48 SUBROUTINE calrh(P1,T1,Q1,RH)
50 use ctlblk_mod,
only: ista, iend, jsta, jend, modelname
53 REAL,
dimension(ista:iend,jsta:jend),
intent(in) :: P1,T1
54 REAL,
dimension(ista:iend,jsta:jend),
intent(inout) :: Q1
55 REAL,
dimension(ista:iend,jsta:jend),
intent(out) :: RH
57 IF(modelname ==
'RAPR')
THEN
58 CALL calrh_gsd(p1,t1,q1,rh)
96 use params_mod,
only: pq0, a2, a3, a4, rhmin
97 use ctlblk_mod,
only: ista, iend, jsta, jend, spval
105 REAL,
dimension(ista:iend,jsta:jend),
intent(in) :: p1,t1
106 REAL,
dimension(ista:iend,jsta:jend),
intent(inout) :: q1
107 REAL,
dimension(ista:iend,jsta:jend),
intent(out) :: rh
116 IF (t1(i,j) < spval)
THEN
117 IF (abs(p1(i,j)) >= 1)
THEN
118 qc = pq0/p1(i,j)*exp(a2*(t1(i,j)-a3)/(t1(i,j)-a4))
124 IF (rh(i,j) > 1.0)
THEN
128 IF (rh(i,j) < rhmin)
THEN
176 use params_mod,
only: rhmin
177 use ctlblk_mod,
only: ista, iend, jsta, jend, spval
181 real,
parameter:: con_rd =2.8705e+2
182 real,
parameter:: con_rv =4.6150e+2
183 real,
parameter:: con_eps =con_rd/con_rv
184 real,
parameter:: con_epsm1 =con_rd/con_rv-1
194 REAL,
dimension(ista:iend,jsta:jend),
intent(in) :: p1,t1
195 REAL,
dimension(ista:iend,jsta:jend),
intent(inout):: q1,rh
205 IF (t1(i,j) < spval .AND. p1(i,j) < spval.AND.q1(i,j)/=spval)
THEN
208 IF (p1(i,j) >= 1.0)
THEN
209 es = min(
fpvsnew(t1(i,j)),p1(i,j))
210 qc = con_eps*es/(p1(i,j)+con_epsm1*es)
214 rh(i,j) = min(1.0,max(q1(i,j)/qc,rhmin))
238 SUBROUTINE calrh_gsd(P1,T1,Q1,RHB)
244 use ctlblk_mod,
only: ista, iend, jsta, jend, spval
249 real :: tx, pol, esx, es, e
250 real,
dimension(ista:iend,jsta:jend) :: p1, t1, q1, rhb
255 IF (t1(i,j) < spval .AND. p1(i,j) < spval .AND. q1(i,j) < spval)
THEN
258 pol = 0.99999683 + tx*(-0.90826951e-02 + &
259 tx*(0.78736169e-04 + tx*(-0.61117958e-06 + &
260 tx*(0.43884187e-08 + tx*(-0.29883885e-10 + &
261 tx*(0.21874425e-12 + tx*(-0.17892321e-14 + &
262 tx*(0.11112018e-16 + tx*(-0.30994571e-19)))))))))
266 e = p1(i,j)/100.*q1(i,j)/(0.62197+q1(i,j)*0.37803)
267 rhb(i,j) = min(1.,e/es)
274 END SUBROUTINE calrh_gsd
278 SUBROUTINE calrh_pw(RHPW)
284 use vrbls3d,
only: q, pmid, t
285 use params_mod,
only: g
286 use ctlblk_mod,
only: lm, ista, iend, jsta, jend, spval
290 real,
PARAMETER :: svp1=6.1153,svp2=17.67,svp3=29.65
292 REAL,
dimension(ista:iend,jsta:jend):: pw, pw_sat, rhpw
293 REAL deltp,sh,qv,temp,es,qs,qv_sat
294 integer i,j,l,k,ka,kb
305 if(t(i,j,k)<spval.and.q(i,j,k)<spval)
then
312 deltp = 0.5*(pmid(i,j,kb)-pmid(i,j,ka))
313 pw(i,j) = pw(i,j) + sh *deltp/g
320 es = svp1*exp(svp2*(temp-273.15)/(temp-svp3))
322 qs = 0.62198*es/(pmid(i,j,k)*1.e-2-0.37802*es)
326 pw_sat(i,j) = pw_sat(i,j) + max(sh,qs)*deltp/g
328 if (i==120 .and. j==120 ) &
329 write (6,*)
'pw-sat', temp, sh, qs, pmid(i,j,kb) &
330 ,pmid(i,j,ka),pw(i,j),pw_sat(i,j)
333 rhpw(i,j) = min(1.,pw(i,j) / pw_sat(i,j)) * 100.
341 END SUBROUTINE calrh_pw
369 integer,
parameter:: nxpvs=7501
370 real,
parameter:: con_ttp =2.7316e+2
371 real,
parameter:: con_psat =6.1078e+2
372 real,
parameter:: con_cvap =1.8460e+3
373 real,
parameter:: con_cliq =4.1855e+3
374 real,
parameter:: con_hvap =2.5000e+6
375 real,
parameter:: con_rv =4.6150e+2
376 real,
parameter:: con_csol =2.1060e+3
377 real,
parameter:: con_hfus =3.3358e+5
378 real,
parameter:: tliq=con_ttp
379 real,
parameter:: tice=con_ttp-20.0
380 real,
parameter:: dldtl=con_cvap-con_cliq
381 real,
parameter:: heatl=con_hvap
382 real,
parameter:: xponal=-dldtl/con_rv
383 real,
parameter:: xponbl=-dldtl/con_rv+heatl/(con_rv*con_ttp)
384 real,
parameter:: dldti=con_cvap-con_csol
385 real,
parameter:: heati=con_hvap+con_hfus
386 real,
parameter:: xponai=-dldti/con_rv
387 real,
parameter:: xponbi=-dldti/con_rv+heati/(con_rv*con_ttp)
392 real xj,x,tbpvs(nxpvs),xp1
393 real xmin,xmax,xinc,c2xpvs,c1xpvs
397 xinc=(xmax-xmin)/(nxpvs-1)
400 c1xpvs=1.-xmin*c2xpvs
402 xj=min(max(c1xpvs+c2xpvs*t,1.0),float(nxpvs))
403 jx=min(xj,float(nxpvs)-1.0)
408 tbpvs(jx)=con_psat*(tr**xponal)*exp(xponbl*(1.-tr))
410 tbpvs(jx)=con_psat*(tr**xponai)*exp(xponbi*(1.-tr))
412 w=(t-tice)/(tliq-tice)
413 pvl=con_psat*(tr**xponal)*exp(xponbl*(1.-tr))
414 pvi=con_psat*(tr**xponai)*exp(xponbi*(1.-tr))
415 tbpvs(jx)=w*pvl+(1.-w)*pvi
418 xp1=xmin+(jx-1+1)*xinc
422 tbpvs(jx+1)=con_psat*(tr**xponal)*exp(xponbl*(1.-tr))
423 elseif(xp1<tice)
then
424 tbpvs(jx+1)=con_psat*(tr**xponai)*exp(xponbi*(1.-tr))
426 w=(t-tice)/(tliq-tice)
427 pvl=con_psat*(tr**xponal)*exp(xponbl*(1.-tr))
428 pvi=con_psat*(tr**xponai)*exp(xponbi*(1.-tr))
429 tbpvs(jx+1)=w*pvl+(1.-w)*pvi
432 fpvsnew=tbpvs(jx)+(xj-jx)*(tbpvs(jx+1)-tbpvs(jx))
527 SUBROUTINE calcape(ITYPE,DPBND,P1D,T1D,Q1D,L1D,CAPE, &
528 CINS,PPARC,ZEQL,THUND)
529 use vrbls3d,
only: pmid, t, q, zint
530 use vrbls2d,
only: teql,ieql
532 use params_mod,
only: d00, h1m12, h99999, h10e5, capa, elocp, eps, &
534 use lookup_mod,
only: thl, rdth, jtb, qs0, sqs, rdq, itb, ptbl, &
535 plq, ttbl, pl, rdp, the0, sthe, rdthe, ttblq, &
536 itbq, jtbq, rdpq, the0q, stheq, rdtheq
537 use ctlblk_mod,
only: jsta_2l, jend_2u, lm, jsta, jend, im, me, spval, &
538 ista_2l, iend_2u, ista, iend
544 real,
PARAMETER :: ismthp=2,ismtht=2,ismthq=2
548 integer,
intent(in) :: itype
549 real,
intent(in) :: dpbnd
550 integer,
dimension(ista:iend,Jsta:jend),
intent(in) :: l1d
551 real,
dimension(ista:iend,Jsta:jend),
intent(in) :: p1d,t1d
552 real,
dimension(ista:iend,jsta:jend),
intent(inout) :: q1d,cape,cins,pparc,zeql
554 integer,
dimension(ista:iend,jsta:jend) :: iptb, ithtb, parcel, klres, khres, lcl, idx
556 real,
dimension(ista:iend,jsta:jend) :: thesp, psp, cape20, qq, pp, thund
557 REAL,
ALLOCATABLE :: tpar(:,:,:)
559 LOGICAL thunder(ista:iend,jsta:jend), needthun
560 real psfck,pkl,tbtk,qbtk,apebtk,tthbtk,tthk,apespk,tpspk, &
561 bqs00k,sqs00k,bqs10k,sqs10k,bqk,sqk,tqk,presk,gdzkl,thetap, &
562 thetaa,p00k,p10k,p01k,p11k,tthesk,esatp,qsatp,tvp,tv
564 integer i,j,l,knuml,knumh,lbeg,lend,iq, kb,ittbk
571 ALLOCATE(tpar(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
605 thunder(i,j) = .true.
626 q1d(i,j) = min(max(h1m12,q1d(i,j)),h99999)
636 IF (itype == 1 .OR. (itype == 2 .AND. kb == 1))
THEN
643 psfck = pmid(i,j,nint(lmh(i,j)))
645 IF(psfck<spval.and.pkl<spval)
THEN
649 (itype == 1 .AND. (pkl >= psfck-dpbnd .AND. pkl <= psfck)))
THEN
652 qbtk = max(0.0, q(i,j,kb))
653 apebtk = (h10e5/pkl)**capa
657 qbtk = max(0.0, q1d(i,j))
658 apebtk = (h10e5/pkl)**capa
669 tthk = (tthbtk-thl)*rdth
670 qq(i,j) = tthk - aint(tthk)
671 ittbk = int(tthk) + 1
677 IF(ittbk >= jtb)
THEN
684 bqs10k = qs0(ittbk+1)
685 sqs10k = sqs(ittbk+1)
687 bqk = (bqs10k-bqs00k)*qq(i,j) + bqs00k
688 sqk = (sqs10k-sqs00k)*qq(i,j) + sqs00k
689 tqk = (qbtk-bqk)/sqk*rdq
690 pp(i,j) = tqk-aint(tqk)
702 p00k = ptbl(iq ,ittbk )
703 p10k = ptbl(iq+1,ittbk )
704 p01k = ptbl(iq ,ittbk+1)
705 p11k = ptbl(iq+1,ittbk+1)
707 tpspk = p00k + (p10k-p00k)*pp(i,j) + (p01k-p00k)*qq(i,j) &
708 + (p00k-p10k-p01k+p11k)*pp(i,j)*qq(i,j)
711 if (tpspk > 1.0e-3)
then
712 apespk = (max(0.,h10e5/ tpspk))**capa
717 tthesk = tthbtk * exp(elocp*qbtk*apespk/tthbtk)
719 IF(tthesk > thesp(i,j))
THEN
735 pparc(i,j) = pmid(i,j,parcel(i,j))
746 IF (pmid(i,j,l) < psp(i,j)) lcl(i,j) = l+1
753 IF (lcl(i,j) > nint(lmh(i,j))) lcl(i,j) = nint(lmh(i,j))
755 IF (t(i,j,lcl(i,j)) < 263.15)
THEN
756 thunder(i,j) = .false.
773 IF(l <= lcl(i,j))
THEN
774 IF(pmid(i,j,l) < plq)
THEN
788 CALL ttblex(tpar(ista_2l,jsta_2l,l),ttbl,itb,jtb,klres &
789 , pmid(ista_2l,jsta_2l,l),pl,qq,pp,rdp,the0,sthe &
790 , rdthe,thesp,iptb,ithtb)
796 CALL ttblex(tpar(ista_2l,jsta_2l,l),ttblq,itbq,jtbq,khres &
797 , pmid(ista_2l,jsta_2l,l),plq,qq,pp,rdpq &
798 ,the0q,stheq,rdtheq,thesp,iptb,ithtb)
805 IF(khres(i,j) > 0)
THEN
806 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
814 IF(klres(i,j) > 0)
THEN
815 IF(tpar(i,j,l) > t(i,j,l) .AND. &
816 pmid(i,j,l)>100.) ieql(i,j) = l
827 lbeg = min(ieql(i,j),lbeg)
828 lend = max(lcl(i,j),lend)
835 IF(t(i,j,ieql(i,j)) > 255.65)
THEN
836 thunder(i,j) = .false.
847 IF(l >= ieql(i,j).AND.l <= lcl(i,j))
THEN
856 IF(idx(i,j) > 0)
THEN
858 gdzkl = (zint(i,j,l)-zint(i,j,l+1)) * g
859 esatp = min(
fpvsnew(tpar(i,j,l)),presk)
860 qsatp = eps*esatp/(presk-esatp*oneps)
862 tvp = tvirtual(tpar(i,j,l),qsatp)
863 thetap = tvp*(h10e5/presk)**capa
865 tv = tvirtual(t(i,j,l),q(i,j,l))
866 thetaa = tv*(h10e5/presk)**capa
867 IF(thetap < thetaa)
THEN
868 cins(i,j) = cins(i,j) + (log(thetap)-log(thetaa))*gdzkl
869 ELSEIF(thetap > thetaa)
THEN
870 cape(i,j) = cape(i,j) + (log(thetap)-log(thetaa))*gdzkl
871 IF (thunder(i,j) .AND. t(i,j,l) < 273.15 &
872 .AND. t(i,j,l) > 253.15)
THEN
873 cape20(i,j) = cape20(i,j) + (log(thetap)-log(thetaa))*gdzkl
887 cape(i,j) = max(d00,cape(i,j))
888 cins(i,j) = min(cins(i,j),d00)
890 zeql(i,j) = zint(i,j,ieql(i,j))
891 teql(i,j) = t(i,j,ieql(i,j))
892 IF (cape20(i,j) < 75.)
THEN
893 thunder(i,j) = .false.
895 IF (thunder(i,j))
THEN
1004 CAPE,CINS,LFC,ESRHL,ESRHH, &
1006 use vrbls3d,
only: pmid, t, q, zint
1007 use vrbls2d,
only: fis,ieql
1008 use gridspec_mod,
only: gridtype
1009 use masks,
only: lmh
1010 use params_mod,
only: d00, h1m12, h99999, h10e5, capa, elocp, eps, &
1012 use lookup_mod,
only: thl, rdth, jtb, qs0, sqs, rdq, itb, ptbl, &
1013 plq, ttbl, pl, rdp, the0, sthe, rdthe, ttblq, &
1014 itbq, jtbq, rdpq, the0q, stheq, rdtheq
1015 use ctlblk_mod,
only: jsta_2l, jend_2u, lm, jsta, jend, im, jm, me, jsta_m, jend_m, spval,&
1016 ista_2l, iend_2u, ista, iend, ista_m, iend_m
1022 real,
PARAMETER :: ismthp=2,ismtht=2,ismthq=2
1026 integer,
intent(in) :: itype
1027 real,
intent(in) :: dpbnd
1028 integer,
dimension(ista:iend,Jsta:jend),
intent(in) :: l1d
1029 real,
dimension(ista:iend,Jsta:jend),
intent(in) :: p1d,t1d
1031 real,
dimension(ista:iend,jsta:jend),
intent(inout) :: q1d,cape,cins
1032 real,
dimension(ista:iend,jsta:jend) :: pparc,zeql
1033 real,
dimension(ista:iend,jsta:jend),
intent(inout) :: lfc,esrhl,esrhh
1034 real,
dimension(ista:iend,jsta:jend),
intent(inout) :: dcape,dgld,esp
1035 integer,
dimension(ista:iend,jsta:jend) ::l12,l17,l3km
1037 integer,
dimension(ista:iend,jsta:jend) :: iptb, ithtb, parcel, klres, khres, lcl, idx
1039 real,
dimension(ista:iend,jsta:jend) :: thesp, psp, cape20, qq, pp, thund
1040 integer,
dimension(ista:iend,jsta:jend) :: parcel2
1041 real,
dimension(ista:iend,jsta:jend) :: thesp2,psp2
1042 real,
dimension(ista:iend,jsta:jend) :: cape4,cins4
1043 REAL,
ALLOCATABLE :: tpar(:,:,:)
1044 REAL,
ALLOCATABLE :: tpar2(:,:,:)
1046 LOGICAL thunder(ista:iend,jsta:jend), needthun
1047 real psfck,pkl,tbtk,qbtk,apebtk,tthbtk,tthk,apespk,tpspk, &
1048 bqs00k,sqs00k,bqs10k,sqs10k,bqk,sqk,tqk,presk,gdzkl,thetap, &
1049 thetaa,p00k,p10k,p01k,p11k,tthesk,esatp,qsatp,tvp,tv
1050 real presk2, esatp2, qsatp2, tvp2, thetap2, tv2, thetaa2
1052 integer i,j,l,knuml,knumh,lbeg,lend,iq, kb,ittbk
1053 integer ie,iw,jn,js,ive(jm),ivw(jm),jvn,jvs
1054 integer istart,istop,jstart,jstop
1055 real,
dimension(ista:iend,jsta:jend) :: htsfc
1062 ALLOCATE(tpar(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
1063 ALLOCATE(tpar2(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
1099 thunder(i,j) = .true.
1124 IF(gridtype ==
'E')
THEN
1135 ELSE IF(gridtype ==
'B')
THEN
1159 IF(gridtype /=
'A')
CALL exch(fis(ista:iend,jsta:jend))
1169 IF (gridtype==
'B')
THEN
1170 htsfc(i,j) = (0.25/g)*(fis(iw,j)+fis(ie,j)+fis(i,jn)+fis(ie,jn))
1172 htsfc(i,j) = (0.25/g)*(fis(iw,j)+fis(ie,j)+fis(i,jn)+fis(i,js))
1181 IF (itype == 2)
THEN
1185 q1d(i,j) = min(max(h1m12,q1d(i,j)),h99999)
1195 IF (itype == 1 .OR. (itype == 2 .AND. kb == 1))
THEN
1202 psfck = pmid(i,j,nint(lmh(i,j)))
1206 IF (itype ==2 .OR. &
1207 (itype == 1 .AND. (pkl >= psfck-dpbnd .AND. pkl <= psfck)))
THEN
1208 IF (itype == 1)
THEN
1210 qbtk = max(0.0, q(i,j,kb))
1211 apebtk = (h10e5/pkl)**capa
1215 qbtk = max(0.0, q1d(i,j))
1216 apebtk = (h10e5/pkl)**capa
1226 tthbtk = tbtk*apebtk
1227 tthk = (tthbtk-thl)*rdth
1228 qq(i,j) = tthk - aint(tthk)
1229 ittbk = int(tthk) + 1
1235 IF(ittbk >= jtb)
THEN
1242 bqs10k = qs0(ittbk+1)
1243 sqs10k = sqs(ittbk+1)
1245 bqk = (bqs10k-bqs00k)*qq(i,j) + bqs00k
1246 sqk = (sqs10k-sqs00k)*qq(i,j) + sqs00k
1247 tqk = (qbtk-bqk)/sqk*rdq
1248 pp(i,j) = tqk-aint(tqk)
1260 p00k = ptbl(iq ,ittbk )
1261 p10k = ptbl(iq+1,ittbk )
1262 p01k = ptbl(iq ,ittbk+1)
1263 p11k = ptbl(iq+1,ittbk+1)
1265 tpspk = p00k + (p10k-p00k)*pp(i,j) + (p01k-p00k)*qq(i,j) &
1266 + (p00k-p10k-p01k+p11k)*pp(i,j)*qq(i,j)
1269 if (tpspk > 1.0e-3)
then
1270 apespk = (max(0.,h10e5/ tpspk))**capa
1275 tthesk = tthbtk * exp(elocp*qbtk*apespk/tthbtk)
1277 IF(tthesk > thesp(i,j))
THEN
1283 IF(tthesk < thesp2(i,j))
THEN
1285 thesp2(i,j) = tthesk
1298 pparc(i,j) = pmid(i,j,parcel(i,j))
1309 IF (pmid(i,j,l) < psp(i,j)) lcl(i,j) = l+1
1316 IF (lcl(i,j) > nint(lmh(i,j))) lcl(i,j) = nint(lmh(i,j))
1318 IF (t(i,j,lcl(i,j)) < 263.15)
THEN
1319 thunder(i,j) = .false.
1335 IF(l <= lcl(i,j))
THEN
1336 IF(pmid(i,j,l) < plq)
THEN
1350 CALL ttblex(tpar(ista_2l,jsta_2l,l),ttbl,itb,jtb,klres &
1351 , pmid(ista_2l,jsta_2l,l),pl,qq,pp,rdp,the0,sthe &
1352 , rdthe,thesp,iptb,ithtb)
1358 CALL ttblex(tpar(ista_2l,jsta_2l,l),ttblq,itbq,jtbq,khres &
1359 , pmid(ista_2l,jsta_2l,l),plq,qq,pp,rdpq &
1360 ,the0q,stheq,rdtheq,thesp,iptb,ithtb)
1367 IF(khres(i,j) > 0)
THEN
1368 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
1376 IF(klres(i,j) > 0)
THEN
1377 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
1388 lbeg = min(ieql(i,j),lbeg)
1389 lend = max(lcl(i,j),lend)
1396 IF(t(i,j,ieql(i,j)) > 255.65)
THEN
1397 thunder(i,j) = .false.
1413 IF(l >= ieql(i,j).AND.l <= lcl(i,j))
THEN
1423 IF(idx(i,j) > 0)
THEN
1425 gdzkl = (zint(i,j,l)-zint(i,j,l+1)) * g
1426 esatp = min(
fpvsnew(tpar(i,j,l)),presk)
1427 qsatp = eps*esatp/(presk-esatp*oneps)
1429 tvp = tvirtual(tpar(i,j,l),qsatp)
1430 thetap = tvp*(h10e5/presk)**capa
1432 tv = tvirtual(t(i,j,l),q(i,j,l))
1433 thetaa = tv*(h10e5/presk)**capa
1434 IF(thetap < thetaa)
THEN
1435 cins4(i,j) = cins4(i,j) + (log(thetap)-log(thetaa))*gdzkl
1436 IF(zint(i,j,l)-htsfc(i,j) <= 3000.)
THEN
1437 cins(i,j) = cins(i,j) + (log(thetap)-log(thetaa))*gdzkl
1439 ELSEIF(thetap > thetaa)
THEN
1440 cape4(i,j) = cape4(i,j) + (log(thetap)-log(thetaa))*gdzkl
1441 IF(zint(i,j,l)-htsfc(i,j) <= 3000.)
THEN
1442 cape(i,j) = cape(i,j) + (log(thetap)-log(thetaa))*gdzkl
1444 IF (thunder(i,j) .AND. t(i,j,l) < 273.15 &
1445 .AND. t(i,j,l) > 253.15)
THEN
1446 cape20(i,j) = cape20(i,j) + (log(thetap)-log(thetaa))*gdzkl
1451 IF (itype /= 1)
THEN
1452 presk2 = pmid(i,j,l+1)
1453 esatp2 = min(
fpvsnew(tpar(i,j,l+1)),presk2)
1454 qsatp2 = eps*esatp2/(presk2-esatp2*oneps)
1456 tvp2 = tvirtual(tpar(i,j,l+1),qsatp2)
1457 thetap2 = tvp2*(h10e5/presk2)**capa
1459 tv2 = tvirtual(t(i,j,l+1),q(i,j,l+1))
1460 thetaa2 = tv2*(h10e5/presk2)**capa
1461 IF(thetap >= thetaa .AND. thetap2 <= thetaa2)
THEN
1462 IF(lfc(i,j) == d00)
THEN
1463 lfc(i,j) = zint(i,j,l)
1469 IF(zint(i,j,l)-htsfc(i,j) <= 3000.)
THEN
1470 IF(cape4(i,j) >= 100. .AND. cins4(i,j) >= -250.)
THEN
1471 IF(esrhl(i,j) == lcl(i,j)) esrhl(i,j)=l
1484 IF(esrhh(i,j) > esrhl(i,j)) esrhh(i,j)=ieql(i,j)
1495 cape(i,j) = max(d00,cape(i,j))
1496 cins(i,j) = min(cins(i,j),d00)
1498 zeql(i,j) = zint(i,j,ieql(i,j))
1499 lfc(i,j) = min(lfc(i,j),zint(i,j,ieql(i,j)))
1500 lfc(i,j) = max(zint(i,j, lcl(i,j)),lfc(i,j))
1501 IF (cape20(i,j) < 75.)
THEN
1502 thunder(i,j) = .false.
1504 IF (thunder(i,j))
THEN
1515 IF (itype == 1)
THEN
1525 psfck = pmid(i,j,nint(lmh(i,j)))
1527 IF(pkl >= psfck-dpbnd)
THEN
1528 IF(pmid(i,j,l) < plq)
THEN
1542 CALL ttblex(tpar2(ista_2l,jsta_2l,l),ttbl,itb,jtb,klres &
1543 , pmid(ista_2l,jsta_2l,l),pl,qq,pp,rdp,the0,sthe &
1544 , rdthe,thesp2,iptb,ithtb)
1550 CALL ttblex(tpar2(ista_2l,jsta_2l,l),ttblq,itbq,jtbq,khres &
1551 , pmid(ista_2l,jsta_2l,l),plq,qq,pp,rdpq &
1552 , the0q,stheq,rdtheq,thesp2,iptb,ithtb)
1564 IF(l >= parcel2(i,j).AND.l < nint(lmh(i,j)))
THEN
1573 IF(idx(i,j) > 0)
THEN
1575 gdzkl = (zint(i,j,l)-zint(i,j,l+1)) * g
1576 esatp = min(
fpvsnew(tpar2(i,j,l)),presk)
1577 qsatp = eps*esatp/(presk-esatp*oneps)
1579 tvp = tvirtual(tpar2(i,j,l),qsatp)
1580 thetap = tvp*(h10e5/presk)**capa
1582 tv = tvirtual(t(i,j,l),q(i,j,l))
1583 thetaa = tv*(h10e5/presk)**capa
1585 dcape(i,j) = dcape(i,j) + (log(thetap)-log(thetaa))*gdzkl
1595 dcape(i,j) = min(d00,dcape(i,j))
1611 IF(t(i,j,l) <= tfrz-12. .AND. l12(i,j)==lm) l12(i,j)=l
1612 IF(t(i,j,l) <= tfrz-17. .AND. l17(i,j)==lm) l17(i,j)=l
1619 IF(l12(i,j)/=lm .AND. l17(i,j)/=lm)
THEN
1620 dgld(i,j)=zint(i,j,l17(i,j))-zint(i,j,l12(i,j))
1621 dgld(i,j)=max(dgld(i,j),0.)
1635 IF(zint(i,j,l)-htsfc(i,j) <= 3000.) l3km(i,j)=l
1642 esp(i,j) = (cape(i,j) / 50.) * (t(i,j,lm) - t(i,j,l3km(i,j)) - 7.0)
1643 IF((t(i,j,lm) - t(i,j,l3km(i,j))) < 7.0) esp(i,j) = 0.
1658 elemental function tvirtual(T,Q)
1664 REAL,
INTENT(IN) :: t, q
1666 tvirtual = t*(1+0.608*q)
1668 end function tvirtual
1697 SUBROUTINE calvor(UWND,VWND,ABSV)
1701 use vrbls2d,
only: f
1702 use masks,
only: gdlat, gdlon, dx, dy
1703 use params_mod,
only: d00, dtr, small, erad
1704 use ctlblk_mod,
only: jsta_2l, jend_2u, spval, modelname, global, &
1705 jsta, jend, im, jm, jsta_m, jend_m, gdsdegr,&
1706 ista, iend, ista_m, iend_m, ista_2l, iend_2u, me, num_procs
1707 use gridspec_mod,
only: gridtype, dyval
1708 use upp_math,
only: dvdxdudy, ddvdx, ddudy, uuavg
1714 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u),
intent(in) :: uwnd, vwnd
1715 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u),
intent(inout) :: absv
1716 REAL,
dimension(IM,2) :: glatpoles, coslpoles, upoles, avpoles
1717 REAL,
dimension(IM,JSTA:JEND) :: cosltemp, avtemp
1719 real,
allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
1720 INTEGER,
allocatable :: ihe(:),ihw(:), ie(:),iw(:)
1722 integer,
parameter :: npass2=2, npass3=3
1723 integer i,j,ip1,im1,ii,iir,iil,jj,jmt2,imb2, npass, nn, jtem
1724 real r2dx,r2dy,dvdx,dudy,uavg,tph1,tphi, tx1(im+2), tx2(im+2)
1731 IF(modelname ==
'RAPR')
then
1733 DO j=jsta_2l,jend_2u
1734 DO i=ista_2l,iend_2u
1740 DO j=jsta_2l,jend_2u
1741 DO i=ista_2l,iend_2u
1752 IF (modelname ==
'GFS' .or. global)
THEN
1753 CALL exch(gdlat(ista_2l,jsta_2l))
1754 CALL exch(gdlon(ista_2l,jsta_2l))
1756 allocate (wrk1(ista:iend,jsta:jend), wrk2(ista:iend,jsta:jend), &
1757 & wrk3(ista:iend,jsta:jend), cosl(ista_2l:iend_2u,jsta_2l:jend_2u))
1758 allocate(iw(im),ie(im))
1779 cosl(i,j) = cos(gdlat(i,j)*dtr)
1780 IF(cosl(i,j) >= small)
then
1781 wrk1(i,j) = 1.0 / (erad*cosl(i,j))
1785 if(i == im .or. i == 1)
then
1786 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr)
1788 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr)
1795 call fullpole( cosl(ista_2l:iend_2u,jsta_2l:jend_2u),coslpoles)
1796 call fullpole(gdlat(ista_2l:iend_2u,jsta_2l:jend_2u),glatpoles)
1798 if(me==0 ) print*,
'CALVOR ',me,glatpoles(ista,1),glatpoles(ista,2)
1799 if(me==num_procs-1) print*,
'CALVOR ',me,glatpoles(ista,1),glatpoles(ista,2)
1804 if(gdlat(ista,j) > 0.)
then
1807 if (ii > im) ii = ii - im
1809 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-glatpoles(ii,1))*dtr)
1814 if (ii > im) ii = ii - im
1816 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+glatpoles(ii,1))*dtr)
1820 elseif (j == jm)
then
1821 if(gdlat(ista,j) < 0.)
then
1824 if (ii > im) ii = ii - im
1826 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+glatpoles(ii,2))*dtr)
1831 if (ii > im) ii = ii - im
1833 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-glatpoles(ii,2))*dtr)
1838 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr)
1847 call fullpole(uwnd(ista_2l:iend_2u,jsta_2l:jend_2u),upoles)
1854 if(gdlat(ista,j) > 0.)
then
1855 IF(cosl(ista,j) >= small)
THEN
1860 if (ii > im) ii = ii - im
1861 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1863 upoles(ii,1)==spval .or. uwnd(i,j+1)==spval) cycle
1864 absv(i,j) = ((vwnd(ip1,j)-vwnd(im1,j))*wrk2(i,j) &
1866 & + (upoles(ii,1)*coslpoles(ii,1) &
1867 & + uwnd(i,j+1)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j) &
1875 if(vwnd(ip1,jj)==spval .or. vwnd(im1,jj)==spval .or. &
1876 uwnd(i,j)==spval .or. uwnd(i,jj+1)==spval) cycle
1877 absv(i,j) = ((vwnd(ip1,jj)-vwnd(im1,jj))*wrk2(i,jj) &
1878 & - (uwnd(i,j)*cosl(i,j) &
1879 - uwnd(i,jj+1)*cosl(i,jj+1))*wrk3(i,jj)) * wrk1(i,jj) &
1884 IF(cosl(ista,j) >= small)
THEN
1889 if (ii > im) ii = ii - im
1890 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1892 upoles(ii,1)==spval .or. uwnd(i,j+1)==spval) cycle
1893 absv(i,j) = ((vwnd(ip1,j)-vwnd(im1,j))*wrk2(i,j) &
1895 & - (upoles(ii,1)*coslpoles(ii,1) &
1896 & + uwnd(i,j+1)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j) &
1904 if(vwnd(ip1,jj)==spval .or. vwnd(im1,jj)==spval .or. &
1905 uwnd(i,j)==spval .or. uwnd(i,jj+1)==spval) cycle
1906 absv(i,j) = ((vwnd(ip1,jj)-vwnd(im1,jj))*wrk2(i,jj) &
1907 & + (uwnd(i,j)*cosl(i,j) &
1908 - uwnd(i,jj+1)*cosl(i,jj+1))*wrk3(i,jj)) * wrk1(i,jj) &
1913 ELSE IF(j == jm)
THEN
1914 if(gdlat(ista,j) < 0.)
then
1915 IF(cosl(ista,j) >= small)
THEN
1920 if (ii > im) ii = ii - im
1921 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1923 uwnd(i,j-1)==spval .or. upoles(ii,2)==spval) cycle
1924 absv(i,j) = ((vwnd(ip1,j)-vwnd(im1,j))*wrk2(i,j) &
1925 & - (uwnd(i,j-1)*cosl(i,j-1) &
1927 & + upoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j) &
1935 if(vwnd(ip1,jj)==spval .or. vwnd(im1,jj)==spval .or. &
1936 uwnd(i,jj-1)==spval .or. uwnd(i,j)==spval) cycle
1937 absv(i,j) = ((vwnd(ip1,jj)-vwnd(im1,jj))*wrk2(i,jj) &
1938 & - (uwnd(i,jj-1)*cosl(i,jj-1) &
1939 & - uwnd(i,j)*cosl(i,j))*wrk3(i,jj)) * wrk1(i,jj) &
1944 IF(cosl(ista,j) >= small)
THEN
1949 if (ii > im) ii = ii - im
1950 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1952 uwnd(i,j-1)==spval .or. upoles(ii,2)==spval) cycle
1953 absv(i,j) = ((vwnd(ip1,j)-vwnd(im1,j))*wrk2(i,j) &
1954 & + (uwnd(i,j-1)*cosl(i,j-1) &
1956 & + upoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j) &
1964 if(vwnd(ip1,jj)==spval .or. vwnd(im1,jj)==spval .or. &
1965 uwnd(i,jj-1)==spval .or. uwnd(i,j)==spval) cycle
1966 absv(i,j) = ((vwnd(ip1,jj)-vwnd(im1,jj))*wrk2(i,jj) &
1967 & + (uwnd(i,jj-1)*cosl(i,jj-1) &
1968 & - uwnd(i,j)*cosl(i,j))*wrk3(i,jj)) * wrk1(i,jj) &
1977 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1978 uwnd(i,j-1)==spval .or. uwnd(i,j+1)==spval) cycle
1979 absv(i,j) = ((vwnd(ip1,j)-vwnd(im1,j))*wrk2(i,j) &
1980 & - (uwnd(i,j-1)*cosl(i,j-1) &
1981 - uwnd(i,j+1)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j) &
1998 tx1(i-1) = 0.25 * (tx2(i-1) + tx2(i+1)) + 0.5*tx2(i)
2012 call exch(absv(ista_2l:iend_2u,jsta_2l:jend_2u))
2013 call fullpole(absv(ista_2l:iend_2u,jsta_2l:jend_2u),avpoles)
2016 if(jsta== 1) cosltemp(1:im, 1)=coslpoles(1:im,1)
2017 if(jend==jm) cosltemp(1:im,jm)=coslpoles(1:im,2)
2019 if(jsta== 1) avtemp(1:im, 1)=avpoles(1:im,1)
2020 if(jend==jm) avtemp(1:im,jm)=avpoles(1:im,2)
2022 call poleavg(im,jm,jsta,jend,small,cosltemp(1,jsta),spval,avtemp(1,jsta))
2024 if(jsta== 1) absv(ista:iend, 1)=avtemp(ista:iend, 1)
2025 if(jend==jm) absv(ista:iend,jm)=avtemp(ista:iend,jm)
2027 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
2031 IF (gridtype ==
'B')
THEN
2036 CALL dvdxdudy(uwnd,vwnd)
2038 IF(gridtype ==
'A')
THEN
2042 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2044 IF(vwnd(i+1,j)<spval.AND.vwnd(i-1,j)<spval.AND. &
2045 & uwnd(i,j+1)<spval.AND.uwnd(i,j-1)<spval)
THEN
2050 IF(modelname ==
'RAPR')
then
2051 absv(i,j) = dvdx - dudy + f(i,j)
2053 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(gdlat(i,j)*dtr)/erad
2059 ELSE IF (gridtype ==
'E')
THEN
2060 allocate(ihw(jsta_2l:jend_2u), ihe(jsta_2l:jend_2u))
2062 DO j=jsta_2l,jend_2u
2069 tphi = (j-jmt2)*(dyval/1000.)*dtr
2070 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2072 IF(vwnd(i+ihe(j),j) < spval.AND.vwnd(i+ihw(j),j) < spval .AND. &
2073 & uwnd(i,j+1) < spval .AND.uwnd(i,j-1) < spval)
THEN
2078 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(tphi)/erad
2082 deallocate(ihw, ihe)
2083 ELSE IF (gridtype ==
'B')
THEN
2087 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2089 if(vwnd(i, j)==spval .or. vwnd(i, j-1)==spval .or. &
2090 vwnd(i-1,j)==spval .or. vwnd(i-1,j-1)==spval .or. &
2091 uwnd(i, j)==spval .or. uwnd(i-1,j)==spval .or. &
2092 uwnd(i,j-1)==spval .or. uwnd(i-1,j-1)==spval) cycle
2097 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(tphi)/erad
2125 use masks,
only: gdlat, gdlon
2126 use params_mod,
only: d00, dtr, small, erad
2127 use ctlblk_mod,
only: jsta_2l, jend_2u, spval, modelname, global, &
2128 jsta, jend, im, jm, jsta_m, jend_m, lm, &
2129 ista, iend, ista_m, iend_m, ista_2l, iend_2u
2130 use gridspec_mod,
only: gridtype
2136 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u,lm),
intent(in) :: uwnd,vwnd
2137 REAL,
dimension(ista:iend,jsta:jend,lm),
intent(inout) :: div
2138 REAL,
dimension(IM,2) :: glatpoles, coslpoles, upoles, vpoles, divpoles
2139 REAL,
dimension(IM,JSTA:JEND) :: cosltemp, divtemp
2141 real,
allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
2142 INTEGER,
allocatable :: ihe(:),ihw(:), ie(:),iw(:)
2144 real :: dnpole, dspole, tem
2145 integer i,j,ip1,im1,ii,iir,iil,jj,imb2, l
2152 CALL exch(gdlat(ista_2l,jsta_2l))
2153 CALL exch(gdlon(ista_2l,jsta_2l))
2155 allocate (wrk1(ista:iend,jsta:jend), wrk2(ista:iend,jsta:jend), &
2156 & wrk3(ista:iend,jsta:jend), cosl(ista_2l:iend_2u,jsta_2l:jend_2u))
2157 allocate(iw(im),ie(im))
2174 cosl(i,j) = cos(gdlat(i,j)*dtr)
2175 IF(cosl(i,j) >= small)
then
2176 wrk1(i,j) = 1.0 / (erad*cosl(i,j))
2180 if(i == im .or. i == 1)
then
2181 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr)
2183 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr)
2189 CALL fullpole(cosl,coslpoles)
2190 CALL fullpole(gdlat(ista_2l:iend_2u,jsta_2l:jend_2u),glatpoles)
2195 if(gdlat(ista,j) > 0.)
then
2198 if (ii > im) ii = ii - im
2200 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-glatpoles(ii,1))*dtr)
2205 if (ii > im) ii = ii - im
2207 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+glatpoles(ii,1))*dtr)
2210 elseif (j == jm)
then
2211 if(gdlat(ista,j) < 0.)
then
2214 if (ii > im) ii = ii - im
2216 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+glatpoles(ii,2))*dtr)
2221 if (ii > im) ii = ii - im
2223 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-glatpoles(ii,2))*dtr)
2228 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr)
2241 CALL exch(vwnd(ista_2l,jsta_2l,l))
2242 CALL exch(uwnd(ista_2l,jsta_2l,l))
2244 CALL fullpole(vwnd(ista_2l:iend_2u,jsta_2l:jend_2u,l),vpoles)
2245 CALL fullpole(uwnd(ista_2l:iend_2u,jsta_2l:jend_2u,l),upoles)
2250 if(gdlat(ista,j) > 0.)
then
2251 IF(cosl(ista,j) >= small)
THEN
2256 if (ii > im) ii = ii - im
2257 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2259 & - (vpoles(ii,1)*coslpoles(ii,1) &
2260 & + vwnd(i,j+1,l)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j)
2268 div(i,j,l) = ((uwnd(ip1,jj,l)-uwnd(im1,jj,l))*wrk2(i,jj) &
2269 & + (vwnd(i,j,l)*cosl(i,j) &
2270 - vwnd(i,jj+1,l)*cosl(i,jj+1))*wrk3(i,jj)) * wrk1(i,jj)
2275 IF(cosl(ista,j) >= small)
THEN
2280 if (ii > im) ii = ii - im
2281 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2283 & + (vpoles(ii,1)*coslpoles(ii,1) &
2284 & + vwnd(i,j+1,l)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j)
2292 div(i,j,l) = ((uwnd(ip1,jj,l)-uwnd(im1,jj,l))*wrk2(i,jj) &
2293 & - (vwnd(i,j,l)*cosl(i,j) &
2294 - vwnd(i,jj+1,l)*cosl(i,jj+1))*wrk3(i,jj)) * wrk1(i,jj)
2298 ELSE IF(j == jm)
THEN
2299 if(gdlat(ista,j) < 0.)
then
2300 IF(cosl(ista,j) >= small)
THEN
2305 if (ii > im) ii = ii - im
2306 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2307 & + (vwnd(i,j-1,l)*cosl(i,j-1) &
2309 & + vpoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j)
2317 div(i,j,l) = ((uwnd(ip1,jj,l)-uwnd(im1,jj,l))*wrk2(i,jj) &
2318 & + (vwnd(i,jj-1,l)*cosl(i,jj-1) &
2319 & - vwnd(i,j,l)*cosl(i,j))*wrk3(i,jj)) * wrk1(i,jj)
2324 IF(cosl(ista,j) >= small)
THEN
2329 if (ii > im) ii = ii - im
2330 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2331 & - (vwnd(i,j-1,l)*cosl(i,j-1) &
2333 & + vpoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j)
2341 div(i,j,l) = ((uwnd(ip1,jj,l)-uwnd(im1,jj,l))*wrk2(i,jj) &
2342 & - (vwnd(i,jj-1,l)*cosl(i,jj-1) &
2343 & - vwnd(i,j,l)*cosl(i,j))*wrk3(i,jj)) * wrk1(i,jj)
2352 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2353 & + (vwnd(i,j-1,l)*cosl(i,j-1) &
2354 - vwnd(i,j+1,l)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j)
2356 if(div(i,j,l)>1.0)print*,
'Debug in CALDIV',i,j,uwnd(ip1,j,l),uwnd(im1,j,l), &
2357 & wrk2(i,j),vwnd(i,j-1,l),cosl(i,j-1),vwnd(i,j+1,l),cosl(i,j+1), &
2358 & wrk3(i,j),wrk1(i,j),div(i,j,l)
2367 call exch(div(ista_2l:iend_2u,jsta_2l:jend_2u,l))
2368 call fullpole(div(ista_2l:iend_2u,jsta_2l:jend_2u,l),divpoles)
2371 IF(jsta== 1) cosltemp(1:im, 1)=coslpoles(1:im,1)
2372 IF(jend==jm) cosltemp(1:im,jm)=coslpoles(1:im,2)
2374 IF(jsta== 1) divtemp(1:im, 1)=divpoles(1:im,1)
2375 IF(jend==jm) divtemp(1:im,jm)=divpoles(1:im,2)
2377 call poleavg(im,jm,jsta,jend,small,cosltemp(1:im,jsta:jend) &
2378 ,spval,divtemp(1:im,jsta:jend))
2380 IF(jsta== 1) div(ista:iend, 1,l)=divtemp(ista:iend, 1)
2381 IF(jend==jm) div(ista:iend,jm,l)=divtemp(ista:iend,jm)
2384 if(div(ista,jsta,l)>1.0)print*,
'Debug in CALDIV',jsta,div(ista,jsta,l)
2389 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
2410 use masks,
only: gdlat, gdlon
2411 use params_mod,
only: dtr, d00, small, erad
2412 use ctlblk_mod,
only: jsta_2l, jend_2u, spval, modelname, global, &
2413 jsta, jend, im, jm, jsta_m, jend_m, &
2414 ista, iend, ista_m, iend_m, ista_2l, iend_2u
2416 use gridspec_mod,
only: gridtype
2422 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u),
intent(in) :: ps
2423 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u),
intent(inout) :: psx,psy
2425 real,
allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
2426 INTEGER,
allocatable :: ihe(:),ihw(:), ie(:),iw(:)
2428 integer i,j,ip1,im1,ii,iir,iil,jj,imb2
2449 CALL exch(gdlat(ista_2l,jsta_2l))
2450 CALL exch(gdlon(ista_2l,jsta_2l))
2452 allocate (wrk1(ista:iend,jsta:jend), wrk2(ista:iend,jsta:jend), &
2453 & wrk3(ista:iend,jsta:jend), cosl(ista_2l:iend_2u,jsta_2l:jend_2u))
2454 allocate(iw(im),ie(im))
2471 cosl(i,j) = cos(gdlat(i,j)*dtr)
2472 if(cosl(i,j) >= small)
then
2473 wrk1(i,j) = 1.0 / (erad*cosl(i,j))
2477 if(i == im .or. i == 1)
then
2478 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr)
2480 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr)
2490 if(gdlat(ista,j) > 0.)
then
2493 if (ii > im) ii = ii - im
2494 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-gdlat(ii,j))*dtr)
2499 if (ii > im) ii = ii - im
2500 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+gdlat(ii,j))*dtr)
2503 elseif (j == jm)
then
2504 if(gdlat(ista,j) < 0.)
then
2507 if (ii > im) ii = ii - im
2508 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+gdlat(ii,j))*dtr)
2513 if (ii > im) ii = ii - im
2514 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-gdlat(ii,j))*dtr)
2519 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr)
2527 if(gdlat(ista,j) > 0.)
then
2528 IF(cosl(ista,j) >= small)
THEN
2533 if (ii > im) ii = ii - im
2534 psx(i,j) = (ps(ip1,j)-ps(im1,j))*wrk2(i,j)*wrk1(i,j)
2535 psy(i,j) = (ps(ii,j)-ps(i,j+1))*wrk3(i,j)/erad
2542 psx(i,j) = (ps(ip1,jj)-ps(im1,jj))*wrk2(i,jj)*wrk1(i,jj)
2543 psy(i,j) = (ps(i,j)-ps(i,jj+1))*wrk3(i,jj)/erad
2547 IF(cosl(ista,j) >= small)
THEN
2552 if (ii > im) ii = ii - im
2553 psx(i,j) = (ps(ip1,j)-ps(im1,j))*wrk2(i,j)*wrk1(i,j)
2554 psy(i,j) = - (ps(ii,j)-ps(i,j+1))*wrk3(i,j)/erad
2561 psx(i,j) = (ps(ip1,jj)-ps(im1,jj))*wrk2(i,jj)*wrk1(i,jj)
2562 psy(i,j) = - (ps(i,j)-ps(i,jj+1))*wrk3(i,jj)/erad
2566 ELSE IF(j == jm)
THEN
2567 if(gdlat(ista,j) < 0.)
then
2568 IF(cosl(ista,j) >= small)
THEN
2573 if (ii > im) ii = ii - im
2574 psx(i,j) = (ps(ip1,j)-ps(im1,j))*wrk2(i,j)*wrk1(i,j)
2575 psy(i,j) = (ps(i,j-1)-ps(ii,j))*wrk3(i,j)/erad
2582 psx(i,j) = (ps(ip1,jj)-ps(im1,jj))*wrk2(i,jj)*wrk1(i,jj)
2583 psy(i,j) = (ps(i,jj-1)-ps(i,j))*wrk3(i,jj)/erad
2587 IF(cosl(ista,j) >= small)
THEN
2592 if (ii > im) ii = ii - im
2593 psx(i,j) = (ps(ip1,j)-ps(im1,j))*wrk2(i,j)*wrk1(i,j)
2594 psy(i,j) = - (ps(i,j-1)-ps(ii,j))*wrk3(i,j)/erad
2601 psx(i,j) = (ps(ip1,jj)-ps(im1,jj))*wrk2(i,jj)*wrk1(i,jj)
2602 psy(i,j) = - (ps(i,jj-1)-ps(i,j))*wrk3(i,jj)/erad
2610 psx(i,j) = (ps(ip1,j)-ps(im1,j))*wrk2(i,j)*wrk1(i,j)
2611 psy(i,j) = (ps(i,j-1)-ps(i,j+1))*wrk3(i,j)/erad
2613 if(psx(i,j)>100.0)print*,
'Debug in CALGRADPS: PSX',i,j,ps(ip1,j),ps(im1,j), &
2615 & wrk2(i,j),wrk1(i,j),psx(i,j)
2616 if(psy(i,j)>100.0)print*,
'Debug in CALGRADPS: PSY',i,j,ps(i,j-1),ps(i,j+1), &
2618 & wrk3(i,j),erad,psy(i,j)
2625 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
dvdxdudy() computes dudy, dvdx, uwnd
calcape() computes CAPE/CINS and other storm related variables.
subroutine, public calcape2(itype, dpbnd, p1d, t1d, q1d, l1d, cape, cins, lfc, esrhl, esrhh, dcape, dgld, esp)
calcape2() computes CAPE and CINS.
subroutine, public calcape(itype, dpbnd, p1d, t1d, q1d, l1d, cape, cins, pparc, zeql, thund)
calcape() computes CAPE and CINS.
subroutine, public calgradps(ps, psx, psy)
subroutine, public calrh_nam(p1, t1, q1, rh)
calrh_nam() computes relative humidity.
subroutine, public caldiv(uwnd, vwnd, div)
CALDIV computes divergence.
elemental real function, public fpvsnew(t)
subroutine, public calrh_gfs(p1, t1, q1, rh)
calrh_gfs() computes relative humidity.