diff --git a/MNH/advec_ppm_algo.f90 b/MNH/advec_ppm_algo.f90 index e64f8349e76c7135dcada2b9a229c3b94ad558a0..59d6e1a366ef91ea54c3055ab6e6f86d72b95d3f 100644 --- a/MNH/advec_ppm_algo.f90 +++ b/MNH/advec_ppm_algo.f90 @@ -134,19 +134,19 @@ CASE('PPM_00') !* 1. ADVECTION IN X DIRECTION ! ------------------------ ! - PSRC = PPM_S0_X(HLBCX, KGRID, PSRC, PCRU, PRHODJ, PTSTEP) + CALL PPM_S0_X(HLBCX, KGRID, PSRC, PCRU, PRHODJ, PTSTEP, PSRC ) PSRC = PSRC / PRHOX1 ! !* 2. ADVECTION IN Y DIRECTION ! ------------------------ ! - PSRC = PPM_S0_Y(HLBCY, KGRID, PSRC, PCRV, PRHOX1, PTSTEP) + CALL PPM_S0_Y(HLBCY, KGRID, PSRC, PCRV, PRHOX1, PTSTEP, PSRC) PSRC = PSRC / PRHOY1 ! !* 3. ADVECTION IN Z DIRECTION ! ------------------------ ! - PSRC = PPM_S0_Z(KGRID, PSRC, PCRW, PRHOY1, PTSTEP) + CALL PPM_S0_Z(KGRID, PSRC, PCRW, PRHOY1, PTSTEP, PSRC) PSRC = PSRC / PRHOZ1 ! ELSE @@ -155,19 +155,19 @@ CASE('PPM_00') !* 1. ADVECTION IN Z DIRECTION ! ------------------------ ! - PSRC = PPM_S0_Z(KGRID, PSRC, PCRW, PRHODJ, PTSTEP) + CALL PPM_S0_Z(KGRID, PSRC, PCRW, PRHODJ, PTSTEP, PSRC) PSRC = PSRC / PRHOZ2 ! !* 2. ADVECTION IN Y DIRECTION ! ------------------------ ! - PSRC = PPM_S0_Y(HLBCY, KGRID, PSRC, PCRV, PRHOZ2, PTSTEP) + CALL PPM_S0_Y(HLBCY, KGRID, PSRC, PCRV, PRHOZ2, PTSTEP, PSRC) PSRC = PSRC / PRHOY2 ! !* 3. ADVECTION IN X DIRECTION ! ------------------------ ! - PSRC = PPM_S0_X(HLBCX, KGRID, PSRC, PCRU, PRHOY2, PTSTEP) + CALL PPM_S0_X(HLBCX, KGRID, PSRC, PCRU, PRHOY2, PTSTEP, PSRC) PSRC = PSRC / PRHOX2 ! END IF diff --git a/MNH/mode_mnh_zwork.f90 b/MNH/mode_mnh_zwork.f90 index dbfa083c984661a42c41de6008d1dd43539c5fc1..3c16414a6313e9bced3d62f07e02256e85ec0af8 100644 --- a/MNH/mode_mnh_zwork.f90 +++ b/MNH/mode_mnh_zwork.f90 @@ -1,7 +1,8 @@ MODULE MODE_MNH_ZWORK -INTEGER, SAVE :: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER, SAVE :: IIE,IJE ! End useful area in x,y,z directions +INTEGER, SAVE :: IIB,IJB,IKB ! Begining useful area in x,y,z directions +INTEGER, SAVE :: IIE,IJE,IKE ! End useful area in x,y,z directions + ! INTEGER,SAVE :: IJS,IJN, IIW,IIA ! @@ -46,6 +47,8 @@ SUBROUTINE MNH_ALLOC_ZWORK(IMODEL) IJN=IJE IIW=IIB IIA=IIE + IKB = 1 + JPVEXT + IKE = NKMAX + JPVEXT CALL GET_DIM_EXT_ll('B',IIU,IJU) IKU=NKMAX + 2* JPVEXT diff --git a/MNH/ppm.f90 b/MNH/ppm.f90 index 6a722c428b5e5d899a961b86b11cda0e0f30f1ee..a2fd85ae748010e0eb46960d9f5c29917204028b 100644 --- a/MNH/ppm.f90 +++ b/MNH/ppm.f90 @@ -66,8 +66,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! END SUBROUTINE PPM_01_Z ! -FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) +SUBROUTINE PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) + CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type ! INTEGER, INTENT(IN) :: KGRID ! C grid localisation @@ -81,10 +84,12 @@ REAL, INTENT(IN) :: PTSTEP ! Time step ! output source term REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! -END FUNCTION PPM_S0_X +END SUBROUTINE PPM_S0_X ! -FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) +SUBROUTINE PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) ! CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type ! @@ -99,10 +104,12 @@ REAL, INTENT(IN) :: PTSTEP ! Time step ! output source term REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! -END FUNCTION PPM_S0_Y +END SUBROUTINE PPM_S0_Y ! -FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) +SUBROUTINE PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) ! INTEGER, INTENT(IN) :: KGRID ! C grid localisation ! @@ -115,7 +122,7 @@ REAL, INTENT(IN) :: PTSTEP ! Time step ! output source term REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! -END FUNCTION PPM_S0_Z +END SUBROUTINE PPM_S0_Z ! FUNCTION PPM_S1_X(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & PTSTEP) RESULT(PR) @@ -1477,8 +1484,11 @@ END SUBROUTINE PPM_01_Z !------------------------------------------------------------------------------- ! ! ######################################################################## - FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$ FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) + SUBROUTINE PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) + ! ######################################################################## !! !!**** PPM_S0_X - PPM advection scheme in X direction in Skamarock 2006 @@ -1505,7 +1515,7 @@ USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MPPDB ! USE MODE_MNH_ZWORK, ONLY : & -& IIB,IIE, IJB,IJE, IIU,IJU,IKU , IJS,IJN, & +& IIB,IIE, IIU,IJU,IKU , IJS,IJN, & & GWEST,GEAST, & & ZPHAT=>ZW3D1,ZPHAT=>ZW3D2,ZFPOS=>ZW3D3,ZFNEG=>ZW3D4, & & ZRHO_MXM=>ZW3D5,ZCR_MXM=>ZW3D6,ZCR_DXF=>ZW3D7, & @@ -1785,14 +1795,16 @@ CALL MPPDB_CHECK3DM("PPM::PPM_S0_X OPEN ::PR",PRECISION,PR) !------------------------------------------------------------------------------- CALL DEL_HALO2_ll(TZ_PSRC_HALO2_ll) ! -END FUNCTION PPM_S0_X +END SUBROUTINE PPM_S0_X ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! ! ######################################################################## - FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$ FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) + SUBROUTINE PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) ! ######################################################################## !! !!**** PPM_S0_Y - PPM advection scheme in Y direction in Skamarock 2006 @@ -1817,7 +1829,7 @@ USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MPPDB ! USE MODE_MNH_ZWORK, ONLY : & -& IIB,IIE, IJB,IJE, IIU,IJU,IKU , IIW,IIA, & +& IJB,IJE, IIU,IJU,IKU , IIW,IIA, & & GSOUTH , GNORTH, & & ZPHAT=>ZW3D1,ZFPOS=>ZW3D2,ZFNEG=>ZW3D3,ZRHO_MYM=>ZW3D4, & & ZCR_MYM=>ZW3D5,ZCR_DYF=>ZW3D6, & @@ -2082,15 +2094,17 @@ ENDIF ! CALL DEL_HALO2_ll(TZ_PSRC_HALO2_ll) ! -END FUNCTION PPM_S0_Y +END SUBROUTINE PPM_S0_Y ! ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! ! ######################################################################## - FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & - RESULT(PR) +!!$ FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & +!!$ RESULT(PR) + SUBROUTINE PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP & + , PR) ! ######################################################################## !! !!**** PPM_S0_Z - PPM advection scheme in Z direction in Skamarock 2006 @@ -2111,6 +2125,11 @@ USE MODD_CONF USE MODD_PARAMETERS USE MODE_MPPDB ! +USE MODE_MNH_ZWORK, ONLY : & +& IKB,IKE, IKU, & +& ZPHAT=>ZW3D1,ZPHAT=>ZW3D2,ZFPOS=>ZW3D3,ZFNEG=>ZW3D4, & +& ZRHO_MZM=>ZW3D5,ZCR_MZM=>ZW3D6,ZCR_DZF=>ZW3D7 +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -2124,30 +2143,30 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density REAL, INTENT(IN) :: PTSTEP ! Time step ! ! output source term -REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR & +REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! !* 0.2 Declarations of local variables : ! ! advection fluxes - , ZFPOS, ZFNEG & +!!$ , ZFPOS, ZFNEG & ! ! interpolated variable at cell edges - , ZPHAT & - , ZRHO_MZM ,ZCR_MZM,ZCR_DZF +!!$ , ZPHAT & +!!$ , ZRHO_MZM ,ZCR_MZM,ZCR_DZF ! -INTEGER:: IKB ! Begining useful area in x,y,z directions -INTEGER:: IKE ! End useful area in x,y,z directions -INTEGER:: IKU +!!$INTEGER:: IKB ! Begining useful area in x,y,z directions +!!$INTEGER:: IKE ! End useful area in x,y,z directions +!!$INTEGER:: IKU ! !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ ! -IKB = 1 + JPVEXT -IKE = SIZE(PSRC,3) - JPVEXT -! -IKU=size(psrc,3) +!!$IKB = 1 + JPVEXT +!!$IKE = SIZE(PSRC,3) - JPVEXT +!!$! +!!$IKU=size(psrc,3) ! !------------------------------------------------------------------------------- ! @@ -2157,8 +2176,8 @@ CALL GET_HALO(PSRC) ! #define JUAN_ACC_S0_Z #ifdef JUAN_ACC_S0_Z -!$acc data region local(ZPHAT,ZFPOS,ZFNEG,ZRHO_MZM,ZCR_MZM,ZCR_DZF) copyin (psrc,pcr,prho) copyout(pr) -!$acc region +!$acc data copyin (psrc,pcr,prho) copyout(pr) +!$acc kernels #endif ! ZPHAT(:,:,IKB+1:IKE) = (7.0 * & @@ -2221,14 +2240,14 @@ ZFNEG(:,:,IKE+1) = (ZPHAT(:,:,IKE+1) - PSRC(:,:,IKE+1))*PCR(:,:,IKE+1) + & PR(:,:,IKE+1) = PR(:,:,IKE) ! #ifdef JUAN_ACC_S0_Z -!$acc end region -!$acc end data region +!$acc end kernels +!$acc end data #endif ! CALL GET_HALO(PR) ! JUAN CALL MPPDB_CHECK3DM("PPM::PPM_S0_Z ::PR",PRECISION,PR) ! -END FUNCTION PPM_S0_Z + END SUBROUTINE PPM_S0_Z ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- diff --git a/MNH/ppm_met.f90 b/MNH/ppm_met.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a80d156d4d43758307df3dda1e36b61443277a77 --- /dev/null +++ b/MNH/ppm_met.f90 @@ -0,0 +1,209 @@ +! +! ##################### + MODULE MODI_PPM_MET +! ##################### +! +INTERFACE +! + SUBROUTINE PPM_MET (HLBCX,HLBCY, KRR, KTCOUNT, & + PCRU, PCRV, PCRW, PTSTEP, PRHODJ, & + PTHT, PTKET, PRT, & + PRTHS, PRTKES, PRRS, HMET_ADV_SCHEME ) +! +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +CHARACTER (LEN=6), INTENT(IN) :: HMET_ADV_SCHEME +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KTCOUNT! iteration count +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRU ! Courant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRV ! numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRW ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density +! +REAL, INTENT(IN) :: PTSTEP ! Single Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET ! Vars at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES! Source terms +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +! +END SUBROUTINE PPM_MET +! +END INTERFACE +! +END MODULE MODI_PPM_MET +! +! ###################################################################### + SUBROUTINE PPM_MET (HLBCX,HLBCY, KRR, KTCOUNT, & + PCRU, PCRV, PCRW, PTSTEP, PRHODJ, & + PTHT, PTKET, PRT, & + PRTHS, PRTKES, PRRS, HMET_ADV_SCHEME ) +! ###################################################################### +! +!!**** *PPM_MET * +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODULE MODD_ARGSLIST +!! HALO2LIST_ll : type for a list of "HALO2_lls" +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! MODIFICATIONS +!! ------------- +!! Original 11.05.2006. T.Maric +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!USE MODE_ll +! +USE MODD_PARAMETERS +USE MODD_CONF +USE MODD_BUDGET +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +USE MODI_SHUMAN +USE MODI_BUDGET +USE MODI_PPM +USE MODI_ADVEC_PPM_ALGO +! +! incorporate ADVEC_4TH_ORDER_ALG, MZF4 and MZM4 +!USE MODI_ADVEC_4TH_ORDER_AUX +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy 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 +CHARACTER (LEN=6), INTENT(IN) :: HMET_ADV_SCHEME +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KTCOUNT! iteration count +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRU ! contravariant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRV ! components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRW ! of momentum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density +! +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET ! Vars at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES! Source terms +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JRR ! Loop index for moist variables +! +LOGICAL :: GTKEALLOC ! true if TKE arrays are not zero-sized +! +INTEGER :: IGRID ! localisation on the model grid +! +!* Variables specific to ppm scheme +! +! Advection source term calulated in the PPM algorithm +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZSRC +! +! Temporary advected rhodj +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOX1,ZRHOX2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOY1,ZRHOY2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOZ1,ZRHOZ2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZUNIT +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTES THE DOMAIN DIMENSIONS +! ------------------------------ +! +GTKEALLOC = SIZE(PTKET,1) /= 0 +! +!------------------------------------------------------------------------------- +! +!* 2. CALL THE ADVEC_PPM_ALGO ROUTINE FOR EACH FIELD +! ----------------------------------------------- +! +IGRID = 1 +! +! Calculate the advection of the density RHODJ to pass to the algorithm +! +ZUNIT = 1.0 +CALL PPM_S0_X(HLBCX, IGRID, ZUNIT, PCRU, PRHODJ, PTSTEP, ZRHOX1) +CALL PPM_S0_Y(HLBCY, IGRID, ZUNIT, PCRV, ZRHOX1, PTSTEP, ZRHOY1) +CALL PPM_S0_Z(IGRID, ZUNIT, PCRW, ZRHOY1, PTSTEP, ZRHOZ1) +CALL PPM_S0_Z(IGRID, ZUNIT, PCRW, PRHODJ, PTSTEP, ZRHOZ2) +CALL PPM_S0_Y(HLBCY, IGRID, ZUNIT, PCRV, ZRHOZ2, PTSTEP, ZRHOY2) +CALL PPM_S0_X(HLBCX, IGRID, ZUNIT, PCRU, ZRHOY2, PTSTEP, ZRHOX2) +! +! +! Potential temperature +! +CALL ADVEC_PPM_ALGO(HMET_ADV_SCHEME, HLBCX, HLBCY, IGRID, PTHT, PRHODJ, PTSTEP, & + ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & + ZSRC, KTCOUNT, PCRU, PCRV, PCRW) +! add the advection to the sources +PRTHS = PRTHS + ZSRC +! +IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADV_BU_RTH') +! +! Turbulence variables +! +IF (GTKEALLOC) THEN + CALL ADVEC_PPM_ALGO(HMET_ADV_SCHEME, HLBCX, HLBCY, IGRID, PTKET,PRHODJ,PTSTEP, & + ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & + ZSRC, KTCOUNT, PCRU, PCRV, PCRW) + PRTKES = PRTKES + ZSRC +! + IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADV_BU_RTKE') +! +END IF +! +! +! +! Case with KRR moist variables +! +DO JRR=1,KRR +! + CALL ADVEC_PPM_ALGO(HMET_ADV_SCHEME, HLBCX, HLBCY, IGRID, PRT(:,:,:,JRR), & + PRHODJ, PTSTEP, & + ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & + ZSRC, KTCOUNT, PCRU, PCRV, PCRW) + PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZSRC(:,:,:) +! + IF (JRR==1.AND.LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6,'ADV_BU_RRV') + IF (JRR==2.AND.LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'ADV_BU_RRC') + IF (JRR==3.AND.LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8,'ADV_BU_RRR') + IF (JRR==4.AND.LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9,'ADV_BU_RRI') + IF (JRR==5.AND.LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADV_BU_RRS') + IF (JRR==6.AND.LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADV_BU_RRG') + IF (JRR==7.AND.LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADV_BU_RRH') +! +END DO +! +! +END SUBROUTINE PPM_MET diff --git a/MNH/ppm_scalar.f90 b/MNH/ppm_scalar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d9038795b484aa58d2e2972aa1a4b5992326bd0b --- /dev/null +++ b/MNH/ppm_scalar.f90 @@ -0,0 +1,164 @@ +! +! +! ##################### + MODULE MODI_PPM_SCALAR +! ##################### +! +INTERFACE +! + SUBROUTINE PPM_SCALAR (HLBCX,HLBCY, KSV, KTCOUNT, & + PCRU, PCRV, PCRW, PTSTEP, PRHODJ, & + PSVT, PRSVS, HSV_ADV_SCHEME ) +! +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +CHARACTER (LEN=6), INTENT(IN) :: HSV_ADV_SCHEME +! +INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables +INTEGER, INTENT(IN) :: KTCOUNT! iteration count +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRU ! Courant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRV ! numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRW ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density +! +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Vars at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Source terms +! +! +END SUBROUTINE PPM_SCALAR +! +END INTERFACE +! +END MODULE MODI_PPM_SCALAR +! +! ###################################################################### + SUBROUTINE PPM_SCALAR (HLBCX,HLBCY, KSV, KTCOUNT, & + PCRU, PCRV, PCRW, PTSTEP, PRHODJ, & + PSVT, PRSVS, HSV_ADV_SCHEME ) +! ###################################################################### +! +!!**** *PPM_SCALAR * +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODULE MODD_ARGSLIST +!! HALO2LIST_ll : type for a list of "HALO2_lls" +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! MODIFICATIONS +!! ------------- +!! Original 11.05.2006. T.Maric +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!USE MODE_ll +! +USE MODD_PARAMETERS +USE MODD_CONF +USE MODD_BUDGET +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +USE MODI_SHUMAN +USE MODI_BUDGET +USE MODI_PPM +USE MODI_ADVEC_PPM_ALGO +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy 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 +CHARACTER (LEN=6), INTENT(IN) :: HSV_ADV_SCHEME +! +INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables +INTEGER, INTENT(IN) :: KTCOUNT! iteration count +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRU ! contravariant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRV ! components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRW ! of momentum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density +! +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Source terms +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JSV ! Loop index for Scalar Variables +! +INTEGER :: IGRID ! localisation on the model grid +! +!* Variables specific to ppm scheme +! +! Advection source term calulated in the PPM algorithm +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZSRC +! +! Temporary advected rhodj +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOX1,ZRHOX2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOY1,ZRHOY2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZRHOZ1,ZRHOZ2 +REAL, DIMENSION(SIZE(PCRU,1),SIZE(PCRU,2),SIZE(PCRU,3)) :: ZUNIT +! +!------------------------------------------------------------------------------- +! +!* 1. CALL THE ADVEC_PPM_ALGO ROUTINE FOR EACH FIELD +! ----------------------------------------------- +! +IGRID = 1 +! +! Calculate the advection of the density RHODJ to pass to the algorithm +! +ZUNIT = 1.0 +CALL PPM_S0_X(HLBCX, IGRID, ZUNIT, PCRU, PRHODJ, PTSTEP, ZRHOX1) +CALL PPM_S0_Y(HLBCY, IGRID, ZUNIT, PCRV, ZRHOX1, PTSTEP, ZRHOY1) +CALL PPM_S0_Z(IGRID, ZUNIT, PCRW, ZRHOY1, PTSTEP, ZRHOZ1) +CALL PPM_S0_Z(IGRID, ZUNIT, PCRW, PRHODJ, PTSTEP, ZRHOZ2) +CALL PPM_S0_Y(HLBCY, IGRID, ZUNIT, PCRV, ZRHOZ2, PTSTEP, ZRHOY2) +CALL PPM_S0_X(HLBCX, IGRID, ZUNIT, PCRU, ZRHOY2, PTSTEP, ZRHOX2) +! +! Case with KSV tracers +! +DO JSV=1,KSV +! + CALL ADVEC_PPM_ALGO(HSV_ADV_SCHEME, HLBCX, HLBCY, IGRID, PSVT(:,:,:,JSV), & + PRHODJ, PTSTEP, & + ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & + ZSRC, KTCOUNT, PCRU, PCRV, PCRW) +! add the advection to the sources + PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZSRC(:,:,:) +! + IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADV_BU_RSV') +! +END DO +! +! +END SUBROUTINE PPM_SCALAR