source: flexpart.git/src/verttransform_nests.f90 @ 1a8fbee

univie
Last change on this file since 1a8fbee was 1a8fbee, checked in by pesei <petra seibert at univie ac at>, 6 years ago

vertransform: fix #140 (ref position for grid), verttransform_nest: fix bug with dimensions, both: smaller changes, com_mod: correct comment to nmixz

  • Property mode set to 100644
File size: 24.5 KB
Line 
1!**********************************************************************
2! Copyright 1998,1999,2000,2001,2002,2005,2007,2008,2009,2010         *
3! Andreas Stohl, Petra Seibert, A. Frank, Gerhard Wotawa,             *
4! Caroline Forster, Sabine Eckhardt, John Burkhart, Harald Sodemann   *
5!                                                                     *
6! This file is part of FLEXPART.                                      *
7!                                                                     *
8! FLEXPART is free software: you can redistribute it and/or modify    *
9! it under the terms of the GNU General Public License as published by*
10! the Free Software Foundation, either version 3 of the License, or   *
11! (at your option) any later version.                                 *
12!                                                                     *
13! FLEXPART is distributed in the hope that it will be useful,         *
14! but WITHOUT ANY WARRANTY; without even the implied warranty of      *
15! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
16! GNU General Public License for more details.                        *
17!                                                                     *
18! You should have received a copy of the GNU General Public License   *
19! along with FLEXPART.  If not, see <http://www.gnu.org/licenses/>.   *
20!**********************************************************************
21
22subroutine verttransform_nests(n,uuhn,vvhn,wwhn,pvhn)
23!                            i   i    i    i   i
24!*****************************************************************************
25!                                                                            *
26!     This subroutine transforms temperature, dew point temperature and      *
27!     wind components from eta to meter coordinates.                         *
28!     The vertical wind component is transformed from Pa/s to m/s using      *
29!     the conversion factor pinmconv.                                        *
30!     In addition, this routine calculates vertical density gradients        *
31!     needed for the parameterization of the turbulent velocities.           *
32!     It is similar to verttransform, but makes the transformations for      *
33!     the nested grids.                                                      *
34!                                                                            *
35!     Author: A. Stohl, G. Wotawa                                            *
36!                                                                            *
37!     12 August 1996                                                         *
38!     Update: 16 January 1998                                                *
39!                                                                            *
40!                                                                            *
41!*****************************************************************************
42!  CHANGES                                                                   *
43!     Major update: 17 February 1999                                         *
44!     by G. Wotawa                                                           *
45!                                                                            *
46!     - Vertical levels for u, v and w are put together                      *
47!     - Slope correction for vertical velocity: Modification of calculation  *
48!       procedure                                                            *
49!                                                                            *
50!*****************************************************************************
51!  Changes, Bernd C. Krueger, Feb. 2001:       (marked "C-cv")
52!   Variables tthn and qvhn (on eta coordinates) from common block
53! Sabine Eckhardt, March 2007:
54!   added the variable cloud for use with scavenging - descr. in com_mod
55!                                                                            *
56! Who? When?                                                                 *
57!   Unified ECMWF and GFS builds
58! Marian Harustak, 12.5.2017
59!     - Renamed from verttransform to verttransform_ecmwf
60!                                                                            *
61! ESO, 2016
62! -note that divide-by-zero occurs when nxmaxn,nymaxn etc. are larger than
63!  the actual field dimensions /fixed, PS 2018/
64!                                                                            *
65! Don Morton, 2017-05-30:
66!   modification of a bug in ew. Don Morton (CTBTO project)                  *
67!                                                                            *
68!  undocumented modifications by NILU for v10                                *
69!                                                                            *
70!  Petra Seibert, 2018-06-13:                                                *
71!   - insert proper boundaries for implied loops in array expressions        *s
72!   - minor changes, most of them just cosmetics                             *
73!   for details see changelog.txt                                            *
74!                                                                            *
75! ****************************************************************************
76!                                                                            *
77! Variables:                                                                 *
78! nxn,nyn,nuvz,nwz                field dimensions in x,y and z direction    *
79! uun                             wind components in x-direction [m/s]       *
80! vvn                             wind components in y-direction [m/s]       *
81! wwn                             wind components in z-direction [deltaeta/s]*
82! ttn                             temperature [K]                            *
83! pvn                             potential vorticity (pvu)                  *
84! psn                             surface pressure [Pa]                      *
85!                                                                            *
86!*****************************************************************************
87
88  use par_mod
89  use com_mod
90
91  implicit none
92
93  real,intent(in),dimension(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests) :: &
94    uuhn,vvhn,pvhn
95  real,intent(in),dimension(0:nxmaxn-1,0:nymaxn-1,nwzmax,maxnests) :: wwhn
96
97  real,dimension(0:nxmaxn-1,0:nymaxn-1,nuvzmax) :: rhohn,uvzlev,wzlev
98  real,dimension(0:nxmaxn-1,0:nymaxn-1,nzmax) :: pinmconv
99
100  real,dimension(0:nymaxn-1) :: cosf
101  real,dimension(0:nxmaxn-1,0:nymaxn-1) :: tvold,pold,pint,tv
102!! automatic arrays introduced in v10 by ?? to achieve better loop order (PS)
103
104  integer,dimension(0:nxmaxn-1,0:nymaxn-1) :: rain_cloud_above, idx
105
106  integer :: ix,jy,kz,iz,n,l,kmin,kl,klp,ix1,jy1,ixp,jyp,kz_inv
107  integer :: nxx, nyy ! max of nest where we are working
108  real :: f_qvsat,pressure,rh,lsp,convp,cloudh_min,prec
109
110  real :: ew,dz1,dz2,dz
111  real :: dzdx,dzdy
112  real :: dzdx1,dzdx2,dzdy1,dzdy2
113  real,parameter :: const=r_air/ga
114  real :: tot_cloud_h
115
116!  real,parameter :: precmin = 0.002 ! minimum prec in mm/h for cloud diagn.
117
118! Loop over all nests
119!********************
120
121  l_loop: do l=1,numbnests
122    nxx=nxn(l)-1 ! shorthand
123    nyy=nyn(l)-1 ! shorthand
124
125! Loop over the whole grid (partly implicitly
126!*************************
127! initialise the automatic arrays
128
129  tvold(0:nxx,0:nyy)=tt2n(0:nxx,0:nyy,1,n,l) * &
130    (1.+0.378*ew( td2n(0:nxx,0:nyy,1,n,l) ) / psn(0:nxx,0:nyy,1,n,l))
131  pold(0:nxx,0:nyy)=psn(0:nxx,0:nyy,1,n,l)
132  uvzlev(0:nxx,0:nyy,1)=0.
133  wzlev(0:nxx,0:nyy,1)=0.
134  rhohn(0:nxx,0:nyy,1)=pold(0:nxx,0:nyy)/(r_air*tvold(0:nxx,0:nyy))
135
136
137! Compute heights of eta levels
138!******************************
139
140    do kz=2,nuvz
141      pint(:,:)=akz(kz)+bkz(kz)*psn(0:nxx,0:nyy,1,n,l)
142      tv(0:nxx,0:nyy)=tthn(0:nxx,0:nyy,kz,n,l)* &
143        (1.+0.608*qvhn(0:nxx,0:nyy,kz,n,l))
144      rhohn(0:nxx,0:nyy,kz)=pint(0:nxx,0:nyy)/(r_air*tv(0:nxx,0:nyy))
145
146      where (abs(tv(0:nxx,0:nyy)-tvold(0:nxx,0:nyy)).gt.0.2)
147        uvzlev(0:nxx,0:nyy,kz)=uvzlev(0:nxx,0:nyy,kz-1) + &
148          const*log( pold(0:nxx,0:nyy)/pint(0:nxx,0:nyy) ) * &
149          ( tv(0:nxx,0:nyy) - tvold(0:nxx,0:nyy) ) / &
150          log( tv(0:nxx,0:nyy)/tvold(0:nxx,0:nyy) )
151      elsewhere
152        uvzlev(0:nxx,0:nyy,kz)=uvzlev(0:nxx,0:nyy,kz-1) + &
153           const*log( pold(0:nxx,0:nyy)/pint(0:nxx,0:nyy) ) *  &
154           tv(0:nxx,0:nyy)
155      endwhere
156
157      tvold(0:nxx,0:nyy)=tv(0:nxx,0:nyy)
158      pold(0:nxx,0:nyy)=pint(0:nxx,0:nyy)
159
160    end do
161
162    do kz=2,nwz-1
163      wzlev(0:nxx,0:nyy,kz)=(uvzlev(0:nxx,0:nyy,kz+1)+uvzlev(0:nxx,0:nyy,kz))/2.
164    end do
165    wzlev(0:nxx,0:nyy,nwz)=wzlev(0:nxx,0:nyy,nwz-1)+ &
166         uvzlev(0:nxx,0:nyy,nuvz)-uvzlev(0:nxx,0:nyy,nuvz-1)
167
168
169    pinmconv(0:nxx,0:nyy,1)=(uvzlev(0:nxx,0:nyy,2))/ &
170      ((aknew(2)+bknew(2)*psn(0:nxx,0:nyy,1,n,l))- &
171       (aknew(1)+bknew(1)*psn(0:nxx,0:nyy,1,n,l)))
172    do kz=2,nz-1
173      pinmconv(0:nxx,0:nyy,kz)= &
174        (uvzlev(0:nxx,0:nyy,kz+1)-uvzlev(0:nxx,0:nyy,kz-1))/ &
175        ((aknew(kz+1)+bknew(kz+1)*psn(0:nxx,0:nyy,1,n,l))- &
176         (aknew(kz-1)+bknew(kz-1)*psn(0:nxx,0:nyy,1,n,l)))
177    end do
178    pinmconv(0:nxx,0:nyy,nz)= &
179      (uvzlev(0:nxx,0:nyy,nz)-uvzlev(0:nxx,0:nyy,nz-1))/ &
180      ((aknew(nz)+bknew(nz)*psn(0:nxx,0:nyy,1,n,l))- &
181       (aknew(nz-1)+bknew(nz-1)*psn(0:nxx,0:nyy,1,n,l)))
182
183! Levels where u,v,t and q are given
184!************************************
185
186    uun(0:nxx,0:nyy,1,n,l)=uuhn(0:nxx,0:nyy,1,l)
187    vvn(0:nxx,0:nyy,1,n,l)=vvhn(0:nxx,0:nyy,1,l)
188    ttn(0:nxx,0:nyy,1,n,l)=tthn(0:nxx,0:nyy,1,n,l)
189    qvn(0:nxx,0:nyy,1,n,l)=qvhn(0:nxx,0:nyy,1,n,l)
190    if (readclouds_nest(l)) then
191      clwcn(0:nxx,0:nyy,1,n,l)=clwchn(0:nxx,0:nyy,1,n,l)
192      if (.not. sumclouds_nest(l)) &
193        ciwcn(0:nxx,0:nyy,1,n,l)=ciwchn(0:nxx,0:nyy,1,n,l)
194    end if
195    pvn(0:nxx,0:nyy,1,n,l)=pvhn(0:nxx,0:nyy,1,l)
196    rhon(0:nxx,0:nyy,1,n,l)=rhohn(0:nxx,0:nyy,1)
197
198    uun(0:nxx,0:nyy,nz,n,l)=uuhn(0:nxx,0:nyy,nuvz,l)
199    vvn(0:nxx,0:nyy,nz,n,l)=vvhn(0:nxx,0:nyy,nuvz,l)
200    ttn(0:nxx,0:nyy,nz,n,l)=tthn(0:nxx,0:nyy,nuvz,n,l)
201    qvn(0:nxx,0:nyy,nz,n,l)=qvhn(0:nxx,0:nyy,nuvz,n,l)
202    if (readclouds_nest(l)) then
203      clwcn(0:nxx,0:nyy,nz,n,l)=clwchn(0:nxx,0:nyy,nuvz,n,l)
204      if (.not. sumclouds_nest(l)) &
205        ciwcn(0:nxx,0:nyy,nz,n,l)=ciwchn(0:nxx,0:nyy,nuvz,n,l)
206    end if
207    pvn(0:nxx,0:nyy,nz,n,l)=pvhn(0:nxx,0:nyy,nuvz,l)
208    rhon(0:nxx,0:nyy,nz,n,l)=rhohn(0:nxx,0:nyy,nuvz)
209
210    kmin=2
211    idx=kmin
212    iz_loop: do iz=2,nz-1
213
214      do jy=0,nyy
215        do ix=0,nxx
216          if( height(iz).gt.uvzlev(ix,jy,nuvz)) then
217
218            uun(ix,jy,iz,n,l)=uun(ix,jy,nz,n,l)
219            vvn(ix,jy,iz,n,l)=vvn(ix,jy,nz,n,l)
220            ttn(ix,jy,iz,n,l)=ttn(ix,jy,nz,n,l)
221            qvn(ix,jy,iz,n,l)=qvn(ix,jy,nz,n,l)
222!hg adding the cloud water
223            if (readclouds_nest(l)) then
224              clwcn(ix,jy,iz,n,l)=clwcn(ix,jy,nz,n,l)
225              if (.not. sumclouds_nest(l))  &
226                  ciwcn(ix,jy,iz,n,l)=ciwcn(ix,jy,nz,n,l)
227            end if
228!hg
229            pvn(ix,jy,iz,n,l)=pvn(ix,jy,nz,n,l)
230            rhon(ix,jy,iz,n,l)=rhon(ix,jy,nz,n,l)
231
232          else
233
234            kz_loop: do kz=idx(ix,jy),nuvz
235              if (idx(ix,jy) .le. kz .and. height(iz).gt.uvzlev(ix,jy,kz-1) &
236                  .and. height(iz).le.uvzlev(ix,jy,kz)) then
237                idx(ix,jy)=kz
238                exit kz_loop
239              endif
240            enddo kz_loop
241           
242          endif
243        enddo
244      enddo
245
246      do jy=0,nyy
247        do ix=0,nxx
248          if(height(iz).le.uvzlev(ix,jy,nuvz)) then
249            kz=idx(ix,jy)
250            dz1=height(iz)-uvzlev(ix,jy,kz-1)
251            dz2=uvzlev(ix,jy,kz)-height(iz)
252            dz=dz1+dz2
253            uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+uuhn(ix,jy,kz,l)*dz1)/dz
254            vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+vvhn(ix,jy,kz,l)*dz1)/dz
255            ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2 &
256                 +tthn(ix,jy,kz,n,l)*dz1)/dz
257            qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2 &
258                 +qvhn(ix,jy,kz,n,l)*dz1)/dz
259!hg adding the cloud water
260            if (readclouds_nest(l)) then
261              clwcn(ix,jy,iz,n,l)=(clwchn(ix,jy,kz-1,n,l)*dz2 + &
262                clwchn(ix,jy,kz,n,l)*dz1)/dz
263              if (.not. sumclouds_nest(l)) ciwcn(ix,jy,iz,n,l)= &
264                  (ciwchn(ix,jy,kz-1,n,l)*dz2+ciwchn(ix,jy,kz,n,l)*dz1)/dz
265            end if
266!hg
267            pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+pvhn(ix,jy,kz,l)*dz1)/dz
268            rhon(ix,jy,iz,n,l)=(rhohn(ix,jy,kz-1)*dz2+rhohn(ix,jy,kz)*dz1)/dz
269           
270          endif
271        enddo
272      enddo
273
274    enddo iz_loop
275
276
277
278!         do kz=kmin,nuvz
279!           if(height(iz).gt.uvwzlev(ix,jy,nuvz)) then
280!             uun(ix,jy,iz,n,l)=uun(ix,jy,nz,n,l)
281!             vvn(ix,jy,iz,n,l)=vvn(ix,jy,nz,n,l)
282!             ttn(ix,jy,iz,n,l)=ttn(ix,jy,nz,n,l)
283!             qvn(ix,jy,iz,n,l)=qvn(ix,jy,nz,n,l)
284!             pvn(ix,jy,iz,n,l)=pvn(ix,jy,nz,n,l)
285!             rhon(ix,jy,iz,n,l)=rhon(ix,jy,nz,n,l)
286!             goto 30
287!           endif
288!           if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
289!           (height(iz).le.uvwzlev(ix,jy,kz))) then
290!            dz1=height(iz)-uvwzlev(ix,jy,kz-1)
291!            dz2=uvwzlev(ix,jy,kz)-height(iz)
292!            dz=dz1+dz2
293!            uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+ &
294!            uuhn(ix,jy,kz,l)*dz1)/dz
295!            vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+ &
296!            vvhn(ix,jy,kz,l)*dz1)/dz
297!            ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2+ &
298!            tthn(ix,jy,kz,n,l)*dz1)/dz
299!            qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2+ &
300!            qvhn(ix,jy,kz,n,l)*dz1)/dz
301!            pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+ &
302!            pvhn(ix,jy,kz,l)*dz1)/dz
303!            rhon(ix,jy,iz,n,l)=(rhohn(kz-1)*dz2+rhohn(kz)*dz1)/dz
304!            kmin=kz
305!            goto 30
306!           endif
307!         end do
308! 30      continue
309!       end do
310
311
312! Levels, where w is given
313!*************************
314
315    wwn(0:nxx,0:nyy,1,n,l)=wwhn(0:nxx,0:nyy,1,l)*pinmconv(0:nxx,0:nyy,1)
316    wwn(0:nxx,0:nyy,nz,n,l)=wwhn(0:nxx,0:nyy,nwz,l)*pinmconv(0:nxx,0:nyy,nz)
317    kmin=2
318    idx=kmin
319    iz_loop2: do iz=2,nz
320      do jy=0,nyy
321        do ix=0,nxx
322          kz_loop2:   do kz=idx(ix,jy),nwz
323            if (idx(ix,jy) .le. kz .and. height(iz).gt.wzlev(ix,jy,kz-1) &
324                .and. height(iz).le.wzlev(ix,jy,kz)) then
325              idx(ix,jy)=kz
326              exit kz_loop2
327            endif
328          enddo kz_loop2
329        enddo
330      enddo
331      do jy=0,nyy
332        do ix=0,nxx
333          kz=idx(ix,jy)
334          dz1=height(iz)-wzlev(ix,jy,kz-1)
335          dz2=wzlev(ix,jy,kz)-height(iz)
336          dz=dz1+dz2
337          wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(ix,jy,kz-1)*dz2 &
338               +wwhn(ix,jy,kz,l)*pinmconv(ix,jy,kz)*dz1)/dz
339        enddo
340      enddo
341    enddo iz_loop2
342
343!       wwn(ix,jy,1,n,l)=wwhn(ix,jy,1,l)*pinmconv(1)
344!       wwn(ix,jy,nz,n,l)=wwhn(ix,jy,nwz,l)*pinmconv(nz)
345!       kmin=2
346!       do iz=2,nz
347!         do kz=kmin,nwz
348!           if ((height(iz).gt.wzlev(kz-1)).and. &
349!           (height(iz).le.wzlev(kz))) then
350!             dz1=height(iz)-wzlev(kz-1)
351!             dz2=wzlev(kz)-height(iz)
352!             dz=dz1+dz2
353!             wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(kz-1)*dz2 &
354!             +wwhn(ix,jy,kz,l)*pinmconv(kz)*dz1)/dz
355!             kmin=kz
356!             goto 40
357!           endif
358!         end do
359! 40      continue
360!       end do
361
362! Compute density gradients at intermediate levels
363!*************************************************
364
365    drhodzn(0:nxx,0:nyy,1,n,l)= &
366      ( rhon(0:nxx,0:nyy,2,n,l)-rhon(0:nxx,0:nyy,1,n,l) )/(height(2)-height(1))
367    do kz=2,nz-1
368      drhodzn(0:nxx,0:nyy,kz,n,l)= &
369        ( rhon(0:nxx,0:nyy,kz+1,n,l)-rhon(0:nxx,0:nyy,kz-1,n,l) ) / &
370        ( height(kz+1)-height(kz-1) )
371    end do
372    drhodzn(0:nxx,0:nyy,nz,n,l)=drhodzn(0:nxx,0:nyy,nz-1,n,l)
373
374
375! drhodzn(ix,jy,1,n,l)=(rhon(ix,jy,2,n,l)-rhon(ix,jy,1,n,l))/ &
376! (height(2)-height(1))
377! do kz=2,nz-1
378!   drhodzn(ix,jy,kz,n,l)=(rhon(ix,jy,kz+1,n,l)- &
379!   rhon(ix,jy,kz-1,n,l))/(height(kz+1)-height(kz-1))
380! end do
381! drhodzn(ix,jy,nz,n,l)=drhodzn(ix,jy,nz-1,n,l)
382
383
384
385!   end do
386! end do
387
388
389!****************************************************************
390! Compute slope of eta levels in windward direction and resulting
391! vertical wind correction
392!****************************************************************
393
394    do jy=1,nyy-1
395!    cosf=cos((real(jy)*dyn(l)+ylat0n(l))*pi180)
396      cosf(jy) = 1. / cos( ( real(jy)*dyn(l) + ylat0n(l) ) * pi180 )
397    end do
398
399    kmin=2
400    idx=kmin
401    iz_loop3: do iz=2,nz-1
402      do jy=1,nyy-1
403        do ix=1,nxx-1
404
405          kz_loop3: do kz=idx(ix,jy),nz
406            if (idx(ix,jy) .le. kz .and. (height(iz).gt.uvzlev(ix,jy,kz-1)) &
407                .and. (height(iz).le.uvzlev(ix,jy,kz))) then
408              idx(ix,jy)=kz
409              exit kz_loop3
410            endif
411          enddo kz_loop3
412        enddo
413      enddo
414
415      do jy=1,nyy-1
416        do ix=1,nxx-1
417          kz=idx(ix,jy)
418          dz1=height(iz)-uvzlev(ix,jy,kz-1)
419          dz2=uvzlev(ix,jy,kz)-height(iz)
420          dz=dz1+dz2
421          ix1=ix-1
422          jy1=jy-1
423          ixp=ix+1
424          jyp=jy+1
425
426          dzdx1=(uvzlev(ixp,jy,kz-1)-uvzlev(ix1,jy,kz-1))/2.
427          dzdx2=(uvzlev(ixp,jy,kz)-uvzlev(ix1,jy,kz))/2.
428          dzdx=(dzdx1*dz2+dzdx2*dz1)/dz
429
430          dzdy1=(uvzlev(ix,jyp,kz-1)-uvzlev(ix,jy1,kz-1))/2.
431          dzdy2=(uvzlev(ix,jyp,kz)-uvzlev(ix,jy1,kz))/2.
432          dzdy=(dzdy1*dz2+dzdy2*dz1)/dz
433
434          wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l) + &
435            ( dzdx*uun(ix,jy,iz,n,l)*dxconst*xresoln(l)*cosf(jy) + &
436              dzdy*vvn(ix,jy,iz,n,l)*dyconst*yresoln(l) )
437
438        end do
439
440      end do
441    end do iz_loop3
442
443
444!   do jy=1,nyn(l)-2
445!     do ix=1,nxn(l)-2
446!       kmin=2
447!       do iz=2,nz-1
448
449!         ui=uun(ix,jy,iz,n,l)*dxconst*xresoln(l)/cosf(jy)
450!         vi=vvn(ix,jy,iz,n,l)*dyconst*yresoln(l)
451
452!         do kz=kmin,nz
453!           if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
454!                (height(iz).le.uvwzlev(ix,jy,kz))) then
455!             dz1=height(iz)-uvwzlev(ix,jy,kz-1)
456!             dz2=uvwzlev(ix,jy,kz)-height(iz)
457!             dz=dz1+dz2
458!             kl=kz-1
459!             klp=kz
460!             kmin=kz
461!             goto 47
462!           endif
463!         end do
464
465! 47      ix1=ix-1
466!         jy1=jy-1
467!         ixp=ix+1
468!         jyp=jy+1
469
470!         dzdx1=(uvwzlev(ixp,jy,kl)-uvwzlev(ix1,jy,kl))/2.
471!         dzdx2=(uvwzlev(ixp,jy,klp)-uvwzlev(ix1,jy,klp))/2.
472!         dzdx=(dzdx1*dz2+dzdx2*dz1)/dz
473
474!         dzdy1=(uvwzlev(ix,jyp,kl)-uvwzlev(ix,jy1,kl))/2.
475!         dzdy2=(uvwzlev(ix,jyp,klp)-uvwzlev(ix,jy1,klp))/2.
476!         dzdy=(dzdy1*dz2+dzdy2*dz1)/dz
477
478!         wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l)+(dzdx*ui+dzdy*vi)
479
480!       end do
481
482!     end do
483!   end do
484
485
486!write (*,*) 'initializing nested cloudsn, n:',n
487!   create a cloud and rainout/washout field, cloudsn occur where rh>80%
488
489
490!******************************************************************************
491    if (readclouds_nest(l)) then !HG METHOD
492   
493! Loops over all grid cells vertically and construct the 3D matrix for clouds
494! Cloud top and cloud bottom grid cells are assigned as well as the total column
495! cloud water. For precipitating columns, the type and whether it is in or below
496! cloud scavenging are assigned with numbers 2-5 (following the old metod).
497! A distinction is made between lsp and convp though they are treated the equally
498! with regard to scavenging. Also, clouds that are not precipitating are defined which
499! may be used in the future for cloud processing by non-precipitating-clouds.
500!*******************************************************************************
501
502!PS      write(*,*) 'Nested ECMWF fields: using cloud water'
503      clwn(0:nxx,0:nyy,:,n,l)=0.
504!    icloud_stats(0:nxx,0:nyy,:,n)=0.
505      ctwcn(0:nxx,0:nyy,n,l)=0.
506      cloudsn(0:nxx,0:nyy,:,n,l)=0
507! If water/ice are read separately into clwc and ciwc, store sum in clwcn
508      if (.not. sumclouds_nest(l)) then
509        clwcn(0:nxx,0:nyy,:,n,l) = clwcn(0:nxx,0:nyy,:,n,l) + &
510                                   ciwcn(0:nxx,0:nyy,:,n,l)
511      end if
512      do jy=0,nyy
513        do ix=0,nxx
514          lsp=lsprecn(ix,jy,1,n,l)
515          convp=convprecn(ix,jy,1,n,l)
516          prec=lsp+convp
517          tot_cloud_h=0
518! Find clouds in the vertical
519!! Note PS: bad loop order.
520          do kz=1, nz-1 !go from top to bottom
521            if (clwcn(ix,jy,kz,n,l).gt.0) then     
522! assuming rho is in kg/m3 and hz in m gives: kg/kg * kg/m3 *m3/kg /m = m2/m3
523              clwn(ix,jy,kz,n,l)=(clwcn(ix,jy,kz,n,l)*rhon(ix,jy,kz,n,l)) * &
524                (height(kz+1)-height(kz))
525              tot_cloud_h=tot_cloud_h+(height(kz+1)-height(kz))
526              ctwcn(ix,jy,n,l) = ctwcn(ix,jy,n,l)+clwn(ix,jy,kz,n,l)
527!            icloud_stats(ix,jy,4,n)= icloud_stats(ix,jy,4,n)+clw(ix,jy,kz,n)          ! Column cloud water [m3/m3]
528!           icloud_stats(ix,jy,3,n)= min(height(kz+1),height(kz))                     ! Cloud BOT height stats      [m]
529              cloudh_min=min(height(kz+1),height(kz))
530!ZHG 2015 extra for testing
531!            clh(ix,jy,kz,n)=height(kz+1)-height(kz)
532!            icloud_stats(ix,jy,1,n)=icloud_stats(ix,jy,1,n)+(height(kz+1)-height(kz)) ! Cloud total vertical extent [m]
533!            icloud_stats(ix,jy,2,n)= max(icloud_stats(ix,jy,2,n),height(kz))          ! Cloud TOP height            [m]
534!ZHG
535            endif
536          end do
537
538! If Precipitation. Define removal type in the vertical
539        if (lsp.gt.0.01 .or. convp.gt.0.01) then ! cloud and precipitation
540!! Note PS: such hardcoded limits would better be parameters defined in par_mod
541
542            do kz=nz,1,-1 !go Bottom up!
543!! Note PS: bad loop order
544             if (clwn(ix,jy,kz,n,l) .gt. 0.) then ! is in cloud
545               cloudshn(ix,jy,n,l)=cloudshn(ix,jy,n,l)+height(kz)-height(kz-1)
546               cloudsn(ix,jy,kz,n,l)=1                             ! is a cloud
547                if (lsp.ge.convp) then
548                  cloudsn(ix,jy,kz,n,l)=3                        ! lsp in-cloud
549                else
550                  cloudsn(ix,jy,kz,n,l)=2                      ! convp in-cloud
551                endif                               ! convective or large scale
552              elseif ( clwn(ix,jy,kz,n,l) .le. 0. .and. &
553                  cloudh_min .ge. height(kz) ) then ! is below cloud
554                if (lsp .ge. convp) then
555                  cloudsn(ix,jy,kz,n,l)=5              ! lsp dominated washout
556                else
557                  cloudsn(ix,jy,kz,n,l)=4            ! convp dominated washout
558                endif                             ! convective or large scale
559              endif
560
561              if (height(kz).ge. 19000) then ! set a max height for removal
562                cloudsn(ix,jy,kz,n,l)=0
563              endif ! clw>0
564            end do ! kz
565          endif ! precipitation
566        end do
567      end do
568     
569!********************************************************************
570    else ! old method:
571!********************************************************************
572 
573!PS      write(*,*) 'Nested fields: using cloud water from Parameterization'
574      do jy=0,nyy
575        do ix=0,nxx
576          rain_cloud_above(ix,jy)=0
577          lsp=lsprecn(ix,jy,1,n,l)
578          convp=convprecn(ix,jy,1,n,l)
579          cloudshn(ix,jy,n,l)=0
580          do kz_inv=1,nz-1
581!! Note PS: bad loop order.
582            kz=nz-kz_inv+1
583            pressure=rhon(ix,jy,kz,n,l)*r_air*ttn(ix,jy,kz,n,l)
584            rh=qvn(ix,jy,kz,n,l)/f_qvsat(pressure,ttn(ix,jy,kz,n,l))
585            cloudsn(ix,jy,kz,n,l)=0
586
587            if (rh .gt. 0.8) then ! in cloud
588!! Note PS: such hardcoded limits would better be parameters defined in par_mod
589
590              if (lsp.gt.0.01 .or. convp.gt.0.01) then ! cloud and precipitation
591!! Note PS: such hardcoded limits would better be parameters defined in par_mod
592                rain_cloud_above(ix,jy)=1
593                cloudshn(ix,jy,n,l)=cloudshn(ix,jy,n,l)+ &
594                     height(kz)-height(kz-1)
595                if (lsp.ge.convp) then
596                  cloudsn(ix,jy,kz,n,l)=3 ! lsp dominated rainout
597                else
598                  cloudsn(ix,jy,kz,n,l)=2 ! convp dominated rainout
599                endif
600              else ! no precipitation
601                cloudsn(ix,jy,kz,n,l)=1 ! cloud
602              endif
603
604            else ! no cloud
605
606              if (rain_cloud_above(ix,jy).eq.1) then ! scavenging
607                if (lsp.ge.convp) then
608                  cloudsn(ix,jy,kz,n,l)=5 ! lsp dominated washout
609                else
610                  cloudsn(ix,jy,kz,n,l)=4 ! convp dominated washout
611                endif
612              endif
613
614            endif
615          end do ! kz
616         
617        end do ! ix
618      end do ! jy
619     
620    end if! old method:
621
622  end do l_loop! end loop over nests
623
624end subroutine verttransform_nests
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG