source: LMDZ6/trunk/libf/phylmd/clc_core_cp_mod.f90

Last change on this file was 6048, checked in by fhourdin, 6 weeks ago

Renommage des nom de fichiers incluant des modules

File size: 6.3 KB
Line 
1MODULE clc_core_cp_mod
2!
3! $Id$
4!
5CONTAINS
6
7      SUBROUTINE clc_core_cp(du, dt, dq, t1, q1, &
8                                zu, zt, zq, &
9                                        P,&
10                                n_it, mixte, &
11                         coeffs, rugosm, rugosh)
12
13      IMPLICIT NONE
14
15
16  !  INTEGER     :: i,j,k
17  REAL, INTENT(IN) :: du,dt,dq,t1,q1
18  REAL, INTENT(IN) :: zu,zt,zq, P
19  INTEGER, INTENT(IN):: n_it
20  LOGICAL, INTENT(IN) :: mixte
21  REAL, DIMENSION(3), INTENT(OUT) :: coeffs
22  real, intent(out) :: rugosm
23  real, intent(out) :: rugosh
24
25
26!  REAL :: du,dt,t1,dq,q1
27  REAL :: dt_u, dq_u
28
29
30
31  REAL :: cd, ch, cd_rt, cd_n10, ce_n10, ce,&
32       u_N, X,&
33       rho,cpa,le
34
35  REAL :: usr,tsr,qsr
36  REAL, DIMENSION(3) :: zeta                           ! dans l'ordre: it courant, it precedente, var
37  REAL, DIMENSION(2,3) :: psi
38  REAL, PARAMETER :: g = 9.81, k=.41, sqrt_k = .640312 !avec g= gravité, k = cste von karman, sqrt_k = racine(k)
39  REAL :: logzu_10,logzt_10,logzq_10,logzt_zu,logzq_zu,&
40       u,cd_n10_rt,ch_n10_rt,ch_n10,chi,z_0m,z_0h,tv
41  INTEGER :: i,j,m1,m2,m3,m4,m5
42
43
44  REAL :: phih,phid,phie
45
46 
47  REAL, parameter :: alpha=2.7e-3,&           !alpha = a1 ds formulation smith
48       beta = 1.42e-4,&                       !beta = a2 ds la formulation smith
49       gamma = 7.64e-5,&        !Large and yaeger 2006              !gamma = a3 ds formulation smith
50!       gamma = 13.09e-3,&         !Large and yaeger 2004
51       q0 = 1.64474                           ! q0 dzfinis mais pas reutilisée ds la suite ??
52
53  REAL, dimension(3) :: z
54  integer, dimension(2) :: tmp_shape
55  z = [zu, zt, zq]
56 
57
58
59  logzu_10 = LOG(zu/10.)
60  logzt_10 = LOG(zt/10.)
61  logzq_10 = LOG(zq/10.)
62  logzt_zu = logzt_10 - logzu_10
63  logzq_zu = logzq_10 - logzu_10
64
65  cpa = 1004.67                               !!! pas reutilise ds nvelle formulation...
66
67  tv = t1 * (1+.608*q1)                       !!!!! tv pas reutiliser ds nvelle formulation...
68  rho = p / (287.1 * t1 * (1.+.61*q1))        !!!! rho pas reutiliser ds nvelle formulation....
69
70
71  le = (2.501-.00237*(t1-273.15-dt))*1.e6     !!!!!! le pas reutiliser ds nvelle formulation....
72 
73  u = max(du,.5)                              !!!! u = vitesse du vent 1 er niveau
74  u_N = u                                     !!!!!!! u_N utilisée pour le calcul des premier calcul...
75 
76
77  !!!!! initialisation des parametres et premier calcul de z_0 cd et ch
78
79
80  if (mixte) then
81     z_0m = 1.e-4                             !!!!! pour l'initialisation on fixe z_0 a 10-4
82     cd_n10 = k**2 / (log(10/z_0m))**2        !!!!! on calcul ensuite cd a 10 m d'après smith
83     cd_n10_rt = sqrt(cd_n10)   
84  else
85! Large and yaeger 2006
86     cd_n10 = alpha / u_n + beta + gamma * u_n !!!!! calcul de cd pour core pur
87! Large and yaeger 2004
88!     cd_n10 = 1E-3 * (2.7/U_n + 0.142 + U_n/13.09)
89     cd_n10_rt = sqrt(cd_n10)                  !!!!!!
90     z_0m = 10. * exp(-k/cd_n10_rt)            !!!!!!! on calcul le premier z_0
91  endif
92
93
94  if ( dt .gt. 0. ) then
95     ch_n10 = 0.018 * cd_n10_rt                !!!!!!! si regime stable calcul du ch
96!     z_0h = 10. * exp(-k/ch_n10)
97  else
98     ch_n10 = 0.0327 * cd_n10_rt               !!!!!!! si regime instable calcul du ch
99!     z_0h = 10. * exp(-k/ch_n10)
100  endif
101
102  ce_n10 = 3.46e-2 *cd_n10_rt                  !!!!!! calcul ensuite de ce
103
104
105  dt_u = dt                                    !!! def
106  dq_u = dq                                    !!! def
107
108  cd = cd_n10                                  !!! def
109  ch = ch_n10                                  !!! def
110  ce = ce_n10                                  !!! def
111
112  cd_rt = sqrt(cd)                             !!! def
113
114  !  open(7,file="err_rel.dat",position="append")
115
116
117!!!!!!!!! début des itérations....
118
119  do i = 1,n_it
120
121     usr = cd_rt * u
122     tsr = ch / cd_rt *  dt_u
123     qsr = ce / cd_rt * dq_u
124
125
126     zeta = k*g / (usr**2) * tsr / t1&
127          * z
128
129     zeta = sign( min(abs(zeta),10.0), zeta )
130
131
132!!!! calcul du zeta pour connaitre le signe et donc en deduire le regime...
133
134
135
136
137     IF ( zeta(1) .GT. 0 ) THEN !!! si regime stable alors valeurs pr chi et psi
138
139        chi = 0.018
140
141
142        psi(1,1) = -5.*zeta(1)
143        psi(2,1) = psi(1,1)
144
145     ELSE !!!!! si regime instable alors valeurs pr psi et chi !!!
146
147        chi = 0.0327
148
149        X = sqrt( sqrt( 1-16.*zeta(1) ))
150        psi(1,1) =  3.1415695 / 2 + 2 * LOG( ( 1 + X ) / 2 ) + LOG( (1 + X**2) / 2 ) - 2*ATAN(X)
151        psi(2,1) =  2.*LOG( (1 + X**2) / 2 )
152
153     END IF
154
155     do j =2,3
156        IF ( zeta(j) .GT. 0 ) THEN
157           psi(1,j) = -5.*zeta(j)
158           psi(2,j) = psi(1,1)
159
160        ELSE
161           X = sqrt( sqrt( 1-16.*zeta(j) ))
162           psi(1,j) =  3.1415695 / 2 + 2 * LOG( ( 1 + X ) / 2 ) + LOG( (1 + X**2) / 2 ) - 2*ATAN(X)
163           psi(2,j) =  2.*LOG( (1 + X**2) / 2 )
164
165        END IF
166     enddo
167
168
169     dt_u = dt - tsr / k * &
170          ( logzt_zu + psi(2,1) - psi(2,2) )
171
172     dq_u = dq - qsr / k * &
173          ( logzq_zu + psi(2,1) - psi(2,3) )
174
175
176
177     u_N = u / ( 1 + cd_n10_rt / k * ( logzu_10 - psi(1,1)) )
178
179     if (mixte) then
180        z_0m=0.018*usr**2/9.81 + 0.11*14e-6 / (usr)
181!        z_0h=(0.11*14e-6 / (usr)) + 1.4e-5
182        cd_n10 = k**2 / (log(10/z_0m))**2
183        cd_n10_rt = sqrt(cd_n10)
184!        ch_n10 = k**2 / ((log(10/z_0m))*(log(10/z_0h)))
185!        ch_n10_rt = sqrt(ch_n10)
186        ch_n10 = 1.e-3
187     else
188! Large and yaeger 2006
189        cd_n10 = alpha / u_n + beta + gamma * u_n !!!!! calcul de cd pour core pur
190! Large and yaeger 2004
191!        cd_n10 = 1E-3 * (2.7/U_n + 0.142 + U_n/13.09)
192        !        cd_n10_dun = -alpha / u_n**2 + gamma
193        cd_n10_rt = sqrt(cd_n10)
194        z_0m = 10. * exp(-k/cd_n10_rt) !!!!! c'est sur cette ligne la qu'il y a un bug... ou sur la ligne du u_N
195!        ch_n10 = chi * cd_n10_rt
196!        z_0h = 10. * exp(-k/ch_n10)
197!        ch_n10_rt = sqrt(ch_n10)
198        ch_n10 = chi * cd_n10_rt
199     endif
200
201
202     ce_n10 = 3.46e-2*cd_n10_rt
203
204
205
206     phid = 1+cd_n10_rt/k * (logzu_10 - psi(1,1))
207     phih = 1+chi/k * (logzu_10 - psi(2,1))
208     phie = 1+3.46e-2/k * (logzu_10 - psi(2,1))
209
210
211     cd_rt = cd_n10_rt / abs( phid )
212     ch = ch_n10 / ( phih * phid )
213     ce = ce_n10 / ( phie * phid )
214
215     cd=cd_rt**2
216
217  END DO
218
219  usr = cd_rt * u
220  tsr = ch / cd_rt *  dt_u
221  qsr = ce / cd_rt * dq_u
222
223
224  ! coeffs(:,m) = [ &
225  !      rho * usr**2,&
226  !      rho * cpa * usr *tsr,&
227  !      rho * le * usr *qsr]
228
229  coeffs = [ cd_rt**2, ch , ce ]
230
231  rugosm =  z_0m
232  rugosh =  z_0h
233
234      RETURN
235      END subroutine clc_core_cp
236
237END MODULE clc_core_cp_mod
238
Note: See TracBrowser for help on using the repository browser.