f90 tips

11/23’04

Revise 10/6’5

Revise 8/16’5

直接探査についてread_direct_access.htm11/27’5

1.      描画タイトルなどで文字の変更がうまくいかないとき

2.      F90:フォーマット文で1文字空白を表すとき

3.      f77からf90への変換

4.      rainbowにおけるmake fileの作成

5.      Psの変換

6.      関数の作り方

7.      ブロックデータ文

 

1. 描画タイトルなどで文字の変更がうまくいかないとき

zu_title = zu_title//"  風向"//WIND_D(idirec)

ではzu_titleの長さを宣言しているのでうまくいかない。

zu_title = trim(zu_title)//"  風向"//WIND_D(idirec)

が正解!

5/20/04

 

2. F90:フォーマット文で1文字空白を表すとき

富士通コンパイラ ‘(x)’ OK

Sunコンパイラ ‘(x)’ NG → ‘(1x)’ OK

文書の先頭

 

3. f77からf90への変換

3.1コメント文の修正

:%s/^C/!/g

適宜Cのところをc, *と変更する。

:%s/^c/!/g

:%s/^*/!/g

 

3.2複数行にまたがるときの修正

3.2.1 f77で複数行にまたがるところを探す

/^     +/

で複数行にまたがるところを探す。6カラム目は”+”とは限らないので適宜修正する。

6カラム目の文字を出力するperlスクリプト。ただし、タブが含まれていると検出されてしまう。

#!/usr/bin/perl

$n=0;

while(<>){

$n++;

# print $_;

chomp;

 $colum1 = substr($_,0,1);

 $colum6 = substr($_,5,1);

if( $_ ne '' ){

 if( $colum1 ne '!' && $colum6 ne ' ' ){

   print $n,"\t",$colum6,"\n";

 }

}

}

 

変更の手順はviであればmapに登録すると便利。

map g 6s&      ^[

コマンドの意味は、「’6カラム’&5カラムの空白で置換」する。最後はcntl+Vののち(esc)

nで次の対象を探して、gで変換できる。(f90の仕様では、&の入力は必須ではない)

 

3.2.2 f90の複数行指定に修正する

map , k$a     &^[

,(コンマ)1行上に移動し(k)、行末に移動し($)&をつける(a)コマンドを割り付ける。最後はcntl+Vを入力したのち(esc)を入力する。

 

3.2.3 置換の実施

文章末から

?^      &

で複数行にまたがる箇所を検索し、コンマで置換できる。

(注意!) 行の終わりにコメントがある場合は対応できない。コンパイルエラーを見て修正する。

文書の先頭

 

4. rainbowにおけるmake fileの作成

4.1ディレクトリ

作業ディレクトリ:/export/raid2/koshida/tools/bin

 

4.2モジュールの命名則

モジュールのファイル名は (大文字).f90 が必要。 M_ で始めるとよい。

(リザバでコンパイルするとき。ファイル名はすべて大文字とする。)

(モジュール名は小文字でもよい)

(f90は小文字でもよい) 11/20’5追記

モジュール名とファイル名は同じが好ましい。ソース内のモジュール名をもとにオブジェクトファイルを要求するのでモジュール名とファイル名が異なるとMakefileを直す必要が出てくる。

リザバのコンパイラは拡張子が.fで、ソースがf77f90の混合でも解釈してくれる(/home/koshida/jobs/2003/prg/geppou,1/2’6)

 

makeしたとき、以下のようなメッセージはオブジェクトファイルの生成順番がおかしいのでMakefileを書き直す。

"/export/raid2/koshida/MRR/data/prg/scat/src/M_COMMON1.f90", = 5, = 5: エラー: "IOHANDLING" USE 文でモジュール

名として指定されていますが、コンパイラはこれを見つけられません。

 

一つのファイルに複数のモジュールがある場合に、作成順を間違える傾向にある。

このとき、複数のオブジェクトファイルを出力対象としている。

使わない(ないはずの)オブジェクトファイルに対する記述は削除する。ソースがないのにオブジェクトファイルを要求するものに注意!

次のようなメッセージが出る。

make: Fatal error: Don't know how to make target `/export/raid2/koshida/MRR/data/prg/scat/obj/M_SCAT.o'

 

オブジェクトファイルを作成する部分と、ソースの更新時間と比較する部分があるので両方削除する。

 

4.3Library 更新

コンパイル時に、次のようなメッセージがでたら、

未定義の                        最初に参照している

シンボル                            ファイル

jwe_isfm                            /export/raid2/koshida/tools/bin/libcalps90.a(gray.o)

f_ccomp                             /export/raid2/koshida/tools/bin/libcalps90.a(namedcolor.o)

jwe_ilst                            /export/raid2/koshida/tools/bin/libcalps90.a(gray.o)

ライブラリが古い、ということなので、オブジェクトファイルを作成しなおして

ar -r libtakelib90.a mojisu.o

等として、書き換える。

現在のファイルが新しいかどうかは

ar -tv libcalps90.a plot.o

等で確認できる。

Library 更新用のシェル

/export/raid2/koshida/tools/takelib_src/c_renew

/export/raid2/koshida/tools/cal_src/c_renew

前述のように/opt2/SUNWspro/bin/f90 *.fを同様に解釈するのでf77からf90への書き換えは必須でない(1/7’6)

 

_F90_STOP                           /export/raid2/koshida/tools/bin/libtakelib90.a(mojisu.o)

f90でなくてf77でもコンパイル可。

 

オブジェクトファイルを作成

/opt2/SUNWspro/bin/f90 –c gray.f

文書の先頭

 

5. Psの変換

set PSSEDFILE = /export/raid2/koshida/tools/pseuctosj.sed

sed -f  $PSSEDFILE out.ps | euctosj > sj.ps

gs -sDEVICE=png256 -r100 -sOutputFile=mrrARGV[0]%02d.png $PS <inp.gs

)Reservoirには漢字フォントが無いようなので英数文字のみとする。

 

セグメント例外(10/6’5)

setfigorg2のなかで
if(itate.eq.0)then
 ...
else
 ...
 itate=1
endif

という記述があり、「セグメント例外」となる。

 

hydroでコンパイルしたときplotにエラーが出た(Error: /undefined in movetocurrentpoint)。ソースの確認が必要。

 

convert-trimrainbow,hydroとも不可。

 

6. 関数の作り方

6.1整数の関数の例

integer function iradget( ll, n )  !!関数の開始

! 地整番号(ll=Z81-Z8A)、地整内レーダ番号(n)より通し番号を得る

do irad = 1,nrad

        if( all((/ll,n/) == (/id_kyoku(irad),sn_local(irad)/)) ) then

                iradget = irad      !!←返り値として用いたい名前(関数名と同じで可)に値を入れる

                return

        endif

end do

iradget = -1                        !!←返り値として用いたい名前(関数名と同じで可)に値を入れる

return

end function iradget    !!終了文

6.2文字関数の例

      character(len=4) function gaiji_kiji( ikiji1, ikiji2 )

!      最初に文字の長さを宣言する。長さの宣言がないと「長さ1」と判断される。

!同じ名前の文字変数を引用するプログラムで宣言しておく

c     !to get weather infomation about gaiji in geppou   1/2'6

C input:paare of 1bite integer first bite and seconde byte

c output: situation 4 character

      integer(kind=1) :: ikiji1, ikiji2

      character(len=4) :: res

      gaiji_kiji="????"

 

      if(ikiji1==Z'eb')then

        if(ikiji2==z'9f')then

          res="fine"

        elseif(ikiji2==z'a0')then

          res="clud"

        elseif(ikiji2==z'aa')then

          res="snow"

        elseif(ikiji2==z'b5')then

          res="grap"

        else

          res="????" ! undefilne

        endif

      else

        res="xxxx"  !wrong data

        return  !!途中で戻ることも可能

      endif

gaiji_kiji=res

     end function gaiji_kiji !!関数の終了

 

文書の先頭

 

7. ブロックデータ文

参考:http://www.toyama-cmt.ac.jp/~mkawai/lecture/fortran/subroutine/subroutine.html

common文があると、データの初期化はブロックデータ文が必要。

ブロックデータ文であることを一行目で宣言し、最終行で閉じる。

block data sample!!!!一行目 

real::x!!!!宣言文、

common/sam/x!!!!共通ブロック文

data x/1./!!!!データ文

end!!!! ブロックデータ文の終

sample.f90などの名前で保存し、一緒にコンパイルすると値が引き継がれる(はず)4/30’8

 

 

文書の先頭