source: branches/petra/src/verttransform_nests.f90 @ 37

Last change on this file since 37 was 37, checked in by pesei, 9 years ago

Wet dep quick fix and other small changes. Wet depo quick fix not final yet.

File size: 13.5 KB
Line 
1!**********************************************************************
2! Copyright 1998-2015                                                 *
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  !     Major update: 17 February 1999                                         *
41  !     by G. Wotawa                                                           *
42  !                                                                            *
43  !     - Vertical levels for u, v and w are put together                      *
44  !     - Slope correction for vertical velocity: Modification of calculation  *
45  !       procedure                                                            *
46  !                                                                            *
47  !*****************************************************************************
48  !  Changes, Bernd C. Krueger, Feb. 2001:       (marked "C-cv")
49  !   Variables tthn and qvhn (on eta coordinates) from common block
50  !*****************************************************************************
51  ! Sabine Eckhardt, March 2007
52  ! add the variable cloud for use with scavenging - descr. in com_mod
53  !*****************************************************************************
54  ! Petra Seibert, Feb 2015: Add quick fix from 2013
55  !*****************************************************************************
56  !                                                                            *
57  ! Variables:                                                                 *
58  ! nxn,nyn,nuvz,nwz                field dimensions in x,y and z direction    *
59  ! uun                             wind components in x-direction [m/s]       *
60  ! vvn                             wind components in y-direction [m/s]       *
61  ! wwn                             wind components in z-direction [deltaeta/s]*
62  ! ttn                             temperature [K]                            *
63  ! pvn                             potential vorticity (pvu)                  *
64  ! psn                             surface pressure [Pa]                      *
65  !                                                                            *
66  !*****************************************************************************
67
68  use par_mod
69  use com_mod
70
71  implicit none
72
73  integer :: ix,jy,kz,iz,n,l,kmin,kl,klp,ix1,jy1,ixp,jyp,kz_inv
74  integer :: icloudtop
75  real :: f_qvsat,pressure
76  real :: rh,lsp,convp,prec,rhmin
77  real :: rhoh(nuvzmax),pinmconv(nzmax)
78  real :: wzlev(nwzmax),uvwzlev(0:nxmaxn-1,0:nymaxn-1,nzmax)
79  real :: ew,pint,tv,tvold,pold,dz1,dz2,dz,ui,vi
80  real :: dzdx,dzdy
81  real :: dzdx1,dzdx2,dzdy1,dzdy2,cosf
82  real :: uuhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)
83  real :: vvhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)
84  real :: pvhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)
85  real :: wwhn(0:nxmaxn-1,0:nymaxn-1,nwzmax,maxnests)
86  real,parameter :: const=r_air/ga
87
88  logical :: lconvectprec, lsearch
89
90  ! Loop over all nests
91  !********************
92
93  numbnest_loop: &
94  do l=1,numbnests
95
96  ! Loop over the whole grid
97  !*************************
98
99  do jy=0,nyn(l)-1
100    do ix=0,nxn(l)-1
101
102      tvold=tt2n(ix,jy,1,n,l)*(1.+0.378*ew(td2n(ix,jy,1,n,l))/ &
103      psn(ix,jy,1,n,l))
104      pold=psn(ix,jy,1,n,l)
105      uvwzlev(ix,jy,1)=0.
106      wzlev(1)=0.
107      rhoh(1)=pold/(r_air*tvold)
108
109
110  ! Compute heights of eta levels
111  !******************************
112
113      do kz=2,nuvz
114        pint=akz(kz)+bkz(kz)*psn(ix,jy,1,n,l)
115        tv=tthn(ix,jy,kz,n,l)*(1.+0.608*qvhn(ix,jy,kz,n,l))
116        rhoh(kz)=pint/(r_air*tv)
117
118        if (abs(tv-tvold).gt.0.2) then
119          uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)* &
120          (tv-tvold)/log(tv/tvold)
121        else
122          uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)*tv
123        endif
124
125        tvold=tv
126        pold=pint
127      end do
128
129
130      do kz=2,nwz-1
131        wzlev(kz)=(uvwzlev(ix,jy,kz+1)+uvwzlev(ix,jy,kz))/2.
132      end do
133      wzlev(nwz)=wzlev(nwz-1)+uvwzlev(ix,jy,nuvz)-uvwzlev(ix,jy,nuvz-1)
134
135  ! pinmconv=(h2-h1)/(p2-p1)
136
137      pinmconv(1)=(uvwzlev(ix,jy,2)-uvwzlev(ix,jy,1))/ &
138      ((aknew(2)+bknew(2)*psn(ix,jy,1,n,l))- &
139      (aknew(1)+bknew(1)*psn(ix,jy,1,n,l)))
140      do kz=2,nz-1
141        pinmconv(kz)=(uvwzlev(ix,jy,kz+1)-uvwzlev(ix,jy,kz-1))/ &
142        ((aknew(kz+1)+bknew(kz+1)*psn(ix,jy,1,n,l))- &
143        (aknew(kz-1)+bknew(kz-1)*psn(ix,jy,1,n,l)))
144      end do
145      pinmconv(nz)=(uvwzlev(ix,jy,nz)-uvwzlev(ix,jy,nz-1))/ &
146      ((aknew(nz)+bknew(nz)*psn(ix,jy,1,n,l))- &
147      (aknew(nz-1)+bknew(nz-1)*psn(ix,jy,1,n,l)))
148
149
150  ! Levels where u,v,t and q are given
151  !***********************************
152
153      uun(ix,jy,1,n,l)=uuhn(ix,jy,1,l)
154      vvn(ix,jy,1,n,l)=vvhn(ix,jy,1,l)
155      ttn(ix,jy,1,n,l)=tthn(ix,jy,1,n,l)
156      qvn(ix,jy,1,n,l)=qvhn(ix,jy,1,n,l)
157      pvn(ix,jy,1,n,l)=pvhn(ix,jy,1,l)
158      rhon(ix,jy,1,n,l)=rhoh(1)
159      uun(ix,jy,nz,n,l)=uuhn(ix,jy,nuvz,l)
160      vvn(ix,jy,nz,n,l)=vvhn(ix,jy,nuvz,l)
161      ttn(ix,jy,nz,n,l)=tthn(ix,jy,nuvz,n,l)
162      qvn(ix,jy,nz,n,l)=qvhn(ix,jy,nuvz,n,l)
163      pvn(ix,jy,nz,n,l)=pvhn(ix,jy,nuvz,l)
164      rhon(ix,jy,nz,n,l)=rhoh(nuvz)
165      kmin=2
166      do iz=2,nz-1
167        do kz=kmin,nuvz
168          if(height(iz).gt.uvwzlev(ix,jy,nuvz)) then
169            uun(ix,jy,iz,n,l)=uun(ix,jy,nz,n,l)
170            vvn(ix,jy,iz,n,l)=vvn(ix,jy,nz,n,l)
171            ttn(ix,jy,iz,n,l)=ttn(ix,jy,nz,n,l)
172            qvn(ix,jy,iz,n,l)=qvn(ix,jy,nz,n,l)
173            pvn(ix,jy,iz,n,l)=pvn(ix,jy,nz,n,l)
174            rhon(ix,jy,iz,n,l)=rhon(ix,jy,nz,n,l)
175            goto 30
176          endif
177          if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
178          (height(iz).le.uvwzlev(ix,jy,kz))) then
179           dz1=height(iz)-uvwzlev(ix,jy,kz-1)
180           dz2=uvwzlev(ix,jy,kz)-height(iz)
181           dz=dz1+dz2
182           uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+ &
183           uuhn(ix,jy,kz,l)*dz1)/dz
184           vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+ &
185           vvhn(ix,jy,kz,l)*dz1)/dz
186           ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2+ &
187           tthn(ix,jy,kz,n,l)*dz1)/dz
188           qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2+ &
189           qvhn(ix,jy,kz,n,l)*dz1)/dz
190           pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+ &
191           pvhn(ix,jy,kz,l)*dz1)/dz
192           rhon(ix,jy,iz,n,l)=(rhoh(kz-1)*dz2+rhoh(kz)*dz1)/dz
193           kmin=kz
194           goto 30
195          endif
196        end do
19730      continue
198      end do
199
200
201  ! Levels where w is given
202  !************************
203
204      wwn(ix,jy,1,n,l)=wwhn(ix,jy,1,l)*pinmconv(1)
205      wwn(ix,jy,nz,n,l)=wwhn(ix,jy,nwz,l)*pinmconv(nz)
206      kmin=2
207      do iz=2,nz
208        do kz=kmin,nwz
209          if ((height(iz).gt.wzlev(kz-1)).and. &
210          (height(iz).le.wzlev(kz))) then
211            dz1=height(iz)-wzlev(kz-1)
212            dz2=wzlev(kz)-height(iz)
213            dz=dz1+dz2
214            wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(kz-1)*dz2 &
215            +wwhn(ix,jy,kz,l)*pinmconv(kz)*dz1)/dz
216            kmin=kz
217            goto 40
218          endif
219        end do
22040      continue
221      end do
222
223  ! Compute density gradients at intermediate levels
224  !*************************************************
225
226      drhodzn(ix,jy,1,n,l)=(rhon(ix,jy,2,n,l)-rhon(ix,jy,1,n,l))/ &
227      (height(2)-height(1))
228      do kz=2,nz-1
229        drhodzn(ix,jy,kz,n,l)=(rhon(ix,jy,kz+1,n,l)- &
230        rhon(ix,jy,kz-1,n,l))/(height(kz+1)-height(kz-1))
231      end do
232      drhodzn(ix,jy,nz,n,l)=drhodzn(ix,jy,nz-1,n,l)
233
234    end do
235  end do
236
237
238  !****************************************************************
239  ! Compute slope of eta levels in windward direction and resulting
240  ! vertical wind correction
241  !****************************************************************
242
243  do jy=1,nyn(l)-2
244    cosf=cos((real(jy)*dyn(l)+ylat0n(l))*pi180)
245    do ix=1,nxn(l)-2
246
247      kmin=2
248      do iz=2,nz-1
249
250        ui=uun(ix,jy,iz,n,l)*dxconst*xresoln(l)/cosf
251        vi=vvn(ix,jy,iz,n,l)*dyconst*yresoln(l)
252
253        do kz=kmin,nz
254          if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
255               (height(iz).le.uvwzlev(ix,jy,kz))) then
256            dz1=height(iz)-uvwzlev(ix,jy,kz-1)
257            dz2=uvwzlev(ix,jy,kz)-height(iz)
258            dz=dz1+dz2
259            kl=kz-1
260            klp=kz
261            kmin=kz
262            goto 47
263          endif
264        end do
265
26647      ix1=ix-1
267        jy1=jy-1
268        ixp=ix+1
269        jyp=jy+1
270
271        dzdx1=(uvwzlev(ixp,jy,kl)-uvwzlev(ix1,jy,kl))/2.
272        dzdx2=(uvwzlev(ixp,jy,klp)-uvwzlev(ix1,jy,klp))/2.
273        dzdx=(dzdx1*dz2+dzdx2*dz1)/dz
274
275        dzdy1=(uvwzlev(ix,jyp,kl)-uvwzlev(ix,jy1,kl))/2.
276        dzdy2=(uvwzlev(ix,jyp,klp)-uvwzlev(ix,jy1,klp))/2.
277        dzdy=(dzdy1*dz2+dzdy2*dz1)/dz
278
279        wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l)+(dzdx*ui+dzdy*vi)
280
281      end do
282    end do
283  end do
284
285  ! write (*,*) 'diagnosing nested clouds, n:',n
286  jy_loop: &
287  do jy=0,nyn(l)-1
288    do ix=0,nxn(l)-1
289
290      lsp=lsprecn(ix,jy,1,n,l)
291      convp=convprecn(ix,jy,1,n,l)
292      prec=lsp+convp
293      if (lsp .gt. convp) then !  prectype='lsp'
294        lconvectprec = .false.
295      else ! prectype='cp '
296        lconvectprec = .true.
297      endif
298      icloudbotn(ix,jy,n,l)=icmv
299      icloudtop=icmv ! this is just a local variable
300      rhmin=rhmininit 
301      lsearch=.true.
302
303      cloudsearch_loop: &
304      do while (rhmin .ge. rhminx .and. lsearch) 
305        ! give up for < rhminx
306
307        kz_loop: &
308        do kz_inv=1,nz-1
309           kz=nz-kz_inv+1
310           pressure=rhon(ix,jy,kz,n,l)*r_air*ttn(ix,jy,kz,n,l)
311           rh=qvn(ix,jy,kz,n,l)/f_qvsat(pressure,ttn(ix,jy,kz,n,l))
312           if (rh .gt. rhmin) then
313            if (icloudbotn(ix,jy,n,l) .eq. icmv) then
314              icloudtop=nint(height(kz)) ! use int to save memory
315            endif
316            icloudbotn(ix,jy,n,l)=nint(height(kz))
317          endif
318        end do kz_loop
319
320        ! PS try to get a cloud thicker than 50 m
321        ! PS if there is at least precmin mm/h
322        if (prec .gt. precmin .and. &
323          ( icloudbotn(ix,jy,n,l) .eq. icmv .or. &
324            icloudtop-icloudbotn(ix,jy,n,l) .lt. 50)) then
325          rhmin = rhmin - 0.05
326        else
327          lsearch = .false.
328        endif
329       
330      enddo cloudsearch_loop
331     
332      ! PS implement a rough fix for badly represented convection
333      ! PS is based on looking at a limited set of comparison data
334      if (lconvectprec .and. icloudtop .lt. icloudtopconvmin .or. &
335         icloudbotn(ix,jy,n,l) .lt. icloudtopmin .and. prec .gt. precmin) then
336        if (convp .lt. 0.1) then
337          icloudbotn(ix,jy,n,l) = icloudbot1
338          icloudtop =             icloudtop1
339        else
340          icloudbotn(ix,jy,n,l) = icloudbot2
341          icloudtop =             icloudtop2
342        endif
343      endif
344      if (icloudtop .ne. icmv) then
345        icloudthckn(ix,jy,n,l) = icloudtop-icloudbotn(ix,jy,n,l)
346      else
347        icloudthckn(ix,jy,n,l) = icmv
348      endif
349      ! PS get rid of too thin clouds     
350      if (icloudthck(ix,jy,n) .lt. 50) then
351        icloudbotn(ix,jy,n,l)=icmv
352        icloudthckn(ix,jy,n,l)=icmv
353      endif
354
355    enddo
356  enddo jy_loop
357 
358  enddo numbnest_loop
359
360end subroutine verttransform_nests
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG