問題タブ [fortran]
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を学ぶ
私は最近、科学計算を多用する大量の FORTRAN コードを保守するようになりました。Google と 2 つの入門レベルの本があるにもかかわらず、たとえば 40 年前の言語のすべてのニュアンスを理解するのに苦労しています。コードには「パフォーマンス向上の改善」が盛り込まれています。FORTRAN を CS 101 レベルに最適化解除するためのガイドや実用的なアドバイスはありますか? FORTRAN コードの最適化がどのように行われたかを知っている人はいますか? FORTRAN 77/90 コードベースを引き継いで Java/C++/.NET で育った開発者には起こらない、典型的な FORTRAN の「落とし穴」はありますか?
compiler-construction - どのFortranコンパイラがありますか?
この時代にはどのFortranコンパイラがありますか?どれをお勧めしますか?サポートされているFortranのバージョン、動作するプラットフォーム(* nix / Windowsなど)、および費用がかかるかどうかをリストしてください。
(標準OSは回答ごとに1つなど)
.net - 64 ビット プロセスから 32 ビット コードを呼び出す
32 ビットから 64 ビットに移行しようとしているアプリケーションがあります。これは、x64 フラグを使用してコンパイルされた .NET です。ただし、32 ビット用にコンパイルされた FORTRAN 90 で記述された多数の DLL があります。FORTRAN DLL の関数は非常に単純です。データを入力し、データを引き出します。どんな状態でもない。また、そこに多くの時間を費やすことはなく、合計でおそらく 3% ですが、それが実行する計算ロジックは非常に貴重です。
どうにかして 64 ビット コードから 32 ビット DLL を呼び出すことはできますか? MSDN は、できないと示唆しています。簡単なハッキングを行い、これを確認しました。すべてが無効なエントリ ポイント例外をスローします。これまでに見つけた唯一の解決策は、すべての 32 ビット DLL 関数に対して COM+ ラッパーを作成し、64 ビット プロセスから COM を呼び出すことです。これはかなりの頭痛の種のようです。プロセスを WoW エミュレーションで実行することもできますが、メモリの上限は増加せず、約 1.6 GB に制限されます。
64 ビット CLR プロセスから 32 ビット DLL を呼び出す他の方法はありますか?
c - Fortran は C よりも重い計算を最適化するのが簡単ですか?
Fortran は重い計算では C よりも高速である、または C よりも高速である可能性があることを時々読んでいます。それは本当に本当ですか?私は Fortran についてほとんど知らないことを認めなければなりませんが、これまで見てきた Fortran コードは、この言語が C にはない機能を備えていることを示していませんでした。
本当なら理由を教えてください。数値計算に適した言語やライブラリを教えてください。そのためのアプリやライブラリを作成するつもりはありません。ただ興味があるだけです。
fortran - Fortran のプライベート関数
Fortran でプライベート関数を宣言するにはどうすればよいですか?
c# - C# から FORTRAN DLL を呼び出す保護されたメモリ違反
FORTRAN コードからコンパイルされたレガシー dll を呼び出そうとしています。私は Interop を初めて使用しますが、それに関する記事をいくつか読んだことがあり、私の場合はかなり簡単なようです。
本当に呼び出したいメソッドには複雑なメソッド シグネチャがありますが、この単純な GetVersion メソッドを呼び出すことさえできず、保護されたメモリ違反が発生します。
ここに私の DllImport コードがあります:
FORTRAN コードは次のとおりです。
失敗した単体テストは次のとおりです。
エラーメッセージは次のとおりです。
私が試した他のこと:
- デフォルトのマーシャリングの使用
- 文字列の代わりに char[] を渡す (代わりにメソッド シグネチャ エラーを取得する)
c# - C# での FORTRAN の丸めの一致
FORTRAN には、倍精度数を整数値に変換する関数がいくつか用意されています。切り捨て/丸めの方法が異なります。これらを使用する複雑な科学アルゴリズムを変換しています。
FORTRAN のドキュメントによると、
aint(x)は、x と 0 の間の最も近い x の整数値を返します。
anint(x)は、xに最も近い整数値を返します。ただし、途中の場合は、より大きな整数値に丸められます。
nint(x)は、x を最も近い int 値に丸める int 形式に変換します。
これらを C# で実装している人はいますか? 正解するのは難しいかもしれません。
(int)x は aint() と一致するように見えます
Convert.ToInt32(x) は上記のいずれとも一致しません。
Trunc(x) は上記のいずれとも一致しません。
Round(x) は anint または nint に一致する可能性があります。
anint と nint の違いは戻り値の型にあるようです。anint は倍精度値を返しますが、nint は整数を返します。両方が使用されます (実際のサンプル):
DOUBLE PRECISION A、B、C、D、E、F、G
... ここで設定される値 ...
F = ANINT(AB) + ANINT(CD) + ANINT(B+DE)
G = NINT(F) + 1D0;
おそらく、FORTRAN の専門家は、作成者が両方を使用することを選択した理由を明確にするのに役立つ可能性があります (意図的なものだと思います)。
c - Fortran プログラムの mtrace
mtrace
Fortran プログラムでメモリ リークを検出するために使用しようとしています。gfortran コンパイラを使用しています。mtrace の (動作する) C の例については、ウィキペディアのエントリを参照してください: http://en.wikipedia.org/wiki/Mtrace
私は両方の方法を試しました。つまり、mtrace() と muntrace() をラップして fortran プログラムから呼び出し、また mtrace() と muntrace() を直接呼び出す C プログラムを作成しました。どちらの方法でもメモリ リークを検出できませんが、ここでは後者のみを紹介します。
example.c
leaky.f90
私はコンパイルします:
次に、次のように実行します。
raw.txt
mtrace
次に、出力を次のように解析します。
そして得る:
メモリリークはありません。
私が間違っていることはありますか、またはmtrace
リークのあるfortranメモリ割り当てを見つけるためにできることはありますか? gfortran はトレースしない別のmalloc
呼び出しを使用していると思いmtrace
ます... 実際、上で書いたように、(ラップされた)mtrace()
とmuntrace()
.
EDITED:他のオプション(ここではまだ言及されていないものを含む)を検討しましたが、デバッグ中の実際のコードはP6 / AIXで実行されるため、Valgrindは「ちょうど」不便です(別のマシンで実行する必要があります)一方、Forcheckは不便 (別のマシンで実行する必要があります) で、高価です (~ 3k$)。現時点では、mtrace が最適なソリューションです。
再編集:私の推測
gfortran はトレースしない別の
malloc
呼び出しを使用していると思います...mtrace
正しかった。実行可能ファイルを調べると ( または のいずれかでnm
)readelf
呼び出しはありませんmalloc()
が、_gfortran_allocate_array
malloc を呼び出す可能性があるものがあります)。他のアイデアはありますか?
再度編集: 回答を投稿しましたが、受け入れることができません ( http://stackoverflow.uservoice.com/pages/general/suggestions/39426にアクセスして、機能をリクエストしてください。本当に必要です。評判の向上は必要ありません)。
c++ - Fortran 77 コードの C++ への変換
Fortran 77 コードの大きな (私たちのコードは 550,000 行です) プログラムを C++ に変換した人はいますか? どのような落とし穴に遭遇しましたか? 変換は成功しましたか? for_c
( http://www.cobalt-blue.com/fc/fcmain.htm )のようなツールを使用しましたか? 結果の C++ コードは大幅に高速化されましたか、それとも低速化されましたか?
c - 特定のオブジェクトのホームであるライブラリを見つけるにはどうすればよいですか?
Irix 6.5 を実行している SGI で FORTRAN と C でプログラミングしていますが、これはすべての Unix 系システムに適用できるはずです。「未解決のテキスト シンボル」リンク エラーが発生した場合、自分のプログラムにリンクする必要があるライブラリを見つけるにはどうすればよいですか? リンカーから見たものの例を次に示します。
どのライブラリが必要かを知る必要がありますか?それとも、これを理解するのに役立つツールやコマンドはありますか?