LMDZ自带有能量计算的程序,但是对于LMDZ.MARS火星模式需要略加修改后使用。


diagedyn.F及三个子程序(串行可用)

计算能量的子程序为dyn3d_common/diagedyn.F(同名Subroutine)

  1. 首先调用convcont计算逆变分量,调用enercin计算动能(不带质量),调用massdair计算质量。
  2. 然后累乘累加计算三态水的质量(qw,ql,qs),动能(ecin),焓(h_dair),以及三态水的焓。
  3. 与上一次计算作差,得到能量收支。
  4. 打印能量收支,包括三态水的焓(qt=qw+ql+qs,qw,ql,qs),总焓(h_vcol=h_dair+qw+ql+qs),总动能(ec),总能量(h_vcol+ec)

三个子程序调用方法:

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

其中

  1. diag_ecin是新加入的运行参数,这样对于不同需求不需要反复编译。其值默认为0,此时不执行此段计算并输出;当其大于0时,则表示每多少动力步输出一次。 (由于该段代码位于物理过程中,每次执行到此处时itau会累加一次iphysiq而不是1) 加入该参数的具体实现可见

    run.def参数的读入

  2. 当判断需要计算并存储时,首先通过两个子程序计算动能并存入ecin0中。ecin0之后还会由uv计算一次,因此不受影响。而质量则在calfis_p中刚刚用过,无需重复计算。所得结果应当是协调的。

  3. 利用WriteField_p存储数据。该子程序会自动完成收集各进程的数据,写入文件等操作。