ユーザ用ツール

サイト用ツール


fortran:tips

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
fortran:tips [2013/12/25 11:05]
saito
fortran:tips [2017/10/03 12:55] (現在)
ライン 2: ライン 2:
   * intelのコンパイラは[[fortran:​ifort]]参照のこと.   * intelのコンパイラは[[fortran:​ifort]]参照のこと.
   * [[http://​www.owlnet.rice.edu/​~ceng303/​manuals/​fortran/​]] が役に立ちそう.   * [[http://​www.owlnet.rice.edu/​~ceng303/​manuals/​fortran/​]] が役に立ちそう.
 +  * 
 +
 +===== よくある間違い =====
 +コーディングにおいてよくある間違いをまとめる.
 +
 +==== べき乗の順序 ====
 +<​nowiki>​計算の優先順位は
 ++- < */ < **
 +である.</​nowiki>​
 +<code fortran>
 +print*,​-1**0
 +</​code>​
 +<​nowiki>​
 +これは-(1**0)と解釈されるので,出力結果は−1.
 +-1に対してべき乗する場合は,(-1)**0.
 +</​nowiki>​
 +
 +==== 論理演算の順序 ====
 +<​nowiki>​
 +論理演算子の優先順位は
 +.eqv., .neqv. < .or. < .and. < .not.
 +である.
 +</​nowiki>​
 +<code fortran>
 +logical :: a=.false.
 +num :: i=1
 +if(a.eqv..false..or.i==1) then
 +print*,'​if'​
 +else
 +print*,'​else'​
 +end if
 +</​code><​nowiki>​
 +これは,a.eqv.(.false..or.i==1) と解釈される.
 +(.false..or.i==1) はtrueなので,上のコードはelseを吐き出す.
 +前後の条件をorでつなぐ場合は,
 +if((a.eqv..false.).or.(i==1)) としてカッコで順序を明示する.
 +</​nowiki>​
 +
 +ちなみに ​  
 +  * (.ture..or..false.)は.true.(どちらかが真なのでtrue)
 +  * (.ture..and..false.)は.false.(どちらも真でないのでfalse)
 +になる.
 +===== allocated =====
 +すでにallocateしたかどうかわからない時は,allocatedで確かめてからallocateする.
 +https://​gcc.gnu.org/​onlinedocs/​gcc-4.1.0/​gfortran/​ALLOCATED.html
 +<code fortran>
 +  if (allocated(x).eqv..false.) allocate(x(n))
 +</​code>​
 +===== construct name =====
 +入れ子のループで,cycleやexitを使って外側に飛びたいときは,do ループにラベルをつける.
 +これで文番号を付けずに好きなところへ飛べる.
 +  - do の前にラベルとコロンをつける.
 +  - cycleやexitの後にラベルをつける.
 +  - end do の後ろにラベルをつける.
 +
 +<code fortran>
 +outer : do i=1,n
 +  do j=1,n
 +    if(...) cycle outer
 +  end do
 +end do outer
 +</​code>​
 +
 +
 ===== 読み込み専用,書き込み専用で開く ===== ===== 読み込み専用,書き込み専用で開く =====
 読み込み専用で開く場合. 読み込み専用で開く場合.
ライン 13: ライン 77:
   * プログラムが完成して,エラーがない場合には以下のコンパイルオプションはない方が良い.ない方が早く計算できる.   * プログラムが完成して,エラーがない場合には以下のコンパイルオプションはない方が良い.ない方が早く計算できる.
  
-^  compiler ​ ^  gfortran ​ ^  ifort  ​^ frt +^  compiler ​ ^  gfortran ​ ^  ifort  ^  
-|エラーの検出FIXME|-Wall|-check all|-Eg?+|エラーの検出FIXME|-Wall|-check all| 
-|配列外参照|-fbounds-check|-CB+|配列外参照|-fbounds-check|-CB|  
-|暗黙の型宣言|-fimplicit-none|-warn declarations+|暗黙の型宣言|-fimplicit-none|-warn declarations| 
-|浮動小数点演算例外の検出|-ffpe-trap=zero|-fpe0+|浮動小数点演算例外の検出|-ffpe-trap=zero|-fpe0| 
-|標準外機能の警告|-std=f95|-std|+|標準外機能の警告|-std=f95|-std|
  
 +例えば以下のようにする.
 +<code bash>
 +gfortran filename.f90 -O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
 +</​code>​
 ===== 連番のファイル名をつける。 ===== ===== 連番のファイル名をつける。 =====
 ファイル名をcharacter変数に代入して使う。ファイル名の変更にはwrite文を使う。 ファイル名をcharacter変数に代入して使う。ファイル名の変更にはwrite文を使う。
ライン 42: ライン 110:
  
  
-===== makefileでコンパイル =====+===== makefileでコンパイル ​その2=====
  
 +以下の記事は古い.[[fortran:​makefile|別のページ]]を参照せよ.
 +
 +moduleファイルを含む場合,依存関係をはっきりさせる必要がある.
 +依存関係を変えるたびにmakeファイルを書き変えるのは面倒なので,依存関係を見てくれる
 + ​f90_mod_deps.py を使う.
 +
 +http://​lagrange.mechse.illinois.edu/​mwest/​f90_mod_deps/​
 +
 +コンパイル不要のpardisoやompのモジュールを読み込んだり,同一ファイル内に複数のモジュールが存在し循環参照が起きる場合は,f90_mod_deps.py のwrite_depsに以下のように修正.
 +<code python>
 +def write_deps(outf,​ filename, deps, mods):
 +    filebase, fileext = os.path.splitext(filename)
 +#>>>​
 +    loadmod="​MKL_PARDISO.mod"​
 +    if loadmod in deps:
 +        deps.remove(loadmod)
 +    loadmod="​omp_lib.mod"​
 +    if loadmod in deps:
 +        deps.remove(loadmod)
 +#<<<​
 +    outf.write("​%s.o:​ %s\n" % (filebase, " "​.join(deps)))
 +    for mod in mods:
 +#>>> ​
 +        if mod in deps:
 +            deps.remove(mod)
 +#<<<​
 + outf.write("​%s:​ %s\n"
 +    % (mod, " "​.join(deps)))
 +</​code>​
 +
 +以下,Makefile のサンプル.
 +<code bash>
 +TARGET = a.out
 +DEPS=hoge.deps
 +OBJECTS = piyo.o foo.o bar.o main.o
 +F90 = gfortran
 +FFLAGS=-Wall -ffpe-trap=invalid,​zero,​overflow,​underflow -fbounds-check -fimplicit-none -fbacktrace -fopenmp
 +#FFLAGS=-O3 -fopenmp
 +#F90 = ifort
 +#​FFLAGS=-check all -warn all -std -gen_interfaces -fpe0 -ftrapuv -traceback
 +#FFLAGS = -mkl -O3
 +
 +SOURCES=$(OBJECTS:​.o=.f90)
 +
 +.SUFFIXES :
 +.SUFFIXES : .o .f90 .f
 +.f.o:
 + ${F90} -c $< ${FFLAGS}
 +.f90.o:
 + ${F90} -c $< ${FFLAGS}
 +
 +
 +.PHONY:all
 +all: ${DEPS} ${TARGET}
 +
 +${DEPS}: ${SOURCES}
 + python f90_mod_deps.py --output $@ $^
 +
 +${TARGET} : ${OBJECTS} ​
 + ${F90} -o $@ $^ ${FFLAGS}
 +
 +-include ${DEPS}
 +%.o %.mod: %.f90
 + ${F90} -c $< ${FFLAGS}
 + touch $(patsubst %.f90,​%.mod,​$<​)
 +
 +clean :
 + rm ${TARGET} *.mod *.f90~ ${OBJECTS}
 +</​code>​
 +
 +===== makefileでコンパイル =====
 複数のファイル(サブルーチンetc.)で構成されるプログラムを動かすのに便利. 複数のファイル(サブルーチンetc.)で構成されるプログラムを動かすのに便利.
 以下の文を「makefile」という名前で作り,コンパイルしたいファイルと同じディレクトリに置く. 以下の文を「makefile」という名前で作り,コンパイルしたいファイルと同じディレクトリに置く.
ライン 85: ライン 224:
 </​code>​ </​code>​
  
-===== データファイルの読み込み =====+===== 何行あるか分からないときのデータファイルの読み込み =====
  
 データファイルの中に何行あるか分からないときにはiostatかendを使う. データファイルの中に何行あるか分からないときにはiostatかendを使う.
ライン 207: ライン 346:
 $ sh hoge.sh $ sh hoge.sh
 </​code>​ </​code>​
- 
fortran/tips.1387937105.txt.gz · 最終更新: 2017/10/03 12:55 (外部編集)