在LMDZ.MARS/libf/phymars/physiq_mod.F中,作为物理量输出的垂直气流w,内部变量名为pw。它是在该程序中由垂直质量输送变量flxw计算的(850行附近)

注意:作为w的输出,根据代码计算和结果分析判断其正方向应该是向下

$$ w=\frac{Flux}{\rho A}=\frac{Flux}{p/(RT) A} $$

! Compute vertical velocity (m/s) from vertical mass flux
      ! w = F / (rho*area) and rho = P/(r*T)
      ! but first linearly interpolate mass flux to mid-layers
      do l=1,nlayer-1
       pw(1:ngrid,l)=0.5*(flxw(1:ngrid,l)+flxw(1:ngrid,l+1))
      enddo
      pw(1:ngrid,nlayer)=0.5*flxw(1:ngrid,nlayer) ! since flxw(nlayer+1)=0
      do l=1,nlayer
       pw(1:ngrid,l)=(pw(1:ngrid,l)*r*pt(1:ngrid,l)) / 
     &               (pplay(1:ngrid,l)*cell_area(1:ngrid))
       ! NB: here we use r and not rnew since this diagnostic comes
       ! from the dynamics
      enddo

flxw为动力部分输入的变量,在LMDZ.MARS/libf/dynphy_lonlat/phymars/callphysiq_mod.F90中和LMDZ.COMMON/libf/dynphy_lonlat/calfis_p.F为flxwfi_omp,在后者中由flxwfi计算得到,flxwfi则在后者由flxw通过gr_dyn_fi_p子程序计算得到;在迭代主程序LMDZ.COMMON/libf/dyn3dpar/leapfrog_p.F中,变量名也为flxw。

在leapfrog_p.F中,flxw只由advtrac_p子程序计算得到。在子程序中,flxw由wg计算得到,而wg通过groupe_p子程序计算。在groupe_p子程序中变量名为wm

wm由zconvmm简单计算得到,后者来源于zconvm,在子程序convflu_p中计算。其中计算的方式基本依照如下的公式(董老师指导)。

$$ \frac{\partial \pi}{\partial \eta} \dot{\eta}=-\dot{\pi}-\int_{\eta_T}^{\eta}\nabla_\eta \cdot(\delta\pi \bm{v}) $$

具体代码为

DO 2  ij = ijb , ije - 1
  convfl(ij+1,l) = xflu(ij,l) - xflu(ij+ 1,l)   +
                   yflu(ij +1,l ) - yflu( ij -iim,l )
CONTINUE

然后在groupe_p子程序中从上到下累加

      do  l = llm-1,1,-1
          do j=jjb,jje
             do i=1,iip1
                zconvmm(i,j,l)=zconvmm(i,j,l)+zconvmm(i,j,l+1)
             enddo
          enddo
      enddo

最后在vitvert_p中

w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 )

groupeun_p