Skip to content
Snippets Groups Projects
turb.f90 82.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •     CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:,:, JSV) )
    
    CALL TURB_VER(D,CST,CSTURB,TURBN,TLES,                   &
              KRR,KRRL,KRRI,KGRADIENTS,                      &
    
              OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW,             &
    
              PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,        &
              PCOSSLOPE,PSINSLOPE,                           &
    
              PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV,           &
              ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M,               &
    
              PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT,    &
              PTKET,ZLM,PLENGTHM,PLENGTHH,ZLEPS,MFMOIST,     &
              ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE,     &
    
              ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH,         &
    
              PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,              &
    
              PSSTFL, PSSTFL_C, PSSRFL_C,PSSUFL_C,PSSVFL_C,  &
              PSSUFL,PSSVFL                                  )
    
    VIE Benoit's avatar
    VIE Benoit committed
    !IF (HCLOUD == 'LIMA') THEN
    !   IF (KSV_LIMA_NR.GT.0) PRSVS(:,:,KSV_LIMA_NR) = ZRSVS(:,:,KSV_LIMA_NR) 
    !   IF (KSV_LIMA_NS.GT.0) PRSVS(:,:,KSV_LIMA_NS) = ZRSVS(:,:,KSV_LIMA_NS)
    !   IF (KSV_LIMA_NG.GT.0) PRSVS(:,:,KSV_LIMA_NG) = ZRSVS(:,:,KSV_LIMA_NG) 
    !   IF (KSV_LIMA_NH.GT.0) PRSVS(:,:,KSV_LIMA_NH) = ZRSVS(:,:,KSV_LIMA_NH)
    !END IF
    
    IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_U), 'VTURB', PRUS(:,:) )
    IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_V), 'VTURB', PRVS(:,:) )
    IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_W), 'VTURB', PRWS(:,:) )
    
      IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:,:) + ZLVOCPEXNM(:,:) * PRRS(:,:, 2) &
                                                                              + ZLSOCPEXNM(:,:) * PRRS(:,:, 4) )
    
      ELSE IF( KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:,:) + ZLOCPEXNM(:,:) * PRRS(:,:, 2) )
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:,:) )
    
      IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:,:, 1) - PRRS(:,:, 2) - PRRS(:,:, 4) )
    
      ELSE IF( KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:,:, 1) - PRRS(:,:, 2) )
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:,:, 1) )
    
    IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:,:, 2) )
    IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:,:, 4) )
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:,:, JSV) )
    
    !Les budgets des termes horizontaux de la turb sont présents dans AROME
    ! alors que ces termes ne sont pas calculés
    
      IF( BUCONF%LBUDGET_U  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_U ), 'HTURB', PRUS  (:,:) )
      IF( BUCONF%LBUDGET_V  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_V ), 'HTURB', PRVS  (:,:) )
      IF( BUCONF%LBUDGET_W  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_W ), 'HTURB', PRWS  (:,:) )
    
        IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) + ZLVOCPEXNM(:,:) * PRRS(:,:, 2) &
                                                                                 + ZLSOCPEXNM(:,:) * PRRS(:,:, 4) )
    
        ELSE IF( KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) + ZLOCPEXNM(:,:) * PRRS(:,:, 2) )
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) )
    
        IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) - PRRS(:,:, 2) - PRRS(:,:, 4) )
    
        ELSE IF( KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) - PRRS(:,:, 2) )
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) )
    
      IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:,:, 2) )
      IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:,:, 4) )
    
          CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
    
    !à supprimer une fois le précédent ifdef REPRO48 validé
    #ifdef REPRO48
    
              KSPLIT, KRR, KRRL, KRRI, KSV,KSV_LGBEG,KSV_LGEND,    & 
              PTSTEP,HLBCX,HLBCY, OFLAT,O2D, ONOMIXLG,             & 
    
              OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW,                &
    
              PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ,                        &
              PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,                       &
              PCOSSLOPE,PSINSLOPE,                                 &
              PRHODJ,PTHVREF,                                      &
              PSFTH,PSFRV,PSFSV,                                   &
              ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,             &
              PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT,          &
    
              ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE,           &
    
              ZTRH,                                                &
              PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS                     )
    #endif
    
    VIE Benoit's avatar
    VIE Benoit committed
    !  IF (HCLOUD == 'LIMA') THEN
    !     IF (KSV_LIMA_NR.GT.0) PRSVS(:,:,KSV_LIMA_NR) = ZRSVS(:,:,KSV_LIMA_NR) 
    !     IF (KSV_LIMA_NS.GT.0) PRSVS(:,:,KSV_LIMA_NS) = ZRSVS(:,:,KSV_LIMA_NS)
    !     IF (KSV_LIMA_NG.GT.0) PRSVS(:,:,KSV_LIMA_NG) = ZRSVS(:,:,KSV_LIMA_NG) 
    !     IF (KSV_LIMA_NH.GT.0) PRSVS(:,:,KSV_LIMA_NH) = ZRSVS(:,:,KSV_LIMA_NH)
    !  END IF
    
      IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:,:) )
      IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:,:) )
      IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_W), 'HTURB', PRWS(:,:) )
    
        IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) + ZLVOCPEXNM(:,:) * PRRS(:,:, 2) &
                                                                                + ZLSOCPEXNM(:,:) * PRRS(:,:, 4) )
    
        ELSE IF( KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) + ZLOCPEXNM(:,:) * PRRS(:,:, 2) )
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:,:) )
    
        IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) - PRRS(:,:, 2) - PRRS(:,:, 4) )
    
        ELSE IF( KRRL >= 1 ) THEN
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) - PRRS(:,:, 2) )
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:,:, 1) )
    
      IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:,:, 2) )
      IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:,:, 4) )
    
          CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
    
    !----------------------------------------------------------------------------
    !
    
    !*      6. EVOLUTION OF THE TKE AND ITS DISSIPATION
    
    !          ----------------------------------------
    !
    
    !  6.1 Contribution of mass-flux in the TKE buoyancy production if
    !      cloud computation is not statistical
    
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    PTP(:,:) = PTP(:,:) &
                                 + CST%XG / PTHVREF(:,:) * ZWORK1(:,:)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF(PRESENT(PTPMF))  THEN
    
      !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      PTPMF(:,:)=CST%XG / PTHVREF(:,:) * ZWORK1(:,:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:)+ ZLVOCPEXNM(:,:) * PRRS(:,:,2) &
                                                              & + ZLSOCPEXNM(:,:) * PRRS(:,:,4) )
    
      ELSE IF ( KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:) + ZLOCPEXNM(:,:) * PRRS(:,:,2) )
    
        CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:) )
    
      ZRTKEMS(:,:)=PRTKEMS(:,:)
    
      ZRTKEMS(:,:)=0.
    
    CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES,HPROGRAM,           &
    
                       & KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH,                      &
    
                       & PSFU,PSFV,                                         &
    
                       & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,ZRTKEMS,&
    
                       & TBUDGETS,KBUDGETS, PEDR=PEDR, PTR=PTR,PDISS=PDISS, &
                       & PCURRENT_TKE_DISS=PCURRENT_TKE_DISS                )
    
      IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:)+ ZLVOCPEXNM(:,:) * PRRS(:,:,2) &
                                                              & + ZLSOCPEXNM(:,:) * PRRS(:,:,4) )
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:)+ ZLOCPEXNM(:,:) * PRRS(:,:,2) )
    
        CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:,:) )
    
    ENDIF
    !
    !----------------------------------------------------------------------------
    !
    !*      7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME
    !          ---------------------------------------------------------
    !
    
    IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
    
      TZFIELD = TFIELDMETADATA(       &
        CMNHNAME   = 'LM',            &
        CSTDNAME   = '',              &
        CLONGNAME  = 'LM',            &
        CUNITS     = 'm',             &
        CDIR       = 'XY',            &
        CCOMMENT   = 'Mixing length', &
        NGRID      = 1,               &
        NTYPE      = TYPEREAL,        &
        NDIMS      = 3,               &
        LTIMEDEP   = .TRUE.           )
    
      CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM)
    
    !
      IF (KRR /= 0) THEN
    !
    ! stores the conservative potential temperature
    !
    
        TZFIELD = TFIELDMETADATA(                          &
        CMNHNAME   = 'THLM',                               &
        CSTDNAME   = '',                                   &
        CLONGNAME  = 'THLM',                               &
        CUNITS     = 'K',                                  &
        CDIR       = 'XY',                                 &
        CCOMMENT   = 'Conservative potential temperature', &
        NGRID      = 1,                                    &
        NTYPE      = TYPEREAL,                             &
        NDIMS      = 3,                                    &
        LTIMEDEP   = .TRUE.                                )
    
        CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTHLT)
    
    !
    ! stores the conservative mixing ratio
    !
    
        TZFIELD = TFIELDMETADATA(                &
        CMNHNAME   = 'RNPM',                     &
        CSTDNAME   = '',                         &
        CLONGNAME  = 'RNPM',                     &
        CUNITS     = 'kg kg-1',                  &
        CDIR       = 'XY',                       &
        CCOMMENT   = 'Conservative mixing ratio',&
        NGRID      = 1,                          &
        NTYPE      = TYPEREAL,                   &
        NDIMS      = 3,                          &
        LTIMEDEP   = .TRUE.                      )
    
        CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRT(:,:,1))
    
    !* stores value of conservative variables & wind before turbulence tendency (AROME only)
    IF(PRESENT(PDRUS_TURB)) THEN
    
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      PDRUS_TURB(:,:)   = PRUS(:,:) - PDRUS_TURB(:,:)
      PDRVS_TURB(:,:)   = PRVS(:,:) - PDRVS_TURB(:,:)
      PDRTHLS_TURB(:,:) = PRTHLS(:,:) - PDRTHLS_TURB(:,:)
      PDRRTS_TURB(:,:)  = PRRS(:,:,1) - PDRRTS_TURB(:,:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
      !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT,JSV=1:KSV)  
    
      PDRSVS_TURB(:,:,:)  = PRSVS(:,:,:) - PDRSVS_TURB(:,:,:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT,JSV=1:KSV)
    
    !----------------------------------------------------------------------------
    !
    !*      8. RETRIEVE NON-CONSERVATIVE VARIABLES
    !          -----------------------------------
    !
    IF ( KRRL >= 1 ) THEN
      IF ( KRRI >= 1 ) THEN
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        PRT(:,:,1)  = PRT(:,:,1)  - PRT(:,:,2)  &
                                        - PRT(:,:,4)
        PRRS(:,:,1) = PRRS(:,:,1) - PRRS(:,:,2) &
                                        - PRRS(:,:,4)
        PTHLT(:,:)  = PTHLT(:,:)  + ZLVOCPEXNM(:,:) &
                                        * PRT(:,:,2) &
                                        + ZLSOCPEXNM(:,:) * PRT(:,:,4)
        PRTHLS(:,:) = PRTHLS(:,:) + ZLVOCPEXNM(:,:) &
                                        * PRRS(:,:,2) &
                                        + ZLSOCPEXNM(:,:) * PRRS(:,:,4)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        PRT(:,:,1)  = PRT(:,:,1)  - PRT(:,:,2)
        PRRS(:,:,1) = PRRS(:,:,1) - PRRS(:,:,2)
        PTHLT(:,:)  = PTHLT(:,:)  + ZLOCPEXNM(:,:) &
                                        * PRT(:,:,2)
        PRTHLS(:,:) = PRTHLS(:,:) + ZLOCPEXNM(:,:) &
                                        * PRRS(:,:,2)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
    
    CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD,HELEC,'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS)
    
    !----------------------------------------------------------------------------
    !
    !*      9. LES averaged surface fluxes
    !          ---------------------------
    !
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFTH,TLES%X_LES_Q0)
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFRV,TLES%X_LES_E0)
    
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFSV(:,JSV),TLES%X_LES_SV0(:,JSV))
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFU,TLES%X_LES_UW0)
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFV,TLES%X_LES_VW0)
    
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      ZWORK2D(:) = (PSFU(:)*PSFU(:)+PSFV(:)*PSFV(:))**0.25
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2D,TLES%X_LES_USTAR)
    
    !----------------------------------------------------------------------------
    !
    !*     10. LES for 3rd order moments
    !          -------------------------
    !
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWTH,TLES%X_LES_SUBGRID_W2Thl)
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTH2,TLES%X_LES_SUBGRID_WThl2)
    
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWR,TLES%X_LES_SUBGRID_W2Rt)
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTHR,TLES%X_LES_SUBGRID_WThlRt)
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMR2,TLES%X_LES_SUBGRID_WRt2)
    
      END IF
    !
    !----------------------------------------------------------------------------
    !
    !*     11. LES quantities depending on <w'2> in "1DIM" mode
    !          ------------------------------------------------
    !
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1,TLES%X_LES_SUBGRID_U2)
        TLES%X_LES_SUBGRID_V2(:,:,:) = TLES%X_LES_SUBGRID_U2(:,:,:)
        TLES%X_LES_SUBGRID_W2(:,:,:) = TLES%X_LES_SUBGRID_U2(:,:,:)
    
        !
        CALL GZ_M_W_PHY(D,PTHLT,PDZZ,ZWORK1)
        CALL MZF_PHY(D,ZWORK1,ZWORK2)
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        ZWORK2(:,:)  = 2./3.*PTKET(:,:) *ZWORK2(:,:)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddz_Thl_SBG_W2)
    
          CALL GZ_M_W_PHY(D,PRT(:,:,1),PDZZ,ZWORK1)
    
          !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          ZWORK2(:,:)  = 2./3.*PTKET(:,:) *ZWORK2(:,:)
    
          !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddz_Rt_SBG_W2)
    
          CALL GZ_M_W_PHY(D,PSVT(:,:,JSV),PDZZ,ZWORK1)
    
          !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          ZWORK2(:,:)  = 2./3.*PTKET(:,:) *ZWORK2(:,:)
    
          !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV))
    
        END DO
      END IF
    
    !----------------------------------------------------------------------------
    !
    !*     12. LES mixing end dissipative lengths, presso-correlations
    !          -------------------------------------------------------
    !
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLM,TLES%X_LES_SUBGRID_LMix)
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_LDiss)
    
    !
    !* presso-correlations for subgrid Tke are equal to zero.
    !
    
      ZLEPS(:,:) = 0. !ZLEPS is used as a work array (not used anymore)
    
      CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_WP)
    
      TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1
    
    !----------------------------------------------------------------------------
    !
    IF (LHOOK) CALL DR_HOOK('TURB',1,ZHOOK_HANDLE)
    CONTAINS
    !
    !     ########################################################################
          SUBROUTINE COMPUTE_FUNCTION_THERMO(PALP,PBETA,PGAM,PLTT,PC,PT,PEXN,PCP,&
                                             PLOCPEXN,PAMOIST,PATHETA            )
    !     ########################################################################
    !!
    !!****  *COMPUTE_FUNCTION_THERMO* routine to compute several thermo functions
    !
    !!    AUTHOR
    !!    ------
    !!
    !!     JP Pinty      *LA*
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original   24/02/03
    !!
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    IMPLICIT NONE
    !
    
    !*       0.1   Declarations of dummy arguments
    
    REAL,                   INTENT(IN)    :: PALP,PBETA,PGAM,PLTT,PC
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PT,PEXN,PCP
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PLOCPEXN
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PAMOIST,PATHETA
    
    !
    !-------------------------------------------------------------------------------
    !
    
      IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE2)
    
      !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      PLOCPEXN(:,:) = ( PLTT + (CST%XCPV-PC) *  (PT(:,:)-CST%XTT) ) &
                                         / PCP(:,:)
    
    !
    !*      1.2 Saturation vapor pressure at t
    !
    
      ZRVSAT(:,:) =  EXP( PALP - PBETA/PT(:,:) - PGAM*ALOG( PT(:,:) ) )
    
    !
    !*      1.3 saturation  mixing ratio at t
    !
    
      ZRVSAT(:,:) =  ZRVSAT(:,:) &
                                        * ZEPS / ( PPABST(:,:) - ZRVSAT(:,:) )
    
    !
    !*      1.4 compute the saturation mixing ratio derivative (rvs')
    !
    
      ZDRVSATDT(:,:) = ( PBETA / PT(:,:)  - PGAM ) / PT(:,:)   &
                     * ZRVSAT(:,:) * ( 1. + ZRVSAT(:,:) / ZEPS )
    
      PAMOIST(:,:)=  0.5 / ( 1.0 + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )
    
      PATHETA(:,:)= PAMOIST(:,:) * PEXN(:,:) *               &
            ( ( ZRVSAT(:,:) - PRT(:,:,1) ) * PLOCPEXN(:,:) / &
              ( 1. + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )        *               &
    
               ZRVSAT(:,:) * (1. + ZRVSAT(:,:)/ZEPS)                         &
                            * ( -2.*PBETA/PT(:,:) + PGAM ) / PT(:,:)**2      &
              +ZDRVSATDT(:,:) * (1. + 2. * ZRVSAT(:,:)/ZEPS)                 &
                            * ( PBETA/PT(:,:) - PGAM ) / PT(:,:)             &
    
      PLOCPEXN(:,:) = PLOCPEXN(:,:) / PEXN(:,:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',1,ZHOOK_HANDLE2)
    
    END SUBROUTINE COMPUTE_FUNCTION_THERMO
    
    
    !     ########################################################################
          SUBROUTINE COMPUTE_FUNCTION_THERMO_NEW_STAT(PALP,PBETA,PGAM,PLTT,PC,PT,PEXN,PCP,&
                                             PLOCPEXN,PAMOIST,PATHETA            )
    !     ########################################################################
    !!
    !!****  *COMPUTE_FUNCTION_THERMO* routine to compute several thermo functions
    !
    !!    AUTHOR
    !!    ------
    !!
    !!     JP Pinty      *LA*
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original   24/02/03
    !!     Modified: Wim de Rooy 06-02-2019
    !!
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    USE MODD_CST
    !
    IMPLICIT NONE
    !
    !*       0.1   Declarations of dummy arguments
    !
    REAL, INTENT(IN)                      :: PALP,PBETA,PGAM,PLTT,PC
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PT,PEXN,PCP
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PLOCPEXN
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PAMOIST,PATHETA
    
    !
    !-------------------------------------------------------------------------------
    !
    
      IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO_NEW_STAT',0,ZHOOK_HANDLE2)
      ZEPS = CST%XMV / CST%XMD
    
      !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      PLOCPEXN(:,:) = ( PLTT + (CST%XCPV-PC) *  (PT(:,:)-CST%XTT) ) / PCP(:,:)
    
    !
    !*      1.2 Saturation vapor pressure at t
    !
    
      ZRVSAT(:,:) =  EXP( PALP - PBETA/PT(:,:) - PGAM*ALOG( PT(:,:) ) )
    
    !
    !*      1.3 saturation  mixing ratio at t
    !
    
      ZRVSAT(:,:) =  ZRVSAT(:,:) * ZEPS / ( PPABST(:,:) - ZRVSAT(:,:) )
    
    !
    !*      1.4 compute the saturation mixing ratio derivative (rvs')
    !
    
      ZDRVSATDT(:,:) = ( PBETA / PT(:,:)  - PGAM ) / PT(:,:)   &
                     * ZRVSAT(:,:) * ( 1. + ZRVSAT(:,:) / ZEPS )
    
      PAMOIST(:,:)=  1.0 / ( 1.0 + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )
    
      PATHETA(:,:)= PAMOIST(:,:) * PEXN(:,:) * ZDRVSATDT(:,:)
    
    !
    !*      1.7 Lv/Cph/Exner at t-1
    !
    
      PLOCPEXN(:,:) = PLOCPEXN(:,:) / PEXN(:,:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO_NEW_STAT',1,ZHOOK_HANDLE2)
    
    END SUBROUTINE COMPUTE_FUNCTION_THERMO_NEW_STAT
    
    
    !     ####################
    !!
    !!****  *DELT* routine to compute mixing length for DELT case
    !
    !!    AUTHOR
    !!    ------
    !!
    !!     M Tomasini      *Meteo-France
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original   01/05
    !!
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    
    !*       0.1   Declarations of dummy arguments
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PLM
    
    !-------------------------------------------------------------------------------
    !
    
    IF (LHOOK) CALL DR_HOOK('TURB:DELT',0,ZHOOK_HANDLE2)
    
    !
    CALL MXF_PHY(D,PDXX,ZWORK1)
    IF (.NOT. O2D) THEN
      CALL MYF_PHY(D,PDYY,ZWORK2)
    END IF
    !
    
    IF (ODZ) THEN
      ! Dz is take into account in the computation
      DO JK = IKTB,IKTE ! 1D turbulence scheme
    
        !$mnh_expand_array(JIJ=IIJB:IIJE)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      PLM(:,IKU) = PLM(:,IKE)
      PLM(:,IKA) = PZZ(:,IKB) - PZZ(:,IKA)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      IF ( TURBN%CTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
    
          !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          PLM(:,:) = SQRT( PLM(:,:)*ZWORK1(:,:) )
    
          !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          PLM(:,:) = (PLM(:,:)*ZWORK1(:,:) &
                                       * ZWORK2(:,:) ) ** (1./3.)
    
          !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        END IF
      END IF
    ELSE
      ! Dz not taken into account in computation to assure invariability with vertical grid mesh
    
      !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      IF ( TURBN%CTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
    
          PLM(:,:) = ZWORK1(:,:)
    
          !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
          PLM(:,:) = (ZWORK1(:,:)*ZWORK2(:,:) ) ** (1./2.)
    
          !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    !  mixing length limited by the distance normal to the surface
    
    !  (with the same factor as for BL89)
    !
    
      DO JIJ=IIJB,IIJE
        IF (OOCEAN) THEN
          DO JK=IKTE,IKTB,-1
            ZD=ZALPHA*(PZZ(JIJ,IKTE+1)-PZZ(JIJ,JK))
            IF ( PLM(JIJ,JK)>ZD) THEN
              PLM(JIJ,JK)=ZD
            ELSE
              EXIT
            ENDIF
          END DO
        ELSE
          DO JK=IKTB,IKTE
    
            ZD=ZALPHA*(0.5*(PZZ(JIJ,JK)+PZZ(JIJ,JK+IKL))&
    
            -PZZ(JIJ,IKB)) *PDIRCOSZW(JIJ)
            IF ( PLM(JIJ,JK)>ZD) THEN
              PLM(JIJ,JK)=ZD
            ELSE
              EXIT
            ENDIF
          END DO
    
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    
    PLM(:,IKA) = PLM(:,IKB)
    PLM(:,IKU) = PLM(:,IKE)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
    IF (LHOOK) CALL DR_HOOK('TURB:DELT',1,ZHOOK_HANDLE2)
    
    END SUBROUTINE DELT
    !
    !     ####################
          SUBROUTINE DEAR(PLM)
    !     ####################
    !!
    
    !!****  *DEAR* routine to compute mixing length for DEARdorff case
    
    !
    !!    AUTHOR
    !!    ------
    !!
    !!     M Tomasini      *Meteo-France
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original   01/05
    !!      I.Sandu (Sept.2006) : Modification of the stability criterion
    !!                            (theta_v -> theta_l)
    !!
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    
    !*       0.1   Declarations of dummy arguments
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PLM
    
    !
    !-------------------------------------------------------------------------------
    !
    !   initialize the mixing length with the mesh grid
    
    IF (LHOOK) CALL DR_HOOK('TURB:DEAR',0,ZHOOK_HANDLE2)
    
      CALL MXF_PHY(D,PDXX,ZWORK1)
      IF (.NOT. O2D) THEN
        CALL MYF_PHY(D,PDYY,ZWORK2)
      END IF
    END IF
    
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=IKTB:IKTE)
    
    PLM(:,IKTB:IKTE) = PZZ(:,IKTB+IKL:IKTE+IKL) - PZZ(:,IKTB:IKTE)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=IKTB:IKTE)
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    
    PLM(:,IKU) = PLM(:,IKE)
    PLM(:,IKA) = PZZ(:,IKB) - PZZ(:,IKA)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
    IF ( TURBN%CTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        PLM(:,:) = SQRT( PLM(:,:)*ZWORK1(:,:) )
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
        PLM(:,:) = (PLM(:,:)*ZWORK1(:,:) &
                                     * ZWORK2(:,:) ) ** (1./3.)
    
        !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
      END IF
    END IF
    !   compute a mixing length limited by the stability
    !
    
    CALL ETHETA(D,CST,KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZATHETA,PSRCT,OOCEAN,OCOMPUTE_SRC,ZETHETA)
    CALL EMOIST(D,CST,KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZAMOIST,PSRCT,OOCEAN,ZEMOIST)
    
        DO JIJ=IIJB,IIJE
    
          ZDTHLDZ(JIJ,JK)= 0.5*((PTHLT(JIJ,JK+IKL)-PTHLT(JIJ,JK    ))/PDZZ(JIJ,JK+IKL)+ &
                                  (PTHLT(JIJ,JK    )-PTHLT(JIJ,JK-IKL))/PDZZ(JIJ,JK    ))
          ZDRTDZ(JIJ,JK) = 0.5*((PRT(JIJ,JK+IKL,1)-PRT(JIJ,JK    ,1))/PDZZ(JIJ,JK+IKL)+ &
                                  (PRT(JIJ,JK    ,1)-PRT(JIJ,JK-IKL,1))/PDZZ(JIJ,JK    ))
    
          IF (OOCEAN) THEN
            ZVAR=CST%XG*(CST%XALPHAOC*ZDTHLDZ(JIJ,JK)-CST%XBETAOC*ZDRTDZ(JIJ,JK))
          ELSE
            ZVAR=CST%XG/PTHVREF(JIJ,JK)*                                                  &
               (ZETHETA(JIJ,JK)*ZDTHLDZ(JIJ,JK)+ZEMOIST(JIJ,JK)*ZDRTDZ(JIJ,JK))
          END IF
          !
          IF (ZVAR>0.) THEN
            PLM(JIJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JIJ,JK), &
                          0.76* SQRT(PTKET(JIJ,JK)/ZVAR)))
          END IF
    
        END DO
      END DO
    ELSE! For dry atmos or unsalted ocean runs
      DO JK = IKTB+1,IKTE-1
    
        DO JIJ=IIJB,IIJE
    
          ZDTHLDZ(JIJ,JK)= 0.5*((PTHLT(JIJ,JK+IKL)-PTHLT(JIJ,JK    ))/PDZZ(JIJ,JK+IKL)+ &
                                  (PTHLT(JIJ,JK    )-PTHLT(JIJ,JK-IKL))/PDZZ(JIJ,JK    ))
    
          IF (OOCEAN) THEN
            ZVAR= CST%XG*CST%XALPHAOC*ZDTHLDZ(JIJ,JK)
          ELSE
            ZVAR= CST%XG/PTHVREF(JIJ,JK)*ZETHETA(JIJ,JK)*ZDTHLDZ(JIJ,JK)
          END IF
    
          IF (ZVAR>0.) THEN
            PLM(JIJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JIJ,JK), &
                          0.76* SQRT(PTKET(JIJ,JK)/ZVAR)))
          END IF
    
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    
    ZDTHLDZ(:,IKB)=(PTHLT(:,IKB+IKL)-PTHLT(:,IKB))/PDZZ(:,IKB+IKL)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      ZDRTDZ(:,IKB)=(PRT(:,IKB+IKL,1)-PRT(:,IKB,1))/PDZZ(:,IKB+IKL)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      ZDRTDZ(:,IKB)=0
    
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      ZWORK2D(:)=CST%XG*(CST%XALPHAOC*ZDTHLDZ(:,IKB)-CST%XBETAOC*ZDRTDZ(:,IKB))
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      ZWORK2D(:)=CST%XG/PTHVREF(:,IKB)*                                           &
                  (ZETHETA(:,IKB)*ZDTHLDZ(:,IKB)+ZEMOIST(:,IKB)*ZDRTDZ(:,IKB))
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
    !$mnh_expand_where(JIJ=IIJB:IIJE)
    
    WHERE(ZWORK2D(:)>0.)
      PLM(:,IKB)=MAX(CST%XMNH_EPSILON,MIN( PLM(:,IKB),                 &
                        0.76* SQRT(PTKET(:,IKB)/ZWORK2D(:))))
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
    
    !
    !  mixing length limited by the distance normal to the surface (with the same factor as for BL89)
    !
    
      DO JIJ=IIJB,IIJE
        IF (OOCEAN) THEN
          DO JK=IKTE,IKTB,-1
            ZD=ZALPHA*(PZZ(JIJ,IKTE+1)-PZZ(JIJ,JK))
            IF ( PLM(JIJ,JK)>ZD) THEN
              PLM(JIJ,JK)=ZD
            ELSE
              EXIT
            ENDIF
          END DO
        ELSE
          DO JK=IKTB,IKTE
    
            ZD=ZALPHA*(0.5*(PZZ(JIJ,JK)+PZZ(JIJ,JK+IKL))-PZZ(JIJ,IKB)) &
    
              *PDIRCOSZW(JIJ)
            IF ( PLM(JIJ,JK)>ZD) THEN
              PLM(JIJ,JK)=ZD
            ELSE
              EXIT
            ENDIF
          END DO
    
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    
    PLM(:,IKA) = PLM(:,IKB)
    PLM(:,IKE) = PLM(:,IKE-IKL)
    PLM(:,IKU) = PLM(:,IKU-IKL)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
    IF (LHOOK) CALL DR_HOOK('TURB:DEAR',1,ZHOOK_HANDLE2)
    
    END SUBROUTINE DEAR
    !
    !     #########################
          SUBROUTINE CLOUD_MODIF_LM
    !     #########################
    !!
    !!*****CLOUD_MODIF_LM routine to:
    !!       1/ change the mixing length in the clouds
    !!       2/ emphasize the mixing length in the cloud
    !!           by the coefficient ZCOEF_AMPL calculated here
    !!             when the CEI index is above ZCEI_MIN.
    !!
    !!
    !!      ZCOEF_AMPL ^
    !!                 |
    !!                 |
    !!  ZCOEF_AMPL_SAT -                       ---------- Saturation
    !!    (XDUMMY1)    |                      -
    !!                 |                     -
    !!                 |                    -
    !!                 |                   -
    !!                 |                  - Amplification
    !!                 |                 - straight
    !!                 |                - line
    !!                 |               -
    !!                 |              -
    !!                 |             -
    !!                 |            -
    !!                 |           -
    !!               1 ------------
    !!                 |
    !!                 |
    !!               0 -----------|------------|----------> PCEI
    !!                 0      ZCEI_MIN     ZCEI_MAX
    !!                        (XDUMMY2)    (XDUMMY3)
    !!
    !!
    !!
    !!    AUTHOR
    !!    ------
    !!     M. Tomasini   *CNRM METEO-FRANCE
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!     Original   09/07/04
    !!
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    IMPLICIT NONE
    !
    !-------------------------------------------------------------------------------
    !
    !*       1.    INITIALISATION
    !              --------------
    !
    
    IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',0,ZHOOK_HANDLE2)
    
    ZPENTE = ( PCOEF_AMPL_SAT - 1. ) / ( PCEI_MAX - PCEI_MIN )
    
    ZCOEF_AMPL_CEI_NUL = 1. - ZPENTE * PCEI_MIN
    !
    
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    
    !
    !*       2.    CALCULATION OF THE AMPLIFICATION COEFFICIENT
    !              --------------------------------------------
    !
    ! Saturation
    !
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    WHERE ( PCEI(:,:)>=PCEI_MAX ) 
      ZCOEF_AMPL(:,:)=PCOEF_AMPL_SAT
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    !
    ! Between the min and max limits of CEI index, linear variation of the
    ! amplification coefficient ZCOEF_AMPL as a function of CEI
    !
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    WHERE ( PCEI(:,:) <  PCEI_MAX .AND. PCEI(:,:) >  PCEI_MIN)
      ZCOEF_AMPL(:,:) = ZPENTE * PCEI(:,:) + ZCOEF_AMPL_CEI_NUL
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    !
    !
    !*       3.    CALCULATION OF THE MIXING LENGTH IN CLOUDS
    !              ------------------------------------------
    !
    
      ZLM_CLOUD(:,:) = ZLM(:,:)
    
    ELSE
      SELECT CASE (HTURBLEN_CL)
    !
    !*         3.1 BL89 mixing length
    !           ------------------
    
        ZSHEAR(:,:)=0.
    
        CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN,HPROGRAM)
    
    !
    !*         3.2 Delta mixing length
    !           -------------------
      CASE ('DELT')
    
    !
    !*         3.3 Deardorff mixing length
    !           -----------------------
      CASE ('DEAR')
        CALL DEAR(ZLM_CLOUD)
    !
      END SELECT
    ENDIF
    !
    !*       4.    MODIFICATION OF THE MIXING LENGTH IN THE CLOUDS
    !              -----------------------------------------------
    !
    ! Impression before modification of the mixing length
    
    IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
    
      TZFIELD = TFIELDMETADATA(            &
        CMNHNAME   = 'LM_CLEAR_SKY',       &
        CSTDNAME   = '',                   &
        CLONGNAME  = 'LM_CLEAR_SKY',       &
        CUNITS     = 'm',                  &
        CDIR       = 'XY',                 &
        CCOMMENT   = 'X_Y_Z_LM CLEAR SKY', &
        NGRID      = 1,                    &
        NTYPE      = TYPEREAL,             &
        NDIMS      = 3,                    &
        LTIMEDEP   = .TRUE.                )
    
      CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM)
    
    ENDIF
    !
    ! Amplification of the mixing length when the criteria are verified
    !
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)