この文書の現在のバージョンと選択したバージョンの差分を表示します。
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
ifort [2009/09/05 14:44] 118.111.104.198 |
ifort [2011/02/21 15:59] saito |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ====== ifort for linux ====== | + | [[fortran:ifort]]へ移動しました. |
- | + | ||
- | * linux版は非商用に限り無償(アカデミックの用途に使う場合はアカデミックライセンスが必要) | + | |
- | * ライセンスの発行のために登録が必要。 | + | |
- | * MKLも一緒に入ってくる。 | + | |
- | + | ||
- | + | ||
- | ===== インストール方法 ===== | + | |
- | === 1.インテルのページからifortのパッケージをダウンロード === | + | |
- | * [[wpjp>IA32]],[[wpjp>INTEL64]],[[wpjp>IA64]]の中からシステムに応じたものを選択する。core2はintel64, core soloはia32などFIXME。 | + | |
- | * [[http://software.intel.com/en-us/articles/non-commercial-software-download/]] | + | |
- | === 2.install.sh の実行 == | + | |
- | ここでは、ver11.0.074 intel64版をインストール。 | + | |
- | <code> | + | |
- | $ tar xzvf l_cprof_p_11.0.074_intel64.tgz | + | |
- | $ cd l_cprof_p_11.0.074_intel64 | + | |
- | $ sudo ./install.sh | + | |
- | </code> | + | |
- | 言われるがままに進む。途中パスワードの認証(activation)が必要。 | + | |
- | インストール直前にbinutilsあたりでヴァージョンの違いについて文句を言われる。 | + | |
- | おそらくifortが要求するヴァージョンよりもubuntuにインストールされているパッケージのヴァージョンの方が新しいので問題ないFIXME。 | + | |
- | パッケージが不足している場合インストール中にメッセージが出る。 | + | |
- | メッセージを読んで必要なものを入れる((sun-java6-jreはjavaを要求されるからインストールしてみた。 | + | |
- | 正しいかどうか不明FIXME。binutilsは最初から入ってるかも。))。 | + | |
- | <code> | + | |
- | $ sudo apt-get install libstdc++5 g++ binutils sun-java6-jre | + | |
- | </code> | + | |
- | 64bitの場合、32bitがどうのこうのというエラーが出るかもしれないので、ia32-libsもインストール。 | + | |
- | <code> | + | |
- | $ sudo apt-get install ia32-libs | + | |
- | </code> | + | |
- | + | ||
- | === 3.環境変数の設定を行う。 === | + | |
- | + | ||
- | ===== 環境変数の設定 ===== | + | |
- | まず、ifortのパスを通したり、ライブラリのパスを通すため、環境変数の設定を行う。 | + | |
- | === bashの場合 === | + | |
- | 使用前に端末で以下を入力(([ia32|intel64|ia64]は[[google.jp>正規表現]]))。 | + | |
- | <code> | + | |
- | $ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64] | + | |
- | </code> | + | |
- | あるいは、~/.bashrcの最後の行に以下を追記。 | + | |
- | <code> | + | |
- | $ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64] | + | |
- | </code> | + | |
- | === csh系の場合 === | + | |
- | <code> | + | |
- | $ . /opt/intel/Compiler/11.0/074/bin/ifortvars.csh [ia32|intel64|ia64] | + | |
- | </code> | + | |
- | とするか、~/.cshrcを編集FIXME | + | |
- | === zshの場合 === | + | |
- | <code> | + | |
- | $ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64] | + | |
- | </code> | + | |
- | とすると、 | + | |
- | <code> | + | |
- | /opt/intel/Compiler/11.0/074/bin/ifortvars.sh:82: = not found | + | |
- | </code> | + | |
- | なんてエラーが出る。 | + | |
- | おそらくbashとzshの文法の違い。 | + | |
- | エラーが出たシェルの == を = に書き直せば、うまく動作する。 | + | |
- | 例えば、intel64の場合、/opt/intel/Compiler/11.0/074/bin/ifortvars.shと/opt/intel/Compiler/11.0/074/bin/intel64/ifortvars_intel64.shの2つを書き換えればよい。複数のユーザーで使用している場合は、*.shを*.zshにコピーするなどの変更を加えるなどして、zsh専用のファイルを作るのがお行儀が良いかも。 | + | |
- | 以下の2ファイルを作成すればよい。 | + | |
- | * /opt/intel/Compiler/11.0/074/bin/ifortvars.zsh | + | |
- | * /opt/intel/Compiler/11.0/074/bin/intel64/ifortvars_intel64.zsh | + | |
- | + | ||
- | こんな感じかしら(32bit版の場合)FIXME | + | |
- | <code> | + | |
- | $ sudo sh -c "sed 's/==/=/g' /opt/intel/Compiler/11.0/074/bin/ifortvars.sh > /opt/intel/Compiler/11.0/074/bin/ifortvars.zsh"\\ | + | |
- | $ sudo sh -c "sed 's/==/=/g' /opt/intel/Compiler/11.0/074/bin/ia32/ifortvars_ia32.sh > /opt/intel/Compiler/11.0/074/bin/ia32/ifortvars_ia32.zsh"\\ | + | |
- | $ sudo sh -c "sed -i -e 's/.sh/.zsh/g' /opt/intel/Compiler/11.0/074/bin/ifortvars.zsh" | + | |
- | </code> | + | |
- | sudo sh -c " "はsudoでリダイレクトするときの常套手段。 | + | |
- | + | ||
- | ===== コンパイラオプション ===== | + | |
- | [[http://accc.riken.jp/HPC/training/text.html ]] | + | |
- | + | ||
- | [[http://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html]] | + | |
- | これくらいオプションをつけて実行すれば,だいたいエラーは検出されそう. | + | |
- | <code bash> | + | |
- | ifort -check all -warn declarations -CB -fpe0 -traceback | + | |
- | </code> | + | |
- | + | ||
- | [[fortran#コンパイラオプション]]も参照のこと | + | |
- | + | ||
- | ===== 改行の抑制 ===== | + | |
- | ifortでは出力時に勝手に改行する仕様になっている。 | + | |
- | 改行を抑制するためには、Format文を使用すればよい。 | + | |
- | + | ||
- | 適当なやり方。 | + | |
- | <code fortran> | + | |
- | write(*,'(100f)') a(:) | + | |
- | </code> | + | |
- | + | ||
- | きちんとしたやり方。以下2chより引用。 | + | |
- | + | ||
- | [[http://pc12.2ch.net/test/read.cgi/tech/1163319215/532]] | + | |
- | <code> | + | |
- | 532 名前:デフォルトの名無しさん [sage]: 2009/03/27(金) 05:59:41 | + | |
- | 亀だけど、Ifortなら<>がお勧め。 | + | |
- | 多次元配列の最初の数を入れることが多いです | + | |
- | 例 | + | |
- | program main | + | |
- | implicit none | + | |
- | integer,parameter :: num = 9 | + | |
- | integer :: ii,jj | + | |
- | real :: arry(num,num) | + | |
- | do ii=1,num | + | |
- | do jj = 1,num | + | |
- | arry(ii,jj) = ii*jj | + | |
- | enddo | + | |
- | enddo | + | |
- | + | ||
- | write(6,'(<num>F)') arry | + | |
- | end program | + | |
- | </code> | + | |
- | + | ||
- | ====== MKL ====== | + | |
- | + | ||
- | 詳しくは、 | + | |
- | [[http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf|Intel(R) Math Kernel Library for the Linux* OS User's Guide]]を参照。 | + | |
- | + | ||
- | ===== 概要 ===== | + | |
- | ^パッケージ名^^ | + | |
- | |[[ifort#lapack]] |密行列やバンド行列を直説法で解く | | + | |
- | |[[ifort#lapack95]] |密行列やバンド行列を直説法で解く | | + | |
- | |[[ifort#blas95]] |マトベク演算や内積演算を行う | | + | |
- | |[[ifort#sparse_blas95]] |疎行列のマトベク演算行う | | + | |
- | |[[ifort#pardiso]] |疎行列を直説法で解く。(条件数の大きい問題向き) | | + | |
- | |[[ifort#fgmres]] |疎行列をFlexibleGMRESで解く。 | | + | |
- | + | ||
- | + | ||
- | MKLのコンパイラオプションは以下のとおり。 | + | |
- | <file> | + | |
- | -L<MKL path> -I<MKL path> | + | |
- | [-lmkl_lapack95] [-lmkl_blas95] | + | |
- | [cluster components] | + | |
- | [{-lmkl_{intel, intel_ilp64, intel_lp64, intel_sp2dp, gf, gf_ilp64, gf_lp64}] | + | |
- | [-lmkl_{intel_thread, sequential}] | + | |
- | [{-lmkl_solver, -lmkl_solver_lp64, -lmkl_solver_ilp64}] | + | |
- | {{[-lmkl_lapack] -lmkl_{ia32, em64t, ipf}},-lmkl_core}} | + | |
- | [{-lguide, -liomp5}] [-lpthread] [-lm] | + | |
- | </file> | + | |
- | [ ]はあってもなくても良い、{ }はどちらか選択という意味。 | + | |
- | -L<MKL path> -I<MKL path>は pathが通っていれば明示する必要なし。 | + | |
- | + | ||
- | [[http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf|Intel(R) Math Kernel Library for the Linux* OS User's Guide]]に以下のような記述あり。 | + | |
- | <file> | + | |
- | You are strongly encouraged to dynamically link in Intel® Legacy OpenMP* run-time | + | |
- | library libguide and Intel® Compatibility OpenMP* run-time library libiomp. Linking to | + | |
- | static OpenMP run-time library is not recommended, as it is very easy with layered | + | |
- | software to link in more than one copy of the library. This causes performance problems | + | |
- | (too many threads) and may cause correctness problems if more than one copy is | + | |
- | initialized. | + | |
- | You are advised to link with libguide and libiomp dynamically even if other libraries are | + | |
- | linked statically. | + | |
- | </file> | + | |
- | <file> | + | |
- | The second relevant component is the Compiler Support RTL Layer. Prior to Intel MKL 10.0, | + | |
- | this layer only included the Intel® Legacy OpenMP* run-time compiler library libguide. | + | |
- | Now you have a new choice to use the Intel® Compatibility OpenMP* run-time compiler | + | |
- | library libiomp. The Compatibility library provides support for one additional threading | + | |
- | compiler on Linux (gnu). That is, a program threaded with a gnu compiler can safely be | + | |
- | linked with Intel MKL and libiomp and execute efficiently and effectively. | + | |
- | </file> | + | |
- | libguideとlibiompはどちらかを選べば良いのだが、並列化をするのであれば、libiompを選択した方がよいかも。FIXME | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== lapack ===== | + | |
- | * ifortと一緒にインストールされる. | + | |
- | * 環境変数の設定をしておけばパスを通す必要はない. | + | |
- | <code> | + | |
- | $ ifort file.f90 -lmkl -lmkl_lapack -lmkl_em64t -lguide -lmkl_solver | + | |
- | </code> | + | |
- | ===== lapack95 ===== | + | |
- | + | ||
- | * [[http://www.netlib.org/lapack95/|lapack95]] | + | |
- | * [[http://www.netlib.org/lapack95/lug95/|lapack95のhtmlドキュメント]] | + | |
- | * 線形方程式を解くパッケージ。 | + | |
- | * 固有値の計算や特異値分解も可能。 | + | |
- | * mklのlapack95はlapack90のラッパーらしい。 | + | |
- | * 自分でmakeする必要あり。 | + | |
- | + | ||
- | ==== ライブラリの作成 ==== | + | |
- | * libem64t, intel64の部分は環境に応じて適当に。オプションも適当に。デフォルトで十分そうなので、オプションはなくても良さそう。 | + | |
- | <code> | + | |
- | $ cd /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/ | + | |
- | $ sudo gnome-terminal | + | |
- | </code> | + | |
- | 新しく開いた端末で作業((sudo make libem64tとすると、「ifort: コマンドが見つかりませんでした」と怒られる。そのため、スーパーユーザー用の端末を開き、パスを通してから作業。sudoで端末を開くのは、ちょっとお行儀悪いかも。sudoに環境変数を引き継ぐやり方もありそう…))。 | + | |
- | <code> | + | |
- | # . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 | + | |
- | # make libem64t | + | |
- | # exit | + | |
- | </code> | + | |
- | + | ||
- | ==== サンプルコード ==== | + | |
- | + | ||
- | コードのサンプルは /opt/intel/mkl/10.1.0.015/examples/lapack95/source/ にあり。ここではgesv.f90を参考にしながら説明。 | + | |
- | === コンパイルオプション(intel64) === | + | |
- | + | ||
- | <code bash> | + | |
- | $ ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/ -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t -lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d | + | |
- | </code> | + | |
- | === コンパイルオプション(ia32) === | + | |
- | <code bash> | + | |
- | ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32 -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32/ -lmkl_lapack95 -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d | + | |
- | </code> | + | |
- | === 使い方 === | + | |
- | /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の最初 | + | |
- | <code fortran> | + | |
- | USE MKL95_PRECISION, ONLY: WP => SP | + | |
- | USE MKL95_LAPACK, ONLY: GESV | + | |
- | </code> | + | |
- | * 単精度はSP、倍精度はDPを使用する。 | + | |
- | * 呼び出すサブルーチン名をONLYの後に書く。 | + | |
- | + | ||
- | /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の中頃 | + | |
- | <code fortran> | + | |
- | CALL GESV( A, B ) | + | |
- | </code> | + | |
- | <code fortran> | + | |
- | CALL GESV( AA, BB(:,1), IPIV, INFO ) | + | |
- | </code> | + | |
- | * 引数の数が違うのはfortran90のoptional属性によるもの。 | + | |
- | + | ||
- | * LIBRARY_PATHやINCLUDEの環境変数を追加するか,libやmodを適切な位置に動かすのが良いかも.(makeほげほげで設定できないのかしら.未確認.FIXME) | + | |
- | + | ||
- | ===== blas95 ===== | + | |
- | + | ||
- | * マトベク演算やらをしてくれるパッケージ。 | + | |
- | * matmulよりも高速。(多分) | + | |
- | * 自分でmakeする必要あり。 | + | |
- | + | ||
- | ==== ライブラリの作成 ==== | + | |
- | * libem64t, intel64の部分は環境に応じて適当に。オプションも適当に。デフォルトで十分そうなので、オプションはなくても良さそう。 | + | |
- | * ライブラリの作成方法はlapack95と同じ。 | + | |
- | <code> | + | |
- | $ cd /opt/intel/Compiler/11.0/074/mkl/interfaces/blas95 | + | |
- | $ sudo gnome-terminal | + | |
- | </code> | + | |
- | <code> | + | |
- | # . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 | + | |
- | # make libem64t | + | |
- | # exit | + | |
- | </code> | + | |
- | + | ||
- | ==== サンプルコード ==== | + | |
- | === コンパイルオプション === | + | |
- | コードのサンプルは /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/ にあり。ここでは dgemmx.f90を参考にしながら説明。 | + | |
- | <code> | + | |
- | $ ifort /opt/intel/Compiler/11.0/074/mkl/include/mkl_blas.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/common_func.f -lmkl_blas95 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread | + | |
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/blas/data/dgemmx.d | + | |
- | </code> | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/include/mkl_blas.f90 はインターフェース | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 がメインプログラム | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/common_func.f はdgemmxが使用している副プログラム(サブルーチン) | + | |
- | + | ||
- | === コード === | + | |
- | /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 のはじめのあたり。 | + | |
- | <code fortran> | + | |
- | use mkl95_precision, only: wp => dp | + | |
- | use mkl95_blas, only: gemm | + | |
- | </code> | + | |
- | * lapack95と同様にspで単精度、dpで倍精度。 | + | |
- | * gemmは呼び出すルーチン名 | + | |
- | ===== sparse_blas95 ===== | + | |
- | + | ||
- | ===== pardiso/MKL ===== | + | |
- | + | ||
- | * [[http://www.pardiso-project.org]] | + | |
- | * 疎行列で解く。 | + | |
- | * 直接法で解く。-> 条件数の大きい問題に使える。 | + | |
- | * [[http://dx.doi.org/10.1016/S0167-739X(00)00076-5|理論については論文を参照]]\\ | + | |
- | + | ||
- | + | ||
- | ==== コンパイルオプション ==== | + | |
- | * 77でも90でもコンパイル方法は同じ。(ファイルの拡張子が異なるだけ) | + | |
- | * includeする場合はパスの設定が必要.(ifortvars.*shを読み込んでいる場合は,設定済み) | + | |
- | === intel64の場合 === | + | |
- | <code> | + | |
- | $ ifort hoge.f90 -lmkl_solver_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread | + | |
- | </code> | + | |
- | + | ||
- | === ia32の場合 === | + | |
- | <code> | + | |
- | $ ifort hoge.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | </code> | + | |
- | + | ||
- | === コメント === | + | |
- | * mkl_pardiso.f90をincludeせずに,mkl_pardiso.f90と一緒にコンパイルするやり方もあり。 | + | |
- | <code> | + | |
- | $ifort pardiso.f90 /opt/intel/Compiler/11.0/074/mkl/include/mkl_pardiso.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | ==== サンプル コード ==== | + | |
- | f77のコードは /opt/intel/Compiler/11.0/074/mkl/examples/solver/source/ 内にあり。 | + | |
- | + | ||
- | === fortran90 === | + | |
- | <code fortran> | + | |
- | include 'mkl_pardiso.f90' | + | |
- | + | ||
- | program pardiso_test | + | |
- | use MKL_PARDISO | + | |
- | implicit none | + | |
- | real(8),allocatable::a(:),b(:),x(:) | + | |
- | integer::maxfct=1,mnum=1,mtype,phase=13,n,nzero,nrhs=1,iparm(64),msglvl=0,error | + | |
- | type(mkl_pardiso_handle) :: pt(64) | + | |
- | integer i,j | + | |
- | integer,allocatable::ia(:),ja(:),perm(:) | + | |
- | !!! this matrix is quoted by slatec document... | + | |
- | ! |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 | + | |
- | ! |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 | + | |
- | ! | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 | + | |
- | ! | 0 0 0 44 0| | + | |
- | ! |51 0 53 0 55| | + | |
- | !!! set parameter of pardiso | + | |
- | pt(:)=mkl_pardiso_handle(0) | + | |
- | iparm(1)=0 | + | |
- | mtype=11 | + | |
- | !!! assign values to variables | + | |
- | n=5 | + | |
- | nzero=11 | + | |
- | allocate(a(nzero),b(n),x(n),ia(n+1),ja(nzero),perm(n)) | + | |
- | ia(:)=(/1,4,6,8,9,12/) | + | |
- | a(:)=(/11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0,44.d0,51.d0,53.d0,55.d0/) | + | |
- | ja(:)=(/1,2,5,1,2,3,5,4,1,3,5/) | + | |
- | !!! calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) | + | |
- | b(:)=0.d0 | + | |
- | do i=1,5 | + | |
- | do j=ia(i),ia(i+1)-1 | + | |
- | b(i)=b(i)+a(j)*ja(j) | + | |
- | end do | + | |
- | end do | + | |
- | !!! solve linear equation by pardiso | + | |
- | call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs,iparm,msglvl,b,x,error) | + | |
- | if(error /= 0) then | + | |
- | write(*,*) error | + | |
- | stop | + | |
- | end if | + | |
- | write(*,*) x | + | |
- | end program pardiso_test | + | |
- | </code> | + | |
- | + | ||
- | === fortran77 === | + | |
- | fortran90のサンプルを書き換え。 | + | |
- | <code fortran> | + | |
- | program pardiso_test | + | |
- | implicit none | + | |
- | integer lzero,l | + | |
- | parameter (lzero=11,l=5) | + | |
- | real*8 a(lzero),b(l),x(l) | + | |
- | integer maxfct,mnum,mtype,phase,n,nzero,nrhs,iparm(64), | + | |
- | $ msglvl,error,pt(64),ia(l+1),ja(lzero),perm(l),i,j | + | |
- | data ia /1,4,6,8,9,12/ | + | |
- | data ja /1,2,5,1,2,3,5,4,1,3,5/ | + | |
- | data a /11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0, | + | |
- | $ 44.d0,51.d0,53.d0,55.d0/ | + | |
- | ccc this matrix is quoted by slatec document... | + | |
- | c |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 | + | |
- | c |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 | + | |
- | c | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 | + | |
- | c | 0 0 0 44 0| | + | |
- | c |51 0 53 0 55| | + | |
- | ccc set parameter of pardiso | + | |
- | do i=1,64 | + | |
- | pt(i)=0 | + | |
- | end do | + | |
- | iparm(1)=0 | + | |
- | mtype=11 | + | |
- | maxfct=1 | + | |
- | mnum=1 | + | |
- | phase=13 | + | |
- | nrhs=1 | + | |
- | msglvl=0 | + | |
- | ccc assign values to variables | + | |
- | n=5 | + | |
- | nzero=11 | + | |
- | ccc calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) | + | |
- | b(:)=0.d0 | + | |
- | do i=1,5 | + | |
- | do j=ia(i),ia(i+1)-1 | + | |
- | b(i)=b(i)+a(j)*ja(j) | + | |
- | end do | + | |
- | end do | + | |
- | ccc solve linear equation by pardiso | + | |
- | call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs, | + | |
- | $ iparm,msglvl,b,x,error) | + | |
- | if(error /= 0) then | + | |
- | write(*,*) error | + | |
- | stop | + | |
- | end if | + | |
- | write(*,*) x | + | |
- | end program | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | ===== fgmres ===== | + | |
- | 前処理を効率的に行えるようGMRESを改良したもの。前処理に反復解法が使える。 | + | |
- | + | ||
- | FIXME | + |