2015年2月17日火曜日

vi エディタのあれこれ



vi エディタのあれこれ

1)  文字の一斉置換   :%s/"old"/"new"/g
  "old" "new" の所に置換したい文字と新しい文字列を入れる

例 m01をm08という文字列に一括置換したいとき
 VIのコマンドモードで 
 :%s/m01/m08/g
 と入力   

2015年2月16日月曜日

Grads 等値線をかいてみるスクリプトファイル

*-----test1.gs-----

reinit

'open mode2.ctl'
'set lat 39.0 40.0'
'set lon 140.0  142.0'
'set lev 5'
'set map 1 1 6'

'q gxinfo'
'q file'
'q dims'

'set t 1'
'set grads off'
'set gxout shaded'

'set clevs -1 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4  0.6  0.8  1.0'
'd mode'
'cbarn'

'set gxout contour'


*-----test2.gs-----

reinit

'open s1.ctl'
'set lat 35.0 40.0'
'set lon 140.0  145.0'
'set lev 5'
'set map 1 1 6'

'q gxinfo'
'q file'
'q dims'

t=1
while (t<=745)
'c'
'set t 't''
'set grads off'

'set gxout shaded'
'set clevs 30 30.25 30.5 30.75 31.0 31.25 31.5 31.75 32.0 32.25 32.5 32.75 33.0 33.25 33.5 33.75 34.0 34.25 34.5 34.75 35.0'
'd mode'
'set strsiz 0.2 0.2'
'draw string 2 6 t='t
*pull input
t=t+2

endwhile

'cbarn'

'set gxout contour'
'd mode'

2015年2月9日月曜日

「Gradsの最低限知っておいた方がいいコマンド」

Grads 水平分布図を描くときに最低限必要なコマンド」

1)等値線を引く
 set gxout contour
  d 変数

2)等値線のラベルをつける/つけない/強制的につける
  Set clap on/of/forced

3)等値線のラベルのフォントの設定
  set clopt 色番号(太さ(大きさ))
 例 >set clopts 1 2 0.2  (1 ,太さ2,大きさ0.2)

4)塗りつぶすタイプの等値図を描く
  set gxout shaded

4)カラーバーを描くときはcbarnを使う
run cbarn 1.0 0 5.7 0.9
cbar*がシステムに存在しない場合はftp://grads.iges.org/grads/scripts/cbar*.gsをダウンロードして任意の場所(/usr/local/lib/grads/scripts/などに置いて環境変数GASCRPに団ロードしてきたファイルを置いたディレクトリに指定すると使えるようになる)(参考http://wind.gp.tohoku.ac.jp/index.php?%B8%F8%B3%AB%BE%F0%CA%F3%2FGrADS%2FGrADS%A4%CETips#content_1_66
 
5)Doループ内で、一回ずつ図を止めてチェックしたいとき
pull input
doループ内に入れておく。Fortran77pause相当するGradsのコマンド。

2015年2月7日土曜日

「Linux 知っとくとよいコマンドあれこれ」

1) サーバー間でデータをコピーしたいとき


scp -r[ディレクトリの中身ごとコピーするオプション] [アカウント名]@[ホスト名]:[コピーしたいディレクトリ] [(VPS)コピー先のパス]

scp –r (アカウント名)@サーバーのアドレス/work ./


2) Linux ディスク容量をしりたいときのコマンド

df, du, quotaコマンド

1)データ出力をしているときに突然ディスクがいっぱいで書き込みができませんと言われた。そこで早速ディスク容量を表示。

>df

Filesystem           1K-blocks     Used Available  Use%     Mounted on
/dev/sda2            268304384    38645068    229659316    15% /
/dev/lxvm/data       184565485312  165666683240  18898802072  90% /data
udev                264596572     344       264596228     1% /dev
/dev/sda1            253871       46532       194232        20% /boot
/dev/sda4            307722420     307722228      192           100% /home

dfコマンドを使うと上記のような表示が出力された。 数字が大きすぎてなんだかわからないときは、-Hの引数をつける。

>df –H

マウントしているディスクの状況を国際単位系(SI)を使用して表示してくれる。

Filesystem             Size   Used   Avail Use%  Mounted on
/dev/sda2              275G    40G   236G      15% /
/dev/lxvm/data         189T   170T    20T       90% /data
udev                   271G   353k   271G      1% /dev
/dev/sda1              260M    48M   199M     20% /boot
/dev/sda4              316G   316G    99k      100% /home

今のマウントhomeは100%はいっぱいになってる事がわかる。

補足: 引数-kでKバイト, -mでMバイト,-hでMバイトやGバイト単位で表示される。つまりすべてを網羅しているのが-hの引数ということになる。

2)カレントディレクトリから使用率が高いディレクトリを表示するには”du –h”コマンドが便利。

>du –h

356K    ./eigtest
96G     ./mode/hexm
95G     ./mode/pexm
64G     ./mode/cexm
255G    ./mode
255G    .


3)カレントディレクトリ以下の使用率の高いディレクトリが表示される。



データをリンクさせたいときのシェルスクリプト 

#!/bin/csh
set input_path  = /data/inner2/m12/t.grd
set output_path = /home/data/m12/t.grd
ln -s $input_path  $output_path


4)データ除去 コマンドと確認をする引数

rm -i

この引数-iを入れるだけで、ミスが少なくなるはず。こまめにバックアップも取っておくことは重要。



5)home/***ディレクトリからdata/backup/へディレクトリごとコピーするときは

cp –r home/*** data/backup/


-rの引数を付けるとディレクトリごとコピーできる。

2015年1月30日金曜日

「配列データを連続的にバイナリ―で書き込み、Gradsでも読み込むことができるデータ形式にするFortran77プログラム」


x、y、zそれぞれの方向に100,100,10格子あるデータで、それを100個続けてバイナリデータで書き込みたい場合(Fortran77のプログラム)この形式はGradsの読み込み形式にも相当

1)まずFortranのプログラム内でのフォーマットは以下のように記述

    parameter (ia=100,ja=100,ka=10)
    real ::  am1(ia,ja,0:ka)
    character cf1*100,cir1*3
     
     do ik=1,100 
     write(cf1,'(a,a,a)')
           &   '/data/ishizu3/otsuchi/mode/m08/hex1100.grd'

     open(60,file=cf1,status='old'
&  ,form='unformatted',access='direct',recl=ia*ja*(ka+1))
      read(60,rec=ik) (((am1(i,j,k),i=1,ia),j=1,ja),k=0,ka)
      
      if(ik.le.9)then
                 write(cir1,'(a,i1)') '00',ik
                 elseif(ik.le.99)then
                 write(cir1,'(a,i2)') '0',ik
                 else
                 write(cir1,'(i3)')  ik
                 endif

     write(cf1,'(a,a,a)')
         &    '/data/mode/m01/hex0',cir1,'.grd'
                open(60,file=cf1,status='replace'
         &   ,form='unformatted',access='direct',recl=ia*ja*(ka+1))
                write(60,rec=1) (((am1(i,j,k,0),i=1,ia),j=1,ja),k=0,ka)

    enddo
  
    end



これでバイナリファイル形式でデータを保存可能。write文のrec=ikは、データの書き込み位置を指定するもの


------------------------------------------------------------------------------------------------------------------

意外と重要なopen文のstatus !

status の意味とは

status={ ’new’ | ’old’ | ’replace’ | ’unknown’ | ’scratch’ }

new :  出力ファイルに対して指定され、open文が実行された時点でファイルが存在するとエラーになる。既存ファイルを間違って上書きしてしまうのを防ぐために指定。

old: open文が実行された時点でファイルが存在しないとエラーになる。すでにあるファイルに対して使用する。

replace:出力ファイルに対して指定され、open文が実行された時点でファイルが存在しなければ、その名前のファイルを新しく生成し、存在すればそのファイルを消去して上書き。

unknown: ’unknown’ を指定した場合やstatusパラメータを省略した場合、扱いは処理系に依存する。

scratch:一時ファイルに対して指定され、close文が実行されるか、プロセスが終了するとファイルが消去される。私の調べによると、status=’scratch’ を指定した場合、ファイル名を指定してはならないとありましたが、管理者はまだ理解できていない。




2015年1月29日木曜日

「Lapackを使用して実行ファイル(a.out)を実行したとき 'glibc detected' エラーがでてきたときの対処」



*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x000000000beeb5b0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x75018)[0x2aaaac0ac018]
/lib64/libc.so.6(cfree+0x6c)[0x2aaaac0b0f6c]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libintlc.so.5(tbk_get_pc_info+0x354)[0x2aaaabce0f84]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libintlc.so.5(+0xa6df)[0x2aaaabce06df]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libintlc.so.5(tbk_trace_stack+0x1b4)[0x2aaaabce19e4]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libintlc.so.5(tbk_string_stack_signal+0xa6)[0x2aaaabce04a6]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libifcore.so.5(tbk_stack_trace+0x1ac)[0x2aaaaad917ac]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libifcore.so.5(for__issue_diagnostic+0x8e2)[0x2aaaaad04e42]
/opt/intel/composer_xe_2011_sp1.6.233/compiler/lib/intel64/libifcore.so.5(for__signal_handler+0x120)[0x2aaaaad15560]
/lib64/libpthread.so.0(+0xf5d0)[0x2aaaabe295d0]
./a.out[0x401c23]
./a.out[0x400fac]
/lib64/libc.so.6(__libc_start_main+0xe6)[0x2aaaac055bc6]
./a.out[0x400ea9]
======= Memory map: ========
00400000-00438000 r-xp 00000000 08:04 584030342                        
 /home/***/pro/a.out
00637000-00638000 r--p 00037000 08:04 584030342                        
/home/***/pro/a.out
00638000-00639000 rw-p 00038000 08:04 584030342                        
/home/***/pro/a.out
00639000-0bf04000 rw-p 00000000 00:00 0                                  [heap]
2aaaaaaab000-2aaaaaaca000 r-xp 00000000 08:02 1435333                    /lib64/ld-2.11.1.so

このエラーはプログラムをコンパイルするときに、引数“-CB”を付けると解決(intel fortranの場合)!このエラーはプログラムを実行するときにメモリで生じるエラーが問題だそう。情報元はこのサイト(https://software.intel.com/en-us/forums/topic/268134)。

つまり test.f というプログラムファイル を
>ifort -CB test.f
でコンパイル。

2015年1月28日水曜日

「Linux上でLapackをインストールし、使用確認する方法」



現在のシェルを調べる
echo $SHELL

まずLapackがなんであるか、自分の環境にはどのバージョンをダウンロードすればよいかを判断するために以下のサイトを参考にした。

http://www.netlib.org/lapack/faq.html

Linux Distribution


·       Fedora, RedHat, Suse, Mandriva RPM

·       Debian Lapack Debian package
·       Cygwin Pick up lapack from the Math category during installation.
·       Ubuntu Lapack Ubuntu package
·       Gentoo Lapack Gentoo package
·       Quantian Lapack package

とあるように、どのバージョンをインストールすればよいか、OSを確認。


LinuxのOSが分からない時の確認方法


cat /proc/version


Linux version 2.6.32-358.23.2.el6.x86_64 (mockbuild@x86-022.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Sat Sep 14 05:32:37 EDT 2013


と表示される。つまり、Red Hat4.4.7-3というOSのバージョンということ。

Red Hatではi386、x86_64があるのでどちらのバージョンか調べるには “uname- a”とやる。

Linux *****-1 2.6.32-358.23.2.el6.x86_64 #1 SMP Sat Sep 14 05:32:37 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux

という感じで表示されるので、私の使っているサーバーはx86_64バージョンいう事になる 。

http://rpmfind.net/linux/rpm2html/search.php?query=lapack

上記のサイトから自分のバージョンにあうパッケージをダウンロード
私の場合はlapack-3.2.2.tgzをダウンロード
注:rpmファイルはサーバーの管理者用のファイルなので私はhttp://www.netlib.org/lapack/のサイトから lapack-3.2.2用のlapack-3.2.2.tgzを自分のホームディレクトリ にダウンロード

~/tmp/lapack-3.2.2.tgz

“tar xvfz lapack-3.2.2.tgz”によってファイルを解凍

解凍するとlapack-3.2.2ができているはず。lapack-3.2.2のフォルダの中にINSTALLというフォルダがある。その中にgfortran, ifort など各コンパイラごとに使うmakefileがあるのでそれをlapack-3.2.2フォルダの下にコピー。私はインテル用のfortran77コンパイラを使うのでmake.inc.ifortを下記のようにコピー。


cp INSTALL/make.inc.ifort ./make.inc


ここからblas, lapack,tmgのライブラリを下記のように作成。
>make blaslib
>make lapacklib
>make tmglib


ここで注意!コピーしたばかりのmake.incファイルでblaslib.aファイルを作ると、単精度の計算をするライブラリが作られることになる。倍精度で計算をしようと考えている人はmake.incを編集し、以下の箇所を倍精度が計算できるように変更。その後、"make blaslib"をする。


#  Location of the extended-precision BLAS (XBLAS) Fortran library
#  used for building and testing extended-precision routines.  The
#  relevant routines will be compiled and XBLAS will be linked only if
#  USEXBLAS is defined.
#
USEXBLAS    = Yes
#XBLASLIB     =

XBLASLIB    = -lxblas

うまくいけば blas_LINUX.a,lapack_LINUX.a,tmg_LINUX.a の3つのファイル(ライブラリファイル)が完成している。これを任意のディレクトリに置く。管理者なら /usr/local/lib,自分用のライブラリ専用ディレクトリを作るなら ホームディレクトリ以下の~/local/lib/lapack/ あたりに置くと良い。

ライブラリファイル(lapack95.aファイル)はgfortran、ifortなどで、オプションとして指定したいときにliblapack95.aと名前を変えておくと、引数-lを使って指定できるので下記のように名前を変える。同じように.aのライブラリファイルがあれば、ファイル名の最初にlibが使われてなかったら、mvコマンドで名前を変えておくのがよい。


mv blas_LINUX.a libblas.a
mv lapack_LINUX.a liblapack.a
mv tmg_LINUX.a libtmg.a

これらのlapackのライブラリファイルをカレントディレクトリから使うには

ifort -I/home/****/lib mode_conv3.f -L/home/****/lib  -llapack -lblas 
のようにLAPACKのライブラリファイルがあるフォルダーを指定する必要がある。

--------------------------------------------------------------------------------------------


Lapackがうまくインストールされたかどうかチェックするには、固有値のテスト計算をしてみればよい。

以下のサイトは固有値、固有ベクトルを計算するサンプルプログラムが置かれている。

http://people.sc.fsu.edu/~jburkardt/f77_src/test_eigen/test_eigen.html
http://people.sc.fsu.edu/~jburkardt/f77_src/lapack_examples/lapack_prb.f
http://people.sc.fsu.edu/~jburkardt/f77_src/eispack/eispack.html

何種類かの方法で固有値が計算できるようになっているので、うまくテスト計算がでてきたらインストール成功といえよう。

このテストプログラムは、自分でLapackを使った固有値計算が必要なときにも参考になるのでテスト計算はおすすめ。注意すべきことは、ここにあるほとんどのサブルーチンが対称行列の計算を対象としている。ヤコビ法などがそれ。私が確認した限りでは、eispack_prb.fの中のtest04のみ非対称行列でも計算が可能だった。

--------------------------------------------------------------------------------------------


Fortran95 を使っている方は、別途、Lapack95をインストールする。

2015年1月26日月曜日

「サーバの管理者では無いときにGradsインストールし使用できる状態にするプロセス」



Intel/Linux (バイナリインストール)
1.    http://grads.iges.org/grads/downloads.html からLinux-i686をダウンロード
私の場合、grads-2.1.a2-bin-CentOS5.9-x86_64.tar.gzをダウンロード
2. ダウンロードしたファイルを適当な場所に解凍(後でrmしても問題ないのでどこでも大丈夫)
 tar xvf grads-2.0.1-bin-i686-pc-linux-gnu.tar.gz
3.ファイルを解凍すると、grads-2.0.1のフォルダができているので、インストールしたいディレクトリへ移動(私はサーバーの管理者ではないので自分のホームディレクトリ内ということで~/local/bin/)
4. data.tar.Zをダウンロードするため、“wget ftp://grads.iges.org/grads/data.tar.Z” と入力。tar zxf data.tar.Zがダウンロードされたら、”uncompress tar.Z”としてファイルを解凍。data.tarファイルができる。(homepageには、uncompressとあるが、最近のlinuxに入っていない場合があるそう。) data.tar.Zを/usr/local/lib/grads(私の場合は~/local/lib/grads/)におき、”tar xvf data.tar”とする

5. #.basrcに
export PATH=$PATH :/usr/local/bin/grads-2.1a/bin
(GrADS本体を入れたディレクトリ)
export GADDIR=/usr/local/lib/grads
(data.tar.Zの中身を入れたディレクトリ)
export GASCRP=/usr/local/lib/grads
(スクリプトを入れたディレクトリ)
を加筆。

サーバーにアクセスし直す。
そのとき、Xサーバーを立ち上げてからWindowsならputty.exe, Macならターミナルから入って”ssh –X”コマンドを使わなくてはならないことに注意

GrADSをインストールしたのに($ ~/local/grads-2.0a9/bin/grads でgradsが起動できるのに)$ grads (cシェルの場合) >./grads (bシェル)とやってもcommand not foundになるのは、パスが通ってないから。上の.bashrcのところを再チェックする。$grads -bで起動するのに、Xがなんとかなんとかと言われるのは、sshなどでログインしたときに”−X"オプションが付いていないからの可能性大。それでもダメな場合は、管理者の設定の可能性が大。


2015年1月25日日曜日

「初めてMacで外部サーバーにアクセスし、そのサーバーのGradsを使うとき」



1)ターミナル(Terminal)を立ち上げる。

私の場合、 Macを英語表記にしているので Launchpad→ターミナル

2)普段は ”ssh” でサーバーにアクセスするが、Gradsによる描画を行う場合は、”ssh” ではなく”ssh -X”としてサーバーにアクセス。”-X”は描画窓を表示させるための引数(詳しく知りたい場合は$ man ssh)

3)初めてMacから外部のサーバーにアクセスしGradsを使用する場合は “To open “Xauth”, you need to install X11. Would you like to install X11 now?という表示でてくるのでOKをクリック。

4)クリックすると、About X11 and OS Xについてのアップルの画面(日本語ならhttp://support.apple.com/ja-jp/HT5293)がでてくる。http://xquartz.macosforge.orgにアクセスし、XQuartzをダウンロード(私の場合はXQuartz-2.7.7.dmg)。インストールする。インストールでは使用していたターミナルは閉じる必要あり。
5) XQuartzが無事にインストールされたら、アプリケーション→ユーティリティの下にXQuartzが存在しているか確認。XQuartzが存在していたらインストールに成功。

6)Gradsを使うときには、XQuartzから外部のサーバーに”ssh -X”を使って入る必要がある。

2015年1月21日水曜日

「Linux上でifortを使い、プログラムをコンパイル実行(Fortran77)」


1)まずFortranのプログラム内でのフォーマットは以下のように記述

     parameter(ia=100,ja=100,ka=5)
     dimension am(ia,ja,ka)

  write(cf1,'(a)') './mode/mode1.grd'
  lrecl = ia*ja*ka*4
  open(60,file=cf1,status='unknown'
&    ,form='unformatted',access='direct',recl=lrecl)
     write(60,rec=1) (((am(i,j,k,1),i=1,ia),j=1,ja),k=1,ka)

     end

配列データを出力するプログラム

2)プログラムをコンパイル 実行

スクリプトファイルの例

2−1) 最も単純なもの

#!/bin/csh -f
setenv LANG C
ifort  mode_conv1.f
./a.out &

2−2)メインプログラムのほか、外部のサブルーチンプログラムを使う場合

#!/bin/csh -f
setenv LANG C
ifort  -O3  - mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for
./a.out &

3−2)1)で示した配列バイナリデータを読み込み、出力する場合は、パソコン環境によってbig_endian, little_endian方式の2通りがある。そのため、2−1)のような最も単純なコンパイル、実行をすると、うまく読めない、出力できないときがある。そこで、必ず間違えないように、以下のように引数を使ってバイナリデータの読み込み、出力形式を指定しておく

#!/bin/csh -f
setenv LANG C
ifort  -O3  -g -convert big_endian mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for
./a.out &

3−3)プログラムが大きすぎて、メモリが足りない場合がある。そのときは、引数に-shared_intel -mcmodel=medium 

#!/bin/csh -f
setenv LANG C
ifort  -O3  -g -convert big_endian  -shared_intel -mcmodel=medium  mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for


./a.out &

3−4)プログラムにエラーがあって、止まっている場所を知りたいときは、引数 -gen_interfaces や-tracebackをつけて試してみる。


注:上はIntelのifortコマンドで実行する場合なので、gcc, gfortranなどのコンパイルコマンドの場合は別