source: LMDZ6/trunk/libf/phylmd/coef_diff_turb_mod.F90 @ 4706

Last change on this file since 4706 was 4657, checked in by fhourdin, 15 months ago

Poursuite nettoyage replauisation

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