問題タブ [fortran-common-block]
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.
fortran - 一般的なブロック変数が値を保持しないのはなぜですか?
まず、共通のブロックを使用することは、Fortran(および一般的なプログラミング)では悪い考えであることを私は知っています。しかし、私は他の誰かのコードを更新しているので、動作することがわかっているものを台無しにしたくありません。
第二に、私はこれよりも具体的な何かを投稿する必要があることを知っています。これを小さなものに減らす方法を知っていれば、私はそうするでしょう。ただし、2500行のコードを理解しているとは思わないので、具体的な例を投稿することはできません。
それを念頭に置いて、私は自分の問題を説明することはできません。
他の人のFortranコードを更新しています。その男は、いくつかの共通ブロックを使用してグローバル変数を設定しました。どういうわけか、そのようなブロックを使用する関数を呼び出すと、その値はすべて0になります。以前に誰かがそれに遭遇したことがありますか?なぜこれが起こるのか誰かが知っていますか?これを再現する方法は?これを確認するための開始点があれば役立ちます。
その価値のために、前述の共通ブロックは次のように宣言されます
block
4D配列です。x
、、y
およびz
は1D配列です。llx
、、、lly
およびllz
はdouble precision
タイプです。残りはinteger
タイプです。
共通ブロックは、関数が呼び出される前にメインプログラムで宣言および初期化されます。
fortran - Fortran 77 コード (共通ブロックと同等の組み合わせ) から Fortran 90 への移行
Fortran 77 コードでは、共通ブロックと等価ステートメントの組み合わせ使用があります。例えば、
この種の Fortran 77 コードを Fortran 90 コードに変換する実行可能なソリューションを提供できる人はいますか?
fortran - Fortran 77 -> Fortran 90+: COMMON ブロック、MPI_Bcast
F77 プログラムを最新の Fortran 標準 (90 以降) にリファクタリングしています。
いくつかの変数が定義されているモジュールがあります。これらの変数は現在、共通ブロックに配置されています。外部サブルーチンでは、これらの変数はすべて、1 つの MPI_BCAST 呼び出しのみを使用してブロードキャストされ、この共通ブロック内の変数の連続ストレージを利用するためです。
問題は、共通ブロックの長さがcom_length
手動で計算され、エラーが発生しやすいことです。COMMON ブロック定義が欠落している場合、valgrind でさえ OOB に気付かないため、デバッグに時間がかかります。一方、変数ごとに個別に MPI_BCAST を呼び出すと、パフォーマンスに悪影響を及ぼします。
これをリファクタリングする方法についてのご提案をお待ちしております。
fortran - F77 共通ブロックを F90 または F95 に変更します。
このような古いfortranプログラムがあります
fortran 90 または 95 に変換したいのですが、blc0、blc1、blc2 の意味がわかりません。最後の行の 1 と ro_ks の意味は何ですか? 誰でもそれを fortran 90 または 95 に変更できますか?
fortran - MPI_Bcast を使用して 3 次元配列を渡す
を使用して、3D 配列を他のすべてのプロセス (FORTRAN 77) に渡そうとしていMPI_Bcast
ます。v1
一般的なブロック配列です。また、共通配列の計算値をv1
他のすべてのプロセスにブロードキャストする必要があるかどうか、または共通であるため各プロセスで変更されるかどうかもわかりません。関連するコードは次のとおりです。
エラーメッセージが表示されます:
渡される配列のサイズは正しいです。任意のコメント?
コードを修正し、ランクをループして、各ランクの rcount と displs のすべての要素を計算しました。
しかし、それでも間違った結果です。1-私の場合、各部分の結果は次の部分、特に後に使用されます。それぞれの後mpi_allgatherv
に追加する必要がありますか? 2-mpi_in_place を使用する必要がありますか? 各サブ配列が何らかのプロセスによって計算される3D配列が1つしかなく、計算されたサブ配列を同じ配列の適切な部分に配置したいと考えています。3- fortran77 では常に displs(1)=1 であることを考えると、for i=>2 が必要だと思います。だから私はこれを修正しました:ループの前、ループの内側、ループの後。私は正しいですか?mpi_barrier
mpi_allgatherv
v1
v1(1,1,i)
displs(i) = sum(rcount(1:i-1))+1
displs(1)=1
displs(rank+2)=rank*scount+1
displs(nprocz+1)=0
gcc - Fortran 77 が共通ブロックについて不平を言う
FreeBSD 9.2 で gfortran 4.8.2 を使用して、いくつかの実行可能ファイルを作成しています。1 つの C ファイルと 2 つの Fortran 77 ファイルの 3 つのファイルがあり、1 つの共通ブロックで 2 つのルーチンを使用しています。
問題は、gfortran コンパイラから複数の定義のエラーが表示されることです。
サーバーに送信したリクエスト:
di8810.c
gds100.f
gds102.f
エラーは次のとおりです。
それは私を夢中にさせています。何か案は?
fortran - Fortran で SAVE と COMMON を一緒に使用する目的
Fortran の共通ブロックはグローバル変数の目的を果たしますか?
この場合、これらの値をサブルーチンで変更できますか?
SAVE
サブルーチン内以外で使用するために、サブルーチン内から変更されたパラメーターを保存しますか?