From 2c92a861eb65792d5a9b9f8e658877fee9349f73 Mon Sep 17 00:00:00 2001 From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr> Date: Tue, 15 May 2018 14:22:18 +0200 Subject: [PATCH] J.Colin 15/5/2018 : omputation of laplacian for viscosity --- src/MNH/lap_m.f90 | 227 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 src/MNH/lap_m.f90 diff --git a/src/MNH/lap_m.f90 b/src/MNH/lap_m.f90 new file mode 100644 index 000000000..a16fd8061 --- /dev/null +++ b/src/MNH/lap_m.f90 @@ -0,0 +1,227 @@ +!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################# + MODULE MODI_LAP_M +! ################# +! +INTERFACE +! + FUNCTION LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PY) & + RESULT(PLAP_M) +! +IMPLICIT NONE +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type +! +! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density_reference * J +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! field components +! +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PLAP_M ! final divergence +! +END FUNCTION LAP_M +! +END INTERFACE +! +END MODULE MODI_LAP_M +! +! +! +! ######################################################################### + FUNCTION LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PY) & + RESULT(PLAP_M) +! ######################################################################### +! +!!**** *LAP_M * - compute the Laplacian of a field PY +!! +!! PURPOSE +!! ------- +! This function computes laplacian of a scalar field PY +! localized at mass points, with bottom topography. +! The result is localized at a mass point and defined by: +! ( ( GX_M_U (PY) ) ) +! PLAP_M = GDIV ( rho * J ( GX_M_V (PY) ) ) +! ( ( GX_M_W (PY) ) ) +! +! Where GX_M_.. are the cartesian components of the gradient of PY and +! GDIV is the operator acting on a vector AA: +! +! GDIV ( AA ) = J * divergence (1/J AA ) +! +!!** METHOD +!! ------ +!! First, we compute the gradients along x, y , z of the P field. The +!! result is multiplied by rhod. +!! Then, the pseudo-divergence ( J * DIV (1/J o ) ) is computed by the +!! subroutine GDIV. The result is localized at a mass point. +!! +!! EXTERNAL +!! -------- +!! Function GX_M_U : compute the gradient along x +!! Function GY_M_V : compute the gradient along y +!! Function GZ_M_W : compute the gradient along z +!! FUNCTION MXM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MYM: compute an average in the y direction for a variable +!! at a mass localization +!! FUNCTION MZM: compute an average in the z direction for a variable +!! at a mass localization +!! Subroutine GDIV : compute J times the divergence of 1/J times a vector +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: JPHEXT, JPVEXT +!! Module MODD_CONF: L2D +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/02/07 simplified from QLAP function, T.Maric +!! Modification +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODE_ll +! +USE MODD_PARAMETERS +USE MODD_CONF +!USE MODD_CST +USE MODI_GDIV +!USE MODI_GDIV_M +USE MODI_GRADIENT_M +USE MODI_SHUMAN +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! field components +! +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PLAP_M ! final divergence +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZU ! rho*J*gradient along x +! +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZV ! rho*J*gradient along y +! +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZW ! rho*J*gradient along z +! +INTEGER :: IIU,IJU,IKU ! I,J,K array sizes +INTEGER :: JK,JJ,JI ! vertical loop index +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE GRADIENT COMPONENTS +! ------------------------------- +! +! +CALL GET_DIM_EXT_ll('B',IIU,IJU) +IKU=SIZE(PY,3) +! +ZU = GX_M_U(1,IKU,1,PY,PDXX,PDZZ,PDZX) +! +IF ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) THEN + DO JK=2,IKU-1 + DO JJ=1,IJU + ZU(2,JJ,JK)= (PY(2,JJ,JK) - PY(1,JJ,JK) - 0.5 * ( & + PDZX(2,JJ,JK) * (PY(2,JJ,JK)-PY(2,JJ,JK-1)) / PDZZ(2,JJ,JK) & + +PDZX(2,JJ,JK+1) * (PY(2,JJ,JK+1)-PY(2,JJ,JK)) / PDZZ(2,JJ,JK+1) & + ) ) / PDXX(2,JJ,JK) + END DO + END DO +END IF +! +IF ( HLBCX(1) /= 'CYCL' .AND. LEAST_ll() ) THEN + DO JK=2,IKU-1 + DO JJ=1,IJU + ZU(IIU,JJ,JK)= (PY(IIU,JJ,JK) - PY(IIU-1,JJ,JK) - 0.5 * ( & + PDZX(IIU,JJ,JK) * (PY(IIU-1,JJ,JK)-PY(IIU-1,JJ,JK-1)) / PDZZ(IIU-1,JJ,JK) & + +PDZX(IIU,JJ,JK+1) * (PY(IIU-1,JJ,JK+1)-PY(IIU-1,JJ,JK)) / PDZZ(IIU-1,JJ,JK+1)& + ) ) / PDXX(IIU,JJ,JK) + END DO + END DO +END IF +! +IF(.NOT. L2D) THEN +! + ZV = GY_M_V(1,IKU,1,PY,PDYY,PDZZ,PDZY) +! + IF ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) THEN + DO JK=2,IKU-1 + DO JI=1,IIU + ZV(JI,2,JK)= (PY(JI,2,JK) - PY(JI,1,JK) - 0.5 * ( & + PDZY(JI,2,JK) * (PY(JI,2,JK)-PY(JI,2,JK-1)) / PDZZ(JI,2,JK) & + +PDZY(JI,2,JK+1) * (PY(JI,2,JK+1)-PY(JI,2,JK)) / PDZZ(JI,2,JK+1) & + ) ) / PDYY(JI,2,JK) + END DO + END DO + END IF + IF ( HLBCY(1) /= 'CYCL' .AND. LNORTH_ll() ) THEN +! + DO JK=2,IKU-1 + DO JI=1,IIU + ZV(JI,IJU,JK)= (PY(JI,IJU,JK) - PY(JI,IJU-1,JK) - 0.5 * ( & + PDZY(JI,IJU,JK) * (PY(JI,IJU-1,JK)-PY(JI,IJU-1,JK-1)) / PDZZ(JI,IJU-1,JK) & + +PDZY(JI,IJU,JK+1) * (PY(JI,IJU-1,JK+1)-PY(JI,IJU-1,JK)) / PDZZ(JI,IJU-1,JK+1)& + ) ) / PDYY(JI,IJU,JK) + END DO + END DO + END IF +! +ELSE + ZV=0. +ENDIF +! +ZU = MXM(PRHODJ) * ZU +! +IF(.NOT. L2D) THEN + ZV = MYM(PRHODJ) * ZV +ENDIF +! +ZW = MZM(1,IKU,1,PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE DIVERGENCE +! ---------------------- +! +CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,ZU,ZV,ZW,PLAP_M) +! +PLAP_M(:,:,1) = 0. +! +!------------------------------------------------------------------------------- +! +END FUNCTION LAP_M -- GitLab