• 締切済み

物理数値シミュレーションの結合と通信

 数値シミュレーションの技法に関する質問です。(以下、長文ですみません)  2つの数値計算プログラムがあり、それぞれ単独で、まあ正常に動作しています。その2つのプログラムは別の例えで言うと、プログラムAは空、プログラムBは海というものに対応しており、海面という境界では通信する必要がある、というようなものです。プログラムA,Bを何とか結合して全体を含んだプログラムCを作りあげるのが一般的なのかもしれませんが、プログラムA、Bについてそれぞれにあまり手を加えず、通信ができる仕組み(ファイル入出力で対応など)を少しだけ付加してプロセスとしては別々に実行できないかなと考えています。A,Bともに時間的に変化していくので、境界面での通信もそのつど計算する必要があるのです。  まず、Aを実行して、あるところで一旦休止して、Bが動き始め、あるところで休止し、またAが動く...というようなことなのかなと思いますが。この場合、A,Bが交互に動くという意味で同時性がないように思われますが、Aが終わったあと、Bが後ろから追いかけてくるというイメージです。1つのアイディアですが、AからBを呼び出すことができれば、AがBを呼び出し、実行している間、Aは待っており、Bが終わったらまたAが動き出す(そのあとまたBが呼び出される)という方法です。  2つのプログラムは変数名が同じだったりするので変数管理が大変で間違いそうなのでできればソースを編集して結合するのはやりたくないと思っています。  Linuxのシェルスクリプトだったら何でもできるというのかもしれませんが、私は主にWindowsユーザで言語はFortran, シェルというよりバッチ(バッシュよりバッチ)という環境で使っています。(Fortran90以降はモジュールという考え方も出ているようですが、どんなものかなと思いますが。) 何かアイディアがあれば教えて頂きたいのですが。よろしくお願いします。 ※今回の質問はプログラム2つでしたが、うまくいったら3つ4つとなっていく可能性ありです。 ※適当なカテゴリが見つからず、Cのユーザだったらシステムのキモの部分から何でも知っているはずなので、このカテゴリにアップしました。

みんなの回答

  • f272
  • ベストアンサー率46% (7992/17078)
回答No.1

Aを起動して,1タイムステップ実行しその結果をファイルに出力して,Bを起動してAの結果ファイルを読み,1タイムステップ実行しその結果をファイルに出力して,Aを起動して,Aの結果ファイルを読み,1タイムステップ実行しその結果をファイルに出力して... という形でいいのであれば簡単ですね。 そういう動作をするドライバプログラムを作成しましょう。ドライバでは,Aの入力ファイルの設定,Aの実行,Bのの入力ファイルの設定,Bの実行を必要な回数だけ繰り返すようにしておけば良いです。

skmsk1941093
質問者

お礼

回答ありがとうございます。 ドライバプログラムとは、プログラムの起動をコントロールするものだと思います。シェルスクリプト、バッチ、プログラム言語本体などあるかなと思いますが、ループを回すということを考えるとどれがよい、と言えるでしょうか。バッチでできるかなと思いますが。バッチもシェルスクリプトも文法もよく知らないのですが。 (別件ですが、2つのプロセスを起動するようなことはシェルスクリプトじゃないとできないですね。) また、やはりファイルによるデータ共有ですからその分のロスタイムが大きいかなと思いますが、どのような感じでしょうか。

関連するQ&A

  • エクセル 関数 数値の結合 

    19 31 20 7 19 50 18 28 16 4 13 1 のように数値データが2列(A列、B列)あります。A列とB列を「.」を入れて結合して19.31, 20.07, 19.50,... のようにしたいのですが、問題は&でつなげると、B列の数値が1文字の場合、20.7となってしまいます。20.07としたいのですが、B列の1文字のとき0を入れて結合する手順を教えてください。

  • 数値計算で生じる小さなごみ

    ある問題を数値的に解こうと思いFortranでプログラムを組んでいるのですが、倍精度の数値計算で以下のような事が起きて困っています。 プログラムの中で A=B-C*D (変数は全て倍精度実数変数) のような代入文があるのですが、 write(*,*) B,C,D とすると、0.250000000000000 0.500000000000000 0.500000000000000 と表示されるのですが、 write(*,*) B-C*D や write(*,*)A では-1.79570984817912D-017 などと表示されます。(この数値に意味はないのでしょうが、同じシチュエーションでは常に同じ値が表示されます) 入力した値の精度外の「誤差」ですが、どこに原因のある問題でしょうか? 因に使っているコンパイラはintelのサイトで入手したフリーの評価版ifc ver.6 でそれにpentium4に最適化するオプションをつけてコンパイルしています

  • 配列の結合

    変数1 Array ( [A] => あいうえお ) 変数2 Array ( [B] => わおん ) というような二つの変数の配列を Array (   [A] => あいうえお   [B] => わおん ) というように、ひとつの変数内に結合する方法はないでしょうか?

    • ベストアンサー
    • PHP
  • シリアル通信について

    現在、VB6.0を使用してシリアル通信のプログラムを作成しております。 その中で、通信先に対してバッチファイルを実行させてたいのですが、 通信先に対してバッチファイルを実行させる方法がわかりません。 どのようにするのか教えて頂けないでしょうか。 また、実行するバッチファイルでは引数を渡す必要があるようなのですが その方法も教えて下さい。 よろしくお願い致します。

  • 数値を文字列として結合した結果を数値に変換する

    お世話になっております。 プログラムで、文字を結合した結果を数値に変換する処理にて 処理を高速化できる記述方法があるか質問させてください。 ・やりたいこと  複数の数値を文字列として結合した結果を数値型に高速で変換したい。 ・現在のコード(考え方 C#にて)  今、以下のように数値変換しているのですが、  これ以外の書き方で、スマートな方法はないでしょうか?  ※結果がわかりやすいように変数はその都度宣言しています。 int i1 = "10"; int i2 = "2"; string sConcat = i1.ToString() + i2.ToString() ; // "102" // To Int int convertedInt = int.Parse( sConcat ) ; //102 // To Hex int convertedHex = Convert.ToInt32( sConcat , 16 ); // 0x102 数値を文字にして結合して・・・またキャストというのが 無駄なような気がしています。 すみませんが、良い方法があればご教授ください。

  • JAVA: プログラム間の通信について

    JAVA初心者の者ですが、実行可能なプログラム A, Bの2つがあるとして、 プログラムAを実行した後、 プログラムAの動作中にプログラムBを実行して、動作中のAの変数にアクセスしたり、 Aの関数を実行する事ってできないでしょうか? 調べていても中々出ないので質問させて頂きました。 すみませんが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 数値計算の高速な実行

    Fortranで記載している数値計算プログラムを高速に実行したいのですが、 1) コンパイルは64bitで行なった方が早いでしょうか? 2) 現在お薦めなCPUはCore 2 Duoでしょうか? コンパイラはintel fortran、OSはCentOSを使用予定です。 その他、数値計算の高速化に関してお薦めがありましたらお願いいたします。

  • 複数のシートを持つ2つのエクセルファイルを単純に結合したい

    ファイルとして保存してあるエクセルのブックファイルAには10のシートが含まれており、同様のブックファイルBと結合して、20のシートが含まれるブックファイルCを作りたいのですが、エクセルを開いて対話形式で実行するのではなく、バッチファイルに引数としてファイルA・B・Cを渡して実行するなどの方法を探しております。 ご教示いただけると大変助かります。

  • 結合?の方法がわかりません

    恐らく結合だと思ってタイトルを結合という形にしました。 データが 名前  A   B   C A   1 A       2 A          3 B   5       B          6 このような形で構成されております。このデータを 名前  A   B   C A   1   2  3 B   5      6 このようにしたいのですが、言語が4th dimensionという言語なので調べてもなかなか出てきません。なので質問させて頂きました。 もっと言ってしまえば、このデータを適当な変数を使って一覧として出力したいのです。お分かりの方ご教授をお願いします。

  • 数値計算ができるようになりたいのですが…

    現在、大学院修士課程1年です。 将来はアカデミックな研究者を目指しています。 今行っている研究で、非線形方程式(多変数)の解を数値計算を用いて得たいと考えています。 今まで数値計算はやったことがないのでこれから勉強をはじめるところなのですが、少し悩んでいます。 今は数値計算に便利なMATLABのような市販ソフトがあることが分かっており、勉強すれば短時間で実際に研究につかうことができそうです。 しかし、やはり研究者を目指すなら、そのようなソフトに頼らず、しっかりと数値計算の理論を理解したうえで、FORTRANなどで自らプログラムを書くべきなのでしょうか。 良いアドバイスがありましたらよろしくお願いします。