感谢您的建议。请原谅我不够清楚。让我尽我所能再描述一遍。
compns.f
有两个模型 - A 和 B。模型 A 有一个由主程序调用的子程序(它不是模块的一部分) 。下面,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 所需的变量收集到一个模块中,从而将该模块用作存储库,让模型 B 将其用于所需的变量。这种方法对吗?