diff --git a/src/common/turb/mode_turb_ver_sv_corr.F90 b/src/common/turb/mode_turb_ver_sv_corr.F90 index 55a477d1083e63c213ec276b5cddc7b21bbb3784..95a0a6568813709e2537be48156d4d5ebcad864c 100644 --- a/src/common/turb/mode_turb_ver_sv_corr.F90 +++ b/src/common/turb/mode_turb_ver_sv_corr.F90 @@ -121,12 +121,12 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT,KSV), INTENT(IN) :: PPSI_SV ! Inv.Turb.S !* 0.2 declaration of local variables ! ! -REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: & - ZA, ZFLXZ +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZA, ZFLXZ, & + ZWORK1,ZWORK2,ZWORK3! working var. for shuman operators (array syntax) ! REAL :: ZCSV !constant for the scalar flux ! -INTEGER :: JSV ! loop counters +INTEGER :: JI,JJ,JK,JSV ! loop counters ! REAL :: ZTIME1, ZTIME2 ! @@ -154,8 +154,12 @@ DO JSV=1,KSV ! IF (OLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) - ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(D%NKA, D%NKU, D%NKL,PSVM(:,:,:,JSV),PDZZ)**2 - ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:), D%NKA, D%NKU, D%NKL) + ZWORK1 = GZ_M_W(D%NKA, D%NKU, D%NKL,PSVM(:,:,:,JSV),PDZZ) + ZWORK2 = MZF(ZFLXZ(:,:,:), D%NKA, D%NKU, D%NKL) + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*ZWORK1(:,:,:)**2 + ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * ZWORK2(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) CALL LES_MEAN_SUBGRID(-2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID(MZF(PWM, D%NKA, D%NKU, D%NKL)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) END IF @@ -165,19 +169,35 @@ DO JSV=1,KSV IF (OLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) ZA(:,:,:) = ETHETA(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN,OCOMPUTE_SRC) - ZFLXZ(:,:,:)= ( CSTURB%XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(D%NKA, D%NKU, D%NKL,PTHLM,PDZZ) & - * GZ_M_W(D%NKA, D%NKU, D%NKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ, D%NKA, D%NKU, D%NKL) + ! + ZWORK1 = GZ_M_W(D%NKA, D%NKU, D%NKL,PTHLM,PDZZ) + ZWORK2 = GZ_M_W(D%NKA, D%NKU, D%NKL,PSVM(:,:,:,JSV),PDZZ) + ! + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:)= ( CSTURB%XCSHF * PPHI3(:,:,:) + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * ZWORK1(:,:,:) * ZWORK2(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ! + ZWORK3 = MZF(ZFLXZ, D%NKA, D%NKU, D%NKL) + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) / (2.*ZCTSVD) * ZWORK3(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ! CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! IF (KRR>=1) THEN ZA(:,:,:) = EMOIST(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) - ZFLXZ(:,:,:)= ( ZCSV * PPSI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(D%NKA, D%NKU, D%NKL,PRM(:,:,:,1),PDZZ) & - * GZ_M_W(D%NKA, D%NKU, D%NKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ, D%NKA, D%NKU, D%NKL) + ! + ZWORK1 = GZ_M_W(D%NKA, D%NKU, D%NKL,PRM(:,:,:,1),PDZZ) + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:)= ( ZCSV * PPSI3(:,:,:) + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * ZWORK1(:,:,:) * ZWORK2(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZWORK3 = MZF(ZFLXZ, D%NKA, D%NKU, D%NKL) + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) / (2.*ZCQSVD) * ZWORK3(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) END IF diff --git a/src/common/turb/mode_turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 index 892a5c36093bdf2c7de969097d44065650d7094c..0d02669a2e63f4796d515052d7377489e6cf707a 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -246,7 +246,7 @@ INTEGER, INTENT(IN) :: KSV, & LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme LOGICAL, INTENT(IN) :: OHARAT LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step @@ -291,13 +291,14 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: & ! considered in ZSOURCE ZFLXZ, & ! vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZWORK1,ZWORK2! working var. for shuman operators (array syntax) INTEGER :: IKB,IKE ! I index values for the Beginning and End ! mass points of the domain in the 3 direct. INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain INTEGER :: JSV ! loop counters -INTEGER :: JK ! loop +INTEGER :: JI,JJ,JK ! loop ! REAL :: ZTIME1, ZTIME2 @@ -320,35 +321,39 @@ IKB=D%NKB IKE=D%NKE ! IF (OHARAT) THEN + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50.*MFMOIST(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ELSE ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), D%NKA, D%NKU, D%NKL) ENDIF ! IF(OBLOWSNOW) THEN ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables - ZCSV= CSTURB%XCHF/XRSNOW + ZCSV=CSTURB%XCHF/XRSNOW ELSE - ZCSV= CSTURB%XCHF + ZCSV=CSTURB%XCHF ENDIF !---------------------------------------------------------------------------- ! !* 8. SOURCES OF PASSIVE SCALAR VARIABLES ! ----------------------------------- ! +ZWORK1=MZM(PRHODJ, D%NKA, D%NKU, D%NKL) DO JSV=1,KSV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE ! ! Preparation of the arguments for TRIDIAG IF (OHARAT) THEN - ZA(:,:,:) = -PTSTEP* & - ZKEFF * MZM(PRHODJ, D%NKA, D%NKU, D%NKL) / & - PDZZ**2 + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZA(:,:,:) = -PTSTEP * ZKEFF(:,:,:) * ZWORK1(:,:,:) / PDZZ(:,:,:)**2 + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ELSE - ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & - ZKEFF * MZM(PRHODJ, D%NKA, D%NKU, D%NKL) / & - PDZZ**2 + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & + ZKEFF(:,:,:) * ZWORK1(:,:,:) / PDZZ(:,:,:)**2 + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ENDIF ZSOURCE(:,:,:) = 0. ! @@ -359,14 +364,17 @@ DO JSV=1,KSV !* in 1DIM case, the part of energy released in horizontal flux ! is taken into account in the vertical part IF (HTURBDIM=='3DIM') THEN + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & PDZZ(:,:,IKB) * PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,D%NKA) / PRHODJ(:,:,IKB)) + * 0.5 * (1. + PRHODJ(:,:,D%NKA) / PRHODJ(:,:,IKB)) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ELSE - + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & PDZZ(:,:,IKB) / PDIRCOSZW(:,:) & * 0.5 * (1. + PRHODJ(:,:,D%NKA) / PRHODJ(:,:,IKB)) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT) END IF ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. ZSOURCE(:,:,IKE) = 0. @@ -375,34 +383,47 @@ DO JSV=1,KSV CALL TRIDIAG(D,D%NKA,D%NKU,D%NKL,PSVM(:,:,:,JSV),ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,ZSOURCE,ZRES) ! ! Compute the equivalent tendency for the JSV scalar variable + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV)+ & PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ! IF ( (OTURB_FLX .AND. TPFILE%LOPENED) .OR. OLES_CALL ) THEN ! Diagnostic of the cartesian vertical flux ! - ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM), D%NKA, D%NKU, D%NKL) / PDZZ * & - DZM(PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV), D%NKA, D%NKU, D%NKL) + ZWORK1 = MZM(PLM*SQRT(PTKEM), D%NKA, D%NKU, D%NKL) + ZWORK2 = DZM(PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV), D%NKA, D%NKU, D%NKL) + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) + ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * ZWORK1(:,:,:) / PDZZ(:,:,:) * & + ZWORK2(:,:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT,JK=1:D%NKT) ! surface flux !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally ! (in presence of slopes) !* in 1DIM case, the part of energy released in horizontal flux ! is taken into account in the vertical part IF (HTURBDIM=='3DIM') THEN + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & * PDIRCOSZW(:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ELSE + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & / PDIRCOSZW(:,:) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT) END IF ! extrapolates the flux under the ground so that the vertical average with ! the IKB flux gives the ground value + ! + !$mnh_expand_array(JI=1:D%NIT,JJ=1:D%NJT) ZFLXZ(:,:,D%NKA) = ZFLXZ(:,:,IKB) DO JK=IKTB+1,IKTE-1 PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+D%NKL)) END DO PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+D%NKL)) PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-D%NKL,JSV) + !$mnh_end_expand_array(JI=1:D%NIT,JJ=1:D%NJT) END IF ! IF (OTURB_FLX .AND. TPFILE%LOPENED) THEN