Newer
Older
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) &
+ ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) )
ELSE
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) )
END IF
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RV ) THEN
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) )
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) )
END IF
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:, :, :, 2) )
IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:, :, :, 4) )

RODIER Quentin
committed
IF( BUCONF%LBUDGET_SV ) THEN
DO JSV = 1, KSV
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:, :, :, JSV) )
END DO
END IF
!
!Les budgets des termes horizontaux de la turb sont présents dans AROME
! alors que ces termes ne sont pas calculés
#ifdef REPRO48
#else
IF( HTURBDIM == '3DIM' ) THEN
#endif

RODIER Quentin
committed
IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'HTURB', PRUS (:, :, :) )
IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'HTURB', PRVS (:, :, :) )
IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'HTURB', PRWS (:, :, :) )

RODIER Quentin
committed
IF(BUCONF%LBUDGET_TH) THEN
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) &
+ ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) )
ELSE
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) )
END IF
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RV ) THEN
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) )
ELSE
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) )
END IF
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) )
IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) )

RODIER Quentin
committed
IF( BUCONF%LBUDGET_SV ) THEN
DO JSV = 1, KSV
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) )
END DO
END IF
!à supprimer une fois le précédent ifdef REPRO48 validé
#ifdef REPRO48
#else
CALL TURB_HOR_SPLT(D,CST,CSTURB, &
KSPLIT, KRR, KRRL, KRRI, PTSTEP,HLBCX,HLBCY, &
OTURB_FLX,OSUBG_COND,OOCEAN,OCOMPUTE_SRC, &
TPFILE, &
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, &
PTKET,ZLM,ZLEPS, &
ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, &
PDP,PTP,PSIGS, &
ZTRH, &
PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS )
#endif

RODIER Quentin
committed
IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:, :, :) )
IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:, :, :) )
IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'HTURB', PRWS(:, :, :) )

RODIER Quentin
committed
IF( BUCONF%LBUDGET_TH ) THEN
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) &
+ ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) )
ELSE
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) )
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RV ) THEN
IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) )
ELSE IF( KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) )
ELSE
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) )
END IF

RODIER Quentin
committed
IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) )
IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) )

RODIER Quentin
committed
IF( BUCONF%LBUDGET_SV ) THEN
DO JSV = 1, KSV
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) )
END DO
END IF
#ifdef REPRO48
#else
END IF
#endif
!----------------------------------------------------------------------------
!
!* 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

RODIER Quentin
committed
CALL MZF_PHY(D,PFLXZTHVMF,ZWORK1)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
PTP(IIB:IIE,IJB:IJE,1:D%NKT) = PTP(IIB:IIE,IJB:IJE,1:D%NKT) &
+ CST%XG / PTHVREF(IIB:IIE,IJB:IJE,1:D%NKT) * ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT)

RODIER Quentin
committed
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PTPMF(IIB:IIE,IJB:IJE,1:D%NKT)=CST%XG / PTHVREF(IIB:IIE,IJB:IJE,1:D%NKT) * ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
! 6.2 TKE evolution equation

RODIER Quentin
committed
IF (.NOT. OHARAT) THEN

RODIER Quentin
committed
IF (BUCONF%LBUDGET_TH) THEN
IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) &
& + ZLSOCPEXNM * PRRS(:,:,:,4) )
ELSE IF ( KRRL >= 1 ) THEN
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2) )
ELSE
CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) )
END IF
END IF
!
IF(PRESENT(PRTKEMS)) THEN
ZRTKEMS(:,:,:)=PRTKEMS(:,:,:)
END IF
!
CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,HPROGRAM, &
& KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH, &

RODIER Quentin
committed
& PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, &
& PTSTEP,PIMPL,ZEXPL, &
& HTURBLEN,HTURBDIM, &
& TPFILE,OTURB_DIAG,OLES_CALL,ODIAG_IN_RUN, &
& PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,ZRTKEMS,&

RODIER Quentin
committed
& TBUDGETS,KBUDGETS, PEDR=PEDR, PTR=PTR,PDISS=PDISS, &
& PCURRENT_TKE_DISS=PCURRENT_TKE_DISS )

RODIER Quentin
committed
IF (BUCONF%LBUDGET_TH) THEN
IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) &
& + ZLSOCPEXNM * PRRS(:,:,:,4) )
ELSE IF ( KRRL >= 1 ) THEN
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2) )
CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) )
END IF
END IF
ENDIF
!
!----------------------------------------------------------------------------
!
!* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME
! ---------------------------------------------------------
!

RODIER Quentin
committed
IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN
!
! stores the mixing length
!

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'LM'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'LM'
TZFIELD%CUNITS = 'm'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'Mixing length'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM)
!
IF (KRR /= 0) THEN
!
! stores the conservative potential temperature
!

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'THLM'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'THLM'
TZFIELD%CUNITS = 'K'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'Conservative potential temperature'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PTHLT)
!
! stores the conservative mixing ratio
!

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'RNPM'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'RNPM'
TZFIELD%CUNITS = 'kg kg-1'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'Conservative mixing ratio'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PRT(:,:,:,1))
END IF
END IF
!
!* stores value of conservative variables & wind before turbulence tendency (AROME only)
IF(PRESENT(PDRUS_TURB)) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PDRUS_TURB(IIB:IIE,IJB:IJE,1:D%NKT) = PRUS(IIB:IIE,IJB:IJE,1:D%NKT) - PDRUS_TURB(IIB:IIE,IJB:IJE,1:D%NKT)
PDRVS_TURB(IIB:IIE,IJB:IJE,1:D%NKT) = PRVS(IIB:IIE,IJB:IJE,1:D%NKT) - PDRVS_TURB(IIB:IIE,IJB:IJE,1:D%NKT)
PDRTHLS_TURB(IIB:IIE,IJB:IJE,1:D%NKT) = PRTHLS(IIB:IIE,IJB:IJE,1:D%NKT) - PDRTHLS_TURB(IIB:IIE,IJB:IJE,1:D%NKT)
PDRRTS_TURB(IIB:IIE,IJB:IJE,1:D%NKT) = PRRS(IIB:IIE,IJB:IJE,1:D%NKT,1) - PDRRTS_TURB(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT,JSV=1:KSV)
PDRSVS_TURB(IIB:IIE,IJB:IJE,1:D%NKT,:) = PRSVS(IIB:IIE,IJB:IJE,1:D%NKT,:) - PDRSVS_TURB(IIB:IIE,IJB:IJE,1:D%NKT,:)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT,JSV=1:KSV)
!----------------------------------------------------------------------------
!
!* 8. RETRIEVE NON-CONSERVATIVE VARIABLES
! -----------------------------------
!
IF ( KRRL >= 1 ) THEN
IF ( KRRI >= 1 ) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
PRT(IIB:IIE,IJB:IJE,1:D%NKT,1) = PRT(IIB:IIE,IJB:IJE,1:D%NKT,1) - PRT(IIB:IIE,IJB:IJE,1:D%NKT,2) &
- PRT(IIB:IIE,IJB:IJE,1:D%NKT,4)
PRRS(IIB:IIE,IJB:IJE,1:D%NKT,1) = PRRS(IIB:IIE,IJB:IJE,1:D%NKT,1) - PRRS(IIB:IIE,IJB:IJE,1:D%NKT,2) &
- PRRS(IIB:IIE,IJB:IJE,1:D%NKT,4)
PTHLT(IIB:IIE,IJB:IJE,1:D%NKT) = PTHLT(IIB:IIE,IJB:IJE,1:D%NKT) + ZLVOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) &
* PRT(IIB:IIE,IJB:IJE,1:D%NKT,2) &
+ ZLSOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) * PRT(IIB:IIE,IJB:IJE,1:D%NKT,4)
PRTHLS(IIB:IIE,IJB:IJE,1:D%NKT) = PRTHLS(IIB:IIE,IJB:IJE,1:D%NKT) + ZLVOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) &
* PRRS(IIB:IIE,IJB:IJE,1:D%NKT,2) &
+ ZLSOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) * PRRS(IIB:IIE,IJB:IJE,1:D%NKT,4)

RODIER Quentin
committed
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
ELSE

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PRT(IIB:IIE,IJB:IJE,1:D%NKT,1) = PRT(IIB:IIE,IJB:IJE,1:D%NKT,1) - PRT(IIB:IIE,IJB:IJE,1:D%NKT,2)
PRRS(IIB:IIE,IJB:IJE,1:D%NKT,1) = PRRS(IIB:IIE,IJB:IJE,1:D%NKT,1) - PRRS(IIB:IIE,IJB:IJE,1:D%NKT,2)

RODIER Quentin
committed
PTHLT(IIB:IIE,IJB:IJE,1:D%NKT) = PTHLT(IIB:IIE,IJB:IJE,1:D%NKT) + ZLOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) &
* PRT(IIB:IIE,IJB:IJE,1:D%NKT,2)
PRTHLS(IIB:IIE,IJB:IJE,1:D%NKT) = PRTHLS(IIB:IIE,IJB:IJE,1:D%NKT) + ZLOCPEXNM(IIB:IIE,IJB:IJE,1:D%NKT) &
* PRRS(IIB:IIE,IJB:IJE,1:D%NKT,2)

RODIER Quentin
committed
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
END IF
END IF

RODIER Quentin
committed
! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD, 'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS)
!----------------------------------------------------------------------------
!
!* 9. LES averaged surface fluxes
! ---------------------------
!

RODIER Quentin
committed
IF (OLES_CALL) THEN
CALL SECOND_MNH(ZTIME1)
CALL LES_MEAN_SUBGRID(PSFTH,X_LES_Q0)
CALL LES_MEAN_SUBGRID(PSFRV,X_LES_E0)

RODIER Quentin
committed
DO JSV=1,KSV
CALL LES_MEAN_SUBGRID(PSFSV(:,:,JSV),X_LES_SV0(:,JSV))
END DO
CALL LES_MEAN_SUBGRID(PSFU,X_LES_UW0)
CALL LES_MEAN_SUBGRID(PSFV,X_LES_VW0)

RODIER Quentin
committed
!
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
ZWORK2D(IIB:IIE,IJB:IJE) = (PSFU(IIB:IIE,IJB:IJE)*PSFU(IIB:IIE,IJB:IJE)+PSFV(IIB:IIE,IJB:IJE)*PSFV(IIB:IIE,IJB:IJE))**0.25
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
CALL LES_MEAN_SUBGRID(ZWORK2D,X_LES_USTAR)
!----------------------------------------------------------------------------
!
!* 10. LES for 3rd order moments
! -------------------------
!
CALL LES_MEAN_SUBGRID(ZMWTH,X_LES_SUBGRID_W2Thl)
CALL LES_MEAN_SUBGRID(ZMTH2,X_LES_SUBGRID_WThl2)
IF (KRR>0) THEN
CALL LES_MEAN_SUBGRID(ZMWR,X_LES_SUBGRID_W2Rt)
CALL LES_MEAN_SUBGRID(ZMTHR,X_LES_SUBGRID_WThlRt)
CALL LES_MEAN_SUBGRID(ZMR2,X_LES_SUBGRID_WRt2)
END IF
!
!----------------------------------------------------------------------------
!
!* 11. LES quantities depending on <w'2> in "1DIM" mode
! ------------------------------------------------
!
IF (HTURBDIM=="1DIM") THEN

RODIER Quentin
committed
!
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT) = 2./3.*PTKET(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
CALL LES_MEAN_SUBGRID(ZWORK1,X_LES_SUBGRID_U2)
X_LES_SUBGRID_V2(:,:,:) = X_LES_SUBGRID_U2(:,:,:)
X_LES_SUBGRID_W2(:,:,:) = X_LES_SUBGRID_U2(:,:,:)

RODIER Quentin
committed
!
CALL GZ_M_W_PHY(D,PTHLT,PDZZ,ZWORK1)
CALL MZF_PHY(D,ZWORK1,ZWORK2)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) = 2./3.*PTKET(IIB:IIE,IJB:IJE,1:D%NKT) *ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
CALL LES_MEAN_SUBGRID(ZWORK2,X_LES_RES_ddz_Thl_SBG_W2)
!
IF (KRR>=1) THEN
CALL GZ_M_W_PHY(D,PRT(:,:,:,1),PDZZ,ZWORK1)
CALL MZF_PHY(D,ZWORK1,ZWORK2)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) = 2./3.*PTKET(IIB:IIE,IJB:IJE,1:D%NKT) *ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
CALL LES_MEAN_SUBGRID(ZWORK2,X_LES_RES_ddz_Rt_SBG_W2)
END IF

RODIER Quentin
committed
DO JSV=1,KSV

RODIER Quentin
committed
CALL GZ_M_W_PHY(D,PSVT(:,:,:,JSV),PDZZ,ZWORK1)
CALL MZF_PHY(D,ZWORK1,ZWORK2)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) = 2./3.*PTKET(IIB:IIE,IJB:IJE,1:D%NKT) *ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
CALL LES_MEAN_SUBGRID(ZWORK2, X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV))
END DO
END IF
!----------------------------------------------------------------------------
!
!* 12. LES mixing end dissipative lengths, presso-correlations
! -------------------------------------------------------
!
CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_LMix)
CALL LES_MEAN_SUBGRID(ZLEPS,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(ZLEPS,X_LES_SUBGRID_WP)
!
CALL SECOND_MNH(ZTIME2)
XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1
END IF
!

RODIER Quentin
committed
IF(PRESENT(PLEM)) PLEM(IIB:IIE,IJB:IJE,IKTB:IKTE) = ZLM(IIB:IIE,IJB:IJE,IKTB:IKTE)
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
!----------------------------------------------------------------------------
!
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%NIT,D%NJT,D%NKT), INTENT(IN) :: PT,PEXN,PCP
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PLOCPEXN
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PAMOIST,PATHETA
!
!-------------------------------------------------------------------------------
!

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE2)

RODIER Quentin
committed
ZEPS = CST%XMV / CST%XMD
!
!* 1.1 Lv/Cph at t
!

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) = ( PLTT + (CST%XCPV-PC) * (PT(IIB:IIE,IJB:IJE,1:D%NKT)-CST%XTT) ) &
/ PCP(IIB:IIE,IJB:IJE,1:D%NKT)
!
!* 1.2 Saturation vapor pressure at t
!

RODIER Quentin
committed
ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) = EXP( PALP - PBETA/PT(IIB:IIE,IJB:IJE,1:D%NKT) - PGAM*ALOG( PT(IIB:IIE,IJB:IJE,1:D%NKT) ) )
!
!* 1.3 saturation mixing ratio at t
!

RODIER Quentin
committed
ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) = ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) &
* ZEPS / ( PPABST(IIB:IIE,IJB:IJE,1:D%NKT) - ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) )
!
!* 1.4 compute the saturation mixing ratio derivative (rvs')
!

RODIER Quentin
committed
ZDRVSATDT(IIB:IIE,IJB:IJE,1:D%NKT) = ( PBETA / PT(IIB:IIE,IJB:IJE,1:D%NKT) - PGAM ) / PT(IIB:IIE,IJB:IJE,1:D%NKT) &
* ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) * ( 1. + ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) / ZEPS )
!
!* 1.5 compute Amoist
!

RODIER Quentin
committed
PAMOIST(IIB:IIE,IJB:IJE,1:D%NKT)= 0.5 / ( 1.0 + ZDRVSATDT(IIB:IIE,IJB:IJE,1:D%NKT) * PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) )
!
!* 1.6 compute Atheta
!

RODIER Quentin
committed
PATHETA(IIB:IIE,IJB:IJE,1:D%NKT)= PAMOIST(IIB:IIE,IJB:IJE,1:D%NKT) * PEXN(IIB:IIE,IJB:IJE,1:D%NKT) * &
( ( ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) - PRT(IIB:IIE,IJB:IJE,1:D%NKT,1) ) * PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) / &

RODIER Quentin
committed
( 1. + ZDRVSATDT(IIB:IIE,IJB:IJE,1:D%NKT) * PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) ) * &

RODIER Quentin
committed
ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT) * (1. + ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT)/ZEPS) &
* ( -2.*PBETA/PT(IIB:IIE,IJB:IJE,1:D%NKT) + PGAM ) / PT(IIB:IIE,IJB:IJE,1:D%NKT)**2 &
+ZDRVSATDT(IIB:IIE,IJB:IJE,1:D%NKT) * (1. + 2. * ZRVSAT(IIB:IIE,IJB:IJE,1:D%NKT)/ZEPS) &
* ( PBETA/PT(IIB:IIE,IJB:IJE,1:D%NKT) - PGAM ) / PT(IIB:IIE,IJB:IJE,1:D%NKT) &

RODIER Quentin
committed
- ZDRVSATDT(IIB:IIE,IJB:IJE,1:D%NKT) &
)
!
!* 1.7 Lv/Cph/Exner at t-1
!

RODIER Quentin
committed
PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) = PLOCPEXN(IIB:IIE,IJB:IJE,1:D%NKT) / PEXN(IIB:IIE,IJB:IJE,1:D%NKT)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',1,ZHOOK_HANDLE2)
END SUBROUTINE COMPUTE_FUNCTION_THERMO
!
! ####################

RODIER Quentin
committed
SUBROUTINE DELT(PLM,ODZ)
! ####################
!!
!!**** *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%NIT,D%NJT,D%NKT), INTENT(OUT) :: PLM

RODIER Quentin
committed
LOGICAL, INTENT(IN) :: ODZ
!-------------------------------------------------------------------------------
!

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:DELT',0,ZHOOK_HANDLE2)

RODIER Quentin
committed
!
CALL MXF_PHY(D,PDXX,ZWORK1)
IF (.NOT. O2D) THEN
CALL MYF_PHY(D,PDYY,ZWORK2)
END IF
!

RODIER Quentin
committed
IF (ODZ) THEN
! Dz is take into account in the computation
DO JK = IKTB,IKTE ! 1D turbulence scheme

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
PLM(IIB:IIE,IJB:IJE,JK) = PZZ(IIB:IIE,IJB:IJE,JK+D%NKL) - PZZ(IIB:IIE,IJB:IJE,JK)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
END DO

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
PLM(IIB:IIE,IJB:IJE,D%NKU) = PLM(IIB:IIE,IJB:IJE,IKE)
PLM(IIB:IIE,IJB:IJE,D%NKA) = PZZ(IIB:IIE,IJB:IJE,IKB) - PZZ(IIB:IIE,IJB:IJE,D%NKA)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme

RODIER Quentin
committed
IF ( O2D) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT) = SQRT( PLM(IIB:IIE,IJB:IJE,1:D%NKT)*ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT) )
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
ELSE

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT) = (PLM(IIB:IIE,IJB:IJE,1:D%NKT)*ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT) &
* ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) ) ** (1./3.)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
END IF
END IF
ELSE
! Dz not taken into account in computation to assure invariability with vertical grid mesh

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT)=1.E10
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme

RODIER Quentin
committed
IF ( O2D) THEN

RODIER Quentin
committed
PLM(:,:,:) = ZWORK1(:,:,:)

RODIER Quentin
committed
ELSE

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT) = (ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT)*ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) ) ** (1./2.)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
END IF
END IF
END IF
!
! mixing length limited by the distance normal to the surface
! (with the same factor as for BL89)
!
IF (.NOT. ORMC01) THEN
ZALPHA=0.5**(-1.5)
!
DO JJ=1,SIZE(PUT,2)
DO JI=1,SIZE(PUT,1)
IF (OOCEAN) THEN

RODIER Quentin
committed
DO JK=IKTE,IKTB,-1
ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK))
IF ( PLM(JI,JJ,JK)>ZD) THEN
PLM(JI,JJ,JK)=ZD
ELSE
EXIT
ENDIF
END DO
ELSE
DO JK=IKTB,IKTE
ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+D%NKL))&

RODIER Quentin
committed
-PZZ(JI,JJ,IKB)) *PDIRCOSZW(JI,JJ)
IF ( PLM(JI,JJ,JK)>ZD) THEN
PLM(JI,JJ,JK)=ZD
ELSE
EXIT
ENDIF
END DO
ENDIF
END DO
END DO
END IF
!

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
PLM(IIB:IIE,IJB:IJE,D%NKA) = PLM(IIB:IIE,IJB:IJE,IKB)
PLM(IIB:IIE,IJB:IJE,D%NKU) = PLM(IIB:IIE,IJB:IJE,IKE)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:DELT',1,ZHOOK_HANDLE2)
END SUBROUTINE DELT
!
! ####################
SUBROUTINE DEAR(PLM)
! ####################
!!

RODIER Quentin
committed
!!**** *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%NIT,D%NJT,D%NKT), INTENT(OUT) :: PLM
!
!-------------------------------------------------------------------------------
!
! initialize the mixing length with the mesh grid

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:DEAR',0,ZHOOK_HANDLE2)

RODIER Quentin
committed
IF ( HTURBDIM /= '1DIM' ) THEN
CALL MXF_PHY(D,PDXX,ZWORK1)
IF (.NOT. O2D) THEN
CALL MYF_PHY(D,PDYY,ZWORK2)
END IF
END IF

RODIER Quentin
committed
! 1D turbulence scheme

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=IKTB:IKTE)
PLM(IIB:IIE,IJB:IJE,IKTB:IKTE) = PZZ(IIB:IIE,IJB:IJE,D%NKL+IKTB:IKTE+D%NKL) - PZZ(IIB:IIE,IJB:IJE,IKTB:IKTE)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=IKTB:IKTE)
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
PLM(IIB:IIE,IJB:IJE,D%NKU) = PLM(IIB:IIE,IJB:IJE,IKE)
PLM(IIB:IIE,IJB:IJE,D%NKA) = PZZ(IIB:IIE,IJB:IJE,IKB) - PZZ(IIB:IIE,IJB:IJE,D%NKA)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
!
IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme

RODIER Quentin
committed
IF ( O2D) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT) = SQRT( PLM(IIB:IIE,IJB:IJE,1:D%NKT)*ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT) )
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
PLM(IIB:IIE,IJB:IJE,1:D%NKT) = (PLM(IIB:IIE,IJB:IJE,1:D%NKT)*ZWORK1(IIB:IIE,IJB:IJE,1:D%NKT) &
* ZWORK2(IIB:IIE,IJB:IJE,1:D%NKT) ) ** (1./3.)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
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)

RODIER Quentin
committed
IF (KRR>0) THEN
DO JK = IKTB+1,IKTE-1
DO JJ=1,SIZE(PUT,2)
DO JI=1,SIZE(PUT,1)
ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+D%NKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+D%NKL)+ &
(PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-D%NKL))/PDZZ(JI,JJ,JK ))
ZDRTDZ(JI,JJ,JK) = 0.5*((PRT(JI,JJ,JK+D%NKL,1)-PRT(JI,JJ,JK ,1))/PDZZ(JI,JJ,JK+D%NKL)+ &
(PRT(JI,JJ,JK ,1)-PRT(JI,JJ,JK-D%NKL,1))/PDZZ(JI,JJ,JK ))
IF (OOCEAN) THEN

RODIER Quentin
committed
ZVAR=CST%XG*(CST%XALPHAOC*ZDTHLDZ(JI,JJ,JK)-CST%XBETAOC*ZDRTDZ(JI,JJ,JK))

RODIER Quentin
committed
ELSE

RODIER Quentin
committed
ZVAR=CST%XG/PTHVREF(JI,JJ,JK)* &

RODIER Quentin
committed
(ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK)+ZEMOIST(JI,JJ,JK)*ZDRTDZ(JI,JJ,JK))
END IF
!
IF (ZVAR>0.) THEN

RODIER Quentin
committed
PLM(JI,JJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JI,JJ,JK), &

RODIER Quentin
committed
0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR)))
END IF
END DO
END DO
END DO
ELSE! For dry atmos or unsalted ocean runs
DO JK = IKTB+1,IKTE-1
DO JJ=1,SIZE(PUT,2)
DO JI=1,SIZE(PUT,1)
ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+D%NKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+D%NKL)+ &
(PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-D%NKL))/PDZZ(JI,JJ,JK ))
IF (OOCEAN) THEN

RODIER Quentin
committed
ZVAR= CST%XG*CST%XALPHAOC*ZDTHLDZ(JI,JJ,JK)

RODIER Quentin
committed
ELSE

RODIER Quentin
committed
ZVAR= CST%XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK)

RODIER Quentin
committed
END IF
!
IF (ZVAR>0.) THEN

RODIER Quentin
committed
PLM(JI,JJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JI,JJ,JK), &

RODIER Quentin
committed
0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR)))
END IF
END DO
END DO
END DO
END IF

RODIER Quentin
committed
! special case near the surface
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
ZDTHLDZ(IIB:IIE,IJB:IJE,IKB)=(PTHLT(IIB:IIE,IJB:IJE,IKB+D%NKL)-PTHLT(IIB:IIE,IJB:IJE,IKB))/PDZZ(IIB:IIE,IJB:IJE,IKB+D%NKL)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
! For dry simulations
IF (KRR>0) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
ZDRTDZ(IIB:IIE,IJB:IJE,IKB)=(PRT(IIB:IIE,IJB:IJE,IKB+D%NKL,1)-PRT(IIB:IIE,IJB:IJE,IKB,1))/PDZZ(IIB:IIE,IJB:IJE,IKB+D%NKL)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
ELSE
ZDRTDZ(:,:,IKB)=0
ENDIF
IF (OOCEAN) THEN

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
ZWORK2D(IIB:IIE,IJB:IJE)=CST%XG*(CST%XALPHAOC*ZDTHLDZ(IIB:IIE,IJB:IJE,IKB)-CST%XBETAOC*ZDRTDZ(IIB:IIE,IJB:IJE,IKB))
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
ELSE

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
ZWORK2D(IIB:IIE,IJB:IJE)=CST%XG/PTHVREF(IIB:IIE,IJB:IJE,IKB)* &
(ZETHETA(IIB:IIE,IJB:IJE,IKB)*ZDTHLDZ(IIB:IIE,IJB:IJE,IKB)+ZEMOIST(IIB:IIE,IJB:IJE,IKB)*ZDRTDZ(IIB:IIE,IJB:IJE,IKB))
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
END IF

RODIER Quentin
committed
!$mnh_expand_where(JI=IIB:IIE,JJ=IJB:IJE)
WHERE(ZWORK2D(IIB:IIE,IJB:IJE)>0.)
PLM(IIB:IIE,IJB:IJE,IKB)=MAX(CST%XMNH_EPSILON,MIN( PLM(IIB:IIE,IJB:IJE,IKB), &
0.76* SQRT(PTKET(IIB:IIE,IJB:IJE,IKB)/ZWORK2D(IIB:IIE,IJB:IJE))))
END WHERE

RODIER Quentin
committed
!$mnh_end_expand_where(JI=IIB:IIE,JJ=IJB:IJE)
!
! mixing length limited by the distance normal to the surface (with the same factor as for BL89)
!
IF (.NOT. ORMC01) THEN
ZALPHA=0.5**(-1.5)
!
DO JJ=1,SIZE(PUT,2)
DO JI=1,SIZE(PUT,1)
IF (OOCEAN) THEN

RODIER Quentin
committed
DO JK=IKTE,IKTB,-1
ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK))
IF ( PLM(JI,JJ,JK)>ZD) THEN
PLM(JI,JJ,JK)=ZD
ELSE
EXIT
ENDIF
END DO
ELSE
DO JK=IKTB,IKTE
ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+D%NKL))-PZZ(JI,JJ,IKB)) &

RODIER Quentin
committed
*PDIRCOSZW(JI,JJ)
IF ( PLM(JI,JJ,JK)>ZD) THEN
PLM(JI,JJ,JK)=ZD
ELSE
EXIT
ENDIF
END DO
ENDIF
END DO
END DO
END IF
!

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE)
PLM(IIB:IIE,IJB:IJE,D%NKA) = PLM(IIB:IIE,IJB:IJE,IKB)
PLM(IIB:IIE,IJB:IJE,IKE) = PLM(IIB:IIE,IJB:IJE,IKE-D%NKL)
PLM(IIB:IIE,IJB:IJE,D%NKU) = PLM(IIB:IIE,IJB:IJE,D%NKU-D%NKL)
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE)

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:DEAR',1,ZHOOK_HANDLE2)
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
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
! --------------
!

RODIER Quentin
committed
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
!

RODIER Quentin
committed
!$mnh_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
ZCOEF_AMPL(IIB:IIE,IJB:IJE,1:D%NKT) = 1.
!$mnh_end_expand_array(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
!* 2. CALCULATION OF THE AMPLIFICATION COEFFICIENT
! --------------------------------------------
!
! Saturation
!

RODIER Quentin
committed
!$mnh_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
WHERE ( PCEI(IIB:IIE,IJB:IJE,1:D%NKT)>=PCEI_MAX )
ZCOEF_AMPL(IIB:IIE,IJB:IJE,1:D%NKT)=PCOEF_AMPL_SAT
END WHERE
!$mnh_end_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
! Between the min and max limits of CEI index, linear variation of the
! amplification coefficient ZCOEF_AMPL as a function of CEI
!

RODIER Quentin
committed
!$mnh_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
WHERE ( PCEI(IIB:IIE,IJB:IJE,1:D%NKT) < PCEI_MAX .AND. PCEI(IIB:IIE,IJB:IJE,1:D%NKT) > PCEI_MIN)
ZCOEF_AMPL(IIB:IIE,IJB:IJE,1:D%NKT) = ZPENTE * PCEI(IIB:IIE,IJB:IJE,1:D%NKT) + ZCOEF_AMPL_CEI_NUL
END WHERE
!$mnh_end_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
!
!* 3. CALCULATION OF THE MIXING LENGTH IN CLOUDS
! ------------------------------------------
!
IF (HTURBLEN_CL == HTURBLEN) THEN
ZLM_CLOUD(:,:,:) = ZLM(:,:,:)
ELSE
SELECT CASE (HTURBLEN_CL)
!
!* 3.1 BL89 mixing length
! ------------------

RODIER Quentin
committed
CASE ('BL89','RM17','ADAP')

RODIER Quentin
committed
ZSHEAR(:,:,:)=0.

RODIER Quentin
committed
CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN,HPROGRAM)
!
!* 3.2 Delta mixing length
! -------------------
CASE ('DELT')

RODIER Quentin
committed
CALL DELT(ZLM_CLOUD,ODZ=.TRUE.)
!
!* 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

RODIER Quentin
committed
IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'LM_CLEAR_SKY'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'LM_CLEAR_SKY'
TZFIELD%CUNITS = 'm'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM)
ENDIF
!
! Amplification of the mixing length when the criteria are verified
!

RODIER Quentin
committed
!$mnh_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
WHERE (ZCOEF_AMPL(IIB:IIE,IJB:IJE,1:D%NKT) /= 1.)
ZLM(IIB:IIE,IJB:IJE,1:D%NKT) = ZCOEF_AMPL(IIB:IIE,IJB:IJE,1:D%NKT)*ZLM_CLOUD(IIB:IIE,IJB:IJE,1:D%NKT)
END WHERE
!$mnh_end_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
! Cloud mixing length in the clouds at the points which do not verified the CEI
!

RODIER Quentin
committed
!$mnh_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
WHERE (PCEI(IIB:IIE,IJB:IJE,1:D%NKT) == -1.)
ZLM(IIB:IIE,IJB:IJE,1:D%NKT) = ZLM_CLOUD(IIB:IIE,IJB:IJE,1:D%NKT)
END WHERE
!$mnh_end_expand_where(JI=IIB:IIE,JJ=IJB:IJE,JK=1:D%NKT)
!
!
!* 5. IMPRESSION
! ----------
!

RODIER Quentin
committed
IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'COEF_AMPL'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'COEF_AMPL'
TZFIELD%CUNITS = '1'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZCOEF_AMPL)

RODIER Quentin
committed
TZFIELD%CMNHNAME = 'LM_CLOUD'
TZFIELD%CSTDNAME = ''
TZFIELD%CLONGNAME = 'LM_CLOUD'
TZFIELD%CUNITS = 'm'
TZFIELD%CDIR = 'XY'
TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3

RODIER Quentin
committed
CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM_CLOUD)
!
ENDIF
!

RODIER Quentin
committed
IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',1,ZHOOK_HANDLE2)
END SUBROUTINE CLOUD_MODIF_LM
!
END SUBROUTINE TURB