タグ付けされた質問 「fortran」

Fortranは、科学計算コミュニティで広く使用されている汎用プログラミング言語です。

3
ポインターで派生型の配列を使用する場合のfortranのメモリ使用量
このサンプルプログラムでは、2つの異なる方法で同じことを(少なくともそう思います)しています。Linux PCでこれを実行し、topでメモリ使用量を監視しています。gfortranを使用すると、最初の方法(「1」と「2」の間)で使用されるメモリは8.2GBであり、2番目の方法(「2」と「3」の間)でメモリ使用量は3.0GBです。Intelコンパイラーでは、違いはさらに大きくなります:10GB対3GB。これは、ポインターを使用することに対する過度のペナルティのようです。なぜこれが起こるのですか? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = (/1,2,3,4/) end do print …

4
スペクトルノルムシュートアウト(gcc、intel、その他のコンパイラーを使用)でCはFortranよりも遅いですか?
ここでの結論: Fortranコンパイラは本当にどれほど優れていますか? gfortranとgccは単純なコードと同じくらい速いということです。そこで、もっと複雑なものを試してみたかったのです。スペクトル標準の銃撃戦の例を取り上げました。最初に2DマトリックスA(:, :)を事前に計算してから、ノルムを計算します。(この解決策は銃撃戦では許可されていません。)FortranとCバージョンを実装しました。コードは次のとおりです。 https://github.com/certik/spectral_norm 最速のgfortranバージョンはspectrum_norm2.f90とspectrum_norm6.f90です(一方はFortranの組み込みmatmulとdot_productを使用し、他方はコードにこれら2つの関数を実装します-速度に違いはありません)。私が記述できた最速のC / C ++コードはspectrum_norm7.cppです。私のラップトップでのgitバージョン457d9d9のタイミングは次のとおりです。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s そのため、gfortranのバージョンは少し高速です。何故ですか?より高速なC実装でプルリクエストを送信する(またはコードを貼り付ける)場合、リポジトリを更新します。 Fortranでは2D配列を渡しますが、CIでは1D配列を使用します。2D配列またはその他の適切な方法を自由に使用してください。 コンパイラについては、gccとgfortran、iccとifortなどを比較してみましょう。(ifortとgccを比較するシュートアウトページとは異なります。) 更新:バージョン179dae2を使用すると、Cバージョンのmatmul3()が改善され、同じように高速になりました。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 

1
Fortran(またはC)コードを解析して、Fortran(またはC)関数の間隔拡張を生成できるツールはありますか?
博士論文のケーススタディでは、CHEMKIN-IIの Fortranサブルーチンの間隔拡張が必要です(リンクの謝罪。SandiaNational Laboratoryによって配布されなくなったパッケージで見つけることができる最高のものです)。CHEMKIN-IIは、燃焼化学で使用される化学パッケージです。燃焼で使用される標準パッケージであるため、別のパッケージを使用することはできません(むしろ、実際には使用しないことを好みます)。 必要な間隔拡張を取得するために、社内で開発したDAEPACKというツールを使用しました。32ビットOS(gcc 2.95に対応するlibstdcのバージョン)で必要だったCHEMKIN-IIサブルーチンの必要な間隔拡張を生成できるようになっていた古いバイナリは、数年前に落ちました、そして使用するための途方もない試練になります(私が使用したソフトウェアの他のすべての部分の32ビットバージョンを見つける必要があるため)。このパッケージのソースコードもプロプライエタリですが、もともとMITで開発され、MITで働いているため、(かなりの努力を払って)DAEPACKのソースコードを取得できました。私が持っているソースコードを使用して、64ビットバージョンのLinuxおよびgcc 4.xxに対応するlibstdcのバージョンと互換性のあるDAEPACKのバージョンをコンパイルできました。しかし、このソースコードは古いと思われ、論文を完成するために必要な間隔拡張コードを正常に生成しない実行可能ファイルにコンパイルします。開発者に連絡してソースコードの修正を依頼しましたが、以前に開発者と連絡を取ったところ、彼がソースコードを修正したとしても、ソースコードを修正するには時間がかかることがわかりました。 ここに大きな問題があります。資金を使い果たしたため、卒業するまで6か月が残っています。開発者に頼ってDAEPACKをすばやく修正して、博士論文を正常に完成させることはできません。 次のことを行うパッケージが必要です。 区間拡張、テイラーモデル(区間演算を使用)、およびほぼ任意のFortran 77コードの導関数を生成します。DAEPACKによって解析されない構造は、DOループとIFステートメントだけだと思います。テイラーモデルが必要なので、コードには自動微分(AD)機能も必要です。 Fortran 77コードのソースからソースへの変換により、これらの区間拡張とテイラーモデルを生成します(つまり、コンパイラーのようにソースコードを解析して、区間拡張とテイラーモデルを計算するソースコードを生成します)。 ピンチでは、Fortran 77コードの代わりにCコードに上記の2つのことを行うソフトウェアを使用して、すべてを通過させることができf2cます。すべてを通過させることでうまくいくかどうかわからないので、私はこのようにしないことを本当に好みますf2cが、私はかなり必死です。 必死の博士課程の学生を助けることができますか? いくつかの可能な提案を予想するために、時間の制約を考えると、ここではうまくいかないアプローチがあります: DAEPACKを機能させるために一生懸命努力しています。信じて、試してみた。そして、私は頻繁に開発者を盗聴しています。 オブジェクト指向(またはオブジェクト指向のような)アプローチを使用して、区間拡張またはテイラーモデルを計算するツール。CHEMKIN-II(または他の同様に大きなライブラリ)を新しいタイプで再コーディングする時間がありません。大きすぎます。 Fortran 77/90またはC以外の言語を使用します。CHEMKIN-IIコードはFortranにあります。を使用してCに変換できf2cます。必要な場合は、TChemと呼ばれるCHEMKIN-IIのSandiaベースのクローンを使用します。私の以前の結果はCHEMKIN-IIを使用しています。私の新しい結果は私の古い結果を再現するはずであり、Canteraはケーススタディとユニットテストに基づいてCHEMKIN-IIが行うことを再現しないことをすでに知っています。さらに、私に先行した大学院生は、CHEMKIN-IIソースコードに黒魔術をかけて、区間演算を特にうまく機能させました。それを他のパッケージに複製するのは難しいでしょう。

4
fortran 95およびLAPACKを使用したスキューエルミート行列の行列指数
量子力学のシミュレーションのために、Fortran 95に没頭しています。正直なところ、私はOctaveに甘やかされてきたので、当然行列の累乗法を採用しました。(小、与えられた)スキューサイズの-Hermitian行列のn × nは、この問題を解決するためにLAPACKを使用する最も効率的な方法は何ですか?LAPACK95ラッパーは使用せず、LAPACKを直接呼び出します。n≤36n≤36n\leq 36n×nn×nn\times n
11 fortran  lapack 

2
科学プログラムでFortranの関数ポインターを操作する方法
Cでの関数ポインターの典型的な使用法を次に示します。Fortranでも同様のことをしたいと思います。私はいくつかのアイデアを持っていますが、そうするための標準的な方法があるかどうかを知りたいです。 ユーザーによって渡された関数ポインターとコンテキストは保存され、後で呼び出されます。 typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*); PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx); ユーザーの関数は、さまざまな時間にコンテキストを使用してコールバックされます。 PETScでは、文字列->関数ポインターテーブルも多用します。すべてがプラグインであるため、ユーザーは独自の実装を登録でき、一流です。 #define PCGAMG "gamg" PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG); これにより、作成ルーチンが「FList」に登録され、PCSetFromOptions()がこのメソッドを他の選択肢と比較して選択できるようになります。システムが動的ロードをサポートしている場合、PCCreate_GAMGシンボルのコンパイル時の依存関係をスキップしてNULLを渡すだけで、シンボルは実行時に共有ライブラリで検索されます。 これは「工場」を超えた一歩であり、マーティン・ファウラーが「サービスロケーター」と呼ぶものに似た制御デバイスの反転であることに注意してください。 注:これは、Jed Brownとの個人的なやり取りで出てきたもので、Jed Brownがこの質問をしてくれました。私はそれを外部委託し、人々が思い付くことができる答えを見ることにしました。
11 petsc  fortran 

2
FortranのOctreeコード
私は科学計算に不慣れです。OctreeのFortran(できればf90)実装を探しています。 私の問題では、任意のボックスにN個の粒子(またはラプラス方程式のような方程式を解くために積分方程式法にプラグインできる密度値がわかるソース)がなくなるまで、ドメインを分割するOctreeが必要です。 私が見つけたすべてはこのC ++実装でした。使用できるFortranライブラリが既に存在するかどうかを知りたい。 また、計算ボックスへの高速積分方程式法の適用が容易になるように使用できるFortranのOctree実装に関する優れた紙の推奨事項も高く評価されます!

3
Fortran 95とLAPACKを使用した実際の非対称行列の行列指数
最近、スキューエルミート行列について同じ質問をしました。その質問の成功に触発され、数時間壁に頭をぶつけた後、本当の非対称行列の行列指数を調べています。固有値と固有ベクトルを見つける方法はやや複雑で、迷ってしまったようです。 背景:先ほど、私は理論物理学SEについてこの質問をしました。その結果、マスター方程式を実際の非対称行列として表現できます。時間に依存しないケースでは、マスター方程式はこの行列をべき乗することによって解かれます。時間に依存するケースでは、統合が必要になります。現時点では、時間に依存しないことだけに関心があります。 様々なサブルーチンを見ている時に、私は私が呼び出しされるべきだと思う(?gehrd、?orghr、?hseqr ...)それから行列をキャストする方が簡単だろう場合、それは不明であるreal*8とcomplex*16、これらのルーチンの複雑な二重のバージョンでと進み、またはreal*8、私の配列の数を2倍にして、後でそれらの複雑な行列を作成するという制限を守ってください。 では、どのルーチンを(どのような順序で)呼び出す必要があり、実際のdoubleバージョンまたは複素doubleバージョンを使用する必要がありますか?以下は、実際のダブルバージョンでこれを行う試みです。の固有値と固有ベクトルを見つけるのに行き詰まっていL*tます。 function time_indep_master(s,L,t) ! s is the length of a side of L, which is square. ! L is a real*8, asymmetric square matrix. ! t is a real*8 value corresponding to time. ! This function (will) compute expm(L*t). integer, intent(in) :: s real*8, intent(in) :: …

2
Fortranで倍精度値を設定する方法
最近、FORTRAN95で奇妙な問題が発生しました。変数XとYを次のように初期化しました。 X=1.0 Y=0.1 後でそれらを一緒に追加して、結果を出力します。 1.10000000149012 変数を調べたところ、0.1は完全な精度の倍精度で表されていないようです。これを回避する方法はありますか?

4
Fortranの学習
Fortranでプログラミングする方法を学ぶための最良の方法は何だろうと思っていました。 私は本を​​探していましたが、私には問題ないと思われた例として、「Fortran 95/2003 Explained」や「Fortran For Scientists And Engineers」などがありました。 私はあなたたちがこれらについてどう思うか知りませんか? 私が疑問に思っているもう1つのことは、どのコンパイラを使用する必要があるかです。私はWindows 7マシン(64ビット)で作業しています。 皆さんが私にこれを手伝ってくれることを願っています! だから私のプログラミングの経験のために: Matlabとmapleは、プログラミングの世界への私の最初の紹介をやさしく思いました。Matlabは、私が実際にかなり良いプログラムであり、ループを操作するコツと、これらを組み合わせてより効果的なプログラムを作成する方法を得ました。Mapleはより基本的な段階にあります(私は単純な積分などの解を検索する方法を知っています)。 その1年後、Visual BasicでC ++を紹介しました。教授は実際にこれにすばやく取り掛かりましたが、2か月後、ポインターと継承についてはすでに議論していました。私はこの言語で簡単なプログラムを書くことができます。クラスでの作業だけが難しい問題ですが、それは練習の問題だと思います。 そしてその1年後、私はMathematica 8を学ぶ必要がありましたが、これも今日では本当に上手になっています。 だから私は少しプログラミングexpierinceを持っていますが、それが信じられないほどの量であるとは言いません! 私がFortranを学びたいのは、主にそれ自体では理論物理学を行うことができず、理論をテストする必要があり、そのためにそれらの理論を数値的にテストできるプログラムを作成できる必要があるためです。Fortranは、数値数学に関しては使用する言語を分類するものだと聞いたので、この言語を知ることは重宝すると思います。 PS:Fortran95とFortran 2003の違いは何ですか?
9 fortran 

3
コードがコンパイラーによってベクトル化されているかどうかはどのようにしてわかりますか?
ルックアップと計算のコストに対するJed Brownの回答で例示されているように、ベクトル化された浮動小数点演算とベクトル化されていない浮動小数点演算を使用すると、コードがはるかに高速になります。最新のコンパイラの多くは、自動ベクトル化を実行できると主張しています。コードのどの部分が正常にベクトル化されているのですか?

1
疎な複雑な行列をコードからPETScに効率的に取得する方法
FortranコードからPETScに複雑なスパース行列を取得する最も効率的な方法は何ですか?これは問題に依存することを理解しているので、以下に関連する詳細をできるだけ多く記載するようにしました。 私は一緒に遊んでてきたFEAST固有値ソルバー[1]タイプの問題のためのの次元は行列AとBがあるN、およびほとんどすべての時間が解決費やされているN × N複素線形をM0右側のシステム。Nは大きく(3DでのFE基底関数の数)、M0は小さい(私の場合はM0〜20に興味がある)。行列AとBは実対称でスパースであり、解を必要とする複雑な問題はz A − Bであり、ここでzA X = λ B Xあバツ=λBバツA x = \lambda B xああABBBNNNN× NN×NN \times NああABBBzA − Bzあ−BzA-Bzzzは複素数です。FEASTの作成者は、この正確な固有値と固有ベクトルを取得するために、この線形システムの解の精度をそれほど高くする必要がないことを示唆しているようです。そのため、いくつかの高速反復ソルバーは、これに対する優れたソリューションとなる可能性があります。 これまでのところ、複雑なシステムにLapackを使用してきましたが、これは私のコンピューターでにうまく機能します。Nが大きい場合、最適なソルバーがまだわからないので、PETScを使用して、そこで反復ソルバーを試してみたかったのです。N&lt; 1500N&lt;1500N < 1500NNN 私は単純なCドライバーを作成し、それをFortranから呼び出しました。すべてのコードについては[2]を参照してください。問題はこの部分にあります(更新:マトリックスを作成するためにすべての行をここに配置しました。これが関連していること): ierr = MatCreate(PETSC_COMM_WORLD,&amp;A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); for (i=0; i&lt;n; i++) col[i] = i; ierr …

4
DAXPY、DCOPY、DSCALはやりすぎですか?
インテルMKLにリンクすることにより、CGをFORTRANに実装しました。 次のようなステートメントがある場合:(Wikipediaを参照) p=r; x=x+alpha*p r=r-alpha*Ap; またはQMRの類似のもの(はるかに多い) v_tld = r; y = v_tld; rho = norm( y ); w_tld = r; z = w_tld; xi = norm( z ); (and more) DAXPY、DCOPY、DSCALなどのBLASレベル1実装を使用することには意味がありますか? 私の質問の動機は: アルゴリズムの実装は2つあります。NormsとMatVecsのみをMKLにリンクしたもの。コピー、スケーリング、追加は、Fortranの組み込み関数と、可能なすべてのサブルーチンがBLASによって実行される別の関数によって行われます。 私は、BLASより速くなることはできないという考えでした。しかし、Fortranの組み込み関数を使用する私のコードは、BLASレベル1サブルーチンを使用するコードよりも100%高速であることがわかりました(FWIW、これは小さな問題ではありませんでした。 GB RAM)。私は2スレッドで(2コアマシンで)両方を実行ifort QMR.f90 -mklしていましたMKL_DYNAMIC=TRUE 私がいたSOの質問を BLASの拡張に関するけど、私は自分のコードにBLASレベル1が含まれるようにしようとしたとして、私のコードは遅く、遅くなって続けました。 私は何か間違ったことをしていますか、これは予想されますか? また、BLASを拡張してy = 2.89*xbyのような自明ではない操作を行うことは理にかなっていDCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPYますか? また興味深いのは、パフォーマンスDDOTをDNRM2向上させることです。彼らは倍精度の乗算を実行するため、並列に配置すると役立つ可能性があるという事実に起因しました。 …

2
データセットをフィルタリングして、ニューラルネットワークトレーニングのより均一な分布を取得する
スティッフODEの完全なシステムを解くのではなく、人工ニューラルネットワーク(ANN)を使用して流体の反応率を予測することを検討しています。私の研究室の何人かの人はすでにそれにいくつかの仕事をしていたので、私はゼロから始めませんが、私のアプリケーションに問題があります。そのうちの1つは、トレーニング用のデータセットの品質に関連していると思います。通常、1D / 2D / 3DのCFDシミュレーションからトレーニングデータを抽出します。とにかく、ニューラルネットワークに送るデータの多次元配列ができあがります。問題の大きさを理解するために、8つのネットをそれぞれ10の入力と1つの出力でトレーニングすることを検討しています。約100,000ポイントのトレーニングセットは妥当だと思いますが、問題は、これらの100,000ポイントが私の多次元空間の特定の領域をカバーする必要があることです。 スナップショットごとに、トレーニングが正確であることを確認するために高いサンプリングが必要な領域には、ポイントのごく一部しかありません スナップショットをまとめてコンパイルすると、多くのほぼ重複するポイントができます。これは、a)これらの領域に重点を置いてトレーニングにバイアスをかけることにより、b)不要なポイントを追加することにより、ANNトレーニングに悪影響を及ぼします。 そのため、トレーニングセットに含める前に、記録したポイントをフィルタリングしようとしています。私が見ると、新しいポイントがデータセットのすべてのポイントの特定のn次元の半径内にあるかどうかを確認する必要があります。このブルートフォースアプローチは、n ^ 2のようないくつかのトリックスケールを除外し、100,000から10,000ポイントを抽出するのにまあまあ機能します(30分かかります)が、スナップショットのサイズと数を増やすとうまくいきません...明らかに、これを行うためのより賢い方法があるはずですが、私はどちらの方向から探し始めるのかわかりません。私は最初にpythonを試してみましたが、FORTRANに移動してスピードを上げることができましたが、まずはより良い戦略を探すべきだと思います。私の唯一の希望はある種のkdツリーですか?私はそれらについてほとんどまたはまったく経験がなく、私が見る問題は、データセットを構築するとツリーが成長することであり、これは複雑さを増すだけです。Python kdツリーライブラリは私のニーズに合っていますか?問題の規模を考えると、FORTRANに移行する必要がありますか?何かアドバイスをいただければ幸いです、ありがとう!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.