From 2749a15e65a6ffd531d358bad7afd5d739a513f5 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 18 Mar 2020 09:58:37 +0100 Subject: [PATCH] Philippe 18/03/2020: remove unused source files --- src/MNH/advecmet.f90 | 240 -------- src/MNH/advecmet_4th.f90 | 315 ----------- src/MNH/advecscalar.f90 | 168 ------ src/MNH/advecscalar_4th.f90 | 204 ------- src/MNH/advecuvw.f90 | 177 ------ src/MNH/c3r5_adjust.f90 | 166 ------ src/MNH/ch_aqueous_sedimc2r2.f90JPP | 310 ---------- src/MNH/ch_read_meteo.f90 | 83 --- src/MNH/dflux_corr.f90 | 307 ---------- src/MNH/dry_mass.f90 | 162 ------ src/MNH/dummy_gr_index.f90 | 86 --- src/MNH/elec_trid.f90 | 679 ---------------------- src/MNH/fct_met.f90 | 363 ------------ src/MNH/fct_scalar.f90 | 166 ------ src/MNH/ice4_sedimentation_split_old.f90 | 463 --------------- src/MNH/ice_c1r3.f90 | 190 ------- src/MNH/ini_elec.f90 | 102 ---- src/MNH/init_for_convlfi.f90 | 277 --------- src/MNH/les_masksn.f90 | 188 ------- src/MNH/lochead.f90 | 184 ------ src/MNH/mean_prof.f90 | 196 ------- src/MNH/modd_type_allvar.f90 | 73 --- src/MNH/mpdata.f90 | 405 ------------- src/MNH/mpdata_scalar.f90 | 250 --------- src/MNH/prep_ideal_case.f90 | 1 - src/MNH/pressure.f90 | 687 ----------------------- src/MNH/resolved_cloud.f90 | 2 - src/MNH/select_std_pgd.f90 | 306 ---------- src/MNH/trid.f90 | 645 --------------------- src/MNH/ver_dyn.f90 | 1 - src/MNH/wguess.f90 | 169 ------ src/MNH/zs_boundaryn.f90 | 204 ------- 32 files changed, 7769 deletions(-) delete mode 100644 src/MNH/advecmet.f90 delete mode 100644 src/MNH/advecmet_4th.f90 delete mode 100644 src/MNH/advecscalar.f90 delete mode 100644 src/MNH/advecscalar_4th.f90 delete mode 100644 src/MNH/advecuvw.f90 delete mode 100644 src/MNH/c3r5_adjust.f90 delete mode 100644 src/MNH/ch_aqueous_sedimc2r2.f90JPP delete mode 100644 src/MNH/ch_read_meteo.f90 delete mode 100644 src/MNH/dflux_corr.f90 delete mode 100644 src/MNH/dry_mass.f90 delete mode 100644 src/MNH/dummy_gr_index.f90 delete mode 100644 src/MNH/elec_trid.f90 delete mode 100644 src/MNH/fct_met.f90 delete mode 100644 src/MNH/fct_scalar.f90 delete mode 100644 src/MNH/ice4_sedimentation_split_old.f90 delete mode 100644 src/MNH/ice_c1r3.f90 delete mode 100644 src/MNH/ini_elec.f90 delete mode 100644 src/MNH/init_for_convlfi.f90 delete mode 100644 src/MNH/les_masksn.f90 delete mode 100644 src/MNH/lochead.f90 delete mode 100644 src/MNH/mean_prof.f90 delete mode 100644 src/MNH/modd_type_allvar.f90 delete mode 100644 src/MNH/mpdata.f90 delete mode 100644 src/MNH/mpdata_scalar.f90 delete mode 100644 src/MNH/pressure.f90 delete mode 100644 src/MNH/select_std_pgd.f90 delete mode 100644 src/MNH/trid.f90 delete mode 100644 src/MNH/wguess.f90 delete mode 100644 src/MNH/zs_boundaryn.f90 diff --git a/src/MNH/advecmet.f90 b/src/MNH/advecmet.f90 deleted file mode 100644 index f16414b42..000000000 --- a/src/MNH/advecmet.f90 +++ /dev/null @@ -1,240 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_ADVECMET -! ####################### -INTERFACE - SUBROUTINE ADVECMET ( KRR, PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -END SUBROUTINE ADVECMET -! -END INTERFACE -! -END MODULE MODI_ADVECMET -! -! -! -! ###################################################################### - SUBROUTINE ADVECMET ( KRR, PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -! ###################################################################### -! -!!**** *ADVECMET * - routine to compute the advection tendancies of the -!! meterological scalar fields. -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the total advection -!! tendancies of the meteorological scalar fields, written in flux form. -!! The advection velocity is taken as the contravariant form of -!! the momentum for extension to non-cartesian geometry and -!! conformal projection cases. -!! -!! -!!** METHOD -!! ------ -!! The left and right lateral EXTernal zones, have been previously -!! prepared in routine LBC_S, to avoid particular cases close to the -!! Lateral Boundaries in this routine. -!! The Shuman functions are used to write the mean and finite -!! differences operators. -!! The different sources terms are stored for the budget -!! computations. -!! -!! EXTERNAL -!! -------- -!! MXM,MYM,MZM : Shuman functions (mean operators) -!! DXM,DYM,DZM : Shuman functions (finite differences operators) -!! BUDGET : Stores the different budget components -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! LBU_RTH : logical for budget of RTH (potential temperature) -!! .TRUE. = budget of RTH -!! .FALSE. = no budget of RTH -!! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) -!! .TRUE. = budget of RTKE -!! .FALSE. = no budget of RTKE -!! LBU_RRV : logical for budget of RRV (water vapor) -!! .TRUE. = budget of RRV -!! .FALSE. = no budget of RRV -!! LBU_RRC : logical for budget of RRC (cloud water) -!! .TRUE. = budget of RRC -!! .FALSE. = no budget of RRC -!! LBU_RRR : logical for budget of RRR (rain water) -!! .TRUE. = budget of RRR -!! .FALSE. = no budget of RRR -!! LBU_RRI : logical for budget of RRI (ice) -!! .TRUE. = budget of RRI -!! .FALSE. = no budget of RRI -!! LBU_RRS : logical for budget of RRS (snow) -!! .TRUE. = budget of RRS -!! .FALSE. = no budget of RRS -!! LBU_RRG : logical for budget of RRG (graupel) -!! .TRUE. = budget of RRG -!! .FALSE. = no budget of RRG -!! LBU_RRH : logical for budget of RRH (hail) -!! .TRUE. = budget of RRH -!! .FALSE. = no budget of RRH -!! -!! REFERENCE -!! --------- -!! -!! Book2 of documentation ( routine ADVECMET ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/07/94 -!! Corrections 06/09/94 (J.-P. Lafore) -!! 16/03/95 (J. Stein) remove R from the historical var. -!! 01/04/95 (Ph. Hereil J. Nicolau) add the budget computation -!! 16/10/95 (J. Stein) change the budget calls -!! 19/12/96 (J.-P. Pinty) update the budget calls -!! 07/11/02 (V. Masson) update the budget calls -!! 24/04/06 (C.Lac) Split meteorological scalar and passive -!! tracer routines -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET -USE MODD_GRID_n -! -USE MODI_SHUMAN -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JRR ! Loop index for moist variables -! -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE ADVECTIVE TENDENCIES -! --------------------------------- -! - ! Thermodynamical variable -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DXF( PRUCT(:,:,:) * MXM (PTHT(:,:,:)) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVX_BU_RTH') -! -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DYF( PRVCT(:,:,:) * MYM (PTHT(:,:,:)) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVY_BU_RTH') -! -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DZF( PRWCT(:,:,:) * MZM (PTHT(:,:,:)) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVZ_BU_RTH') -! - ! Case with KRR moist variables -DO JRR=1,KRR - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DXF( PRUCT(:,:,:) * MXM (PRT(:,:,:,JRR)) ) -END DO -! -IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVX_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVX_BU_RRC') -IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVX_BU_RRR') -IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVX_BU_RRI') -IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVX_BU_RRS') -IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVX_BU_RRG') -IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVX_BU_RRH') -! -DO JRR=1,KRR - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DYF( PRVCT(:,:,:) * MYM (PRT(:,:,:,JRR)) ) -END DO -! -IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVY_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVY_BU_RRC') -IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVY_BU_RRR') -IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVY_BU_RRI') -IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVY_BU_RRS') -IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVY_BU_RRG') -IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVY_BU_RRH') -! -DO JRR=1,KRR - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DZF( PRWCT(:,:,:) * MZM (PRT(:,:,:,JRR)) ) -END DO -! -IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') -IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVZ_BU_RRR') -IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVZ_BU_RRI') -IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVZ_BU_RRS') -IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVZ_BU_RRG') -IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVZ_BU_RRH') -! - ! TKE variable -IF (SIZE(PTKET,1) /= 0) THEN - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DXF( PRUCT(:,:,:) * MXM (PTKET(:,:,:)) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVX_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DYF( PRVCT(:,:,:) * MYM (PTKET(:,:,:)) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVY_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DZF( PRWCT(:,:,:) * MZM (PTKET(:,:,:)) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVZ_BU_RTKE') -END IF -! -! -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECMET diff --git a/src/MNH/advecmet_4th.f90 b/src/MNH/advecmet_4th.f90 deleted file mode 100644 index a0bd62e15..000000000 --- a/src/MNH/advecmet_4th.f90 +++ /dev/null @@ -1,315 +0,0 @@ -!MNH_LIC Copyright 2005-2020 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_ADVECMET_4TH -! ############################### -! -INTERFACE -! - SUBROUTINE ADVECMET_4TH (HLBCX,HLBCY, KRR, & - PRUCT, PRVCT, PRWCT, & - PTHT, PTKET, PRT, & - PRTHS, PRTKES, PRRS, TPHALO2LIST ) -! -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 -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -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 -! -TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion -! -END SUBROUTINE ADVECMET_4TH -! -END INTERFACE -! -END MODULE MODI_ADVECMET_4TH -! -! ###################################################################### - SUBROUTINE ADVECMET_4TH (HLBCX,HLBCY, KRR, & - PRUCT, PRVCT, PRWCT, & - PTHT, PTKET, PRT, & - PRTHS, PRTKES, PRRS, TPHALO2LIST ) -! ###################################################################### -! -!!**** *ADVEC_4TH_ORDER * - routine to compute the 4th order centered -!! advection tendency of scalar variables -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to call the ADVEC_4TH_ORDER_ALGO -!! routine for the horizontal advection and the MZM4 and MZF4 functions for -!! the vertical advection of each prognostic variable. The code is -!! parallelized and works for various boundary conditions. -!! -!!** METHOD -!! ------ -!! For each prognostic variable the ADVEC_4TH_ORDER routine calls -!! the ADVEC_4TH_ORDER_ALGO routine which computes the numerical advection -!! of any 3D field. -!! The following variables are passed as argument to ADVEC_4TH_ORDER_ALGO : -!! -!! -- The variable at t -!! -- The second layer of the halo of the field at t -!! -- The horizontal advection fluxes -!! -- The localisation on the model grid : -!! -!! IGRID = 1 for mass grid point -!! IGRID = 2 for U grid point -!! IGRID = 3 for V grid point -!! IGRID = 4 for w grid point -!! -!! EXTERNAL -!! -------- -!! BUDGET : Stores the different budget components -!! (not used in current version) -!! ADVEC_4TH_ORDER_ALGO : computes the horizontal advection fluxes -!! MZF4 and MZM4 : computes the vertical advection fluxes -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODULE MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! Switches for budgets activations: -!! -!! LBU_RU : logical for budget of RU (wind component along x) -!! -!! LBU_RU : logical for budget of RU (wind component along x) -!! .TRUE. = budget of RU -!! .FALSE. = no budget of RU -!! LBU_RV : logical for budget of RV (wind component along y) -!! .TRUE. = budget of RV -!! .FALSE. = no budget of RV -!! LBU_RW : logical for budget of RW (wind component along z) -!! .TRUE. = budget of RW -!! .FALSE. = no budget of RW -!! LBU_RTH : logical for budget of RTH (potential temperature) -!! .TRUE. = budget of RTH -!! .FALSE. = no budget of RTH -!! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) -!! .TRUE. = budget of RTKE -!! .FALSE. = no budget of RTKE -!! LBU_RRV : logical for budget of RRV (water vapor) -!! .TRUE. = budget of RRV -!! .FALSE. = no budget of RRV -!! LBU_RRC : logical for budget of RRC (cloud water) -!! .TRUE. = budget of RRC -!! .FALSE. = no budget of RRC -!! LBU_RRR : logical for budget of RRR (rain water) -!! .TRUE. = budget of RRR -!! .FALSE. = no budget of RRR -!! LBU_RRI : logical for budget of RRI (ice) -!! .TRUE. = budget of RRI -!! .FALSE. = no budget of RRI -!! LBU_RRS : logical for budget of RRS (snow) -!! .TRUE. = budget of RRS -!! .FALSE. = no budget of RRS -!! LBU_RRG : logical for budget of RRG (graupel) -!! .TRUE. = budget of RRG -!! .FALSE. = no budget of RRG -!! LBU_RRH : logical for budget of RRH (hail) -!! .TRUE. = budget of RRH -!! .FALSE. = no budget of RRH -!! -!! MODULE MODD_ARGSLIST -!! HALO2LIST_ll : type for a list of "HALO2_lls" -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine ADVEC_4TH_ORDER ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/10/05 -!! -!! Correction : -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_ll -! -USE MODD_PARAMETERS -USE MODD_CONF -USE MODD_GRID_n -USE MODD_BUDGET -USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -! -USE MODI_SHUMAN -USE MODI_BUDGET -! -! 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 -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -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 -! -TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion -! -!* 0.2 Declarations of local variables : -! -! -INTEGER :: JRR ! Loop index for moist variables -INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER:: IIE,IJE ! End useful area in x,y,z directions -! -LOGICAL :: GTKEALLOC ! true if TKE arrays are not zero-sized -! -TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST -! -INTEGER :: IGRID ! localisation on the model grid -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZMEANX, ZMEANY ! fluxes -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE DOMAIN DIMENSIONS -! ------------------------------ -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -! -GTKEALLOC = SIZE(PTKET,1) /= 0 -! -!------------------------------------------------------------------------------- -! -!* 2. CALL THE ADVEC_4TH_ORDER_ALGO ROUTINE FOR EACH FIELD -! ---------------------------------------------------- -! -IGRID = 1 -! -!!$IF (NHALO == 1) THEN - TZHALO2LIST => TPHALO2LIST - CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PTHT, IGRID, ZMEANX, ZMEANY, & - TZHALO2LIST%HALO2 ) -!!$ELSE -!!$ CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PTHT, IGRID, ZMEANX, ZMEANY) -!!$ENDIF -! -! Thermodynamical variable -! -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DXF( PRUCT(:,:,:) * ZMEANX(:,:,:) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVX_BU_RTH') -! -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DYF( PRVCT(:,:,:) * ZMEANY(:,:,:) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVY_BU_RTH') -! -PRTHS(:,:,:) = PRTHS(:,:,:) & - -DZF( PRWCT(:,:,:) * MZM4(PTHT(:,:,:)) ) -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVZ_BU_RTH') -! -! Turbulence variables -! -IF ( GTKEALLOC ) THEN -!!$ IF(NHALO == 1) THEN - TZHALO2LIST => TZHALO2LIST%NEXT - CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PTKET, IGRID, & - ZMEANX, ZMEANY, TPHALO2=TZHALO2LIST%HALO2) -!!$ ELSE -!!$ CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PTKET, IGRID, ZMEANX, ZMEANY) -!!$ ENDIF -! - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DXF( PRUCT(:,:,:) * ZMEANX(:,:,:) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVX_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DYF( PRVCT(:,:,:) * ZMEANY(:,:,:) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVY_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) & - -DZF( PRWCT(:,:,:) * MZM4(PTKET(:,:,:)) ) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVZ_BU_RTKE') -ENDIF -! -! -! Case with KRR moist variables -! -DO JRR=1, KRR -!!$ IF(NHALO == 1) THEN - TZHALO2LIST => TZHALO2LIST%NEXT - CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PRT(:,:,:,JRR), IGRID, & - ZMEANX, ZMEANY,TPHALO2=TZHALO2LIST%HALO2 ) -!!$ ELSE -!!$ CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PRT(:,:,:,JRR), IGRID, ZMEANX, ZMEANY) -!!$ ENDIF -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DXF( PRUCT(:,:,:) * ZMEANX(:,:,:) ) - IF (JRR==1 .AND. LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVX_BU_RRV') - IF (JRR==2 .AND. LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVX_BU_RRC') - IF (JRR==3 .AND. LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVX_BU_RRR') - IF (JRR==4 .AND. LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVX_BU_RRI') - IF (JRR==5 .AND. LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVX_BU_RRS') - IF (JRR==6 .AND. LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVX_BU_RRG') - IF (JRR==7 .AND. LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVX_BU_RRH') -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DYF( PRVCT(:,:,:) * ZMEANY(:,:,:) ) - IF (JRR==1 .AND. LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVY_BU_RRV') - IF (JRR==2 .AND. LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVY_BU_RRC') - IF (JRR==3 .AND. LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVY_BU_RRR') - IF (JRR==4 .AND. LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVY_BU_RRI') - IF (JRR==5 .AND. LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVY_BU_RRS') - IF (JRR==6 .AND. LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVY_BU_RRG') - IF (JRR==7 .AND. LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVY_BU_RRH') -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DZF( PRWCT(:,:,:) * MZM4(PRT(:,:,:,JRR)) ) - IF (JRR==1 .AND. LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') - IF (JRR==2 .AND. LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') - IF (JRR==3 .AND. LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVZ_BU_RRR') - IF (JRR==4 .AND. LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVZ_BU_RRI') - IF (JRR==5 .AND. LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'ADVZ_BU_RRS') - IF (JRR==6 .AND. LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'ADVZ_BU_RRG') - IF (JRR==7 .AND. LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'ADVZ_BU_RRH') -ENDDO -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECMET_4TH - - diff --git a/src/MNH/advecscalar.f90 b/src/MNH/advecscalar.f90 deleted file mode 100644 index 44e315a3d..000000000 --- a/src/MNH/advecscalar.f90 +++ /dev/null @@ -1,168 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_ADVECSCALAR -! ####################### -INTERFACE - SUBROUTINE ADVECSCALAR ( KSV, PSVT, PRUCT, PRVCT, PRWCT, PRSVS ) -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -END SUBROUTINE ADVECSCALAR -! -END INTERFACE -! -END MODULE MODI_ADVECSCALAR -! -! -! -! ###################################################################### - SUBROUTINE ADVECSCALAR ( KSV, PSVT, PRUCT, PRVCT, PRWCT, PRSVS ) -! ###################################################################### -! -!!**** *ADVECSCALAR * - routine to compute the advection tendancies of the -!! tracer scalar fields. -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the total advection -!! tendancies of all the scalar fields, written in flux form. -!! The advection velocity is taken as the contravariant form of -!! the momentum for extension to non-cartesian geometry and -!! conformal projection cases. -!! -!! -!!** METHOD -!! ------ -!! The left and right lateral EXTernal zones, have been previously -!! prepared in routine LBC_S, to avoid particular cases close to the -!! Lateral Boundaries in this routine. -!! The Shuman functions are used to write the mean and finite -!! differences operators. -!! The different sources terms are stored for the budget -!! computations. -!! -!! EXTERNAL -!! -------- -!! MXM,MYM,MZM : Shuman functions (mean operators) -!! DXM,DYM,DZM : Shuman functions (finite differences operators) -!! BUDGET : Stores the different budget components -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! LBU_RSV : logical for budget of RSVx (scalar variables) -!! .TRUE. = budget of RSV -!! .FALSE. = no budget of RSV -!! -!! REFERENCE -!! --------- -!! -!! Book2 of documentation ( routine ADVECSCALAR ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/07/94 -!! Corrections 06/09/94 (J.-P. Lafore) -!! 16/03/95 (J. Stein) remove R from the historical var. -!! 01/04/95 (Ph. Hereil J. Nicolau) add the budget computation -!! 16/10/95 (J. Stein) change the budget calls -!! 19/12/96 (J.-P. Pinty) update the budget calls -!! 07/11/02 (V. Masson) update the budget calls -!! 24/04/06 (C.Lac) Split scalar and passive -!! tracer routines -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET -USE MODD_GRID_n -! -USE MODI_SHUMAN -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JSV ! Loop index for Scalar Variables -! -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE ADVECTIVE TENDENCIES -! --------------------------------- -! - ! Case with KSV Scalar Variables -DO JSV=1,KSV - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DXF( PRUCT(:,:,:) * MXM (PSVT(:,:,:,JSV)) ) -END DO -IF (LBUDGET_SV) THEN - DO JSV=1,KSV - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVX_BU_RSV') - END DO -END IF -! -DO JSV=1,KSV - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DYF( PRVCT(:,:,:) * MYM (PSVT(:,:,:,JSV)) ) -END DO -IF (LBUDGET_SV) THEN - DO JSV=1,KSV - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVY_BU_RSV') - END DO -END IF -! -DO JSV=1,KSV - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DZF( PRWCT(:,:,:) * MZM (PSVT(:,:,:,JSV)) ) -END DO -IF (LBUDGET_SV) THEN - DO JSV=1,KSV - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVZ_BU_RSV') - END DO -END IF -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECSCALAR diff --git a/src/MNH/advecscalar_4th.f90 b/src/MNH/advecscalar_4th.f90 deleted file mode 100644 index 9fa8e7847..000000000 --- a/src/MNH/advecscalar_4th.f90 +++ /dev/null @@ -1,204 +0,0 @@ -!MNH_LIC Copyright 2005-2020 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_ADVECSCALAR_4TH -! ############################### -! -INTERFACE -! - SUBROUTINE ADVECSCALAR_4TH (HLBCX,HLBCY, KSV, PRUCT, PRVCT, PRWCT, & - PSVT, PRSVS, TPHALO2LIST ) -! -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 -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! -! -TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion -! -END SUBROUTINE ADVECSCALAR_4TH -! -END INTERFACE -! -END MODULE MODI_ADVECSCALAR_4TH -! -! ###################################################################### - SUBROUTINE ADVECSCALAR_4TH (HLBCX,HLBCY, KSV, PRUCT, PRVCT, PRWCT, & - PSVT, PRSVS, TPHALO2LIST ) -! ###################################################################### -! -!!**** *ADVEC_4TH_ORDER * - routine to compute the 4th order centered -!! advection tendency of scalar variables -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to call the ADVEC_4TH_ORDER_ALGO -!! routine for the horizontal advection and the MZM4 and MZF4 functions for -!! the vertical advection of each prognostic variable. The code is -!! parallelized and works for various boundary conditions. -!! -!!** METHOD -!! ------ -!! For each prognostic variable the ADVEC_4TH_ORDER routine calls -!! the ADVEC_4TH_ORDER_ALGO routine which computes the numerical advection -!! of any 3D field. -!! The following variables are passed as argument to ADVEC_4TH_ORDER_ALGO : -!! -!! -- The variable at t -!! -- The second layer of the halo of the field at t -!! -- The horizontal advection fluxes -!! -- The localisation on the model grid : -!! -!! IGRID = 1 for mass grid point -!! IGRID = 2 for U grid point -!! IGRID = 3 for V grid point -!! IGRID = 4 for w grid point -!! -!! EXTERNAL -!! -------- -!! BUDGET : Stores the different budget components -!! (not used in current version) -!! ADVEC_4TH_ORDER_ALGO : computes the horizontal advection fluxes -!! MZF4 and MZM4 : computes the vertical advection fluxes -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODULE MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! Switches for budgets activations: -!! -!! LBU_RSV : logical for budget of RSVx (scalar variable) -!! .TRUE. = budget of RSVx -!! .FALSE. = no budget of RSVx -!! -!! MODULE MODD_ARGSLIST -!! HALO2LIST_ll : type for a list of "HALO2_lls" -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine ADVEC_4TH_ORDER ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/10/05 -!! -!! Correction : -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_ll -! -USE MODD_PARAMETERS -USE MODD_GRID_n -USE MODD_CONF -USE MODD_BUDGET -USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -! -USE MODI_SHUMAN -USE MODI_BUDGET -! -! 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 -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS -! -TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion -! -!* 0.2 Declarations of local variables : -! -! -INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER:: IIE,IJE ! End useful area in x,y,z directions -! -TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST -! -INTEGER :: IGRID ! localisation on the model grid -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZMEANX, ZMEANY ! fluxes -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE DOMAIN DIMENSIONS -! ------------------------------ -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -! -!------------------------------------------------------------------------------- -! -!* 2. CALL THE ADVEC_4TH_ORDER_ALGO ROUTINE FOR EACH FIELD -! ---------------------------------------------------- -! -IGRID = 1 -! -! -! Case with KSV tracers -! -DO JSV=1,KSV -! -!!$ IF(NHALO == 1) THEN - TZHALO2LIST => TPHALO2LIST - CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PSVT(:,:,:,JSV), IGRID, & - ZMEANX, ZMEANY,TZHALO2LIST%HALO2 ) -!!$ ELSE -!!$ CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PSVT(:,:,:,JSV), IGRID, ZMEANX, ZMEANY) -!!$ ENDIF -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DXF( PRUCT(:,:,:) * ZMEANX(:,:,:) ) - IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVX_BU_RSV') -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DYF( PRVCT(:,:,:) * ZMEANY(:,:,:) ) - IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVY_BU_RSV') -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DZF( PRWCT(:,:,:) * MZM4(PSVT(:,:,:,JSV)) ) - IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVZ_BU_RSV') -ENDDO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECSCALAR_4TH - - diff --git a/src/MNH/advecuvw.f90 b/src/MNH/advecuvw.f90 deleted file mode 100644 index 087ca0ecf..000000000 --- a/src/MNH/advecuvw.f90 +++ /dev/null @@ -1,177 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_ADVECUVW -! #################### -! -INTERFACE -! - SUBROUTINE ADVECUVW ( PUT, PVT, PWT, & - PRUCT, PRVCT, PRWCT, & - PRUS, PRVS, PRWS ) -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT, PWT ! Wind at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentum -! -END SUBROUTINE ADVECUVW -! -END INTERFACE -! -END MODULE MODI_ADVECUVW -! -! -! -! ########################################################### - SUBROUTINE ADVECUVW ( PUT, PVT, PWT, & - PRUCT, PRVCT, PRWCT, & - PRUS, PRVS, PRWS ) -! ########################################################### -! -!!**** *ADVECUVW * - routine to compute the advection terms of momentum -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the three advection terms -!! of each component of the momentum, written in flux form. -!! The advection velocity is taken as the contravariant form of -!! the momentum for extension to non-cartesian geometry and -!! conformal projection cases. The different sources terms are stored for -!! the budget computations. -!! -!! -!!** METHOD -!! ------ -!! The left and right lateral EXTernal zones, have been previously -!! prepared in routine LBC_S, to avoid particular cases close to the -!! Lateral Boundaries in this routine. -!! The Shuman functions are used to write the mean and finite -!! differences operators. -!! -!! EXTERNAL -!! -------- -!! DXM,DYM,DZM : Shuman functions (finite differences operators) -!! BUDGET : Stores the different budget components -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS: declaration of parameter variables -!! JPVEXT: define the number of marginal points out of the -!! physical domain along the vertical direction. -!! -!! Module MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! LBU_RU : logical for budget of RU (wind component along x) -!! .TRUE. = budget of RU -!! .FALSE. = no budget of RU -!! LBU_RV : logical for budget of RV (wind component along y) -!! .TRUE. = budget of RV -!! .FALSE. = no budget of RV -!! LBU_RW : logical for budget of RW (wind component along z) -!! .TRUE. = budget of RW -!! .FALSE. = no budget of RW -!! -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine ADVECUVW ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/07/94 -!! Corrections 06/09/94 (J.-P. Lafore) -!! 02/11/94 (J.Stein) extrapolation under the ground -!! 16/03/95 (J.Stein) remove R from the historical variables -!! 01/04/95 (Ph. Hereil J. Nicolau) add the budget computation -!! 16/10/95 (J. Stein) change the budget calls -!! 19/12/96 (J.-P. Pinty) update the budget calls -!! 07/11/02 (V. Masson) update the budget calls -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -USE MODD_BUDGET -USE MODD_GRID_n -! -USE MODI_SHUMAN -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT, PWT ! Wind at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentum -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE ADVECTIVE TENDANCIES -! --------------------------------- -! -PRUS(:,:,:) = PRUS(:,:,:) & - -DXM( MXF(PRUCT(:,:,:))*MXF(PUT(:,:,:)) ) -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVX_BU_RU') -! -PRUS(:,:,:) = PRUS(:,:,:) & - -DYF( MXM(PRVCT(:,:,:))*MYM(PUT(:,:,:)) ) -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVY_BU_RU') -! -PRUS(:,:,:) = PRUS(:,:,:) & - -DZF( MXM(PRWCT(:,:,:))*MZM(PUT(:,:,:)) ) -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVZ_BU_RU') -! -! -PRVS(:,:,:) = PRVS(:,:,:) & - -DXF( MYM(PRUCT(:,:,:))*MXM(PVT(:,:,:)) ) -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVX_BU_RV') -! -PRVS(:,:,:) = PRVS(:,:,:) & - -DYM( MYF(PRVCT(:,:,:))*MYF(PVT(:,:,:)) ) -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVY_BU_RV') -! -PRVS(:,:,:) = PRVS(:,:,:) & - -DZF( MYM(PRWCT(:,:,:))*MZM(PVT(:,:,:)) ) -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVZ_BU_RV') -! -! -PRWS(:,:,:) = PRWS(:,:,:) & - -DXF( MZM(PRUCT(:,:,:))*MXM(PWT(:,:,:)) ) -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVX_BU_RW') -! -PRWS(:,:,:) = PRWS(:,:,:) & - -DYF( MZM(PRVCT(:,:,:))*MYM(PWT(:,:,:)) ) -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVY_BU_RW') -! -PRWS(:,:,:) = PRWS(:,:,:) & - -DZM( MZF(PRWCT(:,:,:))*MZF(PWT(:,:,:)) ) -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVZ_BU_RW') -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECUVW diff --git a/src/MNH/c3r5_adjust.f90 b/src/MNH/c3r5_adjust.f90 deleted file mode 100644 index b286ac8c7..000000000 --- a/src/MNH/c3r5_adjust.f90 +++ /dev/null @@ -1,166 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_C3R5_ADJUST -! ####################### -! -INTERFACE -! - SUBROUTINE C3R5_ADJUST( KRR, KMI, HRAD, & - HTURBDIM, OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PSIGS, PPABST, & - PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & - PCCT, PCIT, PCNUCS, PCCS, PINUCS, PCIS, & - PTHS, PSRCS, PCLDFR ) -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KMI ! Model index -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Condensation -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRST ! Aggregate m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRRS ! Rain water m.r. at t+1 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRSS ! Aggregate m.r. at t+1 -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRGS ! Graupel m.r. at t+1 -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHS ! Hail m.r. at t+1 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water conc. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Cloud ice conc. at t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNUCS ! Nucl. aero. conc. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water conc. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINUCS ! Ice Nucl. conc. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Cloud ice conc. source -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux: s'rc'/2Sigma_s2 at time t+1 times Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction -! -END SUBROUTINE C3R5_ADJUST -! -END INTERFACE -! -END MODULE MODI_C3R5_ADJUST -! -! ########################################################################## - SUBROUTINE C3R5_ADJUST( KRR, KMI, HRAD, & - HTURBDIM, OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PSIGS, PPABST, & - PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & - PCCT, PCIT, PCNUCS, PCCS, PINUCS, PCIS, & - PTHS, PSRCS, PCLDFR ) -! ########################################################################## -! -!!**** *C3R5_ADJUST* - compute the fast microphysical sources -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the fast microphysical sources -!! through an explict scheme and a saturation ajustement procedure. -!! -!! -!!** METHOD -!! ------ -!! Reisin et al., 1996 for the explicit scheme when ice is present -!! Langlois, Tellus, 1973 for the implict adjustment for the cloud water -!! (refer also to book 1 of the documentation). -!! -!! EXTERNAL -!! -------- -!! None -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XP00 ! Reference pressure -!! XMD,XMV ! Molar mass of dry air and molar mass of vapor -!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -!! XCL ! Cl (liquid) -!! XTT ! Triple point temperature -!! XLVTT ! Vaporization heat constant -!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor -!! ! pressure function -!! Module MODD_CONF -!! CCONF -!! Module MODD_BUDGET: -!! NBUMOD -!! CBUTYPE -!! NBUPROCCTR -!! LBU_RTH -!! LBU_RRV -!! LBU_RRC -!! Module MODD_LES : NCTR_LES,LTURB_LES,NMODNBR_LES -!! XNA declaration (cloud fraction as global var) -!! -!! REFERENCE -!! --------- -!! -!! Book 1 and Book2 of documentation ( routine FAST_TERMS ) -!! Langlois, Tellus, 1973 -!! AUTHOR -!! ------ -!! E. Richard * Laboratoire d'Aerologie* -!! -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/12/94 -!! Modifications: March 1, 1995 (J.M. Carriere) -!! Introduction of cloud water with order 1 -!! formulation -!! Modifications: June 8, 1995 ( J.Stein ) -!! Cleaning -!! Modifications: August 30, 1995 ( J.Stein ) -!! add Lambda3 for the subgrid condensation -!! -!! October 16, 1995 (J. Stein) change the budget calls -!! March 16, 1996 (J. Stein) store the cloud fraction -!! April 03, 1996 (J. Stein) displace the nebulosity -!! computation in the all and nothing case -!! April 15, 1996 (J. Stein) displace the lambda 3 -!! multiplication and change the nebulosity threshold -!! September 16, 1996 (J. Stein) bug in the SG cond for -!! the M computation -!! October 10, 1996 (J. Stein) reformulate the Subgrid -!! condensation scheme -!! October 8, 1996 (Cuxart,Sanchez) Cloud frac. LES diag (XNA) -!! December 6, 1996 (J.-P. Pinty) correction of Delta_2 -!! November 5, 1996 (J. Stein) remove Rnp<0 values -!! November 13 1996 (V. Masson) add prints in test above -!! March 11, 1997 (J.-M. Cohard) C2R2 option -!! April 6, 2001 (J.-P. Pinty) C3R5 option -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! -!------------------------------------------------------------------------------- -! -!implicit none -! -use mode_msg -! -call Print_msg(NVERB_FATAL,'GEN','C3R5_ADJUST','not yet developed') -! -END SUBROUTINE C3R5_ADJUST diff --git a/src/MNH/ch_aqueous_sedimc2r2.f90JPP b/src/MNH/ch_aqueous_sedimc2r2.f90JPP deleted file mode 100644 index 2627365be..000000000 --- a/src/MNH/ch_aqueous_sedimc2r2.f90JPP +++ /dev/null @@ -1,310 +0,0 @@ -!MNH_LIC Copyright 2008-2019 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_CH_AQUEOUS_SEDIMC2R2 -! ################################ -! -INTERFACE - SUBROUTINE CH_AQUEOUS_SEDIMC2R2 (PTIME, PTSTEP, PZZ, PRHODREF, PRHODJ, & - PRRM, PRRS, PCRM, PCRS, PSVT, PRSVS ) -! -REAL, INTENT(IN) :: PTIME ! Current time -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRM ! Rain water m.r. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRM ! Rain water C at t-dt -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Precip. aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Precip. aq. species source -! -END SUBROUTINE CH_AQUEOUS_SEDIMC2R2 -END INTERFACE -END MODULE MODI_CH_AQUEOUS_SEDIMC2R2 -! -! ####################################################################### - SUBROUTINE CH_AQUEOUS_SEDIMC2R2 (PTIME,PTSTEP, PZZ, PRHODREF, PRHODJ, & - PRRM, PRRS, PCRM, PCRS, PSVT, PRSVS ) -! ####################################################################### -! -!!**** * - compute the explicit microphysical sources -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the sedimentation of chemical -!! species in the raindrops for the C2R2 and C3R5 cloud microphysical schemes. -!! The sedimentation rates are computed with a time spliting technique: -!! an upstream scheme, written as a difference of non-advective fluxes. -!! This source term is added to the next coming time step (split-implicit -!! process). see rain_c2r2.f90 -!! -!! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! Module MODD_CONF : -!! CCONF configuration of the model for the first time step -!! -!! REFERENCE -!! --------- -!! Book1 of the documentation ( routine CH_AQUEOUS_SEDIMC2R2 ) -!! -!! AUTHOR -!! ------ -!! M. Leriche & J.P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 30/10/08 -!! -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LUNIT_n - -USE MODD_PARAMETERS -USE MODD_CONF -USE MODD_RAIN_C2R2_DESCR, ONLY : XCEXVT, XRTMIN, XCTMIN, & - XLBR, XLBEXR, XDR -USE MODD_RAIN_C2R2_PARAM, ONLY : XFSEDRR, XFSEDCR -USE MODD_CH_MNHC_n, ONLY: XRTMIN_AQ -! -use mode_tools, only: Countjv -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -REAL, INTENT(IN) :: PTIME ! Current time -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRM ! Rain water m.r. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRM ! Rain water C at t-dt -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Precip. aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Precip. aq. species source -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JK,JI,JJ ! Vertical loop index for the rain sedimentation -INTEGER :: JN ! Temporal loop index for the rain sedimentation -INTEGER :: IIB ! Define the domain where is -INTEGER :: IIE ! the microphysical sources have to be computed -INTEGER :: IJB ! -INTEGER :: IJE ! -INTEGER :: IKB ! -INTEGER :: IKE ! -! -REAL :: ZTSPLITR ! Small time step for rain sedimentation -! -INTEGER :: ISEDIM ! Case number of sedimentation -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: GSEDIM ! where to compute the SED processes -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZZRRS ! rain water m.r.source for sedim -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZZCRS ! rain water C source for sedim -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRRS ! Rain water m.r. source phys.tendency (*dt) -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZCRS ! Rain water C source phys.tendency -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZWLBDR3, ZWLBDR ! Slope parameter of the raindrops distribution -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZW ! work array -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZWSEDR, ZWSEDC ! sedimentation fluxes -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRR_SEDIM ! Drain/Dt sur ZTSPLIT -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZCR_SEDIM ! Drain/Dt sur ZTSPLIT -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZSV_SEDIM_FACT ! Cumul des Dsv/DT -REAL, DIMENSION(:), ALLOCATABLE :: ZZZRRS ! Rain water m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZZCRS ! Rain water C source -REAL, DIMENSION(:), ALLOCATABLE :: ZLBDR ! slope parameter -! -REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence - ZZW1, ZZW2, ZZW3 ! Work array -REAL, SAVE :: ZRTMIN, ZCTMIN -! -REAL :: ZVTRMAX, ZDZMIN, ZT -LOGICAL, SAVE :: GSFIRSTCALL = .TRUE. -INTEGER, SAVE :: ISPLITR -! -INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT -INTEGER :: JL ! and PACK intrinsics - - -INTEGER :: ILUOUT ! logical unit -INTEGER :: IRESP ! IRESP : return-code if a problem appears - !in LFI subroutines at the open of the file - -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! -IIB=1+JPHEXT -IIE=SIZE(PZZ,1) - JPHEXT -IJB=1+JPHEXT -IJE=SIZE(PZZ,2) - JPHEXT -IKB=1+JPVEXT -IKE=SIZE(PZZ,3) - JPVEXT -! -!------------------------------------------------------------------------------- -! -!!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES -! --------------------------------------- -! -ZRRS(:,:,:) = PRRS(:,:,:) / PRHODJ(:,:,:) -ZCRS(:,:,:) = PCRS(:,:,:) / PRHODJ(:,:,:) -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE SEDIMENTATION (RS) SOURCE -! ------------------------------------- -! -!* 3.1 splitting factor for high Courant number C=v_fall*(del_Z/del_T) -! -firstcall : IF (GSFIRSTCALL) THEN - GSFIRSTCALL = .FALSE. - ZVTRMAX = 30. !cf. ini_rain_c2r2.f90 - ZDZMIN = MINVAL(PZZ(IIB:IIE,IJB:IJE,IKB+1:IKE+1)-PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) - ISPLITR = 1 - SPLIT : DO - ZT = PTSTEP / REAL(ISPLITR) - IF ( ZT * ZVTRMAX / ZDZMIN .LT. 1.) EXIT SPLIT - ISPLITR = ISPLITR + 1 - END DO SPLIT - ZRTMIN = XRTMIN(3) / PTSTEP - ZCTMIN = XCTMIN(3) / PTSTEP -END IF firstcall -! -!* 3.2 Compute the slope parameter -! - ZWLBDR3(:,:,:) = 1.E30 - ZWLBDR(:,:,:) = 1.E10 -! WHERE (ZRRS(:,:,:)>0.0.AND.ZCRS(:,:,:)>0.0 ) - WHERE ( ZRRS(:,:,:)>ZRTMIN .AND. ZCRS(:,:,:)>ZCTMIN ) - ZWLBDR3(:,:,:) = XLBR * ZCRS(:,:,:) / (PRHODREF(:,:,:) * ZRRS(:,:,:)) - ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR - END WHERE -! -!* 3.3 time splitting loop initialization -! -ZTSPLITR = PTSTEP / REAL(ISPLITR) ! Small time step -! -!* 3.4 compute the fluxes -! -! optimization by looking for locations where -! the precipitating fields are larger than a minimal value only !!! -! -ZSV_SEDIM_FACT(:,:,:) = 1.0 -ZZRRS(:,:,:) = ZRRS(:,:,:) * PTSTEP -ZZCRS(:,:,:) = ZCRS(:,:,:) * PTSTEP -! -DO JN = 1 , ISPLITR - GSEDIM(:,:,:) = .FALSE. - GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = ZRRS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN - ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - IF( ISEDIM >= 1 ) THEN - IF( JN==1 ) THEN - ZW(:,:,:) = 0.0 - DO JK = IKB , IKE - ZW(:,:,JK) =ZTSPLITR/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) - END DO - END IF - ALLOCATE(ZRHODREF(ISEDIM)) - ALLOCATE(ZZZRRS(ISEDIM)) - ALLOCATE(ZZZCRS(ISEDIM)) - ALLOCATE(ZLBDR(ISEDIM)) - DO JL=1,ISEDIM - ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) - ZZZRRS(JL) = ZZRRS(I1(JL),I2(JL),I3(JL)) - ZZZCRS(JL) = ZZCRS(I1(JL),I2(JL),I3(JL)) - ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) - ENDDO - ALLOCATE(ZZW1(ISEDIM)) ; ZZW1(:) = 0.0 - ALLOCATE(ZZW2(ISEDIM)) ; ZZW2(:) = 0.0 - ALLOCATE(ZZW3(ISEDIM)) ; ZZW3(:) = 0.0 -! -!* for rain -! - WHERE( ZZZRRS(:)>XRTMIN(3) ) - ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDR(:)**(-XDR)) - ZZW1(:) = XFSEDRR * ZZZRRS(:)* ZZW3(:) * ZRHODREF(:) - ZZW2(:) = XFSEDCR * ZZZCRS(:)* ZZW3(:) - END WHERE - ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK)) & - /PRHODREF(:,:,JK) - ZCR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK)) - END DO - ZZRRS(:,:,:) = ZZRRS(:,:,:) + ZRR_SEDIM(:,:,:) - ZZCRS(:,:,:) = ZZCRS(:,:,:) + ZCR_SEDIM(:,:,:) -! - WHERE( ZZZRRS(:)>XRTMIN(3) ) - ZZW1(:) = XFSEDRR * ZZW3(:) * ZRHODREF(:) - END WHERE - ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK)) - END DO - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZZRRS) - DEALLOCATE(ZZZCRS) - DEALLOCATE(ZLBDR) - DEALLOCATE(ZZW1) - DEALLOCATE(ZZW2) - DEALLOCATE(ZZW3) - ZSV_SEDIM_FACT(:,:,:) = ZSV_SEDIM_FACT(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:)) -!! (1.0 + ZRR_SEDIM(:,:,:)/MAX(ZZRRS(:,:,:),XRTMIN_AQ)) - END IF -END DO -! -! Apply the rain sedimentation rate to the WR_xxx aqueous species -! -!ILUOUT = TLUOUT%NLU -!WRITE(ILUOUT,*) 'valuers ZSV_SEDIM_FACT TIME =', PTIME-59400. -!DO JI=IIB,IIE -! DO JJ = IJB,IJE -! DO JK= IKB,IKE -!IF(ZSV_SEDIM_FACT(jI,jJ,jK)>5.) WRITE(ILUOUT,*) JI,JJ,JK,ZSV_SEDIM_FACT(ji,jj,jk) -! ENDDO -! ENDDO -!ENDDO -DO JL= 1, SIZE(PRSVS,4) - PRSVS(:,:,:,JL) = MAX( 0.0,ZSV_SEDIM_FACT(:,:,:)*PRSVS(:,:,:,JL) ) -END DO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE CH_AQUEOUS_SEDIMC2R2 - diff --git a/src/MNH/ch_read_meteo.f90 b/src/MNH/ch_read_meteo.f90 deleted file mode 100644 index 8dc06a98d..000000000 --- a/src/MNH/ch_read_meteo.f90 +++ /dev/null @@ -1,83 +0,0 @@ -!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_CH_READ_METEO -!! ######################### -! -INTERFACE -SUBROUTINE CH_READ_METEO(TPM) -USE MODD_CH_M9_n, ONLY: METEOTRANSTYPE -IMPLICIT NONE -TYPE(METEOTRANSTYPE), INTENT(INOUT) :: TPM -END SUBROUTINE CH_READ_METEO -END INTERFACE -END MODULE MODI_CH_READ_METEO -!! -!! ############################# - SUBROUTINE CH_READ_METEO(TPM) -!! ############################# -!! -!!*** *CH_READ_METEO* -!! -!! PURPOSE -!! ------- -!! Read a set of meteo variables -!! -!!** METHOD -!! ------ -!! read NMETEOVARS values and the time for the next update XTNEXTMETEO -!! -!! AUTHOR -!! ------ -!! K. Suhre -!! -!! MODIFICATIONS -!! ------------- -!! Original 21/04/95 -!! 27/07/96 (K. Suhre) restructured -!! 01/12/03 (D. Gazen) change Chemical scheme interface -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -USE MODD_CH_MODEL0D, ONLY: TMETEOFILE, XTNEXTMETEO, NVERB -USE MODD_CH_M9_n, ONLY: NMETEOVARS, METEOTRANSTYPE -!! -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ----------------- -IMPLICIT NONE -! -!* 0.1 declaration of arguments -! -TYPE(METEOTRANSTYPE), INTENT(INOUT) :: TPM ! the meteo variables -! -!* 0.2 declaration of local variables -! ---------------- -INTEGER :: JI ! loop control -! -!------------------------------------------------------------------------------ -! -!* EXECUTABLE STATEMENTS -! --------------------- -! -! read meteo variables and time of next update -READ(TMETEOFILE%NLU,*) (TPM%XMETEOVAR(JI), JI = 1, NMETEOVARS) -READ(TMETEOFILE%NLU,*) XTNEXTMETEO -! -! print what has been read -IF (NVERB >= 7) THEN - PRINT *, 'CH_READ_METEO: new set of meteo variables has been read:' - DO JI = 1, NMETEOVARS - PRINT *, TPM%CMETEOVAR(JI), ': ', TPM%XMETEOVAR(JI) - ENDDO -END IF -IF (NVERB >= 5) THEN - PRINT *, 'CH_READ_METEO: next update at XTNEXTMETEO = ', XTNEXTMETEO -END IF -! -END SUBROUTINE CH_READ_METEO diff --git a/src/MNH/dflux_corr.f90 b/src/MNH/dflux_corr.f90 deleted file mode 100644 index fec030ec7..000000000 --- a/src/MNH/dflux_corr.f90 +++ /dev/null @@ -1,307 +0,0 @@ -!MNH_LIC Copyright 1998-2020 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_DFLUX_CORR -! ########################## -! -INTERFACE -! -! ###################################################################### - SUBROUTINE DFLUX_CORR ( HLBCX, HLBCY, PTSTEP, PMIN, & - PRHODJ, PAM, PAT, PRUCT, PRVCT, PRWCT, & - PFX, PFY, PFZ) -! ###################################################################### -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PMIN - ! Absolute minimum variable -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ - ! (Rho) dry *jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAM - ! Variable at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAT - ! Variable at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! Contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFX, PFY, PFZ - ! Flux components -! -END SUBROUTINE DFLUX_CORR -! -END INTERFACE -! -END MODULE MODI_DFLUX_CORR -! -! -! -! ###################################################################### - SUBROUTINE DFLUX_CORR ( HLBCX, HLBCY, PTSTEP, PMIN, & - PRHODJ, PAM, PAT, PRUCT, PRVCT, PRWCT, & - PFX, PFY, PFZ) -! ###################################################################### -! -!!**** *DFLUX_CORR* - calculates the advective tendencies fluxes by means of -!! the Directional Flux-Corrected Transport and -!! the Flux-Corrected Transport advection schemes -!! -!! PURPOSE -!! ------- -!! -!! The purpose of the routine is to calculate the advection of a scalar. -!! A centred advection scheme is used (leapfrog). Two corrections of -!! the fluxes are is applied (DFCT and FCT) to insure that the total -!! resulting scheme is positive definite. -!! The advection scheme is second-order on time and on space. -! -!!** METHOD -!! ------ -!! -!! First, the advective flux is calculated. Second the flux is corrected -!! using the Directional-Flux-Corrected Transport method. -!! Second, the advective flux is calculated. Eventually the flux is corrected -!! using the Flux-Corrected Transport method. This method implies the -!! calculation of one limiting factors: BETAOUT. The -!! first factor insures that the calculated flux is less than its respective -!! analytical value (nonoscillatory condition). -!! -!! EXTERNAL -!! -------- -!! GET_DIM_EXT_ll : get extended sub-domain sizes -!! ADD3DFIELD_ll : add a field to 3D-list -!! UPDATE_HALO_ll : update internal halos -!! UPDATE_BOUNDARIES_ll : update external boundaries -!! LWEAST_ll,LEAST_ll,LNORTH_ll,LSOUTH_ll : position functions -!! MXM,MYM,MZM : Shuman functions (mean operators) -!! DXF,DYF,DZF : Shuman functions (finite difference operators) -!! CLEANLIST_ll : deaalocate a list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! JPHEXT, JPVEXT -!! MODD CONF:CCONF -!! -!! REFERENCE -!! --------- -!! Book1 of documentation (FCT scheme) -!! -!! AUTHOR -!! ------ -!! J.-P. Lafore *Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! -!! original 27/03/98 -!! V. Masson 24/11/97 removes the DO loops -!! P. Jabouille 24/09/98 parallelize the code -!! J. Stein 05/04/99 : bug for the case PMIN /= 0 + lbc -!! JP Pinty & 12/10/98 : Vectorization of the first loops -!! J Escobar -!! J. Stein & 20/03/01 : bug for the open case at the boundary -!! P. Jabouille -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_ll -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_CONF -USE MODD_PARAMETERS -USE MODI_SHUMAN -! -IMPLICIT NONE -! -!* 0.1 DECLARATIONS OF ARGUMENTS -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -! -REAL, INTENT(IN) :: PTSTEP - ! Double Time step -REAL, INTENT(IN) :: PMIN - ! Absolute minimum variable -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ - ! (Rho) dry *jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAM - ! Variable at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAT - ! Variable at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFX, PFY, PFZ - ! Flux component -! -!* 0.2 DECLARATIONS OF LOCAL VARIABLES -! -! -INTEGER:: IIU,IJU,IKU ! Size array in the x, y, - ! and z directions -INTEGER:: JI,JJ,JK ! Loop index in the x, y, - ! and z directions -REAL :: ZEPSILON ! Variable to ensure that the - ! limiting factor is zero -! -! -REAL,DIMENSION(SIZE(PAT,1),SIZE(PAT,2),SIZE(PAT,3)):: ZFOUT - ! The outgoing flux of the grid cell - ! (located at mass point) -REAL,DIMENSION(SIZE(PAT,1),SIZE(PAT,2),SIZE(PAT,3)):: ZBETAOUT - ! The outgoing limiting factor -INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -! -!* 0.3 PROLOGUE -! -NULLIFY(TZFIELDS_ll) -! -CALL GET_DIM_EXT_ll ('B',IIU,IJU) -IKU=SIZE(PRUCT,3) -! -ZEPSILON=1.0E-15 -! -!------------------------------------------------------------------------------ -! -! -!* 1. First limitation on a directional base -! -------------------------------------- -! -ZBETAOUT(:,:,:) = -PRHODJ(:,:,:)*(PAM(:,:,:)-PMIN)/PTSTEP ! First limiter -! -!* 1.1 X-direction -! -ZFOUT(2:IIU,:,:) = -ZBETAOUT(1:IIU-1,:,:) ! Second limiter -ZFOUT(1,:,:) = 0.0 -! -PFX(:,:,:) = PRUCT(:,:,:) * MXM (PAT(:,:,:)) -PFX(:,:,:) = (0.5+SIGN(0.5,PRUCT(:,:,:)))*MIN( PFX(:,:,:),ZFOUT(:,:,:) ) & - +(0.5-SIGN(0.5,PRUCT(:,:,:)))*MAX( PFX(:,:,:),ZBETAOUT(:,:,:) ) -! -!* 1.2 Y-direction -! -ZFOUT(:,2:IJU,:) = -ZBETAOUT(:,1:IJU-1,:) ! Second limiter -ZFOUT(:,1,:) = 0.0 -! -PFY(:,:,:) = PRVCT(:,:,:) * MYM (PAT(:,:,:)) -PFY(:,:,:) = (0.5+SIGN(0.5,PRVCT(:,:,:)))*MIN( PFY(:,:,:),ZFOUT(:,:,:) ) & - +(0.5-SIGN(0.5,PRVCT(:,:,:)))*MAX( PFY(:,:,:),ZBETAOUT(:,:,:) ) -! -!* 1.3 Z-direction -! -ZFOUT(:,:,2:IKU) = -ZBETAOUT(:,:,1:IKU-1) ! Second limiter -ZFOUT(:,:,1) = 0.0 -! -PFZ(:,:,:) = PRWCT(:,:,:) * MZM (PAT(:,:,:)) -PFZ(:,:,:) = (0.5+SIGN(0.5,PRWCT(:,:,:)))*MIN( PFZ(:,:,:),ZFOUT(:,:,:) ) & - +(0.5-SIGN(0.5,PRWCT(:,:,:)))*MAX( PFZ(:,:,:),ZBETAOUT(:,:,:) ) -! -! -!------------------------------------------------------------------------------ -!* 3. Flux-OUT calculation -! --------------------- -! -DO JK=2,IKU-1 - DO JJ=2,IJU-1 - DO JI=2,IIU-1 - ZFOUT(JI,JJ,JK) = MAX(0.,PFX(JI+1,JJ,JK)) & - - MIN(0.,PFX(JI, JJ,JK)) & - + MAX(0.,PFY(JI,JJ+1,JK)) & - - MIN(0.,PFY(JI,JJ ,JK)) & - + MAX(0.,PFZ(JI,JJ,JK+1)) & - - MIN(0.,PFZ(JI,JJ,JK )) - END DO - END DO -END DO -! -! -!------------------------------------------------------------------------------ -!* 4. BETAOUT calculation -! ------------------- -ZBETAOUT(:,:,:) =(PAM(:,:,:)-PMIN)/ & - (PTSTEP*ZFOUT(:,:,:)/PRHODJ(:,:,:)+ZEPSILON) -! -ZBETAOUT(:,:,1) = 1. ! no limitation outside the physical domain -ZBETAOUT(:,:,IKU) = 1. ! because no velocity is available -! -! -! Update halo and apply possible cyclic boundary conditions -! -!!$IF(NHALO == 1 .OR. HLBCX(1)=='CYCL' .OR. HLBCY(1)=='CYCL') THEN -IF(HLBCX(1)=='CYCL' .OR. HLBCY(1)=='CYCL') THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZBETAOUT, 'DFLUX_CORR::ZBETAOUT' ) -!!$ IF(NHALO == 1) THEN - CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -!!$ ELSE -!!$ IF(HLBCX(1)=='CYCL') CALL UPDATE_BOUNDARIES_ll('XX',TZFIELDS_ll,IINFO_ll) -!!$ IF(HLBCY(1)=='CYCL') CALL UPDATE_BOUNDARIES_ll('YY',TZFIELDS_ll,IINFO_ll) -!!$ END IF - CALL CLEANLIST_ll(TZFIELDS_ll) -ENDIF -! -! -IF (HLBCX(1)/='CYCL') THEN - IF (LWEST_ll( )) ZBETAOUT(1,:,:) = 1. ! no limitation outside the physical domain - IF (LEAST_ll( )) ZBETAOUT(IIU,:,:) = 1. ! because no velocity is available -END IF -! -IF (HLBCY(1)/='CYCL') THEN - IF (LSOUTH_ll( )) ZBETAOUT(:,1,:) = 1. ! no limitation outside the physical domain - IF (LNORTH_ll( )) ZBETAOUT(:,IJU,:) = 1. ! because no velocity is available -END IF -! -! -!------------------------------------------------------------------------------ -!* 4. Second Flux limitation -! ---------------------- -! -! - ! x-component - ! -ZFOUT(2:IIU,:,:) = ZBETAOUT(1:IIU-1,:,:) -PFX(:,:,:) = MIN(1., ZFOUT(:,:,:)) * MAX(0.,PFX(:,:,:)) & - + MIN(1., ZBETAOUT(:,:,:)) * MIN(0.,PFX(:,:,:)) - ! y-component - ! -ZFOUT(:,2:IJU,:) = ZBETAOUT(:,1:IJU-1,:) -PFY(:,:,:) = MIN(1., ZFOUT(:,:,:)) * MAX(0.,PFY(:,:,:)) & - + MIN(1., ZBETAOUT(:,:,:)) * MIN(0.,PFY(:,:,:)) - ! z-component - ! -ZFOUT(:,:,2:IKU) = ZBETAOUT(:,:,1:IKU-1) -PFZ(:,:,:) = MIN(1., ZFOUT(:,:,:)) * MAX(0.,PFZ(:,:,:)) & - + MIN(1., ZBETAOUT(:,:,:)) * MIN(0.,PFZ(:,:,:)) -! -!------------------------------------------------------------------------------ -! -!* 5. Boundary conditions for the flux cyclic case -! -------------------------------------------- -! - ! x-direction -IF (HLBCX(1)=='CYCL') THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, PFX, 'DFLUX_CORR::PFX' ) - CALL UPDATE_BOUNDARIES_ll('XX',TZFIELDS_ll, IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) -ENDIF - ! y-direction -IF (HLBCY(1)=='CYCL') THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, PFY, 'DFLUX_CORR::PFY' ) - CALL UPDATE_BOUNDARIES_ll('YY',TZFIELDS_ll, IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) -ENDIF -! -! -!------------------------------------------------------------------------------ -END SUBROUTINE DFLUX_CORR diff --git a/src/MNH/dry_mass.f90 b/src/MNH/dry_mass.f90 deleted file mode 100644 index 0930b058b..000000000 --- a/src/MNH/dry_mass.f90 +++ /dev/null @@ -1,162 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_DRY_MASS -! #################### -INTERFACE - SUBROUTINE DRY_MASS(PTHV,PR,PJ,PPABS,PDRYMASS) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV ! virtual potential temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABS ! absolute pressure -! -REAL, INTENT(OUT) :: PDRYMASS ! dry mass -! -END SUBROUTINE DRY_MASS -END INTERFACE -END MODULE MODI_DRY_MASS -! ######spl - SUBROUTINE DRY_MASS(PTHV,PR,PJ,PPABS,PDRYMASS) -! ########################################## -! -!!**** *DRY_MASS* - computation of the total dry air mass -!! -!! PURPOSE -!! ------- -!! This routine computes the total dry mass in the whole domain from -!! the virtual potential temperature, the mixing ratio, the local Exner -!! function at the top of the model and the Jacobian. -!! -!!** METHOD -!! ------ -!! -!! 1 The local Exner function in computed by integration of the hydrostatic -!! relation from top (PEXNTOP2D) to bottom (routine COMPUTE_EXNER_FROM_TOP). -!! -!! -!! 2 The Exner function at mass level is computed as follows and linearly -!! extrapolated for the uppest non-physical level -!! (routine COMPUTE_EXNER_FROM_TOP). -!! -!! 3 rhod is deduced by the relation: -!! -!! -!! P / (PI) -!! rhod= ---------------- -!! Rd thetav (1+rw) -!! -!! 4 The total dry mass is deduced from rhod and the Jacobian (the integration -!! is performed on the inner points): -!! -!! Md= SUM rhod J* -!! i,j,k -!! -!! -!! EXTERNAL -!! -------- -!! -!! routine COMPUTE_EXNER_FROM_TOP : to compute the hydrostatic Exner function -!! -!! module MODI_COMPUTE_EXNER_FROM_TOP -!! SUM3D_ll : distributed function equivalent to SUM -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_LUNIT_n : contains logical unit names for all models -!! TLUOUT : name of output-listing -!! Module MODD_GRID1 : contains grid variables for model1 -!! XZZ : altitude of the w points -!! Module MODD_CST : contains physical constants -!! XG : gravity constant -!! XCPD: specific heat for dry air at constant pressure -!! XP00: reference pressure -!! XRD : gas constant for dry air -!! Module MODD_PARAMETERS -!! JPVEXT;JPHEXT -!! Module MODD_FIELD1 : contains the prognostic fields of model1 -!! XDRYMASST : total dry mass at t -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/12/94 -!! Sept. 21, 1995 (J.Stein and V.Masson) surface pressure -!! Jan. 09, 1996 (V. Masson) hydrostatic pressure at mass -!! point -!! March 06, 1996 (V. Masson) call to COMPUTE_EXNER_FROM_TOP -!! Jan 15, 1997 (Stein,Lafore) Durran anelastic equation -!! Jun 10, 1997 (V. Masson) use absolute pressure -!! Jul 10, 1997 (V. Masson) removes use to modules of model 1 -!! Nov 21, 1997 (V. Masson) use all water species -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF ! declaration modules -USE MODD_LUNIT_n, ONLY : TLUOUT -USE MODD_CST -USE MODD_PARAMETERS -! -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV ! virtual potential temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABS ! absolute pressure -! -REAL, INTENT(OUT) :: PDRYMASS ! dry mass -! -!* 0.2 Declaration of local variables -! ------------------------------ -INTEGER :: JRR -REAL, DIMENSION(SIZE(PJ,1),SIZE(PJ,2),SIZE(PJ,3)) :: ZRHOD, ZSUMR -INTEGER :: IINFO_ll ! return code of parallel routine -!------------------------------------------------------------------------------- -! -! -!* 1. COMPUTATION OF RHOD -! ------------------- -! -! -ZSUMR(:,:,:) = 0. -DO JRR=1,SIZE(PR,4) - ZSUMR(:,:,:) = ZSUMR(:,:,:) + PR(:,:,:,JRR) -END DO -! -ZRHOD(:,:,:)=PPABS(:,:,:)/(PPABS(:,:,:)/XP00)**(XRD/XCPD) & - /(XRD*PTHV(:,:,:)*(1.+ZSUMR(:,:,:))) -! -!------------------------------------------------------------------------------- -! -!* 2. COMPUTATION OF THE TOTAL DRY MASS -! --------------------------------- -! -PDRYMASS=SUM3D_ll(PJ(:,:,:)*ZRHOD(:,:,:),IINFO_ll) -! -!------------------------------------------------------------------------------- -! -WRITE(TLUOUT%NLU,*) 'Routine DRYMASS completed' -! -END SUBROUTINE DRY_MASS diff --git a/src/MNH/dummy_gr_index.f90 b/src/MNH/dummy_gr_index.f90 deleted file mode 100644 index 1bdac1193..000000000 --- a/src/MNH/dummy_gr_index.f90 +++ /dev/null @@ -1,86 +0,0 @@ -!MNH_LIC Copyright 1997-2019 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_DUMMY_GR_INDEX -! ##################### -INTERFACE - FUNCTION DUMMY_GR_INDEX(HFIELD,HDUMMY_GR_NAME) RESULT(KINDEX) -! -CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! name of PGD field -CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HDUMMY_GR_NAME ! names of PGD field -INTEGER :: KINDEX ! index of this field -! -END FUNCTION DUMMY_GR_INDEX -END INTERFACE -END MODULE MODI_DUMMY_GR_INDEX -! -! ######################################### - FUNCTION DUMMY_GR_INDEX(HFIELD,HDUMMY_GR_NAME) RESULT(KINDEX) -! ######################################### -! -!! -!! PURPOSE -!! ------- -!! -!! routine to retrive the index of a PGD field in LNOCLASS_PGD array -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 15/12/97 -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -use mode_msg -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -! -CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! name of PGD field -CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HDUMMY_GR_NAME ! names of PGD field -INTEGER :: KINDEX ! index of this field -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: JDUMMY ! loop control -!------------------------------------------------------------------------------- -! -DO JDUMMY=1,1000 - IF (HFIELD==HDUMMY_GR_NAME(JDUMMY)) THEN - KINDEX = JDUMMY - RETURN - END IF - IF (LEN_TRIM(HFIELD)==0) THEN - call Print_msg(NVERB_FATAL,'GEN','DUMMY_GR_INDEX','LEN_TRIM(HFIELD)=0') - ENDIF -END DO -!------------------------------------------------------------------------------- -! -END FUNCTION DUMMY_GR_INDEX diff --git a/src/MNH/elec_trid.f90 b/src/MNH/elec_trid.f90 deleted file mode 100644 index 2a8c5aad1..000000000 --- a/src/MNH/elec_trid.f90 +++ /dev/null @@ -1,679 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_ELEC_TRID -! ##################### -! -INTERFACE -! - SUBROUTINE ELEC_TRID(HLBCX,HLBCY, & - PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & - PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY,PEPOTFW_TOP ) -! -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 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! scale factor -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -! -REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction -REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction -! -REAL, INTENT(OUT) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(OUT) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(OUT) :: PRHOM ! mean of XRHODJ on the plane - ! x y localized at a mass - ! level -! -REAL, DIMENSION(:), INTENT(OUT) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFY ! elements (yslice) of the tri-diag. - ! matrix in the pressure eq. -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEPOTFW_TOP ! top boundary condition of - ! the tri-diag. system; it - ! has the dimension of an - ! electrical potential -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXY ! - along y - -! -END SUBROUTINE ELEC_TRID -! -END INTERFACE -! -END MODULE MODI_ELEC_TRID -! -! ################################################################### - SUBROUTINE ELEC_TRID(HLBCX,HLBCY, & - PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & - PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY,PEPOTFW_TOP ) -! #################################################################### -! -!!**** *ELEC_TRID * - Compute coefficients for the flat operator to get the -!! electric potential from the Gauss equation -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical time independent -! coefficients a(k), b(k), c(k) required for the calculation of the "flat" -! (i.e. neglecting the orography) operator Laplacian. RHOJ is averaged on -! the whole horizontal domain. The form of the eigenvalues of the flat -! operator depends on the lateral boundary conditions. Furthermore, this -! routine initializes TRIGS and IFAX arrays required for the FFT transform -! used in the routine PRECOND. -! ELEC_TRID (to invert the Gauss equation) differs from TRID (to solve the -! pressure equation) by the bottom boundary condition, here Dirichlet -! instead of Neumann, because the earth surface is conductive so it is a -! surface with an electrical equipotential referenced to zero. -! -!!** METHOD -!! ------ -!! The forms of the eigenvalues of the horizontal Laplacian are given by: -!! Cyclic conditions: -!! ----------------- -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( imax ) <dyy> <dyy> ( jmax ) -!! -!! Open conditions: -!! ----------------- -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( 2imax ) <dyy> <dyy> ( 2jmax ) -!! -!! Cyclic condition along x and open condition along y: -!! ------------------------------------------------------ -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( imax ) <dyy> <dyy> ( 2jmax ) -!! -!! Open condition along x and cyclic condition along y: -!! ------------------------------------------------------ -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( 2imax ) <dyy> <dyy> ( jmax ) -!! -!! where m = 0,1,2....imax-1, n = 0,1,2....jmax-1 -!! Note that rhoj contains the Jacobian J = Deltax*Deltay*Deltaz = volume of -!! an elementary mesh. - -!! -!! EXTERNAL -!! -------- -!! Function FFTFAX: initialization of TRIGSX,IFAXX,TRIGSY,IFAXY for -!! the FFT transform -!! GET_DIM_EXT_ll : get extended sub-domain sizes -!! GET_INDICE_ll : get physical sub-domain bounds -!! GET_DIM_PHYS_ll : get physical sub-domain sizes -!! GET_GLOBALDIMS_ll : get physical global domain sizes -!! GET_OR_ll : get origine coordonates of the physical sub-domain -!! in global indices -!! REDUCESUM_ll : sum into a scalar variable -!! GET_SLICE_ll : get a slice of the global domain -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : define constants -!! XPI : pi -!! XCPD -!! Module MODD_PARAMETERS: declaration of parameter variables -!! JPHEXT, JPVEXT: define the number of marginal points out of the -!! physical domain along horizontal and vertical directions respectively -!! Module MODD_CONF: model configurations -!! LCARTESIAN: logical for CARTESIAN geometry -!! .TRUE. = Cartesian geometry used -!! L2D: logical for 2D model version -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine ELEC_TRID) -!! -!! AUTHOR -!! ------ -!! P. HÃ…reil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/07/94 -!! 14/04/95 (J. Stein) bug in the ZDZM computation -!! ( stretched case) -!! 8/07/96 (P. Jabouille) change the FFT initialization -!! which now works for odd number. -!! 14/01/97 Durran anelastic equation (Stein,Lafore) -!! 15/06/98 (D.Lugato, R.Guivarch) Parallelisation -!! 10/08/98 (N. Asencio) add parallel code -!! use PDXHAT, PDYHAT and not PXHAT,PYHAT -!! PBFY is initialized -!! 20/08/00 (J. Stein, J. Escobar) optimisation of the solver -!! PBFY transposition -!! 14/03/02 (P. Jabouille) set values for meaningless spectral coefficients -!! (to avoid problem in bouissinesq configuration) -!! 01/07/12 (J-P. Pinty) add a non-homogeneous fair-weather -!! top boundary condition (Neuman) -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CST -USE MODD_CONF -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAMETERS -! -USE MODE_ll -USE MODE_MSG -! -!JUAN -USE MODE_REPRO_SUM -!JUAN -! -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 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! scale factor -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -! -REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction -REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction -! -REAL, INTENT(OUT) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(OUT) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(OUT) :: PRHOM ! mean of XRHODJ on the plane - ! x y localized at a mass - ! level -! -REAL, DIMENSION(:), INTENT(OUT) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFY ! elements (yslice) of the tri-diag. -! matrix in the pressure eq. which is transposed. PBFY is a y-slices structure -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEPOTFW_TOP ! top boundary condition of - ! the tri-diag. system; it - ! has the dimension of an - ! electrical potential -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXY ! - along y - -! -!* 0.2 declarations of local variables -! -INTEGER :: IRESP ! FM return code -INTEGER :: ILUOUT ! Logical unit number for - ! output-listing -INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! indice values of the physical subdomain -INTEGER :: IKU ! size of the arrays along z -INTEGER :: IIB_ll,IIE_ll,IJB_ll,IJE_ll ! indice values of the physical global domain -INTEGER :: IIMAX,IJMAX ! Number of points of the physical subdomain -INTEGER :: IIMAX_ll,IJMAX_ll ! Number of points of Global physical domain -! -INTEGER :: JI,JJ,JK ! loop indexes -! -INTEGER :: INN ! temporary result for the computation of array TRIGS -! -REAL, DIMENSION (:,:), ALLOCATABLE :: ZEIGEN_ll ! eigenvalues b(m,n) in global representation -REAL, DIMENSION (:), ALLOCATABLE :: ZEIGENX_ll ! used for the computation of ZEIGEN_ll -! -REAL, DIMENSION( SIZE(PDXHAT)) :: ZWORKX ! work array to compute PDXHATM -REAL, DIMENSION( SIZE(PDYHAT)) :: ZWORKY ! work array to compute PDYHATM -! -REAL :: ZGWNX,ZGWNY ! greater wave numbers allowed by the model - ! configuration in x and y directions respectively -! -REAL, DIMENSION (SIZE(PZZ,3)) :: ZDZM ! mean of deltaz on the plane x y - ! localized at a w-level -! -REAL :: ZANGLE,ZDEL ! needed for the initialization of the arrays used by the FFT -! -REAL :: ZINVMEAN ! inverse of inner points number in an horizontal grid -! -INTEGER :: IINFO_ll ! return code of parallel routine -REAL, DIMENSION (SIZE(PMAP,1)) :: ZXMAP ! extraction of PMAP array along x -REAL, DIMENSION (SIZE(PMAP,2)) :: ZYMAP ! extraction of PMAP array along y -INTEGER :: IORXY_ll,IORYY_ll ! origin's coordinates of the y-slices subdomain -INTEGER :: IIUY_ll,IJUY_ll ! dimensions of the y-slices subdomain -INTEGER :: IXMODE_ll,IYMODE_ll ! number of modes in the x and y direction for global point of view -INTEGER :: IXMODEY_ll,IYMODEY_ll ! number of modes in the x and y direction for y_slice point of view -!JUAN16 -!TYPE(DOUBLE_DOUBLE) , DIMENSION (SIZE(PZZ,3)) :: ZRHOM_ll , ZDZM_ll -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZRHOM_2D , ZDZM_2D -!JUAN16 -! -! -! -! -! -!------------------------------------------------------------------------------ -! -!* 1. INITIALIZATION -! -------------- -! -!* 1.1 retrieve a logical unit number -! ------------------------------ -! -ILUOUT = TLUOUT%NLU -! -!* 1.2 compute loop bounds -! ------------------- -! -! extended sub-domain -CALL GET_DIM_EXT_ll ('Y',IIUY_ll,IJUY_ll) -IKU=SIZE(PRHODJ,3) -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1 +JPVEXT -IKE=IKU -JPVEXT -! physical sub-domain -CALL GET_DIM_PHYS_ll ( 'B',IIMAX,IJMAX) -! -! global physical domain limits -CALL GET_GLOBALDIMS_ll ( IIMAX_ll, IJMAX_ll) -IIB_ll = 1 + JPHEXT -IIE_ll = IIMAX_ll + JPHEXT -IJB_ll = 1 + JPHEXT -IJE_ll = IJMAX_ll + JPHEXT -! -! the use of local array ZEIGENX and ZEIGEN would require some technical modifications -! -ALLOCATE (ZEIGENX_ll(IIMAX_ll + 2*JPHEXT)) -ALLOCATE (ZEIGEN_ll(IIMAX_ll + 2*JPHEXT, IJMAX_ll + 2*JPHEXT)) -ZEIGEN_ll = 0.0 -! Get the origin coordinates of the extended sub-domain in global landmarks -CALL GET_OR_ll('Y',IORXY_ll,IORYY_ll) -! -!* 1.3 allocate x-slice array - -! -!* 1.4 variables for the eigenvalues computation -! -ZGWNX = XPI/REAL(IIMAX_ll) -ZGWNY = XPI/REAL(IJMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 2. COMPUTE THE AVERAGE OF RHOJ*CPD*THETAVREF ALONG XY -! -------------------------------------------------- -! -ZINVMEAN = 1./REAL(IIMAX_ll*IJMAX_ll) -!JUAN16 -ALLOCATE(ZRHOM_2D(IIB:IIE, IJB:IJE)) -! -DO JK = 1,SIZE(PZZ,3) - IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*XCPD*PTHVREF(JI,JJ,JK)*ZINVMEAN - END DO - END DO - ELSEIF ( CEQNSYS == 'LHE' ) THEN - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*ZINVMEAN - END DO - END DO - END IF - ! global sum - PRHOM(JK) = SUM_DD_R2_ll(ZRHOM_2D) -END DO - -! -! global sum -!CALL REDUCESUM_ll(ZRHOM_ll,IINFO_ll) -!PRHOM = ZRHOM_ll -!JUAN16 -! -!------------------------------------------------------------------------------ -! -!* 3. COMPUTE THE MEAN INCREMENT BETWEEN Z LEVELS -! ------------------------------------------- -! -!JUAN16 -!ZDZM_ll = 0. -ALLOCATE(ZDZM_2D(IIB:IIE, IJB:IJE)) -! -DO JK = IKB-1,IKE - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZDZM_2D(JI,JJ) = (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK))*ZINVMEAN - END DO - END DO - ZDZM(JK) = SUM_DD_R2_ll(ZDZM_2D) -END DO -ZDZM(IKE+1) = ZDZM(IKE) -! -! global sum -!CALL REDUCESUM_ll(ZDZM_ll,IINFO_ll) -!ZDZM = ZDZM_ll -!JUAN16 -! -! -! vertical average to arrive at a w-level -DO JK = IKE+1,IKB,-1 - ZDZM(JK) = (ZDZM(JK) + ZDZM(JK-1))*0.5 -END DO -! -ZDZM(IKB-1) = -999. -! -!------------------------------------------------------------------------------ -! -!* 4. COMPUTE THE MEAN INCREMENT BETWEEN X LEVELS -! ------------------------------------------- -! -PDXHATM =0. -! . local sum -IF (LCARTESIAN) THEN - PDXHATM = SUM_1DFIELD_ll ( PDXHAT,'X',IIB_ll,IIE_ll,IINFO_ll) -ELSE - ! Extraction of x-slice PMAP at j=(IJB_ll+IJE_ll)/2 - CALL GET_SLICE_ll (PMAP,'X',(IJB_ll+IJE_ll)/2,ZXMAP(IIB:IIE) & - ,IIB,IIE,IINFO_ll) - ! initialize the work array = PDXHAT/ZXMAP - ZWORKX(IIB:IIE) = PDXHAT(IIB:IIE)/ ZXMAP (IIB:IIE) - PDXHATM = SUM_1DFIELD_ll ( ZWORKX,'X',IIB_ll,IIE_ll,IINFO_ll) -END IF -! . division to complete sum -PDXHATM = PDXHATM / REAL(IIMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 5. COMPUTE THE MEAN INCREMENT BETWEEN Y LEVELS -! ------------------------------------------- -! -PDYHATM = 0. -IF (LCARTESIAN) THEN - PDYHATM = SUM_1DFIELD_ll ( PDYHAT,'Y',IJB_ll,IJE_ll,IINFO_ll) -ELSE - ! Extraction of y-slice PMAP at i=IIB_ll+IIE_ll/2 - CALL GET_SLICE_ll (PMAP,'Y',(IIB_ll+IIE_ll)/2,ZYMAP(IJB:IJE) & - ,IJB,IJE,IINFO_ll) - ! initialize the work array = PDYHAT / ZYMAP - ZWORKY(IJB:IJE) = PDYHAT(IJB:IJE) / ZYMAP (IJB:IJE) - PDYHATM = SUM_1DFIELD_ll ( ZWORKY,'Y',IJB_ll,IJE_ll,IINFO_ll) -END IF -! . division to complete sum -PDYHATM= PDYHATM / REAL(IJMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 6. COMPUTE THE OUT-DIAGONAL ELEMENTS A AND C OF THE MATRIX -! ------------------------------------------------------- -! -DO JK = IKB,IKE - PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 - PCF(JK) = 0.5 * ( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1) **2 -END DO -! -! at the upper and lower levels PAF and PCF are computed using the Neumann -! conditions applying on the vertical component of the gradient -! -! -! Neumann boundary condition (top of atmosphere) -! -PAF(IKE+1) = -0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 -! -! Dirichlet boundary condition (earth surface) -! -PCF(IKB-1) = 0.0 -! -PAF(IKB-1) = 999. -PCF(IKE+1) = 999. -!------------------------------------------------------------------------------ -!* 7. COMPUTE THE DIAGONAL ELEMENTS B OF THE MATRIX -! --------------------------------------------- -! -!* 7.1 compute the horizontal eigenvalues -! -! -!* 7.1.1 compute the eigenvalues along the x direction -! -SELECT CASE (HLBCX(1)) -! in the cyclic case, the eigenvalues are the same for two following JM values: -! it corresponds to the real and complex parts of the FFT - CASE('CYCL') ! cyclic case - IXMODE_ll = IIMAX_ll+2 - IXMODEY_ll = IIUY_ll -! - DO JI = 1,IXMODE_ll - ZEIGENX_ll(JI) = - ( 2. * SIN ( (JI-1)/2*ZGWNX ) / PDXHATM )**2 - END DO - CASE DEFAULT ! other cases - IXMODE_ll = IIMAX_ll -! -! - IF (LEAST_ll(HSPLITTING='Y')) THEN - IXMODEY_ll = IIUY_ll - 2 - ELSE - IXMODEY_ll = IIUY_ll - END IF -! -! - DO JI = 1,IXMODE_ll - ZEIGENX_ll(JI) = - ( 2. *SIN (0.5*REAL(JI-1)*ZGWNX ) / PDXHATM )**2 - END DO -END SELECT -! -!* 7.1.2 compute the eventual eigenvalues along the y direction -! -IF (.NOT. L2D) THEN -! -! y lateral boundary conditions for three-dimensional cases -! - SELECT CASE (HLBCY(1)) -! in the cyclic case, the eigenvalues are the same for two following JN values: -! it corresponds to the real and complex parts of the FFT result -! - CASE('CYCL') ! 3D cyclic case - IYMODE_ll = IJMAX_ll+2 - IYMODEY_ll = IJUY_ll -! - DO JJ = 1,IYMODE_ll - DO JI = 1,IXMODE_ll - ZEIGEN_ll(JI,JJ) = ZEIGENX_ll(JI) - & - ( 2.* SIN ( (JJ-1)/2*ZGWNY ) / PDYHATM )**2 - END DO - END DO -! - CASE DEFAULT ! 3D non-cyclic cases - IYMODE_ll = IJMAX_ll - IYMODEY_ll = IJUY_ll - 2 -! - DO JJ = 1,IYMODE_ll - DO JI = 1,IXMODE_ll - ZEIGEN_ll(JI,JJ) = ZEIGENX_ll(JI) - ( 2.* SIN (0.5*REAL(JJ-1)*ZGWNY ) / & - PDYHATM )**2 - END DO - END DO -! - END SELECT -ELSE -! -! copy the x eigenvalue array in a 2D array for a 2D case -! - IYMODE_ll = 1 - IYMODEY_ll = 1 - ZEIGEN_ll(1:IXMODE_ll,1)=ZEIGENX_ll(1:IXMODE_ll) -! -END IF -! -DEALLOCATE(ZEIGENX_ll) -! -!* 7.2 compute the matrix diagonal elements -! -! -PBFY = 1. -IF (L2D) THEN - DO JK= IKB,IKE - DO JJ= 1, IYMODEY_ll - DO JI= 1, IXMODEY_ll - PBFY(JI,JJ,JK) = PRHOM(JK)* ZEIGEN_ll(JI+IORXY_ll-1,JJ+IORYY_ll-1) - 0.5 * & - ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & - +( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1)**2 ) - END DO - END DO - END DO -! at the upper and lower levels PBFY is computed using the Neumann -! condition -! - PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKB) = PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKB) - & - PAF(IKB) - PAF(IKB) = 0.0 - PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKB-1) = 1.0 - ! - PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & - ZDZM(IKE+1) **2 - ! - ! -ELSE - DO JK= IKB,IKE - DO JJ= 1, IYMODEY_ll - DO JI= 1, IXMODEY_ll - PBFY(JJ,JI,JK) = PRHOM(JK)* ZEIGEN_ll(JI+IORXY_ll-1,JJ+IORYY_ll-1) - 0.5 * & - ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & - +( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1)**2 ) - END DO - END DO - END DO -! at the upper and lower levels PBFY is computed using the Neumann -! condition -! - PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKB) = PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKB) - & - PAF(IKB) - PAF(IKB) = 0.0 - PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKB-1) = 1.0 - ! - PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & - ZDZM(IKE+1) **2 - ! -END IF -! -DEALLOCATE(ZEIGEN_ll) -! -! second coefficent is meaningless in cyclic case -IF (HLBCX(1) == 'CYCL' .AND. L2D) PBFY(2,:,:)=1. -IF (HLBCX(1) == 'CYCL' .AND. .NOT.(L2D) .AND. LWEST_ll(HSPLITTING='Y')) PBFY(:,2,:)=1. -IF (HLBCY(1) == 'CYCL' .AND. .NOT.(L2D)) PBFY(2,:,:)=1. -! -!------------------------------------------------------------------------------ -!* 8. INITIALIZATION OF THE TRIGS AND IFAX ARRAYS FOR THE FFT -! ------------------------------------------------------- -! -! 8.1 x lateral boundary conditions -! -CALL SET99(PTRIGSX,KIFAXX,IIMAX_ll) -! -! test on the value of KIMAX: KIMAX must be factorizable as a product -! of powers of 2,3 and 5. KIFAXX(10) is equal to IIMAX if the decomposition -! is correct, then KIFAXX(1) contains the number of decomposition factors -! of KIMAX. -! -IF (KIFAXX(10) /= IIMAX_ll) THEN - WRITE(UNIT=ILUOUT,FMT="(' ERROR',/, & - &' : THE FORM OF THE FFT USED FOR THE INVERSION OF THE FLAT ',/,& - &' OPERATOR REQUIRES THAT KIMAX MUST BE FACTORIZABLE' ,/,& - & ' AS A PRODUCT OF POWERS OF 2, 3 AND 5.')") - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','ELEC_TRID','') -END IF -! -IF (HLBCX(1) /= 'CYCL') THEN -! -! extra trigs for shifted (co) sine transform (FFT55) -! - INN=2*(IIMAX_ll) - ZDEL=ASIN(1.0)/REAL(IIMAX_ll) - DO JI=1,IIMAX_ll - ZANGLE=REAL(JI)*ZDEL - PTRIGSX(INN+JI)=SIN(ZANGLE) - END DO -! -ENDIF -! -! 8.2 y lateral boundary conditions -! -IF (.NOT. L2D) THEN - CALL SET99(PTRIGSY,KIFAXY,IJMAX_ll) - ! - ! test on the value of KJMAX: KJMAX must be factorizable as a product - ! of powers of 2,3 and 5. KIFAXY(10) is equal to IJMAX_ll if the decomposition - ! is correct, then KIFAXX(1) contains the number of decomposition factors - ! of IIMAX_ll. - ! - IF (KIFAXY(10) /= IJMAX_ll) THEN - WRITE(UNIT=ILUOUT,FMT="(' ERROR',/, & - &' : THE FORM OF THE FFT USED FOR THE INVERSION OF THE FLAT ',/,& - &' OPERATOR REQUIRES THAT KJMAX MUST BE FACTORIZABLE' ,/,& - & ' AS A PRODUCT OF POWERS OF 2, 3 AND 5.')") - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','ELEC_TRID','') - END IF - ! - ! 8.3 top boundary conditions - ! - PEPOTFW_TOP(:,:) = PEPOTFW_TOP(:,:) / ZDZM(IKE+1) - - ! - ! other cases - ! - IF (HLBCY(1) /= 'CYCL') THEN - ! - ! extra trigs for shifted (co) sine transform - ! - INN=2*(IJMAX_ll) - ZDEL=ASIN(1.0)/REAL(IJMAX_ll) - DO JJ=1,IJMAX_ll - ZANGLE=REAL(JJ)*ZDEL - PTRIGSY(INN+JJ)=SIN(ZANGLE) - END DO - ! - ENDIF - ! -ENDIF -! -!------------------------------------------------------------------------------ -! -END SUBROUTINE ELEC_TRID diff --git a/src/MNH/fct_met.f90 b/src/MNH/fct_met.f90 deleted file mode 100644 index b484dc593..000000000 --- a/src/MNH/fct_met.f90 +++ /dev/null @@ -1,363 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_FCT_MET -! ###################### -! -INTERFACE - SUBROUTINE FCT_MET (HLBCX, HLBCY, KRR, & - PTSTEP, PRHODJ, PTHM, PRM, PTKEM, & - PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, INTENT(IN) :: PTSTEP ! Double Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM, PTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariant component of - ! momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -! -END SUBROUTINE FCT_MET -! -END INTERFACE -! -END MODULE MODI_FCT_MET -! -! -! -! ##################################################################### - SUBROUTINE FCT_MET (HLBCX, HLBCY, KRR, & - PTSTEP, PRHODJ, PTHM, PRM, PTKEM, & - PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -! ##################################################################### -! -!!**** *FCT_MET * - routine to call the Flux-Corrected Transport for -!! meteorological scalars -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to call the FLUX-CORRected routine -!! for meteorological scalars variables. -!! -!!** METHOD -!! ------ -!! The Flux-Corrected Transport method correct the fluxes using a limiting -!! factor. This method ensures that the advection scheme is definite -!! positive. A minimum value of the scalar (MIN) equal to 0 is used for -!! the positiveness of the scheme. -!! -!! EXTERNAL -!! -------- -!! Functions MXM,MYM,MZM : computes the averages along three directins -!! Functions DXF,DYF,DZF : computes the finite differences -!! Subroutine FLUX_CORR : corrects the advective fluxes -!! Subroutine BUDGET : stores the sources for budget purposes -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_BUDGET : LBU_R* ( individual budget switches) -!! CBUTYPE, NBUMOD -!! REFERENCE -!! --------- -!! Book1 and book2 ( routine ADVECTION ) -!! -!! AUTHOR -!! ------ -!! J. Vila & JP. Lafore *Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/10/94 -!! Stein 27/06/96 add the budgets -!! Pinty 20/12/96 update the budgets -!! Lafore 27/03/98 call to DFLUX_CORR -!! Lafore 01/04/98 FCT only on total water (rv+rc+ri) and -!! precipitating hydrometeors, -!! remove 4D flux local arrays -!! Stein 20/04/99 remove KMI from the list of argument of DFLUX_CORR -!! Masson 07/11/02 update the budgets -!! Lac 24/04/06 split meteorological and passive tracer routines -!! 05/06 Remove KEPS -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET -USE MODI_SHUMAN -USE MODI_DFLUX_CORR -USE MODI_BUDGET -USE MODD_GRID_n -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, INTENT(IN) :: PTSTEP ! Double Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM, PTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariant component of - ! momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -! -! -!* 0.2 declarations of local variables -! -INTEGER :: JRR - ! Loop index -! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) & - :: ZFX ,ZFY ,ZFZ ! Advective flux components for each -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & - ZRTFX,ZRTFY,ZRTFZ ! variables and for total water (rv+rc+ri) -! -REAL :: ZMINR,ZMINTKE - ! Absolute minimum values of - ! water substances, TKE -!------------------------------------------------------------------------------- -! -!* 1. FLUX-CORRECTED TRANSPORT ADVECTION SCHEME for the HMET group -! -! -!* 1.1 Temperature: ---> advected by a CEN scheme - ! NB! It is not necessary to make the - ! flux correction since temperature is - ! always positive. -! -! - PRTHS(:,:,:) = PRTHS(:,:,:) & - - DXF(PRUCT(:,:,:)*MXM (PTHT(:,:,:))) - IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVX_BU_RTH') -! - PRTHS(:,:,:) = PRTHS(:,:,:) & - - DYF(PRVCT(:,:,:)*MYM (PTHT(:,:,:))) - IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVY_BU_RTH') -! - PRTHS(:,:,:) = PRTHS(:,:,:) & - - DZF(PRWCT(:,:,:)*MZM (PTHT(:,:,:))) - IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVZ_BU_RTH') -! -!* 1.2 No condensation case: Vapor ---> advected by a FCT scheme -! - ZMINR=0. ! Absolute minimum water substances -! - IF (KRR == 1) THEN - CALL DFLUX_CORR (HLBCX, HLBCY, PTSTEP, ZMINR, PRHODJ, & - PRM(:,:,:,1), PRT(:,:,:,1), & - PRUCT, PRVCT, PRWCT, & - ZFX(:,:,:), ZFY(:,:,:), ZFZ(:,:,:) ) -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DXF(ZFX(:,:,:)) - IF (LBUDGET_RV) & - CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVX_BU_RRV') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DYF(ZFY(:,:,:)) - IF (LBUDGET_RV) & - CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVY_BU_RRV') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZFZ(:,:,:)) - IF (LBUDGET_RV) & - CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') - END IF -! -!* 1.3 No ice case: rv+rc ---> advected by the FCT scheme -! rc ---> advected by the CEN scheme -! - IF (KRR == 2 .OR. KRR == 3 ) THEN - CALL DFLUX_CORR (HLBCX,HLBCY,PTSTEP,ZMINR,PRHODJ, & - PRM(:,:,:,1)+PRM(:,:,:,2),PRT(:,:,:,1)+PRT(:,:,:,2), & - PRUCT, PRVCT, PRWCT, & - ZRTFX(:,:,:),ZRTFY(:,:,:),ZRTFZ(:,:,:) ) -! - ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,2)) ! - ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,2)) ! CENtred scheme for rc - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,2)) ! -! - ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! - ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv fluxes deduction - ZRTFZ(:,:,:) = ZRTFZ(:,:,:) - ZFZ(:,:,:) ! -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DXF(ZRTFX(:,:,:)) - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DXF( ZFX(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVX_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVX_BU_RRC') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DYF(ZRTFY(:,:,:)) - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DYF( ZFY(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVY_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVY_BU_RRC') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZRTFZ(:,:,:)) - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF( ZFZ(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') -! - END IF -! -!* 1.4 Ice case: rv+rc+ri ---> advected by the FCT scheme -! rc ---> advected by the CEN scheme -! ri ---> advected by the CEN scheme -! - IF ( KRR >= 4 ) THEN - CALL DFLUX_CORR (HLBCX,HLBCY,PTSTEP,ZMINR,PRHODJ, & - PRM(:,:,:,1)+PRM(:,:,:,2)+PRM(:,:,:,4), & - PRT(:,:,:,1)+PRT(:,:,:,2)+PRT(:,:,:,4), & - PRUCT, PRVCT, PRWCT, & - ZRTFX(:,:,:),ZRTFY(:,:,:),ZRTFZ(:,:,:) ) -! - ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,2)) ! - ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,2)) ! CENtred scheme for rc - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,2)) ! -! - ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! - ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv+ri fluxes deduction - ZRTFZ(:,:,:) = ZRTFZ(:,:,:) - ZFZ(:,:,:) ! -! - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DXF( ZFX(:,:,:)) - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVX_BU_RRC') -! - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DYF( ZFY(:,:,:)) - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVY_BU_RRC') -! - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF( ZFZ(:,:,:)) - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') -! -! - ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,4)) ! - ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,4)) ! CENtred scheme for ri - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,4)) ! -! - ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! - ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv fluxes deduction - ZRTFZ(:,:,:) = ZRTFZ(:,:,:) - ZFZ(:,:,:) ! -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DXF(ZRTFX(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - DXF( ZFX(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVX_BU_RRV') - IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVX_BU_RRI') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DYF(ZRTFY(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - DYF( ZFY(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVY_BU_RRV') - IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVY_BU_RRI') -! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZRTFZ(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - DZF( ZFZ(:,:,:)) - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') - IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVZ_BU_RRI') -! - END IF -! -!* 1.5 Rain case: rr ---> advected by the FCT scheme -! - IF ( KRR >= 3 ) THEN - CALL DFLUX_CORR (HLBCX, HLBCY, & - PTSTEP, ZMINR, PRHODJ, PRM(:,:,:,3), PRT(:,:,:,3), & - PRUCT, PRVCT, PRWCT, & - ZFX(:,:,:), ZFY(:,:,:), ZFZ(:,:,:) ) -! - PRRS(:,:,:,3) = PRRS(:,:,:,3) - DXF( ZFX(:,:,:)) - IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVX_BU_RRR') -! - PRRS(:,:,:,3) = PRRS(:,:,:,3) - DYF( ZFY(:,:,:)) - IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVY_BU_RRR') -! - PRRS(:,:,:,3) = PRRS(:,:,:,3) - DZF( ZFZ(:,:,:)) - IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVZ_BU_RRR') -! - END IF -! -!* 1.6 Other hydrometeors: rs,rg,rh ---> advected by the FCT scheme -! - DO JRR = 5, KRR - CALL DFLUX_CORR (HLBCX, HLBCY, & - PTSTEP, ZMINR, PRHODJ, PRM(:,:,:,JRR), PRT(:,:,:,JRR), & - PRUCT, PRVCT, PRWCT, & - ZFX(:,:,:), ZFY(:,:,:), ZFZ(:,:,:) ) -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) - DXF(ZFX(:,:,:)) - IF (JRR==5.AND.LBUDGET_RS) & - CALL BUDGET (PRRS(:,:,:,5),10,'ADVX_BU_RRS') - IF (JRR==6.AND.LBUDGET_RG) & - CALL BUDGET (PRRS(:,:,:,6),11,'ADVX_BU_RRG') - IF (JRR==7.AND.LBUDGET_RH) & - CALL BUDGET (PRRS(:,:,:,7),12,'ADVX_BU_RRH') -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) - DYF(ZFY(:,:,:)) - IF (JRR==5.AND.LBUDGET_RS) & - CALL BUDGET (PRRS(:,:,:,5),10,'ADVY_BU_RRS') - IF (JRR==6.AND.LBUDGET_RG) & - CALL BUDGET (PRRS(:,:,:,6),11,'ADVY_BU_RRG') - IF (JRR==7.AND.LBUDGET_RH) & - CALL BUDGET (PRRS(:,:,:,7),12,'ADVY_BU_RRH') -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) - DZF(ZFZ(:,:,:)) - IF (JRR==5.AND.LBUDGET_RS) & - CALL BUDGET (PRRS(:,:,:,5),10,'ADVZ_BU_RRS') - IF (JRR==6.AND.LBUDGET_RG) & - CALL BUDGET (PRRS(:,:,:,6),11,'ADVZ_BU_RRG') - IF (JRR==7.AND.LBUDGET_RH) & - CALL BUDGET (PRRS(:,:,:,7),12,'ADVZ_BU_RRH') -! - END DO -! -!* 1.6 TKE ---> advected by the FCT scheme -! - IF (SIZE(PTKET,1) /= 0) THEN -! - ZMINTKE=0. ! Absolute minimum TKE -! - CALL DFLUX_CORR (HLBCX, HLBCY, & - PTSTEP, ZMINTKE, PRHODJ, PTKEM,PTKET, & - PRUCT, PRVCT, PRWCT, & - ZFX(:,:,:), ZFY(:,:,:), ZFZ(:,:,:) ) -! - PRTKES(:,:,:) = PRTKES(:,:,:) - DXF(ZFX(:,:,:)) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVX_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) - DYF(ZFY(:,:,:)) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVY_BU_RTKE') -! - PRTKES(:,:,:) = PRTKES(:,:,:) - DZF(ZFZ(:,:,:)) - IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVZ_BU_RTKE') -! - END IF -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE FCT_MET diff --git a/src/MNH/fct_scalar.f90 b/src/MNH/fct_scalar.f90 deleted file mode 100644 index b37661bd0..000000000 --- a/src/MNH/fct_scalar.f90 +++ /dev/null @@ -1,166 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_FCT_SCALAR -! ###################### -! -INTERFACE - SUBROUTINE FCT_SCALAR (HLBCX, HLBCY, KSV, & - PTSTEP, PRHODJ, PSVM, PSVT, & - PRUCT, PRVCT, PRWCT, PRSVS ) -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, INTENT(IN) :: PTSTEP ! Double Time step -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariant component of - ! momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -! -END SUBROUTINE FCT_SCALAR -! -END INTERFACE -! -END MODULE MODI_FCT_SCALAR -! -! -! -! ##################################################################### - SUBROUTINE FCT_SCALAR (HLBCX, HLBCY, KSV, & - PTSTEP, PRHODJ, PSVM, PSVT, & - PRUCT, PRVCT, PRWCT, PRSVS ) -! ##################################################################### -! -!!**** *FCT_SCALAR * - routine to call the Flux-Corrected Transport Scalar -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to call the FLUX-CORRected routine -!! for scalar variables (tracers). -!! -!!** METHOD -!! ------ -!! The Flux-Corrected Transport method correct the fluxes using a limiting -!! factor. This method ensures that the advection scheme is definite -!! positive. A minimum value of the scalar (MIN) equal to 0 is used for -!! the positiveness of the scheme. -!! -!! EXTERNAL -!! -------- -!! Functions MXM,MYM,MZM : computes the averages along three directins -!! Functions DXF,DYF,DZF : computes the finite differences -!! Subroutine FLUX_CORR : corrects the advective fluxes -!! Subroutine BUDGET : stores the sources for budget purposes -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_BUDGET : LBU_R* ( individual budget switches) -!! CBUTYPE, NBUMOD -!! REFERENCE -!! --------- -!! Book1 and book2 ( routine ADVECTION ) -!! -!! AUTHOR -!! ------ -!! J. Vila & JP. Lafore *Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/10/94 -!! Stein 27/06/96 add the budgets -!! Pinty 20/12/96 update the budgets -!! Lafore 27/03/98 call to DFLUX_CORR -!! Lafore 01/04/98 FCT only on total water (rv+rc+ri) and -!! precipitating hydrometeors, -!! remove 4D flux local arrays -!! Stein 20/04/99 remove KMI from the list of argument of DFLUX_CORR -!! Jabouille 22/06/01 use XSVMIN -!! Masson 07/11/02 update the budgets -!! Lac 24/04/06 Split scalar and passive tracer routines -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET -USE MODD_NSV, ONLY : XSVMIN -USE MODD_GRID_n -USE MODI_SHUMAN -USE MODI_DFLUX_CORR -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariant component of - ! momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -! -! -!* 0.2 declarations of local variables -! -INTEGER :: JSV - ! Loop index -! -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZFX ,ZFY ,ZFZ ! Advective flux components for each -! -!------------------------------------------------------------------------------- -! -!* 1. FLUX-CORRECTED TRANSPORT ADVECTION SCHEME for the HSV group -! -! -! -! - DO JSV = 1, KSV - CALL DFLUX_CORR (HLBCX,HLBCY,PTSTEP,XSVMIN(JSV),PRHODJ, & - PSVM(:,:,:,JSV),PSVT(:,:,:,JSV),PRUCT,PRVCT,PRWCT, & - ZFX(:,:,:),ZFY(:,:,:),ZFZ(:,:,:) ) -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) - DXF(ZFX(:,:,:)) - IF (LBUDGET_SV) & - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVX_BU_RSV') -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) - DYF(ZFY(:,:,:)) - IF (LBUDGET_SV) & - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVY_BU_RSV') -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) - DZF(ZFZ(:,:,:)) - IF (LBUDGET_SV) & - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVZ_BU_RSV') - END DO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE FCT_SCALAR diff --git a/src/MNH/ice4_sedimentation_split_old.f90 b/src/MNH/ice4_sedimentation_split_old.f90 deleted file mode 100644 index 47095b89e..000000000 --- a/src/MNH/ice4_sedimentation_split_old.f90 +++ /dev/null @@ -1,463 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_ICE4_SEDIMENTATION_SPLIT_OLD -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_SPLIT_OLD(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, KSPLITR, & - &PSEA, PTOWN, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PINPRH, PRHT, PRHS, PFPR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step integration for rain sedimendation -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_OLD -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_SPLIT_OLD -SUBROUTINE ICE4_SEDIMENTATION_SPLIT_OLD(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, KSPLITR, & - &PSEA, PTOWN, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PINPRH, PRHT, PRHS, PFPR) -!! -!!** PURPOSE -!! ------- -!! Computes the sedimentation -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET -USE MODD_CST -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM - -USE MODE_MSG -use mode_tools, only: Countjv - -USE MODI_BUDGET -USE MODI_GAMMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step integration for rain sedimendation -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -! -!* 0.2 declaration of local variables -! -! -LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: GSEDIM ! Test where to compute the SED processes -INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT - -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation - & ZRAY, & ! Cloud Mean radius - & ZLBC, & ! XLBC weighted by sea fraction - & ZFSEDC, & - & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step - & ZW, & ! work array - & ZRCT, & - & ZRRT, & - & ZRIT, & - & ZRST, & - & ZRGT, & - & ZRHT -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! sedimentation fluxes -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration -REAL :: ZINVTSTEP -INTEGER :: ISEDIM ! ! Case number of sedimentation -REAL :: ZTSPLITR ! Small time step for rain sedimentation -INTEGER :: JJ, JK, JN, JL -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -! -! -! O. Initialization of for sedimentation -! -ZINVTSTEP=1./PTSTEP -ZTSPLITR=PTSTEP/REAL(KSPLITR) -IF (OSEDIC) PINPRC (:,:) = 0. -PINPRR (:,:) = 0. -PINPRI (:,:) = 0. -PINPRS (:,:) = 0. -PINPRG (:,:) = 0. -IF ( KRR == 7 ) PINPRH (:,:) = 0. -! -!* 1. Parameters for cloud sedimentation -! -IF (OSEDIC) THEN - ZRAY(:,:,:) = 0. - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - - DO JK=KKTB, KKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO - ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) -ENDIF -! -!* 2. compute the fluxes -! -! optimization by looking for locations where -! the precipitating fields are larger than a minimal value only !!! -! For optimization we consider each variable separately -! -! External tendecies -IF (OSEDIC) ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)* ZINVTSTEP -ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)* ZINVTSTEP -ZPRIS(:,:,:) = PRIS(:,:,:)-PRIT(:,:,:)* ZINVTSTEP -ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)* ZINVTSTEP -ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)* ZINVTSTEP -IF ( KRR == 7 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)* ZINVTSTEP -! -! mr values inside the time-splitting loop -ZRCT(:,:,:) = PRCT(:,:,:) -ZRRT(:,:,:) = PRRT(:,:,:) -ZRIT(:,:,:) = PRIT(:,:,:) -ZRST(:,:,:) = PRST(:,:,:) -ZRGT(:,:,:) = PRGT(:,:,:) -IF (KRR==7) ZRHT(:,:,:) = PRHT(:,:,:) -! -DO JK = KKTB , KKTE - ZW(:,:,JK) =ZTSPLITR/(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) -END DO -! -DO JN = 1 , KSPLITR - !We add part of the external tendencies - IF (OSEDIC) ZRCT(:,:,:) = ZRCT(:,:,:) + ZPRCS(:,:,:)*ZTSPLITR - ZRRT(:,:,:) = ZRRT(:,:,:) + ZPRRS(:,:,:)*ZTSPLITR - ZRIT(:,:,:) = ZRIT(:,:,:) + ZPRIS(:,:,:)*ZTSPLITR - ZRST(:,:,:) = ZRST(:,:,:) + ZPRSS(:,:,:)*ZTSPLITR - ZRGT(:,:,:) = ZRGT(:,:,:) + ZPRGS(:,:,:)*ZTSPLITR - IF (KRR==7) ZRHT(:,:,:) = ZRHT(:,:,:) + ZPRHS(:,:,:)*ZTSPLITR - ! - ! - !* 2.1 for cloud - ! - IF (OSEDIC) THEN - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRCT(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(2) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &2, & - &ZRCT, PRCS, ZWSED, & - &ZRAY, ZLBC, ZFSEDC, ZCONC3D) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,2)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRC(:,:) = PINPRC(:,:) + ZWSED(:,:,KKB) / XRHOLW / KSPLITR - END IF - ! - !* 2.2 for rain - ! - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRRT(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(3) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &3, & - &ZRRT, PRRS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,3)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR - ! - !* 2.3 for pristine ice - ! - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRIT(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(4) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &4, & - &ZRIT, PRIS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,4)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRI(:,:) = PINPRI(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR - ! - !* 2.4 for aggregates/snow - ! - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRST(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(5) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &5, & - &ZRST, PRSS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,5)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR - ! - !* 2.5 for graupeln - ! - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRGT(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(6) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &6, & - &ZRGT, PRGS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,6)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR - ! - !* 2.6 for hail - ! - IF ( KRR == 7 ) THEN - GSEDIM(:,:,:)=.FALSE. - GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = & - ZRHT(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(7) - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &ISEDIM, GSEDIM, I1, I2, I3, & - &PRHODREF, ZW, PPABST, PTHT, PSEA, PTOWN, ZTSPLITR, PTSTEP, & - &7, & - &ZRHT, PRHS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,7)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR - END IF - ! -END DO -! -! -CONTAINS -! -! -!------------------------------------------------------------------------------- -! -! - SUBROUTINE INTERNAL_SEDIM_SPLI(KIT, KJT, KKT, KKL, & - &KSEDIM, LDSEDIM, I1, I2, I3, & - &PRHODREF, PTSORHODZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, PTOTAL_TSTEP, & - &KSPE, & - &PRXT, PRXS, PWSED, & - &PRAY, PLBC, PFSEDC, PCONC3D) - ! - !* 0. DECLARATIONS - ! ------------ - ! - USE MODD_RAIN_ICE_DESCR - USE MODD_RAIN_ICE_PARAM - ! - IMPLICIT NONE - ! - !* 0.1 Declarations of dummy arguments : - ! - INTEGER, INTENT(IN) :: KIT, KJT, KKT, KKL - INTEGER, INTENT(IN) :: KSEDIM - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LDSEDIM - INTEGER, DIMENSION(KSEDIM), INTENT(IN) :: I1, I2, I3 - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTSORHODZ ! TimeStep Over (Rhodref time delta Z) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST - REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask - REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT - REAL, INTENT(IN) :: PTSTEP ! small timestep - REAL, INTENT(IN) :: PTOTAL_TSTEP ! total timestep - INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXT ! mr of specy X - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE - REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D - ! - !* 0.2 declaration of local variables - ! - ! - character(len=10) :: yspe ! String for error message - INTEGER :: JK, JL, JI, JJ - REAL :: ZINVTOTAL_TSTEP - REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC - REAL :: ZFSED, ZEXSED - REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE - ! - !------------------------------------------------------------------------------- - ! - ! - !* 1. Parameters for cloud sedimentation - ! - ! - !* 2. compute the fluxes - ! - ! - ZINVTOTAL_TSTEP = 1./PTOTAL_TSTEP - PWSED(:,:,:) = 0. - IF(KSPE==2) THEN - !******* for cloud - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) - ZZWLBDC = ZZWLBDC**XLBEXC - ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC - ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) - ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) - ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) - PWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & - ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) - ENDDO - ELSEIF(KSPE==4) THEN - ! ******* for pristine ice - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI, JJ, JK) .GT. MAX(XRTMIN(4), 1.0E-7)) THEN - PWSED(JI, JJ, JK) = XFSEDI * PRXT(JI, JJ, JK) * & - & PRHODREF(JI,JJ,JK)**(1.-XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI - ENDIF - ENDDO - ELSE - ! ******* for other species - IF(KSPE==3) THEN - ZFSED=XFSEDR - ZEXSED=XEXSEDR - ELSEIF(KSPE==5) THEN - ZFSED=XFSEDS - ZEXSED=XEXSEDS - ELSEIF(KSPE==6) THEN - ZFSED=XFSEDG - ZEXSED=XEXSEDG - ELSEIF(KSPE==7) THEN - ZFSED=XFSEDH - ZEXSED=XEXSEDH - ELSE - write( yspe, '( I10 )' ) kspe - call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT_OLD', & - 'no sedimentation parameter for KSPE='//trim(yspe) ) - ENDIF - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - PWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED * & - PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) - ENDDO - ENDIF - ZMRCHANGE(:,:) = 0. - DO JK = KKTB , KKTE - ZMRCHANGE(:,:) = PTSORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK)) - PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) - PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTOTAL_TSTEP - ENDDO - END SUBROUTINE INTERNAL_SEDIM_SPLI - ! -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_OLD diff --git a/src/MNH/ice_c1r3.f90 b/src/MNH/ice_c1r3.f90 deleted file mode 100644 index 9d169e9e1..000000000 --- a/src/MNH/ice_c1r3.f90 +++ /dev/null @@ -1,190 +0,0 @@ -!MNH_LIC Copyright 1996-2019 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_ICE_C1R3 -! ###################### -! -INTERFACE - SUBROUTINE ICE_C1R3 (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PW_NU, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & - PCCT, PCRT, PCIT, PCNS, PCCS, PCRS, PINS, PCIS, & - PINPRS, PINPRG ) -! -! -! -LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the - ! cloud ice sedimentation -LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing -INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step - ! integration for ice sedimendation -REAL, INTENT(IN) :: PTSTEP ! Time step -INTEGER, INTENT(IN) :: KMI ! Model index -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for - ! the nucleation param. -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel/hail m.r. source -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNS ! Cloud C. nuclei C. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINS ! Ice nuclei C. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -! -END SUBROUTINE ICE_C1R3 -END INTERFACE -END MODULE MODI_ICE_C1R3 -! ###################################################################### - SUBROUTINE ICE_C1R3 (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PW_NU, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & - PCCT, PCRT, PCIT, PCNS, PCCS, PCRS, PINS, PCIS, & - PINPRS, PINPRG ) -! ###################################################################### -! -!!**** * - compute the explicit microphysical sources of cloud water and -!! rain water concentrations and mixing ratios -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the microphysical sources: -!! nucleation, sedimentation, autoconversion, accretion, self-collection -!! and vaporisation which are parameterized according to Cohard and Pinty -!! QJRMS, 2000 -!! -!! -!!** METHOD -!! ------ -!! The activation of CCN is checked for quasi-saturated air parcels -!! to update the cloud droplet number concentration. Then assuming a -!! generalized gamma distribution law for the cloud droplets and the -!! raindrops, the zeroth and third order moments tendencies are evaluated -!! for all the coalescence terms by integrating the Stochastic Collection -!! Equation. As autoconversion is a process that cannot be resolved -!! analytically, the Berry-Reinhardt parameterisation is employed with -!! modifications to initiate the raindrop spectrum mode. The integration -!! of the raindrop evaporation of the raindrops below clouds is -!! straightformward. -!! -!! The sedimentation rates are computed with a time spliting technique: -!! an upstream scheme, written as a difference of non-advective fluxes. -!! This source term is added to the next coming time step (split-implicit -!! process). -!! -!! EXTERNAL -!! -------- -!! None -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! Module MODD_CONF : -!! CCONF configuration of the model for the first time step -!! -!! Module MODD_CST -!! XP00 ! Reference pressure -!! XRD,XRV ! Gaz constant for dry air, vapor -!! XMD,XMV ! Molecular weight for dry air, vapor -!! XCPD ! Cpd (dry air) -!! XCL ! Cl (liquid) -!! XTT ! Triple point temperature -!! XLVTT ! Vaporization heat constant -!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure -!! function over liquid water -!! Module MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! LBU_RTH : logical for budget of RTH (potential temperature) -!! .TRUE. = budget of RTH -!! .FALSE. = no budget of RTH -!! LBU_RRV : logical for budget of RRV (water vapor) -!! .TRUE. = budget of RRV -!! .FALSE. = no budget of RRV -!! LBU_RRC : logical for budget of RRC (cloud water) -!! .TRUE. = budget of RRC -!! .FALSE. = no budget of RRC -!! LBU_RRR : logical for budget of RRR (rain water) -!! .TRUE. = budget of RRR -!! .FALSE. = no budget of RRR -!! -!! REFERENCE -!! --------- -!! -!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm -!! microphysical bulk scheme. -!! Part I: Description and tests -!! Part II: 2D experiments with a non-hydrostatic model -!! Accepted for publication in Quart. J. Roy. Meteor. Soc. -!! -!! AUTHOR -!! ------ -!! J.-M. Cohard * Laboratoire d'Aerologie* -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 31/12/96 -!! Jean-Pierre PINTY 7/ 4/01 Code cleaning -!! Jean-Pierre PINTY 7/ 5/01 Bug correction in BERFI -!! Jean-Pierre PINTY 17/ 5/01 Reset PINS=0 in case of IMLT -!! Jean-Pierre PINTY 17/ 5/01 Bug in RRCFRIG and RICFRRG -!! Jean-Pierre PINTY 29/ 5/01 Bug in RCHONI and graupel shedding -!! Jean-Pierre PINTY 29/ 6/01 Bug in RCHONI and RVHNCI -!! Jean-Pierre PINTY 29/ 6/01 Add RHHONI process (freezing haze part.) -!! Jean-Pierre PINTY 13/ 9/01 Recode the RCHONI and RVHNCI processes -!! Jean-Pierre PINTY 23/ 9/01 Recode the HM processes according to -!! Beheng(1986) and Ovtchin. et al. (2000) -!! and add the S to I conversion rate -!! Jean-Pierre PINTY 1/10/01 Bug in RVHNCI -!! Jean-Pierre PINTY 8/10/01 Revise limits in sedim. and review S->I -!! Jean-Pierre PINTY 18/10/01 Revise Snow to Ice conversion -!! Jean-Pierre PINTY 18/12/01 Revise Graupel wet growth (limitation) -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! -!------------------------------------------------------------------------------- -! -use mode_msg -! -call Print_msg(NVERB_FATAL,'GEN','ICE_C1R3','not yet developed') -! -END SUBROUTINE ICE_C1R3 diff --git a/src/MNH/ini_elec.f90 b/src/MNH/ini_elec.f90 deleted file mode 100644 index 0154ac6da..000000000 --- a/src/MNH/ini_elec.f90 +++ /dev/null @@ -1,102 +0,0 @@ -!MNH_LIC Copyright 2002-2019 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. -!----------------------------------------------------------------- -! ######################################################### - SUBROUTINE INI_ELEC(KMI,TPINIFILE,PTSTEP,PDZMIN,KSPLITR, & - PDXX,PDYY,PDZZ,PDZX,PDZY ) -! ######################################################### -! -!!**** *INI_ELEC* - routine to initialize the electrical parameters -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the variables -! of the atmospheric electricity scheme -! -!!** METHOD -!! ------ -!! The initialization of the scheme is performed as follows : -!! -!! EXTERNAL -!! -------- -!! CLEANLIST_ll : deaalocate a list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_ELEC) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie * -!! -!! MODIFICATIONS -!! ------------- -!! Original 29/11/02 -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_CONF -USE MODD_CST -USE MODD_DYN -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n -USE MODD_NSV, ONLY: NSV, NSV_ELEC, NSV_ELECBEG, NSV_ELECEND -USE MODD_PARAMETERS -USE MODD_REF -USE MODD_TIME -! -USE MODE_ll -use mode_msg -! -USE MODI_INI_CLOUD -! -USE MODN_CONF_n -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! Model Index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE! Initial file -REAL, INTENT(IN) :: PTSTEP ! Time STEP -! -REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integration for rain - ! sedimendation -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -! -! -!* 0.2 declarations of local variables -! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILUOUT ! Logical unit number of output-listing -! -! -!------------------------------------------------------------------------------- -! -!* 0. PROLOGUE -! -------- -! -! -call Print_msg(NVERB_FATAL,'GEN','INI_ELEC','not yet developed') -! -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE INI_ELEC diff --git a/src/MNH/init_for_convlfi.f90 b/src/MNH/init_for_convlfi.f90 deleted file mode 100644 index 733aa93ca..000000000 --- a/src/MNH/init_for_convlfi.f90 +++ /dev/null @@ -1,277 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_INIT_FOR_CONVLFI -!########################### -! -! -INTERFACE - SUBROUTINE INIT_FOR_CONVLFI(TPINIFILE) -! -USE MODD_IO,ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! file being read -! -END SUBROUTINE INIT_FOR_CONVLFI -END INTERFACE -END MODULE MODI_INIT_FOR_CONVLFI -! -! ############################################ - SUBROUTINE INIT_FOR_CONVLFI(TPINIFILE) -! ############################################ -! -!!**** *INIT_FOR_CONVLFI * - light monitor to initialize the variables -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize some variables -! necessary in the conversion program. -! -!!** METHOD -!! ------ -!! This initialization takes some parts of the whole initialization modules -!! of monitor INIT: -!! geometry and dimensions from ini_sizen -!! grids, metric coefficients, dates and times from set_grid -!! reading of the pressure field -!! -!! -!! EXTERNAL -!! -------- -!! INI_CST : to initialize physical constants -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! I. Mallet * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/02/01 -!! J.-P. Pinty and D. Gazen 31/03/04 Add the 2D capability for V5D plots -!! 10/10/2011 J.Escobar call INI_PARAZ_ll -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_CONF -USE MODD_CST -USE MODD_DIM_n -USE MODD_FIELD_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_TIME -USE MODD_TIME_n -USE MODD_VAR_ll, ONLY: NPROC -! -USE MODE_FIELD, ONLY: TFIELDDATA, TFIELDLIST, FIND_FIELD_ID_FROM_MNHNAME -USE MODE_TIME -USE MODE_GRIDPROJ -USE MODE_GRIDCART -! -USE MODE_GATHER_ll -USE MODE_IO, only: IO_Pack_set -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_ll -! -USE MODI_INI_CST -!JUANZ -USE MODE_SPLITTINGZ_ll -!JUANZ -! -IMPLICIT NONE -! -!* 0.1 Arguments variables -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! file being read -! -!* 0.2 Local variables -! -INTEGER :: IRESP -CHARACTER (LEN=40) :: YTITLE ! Title for date print -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian -! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal - ! plane (array on the complete domain) -REAL :: ZXHATM,ZYHATM ! coordinates of mass point -REAL :: ZLATORI, ZLONORI ! lat and lon of left-bottom point -! -INTEGER :: IIU,IJU ! Upper dimension in x,y direction (local) -INTEGER :: IKU ! Upper dimension in z direction -INTEGER :: IINFO_ll ! return code of // routines -INTEGER :: IID -TYPE(TFIELDDATA) :: TZFIELD -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALIZE EACH MODEL SIZES AND DEPENDENCY (ini_sizen) -! ------------------------------------------ -! -!* 1.1 Read the geometry kind in the LFIFM file (Cartesian or spherical) -! -CALL IO_Field_read(TPINIFILE,'CARTESIAN',LCARTESIAN) -! -!* 1.2 Read configuration and dimensions in initial file and initialize -! subdomain dimensions and parallel variables -! -CALL IO_Field_read(TPINIFILE,'IMAX',NIMAX_ll) -CALL IO_Field_read(TPINIFILE,'JMAX',NJMAX_ll) -! -CALL IO_Field_read(TPINIFILE,'L1D',L1D,IRESP) -IF (IRESP/=0) THEN - L1D=.FALSE. - IF( (NIMAX_ll == 1).AND.(NJMAX_ll == 1) ) L1D=.TRUE. -ENDIF -! -CALL IO_Field_read(TPINIFILE,'L2D',L2D,IRESP) -IF (IRESP/=0) THEN - L2D=.FALSE. - IF( (NIMAX_ll /= 1).AND.(NJMAX_ll == 1) ) L2D=.TRUE. -ENDIF -! -CALL IO_Field_read(TPINIFILE,'PACK',LPACK,IRESP) -IF (IRESP/=0) LPACK=.TRUE. -! -CALL IO_Pack_set(L1D,L2D,LPACK) -! -CALL IO_Field_read(TPINIFILE,'KMAX',NKMAX) -! -CSPLIT ='BSPLITTING' ; NHALO = 1 -CALL SET_SPLITTING_ll(CSPLIT) -CALL SET_JP_ll(1,JPHEXT,JPVEXT, NHALO) -CALL SET_DAD0_ll() -CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) -CALL IO_Pack_set(L1D,L2D,LPACK) -CALL SET_LBX_ll('OPEN', 1) -CALL SET_LBY_ll('OPEN', 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -!JUANZ CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -! -!* 1.4 Compute sizes of arrays of the extended sub-domain (ini_modeln) -! -IKU=NKMAX + 2*JPVEXT -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -! -!------------------------------------------------------------------------------- -! -!* 2. INITIALIZE GRIDS AND METRIC COEFFICIENTS (set_grid) -! --------------------- -! -! 2.1 reading -! -CALL IO_Field_read(TPINIFILE,'LAT0',XLAT0) -CALL IO_Field_read(TPINIFILE,'LON0',XLON0) -CALL IO_Field_read(TPINIFILE,'BETA',XBETA) -CALL IO_Field_read(TPINIFILE,'XHAT',XXHAT) -CALL IO_Field_read(TPINIFILE,'YHAT',XYHAT) -! -IF (.NOT.LCARTESIAN) THEN - CALL IO_Field_read(TPINIFILE,'RPK',XRPK) - CALL IO_Field_read(TPINIFILE,'LONORI',XLONORI) - CALL IO_Field_read(TPINIFILE,'LATORI',XLATORI) - ! - IF (TPINIFILE%NMNHVERSION(1)<4 .OR. (TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)<=5)) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) - TZFIELD%CMNHNAME = 'LONOR' - CALL IO_Field_read(TPINIFILE,TZFIELD,XLONORI) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) - TZFIELD%CMNHNAME = 'LATOR' - CALL IO_Field_read(TPINIFILE,TZFIELD,XLATORI) - ! - ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !// - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !// - ZXHATM = - 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2)) - ZYHATM = - 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2)) - CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATORI,ZLONORI) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) - XLATORI = ZLATORI - XLONORI = ZLONORI - END IF -END IF -! -ALLOCATE(XZS(IIU,IJU)) -CALL IO_Field_read(TPINIFILE,'ZS',XZS,IRESP) -IF (IRESP/=0) XZS(:,:)=0. -! -ALLOCATE(XZSMT(IIU,IJU)) -CALL IO_Field_read(TPINIFILE,'ZSMT',XZSMT,IRESP) -IF (IRESP/=0) XZSMT(:,:)=XZS(:,:) -! -ALLOCATE(XZHAT(IKU)) -CALL IO_Field_read(TPINIFILE,'ZHAT',XZHAT) -CALL IO_Field_read(TPINIFILE,'ZTOP',XZTOP) -! -CALL IO_Field_read(TPINIFILE,'SLEVE',LSLEVE,IRESP) -IF (IRESP/=0) LSLEVE = .FALSE. -! -IF (LSLEVE) THEN - CALL IO_Field_read(TPINIFILE,'LEN1',XLEN1) - CALL IO_Field_read(TPINIFILE,'LEN2',XLEN2) -END IF -! -CALL IO_Field_read(TPINIFILE,'DTEXP',TDTEXP) -CALL IO_Field_read(TPINIFILE,'DTMOD',TDTMOD) -CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG) -CALL IO_Field_read(TPINIFILE,'DTCUR',TDTCUR) -! -YTITLE='CURRENT DATE AND TIME' -CALL SM_PRINT_TIME(TDTCUR,TLUOUT,YTITLE) -! -!* 2.2 Spatial grid -! -ALLOCATE(XDXHAT(IIU)) -ALLOCATE(XDYHAT(IJU)) -ALLOCATE(XZZ(IIU,IJU,IKU)) -ALLOCATE(ZJ(IIU,IJU,IKU)) -! -CALL INI_CST -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) -ELSE - ALLOCATE(XLON(IIU,IJU)) - ALLOCATE(XLAT(IIU,IJU)) - ALLOCATE(XMAP(IIU,IJU)) - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ) -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZE THE PROGNOSTIC AND SURFACE FIELDS (read_field) -! -------------------------------------------- -ALLOCATE(XPABST(IIU,IJU,IKU)) -CALL IO_Field_read(TPINIFILE,'PABST',XPABST) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE INIT_FOR_CONVLFI diff --git a/src/MNH/les_masksn.f90 b/src/MNH/les_masksn.f90 deleted file mode 100644 index 4add46bb6..000000000 --- a/src/MNH/les_masksn.f90 +++ /dev/null @@ -1,188 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 les 2006/08/30 18:38:57 -!----------------------------------------------------------------- -! ################ -MODULE MODI_LES_MASKS_n -! ################ -! -! -! -INTERFACE LES_MASKS_n -! - SUBROUTINE LES_MASKS_n(KTCOUNT) -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -END SUBROUTINE LES_MASKS_n -! -END INTERFACE -! -END MODULE MODI_LES_MASKS_n - -! ####################### - SUBROUTINE LES_MASKS_n(KTCOUNT) -! ####################### -! -! -!!**** *LES_MASKS_n* initializes the LES variables for -!! the current time-step of model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n -USE MODD_CONF_n -USE MODD_TIME_n -USE MODD_DYN_n -USE MODD_TIME -! -USE MODE_ll -USE MODE_MODELN_HANDLER -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -! -! 0.2 declaration of local variables -! -INTEGER :: IXOR_ll, IYOR_ll ! origine point coordinates -! ! of current processor domain -! ! on model domain on all -! ! processors -INTEGER :: IIB_ll, IJB_ll ! SO point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIE_ll, IJE_ll ! NE point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIINF_MASK, IISUP_MASK ! cart. mask local proc. limits -INTEGER :: IJINF_MASK, IJSUP_MASK ! cart. mask local proc. limits -! -INTEGER :: JK ! vertical loop counter -INTEGER :: IIB, IJB, IIE, IJE ! hor. indices -INTEGER :: IIU, IJU ! hor. indices -INTEGER :: IKU ! ver. index -INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices -INTEGER :: IMI ! Current model index -! -!------------------------------------------------------------------------------- -! -!* 1. Does current time-step is a LES time-step? -! ----------------------------------------- -! -LLES_CALL= .FALSE. -! -IF (.NOT. LLES) RETURN -! -IF ( KTCOUNT>1 .AND. MOD (KTCOUNT-1,NLES_DTCOUNT)==0) LLES_CALL=.TRUE. -! -IF (.NOT. LLES_CALL) RETURN -! -NLES_TCOUNT = NLES_TCOUNT + 1 -! -NLES_CURRENT_TCOUNT = NLES_TCOUNT -! -! -XLES_DATIME( 1,NLES_TCOUNT) = TDTEXP%TDATE%YEAR -XLES_DATIME( 2,NLES_TCOUNT) = TDTEXP%TDATE%MONTH -XLES_DATIME( 3,NLES_TCOUNT) = TDTEXP%TDATE%DAY -XLES_DATIME( 4,NLES_TCOUNT) = TDTEXP%TIME -XLES_DATIME( 5,NLES_TCOUNT) = TDTSEG%TDATE%YEAR -XLES_DATIME( 6,NLES_TCOUNT) = TDTSEG%TDATE%MONTH -XLES_DATIME( 7,NLES_TCOUNT) = TDTSEG%TDATE%DAY -XLES_DATIME( 8,NLES_TCOUNT) = TDTSEG%TIME -XLES_DATIME( 9,NLES_TCOUNT) = TDTMOD%TDATE%YEAR -XLES_DATIME(10,NLES_TCOUNT) = TDTMOD%TDATE%MONTH -XLES_DATIME(11,NLES_TCOUNT) = TDTMOD%TDATE%DAY -XLES_DATIME(12,NLES_TCOUNT) = TDTMOD%TIME -XLES_DATIME(13,NLES_TCOUNT) = TDTCUR%TDATE%YEAR -XLES_DATIME(14,NLES_TCOUNT) = TDTCUR%TDATE%MONTH -XLES_DATIME(15,NLES_TCOUNT) = TDTCUR%TDATE%DAY -XLES_DATIME(16,NLES_TCOUNT) = TDTCUR%TIME -! -XLES_TRAJT(NLES_TCOUNT,1) = (KTCOUNT-1) * XTSTEP -! -!------------------------------------------------------------------------------- -! -CALL GET_OR_ll ('B',IXOR_ll,IYOR_ll) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IIB_ll=IXOR_ll+IIB-1 -IJB_ll=IYOR_ll+IJB-1 -IIE_ll=IXOR_ll+IIE-1 -IJE_ll=IYOR_ll+IJE-1 -! -IKU = SIZE(XTHT,3) -! -!------------------------------------------------------------------------------- -! -!* 2. Definition of masks -! ------------------- -! -!* 2.1 Cartesian (sub-)domain (on local processor) -! ---------------------- -! -ALLOCATE(LLES_CURRENT_CART_MASK(IIU,IJU,NLES_K)) -! -IMI = GET_CURRENT_MODEL_INDEX() -! -IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)-(IIB_ll-1-JPHEXT)) -IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)-(IJB_ll-1-JPHEXT)) -IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)-(IIB_ll-1-JPHEXT)) -IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)-(IJB_ll-1-JPHEXT)) -! -LLES_CURRENT_CART_MASK(:,:,:) = .FALSE. -LLES_CURRENT_CART_MASK(IIINF_MASK:IISUP_MASK,IJINF_MASK:IJSUP_MASK,:) = .TRUE. -! -CLES_CURRENT_LBCX(:) = CLES_LBCX(:,IMI) -CLES_CURRENT_LBCY(:) = CLES_LBCY(:,IMI) -! -! -!* 2.2 Cloud masks -! ----------- -! -CALL LES_CLOUD_MASKS_n -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES_MASKS_n diff --git a/src/MNH/lochead.f90 b/src/MNH/lochead.f90 deleted file mode 100644 index 5bb77e10e..000000000 --- a/src/MNH/lochead.f90 +++ /dev/null @@ -1,184 +0,0 @@ -!MNH_LIC Copyright 1995-2019 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_LOCHEAD -! ################### -INTERFACE - SUBROUTINE LOCHEAD(PLATMIN,PLATMAX,PLONMIN,PLONMAX, & - PGLBLATMIN,PGLBLATMAX,PGLBLONMIN,PGLBLONMAX, & - KGLBNBLAT,KGLBNBLON,PCUTVAL,KSHIFT,KMAX, & - HSAVEDDATAFILE,ODATASAVE ) -! -REAL, INTENT(IN) :: PLATMIN ! min latitude of the local field. -REAL, INTENT(IN) :: PLATMAX ! max latitude of the local field. -REAL, INTENT(IN) :: PLONMIN ! min longitude of the local field. -REAL, INTENT(IN) :: PLONMAX ! min longitude of the local field. -REAL, INTENT(IN) :: PGLBLATMIN ! min latitude of the global file -REAL, INTENT(IN) :: PGLBLATMAX ! max latitude of the global file -REAL, INTENT(IN) :: PGLBLONMIN ! min longitude of the global file -REAL, INTENT(IN) :: PGLBLONMAX ! max longitude of the global file -INTEGER, INTENT(IN) :: KGLBNBLAT ! number of latitude rows in global file -INTEGER, INTENT(IN) :: KGLBNBLON ! number of longitude rows in global file -REAL, INTENT(IN) :: PCUTVAL ! special value in data file -INTEGER, INTENT(OUT):: KSHIFT ! shift applied to longitude array -INTEGER, INTENT(OUT):: KMAX ! maximum index of new longitude -! ! array in local area -CHARACTER(LEN=28), INTENT(IN) :: HSAVEDDATAFILE! Name of the local field file -LOGICAL, INTENT(IN) :: ODATASAVE ! flag to save data on the local -! ! field file -! -END SUBROUTINE LOCHEAD -END INTERFACE -END MODULE MODI_LOCHEAD -! -! -! ################################################################ - SUBROUTINE LOCHEAD(PLATMIN,PLATMAX,PLONMIN,PLONMAX, & - PGLBLATMIN,PGLBLATMAX,PGLBLONMIN,PGLBLONMAX, & - KGLBNBLAT,KGLBNBLON,PCUTVAL,KSHIFT,KMAX, & - HSAVEDDATAFILE,ODATASAVE ) -! ################################################################ -! -!!**** *LOCHEAD* writes the head of a the local 'latlon' file. -!! -!! PURPOSE -!! ------- -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 29/08/95 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -USE MODD_IO, ONLY: TFILEDATA -! -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -! -REAL, INTENT(IN) :: PLATMIN ! min latitude of the local area -REAL, INTENT(IN) :: PLATMAX ! max latitude of the local area -REAL, INTENT(INOUT) :: PLONMIN ! min longitude of the local area -REAL, INTENT(INOUT) :: PLONMAX ! min longitude of the local area -REAL, INTENT(IN) :: PGLBLATMIN ! min latitude of the global file -REAL, INTENT(IN) :: PGLBLATMAX ! max latitude of the global file -REAL, INTENT(IN) :: PGLBLONMIN ! min longitude of the global file -REAL, INTENT(IN) :: PGLBLONMAX ! max longitude of the global file -INTEGER, INTENT(IN) :: KGLBNBLAT ! number of latitude rows in global file -INTEGER, INTENT(IN) :: KGLBNBLON ! number of longitude rows in global file -REAL, INTENT(IN) :: PCUTVAL ! special value in data file -INTEGER, INTENT(OUT):: KSHIFT ! shift applied to longitude array -INTEGER, INTENT(OUT):: KMAX ! maximum index of new longitude -! ! array in local area -CHARACTER(LEN=28), INTENT(IN) :: HSAVEDDATAFILE! Name of the local field file -LOGICAL, INTENT(IN) :: ODATASAVE ! flag to save data on the local -! ! field file -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: ISAVE ! logical unit -INTEGER :: IRESP ! return code -REAL, DIMENSION(KGLBNBLAT) :: Z1 ! latitudes of global field -REAL, DIMENSION(KGLBNBLON) :: Z2 ! longitudes of global field -REAL :: ZDLAT ! latitude mesh in the data file -REAL :: ZDLON ! longitude mesh in the data file -REAL :: Z1MIN ! min latitude of the local file -REAL :: Z1MAX ! max latitude of the local file -REAL :: Z2MIN ! min longitude of the local file -REAL :: Z2MAX ! max longitude of the local file -INTEGER, DIMENSION(1) :: INB1 ! number of lines in local file -INTEGER, DIMENSION(1) :: INB2 ! number of columns in local file -INTEGER :: JLAT ! loop control -INTEGER :: JLON ! loop control -TYPE(TFILEDATA),POINTER :: TZFILE -!------------------------------------------------------------------------------- -! -IF (ODATASAVE) THEN - CALL IO_File_find_byname(HSAVEDDATAFILE,TZFILE,IRESP) - ISAVE = TZFILE%NLU -END IF -! -ZDLAT=(PGLBLATMAX-PGLBLATMIN)/KGLBNBLAT -ZDLON=(PGLBLONMAX-PGLBLONMIN)/KGLBNBLON -! -Z1(:)=(/ (PGLBLATMAX-(JLAT-0.5)*ZDLAT, JLAT=1,KGLBNBLAT) /) -Z2(:)=(/ (PGLBLONMIN+(JLON-0.5)*ZDLON, JLON=1,KGLBNBLON) /) -! -IF (MINVAL(Z1)>PLATMAX .OR. MAXVAL(Z1)<PLATMIN) THEN - KSHIFT=0 - RETURN -END IF -Z1MIN=MINVAL(Z1,MASK=(Z1>PLATMIN))-0.5*ZDLAT -Z1MAX=MAXVAL(Z1,MASK=(Z1<PLATMAX))+0.5*ZDLAT -INB1(:)=MINLOC(Z1,MASK=(Z1>PLATMIN)) & - -MAXLOC(Z1,MASK=(Z1<PLATMAX)) +1 -! -!* Computations on longitudes, shift of longitudes below PLONMIN -! -IF ( (PLONMAX+NINT((PGLBLONMIN-180.-PLONMIN)/360.)*360.<PGLBLONMIN) & - .AND.(PLONMIN+NINT((PGLBLONMIN+180.-PLONMIN)/360.)*360.>PGLBLONMAX) ) THEN - KMAX=0 - KSHIFT=0 -ELSE - IF (PLONMAX+NINT((PGLBLONMIN-180.-PLONMIN)/360.)*360.>PGLBLONMIN) THEN - Z2(:)=Z2(:)+NINT((PGLBLONMIN-180.-PLONMIN)/360.)*360. - ELSE - Z2(:)=Z2(:)+NINT((PGLBLONMIN+180.-PLONMIN)/360.)*360. - END IF - KSHIFT=COUNT(Z2(:)<PLONMIN) - WHERE(Z2<PLONMIN) - Z2=Z2+360. - ENDWHERE - Z2=CSHIFT(Z2,SHIFT=KSHIFT) - INB2(:)=MAXLOC(Z2,MASK=(Z2<PLONMAX)) - KMAX=INB2(1) - Z2MIN=MINVAL(Z2,MASK=(Z2>PLONMIN))-0.5*ZDLON - Z2MAX=MAXVAL(Z2,MASK=(Z2<PLONMAX))+0.5*ZDLON -END IF -! -!------------------------------------------------------------------------------- -! -IF ( (KMAX>0) .AND. (INB1(1)>0) .AND. (ODATASAVE) ) THEN - WRITE(ISAVE,*) 'local file ',HSAVEDDATAFILE - WRITE(ISAVE,'(A8,F13.8)') 'nodata: ',PCUTVAL - WRITE(ISAVE,'(A7,F13.8)') 'north: ',Z1MAX - WRITE(ISAVE,'(A7,F13.8)') 'south: ',Z1MIN - WRITE(ISAVE,'(A7,F13.8)') 'east: ', Z2MAX - WRITE(ISAVE,'(A7,F13.8)') 'west: ', Z2MIN - WRITE(ISAVE,'(A6,I7)') 'rows: ', INB1(1) - WRITE(ISAVE,'(A6,I7)') 'cols: ', INB2(1) -END IF -! -!------------------------------------------------------------------------------- -END SUBROUTINE LOCHEAD diff --git a/src/MNH/mean_prof.f90 b/src/MNH/mean_prof.f90 deleted file mode 100644 index 773ee9a8c..000000000 --- a/src/MNH/mean_prof.f90 +++ /dev/null @@ -1,196 +0,0 @@ -!MNH_LIC Copyright 1997-2019 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_MEAN_PROF -! ##################### -INTERFACE - SUBROUTINE MEAN_PROF(PVAR_MX,PZMASS_MX,PZS_LS,PCLIMGR,& - PF_FREE,PZ_FREE) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVAR_MX ! thermodynamical field -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZMASS_MX ! mass points altitude -REAL, DIMENSION(:,:), INTENT(IN) :: PZS_LS ! large scale orography -REAL, INTENT(IN) :: PCLIMGR ! climatological gradient -! ! near the ground -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_FREE ! mean profile of the -! ! thermodynamical field -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZ_FREE ! discretization in x,y,z -! ! of the profile on the -! ! flat grid where zs is the -! ! minimum of both orographies -END SUBROUTINE MEAN_PROF -END INTERFACE -END MODULE MODI_MEAN_PROF -! ############################################################## - SUBROUTINE MEAN_PROF(PVAR_MX,PZMASS_MX,PZS_LS,PCLIMGR,& - PF_FREE,PZ_FREE) -! ############################################################## -! -!!**** *MEAN_PROF* - Computation of the profile of the free atmospheres -!! i.e. without the Boundary layer structures -!! -!! PURPOSE -!! ------- -!! This routine computes the profile used for the shift of a variable -!! and the altitude of the discretization points of this profile. -! -!! CAUTION: -!! The shift profile is only defined on the inner vertical points of the grid. -!! -!!** METHOD -!! ------ -!! The profile is discretized on the vertical GS grid defined by -!! the MESO-NH level array XZHAT and by a constant orography, -!! corresponding to the minimum of the Arpege and MESO-NH orographies. -!! If necessary, the profile is extrapolated under the minimum -!! altitude of the Arpege orography with a climatological vertical -!! gradient PCLIMGR (uniform on the whole domain). -!! -!! EXTERNAL -!! -------- -!! -!! function ZSECT : to compute the mean of a 3D field at a constant -!! altitude -!! Module MODI_ZSECT: contains interface for function ZSECT -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_LUNIT : contains logical unit names for all models -!! TLUOUT0 : name of output-listing -!! Module MODD_GRID1 : contains grid variables for model1 -!! XZS : orography of MESO-NH -!! XZHAT : GS levels -!! Module MODD_PARAMETERS -!! JPVEXT -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/08/97 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_GRID_n -USE MODD_LUNIT, ONLY: TLUOUT0 -USE MODD_PARAMETERS -! -USE MODI_ZSECT -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVAR_MX ! thermodynamical field -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZMASS_MX ! mass points altitude -REAL, DIMENSION(:,:), INTENT(IN) :: PZS_LS ! large scale orography -REAL, INTENT(IN) :: PCLIMGR ! climatological gradient -! ! near the ground -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_FREE ! mean profile of the -! ! thermodynamical field -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZ_FREE ! discretization in x,y,z -! ! of the profile on the -! ! flat grid where zs is the -! ! minimum of both orographies -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: ILEVEL,IKB,IKE,ILB,ILE,JK -REAL :: ZMIN -REAL, DIMENSION(SIZE(PF_FREE,3)) :: ZF_FREE -REAL, DIMENSION(SIZE(PZ_FREE,3)) :: ZZ_FREE -!------------------------------------------------------------------------------- -! -! -IKB=JPVEXT+1 -IKE=SIZE(PZ_FREE,3)-JPVEXT -! -!* 1. Computation of the altitude of the GS grid for the shift profile -! ---------------------------------------------------------------- -! -ZMIN=MIN(MINVAL(PZS_LS),MINVAL(XZS)) -ZZ_FREE(1:IKE)=ZMIN+0.5*(XZHAT(1:IKE)+XZHAT(2:IKE+1))*(1.-ZMIN/XZHAT(IKE+1)) -ZZ_FREE(IKE+1)=2.*XZHAT(IKE+1)-ZZ_FREE(IKE) -! -!------------------------------------------------------------------------------- -! -!* 2. Computation of the shift profile -! -------------------------------- -! -!* 2.1 Defined values -! -------------- -! -ZF_FREE(:)=-999. -DO JK=IKB,IKE - ZF_FREE(JK)=ZSECT(ZZ_FREE(JK),PZMASS_MX(:,:,IKB:IKE+1),& - PVAR_MX(:,:,IKB:IKE+1)) -END DO -! -!* 2.2 Low levels values (extrapolation with constant gradient) -! -------------------------------------------------------- -! -ILEVEL=0 -DO JK=1,IKE - IF (ABS(ZF_FREE(JK)+999.)<1.E-10) THEN - ILEVEL=JK+1 - ELSE - EXIT - ENDIF -ENDDO -! -DO JK=1,ILEVEL-1 - ZF_FREE(JK)=ZF_FREE(ILEVEL)& - +PCLIMGR*(ZZ_FREE(JK)-ZZ_FREE(ILEVEL)) -ENDDO -! -!* 2.3 Upper levels values (linear extrapolation) -! ------------------------------------------ -! -ILEVEL=IKE+1 -DO JK=IKE+1,1,-1 - IF (ABS(ZF_FREE(JK)+999.)<1.E-10) THEN - ILEVEL=JK-1 - ELSE - EXIT - ENDIF -ENDDO -! -DO JK=IKE+1,ILEVEL+1 - ZF_FREE(JK)=ZF_FREE(ILEVEL) & - +(ZF_FREE(ILEVEL)-ZF_FREE(ILEVEL-1)) & - /(ZZ_FREE(ILEVEL)-ZZ_FREE(ILEVEL-1)) & - *(ZZ_FREE(JK)-ZZ_FREE(ILEVEL)) -ENDDO -! -!------------------------------------------------------------------------------- -! -!* 3. 3D output profiles arrays -! ------------------------- -! -PZ_FREE(:,:,:)=SPREAD(SPREAD(ZZ_FREE(:),1,SIZE(PZ_FREE,1)),2,SIZE(PZ_FREE,2)) -PF_FREE(:,:,:)=SPREAD(SPREAD(ZF_FREE(:),1,SIZE(PF_FREE,1)),2,SIZE(PF_FREE,2)) -! -!------------------------------------------------------------------------------- -! -WRITE(TLUOUT0%NLU,*) 'Routine MEAN_PROF completed' -! -END SUBROUTINE MEAN_PROF diff --git a/src/MNH/modd_type_allvar.f90 b/src/MNH/modd_type_allvar.f90 deleted file mode 100644 index b9c3b187c..000000000 --- a/src/MNH/modd_type_allvar.f90 +++ /dev/null @@ -1,73 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ################### - MODULE MODD_TYPE_ALLVAR -! ################### -! -!!**** *MODD_TYPE_ALLVAR* - Declaration des types de variables 3D, 2D, 1D, -!! -!! PURPOSE -!! ------- -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! P Jabouille -!! -!! MODIFICATIONS -!! ------------- -!! Original 11/08/97 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -IMPLICIT NONE -! -TYPE X_Y_Z_ - CHARACTER(LEN=16) :: NAME - INTEGER :: IGRID - CHARACTER(LEN=16) :: UNITS -END TYPE X_Y_Z_ -! -TYPE X_Y_ - CHARACTER(LEN=16) :: NAME - INTEGER :: IGRID - CHARACTER(LEN=16) :: UNITS -END TYPE X_Y_ -! -TYPE VX_VY_VZ_ - CHARACTER(LEN=16),DIMENSION(3) :: NAME - INTEGER,DIMENSION(3) :: IGRID - CHARACTER(LEN=16),DIMENSION(3) :: UNITS -END TYPE VX_VY_VZ_ -! -TYPE VX_VY_ - CHARACTER(LEN=16),DIMENSION(3) :: NAME - INTEGER,DIMENSION(3) :: IGRID - CHARACTER(LEN=16),DIMENSION(3) :: UNITS -END TYPE VX_VY_ -! -TYPE Z_ - CHARACTER(LEN=16) :: NAME - INTEGER :: IGRID - CHARACTER(LEN=16) :: UNITS -END TYPE Z_ -! -END MODULE MODD_TYPE_ALLVAR diff --git a/src/MNH/mpdata.f90 b/src/MNH/mpdata.f90 deleted file mode 100644 index 8b676d70d..000000000 --- a/src/MNH/mpdata.f90 +++ /dev/null @@ -1,405 +0,0 @@ -!MNH_LIC Copyright 1995-2020 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_MPDATA -! ################## -INTERFACE - SUBROUTINE MPDATA (KLITER, HLBCX, HLBCY, KRR, & - PTSTEP, PRHODJ, PTHM, PRM, PTKEM, & - PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -! -INTEGER, INTENT(IN) :: KLITER ! Number of iterations MPDATA -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM, PTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT ! Contravariants - ! components of the momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -END SUBROUTINE MPDATA -! -END INTERFACE -! -END MODULE MODI_MPDATA -! -! -! ######################################################################## - SUBROUTINE MPDATA (KLITER, HLBCX, HLBCY, KRR, & - PTSTEP, PRHODJ, PTHM, PRM, PTKEM, & - PTHT, PRT, PTKET, & - PRUCT, PRVCT, PRWCT, & - PRTHS, PRRS, PRTKES ) -! ######################################################################## -! -!!**** *MPDATA* - routine to compute the advection tendancies of the scalar -!! fields using an upstream scheme. The excesive numerical -!! correction of the scheme is corrected by means of an -!! antidiffusive velocity. -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the total advection -!! tendencies of all the scalar fields using the MPDATA scheme. -!! -!!** METHOD -!! ------ -!! MPDATA solves the advection of a quantity in the following way -!! 1.- 1st iteration. Upstream scheme. -!! The quantity is advected by the contravariant -!! velocities using an upstream scheme. -!! 2.- 2nd and next iterations. The excessive diffusion -!! of the upstream scheme is corrected by defining -!! the antidiffusive velocities (ANTI_DIFF routine) -!! and using for each iteration the upstream scheme. -!! EXTERNAL -!! -------- -!! ADD3DFIELD_ll : add a field to 3D-list -!! CLEANLIST_ll : deallocate a list -!! UPDATE_HALO_ll : update internal halos -!! DXF,DYF,DZF : Shuman operators -!! FXM,FYM,FZM : Flux operators -!! ANTI_DIFF : antidiffusion -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! Book1 of documentation ( MPDATA scheme ) -!! -!! AUTHOR -!! ------ -!! J. Vila-Guerau * Meteo France* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 30/10/95 -!! J.-P. Pinty & J.-M. Cohard *LA* Add the budget calls -!! J. Stein include the cyclic case -!! P. Jabouille parallelization -!! V. Masson 06/11/02 updates the budget calls -!! 05/2006 Remove EPS -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODE_ll -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -! -USE MODD_BUDGET -USE MODD_PARAMETERS -! -USE MODI_SHUMAN -USE MODI_FLUX -USE MODI_ANTI_DIFF -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KLITER ! Number of iterations MPDATA -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM, PTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariants components momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT - ! Variables at t -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS - ! Sources terms -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JLITER ! Loop index for MPDATA iterations -INTEGER :: JRR ! Loop index for moist variables -! -INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER:: IIE,IJE ! End useful area in x,y,z directions -! -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZGUESS ! Guess - ! variable (to be removed in the future !) -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAUCT -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAVCT -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAWCT - ! Antidiffusive contravariant component of the - ! momentum -! -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADV ! used -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVU ! for -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVV ! budget -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVW ! purpose -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRVARS ! only -! -CHARACTER (LEN=3) , DIMENSION(7) :: YRX -CHARACTER (LEN=20) :: YBURX -LOGICAL , DIMENSION(7) :: LBUDGET_R -! -INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -!JUAN : init of TZFIELDS_ll -NULLIFY(TZFIELDS_ll) -! -!* 0.3 PROLOGUE -! -CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -! -YRX(1) = 'RRV' -YRX(2) = 'RRC' -YRX(3) = 'RRR' -YRX(4) = 'RRI' -YRX(5) = 'RRS' -YRX(6) = 'RRG' -YRX(7) = 'RRH' -! -LBUDGET_R(1) = LBUDGET_RV -LBUDGET_R(2) = LBUDGET_RC -LBUDGET_R(3) = LBUDGET_RR -LBUDGET_R(4) = LBUDGET_RI -LBUDGET_R(5) = LBUDGET_RS -LBUDGET_R(6) = LBUDGET_RG -LBUDGET_R(7) = LBUDGET_RH -! -! -!------------------------------------------------------------------------------- -! -! -! -!* 1. Thermodynamical variable -! ----------------------- -! - CALL ADD3DFIELD_ll( TZFIELDS_ll, PRTHS, 'MPDATA::PRTHS' ) -! -!* 1st iteration (upstream scheme) -! - ZRVARS(:,:,:) = PRTHS(:,:,:) - ZFADVU(:,:,:) = -DXF(FXM( PTHM(:,:,:),PRUCT(:,:,:) ) ) - ZFADVV(:,:,:) = -DYF(FYM( PTHM(:,:,:),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(FZM( PTHM(:,:,:),PRWCT(:,:,:) ) ) -! - PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + ZFADVW(:,:,:) -! -! -!* Iterations greater than 1 -! - ZRAUCT(:,:,:)=PRUCT(:,:,:) - ZRAVCT(:,:,:)=PRVCT(:,:,:) - ZRAWCT(:,:,:)=PRWCT(:,:,:) -! - DO JLITER=2,KLITER -! -! update halo (and possibly periodize) the guess of the future time -! - CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -! - CALL ANTI_DIFF(HLBCX,HLBCY,PTSTEP,PRHODJ,PRTHS,ZRAUCT,ZRAVCT,ZRAWCT) -! - ZGUESS(:,:,:)=PTSTEP*PRTHS/PRHODJ(:,:,:) -! - ZFADV(:,:,:) = -DXF(FXM( ZGUESS(:,:,:),ZRAUCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVU(:,:,:) = ZFADVU(:,:,:) + ZFADV(:,:,:) - PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DYF(FYM( ZGUESS(:,:,:),ZRAVCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) - PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVW(:,:,:) = ZFADVW(:,:,:) + ZFADV(:,:,:) - PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADV(:,:,:) -! - END DO -! - CALL CLEANLIST_ll(TZFIELDS_ll) -! - IF (LBUDGET_TH) THEN - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVU(:,:,:) - CALL BUDGET (ZRVARS,4,'ADVX_BU_RTH') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVV(:,:,:) - CALL BUDGET (ZRVARS,4,'ADVY_BU_RTH') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVW(:,:,:) - CALL BUDGET (ZRVARS,4,'ADVZ_BU_RTH') - END IF -! -!------------------------------------------------------------------------------- -! -!* 2. Case with KRR water variables -! ----------------------------- -! - DO JRR=1,KRR - CALL ADD3DFIELD_ll( TZFIELDS_ll, PRRS(:,:,:,JRR), 'MPDATA::PRRS(:,:,:,JRR)' ) - ZRVARS(:,:,:) = PRRS(:,:,:,JRR) - ZFADVU(:,:,:) = -DXF(FXM( PRM(:,:,:,JRR),PRUCT(:,:,:) ) ) - ZFADVV(:,:,:) = -DYF(FYM( PRM(:,:,:,JRR),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(FZM( PRM(:,:,:,JRR),PRWCT(:,:,:) ) ) -! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + & - ZFADVW(:,:,:) -! - ZRAUCT(:,:,:)=PRUCT(:,:,:) - ZRAVCT(:,:,:)=PRVCT(:,:,:) - ZRAWCT(:,:,:)=PRWCT(:,:,:) -! - DO JLITER=2,KLITER - CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -! - CALL ANTI_DIFF(HLBCX,HLBCY,PTSTEP,PRHODJ,PRRS(:,:,:,JRR),ZRAUCT,ZRAVCT,ZRAWCT) -! - ZGUESS(:,:,:)=PTSTEP*PRRS(:,:,:,JRR)/PRHODJ(:,:,:) -! -! - ZFADV(:,:,:) = -DXF(FXM( ZGUESS(:,:,:),ZRAUCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVU(:,:,:) = ZFADVU(:,:,:) + ZFADV(:,:,:) - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DYF(FYM( ZGUESS(:,:,:),ZRAVCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVW(:,:,:) = ZFADVW(:,:,:) + ZFADV(:,:,:) - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADV(:,:,:) - END DO -! - CALL CLEANLIST_ll(TZFIELDS_ll) -! - IF (LBUDGET_R(JRR)) THEN - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVU(:,:,:) - YBURX = 'ADVX_BU_'//YRX(JRR) - CALL BUDGET (ZRVARS(:,:,:),JRR+5 ,YBURX) - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVV(:,:,:) - YBURX = 'ADVY_BU_'//YRX(JRR) - CALL BUDGET (ZRVARS(:,:,:),JRR+5 ,YBURX) - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVW(:,:,:) - YBURX = 'ADVZ_BU_'//YRX(JRR) - CALL BUDGET (ZRVARS(:,:,:),JRR+5 ,YBURX) - END IF - END DO -! -! -!------------------------------------------------------------------------------- -! -!* 3. TKE variable -! ------------- - IF (SIZE(PTKET,1) /= 0) THEN -! - CALL ADD3DFIELD_ll( TZFIELDS_ll, PRTKES, 'MPDATA::PRTKES' ) - ZRVARS(:,:,:) = PRTKES(:,:,:) - ZFADVU(:,:,:) = -DXF(FXM( PTKEM(:,:,:),PRUCT(:,:,:) ) ) - ZFADVV(:,:,:) = -DYF(FYM( PTKEM(:,:,:),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(FZM( PTKEM(:,:,:),PRWCT(:,:,:) ) ) -! - PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + ZFADVW(:,:,:) -! - ZRAUCT(:,:,:)=PRUCT(:,:,:) - ZRAVCT(:,:,:)=PRVCT(:,:,:) - ZRAWCT(:,:,:)=PRWCT(:,:,:) -! - DO JLITER=2,KLITER - CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -! - CALL ANTI_DIFF(HLBCX,HLBCY,PTSTEP,PRHODJ,PRTKES,ZRAUCT,ZRAVCT,ZRAWCT) -! - ZGUESS(:,:,:)=PTSTEP*PRTKES/PRHODJ(:,:,:) -! -! - ZFADV(:,:,:) = -DXF(FXM( ZGUESS(:,:,:),ZRAUCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVU(:,:,:) = ZFADVU(:,:,:) + ZFADV(:,:,:) - PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DYF(FYM( ZGUESS(:,:,:),ZRAVCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) - PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVW(:,:,:) = ZFADVW(:,:,:) + ZFADV(:,:,:) - PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADV(:,:,:) - END DO -! - CALL CLEANLIST_ll(TZFIELDS_ll) -! - IF (LBUDGET_TKE) THEN - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVU(:,:,:) - CALL BUDGET (ZRVARS,5,'ADVX_BU_RTKE') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVV(:,:,:) - CALL BUDGET (ZRVARS,5,'ADVY_BU_RTKE') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVW(:,:,:) - CALL BUDGET (ZRVARS,5,'ADVZ_BU_RTKE') - END IF - END IF -! -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE MPDATA diff --git a/src/MNH/mpdata_scalar.f90 b/src/MNH/mpdata_scalar.f90 deleted file mode 100644 index 48b6e1215..000000000 --- a/src/MNH/mpdata_scalar.f90 +++ /dev/null @@ -1,250 +0,0 @@ -!MNH_LIC Copyright 1995-2020 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_MPDATA_SCALAR -! ######################### -INTERFACE - SUBROUTINE MPDATA_SCALAR ( KLITER, HLBCX, HLBCY, KSV, & - PTSTEP, PRHODJ, PSVM, PSVT, & - PRUCT, PRVCT, PRWCT, PRSVS ) -! -INTEGER, INTENT(IN) :: KLITER ! Number of iterations MPDATA -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT ! Contravariants - ! components of the momentum -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -END SUBROUTINE MPDATA_SCALAR -! -END INTERFACE -! -END MODULE MODI_MPDATA_SCALAR -! -! -! ######################################################################## - SUBROUTINE MPDATA_SCALAR ( KLITER, HLBCX, HLBCY, KSV, & - PTSTEP, PRHODJ, PSVM, PSVT, & - PRUCT, PRVCT, PRWCT, PRSVS ) -! ######################################################################## -! -!!**** *MPDATA_SCALAR* - routine to compute the advection tendancies of the scalar -!! fields using an upstream scheme. The excesive numerical -!! correction of the scheme is corrected by means of an -!! antidiffusive velocity. -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the total advection -!! tendencies of all the scalar fields using the MPDATA scheme. -!! -!!** METHOD -!! ------ -!! MPDATA solves the advection of a quantity in the following way -!! 1.- 1st iteration. Upstream scheme. -!! The quantity is advected by the contravariant -!! velocities using an upstream scheme. -!! 2.- 2nd and next iterations. The excessive diffusion -!! of the upstream scheme is corrected by defining -!! the antidiffusive velocities (ANTI_DIFF routine) -!! and using for each iteration the upstream scheme. -!! EXTERNAL -!! -------- -!! ADD3DFIELD_ll : add a field to 3D-list -!! CLEANLIST_ll : deallocate a list -!! UPDATE_HALO_ll : update internal halos -!! DXF,DYF,DZF : Shuman operators -!! FXM,FYM,FZM : Flux operators -!! ANTI_DIFF : antidiffusion -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! Book1 of documentation ( MPDATA scheme ) -!! -!! AUTHOR -!! ------ -!! J. Vila-Guerau * Meteo France* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 30/10/95 -!! J.-P. Pinty & J.-M. Cohard *LA* Add the budget calls -!! J. Stein include the cyclic case -!! P. Jabouille parallelization -!! V. Masson 06/11/02 updates the budget calls -!! C.Lac Split meteorological scalar and tracer -!! variables routines -!! P.Tulet Upstream condition for aerosols -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODE_ll -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -! -USE MODD_BUDGET -USE MODD_PARAMETERS -USE MODD_NSV, ONLY : NSV_DSTBEG, NSV_DSTEND, NSV_AERBEG, NSV_AEREND,& - NSV_SLTBEG, NSV_SLTEND -! -USE MODI_SHUMAN -USE MODI_FLUX -USE MODI_ANTI_DIFF -USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KLITER ! Number of iterations MPDATA -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM - ! Variables at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT,PRVCT,PRWCT - ! Contravariants components momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT - ! Variables at t -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! Sources terms -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JLITER ! Loop index for MPDATA iterations -INTEGER :: JSV ! Loop index for Scalar Variables -! -INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER:: IIE,IJE ! End useful area in x,y,z directions -! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: ZGUESS ! Guess - ! variable (to be removed in the future !) -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAUCT -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAVCT -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRAWCT - ! Antidiffusive contravariant component of the - ! momentum -! -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADV ! used -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVU ! for -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVV ! budget -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZFADVW ! purpose -REAL, DIMENSION(SIZE(PRUCT,1),SIZE(PRUCT,2),SIZE(PRUCT,3)):: ZRVARS ! only -! -INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -NULLIFY(TZFIELDS_ll) -! -!* 0. PROLOGUE -! -CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -! -! -!------------------------------------------------------------------------------- -! -!* 1.- case with KSV Scalar Variables -! -------------------------------- - DO JSV=1,KSV -! - CALL ADD3DFIELD_ll( TZFIELDS_ll, PRSVS(:,:,:,JSV), 'MPDATA_SCALAR::PRSVS(:,:,:,JSV)' ) - ZRVARS(:,:,:) = PRSVS(:,:,:,JSV) - ZFADVU(:,:,:) = -DXF(FXM( PSVM(:,:,:,JSV),PRUCT(:,:,:) ) ) - ZFADVV(:,:,:) = -DYF(FYM( PSVM(:,:,:,JSV),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(FZM( PSVM(:,:,:,JSV),PRWCT(:,:,:) ) ) -! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + & - ZFADVW(:,:,:) -! - ZRAUCT(:,:,:)=PRUCT(:,:,:) - ZRAVCT(:,:,:)=PRVCT(:,:,:) - ZRAWCT(:,:,:)=PRWCT(:,:,:) -! - -! ANTI_DIFF of MPDATA not suported by aerosols variables - IF ((.NOT.((JSV .GE. NSV_AERBEG).AND.(JSV .LE. NSV_AEREND))).AND.& - (.NOT.((JSV .GE. NSV_DSTBEG).AND.(JSV .LE. NSV_DSTEND))).AND.& - (.NOT.((JSV .GE. NSV_SLTBEG).AND.(JSV .LE. NSV_SLTEND)))) THEN - - DO JLITER=2,KLITER - CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -! - CALL ANTI_DIFF(HLBCX,HLBCY,PTSTEP,PRHODJ,PRSVS(:,:,:,JSV),ZRAUCT,ZRAVCT,ZRAWCT) -! - ZGUESS(:,:,:)=PTSTEP*PRSVS(:,:,:,JSV)/PRHODJ(:,:,:) -! -! - ZFADV(:,:,:) = -DXF(FXM( ZGUESS(:,:,:),ZRAUCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVU(:,:,:) = ZFADVU(:,:,:) + ZFADV(:,:,:) - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DYF(FYM( ZGUESS(:,:,:),ZRAVCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADV(:,:,:) -! - ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. - IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. - IF(LNORTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJE,:)=0. - ZFADVW(:,:,:) = ZFADVW(:,:,:) + ZFADV(:,:,:) - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADV(:,:,:) - END DO - END IF -! - CALL CLEANLIST_ll(TZFIELDS_ll) -! - IF (LBUDGET_SV) THEN - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVU(:,:,:) - CALL BUDGET (ZRVARS,JSV+12,'ADVX_BU_RSV') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVV(:,:,:) - CALL BUDGET (ZRVARS,JSV+12,'ADVY_BU_RSV') - ZRVARS(:,:,:) = ZRVARS(:,:,:) + ZFADVW(:,:,:) - CALL BUDGET (ZRVARS,JSV+12,'ADVZ_BU_RSV') - END IF -! - END DO - -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE MPDATA_SCALAR diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 14b2b23d9..02cdc55d3 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -388,7 +388,6 @@ USE MODI_UPDATE_METRICS USE MODI_SET_REF USE MODI_SET_PERTURB USE MODI_TOTAL_DMASS -USE MODI_WGUESS USE MODI_CH_INIT_SCHEME_n USE MODI_CH_INIT_FIELD_n USE MODI_INI_NSV diff --git a/src/MNH/pressure.f90 b/src/MNH/pressure.f90 deleted file mode 100644 index f06d79f0a..000000000 --- a/src/MNH/pressure.f90 +++ /dev/null @@ -1,687 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_PRESSURE -!################### -! -INTERFACE -! - SUBROUTINE PRESSURE( & - HLBCX,HLBCY,HPRESOPT,KITR,OITRADJ,KTCOUNT,PRELAX,KMI, & - PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY,PDXHATM,PDYHATM,PRHOM, & - PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PPABSM, & - KRR,KRRL,KRRI,PDRYMASST,PREFMASS,PMASS_O_PHI0, & - PTHT,PRT,PRHODREF,PTHVREF,PRVREF,PEXNREF,PLINMASS, & - PRUS,PRVS,PRWS,PPABST,PRESIDUAL) -! -IMPLICIT NONE -! -CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type -CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type -! -CHARACTER (LEN=5), INTENT(IN) :: HPRESOPT ! choice of the pressure solver -! -INTEGER, INTENT(INOUT) :: KITR ! number of iterations for the - ! pressure solver -LOGICAL, INTENT(IN) :: OITRADJ ! switch to adjust or not KITR -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for - ! the Richardson's method -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state - ! * J -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients -! -REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(IN) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(IN) :: PRHOM ! mean of XRHODJ on the plane x y - ! localized at a mass level -! -REAL, DIMENSION(:), INTENT(IN) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF ! elements of the tri-diag. - ! matrix in the pressure eq. -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXY ! - along y -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! pressure (t-dt) -! -INTEGER, INTENT(IN) :: KRR ! Total number of water var. -INTEGER, INTENT(IN) :: KRRL ! Number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! Number of ice water var. -! -REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air and of -REAL, INTENT(IN) :: PREFMASS ! the ref. atmosphere -REAL, INTENT(IN) :: PMASS_O_PHI0 ! Mass / Phi0 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Temperature and water -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! variables at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry Density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVREF ! mixing ratio of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Exner function - ! of the reference state -REAL, INTENT(IN) :: PLINMASS ! lineic mass through - ! open boundaries -! -REAL, INTENT(INOUT) :: PRUS(:,:,:) ! source term along x -REAL, INTENT(INOUT) :: PRVS(:,:,:) ! source term along y -REAL, INTENT(INOUT) :: PRWS(:,:,:) ! source term along z -! -REAL, INTENT(INOUT) :: PPABST(:,:,:) ! pressure(t) -!JUAN -REAL, OPTIONAL :: PRESIDUAL -!JUAN -! -END SUBROUTINE PRESSURE -! -END INTERFACE -! -END MODULE MODI_PRESSURE -! ###################################################################### - SUBROUTINE PRESSURE( & - HLBCX,HLBCY,HPRESOPT,KITR,OITRADJ,KTCOUNT,PRELAX,KMI, & - PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY,PDXHATM,PDYHATM,PRHOM, & - PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PPABSM, & - KRR,KRRL,KRRI,PDRYMASST,PREFMASS,PMASS_O_PHI0, & - PTHT,PRT,PRHODREF,PTHVREF,PRVREF,PEXNREF,PLINMASS, & - PRUS,PRVS,PRWS,PPABST,PRESIDUAL) -! ###################################################################### -! -!!**** *PRESSURE * - solve the pressure equation and add the pressure term -!! to the sources -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to solve the pressure equation: -! with either the conjugate gradient method or the Richardson's method. -! The pressure gradient is added to the sources in order -! to nullify the divergence of the momentum* Thetavref*(1+Rvref) -! at the time t+dt. -! -!!** METHOD -!! ------ -!! The divergence of the sources ( RHS of the pressure equation ) is -!! computed. The pressure equation is then solved by either CG method, -!! either Richardson's method, or an exact method. Finally, the pressure -!! gradient is added to the sources RUS, RVS, RWS. -!! Finally, the absolute pressure is diagnozed from the total mass -!! included in the simulation domain. -!! -!! EXTERNAL -!! -------- -!! Subroutine MASS_LEAK : assures global non-divergence condition in the -!! case of open boundaries -!! Subroutine FLAT_INV : solve the pressure equation for the case -!! without orography -!! Subroutine RICHARDSON: solve the pressure equation with the -!! Richardson's method -!! Subroutine CONJGRAD : solve the pressure equation with the Conjugate -!! Gradient algorithm -!! 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 -!! Subroutine GDIV : compute J times the divergence of 1/J times a vector -!! 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 P_ABS : compute the constant for PABS and therefore, the -!! absolute pressure function -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CONF: model configuration -!! LFLAT: logical switch for zero orography -!! L2D : logical switch for two-dimensional configuration -!! LCARTESIAN : logical switch for cartesian geometry -!! Module MODD_PARAMETERS: declaration of parameter variables -!! JPHEXT, JPVEXT: define the number of marginal points out of the -!! physical domain along horizontal and vertical directions respectively -!! Module MODD_CST: physical constants -!! XCPD -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (subroutine PRESSURE) + Book1 ( ) -!! -!! AUTHOR -!! ------ -!! P. Hereil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/07/94 -!! Modification 03/01/95 (Lafore) To add the absolute pressure diagnosis -!! Modification 31/01/95 (Stein) Copy of the pressure function in the -!! 2D case in the two outermost planes -!! Modification 16/02/95 (Mallet) Add the call to MASS_LEAK -!! Modification 16/03/95 (Stein) change the argument list of the -!! gradient and remove R from the historical var. -!! Modification 30/06/95 (Stein) Add a test not to compute the absolute -!! pressure in the Boussinesq case -!! 16/10/95 (J. Stein) change the budget calls -!! 29/01/96 (J. Stein) call iterative resolution for -!! non-cartessian geometry -!! 19/12/96 (J.-P. Pinty) update the budget calls -!! 14/01/97 (Stein,Lafore) New anelastic equations -!! 17/12/97 ( Stein )include the case of non-vanishing -!! orography at the lbc -!! 26/03/98 (Stein,Jabouille) fix the value of the corner point -!! 15/06/98 (D.Lugato, R.Guivarch) Parallelisation -!! 25/08/99 (J.-P. Pinty) add CRESI option to CPRESOPT -!! 06/11/02 (V. Masson) update the budget calls -!! 24/08/2005 (J. escobar) BUG : remove IIE+1, IJE+1 out of bound -!! references in parallel run -!! 08/2010 (V.Masson, C.Lac) Add UPDATE_HALO -!! 11/2010 (V.Masson, C.Lac) PPABST, must not be cyclic => add temp array -!! to save it before UPDATE_HALO -!! 06/2011 (J.escobar ) Bypass Bug with ifort11/12 on HLBCX,HLBCY -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -USE MODD_BUDGET -USE MODD_CONF -USE MODD_CST -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODI_MASS_LEAK -USE MODI_GDIV -USE MODI_FLAT_INV -USE MODI_RICHARDSON -USE MODI_CONJGRAD -USE MODI_CONRESOL -USE MODI_GRADIENT_M -USE MODI_SHUMAN -USE MODI_P_ABS -USE MODI_BUDGET -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! - CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type - CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type -! -CHARACTER (LEN=5), INTENT(IN) :: HPRESOPT ! choice of the pressure solver -! -INTEGER, INTENT(INOUT) :: KITR ! number of iterations for the - ! pressure solver -LOGICAL, INTENT(IN) :: OITRADJ ! switch to adjust or not KITR -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for - ! the Richardson's method -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state - ! * J -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients -! -REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(IN) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(IN) :: PRHOM ! mean of XRHODJ on the plane x y - ! localized at a mass level -! -REAL, DIMENSION(:), INTENT(IN) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF ! elements of the tri-diag. - ! matrix in the pressure eq. -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXY ! - along y -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! pressure (t-dt) -! -INTEGER, INTENT(IN) :: KRR ! Total number of water var. -INTEGER, INTENT(IN) :: KRRL ! Number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! Number of ice water var. -! -REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air and of -REAL, INTENT(IN) :: PREFMASS ! the ref. atmosphere -REAL, INTENT(IN) :: PMASS_O_PHI0 ! Mass / Phi0 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Temperature and water -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! variables at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry Density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVREF ! mixing ratio of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Exner function - ! of the reference state -REAL, INTENT(IN) :: PLINMASS ! lineic mass through - ! open boundaries -! -REAL, INTENT(INOUT) :: PRUS(:,:,:) ! source term along x -REAL, INTENT(INOUT) :: PRVS(:,:,:) ! source term along y -REAL, INTENT(INOUT) :: PRWS(:,:,:) ! source term along z -! -REAL, INTENT(INOUT) :: PPABST(:,:,:) ! pressure(t) -!JUAN -REAL, OPTIONAL :: PRESIDUAL -!JUAN -! -! -!* 0.2 declarations of local variables -! -! Metric coefficients: -! -REAL, DIMENSION(SIZE(PPABSM,1),SIZE(PPABSM,2),SIZE(PPABSM,3)) :: ZDV_SOURCE -! ! divergence of the sources -! -INTEGER :: IIB ! indice I for the first inner mass point along x -INTEGER :: IIE ! indice I for the last inner mass point along x -INTEGER :: IJB ! indice J for the first inner mass point along y -INTEGER :: IJE ! indice J for the last inner mass point along y -INTEGER :: IKB ! indice K for the first inner mass point along z -INTEGER :: IKE ! indice K for the last inner mass point along z -INTEGER :: ILUOUT ! Logical unit of output listing -! -REAL, DIMENSION(SIZE(PPABSM,1),SIZE(PPABSM,2),SIZE(PPABSM,3)) :: ZTHETAV, & - ! virtual potential temperature - ZPHIT - ! MAE + DUR => Exner function perturbation - ! LHE => Exner function perturbation * CPD * THVREF -! -REAL :: ZRV_OV_RD ! XRV / XRD -REAL :: ZMAXVAL, ZMAXRES ! for print -INTEGER, DIMENSION(3) :: IMAXLOC ! purpose -INTEGER :: JWATER ! loop index on water species -INTEGER :: IIU,IJU,IKU ! array sizes in I,J,K -INTEGER :: JK ! loop index on the vertical levels -INTEGER :: JI,JJ -! -REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,3)) :: ZPABS_S ! local pressure on southern side -REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,3)) :: ZPABS_N ! local pressure on northern side -REAL, DIMENSION(SIZE(PDYY,2),SIZE(PDXX,3)) :: ZPABS_E ! local pressure on eastern side -REAL, DIMENSION(SIZE(PDYY,2),SIZE(PDXX,3)) :: ZPABS_W ! local pressure on western side -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -TYPE(LIST_ll), POINTER :: TZFIELDS_2_ll ! list of fields to exchange -! -! -!------------------------------------------------------------------------------ -!------------------------------------------------------------------------------- -NULLIFY(TZFIELDS_ll) -NULLIFY(TZFIELDS_2_ll) -! -!* 1. PRELIMINARIES -! ------------- -! -ILUOUT = TLUOUT%NLU -! -CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -! -IKB= 1+JPVEXT -IKU= SIZE(PPABSM,3) -IKE= IKU - JPVEXT -! -ZPABS_S(:,:) = 0. -ZPABS_N(:,:) = 0. -ZPABS_E(:,:) = 0. -ZPABS_W(:,:) = 0. -! -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE LINEIC MASS -! ----------------------- -! -IF ( ANY(HLBCX(:)=='OPEN') .OR. ANY(HLBCY(:)=='OPEN') ) THEN - CALL MASS_LEAK(PDXX,PDYY,HLBCX,HLBCY,PLINMASS,PRHODJ,PRUS,PRVS) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. COMPUTE THE FORCING TERM FOR THE PRESSURE EQUATION -! -------------------------------------------------- -! -! -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRUS, 'PRESSURE::PRUS' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRVS, 'PRESSURE::PRVS' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRWS, 'PRESSURE::PRWS' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) -! -! The non-homogenous Neuman problem is transformed in an homogenous Neuman -! problem in the non-periodic cases -IF (HLBCX(1) /= 'CYCL') THEN - IF (LWEST_ll()) ZDV_SOURCE(IIB-1,:,:) = 0. - IF (LEAST_ll()) ZDV_SOURCE(IIE+1,:,:) = 0. -ENDIF -! -IF (.NOT. L2D .AND. HLBCY(1) /= 'CYCL') THEN - IF (LSOUTH_ll()) ZDV_SOURCE(:,IJB-1,:) = 0. - IF (LNORTH_ll()) ZDV_SOURCE(:,IJE+1,:) = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 5. SOLVE THE PRESSURE EQUATION -! --------------------------- -! -! -!* 5.1 Compute the virtual theta and the pressure perturbation -! ------------------------------------------------------- -! -IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - IF(KRR > 0) THEN - ! - ! compute the ratio : 1 + total water mass / dry air mass - ZRV_OV_RD = XRV / XRD - ZTHETAV(:,:,:) = 1. + PRT(:,:,:,1) - DO JWATER = 2 , 1+KRRL+KRRI - ZTHETAV(:,:,:) = ZTHETAV(:,:,:) + PRT(:,:,:,JWATER) - END DO - ! compute the virtual potential temperature when water is present in any - ! form - ZTHETAV(:,:,:) = PTHT(:,:,:) * (1. + PRT(:,:,:,1) * ZRV_OV_RD) / ZTHETAV(:,:,:) - ELSE - ! compute the virtual potential temperature when water is absent - ZTHETAV(:,:,:) = PTHT(:,:,:) - END IF - ! - ZPHIT(:,:,:)=(PPABSM(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:) - ! -ELSEIF(CEQNSYS=='LHE') THEN - ZPHIT(:,:,:)= ((PPABSM(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:)) & - * XCPD * PTHVREF(:,:,:) - ! -END IF -! -IF(CEQNSYS=='LHE'.AND. LFLAT .AND. LCARTESIAN) THEN - ! flat cartesian LHE case -> exact solution - ! - CALL FLAT_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZDV_SOURCE,ZPHIT) -ELSE - SELECT CASE(HPRESOPT) - CASE('RICHA') ! Richardson's method -! - CALL RICHARDSON(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,KTCOUNT,PRELAX,ZDV_SOURCE,ZPHIT) -! - CASE('CGRAD') ! Conjugate Gradient method - CALL CONJGRAD(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT) -! - CASE('CRESI') ! Conjugate Residual method - CALL CONRESOL(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT) - END SELECT -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. ADD THE PRESSURE GRADIENT TO THE SOURCES -! ---------------------------------------- -! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) ZPHIT(IIB-1,:,IKB-1) = ZPHIT(IIB,:,IKB-1) - IF(LEAST_ll()) ZPHIT(IIE+1,:,IKB-1) = ZPHIT(IIE,:,IKB-1) -ENDIF -IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,IKB-1) = ZPHIT(:,IJB,IKB-1) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,IKB-1) = ZPHIT(:,IJE,IKB-1) -ENDIF -! -IF ( L2D ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,:) = ZPHIT(:,IJB,:) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,:) = ZPHIT(:,IJB,:) -END IF -! -ZDV_SOURCE = GX_M_U(1,IKU,1,ZPHIT,PDXX,PDZZ,PDZX) -! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) THEN -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! - DO JK=2,IKU-1 - ZDV_SOURCE(2,:,JK)= & - (ZPHIT(2,:,JK) - ZPHIT(1,:,JK) - 0.5 * ( & - PDZX(2,:,JK) * (ZPHIT(2,:,JK)-ZPHIT(2,:,JK-1)) / PDZZ(2,:,JK) & - +PDZX(2,:,JK+1) * (ZPHIT(2,:,JK+1)-ZPHIT(2,:,JK)) / PDZZ(2,:,JK+1) & - ) & - ) / PDXX(2,:,JK) - END DO - ENDIF - ! - IF(LEAST_ll()) THEN - DO JK=2,IKU-1 - ZDV_SOURCE(IIU,:,JK)= & - (ZPHIT(IIU,:,JK) - ZPHIT(IIU-1,:,JK) - 0.5 * ( & - PDZX(IIU,:,JK) * (ZPHIT(IIU-1,:,JK)-ZPHIT(IIU-1,:,JK-1)) & - / PDZZ(IIU-1,:,JK) & - +PDZX(IIU,:,JK+1) * (ZPHIT(IIU-1,:,JK+1)-ZPHIT(IIU-1,:,JK)) & - / PDZZ(IIU-1,:,JK+1) & - ) & - ) / PDXX(IIU,:,JK) - END DO - END IF -END IF -! -IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) -ELSEIF(CEQNSYS=='LHE') THEN - PRUS = PRUS - MXM(PRHODJ) * ZDV_SOURCE - PRWS = PRWS - MZM(PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) -END IF -! -IF(.NOT. L2D) THEN -! - ZDV_SOURCE = GY_M_V(1,IKU,1,ZPHIT,PDYY,PDZZ,PDZY) -! - IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! - DO JK=2,IKU-1 - ZDV_SOURCE(:,2,JK)= & - (ZPHIT(:,2,JK) - ZPHIT(:,1,JK) - 0.5 * ( & - PDZY(:,2,JK) * (ZPHIT(:,2,JK)-ZPHIT(:,2,JK-1)) / PDZZ(:,2,JK) & - +PDZY(:,2,JK+1) * (ZPHIT(:,2,JK+1)-ZPHIT(:,2,JK)) / PDZZ(:,2,JK+1) & - ) & - ) / PDYY(:,2,JK) - END DO - END IF - ! - IF (LNORTH_ll()) THEN - DO JK=2,IKU-1 - ZDV_SOURCE(:,IJU,JK)= & - (ZPHIT(:,IJU,JK) - ZPHIT(:,IJU-1,JK) - 0.5 * ( & - PDZY(:,IJU,JK) * (ZPHIT(:,IJU-1,JK)-ZPHIT(:,IJU-1,JK-1)) & - / PDZZ(:,IJU-1,JK) & - +PDZY(:,IJU,JK+1) * (ZPHIT(:,IJU-1,JK+1)-ZPHIT(:,IJU-1,JK)) & - / PDZZ(:,IJU-1,JK+1) & - ) & - ) / PDYY(:,IJU,JK) - END DO - END IF - END IF -! - IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRVS = PRVS - MYM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - ELSEIF(CEQNSYS=='LHE') THEN - PRVS = PRVS - MYM(PRHODJ) * ZDV_SOURCE - END IF -END IF -! -!! same boundary conditions as in gdiv ... !! (provisory coding) -!! (necessary when NVERB=1) -DO JJ = IJB,IJE ! copy the horizontal components under - DO JI = IIB,IIE - PRUS(JI,JJ,IKB-1)=PRUS(JI,JJ,IKB) - PRUS(JI,JJ,IKE+1)=PRUS(JI,JJ,IKE) - END DO -END DO -! -DO JJ = IJB,IJE - DO JI = IIB,IIE ! the ground and above the top - PRVS(JI,JJ,IKB-1)=PRVS(JI,JJ,IKB) - PRVS(JI,JJ,IKE+1)=PRVS(JI,JJ,IKE) - END DO -END DO -!! -! -! compute the residual divergence -CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) -! -IF ( CEQNSYS=='DUR' ) THEN - IF ( SIZE(PRVREF,1) == 0 ) THEN - ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF - ELSE - ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF*(1.+PRVREF) - END IF -ELSEIF( CEQNSYS=='MAE' .OR. CEQNSYS=='LHE' ) THEN - ZDV_SOURCE=ZDV_SOURCE/PRHODJ*PRHODREF -END IF -! -ZMAXVAL=MAX_ll(ABS(ZDV_SOURCE),IINFO_ll) -IF (PRESENT(PRESIDUAL)) PRESIDUAL = ZMAXVAL -IMAXLOC=MAXLOC( ABS(ZDV_SOURCE(IIB:IIE,IJB:IJE,IKB:IKE))) !provisory coding one one processor only -! -WRITE(ILUOUT,*) 'residual divergence / 2 DT', ZMAXVAL, & - ' located at ', IMAXLOC -! number of iterations adjusted -IF (LFLAT .AND. LCARTESIAN) THEN - ZMAXRES = 1.E-12 -ELSE - ZMAXRES = 1.E-9 -END IF -! -IF (OITRADJ) THEN - IF (ZMAXVAL>10.*ZMAXRES) THEN - KITR=KITR+2 - WRITE(ILUOUT,*) 'NITR adjusted to ', KITR - ELSE IF (ZMAXVAL<ZMAXRES) THEN - KITR=MAX(KITR-1,1) - WRITE(ILUOUT,*) 'NITR adjusted to ', KITR - ENDIF -ENDIF -! -!* 7. STORAGE OF THE FIELDS IN BUDGET ARRAYS -! -------------------------------------- -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'PRES_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'PRES_BU_RV') -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'PRES_BU_RW') -! -!------------------------------------------------------------------------------- -! -!* 8. ABSOLUTE PRESSURE COMPUTATION -! ----------------------------- -! -!IF ( ABS(PRHODREF(IIB,IJB,IKB)-PRHODREF(IIB,IJB,IKE)) > 1.E-16 & -IF ( ABS(PRHODREF(IIB,IJB,IKB)-PRHODREF(IIB,IJB,IKE)) > 1.E-12 & - .AND. KTCOUNT >0 ) THEN - CALL P_ABS ( KRR, KRRL, KRRI, PDRYMASST, PREFMASS, PMASS_O_PHI0, & - PTHT, PRT, PRHODJ, PRHODREF, ZTHETAV, PTHVREF, & - PRVREF, PEXNREF, ZPHIT ) -! - IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PPABST(:,:,:)=XP00*(ZPHIT+PEXNREF)**(XCPD/XRD) - ELSEIF(CEQNSYS=='LHE') THEN - PPABST(:,:,:)=XP00*(ZPHIT/(XCPD*PTHVREF)+PEXNREF)**(XCPD/XRD) - ENDIF -! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - ZPABS_W(:,:)= PPABST(IIB,:,:) - END IF -! - IF (LEAST_ll()) THEN - ZPABS_E(:,:)= PPABST(IIE+1,:,:) - END IF -! - END IF -! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - ZPABS_S(:,:)= PPABST(:,IJB,:) - END IF -! - IF (LNORTH_ll()) THEN - ZPABS_N(:,:)= PPABST(:,IJE+1,:) - END IF -! - END IF -! - CALL ADD3DFIELD_ll( TZFIELDS_2_ll, PPABST, 'PRESSURE::PPABST' ) - CALL UPDATE_HALO_ll(TZFIELDS_2_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_2_ll) -! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - PPABST(IIB,:,:) = ZPABS_W(:,:) - END IF -! - IF (LEAST_ll()) THEN - PPABST(IIE+1,:,:) = ZPABS_E(:,:) - END IF -! - END IF -! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - PPABST(:,IJB,:) = ZPABS_S(:,:) - END IF -! - IF (LNORTH_ll()) THEN - PPABST(:,IJE+1,:) = ZPABS_N(:,:) - END IF -! - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE PRESSURE diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 68ae9f8b9..86d118fae 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -296,11 +296,9 @@ USE MODE_ll ! USE MODI_BUDGET USE MODI_C2R2_ADJUST -USE MODI_C3R5_ADJUST USE MODI_FAST_TERMS USE MODI_GET_HALO USE MODI_ICE_ADJUST -USE MODI_ICE_C1R3 USE MODI_KHKO_NOTADJUST USE MODI_LIMA USE MODI_LIMA_ADJUST diff --git a/src/MNH/select_std_pgd.f90 b/src/MNH/select_std_pgd.f90 deleted file mode 100644 index 355f99426..000000000 --- a/src/MNH/select_std_pgd.f90 +++ /dev/null @@ -1,306 +0,0 @@ -!MNH_LIC Copyright 1997-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_SELECT_STD_PGD -! ########################## -INTERFACE - SUBROUTINE SELECT_STD_PGD(HFIELD_NAME,PFIELD) -! -CHARACTER(LEN=*), INTENT(IN) :: HFIELD_NAME ! pgd field name -REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD ! pgd field -! -END SUBROUTINE SELECT_STD_PGD -END INTERFACE -END MODULE MODI_SELECT_STD_PGD -! -! ###################################### - SUBROUTINE SELECT_STD_PGD(HFIELD_NAME,PFIELD) -! ###################################### -! -!!**** -!! -!! PURPOSE -!! ------- -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 15/12/97 -!! F.Solmon 06/00 patch approach : Rq -!! value of surface variable are atributed to NPT_USER class -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -USE MODD_LUNIT -USE MODD_PGDFIELDS -! -! -USE MODD_GROUND_PAR -! -! -USE MODI_PGD_INDEX -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -! -CHARACTER(LEN=*), INTENT(IN) :: HFIELD_NAME ! pgd field name -REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD ! pgd field -! -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -! -CHARACTER(LEN=20) :: YFIELD -! -!------------------------------------------------------------------------------- -! -YFIELD=' ' -YFIELD=HFIELD_NAME//YFIELD -! -SELECT CASE (YFIELD) -! -!* 1. Vegetation parameters -! --------------------- -! -! - CASE('VEG ') - LNOCLASS_PGD0(PGD_INDEX('VEG'))=.TRUE. - XPGDVEG(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('LAI ') - LNOCLASS_PGD0(PGD_INDEX('LAI'))=.TRUE. - XPGDLAI(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('RSMIN ') - LNOCLASS_PGD0(PGD_INDEX('RSMIN'))=.TRUE. - XPGDRSMIN(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('GAMMA ') - LNOCLASS_PGD0(PGD_INDEX('GAMMA'))=.TRUE. - XPGDGAMMA(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('RGL ') - LNOCLASS_PGD0(PGD_INDEX('RGL'))=.TRUE. - XPGDRGL(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('CV ') - LNOCLASS_PGD0(PGD_INDEX('CV'))=.TRUE. - XPGDCV(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('DG2 ') - LNOCLASS_PGD0(PGD_INDEX('DG2'))=.TRUE. - XPGDDG(:,:,2,NPT_USER) = PFIELD (:,:) - -! - CASE('DG3 ') - LNOCLASS_PGD0(PGD_INDEX('DG3'))=.TRUE. - XPGDDG(:,:,3,NPT_USER) = PFIELD (:,:) - -! - CASE('Z0VEG ') - LNOCLASS_PGD0(PGD_INDEX('Z0VEG'))=.TRUE. - XPGDZ0VEG(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('Z0HVEG ') - LNOCLASS_PGD0(PGD_INDEX('Z0HVEG'))=.TRUE. - XPGDZ0HVEG(:,:,NPT_USER) = PFIELD (:,:) - - CASE('ALBNIR_ECO ') - LNOCLASS_PGD0(PGD_INDEX('ALBNIR_ECO'))=.TRUE. - XPGDALBNIR_ECO(:,:,NPT_USER) = PFIELD (:,:) -! - CASE('ALBVIS_ECO ') - LNOCLASS_PGD0(PGD_INDEX('ALBVIS_ECO'))=.TRUE. - XPGDALBVIS_ECO(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('EMIS_ECO ') - LNOCLASS_PGD0(PGD_INDEX('EMIS_ECO'))=.TRUE. - XPGDEMIS_ECO(:,:,NPT_USER) = PFIELD (:,:) - -! - CASE('GMES ') - LNOCLASS_PGD0(PGD_INDEX('GMES'))=.TRUE. - XPGDGMES(:,:,NPT_USER) =PFIELD (:,:) - -! - CASE('BSLAI ') - LNOCLASS_PGD0(PGD_INDEX('BSLAI'))=.TRUE. - XPGDBSLAI(:,:,NPT_USER) =PFIELD (:,:) - -! - CASE('LAIMIN ') - LNOCLASS_PGD0(PGD_INDEX('LAIMIN'))=.TRUE. - XPGDLAIMIN(:,:,NPT_USER) =PFIELD (:,:) - -! - CASE('SEFOLD ') - LNOCLASS_PGD0(PGD_INDEX('SEFOLD'))=.TRUE. - XPGDSEFOLD(:,:,NPT_USER) =PFIELD (:,:) - -! - CASE('H_TREE ') - LNOCLASS_PGD0(PGD_INDEX('H_TREE'))=.TRUE. - XPGDH_TREE(:,:,NPT_USER) =PFIELD (:,:) - -! -!------------------------------------------------------------------------------- -! -!* 2. Town parameters -! --------------- -! - CASE('Z0_TOWN ') - LNOCLASS_PGD0(PGD_INDEX('Z0_TOWN'))=.TRUE. - XPGDZ0_TOWN(:,:) = PFIELD (:,:) -! - CASE('ALBNIR_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('ALBNIR_ROOF'))=.TRUE. - XPGDALBNIR_ROOF(:,:) = PFIELD (:,:) -! - CASE('ALBVIS_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('ALBVIS_ROOF'))=.TRUE. - XPGDALBVIS_ROOF(:,:) = PFIELD (:,:) -! - CASE('EMIS_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('EMIS_ROOF'))=.TRUE. - XPGDEMIS_ROOF(:,:) = PFIELD (:,:) -! - CASE('HC_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('HC_ROOF'))=.TRUE. - XPGDHC_ROOF(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDHC_ROOF,3)) -! - CASE('TC_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('TC_ROOF'))=.TRUE. - XPGDTC_ROOF(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDTC_ROOF,3)) -! - CASE('D_ROOF ') - LNOCLASS_PGD0(PGD_INDEX('D_ROOF'))=.TRUE. - XPGDD_ROOF(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDD_ROOF,3)) -! - CASE('ALBNIR_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('ALBNIR_ROAD'))=.TRUE. - XPGDALBNIR_ROAD(:,:) = PFIELD (:,:) -! - CASE('ALBVIS_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('ALBVIS_ROAD'))=.TRUE. - XPGDALBVIS_ROAD(:,:) = PFIELD (:,:) -! - CASE('EMIS_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('EMIS_ROAD'))=.TRUE. - XPGDEMIS_ROAD(:,:) = PFIELD (:,:) -! - CASE('HC_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('HC_ROAD'))=.TRUE. - XPGDHC_ROAD(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDHC_ROAD,3)) -! - CASE('TC_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('TC_ROAD'))=.TRUE. - XPGDTC_ROAD(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDTC_ROAD,3)) -! - CASE('D_ROAD ') - LNOCLASS_PGD0(PGD_INDEX('D_ROAD'))=.TRUE. - XPGDD_ROAD(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDD_ROAD,3)) -! - CASE('ALBNIR_WALL ') - LNOCLASS_PGD0(PGD_INDEX('ALBNIR_WALL'))=.TRUE. - XPGDALBNIR_WALL(:,:) = PFIELD (:,:) -! - CASE('ALBVIS_WALL ') - LNOCLASS_PGD0(PGD_INDEX('ALBVIS_WALL'))=.TRUE. - XPGDALBVIS_WALL(:,:) = PFIELD (:,:) -! - CASE('EMIS_WALL ') - LNOCLASS_PGD0(PGD_INDEX('EMIS_WALL'))=.TRUE. - XPGDEMIS_WALL(:,:) = PFIELD (:,:) -! - CASE('HC_WALL ') - LNOCLASS_PGD0(PGD_INDEX('HC_WALL'))=.TRUE. - XPGDHC_WALL(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDHC_WALL,3)) -! - CASE('TC_WALL ') - LNOCLASS_PGD0(PGD_INDEX('TC_WALL'))=.TRUE. - XPGDTC_WALL(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDTC_WALL,3)) -! - CASE('D_WALL ') - LNOCLASS_PGD0(PGD_INDEX('D_WALL'))=.TRUE. - XPGDD_WALL(:,:,:) = SPREAD(PFIELD (:,:),3,SIZE(XPGDD_WALL,3)) -! - CASE('BLD ') - LNOCLASS_PGD0(PGD_INDEX('BLD'))=.TRUE. - XPGDBLD(:,:) = PFIELD (:,:) -! - CASE('BLD_HEIGHT ') - LNOCLASS_PGD0(PGD_INDEX('BLD_HEIGHT'))=.TRUE. - XPGDBLD_HEIGHT(:,:) = PFIELD (:,:) -! - CASE('BLD_HL_RATIO ') - LNOCLASS_PGD0(PGD_INDEX('BLD_HL_RATIO'))=.TRUE. - XPGDBLD_HL_RATIO(:,:) = PFIELD (:,:) -! - CASE('CAN_HW_RATIO ') - LNOCLASS_PGD0(PGD_INDEX('CAN_HW_RATIO'))=.TRUE. - XPGDCAN_HW_RATIO(:,:) = PFIELD (:,:) -! - CASE('H_TRAFFIC ') - LNOCLASS_PGD0(PGD_INDEX('H_TRAFFIC'))=.TRUE. - XPGDH_TRAFFIC(:,:) = PFIELD (:,:) -! - CASE('LE_TRAFFIC ') - LNOCLASS_PGD0(PGD_INDEX('LE_TRAFFIC'))=.TRUE. - XPGDLE_TRAFFIC(:,:) = PFIELD (:,:) -! - CASE('H_INDUSTRY ') - LNOCLASS_PGD0(PGD_INDEX('H_INDUSTRY'))=.TRUE. - XPGDH_INDUSTRY(:,:) = PFIELD (:,:) -! - CASE('LE_INDUSTRY ') - LNOCLASS_PGD0(PGD_INDEX('LE_INDUSTRY'))=.TRUE. - XPGDLE_INDUSTRY(:,:) = PFIELD (:,:) -! -!------------------------------------------------------------------------------- -! - CASE DEFAULT - - PRINT*, ' ' - PRINT*, 'The field ',HFIELD_NAME, ' is not yet a standard PGD field.' - PRINT*, 'IT WILL NOT BE SAVED ON THE PGD FILE.' - PRINT*, ' ' - -END SELECT -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE SELECT_STD_PGD diff --git a/src/MNH/trid.f90 b/src/MNH/trid.f90 deleted file mode 100644 index db2600ee0..000000000 --- a/src/MNH/trid.f90 +++ /dev/null @@ -1,645 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_TRID -! ################ -! -INTERFACE -! - SUBROUTINE TRID(HLBCX,HLBCY, & - PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & - PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY ) -! -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 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! scale factor -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -! -REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction -REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction -! -REAL, INTENT(OUT) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(OUT) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(OUT) :: PRHOM ! mean of XRHODJ on the plane - ! x y localized at a mass - ! level -! -REAL, DIMENSION(:), INTENT(OUT) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFY ! elements (yslice) of the tri-diag. - ! matrix in the pressure eq. -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXY ! - along y - -! -END SUBROUTINE TRID -! -END INTERFACE -! -END MODULE MODI_TRID -! -! ################################################################### - SUBROUTINE TRID(HLBCX,HLBCY, & - PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & - PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY ) -! #################################################################### -! -!!**** *TRID * - Compute coefficients for the flat operator -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical time independent -! coefficients a(k), b(k), c(k) required for the calculation of the "flat" -! (i.e. neglecting the orography) operator Laplacian. RHOJ is averaged on -! the whole horizontal domain. The form of the eigenvalues of the flat -! operator depends on the lateral boundary conditions. Furthermore, this -! routine initializes TRIGS and IFAX arrays required for the FFT transform -! used in the routine PRECOND. -! -!!** METHOD -!! ------ -!! The forms of the eigenvalues of the horizontal Laplacian are given by: -!! Cyclic conditions: -!! ----------------- -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( imax ) <dyy> <dyy> ( jmax ) -!! -!! Open conditions: -!! ----------------- -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( 2imax ) <dyy> <dyy> ( 2jmax ) -!! -!! Cyclic condition along x and open condition along y: -!! ------------------------------------------------------ -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( imax ) <dyy> <dyy> ( 2jmax ) -!! -!! Open condition along x and cyclic condition along y: -!! ------------------------------------------------------ -!! <rhoj> 2 ( pi ) <rhoj> 2 ( pi ) -!! b(m,n) = -4 ----------- sin (----- m ) -4 ----------- sin (----- n ) -!! <dxx> <dxx> ( 2imax ) <dyy> <dyy> ( jmax ) -!! -!! where m = 0,1,2....imax-1, n = 0,1,2....jmax-1 -!! Note that rhoj contains the Jacobian J = Deltax*Deltay*Deltaz = volume of -!! an elementary mesh. - -!! -!! EXTERNAL -!! -------- -!! Function FFTFAX: initialization of TRIGSX,IFAXX,TRIGSY,IFAXY for -!! the FFT transform -!! GET_DIM_EXT_ll : get extended sub-domain sizes -!! GET_INDICE_ll : get physical sub-domain bounds -!! GET_DIM_PHYS_ll : get physical sub-domain sizes -!! GET_GLOBALDIMS_ll : get physical global domain sizes -!! GET_OR_ll : get origine coordonates of the physical sub-domain in global indices -!! REDUCESUM_ll : sum into a scalar variable -!! GET_SLICE_ll : get a slice of the global domain -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : define constants -!! XPI : pi -!! XCPD -!! Module MODD_PARAMETERS: declaration of parameter variables -!! JPHEXT, JPVEXT: define the number of marginal points out of the -!! physical domain along horizontal and vertical directions respectively -!! Module MODD_CONF: model configurations -!! LCARTESIAN: logical for CARTESIAN geometry -!! .TRUE. = Cartesian geometry used -!! L2D: logical for 2D model version -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine TRID) -!! -!! AUTHOR -!! ------ -!! P. HÃ…reil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/07/94 -!! 14/04/95 (J. Stein) bug in the ZDZM computation -!! ( stretched case) -!! 8/07/96 (P. Jabouille) change the FFT initialization -!! which now works for odd number. -!! 14/01/97 Durran anelastic equation (Stein,Lafore) -!! 15/06/98 (D.Lugato, R.Guivarch) Parallelisation -!! 10/08/98 (N. Asencio) add parallel code -!! use PDXHAT, PDYHAT and not PXHAT,PYHAT -!! PBFY is initialized -!! 20/08/00 (J. Stein, J. Escobar) optimisation of the solver -!! PBFY transposition -!! 14/03/02 (P. Jabouille) set values for meaningless spectral coefficients -!! (to avoid problem in bouissinesq configuration) -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CST -USE MODD_CONF -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAMETERS -! -USE MODE_ll -USE MODE_MSG -! -!JUAN -USE MODE_REPRO_SUM -!JUAN -! -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 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! scale factor -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -! -REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction -REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction -! -REAL, INTENT(OUT) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(OUT) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(OUT) :: PRHOM ! mean of XRHODJ on the plane - ! x y localized at a mass - ! level -! -REAL, DIMENSION(:), INTENT(OUT) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFY ! elements (yslice) of the tri-diag. -! matrix in the pressure eq. which is transposed. PBFY is a y-slices structure -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(OUT) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(OUT) :: KIFAXY ! - along y - -! -!* 0.2 declarations of local variables -! -INTEGER :: IRESP ! FM return code -INTEGER :: ILUOUT ! Logical unit number for - ! output-listing -INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! indice values of the physical subdomain -INTEGER :: IKU ! size of the arrays along z -INTEGER :: IIB_ll,IIE_ll,IJB_ll,IJE_ll ! indice values of the physical global domain -INTEGER :: IIMAX,IJMAX ! Number of points of the physical subdomain -INTEGER :: IIMAX_ll,IJMAX_ll ! Number of points of Global physical domain -! -INTEGER :: JI,JJ,JK ! loop indexes -! -INTEGER :: INN ! temporary result for the computation of array TRIGS -! -REAL, DIMENSION (:,:), ALLOCATABLE :: ZEIGEN_ll ! eigenvalues b(m,n) in global representation -REAL, DIMENSION (:), ALLOCATABLE :: ZEIGENX_ll ! used for the computation of ZEIGEN_ll -! -REAL, DIMENSION( SIZE(PDXHAT)) :: ZWORKX ! work array to compute PDXHATM -REAL, DIMENSION( SIZE(PDYHAT)) :: ZWORKY ! work array to compute PDYHATM -! -REAL :: ZGWNX,ZGWNY ! greater wave numbers allowed by the model - ! configuration in x and y directions respectively -! -REAL, DIMENSION (SIZE(PZZ,3)) :: ZDZM ! mean of deltaz on the plane x y - ! localized at a w-level -! -REAL :: ZANGLE,ZDEL ! needed for the initialization of the arrays used by the FFT -! -REAL :: ZINVMEAN ! inverse of inner points number in an horizontal grid -! -INTEGER :: IINFO_ll ! return code of parallel routine -REAL, DIMENSION (SIZE(PMAP,1)) :: ZXMAP ! extraction of PMAP array along x -REAL, DIMENSION (SIZE(PMAP,2)) :: ZYMAP ! extraction of PMAP array along y -INTEGER :: IORXY_ll,IORYY_ll ! origin's coordinates of the y-slices subdomain -INTEGER :: IIUY_ll,IJUY_ll ! dimensions of the y-slices subdomain -INTEGER :: IXMODE_ll,IYMODE_ll ! number of modes in the x and y direction for global point of view -INTEGER :: IXMODEY_ll,IYMODEY_ll ! number of modes in the x and y direction for y_slice point of view -!JUAN16 -!TYPE(DOUBLE_DOUBLE) , DIMENSION (SIZE(PZZ,3)) :: ZRHOM_ll , ZDZM_ll -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZRHOM_2D , ZDZM_2D -!JUAN16 -! -! -! -! -! -!------------------------------------------------------------------------------ -! -!* 1. INITIALIZATION -! -------------- -! -!* 1.1 retrieve a logical unit number -! ------------------------------ -! -ILUOUT = TLUOUT%NLU -! -!* 1.2 compute loop bounds -! ------------------- -! -! extended sub-domain -CALL GET_DIM_EXT_ll ('Y',IIUY_ll,IJUY_ll) -IKU=SIZE(PRHODJ,3) -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1 +JPVEXT -IKE=IKU -JPVEXT -! physical sub-domain -CALL GET_DIM_PHYS_ll ( 'B',IIMAX,IJMAX) -! -! global physical domain limits -CALL GET_GLOBALDIMS_ll ( IIMAX_ll, IJMAX_ll) -IIB_ll = 1 + JPHEXT -IIE_ll = IIMAX_ll + JPHEXT -IJB_ll = 1 + JPHEXT -IJE_ll = IJMAX_ll + JPHEXT -! -! the use of local array ZEIGENX and ZEIGEN would require some technical modifications -! -ALLOCATE (ZEIGENX_ll(IIMAX_ll + 2*JPHEXT)) -ALLOCATE (ZEIGEN_ll(IIMAX_ll + 2*JPHEXT, IJMAX_ll + 2*JPHEXT)) -ZEIGEN_ll = 0.0 -! Get the origin coordinates of the extended sub-domain in global landmarks -CALL GET_OR_ll('Y',IORXY_ll,IORYY_ll) -! -!* 1.3 allocate x-slice array - -! -!* 1.4 variables for the eigenvalues computation -! -ZGWNX = XPI/REAL(IIMAX_ll) -ZGWNY = XPI/REAL(IJMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 2. COMPUTE THE AVERAGE OF RHOJ*CPD*THETAVREF ALONG XY -! -------------------------------------------------- -! -ZINVMEAN = 1./REAL(IIMAX_ll*IJMAX_ll) -!JUAN16 -ALLOCATE(ZRHOM_2D(IIB:IIE, IJB:IJE)) -! -DO JK = 1,SIZE(PZZ,3) - IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*XCPD*PTHVREF(JI,JJ,JK)*ZINVMEAN - END DO - END DO - ELSEIF ( CEQNSYS == 'LHE' ) THEN - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*ZINVMEAN - END DO - END DO - END IF - ! global sum - PRHOM(JK) = SUM_DD_R2_ll(ZRHOM_2D) -END DO - -! -! global sum -!CALL REDUCESUM_ll(ZRHOM_ll,IINFO_ll) -!PRHOM = ZRHOM_ll -!JUAN16 -! -!------------------------------------------------------------------------------ -! -!* 3. COMPUTE THE MEAN INCREMENT BETWEEN Z LEVELS -! ------------------------------------------- -! -!JUAN16 -!ZDZM_ll = 0. -ALLOCATE(ZDZM_2D(IIB:IIE, IJB:IJE)) -! -DO JK = IKB-1,IKE - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZDZM_2D(JI,JJ) = (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK))*ZINVMEAN - END DO - END DO - ZDZM(JK) = SUM_DD_R2_ll(ZDZM_2D) -END DO -ZDZM(IKE+1) = ZDZM(IKE) -! -! global sum -!CALL REDUCESUM_ll(ZDZM_ll,IINFO_ll) -!ZDZM = ZDZM_ll -!JUAN16 -! -! -! vertical average to arrive at a w-level -DO JK = IKE+1,IKB,-1 - ZDZM(JK) = (ZDZM(JK) + ZDZM(JK-1))*0.5 -END DO -! -ZDZM(IKB-1) = -999. -! -!------------------------------------------------------------------------------ -! -!* 4. COMPUTE THE MEAN INCREMENT BETWEEN X LEVELS -! ------------------------------------------- -! -PDXHATM =0. -! . local sum -IF (LCARTESIAN) THEN - PDXHATM = SUM_1DFIELD_ll ( PDXHAT,'X',IIB_ll,IIE_ll,IINFO_ll) -ELSE - ! Extraction of x-slice PMAP at j=(IJB_ll+IJE_ll)/2 - CALL GET_SLICE_ll (PMAP,'X',(IJB_ll+IJE_ll)/2,ZXMAP(IIB:IIE) & - ,IIB,IIE,IINFO_ll) - ! initialize the work array = PDXHAT/ZXMAP - ZWORKX(IIB:IIE) = PDXHAT(IIB:IIE)/ ZXMAP (IIB:IIE) - PDXHATM = SUM_1DFIELD_ll ( ZWORKX,'X',IIB_ll,IIE_ll,IINFO_ll) -END IF -! . division to complete sum -PDXHATM = PDXHATM / REAL(IIMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 5. COMPUTE THE MEAN INCREMENT BETWEEN Y LEVELS -! ------------------------------------------- -! -PDYHATM = 0. -IF (LCARTESIAN) THEN - PDYHATM = SUM_1DFIELD_ll ( PDYHAT,'Y',IJB_ll,IJE_ll,IINFO_ll) -ELSE - ! Extraction of y-slice PMAP at i=IIB_ll+IIE_ll/2 - CALL GET_SLICE_ll (PMAP,'Y',(IIB_ll+IIE_ll)/2,ZYMAP(IJB:IJE) & - ,IJB,IJE,IINFO_ll) - ! initialize the work array = PDYHAT / ZYMAP - ZWORKY(IJB:IJE) = PDYHAT(IJB:IJE) / ZYMAP (IJB:IJE) - PDYHATM = SUM_1DFIELD_ll ( ZWORKY,'Y',IJB_ll,IJE_ll,IINFO_ll) -END IF -! . division to complete sum -PDYHATM= PDYHATM / REAL(IJMAX_ll) -! -!------------------------------------------------------------------------------ -! -!* 6. COMPUTE THE OUT-DIAGONAL ELEMENTS A AND C OF THE MATRIX -! ------------------------------------------------------- -! -DO JK = IKB,IKE - PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 - PCF(JK) = 0.5 * ( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1) **2 -END DO -! -! at the upper and lower levels PAF and PCF are computed using the Neumann -! conditions applying on the vertical component of the gradient -! -PAF(IKE+1) = -0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 -PCF(IKB-1) = 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 -! -PAF(IKB-1) = 999. -PCF(IKE+1) = 999. -!------------------------------------------------------------------------------ -!* 7. COMPUTE THE DIAGONAL ELEMENTS B OF THE MATRIX -! --------------------------------------------- -! -!* 7.1 compute the horizontal eigenvalues -! -! -!* 7.1.1 compute the eigenvalues along the x direction -! -SELECT CASE (HLBCX(1)) -! in the cyclic case, the eigenvalues are the same for two following JM values: -! it corresponds to the real and complex parts of the FFT - CASE('CYCL') ! cyclic case - IXMODE_ll = IIMAX_ll+2 - IXMODEY_ll = IIUY_ll -! - DO JI = 1,IXMODE_ll - ZEIGENX_ll(JI) = - ( 2. * SIN ( (JI-1)/2*ZGWNX ) / PDXHATM )**2 - END DO - CASE DEFAULT ! other cases - IXMODE_ll = IIMAX_ll -! -! - IF (LEAST_ll(HSPLITTING='Y')) THEN - IXMODEY_ll = IIUY_ll - 2 - ELSE - IXMODEY_ll = IIUY_ll - END IF -! -! - DO JI = 1,IXMODE_ll - ZEIGENX_ll(JI) = - ( 2. *SIN (0.5*REAL(JI-1)*ZGWNX ) / PDXHATM )**2 - END DO -END SELECT -! -!* 7.1.2 compute the eventual eigenvalues along the y direction -! -IF (.NOT. L2D) THEN -! -! y lateral boundary conditions for three-dimensional cases -! - SELECT CASE (HLBCY(1)) -! in the cyclic case, the eigenvalues are the same for two following JN values: -! it corresponds to the real and complex parts of the FFT result -! - CASE('CYCL') ! 3D cyclic case - IYMODE_ll = IJMAX_ll+2 - IYMODEY_ll = IJUY_ll -! - DO JJ = 1,IYMODE_ll - DO JI = 1,IXMODE_ll - ZEIGEN_ll(JI,JJ) = ZEIGENX_ll(JI) - & - ( 2.* SIN ( (JJ-1)/2*ZGWNY ) / PDYHATM )**2 - END DO - END DO -! - CASE DEFAULT ! 3D non-cyclic cases - IYMODE_ll = IJMAX_ll - IYMODEY_ll = IJUY_ll - 2 -! - DO JJ = 1,IYMODE_ll - DO JI = 1,IXMODE_ll - ZEIGEN_ll(JI,JJ) = ZEIGENX_ll(JI) - ( 2.* SIN (0.5*REAL(JJ-1)*ZGWNY ) / & - PDYHATM )**2 - END DO - END DO -! - END SELECT -ELSE -! -! copy the x eigenvalue array in a 2D array for a 2D case -! - IYMODE_ll = 1 - IYMODEY_ll = 1 - ZEIGEN_ll(1:IXMODE_ll,1)=ZEIGENX_ll(1:IXMODE_ll) -! -END IF -! -DEALLOCATE(ZEIGENX_ll) -! -!* 7.2 compute the matrix diagonal elements -! -! -PBFY = 1. -IF (L2D) THEN - DO JK= IKB,IKE - DO JJ= 1, IYMODEY_ll - DO JI= 1, IXMODEY_ll - PBFY(JI,JJ,JK) = PRHOM(JK)* ZEIGEN_ll(JI+IORXY_ll-1,JJ+IORYY_ll-1) - 0.5 * & - ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & - +( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1)**2 ) - END DO - END DO - END DO -! at the upper and lower levels PBFY is computed using the Neumann -! condition -! - PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKB-1) = -0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / & - ZDZM(IKB) **2 - ! - PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & - ZDZM(IKE+1) **2 - ! -ELSE - DO JK= IKB,IKE - DO JJ= 1, IYMODEY_ll - DO JI= 1, IXMODEY_ll - PBFY(JJ,JI,JK) = PRHOM(JK)* ZEIGEN_ll(JI+IORXY_ll-1,JJ+IORYY_ll-1) - 0.5 * & - ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & - +( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1)**2 ) - END DO - END DO - END DO -! at the upper and lower levels PBFY is computed using the Neumann -! condition -! - PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKB-1) = -0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / & - ZDZM(IKB) **2 - ! - PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & - ZDZM(IKE+1) **2 - ! -END IF -! -DEALLOCATE(ZEIGEN_ll) -! -! second coefficent is meaningless in cyclic case -IF (HLBCX(1) == 'CYCL' .AND. L2D) PBFY(2,:,:)=1. -IF (HLBCX(1) == 'CYCL' .AND. .NOT.(L2D) .AND. LWEST_ll(HSPLITTING='Y')) PBFY(:,2,:)=1. -IF (HLBCY(1) == 'CYCL' .AND. .NOT.(L2D)) PBFY(2,:,:)=1. -! -!------------------------------------------------------------------------------ -!* 8. INITIALIZATION OF THE TRIGS AND IFAX ARRAYS FOR THE FFT -! ------------------------------------------------------- -! -! 8.1 x lateral boundary conditions -! -CALL SET99(PTRIGSX,KIFAXX,IIMAX_ll) -! -! test on the value of KIMAX: KIMAX must be factorizable as a product -! of powers of 2,3 and 5. KIFAXX(10) is equal to IIMAX if the decomposition -! is correct, then KIFAXX(1) contains the number of decomposition factors -! of KIMAX. -! -IF (KIFAXX(10) /= IIMAX_ll) THEN - WRITE(UNIT=ILUOUT,FMT="(' ERROR',/, & - &' : THE FORM OF THE FFT USED FOR THE INVERSION OF THE FLAT ',/,& - &' OPERATOR REQUIRES THAT KIMAX MUST BE FACTORIZABLE' ,/,& - & ' AS A PRODUCT OF POWERS OF 2, 3 AND 5.')") - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','TRID','') -END IF -! -IF (HLBCX(1) /= 'CYCL') THEN -! -! extra trigs for shifted (co) sine transform (FFT55) -! - INN=2*(IIMAX_ll) - ZDEL=ASIN(1.0)/REAL(IIMAX_ll) - DO JI=1,IIMAX_ll - ZANGLE=REAL(JI)*ZDEL - PTRIGSX(INN+JI)=SIN(ZANGLE) - END DO -! -ENDIF -! -! 8.2 y lateral boundary conditions -! -IF (.NOT. L2D) THEN - CALL SET99(PTRIGSY,KIFAXY,IJMAX_ll) - ! - ! test on the value of KJMAX: KJMAX must be factorizable as a product - ! of powers of 2,3 and 5. KIFAXY(10) is equal to IJMAX_ll if the decomposition - ! is correct, then KIFAXX(1) contains the number of decomposition factors - ! of IIMAX_ll. - ! - IF (KIFAXY(10) /= IJMAX_ll) THEN - WRITE(UNIT=ILUOUT,FMT="(' ERROR',/, & - &' : THE FORM OF THE FFT USED FOR THE INVERSION OF THE FLAT ',/,& - &' OPERATOR REQUIRES THAT KJMAX MUST BE FACTORIZABLE' ,/,& - & ' AS A PRODUCT OF POWERS OF 2, 3 AND 5.')") - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','TRID','') - END IF - ! - ! - ! other cases - ! - IF (HLBCY(1) /= 'CYCL') THEN - ! - ! extra trigs for shifted (co) sine transform - ! - INN=2*(IJMAX_ll) - ZDEL=ASIN(1.0)/REAL(IJMAX_ll) - DO JJ=1,IJMAX_ll - ZANGLE=REAL(JJ)*ZDEL - PTRIGSY(INN+JJ)=SIN(ZANGLE) - END DO - ! - ENDIF - ! -ENDIF -! -!------------------------------------------------------------------------------ -! -END SUBROUTINE TRID diff --git a/src/MNH/ver_dyn.f90 b/src/MNH/ver_dyn.f90 index 925c2225b..7c282a1f0 100644 --- a/src/MNH/ver_dyn.f90 +++ b/src/MNH/ver_dyn.f90 @@ -158,7 +158,6 @@ USE MODI_SHUMAN USE MODI_VER_INT_DYN USE MODI_VER_INTERP_LIN USE MODI_VER_SHIFT -USE MODI_WGUESS ! IMPLICIT NONE ! diff --git a/src/MNH/wguess.f90 b/src/MNH/wguess.f90 deleted file mode 100644 index d6324d607..000000000 --- a/src/MNH/wguess.f90 +++ /dev/null @@ -1,169 +0,0 @@ -!MNH_LIC Copyright 1994-2020 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_WGUESS -! ################## -INTERFACE - SUBROUTINE WGUESS(PRHODJU,PRHODJV,PZZ,PDXX,PDYY,PDZZ,PDZX,PDZY,PRHODJW) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJU ! rhodJU on the MESO-NH grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJV ! rhodJV on the MESO-NH grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of w points -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHODJW ! rhodJw on the MESO-NH grid -! -END SUBROUTINE WGUESS -END INTERFACE -END MODULE MODI_WGUESS -! -! ####################################################################### - SUBROUTINE WGUESS(PRHODJU,PRHODJV,PZZ,PDXX,PDYY,PDZZ,PDZX,PDZY,PRHODJW) -! ####################################################################### -! -!!**** *WGUESS* - compute the first guess of w -!! -!! PURPOSE -!! ------- -!! This routine computes a value of w in order to have a first guess of w -!! for the anelastic correction routine. The bottom boundary condition is -!! verified, not the top one. -!! -!!** METHOD -!! ------ -!! -!! 1 the vertical contravariant component Wc of the momentum is computed -!! from the uncompressible form of the continuity equation: -!! _ _ _ -!! d(rhodJ Uc)/dx + d(rhodJ Vc)/dy + d(rhodJ Wc)/dz = 0. -!! with Wc=0 at ground level -!! -!! 2 the final value of w ( vertical catesian component) is deduced from: -!! -!! Wc=1/dzz * (w-Udzx/dxx-Vdzy/dyy) -!! -!! CAUTION: the values of rhoJw at JI=IJU-1, JJ=IJU-1,JK=IKU-1 or JK=IKB -!! are duplicated on the points JI=IJU, JJ=IJU JK=IKU and JK=IKB-1 to JK=1 -!! respectively. -!! -!! -!! -!! EXTERNAL -!! -------- -!! -!! DXF,DYF,MXF,MYF,MZM : Shuman operators -!! Module MODI_SHUMAN : interface for Shuman operators -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_PARAMETERS -!! JPVEXT -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/12/94 -!! 15/05/96 spread the residual divergence on the whole domain -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODI_SHUMAN ! interface module -USE MODD_CONF ! declaration modules -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!* 0.1 Declaration of arguments -! ------------------------ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJU ! rhodJU on the MESO-NH grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJV ! rhodJV on the MESO-NH grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of w points -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHODJW ! rhodJw on the MESO-NH grid -! -!* 0.2 Declaration of local variables -! ------------------------------ -INTEGER :: IIU,IJU -INTEGER :: IKB,IKU -INTEGER :: JK -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),SIZE(PDZZ,3)) :: & ! - ZRHODJWC ! rhoJ Wc -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2)) :: ZLAMBDA - ! characteristic length for the weight function -!------------------------------------------------------------------------------- -! -IIU=SIZE(PDZZ,1) -IJU=SIZE(PDZZ,2) -IKB=JPVEXT+1 -IKU=SIZE(PDZZ,3) -! -!* 1. INTEGRATION OF THE CONTRAVARIANT W -! ---------------------------------- -! -ZRHODJWC(:,:,IKB)=0. -DO JK=IKB,IKU-1 - ZRHODJWC(:,:,JK+1:JK+1)=ZRHODJWC(:,:,JK:JK) & - -DXF(PRHODJU(:,:,JK:JK)/PDXX(:,:,JK:JK)) & - -DYF(PRHODJV(:,:,JK:JK)/PDYY(:,:,JK:JK)) -END DO -! -!------------------------------------------------------------------------------- -! -!* 2. COMPUTATION OF rhoJw -! -------------------- -! -!* 2.1 General case -! ------------ -! -PRHODJW= PDZZ*ZRHODJWC + MXF(PDZX*MZM(PRHODJU/PDXX)) & - + MYF(PDZY*MZM(PRHODJV/PDYY)) -! -!* 2.2 Copies on boundaries -! -------------------- -! -PRHODJW( 1 , : ,:)=PRHODJW( 2 , : ,:) -PRHODJW(IIU, : ,:)=PRHODJW(IIU-1, : ,:) -PRHODJW( : , 1 ,:)=PRHODJW( : , 2 ,:) -PRHODJW( : ,IJU,:)=PRHODJW( : ,IJU-1,:) -! -!* 2.3 Apply a weight function -! ----------------------- -ZLAMBDA(:,:)= (PZZ(:,:,IKU)-PZZ(:,:,IKB)) / 10 -DO JK=IKB,IKU - PRHODJW(:,:,JK) = PRHODJW(:,:,JK) * & - ( 1. - EXP( (PZZ(:,:,JK)-PZZ(:,:,IKU)) / ZLAMBDA(:,:) ) ) -END DO -! -DO JK=1,IKB-1 - PRHODJW(:,:,JK)=PRHODJW(:,:,IKB) -END DO -! -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE WGUESS diff --git a/src/MNH/zs_boundaryn.f90 b/src/MNH/zs_boundaryn.f90 deleted file mode 100644 index 4e2f7935a..000000000 --- a/src/MNH/zs_boundaryn.f90 +++ /dev/null @@ -1,204 +0,0 @@ -!MNH_LIC Copyright 1999-2019 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_ZS_BOUNDARY_n -! ####################### -! -INTERFACE -! - SUBROUTINE ZS_BOUNDARY_n (KMI, & - PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & - PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & - KDXRATIO,KDYRATIO, & - HLBCX,HLBCY, & - PZS ) -! -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBFX1,PBFX2,PBFX3,PBFX4 ! Flux points in X-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBFY1,PBFY2,PBFY3,PBFY4 ! Flux points in Y-direc. -INTEGER, INTENT(IN) :: KDXRATIO ! x and y-direction resolution RATIO -INTEGER, INTENT(IN) :: KDYRATIO ! between inner model and outer model -CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCX ! type of lateral -CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZS ! orography of the fine mesh model -! -END SUBROUTINE ZS_BOUNDARY_n -! -END INTERFACE -! -END MODULE MODI_ZS_BOUNDARY_n -! -! ##################################################################### - SUBROUTINE ZS_BOUNDARY_n (KMI, & - PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & - PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & - KDXRATIO,KDYRATIO, & - HLBCX,HLBCY, & - PZS ) -! ##################################################################### -! -!!**** *ZS_BOUNDARY_n* - interpolate the orography of the DAD model to the -!! CHILD model -!! -!! PURPOSE -!! ------- -!! The purpose of ZS_BOUNDARY$n is to perform the Bikhardt interpolation -!! from the DAD model orography toward the fine scale model KMI. -! -! -!!** METHOD -!! ------ -!! -!! We use the Bikhardt interpolation scheme to compute the orography of -!! the fine-mesh model from the value of its DAD orography. This intermediate -!! smooth orography is only used to modify the orography of the fine-mesh -!! model for the marginal points ( 1, IIU, 1, IJU). The fine-scale orography -!! is imported in this subroutine by argument and the DAD orography by module -!! MODD_GRID$n -!! -!! EXTERNAL -!! -------- -!! BIKHARDT : horizontal interpolation scheme using 4 points in x and y -!! directions -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! MODULE MODD_GRID$n: XZS -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! J. Stein *Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 1/2/99 -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_ll -USE MODE_MODELN_HANDLER -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_GRID_n ! contains the DAD model informations -! -use mode_bikhardt -! -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBFX1,PBFX2,PBFX3,PBFX4 ! Flux points in X-direc. -REAL, DIMENSION(:), INTENT(IN) :: PBFY1,PBFY2,PBFY3,PBFY4 ! Flux points in Y-direc. -INTEGER, INTENT(IN) :: KDXRATIO ! x and y-direction resolution RATIO -INTEGER, INTENT(IN) :: KDYRATIO ! between inner model and outer model -CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCX ! type of lateral -CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZS ! orography of the fine mesh model -! -!* 0.2 declarations of local variables -! -!REAL , DIMENSION(SIZE(PZS,1),SIZE(PZS,2)) :: ZZSLS ! interpolated orography - ! at high resolution -REAL , DIMENSION(SIZE(PZS,1),SIZE(PZS,2),1) :: ZZSLS -INTEGER :: IIB,IJB,IIE,IJE -INTEGER :: IIU,IJU ! array sizes in x and y directions of the CHILD model -! -! Variables used for LS communications -TYPE(LIST_ll), POINTER :: TZLSFIELD_ll ! list of fields to exchange -INTEGER :: IINFO_ll, IDIMX, IDIMY -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZS,ZZS !!! provisoire -!REAL, DIMENSION(:,:), ALLOCATABLE :: ZTZS -INTEGER :: IMI !Current model index -!------------------------------------------------------------------------------- -! -!* 0. INITIALISATION -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IIB=IIB-1 -IIE=IIE+1 -IJB=IJB-1 -IJE=IJE+1 -! -!* 1 GATHER LS FIELD FOR THE CHILD MODEL KMI -! -! 1.1 Must be on the father model to call get_child_dim -! -IMI = GET_CURRENT_MODEL_INDEX() -CALL GO_TOMODEL_ll(IMI, IINFO_ll) -CALL GET_CHILD_DIM_ll(KMI, IDIMX, IDIMY, IINFO_ll) -! -! 1.2 Allocate array which will receive coarse grid points -! -ALLOCATE(ZTZS(IDIMX,IDIMY,1)) -ALLOCATE(ZZS(SIZE(XZS,1),SIZE(XZS,2),1)) -ZZS(:,:,1)=XZS(:,:) -! -! 1.3 Specify the ls "source" fields and receiver fields -! -CALL SET_LSFIELD_1WAY_ll(ZZS, ZTZS, KMI) -! -! -! 1.4 Communication -! -CALL LS_FORCING_ll(KMI, IINFO_ll) -! -! 1.5 Back to the (current) child model -! -CALL GO_TOMODEL_ll(KMI, IINFO_ll) -! -CALL UNSET_LSFIELD_1WAY_ll() -! -! -!* 1. BIKARDT INTERPOLATION -! --------------------- -! -CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & - PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & - 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & - HLBCX,HLBCY,ZTZS,ZZSLS(IIB:IIE,IJB:IJE,:)) -! -DEALLOCATE(ZTZS,ZZS) -!------------------------------------------------------------------------------- -! -!* 2. SET THE OROGRAPHY AT THE MARGINAL POINTS -! ---------------------------------------- -! -! -IIU=SIZE(PZS,1) -IJU=SIZE(PZS,2) -! -IF(HLBCX(1)/='CYCL' .AND. LWEST_ll()) PZS(1,IJB:IJE) = ZZSLS(1,IJB:IJE,1) -IF(HLBCX(2)/='CYCL' .AND. LEAST_ll()) PZS(IIU,IJB:IJE) = ZZSLS(IIU,IJB:IJE,1) -IF(HLBCY(1)/='CYCL' .AND. LSOUTH_ll()) PZS(IIB:IIE,1) = ZZSLS(IIB:IIE,1,1) -IF(HLBCY(2)/='CYCL' .AND. LNORTH_ll()) PZS(IIB:IIE,IJU) = ZZSLS(IIB:IIE,IJU,1) -! -NULLIFY(TZLSFIELD_ll) -CALL ADD2DFIELD_ll( TZLSFIELD_ll, PZS, 'ZS_BOUNDARY_n::PZS' ) -CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) -CALL CLEANLIST_ll(TZLSFIELD_ll) -! -!------------------------------------------------------------------------------ -! -END SUBROUTINE ZS_BOUNDARY_n -- GitLab