問題タブ [fortran90]
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 - Fortran90のテキストファイルから1行スキップします
私はFortran(90)で書いています。私のプログラムはfile1を読み取り、そのすべての行で何かを実行し、結果をfile2に書き込む必要があります。しかし、問題-file1の最初の行に不要な情報がいくつかあります。
Fortranを使用して入力ファイルから1行スキップするにはどうすればよいですか?
コード:
最初の行はテキストと数字の組み合わせです。
cuda - Fortranでカスタム配列を作成するには?
cuda ライブラリを fortran に移植することを検討しています。PGIとEM Photonicsは、現在存在する 2 つのライブラリのようです。しかし、私はここで探しているものしか見つけられませんでした
私の質問は、上記のコード サンプルのようなカスタム配列を作成する方法はありますか? それとも、PGI の専用コンパイラの一部ですか?
さらに明確にするために編集
つまり、私はこれを行うことができます
fortran - 私のコードに残ったエラーは 1 つだけです。
85 行目と 87 行目に同じエラーが 1 つだけ表示されます。次のように表示されます。
y は y(j-1) に暗黙の型を持たず、y(j+1) にもありません。
fortran - Fortran 90 でのスタック オーバーフロー
私は Fortran 90 でかなり大きなプログラムを書きました。それはかなり長い間美しく動作していましたが、今日はそれを一段階上げて問題のサイズを大きくしようとしました (それが研究用の非標準 FE ソルバーである場合、誰にも役立ちます...) 今、「スタックオーバーフロー」エラーメッセージが表示され、プログラムは当然、作業に役立つものを何も提供せずに終了します。
プログラムは、関連するすべての配列と行列の設定から開始し、その後、これに関する数行の統計をログ ファイルに出力します。私の新しいより大きな問題でも、これはうまく機能しますが(少し遅いですが)、「数の計算」が進むにつれて失敗します。
私を混乱させるのは、その時点ですべてがすでに割り当てられていることです(そして、エラーなしで機能しました)。スタックが何であるかは完全にはわかりません (ウィキペディアとここのいくつかのトレッドは、コンピューターの「舞台裏」の仕組みについて非常に基本的な知識しか持っていないため、あまり役に立ちませんでした)。
たとえば、次のように初期化されたいくつかの配列があるとします。
いくつかの初期化ルーチン(つまり、ファイルからの入力の読み取りなど)が次のように割り当てられた後、次のように割り当てられます(固定サイズのIAのサブルーチンに簡単に渡すために、いくつかのサイズ整数を保存します):
これは基本的に最初の部分で発生することであり、これまでのところ問題ありません。しかし、次にサブルーチンを呼び出すと
そして、ルーチンは次のようになります (派手なものはありません):
今、私はエラーが発生します!画面への出力には次のように表示されます。
ただし、デバッガーでプログラムを実行すると、419 行目で、というファイルwinsig.c
(私のファイルではなく、おそらくコンパイラーの一部?) で中断します。呼び出されたルーチンの一部のようであり、sigreterror:
呼び出されたのはデフォルトのケースであり、テキストを返しますInvalid signal or error
。これに奇妙なことにコメント行が添付されています/* should never happen, but compiler can't tell */
...?
だから私の質問は、なぜこれが起こるのか、そして実際に何が起こっているのかということだと思います. 関連するすべてのメモリを割り当てることができる限り、私は大丈夫だと思いましたか? サブルーチンの呼び出しは、引数のコピーを作成しますか、それとも単にそれらへのポインタを作成しますか? 答えがコピーである場合、問題がどこにあるのかがわかります。もしそうなら、それを回避する方法についてのアイデアはありますか?
私が解決しようとしている問題は大きいですが、決して正気ではありません。標準的な FE ソルバーは、現在の問題よりも大きな問題を処理できます。Dell PowerEdge 1850 でプログラムを実行しており、OS は Microsoft Server 2008 R2 Enterprise です。プロンプトによるとsysteminfo
、cmd
8 GB の物理メモリとほぼ 16 GB の仮想メモリがあります。私が理解している限り、すべての配列とマトリックスの合計は、おそらく 100MB を超えてはならない - 約 5.5Minteger(4)
と 2.5M real(8)
(私によれば、これは約 44MB しかないはずですが、公平を期して、オーバーヘッドのためにさらに 50MB を追加しましょう) )。
Microsoft Visual Studio 2008 に統合された Intel Fortran コンパイラを使用しています。
少し明確にするために実際のソースコードを追加する
ルーチンへの実際の呼び出しです。大きな配列はposc
、bmtrx
およびaa
- 他のすべてのものは、少なくとも 1 桁小さい (それ以上ではないにしても) です。posc
でINTEGER(4)
ありbmtrx
、でaa
あるREAL(8)
そして、上記の最後の行の前で失敗します。
fortran90 - 整数を long double に変換する
long double ランダム ジェネレーターを作成する必要があります。高精度のランダムシーケンスは必要ないため、線形合同ジェネレーターについて考えています。しかし、整数を long double に変換するにはどうすればよいでしょうか?
fortran - 複数の部分からなる Fortran プログラムのコンパイル
私は Fortran と Intel コンパイラ全体に非常に慣れていません (Visual Studio 統合のない IMSL ライブラリを備えた Windows ベースの Intel コンパイラを使用しているため、コマンドラインのみです)。
問題は非常に単純なはずです。コンパイルする必要のある Fortran プログラムがあり、それは 4 つの異なるソース コード部分として格納されています。メイン プログラム (およびいくつかのサブルーチン) は、central.for という名前のコード ファイルに格納されています。また、s1.for、s2.for、および s3.for と呼ぶ 3 つのファイルもあり、それぞれに 1 つのサブルーチンのみが含まれています (letsそれらを sub1-sub3) と呼び、メインプログラムはありません。メイン プログラムは、s1 ~ s3 および central.for に格納されているサブルーチンを呼び出します。
問題は、どのようにコンパイルする必要があるかです。
central.for をコンパイルしようとすると、error LNK2019: unresolved external symbol _SUB1 referenced in function _MAIN__
. 同様に、SUB2 と SUB3 についても同じメッセージが表示されます。
s1.for-s3.for をコンパイルしようとすると、error LNK2019: unresolved external symbol _MAIN__ referenced in function _main
どうにかしてそれらをリンクする必要があることは明らかです。しかし、私は方法がわかりません
fortran90 - 型である型メンバーをターゲットにすることはできますか?
次の設定があるとします
他のタイプも欲しい
barPtr
を指すように設定しfoo%bar
ます。これを行うには、 を宣言する必要type(BarType), target :: bar
がありますが、エラーが発生しました。私はこれ以上調査せず、戦略を変更することにしましたが、好奇心のために、これが許可されているかどうか知っていますか?
fortran - Fortran 90 と Fortran 95 の違い
Fortran 95 コンパイラで Fortran 90 ファイルをコンパイルできますか? Fortran 95 にはたくさんありますが、Fortran 90 にはありません。
fortran - Fortran 90 でより優れた倍精度代入はありますか?
Fortran 90 (Mac OS X で gfortran を使用) では、種類を明示的に追加せずに倍精度変数に値を代入すると、精度が「取得」されません。つまり、次のプログラムを実行すると、次のようになります。
私は結果を得る:
単精度の結果は、予想どおり小数点第 8 位で四捨五入されますが、_dp で明示的に割り当てた倍精度変数だけが 16 桁すべての精度を維持します。倍精度変数が自動的に倍精度になると私が予想していたように (私は比較的 Fortran に慣れていません)、これは奇妙に思えます。倍精度変数を割り当てるより良い方法はありますか、または上記のように明示的に入力する必要がありますか?
format - Fortran90/95でのフォーマット
私はFortran90/95を学んでおり、使用している本には、フォーマットステートメントに対するラインプリンターの影響についての議論がありました。この本によると、プログラムは行の最初の文字を使用して、前の行に対する行の位置を決定します(つまり、「1」は新しいページを開始し、「0」は行をスキップし、「+」は前の行を上書きし、 ''または他の文字は、前の行の下に新しい行を書き込みます)。これをテストするために、コンソールで簡単なプログラムをコンパイルして実行しましたが、この動作は観察されませんでした。
出力は
私が期待していた場所
なぜこれなのか誰か知っていますか?これはFortran90/95で使用されていないレガシー機能ですか?コンソールへの印刷の特定の動作ですか?書くときに、フォーマットステートメントで特別な最初の文字を宣言する必要があるのはいつか(もしあれば)知りたいです。
私のコンパイラはForce2.0.9で、これはgfortranに基づいていると思います。私はそれをWindows7で実行しており、コンソールはPowerShellです。
助けてくれてありがとう!