ユーザ用ツール

サイト用ツール


fortran:tips

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
fortran:tips [2014/10/23 14:35]
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>​
 +
 +
 ===== 読み込み専用,書き込み専用で開く ===== ===== 読み込み専用,書き込み専用で開く =====
 読み込み専用で開く場合. 読み込み専用で開く場合.
ライン 47: ライン 111:
  
 ===== makefileでコンパイル その2===== ===== makefileでコンパイル その2=====
 +
 +以下の記事は古い.[[fortran:​makefile|別のページ]]を参照せよ.
 +
 moduleファイルを含む場合,依存関係をはっきりさせる必要がある. moduleファイルを含む場合,依存関係をはっきりさせる必要がある.
 依存関係を変えるたびにmakeファイルを書き変えるのは面倒なので,依存関係を見てくれる 依存関係を変えるたびにmakeファイルを書き変えるのは面倒なので,依存関係を見てくれる
ライン 53: ライン 120:
 http://​lagrange.mechse.illinois.edu/​mwest/​f90_mod_deps/​ 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> <code bash>
 TARGET = a.out TARGET = a.out
-OBJECTS ​= hoge.piyo.o ​fuga.o+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) SOURCES=$(OBJECTS:​.o=.f90)
  
-#F90 = gfortran +.SUFFIXES : 
-F90 = ifort +.SUFFIXES : .o .f90 .f 
-#FFLAGS ​= -Wall -fbounds-check -ffpe-trap=zero+.f.o: 
 + ${F90} -c $< ${FFLAGS
 +.f90.o: 
 + ${F90} ​-c $< ${FFLAGS}
  
-.SUFFIXES: 
-.SUFFIXES: .f90 .o .mod .deps 
  
 .PHONY:all .PHONY:all
-all: hogehoge.deps ​${TARGET}+all: ${DEPS} ​${TARGET}
  
-hogehoge.deps: ${SOURCES}+${DEPS}: ${SOURCES}
  python f90_mod_deps.py --output $@ $^  python f90_mod_deps.py --output $@ $^
  
-${TARGET} : ${OBJECTS} +${TARGET} : ${OBJECTS}  
- ${F90} -o $@ ${OBJECTS} ​${FFLAGS}+ ${F90} -o $@ $${FFLAGS}
  
--include ​hogehoge.deps+-include ​${DEPS}
 %.o %.mod: %.f90 %.o %.mod: %.f90
  ${F90} -c $< ${FFLAGS}  ${F90} -c $< ${FFLAGS}
ライン 248: ライン 346:
 $ sh hoge.sh $ sh hoge.sh
 </​code>​ </​code>​
- 
fortran/tips.1414042546.txt.gz · 最終更新: 2017/10/03 12:55 (外部編集)