UPP v11.0.0
Loading...
Searching...
No Matches
FRZLVL.f
Go to the documentation of this file.
1
41 SUBROUTINE frzlvl(ZFRZ,RHFRZ,PFRZL)
42
43!
44!
45 use vrbls3d, only: pint, t, zmid, q, pmid
46 use vrbls2d, only: fis, tshltr, pshltr, qshltr
47 use masks, only: lmh
48 use params_mod, only: gi, d00, capa, d0065, tfrz, pq0, a2, a3, a4
49 use ctlblk_mod, only: jsta, jend, spval, lm, modelname, im, ista, iend
50 use physcons_post, only: con_rd, con_rv, con_eps, con_epsm1
51 use upp_physics, only: fpvsnew
52
53 implicit none
54!
55! DECLARE VARIABLES.
56!
57 REAL,dimension(ista:iend,jsta:jend) :: RHFRZ, ZFRZ, PFRZL
58 integer I,J,LLMH,L
59 real HTSFC,PSFC,TSFC,QSFC,QSAT,RHSFC,DELZ,DELT,DELQ,DELALP, &
60 delzp,zl,dzabv,qfrz,alpl,alph,alpfrz,pfrz,qsfrz,rhz,zu, &
61 dzfr,es
62!
63!*********************************************************************
64! START FRZLVL.
65!
66!
67!
68! LOOP OVER HORIZONTAL GRID.
69!
70!!$omp parallel do &
71! & private(i,j,alpfrz,alph,alpl,delalp,delq,delt,delz, &
72! & delzp,dzabv,dzfr,htsfc,l,llmh,psfc,qfrz, &
73! & qsat,qsfc,qsfrz,rhsfc,rhz,tsfc, &
74! & zl,zu)
75
76 DO 20 j=jsta,jend
77 DO 20 i=ista,iend
78 htsfc = fis(i,j)*gi
79 llmh = nint(lmh(i,j))
80 rhfrz(i,j) = d00
81 zfrz(i,j) = htsfc
82 psfc = pint(i,j,llmh+1)
83 pfrzl(i,j) = psfc
84!
85! CHECK IF FREEZING LEVEL IS AT THE GROUND.
86!
87! IF(SM(I,J)/=SPVAL .AND. THZ0(I,J)/=SPVAL .AND. &
88! THS(I,J)/=SPVAL)THEN
89! TSFC = (SM(I,J)*THZ0(I,J)+(1.-SM(I,J))*THS(I,J)) &
90! *(PINT(I,J,NINT(LMH(I,J))+1)/P1000)**CAPA
91! Per AWC's request, use 2m T instead of skin T so that freezing level
92! would be above ground more often
93 IF(tshltr(i,j)/=spval .AND. pshltr(i,j)/=spval)THEN
94 tsfc=tshltr(i,j)*(pshltr(i,j)*1.e-5)**capa
95 ELSE
96! GFS analysis does not have flux file to retrieve TSFC from
97 tsfc=t(i,j,lm)+d0065*(zmid(i,j,lm)-htsfc-2.0)
98 END IF
99 IF (tsfc<=tfrz) THEN
100! ZFRZ(I,J) = HTSFC+(TSFC-TFRZ)/D0065
101 zfrz(i,j) = htsfc+2.0+(tsfc-tfrz)/d0065
102! IF(SM(I,J)/=SPVAL .AND. QZ0(I,J)/=SPVAL .AND. &
103! QS(I,J)/=SPVAL)THEN
104! QSFC = SM(I,J)*QZ0(I,J)+(1.-SM(I,J))*QS(I,J)
105! GFS does not output QS
106! ELSE IF(QSHLTR(I,J)/=SPVAL)THEN
107 IF(qshltr(i,j)/=spval)THEN
108 psfc=pshltr(i,j)
109 qsfc=qshltr(i,j)
110 ELSE
111 qsfc=q(i,j,lm)
112 psfc=pmid(i,j,lm)
113 END IF
114!
115 IF(modelname == 'GFS' .OR. modelname == 'RAPR')THEN
116 es=fpvsnew(tsfc)
117 es=min(es,psfc)
118 qsat=con_eps*es/(psfc+con_epsm1*es)
119 ELSE
120 qsat=pq0/psfc*exp(a2*(tsfc-a3)/(tsfc-a4))
121 END IF
122!
123 rhsfc = qsfc/qsat
124 rhsfc = amax1(0.01,rhsfc)
125 rhsfc = amin1(rhsfc,1.0)
126 rhfrz(i,j)= rhsfc
127 pfrzl(i,j)= psfc
128 cycle
129 ENDIF
130!
131! OTHERWISE, LOCATE THE FREEZING LEVEL ALOFT.
132!
133 DO 10 l = llmh,1,-1
134 IF (t(i,j,l)<=tfrz) THEN
135 IF (l<llmh) THEN
136 delz = zmid(i,j,l)-zmid(i,j,l+1)
137 zl = zmid(i,j,l+1)
138 delt = t(i,j,l)-t(i,j,l+1)
139 zfrz(i,j) = zl + (tfrz-t(i,j,l+1))/delt*delz
140!
141 dzabv = zfrz(i,j)-zl
142 delq = q(i,j,l)-q(i,j,l+1)
143 qfrz = q(i,j,l+1) + delq/delz*dzabv
144 qfrz = amax1(0.0,qfrz)
145!
146!
147 alpl = alog(pmid(i,j,l+1))
148 alph = alog(pmid(i,j,l))
149 alpfrz = alpl + (alph-alpl)/delz*dzabv
150 pfrz = exp(alpfrz)
151 pfrzl(i,j) = pfrz
152 IF(modelname == 'GFS' .OR.modelname == 'RAPR')THEN
153 es=fpvsnew(tfrz)
154 es=min(es,pfrz)
155 qsfrz=con_eps*es/(pfrz+con_epsm1*es)
156 ELSE
157 qsfrz=pq0/pfrz &
158 *exp(a2*(tfrz-a3)/(tfrz-a4))
159 END IF
160!
161 rhz = qfrz/qsfrz
162 rhz = amax1(0.01,rhz)
163 rhz = amin1(rhz,1.0)
164 rhfrz(i,j) = rhz
165!
166 ELSE
167 zu = zmid(i,j,l)
168 zl = htsfc+2.0
169 delz = zu-zl
170 IF(tshltr(i,j)/=spval .AND. pshltr(i,j)/=spval)THEN
171 tsfc=tshltr(i,j)*(pshltr(i,j)*1.e-5)**capa
172 ELSE
173! GFS analysis does not have flux file to retrieve TSFC from
174 tsfc=t(i,j,lm)+d0065*(zmid(i,j,lm)-htsfc-2.0)
175 END IF
176 delt = t(i,j,l)-tsfc
177 zfrz(i,j) = zl + (tfrz-tsfc)/delt*delz
178!
179 dzabv = zfrz(i,j)-zl
180! GFS does not output QS
181 IF(qshltr(i,j)/=spval)THEN
182 qsfc=qshltr(i,j)
183 ELSE
184 qsfc=q(i,j,lm)
185 END IF
186 delq = q(i,j,l)-qsfc
187 qfrz = qsfc + delq/delz*dzabv
188 qfrz = amax1(0.0,qfrz)
189!
190 alph = alog(pmid(i,j,l))
191 alpl = alog(psfc)
192 delalp = alph-alpl
193 alpfrz = alpl + delalp/delz*dzabv
194 pfrz = exp(alpfrz)
195!
196 pfrzl(i,j) = pfrz
197 IF(modelname == 'GFS'.OR.modelname == 'RAPR')THEN
198 es=fpvsnew(tfrz)
199 es=min(es,pfrz)
200 qsfrz=con_eps*es/(pfrz+con_epsm1*es)
201 ELSE
202 qsfrz=pq0/pfrz &
203 *exp(a2*(tfrz-a3)/(tfrz-a4))
204 END IF
205!
206 rhz = qfrz/qsfrz
207 rhz = amax1(0.01,rhz)
208 rhz = amin1(rhz,1.0)
209 rhfrz(i,j)= rhz
210 ENDIF
211!
212! BOUND FREEZING LEVEL RH. FREEZING LEVEL HEIGHT IS
213! MEASURED WITH RESPECT TO MEAN SEA LEVEL.
214!
215! RHFRZ(I,J) = AMAX1(0.01,RHFRZ(I,J))
216! RHFRZ(I,J) = AMIN1(RHFRZ(I,J),1.00)
217 zfrz(i,j) = amax1(0.0,zfrz(i,j))
218 EXIT
219 ENDIF
220 10 CONTINUE
22120 CONTINUE
222!
223! END OF ROUTINE.
224!
225 RETURN
226 END
calcape() computes CAPE/CINS and other storm related variables.
Definition UPP_PHYSICS.f:27
elemental real function, public fpvsnew(t)