この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
fortran:tips [2014/04/03 17:44] saito [makefileでコンパイル] |
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.o 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} | ||
| ライン 126: | ライン 224: | ||
| </code> | </code> | ||
| - | ===== データファイルの読み込み ===== | + | ===== 何行あるか分からないときのデータファイルの読み込み ===== |
| データファイルの中に何行あるか分からないときにはiostatかendを使う. | データファイルの中に何行あるか分からないときにはiostatかendを使う. | ||
| ライン 248: | ライン 346: | ||
| $ sh hoge.sh | $ sh hoge.sh | ||
| </code> | </code> | ||
| - | |||