差分

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

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

Both sides previous revision Previous revision
Next revision
Previous revision
ifort [2010/06/22 21:08]
saito
ifort [2012/04/13 10:09]
saito 削除
ライン 1: ライン 1:
-====== ifort for linux ====== +[[fortran:ifort]]へ移動しました.
- +
-  * linux版は非商用に限り無償(**アカデミックの用途に使う場合はアカデミックライセンスが必要**) +
-  * ライセンスの発行のために登録が必要。 +
-  * MKLも一緒に入ってくる。 +
-  +
- +
-===== インストール方法 ===== +
- +
-==== ubuntu 9.10 on Xeon にintel fortran compilerをインストールしたときのメモ ==== +
- +
-インストールに必要なopenjdk-6-jre,ia32-libsをインストール. +
-<code bash> +
-sudo apt-get install openjdk-6-jre ia32-libs +
-</​code>​ +
-openjdk-6-jreにしたのは気分.sunのjavaでも可. +
- +
-http://​bootstrapping.wordpress.com/​2009/​11/​25/​missing-libstdc-so-5-in-ubuntu-9-10-karmic/​ +
-に書いてあるとおりにlibstdc++5をインストール. +
-<code bash>  +
-wget http://​security.ubuntu.com/​ubuntu/​pool/​universe/​i/​ia32-libs/​ia32-libs_2.7ubuntu6.1_amd64.deb +
-dpkg-deb -x ia32-libs_2.7ubuntu6.1_amd64.deb ia32-libs +
-sudo cp ia32-libs/​usr/​lib32/​libstdc++.so.5.0.7 /​usr/​lib32/​ +
-cd /​usr/​lib32 +
-sudo ln -s libstdc++.so.5.0.7 libstdc++.so.5 +
-</​code>​ +
-これがないとifortのインストール途中で下記のような文句を言われる. +
-<​code>​ +
-32-bit libraries not found on this system. +
-This product release requires the presence of 32-bit compatibility libraries +
-when running on Intel(R) 64 architecture systems. One or more of these libraries +
-could not be found: +
-    libstdc++ +
-    libstdc++5 +
-    glibc +
-    libgcc +
-Without these libraries, the compiler will not function properly. ​ Please refer  +
-to Release Notes for more information. +
-</​code>​ +
- +
-http://​software.intel.com/​en-us/​articles/​non-commercial-software-download/​ +
- ​よりソースをダウンロード.Xeonの場合はintel64を選択。 +
-<code bash> +
-tar xzvf l_cprof_p_11.1.064_intel64.tgz +
-cd l_cprof_p_11.1.064_intel64 +
-sudo ./​install.sh +
-</​code>​ +
-選択はデフォルトでOK. +
- +
- +
-入ったと思いきや、 +
-<​code>​ +
-/​opt/​intel/​Compiler/​11.1/​069/​bin/​intel64/​fortcom:​ error while loading shared libraries: libstdc++.so.5:​ cannot open shared object file: No such file or directory +
-ifort: error #10273: /​opt/​intel/​Compiler/​11.1/​069/​bin/​intel64/​fortcom の致命的なエラー、0x7f で終了しました。 +
-</​code>​ +
-というエラーが発生。すべての9.10で起きたわけではないので、ハードウェア依存??​FIXME +
- +
-仕方がないので、他の方法でlibstdc++5を再インストール +
-http://​hsmak.wordpress.com/​2009/​12/​01/​how-to-fix-libstdc5-dependency-problem-in-ubuntu-9-10/​ +
-を参考に +
-<code bash> +
-sudo rm /​usr/​lib32/​libstdc++.so.5* +
-wget http://​ftp.riken.go.jp/​pub/​Linux/​ubuntu/​pool/​universe/​g/​gcc-3.3/​libstdc++5_3.3.6-17ubuntu1_amd64.deb +
-sudo dpkg -i libstdc++5_3.3.6-17ubuntu1_amd64.deb +
-</​code>​ +
- +
-==== ubuntu 9.04にintel fortranコンパイラをインストール ==== +
- +
- +
- === 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) === +
- +
-(2010.06.22追記)最近のver.はライブラリの場所が変わったようだ(というか今まで間違ったファイルを使ってだけかも....) +
-Fortran90でLapack95使ったときのコンパイルコマンド.file.f90のところは適当に修正して下さい. +
-<code bash> +
-ifort file.f90 -L/​opt/​intel/​Compiler/​11.1/​069/​mkl/​lib/​em64t/​ -I /​opt/​intel/​Compiler/​11.1/​069/​mkl/​include/​em64t/​lp64/​ -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread -O2 +
-</​code>​ +
- +
-以下,古い情報 +
-<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+
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0