問題タブ [fortran2003]
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.
c - C ライブラリ ヘッダーからの Fortran 2003 バインディングの自動生成 (iso_c_bindings 組み込みモジュールを使用)
Fortran 2003 標準の組み込みモジュールを使用して、C ライブラリ ヘッダーからFortanバインディングを自動的に生成するツールはありますか?iso_c_bindings
C を Fortran に変換することには興味がなく、バインディングを生成するだけです。
class - Fortran 2003で多態的な方法で割り当てを解除する方法は?
ユーザー派生型階層を実装する前に、Fortran2003の機能を使用して多態的な割り当て解除を理解しようとしています。理想的な目標は、他の互換性のある子型を指す可能性のある宣言された親型ポインターの割り当てを解除する方法を理解することです。
次のコードが示すように、ファイルは基本型と継承型をliboo.f90
宣言します。どちらのタイプも、それぞれスカラーと配列の両方の状況に対応しています。このファイルは、18個の異なるサブルーチンを使用して異なる割り当て解除を試みます。Parent
Child
FINAL
test_liboo.f90
サブルーチン、、、、、、、は
TestParent_3_POINTER_CLASS
すべてセグメンテーション違反を引き起こします
。
のエラーメッセージを以下に示します。TestParent_7_array_POINTER_CLASS
TestChild_3_POINTER_CLASS
TestChild_7_array_POINTER_CLASS
TestPolymorph_3_array_Pointer_TypeForChildren_ClassForParents
TestPolymorph_4_array_Pointer_ClassForChildren_ClassForParents
TestParent_3_POINTER_CLASS
サブルーチンTestPolymorph_1_Pointer_TypeForChild_ClassForParent
は言うforrtl: severe (173): A pointer passed to DEALLOCATE points to an array that cannot be deallocated
。
理由をコメントしていただけませんか?
TestPolymorph_2_Pointer_ClassForChild_ClassForParent
セグメンテーション違反は発生しませんが、子を呼び出すだけですが、Final
などは子と親のTestChild_1
両方を呼び出すことができます。これは望ましいことです。Final
Final
Fortran 2003で継承された型を実際に保持する宣言された親型の割り当てを解除する方法を知りたいですか?どんな洞察も高く評価されます!
PS:コンパイラーはIntel Fortranコンパイラーであり、バージョンは次のとおりです。
エラーメッセージの1つ
Makefile
liboo.f90
test_liboo.f90
pointers - OpenMP を使用する場合、サブルーチンでポインターの割り当てを行う方法は?
次のコード サンプルが示すように、メイン プログラムは OpenMP を利用してサブルーチンを呼び出そうとします。そのサブルーチンでは、ローカル ポインター変数が作成され、反復されます。プログラムはSubscript #1 of the array PTEMPINTLIST has value 208 which is greater than the upper bound of 207
エラーを生成します (具体的な数値は異なります)。包括的なユーザー派生型を既に作成していomp-private
ますが、呼び出されたサブルーチンのローカル変数も宣言する必要があるようomp-private
ですが、これが正しいかどうかはわかりませんし、これを達成する方法もわかりません。
プログラムがそのようなエラーを出す理由についてコメントしていただけますか? さらに重要なこととして、OpenMP を使用する場合にサブルーチンでポインターを割り当てる方法に関するベスト プラクティスについてコメントしていただけますか?
Fortran コードが色付けされていない理由がわかりません。読みやすくするために、コードに色を付ける方法について誰かがコメントするのを手伝ってくれませんか?
コンパイラはインテル Fortran コンパイラで、バージョンは次のとおりです。
エラーメッセージを以下に示します。
コード サンプルは次のとおりです。
c - iso_c_bindingsを使用した単一のC関数への多くの代替Fortranインターフェース
iso_c_bindings
組み込みモジュールを使用して、単一のC関数/プロシージャーに対して複数のFortran 2003インターフェースを生成することは可能ですか?
CタイプのパラメーターがFortranのものと完全に一致しない状況に対応する代替インターフェースが必要です。たとえば*float
、Cの場合、配列、単一変数への参照、またはポインター(C_PTR_NUL)の場合があります。
fortran - 抽象型を拡張する派生型の演算子をオーバーロードするにはどうすればよいですか?
Metcalfらによる「Fortran95/2003の説明」の例を取り上げます。これは、独自のコードが同じことを目的としているためです。
さて、私の質問は、関数を適切に実装するにはどうすればよいかということですadd_my_integer
。my_integer
型にバインドされたプロシージャであるため、最初の引数をキャストする必要があるようですが、2番目の引数my_numeric_type
は抽象インターフェイスに準拠している必要があります。結果は、に割り当てる必要r
がありmy_integer
ますか?これが私がこれまでに思いついたもので、コンパイルされますが、タイプを常にチェックするのは奇妙に思え、セグメンテーション違反が発生します(おそらく私のコードの他の問題が原因です)。
fortran - OOP Fortran: インテント (IN) 変数へのポインターの保存
Fortran 2003 との互換性を維持しながら、可能な限り OOP の哲学に従って編成したい Fortran モジュールがあります。一部のデータで動作します。この関数 do_F はこれらの一時バッファーを使用しますが、いくつかの補助型にも依存します。
バッファを型に入れ、必要に応じて初期化/解放する必要があることは明らかです。ただし、do_F の各呼び出しには複数の引数が必要なため、どの設計戦略を使用するのが最適かは確信しています。
より具体的には、次の実装を検討してください。
do_F が呼び出されるたびに多数の型を渡す
/li>do_F が必要とする型へのポインターを保存します。
/li>
私の具体的な質問は次のとおりです。
- 実装 #2 は有効ですか? PGIコンパイラはそれについて文句を言いませんでしたが、関数が戻った後、intent(IN)が適切に定義されなくなったと聞きました
- このスキームをポインターで使用すると、パフォーマンスが低下しますか? これらの aux_ptr に書き込んでいない場合でも、コンパイラはケース 1 と同様にコードを最適化できますか?
いくつかのメモ:
- 関数 do_F は最大 100 回呼び出され、各呼び出しには数分かかり、大きな配列を操作します。
- do_F とは別に、同じデータを操作し、同じ補助変数を使用する do_G および do_H 関数もあります。そのため、そもそも関数に渡す変数の数を減らしたいと考えていました。
- すべての aux 変数を 1 つの型にまとめたくはありません。なぜなら、それらは大規模な HPC コードの残りの部分で使用されるからです。
ありがとう!
oop - Fortran 2003 の抽象インターフェイスと一緒に基本型へのポインタを返すオーバーロードされた関数?
Fortran2003 で連結リスト構造を書いています。このリンクされたリストのノードには、交互に 2 つの種類があります。リストはエッジのトポロジー リングを表し、各エッジは 2 つの頂点で囲まれ、各頂点は 2 つのエッジに接続されます。これらの構造体は抽象 NODE_T 型として宣言され、VN_T と EN_T の 2 つのサブクラスによって実装されます。VN_T は 2 つの EN_T を指し、その逆も同様です。リストはタイプ間で交互になるため、ポインターはサブクラスに格納されます。私の問題は、NEXT() および PREV() と呼ばれる VN_T および EN_T に型バインド関数 (メソッド?) を追加することであり、ポリモーフィズムを介して正しいことを行います。VN_T%NEXT() は2 つのステップでスキップし、次の VN_T を取得する必要があります (最初の VN_T とは EN_T で区切られています)。
私のタイプ/クラスの定義は次のとおりです。
next/prev ルーチンの実装はすべてほぼ同じで、next/prev と EN/VN の 4 つの組み合わせがあります。
これらの関数を呼び出すと:
次に、私のコンパイラ (Intel FORTRAN XE Composer 2011、つまり v12.0) が次のメッセージを表示します。
これに基づいて、このドキュメントは、サブクラスの実装の1つを選択するのではなく、基本クラスでプロシージャNEXTを呼び出そうとしていることを示しているようです(右側にあるNODE1の具体的なタイプに基づいて実行できるはずです)手元ですよね?)。
私は F2003 の OOP 機能に慣れていないので、Java でこのパターンのモックアップを作成し、満足のいく作業ができました。これが a) F2003 の OOP 動作の違いなのか、2) コンパイラのバグなのか、3) 頭がおかしいだけなのか、誰でも明らかにできますか...
python - 最新の Fortran コードを Python でラップするための現在の最良の方法
f2py2eを使用して古い Fortran 77 コードをラップしたことは知っていますが、新しい Fortran 95 コードでは機能しないことを理解しています。私は何を使用すべきかを調査し、fwrap とG3 f2pyに出くわしましたが、どちらも現在の状態や使用方法について何の説明もしていないようです。f2py のバージョンには、第 3 世代の f2py を使用するオプションがあることがわかりましたが、機能しないとコメントされています。これを考えると、どのプロジェクトを使用すればよいかわかりません。どちらを使用する必要がありますか?
この質問は現在、Computational Science スタック交換サイトにクロスポストされています (そして回答されています) 。
oop - 最新の Fortran を使用したソルバーの優れた OOP 設計
PDE 系を解くための Fortran コードを設計しています。
現在設計されている方法は、Variable
いくつかの属性を持つ型を持っているということです。その中で最も重要なのはval
、値を格納する配列です。
solver
これで、 で計算を実行するクラスも作成されましたvariable
。全体variable
をソルバーに渡し、variable%val
それを実行するたびに (実行中に数千回) 作業するのは非効率的であると考えたので、solver
クラスでポインター フィールドを定義して to ソルバーにバインドすることにしました。適切な変数。例えば
そしてソルバーモジュール
私のプログラムでは、さまざまな物理特性に対してさまざまな変数を定義し、上記の方法でそれらの変数に関連付けられたさまざまなソルバーを定義しています。
私は一般的にOOPに慣れていないので、私の質問はそれがまともな設計であるかどうかです? 特にパフォーマンスの観点から。T
これは、配列だけを作成してサブルーチンに渡す場合と比較してsolve
、速度の点でどうですか? これを行う定期的な方法はありますか?
fortran - fortran 2003 を使用した完全なオブジェクト指向の例?
このC++コードに相当する単純なFortran 2003オブジェクト指向レイアウトの場合の例を教えてください。
コードに問題があります。以下を参照してください
特に、基本クラスを初期化する方法と、派生クラスのデストラクタを定義する方法が明確ではありません。
ありがとう