source: LMDZ6/branches/PBLSURF_GPUPORT/libf/phylmd/coef_diff_turb_mod.f90 @ 5876

Last change on this file since 5876 was 5876, checked in by yann meurdesoif, 5 weeks ago

GPU port of cdrag + call_atke + coef_diff_turb

YM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.2 KB
Line 
1!
2MODULE coef_diff_turb_mod
3!
4! This module contains some procedures for calculation of the coefficients of the
5! turbulent diffusion in the atmosphere and coefficients for turbulent diffusion
6! at surface(cdrag)
7!
8    IMPLICIT NONE
9
10CONTAINS
11!
12!****************************************************************************************
13!
14  SUBROUTINE coef_diff_turb(dtime, nsrf, knon, ni, &
15       ypaprs, ypplay, yu, yv, yq, yt, yts, yqsurf, ycdragm, &
16       ycoefm, ycoefh ,yq2, yeps, ydrgpro)
17!$gpum horizontal knon
18    USE dimphy, ONLY : klev
19    USE mod_grid_phy_lmdz, ONLY: klon_glo
20    USE indice_sol_mod
21    USE print_control_mod, ONLY: prt_level, lunout
22    USE yomcst_mod_h
23    USE yoethf_mod_h
24    USE compbl_mod_h
25    USE yamada4_mod, ONLY : yamada4
26    USE ustarhb_mod, ONLY : ustarhb
27    USE vdif_kcay_mod, ONLY : vdif_kcay
28    USE coefkzmin_mod, ONLY : coefkzmin
29    USE clesphys_mod_h, ONLY : ksta, ksta_ter, ok_kzmin
30
31!
32! Calculate coefficients(ycoefm, ycoefh) for turbulent diffusion in the
33! atmosphere
34! NB! No values are calculated between surface and the first model layer.
35!     ycoefm(:,1) and ycoefh(:,1) are not valid !!!
36!
37!
38! Input arguments
39!****************************************************************************************
40    REAL, INTENT(IN)                           :: dtime
41    INTEGER, INTENT(IN)                        :: nsrf, knon
42    INTEGER, DIMENSION(knon), INTENT(IN)       :: ni
43    REAL, DIMENSION(knon,klev+1), INTENT(IN)   :: ypaprs
44    REAL, DIMENSION(knon,klev), INTENT(IN)     :: ypplay
45    REAL, DIMENSION(knon,klev), INTENT(IN)     :: yu, yv
46    REAL, DIMENSION(knon,klev), INTENT(IN)     :: yq, yt
47    REAL, DIMENSION(knon), INTENT(IN)          :: yts, yqsurf
48    REAL, DIMENSION(knon), INTENT(IN)          :: ycdragm
49!FC
50    REAL, DIMENSION(knon,klev), INTENT(IN)     :: ydrgpro
51
52
53! InOutput arguments
54!****************************************************************************************
55    REAL, DIMENSION(knon,klev+1), INTENT(INOUT):: yq2
56
57! Output arguments
58!****************************************************************************************
59    REAL, DIMENSION(knon,klev+1), INTENT(OUT)  :: yeps
60    REAL, DIMENSION(knon,klev), INTENT(OUT)    :: ycoefh
61    REAL, DIMENSION(knon,klev), INTENT(OUT)    :: ycoefm
62
63! Other local variables
64!****************************************************************************************
65    INTEGER                                    :: k, i, j
66    REAL, DIMENSION(knon,klev)                 :: ycoefm0, ycoefh0, yzlay, yteta
67    REAL, DIMENSION(knon,klev+1)               :: yzlev, q2diag, ykmm, ykmn, ykmq
68    REAL, DIMENSION(knon)                      :: yustar
69
70    ykmm = 0 !ym missing init
71    ykmn = 0 !ym missing init
72    ykmq = 0 !ym missing init
73   
74    yeps(:,:) = 0.
75
76!****************************************************************************************   
77! Calcul de coefficients de diffusion turbulent de l'atmosphere :
78! ycoefm(:,2:klev), ycoefh(:,2:klev)
79!
80!****************************************************************************************   
81
82    CALL coefkz(nsrf, knon, ypaprs, ypplay, &
83         ksta, ksta_ter, &
84         yts, yu, yv, yt, yq, &
85         yqsurf, &
86         ycoefm, ycoefh)
87 
88!****************************************************************************************
89! Eventuelle recalcule des coeffeicients de diffusion turbulent de l'atmosphere :
90! ycoefm(:,2:klev), ycoefh(:,2:klev)
91!
92!****************************************************************************************
93
94    IF (iflag_pbl.EQ.1) THEN
95       CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, &
96            ycoefm0, ycoefh0)
97
98       DO k = 2, klev
99          DO i = 1, knon
100             ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k))
101             ycoefh(i,k) = MAX(ycoefh(i,k),ycoefh0(i,k))
102          ENDDO
103       ENDDO
104    ENDIF
105
106 
107!**************************************************************************************** 
108! Calcul d'une diffusion minimale pour les conditions tres stables
109!
110!****************************************************************************************
111    IF (ok_kzmin) THEN
112       CALL coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm, &
113            ycoefm0,ycoefh0)
114       
115       DO k = 2, klev
116          DO i = 1, knon
117             ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k))
118             ycoefh(i,k) = MAX(ycoefh(i,k),ycoefh0(i,k))
119          ENDDO
120       ENDDO
121       
122    ENDIF
123
124 
125!****************************************************************************************
126! MELLOR ET YAMADA adapte a Mars Richard Fournier et Frederic Hourdin
127!
128!****************************************************************************************
129
130    IF (iflag_pbl.GE.3) THEN
131
132       yzlay(1:knon,1)= &
133            RD*yt(1:knon,1)/(0.5*(ypaprs(1:knon,1)+ypplay(1:knon,1))) &
134            *(ypaprs(1:knon,1)-ypplay(1:knon,1))/RG
135       DO k=2,klev
136          DO i = 1, knon
137             yzlay(i,k)= &
138                  yzlay(i,k-1)+RD*0.5*(yt(i,k-1)+yt(i,k)) &
139                  /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG
140          END DO
141       END DO
142
143       DO k=1,klev
144          DO i = 1, knon
145             yteta(i,k)= &
146                  yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**RKAPPA &
147                  *(1.+0.61*yq(i,k))
148          END DO
149       END DO
150
151       yzlev(1:knon,1)=0.
152       yzlev(1:knon,klev+1)=2.*yzlay(1:knon,klev)-yzlay(1:knon,klev-1)
153       DO k=2,klev
154          DO i = 1, knon
155             yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1))
156          END DO
157       END DO
158
159!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
160!!$! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un
161!!$! bug sur les coefficients de surface :
162!!$!          ycdragh(1:knon) = ycoefm(1:knon,1)
163!!$!          ycdragm(1:knon) = ycoefh(1:knon,1)
164!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
165
166       ! Normalement, on peut passer dans les codes avec knon=0
167       ! Mais ca fait planter le replay.
168       ! En attendant une réécriture, on a joute des if (Fredho)
169
170       if ( klon_glo>1 .or. (klon_glo==1 .and. knon==1) ) then
171          CALL ustarhb(knon,klev,knon,yu,yv,ycdragm, yustar)
172       endif
173     
174       IF (prt_level > 9) THEN
175          WRITE(lunout,*) 'USTAR = ',(yustar(i),i=1,knon)
176       ENDIF
177         
178!   iflag_pbl peut etre utilise comme longuer de melange
179       IF (iflag_pbl.GE.31) THEN
180
181          if ( klon_glo>1 .or. (klon_glo==1 .and. knon==1) ) then
182          CALL vdif_kcay(knon,klev,knon,dtime,RG,RD,ypaprs,yt, &
183               yzlev,yzlay,yu,yv,yteta, &
184               ycdragm,yq2,q2diag,ykmm,ykmn,yustar, &
185               iflag_pbl)
186          endif
187       ELSE IF (iflag_pbl<20) THEN
188          CALL yamada4(ni,nsrf,knon,dtime,RG,RD,ypaprs,yt, &
189               yzlev,yzlay,yu,yv,yteta, &
190               ycdragm,yq2,yeps,ykmm,ykmn,ykmq,yustar, &
191               iflag_pbl,ydrgpro)
192!FC
193       ENDIF
194       
195       ycoefm(1:knon,2:klev)=ykmm(1:knon,2:klev)
196       ycoefh(1:knon,2:klev)=ykmn(1:knon,2:klev)
197               
198    ELSE
199       ! No TKE for Standard Physics
200       yq2=0.
201    ENDIF !(iflag_pbl.ge.3)
202
203  END SUBROUTINE coef_diff_turb
204!
205!****************************************************************************************
206!
207  SUBROUTINE coefkz(nsrf, knon, paprs, pplay, &
208       ksta, ksta_ter, &
209       ts, &
210       u,v,t,q, &
211       qsurf, &
212       pcfm, pcfh)
213!$gpum horizontal knon   
214    USE yomcst_mod_h
215    USE dimphy, ONLY : klev
216    USE indice_sol_mod
217    USE print_control_mod, ONLY: prt_level, lunout
218    USE yoethf_mod_h
219    USE compbl_mod_h
220
221!======================================================================
222! Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 19930922
223!           (une version strictement identique a l'ancien modele)
224! Objet: calculer le coefficient du frottement du sol (Cdrag) et les
225!        coefficients d'echange turbulent dans l'atmosphere.
226! Arguments:
227! nsrf-----input-I- indicateur de la nature du sol
228! knon-----input-I- nombre de points a traiter
229! paprs----input-R- pregssion a chaque intercouche (en Pa)
230! pplay----input-R- pression au milieu de chaque couche (en Pa)
231! ts-------input-R- temperature du sol (en Kelvin)
232! u--------input-R- vitesse u
233! v--------input-R- vitesse v
234! t--------input-R- temperature (K)
235! q--------input-R- vapeur d'eau (kg/kg)
236!
237! pcfm-----output-R- coefficients a calculer (vitesse)
238! pcfh-----output-R- coefficients a calculer (chaleur et humidite)
239!======================================================================
240    INCLUDE "FCTTRE.h"
241!
242! Arguments:
243!
244    INTEGER, INTENT(IN)                      :: knon, nsrf
245    REAL, INTENT(IN)                         :: ksta, ksta_ter
246    REAL, DIMENSION(knon), INTENT(IN)        :: ts
247    REAL, DIMENSION(knon,klev+1), INTENT(IN) :: paprs
248    REAL, DIMENSION(knon,klev), INTENT(IN)   :: pplay
249    REAL, DIMENSION(knon,klev), INTENT(IN)   :: u, v, t, q
250    REAL, DIMENSION(knon), INTENT(IN)        :: qsurf
251
252    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: pcfm, pcfh
253
254!
255! Local variables:
256!
257    INTEGER, DIMENSION(knon)    :: itop ! numero de couche du sommet de la couche limite
258!
259! Quelques constantes et options:
260!
261    REAL, PARAMETER :: cepdu2=0.1*0.1
262    REAL, PARAMETER :: CKAP=0.4
263    REAL, PARAMETER :: cb=5.0
264    REAL, PARAMETER :: cc=5.0
265    REAL, PARAMETER :: cd=5.0
266    REAL, PARAMETER :: clam=160.0
267    REAL, PARAMETER :: ratqs=0.05 ! largeur de distribution de vapeur d'eau
268    LOGICAL, PARAMETER :: richum=.TRUE. ! utilise le nombre de Richardson humide
269    REAL, PARAMETER :: ric=0.4 ! nombre de Richardson critique
270    REAL, PARAMETER :: prandtl=0.4
271    REAL kstable ! diffusion minimale (situation stable)
272    ! GKtest
273    ! PARAMETER (kstable=1.0e-10)
274!IM: 261103     REAL kstable_ter, kstable_sinon
275!IM: 211003 cf GK   PARAMETER (kstable_ter = 1.0e-6)
276!IM: 261103     PARAMETER (kstable_ter = 1.0e-8)
277!IM: 261103   PARAMETER (kstable_ter = 1.0e-10)
278!IM: 261103   PARAMETER (kstable_sinon = 1.0e-10)
279    ! fin GKtest
280    REAL, PARAMETER :: mixlen=35.0 ! constante controlant longueur de melange
281    INTEGER isommet ! le sommet de la couche limite
282    LOGICAL, PARAMETER :: tvirtu=.TRUE. ! calculer Ri d'une maniere plus performante
283    LOGICAL, PARAMETER :: opt_ec=.FALSE.! formule du Centre Europeen dans l'atmosphere
284
285!
286! Variables locales:
287    INTEGER i, k !IM 120704
288    REAL zgeop(knon,klev)
289    REAL zmgeom(knon)
290    REAL zri(knon)
291    REAL zl2(knon)
292    REAL zdphi, zdu2, ztvd, ztvu, zcdn
293    REAL zscf
294    REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs
295    REAL z2geomf, zalh2, zalm2, zscfh, zscfm
296    REAL, PARAMETER :: t_coup=273.15
297    LOGICAL, PARAMETER :: check=.FALSE.
298!
299! contre-gradient pour la chaleur sensible: Kelvin/metre
300    REAL gamt(2:klev)
301
302!
303! Fonctions thermodynamiques et fonctions d'instabilite
304    REAL fsta, fins, x
305
306    fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))
307    fins(x) = SQRT(1.0-18.0*x)
308
309    isommet=klev
310     
311!
312! Initialiser les sorties
313!
314    DO k = 1, klev
315       DO i = 1, knon
316          pcfm(i,k) = 0.0
317          pcfh(i,k) = 0.0
318       ENDDO
319    ENDDO
320    DO i = 1, knon
321       itop(i) = 0
322    ENDDO
323   
324!
325! Prescrire la valeur de contre-gradient
326!
327    IF (iflag_pbl.EQ.1) THEN
328       DO k = 3, klev
329          gamt(k) = -1.0E-03
330       ENDDO
331       gamt(2) = -2.5E-03
332    ELSE
333       DO k = 2, klev
334          gamt(k) = 0.0
335       ENDDO
336    ENDIF
337!IM cf JLD/ GKtest
338    IF ( nsrf .NE. is_oce ) THEN
339!IM 261103     kstable = kstable_ter
340       kstable = ksta_ter
341    ELSE
342!IM 261103     kstable = kstable_sinon
343       kstable = ksta
344    ENDIF
345!IM cf JLD/ GKtest fin
346
347!
348! Calculer les geopotentiels de chaque couche
349!
350    DO i = 1, knon
351       zgeop(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) &
352            * (paprs(i,1)-pplay(i,1))
353    ENDDO
354    DO k = 2, klev
355       DO i = 1, knon
356          zgeop(i,k) = zgeop(i,k-1) &
357               + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) &
358               * (pplay(i,k-1)-pplay(i,k))
359       ENDDO
360    ENDDO
361
362!
363! Calculer les coefficients turbulents dans l'atmosphere
364!
365    DO i = 1, knon
366       itop(i) = isommet
367    ENDDO
368
369
370    DO k = 2, isommet
371       DO i = 1, knon
372          zdu2=MAX(cepdu2,(u(i,k)-u(i,k-1))**2 &
373               +(v(i,k)-v(i,k-1))**2)
374          zmgeom(i)=zgeop(i,k)-zgeop(i,k-1)
375          zdphi =zmgeom(i) / 2.0
376          zt = (t(i,k)+t(i,k-1)) * 0.5
377          zq = (q(i,k)+q(i,k-1)) * 0.5
378
379!
380! Calculer Qs et dQs/dT:
381!
382          IF (thermcep) THEN
383             zdelta = MAX(0.,SIGN(1.,RTT-zt))
384             zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta) &
385                  + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta
386             zqs = R2ES * FOEEW(zt,zdelta) / pplay(i,k)
387             zqs = MIN(0.5,zqs)
388             zcor = 1./(1.-RETV*zqs)
389             zqs = zqs*zcor
390             zdqs = FOEDE(zt,zdelta,zcvm5,zqs,zcor)
391          ELSE
392             IF (zt .LT. t_coup) THEN
393                zqs = qsats(zt) / pplay(i,k)
394                zdqs = dqsats(zt,zqs)
395             ELSE
396                zqs = qsatl(zt) / pplay(i,k)
397                zdqs = dqsatl(zt,zqs)
398             ENDIF
399          ENDIF
400!
401!           calculer la fraction nuageuse (processus humide):
402!
403          if (zq /= 0.) then
404             zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
405          else
406             zfr = 0.
407          end if
408          zfr = MAX(0.0,MIN(1.0,zfr))
409          IF (.NOT.richum) zfr = 0.0
410!
411!           calculer le nombre de Richardson:
412!
413          IF (tvirtu) THEN
414             ztvd =( t(i,k) &
415                  + zdphi/RCPD/(1.+RVTMP2*zq) &
416                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
417                  )*(1.+RETV*q(i,k))
418             ztvu =( t(i,k-1) &
419                  - zdphi/RCPD/(1.+RVTMP2*zq) &
420                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
421                  )*(1.+RETV*q(i,k-1))
422             zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
423             zri(i) = zri(i) &
424                  + zmgeom(i)*zmgeom(i)/RG*gamt(k) &
425                  *(paprs(i,k)/101325.0)**RKAPPA &
426                  /(zdu2*0.5*(ztvd+ztvu))
427
428          ELSE ! calcul de Ridchardson compatible LMD5
429
430             zri(i) =(RCPD*(t(i,k)-t(i,k-1)) &
431                  -RD*0.5*(t(i,k)+t(i,k-1))/paprs(i,k) &
432                  *(pplay(i,k)-pplay(i,k-1)) &
433                  )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i,k-1)+t(i,k)))
434             zri(i) = zri(i) + &
435                  zmgeom(i)*zmgeom(i)*gamt(k)/RG &
436                  *(paprs(i,k)/101325.0)**RKAPPA &
437                  /(zdu2*0.5*(t(i,k-1)+t(i,k)))
438          ENDIF
439!
440!           finalement, les coefficients d'echange sont obtenus:
441!
442          zcdn=SQRT(zdu2) / zmgeom(i) * RG
443
444          IF (opt_ec) THEN
445             z2geomf=zgeop(i,k-1)+zgeop(i,k)
446             zalm2=(0.5*ckap/RG*z2geomf &
447                  /(1.+0.5*ckap/rg/clam*z2geomf))**2
448             zalh2=(0.5*ckap/rg*z2geomf &
449                  /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2
450             IF (zri(i).LT.0.0) THEN  ! situation instable
451                zscf = ((zgeop(i,k)/zgeop(i,k-1))**(1./3.)-1.)**3 &
452                     / (zmgeom(i)/RG)**3 / (zgeop(i,k-1)/RG)
453                zscf = SQRT(-zri(i)*zscf)
454                zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
455                zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
456                pcfm(i,k)=zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)
457                pcfh(i,k)=zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)
458             ELSE ! situation stable
459                zscf=SQRT(1.+cd*zri(i))
460                pcfm(i,k)=zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)
461                pcfh(i,k)=zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)
462             ENDIF
463          ELSE
464             zl2(i)=(mixlen*MAX(0.0,(paprs(i,k)-paprs(i,itop(i)+1)) &
465                  /(paprs(i,2)-paprs(i,itop(i)+1)) ))**2
466             pcfm(i,k)=SQRT(MAX(zcdn*zcdn*(ric-zri(i))/ric, kstable))
467             pcfm(i,k)= zl2(i)* pcfm(i,k)
468             pcfh(i,k) = pcfm(i,k) /prandtl ! h et m different
469          ENDIF
470       ENDDO
471    ENDDO
472
473!
474! Au-dela du sommet, pas de diffusion turbulente:
475!
476    DO i = 1, knon
477       IF (itop(i)+1 .LE. klev) THEN
478          DO k = itop(i)+1, klev
479             pcfh(i,k) = 0.0
480             pcfm(i,k) = 0.0
481          ENDDO
482       ENDIF
483    ENDDO
484     
485  END SUBROUTINE coefkz
486!
487!****************************************************************************************
488!
489  SUBROUTINE coefkz2(nsrf, knon, paprs, pplay,t, &
490       pcfm, pcfh)
491!$gpum horizontal knon
492    USE yomcst_mod_h
493    USE dimphy, ONLY : klev
494    USE indice_sol_mod
495
496!======================================================================
497! J'introduit un peu de diffusion sauf dans les endroits
498! ou une forte inversion est presente
499! On peut dire qu'il represente la convection peu profonde
500!
501! Arguments:
502! nsrf-----input-I- indicateur de la nature du sol
503! knon-----input-I- nombre de points a traiter
504! paprs----input-R- pression a chaque intercouche (en Pa)
505! pplay----input-R- pression au milieu de chaque couche (en Pa)
506! t--------input-R- temperature (K)
507!
508! pcfm-----output-R- coefficients a calculer (vitesse)
509! pcfh-----output-R- coefficients a calculer (chaleur et humidite)
510!======================================================================
511!
512! Arguments:
513!
514    INTEGER, INTENT(IN)                       :: knon, nsrf
515    REAL, DIMENSION(knon, klev+1), INTENT(IN) ::  paprs
516    REAL, DIMENSION(knon, klev), INTENT(IN)   ::  pplay
517    REAL, DIMENSION(knon, klev), INTENT(IN)   ::  t
518
519    REAL, DIMENSION(knon, klev), INTENT(OUT)  :: pcfm, pcfh
520!
521! Quelques constantes et options:
522!
523    REAL, PARAMETER :: prandtl=0.4
524    REAL, PARAMETER :: kstable=0.002
525!   REAL, PARAMETER :: kstable=0.001
526    REAL, PARAMETER :: mixlen=35.0 ! constante controlant longueur de melange
527    REAL, PARAMETER :: seuil=-0.02 ! au-dela l'inversion est consideree trop faible
528!    PARAMETER (seuil=-0.04)
529!    PARAMETER (seuil=-0.06)
530!    PARAMETER (seuil=-0.09)
531
532!
533! Variables locales:
534!
535    INTEGER i, k, invb(knon)
536    REAL zl2(knon)
537    REAL zdthmin(knon), zdthdp
538
539
540!
541! Initialiser les sorties
542!
543    DO k = 1, klev
544       DO i = 1, knon
545          pcfm(i,k) = 0.0
546          pcfh(i,k) = 0.0
547       ENDDO
548    ENDDO
549
550!
551! Chercher la zone d'inversion forte
552!
553    DO i = 1, knon
554       invb(i) = klev
555       zdthmin(i)=0.0
556    ENDDO
557    DO k = 2, klev/2-1
558       DO i = 1, knon
559          zdthdp = (t(i,k)-t(i,k+1))/(pplay(i,k)-pplay(i,k+1)) &
560               - RD * 0.5*(t(i,k)+t(i,k+1))/RCPD/paprs(i,k+1)
561          zdthdp = zdthdp * 100.0
562          IF (pplay(i,k).GT.0.8*paprs(i,1) .AND. &
563               zdthdp.LT.zdthmin(i) ) THEN
564             zdthmin(i) = zdthdp
565             invb(i) = k
566          ENDIF
567       ENDDO
568    ENDDO
569
570!
571! Introduire une diffusion:
572!
573    IF ( nsrf.EQ.is_oce ) THEN
574       DO k = 2, klev
575          DO i = 1, knon
576!IM cf FH/GK   IF ( (nsrf.NE.is_oce) .OR.  ! si ce n'est pas sur l'ocean
577!IM cf FH/GK  .     (invb(i).EQ.klev) .OR. ! s'il n'y a pas d'inversion
578      !IM cf JLD/ GKtest TERkz2
579      ! IF ( (nsrf.EQ.is_ter) .OR.  ! si on est sur la terre
580      ! fin GKtest
581
582
583! s'il n'y a pas d'inversion ou si l'inversion est trop faible
584!          IF ( (nsrf.EQ.is_oce) .AND. &
585             IF ( (invb(i).EQ.klev) .OR. (zdthmin(i).GT.seuil) ) THEN
586                zl2(i)=(mixlen*MAX(0.0,(paprs(i,k)-paprs(i,klev+1)) &
587                     /(paprs(i,2)-paprs(i,klev+1)) ))**2
588                pcfm(i,k)= zl2(i)* kstable
589                pcfh(i,k) = pcfm(i,k) /prandtl ! h et m different
590             ENDIF
591          ENDDO
592       ENDDO
593    ENDIF
594
595  END SUBROUTINE coefkz2
596!
597!****************************************************************************************
598!
599END MODULE coef_diff_turb_mod
Note: See TracBrowser for help on using the repository browser.