UPP v11.0.0
Loading...
Searching...
No Matches
UPP_PHYSICS.f
Go to the documentation of this file.
1
5
28
29 implicit none
30
31 private
32
33 public :: calcape, calcape2
34 public :: caldiv
35 public :: calgradps
36 public :: calrh
37 public :: calrh_gfs, calrh_gsd, calrh_nam
38 public :: calrh_pw
39 public :: calvor
40
41 public :: fpvsnew
42 public :: tvirtual
43
44 contains
45!
46!-------------------------------------------------------------------------------------
47!
48 SUBROUTINE calrh(P1,T1,Q1,RH)
49
50 use ctlblk_mod, only: ista, iend, jsta, jend, modelname
51 implicit none
52
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
56
57 IF(modelname == 'RAPR')THEN
58 CALL calrh_gsd(p1,t1,q1,rh)
59 ELSE
60 CALL calrh_nam(p1,t1,q1,rh)
61 END IF
62
63 END SUBROUTINE calrh
64!
65!-------------------------------------------------------------------------------------
66!
95 SUBROUTINE calrh_nam(P1,T1,Q1,RH)
96 use params_mod, only: pq0, a2, a3, a4, rhmin
97 use ctlblk_mod, only: ista, iend, jsta, jend, spval
98!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
99 implicit none
100!
101! SET PARAMETER.
102!
103! DECLARE VARIABLES.
104!
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
108 REAL qc
109 integer i,j
110!***************************************************************
111!
112! START CALRH.
113!
114 DO j=jsta,jend
115 DO i=ista,iend
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))
119!
120 rh(i,j) = q1(i,j)/qc
121!
122! BOUNDS CHECK
123!
124 IF (rh(i,j) > 1.0) THEN
125 rh(i,j) = 1.0
126 q1(i,j) = rh(i,j)*qc
127 ENDIF
128 IF (rh(i,j) < rhmin) THEN !use smaller RH limit for stratosphere
129 rh(i,j) = rhmin
130 q1(i,j) = rh(i,j)*qc
131 ENDIF
132!
133 ENDIF
134 ELSE
135 rh(i,j) = spval
136 ENDIF
137 ENDDO
138 ENDDO
139!
140!
141! END SUBROUTINE CALRH
142 END SUBROUTINE calrh_nam
143!
144!-------------------------------------------------------------------------------------
145!
175 SUBROUTINE calrh_gfs(P1,T1,Q1,RH)
176 use params_mod, only: rhmin
177 use ctlblk_mod, only: ista, iend, jsta, jend, spval
178!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
179 implicit none
180!
181 real,parameter:: con_rd =2.8705e+2 ! gas constant air (J/kg/K)
182 real,parameter:: con_rv =4.6150e+2 ! gas constant H2O
183 real,parameter:: con_eps =con_rd/con_rv
184 real,parameter:: con_epsm1 =con_rd/con_rv-1
185! real,external::FPVSNEW
186
187! INTERFACE
188! ELEMENTAL FUNCTION FPVSNEW (t)
189! REAL FPVSNEW
190! REAL, INTENT(IN) :: t
191! END FUNCTION FPVSNEW
192! END INTERFACE
193!
194 REAL,dimension(ista:iend,jsta:jend),intent(in) :: p1,t1
195 REAL,dimension(ista:iend,jsta:jend),intent(inout):: q1,rh
196 REAL es,qc
197 integer :: i,j
198!***************************************************************
199!
200! START CALRH.
201!
202!$omp parallel do private(i,j,es,qc)
203 DO j=jsta,jend
204 DO i=ista,iend
205 IF (t1(i,j) < spval .AND. p1(i,j) < spval.AND.q1(i,j)/=spval) THEN
206! IF (ABS(P1(I,J)) > 1.0) THEN
207! IF (P1(I,J) > 1.0) 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)
211
212! QC=PQ0/P1(I,J)*EXP(A2*(T1(I,J)-A3)/(T1(I,J)-A4))
213
214 rh(i,j) = min(1.0,max(q1(i,j)/qc,rhmin))
215 q1(i,j) = rh(i,j)*qc
216
217! BOUNDS CHECK
218!
219! IF (RH(I,J) > 1.0) THEN
220! RH(I,J) = 1.0
221! Q1(I,J) = RH(I,J)*QC
222! ELSEIF (RH(I,J) < RHmin) THEN !use smaller RH limit for stratosphere
223! RH(I,J) = RHmin
224! Q1(I,J) = RH(I,J)*QC
225! ENDIF
226
227 ENDIF
228 ELSE
229 rh(i,j) = spval
230 ENDIF
231 ENDDO
232 ENDDO
233
234 END SUBROUTINE calrh_gfs
235!
236!-------------------------------------------------------------------------------------
237!
238 SUBROUTINE calrh_gsd(P1,T1,Q1,RHB)
239!
240! Algorithm use at GSD for RUC and Rapid Refresh
241!------------------------------------------------------------------
242!
243
244 use ctlblk_mod, only: ista, iend, jsta, jend, spval
245
246 implicit none
247
248 integer :: j, i
249 real :: tx, pol, esx, es, e
250 real, dimension(ista:iend,jsta:jend) :: p1, t1, q1, rhb
251
252
253 DO j=jsta,jend
254 DO i=ista,iend
255 IF (t1(i,j) < spval .AND. p1(i,j) < spval .AND. q1(i,j) < spval) THEN
256! - compute relative humidity
257 tx=t1(i,j)-273.15
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)))))))))
263 esx = 6.1078/pol**8
264
265 es = esx
266 e = p1(i,j)/100.*q1(i,j)/(0.62197+q1(i,j)*0.37803)
267 rhb(i,j) = min(1.,e/es)
268 ELSE
269 rhb(i,j) = spval
270 ENDIF
271 ENDDO
272 ENDDO
273
274 END SUBROUTINE calrh_gsd
275!
276!-------------------------------------------------------------------------------------
277!
278 SUBROUTINE calrh_pw(RHPW)
279!
280! Algorithm use at GSD for RUC and Rapid Refresh
281!------------------------------------------------------------------
282!
283
284 use vrbls3d, only: q, pmid, t
285 use params_mod, only: g
286 use ctlblk_mod, only: lm, ista, iend, jsta, jend, spval
287!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
288 implicit none
289
290 real,PARAMETER :: svp1=6.1153,svp2=17.67,svp3=29.65
291
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
295
296 pw = 0.
297 pw_sat = 0.
298 rhpw = 0.
299
300 DO l=1,lm
301 k=lm-l+1
302 DO j=jsta,jend
303 DO i=ista,iend
304! -- use specific humidity for PW calculation
305 if(t(i,j,k)<spval.and.q(i,j,k)<spval) then
306 sh = q(i,j,k)
307 qv = sh/(1.-sh)
308 ka = max(1,k-1)
309 kb = min(lm,k+1)
310
311! assumes that P is in mb at this point - be careful!
312 deltp = 0.5*(pmid(i,j,kb)-pmid(i,j,ka))
313 pw(i,j) = pw(i,j) + sh *deltp/g
314
315!Csgb -- Add more for RH w.r.t. PW-sat
316
317 temp = t(i,j,k)
318! --- use saturation mixing ratio w.r.t. water here
319! for this check.
320 es = svp1*exp(svp2*(temp-273.15)/(temp-svp3))
321! -- get saturation specific humidity (w.r.t. total air)
322 qs = 0.62198*es/(pmid(i,j,k)*1.e-2-0.37802*es)
323! -- get saturation mixing ratio (w.r.t. dry air)
324 qv_sat = qs/(1.-qs)
325
326 pw_sat(i,j) = pw_sat(i,j) + max(sh,qs)*deltp/g
327
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)
331
332!sgb - This IS RH w.r.t. PW-sat.
333 rhpw(i,j) = min(1.,pw(i,j) / pw_sat(i,j)) * 100.
334 else
335 rhpw(i,j) = spval
336 endif
337 ENDDO
338 ENDDO
339 ENDDO
340
341 END SUBROUTINE calrh_pw
342!
343!-------------------------------------------------------------------------------------
344!
345 elemental function fpvsnew(t)
346
368 implicit none
369 integer,parameter:: nxpvs=7501
370 real,parameter:: con_ttp =2.7316e+2 ! temp at H2O 3pt
371 real,parameter:: con_psat =6.1078e+2 ! pres at H2O 3pt
372 real,parameter:: con_cvap =1.8460e+3 ! spec heat H2O gas (J/kg/K)
373 real,parameter:: con_cliq =4.1855e+3 ! spec heat H2O liq
374 real,parameter:: con_hvap =2.5000e+6 ! lat heat H2O cond
375 real,parameter:: con_rv =4.6150e+2 ! gas constant H2O
376 real,parameter:: con_csol =2.1060e+3 ! spec heat H2O ice
377 real,parameter:: con_hfus =3.3358e+5 ! lat heat H2O fusion
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)
388 real tr,w,pvl,pvi
389 real fpvsnew
390 real,intent(in):: t
391 integer jx
392 real xj,x,tbpvs(nxpvs),xp1
393 real xmin,xmax,xinc,c2xpvs,c1xpvs
394! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
395 xmin=180.0
396 xmax=330.0
397 xinc=(xmax-xmin)/(nxpvs-1)
398! c1xpvs=1.-xmin/xinc
399 c2xpvs=1./xinc
400 c1xpvs=1.-xmin*c2xpvs
401! xj=min(max(c1xpvs+c2xpvs*t,1.0),real(nxpvs,krealfp))
402 xj=min(max(c1xpvs+c2xpvs*t,1.0),float(nxpvs))
403 jx=min(xj,float(nxpvs)-1.0)
404 x=xmin+(jx-1)*xinc
405
406 tr=con_ttp/x
407 if(x>=tliq) then
408 tbpvs(jx)=con_psat*(tr**xponal)*exp(xponbl*(1.-tr))
409 elseif(x<tice) then
410 tbpvs(jx)=con_psat*(tr**xponai)*exp(xponbi*(1.-tr))
411 else
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
416 endif
417
418 xp1=xmin+(jx-1+1)*xinc
419
420 tr=con_ttp/xp1
421 if(xp1>=tliq) then
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))
425 else
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
430 endif
431
432 fpvsnew=tbpvs(jx)+(xj-jx)*(tbpvs(jx+1)-tbpvs(jx))
433! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
434 end function fpvsnew
435!
436!-------------------------------------------------------------------------------------
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
531 use masks, only: lmh
532 use params_mod, only: d00, h1m12, h99999, h10e5, capa, elocp, eps, &
533 oneps, g
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
539!
540!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
541 implicit none
542!
543! INCLUDE/SET PARAMETERS. CONSTANTS ARE FROM BOLTON (MWR, 1980).
544 real,PARAMETER :: ismthp=2,ismtht=2,ismthq=2
545!
546! DECLARE VARIABLES.
547!
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
553!
554 integer, dimension(ista:iend,jsta:jend) :: iptb, ithtb, parcel, klres, khres, lcl, idx
555!
556 real, dimension(ista:iend,jsta:jend) :: thesp, psp, cape20, qq, pp, thund
557 REAL, ALLOCATABLE :: tpar(:,:,:)
558
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
563! real,external :: fpvsnew
564 integer i,j,l,knuml,knumh,lbeg,lend,iq, kb,ittbk
565
566! integer I,J,L,KNUML,KNUMH,LBEG,LEND,IQ,IT,LMHK, KB,ITTBK
567!
568!**************************************************************
569! START CALCAPE HERE.
570!
571 ALLOCATE(tpar(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
572!
573! COMPUTE CAPE/CINS
574!
575! WHICH IS: THE SUM FROM THE LCL TO THE EQ LEVEL OF
576! G * (LN(THETAP) - LN(THETAA)) * DZ
577!
578! (POSITIVE AREA FOR CAPE, NEGATIVE FOR CINS)
579!
580! WHERE:
581! THETAP IS THE PARCEL THETA
582! THETAA IS THE AMBIENT THETA
583! DZ IS THE THICKNESS OF THE LAYER
584!
585! USING LCL AS LEVEL DIRECTLY BELOW SATURATION POINT
586! AND EQ LEVEL IS THE HIGHEST POSITIVELY BUOYANT LEVEL.
587!
588! IEQL = EQ LEVEL
589! P_thetaemax - real pressure of theta-e max parcel (Pa)
590!
591! INITIALIZE CAPE AND CINS ARRAYS
592!
593!$omp parallel do
594 DO j=jsta,jend
595 DO i=ista,iend
596 cape(i,j) = d00
597 cape20(i,j) = d00
598 cins(i,j) = d00
599 lcl(i,j) = 0
600 thesp(i,j) = d00
601 ieql(i,j) = lm
602 parcel(i,j) = lm
603 psp(i,j) = d00
604 pparc(i,j) = d00
605 thunder(i,j) = .true.
606 ENDDO
607 ENDDO
608!
609!$omp parallel do
610 DO l=1,lm
611 DO j=jsta,jend
612 DO i=ista,iend
613 tpar(i,j,l) = d00
614 ENDDO
615 ENDDO
616 ENDDO
617!
618! TYPE 2 CAPE/CINS:
619! NOTE THAT FOR TYPE 1 CAPE/CINS ARRAYS P1D, T1D, Q1D
620! ARE DUMMY ARRAYS.
621!
622 IF (itype == 2) THEN
623!$omp parallel do private(i,j)
624 DO j=jsta,jend
625 DO i=ista,iend
626 q1d(i,j) = min(max(h1m12,q1d(i,j)),h99999)
627 ENDDO
628 ENDDO
629 ENDIF
630!-------FOR ITYPE=1--FIND MAXIMUM THETA E LAYER IN LOWEST DPBND ABOVE GROUND-------
631!-------FOR ITYPE=2--FIND THETA E LAYER OF GIVEN T1D, Q1D, P1D---------------------
632!--------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-------------------
633
634 DO kb=1,lm
635!hc IF (ITYPE==2.AND.KB>1) cycle
636 IF (itype == 1 .OR. (itype == 2 .AND. kb == 1)) THEN
637
638!$omp parallel do private(i,j,apebtk,apespk,bqk,bqs00k,bqs10k,iq,ittbk, &
639!$omp & p00k,p01k,p10k,p11k,pkl,psfck,qbtk,sqk,sqs00k, &
640!$omp & sqs10k,tbtk,tpspk,tqk,tthbtk,tthesk,tthk)
641 DO j=jsta,jend
642 DO i=ista,iend
643 psfck = pmid(i,j,nint(lmh(i,j)))
644 pkl = pmid(i,j,kb)
645 IF(psfck<spval.and.pkl<spval)THEN
646
647!hc IF (ITYPE==1.AND.(PKL<PSFCK-DPBND.OR.PKL>PSFCK)) cycle
648 IF (itype ==2 .OR. &
649 (itype == 1 .AND. (pkl >= psfck-dpbnd .AND. pkl <= psfck)))THEN
650 IF (itype == 1) THEN
651 tbtk = t(i,j,kb)
652 qbtk = max(0.0, q(i,j,kb))
653 apebtk = (h10e5/pkl)**capa
654 ELSE
655 pkl = p1d(i,j)
656 tbtk = t1d(i,j)
657 qbtk = max(0.0, q1d(i,j))
658 apebtk = (h10e5/pkl)**capa
659 ENDIF
660
661!----------Breogan Gomez - 2009-02-06
662! To prevent QBTK to be less than 0 which leads to a unrealistic value of PRESK
663! and a floating invalid.
664
665! if(QBTK < 0) QBTK = 0
666
667!--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX--------------
668 tthbtk = tbtk*apebtk
669 tthk = (tthbtk-thl)*rdth
670 qq(i,j) = tthk - aint(tthk)
671 ittbk = int(tthk) + 1
672!--------------KEEPING INDICES WITHIN THE TABLE-------------------------
673 IF(ittbk < 1) THEN
674 ittbk = 1
675 qq(i,j) = d00
676 ENDIF
677 IF(ittbk >= jtb) THEN
678 ittbk = jtb-1
679 qq(i,j) = d00
680 ENDIF
681!--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
682 bqs00k = qs0(ittbk)
683 sqs00k = sqs(ittbk)
684 bqs10k = qs0(ittbk+1)
685 sqs10k = sqs(ittbk+1)
686!--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
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)
691 iq = int(tqk)+1
692!--------------KEEPING INDICES WITHIN THE TABLE-------------------------
693 IF(iq < 1) THEN
694 iq = 1
695 pp(i,j) = d00
696 ENDIF
697 IF(iq >= itb) THEN
698 iq = itb-1
699 pp(i,j) = d00
700 ENDIF
701!--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
702 p00k = ptbl(iq ,ittbk )
703 p10k = ptbl(iq+1,ittbk )
704 p01k = ptbl(iq ,ittbk+1)
705 p11k = ptbl(iq+1,ittbk+1)
706!--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
707 tpspk = p00k + (p10k-p00k)*pp(i,j) + (p01k-p00k)*qq(i,j) &
708 + (p00k-p10k-p01k+p11k)*pp(i,j)*qq(i,j)
709
710!!from WPP::tgs APESPK=(H10E5/TPSPK)**CAPA
711 if (tpspk > 1.0e-3) then
712 apespk = (max(0.,h10e5/ tpspk))**capa
713 else
714 apespk = 0.0
715 endif
716
717 tthesk = tthbtk * exp(elocp*qbtk*apespk/tthbtk)
718!--------------CHECK FOR MAXIMUM THETA E--------------------------------
719 IF(tthesk > thesp(i,j)) THEN
720 psp(i,j) = tpspk
721 thesp(i,j) = tthesk
722 parcel(i,j) = kb
723 ENDIF
724 END IF
725 ENDIF !end PSFCK<spval.and.PKL<spval
726 ENDDO ! I loop
727 ENDDO ! J loop
728 END IF
729 ENDDO ! KB loop
730
731!----FIND THE PRESSURE OF THE PARCEL THAT WAS LIFTED
732!$omp parallel do private(i,j)
733 DO j=jsta,jend
734 DO i=ista,iend
735 pparc(i,j) = pmid(i,j,parcel(i,j))
736 ENDDO
737 ENDDO
738!
739!-----CHOOSE LAYER DIRECTLY BELOW PSP AS LCL AND------------------------
740!-----ENSURE THAT THE LCL IS ABOVE GROUND.------------------------------
741!-------(IN SOME RARE CASES FOR ITYPE=2, IT IS NOT)---------------------
742 DO l=1,lm
743!$omp parallel do private(i,j)
744 DO j=jsta,jend
745 DO i=ista,iend
746 IF (pmid(i,j,l) < psp(i,j)) lcl(i,j) = l+1
747 ENDDO
748 ENDDO
749 ENDDO
750!$omp parallel do private(i,j)
751 DO j=jsta,jend
752 DO i=ista,iend
753 IF (lcl(i,j) > nint(lmh(i,j))) lcl(i,j) = nint(lmh(i,j))
754 IF (itype > 2) THEN
755 IF (t(i,j,lcl(i,j)) < 263.15) THEN
756 thunder(i,j) = .false.
757 ENDIF
758 ENDIF
759 ENDDO
760 ENDDO
761!-----------------------------------------------------------------------
762!---------FIND TEMP OF PARCEL LIFTED ALONG MOIST ADIABAT (TPAR)---------
763!-----------------------------------------------------------------------
764
765 DO l=lm,1,-1
766!--------------SCALING PRESSURE & TT TABLE INDEX------------------------
767 knuml = 0
768 knumh = 0
769 DO j=jsta,jend
770 DO i=ista,iend
771 klres(i,j) = 0
772 khres(i,j) = 0
773 IF(l <= lcl(i,j)) THEN
774 IF(pmid(i,j,l) < plq)THEN
775 knuml = knuml + 1
776 klres(i,j) = 1
777 ELSE
778 knumh = knumh + 1
779 khres(i,j) = 1
780 ENDIF
781 ENDIF
782 ENDDO
783 ENDDO
784!***
785!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE<PLQ
786!**
787 IF(knuml > 0) 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)
791 ENDIF
792!***
793!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE>PLQ
794!**
795 IF(knumh > 0) THEN
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)
799 ENDIF
800
801!------------SEARCH FOR EQ LEVEL----------------------------------------
802!$omp parallel do private(i,j)
803 DO j=jsta,jend
804 DO i=ista,iend
805 IF(khres(i,j) > 0) THEN
806 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
807 ENDIF
808 ENDDO
809 ENDDO
810!
811!$omp parallel do private(i,j)
812 DO j=jsta,jend
813 DO i=ista,iend
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
817 ENDIF
818 ENDDO
819 ENDDO
820!-----------------------------------------------------------------------
821 ENDDO ! end of do l=lm,1,-1 loop
822!------------COMPUTE CAPE AND CINS--------------------------------------
823 lbeg = 1000
824 lend = 0
825 DO j=jsta,jend
826 DO i=ista,iend
827 lbeg = min(ieql(i,j),lbeg)
828 lend = max(lcl(i,j),lend)
829 ENDDO
830 ENDDO
831!
832!$omp parallel do private(i,j)
833 DO j=jsta,jend
834 DO i=ista,iend
835 IF(t(i,j,ieql(i,j)) > 255.65) THEN
836 thunder(i,j) = .false.
837 ENDIF
838 ENDDO
839 ENDDO
840!
841 DO l=lbeg,lend
842
843!$omp parallel do private(i,j)
844 DO j=jsta,jend
845 DO i=ista,iend
846 idx(i,j) = 0
847 IF(l >= ieql(i,j).AND.l <= lcl(i,j)) THEN
848 idx(i,j) = 1
849 ENDIF
850 ENDDO
851 ENDDO
852!
853!$omp parallel do private(i,j,gdzkl,presk,thetaa,thetap,esatp,qsatp,tvp,tv)
854 DO j=jsta,jend
855 DO i=ista,iend
856 IF(idx(i,j) > 0) THEN
857 presk = pmid(i,j,l)
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)
861! TVP = TPAR(I,J,L)*(1+0.608*QSATP)
862 tvp = tvirtual(tpar(i,j,l),qsatp)
863 thetap = tvp*(h10e5/presk)**capa
864! TV = T(I,J,L)*(1+0.608*Q(I,J,L))
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
874 ENDIF
875 ENDIF
876 ENDIF
877 ENDDO
878 ENDDO
879 ENDDO
880!
881! ENFORCE LOWER LIMIT OF 0.0 ON CAPE AND UPPER
882! LIMIT OF 0.0 ON CINS.
883!
884!$omp parallel do private(i,j)
885 DO j=jsta,jend
886 DO i=ista,iend
887 cape(i,j) = max(d00,cape(i,j))
888 cins(i,j) = min(cins(i,j),d00)
889! add equillibrium height
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.
894 ENDIF
895 IF (thunder(i,j)) THEN
896 thund(i,j) = 1.0
897 ELSE
898 thund(i,j) = 0.0
899 ENDIF
900 ENDDO
901 ENDDO
902!
903 DEALLOCATE(tpar)
904!
905 END SUBROUTINE calcape
906!
907!-------------------------------------------------------------------------------------
1003 SUBROUTINE calcape2(ITYPE,DPBND,P1D,T1D,Q1D,L1D, &
1004 CAPE,CINS,LFC,ESRHL,ESRHH, &
1005 DCAPE,DGLD,ESP)
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, &
1011 oneps, g, tfrz
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
1017!
1018!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1019 implicit none
1020!
1021! INCLUDE/SET PARAMETERS. CONSTANTS ARE FROM BOLTON (MWR, 1980).
1022 real,PARAMETER :: ismthp=2,ismtht=2,ismthq=2
1023!
1024! DECLARE VARIABLES.
1025!
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
1030! real, dimension(ista:iend,jsta:jend),intent(inout) :: Q1D,CAPE,CINS,PPARC,ZEQL
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
1036!
1037 integer, dimension(ista:iend,jsta:jend) :: iptb, ithtb, parcel, klres, khres, lcl, idx
1038!
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(:,:,:)
1045
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
1051! real,external :: fpvsnew
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
1056
1057! integer I,J,L,KNUML,KNUMH,LBEG,LEND,IQ,IT,LMHK, KB,ITTBK
1058!
1059!**************************************************************
1060! START CALCAPE HERE.
1061!
1062 ALLOCATE(tpar(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
1063 ALLOCATE(tpar2(ista_2l:iend_2u,jsta_2l:jend_2u,lm))
1064!
1065! COMPUTE CAPE/CINS
1066!
1067! WHICH IS: THE SUM FROM THE LCL TO THE EQ LEVEL OF
1068! G * (LN(THETAP) - LN(THETAA)) * DZ
1069!
1070! (POSITIVE AREA FOR CAPE, NEGATIVE FOR CINS)
1071!
1072! WHERE:
1073! THETAP IS THE PARCEL THETA
1074! THETAA IS THE AMBIENT THETA
1075! DZ IS THE THICKNESS OF THE LAYER
1076!
1077! USING LCL AS LEVEL DIRECTLY BELOW SATURATION POINT
1078! AND EQ LEVEL IS THE HIGHEST POSITIVELY BUOYANT LEVEL.
1079!
1080! IEQL = EQ LEVEL
1081! P_thetaemax - real pressure of theta-e max parcel (Pa)
1082!
1083! INITIALIZE CAPE AND CINS ARRAYS
1084!
1085!$omp parallel do
1086 DO j=jsta,jend
1087 DO i=ista,iend
1088 cape(i,j) = d00
1089 cape20(i,j) = d00
1090 cape4(i,j) = d00
1091 cins(i,j) = d00
1092 cins4(i,j) = d00
1093 lcl(i,j) = 0
1094 thesp(i,j) = d00
1095 ieql(i,j) = lm
1096 parcel(i,j) = lm
1097 psp(i,j) = d00
1098 pparc(i,j) = d00
1099 thunder(i,j) = .true.
1100 lfc(i,j) = d00
1101 esrhl(i,j) = d00
1102 esrhh(i,j) = d00
1103 dcape(i,j) = d00
1104 dgld(i,j) = d00
1105 esp(i,j) = d00
1106 thesp2(i,j) = 1000.
1107 psp2(i,j) = d00
1108 parcel2(i,j) = lm
1109 ENDDO
1110 ENDDO
1111!
1112!$omp parallel do
1113 DO l=1,lm
1114 DO j=jsta,jend
1115 DO i=ista,iend
1116 tpar(i,j,l) = d00
1117 tpar2(i,j,l) = d00
1118 ENDDO
1119 ENDDO
1120 ENDDO
1121!
1122! FIND SURFACE HEIGHT
1123!
1124 IF(gridtype == 'E')THEN
1125 jvn = 1
1126 jvs = -1
1127 do j=jsta,jend
1128 ive(j) = mod(j,2)
1129 ivw(j) = ive(j)-1
1130 enddo
1131 istart = ista_m
1132 istop = iend_m
1133 jstart = jsta_m
1134 jstop = jend_m
1135 ELSE IF(gridtype == 'B')THEN
1136 jvn = 1
1137 jvs = 0
1138 do j=jsta,jend
1139 ive(j)=1
1140 ivw(j)=0
1141 enddo
1142 istart = ista_m
1143 istop = iend_m
1144 jstart = jsta_m
1145 jstop = jend_m
1146 ELSE
1147 jvn = 0
1148 jvs = 0
1149 do j=jsta,jend
1150 ive(j) = 0
1151 ivw(j) = 0
1152 enddo
1153 istart = ista
1154 istop = iend
1155 jstart = jsta
1156 jstop = jend
1157 END IF
1158!!$omp parallel do private(htsfc,ie,iw)
1159 IF(gridtype /= 'A') CALL exch(fis(ista:iend,jsta:jend))
1160 DO j=jstart,jstop
1161 DO i=istart,istop
1162 ie = i+ive(j)
1163 iw = i+ivw(j)
1164 jn = j+jvn
1165 js = j+jvs
1166!mp PDSLVK=(PD(IW,J)*RES(IW,J)+PD(IE,J)*RES(IE,J)+
1167!mp 1 PD(I,J+1)*RES(I,J+1)+PD(I,J-1)*RES(I,J-1))*0.25
1168!mp PSFCK=AETA(LMV(I,J))*PDSLVK+PT
1169 IF (gridtype=='B')THEN
1170 htsfc(i,j) = (0.25/g)*(fis(iw,j)+fis(ie,j)+fis(i,jn)+fis(ie,jn))
1171 ELSE
1172 htsfc(i,j) = (0.25/g)*(fis(iw,j)+fis(ie,j)+fis(i,jn)+fis(i,js))
1173 ENDIF
1174 ENDDO
1175 ENDDO
1176!
1177! TYPE 2 CAPE/CINS:
1178! NOTE THAT FOR TYPE 1 CAPE/CINS ARRAYS P1D, T1D, Q1D
1179! ARE DUMMY ARRAYS.
1180!
1181 IF (itype == 2) THEN
1182!$omp parallel do private(i,j)
1183 DO j=jsta,jend
1184 DO i=ista,iend
1185 q1d(i,j) = min(max(h1m12,q1d(i,j)),h99999)
1186 ENDDO
1187 ENDDO
1188 ENDIF
1189!-------FOR ITYPE=1--FIND MAXIMUM THETA E LAYER IN LOWEST DPBND ABOVE GROUND-------
1190!-------FOR ITYPE=2--FIND THETA E LAYER OF GIVEN T1D, Q1D, P1D---------------------
1191!--------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-------------------
1192
1193 DO kb=1,lm
1194!hc IF (ITYPE==2.AND.KB>1) cycle
1195 IF (itype == 1 .OR. (itype == 2 .AND. kb == 1)) THEN
1196
1197!$omp parallel do private(i,j,apebtk,apespk,bqk,bqs00k,bqs10k,iq,ittbk, &
1198!$omp & p00k,p01k,p10k,p11k,pkl,psfck,qbtk,sqk,sqs00k, &
1199!$omp & sqs10k,tbtk,tpspk,tqk,tthbtk,tthesk,tthk)
1200 DO j=jsta,jend
1201 DO i=ista,iend
1202 psfck = pmid(i,j,nint(lmh(i,j)))
1203 pkl = pmid(i,j,kb)
1204
1205!hc IF (ITYPE==1.AND.(PKL<PSFCK-DPBND.OR.PKL>PSFCK)) cycle
1206 IF (itype ==2 .OR. &
1207 (itype == 1 .AND. (pkl >= psfck-dpbnd .AND. pkl <= psfck)))THEN
1208 IF (itype == 1) THEN
1209 tbtk = t(i,j,kb)
1210 qbtk = max(0.0, q(i,j,kb))
1211 apebtk = (h10e5/pkl)**capa
1212 ELSE
1213 pkl = p1d(i,j)
1214 tbtk = t1d(i,j)
1215 qbtk = max(0.0, q1d(i,j))
1216 apebtk = (h10e5/pkl)**capa
1217 ENDIF
1218
1219!----------Breogan Gomez - 2009-02-06
1220! To prevent QBTK to be less than 0 which leads to a unrealistic value of PRESK
1221! and a floating invalid.
1222
1223! if(QBTK < 0) QBTK = 0
1224
1225!--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX--------------
1226 tthbtk = tbtk*apebtk
1227 tthk = (tthbtk-thl)*rdth
1228 qq(i,j) = tthk - aint(tthk)
1229 ittbk = int(tthk) + 1
1230!--------------KEEPING INDICES WITHIN THE TABLE-------------------------
1231 IF(ittbk < 1) THEN
1232 ittbk = 1
1233 qq(i,j) = d00
1234 ENDIF
1235 IF(ittbk >= jtb) THEN
1236 ittbk = jtb-1
1237 qq(i,j) = d00
1238 ENDIF
1239!--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
1240 bqs00k = qs0(ittbk)
1241 sqs00k = sqs(ittbk)
1242 bqs10k = qs0(ittbk+1)
1243 sqs10k = sqs(ittbk+1)
1244!--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
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)
1249 iq = int(tqk)+1
1250!--------------KEEPING INDICES WITHIN THE TABLE-------------------------
1251 IF(iq < 1) THEN
1252 iq = 1
1253 pp(i,j) = d00
1254 ENDIF
1255 IF(iq >= itb) THEN
1256 iq = itb-1
1257 pp(i,j) = d00
1258 ENDIF
1259!--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
1260 p00k = ptbl(iq ,ittbk )
1261 p10k = ptbl(iq+1,ittbk )
1262 p01k = ptbl(iq ,ittbk+1)
1263 p11k = ptbl(iq+1,ittbk+1)
1264!--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
1265 tpspk = p00k + (p10k-p00k)*pp(i,j) + (p01k-p00k)*qq(i,j) &
1266 + (p00k-p10k-p01k+p11k)*pp(i,j)*qq(i,j)
1267
1268!!from WPP::tgs APESPK=(H10E5/TPSPK)**CAPA
1269 if (tpspk > 1.0e-3) then
1270 apespk = (max(0.,h10e5/ tpspk))**capa
1271 else
1272 apespk = 0.0
1273 endif
1274
1275 tthesk = tthbtk * exp(elocp*qbtk*apespk/tthbtk)
1276!--------------CHECK FOR MAXIMUM THETA E--------------------------------
1277 IF(tthesk > thesp(i,j)) THEN
1278 psp(i,j) = tpspk
1279 thesp(i,j) = tthesk
1280 parcel(i,j) = kb
1281 ENDIF
1282!--------------CHECK FOR MINIMUM THETA E--------------------------------
1283 IF(tthesk < thesp2(i,j)) THEN
1284 psp2(i,j) = tpspk
1285 thesp2(i,j) = tthesk
1286 parcel2(i,j) = kb
1287 ENDIF
1288 END IF
1289 ENDDO ! I loop
1290 ENDDO ! J loop
1291 END IF
1292 ENDDO ! KB loop
1293
1294!----FIND THE PRESSURE OF THE PARCEL THAT WAS LIFTED
1295!$omp parallel do private(i,j)
1296 DO j=jsta,jend
1297 DO i=ista,iend
1298 pparc(i,j) = pmid(i,j,parcel(i,j))
1299 ENDDO
1300 ENDDO
1301!
1302!-----CHOOSE LAYER DIRECTLY BELOW PSP AS LCL AND------------------------
1303!-----ENSURE THAT THE LCL IS ABOVE GROUND.------------------------------
1304!-------(IN SOME RARE CASES FOR ITYPE=2, IT IS NOT)---------------------
1305 DO l=1,lm
1306!$omp parallel do private(i,j)
1307 DO j=jsta,jend
1308 DO i=ista,iend
1309 IF (pmid(i,j,l) < psp(i,j)) lcl(i,j) = l+1
1310 ENDDO
1311 ENDDO
1312 ENDDO
1313!$omp parallel do private(i,j)
1314 DO j=jsta,jend
1315 DO i=ista,iend
1316 IF (lcl(i,j) > nint(lmh(i,j))) lcl(i,j) = nint(lmh(i,j))
1317 IF (itype > 2) THEN
1318 IF (t(i,j,lcl(i,j)) < 263.15) THEN
1319 thunder(i,j) = .false.
1320 ENDIF
1321 ENDIF
1322 ENDDO
1323 ENDDO
1324!-----------------------------------------------------------------------
1325!---------FIND TEMP OF PARCEL LIFTED ALONG MOIST ADIABAT (TPAR)---------
1326!-----------------------------------------------------------------------
1327 DO l=lm,1,-1
1328!--------------SCALING PRESSURE & TT TABLE INDEX------------------------
1329 knuml = 0
1330 knumh = 0
1331 DO j=jsta,jend
1332 DO i=ista,iend
1333 klres(i,j) = 0
1334 khres(i,j) = 0
1335 IF(l <= lcl(i,j)) THEN
1336 IF(pmid(i,j,l) < plq)THEN
1337 knuml = knuml + 1
1338 klres(i,j) = 1
1339 ELSE
1340 knumh = knumh + 1
1341 khres(i,j) = 1
1342 ENDIF
1343 ENDIF
1344 ENDDO
1345 ENDDO
1346!***
1347!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE<PLQ
1348!**
1349 IF(knuml > 0) 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)
1353 ENDIF
1354!***
1355!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE>PLQ
1356!**
1357 IF(knumh > 0) THEN
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)
1361 ENDIF
1362
1363!------------SEARCH FOR EQ LEVEL----------------------------------------
1364!$omp parallel do private(i,j)
1365 DO j=jsta,jend
1366 DO i=ista,iend
1367 IF(khres(i,j) > 0) THEN
1368 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
1369 ENDIF
1370 ENDDO
1371 ENDDO
1372!
1373!$omp parallel do private(i,j)
1374 DO j=jsta,jend
1375 DO i=ista,iend
1376 IF(klres(i,j) > 0) THEN
1377 IF(tpar(i,j,l) > t(i,j,l)) ieql(i,j) = l
1378 ENDIF
1379 ENDDO
1380 ENDDO
1381!-----------------------------------------------------------------------
1382 ENDDO ! end of do l=lm,1,-1 loop
1383!------------COMPUTE CAPE AND CINS--------------------------------------
1384 lbeg = 1000
1385 lend = 0
1386 DO j=jsta,jend
1387 DO i=ista,iend
1388 lbeg = min(ieql(i,j),lbeg)
1389 lend = max(lcl(i,j),lend)
1390 ENDDO
1391 ENDDO
1392!
1393!$omp parallel do private(i,j)
1394 DO j=jsta,jend
1395 DO i=ista,iend
1396 IF(t(i,j,ieql(i,j)) > 255.65) THEN
1397 thunder(i,j) = .false.
1398 ENDIF
1399 ENDDO
1400 ENDDO
1401!
1402!reverse L order from bottom up for ESRH calculation
1403!
1404 esrhh = lcl
1405 esrhl = lcl
1406! DO L=LBEG,LEND
1407 DO l=lend,lbeg,-1
1408
1409!$omp parallel do private(i,j)
1410 DO j=jsta,jend
1411 DO i=ista,iend
1412 idx(i,j) = 0
1413 IF(l >= ieql(i,j).AND.l <= lcl(i,j)) THEN
1414 idx(i,j) = 1
1415 ENDIF
1416 ENDDO
1417 ENDDO
1418!
1419!$omp parallel do private(i,j,gdzkl,presk,thetaa,thetap,esatp,qsatp,tvp,tv,&
1420!$omp & presk2,esatp2,qsatp2,tvp2,thetap2,tv2,thetaa2)
1421 DO j=jsta,jend
1422 DO i=ista,iend
1423 IF(idx(i,j) > 0) THEN
1424 presk = pmid(i,j,l)
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)
1428! TVP = TPAR(I,J,L)*(1+0.608*QSATP)
1429 tvp = tvirtual(tpar(i,j,l),qsatp)
1430 thetap = tvp*(h10e5/presk)**capa
1431! TV = T(I,J,L)*(1+0.608*Q(I,J,L))
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
1438 ENDIF
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
1443 ENDIF
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
1447 ENDIF
1448 ENDIF
1449
1450! LFC
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)
1455! TVP2 = TPAR(I,J,L+1)*(1+0.608*QSATP2)
1456 tvp2 = tvirtual(tpar(i,j,l+1),qsatp2)
1457 thetap2 = tvp2*(h10e5/presk2)**capa
1458! TV2 = T(I,J,L+1)*(1+0.608*Q(I,J,L+1))
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)
1464 ENDIF
1465 ENDIF
1466 ENDIF
1467!
1468! ESRH/CAPE threshold check
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
1472 ENDIF
1473 esrhh(i,j)=l
1474 ENDIF
1475
1476 ENDIF !(IDX(I,J) > 0)
1477 ENDDO
1478 ENDDO
1479 ENDDO
1480
1481!$omp parallel do private(i,j)
1482 DO j=jsta,jend
1483 DO i=ista,iend
1484 IF(esrhh(i,j) > esrhl(i,j)) esrhh(i,j)=ieql(i,j)
1485 ENDDO
1486 ENDDO
1487!
1488! ENFORCE LOWER LIMIT OF 0.0 ON CAPE AND UPPER
1489! LIMIT OF 0.0 ON CINS.
1490! ENFORCE LFC ABOVE LCL AND BELOW EL
1491!
1492!$omp parallel do private(i,j)
1493 DO j=jsta,jend
1494 DO i=ista,iend
1495 cape(i,j) = max(d00,cape(i,j))
1496 cins(i,j) = min(cins(i,j),d00)
1497! equillibrium height
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.
1503 ENDIF
1504 IF (thunder(i,j)) THEN
1505 thund(i,j) = 1.0
1506 ELSE
1507 thund(i,j) = 0.0
1508 ENDIF
1509 ENDDO
1510 ENDDO
1511!------------COMPUTE DCAPE--------------------------------------
1512!-----------------------------------------------------------------------
1513!---------FIND TEMP OF PARCEL DESCENDED ALONG MOIST ADIABAT (TPAR)---------
1514!-----------------------------------------------------------------------
1515 IF (itype == 1) THEN
1516
1517 DO l=lm,1,-1
1518!--------------SCALING PRESSURE & TT TABLE INDEX------------------------
1519 knuml = 0
1520 knumh = 0
1521 DO j=jsta,jend
1522 DO i=ista,iend
1523 klres(i,j) = 0
1524 khres(i,j) = 0
1525 psfck = pmid(i,j,nint(lmh(i,j)))
1526 pkl = pmid(i,j,l)
1527 IF(pkl >= psfck-dpbnd) THEN
1528 IF(pmid(i,j,l) < plq)THEN
1529 knuml = knuml + 1
1530 klres(i,j) = 1
1531 ELSE
1532 knumh = knumh + 1
1533 khres(i,j) = 1
1534 ENDIF
1535 ENDIF
1536 ENDDO
1537 ENDDO
1538!***
1539!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE<PLQ
1540!**
1541 IF(knuml > 0) 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)
1545 ENDIF
1546!***
1547!*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE>PLQ
1548!**
1549 IF(knumh > 0) THEN
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)
1553 ENDIF
1554 ENDDO ! end of do l=lm,1,-1 loop
1555
1556 lbeg = 1
1557 lend = lm
1558
1559 DO l=lbeg,lend
1560!$omp parallel do private(i,j)
1561 DO j=jsta,jend
1562 DO i=ista,iend
1563 idx(i,j) = 0
1564 IF(l >= parcel2(i,j).AND.l < nint(lmh(i,j))) THEN
1565 idx(i,j) = 1
1566 ENDIF
1567 ENDDO
1568 ENDDO
1569!
1570!$omp parallel do private(i,j,gdzkl,presk,thetaa,thetap,esatp,qsatp,tvp,tv)
1571 DO j=jsta,jend
1572 DO i=ista,iend
1573 IF(idx(i,j) > 0) THEN
1574 presk = pmid(i,j,l)
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)
1578! TVP = TPAR2(I,J,L)*(1+0.608*QSATP)
1579 tvp = tvirtual(tpar2(i,j,l),qsatp)
1580 thetap = tvp*(h10e5/presk)**capa
1581! TV = T(I,J,L)*(1+0.608*Q(I,J,L))
1582 tv = tvirtual(t(i,j,l),q(i,j,l))
1583 thetaa = tv*(h10e5/presk)**capa
1584 !IF(THETAP < THETAA) THEN
1585 dcape(i,j) = dcape(i,j) + (log(thetap)-log(thetaa))*gdzkl
1586 !ENDIF
1587 ENDIF
1588 ENDDO
1589 ENDDO
1590 ENDDO
1591
1592!$omp parallel do private(i,j)
1593 DO j=jsta,jend
1594 DO i=ista,iend
1595 dcape(i,j) = min(d00,dcape(i,j))
1596 ENDDO
1597 ENDDO
1598
1599 ENDIF !ITYPE=1 FOR DCAPE
1600
1601!
1602! Dendritic Growth Layer depth
1603! the layer with temperatures from -12 to -17 C in meters
1604!
1605 l12=lm
1606 l17=lm
1607 DO l=lm,1,-1
1608!$omp parallel do private(i,j)
1609 DO j=jsta,jend
1610 DO i=ista,iend
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
1613 ENDDO
1614 ENDDO
1615 ENDDO
1616!$omp parallel do private(i,j)
1617 DO j=jsta,jend
1618 DO i=ista,iend
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.)
1622 ENDIF
1623 ENDDO
1624 ENDDO
1625!
1626! Enhanced Stretching Potential
1627! ESP = (0-3 km MLCAPE / 50 J kg-1) * ((0-3 km lapse rate - 7.0) / 1.0 C (km-1)
1628! https://www.spc.noaa.gov/exper/soundings/help/params4.html
1629!
1630 l3km=lm
1631 DO l=lm,1,-1
1632!$omp parallel do private(i,j)
1633 DO j=jsta,jend
1634 DO i=ista,iend
1635 IF(zint(i,j,l)-htsfc(i,j) <= 3000.) l3km(i,j)=l
1636 ENDDO
1637 ENDDO
1638 ENDDO
1639!$omp parallel do private(i,j)
1640 DO j=jsta,jend
1641 DO i=ista,iend
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.
1644! IF(CAPE(I,J) < 250.) ESP(I,J) = 0.
1645 ENDDO
1646 ENDDO
1647!
1648 DEALLOCATE(tpar)
1649 DEALLOCATE(tpar2)
1650!
1651 END SUBROUTINE calcape2
1652!
1653!-------------------------------------------------------------------------------------
1654!
1655!
1656!-------------------------------------------------------------------------------------
1657!
1658 elemental function tvirtual(T,Q)
1659!
1660! COMPUTE VIRTUAL TEMPERATURE
1661!
1662 IMPLICIT NONE
1663 REAL tvirtual
1664 REAL, INTENT(IN) :: t, q
1665
1666 tvirtual = t*(1+0.608*q)
1667
1668 end function tvirtual
1669!
1670!-------------------------------------------------------------------------------------
1671!
1697 SUBROUTINE calvor(UWND,VWND,ABSV)
1698
1699!
1700!
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
1709
1710 implicit none
1711!
1712! DECLARE VARIABLES.
1713!
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
1718!
1719 real, allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
1720 INTEGER, allocatable :: ihe(:),ihw(:), ie(:),iw(:)
1721!
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)
1725!
1726!***************************************************************************
1727! START CALVOR HERE.
1728!
1729! LOOP TO COMPUTE ABSOLUTE VORTICITY FROM WINDS.
1730!
1731 IF(modelname == 'RAPR') then
1732!$omp parallel do private(i,j)
1733 DO j=jsta_2l,jend_2u
1734 DO i=ista_2l,iend_2u
1735 absv(i,j) = d00
1736 ENDDO
1737 ENDDO
1738 else
1739!$omp parallel do private(i,j)
1740 DO j=jsta_2l,jend_2u
1741 DO i=ista_2l,iend_2u
1742 absv(i,j) = spval
1743 ENDDO
1744 ENDDO
1745 endif
1746
1747! print*,'dyval in CALVOR= ',DYVAL
1748
1749 CALL exch(uwnd)
1750 CALL exch(vwnd)
1751!
1752 IF (modelname == 'GFS' .or. global) THEN
1753 CALL exch(gdlat(ista_2l,jsta_2l))
1754 CALL exch(gdlon(ista_2l,jsta_2l))
1755
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))
1759
1760 imb2 = im/2
1761!$omp parallel do private(i)
1762 do i=ista,iend
1763 ie(i) = i+1
1764 iw(i) = i-1
1765 enddo
1766! iw(1) = im
1767! ie(im) = 1
1768
1769! if(1>=jsta .and. 1<=jend)then
1770! if(cos(gdlat(1,1)*dtr)<small)poleflag=.T.
1771! end if
1772! call mpi_bcast(poleflag,1,MPI_LOGICAL,0,mpi_comm_comp,iret)
1773
1774!$omp parallel do private(i,j,ip1,im1)
1775 DO j=jsta,jend
1776 do i=ista,iend
1777 ip1 = ie(i)
1778 im1 = iw(i)
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))
1782 else
1783 wrk1(i,j) = 0.
1784 end if
1785 if(i == im .or. i == 1) then
1786 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
1787 else
1788 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
1789 end if
1790 enddo
1791 enddo
1792! CALL EXCH(cosl(1,JSTA_2L))
1793 CALL exch(cosl)
1794
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)
1797
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)
1800
1801!$omp parallel do private(i,j,ii)
1802 DO j=jsta,jend
1803 if (j == 1) then
1804 if(gdlat(ista,j) > 0.) then ! count from north to south
1805 do i=ista,iend
1806 ii = i + imb2
1807 if (ii > im) ii = ii - im
1808 ! wrk3(i,j) = 1.0 / ((180.-GDLAT(i,J+1)-GDLAT(II,J))*DTR) !1/dphi
1809 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-glatpoles(ii,1))*dtr) !1/dphi
1810 enddo
1811 else ! count from south to north
1812 do i=ista,iend
1813 ii = i + imb2
1814 if (ii > im) ii = ii - im
1815 ! wrk3(i,j) = 1.0 / ((180.+GDLAT(i,J+1)+GDLAT(II,J))*DTR) !1/dphi
1816 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+glatpoles(ii,1))*dtr) !1/dphi
1817!
1818 enddo
1819 end if
1820 elseif (j == jm) then
1821 if(gdlat(ista,j) < 0.) then ! count from north to south
1822 do i=ista,iend
1823 ii = i + imb2
1824 if (ii > im) ii = ii - im
1825 ! wrk3(i,j) = 1.0 / ((180.+GDLAT(i,J-1)+GDLAT(II,J))*DTR)
1826 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+glatpoles(ii,2))*dtr)
1827 enddo
1828 else ! count from south to north
1829 do i=ista,iend
1830 ii = i + imb2
1831 if (ii > im) ii = ii - im
1832 ! wrk3(i,j) = 1.0 / ((180.-GDLAT(i,J-1)-GDLAT(II,J))*DTR)
1833 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-glatpoles(ii,2))*dtr)
1834 enddo
1835 end if
1836 else
1837 do i=ista,iend
1838 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr) !1/dphi
1839 enddo
1840 endif
1841 enddo
1842
1843 npass = 0
1844
1845 jtem = jm / 18 + 1
1846
1847 call fullpole(uwnd(ista_2l:iend_2u,jsta_2l:jend_2u),upoles)
1848
1849!$omp parallel do private(i,j,ip1,im1,ii,jj,tx1,tx2)
1850 DO j=jsta,jend
1851! npass = npass2
1852! if (j > jm-jtem+1 .or. j < jtem) npass = npass3
1853 IF(j == 1) then ! Near North or South pole
1854 if(gdlat(ista,j) > 0.) then ! count from north to south
1855 IF(cosl(ista,j) >= small) THEN !not a pole point
1856 DO i=ista,iend
1857 ip1 = ie(i)
1858 im1 = iw(i)
1859 ii = i + imb2
1860 if (ii > im) ii = ii - im
1861 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1862! UWND(II,J)==SPVAL .or. UWND(I,J+1)==SPVAL) cycle
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) &
1865! & + (UWND(II,J)*COSL(II,J) &
1866 & + (upoles(ii,1)*coslpoles(ii,1) &
1867 & + uwnd(i,j+1)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j) &
1868 & + f(i,j)
1869 enddo
1870 ELSE !pole point, compute at j=2
1871 jj = 2
1872 DO i=ista,iend
1873 ip1 = ie(i)
1874 im1 = iw(i)
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) &
1880 & + f(i,jj)
1881 enddo
1882 ENDIF
1883 else
1884 IF(cosl(ista,j) >= small) THEN !not a pole point
1885 DO i=ista,iend
1886 ip1 = ie(i)
1887 im1 = iw(i)
1888 ii = i + imb2
1889 if (ii > im) ii = ii - im
1890 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1891! UWND(II,J)==SPVAL .or. UWND(I,J+1)==SPVAL) cycle
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) &
1894! & - (UWND(II,J)*COSL(II,J) &
1895 & - (upoles(ii,1)*coslpoles(ii,1) &
1896 & + uwnd(i,j+1)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j) &
1897 & + f(i,j)
1898 enddo
1899 ELSE !pole point, compute at j=2
1900 jj = 2
1901 DO i=ista,iend
1902 ip1 = ie(i)
1903 im1 = iw(i)
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) &
1909 & + f(i,jj)
1910 enddo
1911 ENDIF
1912 endif
1913 ELSE IF(j == jm) THEN ! Near North or South Pole
1914 if(gdlat(ista,j) < 0.) then ! count from north to south
1915 IF(cosl(ista,j) >= small) THEN !not a pole point
1916 DO i=ista,iend
1917 ip1 = ie(i)
1918 im1 = iw(i)
1919 ii = i + imb2
1920 if (ii > im) ii = ii - im
1921 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1922! UWND(I,J-1)==SPVAL .or. UWND(II,J)==SPVAL) cycle
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) &
1926! & + UWND(II,J)*COSL(II,J))*wrk3(i,j)) * wrk1(i,j) &
1927 & + upoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j) &
1928 & + f(i,j)
1929 enddo
1930 ELSE !pole point,compute at jm-1
1931 jj = jm-1
1932 DO i=ista,iend
1933 ip1 = ie(i)
1934 im1 = iw(i)
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) &
1940 & + f(i,jj)
1941 enddo
1942 ENDIF
1943 else
1944 IF(cosl(ista,j) >= small) THEN !not a pole point
1945 DO i=ista,iend
1946 ip1 = ie(i)
1947 im1 = iw(i)
1948 ii = i + imb2
1949 if (ii > im) ii = ii - im
1950 if(vwnd(ip1,j)==spval .or. vwnd(im1,j)==spval .or. &
1951! UWND(I,J-1)==SPVAL .or. UWND(II,J)==SPVAL) cycle
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) &
1955! & + UWND(II,J)*COSL(II,J))*wrk3(i,j)) * wrk1(i,j) &
1956 & + upoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j) &
1957 & + f(i,j)
1958 enddo
1959 ELSE !pole point,compute at jm-1
1960 jj = jm-1
1961 DO i=ista,iend
1962 ip1 = ie(i)
1963 im1 = iw(i)
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) &
1969 & + f(i,jj)
1970 enddo
1971 ENDIF
1972 endif
1973 ELSE
1974 DO i=ista,iend
1975 ip1 = ie(i)
1976 im1 = iw(i)
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) &
1982 + f(i,j)
1983 ENDDO
1984 END IF
1985! if(ABSV(I,J)>1.0)print*,'Debug CALVOR',i,j,VWND(ip1,J),VWND(im1,J), &
1986! wrk2(i,j),UWND(I,J-1),COSL(I,J-1),UWND(I,J+1),COSL(I,J+1),wrk3(i,j),cosl(i,j),F(I,J),ABSV(I,J)
1987 if (npass > 0) then
1988 do i=ista,iend
1989 tx1(i) = absv(i,j)
1990 enddo
1991 do nn=1,npass
1992 do i=ista,iend
1993 tx2(i+1) = tx1(i)
1994 enddo
1995 tx2(1) = tx2(im+1)
1996 tx2(im+2) = tx2(2)
1997 do i=2,im+1
1998 tx1(i-1) = 0.25 * (tx2(i-1) + tx2(i+1)) + 0.5*tx2(i)
1999 enddo
2000 enddo
2001 do i=ista,iend
2002 absv(i,j) = tx1(i)
2003 enddo
2004 endif
2005 END DO ! end of J loop
2006
2007! deallocate (wrk1, wrk2, wrk3, cosl)
2008! GFS use lon avg as one scaler value for pole point
2009
2010 ! call poleavg(IM,JM,JSTA,JEND,SMALL,COSL(1,jsta),SPVAL,ABSV(1,jsta))
2011
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)
2014
2015 cosltemp=spval
2016 if(jsta== 1) cosltemp(1:im, 1)=coslpoles(1:im,1)
2017 if(jend==jm) cosltemp(1:im,jm)=coslpoles(1:im,2)
2018 avtemp=spval
2019 if(jsta== 1) avtemp(1:im, 1)=avpoles(1:im,1)
2020 if(jend==jm) avtemp(1:im,jm)=avpoles(1:im,2)
2021
2022 call poleavg(im,jm,jsta,jend,small,cosltemp(1,jsta),spval,avtemp(1,jsta))
2023
2024 if(jsta== 1) absv(ista:iend, 1)=avtemp(ista:iend, 1)
2025 if(jend==jm) absv(ista:iend,jm)=avtemp(ista:iend,jm)
2026
2027 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
2028
2029 ELSE !(MODELNAME == 'GFS' .or. global)
2030
2031 IF (gridtype == 'B')THEN
2032 CALL exch(vwnd)
2033 CALL exch(uwnd)
2034 ENDIF
2035
2036 CALL dvdxdudy(uwnd,vwnd)
2037
2038 IF(gridtype == 'A')THEN
2039!$omp parallel do private(i,j,jmt2,tphi,r2dx,r2dy,dvdx,dudy,uavg)
2040 DO j=jsta_m,jend_m
2041 jmt2 = jm/2+1
2042 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2043 DO i=ista_m,iend_m
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
2046 dvdx = ddvdx(i,j)
2047 dudy = ddudy(i,j)
2048 uavg = uuavg(i,j)
2049! is there a (f+tan(phi)/erad)*u term?
2050 IF(modelname == 'RAPR') then
2051 absv(i,j) = dvdx - dudy + f(i,j) ! for run RAP over north pole
2052 else
2053 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(gdlat(i,j)*dtr)/erad ! not sure about this???
2054 endif
2055 END IF
2056 END DO
2057 END DO
2058
2059 ELSE IF (gridtype == 'E')THEN
2060 allocate(ihw(jsta_2l:jend_2u), ihe(jsta_2l:jend_2u))
2061!$omp parallel do private(j)
2062 DO j=jsta_2l,jend_2u
2063 ihw(j) = -mod(j,2)
2064 ihe(j) = ihw(j)+1
2065 ENDDO
2066!$omp parallel do private(i,j,jmt2,tphi,r2dx,r2dy,dvdx,dudy,uavg)
2067 DO j=jsta_m,jend_m
2068 jmt2 = jm/2+1
2069 tphi = (j-jmt2)*(dyval/1000.)*dtr
2070 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2071 DO i=ista_m,iend_m
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
2074 dvdx = ddvdx(i,j)
2075 dudy = ddudy(i,j)
2076 uavg = uuavg(i,j)
2077! is there a (f+tan(phi)/erad)*u term?
2078 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(tphi)/erad
2079 END IF
2080 END DO
2081 END DO
2082 deallocate(ihw, ihe)
2083 ELSE IF (gridtype == 'B')THEN
2084! CALL EXCH(VWND) !done before dvdxdudy() Jesse 20200520
2085 DO j=jsta_m,jend_m
2086 jmt2 = jm/2+1
2087 tphi = (j-jmt2)*(dyval/gdsdegr)*dtr
2088 DO i=ista_m,iend_m
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
2093 dvdx = ddvdx(i,j)
2094 dudy = ddudy(i,j)
2095 uavg = uuavg(i,j)
2096! is there a (f+tan(phi)/erad)*u term?
2097 absv(i,j) = dvdx - dudy + f(i,j) + uavg*tan(tphi)/erad
2098 END DO
2099 END DO
2100 END IF
2101 END IF
2102!
2103! END OF ROUTINE.
2104!
2105 RETURN
2106 END
2107
2124 SUBROUTINE caldiv(UWND,VWND,DIV)
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
2131
2132 implicit none
2133!
2134! DECLARE VARIABLES.
2135!
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
2140!
2141 real, allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
2142 INTEGER, allocatable :: ihe(:),ihw(:), ie(:),iw(:)
2143!
2144 real :: dnpole, dspole, tem
2145 integer i,j,ip1,im1,ii,iir,iil,jj,imb2, l
2146!
2147!***************************************************************************
2148! START CALDIV HERE.
2149!
2150! LOOP TO COMPUTE DIVERGENCE FROM WINDS.
2151!
2152 CALL exch(gdlat(ista_2l,jsta_2l))
2153 CALL exch(gdlon(ista_2l,jsta_2l))
2154
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))
2158
2159 imb2 = im/2
2160!$omp parallel do private(i)
2161 do i=ista,iend
2162 ie(i) = i+1
2163 iw(i) = i-1
2164 enddo
2165! iw(1) = im
2166! ie(im) = 1
2167
2168
2169!$omp parallel do private(i,j,ip1,im1)
2170 DO j=jsta,jend
2171 do i=ista,iend
2172 ip1 = ie(i)
2173 im1 = iw(i)
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))
2177 else
2178 wrk1(i,j) = 0.
2179 end if
2180 if(i == im .or. i == 1) then
2181 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
2182 else
2183 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
2184 end if
2185 enddo
2186 ENDDO
2187
2188 CALL exch(cosl)
2189 CALL fullpole(cosl,coslpoles)
2190 CALL fullpole(gdlat(ista_2l:iend_2u,jsta_2l:jend_2u),glatpoles)
2191
2192!$omp parallel do private(i,j,ii)
2193 DO j=jsta,jend
2194 if (j == 1) then
2195 if(gdlat(ista,j) > 0.) then ! count from north to south
2196 do i=ista,iend
2197 ii = i + imb2
2198 if (ii > im) ii = ii - im
2199 ! wrk3(i,j) = 1.0 / ((180.-GDLAT(i,J+1)-GDLAT(II,J))*DTR) !1/dphi
2200 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-glatpoles(ii,1))*dtr) !1/dphi
2201 enddo
2202 else ! count from south to north
2203 do i=ista,iend
2204 ii = i + imb2
2205 if (ii > im) ii = ii - im
2206 ! wrk3(i,j) = 1.0 / ((180.+GDLAT(i,J+1)+GDLAT(II,J))*DTR) !1/dphi
2207 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+glatpoles(ii,1))*dtr) !1/dphi
2208 enddo
2209 end if
2210 elseif (j == jm) then
2211 if(gdlat(ista,j) < 0.) then ! count from north to south
2212 do i=ista,iend
2213 ii = i + imb2
2214 if (ii > im) ii = ii - im
2215 ! wrk3(i,j) = 1.0 / ((180.+GDLAT(i,J-1)+GDLAT(II,J))*DTR)
2216 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+glatpoles(ii,2))*dtr)
2217 enddo
2218 else ! count from south to north
2219 do i=ista,iend
2220 ii = i + imb2
2221 if (ii > im) ii = ii - im
2222 ! wrk3(i,j) = 1.0 / ((180.-GDLAT(i,J-1)-GDLAT(II,J))*DTR)
2223 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-glatpoles(ii,2))*dtr)
2224 enddo
2225 end if
2226 else
2227 do i=ista,iend
2228 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr) !1/dphi
2229 enddo
2230 endif
2231 enddo
2232
2233 do l=1,lm
2234!$omp parallel do private(i,j)
2235 DO j=jsta,jend
2236 DO i=ista,iend
2237 div(i,j,l) = spval
2238 ENDDO
2239 ENDDO
2240
2241 CALL exch(vwnd(ista_2l,jsta_2l,l))
2242 CALL exch(uwnd(ista_2l,jsta_2l,l))
2243
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)
2246
2247!$omp parallel do private(i,j,ip1,im1,ii,jj)
2248 DO j=jsta,jend
2249 IF(j == 1) then ! Near North pole
2250 if(gdlat(ista,j) > 0.) then ! count from north to south
2251 IF(cosl(ista,j) >= small) THEN !not a pole point
2252 DO i=ista,iend
2253 ip1 = ie(i)
2254 im1 = iw(i)
2255 ii = i + imb2
2256 if (ii > im) ii = ii - im
2257 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2258 !& ! - (VWND(II,J,l)*COSL(II,J) &
2259 & - (vpoles(ii,1)*coslpoles(ii,1) &
2260 & + vwnd(i,j+1,l)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j)
2261 enddo
2262!--
2263 ELSE !North pole point, compute at j=2
2264 jj = 2
2265 do i=ista,iend
2266 ip1 = ie(i)
2267 im1 = iw(i)
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)
2271 enddo
2272!--
2273 ENDIF
2274 else
2275 IF(cosl(ista,j) >= small) THEN !not a pole point
2276 DO i=ista,iend
2277 ip1 = ie(i)
2278 im1 = iw(i)
2279 ii = i + imb2
2280 if (ii > im) ii = ii - im
2281 div(i,j,l) = ((uwnd(ip1,j,l)-uwnd(im1,j,l))*wrk2(i,j) &
2282 !& ! + (VWND(II,J,l)*COSL(II,J) &
2283 & + (vpoles(ii,1)*coslpoles(ii,1) &
2284 & + vwnd(i,j+1,l)*cosl(i,j+1))*wrk3(i,j)) * wrk1(i,j)
2285 enddo
2286!--
2287 ELSE !North pole point, compute at j=2
2288 jj = 2
2289 do i=ista,iend
2290 ip1 = ie(i)
2291 im1 = iw(i)
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)
2295 enddo
2296 ENDIF
2297 endif
2298 ELSE IF(j == jm) THEN ! Near South pole
2299 if(gdlat(ista,j) < 0.) then ! count from north to south
2300 IF(cosl(ista,j) >= small) THEN !not a pole point
2301 DO i=ista,iend
2302 ip1 = ie(i)
2303 im1 = iw(i)
2304 ii = i + imb2
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) &
2308 !& ! + VWND(II,J,l)*COSL(II,J))*wrk3(i,j)) * wrk1(i,j)
2309 & + vpoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j)
2310 enddo
2311!--
2312 ELSE !South pole point,compute at jm-1
2313 jj = jm-1
2314 do i=ista,iend
2315 ip1 = ie(i)
2316 im1 = iw(i)
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)
2320
2321 enddo
2322 ENDIF
2323 else
2324 IF(cosl(ista,j) >= small) THEN !not a pole point
2325 DO i=ista,iend
2326 ip1 = ie(i)
2327 im1 = iw(i)
2328 ii = i + imb2
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) &
2332 !& ! + VWND(II,J,l)*COSL(II,J))*wrk3(i,j)) * wrk1(i,j)
2333 & + vpoles(ii,2)*coslpoles(ii,2))*wrk3(i,j)) * wrk1(i,j)
2334 enddo
2335!--
2336 ELSE !South pole point,compute at jm-1
2337 jj = jm-1
2338 do i=ista,iend
2339 ip1 = ie(i)
2340 im1 = iw(i)
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)
2344
2345 enddo
2346 ENDIF
2347 endif
2348 ELSE
2349 DO i=ista,iend
2350 ip1 = ie(i)
2351 im1 = iw(i)
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)
2355!sk06132016
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)
2359!--
2360 ENDDO
2361 ENDIF
2362 ENDDO ! end of J loop
2363
2364! GFS use lon avg as one scaler value for pole point
2365! call poleavg(IM,JM,JSTA,JEND,SMALL,COSL(1,jsta),SPVAL,DIV(1,jsta,l))
2366
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)
2369
2370 cosltemp=spval
2371 IF(jsta== 1) cosltemp(1:im, 1)=coslpoles(1:im,1)
2372 IF(jend==jm) cosltemp(1:im,jm)=coslpoles(1:im,2)
2373 divtemp=spval
2374 IF(jsta== 1) divtemp(1:im, 1)=divpoles(1:im,1)
2375 IF(jend==jm) divtemp(1:im,jm)=divpoles(1:im,2)
2376
2377 call poleavg(im,jm,jsta,jend,small,cosltemp(1:im,jsta:jend) &
2378 ,spval,divtemp(1:im,jsta:jend))
2379
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)
2382
2383!sk06142016e
2384 if(div(ista,jsta,l)>1.0)print*,'Debug in CALDIV',jsta,div(ista,jsta,l)
2385! print*,'Debug in CALDIV',' jsta= ',jsta,DIV(1,jsta,l)
2386
2387 enddo ! end of l looop
2388!--
2389 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
2390
2391
2392 END SUBROUTINE caldiv
2393
2394 SUBROUTINE calgradps(PS,PSX,PSY)
2395
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
2415
2416 use gridspec_mod, only: gridtype
2417
2418 implicit none
2419!
2420! DECLARE VARIABLES.
2421!
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
2424!
2425 real, allocatable :: wrk1(:,:), wrk2(:,:), wrk3(:,:), cosl(:,:)
2426 INTEGER, allocatable :: ihe(:),ihw(:), ie(:),iw(:)
2427!
2428 integer i,j,ip1,im1,ii,iir,iil,jj,imb2
2429!
2430!***************************************************************************
2431! START CALGRADPS HERE.
2432!
2433! LOOP TO COMPUTE ZONAL AND MERIDIONAL GRADIENTS OF PS OR LNPS
2434!
2435!sk06162016 DO J=JSTA_2L,JEND_2U
2436!$omp parallel do private(i,j)
2437 DO j=jsta,jend
2438 DO i=ista,iend
2439 psx(i,j) = spval
2440 psy(i,j) = spval
2441!sk PSX(I,J) = D00
2442!sk PSY(I,J) = D00
2443 ENDDO
2444 ENDDO
2445
2446 CALL exch(ps)
2447
2448! IF (MODELNAME == 'GFS' .or. global) THEN
2449 CALL exch(gdlat(ista_2l,jsta_2l))
2450 CALL exch(gdlon(ista_2l,jsta_2l))
2451
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))
2455
2456 imb2 = im/2
2457!$omp parallel do private(i)
2458 do i=ista,iend
2459 ie(i) = i+1
2460 iw(i) = i-1
2461 enddo
2462! iw(1) = im
2463! ie(im) = 1
2464
2465
2466!$omp parallel do private(i,j,ip1,im1)
2467 DO j=jsta,jend
2468 do i=ista,iend
2469 ip1 = ie(i)
2470 im1 = iw(i)
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))
2474 else
2475 wrk1(i,j) = 0.
2476 end if
2477 if(i == im .or. i == 1) then
2478 wrk2(i,j) = 1.0 / ((360.+gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
2479 else
2480 wrk2(i,j) = 1.0 / ((gdlon(ip1,j)-gdlon(im1,j))*dtr) !1/dlam
2481 end if
2482 enddo
2483 ENDDO
2484
2485 CALL exch(cosl)
2486
2487!$omp parallel do private(i,j,ii)
2488 DO j=jsta,jend
2489 if (j == 1) then
2490 if(gdlat(ista,j) > 0.) then ! count from north to south
2491 do i=ista,iend
2492 ii = i + imb2
2493 if (ii > im) ii = ii - im
2494 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j+1)-gdlat(ii,j))*dtr) !1/dphi
2495 enddo
2496 else ! count from south to north
2497 do i=ista,iend
2498 ii = i + imb2
2499 if (ii > im) ii = ii - im
2500 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j+1)+gdlat(ii,j))*dtr) !1/dphi
2501 enddo
2502 end if
2503 elseif (j == jm) then
2504 if(gdlat(ista,j) < 0.) then ! count from north to south
2505 do i=ista,iend
2506 ii = i + imb2
2507 if (ii > im) ii = ii - im
2508 wrk3(i,j) = 1.0 / ((180.+gdlat(i,j-1)+gdlat(ii,j))*dtr)
2509 enddo
2510 else ! count from south to north
2511 do i=ista,iend
2512 ii = i + imb2
2513 if (ii > im) ii = ii - im
2514 wrk3(i,j) = 1.0 / ((180.-gdlat(i,j-1)-gdlat(ii,j))*dtr)
2515 enddo
2516 end if
2517 else
2518 do i=ista,iend
2519 wrk3(i,j) = 1.0 / ((gdlat(i,j-1)-gdlat(i,j+1))*dtr) !1/dphi
2520 enddo
2521 endif
2522 ENDDO
2523
2524!$omp parallel do private(i,j,ip1,im1,ii,jj)
2525 DO j=jsta,jend
2526 IF(j == 1) then ! Near North pole
2527 if(gdlat(ista,j) > 0.) then ! count from north to south
2528 IF(cosl(ista,j) >= small) THEN !not a pole point
2529 DO i=ista,iend
2530 ip1 = ie(i)
2531 im1 = iw(i)
2532 ii = i + imb2
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
2536 enddo
2537 ELSE !North pole point, compute at j=2
2538 jj = 2
2539 DO i=ista,iend
2540 ip1 = ie(i)
2541 im1 = iw(i)
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
2544 enddo
2545 ENDIF
2546 else
2547 IF(cosl(ista,j) >= small) THEN !not a pole point
2548 DO i=ista,iend
2549 ip1 = ie(i)
2550 im1 = iw(i)
2551 ii = i + imb2
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
2555 enddo
2556 ELSE !North pole point, compute at j=2
2557 jj = 2
2558 DO i=ista,iend
2559 ip1 = ie(i)
2560 im1 = iw(i)
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
2563 enddo
2564 ENDIF
2565 endif
2566 ELSE IF(j == jm) THEN ! Near South pole
2567 if(gdlat(ista,j) < 0.) then ! count from north to south
2568 IF(cosl(ista,j) >= small) THEN !not a pole point
2569 DO i=ista,iend
2570 ip1 = ie(i)
2571 im1 = iw(i)
2572 ii = i + imb2
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
2576 enddo
2577 ELSE !South pole point,compute at jm-1
2578 jj = jm-1
2579 DO i=ista,iend
2580 ip1 = ie(i)
2581 im1 = iw(i)
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
2584 enddo
2585 ENDIF
2586 else
2587 IF(cosl(ista,j) >= small) THEN !not a pole point
2588 DO i=ista,iend
2589 ip1 = ie(i)
2590 im1 = iw(i)
2591 ii = i + imb2
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
2595 enddo
2596 ELSE !South pole point,compute at jm-1
2597 jj = jm-1
2598 DO i=ista,iend
2599 ip1 = ie(i)
2600 im1 = iw(i)
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
2603 enddo
2604 ENDIF
2605 endif
2606 ELSE
2607 DO i=ista,iend
2608 ip1 = ie(i)
2609 im1 = iw(i)
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
2612!sk06142016A
2613 if(psx(i,j)>100.0)print*,'Debug in CALGRADPS: PSX',i,j,ps(ip1,j),ps(im1,j), &
2614! print*,'Debug in CALGRADPS',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), &
2617! print*,'Debug in CALGRADPS',i,j,PS(i,J-1),PS(i,J+1), &
2618 & wrk3(i,j),erad,psy(i,j)
2619!--
2620 ENDDO
2621 END IF
2622!
2623 ENDDO ! end of J loop
2624
2625 deallocate (wrk1, wrk2, wrk3, cosl, iw, ie)
2626
2627! END IF
2628
2629 END SUBROUTINE calgradps
2630!
2631!-------------------------------------------------------------------------------------
2632!
2633 end module upp_physics
2634
dvdxdudy() computes dudy, dvdx, uwnd
Definition UPP_MATH.f:17
calcape() computes CAPE/CINS and other storm related variables.
Definition UPP_PHYSICS.f:27
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.
Definition UPP_PHYSICS.f:96
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.