問題タブ [fortran2008]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
concurrency - DO CONCURRENT と OpenMP をいつ使用する必要がありますか?
私はこれとこれを認識していますが、最初のリンクは現在かなり古く、2番目のリンクは決定的な答えに達していないようです. コンセンサスは形成されましたか?
私の問題は簡単です:
同時に実行できる要素DO
を持つループがあります。どの方法を使用しますか?
以下は、単純な立方格子上に粒子を生成するコードです。
- npartは粒子の数です
- npart_edgeとnpart_faceは、それぞれエッジと面に沿ったものです
- spaceは格子間隔
- Rx、Ry、Rzは位置配列です
- x、y、zは、格子上の位置を決定するための一時的な変数です
x、y、z は、CONCURRENT の場合は配列でなければならないが、OpenMP の場合は PRIVATE として定義できるため、そうではないという違いに注意してください。
だから私は使用しますかDO CONCURRENT
(上記のリンクからわかるように、SIMDを使用します):
または、OpenMP を使用しますか?
私のテスト:
サイド 10 のボックスに 64 個のパーティクルを配置する:
サイド 100 のボックスに 100000 個のパーティクルを配置する:
コンストラクトを使用するDO CONCURRENT
と、少なくとも 1 桁はパフォーマンスが向上するようです。これは i7-4790K で行われました。また、同時実行の利点は、サイズが大きくなるにつれて減少するようです。
arrays - gfortran (mac os x) : エラー: (1) の配列指定が 7 次元を超えています
El Capitan 10.11.6 を使用しており、自作から gcc 6.1.0 をインストールしています。>7 次元配列を持つ Fortran プログラム test.f があります。を使用してコンパイルしました
Fortran 2008 は 15 次元までの配列を処理すると思っていましたが、それでも次の結果が得られます。
私は何を間違えましたか?
fortran - 他のモジュール プロシージャからモジュール プロシージャへのアクセスを制限する
私は最近、Fortran 2008 の新機能、すなわちSUBMODULE
s を発見しました。
質問の下で私の最小限の実例を見てください。コンパイル後、ターミナルに以下を配置します。
つまり、当然のことながら、 と のモジュール プロシージャはsub1
相互に実行sub2
でき、すべて問題ありません。CALL
コード アーキテクチャやメンテナンスなどの理由により、このアクセスを何らかの方法で制限する必要があります。つまり、モジュール プロシージャ (sub1
とsub2
) は互いに見えません。そうしてもいいですか?
oop - 遅延関数と non_overridable キーワードによるセグメンテーション違反
抽象型によってサポートされるポリモーフィズムを使用した数値最適化のためのオブジェクト指向 Fortran コードを開発しています。これは TDD の優れた実践であるため、抽象型 ですべての最適化テストを記述しようとしていclass(generic_optimizer)
ますtype(newton_raphson)
。
すべての最適化テストは への呼び出しを特徴としてcall my_problem%solve(...)
おり、これは抽象型として定義されdeferred
ており、もちろん派生型ごとに異なる実装を特徴としています。
問題は、各非抽象クラスで遅延関数を として定義するとnon_overridable
、次のようなセグメンテーション違反が発生することです。
non_overridable
試行錯誤の末、宣言を削除するとエラーを回避できることに気付きました。この場合、それは問題ではありませんが、このコードでは 2 つのレベルのポリモーフィズムが発生する可能性が低いため、強制したかったのです。代わりに、標準の要件に違反していましたか?
エラーを再現するサンプルコードを次に示します。gfortran 5.3.0 および 6.1.0 でテストしています。
fortran - 複雑な Fortran 配列の虚部への「ポインター」を BLAS ルーチンに渡す
複素数 Fortran 配列の虚数部への「ポインター」を、実数のみを操作する BLAS 関数に渡したいと思います。データのコピーを必要としないので、C 言語の意味での「ポインター」を意味します。
たとえば、次の単純なコードを考えてみましょう (実際のコードはもう少し複雑です)。
残念ながら、%re
and%im
は Fortran 2008 でのみ指定されています。さらに、どちらのコンパイラもサポートしていないため、配列の個々の要素に複雑な部分セレクターを適用することが標準で許可されているかどうかはわかりません。
gfortran
「非派生型変数の予期しない '%'」というエラーが表示されます。
私が必要とするものを達成する他の方法はありますか?