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などのコンパイルコマンドの場合は別