提案をありがとう。十分に明確でないことをお許しください。私の能力の及ぶ範囲でもう一度説明させてください。
A と B の 2 つのモデルがあります。モデル A にはcompns.f
、メイン プログラムによって呼び出されるサブルーチン (モジュールの一部ではない) があります。以下、compns.f
コード:
compns.f: (モデル A)
subroutine compns(deltim,fhout)
use var_repos, only: compns_var_dump
open(unit=nlunit,file=gfs_namelist) ! reads a file for the variables deltim and fhout
rewind (nlunit)
read(nlunit,nam_mrf)
print *, deltim,fhout ! deltim = 360.0, fhout = 6.0
CALL compns_var_dump(deltim,fhout) ! calls the subroutine and passes the variables
end
サブルーチン compns_var_dump (変数を収集するため) を含む別のモジュールは
次のvar_repos.f90
とおりです。
MODULE var_repos
IMPLICIT NONE
PUBLIC :: compns_var_dump
PUBLIC :: tstep_var_dump !!! to dump variables from another place
REAL, PUBLIC :: d_time ! dummy variable
! declare the variables which will go public here:
REAL, PUBLIC :: deltim, fhout
CONTAINS
SUBROUTINE compns_var_dump(deltim , fhout)
REAL, INTENT(inout) :: deltim , fhout
d_time = deltim
WRITE(*,*)'Inside var_repos: deltim = ',deltim,d_time
END SUBROUTINE compns_var_dump
SUBROUTINE tstep_var_dump
...
END SUBROUTINE tstep_var_dump
END MODULE var_repos
ここで、モデル B の変数が必要ですvar_repos.f90
。それらを必要とするモデル B のモジュールは次のとおりです。
mo_time_control.f90: (モデル B)
MODULE time_control
PUBLIC :: get_delta_time
CONTAINS
REAL(dp) FUNCTION get_delta_time()
USE var_repos, ONLY: d_time
IMPLICIT NONE
REAL :: d_time
REAL :: a_time ! Testing
get_delta_time = d_time
a_time = d_time ! Testing
WRITE(*,*)'Inside function get_delta_time(): deltim= ',d_time,get_delta_time, a_time
END FUNCTION get_delta_time
END MODULE time_control
モデルを実行した後の出力は次のとおりです。
'Inside var_repos: deltim = ' 360.000 360.000
'Inside function get_delta_time(): deltim= ' 0.00000E+00 0.00000E+00 0.00000E+00
この投稿で私が明確であることを願っています。上記のタスクを実行するためのより良い方法はありますか? 私の哲学は、モデル A から必要な変数を、さまざまなサブルーチン呼び出しによって 1 つのモジュールに収集することでした。したがって、このモジュールをリポジトリとして使用し、モデル B が必要な変数に使用できるようにします。このアプローチは正しいですか?