--- trunk/Sources/phylmd/CV30_routines/cv30_feed.f 2016/05/23 13:50:39 196 +++ trunk/Sources/phylmd/CV30_routines/cv30_feed.f 2016/06/06 17:42:15 201 @@ -4,10 +4,11 @@ contains - SUBROUTINE cv30_feed(t1, q1, qs1, p1, ph1, gz1, nk1, icb1, iflag1, tnk1, & - qnk1, gznk1, plcl1) + SUBROUTINE cv30_feed(t1, q1, qs1, p1, ph1, gz1, icb1, iflag1, tnk1, qnk1, & + gznk1, plcl1) ! Purpose: convective feed + ! Assuming origin level of ascending parcels is minorig. use cv30_param_m, only: minorig, nl USE dimphy, ONLY: klev, klon @@ -20,52 +21,37 @@ ! outputs: - integer, intent(out):: nk1(:) ! (klon) - integer, intent(out):: icb1(:) ! (klon) - ! first level above lcl, 2 <= icb1 <= nl - 2 + ! first level above LCL, 2 <= icb1 <= nl - 2 integer, intent(out):: iflag1(:) ! (klon) - real tnk1(klon), qnk1(klon), gznk1(klon) - real, intent(out):: plcl1(klon) + real tnk1(:), qnk1(:), gznk1(:) ! (klon) + real, intent(out):: plcl1(:) ! (klon) ! Local: integer i - real pnk(klon), qsnk(klon), rh(klon), chi(klon) + real rh(klon) real, parameter:: A = 1669., B = 122. !-------------------------------------------------------------------- - iflag1 = 0 - plcl1 = 0. - - ! Origin level of ascending parcels - nk1 = minorig - - ! Check whether parcel level temperature and specific humidity - ! are reasonable - - do i = 1, klon - if (t1(i, nk1(i)) < 250. .or. q1(i, nk1(i)) <= 0.) iflag1(i) = 7 - end do - ! Calculate lifted condensation level of air at parcel origin level ! (within 0.2 % of formula of Bolton, Mon. Wea. Rev., 1980) + where (t1(:, minorig) >= 250. .and. q1(:, minorig) > 0.) + ! Parcel level temperature and specific humidity are reasonable. + tnk1 = t1(:, minorig) + qnk1 = q1(:, minorig) + gznk1 = gz1(:, minorig) + + rh = qnk1 / qs1(:, minorig) + plcl1 = p1(:, minorig) * rh**(tnk1 / (A - B * rh - tnk1)) + iflag1 = 0 + elsewhere + plcl1 = 0. + iflag1 = 7 + end where - do i = 1, klon - if (iflag1(i) == 0) then - tnk1(i) = t1(i, nk1(i)) - qnk1(i) = q1(i, nk1(i)) - gznk1(i) = gz1(i, nk1(i)) - pnk(i) = p1(i, nk1(i)) - qsnk(i) = qs1(i, nk1(i)) - - rh(i) = qnk1(i) / qsnk(i) - chi(i) = tnk1(i) / (A - B*rh(i) - tnk1(i)) - plcl1(i) = pnk(i)*(rh(i)**chi(i)) - if (plcl1(i) < 200. .or. plcl1(i) >= 2000.) iflag1(i) = 8 - endif - end do + where (iflag1 == 0 .and. (plcl1 < 200. .or. plcl1 >= 2000.)) iflag1 = 8 ! Compute icb1: do i = 1, klon @@ -76,13 +62,16 @@ else icb1(i) = locate(- ph1(i, 3:nl - 2), - plcl1(i), my_lbound = 3) ! {2 <= icb1(i) <= nl - 3} - ! {ph1(i, icb1(i) + 1) < plcl1(i) <= ph1(i, icb1(i))} + ! {ph1(i, icb1(i) + 1) < plcl1(i)} + ! {plcl1(i) <= ph1(i, icb1(i)) or icb1(i) == 2} end if end do where (icb1 == nl - 2 .and. iflag1 == 0) iflag1 = 9 - ! {(2 <= icb1(i) <= nl - 3 and ph1(i, icb1(i) + 1) < plcl1(i) <= - ! ph1(i, icb1(i))) or iflag1 /= 0} + + ! {(2 <= icb1(i) <= nl - 3 and ph1(i, icb1(i) + 1) < plcl1(i) and + ! (plcl1(i) <= ph1(i, icb1(i)) or icb1(i) == 2)) or iflag1(i) /= + ! 0} end SUBROUTINE cv30_feed