LMDZ自带有能量计算的程序,但是对于LMDZ.MARS火星模式需要略加修改后使用。
计算能量的子程序为dyn3d_common/diagedyn.F(同名Subroutine)
三个子程序调用方法:
CALL covcont ( llm , ucov , vcov , ucont, vcont )
CALL enercin ( vcov , ucov , vcont , ucont , ecin )
CALL massdair( p, masse )
三个子程序存在并行版本,但是diagedyn及其调用的子程序是串行的。
动能计算仅需要上面三个子程序即可,因此容易在并行环境下使用。
在主迭代程序leapfrog_p.F中,在CALL calfis_p调用计算物理过程的子程序之后,加入如下的代码
! added by YZ 22/10/28
if(diag_ecin > 0) then
if(MOD(itau,diag_ecin) < iphysiq) then
call covcont_p(llm,ucov,vcov,ucont,vcont)
call enercin_p(vcov,ucov,vcont,ucont,ecin0)
!$OMP MASTER
call WriteField_p('masse',reshape(masse,(/iip1,jmp1,llm/)))
call WriteField_p('ecin',reshape(ecin0,(/iip1,jmp1,llm/)))
!$OMP END MASTER
end if
end if
! end YZ
其中
diag_ecin是新加入的运行参数,这样对于不同需求不需要反复编译。其值默认为0,此时不执行此段计算并输出;当其大于0时,则表示每多少动力步输出一次。 (由于该段代码位于物理过程中,每次执行到此处时itau会累加一次iphysiq而不是1) 加入该参数的具体实现可见
当判断需要计算并存储时,首先通过两个子程序计算动能并存入ecin0中。ecin0之后还会由uv计算一次,因此不受影响。而质量则在calfis_p中刚刚用过,无需重复计算。所得结果应当是协调的。
利用WriteField_p存储数据。该子程序会自动完成收集各进程的数据,写入文件等操作。