source: trunk/LMDZ.MARS/libf/phymars/vdif_cd.F @ 290

Last change on this file since 290 was 290, checked in by acolaitis, 13 years ago

--- AC 07/09/2011 ---

This is a major update for thermals and richardson layer parametrization. This update stabilizes thermals (further
studies might show that we can reduce the value of nsplit in gcm. To be tested.), and prevent downdrafts from descending into
the surface layer, which was acting as a cold feedback on the thermals. The Richardson surface layer now features
different gustiness coefficients for Richardson, heat and momentum so that u* and t* are correctly represented.

Upcoming updates will change surflayer_interpol.F90 to implement those changes in the interpolation scheme as well.

*
IMPORTANT : several parts of the vdifc code might want to use these new definitions for gustiness, u* and t*. exemple : dust devil routines
that recompute u* ? lifting routines ? TODO !

M 289 libf/phymars/thermcell_main_mars.F90
-----------------> Added iterations to the velocity / buoyancy / entrainment / detrainment

computation to ensure correct convergence. Iteration number is for now set to
4, which is probably too much. This will be changed once several cases are tested.
The minimum is probably 2 iterations.

M 289 libf/phymars/vdifc.F
-----------------> Subgrid gustiness parametrization now uses different gustiness beta coefficients

for heat and momentum. Comparisons with LES at Exomars landing site, matching u*
and teta* suggests values of beta=0.7 for momentum and beta=1.2 for heat, where
the formula for large scale horizontal winds in the first layer is :

U02 = pu2 + pv2 + (beta*wmax_th)2

M 289 libf/phymars/vdif_cd.F
-----------------> LES data suggests that Richardson number distribution during daytime has a very large

standart deviation due to highly negative Richardsons on several gridpoints. As a consequence,
the mean Richardson in daytime in the LES is much more negative than in LES. In the gcm,
parametrized subgrid turbulence prevents such cases, which can be dangerous in nearly unstable conditions.
Hence, we use beta=0.5 instead of one, so that we keep the anti-crazy-hfx function of beta and we increase the
norm of negative Richardsons in general for daytime conditions. This is set in conjonction with
beta settings for heat and momentum in vdifc.

M 289 libf/phymars/meso_inc/meso_inc_les.F
-----------------> HFX and USTM computations now uses the different betas for heat and momentum.


File size: 7.2 KB
Line 
1      SUBROUTINE vdif_cd(ngrid,nlay,pz0,
2     &           pg,pz,pu,pv,wmax,pts,ph,pcdv,pcdh)
3      IMPLICIT NONE
4c=======================================================================
5c
6c   Subject: computation of the surface drag coefficient using the
7c   -------  approch developed by Loui for ECMWF.
8c
9c   Author: Frederic Hourdin  15 /10 /93
10c   Modified by : Arnaud Colaitis 03/08/11
11c   -------
12c
13c   Arguments:
14c   ----------
15c
16c   inputs:
17c   ------
18c     ngrid            size of the horizontal grid
19c     pg               gravity (m s -2)
20c     pz(ngrid,nlay)   height of layers
21c     pu(ngrid,nlay)   u component of the wind
22c     pv(ngrid,nlay)   v component of the wind
23c     pts(ngrid)       surface temperature
24c     ph(ngrid)        potential temperature T*(p/ps)^kappa
25c
26c   outputs:
27c   --------
28c     pcdv(ngrid)      Cd for the wind
29c     pcdh(ngrid)      Cd for potential temperature
30c
31c=======================================================================
32c
33c-----------------------------------------------------------------------
34c   Declarations:
35c   -------------
36
37#include "comcstfi.h"
38#include "callkeys.h"
39
40c   Arguments:
41c   ----------
42
43      INTEGER, INTENT(IN) :: ngrid,nlay
44      REAL, INTENT(IN) :: pz0(ngrid)
45      REAL, INTENT(IN) :: pg,pz(ngrid,nlay)
46      REAL, INTENT(IN) :: pu(ngrid,nlay),pv(ngrid,nlay)
47      REAL, INTENT(IN) :: pts(ngrid),ph(ngrid,nlay)
48      REAL, INTENT(IN) :: wmax(ngrid)
49      REAL, INTENT(OUT) :: pcdv(ngrid),pcdh(ngrid) ! momentum and heat drag coefficient
50
51c   Local:
52c   ------
53
54      INTEGER ig
55
56      REAL karman,nu    ! Von Karman constant and fluid kinematic viscosity
57      LOGICAL firstcal
58      DATA karman,nu/.41,0.001/
59      DATA firstcal/.true./
60      SAVE karman,nu
61
62c    Local(2):
63c    ---------
64      REAL z1,zcd0
65
66      REAL rib(ngrid)  ! Bulk Richardson number
67      REAL rig(ngrid)  ! Gradient Richardson number
68      REAL fm(ngrid) ! stability function for momentum
69      REAL fh(ngrid) ! stability function for heat
70      REAL z1z0,z1z0t ! ratios z1/z0 and z1/z0T
71
72c phim = 1+betam*zeta   or   (1-bm*zeta)**am
73c phih = alphah + betah*zeta    or   alphah(1.-bh*zeta)**ah
74      REAL betam, betah, alphah, bm, bh, lambda
75c ah and am are assumed to be -0.25 and -0.5 respectively
76
77      REAL cdn(ngrid),chn(ngrid)  ! neutral momentum and heat drag coefficient
78      REAL pz0t        ! initial thermal roughness length. (local)
79      REAL ric         ! critical richardson number
80      REAL reynolds(ngrid)    ! reynolds number for UBL
81      REAL prandtl(ngrid)     ! prandtl number for UBL
82      REAL pz0tcomp(ngrid)     ! computed z0t
83      REAL ite
84      REAL residual
85      REAL zu2(ngrid)
86c-----------------------------------------------------------------------
87c   couche de surface:
88c   ------------------
89
90c Original formulation :
91
92      if(callrichsl .eq. .false.) then
93
94      DO ig=1,ngrid
95         z1=1.E+0 + pz(ig,1)/pz0(ig)
96         zcd0=karman/log(z1)
97         zcd0=zcd0*zcd0
98         pcdv(ig)=zcd0
99         pcdh(ig)=zcd0
100      ENDDO
101     
102!      print*,'old : cd,ch; ',pcdv,pcdh
103      else
104
105      reynolds(:)=0.
106
107c New formulation (AC) :
108
109c phim = 1+betam*zeta   or   (1-bm*zeta)**am
110c phih = alphah + betah*zeta    or   alphah(1.-bh*zeta)**ah
111c am=-0.25, ah=-0.5
112
113      pz0t = 0.     ! for the sake of simplicity
114      pz0tcomp(:) = 0.1*pz0(:)
115      rib(:)=0.
116
117      pcdv(:)=0.
118      pcdh(:)=0.
119
120c this formulation assumes alphah=1., implying betah=betam
121c We use Dyer et al. parameters, as they cover a broad range of Richardson numbers :
122      bm=16.            !UBL
123      bh=16.            !UBL
124      alphah=1.
125      betam=5.         !SBL
126      betah=5.         !SBL
127      lambda=(sqrt(bh/bm))/alphah
128      ric=betah/(betam**2)
129
130      DO ig=1,ngrid
131
132         ite=0.
133         residual=abs(pz0tcomp(ig)-pz0t)
134
135         do while((residual .gt. 0.01*pz0(ig)) .and.  (ite .lt. 10.))
136
137         pz0t=pz0tcomp(ig)
138
139         if ((pu(ig,1) .ne. 0.) .or. (pv(ig,1) .ne. 0.)) then
140
141c Classical Richardson number formulation
142
143c         rib(ig) = (pg/ph(ig,1))*pz(ig,1)*(ph(ig,1)-pts(ig))
144c     &           /(pu(ig,1)*pu(ig,1) + pv(ig,1)*pv(ig,1))
145
146c Richardson number formulation proposed by D.E. England et al. (1995)
147
148!         zu2=MAX(pu(ig,1)*pu(ig,1) + pv(ig,1)*pv(ig,1),0.25*wmax(ig)**2)
149!         zu2=pu(ig,1)*pu(ig,1) + pv(ig,1)*pv(ig,1)
150!         zu2=MAX(pu(ig,1)*pu(ig,1) + pv(ig,1)*pv(ig,1),wmax(ig)**2)
151       zu2(ig)=pu(ig,1)*pu(ig,1) + pv(ig,1)*pv(ig,1) + (0.5*wmax(ig))**2
152
153               ! we add the wmax to simulate
154               ! bulk Ri changes due to subgrid wind feeding the thermals
155
156!          rig(ig) = (pg/ph(ig,1))*((pz(ig,1)-pz0(ig))**2
157!     &         /(pz(ig,1)-pz0t))*(ph(ig,1)-pts(ig))
158!     &         /zu2
159
160          rib(ig) = (pg/ph(ig,1))
161!     &      *pz(ig,1)*pz0(ig)/sqrt(pz(ig,1)*pz0t)
162     &      *sqrt(pz(ig,1)*pz0(ig))
163     &      *(((log(pz(ig,1)/pz0(ig)))**2)/(log(pz(ig,1)/pz0t)))
164     &      *(ph(ig,1)-pts(ig))
165     &  /zu2(ig)
166
167         else
168         print*,'warning, infinite Richardson at surface'
169         print*,pu(ig,1),pv(ig,1)
170         rib(ig) = ric          ! traiter ce cas !
171         endif
172
173         z1z0=pz(ig,1)/pz0(ig)
174         z1z0t=pz(ig,1)/pz0t
175
176         cdn(ig)=karman/log(z1z0)
177         cdn(ig)=cdn(ig)*cdn(ig)
178         chn(ig)=cdn(ig)*log(z1z0)/log(z1z0t)
179
180c Stable case :
181      if (rib(ig) .gt. 0.) then
182c From D.E. England et al. (95)
183      prandtl(ig)=1.
184         if(rib(ig) .lt. ric) then
185c Assuming alphah=1. and bh=bm for stable conditions :
186            fm(ig)=((ric-rib(ig))/ric)**2
187            fh(ig)=((ric-rib(ig))/ric)**2
188         else
189c For Ri>Ric, we consider Ri->Infinity => no turbulent mixing at surface
190            fm(ig)=0.
191            fh(ig)=0.
192         endif
193c Unstable case :
194      else
195c From D.E. England et al. (95)
196         fm(ig)=sqrt(1.-lambda*bm*rib(ig))
197         fh(ig)=(1./alphah)*((1.-lambda*bh*rib(ig))**0.5)*
198     &                     (1.-lambda*bm*rib(ig))**0.25
199         prandtl(ig)=alphah*((1.-lambda*bm*rib(ig))**0.25)/
200     &             ((1.-lambda*bh*rib(ig))**0.5)
201      endif
202
203       reynolds(ig)=karman*sqrt(fm(ig))
204     &      *sqrt(zu2(ig))
205c     &      *sqrt(pu(ig,1)**2 + pv(ig,1)**2)
206     &       *pz0(ig)/(log(z1z0)*nu)
207       pz0tcomp(ig)=pz0(ig)*exp(-karman*7.3*
208     &              (reynolds(ig)**0.25)*(prandtl(ig)**0.5))
209
210         
211      residual = abs(pz0t-pz0tcomp(ig))
212      ite = ite+1
213!      print*, "iteration nnumber, residual",ite,residual
214
215      enddo  ! of while
216
217          pz0t=0.
218
219c Drag computation :
220
221         pcdv(ig)=cdn(ig)*fm(ig)
222         pcdh(ig)=chn(ig)*fh(ig)
223       
224      ENDDO
225!
226!      print*,'new : cd,ch; ',pcdv,pcdh
227
228! Some useful diagnostics :
229
230!       call WRITEDIAGFI(ngrid,'RiB',
231!     &              'Bulk Richardson nb','no units',
232!     &                         2,rib)
233!                call WRITEDIAGFI(ngrid,'RiG',
234!     &              'Grad Richardson nb','no units',
235!     &                         2,rig)
236!        call WRITEDIAGFI(ngrid,'Pr',
237!     &              'Prandtl nb','no units',
238!     &                         0,prandtl)
239!       call WRITEDIAGFI(ngrid,'Re',
240!     &              'Reynolds nb','no units',
241!     &                         0,reynolds)
242!        call WRITEDIAGFI(ngrid,'z0tcomp',
243!     &              'computed z0t','m',
244!     &                         2,pz0tcomp)
245
246
247      endif !of if call richardson surface layer
248
249      RETURN
250      END
Note: See TracBrowser for help on using the repository browser.