diff --git a/docs/Interfaces b/docs/Interfaces index a233c0e9d195229feaf8887c232326d1b096a995..058e4f878ce35ea769b9e2950372185e49d10de8 100644 --- a/docs/Interfaces +++ b/docs/Interfaces @@ -18,8 +18,6 @@ Dependencies: - budget - mode_msg, modd_io - modd_precision -- modd_cst - yomhook, parkind1 - diff --git a/src/arome/.gmkpack_ignored_files.swp b/src/arome/.gmkpack_ignored_files.swp new file mode 100644 index 0000000000000000000000000000000000000000..3105dd92e5d0dfc3fbb5d5eb07555133de865b56 Binary files /dev/null and b/src/arome/.gmkpack_ignored_files.swp differ diff --git a/src/arome/externals/gradient_m.F90 b/src/arome/externals/gradient_m.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f9427caa265cc37dae1bdb44642a546531c1d7e8 --- /dev/null +++ b/src/arome/externals/gradient_m.F90 @@ -0,0 +1,670 @@ +! ######spl + FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GX_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___x ) ) +! 1 ( _x (d*zx dzm(PA) ) ) +! PGX_M_M = ---- (dxf(PA) - (------------)) ) +! ___x ( ( ) ) +! d*xx ( ( d*zz ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MXF,MZF : Shuman functions (mean operators) +!! DXF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DXF, MZF, DZM, MXF, MXM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_M_M +! -------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GX_M_M',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:))) - & + MZF(MXF(PDZX)*DZM(PA(:,:,:), KKA, KKU, KL) & + /PDZZ(:,:,:), KKA, KKU, KL) ) /MXF(PDXX(:,:,:)) +ELSE + PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GX_M_M',1,ZHOOK_HANDLE) +END FUNCTION GX_M_M +! ######spl + FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_U) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ################################################## +! +!!**** *GX_M_U * - Compute the gradient along x for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x +! direction for a field PY localized at a mass point. The result PGX_M_U +! is localized at a x-flux point (u point). +! +! ( ____________z ) +! ( ________x ) +! 1 ( dzm(PY) ) +! PGX_M_U = ---- (dxm(PY) - d*zx -------- ) +! d*xx ( d*zz ) +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDXX,PDZX,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DXM: compute a finite difference along the x direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MXM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GX_M_U) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!! 20/08/00 optimization (J. Escobar) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux + ! side +INTEGER IIU,IKU,JI,JK +! +INTEGER :: JJK,IJU +INTEGER :: JIJK,JIJKOR,JIJKEND +INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1 +! +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG X +! ----------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GX_M_U',0,ZHOOK_HANDLE) +IIU=SIZE(PY,1) +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) +IF (.NOT. LFLAT) THEN +! PGX_M_U = ( DXM(PY) - MZF ( MXM( DZM(PY) /PDZZ ) * PDZX ) )/PDXX +!! DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB +!! DO JI=1+JPHEXT,IIU +!! PGX_M_U(JI,:,JK)= & +!! ( PY(JI,:,JK)-PY(JI-1,:,JK) & +!! -( (PY(JI,:,JK)-PY(JI,:,JK-1)) / PDZZ(JI,:,JK) & +!! +(PY(JI-1,:,JK)-PY(JI-1,:,JK-1)) / PDZZ(JI-1,:,JK) & +!! ) * PDZX(JI,:,JK)* 0.25 & +!! -( (PY(JI,:,JK+1)-PY(JI,:,JK)) / PDZZ(JI,:,JK+1) & +!! +(PY(JI-1,:,JK+1)-PY(JI-1,:,JK)) / PDZZ(JI-1,:,JK+1) & +!! ) * PDZX(JI,:,JK+1)* 0.25 & +!! ) / PDXX(JI,:,JK) +!! END DO +!! END DO + JIJKOR = 1 + JPHEXT + IIU*IJU*(JPVEXT_TURB+1 - 1) + JIJKEND = IIU*IJU*(IKU-JPVEXT_TURB) +!CDIR NODEP +!OCL NOVREC + DO JIJK=JIJKOR , JIJKEND +! indexation + JI_1JK = JIJK - 1 + JIJK_1 = JIJK - IIU*IJU*KL + JI_1JK_1 = JIJK - 1 - IIU*IJU*KL + JIJKP1 = JIJK + IIU*IJU*KL + JI_1JKP1 = JIJK - 1 + IIU*IJU*KL +! + PGX_M_U(JIJK,1,1)= & + ( PY(JIJK,1,1)-PY(JI_1JK,1,1) & + -( (PY(JIJK,1,1)-PY(JIJK_1,1,1)) / PDZZ(JIJK,1,1) & + +(PY(JI_1JK,1,1)-PY(JI_1JK_1,1,1)) / PDZZ(JI_1JK,1,1) & + ) * PDZX(JIJK,1,1)* 0.25 & + -( (PY(JIJKP1,1,1)-PY(JIJK,1,1)) / PDZZ(JIJKP1,1,1) & + +(PY(JI_1JKP1,1,1)-PY(JI_1JK,1,1)) / PDZZ(JI_1JKP1,1,1) & + ) * PDZX(JIJKP1,1,1)* 0.25 & + ) / PDXX(JIJK,1,1) + END DO + +! + DO JI=1+JPHEXT,IIU + PGX_M_U(JI,:,KKU)= ( PY(JI,:,KKU)-PY(JI-1,:,KKU) ) / PDXX(JI,:,KKU) + PGX_M_U(JI,:,KKA)= -999. + END DO +! + PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) +ELSE +! PGX_M_U = DXM(PY) / PDXX + PGX_M_U(1+JPHEXT:IIU,:,:) = ( PY(1+JPHEXT:IIU,:,:)-PY(JPHEXT:IIU-1,:,:) ) & + / PDXX(1+JPHEXT:IIU,:,:) +! + PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) +ENDIF +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GX_M_U',1,ZHOOK_HANDLE) +END FUNCTION GX_M_U +! ######spl + FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GY_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___y ) ) +! 1 ( _y (d*zy dzm(PA) ) ) +! PGY_M_M = ---- (dyf(PA) - (------------)) ) +! ___y ( ( ) ) +! d*yy ( ( d*zz ) ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM,MYF,MZF : Shuman functions (mean operators) +!! DYF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODD_CONF +USE MODI_SHUMAN, ONLY: DYF, MZF, DZM, MYF, MYM +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_M_M +! -------------------- +! +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GY_M_M',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(MYF(PDZY)*DZM(PA, KKA, KKU, KL)& + /PDZZ, KKA, KKU, KL)) /MYF(PDYY) +ELSE + PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY) +ENDIF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GY_M_M',1,ZHOOK_HANDLE) +END FUNCTION GY_M_M +! ######spl + FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_V) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ################################################## +! +!!**** *GY_M_V * - Compute the gradient along y for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along y +! direction for a field PY localized at a mass point. The result PGY_M_V +! is localized at a y-flux point (v point). +! +! ( ____________z ) +! ( ________y ) +! 1 ( dzm(PY) ) +! PGY_M_V = ---- (dym(PY) - d*zy -------- ) +! d*yy ( d*zz ) +! +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDYY,PDZY,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DYM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MYM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GY_M_V) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux + ! side +INTEGER IJU,IKU,JJ,JK +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Y +! ---------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GY_M_V',0,ZHOOK_HANDLE) +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) +IF (.NOT. LFLAT) THEN +! PGY_M_V = ( DYM(PY) - MZF ( MYM( DZM(PY) /PDZZ ) * PDZY ) )/PDYY + DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,JK)= & + ( PY(:,JJ,JK)-PY(:,JJ-1,JK) & + -( (PY(:,JJ,JK)-PY(:,JJ,JK-KL)) / PDZZ(:,JJ,JK) & + +(PY(:,JJ-1,JK)-PY(:,JJ-KL,JK-KL)) / PDZZ(:,JJ-1,JK) & + ) * PDZY(:,JJ,JK)* 0.25 & + -( (PY(:,JJ,JK+KL)-PY(:,JJ,JK)) / PDZZ(:,JJ,JK+KL) & + +(PY(:,JJ-1,JK+KL)-PY(:,JJ-1,JK)) / PDZZ(:,JJ-1,JK+KL) & + ) * PDZY(:,JJ,JK+KL)* 0.25 & + ) / PDYY(:,JJ,JK) + END DO + END DO +! + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,KKU)= ( PY(:,JJ,KKU)-PY(:,JJ-1,KKU) ) / PDYY(:,JJ,KKU) + PGY_M_V(:,JJ,KKA)= -999. + END DO +! + PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) +ELSE +! PGY_M_V = DYM(PY)/PDYY + PGY_M_V(:,1+JPHEXT:IJU,:) = ( PY(:,1+JPHEXT:IJU,:)-PY(:,JPHEXT:IJU-1,:) ) & + / PDYY(:,1+JPHEXT:IJU,:) +! + PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) +ENDIF +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GY_M_V',1,ZHOOK_HANDLE) +END FUNCTION GY_M_V +! ######spl + FUNCTION GZ_M_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GZ_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! _________z +! (dzm(PA)) +! PGZ_M_M = (------ ) +! ( d*zz ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MZF : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: MZF, DZM +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_M_M +! -------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GZ_M_M',0,ZHOOK_HANDLE) +PGZ_M_M(:,:,:)= MZF(DZM(PA(:,:,:), KKA, KKU, KL)/PDZZ(:,:,:), KKA, KKU, KL) +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GZ_M_M',1,ZHOOK_HANDLE) +END FUNCTION GZ_M_M +! ######spl + FUNCTION GZ_M_W(PY,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_W) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ######################################### +! +!!**** *GZ_M_W * - Compute the gradient along z direction for a +!! variable localized at a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x,y,z +! directions for a field PY localized at a mass point. The result PGZ_M_W +! is localized at a z-flux point (w point) +! +! +! dzm(PY) +! PGZ_M_W = ------- +! d*zz +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DZM : compute a finite difference along the z +!! direction for a variable at a mass localization +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODI_SHUMAN : interface for the Shuman functions +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GZ_M_W) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! + ! Metric coefficient: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux + ! side +! +INTEGER :: IKT,IKTB,IKTE +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Z +! ----------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GZ_M_W',0,ZHOOK_HANDLE) +IKT=SIZE(PY,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB + +PGZ_M_W(:,:,IKTB:IKTE) = (PY(:,:,IKTB:IKTE)-PY(:,:,IKTB-KL:IKTE-KL)) & + / PDZZ(:,:,IKTB:IKTE) +PGZ_M_W(:,:,KKU)= (PY(:,:,KKU)-PY(:,:,KKU-KL)) & + / PDZZ(:,:,KKU) +PGZ_M_W(:,:,KKA)=-999. +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GZ_M_W',1,ZHOOK_HANDLE) +END FUNCTION GZ_M_W diff --git a/src/arome/externals/gradient_u.F90 b/src/arome/externals/gradient_u.F90 new file mode 100644 index 0000000000000000000000000000000000000000..96c0af25be42efcb11f3efb8f6f76e57db7840b8 --- /dev/null +++ b/src/arome/externals/gradient_u.F90 @@ -0,0 +1,288 @@ +! ######spl + FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_U_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GX_U_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! U point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! U point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___________x ) ) +! 1 ( (d*zx dzm(PA) ) ) +! PGX_U_M = ---- (dxf(PA) - (------------)) ) +! ___x ( ( ) ) +! d*xx ( ( d*zz ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXF,MZF : Shuman functions (mean operators) +!! DXF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DXF, MZF, DZM, MXF +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_U_M +! -------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GX_U_M',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGX_U_M(:,:,:)= ( DXF(PA) - & + MZF(MXF(PDZX*DZM(PA, KKA, KKU, KL)) / PDZZ, KKA, KKU, KL) & + ) / MXF(PDXX) +ELSE + PGX_U_M(:,:,:)= DXF(PA) / MXF(PDXX) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GX_U_M',1,ZHOOK_HANDLE) +END FUNCTION GX_U_M +! ######spl + FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_U_UV) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ######################################################### +! +!!**** *GY_U_UV* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! U point and the result is placed at +!! the UV vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! U point. The result is placed at the UV vorticity point. +! +! +! +! ( _________________z ) +! ( (___x _________y ) ) +! 1 ( (d*zy (dzm(PA))) ) ) +! PGY_U_UV= ---- (dym(PA) - ( (------ ) ) ) +! ___x ( ( ( ___x ) ) ) +! d*yy ( ( ( d*zz ) ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MYM,MZF : Shuman functions (mean operators) +!! DYM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DYM, MZF, DZM, MXM, MYM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_U_UV +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GY_U_UV',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGY_U_UV(:,:,:)= (DYM(PA)- MZF(MYM(DZM(PA, KKA, KKU, KL)/& + MXM(PDZZ)) *MXM(PDZY), KKA, KKU, KL) ) / MXM(PDYY) +ELSE + PGY_U_UV(:,:,:)= DYM(PA) / MXM(PDYY) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GY_U_UV',1,ZHOOK_HANDLE) +END FUNCTION GY_U_UV +! ######spl + FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_U_UW) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GZ_U_UW - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! U point and the result is placed at +!! the UW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! U point. The result is placed at the UW vorticity point. +! +! dzm(PA) +! PGZ_U_UW = ------ +! ____x +! d*zz +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DZM, MXM +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_U_UW +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GZ_U_UW',0,ZHOOK_HANDLE) +PGZ_U_UW(:,:,:)= DZM(PA, KKA, KKU, KL) / MXM(PDZZ) +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GZ_U_UW',1,ZHOOK_HANDLE) +END FUNCTION GZ_U_UW diff --git a/src/arome/externals/gradient_v.F90 b/src/arome/externals/gradient_v.F90 new file mode 100644 index 0000000000000000000000000000000000000000..3dd2f23776cf0b1c4904a2ab6a743aa516af4d19 --- /dev/null +++ b/src/arome/externals/gradient_v.F90 @@ -0,0 +1,287 @@ +! ######spl + FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_V_UV) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ######################################################### +! +!!**** *GX_V_UV* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! V point and the result is placed at +!! the UV vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! V point. The result is placed at the UV vorticity point. +! +! +! ( _________________z ) +! ( (___y _________x ) ) +! 1 ( (d*zx (dzm(PA))) ) ) +! PGX_V_UV= ---- (dxm(PA) - ( (------ ) ) ) +! ___y ( ( ( ___y ) ) ) +! d*xx ( ( ( d*zz ) ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MZF,MYM : Shuman functions (mean operators) +!! DXM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DXM, MZF, DZM, MYM, MXM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_V_UV +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GX_V_UV',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGX_V_UV(:,:,:)= ( DXM(PA)- MZF(MXM(DZM(PA, KKA, KKU, KL)/& + MYM(PDZZ) ) *MYM(PDZX), KKA, KKU, KL)) / MYM(PDXX) +ELSE + PGX_V_UV(:,:,:)= DXM(PA) / MYM(PDXX) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GX_V_UV',1,ZHOOK_HANDLE) +END FUNCTION GX_V_UV +! ######spl + FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_V_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GY_V_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! V point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! V point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___________y ) ) +! 1 ( (d*zy dzm(PA) ) ) +! PGY_V_M = ---- (dyf(PA) - (------------)) ) +! ___y ( ( ) ) +! d*yy ( ( d*zz ) ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYF,MZF : Shuman functions (mean operators) +!! DYF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DYF, MZF, MYF, DZM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_V_M +! -------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GY_V_M',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGY_V_M(:,:,:)= (DYF(PA) - & + MZF(MYF(PDZY*DZM(PA, KKA, KKU, KL))/PDZZ, KKA, KKU, KL) & + ) / MYF(PDYY) +ELSE + PGY_V_M(:,:,:)= DYF(PA) / MYF(PDYY) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GY_V_M',1,ZHOOK_HANDLE) +END FUNCTION GY_V_M +! ######spl + FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_V_VW) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GZ_V_VW - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! V point and the result is placed at +!! the VW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! V point. The result is placed at the VW vorticity point. +! +! +! dzm(PA) +! PGZ_V_VW = ------ +! ____y +! d*zz +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DZM, MYM +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_V_VW +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GZ_V_VW',0,ZHOOK_HANDLE) +PGZ_V_VW(:,:,:)= DZM(PA, KKA, KKU, KL) / MYM(PDZZ) +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GZ_V_VW',1,ZHOOK_HANDLE) +END FUNCTION GZ_V_VW diff --git a/src/arome/externals/gradient_w.F90 b/src/arome/externals/gradient_w.F90 new file mode 100644 index 0000000000000000000000000000000000000000..b17ca4bab07ca090d3b9610d453bc6f35b6a3fcc --- /dev/null +++ b/src/arome/externals/gradient_w.F90 @@ -0,0 +1,263 @@ +! ######spl + FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_W_UW) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ######################################################### +! +!!**** *GX_W_UW* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! V point and the result is placed at +!! the UW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! W point. The result is placed at the UW vorticity point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MZM,MZF : Shuman functions (mean operators) +!! DXM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DXM, MZM, DZM, MZF, MZM, MXM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_W_UW +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GX_W_UW',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:), KKA, KKU, KL)) & + -DZM(MXM(MZF(PA(:,:,:), KKA, KKU, KL)), KKA, KKU, KL)*PDZX(:,:,:) & + /(MZM(PDXX(:,:,:), KKA, KKU, KL)*MXM(PDZZ(:,:,:)) ) +ELSE + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:), KKA, KKU, KL)) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GX_W_UW',1,ZHOOK_HANDLE) +END FUNCTION GX_W_UW +! ######spl + FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_W_VW) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ######################################################### +! +!!**** *GY_W_VW* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! W point and the result is placed at +!! the VW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! W point. The result is placed at the VW vorticity point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM,MZM,MZF : Shuman functions (mean operators) +!! DYM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DYM, MZM, DZM, MZF, MYM +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_W_VW +! --------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GY_W_VW',0,ZHOOK_HANDLE) +IF (.NOT. LFLAT) THEN + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:), KKA, KKU, KL)) & + -DZM(MYM(MZF(PA(:,:,:), KKA, KKU, KL)), KKA, KKU, KL)*PDZY(:,:,:) & + /( MZM(PDYY(:,:,:), KKA, KKU, KL)*MYM(PDZZ(:,:,:)) ) +ELSE + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:), KKA, KKU, KL)) +END IF +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GY_W_VW',1,ZHOOK_HANDLE) +END FUNCTION GY_W_VW +! ######spl + FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_W_M) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ####################################################### +! +!!**** *GZ_W_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! W point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! W point. The result is placed at the mass point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MZF : Shuman functions (mean operators) +!! DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN, ONLY: DZF, MZF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_W_M +! -------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('GZ_W_M',0,ZHOOK_HANDLE) +PGZ_W_M(:,:,:)= DZF(PA(:,:,:), KKA, KKU, KL)/(MZF(PDZZ(:,:,:), KKA, KKU, KL)) +! +!---------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('GZ_W_M',1,ZHOOK_HANDLE) +END FUNCTION GZ_W_M diff --git a/src/arome/turb/modi_gradient_m.F90 b/src/arome/externals/modi_gradient_m.F90 similarity index 90% rename from src/arome/turb/modi_gradient_m.F90 rename to src/arome/externals/modi_gradient_m.F90 index 072a783b785dea22531b5a5b46c43952cfd14c82..82f5e3c895cedbe9b433086eb3e0a4c370888ec1 100644 --- a/src/arome/turb/modi_gradient_m.F90 +++ b/src/arome/externals/modi_gradient_m.F90 @@ -5,7 +5,7 @@ INTERFACE ! ! -FUNCTION GX_M_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) +FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_M) INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point @@ -18,7 +18,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point END FUNCTION GX_M_M ! ! -FUNCTION GY_M_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) +FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_M) INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point @@ -31,7 +31,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point END FUNCTION GY_M_M ! ! -FUNCTION GZ_M_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_M_M) +FUNCTION GZ_M_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_M) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -42,7 +42,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point ! END FUNCTION GZ_M_M ! - FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) + FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_U) ! IMPLICIT NONE ! @@ -59,7 +59,7 @@ REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux END FUNCTION GX_M_U ! ! - FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) + FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_V) ! IMPLICIT NONE ! @@ -75,7 +75,7 @@ REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux ! side END FUNCTION GY_M_V ! - FUNCTION GZ_M_W(KKA,KKU,KL,PY,PDZZ) RESULT(PGZ_M_W) + FUNCTION GZ_M_W(PY,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_W) ! IMPLICIT NONE ! diff --git a/src/arome/turb/modi_gradient_u.F90 b/src/arome/externals/modi_gradient_u.F90 similarity index 89% rename from src/arome/turb/modi_gradient_u.F90 rename to src/arome/externals/modi_gradient_u.F90 index 69673d21f39fce7a10844ea5cbc2c56ff5bcc287..634310304ac65a470e562864b3d89c3c713edeae 100644 --- a/src/arome/turb/modi_gradient_u.F90 +++ b/src/arome/externals/modi_gradient_u.F90 @@ -5,7 +5,7 @@ INTERFACE ! ! -FUNCTION GX_U_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) +FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_U_M) INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point @@ -18,7 +18,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point END FUNCTION GX_U_M ! ! -FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) +FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_U_UV) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -32,7 +32,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point END FUNCTION GY_U_UV ! ! -FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) +FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_U_UW) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise diff --git a/src/arome/turb/modi_gradient_v.F90 b/src/arome/externals/modi_gradient_v.F90 similarity index 90% rename from src/arome/turb/modi_gradient_v.F90 rename to src/arome/externals/modi_gradient_v.F90 index ed9b2d80adefcfeb8764b8500e2a0a34ac497d11..eec4d2fe9a2b2aec96f84be5e17e842ec718dc93 100644 --- a/src/arome/turb/modi_gradient_v.F90 +++ b/src/arome/externals/modi_gradient_v.F90 @@ -5,7 +5,7 @@ INTERFACE ! ! -FUNCTION GY_V_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) +FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_V_M) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -18,7 +18,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point ! END FUNCTION GY_V_M ! -FUNCTION GX_V_UV(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) +FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_V_UV) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -32,7 +32,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point END FUNCTION GX_V_UV ! ! -FUNCTION GZ_V_VW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_V_VW) +FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_V_VW) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise diff --git a/src/arome/turb/modi_gradient_w.F90 b/src/arome/externals/modi_gradient_w.F90 similarity index 90% rename from src/arome/turb/modi_gradient_w.F90 rename to src/arome/externals/modi_gradient_w.F90 index 44274e47d62e19cc9dbc2aaf4eb8e5026470c459..759319e3d8287c03b5f97936f34ddeca4f2f3348 100644 --- a/src/arome/turb/modi_gradient_w.F90 +++ b/src/arome/externals/modi_gradient_w.F90 @@ -5,7 +5,7 @@ INTERFACE ! ! -FUNCTION GZ_W_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_W_M) +FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_W_M) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -16,7 +16,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point ! END FUNCTION GZ_W_M ! -FUNCTION GX_W_UW(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) +FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_W_UW) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise @@ -30,7 +30,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point END FUNCTION GX_W_UW ! ! -FUNCTION GY_W_VW(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGY_W_VW) +FUNCTION GY_W_VW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGY_W_VW) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise diff --git a/src/arome/turb/modi_shumanaro.F90 b/src/arome/externals/modi_shumanaro.F90 similarity index 91% rename from src/arome/turb/modi_shumanaro.F90 rename to src/arome/externals/modi_shumanaro.F90 index f20c8e252317096337aa4334627614a27971709b..8bc69a410cc83ea136f24c444eb8abf328091418 100644 --- a/src/arome/turb/modi_shumanaro.F90 +++ b/src/arome/externals/modi_shumanaro.F90 @@ -32,22 +32,20 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux ! side END FUNCTION DYM ! -FUNCTION DZF(KKA,KKU,KL,PA) RESULT(PDZF) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION DZF(PA,KKA,KKU,KL) RESULT(PDZF) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass - ! localization -END FUNCTION DZF -! -FUNCTION DZM(KKA,KKU,KL,PA) RESULT(PDZM) INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass localization +END FUNCTION DZF +! +FUNCTION DZM(PA,KKA,KKU,KL) RESULT(PDZM) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass ! localization -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux - ! side +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux side END FUNCTION DZM ! FUNCTION MXF(PA) RESULT(PMXF) @@ -74,19 +72,18 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass l REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization END FUNCTION MYM ! -FUNCTION MZF(KKA,KKU,KL,PA) RESULT(PMZF) +FUNCTION MZF(PA,KKA,KKU,KL) RESULT(PMZF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass ! localization END FUNCTION MZF ! -FUNCTION MZM(KKA,KKU,KL,PA) RESULT(PMZM) +FUNCTION MZM(PA,KKA,KKU,KL) RESULT(PMZM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization END FUNCTION MZM ! diff --git a/src/arome/turb/shumanaro.F90 b/src/arome/externals/shumanaro.F90 similarity index 98% rename from src/arome/turb/shumanaro.F90 rename to src/arome/externals/shumanaro.F90 index 04046f336cfe3da768da7393744e42a1a6e2eb28..47109f11e7a325caf881364330a5289757ce29c5 100644 --- a/src/arome/turb/shumanaro.F90 +++ b/src/arome/externals/shumanaro.F90 @@ -377,7 +377,7 @@ END FUNCTION MYM ! ! ! ############################### - FUNCTION MZF(KKA,KKU,KL,PA) RESULT(PMZF) + FUNCTION MZF(PA, KKA, KKU, KL) RESULT(PMZF) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################### @@ -428,10 +428,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass ! localization ! @@ -462,7 +461,7 @@ END FUNCTION MZF ! ! ! ############################### - FUNCTION MZM(KKA,KKU,KL,PA) RESULT(PMZM) + FUNCTION MZM(PA, KKA, KKU, KL) RESULT(PMZM) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################### @@ -513,9 +512,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization ! !* 0.2 Declarations of local variables @@ -901,7 +900,7 @@ END FUNCTION DYM ! ! ! ############################### - FUNCTION DZF(KKA,KKU,KL,PA) RESULT(PDZF) + FUNCTION DZF(PA, KKA, KKU, KL) RESULT(PDZF) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################### @@ -952,10 +951,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass ! localization ! @@ -986,7 +984,7 @@ END FUNCTION DZF ! ! ! ############################### - FUNCTION DZM(KKA,KKU,KL,PA) RESULT(PDZM) + FUNCTION DZM(PA, KKA, KKU, KL) RESULT(PDZM) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################### @@ -1037,10 +1035,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass - ! localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux ! side ! diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index e45272470ccf31f649b9aac1c2ae0c19551d472c..be478ac36395b5a9e32e0cf15b246ca0003c80bc 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -1 +1,22 @@ phyex/micro/budget.F90 +phyex/turb/shumanaro.F90 +phyex/turb/modi_shumanaro.F90 +phyex/turb/modi_gradient_m.F90 +phyex/turb/modi_gradient_u.F90 +phyex/turb/modi_gradient_v.F90 +phyex/turb/modi_gradient_w.F90 +phyex/turb/gx_m_m.F90 +phyex/turb/gx_m_u.F90 +phyex/turb/gx_u_m.F90 +phyex/turb/gx_v_uv.F90 +phyex/turb/gx_w_uw.F90 +phyex/turb/gy_m_m.F90 +phyex/turb/gy_m_v.F90 +phyex/turb/gy_u_uv.F90 +phyex/turb/gy_v_m.F90 +phyex/turb/gy_w_vw.F90 +phyex/turb/gz_m_m.F90 +phyex/turb/gz_m_w.F90 +phyex/turb/gz_u_uw.F90 +phyex/turb/gz_v_vw.F90 +phyex/turb/gz_w_m.F90 diff --git a/src/arome/turb/compute_mf_cloud_bigaus.F90 b/src/arome/turb/compute_mf_cloud_bigaus.F90 index fd5a465f3ac5db63d60886b220d5cdae4aabed34..06f062de47119dbe9f4ef2f3ea3d46c08c27d11d 100644 --- a/src/arome/turb/compute_mf_cloud_bigaus.F90 +++ b/src/arome/turb/compute_mf_cloud_bigaus.F90 @@ -49,7 +49,7 @@ USE MODD_CMFSHALL, ONLY : XALPHA_MF, XSIGMA_MF USE MODD_CST, ONLY : XPI, XG ! -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZF_MF, GZ_M_W_MF USE MODI_GAMMA_INC ! USE MODE_THERMO @@ -103,17 +103,17 @@ IF (LHOOK) CALL DR_HOOK('COMPUTE_MF_CLOUD_BIGAUS',0,ZHOOK_HANDLE) ! ! !Vertical gradient of RT, result on mass points -ZW1(:,:)=GZ_M_W_MF(KKA,KKU,KKL, PRTM(:,:), PDZZ(:,:)) -ZGRAD_Z_RT(:,:)=MZF_MF(KKA,KKU,KKL, ZW1(:,:)) +ZW1(:,:)=GZ_M_W_MF(PRTM(:,:), PDZZ(:,:), KKA, KKU, KKL) +ZGRAD_Z_RT(:,:)=MZF_MF(ZW1(:,:), KKA, KKU, KKL) !Interpolation on mass points -ZTHV_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PTHV_UP(:,:)) -ZRSAT_UP_M(:,:)= MZF_MF(KKA,KKU,KKL, PRSAT_UP(:,:)) -ZRC_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PRC_UP(:,:)) -ZRI_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PRI_UP(:,:)) -ZRT_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PRT_UP(:,:)) -ZEMF_M(:,:) = MZF_MF(KKA,KKU,KKL, PEMF(:,:)) -ZFRAC_ICE_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PFRAC_ICE_UP(:,:)) +ZTHV_UP_M(:,:) = MZF_MF(PTHV_UP(:,:), KKA, KKU, KKL) +ZRSAT_UP_M(:,:)= MZF_MF(PRSAT_UP(:,:), KKA, KKU, KKL) +ZRC_UP_M(:,:) = MZF_MF(PRC_UP(:,:), KKA, KKU, KKL) +ZRI_UP_M(:,:) = MZF_MF(PRI_UP(:,:), KKA, KKU, KKL) +ZRT_UP_M(:,:) = MZF_MF(PRT_UP(:,:), KKA, KKU, KKL) +ZEMF_M(:,:) = MZF_MF(PEMF(:,:), KKA, KKU, KKL) +ZFRAC_ICE_UP_M(:,:) = MZF_MF(PFRAC_ICE_UP(:,:), KKA, KKU, KKL) !computation of omega star up ZOMEGA_UP_M(:)=0. diff --git a/src/arome/turb/compute_mf_cloud_stat.F90 b/src/arome/turb/compute_mf_cloud_stat.F90 index 43f9d0e94808d302e71cd3fccba5009f42cd99a6..3c86b33b9b6746d406fb3d2a793d76be93f66b83 100644 --- a/src/arome/turb/compute_mf_cloud_stat.F90 +++ b/src/arome/turb/compute_mf_cloud_stat.F90 @@ -45,7 +45,7 @@ USE MODD_CMFSHALL, ONLY : XTAUSIGMF USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT ! -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF USE MODI_COMPUTE_FUNCTION_THERMO_MF ! USE PARKIND1, ONLY : JPRB @@ -103,14 +103,14 @@ IF (KRRL > 0) THEN ! ! - ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) * & - GZ_M_W_MF(KKA,KKU,KKL,PTHLM(:,:),PDZZ(:,:)) + ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), KKA, KKU, KKL)) * & + GZ_M_W_MF(PTHLM(:,:),PDZZ(:,:), KKA, KKU, KKL) ! ! Avoid negative values ZFLXZ(:,:) = MAX(0.,ZFLXZ(:,:)) - PSIGMF(:,:) = MZF_MF(KKA,KKU,KKL,ZFLXZ(:,:)) * ZATHETA(:,:)**2 + PSIGMF(:,:) = MZF_MF(ZFLXZ(:,:), KKA, KKU, KKL) * ZATHETA(:,:)**2 ! ! @@ -119,14 +119,14 @@ IF (KRRL > 0) THEN ! ! ! - ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,PRTM(:,:))) * & - GZ_M_W_MF(KKA,KKU,KKL,PRTM(:,:),PDZZ(:,:)) + ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(PRTM(:,:), KKA, KKU, KKL)) * & + GZ_M_W_MF(PRTM(:,:),PDZZ(:,:), KKA, KKU, KKL) ! ! Avoid negative values ZFLXZ(:,:) = MAX(0.,ZFLXZ(:,:)) ! - PSIGMF(:,:) = PSIGMF(:,:) + ZAMOIST(:,:) **2 * MZF_MF(KKA,KKU,KKL,ZFLXZ(:,:)) + PSIGMF(:,:) = PSIGMF(:,:) + ZAMOIST(:,:) **2 * MZF_MF(ZFLXZ(:,:), KKA, KKU, KKL) ! ! 1.3 Vertical part of Sigma_s ! diff --git a/src/arome/turb/compute_updraft.F90 b/src/arome/turb/compute_updraft.F90 index 8ba4d1c567308de0dde16fbc00d96e017c4c4a4a..b0047fc1ec66cfacbeb6093e8910ee1f81381b69 100644 --- a/src/arome/turb/compute_updraft.F90 +++ b/src/arome/turb/compute_updraft.F90 @@ -61,7 +61,7 @@ USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_COMPUTE_ENTR_DETR USE MODI_TH_R_FROM_THL_RT_1D -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZM_MF, MZF_MF, GZ_M_W_MF USE MODI_COMPUTE_BL89_ML @@ -231,15 +231,15 @@ END IF ! Initialisation of environment variables at t-dt ! variables at flux level -ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) -ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) -ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) -ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) -ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) +ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) +ZRTM_F (:,:) = MZM_MF(PRTM(:,:), KKA, KKU, KKL) +ZUM_F (:,:) = MZM_MF(PUM(:,:), KKA, KKU, KKL) +ZVM_F (:,:) = MZM_MF(PVM(:,:), KKA, KKU, KKL) +ZTKEM_F(:,:) = MZM_MF(PTKEM(:,:), KKA, KKU, KKL) DO JSV=1,ISV IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE - ZSVM_F(:,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV)) + ZSVM_F(:,:,JSV) = MZM_MF(PSVM(:,:,JSV), KKA, KKU, KKL) END DO ! ! Initialisation of updraft characteristics @@ -258,10 +258,10 @@ PRT_UP(:,KKB) = ZRTM_F(:,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KKB)))*X IF (OENTR_DETR) THEN - ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) - ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) - ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) - ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) + ZTHM_F (:,:) = MZM_MF(PTHM (:,:), KKA, KKU, KKL) + ZPRES_F(:,:) = MZM_MF(PPABSM(:,:), KKA, KKU, KKL) + ZRHO_F (:,:) = MZM_MF(PRHODREF(:,:), KKA, KKU, KKL) + ZRVM_F (:,:) = MZM_MF(PRVM(:,:), KKA, KKU, KKL) ! thetav at mass and flux levels ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) @@ -296,8 +296,8 @@ IF (OENTR_DETR) THEN ZTKEM_F(:,KKB)=0. ! IF(CTURBLEN=='RM17') THEN - ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) - ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZDUDZ = MZF_MF(GZ_M_W_MF(PUM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) + ZDVDZ = MZF_MF(GZ_M_W_MF(PVM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) PRINT*, 'phasage bete sans controle' CALL ABORT diff --git a/src/arome/turb/compute_updraft_raha.F90 b/src/arome/turb/compute_updraft_raha.F90 index 8b9af12294f8d17d4f277dcc50446d10cc8323f7..337696338c23e4075da3b4416e6b46a74bd16957 100644 --- a/src/arome/turb/compute_updraft_raha.F90 +++ b/src/arome/turb/compute_updraft_raha.F90 @@ -55,7 +55,7 @@ USE MODD_CST USE MODD_CMFSHALL USE MODI_TH_R_FROM_THL_RT_1D -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZM_MF IMPLICIT NONE @@ -238,11 +238,11 @@ PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not u ! Initialisation of environment variables at t-dt ! variables at flux level -ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) -ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) -ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) -ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) -ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) +ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) +ZRTM_F (:,:) = MZM_MF(PRTM(:,:), KKA, KKU, KKL) +ZUM_F (:,:) = MZM_MF(PUM(:,:), KKA, KKU, KKL) +ZVM_F (:,:) = MZM_MF(PVM(:,:), KKA, KKU, KKL) +ZTKEM_F(:,:) = MZM_MF(PTKEM(:,:), KKA, KKU, KKL) !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE @@ -269,10 +269,10 @@ PRT_UP(:,KKB) = ZRTM_F(:,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KKB)))*X ZQT_UP(:) = PRT_UP(:,KKB)/(1.+PRT_UP(:,KKB)) ZTHS_UP(:,KKB)=PTHL_UP(:,KKB)*(1.+XLAMBDA*ZQT_UP(:)) -ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) -ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) -ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) -ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) +ZTHM_F (:,:) = MZM_MF(PTHM (:,:), KKA, KKU, KKL) +ZPRES_F(:,:) = MZM_MF(PPABSM(:,:), KKA, KKU, KKL) +ZRHO_F (:,:) = MZM_MF(PRHODREF(:,:), KKA, KKU, KKL) +ZRVM_F (:,:) = MZM_MF(PRVM(:,:), KKA, KKU, KKL) ! thetav at mass and flux levels ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) diff --git a/src/arome/turb/compute_updraft_rhcj10.F90 b/src/arome/turb/compute_updraft_rhcj10.F90 index 14f0b6ae68f2f53203e9096e4cdb74f6bae6fc48..c6d108cf8fe3d7b6ffc3a1d82615587028a2beb7 100644 --- a/src/arome/turb/compute_updraft_rhcj10.F90 +++ b/src/arome/turb/compute_updraft_rhcj10.F90 @@ -54,7 +54,7 @@ USE MODD_CST USE MODD_CMFSHALL USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_TH_R_FROM_THL_RT_1D -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF USE MODI_COMPUTE_BL89_ML @@ -241,11 +241,11 @@ PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not u ! Initialisation of environment variables at t-dt ! variables at flux level -ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) -ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) -ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) -ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) -ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) +ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) +ZRTM_F (:,:) = MZM_MF(PRTM(:,:), KKA, KKU, KKL) +ZUM_F (:,:) = MZM_MF(PUM(:,:), KKA, KKU, KKL) +ZVM_F (:,:) = MZM_MF(PVM(:,:), KKA, KKU, KKL) +ZTKEM_F(:,:) = MZM_MF(PTKEM(:,:), KKA, KKU, KKL) !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE @@ -274,10 +274,10 @@ ZQT_UP(JI) = PRT_UP(JI,KKB)/(1.+PRT_UP(JI,KKB)) ZTHS_UP(JI,KKB)=PTHL_UP(JI,KKB)*(1.+XLAMBDA*ZQT_UP(JI)) ENDDO -ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) -ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) -ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) -ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) +ZTHM_F (:,:) = MZM_MF(PTHM (:,:), KKA, KKU, KKL) +ZPRES_F(:,:) = MZM_MF(PPABSM(:,:), KKA, KKU, KKL) +ZRHO_F (:,:) = MZM_MF(PRHODREF(:,:), KKA, KKU, KKL) +ZRVM_F (:,:) = MZM_MF(PRVM(:,:), KKA, KKU, KKL) ! thetav at mass and flux levels DO JK=1,IKU @@ -326,8 +326,8 @@ GLMIX=.TRUE. ZTKEM_F(:,KKB)=0. ! IF(CTURBLEN=='RM17') THEN - ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) - ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZDUDZ = MZF_MF(GZ_M_W_MF(PUM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) + ZDVDZ = MZF_MF(GZ_M_W_MF(PVM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) PRINT*, 'phasage bete sans controle' CALL ABORT diff --git a/src/arome/turb/gx_m_m.F90 b/src/arome/turb/gx_m_m.F90 deleted file mode 100644 index 8990eed604368714b93cba46983480719166a313..0000000000000000000000000000000000000000 --- a/src/arome/turb/gx_m_m.F90 +++ /dev/null @@ -1,101 +0,0 @@ -! ######spl - FUNCTION GX_M_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GX_M_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian X -!! direction for a variable placed at the -!! mass point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the X cartesian direction for a field PA placed at the -! mass point. The result is placed at the mass point. -! -! -! ( ______________z ) -! ( (___x ) ) -! 1 ( _x (d*zx dzm(PA) ) ) -! PGX_M_M = ---- (dxf(PA) - (------------)) ) -! ___x ( ( ) ) -! d*xx ( ( d*zz ) ) -! -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXM,MXF,MZF : Shuman functions (mean operators) -!! DXF,DZF : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_CONF : LFLAT -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/07/94 -!! 19/07/00 add the LFLAT switch (J. Stein) -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GX_M_M -! -------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GX_M_M',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:))) - & - MZF(KKA,KKU,KL,MXF(PDZX)*DZM(KKA,KKU,KL,PA(:,:,:)) & - /PDZZ(:,:,:)) ) /MXF(PDXX(:,:,:)) -ELSE - PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GX_M_M',1,ZHOOK_HANDLE) -END FUNCTION GX_M_M diff --git a/src/arome/turb/gx_m_u.F90 b/src/arome/turb/gx_m_u.F90 deleted file mode 100644 index 7c1d538b0f85a1f56b97c7abaca0be62153855bb..0000000000000000000000000000000000000000 --- a/src/arome/turb/gx_m_u.F90 +++ /dev/null @@ -1,157 +0,0 @@ -! ######spl - FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ################################################## -! -!!**** *GX_M_U * - Compute the gradient along x for a variable localized at -!! a mass point -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute a gradient along x -! direction for a field PY localized at a mass point. The result PGX_M_U -! is localized at a x-flux point (u point). -! -! ( ____________z ) -! ( ________x ) -! 1 ( dzm(PY) ) -! PGX_M_U = ---- (dxm(PY) - d*zx -------- ) -! d*xx ( d*zz ) -! -! -! -!!** METHOD -!! ------ -!! We employ the Shuman operators to compute the derivatives and the -!! averages. The metric coefficients PDXX,PDZX,PDZZ are dummy arguments. -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTION DXM: compute a finite difference along the x direction for -!! a variable at a mass localization -!! FUNCTION DZM: compute a finite difference along the y direction for -!! a variable at a mass localization -!! FUNCTION MXM: compute an average in the x direction for a variable -!! at a mass localization -!! FUNCTION MZF: compute an average in the z direction for a variable -!! at a flux side -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_CONF : LFLAT -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (function GX_M_U) -!! -!! -!! AUTHOR -!! ------ -!! P. Hereil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/07/94 -!! Modification 16/03/95 change the order of the arguments -!! 19/07/00 add the LFLAT switch + inlining(J. Stein) -!! 20/08/00 optimization (J. Escobar) -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODI_SHUMAN -USE MODD_CONF -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!* 0.1 Declarations of arguments and result -! ------------------------------------ -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass - ! localization -REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux - ! side -INTEGER IIU,IKU,JI,JK -! -INTEGER :: JJK,IJU -INTEGER :: JIJK,JIJKOR,JIJKEND -INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1 -! -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE GRADIENT ALONG X -! ----------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GX_M_U',0,ZHOOK_HANDLE) -IIU=SIZE(PY,1) -IJU=SIZE(PY,2) -IKU=SIZE(PY,3) -IF (.NOT. LFLAT) THEN -! PGX_M_U = ( DXM(PY) - MZF ( MXM( DZM(PY) /PDZZ ) * PDZX ) )/PDXX -!! DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB -!! DO JI=1+JPHEXT,IIU -!! PGX_M_U(JI,:,JK)= & -!! ( PY(JI,:,JK)-PY(JI-1,:,JK) & -!! -( (PY(JI,:,JK)-PY(JI,:,JK-1)) / PDZZ(JI,:,JK) & -!! +(PY(JI-1,:,JK)-PY(JI-1,:,JK-1)) / PDZZ(JI-1,:,JK) & -!! ) * PDZX(JI,:,JK)* 0.25 & -!! -( (PY(JI,:,JK+1)-PY(JI,:,JK)) / PDZZ(JI,:,JK+1) & -!! +(PY(JI-1,:,JK+1)-PY(JI-1,:,JK)) / PDZZ(JI-1,:,JK+1) & -!! ) * PDZX(JI,:,JK+1)* 0.25 & -!! ) / PDXX(JI,:,JK) -!! END DO -!! END DO - JIJKOR = 1 + JPHEXT + IIU*IJU*(JPVEXT_TURB+1 - 1) - JIJKEND = IIU*IJU*(IKU-JPVEXT_TURB) -!CDIR NODEP -!OCL NOVREC - DO JIJK=JIJKOR , JIJKEND -! indexation - JI_1JK = JIJK - 1 - JIJK_1 = JIJK - IIU*IJU*KL - JI_1JK_1 = JIJK - 1 - IIU*IJU*KL - JIJKP1 = JIJK + IIU*IJU*KL - JI_1JKP1 = JIJK - 1 + IIU*IJU*KL -! - PGX_M_U(JIJK,1,1)= & - ( PY(JIJK,1,1)-PY(JI_1JK,1,1) & - -( (PY(JIJK,1,1)-PY(JIJK_1,1,1)) / PDZZ(JIJK,1,1) & - +(PY(JI_1JK,1,1)-PY(JI_1JK_1,1,1)) / PDZZ(JI_1JK,1,1) & - ) * PDZX(JIJK,1,1)* 0.25 & - -( (PY(JIJKP1,1,1)-PY(JIJK,1,1)) / PDZZ(JIJKP1,1,1) & - +(PY(JI_1JKP1,1,1)-PY(JI_1JK,1,1)) / PDZZ(JI_1JKP1,1,1) & - ) * PDZX(JIJKP1,1,1)* 0.25 & - ) / PDXX(JIJK,1,1) - END DO - -! - DO JI=1+JPHEXT,IIU - PGX_M_U(JI,:,KKU)= ( PY(JI,:,KKU)-PY(JI-1,:,KKU) ) / PDXX(JI,:,KKU) - PGX_M_U(JI,:,KKA)= -999. - END DO -! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) -ELSE -! PGX_M_U = DXM(PY) / PDXX - PGX_M_U(1+JPHEXT:IIU,:,:) = ( PY(1+JPHEXT:IIU,:,:)-PY(JPHEXT:IIU-1,:,:) ) & - / PDXX(1+JPHEXT:IIU,:,:) -! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) -ENDIF -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GX_M_U',1,ZHOOK_HANDLE) -END FUNCTION GX_M_U diff --git a/src/arome/turb/gx_u_m.F90 b/src/arome/turb/gx_u_m.F90 deleted file mode 100644 index fc839c4797cff32ba4b27b2f0857c5aea8233085..0000000000000000000000000000000000000000 --- a/src/arome/turb/gx_u_m.F90 +++ /dev/null @@ -1,101 +0,0 @@ -! ######spl - FUNCTION GX_U_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GX_U_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian X -!! direction for a variable placed at the -!! U point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the X cartesian direction for a field PA placed at the -! U point. The result is placed at the mass point. -! -! -! ( ______________z ) -! ( (___________x ) ) -! 1 ( (d*zx dzm(PA) ) ) -! PGX_U_M = ---- (dxf(PA) - (------------)) ) -! ___x ( ( ) ) -! d*xx ( ( d*zz ) ) -! -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXF,MZF : Shuman functions (mean operators) -!! DXF,DZF : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 19/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GX_U_M -! -------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GX_U_M',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGX_U_M(:,:,:)= ( DXF(PA) - & - MZF(KKA,KKU,KL,MXF(PDZX*DZM(KKA,KKU,KL,PA)) / PDZZ ) & - ) / MXF(PDXX) -ELSE - PGX_U_M(:,:,:)= DXF(PA) / MXF(PDXX) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GX_U_M',1,ZHOOK_HANDLE) -END FUNCTION GX_U_M diff --git a/src/arome/turb/gx_v_uv.F90 b/src/arome/turb/gx_v_uv.F90 deleted file mode 100644 index 5f3e6ac0707c963fd5d674bb55767aa4f080195a..0000000000000000000000000000000000000000 --- a/src/arome/turb/gx_v_uv.F90 +++ /dev/null @@ -1,100 +0,0 @@ -! ######spl - FUNCTION GX_V_UV(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ######################################################### -! -!!**** *GX_V_UV* - Cartesian Gradient operator: -!! computes the gradient in the cartesian X -!! direction for a variable placed at the -!! V point and the result is placed at -!! the UV vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the X cartesian direction for a field PA placed at the -! V point. The result is placed at the UV vorticity point. -! -! -! ( _________________z ) -! ( (___y _________x ) ) -! 1 ( (d*zx (dzm(PA))) ) ) -! PGX_V_UV= ---- (dxm(PA) - ( (------ ) ) ) -! ___y ( ( ( ___y ) ) ) -! d*xx ( ( ( d*zz ) ) ) -! -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXM,MZF,MYM : Shuman functions (mean operators) -!! DXM,DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GX_V_UV -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GX_V_UV',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGX_V_UV(:,:,:)= ( DXM(PA)- MZF(KKA,KKU,KL, MXM( DZM(KKA,KKU,KL,PA)/& - MYM(PDZZ) ) *MYM(PDZX) ) ) / MYM(PDXX) -ELSE - PGX_V_UV(:,:,:)= DXM(PA) / MYM(PDXX) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GX_V_UV',1,ZHOOK_HANDLE) -END FUNCTION GX_V_UV diff --git a/src/arome/turb/gx_w_uw.F90 b/src/arome/turb/gx_w_uw.F90 deleted file mode 100644 index a6bafa0915759bff8e59cfcbb47916aec60304a3..0000000000000000000000000000000000000000 --- a/src/arome/turb/gx_w_uw.F90 +++ /dev/null @@ -1,91 +0,0 @@ -! ######spl - FUNCTION GX_W_UW(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ######################################################### -! -!!**** *GX_W_UW* - Cartesian Gradient operator: -!! computes the gradient in the cartesian X -!! direction for a variable placed at the -!! V point and the result is placed at -!! the UW vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the X cartesian direction for a field PA placed at the -! W point. The result is placed at the UW vorticity point. -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXM,MZM,MZF : Shuman functions (mean operators) -!! DXM,DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GX_W_UW -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GX_W_UW',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDXX(:,:,:))) & - -DZM(KKA,KKU,KL,MXM(MZF(KKA,KKU,KL,PA(:,:,:))))*PDZX(:,:,:) & - /( MZM(KKA,KKU,KL,PDXX(:,:,:))*MXM(PDZZ(:,:,:)) ) -ELSE - PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDXX(:,:,:))) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GX_W_UW',1,ZHOOK_HANDLE) -END FUNCTION GX_W_UW diff --git a/src/arome/turb/gy_m_m.F90 b/src/arome/turb/gy_m_m.F90 deleted file mode 100644 index 307faf7532faf81657f424be9ded39ce7797a5ef..0000000000000000000000000000000000000000 --- a/src/arome/turb/gy_m_m.F90 +++ /dev/null @@ -1,100 +0,0 @@ -! ######spl - FUNCTION GY_M_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GY_M_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Y -!! direction for a variable placed at the -!! mass point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Y cartesian direction for a field PA placed at the -! mass point. The result is placed at the mass point. -! -! -! ( ______________z ) -! ( (___y ) ) -! 1 ( _y (d*zy dzm(PA) ) ) -! PGY_M_M = ---- (dyf(PA) - (------------)) ) -! ___y ( ( ) ) -! d*yy ( ( d*zz ) ) -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MYM,MYF,MZF : Shuman functions (mean operators) -!! DYF,DZF : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_CONF : LFLAT -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/07/94 -!! 19/07/00 add the LFLAT switch (J. Stein) -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODD_CONF -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GY_M_M -! -------------------- -! -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GY_M_M',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(KKA,KKU,KL,MYF(PDZY)*DZM(KKA,KKU,KL,PA)& - /PDZZ) ) /MYF(PDYY) -ELSE - PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY) -ENDIF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GY_M_M',1,ZHOOK_HANDLE) -END FUNCTION GY_M_M diff --git a/src/arome/turb/gy_m_v.F90 b/src/arome/turb/gy_m_v.F90 deleted file mode 100644 index 70445b3bc6df18cd617731bcf848d88b5b5e4e5c..0000000000000000000000000000000000000000 --- a/src/arome/turb/gy_m_v.F90 +++ /dev/null @@ -1,128 +0,0 @@ -! ######spl - FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ################################################## -! -!!**** *GY_M_V * - Compute the gradient along y for a variable localized at -!! a mass point -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute a gradient along y -! direction for a field PY localized at a mass point. The result PGY_M_V -! is localized at a y-flux point (v point). -! -! ( ____________z ) -! ( ________y ) -! 1 ( dzm(PY) ) -! PGY_M_V = ---- (dym(PY) - d*zy -------- ) -! d*yy ( d*zz ) -! -! -! -! -!!** METHOD -!! ------ -!! We employ the Shuman operators to compute the derivatives and the -!! averages. The metric coefficients PDYY,PDZY,PDZZ are dummy arguments. -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTION DYM: compute a finite difference along the y direction for -!! a variable at a mass localization -!! FUNCTION DZM: compute a finite difference along the y direction for -!! a variable at a mass localization -!! FUNCTION MYM: compute an average in the x direction for a variable -!! at a mass localization -!! FUNCTION MZF: compute an average in the z direction for a variable -!! at a flux side -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_CONF : LFLAT -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (function GY_M_V) -!! -!! -!! AUTHOR -!! ------ -!! P. Hereil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/07/94 -!! Modification 16/03/95 change the order of the arguments -!! 19/07/00 add the LFLAT switch + inlining(J. Stein) -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODI_SHUMAN -USE MODD_CONF -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!* 0.1 Declarations of arguments and results -! ------------------------------------- -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass - ! localization -REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux - ! side -INTEGER IJU,IKU,JJ,JK -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE GRADIENT ALONG Y -! ---------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GY_M_V',0,ZHOOK_HANDLE) -IJU=SIZE(PY,2) -IKU=SIZE(PY,3) -IF (.NOT. LFLAT) THEN -! PGY_M_V = ( DYM(PY) - MZF ( MYM( DZM(PY) /PDZZ ) * PDZY ) )/PDYY - DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB - DO JJ=1+JPHEXT,IJU - PGY_M_V(:,JJ,JK)= & - ( PY(:,JJ,JK)-PY(:,JJ-1,JK) & - -( (PY(:,JJ,JK)-PY(:,JJ,JK-KL)) / PDZZ(:,JJ,JK) & - +(PY(:,JJ-1,JK)-PY(:,JJ-KL,JK-KL)) / PDZZ(:,JJ-1,JK) & - ) * PDZY(:,JJ,JK)* 0.25 & - -( (PY(:,JJ,JK+KL)-PY(:,JJ,JK)) / PDZZ(:,JJ,JK+KL) & - +(PY(:,JJ-1,JK+KL)-PY(:,JJ-1,JK)) / PDZZ(:,JJ-1,JK+KL) & - ) * PDZY(:,JJ,JK+KL)* 0.25 & - ) / PDYY(:,JJ,JK) - END DO - END DO -! - DO JJ=1+JPHEXT,IJU - PGY_M_V(:,JJ,KKU)= ( PY(:,JJ,KKU)-PY(:,JJ-1,KKU) ) / PDYY(:,JJ,KKU) - PGY_M_V(:,JJ,KKA)= -999. - END DO -! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) -ELSE -! PGY_M_V = DYM(PY)/PDYY - PGY_M_V(:,1+JPHEXT:IJU,:) = ( PY(:,1+JPHEXT:IJU,:)-PY(:,JPHEXT:IJU-1,:) ) & - / PDYY(:,1+JPHEXT:IJU,:) -! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) -ENDIF -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GY_M_V',1,ZHOOK_HANDLE) -END FUNCTION GY_M_V diff --git a/src/arome/turb/gy_u_uv.F90 b/src/arome/turb/gy_u_uv.F90 deleted file mode 100644 index 81af6f6e2b7216c6f05356eed605a695da378124..0000000000000000000000000000000000000000 --- a/src/arome/turb/gy_u_uv.F90 +++ /dev/null @@ -1,101 +0,0 @@ -! ######spl - FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ######################################################### -! -!!**** *GY_U_UV* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Y -!! direction for a variable placed at the -!! U point and the result is placed at -!! the UV vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Y cartesian direction for a field PA placed at the -! U point. The result is placed at the UV vorticity point. -! -! -! -! ( _________________z ) -! ( (___x _________y ) ) -! 1 ( (d*zy (dzm(PA))) ) ) -! PGY_U_UV= ---- (dym(PA) - ( (------ ) ) ) -! ___x ( ( ( ___x ) ) ) -! d*yy ( ( ( d*zz ) ) ) -! -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXM,MYM,MZF : Shuman functions (mean operators) -!! DYM,DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GY_U_UV -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GY_U_UV',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGY_U_UV(:,:,:)= (DYM(PA)- MZF(KKA,KKU,KL, MYM( DZM(KKA,KKU,KL,PA)/& - MXM(PDZZ) ) *MXM(PDZY) ) ) / MXM(PDYY) -ELSE - PGY_U_UV(:,:,:)= DYM(PA) / MXM(PDYY) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GY_U_UV',1,ZHOOK_HANDLE) -END FUNCTION GY_U_UV diff --git a/src/arome/turb/gy_v_m.F90 b/src/arome/turb/gy_v_m.F90 deleted file mode 100644 index 2b4fdc531b95d526c4f6eb5fb6aa83df47f18772..0000000000000000000000000000000000000000 --- a/src/arome/turb/gy_v_m.F90 +++ /dev/null @@ -1,100 +0,0 @@ -! ######spl - FUNCTION GY_V_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GY_V_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Y -!! direction for a variable placed at the -!! V point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Y cartesian direction for a field PA placed at the -! V point. The result is placed at the mass point. -! -! -! ( ______________z ) -! ( (___________y ) ) -! 1 ( (d*zy dzm(PA) ) ) -! PGY_V_M = ---- (dyf(PA) - (------------)) ) -! ___y ( ( ) ) -! d*yy ( ( d*zz ) ) -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MYF,MZF : Shuman functions (mean operators) -!! DYF,DZF : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 19/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GY_V_M -! -------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GY_V_M',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGY_V_M(:,:,:)= (DYF(PA) - & - MZF(KKA,KKU,KL, MYF(PDZY*DZM(KKA,KKU,KL,PA))/PDZZ ) & - ) / MYF(PDYY) -ELSE - PGY_V_M(:,:,:)= DYF(PA) / MYF(PDYY) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GY_V_M',1,ZHOOK_HANDLE) -END FUNCTION GY_V_M diff --git a/src/arome/turb/gy_w_vw.F90 b/src/arome/turb/gy_w_vw.F90 deleted file mode 100644 index 679aa999194948998e55a746bb5c71bd2f36344f..0000000000000000000000000000000000000000 --- a/src/arome/turb/gy_w_vw.F90 +++ /dev/null @@ -1,91 +0,0 @@ -! ######spl - FUNCTION GY_W_VW(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_W_VW) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ######################################################### -! -!!**** *GY_W_VW* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Y -!! direction for a variable placed at the -!! W point and the result is placed at -!! the VW vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Y cartesian direction for a field PA placed at the -! W point. The result is placed at the VW vorticity point. -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MYM,MZM,MZF : Shuman functions (mean operators) -!! DYM,DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!! 18/10/00 (V.Masson) add LFLAT switch -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -USE MODD_CONF -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzx -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GY_W_VW -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GY_W_VW',0,ZHOOK_HANDLE) -IF (.NOT. LFLAT) THEN - PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDYY(:,:,:))) & - -DZM(KKA,KKU,KL,MYM(MZF(KKA,KKU,KL,PA(:,:,:))))*PDZY(:,:,:) & - /( MZM(KKA,KKU,KL,PDYY(:,:,:))*MYM(PDZZ(:,:,:)) ) -ELSE - PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDYY(:,:,:))) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GY_W_VW',1,ZHOOK_HANDLE) -END FUNCTION GY_W_VW diff --git a/src/arome/turb/gz_m_m.F90 b/src/arome/turb/gz_m_m.F90 deleted file mode 100644 index 7dc824355e1e76206e4507b7b42d0dd1e4e30a1e..0000000000000000000000000000000000000000 --- a/src/arome/turb/gz_m_m.F90 +++ /dev/null @@ -1,87 +0,0 @@ -! ######spl - FUNCTION GZ_M_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_M_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GZ_M_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Z -!! direction for a variable placed at the -!! mass point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Z cartesian direction for a field PA placed at the -! mass point. The result is placed at the mass point. -! -! _________z -! (dzm(PA)) -! PGZ_M_M = (------ ) -! ( d*zz ) -! -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MZF : Shuman functions (mean operators) -!! DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/07/94 -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GZ_M_M -! -------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GZ_M_M',0,ZHOOK_HANDLE) -PGZ_M_M(:,:,:)= MZF(KKA,KKU,KL, DZM(KKA,KKU,KL,PA(:,:,:))/PDZZ(:,:,:) ) -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GZ_M_M',1,ZHOOK_HANDLE) -END FUNCTION GZ_M_M diff --git a/src/arome/turb/gz_m_w.F90 b/src/arome/turb/gz_m_w.F90 deleted file mode 100644 index c2a01f0a97e4c71765a8d8524583dae0e1956944..0000000000000000000000000000000000000000 --- a/src/arome/turb/gz_m_w.F90 +++ /dev/null @@ -1,95 +0,0 @@ -! ######spl - FUNCTION GZ_M_W(KKA,KKU,KL,PY,PDZZ) RESULT(PGZ_M_W) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ######################################### -! -!!**** *GZ_M_W * - Compute the gradient along z direction for a -!! variable localized at a mass point -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute a gradient along x,y,z -! directions for a field PY localized at a mass point. The result PGZ_M_W -! is localized at a z-flux point (w point) -! -! -! dzm(PY) -! PGZ_M_W = ------- -! d*zz -! -!!** METHOD -!! ------ -!! We employ the Shuman operators to compute the derivatives and the -!! averages. The metric coefficients PDZZ are dummy arguments. -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTION DZM : compute a finite difference along the z -!! direction for a variable at a mass localization -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODI_SHUMAN : interface for the Shuman functions -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (function GZ_M_W) -!! -!! -!! AUTHOR -!! ------ -!! P. Hereil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/07/94 -!! Modification 16/03/95 change the order of the arguments -!! 19/07/00 inlining(J. Stein) -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODI_SHUMAN -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!* 0.1 Declarations of arguments and results -! ------------------------------------- -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise - - ! Metric coefficient: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass - ! localization -REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux - ! side -! -INTEGER :: IKT,IKTB,IKTE -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE GRADIENT ALONG Z -! ----------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GZ_M_W',0,ZHOOK_HANDLE) -IKT=SIZE(PY,3) -IKTB=1+JPVEXT_TURB -IKTE=IKT-JPVEXT_TURB - -PGZ_M_W(:,:,IKTB:IKTE) = (PY(:,:,IKTB:IKTE)-PY(:,:,IKTB-KL:IKTE-KL)) & - / PDZZ(:,:,IKTB:IKTE) -PGZ_M_W(:,:,KKU)= (PY(:,:,KKU)-PY(:,:,KKU-KL)) & - / PDZZ(:,:,KKU) -PGZ_M_W(:,:,KKA)=-999. -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GZ_M_W',1,ZHOOK_HANDLE) -END FUNCTION GZ_M_W diff --git a/src/arome/turb/gz_u_uw.F90 b/src/arome/turb/gz_u_uw.F90 deleted file mode 100644 index aa7c14fcb73280c2e2c4e4a13c567a7b49a1dfc2..0000000000000000000000000000000000000000 --- a/src/arome/turb/gz_u_uw.F90 +++ /dev/null @@ -1,86 +0,0 @@ -! ######spl - FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GZ_U_UW - Cartesian Gradient operator: -!! computes the gradient in the cartesian Z -!! direction for a variable placed at the -!! U point and the result is placed at -!! the UW vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Z cartesian direction for a field PA placed at the -! U point. The result is placed at the UW vorticity point. -! -! dzm(PA) -! PGZ_U_UW = ------ -! ____x -! d*zz -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MXM : Shuman functions (mean operators) -!! DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GZ_U_UW -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GZ_U_UW',0,ZHOOK_HANDLE) -PGZ_U_UW(:,:,:)= DZM(KKA,KKU,KL,PA) / MXM(PDZZ) -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GZ_U_UW',1,ZHOOK_HANDLE) -END FUNCTION GZ_U_UW diff --git a/src/arome/turb/gz_v_vw.F90 b/src/arome/turb/gz_v_vw.F90 deleted file mode 100644 index 8e7315d23e0d23452aafc24d258449749cf944b2..0000000000000000000000000000000000000000 --- a/src/arome/turb/gz_v_vw.F90 +++ /dev/null @@ -1,87 +0,0 @@ -! ######spl - FUNCTION GZ_V_VW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_V_VW) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GZ_V_VW - Cartesian Gradient operator: -!! computes the gradient in the cartesian Z -!! direction for a variable placed at the -!! V point and the result is placed at -!! the VW vorticity point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Z cartesian direction for a field PA placed at the -! V point. The result is placed at the VW vorticity point. -! -! -! dzm(PA) -! PGZ_V_VW = ------ -! ____y -! d*zz -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MYM : Shuman functions (mean operators) -!! DZM : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/07/94 -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GZ_V_VW -! --------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GZ_V_VW',0,ZHOOK_HANDLE) -PGZ_V_VW(:,:,:)= DZM(KKA,KKU,KL,PA) / MYM(PDZZ) -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GZ_V_VW',1,ZHOOK_HANDLE) -END FUNCTION GZ_V_VW diff --git a/src/arome/turb/gz_w_m.F90 b/src/arome/turb/gz_w_m.F90 deleted file mode 100644 index 4bda15fd158c5e670d558868579ec6ca2f8fe018..0000000000000000000000000000000000000000 --- a/src/arome/turb/gz_w_m.F90 +++ /dev/null @@ -1,81 +0,0 @@ -! ######spl - FUNCTION GZ_W_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_W_M) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ####################################################### -! -!!**** *GZ_W_M* - Cartesian Gradient operator: -!! computes the gradient in the cartesian Z -!! direction for a variable placed at the -!! W point and the result is placed at -!! the mass point. -!! PURPOSE -!! ------- -! The purpose of this function is to compute the discrete gradient -! along the Z cartesian direction for a field PA placed at the -! W point. The result is placed at the mass point. -! -!!** METHOD -!! ------ -!! The Chain rule of differencing is applied to variables expressed -!! in the Gal-Chen & Somerville coordinates to obtain the gradient in -!! the cartesian system -!! -!! EXTERNAL -!! -------- -!! MZF : Shuman functions (mean operators) -!! DZF : Shuman functions (finite difference operators) -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (GRAD_CAR operators) -!! A Turbulence scheme for the Meso-NH model (Chapter 6) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart *INM and Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 19/07/94 -!------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments and result -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point -! -! -!* 0.2 declaration of local variables -! -! NONE -! -!---------------------------------------------------------------------------- -! -!* 1. DEFINITION of GZ_W_M -! -------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('GZ_W_M',0,ZHOOK_HANDLE) -PGZ_W_M(:,:,:)= DZF(KKA,KKU,KL,PA(:,:,:))/(MZF(KKA,KKU,KL,PDZZ(:,:,:))) -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('GZ_W_M',1,ZHOOK_HANDLE) -END FUNCTION GZ_W_M diff --git a/src/arome/turb/mf_turb.F90 b/src/arome/turb/mf_turb.F90 index 796381e3102ac1d91236a8100897a1a1f7486a04..ee1e2cbf2b3be24d91653abc9987bbd08d6dfc50 100644 --- a/src/arome/turb/mf_turb.F90 +++ b/src/arome/turb/mf_turb.F90 @@ -58,7 +58,7 @@ ! USE MODD_CMFSHALL ! -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZM_MF USE MODI_TRIDIAG_MASSFLUX ! IMPLICIT NONE @@ -152,15 +152,15 @@ PSVDT = 0. ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) ! -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), KKA, KKU, KKL)) -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,PRTM(:,:))) +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(PRTM(:,:), KKA, KKU, KKL)) -PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHVM(:,:))) +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), KKA, KKU, KKL)) IF (OMIXUV) THEN - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,PUM(:,:))) - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PVM(:,:))) + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), KKA, KKU, KKL)) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), KKA, KKU, KKL)) ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. @@ -182,7 +182,7 @@ ENDIF CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PTHLM,PFLXZTHMF,-PEMF,PTSTEP_MET,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) !!! compute THL tendency ! @@ -194,7 +194,7 @@ PTHLDT(:,:)= (ZVARS(:,:)-PTHLM(:,:))/PTSTEP_MET CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP_MET,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) !!! compute RT tendency PRTDT(:,:) = (ZVARS(:,:)-PRTM(:,:))/PTSTEP_MET @@ -209,7 +209,7 @@ IF (OMIXUV) THEN CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) ! compute U tendency PUDT(:,:)= (ZVARS(:,:)-PUM(:,:))/PTSTEP @@ -223,7 +223,7 @@ IF (OMIXUV) THEN CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) ! compute V tendency PVDT(:,:)= (ZVARS(:,:)-PVM(:,:))/PTSTEP @@ -239,7 +239,7 @@ DO JSV=1,ISV !* compute mean flux of scalar variables at time t-dt ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV))) + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(PSVM(:,:,JSV), KKA, KKU, KKL)) ! ! 3.5 Compute the tendency for scalar variables @@ -248,7 +248,7 @@ DO JSV=1,ISV CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& -PEMF,PTSTEP_SV,PIMPL,PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,ZVARS)) + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(ZVARS, KKA, KKU, KKL)) ! compute Sv tendency PSVDT(:,:,JSV)= (ZVARS(:,:)-PSVM(:,:,JSV))/PTSTEP_SV diff --git a/src/arome/turb/mf_turb_expl.F90 b/src/arome/turb/mf_turb_expl.F90 index 3fa0d8b555db6653682fff047ea817be257be967..0ac56e3236e5bf9ae5a995c7d509397fde4593fe 100644 --- a/src/arome/turb/mf_turb_expl.F90 +++ b/src/arome/turb/mf_turb_expl.F90 @@ -48,7 +48,7 @@ ! ------------ USE MODD_CMFSHALL -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: MZM_MF IMPLICIT NONE @@ -123,22 +123,22 @@ PVDT = 0. ! ----------------------------------------------- ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) -ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM (:,:)) -ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) +ZRTM_F (:,:) = MZM_MF(PRTM (:,:), KKA, KKU, KKL) +ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) ZQTM (:,:) = ZRTM_F (:,:)/(1.+ZRTM_F (:,:)) ZQT_UP (:,:) = PRT_UP (:,:)/(1.+PRT_UP (:,:)) ZTHS_UP(:,:) = PTHL_UP(:,:)*(1.+XLAMBDA*ZQT_UP(:,:)) ZTHSM (:,:) = ZTHLM_F(:,:)*(1.+XLAMBDA*ZQTM(:,:)) -PFLXZTHLMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) ! ThetaL -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP (:,:)-MZM_MF(KKA,KKU,KKL,PRTM (:,:))) ! Rt -PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHVM(:,:))) ! ThetaV +PFLXZTHLMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), KKA, KKU, KKL)) ! ThetaL +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP (:,:)-MZM_MF(PRTM (:,:), KKA, KKU, KKL)) ! Rt +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), KKA, KKU, KKL)) ! ThetaV ZFLXZTHSMF(:,:) = PEMF(:,:)*(ZTHS_UP(:,:)-ZTHSM(:,:)) ! Theta S flux IF (OMIXUV) THEN - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,PUM(:,:))) ! U - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PVM(:,:))) ! V + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), KKA, KKU, KKL)) ! U + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), KKA, KKU, KKL)) ! V ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. diff --git a/src/arome/turb/mode_prandtl.F90 b/src/arome/turb/mode_prandtl.F90 index 58d3ddc613750c53a438b0c0b818a4731ece2c91..d460f8e0bc4b5af58dc41c7adef903aa53ae1f67 100644 --- a/src/arome/turb/mode_prandtl.F90 +++ b/src/arome/turb/mode_prandtl.F90 @@ -10,7 +10,7 @@ USE MODD_CTURB, ONLY : XCTV, XCSHF, XCTD, XPHI_LIM, XCPR3, XCPR4, XCPR5 USE MODD_PARAMETERS, ONLY : JPVEXT_TURB ! -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY: MZM, MZF IMPLICIT NONE !---------------------------------------------------------------------------- CONTAINS @@ -385,7 +385,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(KKA,KKU,KKL,PTKE) & +M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL) & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD ) / (1.+PREDTH1) ! M3_WTH_W2TH(:,:,IKB-1)=M3_WTH_W2TH(:,:,IKB) @@ -414,7 +414,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_W2TH_O_DDTDZ(:,:,:) = & - - XCSHF*PKEFF*1.5/MZM(KKA,KKU,KKL,PTKE)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & + - XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD*( 1.+(1.+PREDTH1)*(1.5+PREDR1+PREDTH1)/PD) ) ! D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB) @@ -443,7 +443,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(KKA,KKU,KKL,PTKE)*PEMOIST*PDTDZ/PD +M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST*PDTDZ/PD ! M3_WTH_W2R(:,:,IKB-1)=M3_WTH_W2R(:,:,IKB) M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) @@ -470,7 +470,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(KKA,KKU,KKL,PTKE)*PEMOIST/PD & +D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKB) @@ -503,7 +503,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_WTH_WR2(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(KKA,KKU,KKL,PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD*PDTDZ/PD + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD*PDTDZ/PD ! M3_WTH_WR2(:,:,IKB-1)=M3_WTH_WR2(:,:,IKB) M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) @@ -534,7 +534,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(KKA,KKU,KKL,PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD/PD & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKB) @@ -563,9 +563,9 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(KKA,KKU,KKL,PBETA*PTKE*PSQRT_TKE) & +!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE, KKA, KKU, KKL) & ! *0.5*PLEPS/XCTD*(1+PREDR1)/PD -M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(KKA,KKU,KKL,PBETA/PTKE*PSQRT_TKE) & +M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE, KKA, KKU, KKL) & *0.5*PLEPS/XCTD*(1+PREDR1)/PD ! M3_WTH_WTHR(:,:,IKB-1)=M3_WTH_WTHR(:,:,IKB) @@ -616,7 +616,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2TH(:,:,:) = - MZF(KKA,KKU,KKL,(1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ) & +M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ, KKA, KKU, KKL) & * 1.5*PLM*PLEPS/PTKE*XCTV ! M3_TH2_W2TH(:,:,IKB-1)=M3_TH2_W2TH(:,:,IKB) @@ -645,15 +645,15 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB IF (OUSERV) THEN -! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL, & +! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & ! (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD ) & -! / (1.+PREDTH1)**2 ) - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL, & +! / (1.+PREDTH1)**2, KKA, KKU, KKL) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)* & - PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2 ) + PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2, KKA, KKU, KKL) ELSE - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL,1./(1.+PREDTH1)**2) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2, KKA, KKU, KKL) END IF ! D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB) @@ -680,7 +680,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTH2(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE & - * MZF(KKA,KKU,KKL, (1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD ) + * MZF((1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD, KKA, KKU, KKL) ! M3_TH2_WTH2(:,:,IKB-1)=M3_TH2_WTH2(:,:,IKB) M3_TH2_WTH2(:,:,IKE+1)=M3_TH2_WTH2(:,:,IKE) @@ -708,9 +708,9 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE*XCTV & - * MZF(KKA,KKU,KKL, PBLL_O_E*PETHETA* (0.5/PD & + * MZF(PBLL_O_E*PETHETA* (0.5/PD & - (1.5+PREDTH1+PREDR1)*(1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD**2 & - ) ) + ), KKA, KKU, KKL) ! D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB) D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) @@ -737,7 +737,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(KKA,KKU,KKL,PBLL_O_E*PEMOIST/PD*PDTDZ**2)*PLM*PLEPS/PTKE +M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2, KKA, KKU, KKL)*PLM*PLEPS/PTKE ! M3_TH2_W2R(:,:,IKB-1)=M3_TH2_W2R(:,:,IKB) M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) @@ -767,7 +767,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*XCTV**2*PLM*PLEPS/PTKE & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKB) D_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKE) @@ -793,7 +793,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF(KKA,KKU,KKL,(PBLL_O_E*PEMOIST*PDTDZ)**2/PD)*PLEPS/PSQRT_TKE/XCTD +M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD, KKA, KKU, KKL)*PLEPS/PSQRT_TKE/XCTD ! M3_TH2_WR2(:,:,IKB-1)=M3_TH2_WR2(:,:,IKB) M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) @@ -822,7 +822,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*XCTV**2*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, (PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF((PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKB) D_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKE) @@ -850,7 +850,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTHR(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD ) + * MZF(PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_TH2_WTHR(:,:,IKB-1)=M3_TH2_WTHR(:,:,IKB) M3_TH2_WTHR(:,:,IKE+1)=M3_TH2_WTHR(:,:,IKE) @@ -879,7 +879,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB) D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) @@ -905,7 +905,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, (1.+PREDTH1)*(1.+PREDR1)/PD ) + * MZF((1.+PREDTH1)*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_THR_WTHR(:,:,IKB-1)=M3_THR_WTHR(:,:,IKB) M3_THR_WTHR(:,:,IKE+1)=M3_THR_WTHR(:,:,IKE) @@ -933,7 +933,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD * XCTV & - * MZF(KKA,KKU,KKL, PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_THR_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKB) D_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKE) @@ -961,7 +961,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF(KKA,KKU,KKL, (1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD ) + * MZF((1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_WTH2(:,:,IKB-1)=M3_THR_WTH2(:,:,IKB) M3_THR_WTH2(:,:,IKE+1)=M3_THR_WTH2(:,:,IKE) @@ -990,7 +990,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV**2 & - * MZF(KKA,KKU,KKL, -(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1) ) + * MZF(-(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1), KKA, KKU, KKL) ! D_M3_THR_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKB) D_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKE) @@ -1018,9 +1018,9 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF(KKA,KKU,KKL, PBLL_O_E*PETHETA/PD & - *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)) & - ) + * MZF(PBLL_O_E*PETHETA/PD & + *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)), & + KKA, KKU, KKL) ! D_M3_THR_WTH2_O_DDRDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKB) D_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKE) @@ -1047,7 +1047,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF(KKA,KKU,KKL, (1.+PREDR1)*PDRDZ/PD ) + * MZF((1.+PREDR1)*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_W2TH(:,:,IKB-1)=M3_THR_W2TH(:,:,IKB) M3_THR_W2TH(:,:,IKE+1)=M3_THR_W2TH(:,:,IKE) @@ -1077,7 +1077,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV**2 & - * MZF(KKA,KKU,KKL, -PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2 ) + * MZF(-PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2, KKA, KKU, KKL) ! D_M3_THR_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKB) @@ -1105,9 +1105,9 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF(KKA,KKU,KKL, -(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & - +(1.+2.*PREDR1)/PD & - ) + * MZF(-(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & + +(1.+2.*PREDR1)/PD, & + KKA, KKU, KKL) ! D_M3_THR_W2TH_O_DDRDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDRDZ(:,:,IKB) diff --git a/src/arome/turb/prandtl.F90 b/src/arome/turb/prandtl.F90 index f78288a3225a79b68d28568a3d263af280c1640f..3afb18cc4446837c32394876d804095d204a07ea 100644 --- a/src/arome/turb/prandtl.F90 +++ b/src/arome/turb/prandtl.F90 @@ -125,7 +125,7 @@ USE MODD_PARAMETERS USE MODI_GRADIENT_M USE MODI_EMOIST USE MODI_ETHETA -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY: MZM USE MODE_FMWRIT ! IMPLICIT NONE @@ -228,8 +228,8 @@ IKE = KKU-JPVEXT_TURB*KKL ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) ISV =SIZE(PSVM,4) ! -PETHETA(:,:,:) = MZM(KKA,KKU,KKL, ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ) -PEMOIST(:,:,:) = MZM(KKA,KKU,KKL, EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ) +PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM), KKA, KKU, KKL) +PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM), KKA, KKU, KKL) PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) ! @@ -238,14 +238,14 @@ IF (.NOT. LHARAT) THEN ! ! 1.3 1D Redelsperger numbers ! -PBLL_O_E(:,:,:) = MZM(KKA,KKU,KKL, XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) +PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) IF (KRR /= 0) THEN ! moist case PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & - & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) + & GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & - & GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) + & GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) PREDR1(:,:,:) = 0. END IF ! @@ -296,7 +296,7 @@ END IF ! ! For the scalar variables DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) + PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) END DO ! DO JSV=1,ISV @@ -322,22 +322,22 @@ ELSE IF (L2D) THEN ! 3D case in a 2D model ! IF (KRR /= 0) THEN ! moist 3D case PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 ) + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) ! PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)) + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) ! ELSE ! dry 3D case in a 2D model PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 ) + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:) = 0. @@ -350,27 +350,27 @@ ELSE ! 3D case in a 3D model ! IF (KRR /= 0) THEN ! moist 3D case PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)**2 ) + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) ! PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)+ & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY) ) + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) ! ELSE ! dry 3D case in a 3D model PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)**2 ) + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:) = 0. @@ -400,22 +400,22 @@ DO JSV=1,ISV ELSE IF (L2D) THEN ! 3D case in a 2D model ! IF (KRR /= 0) THEN - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA ELSE - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX) & - ) + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) ! IF (KRR /= 0) THEN PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1 * PEMOIST * & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - ) + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) ELSE PRED2RS3(:,:,:,JSV) = 0. END IF @@ -423,26 +423,26 @@ DO JSV=1,ISV ELSE ! 3D case in a 3D model ! IF (KRR /= 0) THEN - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA ELSE - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX) & - +GY_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY) & - ) + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) ! IF (KRR /= 0) THEN PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1 * PEMOIST * & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - +GY_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY) & - ) + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) ELSE PRED2RS3(:,:,:,JSV) = 0. END IF diff --git a/src/arome/turb/tke_eps_sources.F90 b/src/arome/turb/tke_eps_sources.F90 index 833a2f8f90ecde5c536e1c47d8b52985e5070909..fc586dd609be380c5933c7cbe98e21d746e2adaf 100644 --- a/src/arome/turb/tke_eps_sources.F90 +++ b/src/arome/turb/tke_eps_sources.F90 @@ -128,7 +128,7 @@ USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF USE MODI_TRIDIAG USE MODI_TRIDIAG_TKE USE MODI_BUDGET @@ -277,7 +277,7 @@ ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) - PTKEM(:,:,:) / PTSTEP & ! matrix inverted in TRIDIAG ! ZA(:,:,:) = - PTSTEP * XCET * & - MZM(KKA,KKU,KKL,ZKEFF) * MZM(KKA,KKU,KKL,PRHODJ) / PDZZ**2 + MZM(ZKEFF, KKA, KKU, KKL) * MZM(PRHODJ, KKA, KKU, KKL) / PDZZ**2 ! ! Compute TKE at time t+deltat: ( stored in ZRES ) ! @@ -309,21 +309,21 @@ IF ( LLES_CALL .OR. & ! Compute the cartesian vertical flux of TKE in ZFLX ! - ZFLX(:,:,:) = - XCET * MZM(KKA,KKU,KKL,ZKEFF) * & - DZM(KKA,KKU,KKL,PIMPL * ZRES + PEXPL * PTKEM ) / PDZZ + ZFLX(:,:,:) = - XCET * MZM(ZKEFF, KKA, KKU, KKL) * & + DZM(PIMPL * ZRES + PEXPL * PTKEM, KKA, KKU, KKL) / PDZZ ! ZFLX(:,:,IKB) = 0. ZFLX(:,:,KKA) = 0. ! ! Compute the whole turbulent TRansport of TKE: ! - ZTR(:,:,:)= ZTR - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PRHODJ) * ZFLX / PDZZ ) /PRHODJ + ZTR(:,:,:)= ZTR - DZF(MZM(PRHODJ, KKA, KKU, KKL) * ZFLX / PDZZ, KKA, KKU, KKL) /PRHODJ ! ! Storage in the LES configuration ! IF (LLES_CALL) THEN - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLX), X_LES_SUBGRID_WTke ) - CALL LES_MEAN_SUBGRID( -ZTR, X_LES_SUBGRID_ddz_WTke ) + CALL LES_MEAN_SUBGRID(MZF(ZFLX, KKA, KKU, KKL), X_LES_SUBGRID_WTke ) + CALL LES_MEAN_SUBGRID(-ZTR, X_LES_SUBGRID_ddz_WTke ) END IF ! END IF diff --git a/src/arome/turb/turb.F90 b/src/arome/turb/turb.F90 index 6b219e33fd20d346984e1538fedd9f8f3df925d5..3a0b480d85d7ed81bfdc6d4c77b3d13c56725ca2 100644 --- a/src/arome/turb/turb.F90 +++ b/src/arome/turb/turb.F90 @@ -232,7 +232,7 @@ USE MODI_TURB_VER !USE MODI_ROTATE_WIND !USE MODI_TURB_HOR_SPLT USE MODI_TKE_EPS_SOURCES -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY : MZF, MXF, MYF USE MODI_GRADIENT_M USE MODI_BUDGET USE MODI_LES_MEAN_SUBGRID @@ -777,11 +777,11 @@ ZMTHR = 0. ! w'th'r' IF (HTOM=='TM06') CALL TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,ZMWTH,ZMTH2) ! -ZFWTH = -GZ_M_W(KKA,KKU,KKL,ZMWTH,PDZZ) ! -d(w'2th' )/dz -ZFWR = -GZ_M_W(KKA,KKU,KKL,ZMWR, PDZZ) ! -d(w'2r' )/dz -ZFTH2 = -GZ_W_M(KKA,KKU,KKL,ZMTH2,PDZZ) ! -d(w'th'2 )/dz -ZFR2 = -GZ_W_M(KKA,KKU,KKL,ZMR2, PDZZ) ! -d(w'r'2 )/dz -ZFTHR = -GZ_W_M(KKA,KKU,KKL,ZMTHR,PDZZ) ! -d(w'th'r')/dz +ZFWTH = -GZ_M_W(ZMWTH,PDZZ, KKA, KKU, KKL) ! -d(w'2th' )/dz +ZFWR = -GZ_M_W(ZMWR, PDZZ, KKA, KKU, KKL) ! -d(w'2r' )/dz +ZFTH2 = -GZ_W_M(ZMTH2,PDZZ, KKA, KKU, KKL) ! -d(w'th'2 )/dz +ZFR2 = -GZ_W_M(ZMR2, PDZZ, KKA, KKU, KKL) ! -d(w'r'2 )/dz +ZFTHR = -GZ_W_M(ZMTHR,PDZZ, KKA, KKU, KKL) ! -d(w'th'r')/dz ! ZFWTH(:,:,IKTE:) = 0. ZFWTH(:,:,:IKTB) = 0. @@ -907,8 +907,8 @@ IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9,'HTURB_BU_RRI',YDDDH, YDLDDH, YDMDD ! 6.1 Contribution of mass-flux in the TKE buoyancy production if ! cloud computation is not statistical - PTP = PTP + XG / PTHVREF * MZF(KKA,KKU,KKL, PFLXZTHVMF ) - PTPMF=XG / PTHVREF * MZF(KKA,KKU,KKL, PFLXZTHVMF ) + PTP = PTP + XG / PTHVREF * MZF(PFLXZTHVMF,KKA, KKU, KKL) + PTPMF=XG / PTHVREF * MZF(PFLXZTHVMF, KKA, KKU, KKL) ! 6.2 TKE evolution equation @@ -1038,14 +1038,14 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_U2) CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_V2) CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_W2) - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(KKA,KKU,KKL,& - & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL),& + KKA, KKU, KKL),X_LES_RES_ddz_Thl_SBG_W2) IF (KRR>=1) & - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(KKA,KKU,KKL,& - & GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ)),X_LES_RES_ddz_Rt_SBG_W2) + CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL),& + &KKA, KKU, KKL),X_LES_RES_ddz_Rt_SBG_W2) DO JSV=1,NSV - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(KKA,KKU,KKL,& - & GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)),X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL), & + &KKA, KKU, KKL), X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO END IF diff --git a/src/arome/turb/turb_ver.F90 b/src/arome/turb/turb_ver.F90 index 08a3932ff3c127a8971d1e2ec73470c432e993d7..a08586c54e10444aa4ba401dab8bc8bd04798a32 100644 --- a/src/arome/turb/turb_ver.F90 +++ b/src/arome/turb/turb_ver.F90 @@ -415,9 +415,9 @@ ZSQRT_TKE = SQRT(PTKEM) ! ! gradients of mean quantities at previous time-step ! -ZDTH_DZ = GZ_M_W(KKA,KKU,KKL,PTHLM(:,:,:),PDZZ) +ZDTH_DZ = GZ_M_W(PTHLM(:,:,:),PDZZ, KKA, KKU, KKL) ZDR_DZ = 0. -IF (KRR>0) ZDR_DZ = GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) +IF (KRR>0) ZDR_DZ = GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) ! ! ! Denominator factor in 3rd order terms diff --git a/src/arome/turb/turb_ver_dyn_flux.F90 b/src/arome/turb/turb_ver_dyn_flux.F90 index 13f3b4bbe09c6f5b65eb1d5169dbfe8c124de6bb..6c3c5f5c7504fcf51cf7bb70a23eddc40539b42b 100644 --- a/src/arome/turb/turb_ver_dyn_flux.F90 +++ b/src/arome/turb/turb_ver_dyn_flux.F90 @@ -213,7 +213,8 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY: MZM, MZF, MXM, MXF, MYM, MYF,& + & DZM, DXF, DXM, DYF, DYM USE MODI_TRIDIAG USE MODI_TRIDIAG_WIND USE MODE_FMWRIT @@ -359,7 +360,7 @@ ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) IF (LHARAT) THEN ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50*MFMOIST(:,:,:) ELSE -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) ENDIF ! @@ -377,7 +378,7 @@ ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) ! Preparation of the arguments for TRIDIAG_WIND ! ZA(:,:,:) = -PTSTEP * ZCMFS * & - MXM( ZKEFF ) * MXM(MZM(KKA,KKU,KKL, PRHODJ )) / & + MXM( ZKEFF ) * MXM(MZM(PRHODJ, KKA, KKU, KKL)) / & MXM( PDZZ )**2 ! IF (CPROGRAM/='AROME ') ZA(1,:,:)=ZA(IIE,:,:) @@ -432,7 +433,7 @@ PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP ! vertical flux of the U wind component ! ZFLXZ(:,:,:) = -ZCMFS * MXM(ZKEFF) * & - DZM (KKA,KKU,KKL,PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) + DZM(PIMPL*ZRES + PEXPL*PUM, KKA, KKU, KKL) / MXM(PDZZ) ! ! surface flux ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & @@ -459,7 +460,7 @@ PWU(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production at the mass point ! -PDP(:,:,:) = - MZF(KKA,KKU,KKL, MXF ( ZFLXZ * GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) ) ) +PDP(:,:,:) = - MZF(MXF(ZFLXZ * GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) PDP(:,:,IKB:IKB) = - MXF ( & @@ -471,9 +472,9 @@ PDP(:,:,IKB:IKB) = - MXF ( ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(ZFLXZ)), X_LES_SUBGRID_WU ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) & - & *ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) + CALL LES_MEAN_SUBGRID(MZF(MXF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WU ) + CALL LES_MEAN_SUBGRID(MZF(MXF(GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL) & + & *ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_U_SBG_UaU ) CALL LES_MEAN_SUBGRID( ZCMFS * ZKEFF, X_LES_SUBGRID_Km ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -489,17 +490,17 @@ IF(HTURBDIM=='3DIM') THEN ! IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS & - -DXF( MZM(KKA,KKU,KKL, MXM(PRHODJ) /PDXX ) * ZFLXZ ) & - +DZM(KKA,KKU,KKL, PRHODJ / MZF(KKA,KKU,KKL,PDZZ ) * & - MXF( MZF(KKA,KKU,KKL, ZFLXZ*PDZX ) / PDXX ) & - ) + -DXF( MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) & + +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & + MXF(MZF(ZFLXZ*PDZX, KKA, KKU, KKL) / PDXX ), & + KKA, KKU, KKL) ELSE - PRWS(:,:,:)= PRWS -DXF( MZM(KKA,KKU,KKL, MXM(PRHODJ) /PDXX ) * ZFLXZ ) + PRWS(:,:,:)= PRWS -DXF(MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) END IF ! ! Complete the Dynamical production with the W wind component ! - ZA(:,:,:)=-MZF(KKA,KKU,KKL, MXF ( ZFLXZ * GX_W_UW(KKA,KKU,KKL, PWM,PDXX,PDZZ,PDZX) ) ) + ZA(:,:,:)=-MZF(MXF(ZFLXZ * GX_W_UW(PWM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) @@ -521,17 +522,17 @@ IF(HTURBDIM=='3DIM') THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(GX_W_UW(KKA,KKU,KKL,PWM,PDXX,& - PDZZ,PDZX)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW ) - CALL LES_MEAN_SUBGRID( MXF(GX_M_U(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)& - * MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MZF(MXF(GX_W_UW(PWM,PDXX,& + PDZZ,PDZX, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_W_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MXF(GX_M_U(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)& + * MZF(ZFLXZ, KKA, KKU, KKL)), X_LES_RES_ddxa_Thl_SBG_UaW ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MXF(GX_U_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)& - *MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)& + *MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Rt_SBG_UaW ) END IF DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( MXF(GX_U_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,& - PDZX)*MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& + PDZX, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -549,7 +550,7 @@ END IF ! Preparation of the arguments for TRIDIAG_WIND !! ZA(:,:,:) = - PTSTEP * ZCMFS * & - MYM( ZKEFF ) * MYM(MZM(KKA,KKU,KKL, PRHODJ )) / & + MYM( ZKEFF ) * MYM(MZM(PRHODJ, KKA, KKU, KKL)) / & MYM( PDZZ )**2 ! ! @@ -602,7 +603,7 @@ PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP ! vertical flux of the V wind component ! ZFLXZ(:,:,:) = -ZCMFS * MYM(ZKEFF) * & - DZM(KKA,KKU,KKL, PIMPL*ZRES + PEXPL*PVM ) / MYM(PDZZ) + DZM(PIMPL*ZRES + PEXPL*PVM, KKA, KKU, KKL) / MYM(PDZZ) ! ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & ( ZSOURCE(:,:,IKB:IKB) & @@ -628,7 +629,7 @@ PWV(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production contribution at the mass point ! -ZA(:,:,:) = - MZF(KKA,KKU,KKL, MYF ( ZFLXZ * GZ_V_VW(KKA,KKU,KKL,PVM,PDZZ) ) ) +ZA(:,:,:) = - MZF(MYF(ZFLXZ * GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = & @@ -643,9 +644,9 @@ PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(ZFLXZ)), X_LES_SUBGRID_WV ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(GZ_V_VW(KKA,KKU,KKL,PVM,PDZZ)*& - & ZFLXZ)), X_LES_RES_ddxa_V_SBG_UaV ) + CALL LES_MEAN_SUBGRID(MZF(MYF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WV ) + CALL LES_MEAN_SUBGRID(MZF(MYF(GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)*& + & ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_V_SBG_UaV ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -660,18 +661,18 @@ IF(HTURBDIM=='3DIM') THEN IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS(:,:,:) & - -DYF( MZM(KKA,KKU,KKL, MYM(PRHODJ) /PDYY ) * ZFLXZ ) & - +DZM(KKA,KKU,KKL, PRHODJ / MZF(KKA,KKU,KKL,PDZZ ) * & - MYF( MZF(KKA,KKU,KKL, ZFLXZ*PDZY ) / PDYY ) & - ) + -DYF( MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) & + +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & + MYF(MZF(ZFLXZ*PDZY, KKA, KKU, KKL) / PDYY ), & + KKA, KKU, KKL) ELSE - PRWS(:,:,:)= PRWS(:,:,:) -DYF( MZM(KKA,KKU,KKL, MYM(PRHODJ) /PDYY ) * ZFLXZ ) + PRWS(:,:,:)= PRWS(:,:,:) -DYF(MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) END IF END IF ! ! Complete the Dynamical production with the W wind component IF (.NOT. L2D) THEN - ZA(:,:,:) = - MZF(KKA,KKU,KKL, MYF ( ZFLXZ * GY_W_VW(KKA,KKU,KKL, PWM,PDYY,PDZZ,PDZY) ) ) + ZA(:,:,:) = - MZF(MYF(ZFLXZ * GY_W_VW(PWM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = - MYF ( & @@ -694,13 +695,16 @@ IF(HTURBDIM=='3DIM') THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(GY_W_VW(KKA,KKU,KKL,PWM,PDYY,& - PDZZ,PDZY)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) - CALL LES_MEAN_SUBGRID( MYF(GY_M_V(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)& - *MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MZF(MYF(GY_W_VW(PWM,PDYY,& + &PDZZ,PDZY, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), & + &X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MYF(GY_M_V(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)*& + &MZF(ZFLXZ, KKA, KKU, KKL)), & + &X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MYF(GY_V_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,& - PDZY)*MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& + &PDZY, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),& + &X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -725,7 +729,7 @@ END IF ! IF ( OTURB_FLX .AND. OCLOSE_OUT .AND. HTURBDIM == '1DIM') THEN ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & - -ZCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(KKA,KKU,KKL,PWM,PDZZ) + -ZCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ, KKA, KKU, KKL) ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance diff --git a/src/arome/turb/turb_ver_sv_corr.F90 b/src/arome/turb/turb_ver_sv_corr.F90 index 0497f97f35a42cdc7de443664dd835f7047df558..25744253b913e3b7ea2203fb5e77e26b6de466ce 100644 --- a/src/arome/turb/turb_ver_sv_corr.F90 +++ b/src/arome/turb/turb_ver_sv_corr.F90 @@ -60,7 +60,7 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY : MZF USE MODI_EMOIST USE MODI_ETHETA USE MODI_LES_MEAN_SUBGRID @@ -125,10 +125,10 @@ DO JSV=1,NSV ! IF (LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) - ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)**2 - ZFLXZ(:,:,:) = XCHF / ZCSVD * PLM * PLEPS * MZF(KKA,KKU,KKL,ZFLXZ(:,:,:) ) - CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) + ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL)**2 + ZFLXZ(:,:,:) = XCHF / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:), KKA, KKU, KKL) + CALL LES_MEAN_SUBGRID(-2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) END IF ! ! covariance ThvSv @@ -137,18 +137,18 @@ DO JSV=1,NSV ! approximation: diagnosed explicitely (without implicit term) ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + XCHF * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) & - * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(KKA,KKU,KKL,ZFLXZ) + * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) & + * GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! IF (KRR>=1) THEN ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ZFLXZ(:,:,:)= ( XCHF * PPSI3 + XCHF * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) & - * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(KKA,KKU,KKL,ZFLXZ) + * GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) & + * GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) END IF diff --git a/src/arome/turb/turb_ver_sv_flux.F90 b/src/arome/turb/turb_ver_sv_flux.F90 index 8e50b0ef4f7a842aaa7931ed32ee8dd6e34266c9..d19712dc51381e9a0f56ace65d0f65e95bdb98dc 100644 --- a/src/arome/turb/turb_ver_sv_flux.F90 +++ b/src/arome/turb/turb_ver_sv_flux.F90 @@ -212,7 +212,7 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY : DZM, MZM, MZF USE MODI_TRIDIAG USE MODI_TRIDIAG_WIND USE MODI_EMOIST @@ -316,7 +316,7 @@ ISV=SIZE(PSVM,4) IF (LHARAT) THEN ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50.*MFMOIST(:,:,:) ELSE -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) ENDIF ! @@ -332,11 +332,11 @@ DO JSV=1,ISV ! Preparation of the arguments for TRIDIAG IF (LHARAT) THEN ZA(:,:,:) = -PTSTEP* & - ZKEFF * MZM(KKA,KKU,KKL,PRHODJ) / & + ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & PDZZ**2 ELSE ZA(:,:,:) = -PTSTEP*XCHF*PPSI_SV(:,:,:,JSV) * & - ZKEFF * MZM(KKA,KKU,KKL,PRHODJ) / & + ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & PDZZ**2 ENDIF ! @@ -369,8 +369,8 @@ ENDIF IF ( (OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL ) THEN ! Diagnostic of the cartesian vertical flux ! - ZFLXZ(:,:,:) = -XCHF * PPSI_SV(:,:,:,JSV) * MZM(KKA,KKU,KKL,PLM*SQRT(PTKEM)) / PDZZ * & - DZM(KKA,KKU,KKL, PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV) ) + ZFLXZ(:,:,:) = -XCHF * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM), KKA, KKU, KKL) / PDZZ * & + DZM(PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV), KKA, KKU, KKL) ! surface flux !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally ! (in presence of slopes) @@ -403,16 +403,16 @@ ENDIF END IF ! ! Storage in the LES configuration - ! + IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ), & - X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ), & - X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( -ZCSVP*SQRT(PTKEM)/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL), & + X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(MZF(GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), & + X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(-ZCSVP*SQRT(PTKEM)/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/arome/turb/turb_ver_thermo_corr.F90 b/src/arome/turb/turb_ver_thermo_corr.F90 index 9c082572b6db4d34b041b487ca20a497d1e5ece5..1e343bb2705068a5d5dc6dd48f38c7a405b577ec 100644 --- a/src/arome/turb/turb_ver_thermo_corr.F90 +++ b/src/arome/turb/turb_ver_thermo_corr.F90 @@ -215,7 +215,7 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY : DZM, MZM, MZF USE MODI_TRIDIAG USE MODE_FMWRIT USE MODI_LES_MEAN_SUBGRID @@ -379,7 +379,7 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2*KKL)+2.*PDZZ(:,:,IKB+KKL)) / & ! ! IF (LHARAT) THEN -PLMF=MZF(KKA,KKU,KKL,PLM) +PLMF=MZF(PLM, KKA, KKU, KKL) PLEPSF=PLMF ! function MZF produces -999 for level IKU (82 for 80 levels) ! so put these to normal value as this level (82) is indeed calculated @@ -387,7 +387,7 @@ PLMF(:,:,IKU)=0.001 PLEPSF(:,:,IKU)=0.001 ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50*MFMOIST(:,:,:) ELSE -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) ENDIF ! @@ -419,9 +419,9 @@ END IF ! Compute the turbulent variance F and F' at time t-dt. ! IF (LHARAT) THEN - ZF (:,:,:) = PLMF*PLEPSF*MZF(KKA,KKU,KKL,PDTH_DZ**2) + ZF (:,:,:) = PLMF*PLEPSF*MZF(PDTH_DZ**2, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,PPHI3*PDTH_DZ**2) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2, KKA, KKU, KKL) ENDIF ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! @@ -438,9 +438,9 @@ ENDIF ! d(w'2th')/dz IF (GFWTH) THEN ZF = ZF + M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTH_DZ,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWTH) + & PLM,PLEPS,PTKEM) * MZF(PFWTH, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,GUSERV) * MZF(KKA,KKU,KKL,PFWTH) + & PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWTH, KKA, KKU, KKL) END IF ! IF (KRR/=0) THEN @@ -455,9 +455,9 @@ ENDIF ! d(w'2r')/dz IF (GFWR) THEN ZF = ZF + M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,PBLL_O_E,& - & PEMOIST,PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) + & PEMOIST,PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) + & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz @@ -472,9 +472,9 @@ ENDIF ! ZFLXZ(:,:,:) = ZF & ! + PIMPL * XCTV*PLM*PLEPS & - ! *MZF(KKA,KKU,KKL,D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & - ! *DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ ) & - + PIMPL * ZDFDDTDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ ) + ! *MZF(D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & + ! *DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ ) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ! ! special case near the ground ( uncentred gradient ) IF (LHARAT) THEN @@ -525,11 +525,11 @@ ENDIF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Thl2 ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) - CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_Thl2 ) + CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) + CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) + CALL LES_MEAN_SUBGRID(PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) + CALL LES_MEAN_SUBGRID(-XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -541,9 +541,9 @@ ENDIF ! ! Compute the turbulent variance F and F' at time t-dt. IF (LHARAT) THEN - ZF (:,:,:) = PLMF*PLEPSF*MZF(KKA,KKU,KKL,PDTH_DZ*PDR_DZ) + ZF (:,:,:) = PLMF*PLEPSF*MZF(PDTH_DZ*PDR_DZ, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ, KKA, KKU, KKL) ENDIF ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately @@ -563,11 +563,11 @@ ENDIF ! d(w'2th')/dz IF (GFWTH) THEN ZF = ZF + M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKEM,& - & PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) + & PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(KKA,KKU,KKL,PFWTH) + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(PFWTH, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWTH) + & PD,PLM,PLEPS,PTKEM) * MZF(PFWTH, KKA, KKU, KKL) END IF ! ! d(w'r'2)/dz @@ -583,11 +583,11 @@ ENDIF ! d(w'2r')/dz IF (GFWR) THEN ZF = ZF + M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKEM,& - & PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) + & PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWR) + & PLM,PLEPS,PTKEM) * MZF(PFWR, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(KKA,KKU,KKL,PFWR) + & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(PFWR, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz @@ -603,25 +603,25 @@ ENDIF IF (LHARAT) THEN ZFLXZ(:,:,:) = ZF & + PIMPL * PLMF*PLEPSF*0.5 & - * MZF(KKA,KKU,KKL, ( 2. & - ) *PDR_DZ *DZM(KKA,KKU,KKL,PTHLP - PTHLM ) / PDZZ & + * MZF(( 2. & + ) *PDR_DZ *DZM(PTHLP - PTHLM, KKA, KKU, KKL ) / PDZZ & +( 2. & - ) *PDTH_DZ *DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ & - ) & - + PIMPL * ZDFDDTDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PTHLP - PTHLM(:,:,:)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ & + , KKA, KKU, KKL) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ELSE ZFLXZ(:,:,:) = ZF & + PIMPL * XCTV*PLM*PLEPS*0.5 & - * MZF(KKA,KKU,KKL, ( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term + * MZF(( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term +D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term - ) *PDR_DZ *DZM(KKA,KKU,KKL,PTHLP - PTHLM ) / PDZZ & + ) *PDR_DZ *DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ & +( D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term +D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term - ) *PDTH_DZ *DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ & - ) & - + PIMPL * ZDFDDTDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PTHLP - PTHLM(:,:,:)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ & + , KKA, KKU, KKL) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ENDIF ! ! special case near the ground ( uncentred gradient ) @@ -686,13 +686,13 @@ ENDIF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_THlRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) - CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) - CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_THlRt ) + CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) + CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) + CALL LES_MEAN_SUBGRID(PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) + CALL LES_MEAN_SUBGRID(-XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlThv , .TRUE. ) + CALL LES_MEAN_SUBGRID(-XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -703,9 +703,9 @@ END IF ! ! Compute the turbulent variance F and F' at time t-dt. IF (LHARAT) THEN - ZF (:,:,:) = PLMF*PLEPSF*MZF(KKA,KKU,KKL,PDR_DZ**2) + ZF (:,:,:) = PLMF*PLEPSF*MZF(PDR_DZ**2, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,PPSI3*PDR_DZ**2) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2, KKA, KKU, KKL) ENDIF ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! @@ -722,9 +722,9 @@ ENDIF ! d(w'2r')/dz IF (GFWR) THEN ZF = ZF + M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDR_DZ,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWR) + & PLM,PLEPS,PTKEM) * MZF(PFWR, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(KKA,KKU,KKL,PFWR) + & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWR, KKA, KKU, KKL) END IF ! IF (KRR/=0) THEN @@ -739,9 +739,9 @@ ENDIF ! d(w'2r')/dz IF (GFWTH) THEN ZF = ZF + M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,& - & PBLL_O_E,PETHETA,PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) + & PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz @@ -757,15 +757,15 @@ ENDIF IF (LHARAT) THEN ZFLXZ(:,:,:) = ZF & + PIMPL * PLMF*PLEPSF & - *MZF(KKA,KKU,KKL,2.*PDR_DZ* & - DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + *MZF(2.*PDR_DZ* & + DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ELSE ZFLXZ(:,:,:) = ZF & + PIMPL * XCTV*PLM*PLEPS & - *MZF(KKA,KKU,KKL,D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & - *DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + *MZF(D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & + *DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ENDIF ! ! special case near the ground ( uncentred gradient ) @@ -813,11 +813,11 @@ ENDIF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Rt2 ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) - CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) + CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_Rt2 ) + CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) + CALL LES_MEAN_SUBGRID(PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) + CALL LES_MEAN_SUBGRID(-XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/arome/turb/turb_ver_thermo_flux.F90 b/src/arome/turb/turb_ver_thermo_flux.F90 index 41494a3641638728430df2edf3925a035d311a17..d377e2c9d3de1ec857dfe3167d1e89c218d3c6c6 100644 --- a/src/arome/turb/turb_ver_thermo_flux.F90 +++ b/src/arome/turb/turb_ver_thermo_flux.F90 @@ -221,7 +221,7 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_SHUMAN +USE MODI_SHUMAN , ONLY : DZF, DZM, MZF, MZM USE MODI_TRIDIAG USE MODE_FMWRIT USE MODI_LES_MEAN_SUBGRID @@ -381,7 +381,7 @@ IF (LHARAT) THEN ! LHARAT so TKE and length scales at half levels! ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) +50.*MFMOIST(:,:,:) ELSE -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) ENDIF ! ! @@ -411,10 +411,10 @@ END IF ! Compute the turbulent flux F and F' at time t-dt. ! IF (LHARAT) THEN -ZF (:,:,:) = -ZKEFF*DZM(KKA,KKU,KKL,PTHLM)/PDZZ +ZF (:,:,:) = -ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ ZDFDDTDZ(:,:,:) = -ZKEFF ELSE -ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(KKA,KKU,KKL,PTHLM)/PDZZ +ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) ENDIF ! @@ -433,9 +433,9 @@ END IF IF (GFTH2) THEN Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTH2) + ZF = ZF + Z3RDMOMENT * MZM(PFTH2, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& - & PD,PBLL_O_E,PETHETA) * MZM(KKA,KKU,KKL,PFTH2) + & PD,PBLL_O_E,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'2r')/dz @@ -449,9 +449,9 @@ END IF ! d(w'r'2)/dz IF (GFR2) THEN ZF = ZF + M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(KKA,KKU,KKL,PFR2) + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(KKA,KKU,KKL,PFR2) + & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz @@ -459,9 +459,9 @@ IF (GFTHR) THEN Z3RDMOMENT= M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& - & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(KKA,KKU,KKL,PFTHR) + & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR, KKA, KKU, KKL) END IF ! !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -492,7 +492,7 @@ PRTHLS(:,:,:)= PRTHLS(:,:,:) + & ! Conservative potential temperature flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDTDZ * DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ + + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! @@ -514,16 +514,16 @@ END IF ! ! Contribution of the conservative temperature flux to the buoyancy flux IF (KRR /= 0) THEN - PTP(:,:,:) = PBETA * MZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PETHETA) * ZFLXZ ) + PTP(:,:,:) = PBETA * MZF(MZM(PETHETA, KKA, KKU, KKL) * ZFLXZ, KKA, KKU, KKL) PTP(:,:,IKB)= PBETA(:,:,IKB) * PETHETA(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) ELSE - PTP(:,:,:)= PBETA * MZF(KKA,KKU,KKL, ZFLXZ ) + PTP(:,:,:)= PBETA * MZF(ZFLXZ, KKA, KKU, KKL) END IF ! ! Buoyancy flux at flux points ! -PWTHV = MZM(KKA,KKU,KKL,PETHETA) * ZFLXZ +PWTHV = MZM(PETHETA, KKA, KKU, KKL) * ZFLXZ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) ! !* 2.3 Partial vertical divergence of the < Rc w > flux @@ -531,14 +531,14 @@ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) !IF ( KRRL >= 1 ) THEN ! IF ( KRRI >= 1 ) THEN ! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & +! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & ! *(1.0-PFRAC_ICE(:,:,:)) ! PRRS(:,:,:,4) = PRRS(:,:,:,4) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & +! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & ! *PFRAC_ICE(:,:,:) ! ELSE ! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) +! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) ! END IF !END IF ! @@ -546,22 +546,22 @@ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WThl ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WThl ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ),& + CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThl ) + CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WThl ) + CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& & X_LES_RES_ddxa_W_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_ThlPz ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MZM(KKA,KKU,KKL,PETHETA)*ZFLXZ), X_LES_SUBGRID_WThv ) + CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaThl ) + CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID(MZF(MZM(PETHETA, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaThl ) + CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaThl ) END IF !* diagnostic of mixing coefficient for heat - ZA = DZM(KKA,KKU,KKL,PTHLP) + ZA = DZM(PTHLP, KKA, KKU, KKL) WHERE (ZA==0.) ZA=1.E-6 ZA = - ZFLXZ / ZA * PDZZ ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) - ZA = MZF(KKA,KKU,KKL, ZA ) + ZA = MZF(ZA, KKA, KKU, KKL) ZA = MIN(MAX(ZA,-1000.),1000.) CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) ! @@ -587,10 +587,10 @@ IF (KRR /= 0) THEN ! Compute the turbulent flux F and F' at time t-dt. ! IF (LHARAT) THEN - ZF (:,:,:) = -ZKEFF*DZM(KKA,KKU,KKL,PRM(:,:,:,1))/PDZZ + ZF (:,:,:) = -ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ ZDFDDRDZ(:,:,:) = -ZKEFF ELSE - ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(KKA,KKU,KKL,PRM(:,:,:,1))/PDZZ + ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) ENDIF ! @@ -609,9 +609,9 @@ IF (KRR /= 0) THEN IF (GFR2) THEN Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFR2) + ZF = ZF + Z3RDMOMENT * MZM(PFR2, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(KKA,KKU,KKL,PFR2) + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'2th')/dz @@ -625,9 +625,9 @@ IF (KRR /= 0) THEN ! d(w'th'2)/dz IF (GFTH2) THEN ZF = ZF + M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(KKA,KKU,KKL,PFTH2) + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(KKA,KKU,KKL,PFTH2) + &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz @@ -635,9 +635,9 @@ IF (KRR /= 0) THEN Z3RDMOMENT= M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(KKA,KKU,KKL,PFTHR) + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR, KKA, KKU, KKL) END IF ! !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -668,7 +668,7 @@ IF (KRR /= 0) THEN ! cons. mixing ratio flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDRDZ * DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ + + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! @@ -690,14 +690,14 @@ IF (KRR /= 0) THEN END IF ! ! Contribution of the conservative water flux to the Buoyancy flux - ZA(:,:,:) = PBETA * MZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PEMOIST) * ZFLXZ ) + ZA(:,:,:) = PBETA * MZF(MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ, KKA, KKU, KKL) ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:) ! ! Buoyancy flux at flux points ! - PWTHV = PWTHV + MZM(KKA,KKU,KKL,PEMOIST) * ZFLXZ + PWTHV = PWTHV + MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) ! !* 3.3 Complete vertical divergence of the < Rc w > flux @@ -705,14 +705,14 @@ IF (KRR /= 0) THEN ! IF ( KRRL >= 1 ) THEN ! IF ( KRRI >= 1 ) THEN ! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & +! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & ! *(1.0-PFRAC_ICE(:,:,:)) ! PRRS(:,:,:,4) = PRRS(:,:,:,4) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & +! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & ! *PFRAC_ICE(:,:,:) ! ELSE ! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) +! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) ! END IF ! END IF ! @@ -720,14 +720,14 @@ IF (KRR /= 0) THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WRt ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ),& + CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRt ) + CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WRt ) + CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& & X_LES_RES_ddxa_W_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MZM(KKA,KKU,KKL,PEMOIST)*ZFLXZ), X_LES_SUBGRID_WThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_RtPz ) + CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaRt ) + CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaRt ) + CALL LES_MEAN_SUBGRID(MZF(MZM(PEMOIST, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_RtPz ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -749,18 +749,18 @@ IF ( ((OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! With LHARAT is true tke and length scales at half levels ! yet modify to use length scale and tke at half levels from vdfexcuhl IF (LHARAT) THEN - ZA(:,:,:) = DZM(KKA,KKU,KKL,PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & (-PLM*PSQRT_TKE) ELSE - ZA(:,:,:) = DZM(KKA,KKU,KKL,PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & - (-PPHI3*MZM(KKA,KKU,KKL,PLM*PSQRT_TKE)) * XCSHF + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & + (-PPHI3*MZM(PLM*PSQRT_TKE, KKA, KKU, KKL)) * XCSHF ENDIF ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & * PDIRCOSZW(:,:) ! ! compute <w Rc> - ZFLXZ(:,:,:) = MZM(KKA,KKU,KKL, PAMOIST * 2.* PSRCM ) * ZFLXZ(:,:,:) + & - MZM(KKA,KKU,KKL, PATHETA * 2.* PSRCM ) * ZA(:,:,:) + ZFLXZ(:,:,:) = MZM(PAMOIST * 2.* PSRCM, KKA, KKU, KKL) * ZFLXZ(:,:,:) + & + MZM(PATHETA * 2.* PSRCM, KKA, KKU, KKL) * ZA(:,:,:) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! ! store the liquid water mixing ratio vertical flux @@ -776,7 +776,7 @@ IF ( ((OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WRc ) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRc ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/common/turb/compute_bl89_ml.F90 b/src/common/turb/compute_bl89_ml.F90 index 897bfc12fab3710b1e672d573cc197fa7d24007e..f303a4529174397fba30e59386820b60c3b651fc 100644 --- a/src/common/turb/compute_bl89_ml.F90 +++ b/src/common/turb/compute_bl89_ml.F90 @@ -42,7 +42,7 @@ USE MODD_PARAMETERS, ONLY: JPVEXT ! USE MODE_MSG ! -USE MODI_SHUMAN_MF +USE MODI_SHUMAN_MF, ONLY: DZM_MF, MZM_MF ! IMPLICIT NONE ! @@ -87,13 +87,13 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_BL89_ML',0,ZHOOK_HANDLE) IIJU=SIZE(PVPT,1) ! -ZDELTVPT(:,:)=DZM_MF(KKA,KKU,KKL,PVPT(:,:)) +ZDELTVPT(:,:)=DZM_MF(PVPT(:,:), KKA, KKU, KKL) ZDELTVPT(:,KKA)=0. WHERE (ABS(ZDELTVPT(:,:))<XLINF) ZDELTVPT(:,:)=XLINF END WHERE ! -ZHLVPT(:,:)=MZM_MF(KKA,KKU,KKL,PVPT(:,:)) +ZHLVPT(:,:)=MZM_MF(PVPT(:,:), KKA, KKU, KKL) ! !We consider that gradient between mass levels KKB and KKB+KKL is the same as !the gradient between flux level KKB and mass level KKB diff --git a/src/common/turb/rmc01.F90 b/src/common/turb/rmc01.F90 index 575b98c39b274ae1a1abd2256a006f0f96fd6f56..7488d6cbd8f5651433d9f34838940920a54ea5f4 100644 --- a/src/common/turb/rmc01.F90 +++ b/src/common/turb/rmc01.F90 @@ -46,7 +46,7 @@ USE MODD_CTURB ! USE MODE_SBL ! -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY : MZF, MYF, MXF ! IMPLICIT NONE ! @@ -113,7 +113,7 @@ IKT=SIZE(PZZ,3) IKTE=IKT-JPVEXT_TURB ! ! altitude of mass points -ZZZ=MZF(KKA,KKU,KKL,PZZ) +ZZZ=MZF(PZZ, KKA, KKU, KKL) ! replace by height of mass points DO JK=1,IKT ZZZ(:,:,JK) = ZZZ(:,:,JK) - PZZ(:,:,IKB) diff --git a/src/common/turb/shuman_mf.F90 b/src/common/turb/shuman_mf.F90 index 4720135892d6c4c6b0a1122a76d99287ba2bbc44..8c1c1ade02fbc219bd9d6143c08cd42293a50bb9 100644 --- a/src/common/turb/shuman_mf.F90 +++ b/src/common/turb/shuman_mf.F90 @@ -8,45 +8,42 @@ ! INTERFACE ! -FUNCTION DZF_MF(KKA,KKU,KKL,PA) RESULT(PDZF) +FUNCTION DZF_MF(PA, KKA, KKU, KKL) RESULT(PDZF) +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZF ! result at mass ! localization END FUNCTION DZF_MF ! -FUNCTION DZM_MF(KKA,KKU,KKL,PA) RESULT(PDZM) +FUNCTION DZM_MF(PA, KKA, KKU, KKL) RESULT(PDZM) +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass - ! localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZM ! result at flux ! side END FUNCTION DZM_MF ! -FUNCTION MZF_MF(KKA,KKU,KKL,PA) RESULT(PMZF) +FUNCTION MZF_MF(PA, KKA, KKU, KKL) RESULT(PMZF) +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZF ! result at mass ! localization END FUNCTION MZF_MF ! -FUNCTION MZM_MF(KKA,KKU,KKL,PA) RESULT(PMZM) +FUNCTION MZM_MF(PA, KKA, KKU, KKL) RESULT(PMZM) +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZM ! result at flux localization END FUNCTION MZM_MF ! -FUNCTION GZ_M_W_MF(KKA,KKU,KKL,PY,PDZZ) RESULT(PGZ_M_W) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GZ_M_W_MF(PY,PDZZ, KKA, KKU, KKL) RESULT(PGZ_M_W) REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficient d*zz REAL, DIMENSION(:,:), INTENT(IN) :: PY ! variable at mass localization +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2)) :: PGZ_M_W ! result at flux side END FUNCTION GZ_M_W_MF ! @@ -55,7 +52,7 @@ END INTERFACE END MODULE MODI_SHUMAN_MF ! ! ############################### - FUNCTION MZF_MF(KKA,KKU,KKL,PA) RESULT(PMZF) + FUNCTION MZF_MF(PA, KKA, KKU, KKL) RESULT(PMZF) ! ############################### ! !!**** *MZF* - SHUMAN_MF operator : mean operator in z direction for a @@ -106,10 +103,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZF ! result at mass ! localization ! @@ -134,7 +130,7 @@ PMZF(:,KKU) = PA(:,KKU) ! END FUNCTION MZF_MF ! ############################### - FUNCTION MZM_MF(KKA,KKU,KKL,PA) RESULT(PMZM) + FUNCTION MZM_MF(PA, KKA, KKU, KKL) RESULT(PMZM) ! ############################### ! !!**** *MZM* - SHUMAN_MF operator : mean operator in z direction for a @@ -185,9 +181,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZM ! result at flux localization ! !* 0.2 Declarations of local variables @@ -211,7 +207,7 @@ PMZM(:,KKU) = 0.5*( PA(:,KKU)+PA(:,KKU-KKL) ) ! END FUNCTION MZM_MF ! ############################### - FUNCTION DZF_MF(KKA,KKU,KKL,PA) RESULT(PDZF) + FUNCTION DZF_MF(PA, KKA, KKU, KKL) RESULT(PDZF) ! ############################### ! !!**** *DZF* - SHUMAN_MF operator : finite difference operator in z direction @@ -262,10 +258,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux side INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux - ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZF ! result at mass ! localization ! @@ -289,7 +284,7 @@ PDZF(:,KKU) = 0. ! END FUNCTION DZF_MF ! ############################### - FUNCTION DZM_MF(KKA,KKU,KKL,PA) RESULT(PDZM) + FUNCTION DZM_MF(PA, KKA, KKU, KKL) RESULT(PDZM) ! ############################### ! !!**** *DZM* - SHUMAN_MF operator : finite difference operator in z direction @@ -340,10 +335,9 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass - ! localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZM ! result at flux ! side ! @@ -368,7 +362,7 @@ PDZM(:,KKU) = PA(:,KKU) - PA(:,KKU-KKL) END FUNCTION DZM_MF ! ############################### - FUNCTION GZ_M_W_MF(KKA,KKU,KKL,PY,PDZZ) RESULT(PGZ_M_W) + FUNCTION GZ_M_W_MF(PY,PDZZ, KKA, KKU, KKL) RESULT(PGZ_M_W) ! ############################### ! !!**** *GZ_M_W * - Compute the gradient along z direction for a @@ -419,10 +413,10 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficient d*zz REAL, DIMENSION(:,:), INTENT(IN) :: PY ! variable at mass localization +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2)) :: PGZ_M_W ! result at flux side ! !* 0.2 Declarations of local variables diff --git a/src/common/turb/tridiag_massflux.F90 b/src/common/turb/tridiag_massflux.F90 index 50ed767706e80b09fa837f4e3f55f810eadf4163..401018cc0fed6cac3161e06224461d7c1ea8ea99 100644 --- a/src/common/turb/tridiag_massflux.F90 +++ b/src/common/turb/tridiag_massflux.F90 @@ -161,7 +161,7 @@ INTEGER :: JK ! loop counter ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',0,ZHOOK_HANDLE) -ZMZM_RHODJ = MZM_MF(KKA,KKU,KKL,PRHODJ) +ZMZM_RHODJ = MZM_MF(PRHODJ, KKA, KKU, KKL) ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ ! ZA=0. diff --git a/src/common/turb/tridiag_thermo.F90 b/src/common/turb/tridiag_thermo.F90 index edd18550f68e7fdfc1b5222efda54204ec20e601..7d20b2fa1e633d84dafcb24479c3c46a808d575a 100644 --- a/src/common/turb/tridiag_thermo.F90 +++ b/src/common/turb/tridiag_thermo.F90 @@ -118,7 +118,7 @@ ! USE MODD_PARAMETERS, ONLY : JPVEXT_TURB ! -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY : MZM ! IMPLICIT NONE !