問題タブ [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.

0 投票する
1 に答える
2485 参照

concurrency - DO CONCURRENT と OpenMP をいつ使用する必要がありますか?

私はこれこれを認識していますが、最初のリンクは現在かなり古く、2番目のリンクは決定的な答えに達していないようです. コンセンサスは形成されましたか?

私の問題は簡単です:

同時に実行できる要素DOを持つループがあります。どの方法を使用しますか?

以下は、単純な立方格子上に粒子を生成するコードです。

  • npartは粒子の数です
  • npart_edgenpart_faceは、それぞれエッジと面に沿ったものです
  • spaceは格子間隔
  • RxRyRzは位置配列です
  • xyzは、格子上の位置を決定するための一時的な変数です

x、y、z は、CONCURRENT の場合は配列でなければならないが、OpenMP の場合は PRIVATE として定義できるため、そうではないという違いに注意してください。

だから私は使用しますかDO CONCURRENT(上記のリンクからわかるように、SIMDを使用します):

または、OpenMP を使用しますか?

私のテスト:

サイド 10 のボックスに 64 個のパーティクルを配置する:

サイド 100 のボックスに 100000 個のパーティクルを配置する:

コンストラクトを使用するDO CONCURRENTと、少なくとも 1 桁はパフォーマンスが向上するようです。これは i7-4790K で行われました。また、同時実行の利点は、サイズが大きくなるにつれて減少するようです。

0 投票する
1 に答える
1576 参照

arrays - gfortran (mac os x) : エラー: (1) の配列指定が 7 次元を超えています

El Capitan 10.11.6 を使用しており、自作から gcc 6.1.0 をインストールしています。>7 次元配列を持つ Fortran プログラム test.f があります。を使用してコンパイルしました

Fortran 2008 は 15 次元までの配列を処理すると思っていましたが、それでも次の結果が得られます。

私は何を間違えましたか?

0 投票する
1 に答える
105 参照

fortran - 他のモジュール プロシージャからモジュール プロシージャへのアクセスを制限する

私は最近、Fortran 2008 の新機能、すなわちSUBMODULEs を発見しました。

質問の下で私の最小限の実例を見て​​ください。コンパイル後、ターミナルに以下を配置します。

つまり、当然のことながら、 と のモジュール プロシージャはsub1相互に実行sub2でき、すべて問題ありません。CALL

コード アーキテクチャやメンテナンスなどの理由により、このアクセスを何らかの方法で制限する必要があります。つまり、モジュール プロシージャ (sub1sub2) は互いに見えません。そうしてもいいですか?

0 投票する
1 に答える
385 参照

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 でテストしています。

0 投票する
3 に答える
323 参照

fortran - 複雑な Fortran 配列の虚部への「ポインター」を BLAS ルーチンに渡す

複素数 Fortran 配列の虚数部への「ポインター」を、実数のみを操作する BLAS 関数に渡したいと思います。データのコピーを必要としないので、C 言語の意味での「ポインター」を意味します。

たとえば、次の単純なコードを考えてみましょう (実際のコードはもう少し複雑です)。

残念ながら、%reand%imは Fortran 2008 でのみ指定されています。さらに、どちらのコンパイラもサポートしていないため、配列の個々の要素に複雑な部分セレクターを適用することが標準で許可されているかどうかはわかりません。

gfortran「非派生型変数の予期しない '%'」というエラーが表示されます。

私が必要とするものを達成する他の方法はありますか?