質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

1回答

908閲覧

Fortran サブルーチンがcallされるたびに中身を書き換えたい

Tubasa1995

総合スコア83

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2021/09/07 10:36

編集2021/09/07 11:46

現在オープンソースのCode Saturneというものを利用して流体の数値計算を行っています。
その中でオープンソースでのGUIでは設定できないことに関して、CまたはFortranでサブルーチンファイルが必要になってきます。今悩んでいる数値計算の境界条件の設定のためのサブルーチンファイルはFotranで実装しています。
このオープンソースでは、数値計算での1stepごとに、特定のフォルダに置いてあるサブルーチンファイル(.f90)を読み込んで境界条件というものが設定されるという仕組みになっています。現状、そのサブルーチンファイルの中身は常に一定という状態で数値計算をしているのですが、将来的には、そのf.90のファイルが読み込まれる(サブルーチンがcallされる)度に、そのファイル内の値を一つ変えようと思っています。

そこで質問なのですが、プログラミングにおいて、その「サブルーチンがcallされる度に~~をする」というコードは可能でしょうか?
プログラミング内でその特定のファイルが読み込まれる度に、ということをどのようにコードに定義することができるのでしょうか。

過去に
Fortranに関しては完全にやったことがありません。
これまでpythonとC(読むだけのために勉強しました)に関しては経験があります。

読み込んで変更されるファイルの中身は下記です
boundary_condition.f90

call getfbr('inlet', nlelt, lstelt) do ilelt = 1, nlelt ifac = lstelt(ilelt) itypfb(ifac) = ientre !Dirichlet B.C for pressure: icodcl(ifac,ipr) = 1 rcodcl(ifac,ipr,1) = 101325.633 !Neumann B.C for velocity: icodcl(ifac,iu)= 3 icodcl(ifac,iv)= 3 icodcl(ifac,iw)= 3 enddo

この中の「101325.633」という数値を、このサブルーチンが呼び出される度に変更できれば良いです。
これは単なるif文などで可能でしょうか?
「if ~~サブルーチンがcallされたら」などで可能でしょうか?

getfbrの定義に関しては下記です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppaul

2021/09/07 11:04

どこでサブルーチンを定義しているのですか?
Tubasa1995

2021/09/07 11:16

的がはずれた返信になっているかもしれませんが、 実行ファイルとサブルーチンのファイルの位置関係は 実行ファイル:course/script/runcase(実行ファイル) サブルーチン:course/src/use_subroutine.f90 というようになっています。
Tubasa1995

2021/09/07 11:24

実行ファイルを実行し、時間stepが1つ進むたびに、use_subroutine.f90を読み込んでサブルーチンをcallしていると思っています。
ppaul

2021/09/07 11:43

subroutine文が何かはわかりますか?
Tubasa1995

2021/09/07 11:48

それは私が理解しているか?という質問でしょうか。 fortranはやったことないですが、なんとなくは理解しています。 質問部分に今回使用するサブルーチンの追加情報の写真を載せました。
ppaul

2021/09/07 12:17

サブルーチンを定義しているファイルの中身を毎回変えたいという質問なのかと思っていたのですが、そうではなくて、サブルーチンを呼び出しているファイルを毎回変えたいという質問なのでしょうか。 そのあたりが良くわかりません。
Tubasa1995

2021/09/07 13:30

質問文にある boundary_condition.f90 ファイルの中身をcallされる度に変えたいということです。
ppaul

2021/09/07 13:49

かみ合っていないようですので、回答は控えさせていただきます。
Tubasa1995

2021/09/07 13:51

回答をされている方の回答を見ても、質問文の意味が分かりませんか?
Tubasa1995

2021/09/07 13:53

サブルーチンがリンクされてコールされる形式、だと思います。
guest

回答1

0

そのf.90のファイルが読み込まれる(サブルーチンがcallされる)度に、そのファイル内の値を一つ変えようと思っています。

「ファイルが読み込まれる」と「サブルーチンがcallされる」の関係が不明ですが、Fortranブログラムはどうやって実行しようとしているのでしょうか?

単独の実行ファイルになっていて、それを起動するのであれば、内部に変化する情報を持つのは不可能なので、ファイルに情報を持つしか無いです。

これまでpythonとC(読むだけのために勉強しました)に関しては経験があります。

プログラミング経験ゼロと言うことですかね?

1つのやり方としては、
・プログラム中で使いたい数値が並んだファイル
・そのファイルの何番目の数値を次に使うかという番号を記録するファイル
という2つのファイルを作って管理します。

投稿2021/09/07 11:04

otn

総合スコア84804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tubasa1995

2021/09/07 11:14

返信ありがとうございます。 経験としてはpythonでは簡単なゴミプロを作って様々な処理をしてきました。 Cに関しては基礎的なところは抑えて勉強して読めるようにしました。(まだまだ素人ですが。) 以下ですが、コンピュータが得意というわけではないので、もしかしたら頓珍漢な返答になっているかもしれません。 オープンソースの数値計算そのものは、GUIで実行または実行ファイルの2つ選択肢があります。 サブルーチンのファイルは単独の実行ファイルにはなっていません。 実行ファイルとサブルーチンのファイルの関係は 実行ファイル:course/script/runcase(実行ファイル) サブルーチン:course/src/use_subroutine.f90 というようになっていて 実行ファイルを実行して、数値計算の1steごとに「use_subroutine.f90」を読み込んでいると思っています。書き換えたい数値は、別途csvファイルから配列を読み込んで、その配列の上から順に数値をとってきて「use_subroutine.f90」の中身の数値としたいと思っています。
Tubasa1995

2021/09/07 11:23

例えば、先にcsvファイルで200個の数値の配列を読みこみ、 ①サブルーチンがcall ②配列の1番先頭の値をサブルーチンの中に代入し ➂配列の1番先頭の値を削除し配列の2番目の数値が先頭になるようにする ④ ①にもどる を配列が持っている数値分(今回の場合は200回) 繰り返せればいいのかな?と考えているのですが このようなことはfortranで可能でしょうか?
otn

2021/09/07 11:32

> 実行ファイルを実行して、数値計算の1steごとに「use_subroutine.f90」を読み込んでいると思っています。 の意味がよく分かりません。 > このようなことはfortranで可能でしょうか? サブルーチンがリンクされてコールされる形式での利用なら可能です。 saveでサブルーチン内の変数の値を次回コール時に引き継ぎ可能なので、何番目かをsaveすればいい。 integer, save :: n = 1 とすると、nは初期値1で、nを更新すると次回呼び出し時にはその更新後の値になっています。 Cの関数内のstatic変数と同じ。
Tubasa1995

2021/09/07 11:36

「サブルーチンがリンクされてコールされる形式」だと思います。 otnさんのアドバイス的に私がしたいことができそうな気がしてきました。 単純に、配列の1番目を指定して、nに+1をしてsaveして、次のcallのときには配列の2番目を指定できるようにすればよいのですね。(この理解で正しいでしょうk。)
otn

2021/09/07 11:42

そうですね。とりあえず、やってみて、駄目だったらファイルを使うのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問