PageRenderTime 59ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_cu_bmj.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2151 lines | 1171 code | 20 blank | 960 comment | 0 complexity | 684e203bda51d1281539c4c7c149847f MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. !-----------------------------------------------------------------------
  2. !
  3. !WRF:MODEL_LAYER:PHYSICS
  4. !
  5. !-----------------------------------------------------------------------
  6. !
  7. MODULE MODULE_CU_BMJ
  8. !
  9. !-----------------------------------------------------------------------
  10. USE MODULE_MODEL_CONSTANTS
  11. !-----------------------------------------------------------------------
  12. !
  13. REAL,PARAMETER :: &
  14. & DSPC=-3000. &
  15. & ,DTTOP=0.,EFIFC=5.0,EFIMN=0.20,EFMNT=0.70 &
  16. & ,ELIWV=2.683E6,ENPLO=20000.,ENPUP=15000. &
  17. & ,EPSDN=1.05,EPSDT=0. &
  18. & ,EPSNTP=.0001,EPSNTT=.0001,EPSPR=1.E-7 &
  19. & ,EPSUP=1.00 &
  20. & ,FR=1.00,FSL=0.85,FSS=0.85 &
  21. & ,FUP=0. &
  22. & ,PBM=13000.,PFRZ=15000.,PNO=1000. &
  23. & ,PONE=2500.,PQM=20000. &
  24. & ,PSH=20000.,PSHU=45000. &
  25. & ,RENDP=1./(ENPLO-ENPUP) &
  26. & ,RHLSC=0.00,RHHSC=1.10 &
  27. & ,ROW=1.E3 &
  28. & ,STABDF=0.90,STABDS=0.90 &
  29. & ,STABS=1.0,STRESH=1.10 &
  30. & ,DTSHAL=-1.0,TREL=2400.
  31. !
  32. REAL,PARAMETER :: DTtrigr=-0.0 &
  33. ,DTPtrigr=DTtrigr*PONE !<-- Average parcel virtual temperature deficit over depth PONE.
  34. !<-- NOTE: CAPEtrigr is scaled by the cloud base temperature (see below)
  35. !
  36. REAL,PARAMETER :: DSPBFL=-3875.*FR &
  37. & ,DSP0FL=-5875.*FR &
  38. & ,DSPTFL=-1875.*FR &
  39. & ,DSPBFS=-3875. &
  40. & ,DSP0FS=-5875. &
  41. & ,DSPTFS=-1875.
  42. !
  43. REAL,PARAMETER :: PL=2500.,PLQ=70000.,PH=105000. &
  44. & ,THL=210.,THH=365.,THHQ=325.
  45. !
  46. INTEGER,PARAMETER :: ITB=76,JTB=134,ITBQ=152,JTBQ=440
  47. !
  48. INTEGER,PARAMETER :: ITREFI_MAX=3
  49. !
  50. !*** ARRAYS FOR LOOKUP TABLES
  51. !
  52. REAL,DIMENSION(ITB),PRIVATE,SAVE :: STHE,THE0
  53. REAL,DIMENSION(JTB),PRIVATE,SAVE :: QS0,SQS
  54. REAL,DIMENSION(ITBQ),PRIVATE,SAVE :: STHEQ,THE0Q
  55. REAL,DIMENSION(ITB,JTB),PRIVATE,SAVE :: PTBL
  56. REAL,DIMENSION(JTB,ITB),PRIVATE,SAVE :: TTBL
  57. REAL,DIMENSION(JTBQ,ITBQ),PRIVATE,SAVE :: TTBLQ
  58. !*** SHARE COPIES FOR MODULE_BL_MYJPBL
  59. !
  60. REAL,DIMENSION(JTB) :: QS0_EXP,SQS_EXP
  61. REAL,DIMENSION(ITB,JTB) :: PTBL_EXP
  62. !
  63. REAL,PARAMETER :: RDP=(ITB-1.)/(PH-PL),RDPQ=(ITBQ-1.)/(PH-PLQ) &
  64. & ,RDQ=ITB-1,RDTH=(JTB-1.)/(THH-THL) &
  65. & ,RDTHE=JTB-1.,RDTHEQ=JTBQ-1. &
  66. & ,RSFCP=1./101300.
  67. !
  68. REAL,PARAMETER :: AVGEFI=(EFIMN+1.)*0.5
  69. !
  70. !-----------------------------------------------------------------------
  71. !
  72. CONTAINS
  73. !
  74. !-----------------------------------------------------------------------
  75. SUBROUTINE BMJDRV( &
  76. & IDS,IDE,JDS,JDE,KDS,KDE &
  77. & ,IMS,IME,JMS,JME,KMS,KME &
  78. & ,ITS,ITE,JTS,JTE,KTS,KTE &
  79. & ,DT,ITIMESTEP,STEPCU &
  80. & ,CUDT, CURR_SECS, ADAPT_STEP_FLAG &
  81. & ,CUDTACTTIME &
  82. & ,RAINCV,PRATEC,CUTOP,CUBOT,KPBL &
  83. & ,TH,T,QV &
  84. & ,PINT,PMID,PI,RHO,DZ8W &
  85. & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
  86. & ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG &
  87. ! optional
  88. & ,RTHCUTEN, RQVCUTEN &
  89. & )
  90. !-----------------------------------------------------------------------
  91. IMPLICIT NONE
  92. !-----------------------------------------------------------------------
  93. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  94. & ,IMS,IME,JMS,JME,KMS,KME &
  95. & ,ITS,ITE,JTS,JTE,KTS,KTE
  96. !
  97. INTEGER,INTENT(IN) :: ITIMESTEP,STEPCU
  98. !
  99. INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: KPBL,LOWLYR
  100. !
  101. REAL,INTENT(IN) :: CP,DT,ELIV,ELWV,G,R,TFRZ,D608
  102. !
  103. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: XLAND
  104. !
  105. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ8W &
  106. & ,PI,PINT &
  107. & ,PMID,QV &
  108. & ,RHO,T,TH
  109. !
  110. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) &
  111. & ,OPTIONAL &
  112. & ,INTENT(INOUT) :: RQVCUTEN,RTHCUTEN
  113. !
  114. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV, &
  115. PRATEC
  116. !
  117. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CUBOT,CUTOP
  118. !
  119. LOGICAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CU_ACT_FLAG
  120. ! Adaptive time-step variables
  121. REAL, INTENT(IN ) :: CUDT
  122. REAL, INTENT(IN ) :: CURR_SECS
  123. LOGICAL,OPTIONAL,INTENT(IN ) :: ADAPT_STEP_FLAG
  124. REAL, INTENT (INOUT) :: CUDTACTTIME
  125. !
  126. !-----------------------------------------------------------------------
  127. !***
  128. !*** LOCAL VARIABLES
  129. !***
  130. !-----------------------------------------------------------------------
  131. INTEGER :: LBOT,LPBL,LTOP
  132. !
  133. REAL :: DTCNVC,LANDMASK,PCPCOL,PSFC,PTOP
  134. !
  135. REAL,DIMENSION(KTS:KTE) :: DPCOL,DQDT,DTDT,PCOL,QCOL,TCOL
  136. !
  137. INTEGER :: I,J,K,KFLIP,LMH
  138. LOGICAL :: run_param , doing_adapt_dt , decided
  139. !
  140. !*** Begin debugging convection
  141. REAL :: DELQ,DELT,PLYR
  142. INTEGER :: IMD,JMD
  143. LOGICAL :: PRINT_DIAG
  144. !*** End debugging convection
  145. !
  146. !-----------------------------------------------------------------------
  147. !***********************************************************************
  148. !-----------------------------------------------------------------------
  149. !
  150. !*** PREPARE TO CALL BMJ CONVECTION SCHEME
  151. !
  152. !-----------------------------------------------------------------------
  153. !
  154. !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
  155. !
  156. ! Initialization for adaptive time step.
  157. doing_adapt_dt = .FALSE.
  158. IF ( PRESENT(adapt_step_flag) ) THEN
  159. IF ( adapt_step_flag ) THEN
  160. doing_adapt_dt = .TRUE.
  161. IF ( cudtacttime .EQ. 0. ) THEN
  162. cudtacttime = curr_secs + cudt*60.
  163. END IF
  164. END IF
  165. END IF
  166. ! Do we run through this scheme or not?
  167. ! Test 1: If this is the initial model time, then yes.
  168. ! ITIMESTEP=1
  169. ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
  170. ! CUDT=0 or STEPCU=1
  171. ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
  172. ! MOD(ITIMESTEP,STEPCU)=0
  173. ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
  174. ! CURR_SECS >= CUDTACTTIME
  175. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  176. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  177. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  178. ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
  179. ! cumulus run.
  180. decided = .FALSE.
  181. run_param = .FALSE.
  182. IF ( ( .NOT. decided ) .AND. &
  183. ( itimestep .EQ. 1 ) ) THEN
  184. run_param = .TRUE.
  185. decided = .TRUE.
  186. END IF
  187. IF ( ( .NOT. decided ) .AND. &
  188. ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
  189. run_param = .TRUE.
  190. decided = .TRUE.
  191. END IF
  192. IF ( ( .NOT. decided ) .AND. &
  193. ( .NOT. doing_adapt_dt ) .AND. &
  194. ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
  195. run_param = .TRUE.
  196. decided = .TRUE.
  197. END IF
  198. IF ( ( .NOT. decided ) .AND. &
  199. ( doing_adapt_dt ) .AND. &
  200. ( curr_secs .GE. cudtacttime ) ) THEN
  201. run_param = .TRUE.
  202. decided = .TRUE.
  203. cudtacttime = curr_secs + cudt*60
  204. END IF
  205. !-----------------------------------------------------------------------
  206. !
  207. !*** COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
  208. !
  209. !*** Begin debugging convection
  210. IMD=(IMS+IME)/2
  211. JMD=(JMS+JME)/2
  212. PRINT_DIAG=.FALSE.
  213. !*** End debugging convection
  214. IF(run_param)THEN
  215. !
  216. DO J=JTS,JTE
  217. DO I=ITS,ITE
  218. CU_ACT_FLAG(I,J)=.TRUE.
  219. ENDDO
  220. ENDDO
  221. !
  222. DTCNVC=DT*STEPCU
  223. !
  224. DO J=JTS,JTE
  225. DO I=ITS,ITE
  226. !
  227. DO K=KTS,KTE
  228. DQDT(K)=0.
  229. DTDT(K)=0.
  230. ENDDO
  231. !
  232. RAINCV(I,J)=0.
  233. PRATEC(I,J)=0.
  234. PCPCOL=0.
  235. PSFC=PINT(I,LOWLYR(I,J),J)
  236. PTOP=PINT(I,KTE+1,J) ! KTE+1=KME
  237. !
  238. !*** CONVERT TO BMJ LAND MASK (1.0 FOR SEA; 0.0 FOR LAND)
  239. !
  240. LANDMASK=XLAND(I,J)-1.
  241. !
  242. !*** FILL 1-D VERTICAL ARRAYS
  243. !*** AND FLIP DIRECTION SINCE BMJ SCHEME
  244. !*** COUNTS DOWNWARD FROM THE DOMAIN'S TOP
  245. !
  246. DO K=KTS,KTE
  247. KFLIP=KTE+1-K
  248. !
  249. !*** CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
  250. !
  251. QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
  252. TCOL(K)=T(I,KFLIP,J)
  253. PCOL(K)=PMID(I,KFLIP,J)
  254. ! DPCOL(K)=PINT(I,KFLIP,J)-PINT(I,KFLIP+1,J)
  255. DPCOL(K)=RHO(I,KFLIP,J)*G*DZ8W(I,KFLIP,J)
  256. ENDDO
  257. !
  258. !*** LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
  259. !
  260. LMH=KTE+1-LOWLYR(I,J)
  261. LPBL=KTE+1-KPBL(I,J)
  262. !-----------------------------------------------------------------------
  263. !***
  264. !*** CALL CONVECTION
  265. !***
  266. !-----------------------------------------------------------------------
  267. !*** Begin debugging convection
  268. ! PRINT_DIAG=.FALSE.
  269. ! IF(I==IMD.AND.J==JMD)PRINT_DIAG=.TRUE.
  270. !*** End debugging convection
  271. !-----------------------------------------------------------------------
  272. CALL BMJ(ITIMESTEP,I,J,DTCNVC,LMH,LANDMASK,CLDEFI(I,J) &
  273. & ,DPCOL,PCOL,QCOL,TCOL,PSFC,PTOP &
  274. & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
  275. & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
  276. & ,PRINT_DIAG &
  277. & ,IDS,IDE,JDS,JDE,KDS,KDE &
  278. & ,IMS,IME,JMS,JME,KMS,KME &
  279. & ,ITS,ITE,JTS,JTE,KTS,KTE)
  280. !-----------------------------------------------------------------------
  281. !
  282. !*** COMPUTE HEATING AND MOISTENING TENDENCIES
  283. !
  284. IF ( PRESENT( RTHCUTEN ) .AND. PRESENT( RQVCUTEN )) THEN
  285. DO K=KTS,KTE
  286. KFLIP=KTE+1-K
  287. RTHCUTEN(I,K,J)=DTDT(KFLIP)/PI(I,K,J)
  288. !
  289. !*** CONVERT FROM SPECIFIC HUMIDTY BACK TO MIXING RATIO
  290. !
  291. RQVCUTEN(I,K,J)=DQDT(KFLIP)/(1.-QCOL(KFLIP))**2
  292. ENDDO
  293. ENDIF
  294. !
  295. !*** ALL UNITS IN BMJ SCHEME ARE MKS, THUS CONVERT PRECIP FROM METERS
  296. !*** TO MILLIMETERS PER STEP FOR OUTPUT.
  297. !
  298. RAINCV(I,J)=PCPCOL*1.E3/STEPCU
  299. PRATEC(I,J)=PCPCOL*1.E3/(STEPCU * DT)
  300. !
  301. !*** CONVECTIVE CLOUD TOP AND BOTTOM FROM THIS CALL
  302. !
  303. CUTOP(I,J)=REAL(KTE+1-LTOP)
  304. CUBOT(I,J)=REAL(KTE+1-LBOT)
  305. !
  306. !-----------------------------------------------------------------------
  307. !*** Begin debugging convection
  308. IF(PRINT_DIAG)THEN
  309. DELT=0.
  310. DELQ=0.
  311. PLYR=0.
  312. IF(LBOT>0.AND.LTOP<LBOT)THEN
  313. DO K=LTOP,LBOT
  314. PLYR=PLYR+DPCOL(K)
  315. DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
  316. DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
  317. ENDDO
  318. DELQ=DELQ/PLYR
  319. DELT=DELT/PLYR
  320. ENDIF
  321. !
  322. WRITE(6,"(2a,2i4,3e12.4,f7.2,4i3)") &
  323. '{cu3 i,j,PCPCOL,DTavg,DQavg,PLYR,' &
  324. ,'LBOT,LTOP,CUBOT,CUTOP = ' &
  325. ,i,j, PCPCOL,DELT,1000.*DELQ,.01*PLYR &
  326. ,LBOT,LTOP,NINT(CUBOT(I,J)),NINT(CUTOP(I,J))
  327. !
  328. IF(PLYR> 0.)THEN
  329. DO K=LBOT,LTOP,-1
  330. KFLIP=KTE+1-K
  331. WRITE(6,"(a,i3,2e12.4,f7.2)") '{cu3a KFLIP,DT,DQ,DP = ' &
  332. ,KFLIP,DTCNVC*DTDT(K),1000.*DTCNVC*DQDT(K),.01*DPCOL(K)
  333. ENDDO
  334. ENDIF
  335. ENDIF
  336. !*** End debugging convection
  337. !-----------------------------------------------------------------------
  338. !
  339. ENDDO
  340. ENDDO
  341. !
  342. ENDIF
  343. !
  344. END SUBROUTINE BMJDRV
  345. !-----------------------------------------------------------------------
  346. !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  347. !-----------------------------------------------------------------------
  348. SUBROUTINE BMJ &
  349. !-----------------------------------------------------------------------
  350. & (ITIMESTEP,I,J,DTCNVC,LMH,SM,CLDEFI &
  351. & ,DPRS,PRSMID,Q,T,PSFC,PT &
  352. & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
  353. & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
  354. & ,PRINT_DIAG &
  355. & ,IDS,IDE,JDS,JDE,KDS,KDE &
  356. & ,IMS,IME,JMS,JME,KMS,KME &
  357. & ,ITS,ITE,JTS,JTE,KTS,KTE)
  358. !-----------------------------------------------------------------------
  359. IMPLICIT NONE
  360. !-----------------------------------------------------------------------
  361. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  362. ,IMS,IME,JMS,JME,KMS,KME &
  363. ,ITS,ITE,JTS,JTE,KTS,KTE &
  364. ,I,J,ITIMESTEP
  365. !
  366. INTEGER,INTENT(IN) :: LMH,LPBL
  367. !
  368. INTEGER,INTENT(OUT) :: LBOT,LTOP
  369. !
  370. REAL,INTENT(IN) :: CP,D608,DTCNVC,ELIV,ELWV,G,PSFC,PT,R,SM,TFRZ
  371. !
  372. REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DPRS,PRSMID,Q,T
  373. !
  374. REAL,INTENT(INOUT) :: CLDEFI,PCPCOL
  375. !
  376. REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: DQDT,DTDT
  377. !
  378. !-----------------------------------------------------------------------
  379. !*** DEFINE LOCAL VARIABLES
  380. !-----------------------------------------------------------------------
  381. !
  382. REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK &
  383. ,PK,PSK,QK,QREFK,QSATK &
  384. ,THERK,THEVRF,THSK &
  385. ,THVMOD,THVREF,TK,TREFK
  386. REAL,DIMENSION(KTS:KTE) :: APE,DIFQ,DIFT,THEE,THES,TREF
  387. !
  388. REAL,DIMENSION(KTS:KTE) :: CPE,CPEcnv,DTV,DTVcnv,THEScnv !<-- CPE for shallow convection buoyancy check (24 Aug 2006)
  389. !
  390. LOGICAL :: DEEP,SHALLOW
  391. !
  392. !*** Begin debugging convection
  393. LOGICAL :: PRINT_DIAG
  394. !*** End debugging convection
  395. !
  396. !-----------------------------------------------------------------------
  397. !***
  398. !*** LOCAL SCALARS
  399. !***
  400. !-----------------------------------------------------------------------
  401. REAL :: APEKL,APEKXX,APEKXY,APES,APESTS &
  402. & ,AVRGT,AVRGTL,BQ,BQK,BQS00K,BQS10K &
  403. & ,CAPA,CUP,DEN,DENTPY,DEPMIN,DEPTH &
  404. & ,DEPWL,DHDT,DIFQL,DIFTL,DP,DPKL,DPLO,DPMIX,DPOT &
  405. & ,DPUP,DQREF,DRHDP,DRHEAT,DSP &
  406. & ,DSP0,DSP0K,DSPB,DSPBK,DSPT,DSPTK &
  407. & ,DSQ,DST,DSTQ,DTHEM,DTDP,EFI &
  408. & ,FEFI,FFUP,FPRS,FPTK,HCORR &
  409. & ,OTSUM,P,P00K,P01K,P10K,P11K &
  410. & ,PART1,PART2,PART3,PBOT,PBOTFC,PBTK &
  411. & ,PK0,PKB,PKL,PKT,PKXXXX,PKXXXY &
  412. & ,PLMH,PELEVFC,PBTmx,plo,POTSUM,PP1,PPK,PRECK &
  413. & ,PRESK,PSP,PSUM,PTHRS,PTOP,PTPK,PUP &
  414. & ,QBT,QKL,QNEW,QOTSUM,QQ1,QQK,QRFKL &
  415. & ,QRFTP,QSP,QSUM,QUP,RDP0T &
  416. & ,RDPSUM,RDTCNVC,RHH,RHL,RHMAX,ROTSUM,RTBAR,RHAVG &
  417. & ,SM1,SMIX,SQ,SQK,SQS00K,SQS10K,STABDL,SUMDE,SUMDP &
  418. & ,SUMDT,TAUK,TAUKSC,TCORR,THBT,THERKX,THERKY &
  419. & ,THESP,THSKL,THTPK,THVMKL,TKL,TNEW &
  420. & ,TQ,TQK,TREFKX,TRFKL,trmlo,trmup,TSKL,tsp,TTH &
  421. & ,TTHK,TUP &
  422. & ,CAPEcnv,PSPcnv,THBTcnv,CAPEtrigr,CAPE &
  423. & ,TLEV2,QSAT1,QSAT2,RHSHmax
  424. !
  425. INTEGER :: IQ,IQTB,IT,ITER,ITREFI,ITTB,ITTBK,KB,KNUMH,KNUML &
  426. & ,L,L0,L0M1,LB,LBM1,LCOR,LPT1 &
  427. & ,LQM,LSHU,LTP1,LTP2,LTSH, LBOTcnv,LTOPcnv,LMID
  428. !-----------------------------------------------------------------------
  429. !
  430. REAL,PARAMETER :: DSPBSL=DSPBFL*FSL,DSP0SL=DSP0FL*FSL &
  431. & ,DSPTSL=DSPTFL*FSL &
  432. & ,DSPBSS=DSPBFS*FSS,DSP0SS=DSP0FS*FSS &
  433. & ,DSPTSS=DSPTFS*FSS
  434. !
  435. REAL,PARAMETER :: ELEVFC=0.6,STEFI=1.
  436. !
  437. REAL,PARAMETER :: SLOPBL=(DSPBFL-DSPBSL)/(1.-EFIMN) &
  438. & ,SLOP0L=(DSP0FL-DSP0SL)/(1.-EFIMN) &
  439. & ,SLOPTL=(DSPTFL-DSPTSL)/(1.-EFIMN) &
  440. & ,SLOPBS=(DSPBFS-DSPBSS)/(1.-EFIMN) &
  441. & ,SLOP0S=(DSP0FS-DSP0SS)/(1.-EFIMN) &
  442. & ,SLOPTS=(DSPTFS-DSPTSS)/(1.-EFIMN) &
  443. & ,SLOPST=(STABDF-STABDS)/(1.-EFIMN) &
  444. & ,SLOPE=(1.-EFMNT)/(1.-EFIMN)
  445. !
  446. REAL :: A23M4L,CPRLG,ELOCP,RCP,QWAT
  447. !-----------------------------------------------------------------------
  448. !***********************************************************************
  449. !-----------------------------------------------------------------------
  450. CAPA=R/CP
  451. CPRLG=CP/(ROW*G*ELWV)
  452. ELOCP=ELIWV/CP
  453. RCP=1./CP
  454. A23M4L=A2*(A3-A4)*ELWV
  455. RDTCNVC=1./DTCNVC
  456. DEPMIN=PSH*PSFC*RSFCP
  457. !
  458. DEEP=.FALSE.
  459. SHALLOW=.FALSE.
  460. !
  461. DSP0=0.
  462. DSPB=0.
  463. DSPT=0.
  464. !-----------------------------------------------------------------------
  465. TAUK=DTCNVC/TREL
  466. TAUKSC=DTCNVC/(1.0*TREL)
  467. !-----------------------------------------------------------------------
  468. !-----------------------------PREPARATIONS------------------------------
  469. !-----------------------------------------------------------------------
  470. LBOT=LMH
  471. PCPCOL=0.
  472. TREF(KTS)=T(KTS)
  473. !
  474. DO L=KTS,LMH
  475. APESTS=PRSMID(L)
  476. APE(L)=(1.E5/APESTS)**CAPA
  477. CPEcnv(L)=0.
  478. DTVcnv(L)=0.
  479. THEScnv(L)=0.
  480. ENDDO
  481. !
  482. !-----------------------------------------------------------------------
  483. !----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
  484. !-----------------------------------------------------------------------
  485. !
  486. PLMH=PRSMID(LMH)
  487. PELEVFC=PLMH*ELEVFC
  488. PBTmx=PRSMID(LMH)-PONE
  489. CAPEcnv=0.
  490. PSPcnv=0.
  491. THBTcnv=0.
  492. LBOTcnv=LBOT
  493. LTOPcnv=LBOT
  494. !
  495. !-----------------------------------------------------------------------
  496. !----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
  497. !-----------------------------------------------------------------------
  498. !
  499. max_buoy_loop: DO KB=LMH,1,-1
  500. !
  501. !-----------------------------------------------------------------------
  502. !
  503. PKL=PRSMID(KB)
  504. ! IF (PKL<PELEVFC .OR. T(KB)<=TFRZ) EXIT
  505. IF (PKL<PELEVFC) EXIT
  506. LBOT=LMH
  507. LTOP=LMH
  508. !
  509. !-----------------------------------------------------------------------
  510. !*** SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
  511. !*** WITH THE MAX THETA-E
  512. !-----------------------------------------------------------------------
  513. !
  514. QBT=Q(KB)
  515. THBT=T(KB)*APE(KB)
  516. TTH=(THBT-THL)*RDTH
  517. QQ1=TTH-AINT(TTH)
  518. ITTB=INT(TTH)+1
  519. !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
  520. IF(ITTB<1)THEN
  521. ITTB=1
  522. QQ1=0.
  523. ELSE IF(ITTB>=JTB)THEN
  524. ITTB=JTB-1
  525. QQ1=0.
  526. ENDIF
  527. !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
  528. ITTBK=ITTB
  529. BQS00K=QS0(ITTBK)
  530. SQS00K=SQS(ITTBK)
  531. BQS10K=QS0(ITTBK+1)
  532. SQS10K=SQS(ITTBK+1)
  533. !--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
  534. BQ=(BQS10K-BQS00K)*QQ1+BQS00K
  535. SQ=(SQS10K-SQS00K)*QQ1+SQS00K
  536. TQ=(QBT-BQ)/SQ*RDQ
  537. PP1=TQ-AINT(TQ)
  538. IQTB=INT(TQ)+1
  539. !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
  540. IF(IQTB<1)THEN
  541. IQTB=1
  542. PP1=0.
  543. ELSE IF(IQTB>=ITB)THEN
  544. IQTB=ITB-1
  545. PP1=0.
  546. ENDIF
  547. !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
  548. IQ=IQTB
  549. IT=ITTB
  550. P00K=PTBL(IQ ,IT )
  551. P10K=PTBL(IQ+1,IT )
  552. P01K=PTBL(IQ ,IT+1)
  553. P11K=PTBL(IQ+1,IT+1)
  554. !
  555. !--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
  556. !
  557. PSP=P00K+(P10K-P00K)*PP1+(P01K-P00K)*QQ1 &
  558. & +(P00K-P10K-P01K+P11K)*PP1*QQ1
  559. APES=(1.E5/PSP)**CAPA
  560. THESP=THBT*EXP(ELOCP*QBT*APES/THBT)
  561. !
  562. !-----------------------------------------------------------------------
  563. !-----------CHOOSE CLOUD BASE AS MODEL LEVEL JUST BELOW PSP-------------
  564. !-----------------------------------------------------------------------
  565. !
  566. DO L=KTS,LMH-1
  567. P=PRSMID(L)
  568. IF(P<PSP.AND.P>=PQM)LBOT=L+1
  569. ENDDO
  570. !***
  571. !*** WARNING: LBOT MUST NOT BE > LMH-1 IN SHALLOW CONVECTION
  572. !*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
  573. !***
  574. PBOT=PRSMID(LBOT)
  575. IF(PBOT>=PBTmx.OR.LBOT>=LMH)THEN
  576. DO L=KTS,LMH-1
  577. P=PRSMID(L)
  578. IF(P<PBTmx)LBOT=L
  579. ENDDO
  580. PBOT=PRSMID(LBOT)
  581. ENDIF
  582. !
  583. !-----------------------------------------------------------------------
  584. !----------------CLOUD TOP COMPUTATION----------------------------------
  585. !-----------------------------------------------------------------------
  586. !
  587. LTOP=LBOT
  588. PTOP=PBOT
  589. DO L=LMH,KTS,-1
  590. THES(L)=THESP
  591. ENDDO
  592. !
  593. !-----------------------------------------------------------------------
  594. !### BEGIN: ########### WARNING ########### WARNING ###########
  595. !-----------------------------------------------------------------------
  596. !
  597. !### IMPORTANT: THIS "DO KB=LMH,1,-1" loop must be broken up into two
  598. ! separate loops in order for entrainment as programmed below to work
  599. ! properly.
  600. !
  601. !--------------- ENTRAINMENT DURING PARCEL ASCENT --------------------
  602. !
  603. ! DO L=LMH,KB,-1
  604. ! THES(L)=THESP
  605. ! ENDDO
  606. !
  607. ! DO L=KTS,LMH
  608. ! THEE(L)=THES(L)
  609. ! ENDDO
  610. !!
  611. ! FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
  612. ! FFUP=FUP/(FEFI*FEFI)
  613. !!
  614. ! IF(PBOT>ENPLO)THEN
  615. ! FPRS=1.
  616. ! ELSEIF(PBOT>ENPUP)THEN
  617. ! FPRS=(PBOT-ENPUP)*RENDP
  618. ! ELSE
  619. ! FPRS=0.
  620. ! ENDIF
  621. !!
  622. ! FFUP=FFUP*FPRS*FPRS*0.5
  623. ! DPUP=DPRS(KB)
  624. !!
  625. ! DO L=KB-1,KTS,-1
  626. ! DPLO=DPUP
  627. ! DPUP=DPRS(L)
  628. !!
  629. ! THES(L)=((-FFUP*DPLO+1.)*THES(L+1) &
  630. ! & +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP) &
  631. ! & /(FFUP*DPUP+1.)
  632. ! ENDDO
  633. !
  634. !-----------------------------------------------------------------------
  635. !### END: ########### WARNING ########### WARNING ###########
  636. !-----------------------------------------------------------------------
  637. !!
  638. !-----------------------------------------------------------------------
  639. !!*** COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
  640. !!*** SCALING PRESSURE & TT TABLE INDEX.
  641. !-----------------------------------------------------------------------
  642. !!
  643. !!
  644. ! DO L=LMH,KTS,-1
  645. !!
  646. ! PRESK=PRSMID(L)
  647. !!
  648. ! IF(PRESK<PLQ)THEN
  649. ! CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE &
  650. ! & ,STHE,THE0,THES(L),TTBL,TREF(L))
  651. ! ELSE
  652. ! CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ &
  653. ! & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
  654. ! ENDIF
  655. !!
  656. ! ENDDO
  657. !!
  658. !!-----------------------------------------------------------------------
  659. !!----------------BUOYANCY CHECK-----------------------------------------
  660. !!-----------------------------------------------------------------------
  661. !!
  662. ! DO L=LMH,KTS,-1
  663. ! IF(TREF(L)>T(L)-DTTOP)LTOP=L
  664. ! ENDDO
  665. !!
  666. !!*** CLOUD TOP PRESSURE
  667. !!
  668. ! PTOP=PRSMID(LTOP)
  669. !
  670. !------------------FIRST ENTROPY CHECK----------------------------------
  671. !
  672. DO L=KTS,LMH
  673. CPE(L)=0.
  674. DTV(L)=0.
  675. ENDDO
  676. !-----------------------------------------------------------------------
  677. ! lbot_ltop: IF(LBOT>LTOP)THEN
  678. !-----------------------------------------------------------------------
  679. !-- Begin: Buoyancy check including deep convection (24 Aug 2006)
  680. !-----------------------------------------------------------------------
  681. DENTPY=0.
  682. L=KB
  683. PLO=PRSMID(L)
  684. TRMLO=0.
  685. CAPEtrigr=DTPtrigr/T(LBOT)
  686. !
  687. !--- Below cloud base
  688. !
  689. IF(KB>LBOT) THEN
  690. DO L=KB-1,LBOT+1,-1
  691. PUP=PRSMID(L)
  692. TUP=THBT/APE(L)
  693. DP=PLO-PUP
  694. TRMUP=(TUP*(QBT*0.608+1.) &
  695. & -T(L)*(Q(L)*0.608+1.))*0.5 &
  696. & /(T(L)*(Q(L)*0.608+1.))
  697. DTV(L)=TRMLO+TRMUP
  698. DENTPY=DTV(L)*DP+DENTPY
  699. CPE(L)=DENTPY
  700. IF (DENTPY < CAPEtrigr) GO TO 170
  701. PLO=PUP
  702. TRMLO=TRMUP
  703. ENDDO
  704. ELSE
  705. L=LBOT+1
  706. PLO=PRSMID(L)
  707. TUP=THBT/APE(L)
  708. TRMLO=(TUP*(QBT*0.608+1.) &
  709. & -T(L)*(Q(L)*0.608+1.))*0.5 &
  710. & /(T(L)*(Q(L)*0.608+1.))
  711. ENDIF ! IF(KB>LBOT) THEN
  712. !
  713. !--- At cloud base
  714. !
  715. L=LBOT
  716. PUP=PSP
  717. TUP=THBT/APES
  718. TSP=(T(L+1)-T(L))/(PLO-PBOT) &
  719. & *(PUP-PBOT)+T(L)
  720. QSP=(Q(L+1)-Q(L))/(PLO-PBOT) &
  721. & *(PUP-PBOT)+Q(L)
  722. DP=PLO-PUP
  723. TRMUP=(TUP*(QBT*0.608+1.) &
  724. & -TSP*(QSP*0.608+1.))*0.5 &
  725. & /(TSP*(QSP*0.608+1.))
  726. DTV(L)=TRMLO+TRMUP
  727. DENTPY=DTV(L)*DP+DENTPY
  728. CPE(L)=DENTPY
  729. DTV(L)=DTV(L)*DP
  730. PLO=PUP
  731. TRMLO=TRMUP
  732. PUP=PRSMID(L)
  733. !
  734. !--- Calculate updraft temperature along moist adiabat (TUP)
  735. !
  736. IF(PUP<PLQ)THEN
  737. CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
  738. & ,STHE,THE0,THES(L),TTBL,TUP)
  739. ELSE
  740. CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
  741. & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
  742. ENDIF
  743. !
  744. QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
  745. QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
  746. DP=PLO-PUP
  747. TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
  748. & -T(L)*(Q(L)*0.608+1.))*0.5 &
  749. & /(T(L)*(Q(L)*0.608+1.))
  750. DENTPY=(TRMLO+TRMUP)*DP+DENTPY
  751. CPE(L)=DENTPY
  752. DTV(L)=(DTV(L)+(TRMLO+TRMUP)*DP)/(PRSMID(LBOT+1)-PRSMID(LBOT))
  753. !
  754. IF (DENTPY < CAPEtrigr) GO TO 170
  755. !
  756. PLO=PUP
  757. TRMLO=TRMUP
  758. !
  759. !-----------------------------------------------------------------------
  760. !--- In cloud above cloud base
  761. !-----------------------------------------------------------------------
  762. !
  763. DO L=LBOT-1,KTS,-1
  764. PUP=PRSMID(L)
  765. !
  766. !--- Calculate updraft temperature along moist adiabat (TUP)
  767. !
  768. IF(PUP<PLQ)THEN
  769. CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
  770. & ,STHE,THE0,THES(L),TTBL,TUP)
  771. ELSE
  772. CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
  773. & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
  774. ENDIF
  775. !
  776. QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
  777. QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
  778. DP=PLO-PUP
  779. TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
  780. & -T(L)*(Q(L)*0.608+1.))*0.5 &
  781. & /(T(L)*(Q(L)*0.608+1.))
  782. DTV(L)=TRMLO+TRMUP
  783. DENTPY=DTV(L)*DP+DENTPY
  784. CPE(L)=DENTPY
  785. !
  786. IF (DENTPY < CAPEtrigr) GO TO 170
  787. !
  788. PLO=PUP
  789. TRMLO=TRMUP
  790. ENDDO
  791. !
  792. !-----------------------------------------------------------------------
  793. !
  794. 170 LTP1=KB
  795. CAPE=0.
  796. !
  797. !-----------------------------------------------------------------------
  798. !--- Cloud top level (LTOP) is located where CAPE is a maximum
  799. !--- Exit cloud-top search if CAPE < CAPEtrigr
  800. !-----------------------------------------------------------------------
  801. !
  802. DO L=KB,KTS,-1
  803. IF (CPE(L) < CAPEtrigr) THEN
  804. EXIT
  805. ELSE IF (CPE(L) > CAPE) THEN
  806. LTP1=L
  807. CAPE=CPE(L)
  808. ENDIF
  809. ENDDO !-- End DO L=KB,KTS,-1
  810. !
  811. LTOP=MIN(LTP1,LBOT)
  812. !
  813. !-----------------------------------------------------------------------
  814. !--------------- CHECK FOR MAXIMUM INSTABILITY ------------------------
  815. !-----------------------------------------------------------------------
  816. IF(CAPE > CAPEcnv) THEN
  817. CAPEcnv=CAPE
  818. PSPcnv=PSP
  819. THBTcnv=THBT
  820. LBOTcnv=LBOT
  821. LTOPcnv=LTOP
  822. DO L=LMH,KTS,-1
  823. CPEcnv(L)=CPE(L)
  824. DTVcnv(L)=DTV(L)
  825. THEScnv(L)=THES(L)
  826. ENDDO
  827. ENDIF ! End IF(CAPE > CAPEcnv) THEN
  828. !
  829. ! ENDIF lbot_ltop
  830. !
  831. !-----------------------------------------------------------------------
  832. !
  833. ENDDO max_buoy_loop
  834. !
  835. !-----------------------------------------------------------------------
  836. !------------------------ MAXIMUM INSTABILITY ------------------------
  837. !-----------------------------------------------------------------------
  838. !
  839. IF(CAPEcnv > 0.) THEN
  840. PSP=PSPcnv
  841. THBT=THBTcnv
  842. LBOT=LBOTcnv
  843. LTOP=LTOPcnv
  844. PBOT=PRSMID(LBOT)
  845. PTOP=PRSMID(LTOP)
  846. !
  847. DO L=LMH,KTS,-1
  848. CPE(L)=CPEcnv(L)
  849. DTV(L)=DTVcnv(L)
  850. THES(L)=THEScnv(L)
  851. ENDDO
  852. !
  853. ENDIF
  854. !
  855. !-----------------------------------------------------------------------
  856. !----- Quick exit if cloud is too thin or no CAPE is present ---------
  857. !-----------------------------------------------------------------------
  858. !
  859. IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2.OR.CAPEcnv<=0.)THEN
  860. LBOT=0
  861. LTOP=KTE
  862. PBOT=PRSMID(LMH)
  863. PTOP=PBOT
  864. CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
  865. GO TO 800
  866. ENDIF
  867. !
  868. !*** DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
  869. !*** IS A SCALED VALUE OF PSFC.
  870. !
  871. DEPTH=PBOT-PTOP
  872. !
  873. IF(DEPTH>=DEPMIN) THEN
  874. DEEP=.TRUE.
  875. ELSE
  876. SHALLOW=.TRUE.
  877. GO TO 600
  878. ENDIF
  879. !
  880. !-----------------------------------------------------------------------
  881. !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
  882. !DCDCDCDCDCDCDCDCDCDCDC DEEP CONVECTION DCDCDCDCDCDCDCDCDCDCDCDCDCD
  883. !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
  884. !-----------------------------------------------------------------------
  885. !
  886. 300 CONTINUE
  887. !
  888. LB =LBOT
  889. EFI=CLDEFI
  890. !-----------------------------------------------------------------------
  891. !--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
  892. !-----------------------------------------------------------------------
  893. !***
  894. !*** ONE SHOULD NOTE THAT THE VALUES ASSIGNED TO THE ARRAY TREFK
  895. !*** IN THE FOLLOWING LOOP ARE REALLY ONLY RELEVANT IN ANCHORING THE
  896. !*** REFERENCE TEMPERATURE PROFILE AT LEVEL LB. WHEN BUILDING THE
  897. !*** REFERENCE PROFILE FROM CLOUD BASE, THEN ASSIGNING THE
  898. !*** AMBIENT TEMPERATURE TO TREFK IS ACCEPTABLE. HOWEVER, WHEN
  899. !*** BUILDING THE REFERENCE PROFILE FROM SOME OTHER LEVEL (SUCH AS
  900. !*** ONE LEVEL ABOVE THE GROUND), THEN TREFK SHOULD BE FILLED WITH
  901. !*** THE TEMPERATURES IN TREF(L) WHICH ARE THE TEMPERATURES OF
  902. !*** THE MOIST ADIABAT THROUGH CLOUD BASE. BY THE TIME THE LINE
  903. !*** NUMBERED 450 HAS BEEN REACHED, TREFK ACTUALLY DOES HOLD THE
  904. !*** REFERENCE TEMPERATURE PROFILE.
  905. !***
  906. DO L=KTS,LMH
  907. DIFT (L)=0.
  908. DIFQ (L)=0.
  909. TKL =T(L)
  910. TK (L)=TKL
  911. TREFK (L)=TKL
  912. QKL =Q(L)
  913. QK (L)=QKL
  914. QREFK (L)=QKL
  915. PKL =PRSMID(L)
  916. PK (L)=PKL
  917. PSK (L)=PKL
  918. APEKL =APE(L)
  919. APEK (L)=APEKL
  920. !
  921. !--- Calculate temperature along moist adiabat (TREF)
  922. !
  923. IF(PKL<PLQ)THEN
  924. CALL TTBLEX(ITB,JTB,PL,PKL,RDP,RDTHE &
  925. & ,STHE,THE0,THES(L),TTBL,TREF(L))
  926. ELSE
  927. CALL TTBLEX(ITBQ,JTBQ,PLQ,PKL,RDPQ,RDTHEQ &
  928. & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
  929. ENDIF
  930. THERK (L)=TREF(L)*APEKL
  931. ENDDO
  932. !
  933. !------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
  934. !
  935. LTP1=LTOP+1
  936. LBM1=LB-1
  937. PKB=PK(LB)
  938. PKT=PK(LTOP)
  939. STABDL=(EFI-EFIMN)*SLOPST+STABDS
  940. !
  941. !------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
  942. !
  943. EL(LB) = ELWV
  944. L0=LB
  945. PK0=PK(LB)
  946. TREFKX=TREFK(LB)
  947. THERKX=THERK(LB)
  948. APEKXX=APEK(LB)
  949. THERKY=THERK(LBM1)
  950. APEKXY=APEK(LBM1)
  951. !
  952. DO L=LBM1,LTOP,-1
  953. IF(T(L+1)<TFRZ)GO TO 430
  954. TREFKX=((THERKY-THERKX)*STABDL &
  955. & +TREFKX*APEKXX)/APEKXY
  956. TREFK(L)=TREFKX
  957. EL(L)=ELWV
  958. APEKXX=APEKXY
  959. THERKX=THERKY
  960. APEKXY=APEK(L-1)
  961. THERKY=THERK(L-1)
  962. L0=L
  963. PK0=PK(L0)
  964. ENDDO
  965. !
  966. !--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
  967. !
  968. GO TO 450
  969. !
  970. !--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
  971. !
  972. 430 L0M1=L0-1
  973. RDP0T=1./(PK0-PKT)
  974. DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
  975. !
  976. DO L=LTOP,L0M1
  977. TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
  978. EL(L)=ELWV !ELIV
  979. ENDDO
  980. !
  981. !-----------------------------------------------------------------------
  982. !--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
  983. !-----------------------------------------------------------------------
  984. !
  985. !*** DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
  986. !*** THE FREEZING LEVEL
  987. !
  988. 450 CONTINUE
  989. DEPWL=PKB-PK0
  990. DEPTH=PFRZ*PSFC*RSFCP
  991. SM1=1.-SM
  992. PBOTFC=1.
  993. !
  994. !-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
  995. !!
  996. ! SUMDT=0.
  997. ! SUMDP=0.
  998. !!
  999. ! DO L=LTOP,LB
  1000. ! SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
  1001. ! SUMDP=SUMDP+DPRS(L)
  1002. ! ENDDO
  1003. !!
  1004. ! TCORR=SUMDT/SUMDP
  1005. !!
  1006. ! DO L=LTOP,LB
  1007. ! TREFK(L)=TREFK(L)+TCORR
  1008. ! ENDDO
  1009. !!
  1010. !-----------------------------------------------------------------------
  1011. !--------------- ITERATION LOOP FOR CLOUD EFFICIENCY -------------------
  1012. !-----------------------------------------------------------------------
  1013. !
  1014. cloud_efficiency : DO ITREFI=1,ITREFI_MAX
  1015. !
  1016. !-----------------------------------------------------------------------
  1017. DSPBK=((EFI-EFIMN)*SLOPBS+DSPBSS*PBOTFC)*SM &
  1018. & +((EFI-EFIMN)*SLOPBL+DSPBSL*PBOTFC)*SM1
  1019. DSP0K=((EFI-EFIMN)*SLOP0S+DSP0SS*PBOTFC)*SM &
  1020. & +((EFI-EFIMN)*SLOP0L+DSP0SL*PBOTFC)*SM1
  1021. DSPTK=((EFI-EFIMN)*SLOPTS+DSPTSS*PBOTFC)*SM &
  1022. & +((EFI-EFIMN)*SLOPTL+DSPTSL*PBOTFC)*SM1
  1023. !
  1024. !-----------------------------------------------------------------------
  1025. !
  1026. DO L=LTOP,LB
  1027. !
  1028. !***
  1029. !*** SATURATION PRESSURE DIFFERENCE
  1030. !***
  1031. IF(DEPWL>=DEPTH)THEN
  1032. IF(L<L0)THEN
  1033. DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
  1034. ELSE
  1035. DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
  1036. ENDIF
  1037. ELSE
  1038. DSP=DSP0K
  1039. IF(L<L0)THEN
  1040. DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
  1041. ENDIF
  1042. ENDIF
  1043. !***
  1044. !*** HUMIDITY PROFILE
  1045. !***
  1046. IF(PK(L)>PQM)THEN
  1047. PSK(L)=PK(L)+DSP
  1048. APESK(L)=(1.E5/PSK(L))**CAPA
  1049. THSK(L)=TREFK(L)*APEK(L)
  1050. QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSK(L)-A3*APESK(L)) &
  1051. & /(THSK(L)-A4*APESK(L)))
  1052. ELSE
  1053. QREFK(L)=QK(L)
  1054. ENDIF
  1055. !
  1056. ENDDO
  1057. !-----------------------------------------------------------------------
  1058. !***
  1059. !*** ENTHALPY CONSERVATION INTEGRAL
  1060. !***
  1061. !-----------------------------------------------------------------------
  1062. enthalpy_conservation : DO ITER=1,2
  1063. !
  1064. SUMDE=0.
  1065. SUMDP=0.
  1066. !
  1067. DO L=LTOP,LB
  1068. SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L) &
  1069. & +SUMDE
  1070. SUMDP=SUMDP+DPRS(L)
  1071. ENDDO
  1072. !
  1073. HCORR=SUMDE/(SUMDP-DPRS(LTOP))
  1074. LCOR=LTOP+1
  1075. !***
  1076. !*** FIND LQM
  1077. !***
  1078. LQM=1
  1079. DO L=KTS,LB
  1080. IF(PK(L)<=PQM)LQM=L
  1081. ENDDO
  1082. !***
  1083. !*** ABOVE LQM CORRECT TEMPERATURE ONLY
  1084. !***
  1085. IF(LCOR<=LQM)THEN
  1086. DO L=LCOR,LQM
  1087. TREFK(L)=TREFK(L)+HCORR*RCP
  1088. ENDDO
  1089. LCOR=LQM+1
  1090. ENDIF
  1091. !***
  1092. !*** BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
  1093. !***
  1094. DO L=LCOR,LB
  1095. TSKL=TREFK(L)*APEK(L)/APESK(L)
  1096. DHDT=QREFK(L)*A23M4L/(TSKL-A4)**2+CP
  1097. TREFK(L)=HCORR/DHDT+TREFK(L)
  1098. THSKL=TREFK(L)*APEK(L)
  1099. QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSKL-A3*APESK(L)) &
  1100. & /(THSKL-A4*APESK(L)))
  1101. ENDDO
  1102. !
  1103. ENDDO enthalpy_conservation
  1104. !-----------------------------------------------------------------------
  1105. !
  1106. !*** HEATING, MOISTENING, PRECIPITATION
  1107. !
  1108. !-----------------------------------------------------------------------
  1109. AVRGT=0.
  1110. PRECK=0.
  1111. DSQ=0.
  1112. DST=0.
  1113. !
  1114. DO L=LTOP,LB
  1115. TKL=TK(L)
  1116. DIFTL=(TREFK(L)-TKL )*TAUK
  1117. DIFQL=(QREFK(L)-QK(L))*TAUK
  1118. AVRGTL=(TKL+TKL+DIFTL)
  1119. DPOT=DPRS(L)/AVRGTL
  1120. DST=DIFTL*DPOT+DST
  1121. DSQ=DIFQL*EL(L)*DPOT+DSQ
  1122. AVRGT=AVRGTL*DPRS(L)+AVRGT
  1123. PRECK=DIFTL*DPRS(L)+PRECK
  1124. DIFT(L)=DIFTL
  1125. DIFQ(L)=DIFQL
  1126. ENDDO
  1127. !
  1128. DST=(DST+DST)*CP
  1129. DSQ=DSQ+DSQ
  1130. DENTPY=DST+DSQ
  1131. AVRGT=AVRGT/(SUMDP+SUMDP)
  1132. !
  1133. ! DRHEAT=PRECK*CP/AVRGT
  1134. DRHEAT=(PRECK*SM+MAX(1.E-7,PRECK)*(1.-SM))*CP/AVRGT !As in Eta!
  1135. DRHEAT=MAX(DRHEAT,1.E-20)
  1136. EFI=EFIFC*DENTPY/DRHEAT
  1137. !-----------------------------------------------------------------------
  1138. EFI=MIN(EFI,1.)
  1139. EFI=MAX(EFI,EFIMN)
  1140. !-----------------------------------------------------------------------
  1141. !
  1142. ENDDO cloud_efficiency
  1143. !
  1144. !-----------------------------------------------------------------------
  1145. !
  1146. !-----------------------------------------------------------------------
  1147. !---------------------- DEEP CONVECTION --------------------------------
  1148. !-----------------------------------------------------------------------
  1149. !
  1150. IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
  1151. !
  1152. CLDEFI=EFI
  1153. FEFI=EFMNT+SLOPE*(EFI-EFIMN)
  1154. FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
  1155. PRECK=PRECK*FEFI
  1156. !
  1157. !*** UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
  1158. !
  1159. CUP=PRECK*CPRLG
  1160. PCPCOL=CUP
  1161. !
  1162. DO L=LTOP,LB
  1163. DTDT(L)=DIFT(L)*FEFI*RDTCNVC
  1164. DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
  1165. ENDDO
  1166. !
  1167. ELSE
  1168. !
  1169. !-----------------------------------------------------------------------
  1170. !*** REDUCE THE CLOUD TOP
  1171. !-----------------------------------------------------------------------
  1172. !
  1173. ! LTOP=LTOP+3
  1174. ! PTOP=PRSMID(LTOP)
  1175. ! DEPMIN=PSH*PSFC*RSFCP
  1176. ! DEPTH=PBOT-PTOP
  1177. !***
  1178. !*** ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
  1179. !***
  1180. ! IF(DEPTH>=DEPMIN)THEN
  1181. ! GO TO 300
  1182. ! ENDIF
  1183. !
  1184. ! CLDEFI=AVGEFI
  1185. CLDEFI=EFIMN*SM+STEFI*(1.-SM)
  1186. !***
  1187. !*** SEARCH FOR SHALLOW CLOUD TOP
  1188. !***
  1189. ! LTSH=LBOT
  1190. ! LBM1=LBOT-1
  1191. ! PBTK=PK(LBOT)
  1192. ! DEPMIN=PSH*PSFC*RSFCP
  1193. ! PTPK=PBTK-DEPMIN
  1194. PTPK=MAX(PSHU, PK(LBOT)-DEPMIN)
  1195. !***
  1196. !*** CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH or JUST BELOW PSHU
  1197. !***
  1198. DO L=KTS,LMH
  1199. IF(PK(L)<=PTPK)LTOP=L+1
  1200. ENDDO
  1201. !
  1202. ! PTPK=PK(LTOP)
  1203. !!***
  1204. !!*** HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
  1205. !!***
  1206. ! IF(PTPK<=PSHU)THEN
  1207. !!
  1208. ! DO L=KTS,LMH
  1209. ! IF(PK(L)<=PSHU)LSHU=L+1
  1210. ! ENDDO
  1211. !!
  1212. ! LTOP=LSHU
  1213. ! PTPK=PK(LTOP)
  1214. ! ENDIF
  1215. !
  1216. ! if(ltop>=lbot)then
  1217. !!!!!! lbot=0
  1218. ! ltop=lmh
  1219. !!!!!! pbot=pk(lbot)
  1220. ! ptop=pk(ltop)
  1221. ! pbot=ptop
  1222. ! go to 600
  1223. ! endif
  1224. !
  1225. ! LTP1=LTOP+1
  1226. ! LTP2=LTOP+2
  1227. !!
  1228. ! DO L=LTOP,LBOT
  1229. ! QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
  1230. ! ENDDO
  1231. !!
  1232. ! RHH=QK(LTOP)/QSATK(LTOP)
  1233. ! RHMAX=0.
  1234. ! LTSH=LTOP
  1235. !!
  1236. ! DO L=LTP1,LBM1
  1237. ! RHL=QK(L)/QSATK(L)
  1238. ! DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
  1239. !!
  1240. ! IF(DRHDP>RHMAX)THEN
  1241. ! LTSH=L-1
  1242. ! RHMAX=DRHDP
  1243. ! ENDIF
  1244. !!
  1245. ! RHH=RHL
  1246. ! ENDDO
  1247. !
  1248. !-----------------------------------------------------------------------
  1249. !-- Make shallow cloud top a function of virtual temperature excess (DTV)
  1250. !-----------------------------------------------------------------------
  1251. !
  1252. LTP1=LBOT
  1253. DO L=LBOT-1,LTOP,-1
  1254. IF (DTV(L) > 0.) THEN
  1255. LTP1=L
  1256. ELSE
  1257. EXIT
  1258. ENDIF
  1259. ENDDO
  1260. LTOP=MIN(LTP1,LBOT)
  1261. !***
  1262. !*** CLOUD MUST BE AT LEAST TWO LAYERS THICK
  1263. !***
  1264. ! IF(LBOT-LTOP<2)LTOP=LBOT-2 (eliminate this criterion)
  1265. !
  1266. !-- End: Buoyancy check (24 Aug 2006)
  1267. !
  1268. PTOP=PK(LTOP)
  1269. SHALLOW=.TRUE.
  1270. DEEP=.FALSE.
  1271. !
  1272. ENDIF
  1273. !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
  1274. !DCDCDCDCDCDCDC END OF DEEP CONVECTION DCDCDCDCDCDCD
  1275. !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
  1276. !
  1277. !-----------------------------------------------------------------------
  1278. !-----------------------------------------------------------------------
  1279. 600 CONTINUE
  1280. !-----------------------------------------------------------------------
  1281. !-----------------------------------------------------------------------
  1282. !
  1283. !----------------GATHER SHALLOW CONVECTION POINTS-----------------------
  1284. !
  1285. ! IF(PTOP<=PBOT-PNO.AND.LTOP<=LBOT-2)THEN
  1286. ! DEPMIN=PSH*PSFC*RSFCP
  1287. !!
  1288. !! if(lpbl<lbot)lbot=lpbl
  1289. !! if(lbot>lmh-1)lbot=lmh-1
  1290. !! pbot=prsmid(lbot)
  1291. !!
  1292. ! IF(PTOP+1.>=PBOT-DEPMIN)SHALLOW=.TRUE.
  1293. ! ELSE
  1294. ! LBOT=0
  1295. ! LTOP=KTE
  1296. ! ENDIF
  1297. !
  1298. !***********************************************************************
  1299. !-----------------------------------------------------------------------
  1300. !*** Begin debugging convection
  1301. IF(PRINT_DIAG)THEN
  1302. WRITE(6,"(a,2i3,L2,3e12.4)") &
  1303. '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
  1304. ,lbot,ltop,shallow,pbot,ptop,depmin
  1305. ENDIF
  1306. !*** End debugging convection
  1307. !-----------------------------------------------------------------------
  1308. !
  1309. IF(.NOT.SHALLOW)GO TO 800
  1310. !
  1311. !-----------------------------------------------------------------------
  1312. !***********************************************************************
  1313. !-----------------------------------------------------------------------
  1314. !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
  1315. !SCSCSCSCSCSCSC SHALLOW CONVECTION CSCSCSCSCSCSCSCSCSCS
  1316. !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
  1317. !-----------------------------------------------------------------------
  1318. DO L=KTS,LMH
  1319. TKL =T(L)
  1320. TK (L) =TKL
  1321. TREFK(L) =TKL
  1322. QKL =Q(L)
  1323. QK (L) =QKL
  1324. QREFK(L) =QKL
  1325. PKL =PRSMID(L)
  1326. PK (L) =PKL
  1327. QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
  1328. APEKL =APE(L)
  1329. APEK (L) =APEKL
  1330. THVMKL =TKL*APEKL*(QKL*D608+1.)
  1331. THVREF(L)=THVMKL
  1332. !
  1333. ! IF(TKL>=TFRZ)THEN
  1334. EL(L)=ELWV
  1335. ! ELSE
  1336. ! EL(L)=ELIV
  1337. ! ENDIF
  1338. ENDDO
  1339. !
  1340. !-----------------------------------------------------------------------
  1341. !-- Begin: Raise cloud top if avg RH>RHSHmax and CAPE>0
  1342. ! RHSHmax=RH at cloud base associated with a DSP of PONE
  1343. !-----------------------------------------------------------------------
  1344. !
  1345. TLEV2=T(LBOT)*((PK(LBOT)-PONE)/PK(LBOT))**CAPA
  1346. QSAT1=PQ0/PK(LBOT)*EXP(A2*(T(LBOT)-A3)/(TK(LBOT)-A4))
  1347. QSAT2=PQ0/(PK(LBOT)-PONE)*EXP(A2*(TLEV2-A3)/(TLEV2-A4))
  1348. RHSHmax=QSAT2/QSAT1
  1349. SUMDP=0.
  1350. RHAVG=0.
  1351. !
  1352. DO L=LBOT,LTOP,-1
  1353. RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
  1354. SUMDP=SUMDP+DPRS(L)
  1355. ENDDO
  1356. !
  1357. IF (RHAVG/SUMDP > RHSHmax) THEN
  1358. LTSH=LTOP
  1359. DO L=LTOP-1,KTS,-1
  1360. RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
  1361. SUMDP=SUMDP+DPRS(L)
  1362. IF (CPE(L) > 0.) THEN
  1363. LTSH=L
  1364. ELSE
  1365. EXIT
  1366. ENDIF
  1367. IF (RHAVG/SUMDP <= RHSHmax) EXIT
  1368. IF (PK(L) <= PSHU) EXIT
  1369. ENDDO
  1370. LTOP=LTSH
  1371. ENDIF
  1372. !
  1373. !-- End: Raise cloud top if avg RH>RHSHmax and CAPE>0
  1374. !
  1375. !---------------------------SHALLOW CLOUD TOP---------------------------
  1376. LBM1=LBOT-1
  1377. PTPK=PTOP
  1378. LTP1=LTOP-1
  1379. DEPTH=PBOT-PTOP
  1380. !-----------------------------------------------------------------------
  1381. !*** Begin debugging convection
  1382. IF(PRINT_DIAG)THEN
  1383. WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
  1384. ,PBOT,PTOP,DEPTH,DEPMIN
  1385. ENDIF
  1386. !*** End debugging convection
  1387. !-----------------------------------------------------------------------
  1388. !
  1389. !BSF IF(DEPTH<DEPMIN)THEN
  1390. !BSF GO TO 800
  1391. !BSF ENDIF
  1392. !-----------------------------------------------------------------------
  1393. IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
  1394. LBOT=0
  1395. !!! LTOP=LBOT
  1396. LTOP=KTE
  1397. PTOP=PBOT
  1398. GO TO 800
  1399. ENDIF
  1400. !
  1401. !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
  1402. !
  1403. THTPK=T(LTP1)*APE(LTP1)
  1404. !
  1405. TTHK=(THTPK-THL)*RDTH
  1406. QQK =TTHK-AINT(TTHK)
  1407. IT =INT(TTHK)+1
  1408. !
  1409. IF(IT<1)THEN
  1410. IT=1
  1411. QQK=0.
  1412. ENDIF
  1413. !
  1414. IF(IT>=JTB)THEN
  1415. IT=JTB-1
  1416. QQK=0.
  1417. ENDIF
  1418. !
  1419. !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
  1420. !
  1421. BQS00K=QS0(IT)
  1422. SQS00K=SQS(IT)
  1423. BQS10K=QS0(IT+1)
  1424. SQS10K=SQS(IT+1)
  1425. !
  1426. !--------------SCALING SPEC. HUMIDITY & TABLE INDEX AT TOP--------------
  1427. !
  1428. BQK=(BQS10K-BQS00K)*QQK+BQS00K
  1429. SQK=(SQS10K-SQS00K)*QQK+SQS00K
  1430. !
  1431. ! TQK=(Q(LTOP)-BQK)/SQK*RDQ
  1432. TQK=(Q(LTP1)-BQK)/SQK*RDQ
  1433. !
  1434. PPK=TQK-AINT(TQK)
  1435. IQ =INT(TQK)+1
  1436. !
  1437. IF(IQ<1)THEN
  1438. IQ=1
  1439. PPK=0.
  1440. ENDIF
  1441. !
  1442. IF(IQ>=ITB)THEN
  1443. IQ=ITB-1
  1444. PPK=0.
  1445. ENDIF
  1446. !
  1447. !----------------CLOUD TOP SATURATION POINT PRESSURE--------------------
  1448. !
  1449. PART1=(PTBL(IQ+1,IT)-PTBL(IQ,IT))*PPK
  1450. PART2=(PTBL(IQ,IT+1)-PTBL(IQ,IT))*QQK
  1451. PART3=(PTBL(IQ ,IT )-PTBL(IQ+1,IT ) &
  1452. & -PTBL(IQ ,IT+1)+PTBL(IQ+1,IT+1))*PPK*QQK
  1453. PTPK=PTBL(IQ,IT)+PART1+PART2+PART3
  1454. !-----------------------------------------------------------------------
  1455. DPMIX=PTPK-PSP
  1456. IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
  1457. !
  1458. !----------------TEMPERATURE PROFILE SLOPE------------------------------
  1459. !
  1460. SMIX=(THTPK-THBT)/DPMIX*STABS
  1461. !
  1462. TREFKX=TREFK(LBOT+1)
  1463. PKXXXX=PK(LBOT+1)
  1464. PKXXXY=PK(LBOT)
  1465. APEKXX=APEK(LBO

Large files files are truncated, but you can click here to view the full file