Changeset 2828


Ignore:
Timestamp:
Mar 20, 2017, 6:05:17 PM (7 years ago)
Author:
fhourdin
Message:

Modifications de yamada4 issues de la these d'Etienne Vignon (sous

l'otpion new_yamada4=y) :
1/ schema numerique inspire de celui de MAR
2/ viscosite moleculaire ajoute pour les cas ou la diffusion

turbulente s'effondre.

3/ Desactivation de la modification Holtzlag Boville pour les

couches limites tres stables.

4/ longueur de melange nulle par defaut.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/yamada4.F90

    r2817 r2828  
    120120  DATA first, ipas/.FALSE., 0/
    121121  !$OMP THREADPRIVATE( first,ipas)
    122   LOGICAL hboville
     122  LOGICAL,SAVE :: hboville=.TRUE.
     123  REAL,SAVE :: viscom,viscoh
     124  !$OMP THREADPRIVATE( hboville,viscom,viscoh)
    123125  INTEGER ig, k
    124126  REAL ri, zrif, zalpha, zsm, zsn
     
    130132  REAL zz(klon, klev+1)
    131133  INTEGER iter
    132   REAL dissip(klon,klev), tkeprov, shear(klon,klev), buoy(klon,klev)
     134  REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev)
    133135  REAL,SAVE :: ric0,ric,rifc, b1, kap
    134136  !$OMP THREADPRIVATE(ric0,ric,rifc,b1,kap)
     
    141143  INTEGER, SAVE :: yamada4_num
    142144  !$OMP THREADPRIVATE(new_yamada4,yamada4_num)
    143   REAL, SAVE :: yun,ydeux,b1leff
     145  REAL, SAVE :: yun,ydeux,disseff
    144146  !$OMP THREADPRIVATE(yun,ydeux)
    145147  REAL frif, falpha, fsm
     
    163165    new_yamada4=.false.
    164166    CALL getin_p('new_yamada4',new_yamada4)
    165     yamada4_num=0
    166     CALL getin_p('yamada4_num',yamada4_num)
    167 ! Pour garantir la continuite dans la mise au point de CMIP6.
    168 ! Eliminer l'option new_yamada4 des le printemps 2016
     167
    169168    IF (new_yamada4) THEN
     169! Corrections et reglages issus du travail de these d'Etienne Vignon.
    170170       ric=0.143 ! qui donne des valeurs proches des seuils proposes
    171171                 ! dans YAMADA 1983 : sm=0.0845 (0.085 dans Y83)
     
    179179       yun=1.
    180180       ydeux=2.
    181 !      yun=2.
    182 !      ydeux=1.
     181       hboville=.FALSE.
     182       viscom=1.46E-5
     183       viscoh=2.06E-5
     184       lmixmin=0.
     185       yamada4_num=5
    183186    ELSE
    184   !!  DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.4/
    185187       ric=0.195
    186188       rifc=0.191
     
    189191       yun=2.
    190192       ydeux=1.
     193       hboville=.TRUE.
     194       viscom=0.
     195       viscoh=0.
     196       lmixmin=1.
     197       yamada4_num=0
    191198    ENDIF
     199
    192200    PRINT*,'YAMADA4 RIc, RIfc, Sm_min, Alpha_min',ric,rifc,seuilsm,seuilalpha
    193201    firstcall = .FALSE.
    194     lmixmin=1.
    195202    CALL getin_p('lmixmin',lmixmin)
     203    CALL getin_p('yamada4_hboville',hboville)
     204    CALL getin_p('yamada4_num',yamada4_num)
    196205  END IF
    197206
     
    203212
    204213! On utilise ou non la routine de Holstalg Boville pour les cas tres stables
    205    hboville=.TRUE.
    206214
    207215
     
    420428         DO ig=1,ngrid
    421429         tkeprov=q2(ig,k)/ydeux
    422          q2(ig,k)= tkeprov*                           &
     430         tkeprov= tkeprov*                           &
    423431           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
    424432           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)))
     433         q2(ig,k)=tkeprov*ydeux
    425434        ENDDO
    426435       ENDDO
    427     ELSE ! version modifiee avec integration exacte pour la dissipation
     436    ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation
    428437       DO k = 2, klev - 1
    429438         DO ig=1,ngrid
    430439         tkeprov=q2(ig,k)/ydeux
    431          q2(ig,k)= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
     440         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
     441         tkeprov = tkeprov/(1.+dt*disseff/(2.*tkeprov))**2
     442         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
     443         q2(ig,k)=tkeprov*ydeux
    432444         ! En cas stable, on traite la flotabilite comme la
    433445         ! dissipation, en supposant que buoy/q2^3 est constant.
    434446         ! Puis on prend la solution exacte
    435          b1leff=1./(1./(b1*l(ig,k))-min(0.,buoy(ig,k)/sqrt(q2(ig,k)))**3)
    436          q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*b1leff))
     447        ENDDO
     448       ENDDO
     449    ELSE IF (yamada4_num==3) THEN ! version modifiee avec integration exacte pour la dissipation
     450       DO k = 2, klev - 1
     451         DO ig=1,ngrid
     452         tkeprov=q2(ig,k)/ydeux
     453         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
     454         tkeprov=tkeprov*exp(-dt*disseff/tkeprov)
     455         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
     456         q2(ig,k)=tkeprov*ydeux
     457         ! En cas stable, on traite la flotabilite comme la
     458         ! dissipation, en supposant que buoy/q2^3 est constant.
     459         ! Puis on prend la solution exacte
     460        ENDDO
     461       ENDDO
     462    ELSE IF (yamada4_num==4) THEN ! version modifiee avec integration exacte pour la dissipation
     463       DO k = 2, klev - 1
     464         DO ig=1,ngrid
     465         tkeprov=q2(ig,k)/ydeux
     466         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
     467         tkeprov= tkeprov*                           &
     468           &  tkeprov/ &
     469           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)))
     470         q2(ig,k)=tkeprov*ydeux
     471         ! En cas stable, on traite la flotabilite comme la
     472         ! dissipation, en supposant que buoy/q2^3 est constant.
     473         ! Puis on prend la solution exacte
     474        ENDDO
     475       ENDDO
     476    ELSE IF (yamada4_num==5) THEN ! version modifiee avec integration exacte pour la dissipation
     477       DO k = 2, klev - 1
     478         DO ig=1,ngrid
     479         tkeprov=q2(ig,k)/ydeux
     480         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
     481         tkeexp=exp(-dt*disseff/tkeprov)
     482         tkeprov= shear(ig,k)*tkeprov/disseff*(1.-tkeexp)+tkeprov*tkeexp
     483         q2(ig,k)=tkeprov*ydeux
     484         ! En cas stable, on traite la flotabilite comme la
     485         ! dissipation, en supposant que buoy/q2^3 est constant.
     486         ! Puis on prend la solution exacte
     487        ENDDO
     488       ENDDO
     489    ELSE IF (yamada4_num==6) THEN ! version modifiee avec integration exacte pour la dissipation
     490       DO k = 2, klev - 1
     491         DO ig=1,ngrid
     492         tkeprov=q2(ig,k)/ydeux
     493         tkeprov=tkeprov+max(buoy(ig,k)+shear(ig,k),0.)*dt
     494         disseff=dissip(ig,k)-min(0.,buoy(ig,k)+shear(ig,k))
     495         tkeexp=exp(-dt*disseff/tkeprov)
     496         tkeprov= tkeprov*tkeexp
     497         q2(ig,k)=tkeprov*ydeux
     498         ! En cas stable, on traite la flotabilite comme la
     499         ! dissipation, en supposant que buoy/q2^3 est constant.
     500         ! Puis on prend la solution exacte
    437501        ENDDO
    438502       ENDDO
     
    441505    DO k = 2, klev - 1
    442506      DO ig=1,ngrid
    443       q2(ig,k)=q2(ig,k)*ydeux
    444507      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
    445508      ENDDO
     
    577640
    578641 END IF ! hboville
     642
     643! Ajout d'une viscosite moleculaire
     644   km(:,:)=km(:,:)+viscom
     645   kn(:,:)=kn(:,:)+viscoh
     646   kq(:,:)=kq(:,:)+viscoh
    579647
    580648  IF (prt_level>1) THEN
Note: See TracChangeset for help on using the changeset viewer.