25 use vrbls3d, only: pint, pmid, zmid
26 use vrbls3d, only: t, q, uh, vh, omga, cwm, qqw, qqi, qqr, qqs, qqg
28 use vrbls3d, only: icing_gfip, icing_gfis, catedr, mwt, gtg
29 use ctlblk_mod, only: grib, cfld, fld_info, datapd, im, jsta, jend, jm, &
30 lm, htfd, spval, nfd, me,&
31 jsta_2l, jend_2u, modelname,&
32 ista, iend, ista_2l, iend_2u
33 use rqstfld_mod, only: iget, lvls, iavblfld, lvlsxml
42 real,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u) :: grid1
43 real,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u) :: egrid1,egrid2,egrid3,egrid4
46 integer i,j,ii,jj,l,itype,ifd,itypefdlvl(nfd)
50 REAL,
allocatable :: htfdctl(:)
51 integer,
allocatable :: itypefdlvlctl(:)
52 real,
allocatable :: qin(:,:,:,:), qfd(:,:,:,:)
53 character,
allocatable :: qtype(:)
54 real,
allocatable :: var3d1(:,:,:), var3d2(:,:,:)
56 integer,
parameter :: nfdmax=50
57 integer :: ids(nfdmax)
77 IF(iget(479)>0 .or. iget(481)>0 .or. &
78 iget(476)>0 .or. iget(477)>0 .or. iget(478)>0 .or. &
79 iget(518)>0 .or. iget(519)>0 .or. iget(520)>0 .or. &
83 IF(iget(520)>0 .or. iget(521)>0 )
THEN
86 n = iavblfld(iget(iid))
87 nfdctl=
size(pset%param(n)%level)
88 if(
allocated(itypefdlvlctl))
deallocate(itypefdlvlctl)
89 allocate(itypefdlvlctl(nfdctl))
91 itypefdlvlctl(ifd)=lvls(ifd,iget(iid))
93 if(
allocated(htfdctl))
deallocate(htfdctl)
94 allocate(htfdctl(nfdctl))
95 htfdctl=pset%param(n)%level
97 htfdctl(i)=
p2h(htfdctl(i)/100.)
99 if(
allocated(var3d1))
deallocate(var3d1)
100 if(
allocated(var3d2))
deallocate(var3d2)
101 allocate(var3d1(ista_2l:iend_2u,jsta_2l:jend_2u,nfdctl))
102 allocate(var3d2(ista_2l:iend_2u,jsta_2l:jend_2u,nfdctl))
106 call
fdlvl_uv(itypefdlvlctl,nfdctl,htfdctl,var3d1,var3d2)
110 IF (lvls(ifd,iget(520)) > 0)
THEN
114 grid1(i,j)=var3d1(i,j,ifd)
117 if(grib==
'grib2')
then
119 fld_info(cfld)%ifld=iavblfld(iget(520))
120 fld_info(cfld)%lvl=lvlsxml(ifd,iget(520))
126 datapd(i,j,cfld) = grid1(ii,jj)
132 IF (lvls(ifd,iget(521)) > 0)
THEN
136 grid1(i,j)=var3d2(i,j,ifd)
139 if(grib==
'grib2')
then
141 fld_info(cfld)%ifld=iavblfld(iget(521))
142 fld_info(cfld)%lvl=lvlsxml(ifd,iget(521))
148 datapd(i,j,cfld) = grid1(ii,jj)
164 if(
allocated(qin))
deallocate(qin)
165 if(
allocated(qtype))
deallocate(qtype)
166 ALLOCATE(qin(ista:iend,jsta:jend,lm,nfdmax))
167 ALLOCATE(qtype(nfdmax))
171 IF(iget(479) > 0)
THEN
174 qin(ista:iend,jsta:jend,1:lm,nfds)=icing_gfip(ista:iend,jsta:jend,1:lm)
177 IF(iget(481) > 0)
THEN
180 qin(ista:iend,jsta:jend,1:lm,nfds)=icing_gfis(ista:iend,jsta:jend,1:lm)
183 IF(iget(476) > 0)
THEN
186 qin(ista:iend,jsta:jend,1:lm,nfds)=gtg(ista:iend,jsta:jend,1:lm)
189 IF(iget(477) > 0)
THEN
192 qin(ista:iend,jsta:jend,1:lm,nfds)=catedr(ista:iend,jsta:jend,1:lm)
195 IF(iget(478) > 0)
THEN
198 qin(ista:iend,jsta:jend,1:lm,nfds)=mwt(ista:iend,jsta:jend,1:lm)
201 IF(iget(519) > 0)
THEN
204 qin(ista:iend,jsta:jend,1:lm,nfds)=t(ista:iend,jsta:jend,1:lm)
210 n = iavblfld(iget(iid))
211 nfdctl=
size(pset%param(n)%level)
212 if(
allocated(itypefdlvlctl))
deallocate(itypefdlvlctl)
213 allocate(itypefdlvlctl(nfdctl))
215 itypefdlvlctl(ifd)=lvls(ifd,iget(iid))
217 if(
allocated(htfdctl))
deallocate(htfdctl)
218 allocate(htfdctl(nfdctl))
219 htfdctl=pset%param(n)%level
221 htfdctl(i)=
p2h(htfdctl(i)/100.)
224 if(
allocated(qfd))
deallocate(qfd)
225 ALLOCATE(qfd(ista:iend,jsta:jend,nfdctl,nfds))
228 call
fdlvl_mass(itypefdlvlctl,nfdctl,pset%param(n)%level,htfdctl,nfds,qin,qtype,qfd)
241 if(qfd(i,j,ifd,n) < spval)
then
242 qfd(i,j,ifd,n)=max(0.0,qfd(i,j,ifd,n))
243 qfd(i,j,ifd,n)=min(1.0,qfd(i,j,ifd,n))
263 if(qfd(i,j,ifd,n1) < 0.001) qfd(i,j,ifd,n)=0.
265 if(qfd(i,j,ifd,n) == spval) cycle
266 if (qfd(i,j,ifd,n) < 0.08)
then
268 elseif (qfd(i,j,ifd,n) <= 0.21)
then
270 else if(qfd(i,j,ifd,n) <= 0.37)
then
272 else if(qfd(i,j,ifd,n) <= 0.67)
then
283 if(iid==476 .or. iid==477 .or. iid==478)
then
287 if(qfd(i,j,ifd,n) < spval)
then
288 qfd(i,j,ifd,n)=max(0.0,qfd(i,j,ifd,n))
289 qfd(i,j,ifd,n)=min(1.0,qfd(i,j,ifd,n))
302 IF (lvls(ifd,iget(iid)) > 0)
THEN
306 grid1(i,j)=qfd(i,j,ifd,n)
309 if(grib==
'grib2')
then
311 fld_info(cfld)%ifld=iavblfld(iget(iid))
312 fld_info(cfld)%lvl=lvlsxml(ifd,iget(iid))
318 datapd(i,j,cfld) = grid1(ii,jj)
333 IF(iget(518) > 0)
THEN
335 n = iavblfld(iget(iid))
336 nfdctl=
size(pset%param(n)%level)
337 if(
allocated(htfdctl))
deallocate(htfdctl)
338 allocate(htfdctl(nfdctl))
339 htfdctl=pset%param(n)%level
341 htfdctl(i)=
p2h(htfdctl(i)/100.)
345 IF (lvls(ifd,iget(iid)) > 0)
THEN
349 grid1(i,j)=htfdctl(ifd)
352 if(grib==
'grib2')
then
354 fld_info(cfld)%ifld=iavblfld(iget(iid))
355 fld_info(cfld)%lvl=lvlsxml(ifd,iget(iid))
361 datapd(i,j,cfld) = grid1(ii,jj)
371 ids = (/ 481,479,476,477,478,518,519,520,521,(0,i=10,50) /)
375 n = iavblfld(iget(iid))
376 nfdctl=
size(pset%param(n)%level)
378 pset%param(n)%level(j) =
relabel(pset%param(n)%level(j))
401 real,
intent(in) :: p
403 real,
parameter :: lapse = 0.0065
404 real,
parameter :: surf_temp = 288.15
405 real,
parameter :: gravity = 9.80665
406 real,
parameter :: moles_dry_air = 0.02896442
407 real,
parameter :: gas_const = 8.31432
408 real,
parameter :: surf_pres = 1013.25
409 real,
parameter :: power_const = (gravity * moles_dry_air) &
410 / (gas_const * lapse)
412 p2h = (surf_temp/lapse)*(1-(p/surf_pres)**(1/power_const))
425 real,
intent(in) :: p
subroutine fdlvl_uv(ITYPE, NFD, HTFD, UFD, VFD)
Computes FD level for u,v.
subroutine mdl2std_p()
mdl2std_p() vertical interpolation of model levels to standard atmospheric pressure.
real function relabel(p)
relabel() relabels the pressure level to reference (or standard atmospheric) pressure levels rather t...
real function p2h(p)
P2H() converts pressure levels (hPa) to geopotential heights.
subroutine fdlvl_mass(ITYPE, NFD, PTFD, HTFD, NIN, QIN, QTYPE, QFD)
Computes FD level for mass variables.