33 public :: calcape, calcape2
37 public :: calrh_gfs, calrh_gsd, calrh_nam
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)
60 CALL calrh_nam(p1,t1,q1,rh)
95 SUBROUTINE calrh_nam(P1,T1,Q1,RH)
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
142 END SUBROUTINE calrh_nam
175 SUBROUTINE calrh_gfs(P1,T1,Q1,RH)
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))
234 END SUBROUTINE calrh_gfs
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)
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
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
905 END SUBROUTINE calcape
1003 SUBROUTINE calcape2(ITYPE,DPBND,P1D,T1D,Q1D,L1D, &
1004 cape,cins,lfc,esrhl,esrhh, &
1006 use vrbls3d, only: pmid, t, q, zint
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.
1651 END SUBROUTINE calcape2
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)
1702 use masks, only: gdlat, gdlon, dx, dy
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
2124 SUBROUTINE caldiv(UWND,VWND,DIV)
2125 use masks, only: gdlat, gdlon
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)
2392 END SUBROUTINE caldiv
2394 SUBROUTINE calgradps(PS,PSX,PSY)
2410 use masks, only: gdlat, gdlon
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)
2629 END SUBROUTINE calgradps
dvdxdudy() computes dudy, dvdx, uwnd
elemental real function, public fpvsnew(t)
calcape() computes CAPE/CINS and other storm related variables.