From 3bc627de44eac940ca305c05b9bcf1369d2ba5f1 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Thu, 23 Feb 2023 18:11:41 +0100 Subject: [PATCH] Quentin 23/02/2023: clean mesonh ext (integrated for MNH 5.6) --- src/mesonh/ext/boundaries.f90 | 1281 ----- src/mesonh/ext/default_desfmn.f90 | 1491 ----- src/mesonh/ext/drag_veg.f90 | 362 -- src/mesonh/ext/ini_budget.f90 | 4886 ----------------- src/mesonh/ext/ini_nsv.f90 | 1315 ----- src/mesonh/ext/init_aerosol_concentration.f90 | 157 - src/mesonh/ext/modeln.f90 | 2414 -------- src/mesonh/ext/radiations.f90 | 3504 ------------ src/mesonh/ext/read_exsegn.f90 | 3075 ----------- src/mesonh/ext/resolved_cloud.f90 | 1108 ---- 10 files changed, 19593 deletions(-) delete mode 100644 src/mesonh/ext/boundaries.f90 delete mode 100644 src/mesonh/ext/default_desfmn.f90 delete mode 100644 src/mesonh/ext/drag_veg.f90 delete mode 100644 src/mesonh/ext/ini_budget.f90 delete mode 100644 src/mesonh/ext/ini_nsv.f90 delete mode 100644 src/mesonh/ext/init_aerosol_concentration.f90 delete mode 100644 src/mesonh/ext/modeln.f90 delete mode 100644 src/mesonh/ext/radiations.f90 delete mode 100644 src/mesonh/ext/read_exsegn.f90 delete mode 100644 src/mesonh/ext/resolved_cloud.f90 diff --git a/src/mesonh/ext/boundaries.f90 b/src/mesonh/ext/boundaries.f90 deleted file mode 100644 index 111dbc701..000000000 --- a/src/mesonh/ext/boundaries.f90 +++ /dev/null @@ -1,1281 +0,0 @@ -!MNH_LIC Copyright 1994-2021 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_BOUNDARIES -!##################### -! -INTERFACE -! - SUBROUTINE BOUNDARIES ( & - PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ,PRHODREF, & - PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) -! -REAL, INTENT(IN) :: PTSTEP ! time step dt -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer - ! (=1 at the segment beginning) -! -! Lateral Boundary fields at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! temporal derivative of the Lateral Boundary fields -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKES ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKES -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS ,PLBXSVS ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-dir. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT - ! Variables at t -! -END SUBROUTINE BOUNDARIES -! -END INTERFACE -! - -END MODULE MODI_BOUNDARIES -! -! -! #################################################################### - SUBROUTINE BOUNDARIES ( & - PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ,PRHODREF, & - PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) -! #################################################################### -! -!!**** *BOUNDARIES* - routine to prepare the Lateral Boundary Conditions for -!! all variables at a scalar localization relative to the -!! considered boundary. -!! -!! PURPOSE -!! ------- -! Fill up the left and right lateral EXTernal zones, for all prognostic -! variables, at time t and t-dt, to avoid particular cases close to -! the Lateral Boundaries in routines computing the evolution terms, in -! particular in the advection routines. -! -!!** METHOD -!! ------ -!! 3 different options are proposed: 'WALL' 'CYCL' 'OPEN' -!! to define the Boundary Condition type, -!! though the variables HLBCX and HLBCY (for the X and Y-directions -!! respectively). -!! For the 'OPEN' type of LBC, the treatment depends -!! on the flow configuration: i.e. INFLOW or OUTFLOW conditions. -!! -!! EXTERNAL -!! -------- -!! GET_INDICE_ll : get physical sub-domain bounds -!! LWEAST_ll,LEAST_ll,LNORTH_ll,LSOUTH_ll : position functions -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : -!! JPHEXT ,JPVEXT -!! -!! Module MODD_CONF : -!! CCONF -!! -!! Module MODE_UPDATE_NSV : -!! NSV_CHEM, NSV_CHEMBEG, NSV_CHEMEND -!! -!! Module MODD_CTURB : -!! XTKEMIN -!! -!! REFERENCE -!! --------- -!! Book1 and book2 of documentation (routine BOUNDARIES) -!! -!! AUTHOR -!! ------ -!! J.-P. Lafore J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 17/10/94 -!! Modification 02/11/94 (J.Stein) copy for t-dt at the external points -!! + change the copy formulation -!! Modification 18/11/94 (J.Stein) bug correction in the normal velocity -!! prescription in the WALL cases -!! Modification 13/02/95 (Lafore) to account for the OPEN case and -!! for the LS fields introduction -!! Modification 03/03/95 (Mallet) corrections in variables names in -!! the Y-OPEN case -!! 16/03/95 (J.Stein) remove R from the historical variables -!! Modification 31/05/95 (Lafore) MASTER_DEV2.1 preparation after the -!! LBC tests performed by I. Mallet -!! Modification 15/03/96 (Richard) bug correction for OPEN CASE: (TOP Y-LBC) -!! Rv case -!! Modification 15/03/96 (Shure) bug correction for SV variable in -!! open x right case -!! Modification 24/10/96 (Masson) initialization of outer points in -!! wall cases for spawning interpolations -!! Modification 13/03/97 (Lafore) "surfacic" LS-fields introduction -!! Modification 10/04/97 (Lafore) proper treatment of minima for TKE and EPS -!! Modification 01/09/97 (Masson) minimum value for water and passive -!! scalars set to zero at instants M,T -!! Modification 20/10/97 (Lafore) introduction of DAVI type of lbc -!! suppression of NEST type -!! Modification 12/11/97 ( Stein ) use the lB fields -!! Modification 02/06/98 (Lafore) declaration of local variables (PLBXUM -!! and PLBXWM do'nt have the same size) -!! Modification 24/08/98 (Jabouille) parallelize the code -!! Modification 20/04/99 ( Stein ) use the same conditions for times t -!! and t-dt -!! Modification 11/04/00 (Mari) special conditions for chemical variables -!! Modification 10/01/01 (Tulet) update for MOCAGE boundary conditions -!! Modification 22/01/01 (Gazen) use NSV_CHEM,NSV_CHEMBEG,NSV_CHEMEND variables -!! Modification 22/06/01(Jabouille) use XSVMIN -!! Modification 20/11/01(Gazen & Escobar) rewrite GCHBOUNDARY for portability -!! Modification 14/03/05 (Tulet) bug : in case of CYCL do not call ch_boundaries -!! Modification 14/05/05 (Tulet) add aerosols / dust -!! Modification 05/06 Suppression of DAVI type of lbc -!! Modification 05/06 Remove EPS -!! Modification 12/2010 (Chong) Add boundary condition for ions -!! (fair weather profiles) -!! Modification 07/2013 (Bosseur & Filippi) adds Forefire -!! Modification 04/2013 (C.Lac) Remove instant M -!! Modification 01/2015 (JL Redelsperger) Introduction of ponderation -!! for non normal velocity and potential temp -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Redelsperger & Pianezze : 08/2015 : add XPOND coefficient -!! Modification 01/2016 (JP Pinty) Add LIMA that is LBC for CCN and IFN -!! Modification 18/07/17 (Vionnet) Add blowing snow variables -!! Modification 01/2018 (JL Redelsperger) Correction for TKE treatment -!! Modification 03/02/2020 (B. Vié) Correction for SV with LIMA -! P. Wautelet 04/06/2020: correct call to Set_conc_lima -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,NBLOWSNOW_2D -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL , ONLY : LORILAM -USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHIC -USE MODD_CONDSAMP, ONLY : LCONDSAMP -USE MODD_CONF -USE MODD_CTURB -USE MODD_DUST -USE MODD_GRID_n, ONLY : XZZ -USE MODD_ELEC_DESCR -USE MODD_ELEC_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE, ONLY : LFOREFIRE -#endif -USE MODD_LBC_n, ONLY : XPOND -USE MODE_ll -USE MODD_NESTING, ONLY : NDAD -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND -USE MODD_PARAM_n, ONLY : CELEC,CCLOUD -USE MODD_PASPOL, ONLY : LPASPOL -USE MODD_PRECISION, ONLY: MNHREAL32 -USE MODD_REF_n -USE MODD_SALT, ONLY : LSALT - -USE MODE_MODELN_HANDLER -USE MODE_SET_CONC_LIMA - -USE MODI_CH_BOUNDARIES -USE MODI_INIT_AEROSOL_CONCENTRATION -USE MODI_ION_BOUNDARIES - -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -! -REAL, INTENT(IN) :: PTSTEP ! time step dt -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer - ! (=1 at the segment beginning) -! -! Lateral Boundary fields at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! temporal derivative of the Lateral Boundary fields -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKES ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKES -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS ,PLBXSVS ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-dir. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT - ! Variables at t -! -!* 0.2 declarations of local variables -! -INTEGER :: IIB ! indice I Beginning in x direction -INTEGER :: IJB ! indice J Beginning in y direction -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IIE ! indice I End in x direction -INTEGER :: IJE ! indice J End in y direction -INTEGER :: IKE ! indice K End in z direction -INTEGER :: JEXT ! Loop index for EXTernal points -INTEGER :: JRR ! Loop index for RR variables (water) -INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER :: IMI ! Model Index -REAL :: ZTSTEP ! effective time step -REAL :: ZPOND ! Coeff PONDERATION LS -INTEGER :: ILBX,ILBY ! size of LB fields' arrays -LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GCHBOUNDARY, GAERBOUNDARY,& - GDSTBOUNDARY, GSLTBOUNDARY, GPPBOUNDARY, & - GCSBOUNDARY, GICBOUNDARY, GLIMABOUNDARY,GSNWBOUNDARY -LOGICAL, SAVE :: GFIRSTCALL1 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL2 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL3 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL5 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLPP = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLCS = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLIC = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLLIMA = .TRUE. -! -REAL, DIMENSION(SIZE(PLBXWM,1),SIZE(PLBXWM,2),SIZE(PLBXWM,3)) :: & - ZLBXVT,ZLBXWT,ZLBXTHT -REAL, DIMENSION(SIZE(PLBYWM,1),SIZE(PLBYWM,2),SIZE(PLBYWM,3)) :: & - ZLBYUT,ZLBYWT,ZLBYTHT -REAL, DIMENSION(SIZE(PLBXTKEM,1),SIZE(PLBXTKEM,2),SIZE(PLBXTKEM,3)) :: & - ZLBXTKET -REAL, DIMENSION(SIZE(PLBYTKEM,1),SIZE(PLBYTKEM,2),SIZE(PLBYTKEM,3)) :: & - ZLBYTKET -REAL, DIMENSION(SIZE(PLBXRM,1),SIZE(PLBXRM,2),SIZE(PLBXRM,3),SIZE(PLBXRM,4)) :: & - ZLBXRT -REAL, DIMENSION(SIZE(PLBYRM,1),SIZE(PLBYRM,2),SIZE(PLBYRM,3),SIZE(PLBYRM,4)) :: & - ZLBYRT -REAL, DIMENSION(SIZE(PLBXSVM,1),SIZE(PLBXSVM,2),SIZE(PLBXSVM,3),SIZE(PLBXSVM,4)) :: & - ZLBXSVT -REAL, DIMENSION(SIZE(PLBYSVM,1),SIZE(PLBYSVM,2),SIZE(PLBYSVM,3),SIZE(PLBYSVM,4)) :: & - ZLBYSVT -LOGICAL :: GCHTMP -LOGICAL :: GPPTMP -LOGICAL :: GCSTMP -! -LOGICAL, SAVE :: GFIRSTCALL4 = .TRUE. -! -#ifdef MNH_FOREFIRE -LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GFFBOUNDARY -LOGICAL, SAVE :: GFIRSTCALLFF = .TRUE. -LOGICAL :: GFFTMP -#endif -! -INTEGER :: JI,JJ -! -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSVT -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZRT -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES: -! ---------------------------------------------- -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PUT,3) - JPVEXT -IMI = GET_CURRENT_MODEL_INDEX() -! -!------------------------------------------------------------------------------- -! -!* 2. UPPER AND LOWER BC FILLING: -! --------------------------- -! -!* 2.1 COMPUTE THE FIELD EXTRAPOLATIONS AT THE GROUND -! - -! -! at the instant t -! -IF(SIZE(PUT) /= 0) PUT (:,:,IKB-1) = PUT (:,:,IKB) -IF(SIZE(PVT) /= 0) PVT (:,:,IKB-1) = PVT (:,:,IKB) -IF(SIZE(PWT) /= 0) PWT (:,:,IKB-1) = PWT (:,:,IKB) -IF(SIZE(PTHT) /= 0) PTHT (:,:,IKB-1) = PTHT (:,:,IKB) -IF(SIZE(PTKET) /= 0) PTKET(:,:,IKB-1) = PTKET(:,:,IKB) -IF(SIZE(PRT) /= 0) PRT (:,:,IKB-1,:)= PRT (:,:,IKB,:) -IF(SIZE(PSVT)/= 0) PSVT (:,:,IKB-1,:)= PSVT (:,:,IKB,:) -IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKB-1) = PSRCT(:,:,IKB) -! -! -!* 2.2 COMPUTE THE FIELD EXTRAPOLATIONS AT THE TOP -! -! at the instant t -! -IF(SIZE(PWT) /= 0) PWT (:,:,IKE+1) = 0. -IF(SIZE(PUT) /= 0) PUT (:,:,IKE+1) = PUT (:,:,IKE) -IF(SIZE(PVT) /= 0) PVT (:,:,IKE+1) = PVT (:,:,IKE) -IF(SIZE(PTHT) /= 0) PTHT (:,:,IKE+1) = PTHT (:,:,IKE) -IF(SIZE(PTKET) /= 0) PTKET(:,:,IKE+1) = PTKET(:,:,IKE) -IF(SIZE(PRT) /= 0) PRT (:,:,IKE+1,:) = PRT (:,:,IKE,:) -IF(SIZE(PSVT)/= 0) PSVT (:,:,IKE+1,:) = PSVT (:,:,IKE,:) -IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKE+1) = PSRCT(:,:,IKE) - -! specific for positive and negative ions mixing ratios (1/kg) - -IF (NSV_ELEC .NE. 0) THEN -! - IF (SIZE(PWT) /= 0) THEN - WHERE ( PWT(:,:,IKE+1) .GE. 0.) ! Outflow - PSVT (:,:,IKE+1,NSV_ELECBEG) = 2.*PSVT (:,:,IKE,NSV_ELECBEG) - & - PSVT (:,:,IKE-1,NSV_ELECBEG) - PSVT (:,:,IKE+1,NSV_ELECEND) = 2.*PSVT (:,:,IKE,NSV_ELECEND) - & - PSVT (:,:,IKE-1,NSV_ELECEND) - ELSE WHERE ! Inflow from the top - PSVT (:,:,IKE+1,NSV_ELECBEG) = XCION_POS_FW(:,:,IKE+1) - PSVT (:,:,IKE+1,NSV_ELECEND) = XCION_NEG_FW(:,:,IKE+1) - END WHERE - ENDIF -! -END IF - -! -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE LB FIELDS AT TIME T -! --------------------------- -! -! -IF ( KTCOUNT == 1) THEN - ZTSTEP = 0. -ELSE - ZTSTEP = PTSTEP -END IF -! -! -IF ( SIZE(PLBXTHS,1) /= 0 .AND. & - ( HLBCX(1)=='OPEN' .OR. HLBCX(2)=='OPEN') ) THEN - ZLBXVT(:,:,:) = PLBXVM(:,:,:) + ZTSTEP * PLBXVS(:,:,:) - ZLBXWT(:,:,:) = PLBXWM(:,:,:) + ZTSTEP * PLBXWS(:,:,:) - ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) + ZTSTEP * PLBXTHS(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) + ZTSTEP * PLBXTKES(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) + ZTSTEP * PLBXRS(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) + ZTSTEP * PLBXSVS(:,:,:,:) - END IF -! -ELSE -! - ZLBXVT(:,:,:) = PLBXVM(:,:,:) - ZLBXWT(:,:,:) = PLBXWM(:,:,:) - ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) - END IF -! -END IF -! -! ============================================================ -! -! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result -! -ZLBXVT(:,:,:) = real(ZLBXVT(:,:,:),kind=MNHREAL32) -ZLBXWT(:,:,:) = real(ZLBXWT(:,:,:),kind=MNHREAL32) -ZLBXTHT(:,:,:) = real(ZLBXTHT(:,:,:),kind=MNHREAL32) -IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = real(ZLBXTKET(:,:,:),kind=MNHREAL32) -END IF -IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = real(ZLBXRT(:,:,:,:),kind=MNHREAL32) -END IF -IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = real(ZLBXSVT(:,:,:,:),kind=MNHREAL32) -END IF -! ============================================================ -! -IF ( SIZE(PLBYTHS,1) /= 0 .AND. & - ( HLBCY(1)=='OPEN' .OR. HLBCY(2)=='OPEN' )) THEN - ZLBYUT(:,:,:) = PLBYUM(:,:,:) + ZTSTEP * PLBYUS(:,:,:) - ZLBYWT(:,:,:) = PLBYWM(:,:,:) + ZTSTEP * PLBYWS(:,:,:) - ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) + ZTSTEP * PLBYTHS(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) + ZTSTEP * PLBYTKES(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) + ZTSTEP * PLBYRS(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) + ZTSTEP * PLBYSVS(:,:,:,:) - END IF -! -ELSE -! - ZLBYUT(:,:,:) = PLBYUM(:,:,:) - ZLBYWT(:,:,:) = PLBYWM(:,:,:) - ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) - END IF -! -END IF -! -! -! ============================================================ -! -! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result -! -ZLBYUT(:,:,:) = real(ZLBYUT(:,:,:),kind=MNHREAL32) -ZLBYWT(:,:,:) = real(ZLBYWT(:,:,:),kind=MNHREAL32) -ZLBYTHT(:,:,:) = real(ZLBYTHT(:,:,:),kind=MNHREAL32) -IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = real(ZLBYTKET(:,:,:),kind=MNHREAL32) -END IF -IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = real(ZLBYRT(:,:,:,:),kind=MNHREAL32) -END IF -IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = real(ZLBYSVT(:,:,:,:),kind=MNHREAL32) -END IF -! ============================================================ -! -!------------------------------------------------------------------------------- -! PONDERATION COEFF for Non-Normal velocities and pot temperature -! -ZPOND = XPOND -! -!* 4. LBC FILLING IN THE X DIRECTION (LEFT WEST SIDE): -! ------------------------------------------------ -IF (LWEST_ll( )) THEN -! -! -SELECT CASE ( HLBCX(1) ) -! -!* 4.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (IIB-JEXT,:,:) = PUT (IIB ,:,:) ! never used during run - IF(SIZE(PVT) /= 0) PVT (IIB-JEXT,:,:) = PVT (IIB-1+JEXT,:,:) - IF(SIZE(PWT) /= 0) PWT (IIB-JEXT,:,:) = PWT (IIB-1+JEXT,:,:) - IF(SIZE(PTHT) /= 0) PTHT(IIB-JEXT,:,:) = PTHT (IIB-1+JEXT,:,:) - IF(SIZE(PTKET)/= 0) PTKET(IIB-JEXT,:,:) = PTKET(IIB-1+JEXT,:,:) - IF(SIZE(PRT) /= 0) PRT (IIB-JEXT,:,:,:) = PRT (IIB-1+JEXT,:,:,:) - IF(SIZE(PSVT) /= 0) PSVT(IIB-JEXT,:,:,:) = PSVT (IIB-1+JEXT,:,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT (IIB-JEXT,:,:) = PSRCT (IIB-1+JEXT,:,:) - IF(LBLOWSNOW) XSNWCANO(IIB-JEXT,:,:) = XSNWCANO(IIB-1+JEXT,:,:) -! - END DO -! - IF(SIZE(PUT) /= 0) PUT(IIB ,:,:) = 0. ! set the normal velocity -! -! -!* 4.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - PUT(JI,:,:)=0. - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PVT (JI,:,:) = 2.*PVT (JI+1,:,:) -PVT (JI+2,:,:) - PWT (JI,:,:) = 2.*PWT (JI+1,:,:) -PWT (JI+2,:,:) - PTHT (JI,:,:) = 2.*PTHT (JI+1,:,:) -PTHT (JI+2,:,:) - ! - ELSEWHERE ! INFLOW condition - PVT (JI,:,:) = ZPOND*ZLBXVT (JI,:,:) + (1.-ZPOND)* PVT(JI+1,:,:) ! 1 - PWT (JI,:,:) = ZPOND*ZLBXWT (JI,:,:) + (1.-ZPOND)* PWT(JI+1,:,:) ! 1 - PTHT (JI,:,:) = ZPOND*ZLBXTHT (JI,:,:) + (1.-ZPOND)* PTHT(JI+1,:,:)! 1 - ENDWHERE - ENDDO - ENDIF -! -! - IF(SIZE(PTKET) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PTKET(JI,:,:) = MAX(XTKEMIN, 2.*PTKET(JI+1,:,:)-PTKET(JI+2,:,:)) - ELSEWHERE ! INFLOW condition - PTKET(JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(JI,:,:) + (1.-ZPOND)*PTKET(JI+1,:,:)) - ENDWHERE - ENDDO - END IF - ! -! Case with KRR moist variables -! -! -! - DO JRR =1 ,KRR - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PRT(JI,:,:,JRR) = MAX(0.,2.*PRT(JI+1,:,:,JRR) -PRT(JI+2,:,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(JI,:,:,JRR) = MAX(0.,ZLBXRT(JI,:,:,JRR)) ! 1 - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JI=JPHEXT,1,-1 - PSRCT (JI,:,:) = PSRCT (JI+1,:,:) - END DO - END IF -! -! Case with KSV scalar variables - DO JSV=1 ,KSV - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(JI+1,:,:,JSV) - & - PSVT(JI+2,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(JI,:,:,JSV)) ! 1 - END WHERE - END DO - END IF - ! - END DO - ! - IF(LBLOWSNOW) THEN - DO JSV=1 ,NBLOWSNOW_2D - WHERE ( PUT(IIB,:,IKB) <= 0. ) ! OUTFLOW condition - XSNWCANO(IIB-1,:,JSV) = MAX(0.,2.*XSNWCANO(IIB,:,JSV) - & - XSNWCANO(IIB+1,:,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(IIB-1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PUT) /= 0) THEN - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PSVT(IIB-1,:,:,JSV) = MAX(0.,2.*PSVT(IIB,:,:,JSV) - & - PSVT(IIB+1,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIB-1,:,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - ENDIF -! -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 5 LBC FILLING IN THE X DIRECTION (RIGHT EAST SIDE): -! ===============-------------------------------- -! -IF (LEAST_ll( )) THEN -! -SELECT CASE ( HLBCX(2) ) -! -!* 5.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (IIE+JEXT,:,:) = PUT (IIE ,:,:) ! never used during run - IF(SIZE(PVT) /= 0) PVT (IIE+JEXT,:,:) = PVT (IIE+1-JEXT,:,:) - IF(SIZE(PWT) /= 0) PWT (IIE+JEXT,:,:) = PWT (IIE+1-JEXT,:,:) - IF(SIZE(PTHT) /= 0) PTHT (IIE+JEXT,:,:) = PTHT (IIE+1-JEXT,:,:) - IF(SIZE(PTKET) /= 0) PTKET(IIE+JEXT,:,:) = PTKET(IIE+1-JEXT,:,:) - IF(SIZE(PRT) /= 0) PRT (IIE+JEXT,:,:,:) = PRT (IIE+1-JEXT,:,:,:) - IF(SIZE(PSVT) /= 0) PSVT(IIE+JEXT,:,:,:) = PSVT (IIE+1-JEXT,:,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT (IIE+JEXT,:,:)= PSRCT (IIE+1-JEXT,:,:) - IF(LBLOWSNOW) XSNWCANO(IIE+JEXT,:,:) = XSNWCANO(IIE+1-JEXT,:,:) -! - END DO -! - IF(SIZE(PUT) /= 0) PUT(IIE+1 ,:,:) = 0. ! set the normal velocity -! -!* 5.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - ILBX = SIZE(PLBXVM,1) - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PVT (IIE+JI,:,:) = 2.*PVT (IIE+JI-1,:,:) -PVT (IIE+JI-2,:,:) - PWT (IIE+JI,:,:) = 2.*PWT (IIE+JI-1,:,:) -PWT (IIE+JI-2,:,:) - PTHT (IIE+JI,:,:) = 2.*PTHT (IIE+JI-1,:,:) -PTHT (IIE+JI-2,:,:) - ! - ELSEWHERE ! INFLOW condition - PVT (IIE+JI,:,:) = ZPOND*ZLBXVT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PVT(IIE+JI-1,:,:) - PWT (IIE+JI,:,:) = ZPOND*ZLBXWT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PWT(IIE+JI-1,:,:) - PTHT (IIE+JI,:,:) = ZPOND*ZLBXTHT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PTHT(IIE+JI-1,:,:) - ENDWHERE - END DO - ENDIF - ! - IF(SIZE(PTKET) /= 0) THEN - ILBX = SIZE(PLBXTKEM,1) - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PTKET(IIE+JI,:,:) = MAX(XTKEMIN, 2.*PTKET(IIE+JI-1,:,:)-PTKET(IIE+JI-2,:,:)) - ELSEWHERE ! INFLOW condition - PTKET(IIE+JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(ILBX-JPHEXT+JI,:,:) + & - (1.-ZPOND)*PTKET(IIE+JI-1,:,:)) - ENDWHERE - END DO - END IF - ! -! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - ILBX=SIZE(PLBXRM,1) - ! - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PRT(IIE+JI,:,:,JRR) = MAX(0.,2.*PRT(IIE+JI-1,:,:,JRR) -PRT(IIE+JI-2,:,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(IIE+JI,:,:,JRR) = MAX(0.,ZLBXRT(ILBX-JPHEXT+JI,:,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JI=1,JPHEXT - PSRCT (IIE+JI,:,:) = PSRCT (IIE+JI-1,:,:) - END DO - END IF -! Case with KSV scalar variables - DO JSV=1 ,KSV - ILBX=SIZE(PLBXSVM,1) - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(IIE+JI-1,:,:,JSV) - & - PSVT(IIE+JI-2,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(ILBX-JPHEXT+JI,:,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PUT(IIE+1,:,IKB) >= 0. ) ! OUTFLOW condition - XSNWCANO(IIE+1,:,JSV) = MAX(0.,2.*XSNWCANO(IIE,:,JSV) - & - XSNWCANO(IIE-1,:,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(IIE+1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PUT) /= 0) THEN - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PSVT(IIE+1,:,:,JSV) = MAX(0.,2.*PSVT(IIE,:,:,JSV) - & - PSVT(IIE-1,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIE+1,:,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - END IF -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 6. LBC FILLING IN THE Y DIRECTION (BOTTOM SOUTH SIDE): -! ------------------------------ -IF (LSOUTH_ll( )) THEN -! -SELECT CASE ( HLBCY(1) ) -! -!* 6.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (:,IJB-JEXT,:) = PUT (:,IJB-1+JEXT,:) - IF(SIZE(PVT) /= 0) PVT (:,IJB-JEXT,:) = PVT (:,IJB ,:) ! never used during run - IF(SIZE(PWT) /= 0) PWT (:,IJB-JEXT,:) = PWT (:,IJB-1+JEXT,:) - IF(SIZE(PTHT) /= 0) PTHT (:,IJB-JEXT,:) = PTHT (:,IJB-1+JEXT,:) - IF(SIZE(PTKET) /= 0) PTKET(:,IJB-JEXT,:) = PTKET(:,IJB-1+JEXT,:) - IF(SIZE(PRT) /= 0) PRT (:,IJB-JEXT,:,:) = PRT (:,IJB-1+JEXT,:,:) - IF(SIZE(PSVT) /= 0) PSVT (:,IJB-JEXT,:,:)= PSVT (:,IJB-1+JEXT,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT(:,IJB-JEXT,:) = PSRCT(:,IJB-1+JEXT,:) - IF(LBLOWSNOW) XSNWCANO(:,IJB-JEXT,:) = XSNWCANO(:,IJB-1+JEXT,:) -! - END DO -! - IF(SIZE(PVT) /= 0) PVT(:,IJB ,:) = 0. ! set the normal velocity -! -!* 6.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - PVT(:,JJ,:)=0. - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PUT (:,JJ,:) = 2.*PUT (:,JJ+1,:) -PUT (:,JJ+2,:) - PWT (:,JJ,:) = 2.*PWT (:,JJ+1,:) -PWT (:,JJ+2,:) - PTHT (:,JJ,:) = 2.*PTHT (:,JJ+1,:) -PTHT (:,JJ+2,:) - ELSEWHERE ! INFLOW condition - PUT (:,JJ,:) = ZPOND*ZLBYUT (:,JJ,:) + (1.-ZPOND)* PUT(:,JJ+1,:) - PWT (:,JJ,:) = ZPOND*ZLBYWT (:,JJ,:) + (1.-ZPOND)* PWT(:,JJ+1,:) - PTHT (:,JJ,:) = ZPOND*ZLBYTHT (:,JJ,:) + (1.-ZPOND)* PTHT(:,JJ+1,:) - ENDWHERE - END DO - ENDIF -! - IF(SIZE(PTKET) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PTKET(:,JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,JJ+1,:)-PTKET(:,JJ+2,:)) - ELSEWHERE ! INFLOW condition - PTKET(:,JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,JJ,:) + & - (1.-ZPOND)*PTKET(:,JJ+1,:)) - ENDWHERE - END DO - END IF - ! -! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PRT(:,JJ,:,JRR) = MAX(0.,2.*PRT(:,JJ+1,:,JRR) -PRT(:,JJ+2,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(:,JJ,:,JRR) = MAX(0.,ZLBYRT(:,JJ,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - PSRCT(:,JJ,:) = PSRCT(:,JJ+1,:) - END DO - END IF -! -! Case with KSV scalar variables -! - DO JSV=1 ,KSV - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,JJ+1,:,JSV) - & - PSVT(:,JJ+2,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,JJ,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PVT(:,IJB,IKB) <= 0. ) ! OUTFLOW condition - XSNWCANO(:,IJB-1,JSV) = MAX(0.,2.*XSNWCANO(:,IJB,JSV) - & - XSNWCANO(:,IJB+1,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(:,IJB-1,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PVT) /= 0) THEN - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PSVT(:,IJB-1,:,JSV) = MAX(0.,2.*PSVT(:,IJB,:,JSV) - & - PSVT(:,IJB+1,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJB-1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - END IF -! -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 7. LBC FILLING IN THE Y DIRECTION (TOP NORTH SIDE): -! =============== -! -IF (LNORTH_ll( )) THEN -! -SELECT CASE ( HLBCY(2) ) -! -!* 4.3.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (:,IJE+JEXT,:) = PUT (:,IJE+1-JEXT,:) - IF(SIZE(PVT) /= 0) PVT (:,IJE+JEXT,:) = PVT (:,IJE ,:) ! never used during run - IF(SIZE(PWT) /= 0) PWT (:,IJE+JEXT,:) = PWT (:,IJE+1-JEXT,:) - IF(SIZE(PTHT) /= 0) PTHT (:,IJE+JEXT,:) = PTHT (:,IJE+1-JEXT,:) - IF(SIZE(PTKET) /= 0) PTKET(:,IJE+JEXT,:) = PTKET(:,IJE+1-JEXT,:) - IF(SIZE(PRT) /= 0) PRT (:,IJE+JEXT,:,:) = PRT (:,IJE+1-JEXT,:,:) - IF(SIZE(PSVT) /= 0) PSVT (:,IJE+JEXT,:,:)= PSVT (:,IJE+1-JEXT,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT(:,IJE+JEXT,:) = PSRCT(:,IJE+1-JEXT,:) - IF(LBLOWSNOW) XSNWCANO(:,IJE+JEXT,:) = XSNWCANO(:,IJE+1-JEXT,:) -! - END DO -! - IF(SIZE(PVT) /= 0) PVT(:,IJE+1 ,:) = 0. ! set the normal velocity -! -!* 4.3.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! -! - ILBY=SIZE(PLBYUM,2) - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PUT (:,IJE+JJ,:) = 2.*PUT (:,IJE+JJ-1,:) -PUT (:,IJE+JJ-2,:) - PWT (:,IJE+JJ,:) = 2.*PWT (:,IJE+JJ-1,:) -PWT (:,IJE+JJ-2,:) - PTHT (:,IJE+JJ,:) = 2.*PTHT (:,IJE+JJ-1,:) -PTHT (:,IJE+JJ-2,:) - ELSEWHERE ! INFLOW condition - PUT (:,IJE+JJ,:) = ZPOND*ZLBYUT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PUT(:,IJE+JJ-1,:) - PWT (:,IJE+JJ,:) = ZPOND*ZLBYWT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PWT(:,IJE+JJ-1,:) - PTHT (:,IJE+JJ,:) = ZPOND*ZLBYTHT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PTHT(:,IJE+JJ-1,:) - ENDWHERE - END DO - ENDIF -! - IF(SIZE(PTKET) /= 0) THEN - ILBY=SIZE(PLBYTKEM,2) - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PTKET(:,IJE+JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,IJE+JJ-1,:)-PTKET(:,IJE+JJ-2,:)) - ELSEWHERE ! INFLOW condition - PTKET(:,IJE+JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,ILBY-JPHEXT+JJ,:) + & - (1.-ZPOND)*PTKET(:,IJE+JJ-1,:)) - ENDWHERE - END DO - ENDIF - ! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - ILBY=SIZE(PLBYRM,2) - ! - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PRT(:,IJE+JJ,:,JRR) = MAX(0.,2.*PRT(:,IJE+JJ-1,:,JRR) -PRT(:,IJE+JJ-2,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(:,IJE+JJ,:,JRR) = MAX(0.,ZLBYRT(:,ILBY-JPHEXT+JJ,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JJ=1,JPHEXT - PSRCT(:,IJE+JJ,:) = PSRCT(:,IJE+JJ-1,:) - END DO - END IF -! -! Case with KSV scalar variables - DO JSV=1 ,KSV - ILBY=SIZE(PLBYSVM,2) - ! - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,IJE+JJ-1,:,JSV) - & - PSVT(:,IJE+JJ-2,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,ILBY-JPHEXT+JJ,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PVT(:,IJE+1,IKB) >= 0. ) ! OUTFLOW condition - XSNWCANO(:,IJE+1,JSV) = MAX(0.,2.*XSNWCANO(:,IJE,JSV) - & - XSNWCANO(:,IJE-1,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(:,IJE+1,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - ! - IF(SIZE(PVT) /= 0) THEN - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PSVT(:,IJE+1,:,JSV) = MAX(0.,2.*PSVT(:,IJE,:,JSV) - & - PSVT(:,IJE-1,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJE+1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - ENDIF -! -END SELECT -END IF -! -! -IF (CCLOUD == 'LIMA' .AND. IMI == 1 .AND. CPROGRAM=='MESONH') THEN - - ZSVT=PSVT - ZRT=PRT - - IF (GFIRSTCALLLIMA) THEN - ALLOCATE(GLIMABOUNDARY(NSV_LIMA)) - GFIRSTCALLLIMA = .FALSE. - DO JSV=NSV_LIMA_BEG,NSV_LIMA_END - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1) = GCHTMP - ENDDO - ENDIF - CALL INIT_AEROSOL_CONCENTRATION(PRHODREF,ZSVT,XZZ) - DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN - IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) - PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) - PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) - PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) - ENDIF - END DO - DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN - IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) - PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) - PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) - PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) - ENDIF - END DO - - CALL SET_CONC_LIMA( IMI, 'NONE', PRHODREF, ZRT(:, :, :, :), ZSVT(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) - IF (NSV_LIMA_NC.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NC-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NC)=ZSVT(IIB-1,:,:,NSV_LIMA_NC) ! cloud - PSVT(IIE+1,:,:,NSV_LIMA_NC)=ZSVT(IIE+1,:,:,NSV_LIMA_NC) - PSVT(:,IJB-1,:,NSV_LIMA_NC)=ZSVT(:,IJB-1,:,NSV_LIMA_NC) - PSVT(:,IJE+1,:,NSV_LIMA_NC)=ZSVT(:,IJE+1,:,NSV_LIMA_NC) - ENDIF - ENDIF - IF (NSV_LIMA_NR.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NR-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NR)=ZSVT(IIB-1,:,:,NSV_LIMA_NR) ! rain - PSVT(IIE+1,:,:,NSV_LIMA_NR)=ZSVT(IIE+1,:,:,NSV_LIMA_NR) - PSVT(:,IJB-1,:,NSV_LIMA_NR)=ZSVT(:,IJB-1,:,NSV_LIMA_NR) - PSVT(:,IJE+1,:,NSV_LIMA_NR)=ZSVT(:,IJE+1,:,NSV_LIMA_NR) - ENDIF - ENDIF - IF (NSV_LIMA_NI.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NI-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NI)=ZSVT(IIB-1,:,:,NSV_LIMA_NI) ! ice - PSVT(IIE+1,:,:,NSV_LIMA_NI)=ZSVT(IIE+1,:,:,NSV_LIMA_NI) - PSVT(:,IJB-1,:,NSV_LIMA_NI)=ZSVT(:,IJB-1,:,NSV_LIMA_NI) - PSVT(:,IJE+1,:,NSV_LIMA_NI)=ZSVT(:,IJE+1,:,NSV_LIMA_NI) - ENDIF - END IF -END IF -! -! -IF (LUSECHEM .AND. IMI == 1) THEN - IF (GFIRSTCALL1) THEN - ALLOCATE(GCHBOUNDARY(NSV_CHEM)) - GFIRSTCALL1 = .FALSE. - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GCHBOUNDARY(JSV-NSV_CHEMBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - IF (GCHBOUNDARY(JSV-NSV_CHEMBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LUSECHIC .AND. IMI == 1) THEN - IF (GFIRSTCALLIC) THEN - ALLOCATE(GICBOUNDARY(NSV_CHIC)) - GFIRSTCALLIC = .FALSE. - DO JSV=NSV_CHICBEG,NSV_CHICEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GICBOUNDARY(JSV-NSV_CHICBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_CHICBEG,NSV_CHICEND - IF (GICBOUNDARY(JSV-NSV_CHICBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -IF (LORILAM .AND. IMI == 1) THEN - IF (GFIRSTCALL2) THEN - ALLOCATE(GAERBOUNDARY(NSV_AER)) - GFIRSTCALL2 = .FALSE. - DO JSV=NSV_AERBEG,NSV_AEREND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GAERBOUNDARY(JSV-NSV_AERBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_AERBEG,NSV_AEREND - IF (GAERBOUNDARY(JSV-NSV_AERBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LDUST .AND. IMI == 1) THEN - IF (GFIRSTCALL3) THEN - ALLOCATE(GDSTBOUNDARY(NSV_DST)) - GFIRSTCALL3 = .FALSE. - DO JSV=NSV_DSTBEG,NSV_DSTEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GDSTBOUNDARY(JSV-NSV_DSTBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_DSTBEG,NSV_DSTEND - IF (GDSTBOUNDARY(JSV-NSV_DSTBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LSALT .AND. IMI == 1) THEN - IF (GFIRSTCALL5) THEN - ALLOCATE(GSLTBOUNDARY(NSV_SLT)) - GFIRSTCALL5 = .FALSE. - DO JSV=NSV_SLTBEG,NSV_SLTEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GSLTBOUNDARY(JSV-NSV_SLTBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_SLTBEG,NSV_SLTEND - IF (GSLTBOUNDARY(JSV-NSV_SLTBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF ( LPASPOL .AND. IMI == 1) THEN - IF (GFIRSTCALLPP) THEN - ALLOCATE(GPPBOUNDARY(NSV_PP)) - GFIRSTCALLPP = .FALSE. - DO JSV=NSV_PPBEG,NSV_PPEND - GPPTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GPPBOUNDARY(JSV-NSV_PPBEG+1) = GPPTMP - ENDDO - ENDIF - - DO JSV=NSV_PPBEG,NSV_PPEND - IF (GPPBOUNDARY(JSV-NSV_PPBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF ( LCONDSAMP .AND. IMI == 1) THEN - IF (GFIRSTCALLCS) THEN - ALLOCATE(GCSBOUNDARY(NSV_CS)) - GFIRSTCALLCS = .FALSE. - DO JSV=NSV_CSBEG,NSV_CSEND - GCSTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GCSBOUNDARY(JSV-NSV_CSBEG+1) = GCSTMP - ENDDO - ENDIF - - DO JSV=NSV_CSBEG,NSV_CSEND - IF (GCSBOUNDARY(JSV-NSV_CSBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF - -IF (LBLOWSNOW .AND. IMI == 1) THEN - IF (GFIRSTCALL3) THEN - ALLOCATE(GSNWBOUNDARY(NSV_SNW)) - GFIRSTCALL3 = .FALSE. - DO JSV=NSV_SNWBEG,NSV_SNWEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(1,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,1,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY,:,JSV)==0) - GSNWBOUNDARY(JSV-NSV_SNWBEG+1) = GCHTMP - ENDDO - ENDIF -ENDIF - -#ifdef MNH_FOREFIRE -!ForeFire -IF ( LFOREFIRE .AND. IMI == 1) THEN - IF (GFIRSTCALLFF) THEN - ALLOCATE(GFFBOUNDARY(NSV_FF)) - GFIRSTCALLFF = .FALSE. - DO JSV=NSV_FFBEG,NSV_FFEND - GFFTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GFFBOUNDARY(JSV-NSV_FFBEG+1) = GFFTMP - ENDDO - ENDIF - - DO JSV=NSV_FFBEG,NSV_FFEND - IF (GFFBOUNDARY(JSV-NSV_FFBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -#endif -! -IF ( CELEC /= 'NONE' .AND. (NSV_ELEC_A(NDAD(IMI)) == 0 .OR. IMI == 1)) THEN - CALL ION_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT) -ENDIF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE BOUNDARIES diff --git a/src/mesonh/ext/default_desfmn.f90 b/src/mesonh/ext/default_desfmn.f90 deleted file mode 100644 index 6957954a7..000000000 --- a/src/mesonh/ext/default_desfmn.f90 +++ /dev/null @@ -1,1491 +0,0 @@ -!MNH_LIC Copyright 1994-2023 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_DEFAULT_DESFM_n -! ########################### -! -INTERFACE -! -SUBROUTINE DEFAULT_DESFM_n(KMI) -INTEGER, INTENT(IN) :: KMI ! Model index -END SUBROUTINE DEFAULT_DESFM_n -! -END INTERFACE -! -END MODULE MODI_DEFAULT_DESFM_n -! -! -! -! ############################### - SUBROUTINE DEFAULT_DESFM_n(KMI) -! ############################### -! -!!**** *DEFAULT_DESFM_n * - set default values for descriptive variables of -!! model KMI -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to set default values for the variables -! in descriptor files by filling the corresponding variables which -! are stored in modules. -! -! -!!** METHOD -!! ------ -!! Each variable in modules, which can be initialized by reading its -!! value in the descriptor file is set to a default value. -!! When this routine is used during INIT, the modules of the first model -!! are used to temporarily store the variables associated with a nested -!! model. -!! When this routine is used during SPAWNING, the modules of a second -!! model must be initialized. -!! Default values for variables common to all models are set only -!! at the first call of DEFAULT_DESFM_n (i.e. when KMI=1) -!! -!! -!! EXTERNAL -!! -------- -!! NONE -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : JPHEXT,JPVEXT -!! -!! Module MODD_CONF : CCONF,L2D,L1D,LFLAT,NMODEL,NVERB -!! -!! Module MODD_DYN : XSEGLEN,XASSELIN,LCORIO,LNUMDIFF -!! XALKTOP,XALZBOT -!! -!! Module MODD_BAKOUT -!! -!! Module MODD_NESTING : NDAD(m),NDTRATIO(m),XWAY(m) -!! -!! Module MODD_CONF_n : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS -!! LUSERG,LUSERH,CSEG,CEXP -!! -!! Module MODD_LUNIT_n : CINIFILE,CCPLFILE -!! -!! -!! Module MODD_DYN_n : XTSTEP,CPRESOPT,NITR,XRELAX,LHO_RELAX -!! LVE_RELAX,XRIMKMAX,NRIMX,NRIMY -!! -!! Module MODD_ADV_n : CUVW_ADV_SCHEME,CMET_ADV_SCHEME,CSV_ADV_SCHEME,NLITER -!! -!! Module MODD_PARAM_n : CTURB,CRAD,CDCONV,CSCONV -!! -!! Module MODD_LBC_n : CLBCX, CLBCY,NLBLX,NLBLY,XCPHASE,XCPHASE_PBL,XPOND -!! -!! Module MODD_TURB_n : XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,LSUBG_COND -!! LTGT_FLX -!! -!! -!! Module MODD_PARAM_RAD_n: -!! XDTRAD,XDTRAD_CLONLY,LCLEAR_SKY,NRAD_COLNBR, NRAD_DIAG -!! -!! Module MODD_BUDGET : CBUTYPE,NBUMOD,XBULEN,NBUKL, NBUKH,LBU_KCP,XBUWRI -!! NBUIL, NBUIH,NBUJL, NBUJH,LBU_ICP,LBU_JCP,NBUMASK -!! -!! Module MODD_BLANK_n: -!! -!! XDUMMYi, NDUMMYi, LDUMMYi, CDUMMYi -!! -!! Module MODD_FRC : -!! -!! LGEOST_UV_FRC,LGEOST_TH_FRC,LTEND_THRV_FRC -!! LVERT_MOTION_FRC,LRELAX_THRV_FRC,LRELAX_UV_FRC,LRELAX_UVMEAN_FRC, -!! XRELAX_TIME_FRC -!! XRELAX_HEIGHT_FRC,CRELAX_HEIGHT_TYPE,LTRANS,XUTRANS,XVTRANS, -!! LPGROUND_FRC -!! -!! Module MODD_PARAM_ICE : -!! -!! LWARM,CPRISTINE_ICE -!! -!! Module MODD_PARAM_KAFR_n : -!! -!! XDTCONV,LREFRESH_ALL,LDOWN,NICE,LCHTRANS -!! -!! Module MODD_PARAM_MFSHALL_n : -!! -!! CMF_UPDRAFT,LMIXUV,CMF_CLOUD,XIMPL_MF,LMF_FLX -!! -!! -!! -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine DEFAULT_DESFM_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 02/06/94 -!! Modifications 17/10/94 (Stein) For LCORIO -!! Modifications 06/12/94 (Stein) remove LBOUSS+add LABSLAYER, LNUMDIFF -!! ,LSTEADYLS -!! Modifications 06/12/94 (Stein) remove LABSLAYER, add LHO_RELAX, -!! LVE_RELAX, NRIMX, NRIMY, XRIMKMAX -!! Modifications 09/01/95 (Lafore) add LSTEADY_DMASS -!! Modifications 09/01/95 (Stein) add the turbulence scheme namelist -!! Modifications 09/01/95 (Stein) add the 1D switch -!! Modifications 10/03/95 (Mallet) add the coupling files -!! 29/06/95 ( Stein, Nicolau, Hereil) add the budgets -!! Modifications 25/09/95 ( Stein )add the LES tools -!! Modifications 25/10/95 ( Stein )add the radiations -!! Modifications 23/10/95 (Vila, lafore) new scalar advection scheme -!! Modifications 24/02/96 (Stein) change the default value for CCPLFILE -!! Modifications 12/02/96 (Lafore) transformation to DEFAULT_DESFM_n for -!! spawning -!! Modifications 25/04/96 (Suhre) add the blank module -!! Modifications 29/07/96 (Pinty&Suhre) add module MODD_FRC -!! Modifications 11/04/96 (Pinty) add the rain-ice scheme and modify -!! the split arrays in MODD_PARAM_RAD_n -!! Modifications 11/01/97 (Pinty) add the deep convection scheme -!! Modifications 24/11/96 (Masson) add LREFRESH_ALL in deep convection -!! Modifications 12/02/96 (Lafore) transformation to DEFAULT_DESFM_n for spawning -!! Modifications 22/07/96 (Lafore) gridnesting implementation -!! Modifications 29/07/96 (Lafore) add the module MODD_FMOUT (renamed MODD_BAKOUT) -!! Modifications 23/06/97 (Stein) add the equation system name -!! Modifications 10/07/97 (Masson) add MODD_PARAM_GROUNDn : CROUGH -!! Modifications 28/07/97 (Masson) remove LREFRESH_ALL and LSTEADY_DMASS -!! Modifications 08/10/97 (Stein) switch (_n=1) to initialize the -!! parameters common to all models -!! Modifications 24/01/98 (Bechtold) add LREFRESH_ALL, LCHTRANS, -!! LTEND_THRV_FR and LSST_FRC -!! Modifications 18/07/99 (Stein) add LRAD_DIAG -!! Modification 15/03/99 (Masson) use of XUNDEF -!! Modification 11/12/00 (Tomasini) Add CSEA_FLUX to MODD_PARAMn -!! Modification 22/01/01 (Gazen) delete NSV and add LHORELAX_SVC2R2 -!! LHORELAX_SVCHEM,LHORELAX_SVLG -!! Modification 15/03/02 (Solmon) radiation scheme: remove NSPOT and add -!! default for aerosol and cloud rad. prop. control -!! Modification 22/05/02 (Jabouille) put chimical default here -!! Modification 01/2004 (Masson) removes surface (externalization) -!! 09/04 (M. Tomasini) New namelist to modify the -!! Cloud mixing length -!! 07/05 (P.Tulet) New namelists for dust and aerosol -!! Modification 01/2007 (Malardel, Pergaud) Add MODD_PARAM_MFSHALL_n -!! Modification 10/2009 (Aumond) Add user multimasks for LES -!! Modification 10/2009 (Aumond) Add MEAN_FIELD -!! Modification 12/04/07 (Leriche) add LUSECHAQ for aqueous chemistry -!! Modification 30/05/07 (Leriche) add LCH_PH and XCH_PHINIT for pH -!! Modification 25/04/08 (Leriche) add XRTMIN_AQ LWC threshold for aq. chemistry -!! 16/07/10 add LHORELAX_SVIC -!! 16/09/10 add LUSECHIC -!! 13/01/11 add LCH_RET_ICE -!! 01/07/11 (F.Couvreux) Add CONDSAMP -!! 01/07/11 (B.Aouizerats) Add CAOP -!! 07/2013 (C.Lac) add WENO, LCHECK -!! 07/2013 (Bosseur & Filippi) adds Forefire -!! 08/2015 (Redelsperger & Pianezze) add XPOND coefficient for LBC -!! Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX -!! put NCH_VEC_LENGTH = 50 instead of 1000 -!! -!! 04/2016 (C.LAC) negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2 -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX -!! put NCH_VEC_LENGTH = 50 instead of 1000 -!! 10/2016 (C.Lac) VSIGQSAT change from 0 to 0.02 for coherence with AROME -!! 10/2016 (C.Lac) Add droplet deposition -!! 10/2016 (R.Honnert and S.Riette) : Improvement of EDKF and adaptation to the grey zone -!! 10/2016 (F Brosse) add prod/loss terms computation for chemistry -!! 07/2017 (V. Masson) adds time step for output files writing. -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! 02/2018 Q.Libois ECRAD -! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 01/2018 (S. Riette) new budgets and variables for ICE3/ICE4 -!! 01/2018 (J.Colin) add VISC and DRAG -!! 07/2017 (V. Vionnet) add blowing snow variables -!! 01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -!! 05/2019 F.Brient add tracer emission from the top of the boundary-layer -!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree -! P. Wautelet 17/04/2020: move budgets switch values into modd_budget -! P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables -! F. Auguste, T. Nagel 02/2021: add IBM defaults parameters -! T. Nagel 02/2021: add turbulence recycling defaults parameters -! P-A Joulin 21/05/2021: add Wind turbines -! S. Riette 21/05/2021: add options to PDF subgrid scheme -! D. Ricard 05/2021: add the contribution of Leonard terms in the turbulence scheme -! JL Redelsperger 06/2021: add parameters allowing to active idealized oceanic convection -! B. Vie 06/2021: add prognostic supersaturation for LIMA -! Q. Rodier 06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation) -! F. Couvreux 06/2021: add LRELAX_UVMEAN_FRC -! Q. Rodier 07/2021: modify XPOND=1 -! A. Costes 12/2021: Blaze fire model -! C. Barthe 03/2022: add CIBU and RDSF options in LIMA -! Delbeke/Vie 03/2022: KHKO option in LIMA -! P. Wautelet 27/04/2022: add namelist for profilers -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_PARAMETERS -USE MODD_CONF ! For INIT only DEFAULT_DESFM1 -USE MODD_CONFZ -USE MODD_DYN -USE MODD_NESTING -USE MODD_BAKOUT -USE MODD_SERIES -USE MODD_CONF_n ! modules used to set the default values is only -USE MODD_LUNIT_n ! the one corresponding to model 1. These memory -USE MODD_DIM_n ! addresses will then be filled by the values read in -USE MODD_DYN_n ! the DESFM corresponding to model n which may have -USE MODD_ADV_n ! missing values. This is why we affect default values. -USE MODD_PARAM_n ! For SPAWNING DEFAULT_DESFM2 is also used -USE MODD_LBC_n -USE MODD_OUT_n -USE MODD_TURB_n -USE MODD_BUDGET -USE MODD_LES -USE MODD_PARAM_RAD_n -#ifdef MNH_ECRAD -USE MODD_PARAM_ECRAD_n -#if ( VER_ECRAD == 140 ) -USE MODD_RADIATIONS_n , ONLY : NSWB_MNH, NLWB_MNH -#endif -#endif -USE MODD_BLANK_n -USE MODD_FRC -USE MODD_PARAM_ICE -USE MODD_PARAM_C2R2 -USE MODD_TURB_CLOUD -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n -USE MODD_CH_MNHC_n -USE MODD_SERIES_n -USE MODD_NUDGING_n -USE MODD_CH_AEROSOL -USE MODD_DUST -USE MODD_SALT -USE MODD_PASPOL -USE MODD_CONDSAMP -USE MODD_MEAN_FIELD -USE MODD_DRAGTREE_n -USE MODD_DRAGBLDG_n -USE MODD_EOL_MAIN -USE MODD_EOL_ADNR -USE MODD_EOL_ALM -USE MODD_EOL_SHARED_IO -USE MODD_ALLPROFILER_n -USE MODD_ALLSTATION_n -! -! -USE MODD_PARAM_LIMA, ONLY : LNUCL, LSEDI, LHHONI, LMEYERS, & - NMOM_I, NMOM_S, NMOM_G, NMOM_H, & - NMOD_IFN, XIFN_CONC, LIFN_HOM, CIFN_SPECIES, & - CINT_MIXING, NMOD_IMM, NIND_SPECIE, LMURAKAMI, & - YSNOW_T=>LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & - XFACTNUC_DEP, XFACTNUC_CON, & - LACTI, OSEDC=>LSEDC, & - OACTIT=>LACTIT, LBOUND, LSPRO, LADJ, LKHKO, NMOM_C, NMOM_R, & - NMOD_CCN, XCCN_CONC, LKESSLERAC, & - LCCN_HOM, CCCN_MODES, & - YALPHAR=>XALPHAR, YNUR=>XNUR, & - YALPHAC=>XALPHAC, YNUC=>XNUC, CINI_CCN=>HINI_CCN, & - CTYPE_CCN=>HTYPE_CCN, YFSOLUB_CCN=>XFSOLUB_CCN, & - YACTEMP_CCN=>XACTEMP_CCN, YAERDIFF=>XAERDIFF, & - YAERHEIGHT=>XAERHEIGHT, & - LSCAV, LAERO_MASS, NPHILLIPS, & - LCIBU, XNDEBRIS_CIBU, LRDSF, & - ODEPOC=>LDEPOC, OVDEPOC=>XVDEPOC, OACTTKE=>LACTTKE, & - LPTSPLIT, L_LFEEDBACKT=>LFEEDBACKT, L_NMAXITER=>NMAXITER, & - L_XMRSTEP=>XMRSTEP, L_XTSTEP_TS=>XTSTEP_TS -! -USE MODD_LATZ_EDFLX -USE MODD_2D_FRC -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_DRAG_n -USE MODD_VISCOSITY -USE MODD_RECYCL_PARAM_n -USE MODD_IBM_PARAM_n -USE MODD_IBM_LSF -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_FIRE_n -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! Model index -! -!* 0.2 declaration of local variables -! -INTEGER :: JM ! loop index -! -!------------------------------------------------------------------------------- -! -!* 1. SET DEFAULT VALUES FOR MODD_LUNIT_n : -! ---------------------------------- -! -! CINIFILE='INIFILE' -CINIFILEPGD='' !Necessary to keep this line to prevent problems with spawning -CCPLFILE(:)=' ' -! -!------------------------------------------------------------------------------- -! -!* 2. SET DEFAULT VALUES FOR MODD_CONF AND MODD_CONF_n : -! ------------------------------------------------ -! -IF (KMI == 1) THEN - CCONF ='START' - LTHINSHELL = .FALSE. - L2D = .FALSE. - L1D = .FALSE. - LFLAT = .FALSE. - NMODEL = 1 - CEQNSYS = 'DUR' - NVERB = 5 - CEXP = 'EXP01' - CSEG = 'SEG01' - LFORCING = .FALSE. - L2D_ADV_FRC= .FALSE. - L2D_REL_FRC= .FALSE. - XRELAX_HEIGHT_BOT = 0. - XRELAX_HEIGHT_TOP = 30000. - XRELAX_TIME = 864000. - LPACK = .TRUE. - NHALO = 1 -#ifdef MNH_SX5 - CSPLIT ='YSPLITTING' ! NEC vectoriel architecture , low number of PROC -#else - CSPLIT ='BSPLITTING' ! Scalaire architecture , high number of PROC -#endif - NZ_PROC = 0 !JUAN Z_SPLITTING :: number of proc in Z splitting - NZ_SPLITTING = 10 !JUAN Z_SPLITTING :: for debug NZ=1=flat_inv; NZ=10=flat_invz; NZ=1+2 the two - LLG = .FALSE. - LINIT_LG = .FALSE. - CINIT_LG = 'FMOUT' - LNOMIXLG = .FALSE. - LCHECK = .FALSE. -END IF -! -CCLOUD = 'NONE' -LUSERV = .TRUE. -LUSERC = .FALSE. -LUSERR = .FALSE. -LUSERI = .FALSE. -LUSERS = .FALSE. -LUSERG = .FALSE. -LUSERH = .FALSE. -LOCEAN = .FALSE. -!NSV = 0 -!NSV_USER = 0 -LUSECI = .FALSE. -! -!------------------------------------------------------------------------------- -! -!* 3. SET DEFAULT VALUES FOR MODD_DYN AND MODD_DYN_n : -! ----------------------------------------------- -! -IF (KMI == 1) THEN - XSEGLEN = 43200. - XASSELIN = 0.2 - XASSELIN_SV = 0.02 - LCORIO = .TRUE. - LNUMDIFU = .TRUE. - LNUMDIFTH = .FALSE. - LNUMDIFSV = .FALSE. - XALZBOT = 4000. - XALKTOP = 0.01 - XALKGRD = 0.01 - XALZBAS = 0.01 -END IF -! -XTSTEP = 60. -CPRESOPT = 'CRESI' -NITR = 4 -LITRADJ = .TRUE. -LRES = .FALSE. -XRES = 1.E-07 -XRELAX = 1. -LVE_RELAX = .FALSE. -LVE_RELAX_GRD = .FALSE. -XRIMKMAX = 0.01 / XTSTEP -XT4DIFU = 1800. -XT4DIFTH = 1800. -XT4DIFSV = 1800. -! -IF (KMI == 1) THEN ! for model 1 we have a Large scale information - NRIMX = JPRIMMAX ! for U,V,W,TH,Rv used for the hor. relaxation - NRIMY = JPRIMMAX -ELSE - NRIMX = 0 ! for inner models we use only surfacic fields to - NRIMY = 0 ! give the lbc and no hor. relaxation is used -END IF -! -LHORELAX_UVWTH = .FALSE. -LHORELAX_RV = .FALSE. -LHORELAX_RC = .FALSE. ! for all these fields, no large scale is usally available -LHORELAX_RR = .FALSE. ! for model 1 and for inner models, we only use surfacic -LHORELAX_RS = .FALSE. ! fiels ( no hor. relax. ) -LHORELAX_RI = .FALSE. -LHORELAX_RG = .FALSE. -LHORELAX_RH = .FALSE. -LHORELAX_TKE = .FALSE. -LHORELAX_SV(:) = .FALSE. -LHORELAX_SVC2R2 = .FALSE. -LHORELAX_SVC1R3 = .FALSE. -LHORELAX_SVELEC = .FALSE. -LHORELAX_SVLG = .FALSE. -LHORELAX_SVCHEM = .FALSE. -LHORELAX_SVCHIC = .FALSE. -LHORELAX_SVDST = .FALSE. -LHORELAX_SVSLT = .FALSE. -LHORELAX_SVPP = .FALSE. -LHORELAX_SVCS = .FALSE. -LHORELAX_SVAER = .FALSE. -! -LHORELAX_SVLIMA = .FALSE. -! -#ifdef MNH_FOREFIRE -LHORELAX_SVFF = .FALSE. -#endif -LHORELAX_SVSNW = .FALSE. -LHORELAX_SVFIRE = .FALSE. -! -! -!------------------------------------------------------------------------------- -! -!* 4. SET DEFAULT VALUES FOR MODD_NESTING : -! ----------------------------------- -! -IF (KMI == 1) THEN - NDAD(1)=1 - DO JM=2,JPMODELMAX - NDAD(JM) = JM - 1 - END DO - NDTRATIO(:) = 1 - XWAY(:) = 2. ! two-way interactive gridnesting - XWAY(1) = 0. ! except for model 1 -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. SET DEFAULT VALUES FOR MODD_ADV_n : -! ---------------------------------- -! -CUVW_ADV_SCHEME = 'CEN4TH' -CMET_ADV_SCHEME = 'PPM_01' -CSV_ADV_SCHEME = 'PPM_01' -CTEMP_SCHEME = 'RKC4' -NWENO_ORDER = 3 -NSPLIT = 1 -LSPLIT_CFL = .TRUE. -LSPLIT_WENO = .TRUE. -XSPLIT_CFL = 0.8 -LCFL_WRIT = .FALSE. -! -!------------------------------------------------------------------------------- -! -!* 6. SET DEFAULT VALUES FOR MODD_PARAM_n : -! ----------------------------------- -! -CTURB = 'NONE' -CRAD = 'NONE' -CDCONV = 'NONE' -CSCONV = 'NONE' -CELEC = 'NONE' -CACTCCN = 'NONE' -! -!------------------------------------------------------------------------------- -! -!* 7. SET DEFAULT VALUES FOR MODD_LBC_n : -! --------------------------------- -! -CLBCX(1) ='CYCL' -CLBCX(2) ='CYCL' -CLBCY(1) ='CYCL' -CLBCY(2) ='CYCL' -NLBLX(:) = 1 -NLBLY(:) = 1 -XCPHASE = 20. -XCPHASE_PBL = 0. -XCARPKMAX = XUNDEF -XPOND = 1.0 -! -!------------------------------------------------------------------------------- -! -!* 8. SET DEFAULT VALUES FOR MODD_NUDGING_n : -! --------------------------------- -! -LNUDGING = .FALSE. -XTNUDGING = 21600. -! -!------------------------------------------------------------------------------- -! -!* 9. SET DEFAULT VALUES FOR MODD_BAKOUT and MODD_OUT_n : -! ------------------------------------------------ -! -! -! -!------------------------------------------------------------------------------- -! -!* 10. SET DEFAULT VALUES FOR MODD_TURB_n : -! ---------------------------------- -! -XIMPL = 1. -XKEMIN = 0.01 -XCEDIS = 0.84 -XCADAP = 0.5 -CTURBLEN = 'BL89' -CTURBDIM = '1DIM' -LTURB_FLX =.FALSE. -LTURB_DIAG=.FALSE. -LSUBG_COND=.FALSE. -CSUBG_AUCV='NONE' -CSUBG_AUCV_RI='NONE' -LSIGMAS =.TRUE. -LSIG_CONV =.FALSE. -LRMC01 =.FALSE. -CTOM ='NONE' -VSIGQSAT = 0.02 -CCONDENS='CB02' -CLAMBDA3='CB' -CSUBG_MF_PDF='TRIANGLE' -LLEONARD =.FALSE. -XCOEFHGRADTHL = 1.0 -XCOEFHGRADRM = 1.0 -XALTHGRAD = 2000.0 -XCLDTHOLD = -1.0 - -!------------------------------------------------------------------------------- -! -!* 10b. SET DEFAULT VALUES FOR MODD_DRAGTREE : -! ---------------------------------- -! -LDRAGTREE = .FALSE. -LDEPOTREE = .FALSE. -XVDEPOTREE = 0.02 ! 2 cm/s -!------------------------------------------------------------------------------ -! -!* 10c. SET DEFAULT VALUES FOR MODD_DRAGB -! ---------------------------------- -! -LDRAGBLDG = .FALSE. -! -!* 10d. SET DEFAULT VALUES FOR MODD_EOL* : -! ---------------------------------- -! -! 10d.i) MODD_EOL_MAIN -! -LMAIN_EOL = .FALSE. -CMETH_EOL = 'ADNR' -CSMEAR = '3LIN' -NMODEL_EOL = 1 -! -! 10d.ii) MODD_EOL_SHARED_IO -! -CFARM_CSVDATA = 'data_farm.csv' -CTURBINE_CSVDATA = 'data_turbine.csv' -CBLADE_CSVDATA = 'data_blade.csv' -CAIRFOIL_CSVDATA = 'data_airfoil.csv' -! -CINTERP = 'CLS' -! -! 10d.iii) MODD_EOL_ALM -! -NNB_BLAELT = 42 -LTIMESPLIT = .FALSE. -LTIPLOSSG = .TRUE. -LTECOUTPTS = .FALSE. -! -!------------------------------------------------------------------------------ -!* 10.e SET DEFAULT VALUES FOR MODD_ALLPROFILER_n : -! ---------------------------------- -! -NNUMB_PROF = 0 -XSTEP_PROF = 60.0 -XX_PROF(:) = XUNDEF -XY_PROF(:) = XUNDEF -XZ_PROF(:) = XUNDEF -XLAT_PROF(:) = XUNDEF -XLON_PROF(:) = XUNDEF -CNAME_PROF(:) = '' -CFILE_PROF = 'NO_INPUT_CSV' -! LDIAG_SURFRAD = .TRUE. -!------------------------------------------------------------------------------ -!* 10.f SET DEFAULT VALUES FOR MODD_ALLSTATION_n : -! ---------------------------------- -! -NNUMB_STAT = 0 -XSTEP_STAT = 60.0 -XX_STAT(:) = XUNDEF -XY_STAT(:) = XUNDEF -XZ_STAT(:) = XUNDEF -XLAT_STAT(:) = XUNDEF -XLON_STAT(:) = XUNDEF -CNAME_STAT(:) = '' -CFILE_STAT = 'NO_INPUT_CSV' -LDIAG_SURFRAD = .TRUE. -! -!------------------------------------------------------------------------------- -! -!* 11. SET DEFAULT VALUES FOR MODD_BUDGET : -! ------------------------------------ -! -! 11.1 General budget variables -! -IF (KMI == 1) THEN - CBUTYPE = 'NONE' - NBUMOD = 1 - XBULEN = XSEGLEN - XBUWRI = XSEGLEN - NBUKL = 1 - NBUKH = 0 - LBU_KCP = .TRUE. -! -! 11.2 Variables for the cartesian box -! - NBUIL = 1 - NBUIH = 0 - NBUJL = 1 - NBUJH = 0 - LBU_ICP = .TRUE. - LBU_JCP = .TRUE. -! -! 11.3 Variables for the mask -! - NBUMASK = 1 -END IF -! -!------------------------------------------------------------------------------- -! -!* 12. SET DEFAULT VALUES FOR MODD_LES : -! --------------------------------- -! -IF (KMI == 1) THEN - LLES_MEAN = .FALSE. - LLES_RESOLVED = .FALSE. - LLES_SUBGRID = .FALSE. - LLES_UPDRAFT = .FALSE. - LLES_DOWNDRAFT = .FALSE. - LLES_SPECTRA = .FALSE. -! - NLES_LEVELS = NUNDEF - XLES_ALTITUDES = XUNDEF - NSPECTRA_LEVELS = NUNDEF - XSPECTRA_ALTITUDES = XUNDEF - NLES_TEMP_SERIE_I = NUNDEF - NLES_TEMP_SERIE_J = NUNDEF - NLES_TEMP_SERIE_Z = NUNDEF - CLES_NORM_TYPE = 'NONE' - CBL_HEIGHT_DEF = 'KE' - XLES_TEMP_SAMPLING = XUNDEF - XLES_TEMP_MEAN_START = XUNDEF - XLES_TEMP_MEAN_END = XUNDEF - XLES_TEMP_MEAN_STEP = 3600. - LLES_CART_MASK = .FALSE. - NLES_IINF = NUNDEF - NLES_ISUP = NUNDEF - NLES_JINF = NUNDEF - NLES_JSUP = NUNDEF - LLES_NEB_MASK = .FALSE. - LLES_CORE_MASK = .FALSE. - LLES_MY_MASK = .FALSE. - NLES_MASKS_USER = NUNDEF - LLES_CS_MASK = .FALSE. - - LLES_PDF = .FALSE. - NPDF = 1 - XTH_PDF_MIN = 270. - XTH_PDF_MAX = 350. - XW_PDF_MIN = -10. - XW_PDF_MAX = 10. - XTHV_PDF_MIN = 270. - XTHV_PDF_MAX = 350. - XRV_PDF_MIN = 0. - XRV_PDF_MAX = 20. - XRC_PDF_MIN = 0. - XRC_PDF_MAX = 1. - XRR_PDF_MIN = 0. - XRR_PDF_MAX = 1. - XRI_PDF_MIN = 0. - XRI_PDF_MAX = 1. - XRS_PDF_MIN = 0. - XRS_PDF_MAX = 1. - XRG_PDF_MIN = 0. - XRG_PDF_MAX = 1. - XRT_PDF_MIN = 0. - XRT_PDF_MAX = 20. - XTHL_PDF_MIN = 270. - XTHL_PDF_MAX = 350. -END IF -! -!------------------------------------------------------------------------------- -! -!* 13. SET DEFAULT VALUES FOR MODD_PARAM_RAD_n : -! --------------------------------------- -! -XDTRAD = XTSTEP -XDTRAD_CLONLY = XTSTEP -LCLEAR_SKY =.FALSE. -NRAD_COLNBR = 1000 -NRAD_DIAG = 0 -CLW ='RRTM' -CAER='SURF' -CAOP='CLIM' -CEFRADL='MART' -CEFRADI='LIOU' -COPWSW = 'FOUQ' -COPISW = 'EBCU' -COPWLW = 'SMSH' -COPILW = 'EBCU' -XFUDG = 1. -LAERO_FT=.FALSE. -LFIX_DAT=.FALSE. -! -#ifdef MNH_ECRAD -!* 13bis. SET DEFAULT VALUES FOR MODD_PARAM_ECRAD_n : -! --------------------------------------- -! -#if ( VER_ECRAD == 101 ) -NSWSOLVER = 0 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -NLWSOLVER = 0 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -#endif -#if ( VER_ECRAD == 140 ) -LSPEC_ALB = .FALSE. -LSPEC_EMISS = .FALSE. - - -!ALLOCATE(USER_ALB_DIFF(NSWB_MNH)) -!ALLOCATE(USER_ALB_DIR(NSWB_MNH)) -!ALLOCATE(USER_EMISS(NLWB_MNH)) -!PRINT*,USER_ALB_DIFF -!USER_ALB_DIFF = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -!USER_ALB_DIR = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -!USER_EMISS = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -SURF_TYPE="SNOW" - -NLWSOLVER = 1 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -NSWSOLVER = 1 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -#endif -! LEFF3D = .TRUE. -! LSIDEM = .TRUE. -NREG = 3 ! Number of cloudy regions (3=TripleClouds) -! LLWCSCA = .TRUE. ! LW cloud scattering -! LLWASCA = .TRUE. ! LW aerosols scattering -NLWSCATTERING = 2 -NAERMACC = 0 -! CGAS = 'RRTMG-IFS' ! Gas optics model -NOVLP = 1 ! overlap assumption ; 0= 'Max-Ran' ; 1= 'Exp-Ran'; 2 = 'Exp-Exp' -NLIQOPT = 3 ! 1: 'Monochromatic', 2: 'HuStamnes', 3: 'SOCRATES', 4: 'Slingo' -NICEOPT = 3 ! 1: 'Monochromatic', 2: 'Fu-PSRAD', 3: 'Fu-IFS', 4: 'Baran', 5: 'Baran2016', 6: 'Baran2017' -! LSW_ML_E = .FALSE. -! LLW_ML_E = .FALSE. -! LPSRAD = .FALSE. -! -NRADLP = 1 ! 0: ERA-15, 1: Zhang and Rossow, 2: Martin (1994) et Woods (2000) -NRADIP = 1 ! 0: 40 mum, 1: Liou and Ou (1994), 2: Liou and Ou (1994) improved, 3: Sun and Rikus (1999) -XCLOUD_FRAC_STD = 1.0_JPRB ! change to 0.75 for more realistic distribution -#endif -!------------------------------------------------------------------------------- -! -!* 14. SET DEFAULT VALUES FOR MODD_BLANK_n : -! ----------------------------------- -! -XDUMMY1 = 0. -XDUMMY2 = 0. -XDUMMY3 = 0. -XDUMMY4 = 0. -XDUMMY5 = 0. -XDUMMY6 = 0. -XDUMMY7 = 0. -XDUMMY8 = 0. -! -NDUMMY1 = 0 -NDUMMY2 = 0 -NDUMMY3 = 0 -NDUMMY4 = 0 -NDUMMY5 = 0 -NDUMMY6 = 0 -NDUMMY7 = 0 -NDUMMY8 = 0 -! -LDUMMY1 = .TRUE. -LDUMMY2 = .TRUE. -LDUMMY3 = .TRUE. -LDUMMY4 = .TRUE. -LDUMMY5 = .TRUE. -LDUMMY6 = .TRUE. -LDUMMY7 = .TRUE. -LDUMMY8 = .TRUE. -! -CDUMMY1 = ' ' -CDUMMY2 = ' ' -CDUMMY3 = ' ' -CDUMMY4 = ' ' -CDUMMY5 = ' ' -CDUMMY6 = ' ' -CDUMMY7 = ' ' -CDUMMY8 = ' ' -! -!------------------------------------------------------------------------------ -! -!* 15. SET DEFAULT VALUES FOR MODD_FRC : -! --------------------------------- -! -IF (KMI == 1) THEN - LGEOST_UV_FRC = .FALSE. - LGEOST_TH_FRC = .FALSE. - LTEND_THRV_FRC = .FALSE. - LTEND_UV_FRC = .FALSE. - LVERT_MOTION_FRC = .FALSE. - LRELAX_THRV_FRC = .FALSE. - LRELAX_UV_FRC = .FALSE. - LRELAX_UVMEAN_FRC = .FALSE. - XRELAX_TIME_FRC = 10800. - XRELAX_HEIGHT_FRC = 0. - CRELAX_HEIGHT_TYPE = "FIXE" - LTRANS = .FALSE. - XUTRANS = 0.0 - XVTRANS = 0.0 - LPGROUND_FRC = .FALSE. - LDEEPOC = .FALSE. - XCENTX_OC = 16000. - XCENTY_OC = 16000. - XRADX_OC = 8000. - XRADY_OC = 8000. -END IF -! -!------------------------------------------------------------------------------- -! -! -!* 16. SET DEFAULT VALUES FOR MODD_PARAM_ICE : -! --------------------------------------- -! -IF (KMI == 1) THEN - LRED = .TRUE. - LWARM = .TRUE. - CPRISTINE_ICE = 'PLAT' - LSEDIC = .TRUE. - LCONVHG = .FALSE. - CSEDIM = 'SPLI' - LFEEDBACKT = .TRUE. - LEVLIMIT = .TRUE. - LNULLWETG = .TRUE. - LWETGPOST = .TRUE. - LNULLWETH = .TRUE. - LWETHPOST = .TRUE. - CSNOWRIMING = 'M90 ' - CSUBG_RC_RR_ACCR = 'NONE' - CSUBG_RR_EVAP = 'NONE' - CSUBG_PR_PDF = 'SIGM' - XFRACM90 = 0.1 - LCRFLIMIT = .TRUE. - NMAXITER = 5 - XMRSTEP = 0.00005 - XTSTEP_TS = 0. - LADJ_BEFORE = .TRUE. - LADJ_AFTER = .TRUE. - CFRAC_ICE_ADJUST = 'S' - XSPLIT_MAXCFL = 0.8 - CFRAC_ICE_SHALLOW_MF = 'S' - LSEDIM_AFTER = .FALSE. - LDEPOSC = .FALSE. - XVDEPOSC= 0.02 ! 2 cm/s - LSNOW_T=.FALSE. - LPACK_INTERP=.TRUE. - LPACK_MICRO=.TRUE. ! Meso-NH does not work with LPACK_MICRO=.FALSE. -END IF -! -!------------------------------------------------------------------------------- -! -! -!* 17. SET DEFAULT VALUES FOR MODD_PARAM_KAFR_n : -! -------------------------------------------- -! -XDTCONV = MAX( 300.0,XTSTEP ) -NICE = 1 -LREFRESH_ALL = .TRUE. -LCHTRANS = .FALSE. -LDOWN = .TRUE. -LSETTADJ = .FALSE. -XTADJD = 3600. -XTADJS = 10800. -LDIAGCONV = .FALSE. -NENSM = 0 -! -!------------------------------------------------------------------------------- -! -! -!* 18. SET DEFAULT VALUES FOR MODD_PARAM_MFSHALL_n : -! -------------------------------------------- -! -XIMPL_MF = 1. -CMF_UPDRAFT = 'EDKF' -CMF_CLOUD = 'DIRE' -LMIXUV = .TRUE. -LMF_FLX = .FALSE. -! -XALP_PERT = 0.3 -XABUO = 1. -XBENTR = 1. -XBDETR = 0. -XCMF = 0.065 -XENTR_MF = 0.035 -XCRAD_MF = 50. -XENTR_DRY = 0.55 -XDETR_DRY = 10. -XDETR_LUP = 1. -XKCF_MF = 2.75 -XKRC_MF = 1. -XTAUSIGMF = 600. -XPRES_UV = 0.5 -XFRAC_UP_MAX= 0.33 -XALPHA_MF = 2. -XSIGMA_MF = 20. -! -XA1 = 2./3. -XB = 0.002 -XC = 0.012 -XBETA1 = 0.9 -XR = 2. -XLAMBDA_MF= 0. -LGZ = .FALSE. -XGZ = 1.83 ! between 1.83 and 1.33 -! -!------------------------------------------------------------------------------- -! -!* 19. SET DEFAULT VALUES FOR MODD_PARAM_C2R2 : -! ---------------------------------------- -! -IF (KMI == 1) THEN - XNUC = 1.0 - XALPHAC = 3.0 - XNUR = 2.0 - XALPHAR = 1.0 -! - LRAIN = .TRUE. - LSEDC = .TRUE. - LACTIT = .FALSE. - LSUPSAT = .FALSE. - LDEPOC = .FALSE. - XVDEPOC = 0.02 ! 2 cm/s - LACTTKE = .TRUE. -! - HPARAM_CCN = 'XXX' - HINI_CCN = 'XXX' - HTYPE_CCN = 'X' -! - XCHEN = 0.0 - XKHEN = 0.0 - XMUHEN = 0.0 - XBETAHEN = 0.0 -! - XCONC_CCN = 0.0 - XAERDIFF = 0.0 - XAERHEIGHT = 2000 - XR_MEAN_CCN = 0.0 - XLOGSIG_CCN = 0.0 - XFSOLUB_CCN = 1.0 - XACTEMP_CCN = 280. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 19.BIS SET DEFAULT VALUES FOR MODD_PARAM_LIMA : -! ---------------------------------------- -! -IF (KMI == 1) THEN - LPTSPLIT = .TRUE. - L_LFEEDBACKT = .TRUE. - L_NMAXITER = 1 - L_XMRSTEP = 0. - L_XTSTEP_TS = 0. -! - YNUC = 1.0 - YALPHAC = 3.0 - YNUR = 2.0 - YALPHAR = 1.0 -! - LACTI = .TRUE. - OSEDC = .TRUE. - OACTIT = .FALSE. - LADJ = .TRUE. - LSPRO = .FALSE. - LKHKO = .FALSE. - ODEPOC = .TRUE. - LBOUND = .FALSE. - OACTTKE = .TRUE. - LKESSLERAC = .FALSE. -! - NMOM_C = 2 - NMOM_R = 2 -! - OVDEPOC = 0.02 ! 2 cm/s -! - CINI_CCN = 'AER' - CTYPE_CCN(:) = 'M' -! - YAERDIFF = 0.0 - YAERHEIGHT = 2000. -! YR_MEAN_CCN = 0.0 ! In case of 'CCN' initialization -! YLOGSIG_CCN = 0.0 - YFSOLUB_CCN = 1.0 - YACTEMP_CCN = 280. -! - NMOD_CCN = 1 -! -!* AP Scavenging -! - LSCAV = .FALSE. - LAERO_MASS = .FALSE. -! - LCCN_HOM = .TRUE. - CCCN_MODES = 'COPT' - XCCN_CONC(:)=300. -! - LHHONI = .FALSE. - LNUCL = .TRUE. - LSEDI = .TRUE. - YSNOW_T = .FALSE. - LMURAKAMI = .TRUE. - CPRISTINE_ICE_LIMA = 'PLAT' - CHEVRIMED_ICE_LIMA = 'GRAU' - XFACTNUC_DEP = 1.0 - XFACTNUC_CON = 1.0 - NMOM_I = 2 - NMOM_S = 1 - NMOM_G = 1 - NMOM_H = 1 - NMOD_IFN = 1 - NIND_SPECIE = 1 - LMEYERS = .FALSE. - LIFN_HOM = .TRUE. - CIFN_SPECIES = 'PHILLIPS' - CINT_MIXING = 'DM2' - XIFN_CONC(:) = 100. - NMOD_IMM = 0 - NPHILLIPS=8 - LCIBU = .FALSE. - XNDEBRIS_CIBU = 50.0 - LRDSF = .FALSE. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 20. SET DEFAULT VALUES FOR MODD_CH_MNHC_n -! ------------------------------------- -! -LUSECHEM = .FALSE. -LUSECHAQ = .FALSE. -LUSECHIC = .FALSE. -LCH_INIT_FIELD = .FALSE. -LCH_CONV_SCAV = .FALSE. -LCH_CONV_LINOX = .FALSE. -LCH_PH = .FALSE. -LCH_RET_ICE = .FALSE. -XCH_PHINIT = 5.2 -XRTMIN_AQ = 5.e-8 -CCHEM_INPUT_FILE = 'EXSEG1.nam' -CCH_TDISCRETIZATION = 'SPLIT' -NCH_SUBSTEPS = 1 -LCH_TUV_ONLINE = .FALSE. -CCH_TUV_LOOKUP = 'PHOTO.TUV39' -CCH_TUV_CLOUDS = 'NONE' -XCH_TUV_ALBNEW = -1. -XCH_TUV_DOBNEW = -1. -XCH_TUV_TUPDATE = 600. -CCH_VEC_METHOD = 'MAX' -NCH_VEC_LENGTH = 50 -XCH_TS1D_TSTEP = 600. -CCH_TS1D_COMMENT = 'no comment' -CCH_TS1D_FILENAME = 'IO1D' -CSPEC_PRODLOSS = '' -CSPEC_BUDGET = '' -! -!------------------------------------------------------------------------------- -! -!* 21. SET DEFAULT VALUES FOR MODD_SERIES AND MODD_SERIE_n -! --------------------------------------------------- -! -IF (KMI == 1) THEN - LSERIES = .FALSE. - LMASKLANDSEA = .FALSE. - LWMINMAX = .FALSE. - LSURF = .FALSE. -ENDIF -! -NIBOXL = 1 !+ JPHEXT -NIBOXH = 1 !+ 2*JPHEXT -NJBOXL = 1 !+ JPHEXT -NJBOXH = 1 !+ 2*JPHEXT -NKCLS = 1 !+ JPVEXT -NKLOW = 1 !+ JPVEXT -NKMID = 1 !+ JPVEXT -NKUP = 1 !+ JPVEXT -NKCLA = 1 !+ JPVEXT -NBJSLICE = 1 -NJSLICEL(:) = 1 !+ JPHEXT -NJSLICEH(:) = 1 !+ 2*JPHEXT -NFREQSERIES = INT(XSEGLEN /(100.*XTSTEP) ) -NFREQSERIES = MAX(NFREQSERIES,1) -! -!------------------------------------------------------------------------------- -! -!* 22. SET DEFAULT VALUES FOR MODD_TURB_CLOUD -! -------------------------------------- -! -IF (KMI == 1) THEN - NMODEL_CLOUD = NUNDEF - CTURBLEN_CLOUD = 'DELT' - XCOEF_AMPL_SAT = 5. - XCEI_MIN = 0.001E-06 - XCEI_MAX = 0.01E-06 -ENDIF -!------------------------------------------------------------------------------- -! -!* 22. SET DEFAULT VALUES FOR MODD_MEAN_FIELD -! -------------------------------------- -! -IF (KMI == 1) THEN - LMEAN_FIELD = .FALSE. - LCOV_FIELD = .FALSE. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 22. SET DEFAULT VALUES FOR MODD_AEROSOL -! ----------------------------------- -IF (KMI == 1) THEN ! other values are defined in modd_ch_aerosol -! -! aerosol lognormal parameterization - -LVARSIGI = .FALSE. ! switch to active pronostic dispersion for I mode -LVARSIGJ = .FALSE. ! switch to active pronostic dispersion for J mode -LHETEROSO4 = .FALSE. ! switch to active sulfates heteronegeous - ! production -LSEDIMAERO = .FALSE. ! switch to active aerosol sedimentation -LAERINIT = .FALSE. ! switch to initialize aerosol in arome -CMINERAL = "NONE" ! mineral equilibrium scheme -CORGANIC = "NONE" ! mineral equilibrium scheme -CNUCLEATION = "NONE" ! sulfates nucleation scheme -LDEPOS_AER(:) = .FALSE. - -ENDIF - -!* 23. SET DEFAULT VALUES FOR MODD_DUST and MODD_SALT -! ---------------------------------------------- -! -IF (KMI == 1) THEN ! other values initialized in modd_dust - LDUST = .FALSE. - NMODE_DST = 3 - LVARSIG = .FALSE. - LSEDIMDUST = .FALSE. - LDEPOS_DST(:) = .FALSE. - - LSALT = .FALSE. - LVARSIG_SLT= .FALSE. - LSEDIMSALT = .FALSE. - LDEPOS_SLT(:) = .FALSE. -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 24. SET DEFAULT VALUES FOR MODD_PASPOL -! ---------------------------------- -! -! other values initialized in modd_paspol -! -IF (KMI == 1) THEN - LPASPOL = .FALSE. - NRELEASE = 0 - CPPINIT(:) ='1PT' - XPPLAT(:) = 0. - XPPLON (:) = 0. - XPPMASS(:) = 0. - XPPBOT(:) = 0. - XPPTOP(:) = 0. - CPPT1(:) = "20010921090000" - CPPT2(:) = "20010921090000" - CPPT3(:) = "20010921091500" - CPPT4(:) = "20010921091500" -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 25. SET DEFAULT VALUES FOR MODD_CONDSAMP -! ---------------------------------- -! -! other values initialized in modd_condsamp -! -IF (KMI == 1) THEN - LCONDSAMP = .FALSE. - NCONDSAMP = 3 - XRADIO(:) = 900. - XSCAL(:) = 1. - XHEIGHT_BASE = 100. - XDEPTH_BASE = 100. - XHEIGHT_TOP = 100. - XDEPTH_TOP = 100. - NFINDTOP = 0 - XTHVP = 0.25 - LTPLUS = .TRUE. -ENDIF -!------------------------------------------------------------------------------- -! -! -!* 26. SET DEFAULT VALUES FOR MODD_LATZ_EDFLX -! ---------------------------------- -! -IF (KMI == 1) THEN - LUV_FLX=.FALSE. - XUV_FLX1=3.E+14 - XUV_FLX2=0. - LTH_FLX=.FALSE. - XTH_FLX=0.75 -ENDIF -#ifdef MNH_FOREFIRE -!------------------------------------------------------------------------------- -! -!* 27. SET DEFAULT VALUES FOR MODD_FOREFIRE -! ---------------------------------- -! -! other values initialized in modd_forefire -! -IF (KMI == 1) THEN - LFOREFIRE = .FALSE. - LFFCHEM = .FALSE. - COUPLINGRES = 100. - NFFSCALARS = 0 -ENDIF -#endif -!------------------------------------------------------------------------------- -! -!* 28. SET DEFAULT VALUES FOR MODD_BLOWSNOW AND MODD_BLOWSNOW_n -! ---------------------------------------- -! -IF (KMI == 1) THEN - LBLOWSNOW = .FALSE. - XALPHA_SNOW = 3. - XRSNOW = 4. - CSNOWSEDIM = 'TABC' -END IF -LSNOWSUBL = .FALSE. -! -! -!------------------------------------------------------------------------------- -! -!* 29. SET DEFAULT VALUES FOR MODD_VISC -! ---------------------------------- -! -! other values initialized in modd_VISC -! -IF (KMI == 1) THEN - LVISC = .FALSE. - LVISC_UVW = .FALSE. - LVISC_TH = .FALSE. - LVISC_SV = .FALSE. - LVISC_R = .FALSE. - XMU_V = 0. - XPRANDTL = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 30. SET DEFAULT VALUES FOR MODD_DRAG -! ---------------------------------- -! -! other values initialized in modd_DRAG -! -IF (KMI == 1) THEN - LDRAG = .FALSE. - LMOUNT = .FALSE. - NSTART = 1 - XHSTART = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 31. SET DEFAULT VALUES FOR MODD_IBM_PARAMn -! -------------------------------------- -! - LIBM = .FALSE. - LIBM_TROUBLE = .FALSE. - CIBM_ADV = 'NOTHIN' - XIBM_EPSI = 1.E-9 - XIBM_IEPS = 1.E+9 - NIBM_ITR = 8 - XIBM_RUG = 0.01 ! (m^1.s^-0) - XIBM_VISC = 1.56e-5 ! (m^2.s^-1) - XIBM_CNU = 0.06 ! (m^0.s^-0) - - NIBM_LAYER_P = 2 - NIBM_LAYER_Q = 2 - NIBM_LAYER_R = 2 - NIBM_LAYER_S = 2 - NIBM_LAYER_T = 2 - NIBM_LAYER_E = 2 - NIBM_LAYER_V = 2 - - XIBM_RADIUS_P = 2. - XIBM_RADIUS_Q = 2. - XIBM_RADIUS_R = 2. - XIBM_RADIUS_S = 2. - XIBM_RADIUS_T = 2. - XIBM_RADIUS_E = 2. - XIBM_RADIUS_V = 2. - - XIBM_POWERS_P = 1. - XIBM_POWERS_Q = 1. - XIBM_POWERS_R = 1. - XIBM_POWERS_S = 1. - XIBM_POWERS_T = 1. - XIBM_POWERS_E = 1. - XIBM_POWERS_V = 1. - - CIBM_MODE_INTE3_P = 'LAI' - CIBM_MODE_INTE3_Q = 'LAI' - CIBM_MODE_INTE3_R = 'LAI' - CIBM_MODE_INTE3_S = 'LAI' - CIBM_MODE_INTE3_T = 'LAI' - CIBM_MODE_INTE3_E = 'LAI' - CIBM_MODE_INTE3_V = 'LAI' - - CIBM_MODE_INTE1_P = 'CL2' - CIBM_MODE_INTE1_Q = 'CL2' - CIBM_MODE_INTE1_R = 'CL2' - CIBM_MODE_INTE1_S = 'CL2' - CIBM_MODE_INTE1_T = 'CL2' - CIBM_MODE_INTE1_E = 'CL2' - CIBM_MODE_INTE1NV = 'CL2' - CIBM_MODE_INTE1TV = 'CL2' - CIBM_MODE_INTE1CV = 'CL2' - - CIBM_MODE_BOUND_P = 'SYM' - CIBM_MODE_BOUND_Q = 'SYM' - CIBM_MODE_BOUND_R = 'SYM' - CIBM_MODE_BOUND_S = 'SYM' - CIBM_MODE_BOUND_T = 'SYM' - CIBM_MODE_BOUND_E = 'SYM' - CIBM_MODE_BOUNT_V = 'ASY' - CIBM_MODE_BOUNN_V = 'ASY' - CIBM_MODE_BOUNC_V = 'ASY' - - XIBM_FORC_BOUND_P = 0. - XIBM_FORC_BOUND_Q = 0. - XIBM_FORC_BOUND_R = 0. - XIBM_FORC_BOUND_S = 0. - XIBM_FORC_BOUND_T = 0. - XIBM_FORC_BOUND_E = 0. - XIBM_FORC_BOUNN_V = 0. - XIBM_FORC_BOUNT_V = 0. - XIBM_FORC_BOUNC_V = 0. - - CIBM_TYPE_BOUND_P = 'NEU' - CIBM_TYPE_BOUND_Q = 'NEU' - CIBM_TYPE_BOUND_R = 'NEU' - CIBM_TYPE_BOUND_S = 'NEU' - CIBM_TYPE_BOUND_T = 'NEU' - CIBM_TYPE_BOUND_E = 'NEU' - CIBM_TYPE_BOUNT_V = 'DIR' - CIBM_TYPE_BOUNN_V = 'DIR' - CIBM_TYPE_BOUNC_V = 'DIR' - - CIBM_FORC_BOUND_P = 'CST' - CIBM_FORC_BOUND_Q = 'CST' - CIBM_FORC_BOUND_R = 'CST' - CIBM_FORC_BOUND_S = 'CST' - CIBM_FORC_BOUND_T = 'CST' - CIBM_FORC_BOUND_E = 'CST' - CIBM_FORC_BOUNN_V = 'CST' - CIBM_FORC_BOUNT_V = 'CST' - CIBM_FORC_BOUNC_V = 'CST' - CIBM_FORC_BOUNR_V = 'CST' - -! -!------------------------------------------------------------------------------- -! -!* 32. SET DEFAULT VALUES FOR MODD_RECYCL_PARAMn -! -------------------------------------- -! - LRECYCL = .FALSE. - LRECYCLN = .FALSE. - LRECYCLW = .FALSE. - LRECYCLE = .FALSE. - LRECYCLS = .FALSE. - XDRECYCLN = 0. - XARECYCLN = 0. - XDRECYCLW = 0. - XARECYCLW = 0. - XDRECYCLS = 0. - XARECYCLS = 0. - XDRECYCLE = 0. - XARECYCLE = 0. - NTMOY = 0 - NTMOYCOUNT = 0 - NNUMBELT = 28 - XRCOEFF = 0.2 - XTBVTOP = 500. - XTBVBOT = 300. -! -!------------------------------------------------------------------------------- -! -!* 33. SET DEFAULT VALUES FOR MODD_FIRE_n -! ---------------------------------- -! -! Blaze fire model namelist -! -LBLAZE = .FALSE. ! Flag for Fire model use, default FALSE -! -CPROPAG_MODEL = 'SANTONI2011' ! Fire propagation model (default SANTONI2011) -! -CHEAT_FLUX_MODEL = 'EXS' ! Sensible heat flux injection model (default EXS) -CLATENT_FLUX_MODEL = 'EXP' ! latent heat flux injection model (default EXP) -XFERR = 0.8 ! Energy released in flamming stage (only for EXP) -! -CFIRE_CPL_MODE = '2WAYCPL' ! Coupling mode (default 2way coupled) -CBMAPFILE = CINIFILE ! File name of BMAP for FIR2ATM mode -LINTERPWIND = .TRUE. ! Horizontal interpolation of wind -LSGBAWEIGHT = .FALSE. ! Flag for use of weighted average method for SubGrid Burning Area computation -! -NFIRE_WENO_ORDER = 3 ! Weno order (1,3,5) -NFIRE_RK_ORDER = 3 ! Runge Kutta order (1,2,3,4) -! -NREFINX = 1 ! Refinement ratio X -NREFINY = 1 ! Refinement ratio Y -! -XCFLMAXFIRE = 0.8 ! Max CFL on fire mesh -XLSDIFFUSION = 0.1 ! Numerical diffusion of LevelSet -XROSDIFFUSION = 0.05 ! Numerical diffusion of ROS -! -XFLUXZEXT = 3. ! Flux distribution on vertical caracteristic length -XFLUXZMAX = 4. * XFLUXZEXT ! Flux distribution on vertical max injetion height -! -XFLXCOEFTMP = 1. ! Flux multiplicator. For testing -! -LWINDFILTER = .FALSE. ! Fire wind filtering flag -CWINDFILTER = 'EWAM' ! Wind filter method (EWAM or WLIM) -XEWAMTAU = 20. ! Time averaging constant for EWAM method (s) -XWLIMUTH = 8. ! Thresehold wind value for WLIM method (m/s) -XWLIMUTMAX = 9. ! Maximum wind value for WLIM method (m/s) (needs to be >= XWLIMUTH ) -! -NNBSMOKETRACER = 1 ! Nb of smoke tracers -! -NWINDSLOPECPLMODE = 0 ! Flag for use of wind/slope in ROS (0 = wind + slope, 1 = wind only, 2 = slope only (U0=0)) -! -! -! -!! DO NOT CHANGE BELOW PARAMETERS -XFIREMESHSIZE(:) = 0. ! Fire mesh size (dxf,dyf) -LRESTA_ASE = .FALSE. ! Flag for using ASE in RESTA file -LRESTA_AWC = .FALSE. ! Flag for using AWC in RESTA file -LRESTA_EWAM = .FALSE. ! Flag for using EWAM in RESTA file -LRESTA_WLIM = .FALSE. ! Flag for using WLIM in RESTA file - -!------------------------------------------------------------------------------- -END SUBROUTINE DEFAULT_DESFM_n diff --git a/src/mesonh/ext/drag_veg.f90 b/src/mesonh/ext/drag_veg.f90 deleted file mode 100644 index de7fba893..000000000 --- a/src/mesonh/ext/drag_veg.f90 +++ /dev/null @@ -1,362 +0,0 @@ -!MNH_LIC Copyright 2009-2021 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_DRAG_VEG -! ####################### -! -INTERFACE - -SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PRRS,PSVS) -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -! -END SUBROUTINE DRAG_VEG - -END INTERFACE - -END MODULE MODI_DRAG_VEG -! -! ################################################################### -SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PRRS,PSVS) -! ################################################################### -! -!!**** *DRAG_VEG_n * - -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! P. Aumond -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/2009 -!! C.Lac 07/2011 : Add budgets -!! S. Donier 06/2015 : bug surface aerosols -!! C.Lac 07/2016 : Add droplet deposition -!! C.Lac 10/2017 : Correction on deposition -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! P. Wautelet 28/01/2020: use the new data structures and subroutines for budgets for U -! C. Lac 02/2020: correction missing condition for budget on RC and SV -! P. Wautelet 04/02/2021: budgets: bugfixes for LDRAGTREE if LIMA + small optimisations and verifications -! R. Schoetter 04/2022: bug add update halo for vegetation drag variables -!!--------------------------------------------------------------- -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ARGSLIST_ll, ONLY: LIST_ll -use modd_budget, only: lbudget_u, lbudget_v, lbudget_rc, lbudget_sv, lbudget_tke, & - NBUDGET_U, NBUDGET_V, NBUDGET_RC, NBUDGET_SV1, NBUDGET_TKE, & - tbudgets -USE MODD_CONF -USE MODD_CST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_GROUND_PAR -USE MODD_NSV -USE MODD_PARAM_C2R2 -USE MODD_PARAM_LIMA, ONLY: NMOM_C -USE MODD_PARAM_n, only: CSURF, CTURB -USE MODD_PGDFIELDS -USE MODD_VEG_n - -use mode_budget, only: Budget_store_init, Budget_store_end -use mode_msg -USE MODE_ll - -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_SHUMAN - -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction -INTEGER :: JI, JJ, JK ! loop index -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -! -! -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZWORK1, ZWORK2, ZWORK3, ZUT_SCAL, ZVT_SCAL, & - ZUS, ZVS, ZTKES, ZTKET -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZCDRAG, ZDENSITY -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & - ZH,ZLAI ! LAI, Vegetation height -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH -LOGICAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) & - :: GDEP -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZWDEPR,ZWDEPS - -IF ( CSURF /= 'EXTE' ) CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DRAG_VEG', 'CSURF/=EXTE not allowed' ) - -!Condition necessary because PTKET is used (and must be allocated) -IF ( CTURB /= 'TKEL' ) CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DRAG_VEG', 'CTURB/=TKEL not allowed' ) -! -if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'DRAG', prus (:, :, :) ) -if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'DRAG', prvs (:, :, :) ) -if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'DRAG', prtkes(:, :, :) ) - -if ( odepotree ) then - if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPOTR', prrs(:, :, :, 2) ) - if ( lbudget_sv .and. ( hcloud=='C2R2' .or. hcloud=='KHKO' ) ) & - call Budget_store_init( tbudgets(NBUDGET_SV1-1+(NSV_C2R2BEG+1)), 'DEPOTR', psvs(:, :, :, NSV_C2R2BEG+1) ) - if ( lbudget_sv .and. hcloud=='LIMA' ) & - call Budget_store_init( tbudgets(NBUDGET_SV1-1+NSV_LIMA_NC), 'DEPOTR', psvs(:, :, :, NSV_LIMA_NC) ) -end if - -IIU = SIZE(PUT,1) -IJU = SIZE(PUT,2) -IKU = SIZE(PUT,3) -! -ZUS (:,:,:) = 0.0 -ZVS (:,:,:) = 0.0 -ZTKES (:,:,:) = 0.0 -! -ZH (:,:) = XUNDEF -ZLAI(:,:) = XUNDEF -! -ZCDRAG (:,:,:) = 0. -ZDENSITY (:,:,:) = 0. -! -CALL MNHGET_SURF_PARAM_n( PH_TREE = ZH, PLAI_TREE = ZLAI ) -! -WHERE ( ZH (:,:) > (XUNDEF-1.) ) ZH (:,:) = 0.0 -WHERE ( ZLAI (:,:) > (XUNDEF-1.) ) ZLAI (:,:) = 0.0 -! -!------------------------------------------------------------------------------- -! -! -!* 1. COMPUTES THE TRUE VELOCITY COMPONENTS -! ------------------------------------- -! -ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) -ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) -ZTKET(:,:,:) = PTKET(:,:,:) -! -! Update halo -! -NULLIFY(TZFIELDS_ll) -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZUT_SCAL, 'DRAG_VEG::ZUT_SCAL') -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZVT_SCAL, 'DRAG_VEG::ZVT_SCAL') -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZTKET , 'DRAG_VEG::ZTKET' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -!------------------------------------------------------------------------------- -! -!* 1. Computations of wind tendency due to canopy drag -! ------------------------------------------------ -! -! -! -! Ext = - Cdrag * u- * u- * Sv tree canopy drag -! - u'w'(ground) * Sh horizontal surfaces (ground) -! -!* 1.1 Drag coefficient by vegetation (Patton et al 2001) -! ------------------------------ -! -GDEP(:,:,:) = .FALSE. -! -DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - ! - ! Set density and drag coefficient for vegetation - ! - IF (ZH(JI,JJ) /= 0) THEN - ! - DO JK=2,(IKU-1) - ! - IF ( (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) .LT. ZH(JI,JJ) ) THEN - ! - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO')) THEN - IF ((PRRS(JI,JJ,JK,2) >0.) .AND. (PSVS(JI,JJ,JK,NSV_C2R2BEG+1) >0.)) & - GDEP(JI,JJ,JK) = .TRUE. - ELSE IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'REVE') THEN - IF (PRRS(JI,JJ,JK,2) >0.) GDEP(JI,JJ,JK) = .TRUE. - ENDIF - ! - ZCDRAG(JI,JJ,JK) = 0.2 !0.075 - ZDENSITY(JI,JJ,JK) = MAX((4 * (ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (ZH(JI,JJ)-(PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)))/& - ZH(JI,JJ)**3)-& - (0.30*((ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) /& - (ZH(JI,JJ)**3))-ZLAI(JI,JJ))))/& - ZH(JI,JJ), 0.) - ! - ENDIF - ! - ENDDO - ENDIF - ! - ENDDO -ENDDO -! -! To exclude the first vertical level already dealt in rain_ice or rain_c2r2_khko -GDEP(:,:,2) = .FALSE. -! -! Update halo -! -NULLIFY(TZFIELDS_ll) -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZCDRAG , 'DRAG_VEG::ZCDRAG') -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZDENSITY, 'DRAG_VEG::ZDENSITY') -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -! -!* 1.2 Drag force by wall surfaces -! --------------------------- -! -!* drag force by vertical surfaces -! -ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & - * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) -! -ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & - * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) -! -PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP -! -PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP -! -IF (ODEPOTREE) THEN - IF ( HCLOUD == 'NONE' ) CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DRAG_VEG', 'LDEPOTREE=T not allowed if CCLOUD=NONE' ) - IF ( HCLOUD == 'LIMA' .AND. NMOM_C.EQ.0 ) & - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DRAG_VEG', 'LDEPOTREE=T not allowed if CCLOUD=LIMA and NMOM_C=0' ) - - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - ZWDEPR(:,:,:)= 0. - ZWDEPS(:,:,:)= 0. - WHERE (GDEP) - ZWDEPR(:,:,:)= PVDEPOTREE * PRT(:,:,:,2) * PRHODJ(:,:,:) - END WHERE - IF ( HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' ) THEN - WHERE (GDEP) - ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_C2R2BEG+1) * PRHODJ(:,:,:) - END WHERE - ELSE IF ( HCLOUD == 'LIMA' ) THEN - WHERE (GDEP) - ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_LIMA_NC) * PRHODJ(:,:,:) - END WHERE - END IF - DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - DO JK=2,(IKU-2) - IF (GDEP(JI,JJ,JK)) THEN - PRRS(JI,JJ,JK,2) = PRRS(JI,JJ,JK,2) + (ZWDEPR(JI,JJ,JK+1)-ZWDEPR(JI,JJ,JK))/ & - (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - IF ( HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' ) THEN - PSVS(JI,JJ,JK,NSV_C2R2BEG+1) = PSVS(JI,JJ,JK,NSV_C2R2BEG+1) + & - (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - ELSE IF ( HCLOUD == 'LIMA' ) THEN - PSVS(JI,JJ,JK,NSV_LIMA_NC) = PSVS(JI,JJ,JK,NSV_LIMA_NC) + & - (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - END IF - END IF - END DO - END DO - END DO -! -! -END IF -! -!* 3. Computations of TKE tendency due to canopy drag -! ------------------------------------------------ - -!* 3.1 Creation of TKE by wake -! ----------------------- -! -! from Kanda and Hino (1994) -! -! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees -! Ext = - Cd * e * u * Sv trees Destruction of TKE due to -! small-scale motions forced by leaves from Kanda and Hino (1994) -! -! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz -! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz -! -ZTKES(:,:,:)= ( ZTKET(:,:,:) + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & - * (SQRT( ZUT_SCAL(:,:,:)**2 + ZVT_SCAL(:,:,:)**2 ))**3 ) / & - ( 1. + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2)) -! -PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP - -if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U ), 'DRAG', prus (:, :, :) ) -if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V ), 'DRAG', prvs (:, :, :) ) -if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'DRAG', prtkes(:, :, :) ) - -if ( odepotree ) then - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPOTR', prrs(:, :, :, 2) ) - if ( lbudget_sv .and. ( hcloud=='C2R2' .or. hcloud=='KHKO' ) ) & - call Budget_store_end( tbudgets(NBUDGET_SV1-1+(NSV_C2R2BEG+1)), 'DEPOTR', psvs(:, :, :, NSV_C2R2BEG+1) ) - if ( lbudget_sv .and. hcloud=='LIMA' ) & - call Budget_store_end( tbudgets(NBUDGET_SV1-1+NSV_LIMA_NC), 'DEPOTR', psvs(:, :, :, NSV_LIMA_NC) ) -end if - -END SUBROUTINE DRAG_VEG diff --git a/src/mesonh/ext/ini_budget.f90 b/src/mesonh/ext/ini_budget.f90 deleted file mode 100644 index ebcaec1c7..000000000 --- a/src/mesonh/ext/ini_budget.f90 +++ /dev/null @@ -1,4886 +0,0 @@ -!MNH_LIC Copyright 1995-2023 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. -!----------------------------------------------------------------- -! Modifications: -! P. Wautelet 17/08/2020: add Budget_preallocate subroutine -!----------------------------------------------------------------- -module mode_ini_budget - - use mode_msg - - implicit none - - private - - public :: Budget_preallocate, Ini_budget - - integer, parameter :: NSOURCESMAX = 60 !Maximum number of sources in a budget - -contains - -subroutine Budget_preallocate() - -use modd_budget, only: nbudgets, tbudgets, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE, & - NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, & - NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1 -use modd_nsv, only: nsv, tsvlist - -integer :: ibudget -integer :: jsv - -call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_preallocate', 'called' ) - -if ( allocated( tbudgets ) ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Budget_preallocate', 'tbudgets already allocated' ) - return -end if - -nbudgets = NBUDGET_SV1 - 1 + nsv -allocate( tbudgets( nbudgets ) ) - -tbudgets(NBUDGET_U)%cname = "UU" -tbudgets(NBUDGET_U)%ccomment = "Budget for U" -tbudgets(NBUDGET_U)%nid = NBUDGET_U - -tbudgets(NBUDGET_V)%cname = "VV" -tbudgets(NBUDGET_V)%ccomment = "Budget for V" -tbudgets(NBUDGET_V)%nid = NBUDGET_V - -tbudgets(NBUDGET_W)%cname = "WW" -tbudgets(NBUDGET_W)%ccomment = "Budget for W" -tbudgets(NBUDGET_W)%nid = NBUDGET_W - -tbudgets(NBUDGET_TH)%cname = "TH" -tbudgets(NBUDGET_TH)%ccomment = "Budget for potential temperature" -tbudgets(NBUDGET_TH)%nid = NBUDGET_TH - -tbudgets(NBUDGET_TKE)%cname = "TK" -tbudgets(NBUDGET_TKE)%ccomment = "Budget for turbulent kinetic energy" -tbudgets(NBUDGET_TKE)%nid = NBUDGET_TKE - -tbudgets(NBUDGET_RV)%cname = "RV" -tbudgets(NBUDGET_RV)%ccomment = "Budget for water vapor mixing ratio" -tbudgets(NBUDGET_RV)%nid = NBUDGET_RV - -tbudgets(NBUDGET_RC)%cname = "RC" -tbudgets(NBUDGET_RC)%ccomment = "Budget for cloud water mixing ratio" -tbudgets(NBUDGET_RC)%nid = NBUDGET_RC - -tbudgets(NBUDGET_RR)%cname = "RR" -tbudgets(NBUDGET_RR)%ccomment = "Budget for rain water mixing ratio" -tbudgets(NBUDGET_RR)%nid = NBUDGET_RR - -tbudgets(NBUDGET_RI)%cname = "RI" -tbudgets(NBUDGET_RI)%ccomment = "Budget for cloud ice mixing ratio" -tbudgets(NBUDGET_RI)%nid = NBUDGET_RI - -tbudgets(NBUDGET_RS)%cname = "RS" -tbudgets(NBUDGET_RS)%ccomment = "Budget for snow/aggregate mixing ratio" -tbudgets(NBUDGET_RS)%nid = NBUDGET_RS - -tbudgets(NBUDGET_RG)%cname = "RG" -tbudgets(NBUDGET_RG)%ccomment = "Budget for graupel mixing ratio" -tbudgets(NBUDGET_RG)%nid = NBUDGET_RG - -tbudgets(NBUDGET_RH)%cname = "RH" -tbudgets(NBUDGET_RH)%ccomment = "Budget for hail mixing ratio" -tbudgets(NBUDGET_RH)%nid = NBUDGET_RH - -do jsv = 1, nsv - ibudget = NBUDGET_SV1 - 1 + jsv - tbudgets(ibudget)%cname = Trim( tsvlist(jsv)%cmnhname ) - tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( tsvlist(jsv)%cmnhname ) - tbudgets(ibudget)%nid = ibudget -end do - - -end subroutine Budget_preallocate - - -! ################################################################# - SUBROUTINE Ini_budget(KLUOUT,PTSTEP,KSV,KRR, & - ONUMDIFU,ONUMDIFTH,ONUMDIFSV, & - OHORELAX_UVWTH,OHORELAX_RV,OHORELAX_RC,OHORELAX_RR, & - OHORELAX_RI,OHORELAX_RS, OHORELAX_RG, OHORELAX_RH,OHORELAX_TKE, & - OHORELAX_SV, OVE_RELAX, ove_relax_grd, OCHTRANS, & - ONUDGING,ODRAGTREE,ODEPOTREE, OAERO_EOL, & - HRAD,HDCONV,HSCONV,HTURB,HTURBDIM,HCLOUD ) -! ################################################################# -! -!!**** *INI_BUDGET* - routine to initialize the parameters for the budgets -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to set or compute the parameters used -! by the MESONH budgets. Names of files for budget recording are processed -! and storage arrays are initialized. -! -!!** METHOD -!! ------ -!! The essential of information is passed by modules. The choice of budgets -!! and processes set by the user as integers is converted in "actions" -!! readable by the subroutine BUDGET under the form of string characters. -!! For each complete process composed of several elementary processes, names -!! of elementary processes are concatenated in order to have an explicit name -!! in the comment of the recording file for budget. -!! -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Modules MODD_* -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_BUDGET) -!! -!! -!! AUTHOR -!! ------ -!! P. Hereil * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/03/95 -!! J. Stein 25/06/95 put the sources in phase with the code -!! J. Stein 20/07/95 reset to FALSE of all the switches when -!! CBUTYPE /= MASK or CART -!! J. Stein 26/06/96 add the new sources + add the increment between -!! 2 active processes -!! J.-P. Pinty 13/12/96 Allowance of multiple SVs -!! J.-P. Pinty 11/01/97 Includes deep convection ice and forcing processes -!! J.-P. Lafore 10/02/98 Allocation of the RHODJs for budget -!! V. Ducrocq 04/06/99 // -!! N. Asencio 18/06/99 // MASK case : delete KIMAX and KJMAX arguments, -!! GET_DIM_EXT_ll initializes the dimensions of the -!! extended local domain. -!! LBU_MASK and NBUSURF are allocated on the extended -!! local domain. -!! add 3 local variables IBUDIM1,IBUDIM2,IBUDIM3 -!! to define the dimensions of the budget arrays -!! in the different cases CART and MASK -!! J.-P. Pinty 23/09/00 add budget for C2R2 -!! V. Masson 18/11/02 add budget for 2way nesting -!! O.Geoffroy 03/2006 Add KHKO scheme -!! J.-P. Pinty 22/04/97 add the explicit hail processes -!! C.Lac 10/08/07 Add ADV for PPM without contribution -!! of each direction -!! C. Barthe 19/11/09 Add atmospheric electricity -!! C.Lac 01/07/11 Add vegetation drag -!! P. Peyrille, M. Tomasini : include in the forcing term the 2D forcing -!! terms in term 2DFRC search for modif PP . but Not very clean! -!! C .Lac 27/05/14 add negativity corrections for chemical species -!! C.Lac 29/01/15 Correction for NSV_USER -!! J.Escobar 02/10/2015 modif for JPHEXT(JPVEXT) variable -!! C.Lac 04/12/15 Correction for LSUPSAT -! C. Lac 04/2016: negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2 -! C. Barthe 01/2016: add budget for LIMA -! C. Lac 10/2016: add budget for droplet deposition -! S. Riette 11/2016: new budgets for ICE3/ICE4 -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 15/11/2019: remove unused CBURECORD variable -! P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH -! P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc) -! P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case -! P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets -! B. Vie 02/03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets -! P .Wautelet 09/03/2020: add missing budgets for electricity -! P. Wautelet 25/03/2020: add missing ove_relax_grd -! P. Wautelet 23/04/2020: add nid in tbudgetdata datatype -! P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets -! P. Wautelet 30/06/2020: use NADVSV when possible -! P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables -! P. Wautelet 06/07/2020: bugfix: add condition on HTURB for NETUR sources for SV budgets -! P. Wautelet 08/12/2020: add nbusubwrite and nbutotwrite -! P. Wautelet 11/01/2021: ignore xbuwri for cartesian boxes (write at every xbulen interval) -! P. Wautelet 01/02/2021: bugfix: add missing CEDS source terms for SV budgets -! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA -! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 -! P. Wautelet 10/02/2021: budgets: add missing sources for NSV_C2R2BEG+3 budget -! P. Wautelet 11/02/2021: budgets: add missing term SCAV for NSV_LIMA_SCAVMASS budget -! P. Wautelet 02/03/2021: budgets: add terms for blowing snow -! P. Wautelet 04/03/2021: budgets: add terms for drag due to buildings -! P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables -! C. Barthe 14/03/2022: budgets: add terms for CIBU and RDSF in LIMA -! M. Taufour 01/07/2022: budgets: add concentration for snow, graupel, hail -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_2d_frc, only: l2d_adv_frc, l2d_rel_frc -use modd_blowsnow, only: lblowsnow -use modd_blowsnow_n, only: lsnowsubl -use modd_budget -use modd_ch_aerosol, only: lorilam -use modd_conf, only: l1d, lcartesian, lforcing, lthinshell, nmodel -use modd_dim_n, only: nimax_ll, njmax_ll, nkmax -use modd_dragbldg_n, only: ldragbldg -use modd_dust, only: ldust -use modd_dyn, only: lcorio, xseglen -use modd_dyn_n, only: xtstep, locean -use modd_elec_descr, only: linductive, lrelax2fw_ion -use modd_field, only: TYPEREAL -use modd_fire_n, only: lblaze -use modd_nsv, only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end, & - nsv_chembeg, nsv_chemend, nsv_chicbeg, nsv_chicend, nsv_csbeg, nsv_csend, & - nsv_dstbeg, nsv_dstend, nsv_dstdepbeg, nsv_dstdepend, nsv_elecbeg, nsv_elecend, & -#ifdef MNH_FOREFIRE - nsv_ffbeg, nsv_ffend, & -#endif - nsv_lgbeg, nsv_lgend, & - nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, & - nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl, & - nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & - nsv_lima_scavmass, nsv_lima_spro, & - nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend, & - nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend, & - nsv_user, tsvlist -use modd_parameters, only: jphext -use modd_param_c2r2, only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat -use modd_param_ice, only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm -use modd_param_n, only: cactccn, celec -use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, ldepoc_lima => ldepoc, & - lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, & - lptsplit, & - lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi, & - lspro_lima => lspro, lcibu, lrdsf, & - nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm -use modd_ref, only: lcouples -use modd_salt, only: lsalt -use modd_turb_n, only: lsubg_cond -use modd_viscosity, only: lvisc, lvisc_r, lvisc_sv, lvisc_th, lvisc_uvw - -USE MODE_ll - -IMPLICIT NONE -! -!* 0.1 declarations of argument -! -! -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -REAL, INTENT(IN) :: PTSTEP ! time step -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -INTEGER, INTENT(IN) :: KRR ! number of moist variables -LOGICAL, INTENT(IN) :: ONUMDIFU ! switch to activate the numerical - ! diffusion for momentum -LOGICAL, INTENT(IN) :: ONUMDIFTH ! for meteorological scalar variables -LOGICAL, INTENT(IN) :: ONUMDIFSV ! for tracer scalar variables -LOGICAL, INTENT(IN) :: OHORELAX_UVWTH ! switch for the - ! horizontal relaxation for U,V,W,TH -LOGICAL, INTENT(IN) :: OHORELAX_RV ! switch for the - ! horizontal relaxation for Rv -LOGICAL, INTENT(IN) :: OHORELAX_RC ! switch for the - ! horizontal relaxation for Rc -LOGICAL, INTENT(IN) :: OHORELAX_RR ! switch for the - ! horizontal relaxation for Rr -LOGICAL, INTENT(IN) :: OHORELAX_RI ! switch for the - ! horizontal relaxation for Ri -LOGICAL, INTENT(IN) :: OHORELAX_RS ! switch for the - ! horizontal relaxation for Rs -LOGICAL, INTENT(IN) :: OHORELAX_RG ! switch for the - ! horizontal relaxation for Rg -LOGICAL, INTENT(IN) :: OHORELAX_RH ! switch for the - ! horizontal relaxation for Rh -LOGICAL, INTENT(IN) :: OHORELAX_TKE ! switch for the - ! horizontal relaxation for tke -LOGICAL,DIMENSION(:),INTENT(IN):: OHORELAX_SV ! switch for the - ! horizontal relaxation for scalar variables -LOGICAL, INTENT(IN) :: OVE_RELAX ! switch to activate the vertical - ! relaxation -logical, intent(in) :: ove_relax_grd ! switch to activate the vertical - ! relaxation to the lowest verticals -LOGICAL, INTENT(IN) :: OCHTRANS ! switch to activate convective - !transport for SV -LOGICAL, INTENT(IN) :: ONUDGING ! switch to activate nudging -LOGICAL, INTENT(IN) :: ODRAGTREE ! switch to activate vegetation drag -LOGICAL, INTENT(IN) :: ODEPOTREE ! switch to activate droplet deposition on tree -LOGICAL, INTENT(IN) :: OAERO_EOL ! switch to activate wind turbine wake -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! type of the radiation scheme -CHARACTER (LEN=*), INTENT(IN) :: HDCONV ! type of the deep convection scheme -CHARACTER (LEN=*), INTENT(IN) :: HSCONV ! type of the shallow convection scheme -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! type of the turbulence scheme -CHARACTER (LEN=*), INTENT(IN) :: HTURBDIM! dimensionnality of the turbulence - ! scheme -CHARACTER (LEN=*), INTENT(IN) :: HCLOUD ! type of microphysical scheme -! -!* 0.2 declarations of local variables -! -real, parameter :: ITOL = 1e-6 - -INTEGER :: JI, JJ ! loop indices -INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain -INTEGER :: IIU, IJU ! size along x and y directions - ! of the extended subdomain -INTEGER :: IBUDIM1 ! first dimension of the budget arrays - ! = NBUIMAX in CART case - ! = NBUKMAX in MASK case -INTEGER :: IBUDIM2 ! second dimension of the budget arrays - ! = NBUJMAX in CART case - ! = nbusubwrite in MASK case -INTEGER :: IBUDIM3 ! third dimension of the budget arrays - ! = NBUKMAX in CART case - ! = NBUMASK in MASK case -INTEGER :: JSV ! loop indice for the SVs -INTEGER :: IINFO_ll ! return status of the interface routine -integer :: ibudget -logical :: gtmp -type(tbusourcedata) :: tzsource ! Used to prepare metadate of source terms - -call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget', 'called' ) -! -!* 1. COMPUTE BUDGET VARIABLES -! ------------------------ -! -NBUSTEP = NINT (XBULEN / PTSTEP) -NBUTSHIFT=0 -! -! common dimension for all CBUTYPE values -! -IF (LBU_KCP) THEN - NBUKMAX = 1 -ELSE - NBUKMAX = NBUKH - NBUKL +1 -END IF -! -if ( cbutype == 'CART' .or. cbutype == 'MASK' ) then - !Check if xbulen is a multiple of xtstep (within tolerance) - if ( Abs( Nint( xbulen / xtstep ) * xtstep - xbulen ) > ( ITOL * xtstep ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbulen is not a multiple of xtstep' ) - - if ( cbutype == 'CART' ) then - !Check if xseglen is a multiple of xbulen (within tolerance) - if ( Abs( Nint( xseglen / xbulen ) * xbulen - xseglen ) > ( ITOL * xseglen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbulen' ) - - !Write cartesian budgets every xbulen time period (do not take xbuwri into account) - xbuwri = xbulen - - nbusubwrite = 1 !Number of budget time average periods for each write - nbutotwrite = nbusubwrite * Nint( xseglen / xbulen ) !Total number of budget time average periods - else if ( cbutype == 'MASK' ) then - !Check if xbuwri is a multiple of xtstep (within tolerance) - if ( Abs( Nint( xbuwri / xtstep ) * xtstep - xbuwri ) > ( ITOL * xtstep ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xtstep' ) - - !Check if xbuwri is a multiple of xbulen (within tolerance) - if ( Abs( Nint( xbuwri / xbulen ) * xbulen - xbuwri ) > ( ITOL * xbulen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xbulen' ) - - !Check if xseglen is a multiple of xbuwri (within tolerance) - if ( Abs( Nint( xseglen / xbuwri ) * xbuwri - xseglen ) > ( ITOL * xseglen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbuwri' ) - - nbusubwrite = Nint ( xbuwri / xbulen ) !Number of budget time average periods for each write - nbutotwrite = nbusubwrite * Nint( xseglen / xbuwri ) !Total number of budget time average periods - end if -end if - -IF (CBUTYPE=='CART') THEN ! cartesian case only -! - IF ( NBUIL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too small (<1)' ) - IF ( NBUIL > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too large (>NIMAX)' ) - IF ( NBUIH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too small (<1)' ) - IF ( NBUIH > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too large (>NIMAX)' ) - IF ( NBUIH < NBUIL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' ) - IF (LBU_ICP) THEN - NBUIMAX_ll = 1 - ELSE - NBUIMAX_ll = NBUIH - NBUIL +1 - END IF - - IF ( NBUJL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too small (<1)' ) - IF ( NBUJL > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too large (>NJMAX)' ) - IF ( NBUJH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too small (<1)' ) - IF ( NBUJH > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too large (>NJMAX)' ) - IF ( NBUJH < NBUJL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' ) - IF (LBU_JCP) THEN - NBUJMAX_ll = 1 - ELSE - NBUJMAX_ll = NBUJH - NBUJL +1 - END IF - - IF ( NBUKL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too small (<1)' ) - IF ( NBUKL > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too large (>NKMAX)' ) - IF ( NBUKH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too small (<1)' ) - IF ( NBUKH > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too large (>NKMAX)' ) - IF ( NBUKH < NBUKL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH < NBUKL' ) - - CALL GET_INTERSECTION_ll(NBUIL+JPHEXT,NBUJL+JPHEXT,NBUIH+JPHEXT,NBUJH+JPHEXT, & - NBUSIL,NBUSJL,NBUSIH,NBUSJH,"PHYS",IINFO_ll) - IF ( IINFO_ll /= 1 ) THEN ! - IF (LBU_ICP) THEN - NBUIMAX = 1 - ELSE - NBUIMAX = NBUSIH - NBUSIL +1 - END IF - IF (LBU_JCP) THEN - NBUJMAX = 1 - ELSE - NBUJMAX = NBUSJH - NBUSJL +1 - END IF - ELSE ! the intersection is void - CBUTYPE='SKIP' ! no budget on this processor - NBUIMAX = 0 ! in order to allocate void arrays - NBUJMAX = 0 - ENDIF -! three first dimensions of budget arrays in cart and skip cases - IBUDIM1=NBUIMAX - IBUDIM2=NBUJMAX - IBUDIM3=NBUKMAX -! these variables are not be used - NBUMASK=-1 -! -ELSEIF (CBUTYPE=='MASK') THEN ! mask case only -! - LBU_ENABLE=.TRUE. - ! result on the FM_FILE - NBUTIME = 1 - - CALL GET_DIM_EXT_ll ('B', IIU,IJU) - ALLOCATE( LBU_MASK( IIU ,IJU, NBUMASK) ) - LBU_MASK(:,:,:)=.FALSE. - ALLOCATE( NBUSURF( IIU, IJU, NBUMASK, nbusubwrite) ) - NBUSURF(:,:,:,:) = 0 -! -! three first dimensions of budget arrays in mask case -! the order of the dimensions are the order expected in WRITE_DIACHRO routine: -! x,y,z,time,mask,processus and in this case x and y are missing -! first dimension of the arrays : dimension along K -! second dimension of the arrays : number of the budget time period -! third dimension of the arrays : number of the budget masks zones - IBUDIM1=NBUKMAX - IBUDIM2=nbusubwrite - IBUDIM3=NBUMASK -! these variables are not used in this case - NBUIMAX=-1 - NBUJMAX=-1 -! the beginning and the end along x and y direction : global extended domain - ! get dimensions of the physical global domain - CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) - NBUIL=1 - NBUIH=IIMAX_ll + 2 * JPHEXT - NBUJL=1 - NBUJH=IJMAX_ll + 2 * JPHEXT -! -ELSE ! default case -! - LBU_ENABLE=.FALSE. - NBUIMAX = -1 - NBUJMAX = -1 - LBU_RU = .FALSE. - LBU_RV = .FALSE. - LBU_RW = .FALSE. - LBU_RTH= .FALSE. - LBU_RTKE= .FALSE. - LBU_RRV= .FALSE. - LBU_RRC= .FALSE. - LBU_RRR= .FALSE. - LBU_RRI= .FALSE. - LBU_RRS= .FALSE. - LBU_RRG= .FALSE. - LBU_RRH= .FALSE. - LBU_RSV= .FALSE. -! -! three first dimensions of budget arrays in default case - IBUDIM1=0 - IBUDIM2=0 - IBUDIM3=0 -! -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 2. ALLOCATE MEMORY FOR BUDGET ARRAYS AND INITIALIZE -! ------------------------------------------------ -! -LBU_BEG =.TRUE. -! -!------------------------------------------------------------------------------- -! -!* 3. INITALIZE VARIABLES -! ------------------- -! -!Create intermediate variable to store rhodj for scalar variables -if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. & - lbu_rri .or. lbu_rrs .or. lbu_rrg .or. lbu_rrh .or. lbu_rsv ) then - allocate( tburhodj ) - - tburhodj%cmnhname = 'RhodJS' - tburhodj%cstdname = '' - tburhodj%clongname = 'RhodJS' - tburhodj%cunits = 'kg' - tburhodj%ccomment = 'RhodJ for Scalars variables' - tburhodj%ngrid = 1 - tburhodj%ntype = TYPEREAL - tburhodj%ndims = 3 - - allocate( tburhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tburhodj%xdata(:, :, :) = 0. -end if - - -tzsource%ntype = TYPEREAL -tzsource%ndims = 3 - -! Budget of RU -tbudgets(NBUDGET_U)%lenabled = lbu_ru - -if ( lbu_ru ) then - allocate( tbudgets(NBUDGET_U)%trhodj ) - - tbudgets(NBUDGET_U)%trhodj%cmnhname = 'RhodJX' - tbudgets(NBUDGET_U)%trhodj%cstdname = '' - tbudgets(NBUDGET_U)%trhodj%clongname = 'RhodJX' - tbudgets(NBUDGET_U)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_U)%trhodj%ccomment = 'RhodJ for momentum along X axis' - tbudgets(NBUDGET_U)%trhodj%ngrid = 2 - tbudgets(NBUDGET_U)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_U)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_U)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_U)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_U)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_U)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_U)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along X axis' - tzsource%ngrid = 2 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force due to trees' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_U) ) - - call Sourcelist_scan( tbudgets(NBUDGET_U), cbulist_ru ) -end if - -! Budget of RV -tbudgets(NBUDGET_V)%lenabled = lbu_rv - -if ( lbu_rv ) then - allocate( tbudgets(NBUDGET_V)%trhodj ) - - tbudgets(NBUDGET_V)%trhodj%cmnhname = 'RhodJY' - tbudgets(NBUDGET_V)%trhodj%cstdname = '' - tbudgets(NBUDGET_V)%trhodj%clongname = 'RhodJY' - tbudgets(NBUDGET_V)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_V)%trhodj%ccomment = 'RhodJ for momentum along Y axis' - tbudgets(NBUDGET_V)%trhodj%ngrid = 3 - tbudgets(NBUDGET_V)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_V)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_V)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_V)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_V)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_V)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_V)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along Y axis' - tzsource%ngrid = 3 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force due to trees' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_V) ) - - call Sourcelist_scan( tbudgets(NBUDGET_V), cbulist_rv ) -end if - -! Budget of RW -tbudgets(NBUDGET_W)%lenabled = lbu_rw - -if ( lbu_rw ) then - allocate( tbudgets(NBUDGET_W)%trhodj ) - - tbudgets(NBUDGET_W)%trhodj%cmnhname = 'RhodJZ' - tbudgets(NBUDGET_W)%trhodj%cstdname = '' - tbudgets(NBUDGET_W)%trhodj%clongname = 'RhodJZ' - tbudgets(NBUDGET_W)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_W)%trhodj%ccomment = 'RhodJ for momentum along Z axis' - tbudgets(NBUDGET_W)%trhodj%ngrid = 4 - tbudgets(NBUDGET_W)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_W)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_W)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_W)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_W)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_W)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_W)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along Z axis' - tzsource%ngrid = 4 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian .and. .not.lthinshell - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio .and. .not.l1d .and. .not.lthinshell - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'GRAV' - tzsource%clongname = 'gravity' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - call Sourcelist_sort_compact( tbudgets(NBUDGET_W) ) - - call Sourcelist_scan( tbudgets(NBUDGET_W), cbulist_rw ) -end if - -! Budget of RTH -tbudgets(NBUDGET_TH)%lenabled = lbu_rth - -if ( lbu_rth ) then - tbudgets(NBUDGET_TH)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_TH)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_TH)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_TH)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_TH)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of potential temperature' - tzsource%ngrid = 1 - - tzsource%cunits = 'K' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'K s-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = '2DADV' - tzsource%clongname = 'advective forcing' - tzsource%lavailable = l2d_adv_frc - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = '2DREL' - tzsource%clongname = 'relaxation forcing' - tzsource%lavailable = l2d_rel_frc - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'PREF' - tzsource%clongname = 'reference pressure' - tzsource%lavailable = krr > 0 .and. .not.l1d - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'RAD' - tzsource%clongname = 'radiation' - tzsource%lavailable = hrad /= 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DISSH' - tzsource%clongname = 'dissipation' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_th - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'OCEAN' - tzsource%clongname = 'radiative tendency due to SW penetrating ocean' - tzsource%lavailable = locean .and. (.not. lcouples) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'heat transport by hydrometeors sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'heterogeneous nucleation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_r.ge.1 ) .or. lptsplit ) ) & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) & - .or. hcloud == 'KESS' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. (hcloud == 'LIMA' .and. nmom_i == 1) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'raindrop homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 ) ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit & - .or. ( nmom_s.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_TH) ) - - call Sourcelist_scan( tbudgets(NBUDGET_TH), cbulist_rth ) -end if - -! Budget of RTKE -tbudgets(NBUDGET_TKE)%lenabled = lbu_rtke - -if ( lbu_rtke ) then - tbudgets(NBUDGET_TKE)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_TKE)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_TKE)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_TKE)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_TKE)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of turbulent kinetic energy' - tzsource%ngrid = 1 - - tzsource%cunits = 'm2 s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm2 s-3' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_tke - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DP' - tzsource%clongname = 'dynamic production' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'TP' - tzsource%clongname = 'thermal production' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DISS' - tzsource%clongname = 'dissipation of TKE' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'TR' - tzsource%clongname = 'turbulent transport' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_TKE) ) - - call Sourcelist_scan( tbudgets(NBUDGET_TKE), cbulist_rtke ) -end if - -! Budget of RRV -tbudgets(NBUDGET_RV)%lenabled = lbu_rrv .and. krr >= 1 - -if ( tbudgets(NBUDGET_RV)%lenabled ) then - tbudgets(NBUDGET_RV)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RV)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RV)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RV)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RV)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of water vapor mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = '2DADV' - tzsource%clongname = 'advective forcing' - tzsource%lavailable = l2d_adv_frc - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = '2DREL' - tzsource%clongname = 'relaxation forcing' - tzsource%lavailable = l2d_rel_frc - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rv - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'heterogeneous nucleation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & - .or. lptsplit ) ) & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) & - .or. hcloud == 'KESS' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1 ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on HAIL' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 ) & - .or. hcloud == 'ICE4' ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RV) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RV), cbulist_rrv ) -end if - -! Budget of RRC -tbudgets(NBUDGET_RC)%lenabled = lbu_rrc .and. krr >= 2 - -if ( tbudgets(NBUDGET_RC)%lenabled ) then - if ( hcloud(1:3) == 'ICE' .and. lred .and. lsedic_ice .and. ldeposc_ice ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'lred=T + lsedic=T + ldeposc=T:'// & - 'DEPO and SEDI source terms are mixed and stored in SEDI' ) - - tbudgets(NBUDGET_RC)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RC)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RC)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RC)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RC)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of cloud water mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rc - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of cloud' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lsedc_lima ) & - .or. ( hcloud(1:3) == 'ICE' .and. lsedic_ice ) & - .or. ( hcloud == 'C2R2' .and. lsedc_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lsedc_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. ldepoc_lima ) & - .or. ( hcloud == 'C2R2' .and. ldepoc_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. ldepoc_c2r2 ) & - .or. ( hcloud(1:3) == 'ICE' .and. ldeposc_ice .and. celec == 'NONE' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RC) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RC), cbulist_rrc ) -end if - -! Budget of RRR -tbudgets(NBUDGET_RR)%lenabled = lbu_rrr .and. krr >= 3 - -if ( tbudgets(NBUDGET_RR)%lenabled ) then - tbudgets(NBUDGET_RR)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RR)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RR)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RR)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RR)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of rain water mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rr - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of rain drops' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & - .or. hcloud == 'KESS' & - .or. hcloud(1:3) == 'ICE' & - .or. hcloud == 'C2R2' & - .or. hcloud == 'KHKO' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'collection of droplets by snow and conversion into rain' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - -!PW: a documenter - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RR) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RR), cbulist_rrr ) -end if - -! Budget of RRI -tbudgets(NBUDGET_RI)%lenabled = lbu_rri .and. krr >= 4 - -if ( tbudgets(NBUDGET_RI)%lenabled ) then - tbudgets(NBUDGET_RI)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RI)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RI)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RI)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RI)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of cloud ice mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_ri - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of rain drops' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lsedi_lima ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RI) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RI), cbulist_rri ) -end if - -! Budget of RRS -tbudgets(NBUDGET_RS)%lenabled = lbu_rrs .and. krr >= 5 - -if ( tbudgets(NBUDGET_RS)%lenabled ) then - tbudgets(NBUDGET_RS)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RS)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RS)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RS)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RS)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of snow/aggregate mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rs - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RS), tzsource nneturrs ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RS) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RS), cbulist_rrs ) -end if - -! Budget of RRG -tbudgets(NBUDGET_RG)%lenabled = lbu_rrg .and. krr >= 6 - -if ( tbudgets(NBUDGET_RG)%lenabled ) then - tbudgets(NBUDGET_RG)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RG)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RG)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RG)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RG)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of graupel mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rg - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RG), tzsource nneturrg ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'GHCV' - tzsource%clongname = 'graupel to hail conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion of hail to graupel' - tzsource%lavailable = hcloud == 'LIMA' .and. (lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HGCV' - tzsource%clongname = 'hail to graupel conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RG) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RG), cbulist_rrg ) -end if - -! Budget of RRH -tbudgets(NBUDGET_RH)%lenabled = lbu_rrh .and. krr >= 7 - -if ( tbudgets(NBUDGET_RH)%lenabled ) then - tbudgets(NBUDGET_RH)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RH)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RH)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RH)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RH)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of hail mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rh - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RH), tzsource nneturrh ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_h.ge.1 ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_h.ge.1 ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - - tzsource%cmnhname = 'GHCV' - tzsource%clongname = 'graupel to hail conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_h.ge.1 & - .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. ( hcloud == 'ICE4' .and. ( .not. lred .or. celec /= 'NONE' ) ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion from hail to graupel' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'HGCV' - tzsource%clongname = 'hail to graupel conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not. lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RH) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RH), cbulist_rrh ) -end if - -! Budgets of RSV (scalar variables) - -if ( ksv > 999 ) call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'number of scalar variables > 999' ) - -SV_BUDGETS: do jsv = 1, ksv - ibudget = NBUDGET_SV1 - 1 + jsv - - tbudgets(ibudget)%lenabled = lbu_rsv - - if ( lbu_rsv ) then - tbudgets(ibudget)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(ibudget)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(ibudget)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(ibudget)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(ibudget)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of scalar variable ' // tsvlist(jsv)%cmnhname - tzsource%ngrid = 1 - - tzsource%cunits = '1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifsv - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_sv( jsv ) .or. ( celec /= 'NONE' .and. lrelax2fw_ion & - .and. (jsv == nsv_elecbeg .or. jsv == nsv_elecend ) ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = ( hdconv == 'KAFR' .or. hsconv == 'KAFR' ) .and. ochtrans - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_sv - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA2' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - ! Add specific source terms to different scalar variables - SV_VAR: if ( jsv <= nsv_user ) then - ! nsv_user case - ! Nothing to do - - else if ( jsv >= nsv_c2r2beg .and. jsv <= nsv_c2r2end ) then SV_VAR - ! C2R2 or KHKO Case - - ! Source terms in common for all C2R2/KHKO budgets - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - ! Source terms specific to each budget - SV_C2R2: select case( jsv - nsv_c2r2beg + 1 ) - case ( 1 ) SV_C2R2 - ! Concentration of activated nuclei - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 2 ) SV_C2R2 - ! Concentration of cloud droplets - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(ibudget), tzsource) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SELF' - tzsource%clongname = 'self-collection of cloud droplets' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = lsedc_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = ldepoc_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 3 ) SV_C2R2 - ! Concentration of raindrops - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCBU' - tzsource%clongname = 'self collection - coalescence/break-up' - tzsource%lavailable = hcloud /= 'KHKO' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'spontaneous break-up' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 4 ) SV_C2R2 - ! Supersaturation - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - end select SV_C2R2 - - - else if ( jsv >= nsv_lima_beg .and. jsv <= nsv_lima_end ) then SV_VAR - ! LIMA case - - ! Source terms in common for all LIMA budgets (except supersaturation) - if ( jsv /= nsv_lima_spro ) then - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - end if - - - ! Source terms specific to each budget - SV_LIMA: if ( jsv == nsv_lima_nc ) then - ! Cloud droplets concentration - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(ibudget), tzsource ) - -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_c.ge.1 .and. lsedc_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = nmom_c.ge.1 .and. ldepoc_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SELF' - tzsource%clongname = 'self-collection of cloud droplets' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_nr ) then SV_LIMA - ! Rain drops concentration -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCBU' - tzsource%clongname = 'self collection - coalescence/break-up' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'spontaneous break-up' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_r.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ccn_free .and. jsv <= nsv_lima_ccn_free + nmod_ccn - 1 ) then SV_LIMA - ! Free CCN concentration - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ccn_acti .and. jsv <= nsv_lima_ccn_acti + nmod_ccn - 1 ) then SV_LIMA - ! Activated CCN concentration - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_scavmass ) then SV_LIMA - ! Scavenged mass variable - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima .and. laero_mass_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = lscav_lima .and. laero_mass_lima .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_ni ) then SV_LIMA - ! Pristine ice crystals concentration -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_i.ge.1 .and. lsedi_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_ns ) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = lptsplit .or. ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'break up of snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'heavy riming of cloud droplet on snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SSC' - tzsource%clongname = 'snow self collection' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_ng ) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_i.ge.1 .or. ( nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'heavy riming of cloud droplet on snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of raindrop' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion hail graupel' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_nh .and. nmom_h.ge.1) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_i.ge.1 .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 .and. nmom_h.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion hail graupel' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'hail melting' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA - ! Free IFN concentration - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ifn_nucl .and. jsv <= nsv_lima_ifn_nucl + nmod_ifn - 1 ) then SV_LIMA - ! Nucleated IFN concentration - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima & - .and. ( ( lmeyers_lima .and. jsv == nsv_lima_ifn_nucl ) .or. .not. lmeyers_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lmeyers_lima .and. jsv == nsv_lima_ifn_nucl - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_imm_nucl .and. jsv <= nsv_lima_imm_nucl + nmod_imm - 1 ) then SV_LIMA - ! Nucleated IMM concentration - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_hom_haze ) then SV_LIMA - ! Homogeneous freezing of CCN - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. & - ( ( lhhoni_lima .and. nmod_ccn >= 1 ) .or. ( .not.lptsplit .and. nmom_c.ge.1 ) ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_spro ) then SV_LIMA - ! Supersaturation - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - end if SV_LIMA - - - else if ( jsv >= nsv_elecbeg .and. jsv <= nsv_elecend ) then SV_VAR - ! Electricity case - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - SV_ELEC: select case( jsv - nsv_elecbeg + 1 ) - case ( 1 ) SV_ELEC - ! volumetric charge of water vapor - tzsource%cmnhname = 'DRIFT' - tzsource%clongname = 'ion drift motion' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORAY' - tzsource%clongname = 'cosmic ray source' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 2 ) SV_ELEC - ! volumetric charge of cloud droplets - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'INCG' - tzsource%clongname = 'inductive charge transfer between cloud droplets and graupel' - tzsource%lavailable = linductive - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = lsedic_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 3 ) SV_ELEC - ! volumetric charge of rain drops - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - case ( 4 ) SV_ELEC - ! volumetric charge of ice crystals - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NIIS' - tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 5 ) SV_ELEC - ! volumetric charge of snow - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NIIS' - tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 6 ) SV_ELEC - ! volumetric charge of graupel - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'INCG' - tzsource%clongname = 'inductive charge transfer between cloud droplets and graupel' - tzsource%lavailable = linductive - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 7: ) SV_ELEC - if ( ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) ) then - ! volumetric charge of hail - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( ( hcloud == 'ICE3' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) & - .or. ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 8 ) ) then - ! Negative ions (NSV_ELECEND case) - tzsource%cmnhname = 'DRIFT' - tzsource%clongname = 'ion drift motion' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORAY' - tzsource%clongname = 'cosmic ray source' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown electricity budget' ) - end if - - end select SV_ELEC - - - else if ( jsv >= nsv_lgbeg .and. jsv <= nsv_lgend ) then SV_VAR - !Lagrangian variables - - - else if ( jsv >= nsv_ppbeg .and. jsv <= nsv_ppend ) then SV_VAR - !Passive pollutants - - -#ifdef MNH_FOREFIRE - else if ( jsv >= nsv_ffbeg .and. jsv <= nsv_ffend ) then SV_VAR - !Forefire - -#endif - else if ( jsv >= nsv_csbeg .and. jsv <= nsv_csend ) then SV_VAR - !Conditional sampling - - - else if ( jsv >= nsv_chembeg .and. jsv <= nsv_chemend ) then SV_VAR - !Chemical case - tzsource%cmnhname = 'CHEM' - tzsource%clongname = 'chemistry activity' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_chicbeg .and. jsv <= nsv_chicend ) then SV_VAR - !Ice phase chemistry - - - else if ( jsv >= nsv_aerbeg .and. jsv <= nsv_aerend ) then SV_VAR - !Chemical aerosol case - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = lorilam - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv >= nsv_aerdepbeg .and. jsv <= nsv_aerdepend ) then SV_VAR - !Aerosol wet deposition - - else if ( jsv >= nsv_dstbeg .and. jsv <= nsv_dstend ) then SV_VAR - !Dust - - else if ( jsv >= nsv_dstdepbeg .and. jsv <= nsv_dstdepend ) then SV_VAR - !Dust wet deposition - - else if ( jsv >= nsv_sltbeg .and. jsv <= nsv_sltend ) then SV_VAR - !Salt - - else if ( jsv >= nsv_sltdepbeg .and. jsv <= nsv_sltdepend ) then SV_VAR - !Salt wet deposition - - else if ( jsv >= nsv_snwbeg .and. jsv <= nsv_snwend ) then SV_VAR - !Snow - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SNSED' - tzsource%clongname = 'blowing snow sedimentation' - tzsource%lavailable = lblowsnow - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lnoxbeg .and. jsv <= nsv_lnoxend ) then SV_VAR - !LiNOX passive tracer - - else SV_VAR - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown scalar variable' ) - end if SV_VAR - - - call Sourcelist_sort_compact( tbudgets(ibudget) ) - - call Sourcelist_scan( tbudgets(ibudget), cbulist_rsv ) - end if -end do SV_BUDGETS - -call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 ) - -if ( tbudgets(NBUDGET_U) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U), cbulist_ru ) -if ( tbudgets(NBUDGET_V) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V), cbulist_rv ) -if ( tbudgets(NBUDGET_W) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W), cbulist_rw ) -if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH), cbulist_rth ) -if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke ) -if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV), cbulist_rrv ) -if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC), cbulist_rrc ) -if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR), cbulist_rrr ) -if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI), cbulist_rri ) -if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS), cbulist_rrs ) -if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG), cbulist_rrg ) -if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH), cbulist_rrh ) -if ( lbu_rsv ) call Sourcelist_sv_nml_compact( cbulist_rsv ) -end subroutine Ini_budget - - -subroutine Budget_source_add( tpbudget, tpsource, odonotinit, ooverwrite ) - use modd_budget, only: tbudgetdata, tbusourcedata - - type(tbudgetdata), intent(inout) :: tpbudget - type(tbusourcedata), intent(in) :: tpsource ! Metadata basis - logical, optional, intent(in) :: odonotinit - logical, optional, intent(in) :: ooverwrite - - character(len=4) :: ynum - integer :: isourcenumber - - call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_source_add', 'called for ' // Trim( tpbudget%cname ) & - // ': ' // Trim( tpsource%cmnhname ) ) - - isourcenumber = tpbudget%nsources + 1 - if ( isourcenumber > tpbudget%nsourcesmax ) then - Write( ynum, '( i4 )' ) tpbudget%nsourcesmax - cmnhmsg(1) = 'Insufficient max number of source terms (' // Trim(ynum) // ') for budget ' // Trim( tpbudget%cname ) - cmnhmsg(2) = 'Please increaze value of parameter NSOURCESMAX' - call Print_msg( NVERB_FATAL, 'BUD', 'Budget_source_add' ) - else - tpbudget%nsources = tpbudget%nsources + 1 - end if - - ! Copy metadata from provided tpsource - ! Modifications to source term metadata done with the other dummy arguments - tpbudget%tsources(isourcenumber) = tpsource - - if ( present( odonotinit ) ) tpbudget%tsources(isourcenumber)%ldonotinit = odonotinit - - if ( present( ooverwrite ) ) tpbudget%tsources(isourcenumber)%loverwrite = ooverwrite -end subroutine Budget_source_add - - -subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 ) - use modd_budget, only: tbudgetdata - use modd_field, only: TYPEINT, TYPEREAL - use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX - - use mode_tools, only: Quicksort - - type(tbudgetdata), dimension(:), intent(inout) :: tpbudgets - integer, intent(in) :: kbudim1 - integer, intent(in) :: kbudim2 - integer, intent(in) :: kbudim3 - - character(len=NMNHNAMELGTMAX) :: ymnhname - character(len=NSTDNAMELGTMAX) :: ystdname - character(len=NLONGNAMELGTMAX) :: ylongname - character(len=NUNITLGTMAX) :: yunits - character(len=NCOMMENTLGTMAX) :: ycomment - integer :: ji, jj, jk - integer :: isources ! Number of source terms in a budget - integer :: inbgroups ! Number of budget groups - integer :: ival - integer :: icount - integer :: ivalmax, ivalmin - integer :: igrid - integer :: itype - integer :: idims - integer, dimension(:), allocatable :: igroups ! Temporary array to store sorted group numbers - integer, dimension(:), allocatable :: ipos ! Temporary array to store initial position of group numbers - real :: zval - real :: zvalmax, zvalmin - - call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget_groups', 'called' ) - - BUDGETS: do ji = 1, size( tpbudgets ) - ENABLED: if ( tpbudgets(ji)%lenabled ) then - isources = size( tpbudgets(ji)%tsources ) - do jj = 1, isources - ! Check if ngroup is an allowed value - if ( tpbudgets(ji)%tsources(jj)%ngroup < 0 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'negative group value is not allowed' ) - tpbudgets(ji)%tsources(jj)%ngroup = 0 - end if - - if ( tpbudgets(ji)%tsources(jj)%ngroup > 0 ) tpbudgets(ji)%tsources(jj)%lenabled = .true. - end do - - !Count the number of groups of source terms - !ngroup=1 is for individual entries, >1 values are groups - allocate( igroups(isources ) ) - allocate( ipos (isources ) ) - igroups(:) = tpbudgets(ji)%tsources(:)%ngroup - ipos(:) = [ ( jj, jj = 1, isources ) ] - - !Sort the group list number - call Quicksort( igroups, 1, isources, ipos ) - - !Count the number of different groups - !and renumber the entries (from 1 to inbgroups) - inbgroups = 0 - ival = igroups(1) - if ( igroups(1) /= 0 ) then - inbgroups = 1 - igroups(1) = inbgroups - end if - do jj = 2, isources - if ( igroups(jj) == 1 ) then - inbgroups = inbgroups + 1 - igroups(jj) = inbgroups - else if ( igroups(jj) > 0 ) then - if ( igroups(jj) /= ival ) then - ival = igroups(jj) - inbgroups = inbgroups + 1 - end if - igroups(jj) = inbgroups - end if - end do - - !Write the igroups values to the budget structure - do jj = 1, isources - tpbudgets(ji)%tsources(ipos(jj))%ngroup = igroups(jj) - end do - - !Allocate the group structure + populate it - tpbudgets(ji)%ngroups = inbgroups - allocate( tpbudgets(ji)%tgroups(inbgroups) ) - - do jj = 1, inbgroups - !Search the list of sources for each group - !not the most efficient algorithm but do the job - icount = 0 - do jk = 1, isources - if ( tpbudgets(ji)%tsources(jk)%ngroup == jj ) then - icount = icount + 1 - ipos(icount) = jk !ipos is reused as a temporary work array - end if - end do - tpbudgets(ji)%tgroups(jj)%nsources = icount - - allocate( tpbudgets(ji)%tgroups(jj)%nsourcelist(icount) ) - tpbudgets(ji)%tgroups(jj)%nsourcelist(:) = ipos(1 : icount) - - ! Set the name of the field - ymnhname = tpbudgets(ji)%tsources(ipos(1))%cmnhname - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ymnhname = trim( ymnhname ) // '_' // trim( tpbudgets(ji)%tsources(ipos(jk))%cmnhname ) - end do - tpbudgets(ji)%tgroups(jj)%cmnhname = ymnhname - - ! Set the standard name (CF convention) - if ( tpbudgets(ji)%tgroups(jj)%nsources == 1 ) then - ystdname = tpbudgets(ji)%tsources(ipos(1))%cstdname - else - ! The CF standard name is probably wrong if combining several source terms => set to '' - ystdname = '' - end if - tpbudgets(ji)%tgroups(jj)%cstdname = ystdname - - ! Set the long name (CF convention) - ylongname = tpbudgets(ji)%tsources(ipos(1))%clongname - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ylongname = trim( ylongname ) // ' + ' // tpbudgets(ji)%tsources(ipos(jk))%clongname - end do - tpbudgets(ji)%tgroups(jj)%clongname = ylongname - - ! Set the units - yunits = tpbudgets(ji)%tsources(ipos(1))%cunits - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( trim( yunits ) /= trim( tpbudgets(ji)%tsources(ipos(jk))%cunits ) ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'incompatible units for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - yunits = 'unknown' - end if - end do - tpbudgets(ji)%tgroups(jj)%cunits = yunits - - ! Set the comment - ! It is composed of the source comment followed by the clongnames of the different sources - ycomment = trim( tpbudgets(ji)%tsources(ipos(1))%ccomment ) // ': '// trim( tpbudgets(ji)%tsources(ipos(1))%clongname ) - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ycomment = trim( ycomment ) // ', ' // trim( tpbudgets(ji)%tsources(ipos(jk))%clongname ) - end do - ycomment = trim( ycomment ) // ' source term' - if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) ycomment = trim( ycomment ) // 's' - tpbudgets(ji)%tgroups(jj)%ccomment = ycomment - - ! Set the Arakawa grid - igrid = tpbudgets(ji)%tsources(ipos(1))%ngrid - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( igrid /= tpbudgets(ji)%tsources(ipos(jk))%ngrid ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different Arakawa grid positions for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ngrid = igrid - - ! Set the data type - itype = tpbudgets(ji)%tsources(ipos(1))%ntype - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( itype /= tpbudgets(ji)%tsources(ipos(jk))%ntype ) then - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'incompatible data types for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ntype = itype - - ! Set the number of dimensions - idims = tpbudgets(ji)%tsources(ipos(1))%ndims - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( idims /= tpbudgets(ji)%tsources(ipos(jk))%ndims ) then - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'incompatible number of dimensions for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ndims = idims - - ! Set the fill values - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then - ival = tpbudgets(ji)%tsources(ipos(1))%nfillvalue - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( ival /= tpbudgets(ji)%tsources(ipos(jk))%nfillvalue ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different (integer) fill values for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%nfillvalue = ival - end if - - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then - zval = tpbudgets(ji)%tsources(ipos(1))%xfillvalue - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( zval /= tpbudgets(ji)%tsources(ipos(jk))%xfillvalue ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different (real) fill values for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%xfillvalue = zval - end if - - ! Set the valid min/max values - ! Take the min or max of all the sources - ! Maybe, it would be better to take the sum? (if same sign, if not already the maximum allowed value for this type) - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then - ivalmin = tpbudgets(ji)%tsources(ipos(1))%nvalidmin - ivalmax = tpbudgets(ji)%tsources(ipos(1))%nvalidmax - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ivalmin = min( ivalmin, tpbudgets(ji)%tsources(ipos(jk))%nvalidmin ) - ivalmax = max( ivalmax, tpbudgets(ji)%tsources(ipos(jk))%nvalidmax ) - end do - tpbudgets(ji)%tgroups(jj)%nvalidmin = ivalmin - tpbudgets(ji)%tgroups(jj)%nvalidmax = ivalmax - end if - - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then - zvalmin = tpbudgets(ji)%tsources(ipos(1))%xvalidmin - zvalmax = tpbudgets(ji)%tsources(ipos(1))%xvalidmax - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - zvalmin = min( zvalmin, tpbudgets(ji)%tsources(ipos(jk))%xvalidmin ) - zvalmax = max( zvalmax, tpbudgets(ji)%tsources(ipos(jk))%xvalidmax ) - end do - tpbudgets(ji)%tgroups(jj)%xvalidmin = zvalmin - tpbudgets(ji)%tgroups(jj)%xvalidmax = zvalmax - end if - - allocate( tpbudgets(ji)%tgroups(jj)%xdata(kbudim1, kbudim2, kbudim3 ) ) - tpbudgets(ji)%tgroups(jj)%xdata(:, :, :) = 0. - end do - - deallocate( igroups ) - deallocate( ipos ) - - !Check that a group does not contain more than 1 source term with ldonotinit=.true. - do jj = 1, inbgroups - if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) then - do jk = 1, tpbudgets(ji)%tgroups(jj)%nsources - if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%ldonotinit ) & - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'a group with more than 1 source term may not contain sources with ldonotinit=true' ) - if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%loverwrite ) & - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'a group with more than 1 source term may not contain sources with loverwrite=true' ) - end do - end if - end do - - end if ENABLED - end do BUDGETS - -end subroutine Ini_budget_groups - - -subroutine Sourcelist_sort_compact( tpbudget ) - !Sort the list of sources to put the non-available source terms at the end of the list - !and compact the list - use modd_budget, only: tbudgetdata, tbusourcedata - - type(tbudgetdata), intent(inout) :: tpbudget - - integer :: ji - integer :: isrc_avail, isrc_notavail - type(tbusourcedata), dimension(:), allocatable :: tzsources_avail - type(tbusourcedata), dimension(:), allocatable :: tzsources_notavail - - isrc_avail = 0 - isrc_notavail = 0 - - Allocate( tzsources_avail (tpbudget%nsources) ) - Allocate( tzsources_notavail(tpbudget%nsources) ) - - !Separate source terms available or not during the execution - !(based on the criteria provided to Budget_source_add and stored in lavailable field) - do ji = 1, tpbudget%nsources - if ( tpbudget%tsources(ji)%lavailable ) then - isrc_avail = isrc_avail + 1 - tzsources_avail(isrc_avail) = tpbudget%tsources(ji) - else - isrc_notavail = isrc_notavail + 1 - tzsources_notavail(isrc_notavail) = tpbudget%tsources(ji) - end if - end do - - !Reallocate/compact the source list - if ( Allocated( tpbudget%tsources ) ) Deallocate( tpbudget%tsources ) - Allocate( tpbudget%tsources( tpbudget%nsources ) ) - - tpbudget%nsourcesmax = tpbudget%nsources - !Limit the number of sources to the available list - tpbudget%nsources = isrc_avail - - !Fill the source list beginning with the available sources and finishing with the non-available ones - do ji = 1, isrc_avail - tpbudget%tsources(ji) = tzsources_avail(ji) - end do - - do ji = 1, isrc_notavail - tpbudget%tsources(isrc_avail + ji) = tzsources_notavail(ji) - end do - -end subroutine Sourcelist_sort_compact - - -subroutine Sourcelist_scan( tpbudget, hbulist ) - use modd_budget, only: tbudgetdata - - type(tbudgetdata), intent(inout) :: tpbudget - character(len=*), dimension(:), intent(in) :: hbulist - - character(len=:), allocatable :: yline - character(len=:), allocatable :: ysrc - character(len=:), dimension(:), allocatable :: ymsg - integer :: idx - integer :: igroup - integer :: igroup_idx - integer :: ipos - integer :: istart - integer :: ji - - istart = 1 - - ! Case 'LIST_AVAIL': list all the available source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'LIST_AVAIL' ) then - Allocate( character(len=65) :: ymsg(tpbudget%nsources + 1) ) - ymsg(1) = '---------------------------------------------------------------------' - ymsg(2) = 'Available source terms for budget ' // Trim( tpbudget%cname ) - Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' - idx = 3 - do ji = 1, tpbudget%nsources - if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then - idx = idx + 1 - Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname - end if - end do - ymsg(tpbudget%nsources + 1 ) = '---------------------------------------------------------------------' - call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) - !To not read the 1st line again - istart = 2 - end if - end if - - ! Case 'LIST_ALL': list all the source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'LIST_ALL' ) then - Allocate( character(len=65) :: ymsg(tpbudget%nsourcesmax + 1) ) - ymsg(1) = '---------------------------------------------------------------------' - ymsg(2) = 'Source terms for budget ' // Trim( tpbudget%cname ) - Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' - idx = 3 - do ji = 1, tpbudget%nsourcesmax - if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then - idx = idx + 1 - Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname - end if - end do - ymsg(tpbudget%nsourcesmax + 1 ) = '---------------------------------------------------------------------' - call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) - !To not read the 1st line again - istart = 2 - end if - end if - - ! Case 'ALL': enable all available source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'ALL' ) then - do ji = 1, tpbudget%nsources - tpbudget%tsources(ji)%ngroup = 1 - end do - return - end if - end if - - !Always enable INIF, ENDF and AVEF terms - ipos = Source_find( tpbudget, 'INIF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': INIF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - ipos = Source_find( tpbudget, 'ENDF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ENDF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - ipos = Source_find( tpbudget, 'AVEF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': AVEF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - !igroup_idx start at 2 because 1 is reserved for individually stored source terms - igroup_idx = 2 - - do ji = istart, Size( hbulist ) - if ( Len_trim( hbulist(ji) ) > 0 ) then - ! Scan the line and separate the different sources (separated by + signs) - yline = Trim(hbulist(ji)) - - idx = Index( yline, '+' ) - if ( idx < 1 ) then - igroup = 1 - else - igroup = igroup_idx - igroup_idx = igroup_idx + 1 - end if - - do - idx = Index( yline, '+' ) - if ( idx < 1 ) then - ysrc = yline - else - ysrc = yline(1 : idx - 1) - yline = yline(idx + 1 :) - end if - - !Check if the source is known - if ( Len_trim( ysrc ) > 0 ) then - ipos = Source_find( tpbudget, ysrc ) - - if ( ipos > 0 ) then - call Print_msg( NVERB_DEBUG, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' found' ) - - if ( .not. tpbudget%tsources(ipos)%lavailable ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' not available' ) - tpbudget%tsources(ipos)%ngroup = 0 - else - tpbudget%tsources(ipos)%ngroup = igroup - end if - else - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' not found' ) - end if - end if - - if ( idx < 1 ) exit - end do - end if - end do -end subroutine Sourcelist_scan - - -subroutine Sourcelist_nml_compact( tpbudget, hbulist ) - !This subroutine reduce the size of the hbulist to the minimum - !The list is generated from the group list - use modd_budget, only: NBULISTMAXLEN, tbudgetdata - - type(tbudgetdata), intent(in) :: tpbudget - character(len=NBULISTMAXLEN), dimension(:), allocatable, intent(inout) :: hbulist - - integer :: idx - integer :: isource - integer :: jg - integer :: js - - if ( Allocated( hbulist ) ) Deallocate( hbulist ) - - if ( tpbudget%ngroups < 3 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' ) - return - end if - - Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) ) - hbulist(:) = '' - - idx = 0 - do jg = 1, tpbudget%ngroups - if ( tpbudget%tgroups(jg)%nsources < 1 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' ) - cycle - end if - - !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled - isource = tpbudget%tgroups(jg)%nsourcelist(1) - if ( Any( tpbudget%tsources(isource)%cmnhname == [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle - - idx = idx + 1 -#if 0 - !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN) - !and the name separator is different ('_') - hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname ) -#else - do js = 1, tpbudget%tgroups(jg)%nsources - isource = tpbudget%tgroups(jg)%nsourcelist(js) - hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname ) - if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+' - end do -#endif - end do -end subroutine Sourcelist_nml_compact - - -subroutine Sourcelist_sv_nml_compact( hbulist ) - !This subroutine reduce the size of the hbulist - !For SV variables the reduction is simpler than for other variables - !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable) - use modd_budget, only: NBULISTMAXLEN, tbudgetdata - - character(len=*), dimension(:), allocatable, intent(inout) :: hbulist - - character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new - integer :: ilines - integer :: ji - - ilines = 0 - do ji = 1, Size( hbulist ) - if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1 - end do - - Allocate( ybulist_new(ilines) ) - - ilines = 0 - do ji = 1, Size( hbulist ) - if ( Len_trim(hbulist(ji)) > 0 ) then - ilines = ilines + 1 - ybulist_new(ilines) = Trim( hbulist(ji) ) - end if - end do - - call Move_alloc( from = ybulist_new, to = hbulist ) -end subroutine Sourcelist_sv_nml_compact - - -pure function Source_find( tpbudget, hsource ) result( ipos ) - use modd_budget, only: tbudgetdata - - type(tbudgetdata), intent(in) :: tpbudget - character(len=*), intent(in) :: hsource - integer :: ipos - - integer :: ji - logical :: gfound - - ipos = -1 - gfound = .false. - do ji = 1, tpbudget%nsourcesmax - if ( Trim( hsource ) == Trim ( tpbudget%tsources(ji)%cmnhname ) ) then - gfound = .true. - ipos = ji - exit - end if - end do - -end function Source_find - -end module mode_ini_budget diff --git a/src/mesonh/ext/ini_nsv.f90 b/src/mesonh/ext/ini_nsv.f90 deleted file mode 100644 index 99bb84876..000000000 --- a/src/mesonh/ext/ini_nsv.f90 +++ /dev/null @@ -1,1315 +0,0 @@ -!MNH_LIC Copyright 2001-2023 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_INI_NSV -! ################### -INTERFACE -! - SUBROUTINE INI_NSV(KMI) - INTEGER, INTENT(IN) :: KMI ! model index - END SUBROUTINE INI_NSV -! -END INTERFACE -! -END MODULE MODI_INI_NSV -! -! -! ########################### - SUBROUTINE INI_NSV(KMI) -! ########################### -! -!!**** *INI_NSV* - compute NSV_* values and indices for model KMI -!! -!! PURPOSE -!! ------- -! -! -! -!!** METHOD -!! ------ -!! -!! This routine is called from any routine which stores values in -!! the first model module (for example READ_EXSEG). -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_NSV : contains NSV_A array variable -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! D. Gazen * LA * -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/02/01 -!! Modification 29/11/02 (Pinty) add SV for C3R5 and ELEC -!! Modification 01/2004 (Masson) add scalar names -!! Modification 03/2006 (O.Geoffroy) add KHKO scheme -!! Modification 04/2007 (Leriche) add SV for aqueous chemistry -!! M. Chong 26/01/10 Add Small ions -!! Modification 07/2010 (Leriche) add SV for ice chemistry -!! X.Pialat & J.Escobar 11/2012 remove deprecated line NSV_A(KMI) = ISV -!! Modification 15/02/12 (Pialat/Tulet) Add SV for ForeFire scalars -!! 03/2013 (C.Lac) add supersaturation as -!! the 4th C2R2 scalar variable -!! J.escobar 04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization -!! Modification 01/2016 (JP Pinty) Add LIMA and LUSECHEM condition -!! Modification 07/2017 (V. Vionnet) Add blowing snow condition -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv -! P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv -! B. Vie 06/2021: add prognostic supersaturation for LIMA -! P. Wautelet 26/11/2021: initialize TSVLIST_A -! A. Costes 12/2021: smoke tracer for fire model -! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables -! + NSV_CHEM_LIST(_A) the size of the list -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BLOWSNOW, ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI -USE MODD_CH_AEROSOL -! USE MODD_CH_AEROSOL, ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, & -! LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP -USE MODD_CH_M9_n, ONLY: CICNAMES, CNAMES, NEQ, NEQAQ -USE MODD_CH_MNHC_n, ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX -USE MODD_CONDSAMP, ONLY: LCONDSAMP, NCONDSAMP -USE MODD_CONF, ONLY: LLG, CPROGRAM, NVERB -USE MODD_CST, ONLY: XMNH_TINY -USE MODD_DIAG_FLAG, ONLY: LCHEMDIAG, LCHAQDIAG -USE MODD_DUST, ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, & - LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI -USE MODD_DYN_n, ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3, & - LHORELAX_SVFIRE, LHORELAX_SVLIMA, & - LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, & - LHORELAX_SVDST,LHORELAX_SVAER, LHORELAX_SVSLT, & - LHORELAX_SVPP,LHORELAX_SVCS, LHORELAX_SVCHIC, & - LHORELAX_SVSNW -#ifdef MNH_FOREFIRE -USE MODD_DYN_n, ONLY: LHORELAX_SVFF -#endif -USE MODD_ELEC_DESCR, ONLY: LLNOX_EXPLICIT -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL -USE MODD_FIRE_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_LG, ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAM_C2R2, ONLY: LSUPSAT -USE MODD_PARAMETERS, ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX -USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, & - NMOD_IFN, NMOD_IMM, LHHONI, & - LSPRO, & - NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES -USE MODD_PARAM_n, ONLY: CCLOUD, CELEC -USE MODD_PASPOL, ONLY: LPASPOL, NRELEASE -USE MODD_PREP_REAL, ONLY: XT_LS -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, CDESLTNAMES, JPSALTORDER, & - LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, LDEPOS_SLT, LVARSIG_SLT, NMODE_SLT, YPDESLT_INI, YPSALT_INI - -USE MODE_MSG - -USE MODI_CH_AER_INIT_SOA, ONLY: CH_AER_INIT_SOA -USE MODI_CH_INIT_SCHEME_n, ONLY: CH_INIT_SCHEME_n -USE MODI_UPDATE_NSV, ONLY: UPDATE_NSV -! -IMPLICIT NONE -! -!------------------------------------------------------------------------------- -! -!* 0.1 Declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! model index -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=2) :: YNUM2 -CHARACTER(LEN=3) :: YNUM3 -CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT -CHARACTER(LEN=NUNITLGTMAX) :: YUNITS -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YAEROLONGNAMES -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YDUSTLONGNAMES -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YSALTLONGNAMES -INTEGER :: ILUOUT -INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array -INTEGER :: ISV ! total number of scalar variables -INTEGER :: IMODEIDX -INTEGER :: JAER -INTEGER :: JI, JJ, JSV -INTEGER :: JMODE, JMOM, JSV_NAME -INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt -! -!------------------------------------------------------------------------------- -! -LINI_NSV(KMI) = .TRUE. - -ILUOUT = TLUOUT%NLU - -ICHIDX = 0 -NSV_CHEM_LIST_A(KMI) = 0 -! -! Users scalar variables are first considered -! -NSV_USER_A(KMI) = NSV_USER -ISV = NSV_USER -! -! scalar variables used in microphysical schemes C2R2,KHKO and C3R5 -! -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) THEN - IF ((CCLOUD == 'C2R2' .AND. LSUPSAT) .OR. (CCLOUD == 'KHKO'.AND. LSUPSAT)) THEN - ! 4th scalar field = supersaturation - NSV_C2R2_A(KMI) = 4 - ELSE - NSV_C2R2_A(KMI) = 3 - END IF - NSV_C2R2BEG_A(KMI) = ISV+1 - NSV_C2R2END_A(KMI) = ISV+NSV_C2R2_A(KMI) - ISV = NSV_C2R2END_A(KMI) - IF (CCLOUD == 'C3R5') THEN ! the SVs for C2R2 and C1R3 must be contiguous - NSV_C1R3_A(KMI) = 2 - NSV_C1R3BEG_A(KMI) = ISV+1 - NSV_C1R3END_A(KMI) = ISV+NSV_C1R3_A(KMI) - ISV = NSV_C1R3END_A(KMI) - ELSE - NSV_C1R3_A(KMI) = 0 - ! force First index to be superior to last index - ! in order to create a null section - NSV_C1R3BEG_A(KMI) = 1 - NSV_C1R3END_A(KMI) = 0 - END IF -ELSE - NSV_C2R2_A(KMI) = 0 - NSV_C1R3_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_C2R2BEG_A(KMI) = 1 - NSV_C2R2END_A(KMI) = 0 - NSV_C1R3BEG_A(KMI) = 1 - NSV_C1R3END_A(KMI) = 0 -END IF -! -! scalar variables used in the LIMA microphysical scheme -! -IF (CCLOUD == 'LIMA' ) THEN - ISV = ISV+1 - NSV_LIMA_BEG_A(KMI) = ISV - IF (NMOM_C.GE.2) THEN -! Nc - NSV_LIMA_NC_A(KMI) = ISV - ISV = ISV+1 - END IF -! Nr - IF (NMOM_R.GE.2) THEN - NSV_LIMA_NR_A(KMI) = ISV - ISV = ISV+1 - END IF -! CCN - IF (NMOD_CCN .GT. 0) THEN - NSV_LIMA_CCN_FREE_A(KMI) = ISV - ISV = ISV + NMOD_CCN - NSV_LIMA_CCN_ACTI_A(KMI) = ISV - ISV = ISV + NMOD_CCN - END IF -! Scavenging - IF (LSCAV .AND. LAERO_MASS) THEN - NSV_LIMA_SCAVMASS_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ni - IF (NMOM_I.GE.2) THEN - NSV_LIMA_NI_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ns - IF (NMOM_S.GE.2) THEN - NSV_LIMA_NS_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ng - IF (NMOM_G.GE.2) THEN - NSV_LIMA_NG_A(KMI) = ISV - ISV = ISV+1 - END IF -! Nh - IF (NMOM_H.GE.2) THEN - NSV_LIMA_NH_A(KMI) = ISV - ISV = ISV+1 - END IF -! IFN - IF (NMOD_IFN .GT. 0) THEN - NSV_LIMA_IFN_FREE_A(KMI) = ISV - ISV = ISV + NMOD_IFN - NSV_LIMA_IFN_NUCL_A(KMI) = ISV - ISV = ISV + NMOD_IFN - END IF -! IMM - IF (NMOD_IMM .GT. 0) THEN - NSV_LIMA_IMM_NUCL_A(KMI) = ISV - ISV = ISV + MAX(1,NMOD_IMM) - END IF - - IF ( NMOD_IFN > 0 ) THEN - IF ( .NOT. ALLOCATED( NIMM ) ) ALLOCATE( NIMM(NMOD_CCN) ) - NIMM(:) = 0 - IF ( ALLOCATED( NINDICE_CCN_IMM ) ) DEALLOCATE( NINDICE_CCN_IMM ) - ALLOCATE( NINDICE_CCN_IMM(MAX( 1, NMOD_IMM )) ) - IF (NMOD_IMM > 0 ) THEN - DO JI = 0, NMOD_IMM - 1 - NIMM(NMOD_CCN - JI) = 1 - NINDICE_CCN_IMM(NMOD_IMM - JI) = NMOD_CCN - JI - END DO -! ELSE IF (NMOD_IMM == 0) THEN ! PNIS exists but is 0 for the call to resolved_cloud -! NMOD_IMM = 1 -! NINDICE_CCN_IMM(1) = 0 - END IF - END IF - -! Homogeneous freezing of CCN - IF (LHHONI) THEN - NSV_LIMA_HOM_HAZE_A(KMI) = ISV - ISV = ISV + 1 - END IF -! Supersaturation - IF (LSPRO) THEN - NSV_LIMA_SPRO_A(KMI) = ISV - ISV = ISV + 1 - END IF -! -! End and total variables -! - ISV = ISV - 1 - NSV_LIMA_END_A(KMI) = ISV - NSV_LIMA_A(KMI) = NSV_LIMA_END_A(KMI) - NSV_LIMA_BEG_A(KMI) + 1 -ELSE - NSV_LIMA_A(KMI) = 0 -! -! force First index to be superior to last index -! in order to create a null section -! - NSV_LIMA_BEG_A(KMI) = 1 - NSV_LIMA_END_A(KMI) = 0 -END IF ! CCLOUD = LIMA -! -! -! Add one scalar for negative ion -! First variable: positive ion (NSV_ELECBEG_A index number) -! Last --------: negative ion (NSV_ELECEND_A index number) -! Correspondence for ICE3: -! Relative index 1 2 3 4 5 6 7 -! Charge for ion+ cloud rain ice snow graupel ion- -! -! Correspondence for ICE4: -! Relative index 1 2 3 4 5 6 7 8 -! Charge for ion+ cloud rain ice snow graupel hail ion- -! -IF (CELEC /= 'NONE') THEN - IF (CCLOUD == 'ICE3') THEN - NSV_ELEC_A(KMI) = 7 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - CELECNAMES(7) = CELECNAMES(8) - ELSE IF (CCLOUD == 'ICE4') THEN - NSV_ELEC_A(KMI) = 8 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - END IF -ELSE - NSV_ELEC_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_ELECBEG_A(KMI) = 1 - NSV_ELECEND_A(KMI) = 0 -END IF -! -! scalar variables used as lagragian variables -! -IF (LLG) THEN - NSV_LG_A(KMI) = 3 - NSV_LGBEG_A(KMI) = ISV+1 - NSV_LGEND_A(KMI) = ISV+NSV_LG_A(KMI) - ISV = NSV_LGEND_A(KMI) -ELSE - NSV_LG_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_LGBEG_A(KMI) = 1 - NSV_LGEND_A(KMI) = 0 -END IF -! -! scalar variables used as LiNOX passive tracer -! -! In case without chemistry -IF (LPASPOL) THEN - NSV_PP_A(KMI) = NRELEASE - NSV_PPBEG_A(KMI)= ISV+1 - NSV_PPEND_A(KMI)= ISV+NSV_PP_A(KMI) - ISV = NSV_PPEND_A(KMI) -ELSE - NSV_PP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_PPBEG_A(KMI)= 1 - NSV_PPEND_A(KMI)= 0 -END IF -! -#ifdef MNH_FOREFIRE -! ForeFire tracers -IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN - NSV_FF_A(KMI) = NFFSCALARS - NSV_FFBEG_A(KMI) = ISV+1 - NSV_FFEND_A(KMI) = ISV+NSV_FF_A(KMI) - ISV = NSV_FFEND_A(KMI) -ELSE - NSV_FF_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_FFBEG_A(KMI)= 1 - NSV_FFEND_A(KMI)= 0 -END IF -#endif -! Blaze tracers -IF (LBLAZE .AND. NNBSMOKETRACER .GT. 0) THEN - NSV_FIRE_A(KMI) = NNBSMOKETRACER - NSV_FIREBEG_A(KMI) = ISV+1 - NSV_FIREEND_A(KMI) = ISV+NSV_FIRE_A(KMI) - ISV = NSV_FIREEND_A(KMI) -ELSE - NSV_FIRE_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_FIREBEG_A(KMI)= 1 - NSV_FIREEND_A(KMI)= 0 -END IF -! -! Conditional sampling variables -IF (LCONDSAMP) THEN - NSV_CS_A(KMI) = NCONDSAMP - NSV_CSBEG_A(KMI)= ISV+1 - NSV_CSEND_A(KMI)= ISV+NSV_CS_A(KMI) - ISV = NSV_CSEND_A(KMI) -ELSE - NSV_CS_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_CSBEG_A(KMI)= 1 - NSV_CSEND_A(KMI)= 0 -END IF -! -! scalar variables used in chemical core system -! -IF (LUSECHEM) THEN - CALL CH_INIT_SCHEME_n(KMI,LUSECHAQ,LUSECHIC,LCH_PH,ILUOUT,NVERB) - IF (LORILAM) CALL CH_AER_INIT_SOA(ILUOUT, NVERB) -END IF - -IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN - NSV_CHEM_A(KMI) = NEQ - NSV_CHEMBEG_A(KMI)= ISV+1 - NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI) - ISV = NSV_CHEMEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI) -ELSE - NSV_CHEM_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_CHEMBEG_A(KMI)= 1 - NSV_CHEMEND_A(KMI)= 0 -END IF -! -! aqueous chemistry (part of the "chem" variables) -! -IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN - NSV_CHGS_A(KMI) = NEQ-NEQAQ - NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI) - NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1 - NSV_CHAC_A(KMI) = NEQAQ - NSV_CHACBEG_A(KMI)= NSV_CHGSEND_A(KMI)+1 - NSV_CHACEND_A(KMI)= NSV_CHEMEND_A(KMI) -! ice phase chemistry - IF (LUSECHIC) THEN - NSV_CHIC_A(KMI) = NEQAQ/2. -1. - NSV_CHICBEG_A(KMI)= ISV+1 - NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI) - ISV = NSV_CHICEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI) - ELSE - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ENDIF -ELSE - IF (NEQ .GT. 0) THEN - NSV_CHGS_A(KMI) = NEQ-NEQAQ - NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI) - NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1 - NSV_CHAC_A(KMI) = 0 - NSV_CHACBEG_A(KMI)= 1 - NSV_CHACEND_A(KMI)= 0 - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ELSE - NSV_CHGS_A(KMI) = 0 - NSV_CHGSBEG_A(KMI)= 1 - NSV_CHGSEND_A(KMI)= 0 - NSV_CHAC_A(KMI) = 0 - NSV_CHACBEG_A(KMI)= 1 - NSV_CHACEND_A(KMI)= 0 - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ENDIF -END IF -! aerosol variables -IF (LORILAM.AND.(NEQ .GT. 0)) THEN - NM6_AER = 0 - IF (LVARSIGI) NM6_AER = 1 - IF (LVARSIGJ) NM6_AER = NM6_AER + 1 - NSV_AER_A(KMI) = (NSP+NCARB+NSOA+1)*JPMODE + NM6_AER - NSV_AERBEG_A(KMI)= ISV+1 - NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI) - ISV = NSV_AEREND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI) - - ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) ) -ELSE - NSV_AER_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_AERBEG_A(KMI)= 1 - NSV_AEREND_A(KMI)= 0 -END IF -IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN - NSV_AERDEP_A(KMI) = JPMODE*2 - NSV_AERDEPBEG_A(KMI)= ISV+1 - NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI) - ISV = NSV_AERDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI) -ELSE - NSV_AERDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_AERDEPBEG_A(KMI)= 1 - NSV_AERDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section -END IF -! -! scalar variables used in dust model -! -IF (LDUST) THEN - IF (ALLOCATED(XT_LS).AND. .NOT.(LDSTPRES)) LDSTINIT=.TRUE. - IF (CPROGRAM == 'IDEAL ') LVARSIG = .TRUE. - IF ((CPROGRAM == 'REAL ').AND.LDSTINIT) LVARSIG = .TRUE. - !Determine number of moments - IF ( LRGFIX_DST ) THEN - INMOMENTS_DST = 1 - IF ( LVARSIG ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG forced to FALSE because LRGFIX_DST is TRUE' ) - LVARSIG = .FALSE. - ELSE IF ( LVARSIG ) THEN - INMOMENTS_DST = 3 - ELSE - INMOMENTS_DST = 2 - END IF - !Number of entries = number of moments multiplied by number of modes - NSV_DST_A(KMI) = NMODE_DST * INMOMENTS_DST - NSV_DSTBEG_A(KMI)= ISV+1 - NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI) - ISV = NSV_DSTEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI) -ELSE - NSV_DST_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_DSTBEG_A(KMI)= 1 - NSV_DSTEND_A(KMI)= 0 -END IF -IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN - NSV_DSTDEP_A(KMI) = NMODE_DST*2 - NSV_DSTDEPBEG_A(KMI)= ISV+1 - NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI) - ISV = NSV_DSTDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI) -ELSE - NSV_DSTDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_DSTDEPBEG_A(KMI)= 1 - NSV_DSTDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section - - END IF -! scalar variables used in sea salt model -! -IF (LSALT) THEN - IF (ALLOCATED(XT_LS).AND. .NOT.(LSLTPRES)) LSLTINIT=.TRUE. - IF (CPROGRAM == 'IDEAL ') LVARSIG_SLT = .TRUE. - IF ((CPROGRAM == 'REAL ').AND. LSLTINIT ) LVARSIG_SLT = .TRUE. - !Determine number of moments - IF ( LRGFIX_SLT ) THEN - INMOMENTS_SLT = 1 - IF ( LVARSIG_SLT ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG_SLT forced to FALSE because LRGFIX_SLT is TRUE' ) - LVARSIG_SLT = .FALSE. - ELSE IF ( LVARSIG_SLT ) THEN - INMOMENTS_SLT = 3 - ELSE - INMOMENTS_SLT = 2 - END IF - !Number of entries = number of moments multiplied by number of modes - NSV_SLT_A(KMI) = NMODE_SLT * INMOMENTS_SLT - NSV_SLTBEG_A(KMI)= ISV+1 - NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI) - ISV = NSV_SLTEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI) -ELSE - NSV_SLT_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SLTBEG_A(KMI)= 1 - NSV_SLTEND_A(KMI)= 0 -END IF -IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN - NSV_SLTDEP_A(KMI) = NMODE_SLT*2 - NSV_SLTDEPBEG_A(KMI)= ISV+1 - NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI) - ISV = NSV_SLTDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI) -ELSE - NSV_SLTDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SLTDEPBEG_A(KMI)= 1 - NSV_SLTDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section -END IF -! -! scalar variables used in blowing snow model -! -IF (LBLOWSNOW) THEN - NSV_SNW_A(KMI) = NBLOWSNOW3D - NSV_SNWBEG_A(KMI)= ISV+1 - NSV_SNWEND_A(KMI)= ISV+NSV_SNW_A(KMI) - ISV = NSV_SNWEND_A(KMI) -ELSE - NSV_SNW_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SNWBEG_A(KMI)= 1 - NSV_SNWEND_A(KMI)= 0 -END IF -! -! scalar variables used as LiNOX passive tracer -! -! In case without chemistry -IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN - NSV_LNOX_A(KMI) = 1 - NSV_LNOXBEG_A(KMI)= ISV+1 - NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI) - ISV = NSV_LNOXEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI) -ELSE - NSV_LNOX_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_LNOXBEG_A(KMI)= 1 - NSV_LNOXEND_A(KMI)= 0 -END IF -! -! Final number of NSV variables -! -NSV_A(KMI) = ISV -! -! -!* Update LHORELAX_SV,CGETSVM,CGETSVT for NON USER SV -! -! C2R2 or KHKO SV case -!*BUG*JPC*MAR2006 -! IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) & -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) & -!*BUG*JPC*MAR2006 -LHORELAX_SV(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=LHORELAX_SVC2R2 -! C3R5 SV case -IF (CCLOUD == 'C3R5') & -LHORELAX_SV(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=LHORELAX_SVC1R3 -! LIMA SV case -IF (CCLOUD == 'LIMA') & -LHORELAX_SV(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=LHORELAX_SVLIMA -! Electrical SV case -IF (CELEC /= 'NONE') & -LHORELAX_SV(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=LHORELAX_SVELEC -! Chemical SV case -IF (LUSECHEM .OR. LCHEMDIAG) & -LHORELAX_SV(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=LHORELAX_SVCHEM -! Ice phase Chemical SV case -IF (LUSECHIC) & -LHORELAX_SV(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=LHORELAX_SVCHIC -! LINOX SV case -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) & -LHORELAX_SV(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=LHORELAX_SVCHEM -! Dust SV case -IF (LDUST) & -LHORELAX_SV(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=LHORELAX_SVDST -! Sea Salt SV case -IF (LSALT) & -LHORELAX_SV(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=LHORELAX_SVSLT -! Aerosols SV case -IF (LORILAM) & -LHORELAX_SV(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=LHORELAX_SVAER -! Lagrangian variables -IF (LLG) & -LHORELAX_SV(NSV_LGBEG_A(KMI):NSV_LGEND_A(KMI))=LHORELAX_SVLG -! Passive pollutants -IF (LPASPOL) & -LHORELAX_SV(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=LHORELAX_SVPP -#ifdef MNH_FOREFIRE -! Fire pollutants -IF (LFOREFIRE) & -LHORELAX_SV(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=LHORELAX_SVFF -#endif -! Blaze Fire pollutants -IF (LBLAZE) & -LHORELAX_SV(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=LHORELAX_SVFIRE -! Conditional sampling -IF (LCONDSAMP) & -LHORELAX_SV(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=LHORELAX_SVCS -! Blowing snow case -IF (LBLOWSNOW) & -LHORELAX_SV(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=LHORELAX_SVSNW -! Update NSV* variables for model KMI -CALL UPDATE_NSV(KMI) -! -! SET MINIMUN VALUE FOR DIFFERENT SV GROUPS -! -XSVMIN(1:NSV_USER_A(KMI))=0. -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) & -XSVMIN(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=0. -IF (CCLOUD == 'C3R5') & -XSVMIN(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=0. -IF (CCLOUD == 'LIMA') & -XSVMIN(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=0. -IF (CELEC /= 'NONE') & -XSVMIN(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=0. -IF (LUSECHEM .OR. LCHEMDIAG) & -XSVMIN(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=0. -IF (LUSECHIC) & -XSVMIN(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=0. -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) & -XSVMIN(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=0. -IF (LORILAM .OR. LCHEMDIAG) & -XSVMIN(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=0. -IF (LDUST) XSVMIN(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=XMNH_TINY -IF ((LDUST).AND.(LDEPOS_DST(KMI))) & -XSVMIN(NSV_DSTDEPBEG_A(KMI):NSV_DSTDEPEND_A(KMI))=XMNH_TINY -IF (LSALT) XSVMIN(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=XMNH_TINY -IF (LLG) THEN - XSVMIN(NSV_LGBEG_A(KMI)) =XLG1MIN - XSVMIN(NSV_LGBEG_A(KMI)+1)=XLG2MIN - XSVMIN(NSV_LGEND_A(KMI)) =XLG3MIN -ENDIF -IF ((LSALT).AND.(LDEPOS_SLT(KMI))) & -XSVMIN(NSV_SLTDEPBEG_A(KMI):NSV_SLTDEPEND_A(KMI))=XMNH_TINY -IF ((LORILAM).AND.(LDEPOS_AER(KMI))) & -XSVMIN(NSV_AERDEPBEG_A(KMI):NSV_AERDEPEND_A(KMI))=XMNH_TINY -IF (LPASPOL) XSVMIN(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=0. -#ifdef MNH_FOREFIRE -IF (LFOREFIRE) XSVMIN(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=0. -#endif -! Blaze smoke -IF (LBLAZE) XSVMIN(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=0. -! -IF (LCONDSAMP) XSVMIN(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=0. -IF (LBLOWSNOW) XSVMIN(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=XMNH_TINY -! -! NAME OF THE SCALAR VARIABLES IN THE DIFFERENT SV GROUPS -! -CSV_A(:, KMI) = ' ' -IF (LLG) THEN - CSV_A(NSV_LGBEG_A(KMI), KMI) = 'X0 ' - CSV_A(NSV_LGBEG_A(KMI)+1, KMI) = 'Y0 ' - CSV_A(NSV_LGEND_A(KMI), KMI) = 'Z0 ' -ENDIF - -! Initialize scalar variable names for dust -IF ( LDUST ) THEN - IF ( NMODE_DST < 1 .OR. NMODE_DST > 3 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_DST must in the 1 to 3 interval' ) - - ! Initialization of dust names - ! Was allocated for previous KMI - ! We assume that if LDUST=T on a model, NSV_DST_A(KMI) is the same for all - IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN - ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) ) - ELSE IF ( SIZE( CDUSTNAMES ) /= NSV_DST_A(KMI) ) THEN - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_DST not the same for different model (if LDUST=T)' ) - DEALLOCATE( CDUSTNAMES ) - ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) ) - END IF - ALLOCATE( YDUSTLONGNAMES(NSV_DST_A(KMI)) ) - !Loop on all dust modes - IF ( INMOMENTS_DST == 1 ) THEN - DO JMODE = 1, NMODE_DST - IMODEIDX = JPDUSTORDER(JMODE) - JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 - CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME) - !Add meaning of the ppv unit (here for moment 3) - YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - END DO - ELSE - DO JMODE = 1,NMODE_DST - !Find which mode we are dealing with - IMODEIDX = JPDUSTORDER(JMODE) - DO JMOM = 1, INMOMENTS_DST - !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * INMOMENTS_DST + JMOM - !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI - JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM - !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT - CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME) - !Add meaning of the ppv unit - IF ( JMOM == 1 ) THEN !Corresponds to moment 0 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for DUST' ) - YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) - END IF - ENDDO ! Loop on moments - ENDDO ! Loop on dust modes - END IF - - ! Initialization of deposition scheme names - IF ( LDEPOS_DST(KMI) ) THEN - IF( .NOT. ALLOCATED( CDEDSTNAMES ) ) THEN - ALLOCATE( CDEDSTNAMES(NMODE_DST * 2) ) - DO JMODE = 1, NMODE_DST - IMODEIDX = JPDUSTORDER(JMODE) - CDEDSTNAMES(JMODE) = YPDEDST_INI(IMODEIDX) - CDEDSTNAMES(NMODE_DST + JMODE) = YPDEDST_INI(NMODE_DST + IMODEIDX) - ENDDO - END IF - END IF -END IF - -! Initialize scalar variable names for salt -IF ( LSALT ) THEN - IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 8 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 8 interval' ) - - ! Was allocated for previous KMI - ! We assume that if LSALT=T on a model, NSV_SLT_A(KMI) is the same for all - IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN - ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) ) - ELSE IF ( SIZE( CSALTNAMES ) /= NSV_SLT_A(KMI) ) THEN - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_SLT not the same for different model (if LSALT=T)' ) - DEALLOCATE( CSALTNAMES ) - ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) ) - END IF - ALLOCATE( YSALTLONGNAMES(NSV_SLT_A(KMI)) ) - !Loop on all dust modes - IF ( INMOMENTS_SLT == 1 ) THEN - DO JMODE = 1, NMODE_SLT - IMODEIDX = JPSALTORDER(JMODE) - JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 - CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME) - !Add meaning of the ppv unit (here for moment 3) - YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - END DO - ELSE - DO JMODE = 1, NMODE_SLT - !Find which mode we are dealing with - IMODEIDX = JPSALTORDER(JMODE) - DO JMOM = 1, INMOMENTS_SLT - !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * INMOMENTS_SLT + JMOM - !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI - JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM - !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT - CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME) - !Add meaning of the ppv unit - IF ( JMOM == 1 ) THEN !Corresponds to moment 0 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for SALT' ) - YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) - END IF - ENDDO ! Loop on moments - ENDDO ! Loop on dust modes - END IF - - ! Initialization of deposition scheme - IF ( LDEPOS_SLT(KMI) ) THEN - IF( .NOT. ALLOCATED( CDESLTNAMES ) ) THEN - ALLOCATE( CDESLTNAMES(NMODE_SLT * 2) ) - DO JMODE = 1, NMODE_SLT - IMODEIDX = JPSALTORDER(JMODE) - CDESLTNAMES(JMODE) = YPDESLT_INI(IMODEIDX) - CDESLTNAMES(NMODE_SLT + JMODE) = YPDESLT_INI(NMODE_SLT + IMODEIDX) - ENDDO - ENDIF - ENDIF -END IF - -! Initialize scalar variable names for snow -IF ( LBLOWSNOW ) THEN - IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN - ALLOCATE( CSNOWNAMES(NSV_SNW_A(KMI)) ) - DO JMOM = 1, NSV_SNW_A(KMI) - CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM) - END DO - END IF -END IF - -!Fill metadata for model KMI -DO JSV = 1, NSV_USER_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVUSER' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVUSER' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVUSER' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SV LIMA ' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = '', & - CUNITS = 'kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(1) ) - ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(2) ) - ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2 - ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2 - ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CAERO_MASS(1) ) - TSVLIST_A(JSV, KMI)%CUNITS = 'kg kg-1' - ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(1) ) - ELSE IF ( JSV == NSV_LIMA_NS_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) - ELSE IF ( JSV == NSV_LIMA_NG_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) - ELSE IF ( JSV == NSV_LIMA_NH_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) - ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2 - ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2 - ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1) - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2 - ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(8) ) - ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CUNITS = '1' - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(5) ) - ELSE - CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' ) - END IF - - TSVLIST_A(JSV, KMI)%CLONGNAME = TRIM( TSVLIST_A(JSV, KMI)%CMNHNAME ) -END DO - -DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI) - IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN - YUNITS = 'C kg-1' - WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV - ELSE - YUNITS = 'kg-1' - WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/kg)' - END IF - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & - CUNITS = TRIM( YUNITS ), & - CDIR = 'XY', & - CCOMMENT = TRIM( YCOMMENT ), & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVPP' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVPP' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -#ifdef MNH_FOREFIRE -DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVFF' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVFF' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO -#endif - -DO JSV = NSV_FIREBEG_A(KMI), NSV_FIREEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FIREBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVFIRE' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVFIRE' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI) - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVCS' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVCS' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - !Determine moment to add meaning of the ppv unit - JAER = JSV - NSV_AERBEG_A(KMI) + 1 - IF ( ANY( JAER == [JP_CH_M0i, JP_CH_M0j] ) ) THEN - !Moment 0 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( ANY( JAER == [ JP_CH_SO4i, JP_CH_SO4j, JP_CH_NO3i, JP_CH_NO3j, JP_CH_H2Oi, JP_CH_H2Oj, JP_CH_NH3i, JP_CH_NH3j, & - JP_CH_OCi, JP_CH_OCj, JP_CH_BCi, JP_CH_BCj, JP_CH_DSTi, JP_CH_DSTj ] ) & - .OR. ( NSOA == 10 .AND. & - ANY( JAER == [ JP_CH_SOA1i, JP_CH_SOA1j, JP_CH_SOA2i, JP_CH_SOA2j, JP_CH_SOA3i, JP_CH_SOA3j, JP_CH_SOA4i, & - JP_CH_SOA4j, JP_CH_SOA5i, JP_CH_SOA5j, JP_CH_SOA6i, JP_CH_SOA6j, JP_CH_SOA7i, JP_CH_SOA7j, & - JP_CH_SOA8i, JP_CH_SOA8j, JP_CH_SOA9i, JP_CH_SOA9j, JP_CH_SOA10i, JP_CH_SOA10j ] ) ) ) THEN - !Moment 3 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( ( LVARSIGI .AND. JAER == JP_CH_M6i ) .OR. ( LVARSIGJ .AND. JAER == JP_CH_M6j ) ) THEN - !Moment 6 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for AER' ) - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) - END IF - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YAEROLONGNAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YDUSTLONGNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YSALTLONGNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -!Check if there is at most 1 LINOX scalar variable -!if not, the name must be modified and different for all of them -IF ( NSV_LNOX_A(KMI) > 1 ) & - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_LNOX_A>1: problem with the names of the corresponding scalar variables' ) - -DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'LINOX', & - CSTDNAME = '', & - CLONGNAME = 'LINOX', & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) & - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' ) - -END SUBROUTINE INI_NSV diff --git a/src/mesonh/ext/init_aerosol_concentration.f90 b/src/mesonh/ext/init_aerosol_concentration.f90 deleted file mode 100644 index fc4becd44..000000000 --- a/src/mesonh/ext/init_aerosol_concentration.f90 +++ /dev/null @@ -1,157 +0,0 @@ -!MNH_LIC Copyright 2013-2021 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_AEROSOL_CONCENTRATION -!###################################### -! -INTERFACE INIT_AEROSOL_CONCENTRATION - SUBROUTINE INIT_AEROSOL_CONCENTRATION(PRHODREF, PSVT, PZZ) -! - REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !Air Density [kg/m**3] - REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !Particles Concentration [/m**3] - REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! - END SUBROUTINE INIT_AEROSOL_CONCENTRATION -END INTERFACE INIT_AEROSOL_CONCENTRATION -! -END MODULE MODI_INIT_AEROSOL_CONCENTRATION -! -! ########################################################## - SUBROUTINE INIT_AEROSOL_CONCENTRATION(PRHODREF, PSVT, PZZ) -! ########################################################## -!! -!! PURPOSE -!! ------- -!! Define the aerosol distributions -!! -!! -!! MODD_BLANKn : -!! CDUMMY2 : CCN ou IFN pour le panache -!! NDUMMY1 : hauteur base du panache -!! NDUMMY2 : hauteur sommet du panache -!! XDUMMY8 : Concentration du panache (N/cm3 pour des CCN, N/L pour des IFN) -!! -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! S. Berthet * Laboratoire d'Aerologie* -!! B. Vié * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original ??/??/13 -!! Modification 01/2016 (JP Pinty) Add LIMA -!! -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_NSV -USE MODD_PARAM_n, ONLY : CCLOUD -USE MODD_PARAM_LIMA, ONLY : NMOM_C, LACTI, NMOD_CCN, LSCAV, LAERO_MASS, & - XCCN_CONC, LCCN_HOM, & - NMOM_I, LNUCL, NMOD_IFN, LMEYERS, & - XIFN_CONC, LIFN_HOM -USE MODD_PARAMETERS, ONLY : JPVEXT -USE MODD_BLANK_n, ONLY : CDUMMY2, NDUMMY1, NDUMMY2, XDUMMY8 -! -IMPLICIT NONE -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !Air Density [kg/m**3] -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !Particles Concentration - ![particles/kg of dry air] -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! -! Local variables -INTEGER :: JMOD_IFN -INTEGER :: JSV, JINIT -INTEGER :: IKB, IKE -! -!------------------------------------------------------------------------------- -! -! -!*initialization of N_FREE_CCN/N_ACTIVATED_CCN et N_FREE_IN/N_ACTIVATED_IN -! -! -IF ( NMOM_C.GE.2 .AND. LACTI ) THEN - DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI+NMOD_CCN-1 - PSVT(:,:,:,JSV) = 0.0 - ENDDO - IKB = 1+JPVEXT - IKE = SIZE(PSVT,3)-JPVEXT -! -! Initialisation des concentrations en CCN -! -! - IF (LCCN_HOM) THEN -! concentration homogène (en nombre par m3) sur la verticale - DO JSV = 1, NMOD_CCN - PSVT(:,:,IKB:IKE,NSV_LIMA_CCN_FREE+JSV-1) = & - XCCN_CONC(JSV)*1.0E6 / PRHODREF(:,:,IKB:IKE) - END DO - ELSE -! concentration décroissante selon z - DO JSV = 1, NMOD_CCN - WHERE (PZZ(:,:,:) .LE. 1000.) - PSVT(:,:,:,NSV_LIMA_CCN_FREE+JSV-1) = XCCN_CONC(JSV)*1.0E6 / PRHODREF(:,:,:) - ELSEWHERE (PZZ(:,:,:) .LE. 10000.) - PSVT(:,:,:,NSV_LIMA_CCN_FREE+JSV-1) = XCCN_CONC(JSV)*1.0E6 & - / PRHODREF(:,:,:) * EXP(-LOG(XCCN_CONC(JSV)/0.01)*PZZ(:,:,:)/10000.) - ELSEWHERE - PSVT(:,:,:,NSV_LIMA_CCN_FREE+JSV-1) = 0.01*1.0E6 / PRHODREF(:,:,:) - ENDWHERE - END DO - ENDIF -END IF ! LWARM AND LACTI -! -! Initialisation des concentrations en IFN -! -IF ( NMOM_I.GE.2 .AND. LNUCL .AND. (.NOT. LMEYERS) ) THEN - DO JSV = NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL+NMOD_IFN-1 - PSVT(:,:,:,JSV) = 0.0 - ENDDO - IKB = 1+JPVEXT - IKE = SIZE(PSVT,3)-JPVEXT -! - IF (LIFN_HOM) THEN -! concentration homogène (en nombre par m3) sur la verticale - DO JSV = 1, NMOD_IFN - PSVT(:,:,IKB:IKE,NSV_LIMA_IFN_FREE+JSV-1) = & - XIFN_CONC(JSV)*1.0E3 / PRHODREF(:,:,IKB:IKE) - END DO - ELSE -! concentration décroissante selon z - DO JSV = 1, NMOD_IFN - WHERE (PZZ(:,:,:) .LE. 1000.) - PSVT(:,:,:,NSV_LIMA_IFN_FREE+JSV-1) = XIFN_CONC(JSV)*1.0E3 / PRHODREF(:,:,:) - ELSEWHERE (PZZ(:,:,:) .LE. 10000.) - PSVT(:,:,:,NSV_LIMA_IFN_FREE+JSV-1) = XIFN_CONC(JSV)*1.0E3 & - / PRHODREF(:,:,:) * EXP(-LOG(XIFN_CONC(JSV)/1.)*PZZ(:,:,:)/10000.) - ELSEWHERE - PSVT(:,:,:,NSV_LIMA_IFN_FREE+JSV-1) = 1*1.0E3 / PRHODREF(:,:,:) - ENDWHERE - END DO - ENDIF -END IF ! LCOLD AND LNUCL AND NOT LMEYERS -! -! -! Cas d'un panache de "pollution", concentration homogène dans le panache : -! -SELECT CASE (CDUMMY2) - CASE ('CCN') - PSVT(:,:,:,NSV_LIMA_CCN_FREE+NMOD_CCN-1)=0. - WHERE ( (PZZ(:,:,:) .GE. NDUMMY1) .AND. (PZZ(:,:,:) .LE. NDUMMY2) ) & - PSVT(:,:,:,NSV_LIMA_CCN_FREE+NMOD_CCN-1)=XDUMMY8*1.0E6 / PRHODREF(:,:,:) - CASE ('IFN') - PSVT(:,:,:,NSV_LIMA_IFN_FREE+NMOD_IFN-1)=0. - WHERE ( (PZZ(:,:,:) .GE. NDUMMY1) .AND. (PZZ(:,:,:) .LE. NDUMMY2) ) & - PSVT(:,:,:,NSV_LIMA_IFN_FREE+NMOD_IFN-1)=XDUMMY8*1.0E3 / PRHODREF(:,:,:) -END SELECT -! -! -END SUBROUTINE INIT_AEROSOL_CONCENTRATION diff --git a/src/mesonh/ext/modeln.f90 b/src/mesonh/ext/modeln.f90 deleted file mode 100644 index b5ab33489..000000000 --- a/src/mesonh/ext/modeln.f90 +++ /dev/null @@ -1,2414 +0,0 @@ -!MNH_LIC Copyright 1994-2023 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_MODEL_n -! ################### -! -INTERFACE -! - SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_TYPE_DATE, ONLY: DATE_TIME -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file -TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation -LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop -! -END SUBROUTINE MODEL_n -! -END INTERFACE -! -END MODULE MODI_MODEL_n - -! ################################### - SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) -! ################################### -! -!!**** *MODEL_n * -monitor of the model version _n -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to build up a typical model version -! by sequentially calling the specialized routines. -! -!!** METHOD -!! ------ -!! Some preliminary initializations are performed in the first section. -!! Then, specialized routines are called to update the guess of the future -!! instant XRxxS of the variable xx by adding the effects of all the -!! different sources of evolution. -!! -!! (guess of xx at t+dt) * Rhod_ref * Jacobian -!! XRxxS = ------------------------------------------- -!! 2 dt -!! -!! At this level, the informations are transferred with a USE association -!! from the INIT step, where the modules have been previously filled. The -!! transfer to the subroutines computing each source term is performed by -!! argument in order to avoid repeated compilations of these subroutines. -!! This monitor model_n, must therefore be duplicated for each model, -!! model1 corresponds in this case to the outermost model, model2 is used -!! for the first level of gridnesting,.... -!! The effect of all parameterizations is computed in PHYS_PARAM_n, which -!! is itself a monitor. This is due to a possible large number of -!! parameterizations, which can be activated and therefore, will require a -!! very large list of arguments. To circumvent this problem, we transfer by -!! a USE association, the necessary informations in this monitor, which will -!! dispatch the pertinent information to every parametrization. -!! Some elaborated diagnostics, LES tools, budget storages are also called -!! at this level because they require informations about the fields at every -!! timestep. -!! -!! -!! EXTERNAL -!! -------- -!! Subroutine IO_File_open: to open a file -!! Subroutine WRITE_DESFM: to write the descriptive part of a FMfile -!! Subroutine WRITE_LFIFM: to write the binary part of a FMfile -!! Subroutine SET_MASK : to compute all the masks selected for budget -!! computations -!! Subroutine BOUNDARIES : set the fields at the marginal points in every -!! directions according the selected boundary conditions -!! Subroutine INITIAL_GUESS: initializes the guess of the future instant -!! Subroutine LES_FLX_SPECTRA: computes the resolved fluxes and the -!! spectra of some quantities when running in LES mode. -!! Subroutine ADVECTION: computes the advection terms. -!! Subroutine DYN_SOURCES: computes the curvature, Coriolis, gravity terms. -!! Subroutine NUM_DIFF: applies the fourth order numerical diffusion. -!! Subroutine RELAXATION: performs the relaxation to Larger Scale fields -!! in the upper levels and outermost vertical planes -!! Subroutine PHYS_PARAM_n : computes the parameterized physical terms -!! Subroutine RAD_BOUND: prepares the velocity normal components for the bc. -!! Subroutine RESOLVED_CLOUD : computes the sources terms for water in any -!! form -!! Subroutine PRESSURE : computes the pressure gradient term and the -!! absolute pressure -!! Subroutine EXCHANGE : updates the halo of each subdomains -!! Subroutine ENDSTEP : advances in time the fields. -!! Subroutines UVW_LS_COUPLING and SCALAR_LS_COUPLING: -!! compute the large scale fields, used to -!! couple Model_n with outer informations. -!! Subroutine ENDSTEP_BUDGET: writes the budget informations. -!! Subroutine IO_File_close: closes a file -!! Subroutine DATETIME_CORRECTDATE: transform the current time in GMT -!! Subroutine FORCING : computes forcing terms -!! Subroutine ADD3DFIELD_ll : add a field to 3D-list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_DYN -!! MODD_CONF -!! MODD_NESTING -!! MODD_BUDGET -!! MODD_PARAMETERS -!! MODD_CONF_n -!! MODD_CURVCOR_n -!! MODD_DYN_n -!! MODD_DIM_n -!! MODD_ADV_n -!! MODD_FIELD_n -!! MODD_LSFIELD_n -!! MODD_GRID_n -!! MODD_METRICS_n -!! MODD_LBC_n -!! MODD_PARAM_n -!! MODD_REF_n -!! MODD_LUNIT_n -!! MODD_OUT_n -!! MODD_TIME_n -!! MODD_TURB_n -!! MODD_CLOUDPAR_n -!! MODD_TIME -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * LA * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/09/94 -!! Modification 20/10/94 (J.Stein) for the outputs and abs_layers routines -!! Modification 10/11/94 (J.Stein) change ABS_LAYER_FIELDS call -!! Modification 16/11/94 (J.Stein) add call to the renormalization -!! Modification 17/11/94 (J.-P. Lafore and J.-P. Pinty) call NUM_DIFF -!! Modification 08/12/94 (J.Stein) cleaning + remove (RENORM + ABS_LAYER.. -!! ..) + add RELAXATION + LS fiels in the arguments -!! Modification 19/12/94 (J.Stein) switch for the num diff -!! Modification 22/12/94 (J.Stein) update tdtcur + change dyn_source call -!! Modification 05/01/95 (J.Stein) add the parameterization monitor -!! Modification 09/01/95 (J.Stein) add the 1D switch -!! Modification 10/01/95 (J.Stein) displace the TDTCUR computation -!! Modification 03/01/95 (J.-P. Lafore) Absolute pressure diagnosis -!! Modification Jan 19, 1995 (J. Cuxart) Shunt the DYN_SOURCES in 1D cases. -!! Modification Jan 24, 1995 (J. Stein) Interchange Boundaries and -!! Initial_guess to correct a bug in 2D configuration -!! Modification Feb 02, 1995 (I.Mallet) update BOUNDARIES and RAD_BOUND -!! calls -!! Modification Mar 10, 1995 (I.Mallet) add call to SET_COUPLING -!! March,21, 1995 (J. Stein) remove R from the historical var. -!! March,26, 1995 (J. Stein) add the EPS variable -!! April 18, 1995 (J. Cuxart) add the LES call -!! Sept 20,1995 (Lafore) coupling for the dry mass Md -!! Nov 2,1995 (Stein) displace the temporal counter increase -!! Jan 2,1996 (Stein) rm the test on the temporal counter -!! Modification Feb 5,1996 (J. Vila) implementation new advection -!! schemes for scalars -!! Modification Feb 20,1996 (J.Stein) doctor norm -!! Dec95 - Jul96 (Georgelin, Pinty, Mari, Suhre) FORCING -!! June 17,1996 (Vincent, Lafore, Jabouille) -!! statistics of computing time -!! Aug 8, 1996 (K. Suhre) add chemistry -!! October 12, 1996 (J. Stein) save the PSRC value -!! Sept 05,1996 (V.Masson) print of loop index for debugging -!! purposes -!! July 22,1996 (Lafore) improve write of computing time statistics -!! July 29,1996 (Lafore) nesting introduction -!! Aug. 1,1996 (Lafore) synchronization between models -!! Sept. 4,1996 (Lafore) modification of call to routine SET_COUPLING -!! now split in 2 routines -!! (UVW_LS_COUPLING and SCALAR_LS_COUPLING) -!! Sept 5,1996 (V.Masson) print of loop index for debugging -!! purposes -!! Sept 25,1996 (V.Masson) test for coupling performed here -!! Oct. 29,1996 (Lafore) one-way nesting implementation -!! Oct. 12,1996 (J. Stein) save the PSRC value -!! Dec. 12,1996 (Lafore) change call to RAD_BOUND -!! Dec. 21,1996 (Lafore) two-way nesting implementation -!! Mar. 12,1997 (Lafore) introduction of "surfacic" LS fields -!! Nov 18, 1996 (J.-P. Pinty) FORCING revisited (translation) -!! Dec 04, 1996 (J.-P. Pinty) include mixed-phase clouds -!! Dec 20, 1996 (J.-P. Pinty) update the budgets -!! Dec 23, 1996 (J.-P. Pinty) add the diachronic file control -!! Jan 11, 1997 (J.-P. Pinty) add the deep convection control -!! Dec 20,1996 (V.Masson) call boundaries before the writing -!! Fev 25, 1997 (P.Jabouille) modify the LES tools -!! April 3,1997 (Lafore) merging of the nesting -!! developments on MASTER3 -!! Jul. 8,1997 (Lafore) print control for nesting (NVERB>=7) -!! Jul. 28,1997 (Masson) supress LSTEADY_DMASS -!! Aug. 19,1997 (Lafore) full Clark's formulation introduction -!! Sept 26,1997 (Lafore) LS source calculation at restart -!! (temporarily test to have LS at instant t) -!! Jan. 28,1998 (Bechtold) add SST forcing -!! fev. 10,1998 (Lafore) RHODJ computation and storage for budget -!! Jul. 10,1998 (Stein ) sequentiel loop for nesting -!! Apr. 07,1999 (Stein ) cleaning of the nesting subroutines -!! oct. 20,1998 (Jabouille) // -!! oct. 20,2000 (J.-P. Pinty) add the C2R2 scheme -!! fev. 01,2001 (D.Gazen) add module MODD_NSV for NSV variables -!! mar, 4,2002 (V.Ducrocq) call to temporal series -!! mar, 8, 2001 (V. Masson) advection of perturbation of theta in neutral cases. -!! Nov, 6, 2002 (V. Masson) time counters for budgets & LES -!! mars 20,2001 (Pinty) add ICE4 and C3R5 options -!! jan. 2004 (Masson) surface externalization -!! sept 2004 (M. Tomasini) Cloud mixing length modification -!! june 2005 (P. Tulet) add aerosols / dusts -!! Jul. 2005 (N. Asencio) two_way and phys_param calls: -!! Add the surface parameters : precipitating -!! hydrometeors, Short and Long Wave , MASKkids array -!! Fev. 2006 (M. Leriche) add aqueous phase chemistry -!! april 2006 (T.Maric) Add halo related to 4th order advection scheme -!! May 2006 Remove KEPS -!! Oct 2008 (C.Lac) FIT for variables advected with PPM -!! July 2009 : Displacement of surface diagnostics call to be -!! coherent with surface diagnostics obtained with DIAG -!! 10/11/2009 (P. Aumond) Add mean moments -!! Nov, 12, 2009 (C. Barthe) add cloud electrification and lightning flashes -!! July 2010 (M. Leriche) add ice phase chemical species -!! April 2011 (C.Lac) : Remove instant M -!! April 2011 (C.Lac, V.Masson) : Time splitting for advection -!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test -!! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface -!! Dec 2014 (C.Lac) : For reproducibility START/RESTA -!! J.Escobar 20/04/2015: missing UPDATE_HALO before UPDATE_HALO2 -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! C.Lac 11/09/2015: correction of the budget due to FIT temporal scheme -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Sep 2015 (S. Bielli) : Remove YDADFILE from argument call -! of write_phys_param -!! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files -!! M.Mazoyer : 04/2016 DTHRAD used for radiative cooling when LACTIT -!!! Modification 01/2016 (JP Pinty) Add LIMA -!! 06/2016 (G.Delautier) phasage surfex 8 -!! M.Leriche : 03/2016 Move computation of accumulated chem. in rain to ch_monitor -!! 09/2016 Add filter on negative values on AERDEP SV before relaxation -!! 10/2016 (C.Lac) _ Correction on the flag for Strang splitting -!! to insure reproducibility between START and RESTA -!! _ Add OSPLIT_WENO -!! _ Add droplet deposition -!! 10/2016 (M.Mazoyer) New KHKO output fields -!! P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! 10/2017 (C.Lac) Necessity to have chemistry processes as -!! the las process modifying XRSVS -!! 01/2018 (G.Delautier) SURFEX 8.1 -!! 03/2018 (P.Wautelet) replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 07/2017 (V. Vionnet) : Add blowing snow scheme -!! S. Riette : 11/2016 Add ZPABST to keep pressure constant during timestep -!! 01/2018 (C.Lac) Add VISCOSITY -!! Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll -! to allow to disable writes (for bench purposes) -! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines -! (nsubfiles_ioz is now determined in IO_File_add2list) -!! 02/2019 C.Lac add rain fraction as an output field -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! J. Escobar 09/07/2019: norme Doctor -> Rename Module Type variable TZ -> T -! J. Escobar 09/07/2019: for bug in management of XLSZWSM variable, add/use specific 2D TLSFIELD2D_ll pointer -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! J. Escobar 27/09/2019: add missing report timing of RESOLVED_ELEC -! P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets -! P. Wautelet 12/10/2020: Write_les_n: remove HLES_AVG dummy argument and group all 4 calls -! F. Auguste 01/02/2021: add IBM -! T. Nagel 01/02/2021: add turbulence recycling -! P. Wautelet 19/02/2021: add NEGA2 term for SV budgets -! J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version) -! A. Costes 12/2021: add Blaze fire model -! C. Barthe 07/04/2022: deallocation of ZSEA -! P. Wautelet 08/12/2022: bugfix if no TDADFILE -! P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n -! (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n) -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_2D_FRC -USE MODD_ADV_n -USE MODD_AIRCRAFT_BALLOON -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_BAKOUT -USE MODD_BIKHARDT_n -USE MODD_BLANK_n -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -use modd_budget, only: cbutype, lbu_ru, lbu_rv, lbu_rw, lbudget_u, lbudget_v, lbudget_w, lbudget_sv, lbu_enable, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_SV1, nbumod, nbutime, & - tbudgets, tbuconf, tburhodj, & - xtime_bu, xtime_bu_process -USE MODD_CH_AERO_n, ONLY: XSOLORG, XMI -USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX,LUSECHAQ,LUSECHIC, & - LCH_INIT_FIELD -USE MODD_CLOUD_MF_n -USE MODD_CLOUDPAR_n -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST, ONLY: CST -USE MODD_CURVCOR_n -USE MODD_DEEP_CONVECTION_n -USE MODD_DIM_n -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_DRAG_n -USE MODD_DUST, ONLY: LDUST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_DYNZD -USE MODD_DYNZD_n -USE MODD_ELEC_DESCR -USE MODD_EOL_MAIN -USE MODD_FIELD_n -USE MODD_FRC -USE MODD_FRC_n -USE MODD_GET_n -USE MODD_GRID, ONLY: XLONORI,XLATORI -USE MODD_GRID_n -USE MODD_IBM_PARAM_n, ONLY: CIBM_ADV, LIBM, LIBM_TROUBLE, XIBM_LS -USE MODD_ICE_C1R3_DESCR, ONLY: XRTMIN_C1R3=>XRTMIN -USE MODD_IO, ONLY: LIO_NO_WRITE, TFILEDATA, TFILE_SURFEX, TFILE_DUMMY -USE MODD_LBC_n -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_LIMA_PRECIP_SCAVENGING_n -USE MODD_LSFIELD_n -USE MODD_LUNIT, ONLY: TOUTDATAFILE -USE MODD_LUNIT_n, ONLY: TDIAFILE,TINIFILE,TINIFILEPGD,TLUOUT -USE MODD_MEAN_FIELD -USE MODD_MEAN_FIELD_n -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING -USE MODD_NSV -USE MODD_NUDGING_n -USE MODD_OUT_n -USE MODD_PARAM_C1R3, ONLY: NSEDI => LSEDI, NHHONI => LHHONI -USE MODD_PARAM_C2R2, ONLY: NSEDC => LSEDC, NRAIN => LRAIN, NACTIT => LACTIT,LACTTKE,LDEPOC -USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC -USE MODD_PARAM_LIMA, ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, & - MACTIT => LACTIT, LSCAV, NMOM_I, & - MSEDI => LSEDI, MHHONI => LHHONI, NMOM_H, & - XRTMIN_LIMA=>XRTMIN, MACTTKE=>LACTTKE -USE MODD_PARAM_MFSHALL_n -USE MODD_PARAM_n -USE MODD_PAST_FIELD_n -USE MODD_PRECIP_n -use modd_precision, only: MNHTIME -USE MODD_PROFILER_n -USE MODD_RADIATIONS_n, ONLY: XTSRAD,XSCAFLASWD,XDIRFLASWD,XDIRSRFSWD, XAER, XDTHRAD -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL -USE MODD_REF, ONLY: LCOUPLES -USE MODD_REF_n -USE MODD_SALT, ONLY: LSALT -USE MODD_SERIES, ONLY: LSERIES -USE MODD_SERIES_n, ONLY: NFREQSERIES -USE MODD_STATION_n -USE MODD_SUB_MODEL_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_TIMEZ -USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI -USE MODD_TURB_n -USE MODD_TYPE_DATE, ONLY: DATE_TIME -USE MODD_VISCOSITY -! -USE MODE_AIRCRAFT_BALLOON -use mode_budget, only: Budget_store_init, Budget_store_end -USE MODE_DATETIME -USE MODE_ELEC_ll -USE MODE_GRIDCART -USE MODE_GRIDPROJ -USE MODE_IO_FIELD_WRITE, only: IO_Field_user_write, IO_Fieldlist_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -#ifdef MNH_IOLFI -use mode_menu_diachro, only: MENU_DIACHRO -#endif -USE MODE_MNH_TIMING -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_MSG -USE MODE_ONE_WAY_n -USE MODE_WRITE_AIRCRAFT_BALLOON -use mode_write_les_n, only: Write_les_n -use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n -USE MODE_WRITE_PROFILER_n, ONLY: WRITE_PROFILER_n -USE MODE_WRITE_STATION_n, ONLY: WRITE_STATION_n -! -USE MODI_ADDFLUCTUATIONS -USE MODI_ADVECTION_METSV -USE MODI_ADVECTION_UVW -USE MODI_ADVECTION_UVW_CEN -USE MODI_ADV_FORCING_n -USE MODI_AER_MONITOR_n -USE MODI_BLOWSNOW -USE MODI_BOUNDARIES -USE MODI_BUDGET_FLAGS -USE MODI_CART_COMPRESS -USE MODI_CH_MONITOR_n -USE MODI_DIAG_SURF_ATM_N -USE MODI_DYN_SOURCES -USE MODI_END_DIAG_IN_RUN -USE MODI_ENDSTEP -USE MODI_ENDSTEP_BUDGET -USE MODI_EXCHANGE -USE MODI_FORCING -USE MODI_FORC_SQUALL_LINE -USE MODI_FORC_WIND -USE MODI_GET_HALO -USE MODI_GRAVITY_IMPL -USE MODI_IBM_INIT -USE MODI_IBM_FORCING -USE MODI_IBM_FORCING_TR -USE MODI_IBM_FORCING_ADV -USE MODI_INI_DIAG_IN_RUN -USE MODI_INI_LG -USE MODI_INI_MEAN_FIELD -USE MODI_INITIAL_GUESS -USE MODI_LES_INI_TIMESTEP_n -USE MODI_LES_N -USE MODI_LIMA_PRECIP_SCAVENGING -USE MODI_LS_COUPLING -USE MODI_MASK_COMPRESS -USE MODI_MEAN_FIELD -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_MNHWRITE_ZS_DUMMY_n -USE MODI_NUDGING -USE MODI_NUM_DIFF -USE MODI_PHYS_PARAM_n -USE MODI_PRESSUREZ -USE MODI_PROFILER_n -USE MODI_RAD_BOUND -USE MODI_RECYCLING -USE MODI_RELAX2FW_ION -USE MODI_RELAXATION -USE MODI_REL_FORCING_n -USE MODI_RESOLVED_CLOUD -USE MODI_RESOLVED_ELEC_n -USE MODI_SERIES_N -USE MODI_SETLB_LG -USE MODI_SET_MASK -USE MODI_SHUMAN -USE MODI_SPAWN_LS_n -USE MODI_STATION_n -USE MODI_TURB_CLOUD_INDEX -USE MODI_TWO_WAY -USE MODI_UPDATE_NSV -USE MODI_VISCOSITY -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_DIAG_SURF_ATM_N -USE MODI_WRITE_LFIFM_n -USE MODI_WRITE_SERIES_n -USE MODI_WRITE_SURF_ATM_N -! -USE MODD_FIRE_n -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file -TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation -LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop -! -!* 0.2 declarations of local variables -! -INTEGER :: ILUOUT ! Logical unit number for the output listing -INTEGER :: IIU,IJU,IKU ! array size in first, second and third dimensions -INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain -INTEGER :: JSV,JRR ! Loop index for scalar and moist variables -INTEGER :: INBVAR ! number of HALO2_lls to allocate -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: IVERB ! LFI verbosity level -LOGICAL :: GSTEADY_DMASS ! conditional call to mass computation -! - ! for computing time analysis -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME, ZTIME1, ZTIME2, ZEND, ZTOT, ZALL, ZTOT_PT, ZBLAZETOT -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_STEP,ZTIME_STEP_PTS -CHARACTER :: YMI -INTEGER :: IPOINTS -CHARACTER(len=16) :: YTCOUNT,YPOINTS -CHARACTER(LEN=:), ALLOCATABLE :: YDADNAME -! -INTEGER :: ISYNCHRO ! model synchronic index relative to its father - ! = 1 for the first time step in phase with DAD - ! = 0 for the last time step (out of phase) -INTEGER :: IMI ! Current model index -REAL, DIMENSION(:,:),ALLOCATABLE :: ZSEA -REAL, DIMENSION(:,:),ALLOCATABLE :: ZTOWN -! Dummy pointers needed to correct an ifort Bug -REAL, DIMENSION(:), POINTER :: DPTR_XZHAT -REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4 -CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS -REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWS,DPTR_XLBYWS,DPTR_XLBXTHS,DPTR_XLBYTHS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKES,DPTR_XLBYTKES -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS -! -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRHODJ,DPTR_XUM,DPTR_XVM,DPTR_XWM,DPTR_XTHM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XTKEM,DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRTKES,DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XRM,DPTR_XSVM,DPTR_XRRS,DPTR_XRSVS -REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG -REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV -LOGICAL, DIMENSION(:,:),POINTER :: DPTR_GMASKkids -! -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDC -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDR -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDS -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDG -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDH -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRC3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRS3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRG3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRH3D -! -LOGICAL :: KWARM -LOGICAL :: KRAIN -LOGICAL :: KSEDC -LOGICAL :: KACTIT -LOGICAL :: KSEDI -LOGICAL :: KHHONI -! -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZRUS,ZRVS,ZRWS -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPABST !To give pressure at t - ! (and not t+1) to resolved_cloud -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZJ -! -TYPE(LIST_ll), POINTER :: TZFIELDC_ll ! list of fields to exchange -TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange -LOGICAL :: GCLD ! conditionnal call for dust wet deposition -LOGICAL :: GCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns -REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) :: ZWETDEPAER -! -TYPE(TFILEDATA),POINTER :: TZOUTFILE -! TYPE(TFILEDATA),SAVE :: TZDIACFILE -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -!------------------------------------------------------------------------------- -! -TPBAKFILE=> NULL() -TZOUTFILE=> NULL() -! -TPDTMODELN = TDTCUR -! -!* 0. MICROPHYSICAL SCHEME -! ------------------- -SELECT CASE(CCLOUD) -CASE('C2R2','KHKO','C3R5') - KWARM = .TRUE. - KRAIN = NRAIN - KSEDC = NSEDC - KACTIT = NACTIT -! - KSEDI = NSEDI - KHHONI = NHHONI -CASE('LIMA') - KRAIN = NMOM_R.GE.1 - KWARM = NMOM_C.GE.1 - KSEDC = MSEDC - KACTIT = MACTIT -! - KSEDI = MSEDI - KHHONI = MHHONI -CASE('ICE3','ICE4') !default values - KWARM = LWARM - KRAIN = .TRUE. - KSEDC = .TRUE. - KACTIT = .FALSE. -! - KSEDI = .TRUE. - KHHONI = .FALSE. -END SELECT -! -! -!* 1 PRELIMINARY -! ------------ -IMI = GET_CURRENT_MODEL_INDEX() -! -!* 1.0 update NSV_* variables for current model -! ---------------------------------------- -! -CALL UPDATE_NSV(IMI) -! -!* 1.1 RECOVER THE LOGICAL UNIT NUMBER FOR THE OUTPUT PRINTS -! -ILUOUT = TLUOUT%NLU -! -!* 1.2 SET ARRAY SIZE -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -IKU=NKMAX+2*JPVEXT -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IF (IMI==1) THEN - GSTEADY_DMASS=LSTEADYLS -ELSE - GSTEADY_DMASS=.FALSE. -END IF -! -!* 1.3 OPEN THE DIACHRONIC FILE -! -IF (KTCOUNT == 1) THEN -! - NULLIFY(TFIELDS_ll,TLSFIELD_ll,TFIELDT_ll) - NULLIFY(TLSFIELD2D_ll) - NULLIFY(THALO2T_ll) - NULLIFY(TLSHALO2_ll) - NULLIFY(TFIELDSC_ll) -! - ALLOCATE(XWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) - ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2))) -! - IF ( .NOT. LIO_NO_WRITE ) THEN - CALL IO_File_open(TDIAFILE) -! - CALL IO_Header_write(TDIAFILE) - CALL WRITE_DESFM_n(IMI,TDIAFILE) - CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE) - END IF -! -!* 1.4 Initialization of the list of fields for the halo updates -! -! a) Sources terms -! - CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS, 'MODEL_n::XRUS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS, 'MODEL_n::XRVS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS, 'MODEL_n::XRWS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS, 'MODEL_n::XRTHS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS_PRES, 'MODEL_n::XRUS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS_PRES, 'MODEL_n::XRVS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS_PRES, 'MODEL_n::XRWS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS_CLD, 'MODEL_n::XRTHS_CLD' ) - IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XRTKES, 'MODEL_n::XRTKES' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS (:,:,:,1:NRR), 'MODEL_n::XRRS' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS_CLD (:,:,:,1:NRR), 'MODEL_n::XRRS_CLD' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS (:,:,:,1:NSV), 'MODEL_n::XRSVS') - CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS_CLD(:,:,:,1:NSV), 'MODEL_n::XRSVS_CLD') - IF (SIZE(XSRCT,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XSRCT, 'MODEL_n::XSRCT' ) - ! Fire model parallel setup - IF (LBLAZE) THEN - CALL ADD3DFIELD_ll( TFIELDS_ll, XLSPHI, 'MODEL_n::XLSPHI') - CALL ADD3DFIELD_ll( TFIELDS_ll, XBMAP, 'MODEL_n::XBMAP') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMRFA, 'MODEL_n::XFMRFA') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWF0, 'MODEL_n::XFMWF0') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR0, 'MODEL_n::XFMR0') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR00, 'MODEL_n::XFMR00') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMIGNITION, 'MODEL_n::XFMIGNITION') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFUELTYPE, 'MODEL_n::XFMFUELTYPE') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRETAU, 'MODEL_n::XFIRETAU') - CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMH(:,:,:,1:SIZE(XFLUXPARAMH,4)), 'MODEL_n::XFLUXPARAMH') - CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMW(:,:,:,1:SIZE(XFLUXPARAMW,4)), 'MODEL_n::XFLUXPARAMW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRERW, 'MODEL_n::XFIRERW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMASE, 'MODEL_n::XFMASE') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMAWC, 'MODEL_n::XFMAWC') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWALKIG, 'MODEL_n::XFMWALKIG') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDH, 'MODEL_n::XFMFLUXHDH') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDW, 'MODEL_n::XFMFLUXHDW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMHWS, 'MODEL_n::XFMHWS') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDU, 'MODEL_n::XFMWINDU') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDV, 'MODEL_n::XFMWINDV') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDW, 'MODEL_n::XFMWINDW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROX, 'MODEL_n::XFMGRADOROX') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROY, 'MODEL_n::XFMGRADOROY') - END IF - ! - IF ((LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN - ! - ! b) LS fields - ! - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSUM, 'MODEL_n::XLSUM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSVM, 'MODEL_n::XLSVM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSWM, 'MODEL_n::XLSWM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSTHM, 'MODEL_n::XLSTHM' ) - CALL ADD2DFIELD_ll( TLSFIELD2D_ll, XLSZWSM, 'MODEL_n::XLSZWSM' ) - IF (NRR >= 1) THEN - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSRVM, 'MODEL_n::XLSRVM' ) - ENDIF - ! - ! c) Fields at t - ! - CALL ADD3DFIELD_ll( TFIELDT_ll, XUT, 'MODEL_n::XUT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XVT, 'MODEL_n::XVT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XWT, 'MODEL_n::XWT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XTHT, 'MODEL_n::XTHT' ) - IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDT_ll, XTKET, 'MODEL_n::XTKET' ) - CALL ADD4DFIELD_ll(TFIELDT_ll, XRT (:,:,:,1:NRR), 'MODEL_n::XSV' ) - CALL ADD4DFIELD_ll(TFIELDT_ll, XSVT(:,:,:,1:NSV), 'MODEL_n::XSVT' ) - ! - !* 1.5 Initialize the list of fields for the halo updates (2nd layer) - ! - INBVAR = 4+NRR+NSV - IF (SIZE(XRTKES,1) /= 0) INBVAR=INBVAR+1 - CALL INIT_HALO2_ll(THALO2T_ll,INBVAR,IIU,IJU,IKU) - CALL INIT_HALO2_ll(TLSHALO2_ll,4+MIN(1,NRR),IIU,IJU,IKU) - ! - !* 1.6 Initialise the 2nd layer of the halo of the LS fields - ! - IF ( LSTEADYLS ) THEN - CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll) - CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll) - END IF - END IF - ! -! - ! - XT_START = 0.0_MNHTIME - ! - XT_STORE = 0.0_MNHTIME - XT_BOUND = 0.0_MNHTIME - XT_GUESS = 0.0_MNHTIME - XT_FORCING = 0.0_MNHTIME - XT_NUDGING = 0.0_MNHTIME - XT_ADV = 0.0_MNHTIME - XT_ADVUVW = 0.0_MNHTIME - XT_GRAV = 0.0_MNHTIME - XT_SOURCES = 0.0_MNHTIME - ! - XT_DIFF = 0.0_MNHTIME - XT_RELAX = 0.0_MNHTIME - XT_PARAM = 0.0_MNHTIME - XT_SPECTRA = 0.0_MNHTIME - XT_HALO = 0.0_MNHTIME - XT_VISC = 0.0_MNHTIME - XT_RAD_BOUND = 0.0_MNHTIME - XT_PRESS = 0.0_MNHTIME - ! - XT_CLOUD = 0.0_MNHTIME - XT_STEP_SWA = 0.0_MNHTIME - XT_STEP_MISC = 0.0_MNHTIME - XT_COUPL = 0.0_MNHTIME - XT_1WAY = 0.0_MNHTIME - XT_STEP_BUD = 0.0_MNHTIME - ! - XT_RAD = 0.0_MNHTIME - XT_DCONV = 0.0_MNHTIME - XT_GROUND = 0.0_MNHTIME - XT_TURB = 0.0_MNHTIME - XT_MAFL = 0.0_MNHTIME - XT_DRAG = 0.0_MNHTIME - XT_EOL = 0.0_MNHTIME - XT_TRACER = 0.0_MNHTIME - XT_SHADOWS = 0.0_MNHTIME - XT_ELEC = 0.0_MNHTIME - XT_CHEM = 0.0_MNHTIME - XT_2WAY = 0.0_MNHTIME - ! - XT_IBM_FORC = 0.0_MNHTIME - ! Blaze fire model - XFIREPERF = 0.0_MNHTIME - ! -END IF -! -!* 1.7 Allocation of arrays for observation diagnostics -! -CALL INI_DIAG_IN_RUN(IIU,IJU,IKU,LFLYER,LSTATION,LPROFILER) -! -! -CALL SECOND_MNH2(ZEND) -! -!------------------------------------------------------------------------------- -! -!* 2. ONE-WAY NESTING AND LARGE SCALE FIELD REFRESH -! --------------------------------------------- -! -! -CALL SECOND_MNH2(ZTIME1) -! -ISYNCHRO = MODULO (KTCOUNT, NDTRATIO(IMI) ) ! test of synchronisation -! -! -IF (LCOUPLES.AND.LOCEAN) THEN - CALL NHOA_COUPL_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT,IKU) -END IF -! No Gridnest in coupled OA LES for now -IF (.NOT. LCOUPLES .AND. IMI/=1 .AND. NDAD(IMI)/=IMI .AND. (ISYNCHRO==1 .OR. NDTRATIO(IMI) == 1) ) THEN -! -! Use dummy pointers to correct an ifort BUG - DPTR_XBMX1=>XBMX1 - DPTR_XBMX2=>XBMX2 - DPTR_XBMX3=>XBMX3 - DPTR_XBMX4=>XBMX4 - DPTR_XBMY1=>XBMY1 - DPTR_XBMY2=>XBMY2 - DPTR_XBMY3=>XBMY3 - DPTR_XBMY4=>XBMY4 - DPTR_XBFX1=>XBFX1 - DPTR_XBFX2=>XBFX2 - DPTR_XBFX3=>XBFX3 - DPTR_XBFX4=>XBFX4 - DPTR_XBFY1=>XBFY1 - DPTR_XBFY2=>XBFY2 - DPTR_XBFY3=>XBFY3 - DPTR_XBFY4=>XBFY4 - DPTR_CLBCX=>CLBCX - DPTR_CLBCY=>CLBCY - ! - DPTR_XZZ=>XZZ - DPTR_XZHAT=>XZHAT - DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM - DPTR_XLSTHM=>XLSTHM - DPTR_XLSRVM=>XLSRVM - DPTR_XLSUM=>XLSUM - DPTR_XLSVM=>XLSVM - DPTR_XLSWM=>XLSWM - DPTR_XLSZWSM=>XLSZWSM - DPTR_XLSTHS=>XLSTHS - DPTR_XLSRVS=>XLSRVS - DPTR_XLSUS=>XLSUS - DPTR_XLSVS=>XLSVS - DPTR_XLSWS=>XLSWS - DPTR_XLSZWSS=>XLSZWSS - ! - IF ( LSTEADYLS ) THEN - NCPL_CUR=0 - ELSE - IF (NCPL_CUR/=1) THEN - IF ( KTCOUNT+1 == NCPL_TIMES(NCPL_CUR-1,IMI) ) THEN - ! - ! LS sources are interpolated from the LS field - ! values of model DAD(IMI) - CALL SPAWN_LS_n(NDAD(IMI),XTSTEP,IMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI), & - DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,LSLEVE,XLEN1,XLEN2,DPTR_XCOEFLIN_LBXM, & - DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSZWSM, & - DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS, DPTR_XLSZWSS ) - END IF - END IF - ! - END IF - ! - DPTR_NKLIN_LBXU=>NKLIN_LBXU - DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU - DPTR_NKLIN_LBYU=>NKLIN_LBYU - DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU - DPTR_NKLIN_LBXV=>NKLIN_LBXV - DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV - DPTR_NKLIN_LBYV=>NKLIN_LBYV - DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV - DPTR_NKLIN_LBXW=>NKLIN_LBXW - DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW - DPTR_NKLIN_LBYW=>NKLIN_LBYW - DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW - ! - DPTR_NKLIN_LBXM=>NKLIN_LBXM - DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM - DPTR_NKLIN_LBYM=>NKLIN_LBYM - DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM - ! - DPTR_XLBXUM=>XLBXUM - DPTR_XLBYUM=>XLBYUM - DPTR_XLBXVM=>XLBXVM - DPTR_XLBYVM=>XLBYVM - DPTR_XLBXWM=>XLBXWM - DPTR_XLBYWM=>XLBYWM - DPTR_XLBXTHM=>XLBXTHM - DPTR_XLBYTHM=>XLBYTHM - DPTR_XLBXTKEM=>XLBXTKEM - DPTR_XLBYTKEM=>XLBYTKEM - DPTR_XLBXRM=>XLBXRM - DPTR_XLBYRM=>XLBYRM - DPTR_XLBXSVM=>XLBXSVM - DPTR_XLBYSVM=>XLBYSVM - ! - DPTR_XLBXUS=>XLBXUS - DPTR_XLBYUS=>XLBYUS - DPTR_XLBXVS=>XLBXVS - DPTR_XLBYVS=>XLBYVS - DPTR_XLBXWS=>XLBXWS - DPTR_XLBYWS=>XLBYWS - DPTR_XLBXTHS=>XLBXTHS - DPTR_XLBYTHS=>XLBYTHS - DPTR_XLBXTKES=>XLBXTKES - DPTR_XLBYTKES=>XLBYTKES - DPTR_XLBXRS=>XLBXRS - DPTR_XLBYRS=>XLBYRS - DPTR_XLBXSVS=>XLBXSVS - DPTR_XLBYSVS=>XLBYSVS - ! - CALL ONE_WAY_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),NDTRATIO(IMI), & - DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & - GSTEADY_DMASS,CCLOUD,LUSECHAQ,LUSECHIC, & - DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & - DPTR_XLBXTHM,DPTR_XLBYTHM, & - DPTR_XLBXTKEM,DPTR_XLBYTKEM, & - DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM, & - XDRYMASST,XDRYMASSS, & - DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS,DPTR_XLBXWS,DPTR_XLBYWS, & - DPTR_XLBXTHS,DPTR_XLBYTHS, & - DPTR_XLBXTKES,DPTR_XLBYTKES, & - DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS ) - ! -END IF -! -CALL SECOND_MNH2(ZTIME2) -XT_1WAY = XT_1WAY + ZTIME2 - ZTIME1 -! -!* 2.1 RECYCLING TURBULENCE -! ---- -IF (CTURB /= 'NONE' .AND. LRECYCL) THEN - CALL RECYCLING(XFLUCTUNW,XFLUCTVNN,XFLUCTUTN,XFLUCTVTW,XFLUCTWTW,XFLUCTWTN, & - XFLUCTUNE,XFLUCTVNS,XFLUCTUTS,XFLUCTVTE,XFLUCTWTE,XFLUCTWTS, & - KTCOUNT) -ENDIF -! -!* 2.2 IBM -! ---- -! -IF (LIBM .AND. KTCOUNT==1) THEN - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates') - ENDIF - ! - CALL IBM_INIT(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 3. LATERAL BOUNDARY CONDITIONS EXCEPT FOR NORMAL VELOCITY -! ------------------------------------------------------ -! -ZTIME1=ZTIME2 -! -!* 3.1 Set the lagragian variables values at the LB -! -IF( LLG .AND. IMI==1 ) CALL SETLB_LG -! -IF (CCONF == "START" .OR. (CCONF == "RESTA" .AND. KTCOUNT /= 1 )) THEN -CALL MPPDB_CHECK3DM("before BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET) -CALL BOUNDARIES ( & - XTSTEP,CLBCX,CLBCY,NRR,NSV,KTCOUNT, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS, & - XRHODJ,XRHODREF, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) -CALL MPPDB_CHECK3DM("after BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_BOUND = XT_BOUND + ZTIME2 - ZTIME1 -! -! -! For START/RESTART MPPDB_CHECK use -!IF ( (IMI==1) .AND. (CCONF == "START") .AND. (KTCOUNT == 2) ) THEN -! CALL MPPDB_START_DEBUG() -!ENDIF -!IF ( (IMI==1) .AND. (CCONF == "RESTA") .AND. (KTCOUNT == 1) ) THEN -! CALL MPPDB_START_DEBUG() -!ENDIF -!------------------------------------------------------------------------------- -!* initializes surface number -IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI) -!------------------------------------------------------------------------------- -! -!* 4. STORAGE IN A SYNCHRONOUS FILE -! ----------------------------- -! -ZTIME1 = ZTIME2 -! -IF ( nfile_backup_current < NBAK_NUMB ) THEN - IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN - nfile_backup_current = nfile_backup_current + 1 - ! - TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE - IVERB = TPBAKFILE%NLFIVERB - ! - CALL IO_File_open(TPBAKFILE) - ! - CALL WRITE_DESFM_n(IMI,TPBAKFILE) - CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE ) - IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN - YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME - ELSE - ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file - YDADNAME = 'DUMMY' - END IF - CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) ) - TOUTDATAFILE => TPBAKFILE - CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE) - IF (CSURF=='EXTE') THEN - TFILE_SURFEX => TPBAKFILE - CALL GOTO_SURFEX(IMI) - CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.) - IF ( KTCOUNT > 1) THEN - CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') - CALL WRITE_DIAG_SURF_ATM_n(YSURF_CUR,'MESONH','ALL') - END IF - NULLIFY(TFILE_SURFEX) - END IF - ! - ! Reinitialize Lagragian variables at every model backup - IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN - CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM ) - IF (IVERB>=5) THEN - WRITE(UNIT=ILUOUT,FMT=*) '************************************' - WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup' - WRITE(UNIT=ILUOUT,FMT=*) '************************************' - END IF - END IF - ! Reinitialise mean variables - IF (LMEAN_FIELD) THEN - CALL INI_MEAN_FIELD - END IF -! - ELSE - !Necessary to have a 'valid' CNAME when calling some subroutines - TPBAKFILE => TFILE_DUMMY - END IF -ELSE - !Necessary to have a 'valid' CNAME when calling some subroutines - TPBAKFILE => TFILE_DUMMY -END IF -! -IF ( nfile_output_current < NOUT_NUMB ) THEN - IF ( KTCOUNT == TOUTPUTN(nfile_output_current + 1)%NSTEP ) THEN - nfile_output_current = nfile_output_current + 1 - ! - TZOUTFILE => TOUTPUTN(nfile_output_current)%TFILE - ! - CALL IO_File_open(TZOUTFILE) - ! - CALL IO_Header_write(TZOUTFILE) - CALL IO_Fieldlist_write( TOUTPUTN(nfile_output_current) ) - CALL IO_Field_user_write( TOUTPUTN(nfile_output_current) ) - ! - CALL IO_File_close(TZOUTFILE) - ! - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STORE = XT_STORE + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 4.BIS IBM and Fluctuations application -! ----------------------------- -! -!* 4.B1 Add fluctuations at the domain boundaries -! -IF (LRECYCL) THEN - CALL ADDFLUCTUATIONS ( & - CLBCX,CLBCY, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT, & - XFLUCTUTN,XFLUCTVTW,XFLUCTUTS,XFLUCTVTE, & - XFLUCTWTW,XFLUCTWTN,XFLUCTWTS,XFLUCTWTE ) -ENDIF -! -!* 4.B2 Immersed boundaries -! -IF (LIBM) THEN - ! - ZTIME1=ZTIME2 - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates') - ENDIF - ! - CALL IBM_FORCING(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET) - ! - IF (LIBM_TROUBLE) THEN - CALL IBM_FORCING_TR(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET) - ENDIF - ! - CALL SECOND_MNH2(ZTIME2) - ! - XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1 - ! -ENDIF -!------------------------------------------------------------------------------- -! -!* 5. INITIALIZATION OF THE BUDGET VARIABLES -! -------------------------------------- -! -IF (NBUMOD==IMI) THEN - LBU_ENABLE = CBUTYPE /='NONE'.AND. CBUTYPE /='SKIP' -ELSE - LBU_ENABLE = .FALSE. -END IF -! -IF (NBUMOD==IMI .AND. CBUTYPE=='MASK' ) THEN - CALL SET_MASK() - if ( lbu_ru ) then - tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mxm( xrhodj(:, :, :) ) ) - end if - if ( lbu_rv ) then - tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mym( xrhodj(:, :, :) ) ) - end if - if ( lbu_rw ) then - tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mzm( xrhodj(:, :, :) ) ) - end if - if ( associated( tburhodj ) ) tburhodj%xdata(:, nbutime, :) = tburhodj%xdata(:, nbutime, :) + Mask_compress( xrhodj(:, :, :) ) -END IF -! -IF (NBUMOD==IMI .AND. CBUTYPE=='CART' ) THEN - if ( lbu_ru ) then - tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) + Cart_compress( Mxm( xrhodj(:, :, :) ) ) - end if - if ( lbu_rv ) then - tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) + Cart_compress( Mym( xrhodj(:, :, :) ) ) - end if - if ( lbu_rw ) then - tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) & - + Cart_compress( Mzm( xrhodj(:, :, :) ) ) - end if - if ( associated( tburhodj ) ) tburhodj%xdata(:, :, :) = tburhodj%xdata(:, :, :) + Cart_compress( xrhodj(:, :, :) ) -END IF -! -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -XTIME_BU = 0.0 -! -!------------------------------------------------------------------------------- -! -!* 6. INITIALIZATION OF THE FIELD TENDENCIES -! -------------------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -! -CALL INITIAL_GUESS ( NRR, NSV, KTCOUNT, XRHODJ,IMI, XTSTEP, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRTKES, XRSVS, & - XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_GUESS = XT_GUESS + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 7. INITIALIZATION OF THE LES FOR CURRENT TIME-STEP -! ----------------------------------------------- -! -XTIME_LES_BU = 0.0 -XTIME_LES = 0.0 -IF (LLES) CALL LES_INI_TIMESTEP_n(KTCOUNT) -! -!------------------------------------------------------------------------------- -! -!* 8. TWO-WAY INTERACTIVE GRID-NESTING -! -------------------------------- -! -! -CALL SECOND_MNH2(ZTIME1) -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -GMASKkids(:,:)=.FALSE. -! -IF (NMODEL>1) THEN - ! correct an ifort bug - DPTR_XRHODJ=>XRHODJ - DPTR_XUM=>XUT - DPTR_XVM=>XVT - DPTR_XWM=>XWT - DPTR_XTHM=>XTHT - DPTR_XRM=>XRT - DPTR_XTKEM=>XTKET - DPTR_XSVM=>XSVT - DPTR_XRUS=>XRUS - DPTR_XRVS=>XRVS - DPTR_XRWS=>XRWS - DPTR_XRTHS=>XRTHS - DPTR_XRRS=>XRRS - DPTR_XRTKES=>XRTKES - DPTR_XRSVS=>XRSVS - DPTR_XINPRC=>XINPRC - DPTR_XINPRR=>XINPRR - DPTR_XINPRS=>XINPRS - DPTR_XINPRG=>XINPRG - DPTR_XINPRH=>XINPRH - DPTR_XPRCONV=>XPRCONV - DPTR_XPRSCONV=>XPRSCONV - DPTR_XDIRFLASWD=>XDIRFLASWD - DPTR_XSCAFLASWD=>XSCAFLASWD - DPTR_XDIRSRFSWD=>XDIRSRFSWD - DPTR_GMASKkids=>GMASKkids - ! - CALL TWO_WAY( NRR,NSV,KTCOUNT,DPTR_XRHODJ,IMI,XTSTEP, & - DPTR_XUM ,DPTR_XVM ,DPTR_XWM , DPTR_XTHM, DPTR_XRM,DPTR_XSVM, & - DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS,DPTR_XRRS,DPTR_XRSVS, & - DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG,DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV, & - DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD,DPTR_GMASKkids ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -XT_2WAY = XT_2WAY + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -!* 10. FORCING -! ------- -! -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & - LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) -END IF -! -IF ( LFORCING ) THEN - CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,& - XUFRC_PAST, XVFRC_PAST,XWTFRC, & - XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT, & - XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI,ZJ) -END IF -! -IF ( L2D_ADV_FRC ) THEN - CALL ADV_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS) -END IF -IF ( L2D_REL_FRC ) THEN - CALL REL_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_FORCING = XT_FORCING + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 11. NUDGING -! ------- -! -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF ( LNUDGING ) THEN - CALL NUDGING(LUSERV,XRHODJ,XTNUDGING, & - XUT,XVT,XWT,XTHT,XRT, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & - XRUS,XRVS,XRWS,XRTHS,XRRS) - -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_NUDGING = XT_NUDGING + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 12. DYNAMICAL SOURCES -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) + XUTRANS - XVT(:,:,:) = XVT(:,:,:) + XVTRANS -END IF -! -CALL DYN_SOURCES( NRR,NRRL, NRRI, & - XUT, XVT, XWT, XTHT, XRT, & - XCORIOX, XCORIOY, XCORIOZ, XCURVX, XCURVY, & - XRHODJ, XZZ, XTHVREF, XEXNREF, & - XRUS, XRVS, XRWS, XRTHS ) -! -IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) - XUTRANS - XVT(:,:,:) = XVT(:,:,:) - XVTRANS -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_SOURCES = XT_SOURCES + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 13. NUMERICAL DIFFUSION -! ------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN -! - CALL UPDATE_HALO_ll(TFIELDT_ll, IINFO_ll) - CALL UPDATE_HALO2_ll(TFIELDT_ll, THALO2T_ll, IINFO_ll) - IF ( .NOT. LSTEADYLS ) THEN - CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll) - CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll) - END IF - CALL NUM_DIFF ( CLBCX, CLBCY, NRR, NSV, & - XDK2U, XDK4U, XDK2TH, XDK4TH, XDK2SV, XDK4SV, IMI, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XRHODJ, & - XRUS, XRVS, XRWS, XRTHS, XRTKES, XRRS, XRSVS, & - LZDIFFU,LNUMDIFU, LNUMDIFTH, LNUMDIFSV, & - THALO2T_ll, TLSHALO2_ll,XZDIFFU_HALO2 ) -END IF - -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) ) - end do -end if - -DO JSV = NSV_CHEMBEG,NSV_CHEMEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_CHICBEG,NSV_CHICEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_AERBEG,NSV_AEREND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_LNOXBEG,NSV_LNOXEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_DSTBEG,NSV_DSTEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SLTBEG,NSV_SLTEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_PPBEG,NSV_PPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -#ifdef MNH_FOREFIRE -DO JSV = NSV_FFBEG,NSV_FFEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -#endif -! Blaze smoke -DO JSV = NSV_FIREBEG,NSV_FIREEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_CSBEG,NSV_CSEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SNWBEG,NSV_SNWEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -IF (CELEC .NE. 'NONE') THEN - XRSVS(:,:,:,NSV_ELECBEG) = MAX(XRSVS(:,:,:,NSV_ELECBEG),0.) - XRSVS(:,:,:,NSV_ELECEND) = MAX(XRSVS(:,:,:,NSV_ELECEND),0.) -END IF - -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) ) - end do -end if -! -CALL SECOND_MNH2(ZTIME2) -! -XT_DIFF = XT_DIFF + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 14. UPPER AND LATERAL RELAXATION -! ---------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF(LVE_RELAX .OR. LVE_RELAX_GRD .OR. LHORELAX_UVWTH .OR. LHORELAX_RV .OR.& - LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR. & - LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR. & - ANY(LHORELAX_SV)) THEN - CALL RELAXATION (LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,LHORELAX_RC, & - LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & - LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & - LHORELAX_SVC2R2,LHORELAX_SVC1R3, & - LHORELAX_SVELEC,LHORELAX_SVLG, & - LHORELAX_SVCHEM,LHORELAX_SVCHIC,LHORELAX_SVAER, & - LHORELAX_SVDST,LHORELAX_SVSLT,LHORELAX_SVPP, & - LHORELAX_SVCS,LHORELAX_SVSNW,LHORELAX_SVFIRE, & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF, & -#endif - KTCOUNT,NRR,NSV,XTSTEP,XRHODJ, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XLSUM, XLSVM, XLSWM, XLSTHM, & - XLBXUM, XLBXVM, XLBXWM, XLBXTHM, & - XLBXRM, XLBXSVM, XLBXTKEM, & - XLBYUM, XLBYVM, XLBYWM, XLBYTHM, & - XLBYRM, XLBYSVM, XLBYTKEM, & - NALBOT, XALK, XALKW, & - NALBAS, XALKBAS, XALKWBAS, & - LMASK_RELAX,XKURELAX, XKVRELAX, XKWRELAX, & - NRIMX,NRIMY, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES ) -END IF - -IF (CELEC.NE.'NONE' .AND. LRELAX2FW_ION) THEN - CALL RELAX2FW_ION (KTCOUNT, IMI, XTSTEP, XRHODJ, XSVT, NALBOT, & - XALK, LMASK_RELAX, XKWRELAX, XRSVS ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 15. PARAMETRIZATIONS' MONITOR -! ------------------------- -! -ZTIME1 = ZTIME2 -! -CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE, & - XT_RAD, XT_SHADOWS, XT_DCONV, XT_GROUND, & - XT_MAFL, XT_DRAG, XT_EOL, XT_TURB, XT_TRACER, & - ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY ) -! -IF (CDCONV/='NONE') THEN - XPACCONV = XPACCONV + XPRCONV * XTSTEP - IF (LCH_CONV_LINOX) THEN - XIC_TOTAL_NUMBER = XIC_TOTAL_NUMBER + XIC_RATE * XTSTEP - XCG_TOTAL_NUMBER = XCG_TOTAL_NUMBER + XCG_RATE * XTSTEP - END IF -END IF -! -! -CALL SECOND_MNH2(ZTIME2) -! -XT_PARAM = XT_PARAM + ZTIME2 - ZTIME1 - XTIME_LES - ZTIME -! -!------------------------------------------------------------------------------- -! -!* 16. TEMPORAL SERIES -! --------------- -! -ZTIME1 = ZTIME2 -! -IF (LSERIES) THEN - IF ( MOD (KTCOUNT-1,NFREQSERIES) == 0 ) CALL SERIES_n -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 17. LARGE SCALE FIELD REFRESH -! ------------------------- -! -ZTIME1 = ZTIME2 -! -IF (.NOT. LSTEADYLS) THEN - IF ( IMI==1 .AND. & - NCPL_CUR < NCPL_NBR ) THEN - IF (KTCOUNT+1 == NCPL_TIMES(NCPL_CUR,1) ) THEN - ! The next current time reachs a - NCPL_CUR=NCPL_CUR+1 ! coupling one, LS sources are refreshed - ! - CALL LS_COUPLING(XTSTEP,GSTEADY_DMASS,CCONF, & - CGETTKET, & - CGETRVT,CGETRCT,CGETRRT,CGETRIT, & - CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, NSV, & - NIMAX_ll,NJMAX_ll, & - NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & - NSIZELBXTKE_ll,NSIZELBYTKE_ll, & - NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & - XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) - ! - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_LNOXBEG,NSV_LNOXEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_AERBEG,NSV_AEREND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTBEG,NSV_DSTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTBEG,NSV_SLTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_PPBEG,NSV_PPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#ifdef MNH_FOREFIRE - DO JSV=NSV_FFBEG,NSV_FFEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#endif - DO JSV=NSV_FIREBEG,NSV_FIREEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_CSBEG,NSV_CSEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SNWBEG,NSV_SNWEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - END IF - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_COUPL = XT_COUPL + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -! -! -!* 8 Bis . Blowing snow scheme -! --------- -! -IF ( LBLOWSNOW ) THEN - CALL BLOWSNOW( XTSTEP, NRR, XPABST, XTHT, XRT, XZZ, XRHODREF, & - XRHODJ, XEXNREF, XRRS, XRTHS, XSVT, XRSVS, XSNWSUBL3D ) -ENDIF -! -!----------------------------------------------------------------------- -! -!* 8 Ter VISCOSITY (no-slip condition inside) -! --------- -! -! -IF ( LVISC ) THEN -! -ZTIME1 = ZTIME2 -! - CALL VISCOSITY(CLBCX, CLBCY, NRR, NSV, XMU_V,XPRANDTL, & - LVISC_UVW,LVISC_TH,LVISC_SV,LVISC_R, & - LDRAG, & - XUT, XVT, XWT, XTHT, XRT, XSVT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS,XDRAG ) -! -ENDIF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_VISC = XT_VISC + ZTIME2 - ZTIME1 -!! -!------------------------------------------------------------------------------- -! -!* 9. ADVECTION -! --------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -! -! -CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) - CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME, & - CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT, & - LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT, & - CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP, & - XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT, XPABST, & - XTHVREF, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRTHS, XRRS, XRTKES, XRSVS, & - XRTHS_CLD, XRRS_CLD, XRSVS_CLD, XRTKEMS ) -CALL MPPDB_CHECK3DM("after ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ ",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ADV = XT_ADV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZRWS = XRWS -! -CALL GRAVITY_IMPL ( CLBCX, CLBCY, NRR, NRRL, NRRI,XTSTEP, & - XTHT, XRT, XTHVREF, XRHODJ, XRWS, XRTHS, XRRS, & - XRTHS_CLD, XRRS_CLD ) -! -! At the initial instant the difference with the ref state creates a -! vertical velocity production that must not be advected as it is -! compensated by the pressure gradient -! -IF (KTCOUNT == 1 .AND. CCONF=='START') XRWS_PRES = - (XRWS - ZRWS) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_GRAV = XT_GRAV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -IF ( LIBM .AND. CIBM_ADV=='FORCIN' ) THEN - ! - ZTIME1=ZTIME2 - ! - CALL IBM_FORCING_ADV (XRUS,XRVS,XRWS) - ! - CALL SECOND_MNH2(ZTIME2) - ! - XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1 - ! -ENDIF -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -!MPPDB_CHECK_LB=.TRUE. -CALL MPPDB_CHECK3DM("before ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS) -IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR')) THEN - IF (CUVW_ADV_SCHEME=='CEN4TH') THEN - NULLIFY(TZFIELDC_ll) - NULLIFY(TZHALO2C_ll) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XUT, 'MODEL_n::XUT' ) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XVT, 'MODEL_n::XVT' ) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XWT, 'MODEL_n::XWT' ) - CALL INIT_HALO2_ll(TZHALO2C_ll,3,IIU,IJU,IKU) - CALL UPDATE_HALO_ll(TZFIELDC_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TZFIELDC_ll, TZHALO2C_ll, IINFO_ll) - END IF - CALL ADVECTION_UVW_CEN(CUVW_ADV_SCHEME, & - CLBCX, CLBCY, & - XTSTEP, KTCOUNT, & - XUM, XVM, XWM, XDUM, XDVM, XDWM, & - XUT, XVT, XWT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS,XRVS, XRWS, & - TZHALO2C_ll ) - IF (CUVW_ADV_SCHEME=='CEN4TH') THEN - CALL CLEANLIST_ll(TZFIELDC_ll) - NULLIFY(TZFIELDC_ll) - CALL DEL_HALO2_ll(TZHALO2C_ll) - NULLIFY(TZHALO2C_ll) - END IF -ELSE - - CALL ADVECTION_UVW(CUVW_ADV_SCHEME, CTEMP_SCHEME, & - NWENO_ORDER, LSPLIT_WENO, & - CLBCX, CLBCY, XTSTEP, & - XUT, XVT, XWT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS, XRVS, XRWS, & - XRUS_PRES, XRVS_PRES, XRWS_PRES ) -END IF -! -CALL MPPDB_CHECK3DM("after ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS) -!MPPDB_CHECK_LB=.FALSE. -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN - CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE, & - LTURB_DIAG, NRRI, & - XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XCEI ) -END IF -! -!------------------------------------------------------------------------------- -! -!* 18. LATERAL BOUNDARY CONDITION FOR THE NORMAL VELOCITY -! -------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) -ZRUS=XRUS -ZRVS=XRVS -ZRWS=XRWS -! -if ( .not. l1d ) then - if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) ) - if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) ) - if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'PRES', xrws(:, :, :) ) -end if -! -CALL MPPDB_CHECK3DM("before RAD_BOUND : other var",PRECISION,XUT,XVT,XRHODJ,XTKET) -CALL MPPDB_CHECKLB(XLBXUM,"modeln XLBXUM",PRECISION,'LBXU',NRIMX) -CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY) -CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX) -CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY) -! - CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & - XTSTEP, & - XDXHAT, XDYHAT, XZHAT, & - XUT, XVT, & - XLBXUM, XLBYVM, XLBXUS, XLBYVS, & - XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, & - XCPHASE, XCPHASE_PBL, XRHODJ, & - XTKET,XRUS, XRVS, XRWS ) -ZRUS=XRUS-ZRUS -ZRVS=XRVS-ZRVS -ZRWS=XRWS-ZRWS -! -CALL SECOND_MNH2(ZTIME2) -! -XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 19. PRESSURE COMPUTATION -! -------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZPABST = XPABST -! -IF(.NOT. L1D) THEN -! -CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) - XRUS_PRES = XRUS - XRVS_PRES = XRVS - XRWS_PRES = XRWS -! - CALL PRESSUREZ( CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,KTCOUNT, XRELAX,IMI, & - XRHODJ,XDXX,XDYY,XDZZ,XDZX,XDZY,XDXHATM,XDYHATM,XRHOM, & - XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY, & - NRR,NRRL,NRRI,XDRYMASST,XREFMASS,XMASS_O_PHI0, & - XTHT,XRT,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS, & - XRUS, XRVS, XRWS, XPABST, & - XBFB,& - XBF_SXP2_YP1_Z) !JUAN Z_SPLITING -! - XRUS_PRES = XRUS - XRUS_PRES + ZRUS - XRVS_PRES = XRVS - XRVS_PRES + ZRVS - XRWS_PRES = XRWS - XRWS_PRES + ZRWS - CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) -! -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_PRESS = XT_PRESS + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 20. CHEMISTRY/AEROSOLS -! ------------------ -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (LUSECHEM) THEN - CALL CH_MONITOR_n(ZWETDEPAER,KTCOUNT,XTSTEP, ILUOUT, NVERB) -END IF -! -! For inert aerosol (dust and sea salt) => aer_monitor_n -IF ((LDUST).OR.(LSALT)) THEN -! -! tests to see if any cloud exists -! - GCLD=.TRUE. - IF (GCLD .AND. NRR.LE.3 ) THEN - IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no clouds - END IF - END IF -! - IF (GCLD .AND. NRR.GE.4 ) THEN - IF( CCLOUD(1:3)=='ICE' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='C3R5' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='LIMA' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - END IF - -! - CALL AER_MONITOR_n(KTCOUNT,XTSTEP, ILUOUT, NVERB, GCLD) -END IF -! -! -CALL SECOND_MNH2(ZTIME2) -! -XT_CHEM = XT_CHEM + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -ZTIME = ZTIME + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS - -!------------------------------------------------------------------------------- -! -!* 20. WATER MICROPHYSICS -! ------------------ -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN -! - IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' & - .OR. CCLOUD == "LIMA" ) THEN - IF ( LFORCING ) THEN - XWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:) - ELSE - XWT_ACT_NUC(:,:,:) = XWT(:,:,:) - END IF - IF (CTURB /= 'NONE' ) THEN - IF ( ((CCLOUD=='C2R2'.OR.CCLOUD=='KHKO').AND.LACTTKE) .OR. (CCLOUD=='LIMA'.AND.MACTTKE) ) THEN - XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) + (2./3. * XTKET(:,:,:))**0.5 - ELSE - XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) - ENDIF - ENDIF - ELSE - XWT_ACT_NUC(:,:,:) = 0. - END IF -! - XRTHS_CLD = XRTHS - XRRS_CLD = XRRS - XRSVS_CLD = XRSVS - IF (CSURF=='EXTE') THEN - ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP, & - XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR,XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & - XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) - ELSE - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV, & - XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR, XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & - XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF ) - END IF - XRTHS_CLD = XRTHS - XRTHS_CLD - XRRS_CLD = XRRS - XRRS_CLD - XRSVS_CLD = XRSVS - XRSVS_CLD -! - IF (CCLOUD /= 'REVE' ) THEN - XACPRR = XACPRR + XINPRR * XTSTEP - IF ( (CCLOUD(1:3) == 'ICE' .AND. LSEDIC ) .OR. & - ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' & - .OR. CCLOUD == 'LIMA' ) .AND. KSEDC ) ) THEN - XACPRC = XACPRC + XINPRC * XTSTEP - IF (LDEPOSC .OR. LDEPOC) XACDEP = XACDEP + XINDEP * XTSTEP - END IF - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & - (CCLOUD == 'LIMA' .AND. NMOM_I.GE.1 ) ) THEN - XACPRS = XACPRS + XINPRS * XTSTEP - XACPRG = XACPRG + XINPRG * XTSTEP - IF (CCLOUD == 'ICE4' .OR. (CCLOUD == 'LIMA' .AND. NMOM_H.GE.1)) XACPRH = XACPRH + XINPRH * XTSTEP - END IF -! -! Lessivage des CCN et IFN nucléables par Slinn -! - IF (LSCAV .AND. (CCLOUD == 'LIMA')) THEN - CALL LIMA_PRECIP_SCAVENGING( YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - CCLOUD, ILUOUT, KTCOUNT,XTSTEP,XRT(:,:,:,3), & - XRHODREF, XRHODJ, XZZ, XPABST, XTHT, & - XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - XRSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), XINPAP ) -! - XACPAP(:,:) = XACPAP(:,:) + XINPAP(:,:) * XTSTEP - END IF - END IF -! -! It is necessary that SV_C2R2 and SV_C1R3 are contiguous in the preceeding CALL -! -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_CLOUD = XT_CLOUD + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 21. CLOUD ELECTRIFICATION AND LIGHTNING FLASHES -! ------------------------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN - XWT_ACT_NUC(:,:,:) = 0. -! - XRTHS_CLD = XRTHS - XRRS_CLD = XRRS - XRSVS_CLD = XRSVS - IF (CSURF=='EXTE') THEN - ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, XRT, XRRS, & - XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) - ELSE - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, & - XRT, XRRS, XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH ) - END IF - XRTHS_CLD = XRTHS - XRTHS_CLD - XRRS_CLD = XRRS - XRRS_CLD - XRSVS_CLD = XRSVS - XRSVS_CLD -! - XACPRR = XACPRR + XINPRR * XTSTEP - IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC)) & - XACPRC = XACPRC + XINPRC * XTSTEP - IF (CCLOUD(1:3) == 'ICE') THEN - XACPRS = XACPRS + XINPRS * XTSTEP - XACPRG = XACPRG + XINPRG * XTSTEP - IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ELEC = XT_ELEC + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 21. L.E.S. COMPUTATIONS -! ------------------- -! -ZTIME1 = ZTIME2 -! -CALL LES_n -! -CALL SECOND_MNH2(ZTIME2) -! -XT_SPECTRA = XT_SPECTRA + ZTIME2 - ZTIME1 + XTIME_LES_BU + XTIME_LES -! -!------------------------------------------------------------------------------- -! -!* 21. bis MEAN_UM -! -------------------- -! -IF (LMEAN_FIELD) THEN - CALL MEAN_FIELD(XUT, XVT, XWT, XTHT, XTKET, XPABST, XSVT(:,:,:,1)) -END IF -! -!------------------------------------------------------------------------------- -! -!* 22. UPDATE HALO OF EACH SUBDOMAINS FOR TIME T+DT -! -------------------------------------------- -! -ZTIME1 = ZTIME2 -! -CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TFIELDS_ll, & - XRUS, XRVS,XRWS,XRTHS,XRRS,XRTKES,XRSVS) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_HALO = XT_HALO + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 23. TEMPORAL SWAPPING -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -! -CALL ENDSTEP ( XTSTEP,NRR,NSV,KTCOUNT,IMI, & - CUVW_ADV_SCHEME,CTEMP_SCHEME,XRHODJ, & - XRUS,XRVS,XRWS,XDRYMASSS, & - XRTHS,XRRS,XRTKES,XRSVS, & - XLSUS,XLSVS,XLSWS, & - XLSTHS,XLSRVS,XLSZWSS, & - XLBXUS,XLBXVS,XLBXWS, & - XLBXTHS,XLBXRS,XLBXTKES,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS, & - XLBYTHS,XLBYRS,XLBYTKES,XLBYSVS, & - XUM,XVM,XWM,XZWS, & - XUT,XVT,XWT,XPABST,XDRYMASST, & - XTHT, XRT, XTHM, XRCM, XPABSM,XTKET, XSVT,& - XLSUM,XLSVM,XLSWM, & - XLSTHM,XLSRVM,XLSZWSM, & - XLBXUM,XLBXVM,XLBXWM, & - XLBXTHM,XLBXRM,XLBXTKEM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM, & - XLBYTHM,XLBYRM,XLBYTKEM,XLBYSVM ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 24.1 BALLOON and AIRCRAFT -! -------------------- -! -ZTIME1 = ZTIME2 -! -IF (LFLYER) THEN - IF (CSURF=='EXTE') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ZSEA(:,:) = 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF, XCIT, PSEA = ZSEA(:,:) ) - DEALLOCATE(ZSEA) - ELSE - CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF, XCIT ) - END IF -END IF - -!------------------------------------------------------------------------------- -! -!* 24.2 STATION (observation diagnostic) -! -------------------------------- -! -IF ( LSTATION ) & - CALL STATION_n( XZZ, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) -! -!--------------------------------------------------------- -! -!* 24.3 PROFILER (observation diagnostic) -! --------------------------------- -! -IF (LPROFILER) THEN - IF (CSURF=='EXTE') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ZSEA(:,:) = 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL PROFILER_n( XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XTSRAD, XPABST, XAER, XCIT, PSEA=ZSEA(:,:) ) - DEALLOCATE(ZSEA) - ELSE - CALL PROFILER_n( XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XTSRAD, XPABST, XAER, XCIT ) - END IF -END IF -! -IF (ALLOCATED(ZSEA)) DEALLOCATE (ZSEA) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 24.4 deallocation of observation diagnostics -! --------------------------------------- -! -CALL END_DIAG_IN_RUN -! -!------------------------------------------------------------------------------- -! -! -!* 25. STORAGE OF BUDGET FIELDS -! ------------------------ -! -ZTIME1 = ZTIME2 -! -IF ( .NOT. LIO_NO_WRITE ) THEN - IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN - CALL ENDSTEP_BUDGET(TDIAFILE,KTCOUNT,TDTCUR,XTSTEP,NSV) - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU -! -!------------------------------------------------------------------------------- -! -!* 27. CURRENT TIME REFRESH -! -------------------- -! -TDTCUR%xtime=TDTCUR%xtime + XTSTEP -CALL DATETIME_CORRECTDATE(TDTCUR) -! -!------------------------------------------------------------------------------- -! -!* 28. CPU ANALYSIS -! ------------ -! -CALL SECOND_MNH2(ZTIME2) -XT_START=XT_START+ZTIME2-ZEND -! -! -IF ( KTCOUNT == NSTOP .AND. IMI==1) THEN - OEXIT=.TRUE. -END IF -! -IF (OEXIT) THEN -! - IF ( .NOT. LIO_NO_WRITE ) THEN - IF (LSERIES) CALL WRITE_SERIES_n(TDIAFILE) - CALL WRITE_AIRCRAFT_BALLOON(TDIAFILE) - CALL WRITE_STATION_n(TDIAFILE) - CALL WRITE_PROFILER_n(TDIAFILE) - call Write_les_n( tdiafile ) -#ifdef MNH_IOLFI - CALL MENU_DIACHRO(TDIAFILE,'END') -#endif - CALL IO_File_close(TDIAFILE) - ! Free memory of flyer that is not present on the master process of the file (was allocated in WRITE_AIRCRAFT_BALLOON) - CALL AIRCRAFT_BALLOON_FREE_NONLOCAL( TDIAFILE ) - END IF - ! - CALL IO_File_close(TINIFILE) - IF (CSURF=="EXTE") CALL IO_File_close(TINIFILEPGD) -! -!* 28.1 print statistics! -! - ! Set File Timing OUTPUT - ! - CALL SET_ILUOUT_TIMING(TLUOUT) - ! - ! Compute global time - ! - CALL TIME_STAT_ll(XT_START,ZTOT) - ! - CALL TIME_HEADER_ll(IMI) - ! - CALL TIME_STAT_ll(XT_1WAY,ZTOT, ' ONE WAY','=') - CALL TIME_STAT_ll(XT_BOUND,ZTOT, ' BOUNDARIES','=') - CALL TIME_STAT_ll(XT_STORE,ZTOT, ' STORE-FIELDS','=') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_SEND,ZTOT, ' W3D_SEND ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_RECV,ZTOT, ' W3D_RECV ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WRIT,ZTOT, ' W3D_WRIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WAIT,ZTOT, ' W3D_WAIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_ALL ,ZTOT, ' W3D_ALL ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_GATH,ZTOT, ' W2D_GATH ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_WRIT,ZTOT, ' W2D_WRIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_ALL ,ZTOT, ' W2D_ALL ','-') - CALL TIME_STAT_ll(XT_GUESS,ZTOT, ' INITIAL_GUESS','=') - CALL TIME_STAT_ll(XT_2WAY,ZTOT, ' TWO WAY','=') - CALL TIME_STAT_ll(XT_ADV,ZTOT, ' ADVECTION MET','=') - CALL TIME_STAT_ll(XT_ADVUVW,ZTOT, ' ADVECTION UVW','=') - CALL TIME_STAT_ll(XT_GRAV,ZTOT, ' GRAVITY','=') - CALL TIME_STAT_ll(XT_FORCING,ZTOT, ' FORCING','=') - CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT, ' IBM','=') - CALL TIME_STAT_ll(XT_NUDGING,ZTOT, ' NUDGING','=') - CALL TIME_STAT_ll(XT_SOURCES,ZTOT, ' DYN_SOURCES','=') - CALL TIME_STAT_ll(XT_DIFF,ZTOT, ' NUM_DIFF','=') - CALL TIME_STAT_ll(XT_RELAX,ZTOT, ' RELAXATION','=') - ! - CALL TIMING_LEGEND() - ! - CALL TIME_STAT_ll(XT_PARAM,ZTOT, ' PHYS_PARAM','=') - CALL TIME_STAT_ll(XT_RAD,ZTOT, ' RAD = '//CRAD ,'-') - CALL TIME_STAT_ll(XT_SHADOWS,ZTOT, ' SHADOWS' ,'-') - CALL TIME_STAT_ll(XT_DCONV,ZTOT, ' DEEP CONV = '//CDCONV,'-') - CALL TIME_STAT_ll(XT_GROUND,ZTOT, ' GROUND' ,'-') - ! Blaze perf - IF (LBLAZE) THEN - CALL TIME_STAT_ll(XFIREPERF,ZBLAZETOT) - CALL TIME_STAT_ll(XFIREPERF,ZTOT, ' BLAZE' ,'~') - CALL TIME_STAT_ll(XGRADPERF,ZBLAZETOT, ' GRAD(PHI)' ,' ') - CALL TIME_STAT_ll(XROSWINDPERF,ZBLAZETOT, ' ROS & WIND' ,' ') - CALL TIME_STAT_ll(XPROPAGPERF,ZBLAZETOT, ' PROPAGATION' ,' ') - CALL TIME_STAT_ll(XFLUXPERF,ZBLAZETOT, ' HEAT FLUXES' ,' ') - END IF - CALL TIME_STAT_ll(XT_TURB,ZTOT, ' TURB = '//CTURB ,'-') - CALL TIME_STAT_ll(XT_MAFL,ZTOT, ' MAFL = '//CSCONV,'-') - CALL TIME_STAT_ll(XT_CHEM,ZTOT, ' CHIMIE' ,'-') - CALL TIME_STAT_ll(XT_EOL,ZTOT, ' WIND TURBINE' ,'-') - CALL TIMING_LEGEND() - CALL TIME_STAT_ll(XT_COUPL,ZTOT, ' SET_COUPLING','=') - CALL TIME_STAT_ll(XT_RAD_BOUND,ZTOT, ' RAD_BOUND','=') - ! - CALL TIMING_LEGEND() - ! - CALL TIME_STAT_ll(XT_PRESS,ZTOT, ' PRESSURE ','=','F') - !JUAN Z_SPLITTING - CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SX_YP2_ZP1,ZTOT, ' REMAP B=>FFTXZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_SXP2_Y_ZP1,ZTOT, ' REMAP FFTXZ=>FFTYZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_B,ZTOT, ' REMAP FTTYZ=>B' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SXP2_YP1_Z,ZTOT, ' REMAP FFTYZ=>SUBZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SXP2_Y_ZP1,ZTOT, ' REMAP B=>FFTYZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_YP1_Z_SXP2_Y_ZP1,ZTOT, ' REMAP SUBZ=>FFTYZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SX_YP2_ZP1,ZTOT, ' REMAP FFTYZ-1=>FFTXZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_B,ZTOT, ' REMAP FFTXZ-1=>B ' ,'-','F') - ! JUAN P1/P2 - CALL TIME_STAT_ll(XT_CLOUD,ZTOT, ' RESOLVED_CLOUD','=') - CALL TIME_STAT_ll(XT_ELEC,ZTOT, ' RESOLVED_ELEC','=') - CALL TIME_STAT_ll(XT_HALO,ZTOT, ' EXCHANGE_HALO','=') - CALL TIME_STAT_ll(XT_STEP_SWA,ZTOT, ' ENDSTEP','=') - CALL TIME_STAT_ll(XT_STEP_BUD,ZTOT, ' BUDGETS','=') - CALL TIME_STAT_ll(XT_SPECTRA,ZTOT, ' LES','=') - CALL TIME_STAT_ll(XT_STEP_MISC,ZTOT, ' MISCELLANEOUS','=') - IF (LIBM) CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT,' IBM FORCING','=') - ! - ! sum of call subroutine - ! - ZALL = XT_1WAY + XT_BOUND + XT_STORE + XT_GUESS + XT_2WAY + & - XT_ADV + XT_FORCING + XT_NUDGING + XT_SOURCES + XT_DIFF + & - XT_ADVUVW + XT_GRAV + XT_IBM_FORC + & - XT_RELAX+ XT_PARAM + XT_COUPL + XT_RAD_BOUND+XT_PRESS + & - XT_CLOUD+ XT_ELEC + XT_HALO + XT_SPECTRA + XT_STEP_SWA + & - XT_STEP_MISC+ XT_STEP_BUD - CALL TIME_STAT_ll(ZALL,ZTOT, ' SUM(CALL)','=') - CALL TIMING_SEPARATOR('=') - ! - ! Gobale Stat - ! - WRITE(ILUOUT,FMT=*) - WRITE(ILUOUT,FMT=*) - CALL TIMING_LEGEND() - ! - ! MODELN all included - ! - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - WRITE(YMI,FMT="(I0)") IMI - CALL TIME_STAT_ll(XT_START,ZTOT, ' MODEL'//YMI,'+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - ! - ! Timing/ Steps - ! - ZTIME_STEP = XT_START / REAL(KTCOUNT) - WRITE(YTCOUNT,FMT="(I0)") KTCOUNT - CALL TIME_STAT_ll(ZTIME_STEP,ZTOT, ' SECOND/STEP='//YTCOUNT,'=') - ! - ! Timing/Step/Points - ! - IPOINTS = NIMAX_ll*NJMAX_ll*NKMAX - WRITE(YPOINTS,FMT="(I0)") IPOINTS - ZTIME_STEP_PTS = ZTIME_STEP / REAL(IPOINTS) * 1e6 - CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT) - CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT, ' MICROSEC/STP/PT='//YPOINTS,'-') - ! - CALL TIMING_SEPARATOR('=') - ! -END IF -! -END SUBROUTINE MODEL_n diff --git a/src/mesonh/ext/radiations.f90 b/src/mesonh/ext/radiations.f90 deleted file mode 100644 index 2ce3ff7dd..000000000 --- a/src/mesonh/ext/radiations.f90 +++ /dev/null @@ -1,3504 +0,0 @@ -!MNH_LIC Copyright 1995-2022 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_RADIATIONS -! ######################## -! -CONTAINS -! -! ############################################################################ - SUBROUTINE RADIATIONS (TPFILE,OCLEAR_SKY,OCLOUD_ONLY, & - KCLEARCOL_TM1,HEFRADL,HEFRADI,HOPWSW,HOPISW,HOPWLW,HOPILW, & - PFUDG, KDLON, KFLEV, KRAD_DIAG, KFLUX, KRAD, KAER, KSWB_OLD, & - KSWB_MNH,KLWB_MNH, KSTATM,KRAD_COLNBR,PCOSZEN,PSEA, PCORSOL, & - PDIR_ALB, PSCA_ALB,PEMIS, PCLDFR, PCCO2, PTSRAD, PSTATM, & - PTHT, PRT, PPABST, POZON, PAER, PDST_WL, PAER_CLIM, PSVT, & - PDTHRAD, PSRFLWD, PSRFSWD_DIR,PSRFSWD_DIF, PRHODREF, PZZ, & - PRADEFF, PSWU, PSWD, PLWU,PLWD, PDTHRADSW, PDTHRADLW ) -! ############################################################################ -! -!!**** *RADIATIONS * - routine to call the SW and LW radiation calculations -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to prepare the temperature, water vapor -!! liquid water, cloud fraction, ozone profiles for the ECMWF radiation -!! calculations. There is a great number of available radiative fluxes in -!! the output, but only the potential temperature radiative tendency and the -!! SW and LW surface fluxes are provided in the output of the routine. -!! Two simplified computations are available (switches OCLEAR_SKY and -!! OCLOUD_ONLY). When OCLOUD_ONLY is .TRUE. the computations are performed -!! for the cloudy columns only. Furthermore with OCLEAR_SKY being .TRUE. -!! the clear sky columns are averaged and the computations are made for -!! the cloudy columns plus a single ensemble-mean clear sky column. -!! -!!** METHOD -!! ------ -!! First the temperature, water vapor, liquid water, cloud fraction -!! and profile arrays are built using the current model fields and -!! the standard atmosphere for the upper layer filling. -!! The standard atmosphere is used between the levels IKUP and -!! KFLEV where KFLEV is the number of vertical levels for the radiation -!! computations. -!! The aerosols optical thickness and the ozone fields come directly -!! from ini_radiation step (climatlogies used) and are already defined for KFLEV. -!! Surface parameter ( albedo, emiss ) are also defined from current surface fields. -!! In the case of clear-sky or cloud-only approximations, the cloudy -!! columns are selected by testing the vertically integrated cloud fraction -!! and the radiation computations are performed for these columns plus the -!! mean clear-sky one. In addition, columns where cloud have disapeared are determined -!! by saving cloud trace between radiation step and they are also recalculated -!! in cloud only step. In all case, the sun position correponds to the centered -!! time between 2 full radiation steps (determined in physparam). -!! Then the ECMWF radiation package is called and the radiative -!! heating/cooling tendancies are reformatted in case of partial -!! computations. In case of "cloud-only approximation" the only cloudy -!! column radiative fields are updated. -!! -!! EXTERNAL -!! -------- -!! Subroutine ECMWF_RADIATION_VERS2 : ECMWF interface calling radiation routines -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : constants -!! XP00 : reference pressure -!! XCPD : calorific capacity of dry air at constant pressure -!! XRD : gas constant for dry air -!! Module MODD_PARAMETERS : parameters -!! JPHEXT : Extra columns on the horizontal boundaries -!! JPVEXT : Extra levels on the vertical boundaries -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine RADIATIONS ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/02/95 -!! J.Stein 20/12/95 add the array splitting in order to save memory -!! J.-P. Pinty 19/11/96 change the split arrays, specific humidity -!! and add the ice phase -!! J.Stein 22/06/97 use of the absolute pressure -!! P.Jabouille 31/07/97 impose a zero humidity for dry simulation -!! V.Masson 22/09/97 case of clear-sky approx. with no clear-sky column -!! V.Masson 07/11/97 half level pressure defined from averaged Exner -!! function -!! V.Masson 07/11/97 modification of junction between standard atm -!! and model for half level variables (top model -!! pressure and temperatures are used preferentially -!! to atm standard profile for the first point). -!! P.Jabouille 24/08/98 impose positivity for ZQLAVE -!! J.-P. Pinty 29/01/98 add storage for diagnostics -!! J. Stein 18/07/99 add the ORAD_DIAG switch and keep inside the -!! subroutine the partial tendencies -!! -!! F.Solmon 04/03/01 MAJOR MODIFICATIONS, updated version of ECMWF radiation scheme -!! P.Jabouille 05/05/03 bug in humidity conversion -!! Y.Seity 25/08/03 KSWB=6 for SW direct and scattered surface -!! downward fluxes used in surface scheme. -!! P. Tulet 01/20/05 climatologic SSA -!! A. Grini 05/20/05 dust direct effect (optical properties) -!! V.Masson, C.Lac 08/10 Correction of inversion of Diffuse and direct albedo -!! B.Aouizerats 2010 Explicit aerosol optical properties -!! C.Lac 11/2015 Correction on aerosols -!! B.Vie /13 LIMA -!! J.Escobar 30/03/2017 : Management of compilation of ECMWF_RAD in REAL*8 with MNH_REAL=R4 -!! J.Escobar 29/06/2017 : Check if Pressure Decreasing with height <-> elsif PB & STOP -!! Q.LIBOIS 06/2017 : correction on CLOUD_ONLY -!! Q.Libois 02/2018 : ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! J.Escobar 28/06/2018 : Reproductible parallelisation of CLOUD_ONLY case -!! J.Escobar 20/07/2018 : for real*4 compilation, convert with REAL(X) argument to SUM_DD... -!! P.Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! 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 06/09/2022: small fix: GSURF_CLOUD was not set outside of physical domain -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE PARKIND1, ONLY: JPRB -USE OYOESW , ONLY : RTAUA ,RPIZA ,RCGA -! -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CST -USE MODD_DUST, ONLY: LDUST -use modd_field, only: tfieldmetadata, TYPEREAL -USE MODD_GRID , ONLY: XLAT0, XLON0 -USE MODD_GRID_n , ONLY: XLAT, XLON -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV, ONLY: NSV_C2R2,NSV_C2R2BEG,NSV_C2R2END, & - NSV_C1R3,NSV_C1R3BEG,NSV_C1R3END, & - NSV_DSTBEG, NSV_DSTEND, & - NSV_AERBEG, NSV_AEREND, & - NSV_SLTBEG, NSV_SLTEND, & - NSV_LIMA,NSV_LIMA_BEG,NSV_LIMA_END, & - NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA -USE MODD_PARAM_n, ONLY: CCLOUD, CRAD -USE MODD_PARAM_RAD_n, ONLY: CAOP -USE MODD_RAIN_ICE_DESCR -USE MODD_SALT, ONLY: LSALT -USE MODD_TIME -! -USE MODE_DUSTOPT -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_ll -use mode_msg -USE MODE_REPRO_SUM, ONLY : SUM_DD_R2_R1_ll,SUM_DD_R1_ll -! -#ifdef MNH_PGI -USE MODE_PACK_PGI -#endif -USE MODE_SALTOPT -USE MODE_SUM_ll, ONLY: MIN_ll -USE MODE_SUM2_ll, ONLY: GMINLOC_ll -USE MODE_THERMO -! -USE MODI_AEROOPT_GET -USE MODI_ECMWF_RADIATION_VERS2 -USE MODI_ECRAD_INTERFACE -USE MODD_VAR_ll, ONLY: IP -! -IMPLICIT NONE -! -!* 0.1 DECLARATIONS OF DUMMY ARGUMENTS : -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OCLOUD_ONLY! flag for the cloud column - ! computations only -LOGICAL, INTENT(IN) :: OCLEAR_SKY ! -INTEGER, INTENT(IN) :: KDLON ! number of columns where the - ! radiation calculations are - ! performed -INTEGER, INTENT(IN) :: KFLEV ! number of vertical levels - ! where the radiation - ! calculations are performed -INTEGER, INTENT(IN) :: KRAD_DIAG ! index for the number of - ! fields in the output -INTEGER, INTENT(IN) :: KFLUX ! number of top and ground - ! fluxes for the ZFLUX array -INTEGER, INTENT(IN) :: KRAD ! number of satellite radiances - ! for the ZRAD and ZRADCS arrays -INTEGER, INTENT(IN) :: KAER ! number of AERosol classes - -INTEGER, INTENT(IN) :: KSWB_OLD ! number of SW band ECMWF -INTEGER, INTENT(IN) :: KSWB_MNH ! number of SW band ECRAD -INTEGER, INTENT(IN) :: KLWB_MNH ! number of LW band ECRAD -INTEGER, INTENT(IN) :: KSTATM ! index of the standard - ! atmosphere level just above - ! the model top -INTEGER, INTENT(IN) :: KRAD_COLNBR ! factor by which the memory - ! is split - ! - !Choice of : -CHARACTER (LEN=*), INTENT (IN) :: HEFRADL ! -CHARACTER (LEN=*), INTENT (IN) :: HEFRADI ! -CHARACTER (LEN=*), INTENT (IN) :: HOPWSW !cloud water SW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPISW !ice water SW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPWLW !cloud water LW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPILW !ice water LW optical properties -REAL, INTENT(IN) :: PFUDG ! subgrid cloud inhomogenity factor -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) -REAL, INTENT(IN) :: PCORSOL ! SOLar constant CORrection -REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! Land-sea mask -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDIR_ALB! Surface direct ALBedo -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSCA_ALB! Surface diffuse ALBedo -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMIS ! Surface IR EMISsivity -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! CLouD FRaction -REAL, INTENT(IN) :: PCCO2 ! CO2 content -REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! RADiative Surface Temperature -REAL, DIMENSION(:,:), INTENT(IN) :: PSTATM ! selected standard atmosphere -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! THeta at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! moist variables at t (humidity, cloud water, rain water, ice water) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! scalar variable ( C2R2 and C1R3 particle) -! -REAL, DIMENSION(:,:,:), POINTER :: POZON ! OZONE field from clim. -REAL, DIMENSION(:,:,:,:), POINTER :: PAER ! AERosols optical thickness from clim. -REAL, DIMENSION(:,:,:,:), POINTER :: PDST_WL ! AERosols Extinction by wavelength . -REAL, DIMENSION(:,:,:,:), POINTER :: PAER_CLIM ! AERosols optical thickness from clim. - ! note : the vertical dimension of - ! these fields include the "radiation levels" - ! above domain top - ! - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ![kg/m3] air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ![m] height of layers - -INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KCLEARCOL_TM1 ! trace of cloud/clear col - ! at the previous radiation step -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRAD ! THeta RADiative Tendancy -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSRFLWD ! Downward SuRFace LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRFSWD_DIR ! Downward SuRFace SW Flux DIRect -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRFSWD_DIF ! Downward SuRFace SW Flux DIFfuse -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSWU ! upward SW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSWD ! downward SW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLWU ! upward LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLWD ! downward LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRADSW ! dthrad sw -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRADLW ! dthradsw -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRADEFF ! effective radius -! -! -!* 0.2 DECLARATIONS OF LOCAL VARIABLES -! -LOGICAL :: GNOCL ! .TRUE. when no cloud is present - ! with OCLEAR_SKY .TRUE. -LOGICAL :: GAOP ! .TRUE. when CAOP='EXPL' -LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLOUD ! .TRUE. for the cloudy columns -LOGICAL, DIMENSION(KFLEV,KDLON) :: GCLOUDT ! transpose of the GCLOUD array -LOGICAL, DIMENSION(KDLON) :: GCLEAR_2D ! .TRUE. for the clear-sky columns -LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLEAR ! .TRUE. for all the levels of the - ! clear-sky columns -LOGICAL, DIMENSION(KDLON,KSWB_MNH) :: GCLEAR_SWB! .TRUE. for all the bands of the - ! clear-sky columns -INTEGER, DIMENSION(:), ALLOCATABLE :: ICLEAR_2D_TM1 ! -! -INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD,JALBS! loop indices -! -INTEGER :: IIB ! I index value of the first inner mass point -INTEGER :: IJB ! J index value of the first inner mass point -INTEGER :: IKB ! K index value of the first inner mass point -INTEGER :: IIE ! I index value of the last inner mass point -INTEGER :: IJE ! J index value of the last inner mass point -INTEGER :: IKE ! K index value of the last inner mass point -INTEGER :: IKU ! array size for the third index -INTEGER :: IIJ ! reformatted array index -INTEGER :: IKSTAE ! level number of the STAndard atmosphere array -INTEGER :: IKUP ! vertical level above which STAndard atmosphere data - ! are filled in -! -INTEGER :: ICLEAR_COL ! number of clear-sky columns -INTEGER :: ICLOUD_COL ! number of cloudy columns -INTEGER :: ICLOUD ! number of levels corresponding of the cloudy columns -INTEGER :: IDIM ! effective number of columns for which the radiation - ! code is run -INTEGER :: INIR ! index corresponding to NIR fisrt band (in SW) -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE ! mean-layer temperature -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZTAVE_RAD ! mean-layer temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZPAVE ! mean-layer pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPAVE_RAD ! mean-layer pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQSAVE ! saturation specific humidity -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLAVE ! Liquid water KG/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRAVE ! Rain water KG/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIAVE ! Ice water Kg/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLWC ! liquid water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRWC ! Rain water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIWC ! ice water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCFAVE ! mean-layer cloud fraction -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL ! half-level pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZT_HL ! half-level temperature -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDPRES ! layer pressure thickness -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_C2R2! Cloud water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_C2R2! Rain water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_C1R3! Ice water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_LIMA! Cloud water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_LIMA! Rain water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_LIMA! Ice water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER ! aerosol optical thickness -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBP ! spectral surface albedo for direct radiations -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBD ! spectral surface albedo for diffuse radiations -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZEMIS ! surface LW emissivity -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZEMIW ! surface LW WINDOW emissivity -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZTS ! reformatted surface PTSRAD array -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLSM ! reformatted land sea mask -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZRMU0 ! Reformatted ZMU0 array -REAL(KIND=JPRB) :: ZRII0 ! corrected solar constant -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW ! LW temperature tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW ! SW temperature tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_CS ! CLEAR-SKY LW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW ! TOTAL LW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_CS ! CLEAR-SKY SW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW ! TOTAL SW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR ! Top and - ! Ground radiative FLUXes -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN ! DowNward SW Flux profiles -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP ! UPward SW Flux profiles -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW ! LW Flux profiles -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_CS ! LW Clear-Sky temp. tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_CS ! SW Clear-Sky temp. tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS ! Top and - ! Ground Clear-Sky radiative FLUXes -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIR !surface SW direct flux -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIF !surface SW diffuse flux - -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_VIS, ZPLAN_ALB_NIR - ! PLANetary ALBedo in VISible, Near-InfraRed regions -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_VIS, ZPLAN_TRA_NIR - ! PLANetary TRANsmission in VISible, Near-InfraRed regions -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_VIS, ZPLAN_ABS_NIR - ! PLANetary ABSorption in VISible, Near-InfraRed regions -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWD, ZEFCL_LWU - ! EFective DOWNward and UPward LW nebulosity (equivalent emissivities) - ! undefined if RRTM is used for LW -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLWP, ZFIWP - ! Liquid and Ice Water Path -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADLP, ZRADIP - ! Cloud liquid water and ice effective radius -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_RRTM, ZCLSW_TOTAL - ! effective LW nebulosity ( RRTM case) - ! and SW CLoud fraction for mixed phase clouds -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL, ZOMEGA_TOTAL, ZCG_TOTAL - ! effective optical thickness, single scattering albedo - ! and asymetry factor for mixed phase clouds -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS - ! Clear-Sky DowNward and UPward SW Flux profiles -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS - ! Thicknes of the mesh -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDZ -! -REAL, DIMENSION(KDLON,KFLEV) :: ZZDTSW ! SW diabatic heating -REAL, DIMENSION(KDLON,KFLEV) :: ZZDTLW ! LW diabatic heating -REAL, DIMENSION(KDLON) :: ZZTGVIS! SW surface flux in the VIS band -REAL, DIMENSION(KDLON) :: ZZTGNIR! SW surface flux in the NIR band -REAL, DIMENSION(KDLON) :: ZZTGIR ! LW surface flux in the IR bands -REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIR -! ! SW direct surface flux -REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIF -! ! SW diffuse surface flux -! -REAL, DIMENSION(KDLON) :: ZCLOUD ! vertically summed cloud fraction -! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner function -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZLWD ! surface Downward LW flux -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIR ! surface -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIF ! surface Downward SW diffuse flux -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZPIZAZ ! Aerosols SSA -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZTAUAZ ! Aerosols Optical Detph -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZCGAZ ! Aerosols Asymetric factor -REAL :: ZZTGVISC ! downward surface SW flux (VIS band) for clear_sky -REAL :: ZZTGNIRC ! downward surface SW flux (NIR band) for clear_sky -REAL :: ZZTGIRC ! downward surface LW flux for clear_sky -REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIRC -! ! downward surface SW direct flux for clear sky -REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIFC -! ! downward surface SW diffuse flux for clear sky -REAL, DIMENSION(KFLEV) :: ZT_CLEAR ! ensemble mean clear-sky temperature -REAL, DIMENSION(KFLEV) :: ZP_CLEAR ! ensemble mean clear-sky temperature -REAL, DIMENSION(KFLEV) :: ZQV_CLEAR ! ensemble mean clear-sky specific humidity -REAL, DIMENSION(KFLEV) :: ZOZ_CLEAR ! ensemble mean clear-sky ozone -REAL, DIMENSION(KFLEV) :: ZHP_CLEAR ! ensemble mean clear-sky half-lev. pression -REAL, DIMENSION(KFLEV) :: ZHT_CLEAR ! ensemble mean clear-sky half-lev. temp. -REAL, DIMENSION(KFLEV) :: ZDP_CLEAR ! ensemble mean clear-sky pressure thickness -REAL, DIMENSION(KFLEV,KAER) :: ZAER_CLEAR ! ensemble mean clear-sky aerosols optical thickness -REAL, DIMENSION(KSWB_MNH) :: ZALBP_CLEAR ! ensemble mean clear-sky surface albedo (parallel) -REAL, DIMENSION(KSWB_MNH) :: ZALBD_CLEAR ! ensemble mean clear-sky surface albedo (diffuse) -REAL :: ZEMIS_CLEAR ! ensemble mean clear-sky surface emissivity -REAL :: ZEMIW_CLEAR ! ensemble mean clear-sky LW window -REAL :: ZRMU0_CLEAR ! ensemble mean clear-sky MU0 -REAL :: ZTS_CLEAR ! ensemble mean clear-sky surface temperature. -REAL :: ZLSM_CLEAR ! ensemble mean clear-sky land sea-mask -REAL :: ZLAT_CLEAR,ZLON_CLEAR -! -!work arrays -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1, ZWORK2, ZWORK3, ZWORK -REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK4, ZWORK1AER, ZWORK2AER, ZWORK_GRID -LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZWORKL -! -! split arrays used to split the memory required by the ECMWF_radiation -! subroutine, the fields have the same meaning as their complete counterpart -! -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBP_SPLIT, ZALBD_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZEMIS_SPLIT, ZEMIW_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZRMU0_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCFAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZO3AVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZT_HL_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZTAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDPRES_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLSM_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQVAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQSAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDZ_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_C2R2_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_C2R2_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_C1R3_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZTS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIF_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_NIR_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_NIR_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_NIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWD_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWU_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLWP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIWP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADLP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADIP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_RRTM_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLSW_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOMEGA_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCG_TOTAL_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP_CS_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS_SPLIT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_EQ_TMP !Single scattering albedo of aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZIR !Real part of the aerosol refractive index(lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZII !Imaginary part of the aerosol refractive index (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_EQ_TMP !Assymetry factor aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_EQ_TMP !tau/tau_{550} aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_DST_TMP !Single scattering albedo of dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_DST_TMP !Assymetry factor dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_DST_TMP !tau/tau_{550} dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_AER_TMP !Single scattering albedo of aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_AER_TMP !Assymetry factor aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_AER_TMP !tau/tau_{550} aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_SLT_TMP !Single scattering albedo of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_SLT_TMP !Assymetry factor of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_SLT_TMP !tau/tau_{550} of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_AER !tau/tau_{550} aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_SLT !tau/tau_{550} sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_DST !tau/tau_{550} dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU550_EQ_TMP !tau/tau_{550} aerosols (lon,lat,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZPIZA_EQ !Single scattering albedo of aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZCGA_EQ !Assymetry factor aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUREL_EQ !tau/tau_{550} aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZPIZA_EQ_SPLIT !Single scattering albedo of aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZCGA_EQ_SPLIT !Assymetry factor aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUREL_EQ_SPLIT !tau/tau_{550} aerosols (points,lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZPIZA_EQ_CLEAR !Single scattering albedo of aerosols (lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZCGA_EQ_CLEAR !Assymetry factor aerosols (lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZTAUREL_EQ_CLEAR !tau/tau_{550} aerosols (lev,wvl) -INTEGER :: WVL_IDX !Counter for wavelength - -! -INTEGER :: JI_SPLIT ! loop on the split array -INTEGER :: INUM_CALL ! number of CALL of the radiation scheme -INTEGER :: IDIM_EFF ! effective number of air-columns to compute -INTEGER :: IDIM_RESIDUE ! number of remaining air-columns to compute -INTEGER :: IBEG, IEND ! auxiliary indices -! -! -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZDTRAD_LW! LW temperature tendency -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZDTRAD_SW! SW temperature tendency -INTEGER :: ILUOUT ! Logical unit number for output-listing -INTEGER :: IRESP ! Return code of FM routines -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZSTORE_3D, ZSTORE_3D2! 3D work array for storage -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2)) & - :: ZSTORE_2D ! 2D work array for storage! -INTEGER :: JBAND ! Solar band index -CHARACTER (LEN=4), DIMENSION(KSWB_OLD) :: YBAND_NAME ! Solar band name -CHARACTER (LEN=2) :: YDIR ! Type of the data field -! -INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes) -INTEGER :: JSWB ! loop on SW spectral bands -INTEGER :: JAE ! loop on aerosol class -TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D -! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST -REAL :: ZMINVAL -INTEGER, DIMENSION(3) :: IMINLOC -INTEGER :: IINFO_ll -LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: GCLOUD_SURF -! -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLON,ZLAT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLON_SPLIT,ZLAT_SPLIT -! -INTEGER :: ICLEAR_COL_ll -INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_ICLEAR_COL -REAL, DIMENSION(KFLEV) :: ZT_CLEAR_DD ! ensemble mean clear-sky temperature -REAL :: ZCLEAR_COL_ll , ZDLON_ll -!------------------------------------------------------------------------- -!------------------------------------------------------------------------- -!------------------------------------------------------------------------- -! -!* 1. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES -! ---------------------------------------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ! this definition must be coherent with - ! the one used in ini_radiations routine -IKU = SIZE(PTHT,3) -IKB = 1 + JPVEXT -IKE = IKU - JPVEXT -! -IKSTAE = SIZE(PSTATM,1) -IKUP = IKE-JPVEXT+1 -! -ISWB = SIZE(PSRFSWD_DIR,3) -! -!------------------------------------------------------------------------------- -!* 1.1 CHECK PRESSURE DECREASING -! ------------------------- -ZDZPABST(:,:,1:IKU-1) = PPABST(:,:,1:IKU-1) - PPABST(:,:,2:IKU) -ZDZPABST(:,:,IKU) = ZDZPABST(:,:,IKU-1) -! -ZMINVAL=MIN_ll(ZDZPABST,IINFO_ll) -! -IF ( ZMINVAL <= 0.0 ) THEN - ILUOUT = TLUOUT%NLU - IMINLOC=GMINLOC_ll( ZDZPABST ) - WRITE(ILUOUT,*) ' radiation.f90 STOP :: SOMETHING WRONG WITH PRESSURE , ZDZPABST <= 0.0 ' - WRITE(ILUOUT,*) ' radiation :: ZDZPABST ', ZMINVAL,' located at ', IMINLOC - FLUSH(unit=ILUOUT) - call Print_msg( NVERB_FATAL, 'GEN', 'RADIATIONS', 'something wrong with pressure: ZDZPABST <= 0.0' ) - -ENDIF -!------------------------------------------------------------------------------ -ALLOCATE(ZLAT(KDLON)) -ALLOCATE(ZLON(KDLON)) -IF(LCARTESIAN) THEN - ZLAT(:) = XLAT0*(XPI/180.) - ZLON(:) = XLON0*(XPI/180.) -ELSE - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZLAT(IIJ) = XLAT(JI,JJ)*(XPI/180.) - ZLON(IIJ) = XLON(JI,JJ)*(XPI/180.) - END DO - END DO -END IF -!------------------------------------------------------------------------------- -! -!* 2. INITIALIZES THE MEAN-LAYER VARIABLES -! ------------------------------------ -! -ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) -! -! Columns where radiation is computed are put on a single line -ALLOCATE(ZTAVE(KDLON,KFLEV)) -ALLOCATE(ZQVAVE(KDLON,KFLEV)) -ALLOCATE(ZQLAVE(KDLON,KFLEV)) -ALLOCATE(ZQIAVE(KDLON,KFLEV)) -ALLOCATE(ZCFAVE(KDLON,KFLEV)) -ALLOCATE(ZQRAVE(KDLON,KFLEV)) -ALLOCATE(ZQLWC(KDLON,KFLEV)) -ALLOCATE(ZQIWC(KDLON,KFLEV)) -ALLOCATE(ZQRWC(KDLON,KFLEV)) -ALLOCATE(ZDZ(KDLON,KFLEV)) -! -ZQVAVE(:,:) = 0.0 -ZQLAVE(:,:) = 0.0 -ZQIAVE(:,:) = 0.0 -ZQRAVE(:,:) = 0.0 -ZCFAVE(:,:) = 0.0 -ZQLWC(:,:) = 0.0 -ZQIWC(:,:) = 0.0 -ZQRWC(:,:) = 0.0 -ZDZ(:,:)=0.0 -! -!COMPUTE THE MESH SIZE -DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZDZ(IIJ,JKRAD) = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) - ZTAVE(IIJ,JKRAD) = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK) ! Conversion potential temperature -> actual temperature - END DO - END DO -END DO -! -! Check if the humidity mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQVAVE(IIJ,JKRAD) =MAX(0., PRT(JI,JJ,JK,1)) - END DO - END DO - END DO -END IF -! -! Check if the cloudwater mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQLAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2)) - ZQLWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2)*PRHODREF(JI,JJ,JK)) - ZCFAVE(IIJ,JKRAD) = PCLDFR(JI,JJ,JK) - END DO - END DO - END DO -END IF -! -! Check if the rainwater mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 3 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQRWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3)*PRHODREF(JI,JJ,JK)) - ZQRAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3)) - END DO - END DO - END DO -END IF -! -! Check if the cloudice mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 4 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQIWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,4)*PRHODREF(JI,JJ,JK)) -! ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4)-XRTMIN(4),0.0 ) - ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4),0.0 ) - END DO - END DO - END DO -END IF -! -! Standard atmosphere extension -! -DO JK=IKUP,KFLEV - JK1 = (KSTATM-1)+(JK-IKUP) - JK2 = JK1+1 - ZTAVE(:,JK) = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) ) - ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+ & - PSTATM(JK2,5)/PSTATM(JK2,4) ) -END DO -! -! 2.1 pronostic water concentation fields (C2R2 coupling) -! -IF( NSV_C2R2 /= 0 ) THEN - ALLOCATE (ZCCT_C2R2(KDLON, KFLEV)) - ALLOCATE (ZCRT_C2R2(KDLON, KFLEV)) - ZCCT_C2R2(:, :) = 0. - ZCRT_C2R2 (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZCCT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+1)) - ZCRT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+2)) - END DO - END DO - END DO -ELSE - ALLOCATE (ZCCT_C2R2(0,0)) - ALLOCATE (ZCRT_C2R2(0,0)) -END IF -! -IF( NSV_C1R3 /= 0 ) THEN - ALLOCATE (ZCIT_C1R3(KDLON, KFLEV)) - ZCIT_C1R3 (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZCIT_C1R3 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C1R3BEG)) - END DO - END DO - END DO -ELSE - ALLOCATE (ZCIT_C1R3(0,0)) -END IF -! -! -! 2.1*bis pronostic water concentation fields (LIMA coupling) -! -IF( CCLOUD == 'LIMA' ) THEN - ALLOCATE (ZCCT_LIMA(KDLON, KFLEV)) - ALLOCATE (ZCRT_LIMA(KDLON, KFLEV)) - ALLOCATE (ZCIT_LIMA(KDLON, KFLEV)) - ZCCT_LIMA(:, :) = 0. - ZCRT_LIMA (:,:) = 0. - ZCIT_LIMA (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - IF (NMOM_C.GE.2) ZCCT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NC)) - IF (NMOM_R.GE.2) ZCRT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NR)) - IF (NMOM_I.GE.2) ZCIT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NI)) - END DO - END DO - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZES THE HALF-LEVEL VARIABLES -! ------------------------------------ -! -ALLOCATE(ZPRES_HL(KDLON,KFLEV+1)) -ALLOCATE(ZT_HL(KDLON,KFLEV+1)) -! -DO JK=IKB,IKE+1 - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZPRES_HL(IIJ,JKRAD) = XP00 * (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD) - END DO - END DO -END DO - -! Standard atmosphere extension - pressure -!* begining at ikup+1 level allows to use a model domain higher than 50km -! -DO JK=IKUP+1,KFLEV+1 - JK1 = (KSTATM-1)+(JK-IKUP) - ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0 ! mb -> Pa -END DO -! -! Surface temperature at the first level -! and surface radiative temperature -ALLOCATE(ZTS(KDLON)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZT_HL(IIJ,1) = PTSRAD(JI,JJ) - ZTS(IIJ) = PTSRAD(JI,JJ) - END DO -END DO -! -! Temperature at half levels -! -ZT_HL(:,2:IKE-JPVEXT) = 0.5*(ZTAVE(:,1:IKE-JPVEXT-1)+ZTAVE(:,2:IKE-JPVEXT)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZT_HL(IIJ,IKE-JPVEXT+1) = 0.5*PTHT(JI,JJ,IKE )*ZEXNT(JI,JJ,IKE ) & - + 0.5*PTHT(JI,JJ,IKE+1)*ZEXNT(JI,JJ,IKE+1) - END DO -END DO -! -! Standard atmosphere extension - temperature -!* begining at ikup+1 level allows to use a model domain higher than 50km -! -DO JK=IKUP+1,KFLEV+1 - JK1 = (KSTATM-1)+(JK-IKUP) - ZT_HL(:,JK) = PSTATM(JK1,3) -END DO -! -!mean layer pressure and layer differential pressure (from half level variables) -! -ALLOCATE(ZPAVE(KDLON,KFLEV)) -ALLOCATE(ZDPRES(KDLON,KFLEV)) -DO JKRAD=1,KFLEV - ZPAVE(:,JKRAD)=0.5*(ZPRES_HL(:,JKRAD)+ZPRES_HL(:,JKRAD+1)) - ZDPRES(:,JKRAD)=ZPRES_HL(:,JKRAD)-ZPRES_HL(:,JKRAD+1) -END DO -!----------------------------------------------------------------------- -!* 4. INITIALIZES THE AEROSOLS and OZONE PROFILES from climatology -! ------------------------------------------- -! -! 4.1 AEROSOL optical thickness -! EXPL -> defined online, otherwise climatology -IF (CAOP=='EXPL') THEN - GAOP = .TRUE. -ELSE - GAOP = .FALSE. -ENDIF -! -IF (CAOP=='EXPL') THEN - ALLOCATE(ZPIZA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - - ALLOCATE(ZPIZA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_DST(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - ALLOCATE(ZPIZA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_AER(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - ALLOCATE(ZPIZA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_SLT(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - - ALLOCATE(ZII(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD)) - ALLOCATE(ZIR(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD)) - - ZPIZA_EQ_TMP = 0. - ZCGA_EQ_TMP = 0. - ZTAUREL_EQ_TMP = 0. - - ZPIZA_DST_TMP = 0. - ZCGA_DST_TMP = 0. - ZTAUREL_DST_TMP = 0 - - ZPIZA_SLT_TMP = 0. - ZCGA_SLT_TMP = 0. - ZTAUREL_SLT_TMP = 0 - - ZPIZA_AER_TMP = 0. - ZCGA_AER_TMP = 0. - ZTAUREL_AER_TMP = 0 - - PAER_DST=0. - PAER_SLT=0. - PAER_AER=0. - - IF (LORILAM) THEN - CALL AEROOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND) & !I [ppv] aerosols concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,ZPIZA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of aerosols - ,ZCGA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for aerosols - ,ZTAUREL_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_AER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of aerosols at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ,ZIR(IIB:IIE,IJB:IJE,:,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,ZII(IIB:IIE,IJB:IJE,:,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ) - ENDIF - IF(LDUST) THEN - CALL DUSTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND) & !I [ppv] Dust scalar concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,ZPIZA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of dust - ,ZCGA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for dust - ,ZTAUREL_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_DST(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of dust at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ) - DO WVL_IDX=1,KSWB_OLD - PDST_WL(:,:,:,WVL_IDX) = ZTAUREL_DST_TMP(:,:,:,WVL_IDX)* PAER(:,:,:,3) - ENDDO - ENDIF - IF(LSALT) THEN - CALL SALTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND) & !I [ppv] sea salt scalar concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,PTHT(IIB:IIE,IJB:IJE,:) & !I [K] potential temperature - ,PPABST(IIB:IIE,IJB:IJE,:) & !I [hPa] pressure - ,PRT(IIB:IIE,IJB:IJE,:,:) & !I [kg/kg] water mixing ratio - ,ZPIZA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of sea salt - ,ZCGA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for sea salt - ,ZTAUREL_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_SLT(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of sea salt at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ) - ENDIF - - ZTAUREL_EQ_TMP(:,:,:,:)=ZTAUREL_DST_TMP(:,:,:,:)+ZTAUREL_AER_TMP(:,:,:,:)+ZTAUREL_SLT_TMP(:,:,:,:) - - PAER(:,:,:,2)=PAER_SLT(:,:,:) - PAER(:,:,:,3)=PAER_DST(:,:,:) - PAER(:,:,:,4)=PAER_AER(:,:,:) - - - WHERE (ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0) - ZPIZA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)+& - ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)+& - ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:))/& - ZTAUREL_EQ_TMP(:,:,:,:) - END WHERE - WHERE ((ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0).AND.(ZPIZA_EQ_TMP(:,:,:,:).GT.0.0)) - ZCGA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)*ZCGA_DST_TMP(:,:,:,:)+& - ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)*ZCGA_AER_TMP(:,:,:,:)+& - ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:)*ZCGA_SLT_TMP(:,:,:,:))/& - (ZTAUREL_EQ_TMP(:,:,:,:)*ZPIZA_EQ_TMP(:,:,:,:)) - END WHERE - - ZTAUREL_EQ_TMP(:,:,:,:)=max(1.E-8,ZTAUREL_EQ_TMP(:,:,:,:)) - ZCGA_EQ_TMP(:,:,:,:)=max(1.E-8,ZCGA_EQ_TMP(:,:,:,:)) - ZPIZA_EQ_TMP(:,:,:,:)=max(1.E-8,ZPIZA_EQ_TMP(:,:,:,:)) - PAER(:,:,:,3)=max(1.E-8,PAER(:,:,:,3)) - ZPIZA_EQ_TMP(:,:,:,:)=min(0.99,ZPIZA_EQ_TMP(:,:,:,:)) - - -ENDIF -! -! Computes SSA, optical depth and assymetry factor for clear sky (aerosols) -ZTAUAZ(:,:,:,:) = 0. -ZPIZAZ(:,:,:,:) = 0. -ZCGAZ(:,:,:,:) = 0. -DO WVL_IDX=1,KSWB_OLD - DO JAE=1,KAER - !Special optical properties for dust - IF (CAOP=='EXPL'.AND.(JAE==3)) THEN - !Ponderation of aerosol optical in case of explicit optical factor - !ti - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - !wi*ti - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - !wi*ti*gi - ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZCGA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - ELSE - - !Ponderation of aerosol optical properties - !ti - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * RTAUA(WVL_IDX,JAE) - !wi*ti - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) *& - RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE) - !wi*ti*gi - ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) +& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) *& - RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE)*RCGA(WVL_IDX,JAE) - ENDIF - ENDDO -! assymetry factor: - -ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) / & - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) -! SSA: -ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) / & - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) -ENDDO -! - -! -ALLOCATE(ZAER(KDLON,KFLEV,KAER)) -! Aerosol classes -! 1=Continental 2=Maritime 3=Desert 4=Urban 5=Volcanic 6=Stratos.Bckgnd -! Loaded from climatology -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,:) = PAER_CLIM (JI,JJ,:,:) - END DO -END DO -IF ((CAOP=='EXPL') .AND. LDUST ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,3) = PAER (JI,JJ,:,3) - END DO - END DO -END IF -IF ((CAOP=='EXPL') .AND. LSALT ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,2) = PAER (JI,JJ,:,2) - END DO - END DO -END IF -IF ((CAOP=='EXPL') .AND. LORILAM ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,4) = PAER (JI,JJ,:,4) - END DO - END DO -END IF -! -ALLOCATE(ZPIZA_EQ(KDLON,KFLEV,KSWB_OLD)) -ALLOCATE(ZCGA_EQ(KDLON,KFLEV,KSWB_OLD)) -ALLOCATE(ZTAUREL_EQ(KDLON,KFLEV,KSWB_OLD)) -IF(CAOP=='EXPL')THEN - !Transform from vector of type #lon #lat #lev #wvl - !to vectors of type #points, #levs, #wavelengths - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZPIZA_EQ(IIJ,:,:) = ZPIZA_EQ_TMP(JI,JJ,:,:) - ZCGA_EQ(IIJ,:,:)= ZCGA_EQ_TMP(JI,JJ,:,:) - ZTAUREL_EQ(IIJ,:,:)=ZTAUREL_EQ_TMP(JI,JJ,:,:) - END DO - END DO - DEALLOCATE(ZPIZA_EQ_TMP) - DEALLOCATE(ZCGA_EQ_TMP) - DEALLOCATE(ZTAUREL_EQ_TMP) - DEALLOCATE(ZPIZA_DST_TMP) - DEALLOCATE(ZCGA_DST_TMP) - DEALLOCATE(ZTAUREL_DST_TMP) - DEALLOCATE(ZPIZA_AER_TMP) - DEALLOCATE(ZCGA_AER_TMP) - DEALLOCATE(ZTAUREL_AER_TMP) - DEALLOCATE(ZPIZA_SLT_TMP) - DEALLOCATE(ZCGA_SLT_TMP) - DEALLOCATE(ZTAUREL_SLT_TMP) - DEALLOCATE(PAER_DST) - DEALLOCATE(PAER_AER) - DEALLOCATE(PAER_SLT) - DEALLOCATE(ZIR) - DEALLOCATE(ZII) -END IF - - -! -! 4.2 OZONE content -! -ALLOCATE(ZO3AVE(KDLON,KFLEV)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZO3AVE(IIJ,:) = POZON (JI,JJ,:) - END DO -END DO -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) -POZON = POZON -#endif -#endif -! -!------------------------------------------------------------------------------- -! -!* 5. CALLS THE E.C.M.W.F. RADIATION CODE -! ----------------------------------- -! -! -!* 5.1 INITIALIZES 2D AND SURFACE FIELDS -! -ALLOCATE(ZRMU0(KDLON)) -ALLOCATE(ZLSM(KDLON)) -! -ALLOCATE(ZALBP(KDLON,KSWB_MNH)) -ALLOCATE(ZALBD(KDLON,KSWB_MNH)) -! -ALLOCATE(ZEMIS(KDLON,KLWB_MNH)) -ALLOCATE(ZEMIW(KDLON,KLWB_MNH)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZEMIS(IIJ,:) = PEMIS(JI,JJ,:) - ZRMU0(IIJ) = PCOSZEN(JI,JJ) - ZLSM(IIJ) = 1.0 - PSEA(JI,JJ) - END DO -END DO -! -! spectral albedo -! -IF ( SIZE(PDIR_ALB,3)==1 ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ! sw direct and diffuse albedos - ZALBP(IIJ,:) = PDIR_ALB(JI,JJ,1) - ZALBD(IIJ,:) = PSCA_ALB(JI,JJ,1) - ! - END DO - END DO -ELSE - DO JK=1, SIZE(PDIR_ALB,3) - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ! sw direct and diffuse albedos - ZALBP(IIJ,JK) = PDIR_ALB(JI,JJ,JK) - ZALBD(IIJ,JK) = PSCA_ALB(JI,JJ,JK) - ENDDO - END DO - ENDDO -END IF -! -! -! LW emissivity -ZEMIW(:,:)= ZEMIS(:,:) -! -!solar constant -ZRII0= PCORSOL*XI0 ! solar constant multiplied by seasonal variations due to Earth-Sun distance -! -! -!* 5.2 ACCOUNTS FOR THE CLEAR-SKY APPROXIMATION -! -! Performs the horizontal average of the fields when no cloud -! -ZCLOUD(:) = SUM( ZCFAVE(:,:),DIM=2 ) ! one where no cloud on the vertical -! -! MODIF option CLLY -ALLOCATE ( ICLEAR_2D_TM1(KDLON) ) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ICLEAR_2D_TM1(IIJ) = KCLEARCOL_TM1(JI,JJ) - END DO -END DO -! -IF(OCLOUD_ONLY .OR. OCLEAR_SKY) THEN - ! - GCLEAR_2D(:) = .TRUE. - WHERE( (ZCLOUD(:) > 0.0) .OR. (ICLEAR_2D_TM1(:)==0) ) ! FALSE on cloudy columns - GCLEAR_2D(:) = .FALSE. - END WHERE - ! - ICLEAR_COL = COUNT( GCLEAR_2D(:) ) ! number of clear sky columns - ! - ALLOCATE(INDEX_ICLEAR_COL(ICLEAR_COL)) - IIJ = 0 - DO JI=1,KDLON - IF ( GCLEAR_2D(JI) ) THEN - IIJ = IIJ + 1 - INDEX_ICLEAR_COL(IIJ) = JI - END IF - END DO - - IF( ICLEAR_COL == KDLON ) THEN ! No cloud case so only the mean clear-sky -!!$ GCLEAR_2D(1) = .FALSE. ! column is selected -!!$ ICLEAR_COL = KDLON-1 - GNOCL = .TRUE. ! TRUE if no cloud at all - ELSE - GNOCL = .FALSE. - END IF - - GCLEAR(:,:) = SPREAD( GCLEAR_2D(:),DIM=2,NCOPIES=KFLEV ) ! vertical extension of clear columns 2D map - ICLOUD_COL = KDLON - ICLEAR_COL ! number of cloudy columns -! - ZCLEAR_COL_ll = REAL(ICLEAR_COL) - CALL REDUCESUM_ll(ZCLEAR_COL_ll,IINFO_ll) - !ZDLON_ll = KDLON - !CALL REDUCESUM_ll(ZDLON_ll,IINFO_ll) - - !IF (IP == 1 ) - !print*,",RADIATIOn COULD_ONLY=OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDON,ZDLON_ll,GNOCL=", & - ! OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDLON,ZDLON_ll,GNOCL -! -!!$ IF( ICLEAR_COL /=0 ) THEN ! at least one clear-sky column exists -> average profiles on clear columns - IF( ZCLEAR_COL_ll /= 0.0 ) THEN ! at least one clear-sky column exists -> average profiles on clear columns - ZT_CLEAR(:) = SUM_DD_R2_R1_ll(ZTAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll - ZP_CLEAR(:) = SUM_DD_R2_R1_ll(ZPAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll - ZQV_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZQVAVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZOZ_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZO3AVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZDP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZDPRES(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - - DO JK1=1,KAER - ZAER_CLEAR(:,JK1) = SUM_DD_R2_R1_ll(REAL(ZAER(INDEX_ICLEAR_COL(:),:,JK1))) / ZCLEAR_COL_ll - END DO - !Get an average value for the clear column - IF(CAOP=='EXPL')THEN - DO WVL_IDX=1,KSWB_OLD - ZPIZA_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZPIZA_EQ( INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ZCGA_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZCGA_EQ( INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ZTAUREL_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZTAUREL_EQ(INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ENDDO - ENDIF - ! - ZHP_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZPRES_HL(INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll - ZHT_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZT_HL (INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll - ! - ZALBP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBP(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZALBD_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBD(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ! - ZEMIS_CLEAR = SUM_DD_R1_ll(REAL(ZEMIS(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll - ZEMIW_CLEAR = SUM_DD_R1_ll(REAL(ZEMIW(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll - ZRMU0_CLEAR = SUM_DD_R1_ll(REAL(ZRMU0(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZTS_CLEAR = SUM_DD_R1_ll(REAL(ZTS(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLSM_CLEAR = SUM_DD_R1_ll(REAL(ZLSM(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLAT_CLEAR = SUM_DD_R1_ll(REAL(ZLAT(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLON_CLEAR = SUM_DD_R1_ll(REAL(ZLON(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll -! - ELSE ! no clear columns -> the first column is chosen, without physical meaning: it will not be - ! unpacked after the call to the radiation ecmwf routine - ZT_CLEAR(:) = ZTAVE(1,:) - ZP_CLEAR(:) = ZPAVE(1,:) - ZQV_CLEAR(:) = ZQVAVE(1,:) - ZOZ_CLEAR(:) = ZO3AVE(1,:) - ZDP_CLEAR(:) = ZDPRES(1,:) - ZAER_CLEAR(:,:) = ZAER(1,:,:) - IF(CAOP=='EXPL')THEN - ZPIZA_EQ_CLEAR(:,:)=ZPIZA_EQ(1,:,:) - ZCGA_EQ_CLEAR(:,:)=ZCGA_EQ(1,:,:) - ZTAUREL_EQ_CLEAR(:,:)=ZTAUREL_EQ(1,:,:) - ENDIF -! - ZHP_CLEAR(1:KFLEV) = ZPRES_HL(1,1:KFLEV) - ZHT_CLEAR(1:KFLEV) = ZT_HL(1,1:KFLEV) - ZALBP_CLEAR(:) = ZALBP(1,:) - ZALBD_CLEAR(:) = ZALBD(1,:) -! - ZEMIS_CLEAR = ZEMIS(1,1) - ZEMIW_CLEAR = ZEMIW(1,1) - ZRMU0_CLEAR = ZRMU0(1) - ZTS_CLEAR = ZTS(1) - ZLSM_CLEAR = ZLSM(1) - ZLAT_CLEAR = ZLAT(1) - ZLON_CLEAR = ZLON(1) - END IF - ! - GCLOUD(:,:) = .NOT.GCLEAR(:,:) ! .true. where the column is cloudy - GCLOUDT(:,:)=TRANSPOSE(GCLOUD(:,:)) - ICLOUD = ICLOUD_COL*KFLEV ! total number of voxels in cloudy columns - ALLOCATE(ZWORK1(ICLOUD)) - ALLOCATE(ZWORK2(ICLOUD+KFLEV)) ! allocation for the KFLEV levels of - ! the ICLOUD cloudy columns - ! and of the KFLEV levels of the clear sky one - ! - ! temperature profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZTAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZT_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZTAVE) - ALLOCATE(ZTAVE(ICLOUD_COL+1,KFLEV)) - ZTAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! vapor mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQVAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZQV_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZQVAVE) - ALLOCATE(ZQVAVE(ICLOUD_COL+1,KFLEV)) - ZQVAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! mesh size - ! - ZWORK1(:) = PACK( TRANSPOSE(ZDZ(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZDZ) - ALLOCATE(ZDZ(ICLOUD_COL+1,KFLEV)) - ZDZ(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! liquid water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQLAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQLAVE) - ALLOCATE(ZQLAVE(ICLOUD_COL+1,KFLEV)) - ZQLAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !rain - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQRAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQRAVE) - ALLOCATE(ZQRAVE(ICLOUD_COL+1,KFLEV)) - ZQRAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! ice water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQIAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQIAVE) - ALLOCATE(ZQIAVE(ICLOUD_COL+1,KFLEV)) - ZQIAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! liquid water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQLWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQLWC) - ALLOCATE(ZQLWC(ICLOUD_COL+1,KFLEV)) - ZQLWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !rain - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQRWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQRWC) - ALLOCATE(ZQRWC(ICLOUD_COL+1,KFLEV)) - ZQRWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! ice water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQIWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQIWC) - ALLOCATE(ZQIWC(ICLOUD_COL+1,KFLEV)) - ZQIWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! cloud fraction profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZCFAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCFAVE) - ALLOCATE(ZCFAVE(ICLOUD_COL+1,KFLEV)) - ZCFAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! C2R2 water particle concentration - ! - IF ( SIZE(ZCCT_C2R2) > 0 ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCCT_C2R2(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCCT_C2R2) - ALLOCATE(ZCCT_C2R2(ICLOUD_COL+1,KFLEV)) - ZCCT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - IF ( SIZE (ZCRT_C2R2) > 0 ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCRT_C2R2(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCRT_C2R2) - ALLOCATE(ZCRT_C2R2(ICLOUD_COL+1,KFLEV)) - ZCRT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - IF ( SIZE (ZCIT_C1R3) > 0) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCIT_C1R3(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCIT_C1R3) - ALLOCATE(ZCIT_C1R3(ICLOUD_COL+1,KFLEV)) - ZCIT_C1R3 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - ! - ! LIMA water particle concentration - ! - IF( CCLOUD == 'LIMA' ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCCT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCCT_LIMA) - ALLOCATE(ZCCT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCCT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) -! - ZWORK1(:) = PACK( TRANSPOSE(ZCRT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCRT_LIMA) - ALLOCATE(ZCRT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCRT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) -! - ZWORK1(:) = PACK( TRANSPOSE(ZCIT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCIT_LIMA) - ALLOCATE(ZCIT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCIT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - ! - ! ozone content profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZO3AVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZOZ_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZO3AVE) - ALLOCATE(ZO3AVE(ICLOUD_COL+1,KFLEV)) - ZO3AVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ZWORK1(:) = PACK( TRANSPOSE(ZPAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZPAVE) - ALLOCATE(ZPAVE(ICLOUD_COL+1,KFLEV)) - ZPAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !pressure thickness - ! - ZWORK1(:) = PACK( TRANSPOSE(ZDPRES(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZDP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZDPRES) - ALLOCATE(ZDPRES(ICLOUD_COL+1,KFLEV)) - ZDPRES(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !aerosols - ! - ALLOCATE(ZWORK1AER(ICLOUD,KAER)) - ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KAER)) - DO JK=1,KAER - ZWORK1AER(:,JK) = PACK( TRANSPOSE(ZAER(:,:,JK)),MASK=GCLOUDT(:,:) ) - ZWORK2AER(1:ICLOUD,JK)=ZWORK1AER(:,JK) - ZWORK2AER(ICLOUD+1:,JK)=ZAER_CLEAR(:,JK) - END DO - DEALLOCATE(ZAER) - ALLOCATE(ZAER(ICLOUD_COL+1,KFLEV,KAER)) - DO JK=1,KAER - ZAER(:,:,JK) = TRANSPOSE( RESHAPE( ZWORK2AER(:,JK),(/KFLEV,ICLOUD_COL+1/) ) ) - END DO - DEALLOCATE (ZWORK1AER) - DEALLOCATE (ZWORK2AER) - ! - IF(CAOP=='EXPL')THEN - ALLOCATE(ZWORK1AER(ICLOUD,KSWB_OLD)) !New vector with value for all cld. points - ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KSWB_OLD)) !New vector with value for all cld.points + 1 clr column - !Single scattering albedo - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK( TRANSPOSE(ZPIZA_EQ(:,:,WVL_IDX)),MASK=GCLOUDT(:,:) ) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZPIZA_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZPIZA_EQ) - ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZPIZA_EQ(:,:,WVL_IDX) = TRANSPOSE( RESHAPE( ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDDO - !Assymetry factor - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK(TRANSPOSE(ZCGA_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:)) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZCGA_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZCGA_EQ) - ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZCGA_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/))) - ENDDO - !Relative wavelength-distributed optical depth - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK(TRANSPOSE(ZTAUREL_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:)) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZTAUREL_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZTAUREL_EQ) - ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZTAUREL_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/))) - ENDDO - DEALLOCATE(ZWORK1AER) - DEALLOCATE(ZWORK2AER) - ELSE - DEALLOCATE(ZPIZA_EQ) - ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DEALLOCATE(ZCGA_EQ) - ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DEALLOCATE(ZTAUREL_EQ) - ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - ENDIF !Check on LDUST - - ! half-level variables - ! - ZWORK1(:) = PACK( TRANSPOSE(ZPRES_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZHP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZPRES_HL) - ALLOCATE(ZPRES_HL(ICLOUD_COL+1,KFLEV+1)) - ZPRES_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0 - ! - ZWORK1(:) = PACK( TRANSPOSE(ZT_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZHT_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZT_HL) - ALLOCATE(ZT_HL(ICLOUD_COL+1,KFLEV+1)) - ZT_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3) - ! - ! surface fields - ! - ALLOCATE(ZWORK3(ICLOUD_COL)) - ALLOCATE(ZWORK4(ICLOUD_COL,KSWB_MNH)) - ALLOCATE(ZWORK(KDLON)) - DO JALBS=1,KSWB_MNH - ZWORK(:) = ZALBP(:,JALBS) - ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) ) - ZWORK4(:,JALBS) = ZWORK3(:) - END DO - DEALLOCATE(ZALBP) - ALLOCATE(ZALBP(ICLOUD_COL+1,KSWB_MNH)) - ZALBP(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:) - ZALBP(ICLOUD_COL+1,:) = ZALBP_CLEAR(:) - ! - DO JALBS=1,KSWB_MNH - ZWORK(:) = ZALBD(:,JALBS) - ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) ) - ZWORK4(:,JALBS) = ZWORK3(:) - END DO - DEALLOCATE(ZALBD) - ALLOCATE(ZALBD(ICLOUD_COL+1,KSWB_MNH)) - ZALBD(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:) - ZALBD(ICLOUD_COL+1,:) = ZALBD_CLEAR(:) - ! - DEALLOCATE(ZWORK4) - ! - ZWORK3(:) = PACK( ZEMIS(:,1),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZEMIS) - ALLOCATE(ZEMIS(ICLOUD_COL+1,1)) - ZEMIS(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL) - ZEMIS(ICLOUD_COL+1,1) = ZEMIS_CLEAR - ! - ! - ZWORK3(:) = PACK( ZEMIW(:,1),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZEMIW) - ALLOCATE(ZEMIW(ICLOUD_COL+1,1)) - ZEMIW(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL) - ZEMIW(ICLOUD_COL+1,1) = ZEMIW_CLEAR - ! - ! - ZWORK3(:) = PACK( ZRMU0(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZRMU0) - ALLOCATE(ZRMU0(ICLOUD_COL+1)) - ZRMU0(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZRMU0(ICLOUD_COL+1) = ZRMU0_CLEAR - ! - ZWORK3(:) = PACK( ZLSM(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLSM) - ALLOCATE(ZLSM(ICLOUD_COL+1)) - ZLSM(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLSM (ICLOUD_COL+1)= ZLSM_CLEAR - ! - ZWORK3(:) = PACK( ZLAT(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLAT) - ALLOCATE(ZLAT(ICLOUD_COL+1)) - ZLAT(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLAT (ICLOUD_COL+1)= ZLAT_CLEAR - ! - ZWORK3(:) = PACK( ZLON(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLON) - ALLOCATE(ZLON(ICLOUD_COL+1)) - ZLON(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLON (ICLOUD_COL+1)= ZLON_CLEAR - ! - ZWORK3(:) = PACK( ZTS(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZTS) - ALLOCATE(ZTS(ICLOUD_COL+1)) - ZTS(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZTS(ICLOUD_COL+1) = ZTS_CLEAR - ! - DEALLOCATE(ZWORK1) - DEALLOCATE(ZWORK2) - DEALLOCATE(ZWORK3) - DEALLOCATE(ZWORK) - ! - IDIM = ICLOUD_COL +1 ! Number of columns where RT is computed -! -ELSE - ! - !* 5.3 RADIATION COMPUTATIONS FOR THE FULL COLUMN NUMBER (KDLON) - ! - IDIM = KDLON -END IF -! -! initialisation of cloud trace for the next radiation time step -! (if unchanged columns are not recomputed) -WHERE ( ZCLOUD(:) <= 0.0 ) - ICLEAR_2D_TM1(:) = 1 -ELSEWHERE - ICLEAR_2D_TM1(:) = 0 -END WHERE -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - KCLEARCOL_TM1(JI,JJ) = ICLEAR_2D_TM1(IIJ) ! output to be saved for next time step - END DO -END DO -! -! -!* 5.4 VERTICAL grid modification(up-down) for compatibility with ECMWF -! radiation vertical grid. ALLOCATION of the outputs. -! -! -ALLOCATE (ZWORK_GRID(SIZE(ZPRES_HL,1),KFLEV+1)) -! -!half level pressure -ZWORK_GRID(:,:)=ZPRES_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZPRES_HL(:,JKRAD) = ZWORK_GRID(:,JK1) -END DO -! -!half level temperature -ZWORK_GRID(:,:)=ZT_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZT_HL(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -DEALLOCATE(ZWORK_GRID) -! -!mean layer variables -!------------------------------------- -ALLOCATE(ZWORK_GRID(SIZE(ZTAVE,1),KFLEV)) -! -!mean layer temperature -ZWORK_GRID(:,:)=ZTAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZTAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer pressure -ZWORK_GRID(:,:)=ZPAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZPAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer pressure thickness -ZWORK_GRID(:,:)=ZDPRES(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZDPRES(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mesh size -ZWORK_GRID(:,:)=ZDZ(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZDZ(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - -!mean layer cloud fraction -ZWORK_GRID(:,:)=ZCFAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCFAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer water vapor mixing ratio -ZWORK_GRID(:,:)=ZQVAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQVAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!ice -ZWORK_GRID(:,:)=ZQIAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQIAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!liquid water -ZWORK_GRID(:,:)=ZQLAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQLAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!rain water -ZWORK_GRID(:,:)=ZQRAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQRAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!ice water content -ZWORK_GRID(:,:)=ZQIWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQIWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!liquid water content -ZWORK_GRID(:,:)=ZQLWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQLWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!rain water content -ZWORK_GRID(:,:)=ZQRWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQRWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!C2R2 water particle concentration -! -IF (SIZE(ZCCT_C2R2) > 0) THEN - ZWORK_GRID(:,:)=ZCCT_C2R2(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCCT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -IF (SIZE(ZCRT_C2R2) > 0) THEN - ZWORK_GRID(:,:)=ZCRT_C2R2(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCRT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -IF (SIZE(ZCIT_C1R3) > 0) THEN - ZWORK_GRID(:,:)=ZCIT_C1R3(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCIT_C1R3(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -! -!LIMA water particle concentration -! -IF( CCLOUD == 'LIMA' ) THEN - ZWORK_GRID(:,:)=ZCCT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCCT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -! - ZWORK_GRID(:,:)=ZCRT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCRT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -! - ZWORK_GRID(:,:)=ZCIT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCIT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -! -!ozone content -ZWORK_GRID(:,:)=ZO3AVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZO3AVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!aerosol optical depth -DO JI=1,KAER - ZWORK_GRID(:,:)=ZAER(:,:,JI) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZAER(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - END DO -END DO -IF (CAOP=='EXPL') THEN -!TURN MORE FIELDS UPSIDE DOWN... -!Dust single scattering albedo -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZPIZA_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZPIZA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO -!Dust asymmetry factor -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZCGA_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZCGA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZTAUREL_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZTAUREL_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO - -END IF - -! -DEALLOCATE(ZWORK_GRID) -! -!mean layer saturation specific humidity -! -ALLOCATE(ZQSAVE(SIZE(ZTAVE,1),SIZE(ZTAVE,2))) -! -WHERE (ZTAVE(:,:) > XTT) - ZQSAVE(:,:) = QSAT(ZTAVE, ZPAVE) -ELSEWHERE - ZQSAVE(:,:) = QSATI(ZTAVE, ZPAVE) -END WHERE -! -! allocations for the radiation code outputs -! -ALLOCATE(ZDTLW(IDIM,KFLEV)) -ALLOCATE(ZDTSW(IDIM,KFLEV)) -ALLOCATE(ZFLUX_TOP_GND_IRVISNIR(IDIM,KFLUX)) -ALLOCATE(ZSFSWDIR(IDIM,ISWB)) -ALLOCATE(ZSFSWDIF(IDIM,ISWB)) -ALLOCATE(ZDTLW_CS(IDIM,KFLEV)) -ALLOCATE(ZDTSW_CS(IDIM,KFLEV)) -ALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS(IDIM,KFLUX)) -! -! -ALLOCATE(ZFLUX_LW(IDIM,2,KFLEV+1)) -ALLOCATE(ZFLUX_SW_DOWN(IDIM,KFLEV+1)) -ALLOCATE(ZFLUX_SW_UP(IDIM,KFLEV+1)) -ALLOCATE(ZRADLP(IDIM,KFLEV)) -IF( KRAD_DIAG >= 1) THEN - ALLOCATE(ZNFLW(IDIM,KFLEV+1)) - ALLOCATE(ZNFSW(IDIM,KFLEV+1)) -ELSE - ALLOCATE(ZNFLW(0,0)) - ALLOCATE(ZNFSW(0,0)) -END IF -! -IF( KRAD_DIAG >= 2) THEN - ALLOCATE(ZFLUX_SW_DOWN_CS(IDIM,KFLEV+1)) - ALLOCATE(ZFLUX_SW_UP_CS(IDIM,KFLEV+1)) - ALLOCATE(ZFLUX_LW_CS(IDIM,2,KFLEV+1)) - ALLOCATE(ZNFLW_CS(IDIM,KFLEV+1)) - ALLOCATE(ZNFSW_CS(IDIM,KFLEV+1)) -ELSE - ALLOCATE(ZFLUX_SW_DOWN_CS(0,0)) - ALLOCATE(ZFLUX_SW_UP_CS(0,0)) - ALLOCATE(ZFLUX_LW_CS(0,0,0)) - ALLOCATE(ZNFSW_CS(0,0)) - ALLOCATE(ZNFLW_CS(0,0)) -END IF -! -IF( KRAD_DIAG >= 3) THEN - ALLOCATE(ZPLAN_ALB_VIS(IDIM)) - ALLOCATE(ZPLAN_ALB_NIR(IDIM)) - ALLOCATE(ZPLAN_TRA_VIS(IDIM)) - ALLOCATE(ZPLAN_TRA_NIR(IDIM)) - ALLOCATE(ZPLAN_ABS_VIS(IDIM)) - ALLOCATE(ZPLAN_ABS_NIR(IDIM)) -ELSE - ALLOCATE(ZPLAN_ALB_VIS(0)) - ALLOCATE(ZPLAN_ALB_NIR(0)) - ALLOCATE(ZPLAN_TRA_VIS(0)) - ALLOCATE(ZPLAN_TRA_NIR(0)) - ALLOCATE(ZPLAN_ABS_VIS(0)) - ALLOCATE(ZPLAN_ABS_NIR(0)) -END IF -! -IF( KRAD_DIAG >= 4) THEN - ALLOCATE(ZEFCL_RRTM(IDIM,KFLEV)) - ALLOCATE(ZCLSW_TOTAL(IDIM,KFLEV)) - ALLOCATE(ZTAU_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZOMEGA_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZCG_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZEFCL_LWD(IDIM,KFLEV)) - ALLOCATE(ZEFCL_LWU(IDIM,KFLEV)) - ALLOCATE(ZFLWP(IDIM,KFLEV)) - ALLOCATE(ZFIWP(IDIM,KFLEV)) - ALLOCATE(ZRADIP(IDIM,KFLEV)) -ELSE - ALLOCATE(ZEFCL_RRTM(0,0)) - ALLOCATE(ZCLSW_TOTAL(0,0)) - ALLOCATE(ZTAU_TOTAL(0,0,0)) - ALLOCATE(ZOMEGA_TOTAL(0,0,0)) - ALLOCATE(ZCG_TOTAL(0,0,0)) - ALLOCATE(ZEFCL_LWD(0,0)) - ALLOCATE(ZEFCL_LWU(0,0)) - ALLOCATE(ZFLWP(0,0)) - ALLOCATE(ZFIWP(0,0)) - ALLOCATE(ZRADIP(0,0)) -END IF -! -!* 5.6 CALLS THE ECMWF_RADIATION ROUTINES -! -! mixing ratio -> specific humidity conversion (for ECMWF routine) -! mixing ratio = mv/md ; specific humidity = mv/(mv+md) - -ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:)) ! Because -! ZAER = 1e-5*ZAER -! ZO3AVE = 1e-5*ZO3AVE! -IF( IDIM <= KRAD_COLNBR ) THEN -! -! there is less than KRAD_COLNBR columns to be considered therefore -! no split of the arrays is performed -! Note that radiation scheme only takes scalar emissivities so only fist value of the spectral emissivity is taken - ALLOCATE(ZTAVE_RAD(SIZE(ZTAVE,1),SIZE(ZTAVE,2))) - ALLOCATE(ZPAVE_RAD(SIZE(ZPAVE,1),SIZE(ZPAVE,2))) - ZTAVE_RAD = ZTAVE - ZPAVE_RAD = ZPAVE - IF (CCLOUD == 'LIMA') THEN - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA, & - ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ) - - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA, & - ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ,ZLAT,ZLON ) - ENDIF - - ELSE - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3, & - ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3, & - ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ,ZLAT,ZLON ) - END IF - - - END IF - DEALLOCATE(ZTAVE_RAD,ZPAVE_RAD) -! -ELSE -! -! the splitting of the arrays will be performed -! - INUM_CALL = CEILING( REAL( IDIM ) / REAL( KRAD_COLNBR ) ) - IDIM_RESIDUE = IDIM -! - DO JI_SPLIT = 1 , INUM_CALL - IDIM_EFF = MIN( IDIM_RESIDUE,KRAD_COLNBR ) - ! - IF( JI_SPLIT == 1 .OR. JI_SPLIT == INUM_CALL ) THEN - ALLOCATE( ZALBP_SPLIT(IDIM_EFF,KSWB_MNH)) - ALLOCATE( ZALBD_SPLIT(IDIM_EFF,KSWB_MNH)) - ALLOCATE( ZEMIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZEMIW_SPLIT(IDIM_EFF)) - ALLOCATE( ZRMU0_SPLIT(IDIM_EFF)) - ALLOCATE( ZLAT_SPLIT(IDIM_EFF)) - ALLOCATE( ZLON_SPLIT(IDIM_EFF)) - ALLOCATE( ZCFAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZO3AVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZT_HL_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZDZ_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQLAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQIAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQRAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQLWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQIWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQRWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQVAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZPAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZAER_SPLIT( IDIM_EFF,KFLEV,KAER)) - ALLOCATE( ZPIZA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZCGA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZTAUREL_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZDPRES_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZLSM_SPLIT(IDIM_EFF)) - ALLOCATE( ZQSAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTS_SPLIT(IDIM_EFF)) - ! output pronostic - ALLOCATE( ZDTLW_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZDTSW_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLUX_TOP_GND_IRVISNIR_SPLIT(IDIM_EFF,KFLUX)) - ALLOCATE( ZSFSWDIR_SPLIT(IDIM_EFF,ISWB)) - ALLOCATE( ZSFSWDIF_SPLIT(IDIM_EFF,ISWB)) - ALLOCATE( ZDTLW_CS_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZDTSW_CS_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(IDIM_EFF,KFLUX)) -! - ALLOCATE( ZFLUX_LW_SPLIT(IDIM_EFF,2,KFLEV+1)) - ALLOCATE( ZFLUX_SW_DOWN_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_SW_UP_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZRADLP_SPLIT(IDIM_EFF,KFLEV)) - IF(KRAD_DIAG >=1) THEN - ALLOCATE( ZNFSW_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZNFLW_SPLIT(IDIM_EFF,KFLEV+1)) - ELSE - ALLOCATE( ZNFSW_SPLIT(0,0)) - ALLOCATE( ZNFLW_SPLIT(0,0)) - END IF -! - IF( KRAD_DIAG >= 2) THEN - ALLOCATE( ZFLUX_SW_DOWN_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_SW_UP_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_LW_CS_SPLIT(IDIM_EFF,2,KFLEV+1)) - ALLOCATE( ZNFSW_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZNFLW_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ELSE - ALLOCATE( ZFLUX_SW_DOWN_CS_SPLIT(0,0)) - ALLOCATE( ZFLUX_SW_UP_CS_SPLIT(0,0)) - ALLOCATE( ZFLUX_LW_CS_SPLIT(0,0,0)) - ALLOCATE( ZNFSW_CS_SPLIT(0,0)) - ALLOCATE( ZNFLW_CS_SPLIT(0,0)) - END IF -! - IF( KRAD_DIAG >= 3) THEN - ALLOCATE( ZPLAN_ALB_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ALB_NIR_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_TRA_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_TRA_NIR_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ABS_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ABS_NIR_SPLIT(IDIM_EFF)) - ELSE - ALLOCATE( ZPLAN_ALB_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_ALB_NIR_SPLIT(0)) - ALLOCATE( ZPLAN_TRA_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_TRA_NIR_SPLIT(0)) - ALLOCATE( ZPLAN_ABS_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_ABS_NIR_SPLIT(0)) - END IF -! - IF( KRAD_DIAG >= 4) THEN - ALLOCATE( ZEFCL_RRTM_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZCLSW_TOTAL_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTAU_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZOMEGA_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZCG_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZEFCL_LWD_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZEFCL_LWU_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLWP_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFIWP_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZRADIP_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE( ZEFCL_RRTM_SPLIT(0,0)) - ALLOCATE( ZCLSW_TOTAL_SPLIT(0,0)) - ALLOCATE( ZTAU_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZOMEGA_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZCG_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZEFCL_LWD_SPLIT(0,0)) - ALLOCATE( ZEFCL_LWU_SPLIT(0,0)) - ALLOCATE( ZFLWP_SPLIT(0,0)) - ALLOCATE( ZFIWP_SPLIT(0,0)) - ALLOCATE( ZRADIP_SPLIT(0,0)) - END IF -! -! C2R2 coupling -! - IF (SIZE (ZCCT_C2R2) > 0) THEN - ALLOCATE (ZCCT_C2R2_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCCT_C2R2_SPLIT(0,0)) - END IF -! - IF (SIZE (ZCRT_C2R2) > 0) THEN - ALLOCATE (ZCRT_C2R2_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCRT_C2R2_SPLIT(0,0)) - END IF -! - IF (SIZE (ZCIT_C1R3) > 0) THEN - ALLOCATE (ZCIT_C1R3_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCIT_C1R3_SPLIT(0,0)) - END IF -! -! LIMA coupling -! - IF( CCLOUD == 'LIMA' ) THEN - ALLOCATE (ZCCT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE (ZCRT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE (ZCIT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - END IF - END IF -! -! fill the split arrays with their values taken from the full arrays -! - IBEG = IDIM-IDIM_RESIDUE+1 - IEND = IBEG+IDIM_EFF-1 -! - ZALBP_SPLIT(:,:) = ZALBP( IBEG:IEND ,:) - ZALBD_SPLIT(:,:) = ZALBD( IBEG:IEND ,:) - ZEMIS_SPLIT(:) = ZEMIS ( IBEG:IEND,1 ) - ZEMIW_SPLIT(:) = ZEMIW ( IBEG:IEND,1 ) - ZRMU0_SPLIT(:) = ZRMU0 ( IBEG:IEND ) - ZLAT_SPLIT(:) = ZLAT ( IBEG:IEND ) - ZLON_SPLIT(:) = ZLON ( IBEG:IEND ) - ZCFAVE_SPLIT(:,:) = ZCFAVE( IBEG:IEND ,:) - ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:) - ZT_HL_SPLIT(:,:) = ZT_HL( IBEG:IEND ,:) - ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:) - ZQLAVE_SPLIT(:,:) = ZQLAVE( IBEG:IEND , :) - ZDZ_SPLIT(:,:) = ZDZ( IBEG:IEND , :) - ZQIAVE_SPLIT(:,:) = ZQIAVE( IBEG:IEND ,:) - ZQRAVE_SPLIT (:,:) = ZQRAVE (IBEG:IEND ,:) - ZQLWC_SPLIT(:,:) = ZQLWC( IBEG:IEND , :) - ZQIWC_SPLIT(:,:) = ZQIWC( IBEG:IEND ,:) - ZQRWC_SPLIT(:,:) = ZQRWC (IBEG:IEND ,:) - ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:) - ZTAVE_SPLIT(:,:) = ZTAVE ( IBEG:IEND ,:) - ZPAVE_SPLIT(:,:) = ZPAVE ( IBEG:IEND ,:) - ZAER_SPLIT (:,:,:) = ZAER ( IBEG:IEND ,:,:) - IF(CAOP=='EXPL')THEN - ZPIZA_EQ_SPLIT(:,:,:)=ZPIZA_EQ(IBEG:IEND,:,:) - ZCGA_EQ_SPLIT(:,:,:)=ZCGA_EQ(IBEG:IEND,:,:) - ZTAUREL_EQ_SPLIT(:,:,:)=ZTAUREL_EQ(IBEG:IEND,:,:) - ENDIF - ZDPRES_SPLIT(:,:) = ZDPRES (IBEG:IEND ,:) - ZLSM_SPLIT (:) = ZLSM (IBEG:IEND) - ZQSAVE_SPLIT (:,:) = ZQSAVE (IBEG:IEND ,:) - ZTS_SPLIT (:) = ZTS (IBEG:IEND) -! -! CALL the ECMWF radiation with the split array -! - IF (CCLOUD == 'LIMA') THEN -! LIMA concentrations - ZCCT_LIMA_SPLIT(:,:) = ZCCT_LIMA (IBEG:IEND ,:) - ZCRT_LIMA_SPLIT(:,:) = ZCRT_LIMA (IBEG:IEND ,:) - ZCIT_LIMA_SPLIT(:,:) = ZCIT_LIMA (IBEG:IEND ,:) - - IF (CRAD == "ECMW") THEN -! - CALL ECMWF_RADIATION_VERS2 ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, & - ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, & - ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT, & - ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT, ZT_HL_SPLIT, & - ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT,ZCRT_LIMA_SPLIT,ZCIT_LIMA_SPLIT, & - ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, & - ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT, & - ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT, & - ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, & - ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT, & - GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT, & - PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT, & - ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, & - ZQSAVE_SPLIT, ZQRAVE_SPLIT, ZQRWC_SPLIT, & - ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT, & - ZCRT_LIMA_SPLIT, ZCIT_LIMA_SPLIT, & - ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, & - ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, & - ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, & - ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, ZTAU_TOTAL_SPLIT, & - ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT, & - GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT ) - END IF - ELSE -! C2R2 concentrations - IF (SIZE (ZCCT_C2R2) > 0) ZCCT_C2R2_SPLIT(:,:) = ZCCT_C2R2 (IBEG:IEND ,:) - IF (SIZE (ZCRT_C2R2) > 0) ZCRT_C2R2_SPLIT(:,:) = ZCRT_C2R2 (IBEG:IEND ,:) - IF (SIZE (ZCIT_C1R3) > 0) ZCIT_C1R3_SPLIT(:,:) = ZCIT_C1R3 (IBEG:IEND ,:) - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, & - ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, & - ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT, & - ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT, ZT_HL_SPLIT, & - ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT,ZCRT_C2R2_SPLIT,ZCIT_C1R3_SPLIT, & - ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, & - ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT, & - ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT, & - ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, & - ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT, & - GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT, & - PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT, & - ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, & - ZQSAVE_SPLIT, ZQRAVE_SPLIT, ZQRWC_SPLIT, & - ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT, & - ZCRT_C2R2_SPLIT, ZCIT_C1R3_SPLIT, & - ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, & - ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, & - ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, & - ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, ZTAU_TOTAL_SPLIT, & - ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT, & - GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT ) - END IF - END IF -! -! fill the full output arrays with the split arrays -! - ZDTLW( IBEG:IEND ,:) = ZDTLW_SPLIT(:,:) - ZDTSW( IBEG:IEND ,:) = ZDTSW_SPLIT(:,:) - ZFLUX_TOP_GND_IRVISNIR( IBEG:IEND ,:)= ZFLUX_TOP_GND_IRVISNIR_SPLIT(:,:) - ZSFSWDIR (IBEG:IEND,:) = ZSFSWDIR_SPLIT(:,:) - ZSFSWDIF (IBEG:IEND,:) = ZSFSWDIF_SPLIT(:,:) -! - ZDTLW_CS( IBEG:IEND ,:) = ZDTLW_CS_SPLIT(:,:) - ZDTSW_CS( IBEG:IEND ,:) = ZDTSW_CS_SPLIT(:,:) - ZFLUX_TOP_GND_IRVISNIR_CS( IBEG:IEND ,:) = & - ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(:,:) - ZFLUX_LW( IBEG:IEND ,:,:) = ZFLUX_LW_SPLIT(:,:,:) - ZFLUX_SW_DOWN( IBEG:IEND ,:) = ZFLUX_SW_DOWN_SPLIT(:,:) - ZFLUX_SW_UP( IBEG:IEND ,:) = ZFLUX_SW_UP_SPLIT(:,:) - ZRADLP( IBEG:IEND ,:) = ZRADLP_SPLIT(:,:) - IF ( tpfile%lopened ) THEN - IF( KRAD_DIAG >= 1) THEN - ZNFLW(IBEG:IEND ,:)= ZNFLW_SPLIT(:,:) - ZNFSW(IBEG:IEND ,:)= ZNFSW_SPLIT(:,:) - IF( KRAD_DIAG >= 2) THEN - ZFLUX_SW_DOWN_CS( IBEG:IEND ,:) = ZFLUX_SW_DOWN_CS_SPLIT(:,:) - ZFLUX_SW_UP_CS( IBEG:IEND ,:) = ZFLUX_SW_UP_CS_SPLIT(:,:) - ZFLUX_LW_CS( IBEG:IEND ,:,:) = ZFLUX_LW_CS_SPLIT(:,:,:) - ZNFLW_CS(IBEG:IEND ,:)= ZNFLW_CS_SPLIT(:,:) - ZNFSW_CS(IBEG:IEND ,:)= ZNFSW_CS_SPLIT(:,:) - IF( KRAD_DIAG >= 3) THEN - ZPLAN_ALB_VIS( IBEG:IEND ) = ZPLAN_ALB_VIS_SPLIT(:) - ZPLAN_ALB_NIR( IBEG:IEND ) = ZPLAN_ALB_NIR_SPLIT(:) - ZPLAN_TRA_VIS( IBEG:IEND ) = ZPLAN_TRA_VIS_SPLIT(:) - ZPLAN_TRA_NIR( IBEG:IEND ) = ZPLAN_TRA_NIR_SPLIT(:) - ZPLAN_ABS_VIS( IBEG:IEND ) = ZPLAN_ABS_VIS_SPLIT(:) - ZPLAN_ABS_NIR( IBEG:IEND ) = ZPLAN_ABS_NIR_SPLIT(:) - IF( KRAD_DIAG >= 4) THEN - ZEFCL_LWD( IBEG:IEND ,:) = ZEFCL_LWD_SPLIT(:,:) - ZEFCL_LWU( IBEG:IEND ,:) = ZEFCL_LWU_SPLIT(:,:) - ZFLWP( IBEG:IEND ,:) = ZFLWP_SPLIT(:,:) - ZFIWP( IBEG:IEND ,:) = ZFIWP_SPLIT(:,:) - ZRADIP( IBEG:IEND ,:) = ZRADIP_SPLIT(:,:) - ZEFCL_RRTM( IBEG:IEND ,:) = ZEFCL_RRTM_SPLIT(:,:) - ZCLSW_TOTAL( IBEG:IEND ,:) = ZCLSW_TOTAL_SPLIT(:,:) - ZTAU_TOTAL( IBEG:IEND ,:,:) = ZTAU_TOTAL_SPLIT(:,:,:) - ZOMEGA_TOTAL( IBEG:IEND ,:,:)= ZOMEGA_TOTAL_SPLIT(:,:,:) - ZCG_TOTAL( IBEG:IEND ,:,:) = ZCG_TOTAL_SPLIT(:,:,:) - END IF - END IF - END IF - END IF - END IF -! - IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF -! -! desallocation of the split arrays -! - IF( JI_SPLIT >= INUM_CALL-1 ) THEN - DEALLOCATE( ZALBP_SPLIT ) - DEALLOCATE( ZALBD_SPLIT ) - DEALLOCATE( ZEMIS_SPLIT ) - DEALLOCATE( ZEMIW_SPLIT ) - DEALLOCATE( ZLAT_SPLIT ) - DEALLOCATE( ZLON_SPLIT ) - DEALLOCATE( ZRMU0_SPLIT ) - DEALLOCATE( ZCFAVE_SPLIT ) - DEALLOCATE( ZO3AVE_SPLIT ) - DEALLOCATE( ZT_HL_SPLIT ) - DEALLOCATE( ZPRES_HL_SPLIT ) - DEALLOCATE( ZDZ_SPLIT ) - DEALLOCATE( ZQLAVE_SPLIT ) - DEALLOCATE( ZQIAVE_SPLIT ) - DEALLOCATE( ZQVAVE_SPLIT ) - DEALLOCATE( ZTAVE_SPLIT ) - DEALLOCATE( ZPAVE_SPLIT ) - DEALLOCATE( ZAER_SPLIT ) - DEALLOCATE( ZDPRES_SPLIT ) - DEALLOCATE( ZLSM_SPLIT ) - DEALLOCATE( ZQSAVE_SPLIT ) - DEALLOCATE( ZQRAVE_SPLIT ) - DEALLOCATE( ZQLWC_SPLIT ) - DEALLOCATE( ZQRWC_SPLIT ) - DEALLOCATE( ZQIWC_SPLIT ) - IF ( ALLOCATED( ZCCT_C2R2_SPLIT ) ) DEALLOCATE( ZCCT_C2R2_SPLIT ) - IF ( ALLOCATED( ZCRT_C2R2_SPLIT ) ) DEALLOCATE( ZCRT_C2R2_SPLIT ) - IF ( ALLOCATED( ZCIT_C1R3_SPLIT ) ) DEALLOCATE( ZCIT_C1R3_SPLIT ) - IF ( ALLOCATED( ZCCT_LIMA_SPLIT ) ) DEALLOCATE( ZCCT_LIMA_SPLIT ) - IF ( ALLOCATED( ZCRT_LIMA_SPLIT ) ) DEALLOCATE( ZCRT_LIMA_SPLIT ) - IF ( ALLOCATED( ZCIT_LIMA_SPLIT ) ) DEALLOCATE( ZCIT_LIMA_SPLIT ) - DEALLOCATE( ZTS_SPLIT ) - DEALLOCATE( ZNFLW_CS_SPLIT) - DEALLOCATE( ZNFLW_SPLIT) - DEALLOCATE( ZNFSW_CS_SPLIT) - DEALLOCATE( ZNFSW_SPLIT) - DEALLOCATE(ZDTLW_SPLIT) - DEALLOCATE(ZDTSW_SPLIT) - DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_SPLIT) - DEALLOCATE(ZSFSWDIR_SPLIT) - DEALLOCATE(ZSFSWDIF_SPLIT) - DEALLOCATE(ZFLUX_SW_DOWN_SPLIT) - DEALLOCATE(ZFLUX_SW_UP_SPLIT) - DEALLOCATE(ZFLUX_LW_SPLIT) - DEALLOCATE(ZDTLW_CS_SPLIT) - DEALLOCATE(ZDTSW_CS_SPLIT) - DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT) - DEALLOCATE(ZPLAN_ALB_VIS_SPLIT) - DEALLOCATE(ZPLAN_ALB_NIR_SPLIT) - DEALLOCATE(ZPLAN_TRA_VIS_SPLIT) - DEALLOCATE(ZPLAN_TRA_NIR_SPLIT) - DEALLOCATE(ZPLAN_ABS_VIS_SPLIT) - DEALLOCATE(ZPLAN_ABS_NIR_SPLIT) - DEALLOCATE(ZEFCL_LWD_SPLIT) - DEALLOCATE(ZEFCL_LWU_SPLIT) - DEALLOCATE(ZFLWP_SPLIT) - DEALLOCATE(ZRADLP_SPLIT) - DEALLOCATE(ZRADIP_SPLIT) - DEALLOCATE(ZFIWP_SPLIT) - DEALLOCATE(ZEFCL_RRTM_SPLIT) - DEALLOCATE(ZCLSW_TOTAL_SPLIT) - DEALLOCATE(ZTAU_TOTAL_SPLIT) - DEALLOCATE(ZOMEGA_TOTAL_SPLIT) - DEALLOCATE(ZCG_TOTAL_SPLIT) - DEALLOCATE(ZFLUX_SW_DOWN_CS_SPLIT) - DEALLOCATE(ZFLUX_SW_UP_CS_SPLIT) - DEALLOCATE(ZFLUX_LW_CS_SPLIT) - DEALLOCATE(ZPIZA_EQ_SPLIT) - DEALLOCATE(ZCGA_EQ_SPLIT) - DEALLOCATE(ZTAUREL_EQ_SPLIT) - END IF - END DO -END IF - -! -DEALLOCATE(ZTAVE) -DEALLOCATE(ZPAVE) -DEALLOCATE(ZQVAVE) -DEALLOCATE(ZQLAVE) -DEALLOCATE(ZDZ) -DEALLOCATE(ZQIAVE) -DEALLOCATE(ZCFAVE) -DEALLOCATE(ZPRES_HL) -DEALLOCATE(ZT_HL) -DEALLOCATE(ZRMU0) -DEALLOCATE(ZLSM) -DEALLOCATE(ZQSAVE) -DEALLOCATE(ZAER) -DEALLOCATE(ZPIZA_EQ) -DEALLOCATE(ZCGA_EQ) -DEALLOCATE(ZTAUREL_EQ) -DEALLOCATE(ZDPRES) -DEALLOCATE(ZCCT_C2R2) -DEALLOCATE(ZCRT_C2R2) -DEALLOCATE(ZCIT_C1R3) -DEALLOCATE(ZLAT) -DEALLOCATE(ZLON) -IF (CCLOUD == 'LIMA') THEN - DEALLOCATE(ZCCT_LIMA) - DEALLOCATE(ZCRT_LIMA) - DEALLOCATE(ZCIT_LIMA) -END IF -! -DEALLOCATE(ZTS) -DEALLOCATE(ZALBP) -DEALLOCATE(ZALBD) -DEALLOCATE(ZEMIS) -DEALLOCATE(ZEMIW) -DEALLOCATE(ZQRAVE) -DEALLOCATE(ZQLWC) -DEALLOCATE(ZQIWC) -DEALLOCATE(ZQRWC) -DEALLOCATE(ICLEAR_2D_TM1) -! -!* 5.6 UNCOMPRESSES THE OUTPUT FIELD IN CASE OF -! CLEAR-SKY APPROXIMATION -! -IF(OCLEAR_SKY .OR. OCLOUD_ONLY) THEN - ALLOCATE(ZWORK1(ICLOUD)) - ALLOCATE(ZWORK2(ICLOUD+KFLEV)) ! allocation for the KFLEV levels of - ALLOCATE(ZWORK4(KFLEV,KDLON)) - ZWORK2(:) = PACK( TRANSPOSE(ZDTLW(:,:)),MASK=.TRUE. ) -! - DO JK=1,KFLEV - ZWORK4(JK,:) = ZWORK2(ICLOUD+JK) - END DO - ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD) - ZZDTLW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:) & - ,FIELD=ZWORK4(:,:) ) ) - ! - ZWORK2(:) = PACK( TRANSPOSE(ZDTSW(:,:)),MASK=.TRUE. ) - DO JK=1,KFLEV - ZWORK4(JK,:) = ZWORK2(ICLOUD+JK) - END DO - ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD) - ZZDTSW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:) & - ,FIELD=ZWORK4(:,:) ) ) - ! - DEALLOCATE(ZWORK1) - DEALLOCATE(ZWORK2) - DEALLOCATE(ZWORK4) - ! - ZZTGVISC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,5) - ! - ZZTGVIS(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,5),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGVISC ) - ZZTGNIRC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,6) - ! - ZZTGNIR(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,6),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGNIRC ) - ZZTGIRC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,4) - ! - ZZTGIR (:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,4),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGIRC ) - ! - DO JSWB=1,ISWB - ZZSFSWDIRC(JSWB) = ZSFSWDIR (ICLOUD_COL+1,JSWB) - ! - ZZSFSWDIR(:,JSWB) = UNPACK(ZSFSWDIR (:,JSWB),MASK=.NOT.GCLEAR_2D(:), & - FIELD= ZZSFSWDIRC(JSWB) ) - ! - ZZSFSWDIFC(JSWB) = ZSFSWDIF (ICLOUD_COL+1,JSWB) - ! - ZZSFSWDIF(:,JSWB) = UNPACK(ZSFSWDIF (:,JSWB),MASK=.NOT.GCLEAR_2D(:), & - FIELD= ZZSFSWDIFC(JSWB) ) - END DO -! -! No cloud case -! - IF( GNOCL ) THEN - IF (SIZE(ZZDTLW,1)>1) THEN - ZZDTLW(1,:)= ZZDTLW(2,:) - ENDIF - IF (SIZE(ZZDTSW,1)>1) THEN - ZZDTSW(1,:)= ZZDTSW(2,:) - ENDIF - ZZTGVIS(1) = ZZTGVISC - ZZTGNIR(1) = ZZTGNIRC - ZZTGIR(1) = ZZTGIRC - ZZSFSWDIR(1,:) = ZZSFSWDIRC(:) - ZZSFSWDIF(1,:) = ZZSFSWDIFC(:) - END IF -ELSE - ZZDTLW(:,:) = ZDTLW(:,:) - ZZDTSW(:,:) = ZDTSW(:,:) - ZZTGVIS(:) = ZFLUX_TOP_GND_IRVISNIR(:,5) - ZZTGNIR(:) = ZFLUX_TOP_GND_IRVISNIR(:,6) - ZZTGIR(:) = ZFLUX_TOP_GND_IRVISNIR(:,4) - ZZSFSWDIR(:,:) = ZSFSWDIR(:,:) - ZZSFSWDIF(:,:) = ZSFSWDIF(:,:) -END IF -! -DEALLOCATE(ZDTLW) -DEALLOCATE(ZDTSW) -DEALLOCATE(ZSFSWDIR) -DEALLOCATE(ZSFSWDIF) -! -!-------------------------------------------------------------------------------------------- -! -!* 6. COMPUTES THE RADIATIVE SOURCES AND THE DOWNWARD SURFACE FLUXES in 2D horizontal -! ------------------------------------------------------------------------------ -! -! Computes the SW and LW radiative tendencies -! note : tendencies in K/s for MNH (from K/day) -! -ZDTRAD_LW(:,:,:)=0.0 -ZDTRAD_SW(:,:,:)=0.0 -DO JK=IKB,IKE - JKRAD= JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZDTRAD_LW(JI,JJ,JK) = ZZDTLW(IIJ,JKRAD)/XDAY ! XDAY from modd_cst (day duration in s) - ZDTRAD_SW(JI,JJ,JK) = ZZDTSW(IIJ,JKRAD)/XDAY - END DO - END DO -END DO -! -! Computes the downward SW and LW surface fluxes + diffuse and direct contribution -! -ZLWD(:,:)=0. -ZSWDDIR(:,:,:)=0. -ZSWDDIF(:,:,:)=0. -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZLWD(JI,JJ) = ZZTGIR(IIJ) - ZSWDDIR(JI,JJ,:) = ZZSFSWDIR (IIJ,:) - ZSWDDIF(JI,JJ,:) = ZZSFSWDIF (IIJ,:) - END DO -END DO -! -!final THETA_radiative tendency and surface fluxes -! -IF(OCLOUD_ONLY) THEN - - GCLOUD_SURF(:,:) = .FALSE. - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - GCLOUD_SURF(JI,JJ) = GCLOUD(IIJ,1) - END DO - END DO - - ZWORKL(:,:) = GCLOUD_SURF(:,:) - - DO JK = IKB,IKE - WHERE( ZWORKL(:,:) ) - PDTHRAD(:,:,JK) = (ZDTRAD_LW(:,:,JK)+ZDTRAD_SW(:,:,JK))/ZEXNT(:,:,JK) - ENDWHERE - END DO - ! - WHERE( ZWORKL(:,:) ) - PSRFLWD(:,:) = ZLWD(:,:) - ENDWHERE - DO JSWB=1,ISWB - WHERE( ZWORKL(:,:) ) - PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB) - PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB) - END WHERE - END DO -ELSE - PDTHRAD(:,:,:) = (ZDTRAD_LW(:,:,:)+ZDTRAD_SW(:,:,:))/ZEXNT(:,:,:) ! tendency in potential temperature - PDTHRADSW(:,:,:) = ZDTRAD_SW(:,:,:)/ZEXNT(:,:,:) - PDTHRADLW(:,:,:) = ZDTRAD_LW(:,:,:)/ZEXNT(:,:,:) - PSRFLWD(:,:) = ZLWD(:,:) - DO JSWB=1,ISWB - PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB) - PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB) - END DO -! -!sw and lw fluxes -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - PSWU(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD) - PSWD(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD) - PLWU(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD) - PLWD(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD) ! in ECMWF all fluxes are upward - END DO - END DO - END DO -!!!effective radius - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - PRADEFF(JI,JJ,JK) = ZRADLP(IIJ,JKRAD) - END DO - END DO - END DO -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 7. STORE SOME ADDITIONNAL RADIATIVE FIELDS -! --------------------------------------- -! -IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN - ZSTORE_3D(:,:,:) = 0.0 - ZSTORE_3D2(:,:,:) = 0.0 - ZSTORE_2D(:,:) = 0.0 - ! - TZFIELD2D = TFIELDMETADATA( & - CMNHNAME = 'generic 2D for radiations', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - - TZFIELD3D = TFIELDMETADATA( & - CMNHNAME = 'generic 3D for radiations', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - IF( KRAD_DIAG >= 1) THEN - ! - ILUOUT = TLUOUT%NLU - WRITE(UNIT=ILUOUT,FMT='(/," STORE ADDITIONNAL RADIATIVE FIELDS:", & - & " KRAD_DIAG=",I1,/)') KRAD_DIAG - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_DOWN' - TZFIELD3D%CLONGNAME = 'SWF_DOWN' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_UP' - TZFIELD3D%CLONGNAME = 'SWF_UP' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_DOWN' - TZFIELD3D%CLONGNAME = 'LWF_DOWN' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_UP' - TZFIELD3D%CLONGNAME = 'LWF_UP' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFLW(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_NET' - TZFIELD3D%CLONGNAME = 'LWF_NET' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFSW(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_NET' - TZFIELD3D%CLONGNAME = 'SWF_NET' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = ZDTRAD_LW (JI,JJ,JK)*XDAY - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_LW' - TZFIELD3D%CLONGNAME = 'DTRAD_LW' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = ZDTRAD_SW (JI,JJ,JK)*XDAY - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_SW' - TZFIELD3D%CLONGNAME = 'DTRAD_SW' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_VIS' - TZFIELD2D%CLONGNAME = 'RADSWD_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) -! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_NIR' - TZFIELD2D%CLONGNAME = 'RADSWD_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADLWD' - TZFIELD2D%CLONGNAME = 'RADLWD' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADLWD' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - END IF - ! - ! - IF( KRAD_DIAG >= 2) THEN - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_DOWN_CS' - TZFIELD3D%CLONGNAME = 'SWF_DOWN_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_UP_CS' - TZFIELD3D%CLONGNAME = 'SWF_UP_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW_CS(IIJ,2,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_DOWN_CS' - TZFIELD3D%CLONGNAME = 'LWF_DOWN_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW_CS(IIJ,1,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_UP_CS' - TZFIELD3D%CLONGNAME = 'LWF_UP_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFLW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_NET_CS' - TZFIELD3D%CLONGNAME = 'LWF_NET_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFSW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_NET_CS' - TZFIELD3D%CLONGNAME = 'SWF_NET_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZDTSW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_SW_CS' - TZFIELD3D%CLONGNAME = 'DTRAD_SW_CS' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZDTLW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_LW_CS' - TZFIELD3D%CLONGNAME = 'DTRAD_LW_CS' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_VIS_CS' - TZFIELD2D%CLONGNAME = 'RADSWD_VIS_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_NIR_CS' - TZFIELD2D%CLONGNAME = 'RADSWD_NIR_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADLWD_CS' - TZFIELD2D%CLONGNAME = 'RADLWD_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADLWD_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - END IF - ! - ! - IF( KRAD_DIAG >= 3) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ALB_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_ALB_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ALB_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_ALB_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_TRA_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_TRA_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_TRA_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_TRA_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ABS_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_ABS_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ABS_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_ABS_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - ! - END IF -! -! - IF( KRAD_DIAG >= 4) THEN - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWD(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFNEB_DOWN' - TZFIELD3D%CLONGNAME = 'EFNEB_DOWN' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWU(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFNEB_UP' - TZFIELD3D%CLONGNAME = 'EFNEB_UP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLWP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'FLWP' - TZFIELD3D%CLONGNAME = 'FLWP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_FLWP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFIWP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'FIWP' - TZFIELD3D%CLONGNAME = 'FIWP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_FIWP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZRADLP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFRADL' - TZFIELD3D%CLONGNAME = 'EFRADL' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZRADIP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFRADI' - TZFIELD3D%CLONGNAME = 'EFRADI' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZCLSW_TOTAL(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SW_NEB' - TZFIELD3D%CLONGNAME = 'SW_NEB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SW_NEB' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_RRTM(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'RRTM_LW_NEB' - TZFIELD3D%CLONGNAME = 'RRTM_LW_NEB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LW_NEB' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - ! spectral bands - IF (KSWB_OLD==6) THEN - INIR = 4 - ELSE - INIR = 2 - END IF - - DO JBAND=1,INIR-1 - WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'VIS', JBAND - END DO - DO JBAND= INIR, KSWB_OLD - WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'NIR', JBAND - END DO -! - DO JBAND=1,KSWB_OLD - TZFIELD3D%CMNHNAME = 'ODAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'ODAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_OD_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZTAUAZ(:,:,:,JBAND)) - ! - TZFIELD3D%CMNHNAME = 'SSAAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'SSAAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZPIZAZ(:,:,:,JBAND)) - ! - TZFIELD3D%CMNHNAME = 'GAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'GAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_G_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZCGAZ(:,:,:,JBAND)) - ENDDO - - DO JBAND=1,KSWB_OLD - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZTAU_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'OTH_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'OTH_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZOMEGA_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SSA_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'SSA_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZCG_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'ASF_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'ASF_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - END DO - END IF - ! - ! - IF (KRAD_DIAG >= 5) THEN -! -! OZONE and AER optical thickness climato entering the ecmwf_radiation_vers2 -! note the vertical grid is re-inversed for graphic ! - DO JK=IKB,IKE - JKRAD = KFLEV+1 - JK + JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZO3AVE(IIJ, JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'O3CLIM' - TZFIELD3D%CLONGNAME = 'O3CLIM' - TZFIELD3D%CUNITS = 'Pa Pa-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_O3' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! -!cumulated optical thickness of aerosols -!cumul begin from the top of the domain, not from the TOA ! -! -!land - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,1) - END DO - END DO - END DO -! - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO - TZFIELD3D%CMNHNAME = 'CUM_AER_LAND' - TZFIELD3D%CLONGNAME = 'CUM_AER_LAND' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! sea - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,2) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_SEA' - TZFIELD3D%CLONGNAME = 'CUM_AER_SEA' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! desert - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,3) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_DES' - TZFIELD3D%CLONGNAME = 'CUM_AER_DES' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! urban - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,4) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_URB' - TZFIELD3D%CLONGNAME = 'CUM_AER_URB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! Volcanoes - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,5) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_VOL' - TZFIELD3D%CLONGNAME = 'CUM_AER_VOL' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! stratospheric background - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,6) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_STRB' - TZFIELD3D%CLONGNAME = 'CUM_AER_STRB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) - ENDIF -END IF -! -DEALLOCATE(ZNFLW_CS) -DEALLOCATE(ZNFLW) -DEALLOCATE(ZNFSW_CS) -DEALLOCATE(ZNFSW) -DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR) -DEALLOCATE(ZFLUX_SW_DOWN) -DEALLOCATE(ZFLUX_SW_UP) -DEALLOCATE(ZFLUX_LW) -DEALLOCATE(ZDTLW_CS) -DEALLOCATE(ZDTSW_CS) -DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS) -DEALLOCATE(ZPLAN_ALB_VIS) -DEALLOCATE(ZPLAN_ALB_NIR) -DEALLOCATE(ZPLAN_TRA_VIS) -DEALLOCATE(ZPLAN_TRA_NIR) -DEALLOCATE(ZPLAN_ABS_VIS) -DEALLOCATE(ZPLAN_ABS_NIR) -DEALLOCATE(ZEFCL_LWD) -DEALLOCATE(ZEFCL_LWU) -DEALLOCATE(ZFLWP) -DEALLOCATE(ZFIWP) -DEALLOCATE(ZRADLP) -DEALLOCATE(ZRADIP) -DEALLOCATE(ZEFCL_RRTM) -DEALLOCATE(ZCLSW_TOTAL) -DEALLOCATE(ZTAU_TOTAL) -DEALLOCATE(ZOMEGA_TOTAL) -DEALLOCATE(ZCG_TOTAL) -DEALLOCATE(ZFLUX_SW_DOWN_CS) -DEALLOCATE(ZFLUX_SW_UP_CS) -DEALLOCATE(ZFLUX_LW_CS) -DEALLOCATE(ZO3AVE) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE RADIATIONS -! -END MODULE MODI_RADIATIONS diff --git a/src/mesonh/ext/read_exsegn.f90 b/src/mesonh/ext/read_exsegn.f90 deleted file mode 100644 index 70d8d7e98..000000000 --- a/src/mesonh/ext/read_exsegn.f90 +++ /dev/null @@ -1,3075 +0,0 @@ -!MNH_LIC Copyright 1994-2023 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_READ_EXSEG_n -! ###################### -! -INTERFACE -! - SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP,OBLOWSNOW, & - KRIMX,KRIMY, KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPEXSEGFILE ! EXSEG file -! The following variables are read by READ_DESFM in DESFM descriptor : -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, & - OUSERG,OUSERH ! kind of moist variables in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECI ! ice concentration in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECHEM ! Chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHAQ ! Aqueous chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHIC ! Ice chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_PH ! pH FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: ODUST ! Dust FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_DST ! Dust wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_SLT ! Sea Salt wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_AER ! Orilam wet deposition FLAG in FMFILE -LOGICAL, INTENT(IN) :: OSALT ! Sea Salt FLAG in FMFILE -LOGICAL, INTENT(IN) :: OORILAM ! Orilam FLAG in FMFILE -LOGICAL, INTENT(IN) :: OPASPOL ! Passive pollutant FLAG in FMFILE -LOGICAL, INTENT(IN) :: OFIRE ! Blaze FLAG in FMFILE -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(IN) :: OFOREFIRE ! ForeFire FLAG in FMFILE -#endif -LOGICAL, INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCONDSAMP ! Conditional sampling FLAG in FMFILE -LOGICAL, INTENT(IN) :: OBLOWSNOW ! Blowing snow FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCHTRANS ! LCHTRANS FLAG in FMFILE - -LOGICAL, INTENT(IN) :: OLG ! lagrangian FLAG in FMFILE -INTEGER, INTENT(IN) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(IN) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! Kind of turbulence parameterization - ! used to produce FMFILE -CHARACTER (LEN=*), INTENT(IN) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(IN) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system -REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file -! -END SUBROUTINE READ_EXSEG_n -! -END INTERFACE -! -END MODULE MODI_READ_EXSEG_n -! -! -! ######################################################################### - SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP, OBLOWSNOW, & - KRIMX,KRIMY, KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) -! ######################################################################### -! -!!**** *READ_EXSEG_n * - routine to read the descriptor file EXSEG -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the descriptor file called -! EXSEG and to control the coherence with FMfile data . -! -!! -!!** METHOD -!! ------ -!! The descriptor file is read. Namelists (NAMXXXn) which contain -!! variables linked to one nested model are at the beginning of the file. -!! Namelists (NAMXXX) which contain variables common to all models -!! are at the end of the file. When the model index is different from 1, -!! the end of the file (namelists NAMXXX) is not read. -!! -!! Coherence between the initial file (description read in DESFM file) -!! and the segment to perform (description read in EXSEG file) -!! is checked for segment achievement configurations -!! or postprocessing configuration. The get indicators are set according -!! to the following check : -!! -!! - segment achievement and preinit configurations : -!! -!! * if there is no turbulence kinetic energy in initial -!! file (HTURB='NONE'), and the segment to perform requires a turbulence -!! parameterization (CTURB /= 'NONE'), the get indicators for turbulence -!! kinetic energy variables are set to 'INIT'; i.e. these variables will be -!! set equal to zero by READ_FIELD according to the get indicators. -!! * The same procedure is applied to the dissipation of TKE. -!! * if there is no moist variables RRn in initial file (OUSERn=.FALSE.) -!! and the segment to perform requires moist variables RRn -!! (LUSERn=.TRUE.), the get indicators for moist variables RRn are set -!! equal to 'INIT'; i.e. these variables will be set equal to zero by -!! READ_FIELD according to the get indicators. -!! * if there are KSV_USER additional scalar variables in initial file and the -!! segment to perform needs more than KSV_USER additional variables, the get -!! indicators for these (NSV_USER-KSV_USER) additional scalar variables are set -!! equal to 'INIT'; i.e. these variables will be set equal to zero by -!! READ_FIELD according to the get indicators. If the segment to perform -!! needs less additional scalar variables than there are in initial file, -!! the get indicators for these (KSV_USER - NSV_USER) additional scalar variables are -!! set equal to 'SKIP'. -!! * warning messages are printed if the fields in initial file are the -!! same at time t and t-dt (HCONF='START') and a leap-frog advance -!! at first time step will be used for the segment to perform -!! (CCONF='RESTA'); It is likewise when HCONF='RESTA' and CCONF='START'. -!! * A warning message is printed if the orography in initial file is zero -!! (OFLAT=.TRUE.) and the segment to perform considers no-zero orography -!! (LFLAT=.FALSE.). It is likewise for LFLAT=.TRUE. and OFLAT=.FALSE.. -!! If the segment to perform requires zero orography (LFLAT=.TRUE.), the -!! orography (XZS) will not read in initial file but set equal to zero -!! by SET_GRID. -!! * check of the depths of the Lateral Damping Layer in x and y -!! direction is performed -!! * If some coupling files are specified, LSTEADYLS is set to T -!! * If no coupling files are specified, LSTEADYLS is set to F -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODN_CONF : CCONF,LTHINSHELL,LFLAT,NMODEL,NVERB -!! -!! Module MODN_DYN : LCORIO, LZDIFFU -!! -!! Module MODN_NESTING : NDAD(m),NDTRATIO(m),XWAY(m) -!! -!! Module MODN_BUDGET : CBUTYPE,XBULEN -!! -!! Module MODN_CONF1 : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH,CSEG -!! -!! Module MODN_DYN1 : XTSTEP,CPRESOPT,NITR,XRELAX -!! -!! Module MODD_ADV1 : CMET_ADV_SCHEME,CSV_ADV_SCHEME,CUVW_ADV_SCHEME,NLITER -!! -!! Module MODN_PARAM1 : CTURB,CRAD,CDCONV,CSCONV -!! -!! Module MODN_LUNIT1 : -!! Module MODN_LBC1 : CLBCX,CLBCY,NLBLX,NLBLY,XCPHASE,XPOND -!! -!! Module MODN_TURB_n : CTURBLEN,CTURBDIM -!! -!! Module MODD_GET1: -!! CGETTKEM,CGETTKET, -!! CGETRVM,CGETRCM,CGETRRM,CGETRIM,CGETRSM,CGETRGM,CGETRHM -!! CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETRST,CGETRGT,CGETRHT,CGETSVM -!! CGETSVT,CGETSIGS,CGETSRCM,CGETSRCT -!! NCPL_NBR,NCPL_TIMES,NCPL_CUR -!! Module MODN_LES : contains declaration of the control parameters -!! for Large Eddy Simulations' storages -!! for the forcing -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine READ_EXSEG_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Modification 26/10/94 (Stein) remove NAM_GET from the Namelists -!! present in DESFM + change the namelist names -!! Modification 22/11/94 (Stein) add GET indicator for phi -!! Modification 21/12/94 (Stein) add GET indicator for LS fields -!! Modification 06/01/95 (Stein) bug in the test for Scalar Var. -!! Modifications 09/01/95 (Stein) add the turbulence scheme -!! Modifications 09/01/95 (Stein) add the 1D switch -!! Modifications 10/03/95 (Mallet) add coherence in coupling case -!! Modifications 16/03/95 (Stein) remove R from the historical variables -!! Modifications 01/03/95 (Hereil) add the budget namelists -!! Modifications 16/06/95 (Stein) coherence control for the -!! microphysical scheme + remove the wrong messge for RESTA conf -!! Modifications 30/06/95 (Stein) conditionnal reading of the fields -!! used by the moist turbulence scheme -!! Modifications 12/09/95 (Pinty) add the radiation scheme -!! Modification 06/02/96 (J.Vila) implement scalar advection schemes -!! Modifications 24/02/96 (Stein) change the default value for CCPLFILE -!! Modifications 02/05/96 (Stein Jabouille) change the Z0SEA activation -!! Modifications 24/05/96 (Stein) change the SRC SIGS control -!! Modifications 08/09/96 (Masson) the coupling file names are reset to -!! default value " " before reading in EXSEG1.nam -!! to avoid extra non-existant coupling files -!! -!! Modifications 25/04/95 (K.Suhre)add namelist NAM_BLANK -!! add read for LFORCING -!! 25/04/95 (K.Suhre)add namelist NAM_FRC -!! and switch checking -!! 06/08/96 (K.Suhre)add namelist NAM_CH_MNHCn -!! and NAM_CH_SOLVER -!! Modifications 10/10/96 (Stein) change SRC into SRCM and SRCT -!! Modifications 11/04/96 (Pinty) add the rain-ice microphysical scheme -!! Modifications 11/01/97 (Pinty) add the deep convection scheme -!! Modifications 22/05/97 (Lafore) gridnesting implementation -!! Modifications 22/06/97 (Stein) add the absolute pressure + cleaning -!! Modifications 25/08/97 (Masson) add tests on surface schemes -!! 22/10/97 (Stein) remove the RIMX /= 0 control -!! + new namelist + cleaning -!! Modifications 17/04/98 (Masson) add tests on character variables -!! Modification 15/03/99 (Masson) add tests on PROGRAM -!! Modification 04/01/00 (Masson) removes TSZ0 case -!! Modification 04/06/00 (Pinty) add C2R2 scheme -!! 11/12/00 (Tomasini) add CSEA_FLUX to MODD_PARAMn -!! delete the test on SST_FRC only in 1D -!! Modification 22/01/01 (Gazen) change NSV,KSV to NSV_USER,KSV_USER and add -!! NSV_* variables initialization -!! Modification 15/10/01 (Mallet) allow namelists in different orders -!! Modification 18/03/02 (Solmon) new radiation scheme test -!! Modification 29/11/02 (JP Pinty) add C3R5, ICE2, ICE4, ELEC -!! Modification 06/11/02 (Masson) new LES BL height diagnostic -!! Modification 06/11/02 (Jabouille) remove LTHINSHELL LFORCING test -!! Modification 01/12/03 (Gazen) change Chemical scheme interface -!! Modification 01/2004 (Masson) removes surface (externalization) -!! Modification 01/2005 (Masson) removes 1D and 2D switches -!! Modification 04/2005 (Tulet) add dust, orilam -!! Modification 03/2006 (O.Geoffroy) Add KHKO scheme -!! Modification 04/2006 (Maric) include 4th order advection scheme -!! Modification 05/2006 (Masson) add nudging -!! Modification 05/2006 Remove KEPS -!! Modification 04/2006 (Maric) include PPM advection scheme -!! Modification 04/2006 (J.Escobar) Bug dollarn add CALL UPDATE_NAM_CONFN -!! Modifications 01/2007 (Malardel,Pergaud) add the MF shallow -!! convection scheme MODN_PARAM_MFSHALL_n -!! Modification 09/2009 (J.Escobar) add more info on relaxation problems -!! Modification 09/2011 (J.Escobar) re-add 'ZRESI' choose -!! Modification 12/2011 (C.Lac) Adaptation to FIT temporal scheme -!! Modification 12/2012 (S.Bielli) add NAM_NCOUT for netcdf output (removed 08/07/2016) -!! Modification 02/2012 (Pialat/Tulet) add ForeFire -!! Modification 02/2012 (T.Lunet) add of new Runge-Kutta methods -!! Modification 01/2015 (C. Barthe) add explicit LNOx -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 18/12/2015 : bug chimie glace dans prep_real_case -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 02/2016 (M.Leriche) treat gas and aq. chemicals separately -!! P.Wautelet 08/07/2016 : removed MNH_NCWRIT define -!! Modification 10/2016 (C.LAC) Add OSPLIT_WENO + Add droplet -!! deposition + Add max values -!! Modification 11/2016 (Ph. Wautelet) Allocate/initialise some output/backup structures -!! Modification 03/2017 (JP Chaboureau) Fix the initialization of -!! LUSERx-type variables for LIMA -!! M.Leriche 06/2017 for spawn and prep_real avoid abort if wet dep for -!! aerosol and no cloud scheme defined -!! Q.Libois 02/2018 ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification 07/2017 (V. Vionnet) add blowing snow scheme -!! Modification 01/2019 (Q. Rodier) define XCEDIS depending on BL89 or RM17 mixing length -!! Modification 01/2019 (P. Wautelet) bugs correction: incorrect writes -!! Modification 01/2019 (R. Honnert) remove SURF in CMF_UPDRAFT -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! Q. Rodier 03/2020: add abort if use of any LHORELAX and cyclic conditions -! F.Auguste 02/2021: add IBM -! T.Nagel 02/2021: add turbulence recycling -! E.Jezequel 02/2021: add stations read from CSV file -! P. Wautelet 09/03/2021: simplify allocation of scalar variable names -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv -! R. Honnert 23/04/2021: add HM21 mixing length and delete HRIO and BOUT from CMF_UPDRAFT -! S. Riette 11/05/2021 HighLow cloud -! A. Costes 12/2021: add Blaze fire model -! P. Wautelet 27/04/2022: add namelist for profilers -! P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables -! P. Wautelet 13/07/2022: add namelist for flyers and balloons -! P. Wautelet 19/08/2022: add namelist for aircrafts -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS -USE MODD_BLOWSNOW -USE MODD_BUDGET -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY : NEQ -USE MODD_CONDSAMP -USE MODD_CONF -USE MODD_CONFZ -! USE MODD_DRAG_n -USE MODD_DUST -USE MODD_DYN -USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA, LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_GET_n -USE MODD_GR_FIELD_n -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV,NSV_USER_n=>NSV_USER -USE MODD_PARAMETERS -USE MODD_PASPOL -USE MODD_SALT -USE MODD_VAR_ll, ONLY: NPROC -USE MODD_VISCOSITY - -USE MODE_MSG -USE MODE_POS - -USE MODI_INI_NSV -USE MODI_TEST_NAM_VAR - -USE MODN_2D_FRC -USE MODN_ADV_n ! The final filling of these modules for the model n is -USE MODN_AIRCRAFTS, ONLY: AIRCRAFTS_NML_ALLOCATE, NAM_AIRCRAFTS -USE MODN_BACKUP -USE MODN_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS -USE MODN_BLANK_n -USE MODN_BLOWSNOW -USE MODN_BLOWSNOW_n -USE MODN_BUDGET -USE MODN_CH_MNHC_n -USE MODN_CH_ORILAM -USE MODN_CH_SOLVER_n -USE MODN_CONDSAMP -USE MODN_CONF -USE MODN_CONF_n -USE MODN_CONFZ -USE MODN_DRAGBLDG_n -USE MODN_DRAG_n -USE MODN_DRAGTREE_n -USE MODN_DUST -USE MODN_DYN -USE MODN_DYN_n ! to avoid the duplication of this routine for each model. -USE MODN_ELEC -USE MODN_EOL -USE MODN_EOL_ADNR -USE MODN_EOL_ALM -USE MODN_FIRE_n -USE MODN_FLYERS -#ifdef MNH_FOREFIRE -USE MODN_FOREFIRE -#endif -USE MODN_FRC -USE MODN_IBM_PARAM_n -USE MODN_LATZ_EDFLX -USE MODN_LBC_n ! routine is used for each nested model. This has been done -USE MODN_LES -USE MODN_LUNIT_n -USE MODN_MEAN -USE MODN_NESTING -USE MODN_NUDGING_n -USE MODN_OUTPUT -USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & - CHEVRIMED_ICE_C1R3 -USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & - WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 -USE MODN_PARAM_ECRAD_n -USE MODN_PARAM_ICE -USE MODN_PARAM_KAFR_n -USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, & - CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, NMOD_IMM, & - LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, & - LPTSPLIT, LSPRO, LADJ, LKHKO, & - NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H -USE MODN_PARAM_MFSHALL_n -USE MODN_PARAM_n ! realized in subroutine ini_model n -USE MODN_PARAM_RAD_n -USE MODN_PASPOL -USE MODN_PROFILER_n -USE MODN_RECYCL_PARAM_n -USE MODN_SALT -USE MODN_SERIES -USE MODN_SERIES_n -USE MODN_STATION_n -USE MODN_TURB -USE MODN_TURB_CLOUD -USE MODN_TURB_n -USE MODN_VISCOSITY -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPEXSEGFILE ! EXSEG file -! The following variables are read by READ_DESFM in DESFM descriptor : -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, & - OUSERG,OUSERH ! kind of moist variables in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECI ! ice concentration in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECHEM ! Chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHAQ ! Aqueous chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHIC ! Ice chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_PH ! pH FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: ODUST ! Dust FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_DST ! Dust Deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_SLT ! Sea Salt wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_AER ! Orilam wet deposition FLAG in FMFILE -LOGICAL, INTENT(IN) :: OSALT ! Sea Salt FLAG in FMFILE -LOGICAL, INTENT(IN) :: OORILAM ! Orilam FLAG in FMFILE -LOGICAL, INTENT(IN) :: OPASPOL ! Passive pollutant FLAG in FMFILE -LOGICAL, INTENT(IN) :: OFIRE ! Blaze FLAG in FMFILE -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(IN) :: OFOREFIRE ! ForeFire FLAG in FMFILE -#endif -LOGICAL, INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCONDSAMP ! Conditional sampling FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCHTRANS ! LCHTRANS FLAG in FMFILE -LOGICAL, INTENT(IN) :: OBLOWSNOW ! Blowing snow FLAG in FMFILE - -LOGICAL, INTENT(IN) :: OLG ! lagrangian FLAG in FMFILE -INTEGER, INTENT(IN) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(IN) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! Kind of turbulence parameterization - ! used to produce FMFILE -CHARACTER (LEN=*), INTENT(IN) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(IN) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system -REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file -! -!* 0.2 declarations of local variables -! -CHARACTER(LEN=3) :: YMODEL -INTEGER :: ILUSEG,ILUOUT ! logical unit numbers of EXSEG file and outputlisting -INTEGER :: JS,JCI,JI,JSV ! Loop indexes -LOGICAL :: GRELAX -LOGICAL :: GFOUND ! Return code when searching namelist -! -!------------------------------------------------------------------------------- -! -!* 1. READ EXSEG FILE -! --------------- -! -CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_EXSEG_n','called for '//TRIM(TPEXSEGFILE%CNAME)) -! -ILUSEG = TPEXSEGFILE%NLU -ILUOUT = TLUOUT%NLU -! -CALL INIT_NAM_LUNITN -CCPLFILE(:)=" " -CALL INIT_NAM_CONFN -CALL INIT_NAM_DYNN -CALL INIT_NAM_ADVN -CALL INIT_NAM_DRAGTREEN -CALL INIT_NAM_DRAGBLDGN -CALL INIT_NAM_PARAMN -CALL INIT_NAM_PARAM_RADN -#ifdef MNH_ECRAD -CALL INIT_NAM_PARAM_ECRADN -#endif -CALL INIT_NAM_PARAM_KAFRN -CALL INIT_NAM_PARAM_MFSHALLN -CALL INIT_NAM_LBCN -CALL INIT_NAM_NUDGINGN -CALL INIT_NAM_TURBN -CALL INIT_NAM_BLANKN -CALL INIT_NAM_DRAGN -CALL INIT_NAM_IBM_PARAMN -CALL INIT_NAM_RECYCL_PARAMN -CALL INIT_NAM_CH_MNHCN -CALL INIT_NAM_CH_SOLVERN -CALL INIT_NAM_SERIESN -CALL INIT_NAM_BLOWSNOWN -CALL INIT_NAM_PROFILERn -CALL INIT_NAM_STATIONn -CALL INIT_NAM_FIREn -! -WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')") -CALL POSNAM(ILUSEG,'NAM_LUNITN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LUNITn) -CALL POSNAM(ILUSEG,'NAM_CONFN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFn) -CALL POSNAM(ILUSEG,'NAM_DYNN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYNn) -CALL POSNAM(ILUSEG,'NAM_ADVN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ADVn) -CALL POSNAM(ILUSEG,'NAM_PARAMN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAMn) -CALL POSNAM(ILUSEG,'NAM_PARAM_RADN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_RADn) -#ifdef MNH_ECRAD -CALL POSNAM(ILUSEG,'NAM_PARAM_ECRADN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn) -#endif -CALL POSNAM(ILUSEG,'NAM_PARAM_KAFRN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) -CALL POSNAM(ILUSEG,'NAM_PARAM_MFSHALLN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_MFSHALLn) -CALL POSNAM(ILUSEG,'NAM_LBCN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LBCn) -CALL POSNAM(ILUSEG,'NAM_NUDGINGN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn) -CALL POSNAM(ILUSEG,'NAM_TURBN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURBn) -CALL POSNAM(ILUSEG,'NAM_DRAGN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn) -CALL POSNAM(ILUSEG,'NAM_IBM_PARAMN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_IBM_PARAMn) -CALL POSNAM(ILUSEG,'NAM_RECYCL_PARAMN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_RECYCL_PARAMn) -CALL POSNAM(ILUSEG,'NAM_CH_MNHCN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_MNHCn) -CALL POSNAM(ILUSEG,'NAM_CH_SOLVERN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_SOLVERn) -CALL POSNAM(ILUSEG,'NAM_SERIESN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn) -CALL POSNAM(ILUSEG,'NAM_BLANKN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLANKn) -CALL POSNAM(ILUSEG,'NAM_BLOWSNOWN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) -CALL POSNAM(ILUSEG,'NAM_DRAGTREEN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn) -CALL POSNAM(ILUSEG,'NAM_DRAGBLDGN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn) -CALL POSNAM(ILUSEG,'NAM_EOL',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL) -CALL POSNAM(ILUSEG,'NAM_EOL_ADNR',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR) -CALL POSNAM(ILUSEG,'NAM_EOL_ALM',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM) -CALL POSNAM(ILUSEG,'NAM_PROFILERN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn) -CALL POSNAM(ILUSEG,'NAM_STATIONN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn) -CALL POSNAM(ILUSEG,'NAM_FIREN',GFOUND,ILUOUT) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FIREn) -! -IF (KMI == 1) THEN - WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')") - CALL POSNAM(ILUSEG,'NAM_CONF',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONF) - CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM(ILUSEG,'NAM_DYN',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYN) - CALL POSNAM(ILUSEG,'NAM_NESTING',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NESTING) - CALL POSNAM(ILUSEG,'NAM_BACKUP',GFOUND,ILUOUT) - IF (GFOUND) THEN - !Should have been allocated before in READ_DESFM_n - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) !Allocate *OUT* variables to prevent - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) !problems if NAM_OUTPUT does not exist - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUSEG,NML=NAM_BACKUP) - ELSE - CALL POSNAM(ILUSEG,'NAM_FMOUT',GFOUND) - IF (GFOUND) THEN - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_EXSEG_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT') - ELSE - IF (CPROGRAM=='MESONH') CALL PRINT_MSG(NVERB_ERROR,'IO','READ_EXSEG_n','namelist NAM_BACKUP not found') - END IF - END IF - CALL POSNAM(ILUSEG,'NAM_OUTPUT',GFOUND,ILUOUT) - IF (GFOUND) THEN - !Should have been allocated before in READ_DESFM_n - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) !problems if NAM_BACKUP does not exist - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUSEG,NML=NAM_OUTPUT) - END IF - CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET) - - CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RU ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' ) - DEALLOCATE( CBULIST_RU ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) ) - CBULIST_RU(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RU) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RV',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' ) - DEALLOCATE( CBULIST_RV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) ) - CBULIST_RV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RW',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RW ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' ) - DEALLOCATE( CBULIST_RW ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) ) - CBULIST_RW(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RW) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RTH',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RTH ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' ) - DEALLOCATE( CBULIST_RTH ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) ) - CBULIST_RTH(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RTH) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RTKE',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RTKE ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' ) - DEALLOCATE( CBULIST_RTKE ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) ) - CBULIST_RTKE(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RTKE) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRV',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' ) - DEALLOCATE( CBULIST_RRV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) ) - CBULIST_RRV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRC',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRC ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' ) - DEALLOCATE( CBULIST_RRC ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) ) - CBULIST_RRC(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRC) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRR',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRR ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' ) - DEALLOCATE( CBULIST_RRR ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) ) - CBULIST_RRR(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRR) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRI',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRI ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' ) - DEALLOCATE( CBULIST_RRI ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) ) - CBULIST_RRI(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRI) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRS',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRS ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' ) - DEALLOCATE( CBULIST_RRS ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) ) - CBULIST_RRS(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRS) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRG',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRG ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' ) - DEALLOCATE( CBULIST_RRG ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) ) - CBULIST_RRG(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRG) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RRH',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRH ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' ) - DEALLOCATE( CBULIST_RRH ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) ) - CBULIST_RRH(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRH) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_BU_RSV',GFOUND,ILUOUT) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RSV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' ) - DEALLOCATE( CBULIST_RSV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) ) - CBULIST_RSV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RSV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) ) - END IF - - CALL POSNAM(ILUSEG,'NAM_LES',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES) - CALL POSNAM(ILUSEG,'NAM_MEAN',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_MEAN) - CALL POSNAM(ILUSEG,'NAM_PDF',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PDF) - CALL POSNAM(ILUSEG,'NAM_FRC',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FRC) - CALL POSNAM(ILUSEG,'NAM_PARAM_ICE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ICE) - CALL POSNAM(ILUSEG,'NAM_PARAM_C2R2',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) - CALL POSNAM(ILUSEG,'NAM_PARAM_C1R3',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) - CALL POSNAM(ILUSEG,'NAM_PARAM_LIMA',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_LIMA) - CALL POSNAM(ILUSEG,'NAM_ELEC',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ELEC) - CALL POSNAM(ILUSEG,'NAM_SERIES',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIES) - CALL POSNAM(ILUSEG,'NAM_TURB_CLOUD',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB_CLOUD) - CALL POSNAM(ILUSEG,'NAM_TURB',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB) - CALL POSNAM(ILUSEG,'NAM_CH_ORILAM',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_ORILAM) - CALL POSNAM(ILUSEG,'NAM_DUST',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DUST) - CALL POSNAM(ILUSEG,'NAM_SALT',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SALT) - CALL POSNAM(ILUSEG,'NAM_PASPOL',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PASPOL) -#ifdef MNH_FOREFIRE - CALL POSNAM(ILUSEG,'NAM_FOREFIRE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FOREFIRE) -#endif - CALL POSNAM(ILUSEG,'NAM_CONDSAMP',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP) - CALL POSNAM(ILUSEG,'NAM_2D_FRC',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC) - CALL POSNAM(ILUSEG,'NAM_LATZ_EDFLX',GFOUND) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX) - CALL POSNAM(ILUSEG,'NAM_BLOWSNOW',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW) - CALL POSNAM(ILUSEG,'NAM_VISC',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC) - - CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) - - IF ( NAIRCRAFTS > 0 ) THEN - CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS ) - CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) - END IF - - IF ( NBALLOONS > 0 ) THEN - CALL BALLOONS_NML_ALLOCATE( NBALLOONS ) - CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) - END IF -END IF -! -!------------------------------------------------------------------------------- -! -CALL TEST_NAM_VAR(ILUOUT,'CPRESOPT',CPRESOPT,'RICHA','CGRAD','CRESI','ZRESI') -! -CALL TEST_NAM_VAR(ILUOUT,'CUVW_ADV_SCHEME',CUVW_ADV_SCHEME, & - 'CEN4TH','CEN2ND','WENO_K' ) -CALL TEST_NAM_VAR(ILUOUT,'CMET_ADV_SCHEME',CMET_ADV_SCHEME, & - &'PPM_00','PPM_01','PPM_02') -CALL TEST_NAM_VAR(ILUOUT,'CSV_ADV_SCHEME',CSV_ADV_SCHEME, & - &'PPM_00','PPM_01','PPM_02') -CALL TEST_NAM_VAR(ILUOUT,'CTEMP_SCHEME',CTEMP_SCHEME, & - &'RK11','RK21','RK33','RKC4','RK53','RK4B','RK62','RK65','NP32','SP32','LEFR') -! -CALL TEST_NAM_VAR(ILUOUT,'CTURB',CTURB,'NONE','TKEL') -CALL TEST_NAM_VAR(ILUOUT,'CRAD',CRAD,'NONE','FIXE','ECMW',& -#ifdef MNH_ECRAD - 'ECRA',& -#endif - 'TOPA') -CALL TEST_NAM_VAR(ILUOUT,'CCLOUD',CCLOUD,'NONE','REVE','KESS', & - & 'ICE3','ICE4','C2R2','C3R5','KHKO','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'CDCONV',CDCONV,'NONE','KAFR') -CALL TEST_NAM_VAR(ILUOUT,'CSCONV',CSCONV,'NONE','KAFR','EDKF') -CALL TEST_NAM_VAR(ILUOUT,'CELEC',CELEC,'NONE','ELE3','ELE4') -! -CALL TEST_NAM_VAR(ILUOUT,'CAER',CAER,'TANR','TEGE','SURF','NONE') -CALL TEST_NAM_VAR(ILUOUT,'CAOP',CAOP,'CLIM','EXPL') -CALL TEST_NAM_VAR(ILUOUT,'CLW',CLW,'RRTM','MORC') -CALL TEST_NAM_VAR(ILUOUT,'CEFRADL',CEFRADL,'PRES','OCLN','MART','C2R2','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'CEFRADI',CEFRADI,'FX40','LIOU','SURI','C3R5','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'COPWLW',COPWLW,'SAVI','SMSH','LILI','MALA') -CALL TEST_NAM_VAR(ILUOUT,'COPILW',COPILW,'FULI','EBCU','SMSH','FU98') -CALL TEST_NAM_VAR(ILUOUT,'COPWSW',COPWSW,'SLIN','FOUQ','MALA') -CALL TEST_NAM_VAR(ILUOUT,'COPISW',COPISW,'FULI','EBCU','FU96') -! -CALL TEST_NAM_VAR(ILUOUT,'CLBCX(1)',CLBCX(1),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCX(2)',CLBCX(2),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCY(1)',CLBCY(1),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN') -! -CALL TEST_NAM_VAR(ILUOUT,'CTURBDIM',CTURBDIM,'1DIM','3DIM') -CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','RM17','DEAR','BLKR','HM21') -CALL TEST_NAM_VAR(ILUOUT,'CTOM',CTOM,'NONE','TM06') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM','PDF','ADJU') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV_RI',CSUBG_AUCV_RI,'NONE','CLFR','ADJU') -CALL TEST_NAM_VAR(ILUOUT,'CCONDENS',CCONDENS,'CB02','GAUS') -CALL TEST_NAM_VAR(ILUOUT,'CLAMBDA3',CLAMBDA3,'CB','NONE') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_MF_PDF',CSUBG_MF_PDF,'NONE','TRIANGLE') -! -CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, & - 'SPLIT ','CENTER ','LAGGED ') -! -CALL TEST_NAM_VAR(ILUOUT,'CCONF',CCONF,'START','RESTA') -CALL TEST_NAM_VAR(ILUOUT,'CEQNSYS',CEQNSYS,'LHE','DUR','MAE') -CALL TEST_NAM_VAR(ILUOUT,'CSPLIT',CSPLIT,'BSPLITTING','XSPLITTING','YSPLITTING') -! -CALL TEST_NAM_VAR(ILUOUT,'CBUTYPE',CBUTYPE,'NONE','CART','MASK') -! -CALL TEST_NAM_VAR(ILUOUT,'CRELAX_HEIGHT_TYPE',CRELAX_HEIGHT_TYPE,'FIXE','THGR') -! -CALL TEST_NAM_VAR(ILUOUT,'CLES_NORM_TYPE',CLES_NORM_TYPE,'NONE','CONV','EKMA','MOBU') -CALL TEST_NAM_VAR(ILUOUT,'CBL_HEIGHT_DEF',CBL_HEIGHT_DEF,'TKE','KE','WTV','FRI','DTH') -CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN_CLOUD',CTURBLEN_CLOUD,'NONE','DEAR','DELT','BL89') -! -! The test on the mass flux scheme for shallow convection -! -CALL TEST_NAM_VAR(ILUOUT,'CMF_UPDRAFT',CMF_UPDRAFT,'NONE','EDKF','RHCJ') -CALL TEST_NAM_VAR(ILUOUT,'CMF_CLOUD',CMF_CLOUD,'NONE','STAT','DIRE') -! -! The test on the CSOLVER name is made elsewhere -! -CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE',CPRISTINE_ICE,'PLAT','COLU','BURO') -CALL TEST_NAM_VAR(ILUOUT,'CSEDIM',CSEDIM,'SPLI','STAT','NONE') -IF( CCLOUD == 'C3R5' ) THEN - CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_C1R3',CPRISTINE_ICE_C1R3, & - 'PLAT','COLU','BURO') - CALL TEST_NAM_VAR(ILUOUT,'CHEVRIMED_ICE_C1R3',CHEVRIMED_ICE_C1R3, & - 'GRAU','HAIL') -END IF -! -IF( CCLOUD == 'LIMA' ) THEN - CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_LIMA',CPRISTINE_ICE_LIMA, & - 'PLAT','COLU','BURO') - CALL TEST_NAM_VAR(ILUOUT,'CHEVRIMED_ICE_LIMA',CHEVRIMED_ICE_LIMA, & - 'GRAU','HAIL') -END IF -! Blaze -CALL UPDATE_NAM_FIREn -IF (LBLAZE) THEN - ! Blaze is only allowed on finer model(s) - DO JI = 1, NMODEL - IF ( JI /= KMI .AND. NDAD(JI) == KMI ) THEN - WRITE( YMODEL, '( I3 )' ) JI - CMNHMSG(1) = 'Blaze fire model only allowed on finer model' - CMNHMSG(2) = '=> disabled on model ' // YMODEL - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'READ_EXSEG_n' ) - LBLAZE = .FALSE. - END IF - END DO - CALL TEST_NAM_VAR(ILUOUT,'CPROPAG_MODEL',CPROPAG_MODEL,'SANTONI2011') - CALL TEST_NAM_VAR(ILUOUT,'CHEAT_FLUX_MODEL',CHEAT_FLUX_MODEL,'CST','EXP','EXS') - CALL TEST_NAM_VAR(ILUOUT,'CLATENT_FLUX_MODEL',CLATENT_FLUX_MODEL,'CST','EXP') - CALL TEST_NAM_VAR(ILUOUT,'CFIRE_CPL_MODE',CFIRE_CPL_MODE,'2WAYCPL','FIR2ATM','ATM2FIR') - CALL TEST_NAM_VAR(ILUOUT,'CWINDFILTER',CWINDFILTER,'EWAM','WLIM') -END IF -! -IF(LBLOWSNOW) THEN - CALL TEST_NAM_VAR(ILUOUT,'CSNOWSEDIM',CSNOWSEDIM,'NONE','MITC','CARR','TABC') - IF (XALPHA_SNOW .NE. 3 .AND. CSNOWSEDIM=='TABC') THEN - WRITE(ILUOUT,*) '*****************************************' - WRITE(ILUOUT,*) '* XALPHA_SNW must be set to 3 when ' - WRITE(ILUOUT,*) '* CSNOWSEDIM = TABC ' - WRITE(ILUOUT,*) '* Update the look-up table in BLOWSNOW_SEDIM_LKT1D ' - WRITE(ILUOUT,*) '* to use TABC with a different value of XEMIALPHA_SNW' - WRITE(ILUOUT,*) '*****************************************' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF -END IF -! -!-------------------------------------------------------------------------------! -!* 2. FIRST INITIALIZATIONS -! --------------------- -! -!* 2.1 Time step in gridnesting case -! -IF (KMI /= 1 .AND. NDAD(KMI) /= KMI) THEN - XTSTEP = PTSTEP_ALL(NDAD(KMI)) / NDTRATIO(KMI) -END IF -PTSTEP_ALL(KMI) = XTSTEP -! -!* 2.2 Fill the global configuration module -! -! Check coherence between the microphysical scheme and water species and -!initialize the logicals LUSERn -! -SELECT CASE ( CCLOUD ) - CASE ( 'NONE' ) - IF (.NOT. ( (.NOT. LUSERC) .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) .AND. CPROGRAM=='MESONH' ) THEN -! - LUSERC=.FALSE. - LUSERR=.FALSE.; LUSERI=.FALSE. - LUSERS=.FALSE.; LUSERG=.FALSE. - LUSERH=.FALSE. -! - END IF -! - IF (CSUBG_AUCV == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE SUBGRID AUTOCONVERSION SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT MICROPHYSICS' - WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"' -! - CSUBG_AUCV = 'NONE' -! - END IF -! - CASE ( 'REVE' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) & - .AND. (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A REVERSIBLE MICROPHYSICAL " ,& - &" SCHEME. YOU WILL ONLY HAVE VAPOR AND CLOUD WATER ",/, & - &" LUSERV AND LUSERC ARE TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. - LUSERR=.FALSE.; LUSERI=.FALSE. - LUSERS=.FALSE.; LUSERG=.FALSE. - LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A REVERSIBLE MICROPHYSICAL SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT YOU DO NOT HAVE RAIN in the "REVE" SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"' -! - CSUBG_AUCV = 'NONE' -! - END IF -! - CASE ( 'KESS' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A KESSLER MICROPHYSICAL " , & - &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/, & - &" LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. - LUSERG=.FALSE.; LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A KESSLER MICROPHYSICAL SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME USING' - WRITE(UNIT=ILUOUT,FMT=*) 'SIGMA_RC.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.' - WRITE(UNIT=ILUOUT,FMT=*) 'SET CSUBG_AUCV TO "CLFR" or "NONE" OR CCLOUD TO "ICE3"' -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - CASE ( 'ICE3' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI & - .AND. LUSERS .AND. LUSERG .AND. (.NOT. LUSERH)) & - .AND. CPROGRAM=='MESONH' ) THEN - ! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice3 SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,' - WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)' - WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES AND GRAUPELN.' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG ARE SET TO TRUE' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH TO FALSE' -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV == 'SIGM' .AND. .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' - END IF -! - IF (CSUBG_AUCV == 'CLFR' .AND. CSCONV /= 'EDKF') THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) 'WITH THE CONVECTIVE CLOUD FRACTION WITHOUT EDKF' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' - END IF -! - CASE ( 'ICE4' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI & - .AND. LUSERS .AND. LUSERG .AND. LUSERH) & - .AND. CPROGRAM=='MESONH' ) THEN - ! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice4 SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,' - WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)' - WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES, GRAUPELN AND HAILSTONES.' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH ARE SET TO TRUE' -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. ; LUSERH=.TRUE. - END IF -! - IF (CSUBG_AUCV /= 'NONE' .AND. .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' - END IF -! - CASE ( 'C2R2','C3R5', 'KHKO' ) - IF (( EPARAM_CCN == 'XXX') .OR. (EINI_CCN == 'XXX')) THEN - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2-MOMENT MICROPHYSICAL ", & - &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_C2R2", & - &" YOU HAVE TO FILL HPARAM_CCN and HINI_CCN ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - IF (HCLOUD == 'NONE') THEN - CGETCLOUD = 'SKIP' - ELSE IF (HCLOUD == 'REVE' ) THEN - CGETCLOUD = 'INI1' - ELSE IF (HCLOUD == 'KESS' ) THEN - CGETCLOUD = 'INI2' - ELSE IF (HCLOUD == 'ICE3' ) THEN - IF (CCLOUD == 'C3R5') THEN - CGETCLOUD = 'INI2' - ELSE - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE WARM MICROPHYSICAL ", & - &" SCHEME BUT YOU WERE USING THE ICE3 SCHEME PREVIOUSLY.",/, & - &" AS THIS IS A LITTLE BIT STUPID IT IS NOT AUTHORIZED !!!")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - ELSE - CGETCLOUD = 'READ' ! This is automatically done - END IF -! - IF ((CCLOUD == 'C2R2' ).OR. (CCLOUD == 'KHKO' )) THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C2R2 MICROPHYSICAL ", & - &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/, & - &"LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. - LUSERG=.FALSE.; LUSERH=.FALSE. - END IF - ELSE IF (CCLOUD == 'C3R5') THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. & - LUSERS .AND. LUSERG .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C3R5 MICROPHYS. SCHEME.",& - &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/, & - &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' ) -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF - ELSE IF (CCLOUD == 'LIMA') THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. & - LUSERS .AND. LUSERG .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LIMA MICROPHYS. SCHEME.",& - &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/, & - &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' ) -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF - END IF -! - IF (LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYS. SCHEME AND THE SUBGRID COND. SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LSUBG_COND TO FALSE OR CCLOUD TO "REVE", "KESS"' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( CEFRADL /= 'C2R2') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - IF ( CCLOUD == 'C3R5' .AND. CEFRADI /= 'C3R5') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADI=C3R5 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADI=C3R5 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - IF ( WALPHAC /= 3.0 .OR. WNUC /= 2.0) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.' - WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS WITH KHKO SCHEME. ' - END IF -! - IF ( CEFRADL /= 'C2R2') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - CASE ( 'LIMA') - IF ((LACTI .AND. FINI_CCN == 'XXX')) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2-MOMENT MICROPHYSICAL ", & - &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_LIMA", & - &" YOU HAVE TO FILL FINI_CCN ")') - call Print_msg( NVERB_FATAL, 'GEN', 'READ_EXSEG_n', '' ) - END IF -! - IF(LACTI .AND. NMOD_CCN == 0) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("ACTIVATION OF AEROSOL PARTICLES IS NOT ", & - &"POSSIBLE IF NMOD_CCN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER ", & - &"VALUE OF NMOD_CCN IN ORDER TO USE LIMA WARM ACTIVATION SCHEME.")') - call Print_msg( NVERB_FATAL, 'GEN', 'READ_EXSEG_n', '' ) - END IF -! - IF(LNUCL .AND. NMOD_IFN == 0 .AND. (.NOT.LMEYERS)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("NUCLEATION BY DEPOSITION AND CONTACT IS NOT ", & - &"POSSIBLE IF NMOD_IFN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER", & - &"VALUE OF NMOD_IFN IN ORDER TO USE LIMA COLD NUCLEATION SCHEME.")') - END IF -! - IF (HCLOUD == 'NONE') THEN - CGETCLOUD = 'SKIP' - ELSE IF (HCLOUD == 'REVE' ) THEN - CGETCLOUD = 'INI1' - ELSE IF (HCLOUD == 'KESS' ) THEN - CGETCLOUD = 'INI2' - ELSE IF (HCLOUD == 'ICE3' ) THEN - CGETCLOUD = 'INI2' - ELSE - CGETCLOUD = 'READ' ! This is automatically done - END IF -! - IF (NMOM_C.GE.1) THEN - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. ; LUSERG=.FALSE.; LUSERH=.FALSE. - END IF -! - IF (NMOM_I.GE.1) THEN - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH= NMOM_H.GE.1 - END IF - ! - IF (LSPRO) LADJ=.FALSE. - IF (.NOT.LPTSPLIT) THEN - IF (NMOM_C==1) NMOM_C=2 - IF (NMOM_R==1) NMOM_R=2 - IF (NMOM_I==1) NMOM_I=2 - IF (NMOM_S==2 .OR. NMOM_G==2 .OR. NMOM_H==2) THEN - NMOM_S=2 - NMOM_G=2 - IF (NMOM_H.GE.1) NMOM_H=2 - END IF - END IF -! - IF (LSUBG_COND .AND. (.NOT. LPTSPLIT)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LPTSPLIT=T with CCLOUD=LIMA' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND ' - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LPTSPLIT=T with LIMA and LSUBG_COND=T') - END IF -! - IF (LSUBG_COND .AND. (.NOT. LADJ)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LADJ=T with CCLOUD=LIMA' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND ' - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LADJ=T with LIMA and LSUBG_COND=T') - END IF -! - IF ( LKHKO .AND. (XALPHAC /= 3.0 .OR. XNUC /= 2.0) ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.' - WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS. ' - END IF -! - IF ( CEFRADL /= 'LIMA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=LIMA FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=LIMA ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME "LIMA"' - END IF -! -END SELECT -! -LUSERV_G(KMI) = LUSERV -LUSERC_G(KMI) = LUSERC -LUSERR_G(KMI) = LUSERR -LUSERI_G(KMI) = LUSERI -LUSERS_G(KMI) = LUSERS -LUSERG_G(KMI) = LUSERG -LUSERH_G(KMI) = LUSERH -LUSETKE(KMI) = (CTURB /= 'NONE') -! -!------------------------------------------------------------------------------- -! -!* 2.3 Chemical and NSV_* variables initializations -! -CALL UPDATE_NAM_IBM_PARAMN -CALL UPDATE_NAM_RECYCL_PARAMN -CALL UPDATE_NAM_PARAMN -CALL UPDATE_NAM_DYNN -CALL UPDATE_NAM_CONFN -! -IF (LORILAM .AND. .NOT. LUSECHEM) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU CANNOT USE ORILAM AEROSOL SCHEME WITHOUT ' - WRITE(ILUOUT,FMT=*) 'CHEMICAL GASEOUS CHEMISTRY ' - WRITE(ILUOUT,FMT=*) 'THEREFORE LUSECHEM IS SET TO TRUE ' - LUSECHEM=.TRUE. -END IF -! -IF (LUSECHAQ.AND.(.NOT.LUSECHEM)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHEM TO TRUE IF YOU WANT REALLY USE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHAQ TO FALSE IF YOU DO NOT WANT USE IT' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -IF (LUSECHAQ.AND.(.NOT.LUSERC).AND.CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT CLOUD MICROPHYSICS IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHAQ IS SET TO FALSE' - LUSECHAQ = .FALSE. -END IF -IF (LUSECHAQ.AND.CCLOUD(1:3) == 'ICE'.AND. .NOT. LUSECHIC) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'WITH MIXED PHASE CLOUD MICROPHYSICS' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHIC TO TRUE IF YOU WANT TO ACTIVATE' - WRITE(UNIT=ILUOUT,FMT=*) 'ICE PHASE CHEMICAL SPECIES' - IF (LCH_RET_ICE) THEN - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE TRUE MEANS ALL SOLUBLE' - WRITE(UNIT=ILUOUT,FMT=*) 'GASES ARE RETAINED IN ICE PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'WHEN SUPERCOOLED WATER FREEZES' - ELSE - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE FALSE MEANS ALL SOLUBLE' - WRITE(UNIT=ILUOUT,FMT=*) 'GASES GO BACK TO THE GAS PHASE WHEN' - WRITE(UNIT=ILUOUT,FMT=*) 'SUPERCOOLED WATER FREEZES' - ENDIF -ENDIF -IF (LUSECHIC.AND. .NOT. CCLOUD(1:3) == 'ICE'.AND.CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT MIXED PHASE CLOUD MICROPHYSICS IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHIC IS SET TO FALSE' - LUSECHIC= .FALSE. -ENDIF -IF (LCH_PH.AND. (.NOT. LUSECHAQ)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'DIAGNOSTIC PH COMPUTATION IS ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT TO ACTIVATE IT' - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_PH IS SET TO FALSE' - LCH_PH= .FALSE. -ENDIF -IF (LUSECHIC.AND.(.NOT.LUSECHAQ)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT REALLY USE CLOUD CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHIC TO FALSE IF YOU DO NOT WANT USE IT' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -IF ((LUSECHIC).AND.(LCH_RET_ICE)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE RETENTION OF SOLUBLE GASES IN ICE' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE ICE PHASE CHEMISTRY IS ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'FLAG LCH_RET_ICE IS ONLY USES WHEN LUSECHIC IS SET' - WRITE(UNIT=ILUOUT,FMT=*) 'TO FALSE IE NO CHEMICAL SPECIES IN ICE' -ENDIF -! -CALL UPDATE_NAM_CH_MNHCN -CALL INI_NSV(KMI) -! -! From this point, all NSV* variables contain valid values for model KMI -! -DO JSV = 1,NSV - LUSESV(JSV,KMI) = .TRUE. -END DO -! -IF ( CAOP=='EXPL' .AND. .NOT.LDUST .AND. .NOT.LORILAM & - .AND. .NOT.LSALT .AND. .NOT.(CCLOUD=='LIMA') ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU WANT TO USE EXPLICIT AEROSOL OPTICAL ' - WRITE(UNIT=ILUOUT,FMT=*) 'PROPERTIES BUT YOU DONT HAVE DUST OR ' - WRITE(UNIT=ILUOUT,FMT=*) 'AEROSOL OR SALT THEREFORE CAOP=CLIM' - CAOP='CLIM' -END IF -!------------------------------------------------------------------------------- -! -!* 3. CHECK COHERENCE BETWEEN EXSEG VARIABLES AND FMFILE ATTRIBUTES -! ------------------------------------------------------------- -! -! -!* 3.1 Turbulence variable -! -IF ((CTURB /= 'NONE').AND.(HTURB == 'NONE')) THEN - CGETTKET ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE TURBULENCE KINETIC ENERGY TKE' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'TKE WILL BE INITIALIZED TO ZERO' -ELSE - IF (CTURB /= 'NONE') THEN - CGETTKET ='READ' - IF ((CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETTKET='INIT' - ELSE - CGETTKET ='SKIP' - END IF -END IF -! -! -IF ((CTOM == 'TM06').AND.(HTOM /= 'TM06')) THEN - CGETBL_DEPTH ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE BL DEPTH FOR THIRD ORDER MOMENTS' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO' -ELSE - IF (CTOM == 'TM06') THEN - CGETBL_DEPTH ='READ' - ELSE - CGETBL_DEPTH ='SKIP' - END IF -END IF -! -IF (LRMC01 .AND. .NOT. ORMC01) THEN - CGETSBL_DEPTH ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE SBL DEPTH FOR RMC01' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO' -ELSE - IF (LRMC01) THEN - CGETSBL_DEPTH ='READ' - ELSE - CGETSBL_DEPTH ='SKIP' - END IF -END IF -! -! -!* 3.2 Moist variables -! -IF (LUSERV.AND. (.NOT.OUSERV)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE VAPOR VARIABLE Rv WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & "Rv WILL BE INITIALIZED TO ZERO")') - CGETRVT='INIT' -ELSE - IF (LUSERV) THEN - CGETRVT='READ' - ELSE - CGETRVT='SKIP' - END IF -END IF -! -IF (LUSERC.AND. (.NOT.OUSERC)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE CLOUD VARIABLE Rc WHEREAS IT ", & - & " IS NOT IN INITIAL FMFILE",/, & - & "Rc WILL BE INITIALIZED TO ZERO")') - CGETRCT='INIT' -ELSE - IF (LUSERC) THEN - CGETRCT='READ' -! IF(CCONF=='START') CGETRCT='INIT' - ELSE - CGETRCT='SKIP' - END IF -END IF -! -IF (LUSERR.AND. (.NOT.OUSERR)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE RAIN VARIABLE Rr WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & " Rr WILL BE INITIALIZED TO ZERO")') - - CGETRRT='INIT' -ELSE - IF (LUSERR) THEN - CGETRRT='READ' -! IF( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRRT='INIT' - ELSE - CGETRRT='SKIP' - END IF -END IF -! -IF (LUSERI.AND. (.NOT.OUSERI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE VARIABLE Ri WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & " Ri WILL BE INITIALIZED TO ZERO")') - CGETRIT='INIT' -ELSE - IF (LUSERI) THEN - CGETRIT='READ' -! IF(CCONF=='START') CGETRIT='INIT' - ELSE - CGETRIT='SKIP' - END IF -END IF -! -IF (LUSECI.AND. (.NOT.OUSECI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE CONC. VARIABLE Ci WHEREAS IT ",& - & "IS NOT IN INITIAL FMFILE",/, & - & " Ci WILL BE INITIALIZED TO ZERO")') - CGETCIT='INIT' -ELSE - IF (LUSECI) THEN - CGETCIT='READ' - ELSE - CGETCIT='SKIP' - END IF -END IF -! -IF (LUSERS.AND. (.NOT.OUSERS)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SNOW VARIABLE Rs WHEREAS IT ",& - & "IS NOT IN INITIAL FMFILE",/, & - & " Rs WILL BE INITIALIZED TO ZERO")') - CGETRST='INIT' -ELSE - IF (LUSERS) THEN - CGETRST='READ' -! IF ( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRST='INIT' - ELSE - CGETRST='SKIP' - END IF -END IF -! -IF (LUSERG.AND. (.NOT.OUSERG)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE GRAUPEL VARIABLE Rg WHEREAS ",& - & " IT IS NOTIN INITIAL FMFILE",/, & - & "Rg WILL BE INITIALIZED TO ZERO")') - CGETRGT='INIT' -ELSE - IF (LUSERG) THEN - CGETRGT='READ' -! IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRGT='INIT' - ELSE - CGETRGT='SKIP' - END IF -END IF -! -IF (LUSERH.AND. (.NOT.OUSERH)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE HAIL VARIABLE Rh WHEREAS",& - & "IT IS NOT IN INITIAL FMFILE",/, & - & " Rh WILL BE INITIALIZED TO ZERO")') - CGETRHT='INIT' -ELSE - IF (LUSERH) THEN - CGETRHT='READ' -! IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRHT='INIT' - ELSE - CGETRHT='SKIP' - END IF -END IF -! -IF (LUSERC.AND. (.NOT.OUSERC)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD FRACTION WILL BE INITIALIZED ACCORDING' - WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0' - CGETCLDFR = 'INIT' -ELSE - IF ( LUSERC ) THEN - CGETCLDFR = 'READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETCLDFR='INIT' - ELSE - CGETCLDFR = 'SKIP' - END IF -END IF -! -IF (LUSERI.AND. (.NOT.OUSERI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE ICE CLOUD FRACTION WILL BE INITIALIZED ACCORDING' - WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0' - CGETICEFR = 'INIT' -ELSE - IF ( LUSERI ) THEN - CGETICEFR = 'READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETICEFR='INIT' - ELSE - CGETICEFR = 'SKIP' - END IF -END IF -! -IF(CTURBLEN=='RM17' .OR. CTURBLEN=='HM21') THEN - XCEDIS=0.34 -ELSE - XCEDIS=0.84 -END IF -! -!* 3.3 Moist turbulence -! -IF ( LUSERC .AND. CTURB /= 'NONE' ) THEN - IF ( .NOT. (OUSERC .AND. HTURB /= 'NONE') ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MOIST TURBULENCE WHEREAS IT ",/, & - & " WAS NOT THE CASE FOR THE INITIAL FMFILE GENERATION",/, & - & "SRC AND SIGS ARE INITIALIZED TO 0")') - CGETSRCT ='INIT' - CGETSIGS ='INIT' - ELSE - CGETSRCT ='READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETSRCT ='INIT' - CGETSIGS ='READ' - END IF -ELSE - CGETSRCT ='SKIP' - CGETSIGS ='SKIP' -END IF -! -IF(NMODEL_CLOUD==KMI .AND. CTURBLEN_CLOUD/='NONE') THEN - IF (CTURB=='NONE' .OR. .NOT.LUSERC) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO COMPUTE A MIXING LENGTH FOR CLOUD=", & - & A4,/, & - & ", WHEREAS YOU DO NOT SPECIFY A TURBULENCE SCHEME OR ", & - & "USE OF RC,",/," CTURBLEN_CLOUD IS SET TO NONE")') & - CTURBLEN_CLOUD - CTURBLEN_CLOUD='NONE' - END IF - IF( XCEI_MIN > XCEI_MAX ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("PROBLEM OF CEI LIMITS FOR CLOUD MIXING ",/, & - & "LENGTH COMPUTATION: XCEI_MIN=",E9.3,", XCEI_MAX=",E9.3)')& - XCEI_MIN,XCEI_MAX - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -IF ( LSIGMAS ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SIGMA_S FROM TURBULENCE SCHEME",/, & - & " IN ICE SUBGRID CONDENSATION, SO YOUR SIGMA_S"/, & - & " MIGHT BE SMALL ABOVE PBL DEPENDING ON LENGTH SCALE")') -END IF -! -IF (LSUBG_COND .AND. CTURB=='NONE' ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID CONDENSATION' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT TURBULENCE ' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: LSUBG_COND is SET to FALSE' - LSUBG_COND=.FALSE. -END IF -! -IF (L1D .AND. CTURB/='NONE' .AND. CTURBDIM == '3DIM') THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE 3D TURBULENCE IN 1D CONFIGURATION ' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE: CTURBDIM IS SET TO 1DIM' - CTURBDIM = '1DIM' -END IF -! -!* 3.4 Additional scalar variables -! -IF (NSV_USER == KSV_USER) THEN - DO JS = 1,KSV_USER ! to read all the variables in initial file - CGETSVT(JS)='READ' ! and to initialize them -! IF(CCONF=='START')CGETSVT(JS)='INIT' ! with these values - END DO -ELSEIF (NSV_USER > KSV_USER) THEN - IF (KSV_USER == 0) THEN - CGETSVT(1:NSV_USER)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MORE ADDITIONAL SCALAR " ,& - &" VARIABLES THAN THERE ARE IN INITIAL FMFILE",/, & - & "THE SUPPLEMENTARY VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - DO JS = 1,KSV_USER ! to read all the variables in initial file - CGETSVT(JS)='READ' ! and to initialize them -! IF(CCONF=='START')CGETSVT(JS)='INIT' ! with these values - END DO - DO JS = KSV_USER+1, NSV_USER ! to initialize to zero supplementary - CGETSVT(JS)='INIT' ! initial file) - END DO - END IF -ELSE - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE LESS ADDITIONAL SCALAR " ,& - &" VARIABLES THAN THERE ARE IN INITIAL FMFILE")') - DO JS = 1,NSV_USER ! to read the first NSV_USER variables in initial file - CGETSVT(JS)='READ' ! and to initialize with these values -! IF(CCONF=='START') CGETSVT(JS)='INIT' - END DO - DO JS = NSV_USER + 1, KSV_USER ! to skip the last (KSV_USER-NSV_USER) variables - CGETSVT(JS)='SKIP' - END DO -END IF -! -! C2R2 and KHKO SV case -! -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN - IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') THEN - CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='READ' -! IF(CCONF=='START') CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C2R2 & - & (or KHKO) SCHEME IN INITIAL FMFILE",/,& - & "THE C2R2 (or KHKO) VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT' - END IF -END IF -! -! C3R5 SV case -! -IF (CCLOUD == 'C3R5') THEN - IF (HCLOUD == 'C3R5') THEN - CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='READ' -! IF(CCONF=='START') CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C3R5 & - &SCHEME IN INITIAL FMFILE",/,& - & "THE C1R3 VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT' - END IF -END IF -! -! LIMA SV case -! -IF (CCLOUD == 'LIMA') THEN - IF (HCLOUD == 'LIMA') THEN - CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LIMA & - & SCHEME IN INITIAL FMFILE",/,& - & "THE LIMA VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='INIT' - END IF -END IF -! -! Electrical SV case -! -IF (CELEC /= 'NONE') THEN - IF (HELEC /= 'NONE') THEN - CGETSVT(NSV_ELECBEG:NSV_ELECEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR ELECTRICAL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE ELECTRICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT' - END IF -END IF -! -! (explicit) LINOx SV case -! -IF (CELEC /= 'NONE' .AND. LLNOX_EXPLICIT) THEN - IF (HELEC /= 'NONE' .AND. OLNOX_EXPLICIT) THEN - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX & - & IN INITIAL FMFILE",/,& - & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT' - END IF -END IF -! -! Chemical SV case (excluding aqueous chemical species) -! -IF (LUSECHEM) THEN - IF (OUSECHEM) THEN - CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='READ' - IF(CCONF=='START' .AND. LCH_INIT_FIELD ) CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT' - END IF -END IF -! add aqueous chemical species -IF (LUSECHAQ) THEN - IF (OUSECHAQ) THEN - CGETSVT(NSV_CHACBEG:NSV_CHACEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SCHEME IN AQUEOUS PHASE IN INITIAL FMFILE",/,& - & "THE AQUEOUS PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT' - END IF -END IF -! add ice phase chemical species -IF (LUSECHIC) THEN - IF (OUSECHIC) THEN - CGETSVT(NSV_CHICBEG:NSV_CHICEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SPECIES IN ICE PHASE IN INITIAL FMFILE",/,& - & "THE ICE PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT' - END IF -END IF -! pH values = diagnostics -IF (LCH_PH .AND. .NOT. OCH_PH) THEN - CGETPHC ='INIT' !will be initialized to XCH_PHINIT - IF (LUSERR) THEN - CGETPHR = 'INIT' !idem - ELSE - CGETPHR = 'SKIP' - ENDIF -ELSE - IF (LCH_PH) THEN - CGETPHC ='READ' - IF (LUSERR) THEN - CGETPHR = 'READ' - ELSE - CGETPHR = 'SKIP' - ENDIF - ELSE - CGETPHC ='SKIP' - CGETPHR ='SKIP' - END IF -END IF -! -! Dust case -! -IF (LDUST) THEN - IF (ODUST) THEN - CGETSVT(NSV_DSTBEG:NSV_DSTEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR DUST & - &SCHEME IN INITIAL FMFILE",/,& - & "THE DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT' - END IF - IF (LDEPOS_DST(KMI)) THEN - - !UPG *PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF DUST IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG *PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_DST(KMI) ) THEN - CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD DUST & - & SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT' - END IF - END IF - - IF(NMODE_DST.GT.3 .OR. NMODE_DST.LT.1) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("DUST MODES MUST BE BETWEEN 1 and 3 ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -! Sea Salt case -! -IF (LSALT) THEN - IF (OSALT) THEN - CGETSVT(NSV_SLTBEG:NSV_SLTEND)='READ' - CGETZWS='READ' -! IF(CCONF=='START') CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR SALT & - &SCHEME IN INITIAL FMFILE",/,& - & "THE SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' - CGETZWS='INIT' - END IF - IF (LDEPOS_SLT(KMI)) THEN - - !UPG*PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND. & - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF SEA SALT AEROSOLS IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG*PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_SLT(KMI) ) THEN - CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD SEA SALT & - & SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST SEA SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT' - END IF - END IF - IF(NMODE_SLT.GT.8 .OR. NMODE_SLT.LT.1) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("SALT MODES MUST BE BETWEEN 1 and 8 ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -! Orilam SV case -! -IF (LORILAM) THEN - IF (OORILAM) THEN - CGETSVT(NSV_AERBEG:NSV_AEREND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR AEROSOL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE AEROSOLS VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT' - END IF - IF (LDEPOS_AER(KMI)) THEN - - !UPG*PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF ORILAM AEROSOLS IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG*PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_AER(KMI) ) THEN - CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and IN CLOUD & - & AEROSOL SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST AEROSOL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT' - END IF - END IF -END IF -! -! Lagrangian variables -! -IF (LINIT_LG .AND. .NOT.(LLG)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("IT IS INCOHERENT TO HAVE LINIT_LG=.T. AND LLG=.F.",/,& - & "IF YOU WANT LAGRANGIAN TRACERS CHANGE LLG TO .T. ")') -ENDIF -IF (LLG) THEN - IF (OLG .AND. .NOT.(LINIT_LG .AND. CPROGRAM=='MESONH')) THEN - CGETSVT(NSV_LGBEG:NSV_LGEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT' - ELSE - IF(.NOT.(LINIT_LG) .AND. CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO LAGRANGIAN VARIABLES IN INITIAL FMFILE",/,& - & "THE LAGRANGIAN VARIABLES HAVE BEEN REINITIALIZED")') - LINIT_LG=.TRUE. - ENDIF - CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT' - END IF -END IF -! -! -! LINOx SV case -! -IF (.NOT.LUSECHEM .AND. LCH_CONV_LINOX) THEN - IF (.NOT.OUSECHEM .AND. OCH_CONV_LINOX) THEN - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX & - &IN INITIAL FMFILE",/,& - & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT' - END IF -END IF -! -! Passive pollutant case -! -IF (LPASPOL) THEN - IF (OPASPOL) THEN - CGETSVT(NSV_PPBEG:NSV_PPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT' - END IF -END IF -! -#ifdef MNH_FOREFIRE -! ForeFire -! -IF (LFOREFIRE) THEN - IF (OFOREFIRE) THEN - CGETSVT(NSV_FFBEG:NSV_FFEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO FOREFIRE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_FFBEG:NSV_FFEND)='INIT' - END IF -END IF -#endif -! Blaze smoke -! -IF (LBLAZE) THEN - IF (OFIRE) THEN - CGETSVT(NSV_FIREBEG:NSV_FIREEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO BLAZE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_FIREBEG:NSV_FIREEND)='INIT' - END IF -END IF -! -! Conditional sampling case -! -IF (LCONDSAMP) THEN - IF (OCONDSAMP) THEN - CGETSVT(NSV_CSBEG:NSV_CSEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT' - END IF -END IF -! -! Blowing snow scheme -! -IF (LBLOWSNOW) THEN - IF (OBLOWSNOW) THEN - CGETSVT(NSV_SNWBEG:NSV_SNWEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR BLOWING SNOW & - &SCHEME IN INITIAL FMFILE",/,& - & "THE BLOWING SNOW VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SNWBEG:NSV_SNWEND)='INIT' - END IF -END IF -! -! -! -!* 3.5 Check coherence between the radiation control parameters -! -IF( CRAD == 'ECMW' .AND. CPROGRAM=='MESONH' ) THEN - IF(CLW == 'RRTM' .AND. COPILW == 'SMSH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'the SMSH parametrisation of LW optical properties for cloud ice' - WRITE(UNIT=ILUOUT,FMT=*) '(COPILW) can not be used with RRTM radiation scheme' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF - IF(CLW == 'MORC' .AND. COPWLW == 'LILI') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'the LILI parametrisation of LW optical properties for cloud water' - WRITE(UNIT=ILUOUT,FMT=*) '(COPWLW) can not be used with MORC radiation scheme' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF - IF( .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE SUBGRID CONDENSATION' - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90' - ELSE IF (CLW == 'MORC') THEN - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE MORCRETTE LW SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90' - ELSE - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=6 IN ini_radconf.f90' - ENDIF -! - IF( LCLEAR_SKY .AND. XDTRAD_CLONLY /= XDTRAD) THEN - ! Check the validity of the LCLEAR_SKY approximation - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE CLEAR-SKY APPROXIMATION' - WRITE(UNIT=ILUOUT,FMT=*) '(i.e. AVERAGE THE WHOLE CLOUDFREE VERTICALS BUT KEEP' - WRITE(UNIT=ILUOUT,FMT=*) 'ALL THE CLOUDY VERTICALS) AND' - WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD-ONLY APPROXIMATION (i.e. YOU CALL MORE OFTEN THE' - WRITE(UNIT=ILUOUT,FMT=*) 'RADIATIONS FOR THE CLOUDY VERTICALS THAN FOR CLOUDFREE ONES).' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE, SO CHOOSE BETWEEN :' - WRITE(UNIT=ILUOUT,FMT=*) 'XDTRAD_CLONLY = XDTRAD and LCLEAR_SKY = FALSE' -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF( XDTRAD_CLONLY > XDTRAD ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("BAD USE OF THE CLOUD-ONLY APPROXIMATION " ,& - &" XDTRAD SHOULD BE LARGER THAN XDTRAD_CLONLY ")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF(( XDTRAD < XTSTEP ).OR. ( XDTRAD_CLONLY < XTSTEP )) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("THE RADIATION CALL XDTRAD OR XDTRAD_CLONLY " ,& - &" IS MORE FREQUENT THAN THE TIME STEP SO ADJUST XDTRAD OR XDTRAD_CLONLY ")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -IF ( CRAD /= 'NONE' .AND. CPROGRAM=='MESONH' ) THEN - CGETRAD='READ' - IF( HRAD == 'NONE' .AND. CCONF=='RESTA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU ARE PERFORMING A RESTART. FOR THIS SEGMENT, YOU ARE USING A RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) 'SCHEME AND NO RADIATION SCHEME WAS USED FOR THE PREVIOUS SEGMENT.' - CGETRAD='INIT' - END IF - IF(CCONF=='START') THEN - CGETRAD='INIT' - END IF - IF(CCONF=='RESTA' .AND. (.NOT. LAERO_FT) .AND. (.NOT. LORILAM) & - .AND. (.NOT. LSALT) .AND. (.NOT. LDUST)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) '!!! WARNING !!! FOR REPRODUCTIBILITY BETWEEN START and START+RESTART,' - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LAERO_FT=T WITH CAER=TEGE IF CCONF=RESTA IN ALL SEGMENTS' - WRITE(UNIT=ILUOUT,FMT=*) 'TO UPDATE THE OZONE AND AEROSOLS CLIMATOLOGY USED BY THE RADIATION CODE;' - END IF -END IF -! -! 3.6 check the initialization of the deep convection scheme -! -IF ( (CDCONV /= 'KAFR') .AND. & - (CSCONV /= 'KAFR') .AND. LCHTRANS ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT IT CAN ONLY",& - &"BE USED FOR THE KAIN FRITSCH SCHEME ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -SELECT CASE ( CDCONV ) - CASE( 'KAFR' ) - IF (.NOT. ( LUSERV ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH DEEP CONV. ",& - &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")') - LUSERV=.TRUE. - ELSE IF (.NOT. ( LUSERI ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO ",& - &" THE CLOUD WATER ")') - ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE ",& - &" WILL BE ADDED TO THE WATER VAPOR FIELD ")') - END IF - IF ( LCHTRANS .AND. NSV == 0 ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",& - &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")') - LCHTRANS=.FALSE. - END IF -END SELECT -! -IF ( CDCONV == 'KAFR' .AND. LCHTRANS .AND. NSV > 0 ) THEN - IF( OCHTRANS ) THEN - CGETSVCONV='READ' - ELSE - CGETSVCONV='INIT' - END IF -END IF -! -SELECT CASE ( CSCONV ) - CASE( 'KAFR' ) - IF (.NOT. ( LUSERV ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH SHALLOW CONV. ",& - &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")') - LUSERV=.TRUE. - ELSE IF (.NOT. ( LUSERI ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO ",& - &" THE CLOUD WATER ")') - ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE ",& - &" WILL BE ADDED TO THE WATER VAPOR FIELD ")') - END IF - IF ( LCHTRANS .AND. NSV == 0 ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",& - &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")') - LCHTRANS=.FALSE. - END IF - CASE( 'EDKF' ) - IF (CTURB == 'NONE' ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE EDKF ", & - &"SHALLOW CONVECTION WITHOUT TURBULENCE SCHEME : ", & - &"IT IS NOT POSSIBLE")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END SELECT -! -! -CGETCONV = 'SKIP' -! -IF ( (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR' ) .AND. CPROGRAM=='MESONH') THEN - CGETCONV = 'READ' - IF( HDCONV == 'NONE' .AND. CCONF=='RESTA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='(" YOU ARE PERFORMING A RESTART. FOR THIS ",& - &" SEGMENT, YOU ARE USING A DEEP CONVECTION SCHEME AND NO DEEP ",& - &" CONVECTION SCHEME WAS USED FOR THE PREVIOUS SEGMENT. ")') -! - CGETCONV = 'INIT' - END IF - IF(CCONF=='START') THEN - CGETCONV = 'INIT' - END IF -END IF -! -!* 3.7 configuration and model version -! -IF (KMI == 1) THEN -! - IF (L1D.AND.(CLBCX(1)/='CYCL'.AND.CLBCX(2)/='CYCL' & - .AND.CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 1D MODEL VERSION WITH NON-CYCL",& - & "CLBCX OR CLBCY VALUES")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - IF (L2D.AND.(CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2D MODEL VERSION WITH NON-CYCL",& - & " CLBCY VALUES")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - ! - IF ( (.NOT. LCARTESIAN) .AND. ( LCORIO) .AND. (.NOT. LGEOST_UV_FRC) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("BE CAREFUL YOU COULD HAVE SPURIOUS MOTIONS " ,& - & " NEAR THE LBC AS LCORIO=T and LGEOST_UV_FRC=F")') - END IF - ! - IF ((.NOT.LFLAT).AND.OFLAT) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'ZERO OROGRAPHY IN INITIAL FILE' - WRITE(UNIT=ILUOUT,FMT=*) '***** ALL TERMS HAVE BEEN NEVERTHELESS COMPUTED WITHOUT SIMPLIFICATION*****' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS SHOULD LEAD TO ERRORS IN THE PRESSURE COMPUTATION' - END IF - IF (LFLAT.AND.(.NOT.OFLAT)) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='(" OROGRAPHY IS NOT EQUAL TO ZERO ", & - & "IN INITIAL FILE" ,/, & - & "******* OROGRAPHY HAS BEEN SET TO ZERO *********",/, & - & "ACCORDING TO ZERO OROGRAPHY, SIMPLIFICATIONS HAVE ", & - & "BEEN MADE IN COMPUTATIONS")') - END IF -END IF -! -!* 3.8 System of equations -! -IF ( HEQNSYS /= CEQNSYS ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU HAVE CHANGED THE SYSTEM OF EQUATIONS' - WRITE(ILUOUT,FMT=*) 'THE ANELASTIC CONSTRAINT IS PERHAPS CHANGED :' - WRITE(ILUOUT,FMT=*) 'FOR THE INITIAL FILE YOU HAVE USED ',HEQNSYS - WRITE(ILUOUT,FMT=*) 'FOR THE RUN YOU PLAN TO USE ',CEQNSYS - WRITE(ILUOUT,FMT=*) 'THIS CAN LEAD TO A NUMERICAL EXPLOSION IN THE FIRST TIME STEPS' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -! 3.9 Numerical schemes -! -IF ( (CUVW_ADV_SCHEME == 'CEN4TH') .AND. & - (CTEMP_SCHEME /= 'LEFR') .AND. (CTEMP_SCHEME /= 'RKC4') ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("CEN4TH SCHEME HAS TO BE USED WITH ",& - &"CTEMP_SCHEME = LEFR of RKC4 ONLY")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ( (CUVW_ADV_SCHEME == 'WENO_K') .AND. LNUMDIFU ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE NUMERICAL DIFFUSION ",& - &"WITH WENO SCHEME ALREADY DIFFUSIVE")') -END IF -!------------------------------------------------------------------------------- -! -!* 4. CHECK COHERENCE BETWEEN EXSEG VARIABLES -! --------------------------------------- -! -!* 4.1 coherence between coupling variables in EXSEG file -! -IF (KMI == 1) THEN - NCPL_NBR = 0 - DO JCI = 1,JPCPLFILEMAX - IF (LEN_TRIM(CCPLFILE(JCI)) /= 0) THEN ! Finds the number - NCPL_NBR = NCPL_NBR + 1 ! of coupling files - ENDIF - IF (JCI/=JPCPLFILEMAX) THEN ! Deplaces the coupling files - IF ((LEN_TRIM(CCPLFILE(JCI)) == 0) .AND. &! names if one missing - (LEN_TRIM(CCPLFILE(JCI+1)) /= 0)) THEN - DO JI=JCI,JPCPLFILEMAX-1 - CCPLFILE(JI)=CCPLFILE(JI+1) - END DO - CCPLFILE(JPCPLFILEMAX)=' ' - END IF - END IF - END DO -! - IF (NCPL_NBR /= 0) THEN - LSTEADYLS = .FALSE. - ELSE - LSTEADYLS = .TRUE. - ENDIF -END IF -! -!* 4.3 check consistency in forcing switches -! -IF ( LFORCING ) THEN - IF ( LRELAX_THRV_FRC .AND. ( LTEND_THRV_FRC .OR. LGEOST_TH_FRC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU CHOSE A TEMPERATURE AND HUMIDITY RELAXATION' - WRITE(ILUOUT,FMT=*) 'TOGETHER WITH TENDENCY OR GEOSTROPHIC FORCING' - WRITE(ILUOUT,FMT=*) & - 'YOU MIGHT CHECK YOUR SWITCHES: LRELAX_THRV_FRC, LTEND_THRV_FRC, AND' - WRITE(ILUOUT,FMT=*) 'LGEOST_TH_FRC' - END IF -! - IF ( LRELAX_UV_FRC .AND. LRELAX_UVMEAN_FRC) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU MUST CHOOSE BETWEEN A RELAXATION APPLIED TO' - WRITE(ILUOUT,FMT=*) 'THE 3D FULL WIND FIELD (LRELAX_UV_FRC) OR' - WRITE(ILUOUT,FMT=*) 'THE HORIZONTAL MEAN WIND (LRELAX_UVMEAN_FRC)' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( (LRELAX_UV_FRC .OR. LRELAX_UVMEAN_FRC) .AND. LGEOST_UV_FRC ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU MUST NOT USE A WIND RELAXATION' - WRITE(ILUOUT,FMT=*) 'TOGETHER WITH A GEOSTROPHIC FORCING' - WRITE(ILUOUT,FMT=*) 'CHECK SWITCHES: LRELAX_UV_FRC, LRELAX_UVMEAN_FRC, LGEOST_UV_FRC' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( CRELAX_HEIGHT_TYPE.NE."FIXE" .AND. CRELAX_HEIGHT_TYPE.NE."THGR" ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'CRELAX_HEIGHT_TYPE MUST BE EITHER "FIXE" OR "THGR"' - WRITE(ILUOUT,FMT=*) 'BUT IT IS "', CRELAX_HEIGHT_TYPE, '"' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( .NOT.LCORIO .AND. LGEOST_UV_FRC ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU CANNOT HAVE A GEOSTROPHIC FORCING WITHOUT' - WRITE(ILUOUT,FMT=*) 'ACTIVATING LCORIOLIS OPTION' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( LPGROUND_FRC ) THEN - WRITE(ILUOUT,FMT=*) 'SURFACE PRESSURE FORCING NOT YET IMPLEMENTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! -END IF -! -IF (LTRANS .AND. .NOT. LFLAT ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU ASK FOR A CONSTANT SPEED DOMAIN TRANSLATION ' - WRITE(ILUOUT,FMT=*) 'BUT NOT IN THE FLAT TERRAIN CASE:' - WRITE(ILUOUT,FMT=*) 'THIS IS NOT ALLOWED ACTUALLY' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -!* 4.4 Check the coherence between the LUSERn and LHORELAX -! -IF (.NOT. LUSERV .AND. LHORELAX_RV) THEN - LHORELAX_RV=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RV FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE' -END IF -! -IF (.NOT. LUSERC .AND. LHORELAX_RC) THEN - LHORELAX_RC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RC FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE' -END IF -! -IF (.NOT. LUSERR .AND. LHORELAX_RR) THEN - LHORELAX_RR=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RR FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE' -END IF -! -IF (.NOT. LUSERI .AND. LHORELAX_RI) THEN - LHORELAX_RI=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RI FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE' -END IF -! -IF (.NOT. LUSERS .AND. LHORELAX_RS) THEN - LHORELAX_RS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RS FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE' -END IF -! -IF (.NOT. LUSERG .AND. LHORELAX_RG) THEN - LHORELAX_RG=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RG FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE' -END IF -! -IF (.NOT. LUSERH .AND. LHORELAX_RH) THEN - LHORELAX_RH=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RH FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE' -END IF -! -IF (CTURB=='NONE' .AND. LHORELAX_TKE) THEN - LHORELAX_TKE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX TKE FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE' -END IF -! -! -IF (CCLOUD/='C2R2' .AND. CCLOUD/='KHKO' .AND. LHORELAX_SVC2R2) THEN - LHORELAX_SVC2R2=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C2R2 or KHKO FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC2R2=FALSE' -END IF -! -IF (CCLOUD/='C3R5' .AND. LHORELAX_SVC1R3) THEN - LHORELAX_SVC1R3=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C3R5 FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC1R3=FALSE' -END IF -! -IF (CCLOUD/='LIMA' .AND. LHORELAX_SVLIMA) THEN - LHORELAX_SVLIMA=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX LIMA FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVLIMA=FALSE' -END IF -! -IF (CELEC(1:3) /= 'ELE' .AND. LHORELAX_SVELEC) THEN - LHORELAX_SVELEC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ELEC FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVELEC=FALSE' -END IF -! -IF (.NOT. LUSECHEM .AND. LHORELAX_SVCHEM) THEN - LHORELAX_SVCHEM=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CHEM FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHEM=FALSE' -END IF -! -IF (.NOT. LUSECHIC .AND. LHORELAX_SVCHIC) THEN - LHORELAX_SVCHIC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ICE CHEM FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHIC=FALSE' -END IF -! -IF (.NOT. LORILAM .AND. LHORELAX_SVAER) THEN - LHORELAX_SVAER=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX AEROSOL FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVAER=FALSE' -END IF - -IF (.NOT. LDUST .AND. LHORELAX_SVDST) THEN - LHORELAX_SVDST=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX DUST FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVDST=FALSE' -END IF - -IF (.NOT. LSALT .AND. LHORELAX_SVSLT) THEN - LHORELAX_SVSLT=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SEA SALT FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSLT=FALSE' -END IF - -IF (.NOT. LPASPOL .AND. LHORELAX_SVPP) THEN - LHORELAX_SVPP=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX PASSIVE POLLUTANT FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVPP=FALSE' -END IF -#ifdef MNH_FOREFIRE -IF (.NOT. LFOREFIRE .AND. LHORELAX_SVFF) THEN - LHORELAX_SVFF=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX FOREFIRE FLUXES BUT THEY DO NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFF=FALSE' -END IF -#endif -IF (.NOT. LBLAZE .AND. LHORELAX_SVFIRE) THEN - LHORELAX_SVFIRE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLAZE FLUXES BUT THEY DO NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFIRE=FALSE' -END IF -IF (.NOT. LCONDSAMP .AND. LHORELAX_SVCS) THEN - LHORELAX_SVCS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CONDITIONAL SAMPLING FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCS=FALSE' -END IF - -IF (.NOT. LBLOWSNOW .AND. LHORELAX_SVSNW) THEN - LHORELAX_SVSNW=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLOWING SNOW FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSNW=FALSE' -END IF - -IF (ANY(LHORELAX_SV(NSV+1:))) THEN - LHORELAX_SV(NSV+1:)=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SV(NSV+1:) FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(NSV+1:)=FALSE' -END IF -! -!* 4.5 check the number of points for the horizontal relaxation -! -IF ( NRIMX > KRIMX .AND. .NOT.LHORELAX_SVELEC ) THEN - NRIMX = KRIMX - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS ' - WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE ' - WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:' - WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMX =',NRIMX -END IF -! -IF ( L2D .AND. KRIMY>0 ) THEN - NRIMY = 0 - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A 2D MODEL THEREFORE NRIMY=0 ' -END IF -! -IF ( NRIMY > KRIMY .AND. .NOT.LHORELAX_SVELEC ) THEN - NRIMY = KRIMY - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS ' - WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE ' - WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:' - WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMY =',NRIMY -END IF -! -IF ( (.NOT. LHORELAX_UVWTH) .AND. (.NOT.(ANY(LHORELAX_SV))) .AND. & - (.NOT. LHORELAX_SVC2R2).AND. (.NOT. LHORELAX_SVC1R3) .AND. & - (.NOT. LHORELAX_SVLIMA).AND. & - (.NOT. LHORELAX_SVELEC).AND. (.NOT. LHORELAX_SVCHEM) .AND. & - (.NOT. LHORELAX_SVLG) .AND. (.NOT. LHORELAX_SVPP) .AND. & - (.NOT. LHORELAX_SVCS) .AND. (.NOT. LHORELAX_SVFIRE) .AND. & -#ifdef MNH_FOREFIRE - (.NOT. LHORELAX_SVFF) .AND. & -#endif - (.NOT. LHORELAX_RV) .AND. (.NOT. LHORELAX_RC) .AND. & - (.NOT. LHORELAX_RR) .AND. (.NOT. LHORELAX_RI) .AND. & - (.NOT. LHORELAX_RS) .AND. (.NOT. LHORELAX_RG) .AND. & - (.NOT. LHORELAX_RH) .AND. (.NOT. LHORELAX_TKE) .AND. & - (.NOT. LHORELAX_SVCHIC).AND. & - (NRIMX /= 0 .OR. NRIMY /= 0)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'THEREFORE NRIMX=NRIMY=0 ' - NRIMX=0 - NRIMY=0 -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (NRIMX==0 .OR. (NRIMY==0 .AND. .NOT.(L2D) ))) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'BUT NRIMX OR NRIMY=0 CHANGE YOUR VALUES ' - WRITE(ILUOUT,FMT=*) "LHORELAX_UVWTH=",LHORELAX_UVWTH - WRITE(ILUOUT,FMT=*) "LHORELAX_SVC2R2=",LHORELAX_SVC2R2 - WRITE(ILUOUT,FMT=*) "LHORELAX_SVC1R3=",LHORELAX_SVC1R3 - WRITE(ILUOUT,FMT=*) "LHORELAX_SVLIMA=",LHORELAX_SVLIMA - WRITE(ILUOUT,FMT=*) "LHORELAX_SVELEC=",LHORELAX_SVELEC - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHEM=",LHORELAX_SVCHEM - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHIC=",LHORELAX_SVCHIC - WRITE(ILUOUT,FMT=*) "LHORELAX_SVLG=",LHORELAX_SVLG - WRITE(ILUOUT,FMT=*) "LHORELAX_SVPP=",LHORELAX_SVPP - WRITE(ILUOUT,FMT=*) "LHORELAX_SVFIRE=",LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE - WRITE(ILUOUT,FMT=*) "LHORELAX_SVFF=",LHORELAX_SVFF -#endif - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCS=",LHORELAX_SVCS - WRITE(ILUOUT,FMT=*) "LHORELAX_SV=",LHORELAX_SV - WRITE(ILUOUT,FMT=*) "LHORELAX_RV=",LHORELAX_RV - WRITE(ILUOUT,FMT=*) "LHORELAX_RC=",LHORELAX_RC - WRITE(ILUOUT,FMT=*) "LHORELAX_RR=",LHORELAX_RR - WRITE(ILUOUT,FMT=*) "LHORELAX_RI=",LHORELAX_RI - WRITE(ILUOUT,FMT=*) "LHORELAX_RG=",LHORELAX_RG - WRITE(ILUOUT,FMT=*) "LHORELAX_RS=",LHORELAX_RS - WRITE(ILUOUT,FMT=*) "LHORELAX_RH=",LHORELAX_RH - WRITE(ILUOUT,FMT=*) "LHORELAX_TKE=", LHORELAX_TKE - WRITE(ILUOUT,FMT=*) "NRIMX=",NRIMX - WRITE(ILUOUT,FMT=*) "NRIMY=",NRIMY - WRITE(ILUOUT,FMT=*) "L2D=",L2D - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (KMI /=1)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'FOR A NESTED MODEL BUT THE COUPLING IS ALREADY DONE' - WRITE(ILUOUT,FMT=*) 'BY THE GRID NESTING. CHANGE LHORELAX TO FALSE' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (CLBCX(1)=='CYCL'.OR.CLBCX(2)=='CYCL' & - .OR.CLBCY(1)=='CYCL'.OR.CLBCY(2)=='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'FOR CYCLIC CLBCX OR CLBCY VALUES' - WRITE(ILUOUT,FMT=*) 'CHANGE LHORELAX TO FALSE' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERV) .AND. LUSERV .AND. LHORELAX_RV -ELSE - GRELAX = .NOT.(LUSERV_G(NDAD(KMI))) .AND. LUSERV_G(KMI).AND. LHORELAX_RV -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RV=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RV FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERC) .AND. LUSERC .AND. LHORELAX_RC -ELSE - GRELAX = .NOT.(LUSERC_G(NDAD(KMI))) .AND. LUSERC_G(KMI).AND. LHORELAX_RC -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RC FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERR) .AND. LUSERR .AND. LHORELAX_RR -ELSE - GRELAX = .NOT.(LUSERR_G(NDAD(KMI))) .AND. LUSERR_G(KMI).AND. LHORELAX_RR -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RR=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RR FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERI) .AND. LUSERI .AND. LHORELAX_RI -ELSE - GRELAX = .NOT.(LUSERI_G(NDAD(KMI))) .AND. LUSERI_G(KMI).AND. LHORELAX_RI -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RI=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RI FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERG) .AND. LUSERG .AND. LHORELAX_RG -ELSE - GRELAX = .NOT.(LUSERG_G(NDAD(KMI))) .AND. LUSERG_G(KMI).AND. LHORELAX_RG -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RG=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RG FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERH) .AND. LUSERH .AND. LHORELAX_RH -ELSE - GRELAX = .NOT.(LUSERH_G(NDAD(KMI))) .AND. LUSERH_G(KMI).AND. LHORELAX_RH -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RH=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RH FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERS) .AND. LUSERS .AND. LHORELAX_RS -ELSE - GRELAX = .NOT.(LUSERS_G(NDAD(KMI))) .AND. LUSERS_G(KMI).AND. LHORELAX_RS -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RS FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = HTURB=='NONE' .AND. LUSETKE(1).AND. LHORELAX_TKE -ELSE - GRELAX = .NOT.(LUSETKE(NDAD(KMI))) .AND. LUSETKE(KMI) .AND. LHORELAX_TKE -END IF -! -IF ( GRELAX ) THEN - LHORELAX_TKE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE TKE FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE' -END IF -! -! -DO JSV = 1,NSV_USER -! - IF (KMI==1) THEN - GRELAX = KSV_USER<JSV .AND. LUSESV(JSV,1).AND. LHORELAX_SV(JSV) - ELSE - GRELAX = .NOT.(LUSESV(JSV,NDAD(KMI))) .AND. LUSESV(JSV,KMI) .AND. LHORELAX_SV(JSV) - END IF - ! - IF ( GRELAX ) THEN - LHORELAX_SV(JSV)=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE ',JSV,' SV FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(',JSV,')=FALSE' - END IF -END DO -! -!* 4.6 consistency in LES diagnostics choices -! -IF (CLES_NORM_TYPE=='EKMA' .AND. .NOT. LCORIO) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE EKMAN NORMALIZATION' - WRITE(ILUOUT,FMT=*) 'BUT CORIOLIS FORCE IS NOT USED (LCORIO=.FALSE.)' - WRITE(ILUOUT,FMT=*) 'THEN, NO NORMALIZATION IS PERFORMED' - CLES_NORM_TYPE='NONE' -END IF -! -!* 4.7 Check the coherence with LNUMDIFF -! -IF (L1D .AND. (LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE HORIZONTAL DIFFUSION ' - WRITE(ILUOUT,FMT=*) 'BUT YOU ARE IN A COLUMN MODEL (L1D=.TRUE.).' - WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFU and LNUMDIFTH and LNUMDIFSV' - WRITE(ILUOUT,FMT=*) 'ARE SET TO FALSE' - LNUMDIFU=.FALSE. - LNUMDIFTH=.FALSE. - LNUMDIFSV=.FALSE. -END IF -! -IF (.NOT. LNUMDIFTH .AND. LZDIFFU) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE HORIZONTAL DIFFUSION (LNUMDIFTH=F)' - WRITE(ILUOUT,FMT=*) 'BUT YOU WANT TO USE Z-NUMERICAL DIFFUSION ' - WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFTH IS SET TO TRUE' - LNUMDIFTH=.TRUE. -END IF -! -!* 4.8 Other -! -IF (XTNUDGING < 4.*XTSTEP) THEN - XTNUDGING = 4.*XTSTEP - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("TIME SCALE FOR NUDGING CAN NOT BE SMALLER THAN", & - & " FOUR TIMES THE TIME STEP")') - WRITE(ILUOUT,FMT=*) 'XTNUDGING is SET TO ',XTNUDGING -END IF -! -! -IF (XWAY(KMI) == 3. ) THEN - XWAY(KMI) = 2. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("XWAY=3 DOES NOT EXIST ANYMORE; ", & - & " IT IS REPLACED BY XWAY=2 ")') -END IF -! -IF ( (KMI == 1) .AND. XWAY(KMI) /= 0. ) THEN - XWAY(KMI) = 0. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("XWAY MUST BE EQUAL TO 0 FOR DAD MODEL")') -END IF -! -!JUANZ ZRESI solver need BSPLITTING -IF ( CPRESOPT == 'ZRESI' .AND. CSPLIT /= 'BSPLITTING' ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("Paralleliez in Z solver CPRESOPT=ZRESI need also CSPLIT=BSPLITTING ")') - WRITE(ILUOUT,FMT=*) ' ERROR you have to set also CSPLIT=BSPLITTING ' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ( LEN_TRIM(HINIFILEPGD)>0 ) THEN - IF ( CINIFILEPGD/=HINIFILEPGD ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) ' ERROR : in EXSEG1.nam, in NAM_LUNITn you have CINIFILEPGD= ',CINIFILEPGD - WRITE(ILUOUT,FMT=*) ' whereas in .des you have CINIFILEPGD= ',HINIFILEPGD - WRITE(ILUOUT,FMT=*) ' Please check your Namelist ' - WRITE(ILUOUT,FMT=*) ' For example, you may have specified the un-nested PGD file instead of the nested PGD file ' - WRITE(ILUOUT,FMT=*) - WRITE(ILUOUT,FMT=*) '###############' - WRITE(ILUOUT,FMT=*) ' MESONH ABORTS' - WRITE(ILUOUT,FMT=*) '###############' - WRITE(ILUOUT,FMT=*) - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -ELSE - CINIFILEPGD = '' -!* note that after a spawning, there is no value for CINIFILEPGD in the .des file, -! so the checking cannot be made if the user starts a simulation directly from -! a spawned file (without the prep_real_case stage) -END IF -!------------------------------------------------------------------------------- -! -!* 5. WE DO NOT FORGET TO UPDATE ALL DOLLARN NAMELIST VARIABLES -! --------------------------------------------------------- -! -CALL UPDATE_NAM_LUNITN -CALL UPDATE_NAM_CONFN -CALL UPDATE_NAM_DRAGTREEN -CALL UPDATE_NAM_DRAGBLDGN -CALL UPDATE_NAM_DYNN -CALL UPDATE_NAM_ADVN -CALL UPDATE_NAM_PARAMN -CALL UPDATE_NAM_PARAM_RADN -#ifdef MNH_ECRAD -CALL UPDATE_NAM_PARAM_ECRADN -#endif -CALL UPDATE_NAM_PARAM_KAFRN -CALL UPDATE_NAM_PARAM_MFSHALLN -CALL UPDATE_NAM_LBCN -CALL UPDATE_NAM_NUDGINGN -CALL UPDATE_NAM_TURBN -CALL UPDATE_NAM_BLANKN -CALL UPDATE_NAM_CH_MNHCN -CALL UPDATE_NAM_CH_SOLVERN -CALL UPDATE_NAM_SERIESN -CALL UPDATE_NAM_BLOWSNOWN -CALL UPDATE_NAM_PROFILERn -CALL UPDATE_NAM_STATIONn -CALL UPDATE_NAM_FIREn -!------------------------------------------------------------------------------- -WRITE(UNIT=ILUOUT,FMT='(/)') -!------------------------------------------------------------------------------- -! -!* 6. FORMATS -! ------- -! -9000 FORMAT(/,'NOTE IN READ_EXSEG FOR MODEL ', I2, ' : ',/, & - '--------------------------------') -9001 FORMAT(/,'CAUTION ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '----------------------------------------' ) -9002 FORMAT(/,'WARNING IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '----------------------------------' ) -9003 FORMAT(/,'FATAL ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '--------------------------------------' ) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE READ_EXSEG_n diff --git a/src/mesonh/ext/resolved_cloud.f90 b/src/mesonh/ext/resolved_cloud.f90 deleted file mode 100644 index 64d5eec3a..000000000 --- a/src/mesonh/ext/resolved_cloud.f90 +++ /dev/null @@ -1,1108 +0,0 @@ -!MNH_LIC Copyright 1994-2021 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_RESOLVED_CLOUD -! ########################## -INTERFACE - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & - HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& - PICEFR, & - PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & - ORAIN, OWARM, OHHONI, OCONVHG, & - PCF_MF,PRC_MF, PRI_MF, & - PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & - PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & - PSOLORG,PMI, & - PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PSEA,PTOWN ) -! -USE MODD_IO, ONLY: TFILEDATA -! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud -CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme - ! paramerization -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation -INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step - ! integrations for ice sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSTT ! Pressure time t+Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation - ! for ICE3 -LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the - ! activation through temp. - ! evolution in C2R2 and KHKO -LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the - ! cloud droplet sedimentation - ! for C2R2 or KHKO -LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the - ! cloud crystal sedimentation -LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the - ! raindrop formation -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes -LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing -LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction -! -END SUBROUTINE RESOLVED_CLOUD -END INTERFACE -END MODULE MODI_RESOLVED_CLOUD -! -! ########################################################################## - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & - HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& - PICEFR, & - PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & - ORAIN, OWARM, OHHONI, OCONVHG, & - PCF_MF,PRC_MF, PRI_MF, & - PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & - PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & - PSOLORG,PMI, & - PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PSEA,PTOWN ) -! ########################################################################## -! -!!**** * - compute the resolved clouds and precipitation -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the microphysical sources -!! related to the resolved clouds and precipitation -!! -!! -!!** METHOD -!! ------ -!! The main actions of this routine is to call the routines computing the -!! microphysical sources. Before that: -!! - it computes the real absolute pressure, -!! - negative values of the current guess of all mixing ratio are removed. -!! This is done by a global filling algorithm based on a multiplicative -!! method (Rood, 1987), in order to conserved the total mass in the -!! simulation domain. -!! - Sources are transformed in physical tendencies, by removing the -!! multiplicative term Rhod*J. -!! - External points values are filled owing to the use of cyclic -!! l.b.c., in order to performe computations on the full domain. -!! After calling to microphysical routines, the physical tendencies are -!! switched back to prognostic variables. -!! -!! -!! EXTERNAL -!! -------- -!! Subroutine SLOW_TERMS: Computes the explicit microphysical sources -!! Subroutine FAST_TERMS: Performs the saturation adjustment for l -!! Subroutine RAIN_ICE : Computes the explicit microphysical sources for i -!! Subroutine ICE_ADJUST: Performs the saturation adjustment for i+l -!! MIN_ll,SUM3D_ll : distributed functions equivalent to MIN and SUM -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : contains declarations of parameter variables -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! Module MODD_CST -!! CST%XP00 ! Reference pressure -!! CST%XRD ! Gaz constant for dry air -!! CST%XCPD ! Cpd (dry air) -!! -!! REFERENCE -!! --------- -!! -!! Book1 and book2 of documentation ( routine RESOLVED_CLOUD ) -!! -!! AUTHOR -!! ------ -!! E. Richard * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 21/12/94 -!! Modifications: June 8, 1995 ( J.Stein ) -!! Cleaning to improve efficienty and clarity -!! in agreement with the MESO-NH coding norm -!! March 1, 1996 ( J.Stein ) -!! store the cloud fraction -!! March 18, 1996 ( J.Stein ) -!! check that ZMASSPOS /= 0 -!! Oct. 12, 1996 ( J.Stein ) -!! remove the negative values correction -!! for the KES2 case -!! Modifications: Dec 14, 1995 (J.-P. Pinty) -!! Add the mixed-phase option -!! Modifications: Jul 01, 1996 (J.-P. Pinty) -!! Change arg. list in routine FAST_TERMS -!! Modifications: Jan 27, 1997 (J.-P. Pinty) -!! add W and SV in arg. list -!! Modifications: March 23, 98 (E.Richard) -!! correction of negative value based on -!! rv+rc+ri and thetal or thetail conservation -!! Modifications: April 08, 98 (J.-P. Lafore and V. Ducrocq ) -!! modify the correction of negative values -!! Modifications: June 08, 00 (J.-P. Pinty and J.-M. Cohard) -!! add the C2R2 scheme -!! Modifications: April 08, 01 (J.-P. Pinty) -!! add the C3R5 scheme -!! Modifications: July 21, 01 (J.-P. Pinty) -!! Add OHHONI and PW_ACT (for haze freezing) -!! Modifications: Sept 21, 01 (J.-P. Pinty) -!! Add XCONC_CCN limitation -!! Modifications: Nov 21, 02 (J.-P. Pinty) -!! Add ICE4 and C3R5 options -!! June, 2005 (V. Masson) -!! Technical change in interface for scalar arguments -!! Modifications : March, 2006 (O.Geoffroy) -!! Add KHKO scheme -!! Modifications : March 2013 (O.Thouron) -!! Add prognostic supersaturation -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Mazoyer : 04/2016 : Temperature radiative tendency used for -!! activation by cooling (OACTIT) -!! Modification 01/2016 (JP Pinty) Add LIMA -!! 10/2016 M.Mazoyer New KHKO output fields -!! 10/2016 (C.Lac) Add droplet deposition -!! S.Riette : 11/2016 : ice_adjust before and after rain_ice -!! ICE3/ICE4 modified, old version under LRED=F -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) -! C. Lac 02/2019: add rain fraction as an output field -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets -! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation -! P. Wautelet 11/06/2020: bugfix: correct ZSVS array indices -! P. Wautelet 11/06/2020: bugfix: add "Non local correction for precipitating species" for ICE4 -! P. Wautelet + Benoit Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets -! P. Wautelet 23/06/2020: remove ZSVS and ZSVT to improve code readability -! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct -! P. Wautelet 30/06/2020: remove non-local corrections -! B. Vie 06/2020: add prognostic supersaturation for LIMA -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_BUDGET, ONLY: TBUDGETS, TBUCONF -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_DUST, ONLY: LDUST -USE MODD_CST, ONLY: CST -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_DUST , ONLY: LDUST -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NEB, ONLY: NEB -USE MODD_NSV, ONLY: NSV, NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, & - NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, & - NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, NSV_AEREND,NSV_DSTEND,NSV_SLTEND -USE MODD_PARAM_C2R2, ONLY: LSUPSAT -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_ICE, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LRED, & - PARAM_ICE -USE MODD_PARAM_LIMA, ONLY: LADJ, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM, NMOM_I -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN, RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM -USE MODD_SALT, ONLY: LSALT -USE MODD_TURB_n, ONLY: TURBN, CSUBG_AUCV_RI, CCONDENS, CLAMBDA3, CSUBG_MF_PDF -! -USE MODE_ll -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -use mode_sources_neg_correct, only: Sources_neg_correct -! -USE MODI_C2R2_ADJUST -USE MODI_FAST_TERMS -USE MODI_GET_HALO -USE MODI_ICE_ADJUST -USE MODI_KHKO_NOTADJUST -USE MODI_LIMA -USE MODI_LIMA_ADJUST -USE MODI_LIMA_ADJUST_SPLIT -USE MODI_LIMA_COLD -USE MODI_LIMA_MIXED -USE MODI_LIMA_NOTADJUST -USE MODI_LIMA_WARM -USE MODI_RAIN_C2R2_KHKO -USE MODI_RAIN_ICE -USE MODI_RAIN_ICE_OLD -USE MODI_SHUMAN -USE MODI_SLOW_TERMS -USE MODI_AER2LIMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization -CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation -INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step - ! integrations for ice sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSTT ! Pressure time t+Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation - ! for ICE3 -LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the - ! activation through temp. - ! evolution in C2R2 and KHKO -LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the - ! cloud droplet sedimentation -LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the - ! cloud crystal sedimentation -LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the - ! raindrop formation -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes -LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing -LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JRR,JSV ! Loop index for the moist and scalar variables -INTEGER :: IIB ! Define the physical domain -INTEGER :: IIE ! -INTEGER :: IJB ! -INTEGER :: IJE ! -INTEGER :: IKB ! -INTEGER :: IKE ! -INTEGER :: IKU -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: JK,JI,JL -! -! -! -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDZZ -real, dimension(:,:,:), allocatable :: ZEXN -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZZ - ! model layer height -! REAL :: ZMASSTOT ! total mass for one water category -! ! including the negative values -! REAL :: ZMASSPOS ! total mass for one water category -! ! after removing the negative values -! REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR -! -INTEGER :: ISVBEG ! first scalar index for microphysics -INTEGER :: ISVEND ! last scalar index for microphysics -!UPG*PT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysics only -!UPG*PT - -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR -! -INTEGER :: JMOD, JMOD_IFN -LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH -LOGICAL :: LMFCONV ! =SIZE(PMFCONV)!=0 -! BVIE work array waiting for PINPRI -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDUM -ZSIGQSAT2D(:,:) = PSIGQSAT -! -!------------------------------------------------------------------------------ -! -!* 1. PRELIMINARY COMPUTATIONS -! ------------------------ -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PZZ,3) - JPVEXT -IKU=SIZE(PZZ,3) -! -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) -! -GWEST = LWEST_ll() -GEAST = LEAST_ll() -GSOUTH = LSOUTH_ll() -GNORTH = LNORTH_ll() -! -LMFCONV=(SIZE(PMFCONV)/=0) -! -IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN - ISVBEG = NSV_C2R2BEG - ISVEND = NSV_C2R2END -ELSE IF (HCLOUD == 'C3R5') THEN - ISVBEG = NSV_C2R2BEG - ISVEND = NSV_C1R3END -ELSE IF (HCLOUD == 'LIMA') THEN - ISVBEG = NSV_LIMA_BEG - IF (.NOT. LDUST .AND. .NOT. LSALT .AND. .NOT. LORILAM) THEN - ISVEND = NSV_LIMA_END - ELSE - IF (LORILAM) THEN - ISVEND = NSV_AEREND - END IF - IF (LDUST) THEN - ISVEND = NSV_DSTEND - END IF - IF (LSALT) THEN - ISVEND = NSV_SLTEND - END IF - END IF -ELSE - ISVBEG = 0 - ISVEND = 0 -END IF -! -! -! -!* 1. From ORILAM to LIMA: -! -IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN -! ORILAM : tendance s --> variable instant t -ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV)) - DO JSV = 1, NSV - ZSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP / PRHODJ(:,:,:) - END DO - -CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,1),& - PPABST(IIB:IIE,IJB:IJE,IKB:IKE),& - PTHT(IIB:IIE,IJB:IJE,IKB:IKE), & - PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) - -! LIMA : variable instant t --> tendance s - PSVS(:,:,:,NSV_LIMA_CCN_FREE) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_CCN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+1) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_CCN_FREE+2) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+2) * & - PRHODJ(:,:,:) / PTSTEP - - PSVS(:,:,:,NSV_LIMA_IFN_FREE) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_IFN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE+1) * & - PRHODJ(:,:,:) / PTSTEP - -DEALLOCATE(ZSVT) -END IF - -!UPG*PT -! -! -!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES -! --------------------------------------- -! -PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) -END DO -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN - DO JSV = ISVBEG, ISVEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:) - ENDDO -ENDIF -! -! complete the lateral boundaries to avoid possible problems -! -DO JI=1,JPHEXT - PTHS(JI,:,:) = PTHS(IIB,:,:) - PTHS(IIE+JI,:,:) = PTHS(IIE,:,:) - PTHS(:,JI,:) = PTHS(:,IJB,:) - PTHS(:,IJE+JI,:) = PTHS(:,IJE,:) -! - PRS(JI,:,:,:) = PRS(IIB,:,:,:) - PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:) - PRS(:,JI,:,:) = PRS(:,IJB,:,:) - PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:) -END DO -! -! complete the physical boundaries to avoid some computations -! -IF(GWEST .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 -IF(GEAST .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 -IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 -IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN -DO JI=1,JPHEXT - PSVS(JI, :, :, ISVBEG:ISVEND) = PSVS(IIB, :, :, ISVBEG:ISVEND) - PSVS(IIE+JI, :, :, ISVBEG:ISVEND) = PSVS(IIE, :, :, ISVBEG:ISVEND) - PSVS(:, JI, :, ISVBEG:ISVEND) = PSVS(:, IJB, :, ISVBEG:ISVEND) - PSVS(:, IJE+JI, :, ISVBEG:ISVEND) = PSVS(:, IJE, :, ISVBEG:ISVEND) -END DO - ! -! complete the physical boundaries to avoid some computations -! - IF(GWEST .AND. HLBCX(1) /= 'CYCL') PSVT(:IIB-1, :, :, ISVBEG:ISVEND) = 0.0 - IF(GEAST .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1:, :, :, ISVBEG:ISVEND) = 0.0 - IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:, :IJB-1, :, ISVBEG:ISVEND) = 0.0 - IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:, IJE+1:, :, ISVBEG:ISVEND) = 0.0 -ENDIF -! -! complete the vertical boundaries -! -PTHS(:,:,IKB-1) = PTHS(:,:,IKB) -PTHS(:,:,IKE+1) = PTHS(:,:,IKE) -! -PRS(:,:,IKB-1,:) = PRS(:,:,IKB,:) -PRS(:,:,IKE+1,:) = PRS(:,:,IKE,:) -! -PRT(:,:,IKB-1,:) = PRT(:,:,IKB,:) -PRT(:,:,IKE+1,:) = PRT(:,:,IKE,:) -! -IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' & - .OR. HCLOUD == 'LIMA') THEN - PSVS(:,:,IKB-1,ISVBEG:ISVEND) = PSVS(:,:,IKB,ISVBEG:ISVEND) - PSVS(:,:,IKE+1,ISVBEG:ISVEND) = PSVS(:,:,IKE,ISVBEG:ISVEND) - PSVT(:,:,IKB-1,ISVBEG:ISVEND) = PSVT(:,:,IKB,ISVBEG:ISVEND) - PSVT(:,:,IKE+1,ISVBEG:ISVEND) = PSVT(:,:,IKE,ISVBEG:ISVEND) -ENDIF -! -! -!* 3. REMOVE NEGATIVE VALUES -! ---------------------- -! -!* 3.1 Non local correction for precipitating species (Rood 87) -! -! IF ( HCLOUD == 'KESS' & -! .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4' & -! .OR. HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' & -! .OR. HCLOUD == 'KHKO' .OR. HCLOUD == 'LIMA' ) THEN -! ! -! DO JRR = 3,KRR -! SELECT CASE (JRR) -! CASE(3,5,6,7) ! rain, snow, graupel and hail -! -! IF ( MIN_ll( PRS(:,:,:,JRR), IINFO_ll) < 0.0 ) THEN -! ! -! ! compute the total water mass computation -! ! -! ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! remove the negative values -! ! -! PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) -! ! -! ! compute the new total mass -! ! -! ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! correct again in such a way to conserve the total mass -! ! -! ZRATIO = ZMASSTOT / ZMASSPOS -! PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO -! ! -! END IF -! END SELECT -! END DO -! END IF -! -!* 3.2 Adjustement for liquid and solid cloud -! -! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) -! -!* 3.4 Limitations of Na and Nc to the CCN max number concentration -! -! Commented by O.Thouron 03/2013 -!IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') & -! .AND.(XCONC_CCN > 0)) THEN -! IF ((HACTCCN /= 'ABRK')) THEN -! ZSVT(:,:,:,1) = MIN( ZSVT(:,:,:,1),XCONC_CCN ) -! ZSVT(:,:,:,2) = MIN( ZSVT(:,:,:,2),XCONC_CCN ) -! ZSVS(:,:,:,1) = MIN( ZSVS(:,:,:,1),XCONC_CCN ) -! ZSVS(:,:,:,2) = MIN( ZSVS(:,:,:,2),XCONC_CCN ) -! END IF -!END IF -! -! -!------------------------------------------------------------------------------- -! -SELECT CASE ( HCLOUD ) - CASE ('REVE') -! -!* 4. REVERSIBLE MICROPHYSICAL SCHEME -! ------------------------------- -! - CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & - HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PCF_MF,PRC_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) -! - CASE ('KESS') -! -!* 5. KESSLER MICROPHYSICAL SCHEME -! ---------------------------- -! -! -!* 5.1 Compute the explicit microphysical sources -! - CALL SLOW_TERMS ( KSPLITR, PTSTEP, KMI, HSUBG_AUCV, & - PZZ, PRHODJ, PRHODREF, PCLDFR, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), PPABST, & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PINPRR, PINPRR3D, PEVAP3D ) -! -!* 5.2 Perform the saturation adjustment -! - CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & - HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PCF_MF,PRC_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), PRRS=PRS(:,:,:,3), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) -! -! - CASE ('C2R2','KHKO') -! -!* 7. 2-MOMENT WARM MICROPHYSICAL SCHEME C2R2 or KHKO -! --------------------------------------- -! -! -!* 7.1 Compute the explicit microphysical sources -! -! - CALL RAIN_C2R2_KHKO ( HCLOUD, OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD,PTHS, PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & - PSVT(:,:,:,NSV_C2R2BEG), PSVT(:,:,:,NSV_C2R2BEG+1), & - PSVT(:,:,:,NSV_C2R2BEG+2), PSVS(:,:,:,NSV_C2R2BEG), & - PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG+2), & - PINPRC, PINPRR, PINPRR3D, PEVAP3D , & - PSVT(:,:,:,:), PSOLORG, PMI, HACTCCN, & - PINDEP, PSUPSAT, PNACT ) -! -! -!* 7.2 Perform the saturation adjustment -! - IF (LSUPSAT) THEN - CALL KHKO_NOTADJUST (KRR, KTCOUNT,TPFILE, HRAD, & - PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PZZ, & - PTHT,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3), & - PTHS,PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & - PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG), & - PSVS(:,:,:,NSV_C2R2BEG+3), PCLDFR, PSRCS, PNPRO, PSSPRO ) -! - ELSE - CALL C2R2_ADJUST ( KRR,TPFILE, HRAD, & - HTURBDIM, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PTHS=PTHS, PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PCNUCS=PSVS(:,:,:,NSV_C2R2BEG), & - PCCS=PSVS(:,:,:,NSV_C2R2BEG+1), & - PSRCS=PSRCS, PCLDFR=PCLDFR, PRRS=PRS(:,:,:,3) ) -! - END IF -! - CASE ('ICE3') -! -!* 9. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES) -! ----------------------------------------------------- -! - allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) - ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD) -! -!* 9.1 Compute the explicit microphysical sources -! -! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'ADJU', .FALSE., .FALSE., & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - ENDIF - IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA,PTOWN, PFPR=ZFPR ) - ELSE - CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & - KSPLITR, PTSTEP, KRR, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & - PSEA, PTOWN, PFPR=ZFPR) - END IF - -! -!* 9.2 Perform the saturation adjustment over cloud ice and cloud water -! -! - IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'DEPI', .FALSE., .FALSE., & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - END IF - - deallocate( zexn ) -! - CASE ('ICE4') -! -!* 10. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES) -! ----------------------------------------------------- -! - allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) - ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD) -! -!* 10.1 Compute the explicit microphysical sources -! -! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'ADJU', .FALSE., .FALSE., & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PRH=PRS(:,:,:,7)*PTSTEP, & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - ENDIF - IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) - ELSE - CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & - KSPLITR, PTSTEP, KRR, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR) - END IF - - -! -!* 10.2 Perform the saturation adjustment over cloud ice and cloud water -! - IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'DEPI', .FALSE., .FALSE., & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PRH=PRS(:,:,:,7)*PTSTEP, & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - END IF - - deallocate( zexn ) -! -! -!* 12. 2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA -! -------------------------------------------------------------- -! -! -!* 12.1 Compute the explicit microphysical sources -! - CASE ('LIMA') - ! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF (LPTSPLIT) THEN - CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - PTSTEP, & - PRHODREF, PEXNREF, ZDZZ, & - PRHODJ, PPABST, & - NMOD_CCN, NMOD_IFN, NMOD_IMM, & - PDTHRAD, PTHT, PRT, & - PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR ) - ELSE - - IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PW_ACT, PPABST, & - PDTHRAD, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) -! - IF (NMOM_I.GE.1) CALL LIMA_COLD(CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRS, PINPRG, PINPRH ) -! - IF (OWARM .AND. NMOM_I.GE.1) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) - ENDIF -! -!* 12.2 Perform the saturation adjustment -! - IF (LSPRO) THEN - CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD, & - PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, & - PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PCLDFR, PICEFR, PRAINFR, PSRCS ) - ELSE IF (LPTSPLIT) THEN - CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - KRR, KMI, CCONDENS, CLAMBDA3, & - OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & - PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,& - PDTHRAD, PW_ACT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF ) - ELSE - CALL LIMA_ADJUST(KRR, KMI, TPFILE, & - OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) - ENDIF -! -END SELECT -! -IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN -! TODO: code a generic routine to update vertical lower and upper levels to 0, a -! specific value or to IKB or IKE and apply it to every output prognostic variable of physics - PCIT(:,:,1) = 0. - PCIT(:,:,IKE+1) = 0. - - PINPRC3D=ZFPR(:,:,:,2) / CST%XRHOLW - PINPRR3D=ZFPR(:,:,:,3) / CST%XRHOLW - PINPRS3D=ZFPR(:,:,:,5) / CST%XRHOLW - PINPRG3D=ZFPR(:,:,:,6) / CST%XRHOLW - IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / CST%XRHOLW - WHERE (PRT(:,:,:,2) > 1.E-04 ) - PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,3) > 1.E-04 ) - PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,5) > 1.E-04 ) - PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,6) > 1.E-04 ) - PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:)) - ENDWHERE - IF(KRR==7) THEN - WHERE (PRT(:,:,:,7) > 1.E-04 ) - PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:)) - ENDWHERE - ENDIF -ENDIF - -! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) - -!------------------------------------------------------------------------------- -! -! -!* 13. SWITCH BACK TO THE PROGNOSTIC VARIABLES -! --------------------------------------- -! -PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) -! -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) -END DO -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN - DO JSV = ISVBEG, ISVEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) - ENDDO -ENDIF - -!------------------------------------------------------------------------------- -! -END SUBROUTINE RESOLVED_CLOUD -- GitLab