問題タブ [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 投票する
3 に答える
1940 参照

fortran - Fortran 2003-2008 で GETCWD() に代わるものはありますか

GNU Fortran コンパイラの GNU 拡張機能GETCWD()は、現在の作業ディレクトリを取得するサブルーチンを提供します。ただし、私のコードはコンパイラにも移植できる必要があり、ifortF2003nagforの機能を使用しています。

GETCWD()では、 F2003 以降の代替手段はありますか?

私はここに標準を持っていますが、かなり大きいので、しばらく試してみましたが、有用なものは何も見つかりませんでした...

0 投票する
2 に答える
327 参照

fortran - Fortran 2003 の定数関数ポインター配列

親愛なる Fortran プログラマーへ

Fortran 2003 以降で定数 (パラメータ) プロシージャ ポインタ配列を宣言できるかどうか、誰にもわかりませんか?

以下に示すように、入力整数引数に応じて異なる関数を呼び出すスイッチャー関数があります。プロシージャ ポインタの配列 (派生でラップされた) 型を使用します。この配列は、使用する前に実行時init()にルーチンを介して初期化する必要があります。コンパイル中にすでにこの配列を初期化し、そのような初期化ルーチンの必要性を回避する方法はありますか? 実行中に値が変化しないため、として定義することもできます。parameter

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

fortran - プライベート コンポーネントを持つ構造体コンストラクター

次の例では、プライベート コンポーネントを使用して構造を定義しました。

構造体コンストラクターは、1 を引数として呼び出されます。nr私の理解では、プライベートであるため、これは不可能です。ただし、これは によってコンパイルされますが、 usingではコンパイルされIntel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32]ません。さらに、ステートメントは出力に の値を示します。最新の標準を使用して、このようにプライベート コンポーネントを持つ構造体を定義することは有効ですか? それともIntelコンパイラのバグですか?gfortran 4.9.3cygwinprintnrFortran

0 投票する
0 に答える
154 参照

dll - Fortran 2003 クラスの dll を作成する方法

大規模な fortran コード ベースがあり、その一部を dll に移動したいと考えています。いくつかの調査を行った後、選択した IDE (code::blocks) で通常のfortran dllを構築する方法と、それを別のfortranプログラムで使用する方法を知っています。しかし、壁にぶち当たりました。dllにプロシージャを入れるだけでよい限り、すべてが桃色です。しかし、私がやりたいことは、Fortran プログラムでもそのクラスを使用できるように Fortran 2003 クラスを組み込むことです。最初の問題は、クラスをモジュールに埋め込む必要があることです (これは、DLL 用の通常の Fortran ファイルとはわずかではありますが重要な点で異なります)。これ自体は、dll を構築する上では大きな問題ではありませんが、サブルーチンやクラスにアクセスしようとする場合には問題になります。

現在、プログラムに use ステートメントを含める必要がある一時的な解決策があります。また、モジュール ファイル mydllmodule.mod をプログラムのモジュール ディレクトリに配置します。

fortran クラスを含む fortran dll を作成し、メイン プログラムでそれらにアクセスできるようにするより良い方法はありますか (コンパイラ固有のプラグマを使用せずに)。本番用に HPC でコンパイルして実行します)。私は、ユーザーの生活が可能な限りシンプルになるセットアップを探しています (つまり、dll をどこかに置くだけで、use ステートメントを使用することもできます)。

ありがとう

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

fortran - 手続きポインタ配列の自動初期化

プロシージャ ポインタの定数配列を自動的に初期化する方法はありますか?

整数変数の値に応じて呼び出す必要がある一連のルーチンがあります。ステートメントを使用する代わりに、select case以下に示すようにプロシージャ ポインターを使用したいと思います。ただし、プロシージャ ポインタ配列の明示的な初期化をスキップして、ラップされたプロシージャ ポインタの定数配列として定義できればよいのですが。以下のコードは、私が見つけた解決策を示しています。コメント行は、達成したい目標を示しています。

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

pointers - fortran での 1 次元ターゲット配列を指す非連続ポインター配列のパフォーマンス

要素を持つ1 次元配列Rを使用するコードがあります。のような粒子3Nの位置ベクトルと考えることができます。配列を簡潔に使用するには、パターンをこのように定義する必要があることに注意してください。NR=[r1x,r1y,r1z,r2x,r2y,...]

コードのセクションでは、x 座標に対してのみいくつかの操作を実行する必要があります。私は現在、次のようなものを使用しています:

Rxその後、操作で使用されます。これにより、アクセスが不連続になりますが、操作をベクトル化する方法が期待できるかどうか疑問に思っていました。別の方法として、粒子上でループを使用して OMP を使用することもできます。この問題に関する専門家の考え、特にパフォーマンスに関する可能な限りのベストプラクティスを知りたいです。

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

fortran - fortran ループのベンチマーク

Fortran プログラムの一部をベンチマークして、特定の変更の影響を理解し、定量化する必要があります (コードをより保守しやすくするために、たとえば関数ポインターを利用して、よりオブジェクト指向にしたいと考えています)。

有限要素の計算を実行するために、同じサブルーチンを数回呼び出すループがあります。ハードコーディングされた関数だけでなく、関数ポインターを使用することの影響を確認したいと考えています。

そのようなループの実行時間を取得し、それを nic の方法でフォーマットする簡単な方法は何でしょうか?

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

fortran - SOURCE= を使用して一度に複数の変数を割り当てる

(*) のような行を含む古い Fortran コードを更新しようとしています。

最初に、私はそれらをに変更しました

しかし、これは明らかにそれほど単純ではありません。だから私はそれらを組み合わせてみました

うまくいくとは思っていませんでしたが、実際には gfortran >=4.8 および Sun fortran 8.7 で動作しました (ifort-14 では動作しませんでした)。そこで、 F2003F2008のドキュメントの ALLOCATE セクションを調べたところ、F2008 では「SOURCE= が表示された場合、 allocation-listに含まれる割り当てオブジェクトは 1 つだけでなければならない」という制限が削除されたようです。これは、上記の行 1 は F2008 では問題なく、異なる動作は単に F2008 のサポートの程度が異なるためであるということですか?

(*) 実際のコードでは、派生型の配列コンポーネントをいくつか割り当てようとして、allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... )それぞれにゼロを割り当てようとしていました。そのため、これらの行をいくらか単純化できるかどうか疑問に思っていました。

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

oop - 多態性配列のサブセットをターゲット多態性配列にコピーする

サブルーチンに 2 つの派生型ポリモーフィック配列 (obj1 と obj2) があります。サブルーチンの使用に基づいて、2 つの配列の型は異なる場合がありますが、両方の配列は同じ型です。以下のサンプル コードでは、抽象クラス (モデル) の 1 つのサブタイプのみを示していますが、実際には、これを複数のサブタイプで機能させたいと考えています。さらに、製品コードでは、このコピーの前に model1 の要素が変更されています。

obj1、obj2 (タイプ A) (サンプル コードではタイプ linearDivisionMode の model1、model2 として指定) および一連のインデックスを指定して、指定された要素を obj1 から obj2 に転送し、そのプロセスで obj2 を割り当てます。

そのためにかなりの数のアプローチを試みましたが、どれもうまくいかないようです。

まず、ベクトル添え字を使用して直接代入を試みました。これは失敗し、割付け可能なポリモーフィック配列の直接代入がまだサポートされていないことを訴えます。

結果:

次に、ソース アロケーションを使用してみました。配列スライス表記でこれを試してみると、うまくいきます (しかし、私の問題は、このような範囲だけでは表現できません)。ソース配列のベクトル インデックスを作成しようとすると、コンパイルは実行されますが、実行時にメモリ不足によるエラーが発生します (システムを考えると、これは現実的ではありません)。

実行結果:

動作しますが、私の目的には十分ではありません。

第 3 に、部分要素を手動で転送することを期待して、多態的な配列を割り当てることができました。ただし、そうしようとすると、多態的なオブジェクトと組み込みの代入について苦情が寄せられます。これについては、この投稿の後半で説明します。

type select ステートメントを使用してポリモーフィック コンテキストを削除しようとしましたが、エラーが残ります。

結果:

回避策として、中間ポインター オブジェクトを使用し、そこから割り当てを行うことを望んでいました。f2008 標準 (ここで適用) により、ベクトル インデックス付き配列にポインターを割り当てることができません。興味深いことに、ポインタを作成すると、そのポインタのベクトル インデックスが生成され、コンパイラはセグメンテーション違反を起こし、何か奇妙なことが起こっていることを示します。

組み込み代入に関するコンパイラの不満に対処するために、私は代入ルーチンを作成することを検討しました。ただし、これには新たな懸念事項があります。これらのルーチンの両方が継承する親の型は抽象型であり、そのクラスで一般的な遅延代入演算子を指定できないようであり、かなりの数のプライベート メソッドを必要とする複雑な親クラスにつながります。プライベート変数を指定していないため、コピーします。さらに、サブクラス A と B の間の変換は十分に定義されていません。これはまだ残っている唯一の方法のようであり、複雑に思えます。

指定されたポリモーフィック サブアレイを効果的に転送するにはどうすればよいですか?

gfortran バージョン 6.1.1 を使用しています。