Changeset 2817


Ignore:
Timestamp:
Mar 7, 2017, 10:05:20 AM (8 years ago)
Author:
fhourdin
Message:

En option, nouveaux schemas numeriques pour l'integration temporelle.
yamada4_num=0 : std

=1 : comme MAR

File:
1 edited

Legend:

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

    r2721 r2817  
    5757  !                          -> the model can run with longer time-steps.
    5858  !             2016/11/30 (EV etienne.vignon@univ-grenoble-alpes.fr)
    59   !               On met tke (=q2/2) en entrée plutôt que q2
     59  !               On met tke (=q2/2) en entr??e plut??t que q2
    6060  !               On corrige l'update de la tke
    6161  !
     
    130130  REAL zz(klon, klev+1)
    131131  INTEGER iter
     132  REAL dissip(klon,klev), tkeprov, shear(klon,klev), buoy(klon,klev)
    132133  REAL,SAVE :: ric0,ric,rifc, b1, kap
    133134  !$OMP THREADPRIVATE(ric0,ric,rifc,b1,kap)
     
    138139  !$OMP THREADPRIVATE(lmixmin)
    139140  LOGICAL, SAVE :: new_yamada4
    140   !$OMP THREADPRIVATE(new_yamada4)
    141   REAL, SAVE :: yun,ydeux
     141  INTEGER, SAVE :: yamada4_num
     142  !$OMP THREADPRIVATE(new_yamada4,yamada4_num)
     143  REAL, SAVE :: yun,ydeux,b1leff
    142144  !$OMP THREADPRIVATE(yun,ydeux)
    143145  REAL frif, falpha, fsm
     
    161163    new_yamada4=.false.
    162164    CALL getin_p('new_yamada4',new_yamada4)
     165    yamada4_num=0
     166    CALL getin_p('yamada4_num',yamada4_num)
    163167! Pour garantir la continuite dans la mise au point de CMIP6.
    164168! Eliminer l'option new_yamada4 des le printemps 2016
     
    169173       CALL getin_p('yamada4_ric',ric)
    170174       ric0=0.19489      ! ric=0.195 originalement, mais produisait sm<0
    171        ric=min(ric,ric0) ! Au delà de ric0, sm devient négatif
     175       ric=min(ric,ric0) ! Au dela de ric0, sm devient n??gatif
    172176       rifc=frif(ric)
    173177       seuilsm=fsm(frif(ric))
     
    290294  !=======================================================================
    291295
    292   ! On commence par calculé q2 à partir de la tke
     296  ! On commence par calculer q2 a partir de la tke
    293297
    294298  IF (new_yamada4) THEN
     
    400404  ELSE IF (iflag_pbl>=10) THEN
    401405
     406    IF (yamada4_num>=1) THEN
     407 
     408    DO k = 2, klev - 1
     409      DO ig=1,ngrid
     410      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
     411      km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
     412      shear(ig,k)=km(ig, k)*m2(ig, k)
     413      buoy(ig,k)=km(ig, k)*m2(ig, k)*(-1.*rif(ig,k))
     414      dissip(ig,k)=((sqrt(q2(ig,k)))**3)/(b1*l(ig,k))
     415     ENDDO
     416    ENDDO
     417
     418    IF (yamada4_num==1) THEN ! Schema du MAR tel quel
     419       DO k = 2, klev - 1
     420         DO ig=1,ngrid
     421         tkeprov=q2(ig,k)/ydeux
     422         q2(ig,k)= tkeprov*                           &
     423           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
     424           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)))
     425        ENDDO
     426       ENDDO
     427    ELSE ! version modifiee avec integration exacte pour la dissipation
     428       DO k = 2, klev - 1
     429         DO ig=1,ngrid
     430         tkeprov=q2(ig,k)/ydeux
     431         q2(ig,k)= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
     432         ! En cas stable, on traite la flotabilite comme la
     433         ! dissipation, en supposant que buoy/q2^3 est constant.
     434         ! 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))
     437        ENDDO
     438       ENDDO
     439    ENDIF
     440
     441    DO k = 2, klev - 1
     442      DO ig=1,ngrid
     443      q2(ig,k)=q2(ig,k)*ydeux
     444      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
     445      ENDDO
     446    ENDDO
     447
     448   ELSE
     449
    402450    DO k = 2, klev - 1
    403451      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
     
    410458    END DO
    411459
     460  ENDIF
    412461
    413462  ELSE
     
    575624
    576625!============================================================================
    577 ! Mise à jour de la tke
     626! Mise a jour de la tke
    578627!============================================================================
    579628
Note: See TracChangeset for help on using the changeset viewer.