--- trunk/Sources/phylmd/CV3_routines/cv3_prelim.f 2015/04/29 15:47:56 134 +++ trunk/Sources/phylmd/CV30_routines/cv30_prelim.f 2016/06/06 17:42:15 201 @@ -1,70 +1,80 @@ -module cv3_prelim_m +module cv30_prelim_m implicit none contains - SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, lv, cpn, tv, gz, h, hm, th) + SUBROUTINE cv30_prelim(t1, q1, p1, ph1, lv1, cpn1, tv1, gz1, h1, hm1, th1) - USE cv3_param_m, ONLY: nl - USE cvthermo, ONLY: cl, clmcpv, cpd, cpv, eps, lv0, rrd, rrv + USE cv30_param_m, ONLY: nl + USE cv_thermo_m, ONLY: clmcpv, eps + USE dimphy, ONLY: klev, klon + use SUPHEC_M, only: rcw, rlvtt, rcpd, rcpv, rd, rv ! Calculate arrays of geopotential, heat capacity and static energy - integer, intent(in):: len, nd, ndp1 - real, intent(in):: t(len, nd) - real, intent(in):: q(len, nd) - real, intent(in):: p(len, nd), ph(len, ndp1) + real, intent(in):: t1(:, :) ! (klon, klev) temperature, in K + real, intent(in):: q1(:, :) ! (klon, klev) specific humidity + real, intent(in):: p1(:, :) ! (klon, klev) full level pressure, in hPa + real, intent(in):: ph1(:, :) ! (klon, klev + 1) half level pressure, in hPa ! outputs: - real lv(len, nd), cpn(len, nd), tv(len, nd) - real gz(len, nd), h(len, nd), hm(len, nd) - real th(len, nd) + + real, intent(out):: lv1(:, :) ! (klon, nl) + ! specific latent heat of vaporization of water, in J kg-1 + + real, intent(out):: cpn1(:, :) ! (klon, nl) + ! specific heat capacity at constant pressure of humid air, in J K-1 kg-1 + + real tv1(:, :) ! (klon, klev) + real gz1(klon, klev), h1(klon, klev), hm1(klon, klev) + real, intent(out):: th1(:, :) ! (klon, nl) potential temperature, in K ! Local: integer k, i - real rdcp + real kappa real tvx, tvy - real cpx(len, nd) + real cpx(klon, klev) !-------------------------------------------------------------- - do k=1, nl - do i=1, len - lv(i, k)= lv0-clmcpv*(t(i, k)-273.15) - cpn(i, k)=cpd*(1.0-q(i, k)) + cpv*q(i, k) - cpx(i, k)=cpd*(1.0-q(i, k)) + cl*q(i, k) - tv(i, k)=t(i, k)*(1.0 + q(i, k)/eps-q(i, k)) - rdcp=(rrd*(1.-q(i, k)) + q(i, k)*rrv)/cpn(i, k) - th(i, k)=t(i, k)*(1000.0/p(i, k))**rdcp + do k = 1, nl + do i = 1, klon + lv1(i, k) = rlvtt - clmcpv * (t1(i, k) - 273.15) + cpn1(i, k) = rcpd * (1. - q1(i, k)) + rcpv * q1(i, k) + cpx(i, k) = rcpd * (1. - q1(i, k)) + rcw * q1(i, k) + tv1(i, k) = t1(i, k) * (1. + q1(i, k) / eps - q1(i, k)) + kappa = (rd * (1. - q1(i, k)) + q1(i, k) * rv) / cpn1(i, k) + th1(i, k) = t1(i, k) * (1000. / p1(i, k))**kappa end do end do - ! gz = phi at the full levels (same as p). + ! gz1 = phi at the full levels (same as p1). - do i=1, len - gz(i, 1)=0.0 + do i = 1, klon + gz1(i, 1) = 0. end do - do k=2, nl - do i=1, len - tvx=t(i, k)*(1. + q(i, k)/eps-q(i, k)) - tvy=t(i, k-1)*(1. + q(i, k-1)/eps-q(i, k-1)) - gz(i, k)=gz(i, k-1) + 0.5*rrd*(tvx + tvy) & - *(p(i, k-1)-p(i, k))/ph(i, k) + do k = 2, nl + do i = 1, klon + tvx = t1(i, k) * (1. + q1(i, k) / eps - q1(i, k)) + tvy = t1(i, k - 1) * (1. + q1(i, k - 1) / eps - q1(i, k - 1)) + gz1(i, k) = gz1(i, k - 1) + 0.5 * rd * (tvx + tvy) & + * (p1(i, k - 1) - p1(i, k)) / ph1(i, k) end do end do - ! h = phi + cpT (dry static energy). - ! hm = phi + cp(T-Tbase) + Lq + ! h1 = phi + cpT (dry static energy). + ! hm1 = phi + cp(T1 - Tbase) + Lq - do k=1, nl - do i=1, len - h(i, k)=gz(i, k) + cpn(i, k)*t(i, k) - hm(i, k)=gz(i, k) + cpx(i, k)*(t(i, k)-t(i, 1)) + lv(i, k)*q(i, k) + do k = 1, nl + do i = 1, klon + h1(i, k) = gz1(i, k) + cpn1(i, k) * t1(i, k) + hm1(i, k) = gz1(i, k) + cpx(i, k) * (t1(i, k) - t1(i, 1)) & + + lv1(i, k) * q1(i, k) end do end do - end SUBROUTINE cv3_prelim + end SUBROUTINE cv30_prelim -end module cv3_prelim_m +end module cv30_prelim_m