From 3bf8ed0b6db945f29aa4c183c111efb2a4a271ef Mon Sep 17 00:00:00 2001 From: Gaelle TANGUY <gaelle.tanguy@meteo.fr> Date: Fri, 4 Nov 2016 09:47:36 +0100 Subject: [PATCH] LIMA --- src/MNH/ini_lima.f90 | 154 +++ src/MNH/ini_lima_cold_mixed.f90 | 1312 +++++++++++++++++++++ src/MNH/ini_lima_warm.f90 | 437 +++++++ src/MNH/init_aerosol_concentration.f90 | 152 +++ src/MNH/init_aerosol_properties.f90 | 341 ++++++ src/MNH/lima_adjust.f90 | 1216 ++++++++++++++++++++ src/MNH/lima_cold.f90 | 414 +++++++ src/MNH/lima_cold_hom_nucl.f90 | 684 +++++++++++ src/MNH/lima_cold_sedimentation.f90 | 378 +++++++ src/MNH/lima_cold_slow_processes.f90 | 568 ++++++++++ src/MNH/lima_functions.f90 | 326 ++++++ src/MNH/lima_meyers.f90 | 485 ++++++++ src/MNH/lima_mixed.f90 | 809 +++++++++++++ src/MNH/lima_mixed_fast_processes.f90 | 1321 ++++++++++++++++++++++ src/MNH/lima_mixed_slow_processes.f90 | 277 +++++ src/MNH/lima_phillips.f90 | 670 +++++++++++ src/MNH/lima_phillips_integ.f90 | 143 +++ src/MNH/lima_phillips_ref_spectrum.f90 | 136 +++ src/MNH/lima_precip_scavenging.f90 | 831 ++++++++++++++ src/MNH/lima_warm.f90 | 440 +++++++ src/MNH/lima_warm_coal.f90 | 495 ++++++++ src/MNH/lima_warm_evap.f90 | 352 ++++++ src/MNH/lima_warm_nucl.f90 | 818 ++++++++++++++ src/MNH/lima_warm_sedim.f90 | 397 +++++++ src/MNH/modd_lima_precip_scavengingn.f90 | 59 + src/MNH/modd_param_lima.f90 | 185 +++ src/MNH/modd_param_lima_cold.f90 | 122 ++ src/MNH/modd_param_lima_mixed.f90 | 169 +++ src/MNH/modd_param_lima_warm.f90 | 119 ++ src/MNH/modn_param_lima.f90 | 29 + src/MNH/set_conc_lima.f90 | 182 +++ 31 files changed, 14021 insertions(+) create mode 100644 src/MNH/ini_lima.f90 create mode 100644 src/MNH/ini_lima_cold_mixed.f90 create mode 100644 src/MNH/ini_lima_warm.f90 create mode 100644 src/MNH/init_aerosol_concentration.f90 create mode 100644 src/MNH/init_aerosol_properties.f90 create mode 100644 src/MNH/lima_adjust.f90 create mode 100644 src/MNH/lima_cold.f90 create mode 100644 src/MNH/lima_cold_hom_nucl.f90 create mode 100644 src/MNH/lima_cold_sedimentation.f90 create mode 100644 src/MNH/lima_cold_slow_processes.f90 create mode 100644 src/MNH/lima_functions.f90 create mode 100644 src/MNH/lima_meyers.f90 create mode 100644 src/MNH/lima_mixed.f90 create mode 100644 src/MNH/lima_mixed_fast_processes.f90 create mode 100644 src/MNH/lima_mixed_slow_processes.f90 create mode 100644 src/MNH/lima_phillips.f90 create mode 100644 src/MNH/lima_phillips_integ.f90 create mode 100644 src/MNH/lima_phillips_ref_spectrum.f90 create mode 100644 src/MNH/lima_precip_scavenging.f90 create mode 100644 src/MNH/lima_warm.f90 create mode 100644 src/MNH/lima_warm_coal.f90 create mode 100644 src/MNH/lima_warm_evap.f90 create mode 100644 src/MNH/lima_warm_nucl.f90 create mode 100644 src/MNH/lima_warm_sedim.f90 create mode 100644 src/MNH/modd_lima_precip_scavengingn.f90 create mode 100644 src/MNH/modd_param_lima.f90 create mode 100644 src/MNH/modd_param_lima_cold.f90 create mode 100644 src/MNH/modd_param_lima_mixed.f90 create mode 100644 src/MNH/modd_param_lima_warm.f90 create mode 100644 src/MNH/modn_param_lima.f90 create mode 100644 src/MNH/set_conc_lima.f90 diff --git a/src/MNH/ini_lima.f90 b/src/MNH/ini_lima.f90 new file mode 100644 index 000000000..ba15ca10c --- /dev/null +++ b/src/MNH/ini_lima.f90 @@ -0,0 +1,154 @@ +! #################### + MODULE MODI_INI_LIMA +! #################### +! +INTERFACE + SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG) +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for graupel + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA +! +END INTERFACE +! +END MODULE MODI_INI_LIMA +! ###################################################### + SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG) +! ###################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_REF +USE MODD_PARAM_LIMA +USE MODD_PARAMETERS +USE MODD_LUNIT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for graupel or hail + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +REAL :: ZT ! Work variable +REAL :: ZVTRMAX +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +! +!------------------------------------------------------------------------------- +! +! +!* 1. INIT OUTPUT LISTING, COMPUTE KSPLITR AND KSPLITG +! ------------------------------------------------ +! +! +! Init output listing +CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) +! +! +! KSPLITR +ZVTRMAX = 30. ! Maximum rain drop fall speed +! +KSPLITR = 1 +SPLITR : DO + ZT = PTSTEP / FLOAT(KSPLITR) + IF ( ZT * ZVTRMAX / PDZMIN < 1.0) EXIT SPLITR + KSPLITR = KSPLITR + 1 +END DO SPLITR +! +! +! KSPLITG +ZVTRMAX = 30. +IF( LHAIL ) THEN + ZVTRMAX = 60. ! Hail case +END IF +! +KSPLITG = 1 +SPLITG : DO + ZT = 2.* PTSTEP / FLOAT(KSPLITG) + IF ( ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLITG + KSPLITG = KSPLITG + 1 +END DO SPLITG +! +! +! +IF (ALLOCATED(XRTMIN)) RETURN ! In case of nesting microphysics, constants of + ! MODD_RAIN_C2R2_PARAM are computed only once. +! +! +! Set bounds for mixing ratios and concentrations +ALLOCATE( XRTMIN(7) ) +XRTMIN(1) = 1.0E-20 ! rv +XRTMIN(2) = 1.0E-20 ! rc +!XRTMIN(3) = 1.0E-20 ! rr +XRTMIN(3) = 1.0E-17 ! rr +XRTMIN(4) = 1.0E-20 ! ri +XRTMIN(5) = 1.0E-15 ! rs +XRTMIN(6) = 1.0E-15 ! rg +XRTMIN(7) = 1.0E-15 ! rh +ALLOCATE( XCTMIN(7) ) +XCTMIN(1) = 1.0 ! Not used +XCTMIN(2) = 1.0E+4 ! Nc +!XCTMIN(3) = 1.0E+1 ! Nr +XCTMIN(3) = 1.0E-3 ! Nr +XCTMIN(4) = 1.0E-3 ! Ni +XCTMIN(5) = 1.0E-3 ! Not used +XCTMIN(6) = 1.0E-3 ! Not used +XCTMIN(7) = 1.0E-3 ! Not used +! +! +! Air density fall speed correction +XCEXVT = 0.4 +! +!------------------------------------------------------------------------------ +! +! +! +!* 2. DEFINE SPECIES CHARACTERISTICS AND PROCESSES CONSTANTS +! ------------------------------------------------------ +! +! +CALL INI_LIMA_WARM(PTSTEP, PDZMIN) +! +CALL INI_LIMA_COLD_MIXED(PTSTEP, PDZMIN) +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA diff --git a/src/MNH/ini_lima_cold_mixed.f90 b/src/MNH/ini_lima_cold_mixed.f90 new file mode 100644 index 000000000..a2c98df44 --- /dev/null +++ b/src/MNH/ini_lima_cold_mixed.f90 @@ -0,0 +1,1312 @@ +! ############################### + MODULE MODI_INI_LIMA_COLD_MIXED +! ############################### +! +INTERFACE + SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN) +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA_COLD_MIXED +! +END INTERFACE +! +END MODULE MODI_INI_LIMA_COLD_MIXED +! ############################################### + SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN) +! ############################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA for the cold and mixed phase variables +!! and processes. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODE_FM +USE MODD_CST +USE MODD_REF +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +USE MODD_PARAMETERS +USE MODD_LUNIT +! +USE MODI_LIMA_FUNCTIONS +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODI_RRCOLSS +USE MODI_RZCOLX +USE MODI_RSCOLRG +USE MODI_READ_XKER_RACCS +USE MODI_READ_XKER_SDRYG +USE MODI_READ_XKER_RDRYG +USE MODI_READ_XKER_SWETH +USE MODI_READ_XKER_GWETH +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first physical + ! points along z +INTEGER :: J1,J2 ! Internal loop indexes +! +REAL, DIMENSION(8) :: ZGAMI ! parameters involving various moments +REAL, DIMENSION(2) :: ZGAMS ! of the generalized gamma law +! +REAL :: ZT ! Work variable +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +REAL :: ZEGS, ZEGR, ZEHS, ZEHG! Bulk collection efficiencies +! +INTEGER :: IND ! Number of interval to integrate the kernels +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +REAL :: ZCONC_MAX ! Maximal concentration for snow +REAL :: ZFACT_NUCL! Amplification factor for the minimal ice concentration +! +INTEGER :: KND +INTEGER :: KACCLBDAS,KACCLBDAR,KDRYLBDAG,KDRYLBDAS,KDRYLBDAR +REAL :: PALPHAR,PALPHAS,PALPHAG,PALPHAH +REAL :: PNUR,PNUS,PNUG,PNUH +REAL :: PBR,PBS,PBG,PBH +REAL :: PCR,PCS,PCG,PCH +REAL :: PDR,PDS,PDG,PDH +REAL :: PESR,PEGS,PEGR,PEHS,PEHG +REAL :: PFDINFTY +REAL :: PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN +REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN +REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN +REAL :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN +REAL :: PWETLBDAH_MAX,PWETLBDAH_MIN +INTEGER :: KWETLBDAS,KWETLBDAG,KWETLBDAH +! +REAL :: ZFAC_ZRNIC ! Zrnic factor used to decrease Long Kernels +! +!------------------------------------------------------------------------------- +! +! +! Initialize output listing +CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) +! +! +!* 1. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 1.2 Ice crystal characteristics +! +SELECT CASE (CPRISTINE_ICE_LIMA) + CASE('PLAT') + XAI = 0.82 ! Plates + XBI = 2.5 ! Plates + XC_I = 800. ! Plates + XDI = 1.0 ! Plates + XC1I = 1./XPI ! Plates + CASE('COLU') + XAI = 2.14E-3 ! Columns + XBI = 1.7 ! Columns + XC_I = 2.1E5 ! Columns + XDI = 1.585 ! Columns + XC1I = 0.8 ! Columns + CASE('BURO') + XAI = 44.0 ! Bullet rosettes + XBI = 3.0 ! Bullet rosettes + XC_I = 4.3E5 ! Bullet rosettes + XDI = 1.663 ! Bullet rosettes + XC1I = 0.5 ! Bullet rosettes +END SELECT +! +! Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly +! +XF0I = 1.00 +! Correction BVIE XF2I from Pruppacher 1997 eq 13-88 +!XF2I = 0.103 +XF2I = 0.14 +XF0IS = 0.86 +XF1IS = 0.28 +! +!* 1.3 Snowflakes/aggregates characteristics +! +XAS = 0.02 +XBS = 1.9 +XCS = 5.1 +XDS = 0.27 +! +XCCS = 5.0 +XCXS = 1.0 +! +XF0S = 0.86 +XF1S = 0.28 +! +XC1S = 1./XPI +! +!* 1.4 Graupel characteristics +! +XAG = 19.6 ! Lump graupel case +XBG = 2.8 ! Lump graupel case +XCG = 124. ! Lump graupel case +XDG = 0.66 ! Lump graupel case +! +XCCG = 5.E5 +XCXG = -0.5 +! XCCG = 4.E4 ! Test of Ziegler (1988) +! XCXG = -1.0 ! Test of Ziegler (1988) +! +XF0G = 0.86 +XF1G = 0.28 +! +XC1G = 1./2. +! +!* 2.5 Hailstone characteristics +! +! +XAH = 470. +XBH = 3.0 +XCH = 207. +XDH = 0.64 +! +!XCCH = 5.E-4 +!XCXH = 2.0 +!!!!!!!!!!!! + XCCH = 4.E4 ! Test of Ziegler (1988) + XCXH = -1.0 ! Test of Ziegler (1988) +!!! XCCH = 5.E5 ! Graupel_like +!!! XCXH = -0.5 ! Graupel_like +!!!!!!!!!!!! +! +XF0H = 0.86 +XF1H = 0.28 +! +XC1H = 1./2. +! +!------------------------------------------------------------------------------- +! +! +!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +!* 2.1 Ice, snow, graupel and hail distribution +! +! +XALPHAI = 3.0 ! Gamma law for the ice crystal volume +XNUI = 3.0 ! Gamma law with little dispersion +! +XALPHAS = 1.0 ! Exponential law +XNUS = 1.0 ! Exponential law +! +XALPHAG = 1.0 ! Exponential law +XNUG = 1.0 ! Exponential law +! +XALPHAH = 1.0 ! Gamma law +XNUH = 8.0 ! Gamma law with little dispersion +! +!* 2.2 Constants for shape parameter +! +XLBEXI = 1.0/XBI +XLBI = XAI*MOMG(XALPHAI,XNUI,XBI) +! +XLBEXS = 1.0/(XCXS-XBS) +XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +! +XLBEXG = 1.0/(XCXG-XBG) +XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) +! +XLBEXH = 1.0/(XCXH-XBH) +XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Shape Parameters")') + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXI =",E13.6," XLBI =",E13.6)') XLBEXI,XLBI + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXS =",E13.6," XLBS =",E13.6)') XLBEXS,XLBS + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXG =",E13.6," XLBG =",E13.6)') XLBEXG,XLBG + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXH =",E13.6," XLBH =",E13.6)') XLBEXH,XLBH +END IF +! +XLBDAS_MAX = 100000.0 +XLBDAG_MAX = 100000.0 +! +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +! +!------------------------------------------------------------------------------- +! +! +!* 3. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 3.1 Exponent of the fall-speed air density correction +! +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +! +!* 3.2 Constants for sedimentation +! +!! XEXRSEDI = (XBI+XDI)/XBI +!! XEXCSEDI = 1.0-XEXRSEDI +!! XFSEDI = (4.*XPI*900.)**(-XEXCSEDI) * & +!! XC_I*XAI*MOMG(XALPHAI,XNUI,XBI+XDI) * & +!! ((XAI*MOMG(XALPHAI,XNUI,XBI)))**(-XEXRSEDI) * & +!! (ZRHO00)**XCEXVT +!! ! +!! ! Computations made for Columns +!! ! +!! XEXRSEDI = 1.9324 +!! XEXCSEDI =-0.9324 +!! XFSEDI = 3.89745E11*MOMG(XALPHAI,XNUI,3.285)* & +!! MOMG(XALPHAI,XNUI,1.7)**(-XEXRSEDI)*(ZRHO00)**XCEXVT +!! XEXCSEDI =-0.9324*3.0 +!! WRITE (ILUOUT0,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI=',XFSEDI +! +! +XFSEDRI = XC_I*GAMMA_X0D(XNUI+(XDI+XBI)/XALPHAI)/GAMMA_X0D(XNUI+XBI/XALPHAI)* & + (ZRHO00)**XCEXVT +XFSEDCI = XC_I*GAMMA_X0D(XNUI+XDI/XALPHAI)/GAMMA_X0D(XNUI)* & + (ZRHO00)**XCEXVT +! +XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) +XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +! +XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) +XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & + (XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG)*(ZRHO00)**XCEXVT +! +XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) +XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & + (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT +! +!------------------------------------------------------------------------------- +! +! +!* 4. CONSTANTS FOR HETEROGENEOUS NUCLEATION +! -------------------------------------- +! +! +! *************** +!* 4.1 LIMA_NUCLEATION +! *************** +!* 4.1.1 Constants for the computation of the number concentration +! of active IN +! +XRHO_CFDC = 0.76 +! +XGAMMA = 2. +! +IF (NPHILLIPS == 13) THEN + XAREA1(1) = 2.0E-6 !DM1 + XAREA1(2) = XAREA1(1) !DM2 + XAREA1(3) = 1.0E-7 !BC + XAREA1(4) = 8.9E-7 !BIO +ELSE IF (NPHILLIPS == 8) THEN + XAREA1(1) = 2.0E-6 !DM1 + XAREA1(2) = XAREA1(1) !DM2 + XAREA1(3) = 2.7E-7 !BC + XAREA1(4) = 9.1E-7 !BIO +ELSE + print *, "NPHILLIPS n'est pas égal à 8 ou 13" + STOP +END IF +! +!* 4.1.2 Constants for the computation of H_X (the fraction-redu- +! cing IN activity at low S_i and warm T) for X={DM1,DM2,BC,BIO} +! +! +IF (NPHILLIPS == 13) THEN + XDT0(1) = 5. +273.15 !DM1 + XDT0(2) = 5. +273.15 !DM2 + XDT0(3) = 10. +273.15 !BC + XDT0(4) = 5. +273.15 !BIOO +! + XT0(1) = -40. +273.15 !DM1 + XT0(2) = XT0(1) !DM2 + XT0(3) = -50. +273.15 !BC + XT0(4) = -20. +273.15 !BIO +! + XSW0 = 0.97 +! + XDSI0(1) = 0.1 !DM1 + XDSI0(2) = 0.1 !DM2 + XDSI0(3) = 0.1 !BC + XDSI0(4) = 0.2 !BIO +! + XH(1) = 0.15 !DM1 + XH(2) = 0.15 !DM2 + XH(3) = 0. !BC + XH(4) = 0. !O +! + XTX1(1) = -30. +273.15 !DM1 + XTX1(2) = XTX1(1) !DM2 + XTX1(3) = -25. +273.15 !BC + XTX1(4) = -5. +273.15 !BIO +! + XTX2(1) = -10. +273.15 !DM1 + XTX2(2) = XTX2(1) !DM2 + XTX2(3) = -15. +273.15 !BC + XTX2(4) = -2. +273.15 !BIO +ELSE IF (NPHILLIPS == 8) THEN + XDT0(1) = 5. +273.15 !DM1 + XDT0(2) = 5. +273.15 !DM2 + XDT0(3) = 5. +273.15 !BC + XDT0(4) = 5. +273.15 !O +! + XT0(1) = -40. +273.15 !DM1 + XT0(2) = XT0(1) !DM2 + XT0(3) = -50. +273.15 !BC + XT0(4) = -50. +273.15 !BIO +! + XSW0 = 0.97 +! + XDSI0(1) = 0.1 !DM1 + XDSI0(2) = 0.1 !DM2 + XDSI0(3) = 0.1 !BC + XDSI0(4) = 0.1 !BIO +! + XH(1) = 0.15 !DM1 + XH(2) = 0.15 !DM2 + XH(3) = 0. !BC + XH(4) = 0. !O +! + XTX1(1) = -5. +273.15 !DM1 + XTX1(2) = XTX1(1) !DM2 + XTX1(3) = -5. +273.15 !BC + XTX1(4) = -5. +273.15 !BIO +! + XTX2(1) = -2. +273.15 !DM1 + XTX2(2) = XTX2(1) !DM2 + XTX2(3) = -2. +273.15 !BC + XTX2(4) = -2. +273.15 !BIO +END IF +! +!* 4.1.3 Constants for the computation of the Gauss Hermitte +! quadrature method used for the integration of the total +! crystal number over T>-35°C +! +NDIAM = 70 +! +ALLOCATE(XABSCISS(NDIAM)) +ALLOCATE(XWEIGHT (NDIAM)) +! +CALL GAUHER(XABSCISS, XWEIGHT, NDIAM) +! +! ***************** +!* 4.2 MEYERS NUCLEATION +! ***************** +! +ZFACT_NUCL = 1.0 ! Plates, Columns and Bullet rosettes +! +!* 5.2.1 Constants for nucleation from ice nuclei +! +XNUC_DEP = XFACTNUC_DEP*1000.*ZFACT_NUCL +XEXSI_DEP = 12.96E-2 +XEX_DEP = -0.639 +! +XNUC_CON = XFACTNUC_CON*1000.*ZFACT_NUCL +XEXTT_CON = -0.262 +XEX_CON = -2.8 +! +XMNU0 = 6.88E-13 +! +IF (LMEYERS) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Heterogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_DEP=",E13.6," XEXSI=",E13.6," XEX=",E13.6)') & + XNUC_DEP,XEXSI_DEP,XEX_DEP + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_CON=",E13.6," XEXTT=",E13.6," XEX=",E13.6)') & + XNUC_CON,XEXTT_CON,XEX_CON + WRITE(UNIT=ILUOUT0,FMT='(" mass of embryo XMNU0=",E13.6)') XMNU0 +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 5. CONSTANTS FOR THE SLOW COLD PROCESSES +! ------------------------------------- +! +! +!* 5.1.2 Constants for homogeneous nucleation from haze particules +! +XRHOI_HONH = 925.0 +XCEXP_DIFVAP_HONH = 1.94 +XCOEF_DIFVAP_HONH = (2.0*XPI)*0.211E-4*XP00/XTT**XCEXP_DIFVAP_HONH +XCRITSAT1_HONH = 2.583 +XCRITSAT2_HONH = 207.83 +XTMIN_HONH = 180.0 +XTMAX_HONH = 240.0 +XDLNJODT1_HONH = 4.37 +XDLNJODT2_HONH = 0.03 +XC1_HONH = 100.0 +XC2_HONH = 22.6 +XC3_HONH = 0.1 +XRCOEF_HONH = (XPI/6.0)*XRHOI_HONH +! +! +!* 5.1.3 Constants for homogeneous nucleation from cloud droplets +! +XTEXP1_HONC = -606.3952*LOG(10.0) +XTEXP2_HONC = -52.6611*LOG(10.0) +XTEXP3_HONC = -1.7439*LOG(10.0) +XTEXP4_HONC = -0.0265*LOG(10.0) +XTEXP5_HONC = -1.536E-4*LOG(10.0) +IF (XALPHAC == 3.0) THEN + XC_HONC = XPI/6.0 + XR_HONC = XPI/6.0 +ELSE + WRITE(UNIT=ILUOUT0,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XALPHAC=",E13.6," IS NOT 3.0")') XALPHAC + WRITE(UNIT=ILUOUT0,FMT='(" No algorithm yet developped in this case !")') + STOP +END IF +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP1_HONC=",E13.6)') XTEXP1_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP2_HONC=",E13.6)') XTEXP2_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP3_HONC=",E13.6)') XTEXP3_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP4_HONC=",E13.6)') XTEXP4_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP5_HONC=",E13.6)') XTEXP5_HONC + WRITE(UNIT=ILUOUT0,FMT='("XC_HONC=",E13.6," XR_HONC=",E13.6)') XC_HONC,XR_HONC +END IF +! +! +!* 5.2 Constants for vapor deposition on ice +! +XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 +! +X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) +X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) +! +! Harrington parameterization for ice to snow conversion +! +XDICNVS_LIM = 125.E-6 ! size in microns +XLBDAICNVS_LIM = (50.0**(1.0/(XALPHAI)))/XDICNVS_LIM ! ZLBDAI Limitation +XC0DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF0IS* & + (XALPHAI/GAMMA_X0D(XNUI))*XDICNVS_LIM**(1.0-XBI) +XC1DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF1IS*SQRT(XC_I)* & + (XALPHAI/GAMMA_X0D(XNUI))*XDICNVS_LIM**(1.0-XBI+(XDI+1.0)/2.0) +XR0DEPIS = XC0DEPIS *(XAI*XDICNVS_LIM**XBI) +XR1DEPIS = XC1DEPIS *(XAI*XDICNVS_LIM**XBI) +! +! Harrington parameterization for snow to ice conversion +! +XLBDASCNVI_MAX = 6000. ! lbdas max after Field (1999) +! +XDSCNVI_LIM = 125.E-6 ! size in microns +XLBDASCNVI_LIM = (50.0**(1.0/(XALPHAS)))/XDSCNVI_LIM ! ZLBDAS Limitation +XC0DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF0IS* & + (XALPHAS/GAMMA_X0D(XNUS))*XDSCNVI_LIM**(1.0-XBS) +XC1DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF1IS*SQRT(XCS)* & + (XALPHAS/GAMMA_X0D(XNUS))*XDSCNVI_LIM**(1.0-XBS+(XDS+1.0)/2.0) +XR0DEPSI = XC0DEPSI *(XAS*XDSCNVI_LIM**XBS) +XR1DEPSI = XC1DEPSI *(XAS*XDSCNVI_LIM**XBS) +! +! Vapor deposition on snow and graupel and hail +! +X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS-1.0 +XEX1DEPS = XCXS-0.5*(XDS+3.0) +! +X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = XCXG-1.0 +XEX1DEPG = XCXG-0.5*(XDG+3.0) +! +X0DEPH = (4.0*XPI)*XCCH*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.) +X1DEPH = (4.0*XPI)*XCCH*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5) +XEX0DEPH = XCXH-1.0 +XEX1DEPH = XCXH-0.5*(XDH+3.0) +! +!------------------------------------------------------------------------------- +! +! +!* 6. CONSTANTS FOR THE COALESCENCE PROCESSES +! --------------------------------------- +! +! +!* 6.0 Precalculation of the gamma function momentum +! +ZGAMI(1) = GAMMA_X0D(XNUI) +ZGAMI(2) = MOMG(XALPHAI,XNUI,3.) +ZGAMI(3) = MOMG(XALPHAI,XNUI,6.) +ZGAMI(4) = ZGAMI(3)-ZGAMI(2)**2 ! useful for Sig_I +ZGAMI(5) = MOMG(XALPHAI,XNUI,9.) +ZGAMI(6) = MOMG(XALPHAI,XNUI,3.+XBI) +ZGAMI(7) = MOMG(XALPHAI,XNUI,XBI) +ZGAMI(8) = MOMG(XALPHAI,XNUI,3.)/MOMG(XALPHAI,XNUI,2.) +! +ZGAMS(1) = GAMMA_X0D(XNUS) +ZGAMS(2) = MOMG(XALPHAS,XNUS,3.) +! +! +!* 6.1 Csts for the coalescence processes +! +ZFAC_ZRNIC = 0.1 +XKER_ZRNIC_A1 = 2.59E15*ZFAC_ZRNIC**2! From Long a1=9.44E9 cm-3 + ! so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKER_ZRNIC_A2 = 3.03E3*ZFAC_ZRNIC ! From Long a2=5.78E3 + ! so XKERA2= 5.78E3* (PI/6) +! +! +!* 6.2 Csts for the pristine ice selfcollection process +! +XSELFI = XKER_ZRNIC_A1*ZGAMI(3) +XCOLEXII = 0.025 ! Temperature factor of the I+I collection efficiency +! +! +!* 6.3 Constants for pristine ice autoconversion +! +XTEXAUTI = 0.025 ! Temperature factor of the I+I collection efficiency +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" pristine ice autoconversion")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XTEXAUTI=",E13.6)') XTEXAUTI +END IF +! +XAUTO3 = 6.25E18*(ZGAMI(2))**(1./3.)*SQRT(ZGAMI(4)) +XAUTO4 = 0.5E6*(ZGAMI(4))**(1./6.) +XLAUTS = 2.7E-2 +XLAUTS_THRESHOLD = 0.4 +XITAUTS= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTS_THRESHOLD = 7.5 +! +! +!* 6.4 Constants for snow aggregation +! +XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XAGGS_CLARGE1 = XKER_ZRNIC_A2*ZGAMI(2) +XAGGS_CLARGE2 = XKER_ZRNIC_A2*ZGAMS(2) +XAGGS_RLARGE1 = XKER_ZRNIC_A2*ZGAMI(6)*XAI +XAGGS_RLARGE2 = XKER_ZRNIC_A2*ZGAMI(7)*ZGAMS(2)*XAI +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" snow aggregation")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIS=",E13.6)') XCOLEXIS +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 7. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE AGGREGATES +! -------------------------------------------------------- +! +! +!* 7.1 Constants for the riming of the aggregates +! +XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) +XCOLCS = 1.0 +XEXCRIMSS= XCXS-XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS-XBS +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" riming of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" D_cs^lim (Farley et al.) XDCSLIM=",E13.6)') XDCSLIM + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLCS=",E13.6)') XCOLCS +END IF +! +NGAMINC = 80 +XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/FLOAT(NGAMINC-1)) +! +ALLOCATE( XGAMINC_RIM1(NGAMINC) ) +ALLOCATE( XGAMINC_RIM2(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND) + XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS ,ZBOUND) +END DO +! +XRIMINTP1 = XALPHAS / LOG(ZRATE) +XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) +! +!* 7.1.1 Defining the constants for the Hallett-Mossop +! secondary ice nucleation process +! +XHMTMIN = XTT - 8.0 +XHMTMAX = XTT - 3.0 +XHM1 = 9.3E-3 ! Obsolete parameterization +XHM2 = 1.5E-3/LOG(10.0) ! from Ferrier (1995) +XHM_YIELD = 5.E-3 ! A splinter is produced after the riming of 200 droplets +XHM_COLLCS= 1.0 ! Collision efficiency snow/droplet (with Dc>25 microns) +XHM_FACTS = XHM_YIELD*(XHM_COLLCS/XCOLCS) +! +! Notice: One magnitude of lambda discretized over 10 points for the droplets +! +XGAMINC_HMC_BOUND_MIN = 1.0E-3 ! Min value of (Lbda * (12,25) microns)**alpha +XGAMINC_HMC_BOUND_MAX = 1.0E5 ! Max value of (Lbda * (12,25) microns)**alpha +ZRATE = EXP(LOG(XGAMINC_HMC_BOUND_MAX/XGAMINC_HMC_BOUND_MIN)/FLOAT(NGAMINC-1)) +! +ALLOCATE( XGAMINC_HMC(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_HMC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_HMC(J1) = GAMMA_INC(XNUC,ZBOUND) +END DO +! +XHMSINTP1 = XALPHAC / LOG(ZRATE) +XHMSINTP2 = 1.0 + XHMSINTP1*LOG( 12.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +XHMLINTP1 = XALPHAC / LOG(ZRATE) +XHMLINTP2 = 1.0 + XHMLINTP1*LOG( 25.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +! +! +!* 7.2 Constants for the accretion of raindrops onto aggregates +! +XFRACCSS = ((XPI**2)/24.0)*XCCS*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) +! +XFSACCRG = (XPI/4.0)*XAS*XCCS*(ZRHO00**XCEXVT) +! +XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 7.2.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for rain +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NACCLBDAS = 40 +XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/FLOAT(NACCLBDAS-1) +XACCINTP1S = 1.0 / ZRATE +XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE +NACCLBDAR = 40 +XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS +XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/FLOAT(NACCLBDAR-1) +XACCINTP1R = 1.0 / ZRATE +XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE +! +!* 7.2.2 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG +! +ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY ) +IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & + (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) + CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCS ) + CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_SACCRG,XAG, XBS, XAS ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SACRG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAS=",I3)') NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAR=",I3)') NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PESR=",E13.6)') ZESR + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MAX=",E13.6)') & + XACCLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MAX=",E13.6)') & + XACCLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MIN=",E13.6)') & + XACCLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MIN=",E13.6)') & + XACCLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCSS(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCS (",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCS (J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")') + DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SACCRG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCSS")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCS ")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SACCRG")') +END IF +! +! +!* 7.3 Constant for the conversion-melting rate +! +XFSCVMG = 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" conversion-melting of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" Conv. factor XFSCVMG=",E13.6)') XFSCVMG +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 8. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE GRAUPELN +! -------------------------------------------------------- +! +! +!* 8.1 Constants for the rain contact freezing +! +XCOLIR = 1.0 +! +! values of these coeficients differ from the single-momemt rain_ice case +! +XEXRCFRI = -XDR-5.0 +XRCFRI = ((XPI**2)/24.0)*XRHOLW*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+5.0) +XEXICFRR = -XDR-2.0 +XICFRR = (XPI/4.0)*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" rain contact freezing")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIR=",E13.6)') XCOLIR +END IF +! +! +!* 8.2 Constants for the dry growth of the graupeln +! +!* 8.2.1 Constants for the cloud droplet collection by the graupeln +! and for the Hallett-Mossop process +! +XCOLCG = 0.6 ! Estimated from Cober and List (1993) +XFCDRYG = (XPI/4.0)*XCOLCG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +XHM_COLLCG= 0.9 ! Collision efficiency graupel/droplet (with Dc>25 microns) +XHM_FACTG = XHM_YIELD*(XHM_COLLCG/XCOLCG) +! +!* 8.2.2 Constants for the cloud ice collection by the graupeln +! +XCOLIG = 0.25 ! Collection efficiency of I+G +XCOLEXIG = 0.05 ! Temperature factor of the I+G collection efficiency +XCOLIG = 0.01 ! Collection efficiency of I+G +XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG +XFIDRYG = (XPI/4.0)*XCOLIG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" cloud ice collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIG=",E13.6)') XCOLIG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIG=",E13.6)') XCOLEXIG +END IF +! +!* 8.2.3 Constants for the aggregate collection by the graupeln +! +XCOLSG = 0.25 ! Collection efficiency of S+G +XCOLEXSG = 0.05 ! Temperature factor of the S+G collection efficiency +XCOLSG = 0.01 ! Collection efficiency of S+G +XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" aggregate collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLSG=",E13.6)') XCOLSG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXSG=",E13.6)') XCOLEXSG +END IF +! +!* 8.2.4 Constants for the raindrop collection by the graupeln +! +XFRDRYG = ((XPI**2)/24.0)*XCCG*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NDRYLBDAR = 40 +XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG +XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/FLOAT(NDRYLBDAR-1) +XDRYINTP1R = 1.0 / ZRATE +XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE +NDRYLBDAS = 80 +XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/FLOAT(NDRYLBDAS-1) +XDRYINTP1S = 1.0 / ZRATE +XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE +NDRYLBDAG = 40 +XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/FLOAT(NDRYLBDAG-1) +XDRYINTP1G = 1.0 / ZRATE +XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE +! +!* 8.2.5 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEGS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG +! +ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XBS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PEGS=",E13.6)') ZEGS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MAX=",E13.6)') & + XDRYLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MIN=",E13.6)') & + XDRYLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SDRYG")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG +ZFDINFTY = 20.0 +! +ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEGR/=ZEGR) .OR. (PBR/=XBR) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XBR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PEGR=",E13.6)') ZEGR + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MAX=",E13.6)') & + XDRYLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MIN=",E13.6)') & + XDRYLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RDRYG")') +END IF +! +!------------------------------------------------------------------------------- +! +!* 9. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE HAILSTONES +! -------------------------------------------------------- +! +!* 9.2 Constants for the wet growth of the hailstones +! +! +!* 9.2.1 Constant for the cloud droplet and cloud ice collection +! by the hailstones +! +XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) +! +!* 9.2.2 Constants for the aggregate collection by the hailstones +! +XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSWETH3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 9.2.3 Constants for the graupel collection by the hailstones +! +XFGWETH = (XPI/4.0)*XCCH*XCCG*XAG*(ZRHO00**XCEXVT) +! +XLBGWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAG,XNUG,XBG) +XLBGWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAG,XNUG,XBG+1.) +XLBGWETH3 = MOMG(XALPHAG,XNUG,XBG+2.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NWETLBDAS = 80 +XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH +ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/FLOAT(NWETLBDAS-1) +XWETINTP1S = 1.0 / ZRATE +XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE +NWETLBDAG = 40 +XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH +XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH +ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/FLOAT(NWETLBDAG-1) +XWETINTP1G = 1.0 / ZRATE +XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE +NWETLBDAH = 40 +XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/FLOAT(NWETLBDAH-1) +XWETINTP1H = 1.0 / ZRATE +XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE +! +!* 9.2.4 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEHS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH +! +IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +! +CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEHS/=ZEHS) .OR. (PBS/=XBS) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & + ZEHS, XBS, XCH, XDH, XCS, XDS, & + XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & + ZFDINFTY, XKER_SWETH ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SWETH KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAS=",I3)') NWETLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=ILUOUT0,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PEHS=",E13.6)') ZEHS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=ILUOUT0,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAS_MAX=",E13.6)') & + XWETLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAS_MIN=",E13.6)') & + XWETLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PKER_SWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,XKER_SWETH ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SWETH")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +! +CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PEHG/=ZEHG) .OR. (PBG/=XBG) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCG/=XCG) .OR. (PDG/=XDG) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=XWETLBDAG_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & + ZEHG, XBG, XCH, XDH, XCG, XDG, & + XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & + ZFDINFTY, XKER_GWETH ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF GWETH KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAG=",I3)') NWETLBDAG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=ILUOUT0,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PEHG=",E13.6)') ZEHG + WRITE(UNIT=ILUOUT0,FMT='("PBG=",E13.6)') XBG + WRITE(UNIT=ILUOUT0,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=ILUOUT0,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAG_MAX=",E13.6)') & + XWETLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAG_MIN=",E13.6)') & + XWETLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_GWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAG + WRITE(UNIT=ILUOUT0,FMT='("PKER_GWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_GWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,XKER_GWETH ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_GWETH")') +END IF +! +! +! +!------------------------------------------------------------------------------- +! +!* 10. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! +! R_eff_i = XFREFFI * (rho*r_i/N_i)**(1/3) +! +XFREFFI = 0.5 * ZGAMI(8) * (1.0/XLBI)**XLBEXI +! +!------------------------------------------------------------------------------- +! +! +!* 11. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the ice particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" PRISTINE ICE")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAI,XBI + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XC_I,XDI + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAI,XNUI + WRITE(UNIT=ILUOUT0,FMT='(" SNOW")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAS,XBS + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCS,XDS + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCS,XCXS + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAS,XNUS + WRITE(UNIT=ILUOUT0,FMT='(" GRAUPEL")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAG,XBG + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCG,XDG + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCG,XCXG + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAG,XNUG +END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA_COLD_MIXED diff --git a/src/MNH/ini_lima_warm.f90 b/src/MNH/ini_lima_warm.f90 new file mode 100644 index 000000000..53748aa7a --- /dev/null +++ b/src/MNH/ini_lima_warm.f90 @@ -0,0 +1,437 @@ +! ######################### + MODULE MODI_INI_LIMA_WARM +! ######################### +! +INTERFACE + SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN) +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA_WARM +! +END INTERFACE +! +END MODULE MODI_INI_LIMA_WARM +! ######################################### + SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN) +! ######################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA for the warm phase species and processes. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_REF +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_PARAMETERS +USE MODD_LUNIT +! +USE MODI_LIMA_FUNCTIONS +USE MODI_HYPGEO +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first and last physical + ! points along z +INTEGER :: J1 ! Internal loop indexes +INTEGER :: JMOD ! Internal loop to index the CCN modes +! +REAL, DIMENSION(6) :: ZGAMC, ZGAMR ! parameters involving various moments of + ! the generalized gamma law +! +REAL :: ZTT ! Temperature in Celsius +REAL :: ZLV ! Latent heat of vaporization +REAL :: ZSS ! Supersaturation +REAL :: ZPSI1, ZG ! Psi1 and G functions +REAL :: ZAHENR ! r_star (FH92) +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZSURF_TEN ! Water drop surface tension +REAL :: ZSMIN, ZSMAX ! Minimal and maximal supersaturation used to + ! discretize the HYP functions +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +! +!------------------------------------------------------------------------------- +! +! +!* 1. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 1.1 Cloud droplet characteristics +! +XAC = (XPI/6.0)*XRHOLW +XBC = 3.0 +XCC = XRHOLW*XG/(18.0*1.816E-5) ! Stokes flow (Pruppacher p 322 for T=293K) +XCC = XRHOLW*XG/(18.0*1.7E-5) ! Stokes flow (Pruppacher p 322 for T=273K) +XDC = 2.0 +! +XF0C = 1.00 +XF2C = 0.108 +! +XC1C = 1./2. +! +!* 1.2 Raindrops characteristics +! +XAR = (XPI/6.0)*XRHOLW +XBR = 3.0 +XCR = 842. +XDR = 0.8 +! +XF0R = 0.780 +!Correction BVIE Pruppacher 1997 eq. 13-61 +!XF1R = 0.265 +XF1R = 0.308 +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +!* 2.1 Cloud droplet distribution +! +!XALPHAC = 3.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +!XNUC = 3.0 ! Gamma law with little dispersion +! +!* 2.2 Raindrop distribution +! +!XALPHAR = 3.0 ! Gamma law of the raindrops (here volume-like distribution) +!XNUR = 3.0 ! Gamma law for the raindrops +!XNUR = 0.1 +! +!* 2.3 Precalculation of the gamma function momentum +! +! +ZGAMC(1) = GAMMA_X0D(XNUC) +ZGAMC(2) = MOMG(XALPHAC,XNUC,3.) +ZGAMC(3) = MOMG(XALPHAC,XNUC,6.) +ZGAMC(4) = ZGAMC(3)-ZGAMC(2)**2 ! useful for Sig_c +ZGAMC(5) = MOMG(XALPHAC,XNUC,9.) +ZGAMC(6) = MOMG(XALPHAC,XNUC,3.)**(2./3.)/MOMG(XALPHAC,XNUC,2.) +! +ZGAMR(1) = GAMMA_X0D(XNUR) +ZGAMR(2) = MOMG(XALPHAR,XNUR,3.) +ZGAMR(3) = MOMG(XALPHAR,XNUR,6.) +ZGAMR(4) = MOMG(XALPHAR,XNUR,6.) +ZGAMR(5) = MOMG(XALPHAR,XNUR,9.) +ZGAMR(6) = MOMG(XALPHAR,XNUR,3.)**(2./3.)/MOMG(XALPHAR,XNUR,2.) +! +!* 2.4 Csts for the shape parameter +! +XLBC = XAR*ZGAMC(2) +XLBEXC = 1.0/XBC +XLBR = XAR*ZGAMR(2) +XLBEXR = 1.0/XBR +! +! +!------------------------------------------------------------------------------ +! +! +!* 3. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 4.1 Exponent of the fall-speed air density correction +! +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +! +!* 4.2 Constants for sedimentation +! +XFSEDRR = XCR*GAMMA_X0D(XNUR+(XDR+3.)/XALPHAR)/GAMMA_X0D(XNUR+3./XALPHAR)* & + (ZRHO00)**XCEXVT +XFSEDCR = XCR*GAMMA_X0D(XNUR+XDR/XALPHAR)/GAMMA_X0D(XNUR)* & + (ZRHO00)**XCEXVT +XFSEDRC = XCC*GAMMA_X0D(XNUC+(XDC+3.)/XALPHAC)/GAMMA_X0D(XNUC+3./XALPHAC)* & + (ZRHO00)**XCEXVT +XFSEDCC = XCC*GAMMA_X0D(XNUC+XDC/XALPHAC)/GAMMA_X0D(XNUC)* & + (ZRHO00)**XCEXVT + +! +! +!------------------------------------------------------------------------------ +! +! +!* 4. CONSTANTS FOR THE NUCLEATION PROCESS +! ------------------------------------ +! +! +XWMIN = 0.01 ! Minimal positive vertical velocity required + ! for the activation process in Twomey and CPB scheme +XTMIN = -0.000278 ! Minimal cooling required 1K/h +! +XDIVA = 226.E-7 ! Diffusivity of water vapor in the air +XTHCO = 24.3E-3 ! Air thermal conductivity +! +! ( 8 Mw (Sigma)sw )3 Pi*Rho_l +! XCSTDCRIT = ( -------------- ) * -------- +! ( 3 Ra Rhow ) 6 +! +ZSURF_TEN = 76.1E-3 ! Surface tension of a water drop at T=0 C +XCSTDCRIT = (XPI/6.)*XRHOLW*( (8.0*ZSURF_TEN )/( 3.0*XRV*XRHOLW ) )**3 +! +! +! +! 4.1 Tabulation of the hypergeometric functions in 'no units' +! -------------------------------------------------------- +! +! In LIMA's nucleation parameterization, +! supersaturation is not in % : Smax=0.01 for a 1% supersaturation. +! This is accounted for in the modified Beta and C values. +! +! Here, we tabulate the +! F(mu,k/2, k/2+1 ,-Beta S**2) -> XHYPF12 +! F(mu,k/2,(k+3)/2,-Beta S**2) -> XHYPF32 functions +! using a logarithmic scale for S +! +NHYP = 500 ! Number of points for the tabulation +ALLOCATE (XHYPF12( NHYP, NMOD_CCN )) +ALLOCATE (XHYPF32( NHYP, NMOD_CCN )) +! +ZSMIN = 1.0E-5 ! Minimum supersaturation set at 0.001 % +ZSMAX = 5.0E-2 ! Maximum supersaturation set at 5 % +XHYPINTP1 = FLOAT(NHYP-1)/LOG(ZSMAX/ZSMIN) +XHYPINTP2 = FLOAT(NHYP)-XHYPINTP1*LOG(ZSMAX) +! +DO JMOD = 1,NMOD_CCN + DO J1 = 1,NHYP + ZSS =ZSMAX*(ZSMIN/ZSMAX)**(FLOAT(NHYP-J1)/FLOAT(NHYP-1)) + XHYPF12(J1,JMOD) = HYPGEO(XMUHEN_MULTI(JMOD),0.5*XKHEN_MULTI(JMOD),& + 0.5*XKHEN_MULTI(JMOD)+1.0,XBETAHEN_MULTI(JMOD),ZSS) + XHYPF32(J1,JMOD) = HYPGEO(XMUHEN_MULTI(JMOD),0.5*XKHEN_MULTI(JMOD),& + 0.5*XKHEN_MULTI(JMOD)+1.5,XBETAHEN_MULTI(JMOD),ZSS) + END DO +ENDDO +! +NAHEN = 81 ! Tabulation for each Kelvin degree in the range XTT-40 to XTT+40 +XAHENINTP1 = 1.0 +XAHENINTP2 = 0.5*FLOAT(NAHEN-1) - XTT +! +! Compute the tabulation of function of T : +! +! 1 +! XAHENG = ----------------------- +! XCSTHEN * G**(3/2) +! +! Compute constants for the calculation of Smax. +! XCSTHEN = 1/(rho_l 2 pi) +! PSI1 +! PSI3 +! T +! Lv +! G +! +ALLOCATE (XAHENG(NAHEN)) +ALLOCATE (XPSI1(NAHEN)) +ALLOCATE (XPSI3(NAHEN)) +XCSTHEN = 1.0 / ( XRHOLW*2.0*XPI ) +DO J1 = 1,NAHEN + ZTT = XTT + FLOAT(J1-(NAHEN-1)/2) ! T + ZLV = XLVTT+(XCPV-XCL)*(ZTT-XTT) ! Lv + XPSI1(J1) = (XG/(XRD*ZTT))*(XMV*ZLV/(XMD*XCPD*ZTT)-1.) ! Psi1 + XPSI3(J1) = -1*XMV*ZLV/(XMD*XRD*(ZTT**2)) ! Psi3 + ZG = 1./( XRHOLW*( (XRV*ZTT)/ & ! G + (XDIVA*EXP(XALPW-(XBETAW/ZTT)-(XGAMW*ALOG(ZTT)))) & + + (ZLV/ZTT)**2/(XTHCO*XRV) ) ) + XAHENG(J1) = XCSTHEN/(ZG)**(3./2.) +END DO +!------------------------------------------------------------------------------- +! +! Parameters used to initialise the droplet and drop concentration +! from the respective mixing ratios (used in RESTART_RAIN_C2R2) +! +! Droplet case +! +!!ALLOCATE(XCONCC_INI(SIZE(PNFS,1),SIZE(PNFS,2),SIZE(PNFS,3),SIZE(PNFS,4))) !NMOD_CCN)) +!! XCONCC_INI(:,:,:,:) = 0.8 * PNFS(:,:,:,:) ! 80% of the maximum CCN conc. is assumed +! +! Raindrop case +! +XCONCR_PARAM_INI = (1.E7)**3/(XPI*XRHOLW) ! MP law with N_O=1.E7 m-1 is assumed +! +! +!------------------------------------------------------------------------------ +! +! +!* 5. CONSTANTS FOR THE COALESCENCE PROCESSES +! --------------------------------------- +! +! +!* 6.1 Csts for the coalescence processes +! +XKERA1 = 2.59E15 ! From Long a1=9.44E9 cm-3 so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKERA2 = 3.03E3 ! From Long a2=5.78E3 so XKERA2= 5.78E3* (PI/6) +! +! Cst for the cloud droplet selfcollection process +! +XSELFC = XKERA1*ZGAMC(3) +! +! Cst for the autoconversion process +! +XAUTO1 = 6.25E18*(ZGAMC(2))**(1./3.)*SQRT(ZGAMC(4)) +XAUTO2 = 0.5E6*(ZGAMC(4))**(1./6.) +XLAUTR = 2.7E-2 +XLAUTR_THRESHOLD = 0.4 +XITAUTR= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTR_THRESHOLD = 7.5 +XCAUTR = 3.5E9 +! +! Cst for the accretion process +! +XACCR1 = ZGAMR(2)**(1./3.) +XACCR2 = 5.0E-6 +XACCR3 = 12.6E-4 +XACCR4 = XAUTO2 +XACCR5 = 3.5 +XACCR6 = 1.2*XCAUTR +XACCR_CLARGE1 = XKERA2*ZGAMC(2) +XACCR_CLARGE2 = XKERA2*ZGAMR(2) +XACCR_RLARGE1 = XKERA2*ZGAMC(3)*XRHOLW*(XPI/6.0) +XACCR_RLARGE2 = XKERA2*ZGAMC(2)*ZGAMR(2)*XRHOLW*(XPI/6.0) +XACCR_CSMALL1 = XKERA1*ZGAMC(3) +XACCR_CSMALL2 = XKERA1*ZGAMR(3) +XACCR_RSMALL1 = XKERA1*ZGAMC(5)*XRHOLW*(XPI/6.0) +XACCR_RSMALL2 = XKERA1*ZGAMC(2)*ZGAMR(3)*XRHOLW*(XPI/6.0) +! +! Cst for the raindrop self-collection/breakup process +! +XSCBU2 = XKERA2*ZGAMR(2) +XSCBU3 = XKERA1*ZGAMR(3) +XSCBU_EFF1 = 0.6E-3 +XSCBU_EFF2 = 2.0E-3 +XSCBUEXP1 = -2500.0 +! +! +!------------------------------------------------------------------------------ +! +! +!* 6. CONSTANTS FOR THE "SONTANEOUS" BREAK-UP +! --------------------------------------- +! +! +XSPONBUD1 = 3.0E-3 +XSPONBUD2 = 4.0E-3 +XSPONBUD3 = 5.0E-3 +XSPONCOEF2 = ((XSPONBUD3/XSPONBUD2)**3 - 1.0)/(XSPONBUD3-XSPONBUD1)**2 +! +! +!------------------------------------------------------------------------------ +! +! +!* 7. CONSTANTS FOR EVAPORATION PROCESS +! --------------------------------------- +! +! +X0CNDC = (4.0*XPI)*XC1C*XF0C*MOMG(XALPHAC,XNUC,1.) +X2CNDC = (4.0*XPI)*XC1C*XF2C*XCC*MOMG(XALPHAC,XNUC,XDC+2.0) +! +! Valeurs utiles pour le calcul de l'évaporation en fonction de N_r +! +!XEX0EVAR = -1.0 +!XEX1EVAR = -1.0 - (XDR+1.0)*0.5 +!XEX2EVAR = -0.5*XCEXVT +! +!X0EVAR = (2.0*XPI)*XF0R*GAMMA_X0D(XNUR+1./XALPHAR)/GAMMA_X0D(XNUR) +!X1EVAR = (2.0*XPI)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & +! GAMMA_X0D(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA_X0D(XNUR) +! +! +! Valeurs utiles pour le calcul de l'évaporation en fonction de r_r +! +XEX0EVAR = 2.0 +XEX1EVAR = 2.0 - (XDR+1.0)*0.5 +XEX2EVAR = -0.5*XCEXVT +! +X0EVAR = (12.0)*XF0R*GAMMA_X0D(XNUR+1./XALPHAR)/GAMMA_X0D(XNUR+3./XALPHAR) +X1EVAR = (12.0)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & + GAMMA_X0D(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA_X0D(XNUR+3./XALPHAR) +! +! +!------------------------------------------------------------------------------ +! +! +!* 8. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! +! R_eff_c = XFREFFC * (rho*r_c/N_c)**(1/3) +! +! +XFREFFC = 0.5 * ZGAMC(6) * (1.0/XAC)**(1.0/3.0) +XFREFFR = 0.5 * ZGAMR(6) * (1.0/XAR)**(1.0/3.0) +! +! Coefficients used to compute reff when both cloud and rain are present +! +XCREC = 1.0/ (ZGAMC(6) * XAC**(2.0/3.0)) +XCRER = 1.0/ (ZGAMR(6) * XAR**(2.0/3.0)) +! +! +!------------------------------------------------------------------------------ +! +! +!* 9. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the cloud particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" CLOUD")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCC,XDC + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAC,XNUC + WRITE(UNIT=ILUOUT0,FMT='(" RAIN")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCR,XDR +!!$ WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & +!!$ XALPHAR,XNUR +!!$ WRITE(UNIT=ILUOUT0,FMT='(" Description of the nucleation spectrum")') +!!$ WRITE(UNIT=ILUOUT0,FMT='(" C=",E13.6," k=",E13.6)') XCHEN, XKHEN +!!$ WRITE(UNIT=ILUOUT0,FMT='(" Beta=",E13.6," MU=",E13.6)') XBETAHEN, XMUHEN +!!$ WRITE(UNIT=ILUOUT0,FMT='(" CCN max=",E13.6)') XCONC_CCN +END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA_WARM diff --git a/src/MNH/init_aerosol_concentration.f90 b/src/MNH/init_aerosol_concentration.f90 new file mode 100644 index 000000000..3ff2fef9b --- /dev/null +++ b/src/MNH/init_aerosol_concentration.f90 @@ -0,0 +1,152 @@ +!###################################### + 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_BLANK : +!! 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 : LWARM, LACTI, NMOD_CCN, LSCAV, LAERO_MASS, & + XCCN_CONC, LCCN_HOM, & + LCOLD, LNUCL, NMOD_IFN, LMEYERS, & + XIFN_CONC, LIFN_HOM +USE MODD_PARAMETERS, ONLY : JPVEXT +USE MODD_BLANK, 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 ( LWARM .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 ( LCOLD .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/MNH/init_aerosol_properties.f90 b/src/MNH/init_aerosol_properties.f90 new file mode 100644 index 000000000..cdce0986f --- /dev/null +++ b/src/MNH/init_aerosol_properties.f90 @@ -0,0 +1,341 @@ +! ############################################################# + SUBROUTINE INIT_AEROSOL_PROPERTIES +! ############################################################# + +!! +!! +!! PURPOSE +!! ------- +!! +!! Define the aerosol properties +!! +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_LUNIT, ONLY : CLUOUT0 +USE MODD_PARAM_LIMA, ONLY : LWARM, LACTI, NMOD_CCN, HINI_CCN, HTYPE_CCN, & + XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN, & + XKHEN_MULTI, XMUHEN_MULTI, XBETAHEN_MULTI, & + XLIMIT_FACTOR, CCCN_MODES, LSCAV, & + XACTEMP_CCN, XFSOLUB_CCN, & + LCOLD, LNUCL, NMOD_IFN, NSPECIE, CIFN_SPECIES, & + XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, XFRAC, XFRAC_REF, & + CINT_MIXING, NMOD_IMM, NINDICE_CCN_IMM, NIMM, & + NPHILLIPS +! +USE MODI_GAMMA +! +IMPLICIT NONE +! +REAL :: XKHEN0 +REAL :: XLOGSIG0 +REAL :: XALPHA1 +REAL :: XMUHEN0 +REAL :: XALPHA2 +REAL :: XBETAHEN0 +REAL :: XR_MEAN0 +REAL :: XALPHA3 +REAL :: XALPHA4 +REAL :: XALPHA5 +REAL :: XACTEMP0 +REAL :: XALPHA6 +! +REAL, DIMENSION(6) :: XKHEN_TMP = (/1.56, 1.56, 1.56, 1.56, 1.56, 1.56 /) +REAL, DIMENSION(6) :: XMUHEN_TMP = (/0.80, 0.80, 0.80, 0.80, 0.80, 0.80 /) +REAL, DIMENSION(6) :: XBETAHEN_TMP= (/136., 136., 136., 136., 136., 136. /) +! +REAL, DIMENSION(3) :: RCCN +REAL, DIMENSION(3) :: LOGSIGCCN +REAL, DIMENSION(3) :: RHOCCN +! +INTEGER :: I,J,JMOD +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines + +! +!------------------------------------------------------------------------------- +! +CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) +! +!!!!!!!!!!!!!!!! +! CCN properties +!!!!!!!!!!!!!!!! +! +IF ( NMOD_CCN .GE. 1 ) THEN +! + IF (.NOT.(ALLOCATED(XR_MEAN_CCN))) ALLOCATE(XR_MEAN_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XLOGSIG_CCN))) ALLOCATE(XLOGSIG_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XRHO_CCN))) ALLOCATE(XRHO_CCN(NMOD_CCN)) +! + SELECT CASE (CCCN_MODES) + CASE ('JUNGFRAU') + RCCN(:) = (/ 0.02E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 0.28 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE ('COPT') + RCCN(:) = (/ 0.125E-6 , 0.4E-6 , 1.0E-6 /) + LOGSIGCCN(:) = (/ 0.69 , 0.41 , 0.47 /) + RHOCCN(:) = (/ 1000. , 1000. , 1000. /) + CASE ('MACC') + RCCN(:) = (/ 0.4E-6 , 0.25E-6 , 0.1E-6 /) + LOGSIGCCN(:) = (/ 0.64 , 0.47 , 0.47 /) + RHOCCN(:) = (/ 2160. , 2000. , 1750. /) + CASE ('MACC_JPP') +! sea-salt, sulfate, hydrophilic (GADS data) + RCCN(:) = (/ 0.209E-6 , 0.0695E-6 , 0.0212E-6 /) + LOGSIGCCN(:) = (/ 0.708 , 0.708 , 0.806 /) + RHOCCN(:) = (/ 2200. , 1700. , 1800. /) + CASE ('SIRTA') + RCCN(:) = (/ 0.153E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 0.846 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE ('CPS00') + RCCN(:) = (/ 0.0218E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 1.16 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE DEFAULT +! d'après Jaenicke 1993, aerosols troposphere libre, masse volumique typique + RCCN(:) = (/ 0.0035E-6 , 0.125E-6 , 0.26E-6 /) + LOGSIGCCN(:) = (/ 0.645 , 0.253 , 0.425 /) + RHOCCN(:) = (/ 1000. , 1000. , 1000. /) + ENDSELECT +! + DO I=1, MIN(NMOD_CCN,3) + XR_MEAN_CCN(I) = RCCN(I) + XLOGSIG_CCN(I) = LOGSIGCCN(I) + XRHO_CCN(I) = RHOCCN(I) + END DO +! + IF (NMOD_CCN .EQ. 4) THEN +! default values as coarse sea salt mode + XR_MEAN_CCN(4) = 1.75E-6 + XLOGSIG_CCN(4) = 0.708 + XRHO_CCN(4) = 2200. + END IF +! +! +! Compute CCN spectra parameters from CCN characteristics +! +!* INPUT : XBETAHEN_TEST is in 'percent' and XBETAHEN_MULTI in 'no units', +! XK... and XMU... are invariant +! + IF (.NOT.(ALLOCATED(XKHEN_MULTI))) ALLOCATE(XKHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XMUHEN_MULTI))) ALLOCATE(XMUHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XBETAHEN_MULTI))) ALLOCATE(XBETAHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XLIMIT_FACTOR))) ALLOCATE(XLIMIT_FACTOR(NMOD_CCN)) +! + IF (HINI_CCN == 'CCN'.AND. (.NOT. LSCAV) ) THEN +! Numerical initialization without dependence on AP physical properties +100 DO JMOD = 1, NMOD_CCN + XKHEN_MULTI(JMOD) = XKHEN_TMP(JMOD) + XMUHEN_MULTI(JMOD) = XMUHEN_TMP(JMOD) + XBETAHEN_MULTI(JMOD) = XBETAHEN_TMP(JMOD)*(100.)**2 +! no units relative to smax + XLIMIT_FACTOR(JMOD) = ( GAMMA_X0D(0.5*XKHEN_MULTI(JMOD)+1.)& + *GAMMA_X0D(XMUHEN_MULTI(JMOD)-0.5*XKHEN_MULTI(JMOD)) ) & + /( XBETAHEN_MULTI(JMOD)**(0.5*XKHEN_MULTI(JMOD)) & + *GAMMA_X0D(XMUHEN_MULTI(JMOD)) ) ! N/C + END DO + ELSE IF (HINI_CCN == 'CCN'.AND. LSCAV ) THEN +! Attention ! + WRITE(UNIT=ILUOUT0,FMT='("You are using a numerical initialization & + not depending on the aerosol properties, however you need it for & + scavenging. & + With LSCAV = true, HINI_CCN should be set to AER for consistency")') + go to 100 + ELSE IF (HINI_CCN == 'AER') THEN +! +! Initialisation depending on aerosol physical properties +! +! First, computing k, mu, beta, and XLIMIT_FACTOR as in CPS2000 (eqs 9a-9c) +! +! XLIMIT_FACTOR replaces C, because C depends on the CCN number concentration +! which is therefore determined at each grid point and time step as +! Nccn / XLIMIT_FACTOR +! + DO JMOD = 1, NMOD_CCN +! + SELECT CASE (HTYPE_CCN(JMOD)) + CASE ('M') ! CCN marins + XKHEN0 = 3.251 + XLOGSIG0 = 0.4835 + XALPHA1 = -1.297 + XMUHEN0 = 2.589 + XALPHA2 = -1.511 + XBETAHEN0 = 621.689 + XR_MEAN0 = 0.133E-6 + XALPHA3 = 3.002 + XALPHA4 = 1.081 + XALPHA5 = 1.0 + XACTEMP0 = 290.16 + XALPHA6 = 2.995 + CASE ('C') ! CCN continentaux + XKHEN0 = 1.403 + XLOGSIG0 = 1.16 + XALPHA1 = -1.172 + XMUHEN0 = 0.834 + XALPHA2 = -1.350 + XBETAHEN0 = 25.499 + XR_MEAN0 = 0.0218E-6 + XALPHA3 = 3.057 + XALPHA4 = 4.092 + XALPHA5 = 1.011 + XACTEMP0 = 290.16 + XALPHA6 = 3.076 + CASE DEFAULT + WRITE(UNIT=ILUOUT0,FMT='("You must specify HTYPE_CNN(JMOD)=C or M & + in EXSEG1.nam for each CCN mode")') + CALL ABORT + ENDSELECT +! + XKHEN_MULTI(JMOD) = XKHEN0*(XLOGSIG_CCN(JMOD)/XLOGSIG0)**XALPHA1 + XMUHEN_MULTI(JMOD) = XMUHEN0*(XLOGSIG_CCN(JMOD)/XLOGSIG0)**XALPHA2 + XBETAHEN_MULTI(JMOD)=XBETAHEN0*(XR_MEAN_CCN(JMOD)/XR_MEAN0)**XALPHA3 & + * EXP( XALPHA4*((XLOGSIG_CCN(JMOD)/XLOGSIG0)-1.) ) & + * XFSOLUB_CCN**XALPHA5 & + * (XACTEMP_CCN/XACTEMP0)**XALPHA6 + XLIMIT_FACTOR(JMOD) = ( GAMMA_X0D(0.5*XKHEN_MULTI(JMOD)+1.) & + *GAMMA_X0D(XMUHEN_MULTI(JMOD)-0.5*XKHEN_MULTI(JMOD)) ) & + /( XBETAHEN_MULTI(JMOD)**(0.5*XKHEN_MULTI(JMOD)) & + *GAMMA_X0D(XMUHEN_MULTI(JMOD)) ) + ENDDO +! +! These parameters are correct for a nucleation spectra +! Nccn(Smax) = C Smax^k F(mu,k/2,1+k/2,-beta Smax^2) +! with Smax expressed in % (Smax=1 for a supersaturation of 1%). +! +! All the computations in LIMA are done for an adimensional Smax (Smax=0.01 for +! a 1% supersaturation). So beta and C (XLIMIT_FACTOR) are changed : +! new_beta = beta * 100^2 +! new_C = C * 100^k (ie XLIMIT_FACTOR = XLIMIT_FACTOR / 100^k) +! + XBETAHEN_MULTI(:) = XBETAHEN_MULTI(:) * 10000 + XLIMIT_FACTOR(:) = XLIMIT_FACTOR(:) / (100**XKHEN_MULTI(:)) + END IF +END IF ! NMOD_CCN > 0 +! +!!!!!!!!!!!!!!!! +! IFN properties +!!!!!!!!!!!!!!!! +! +IF ( NMOD_IFN .GE. 1 ) THEN + SELECT CASE (CIFN_SPECIES) + CASE ('MACC_JPP') +! sea-salt, sulfate, hydrophilic (GADS data) +! 2 species, dust-metallic and hydrophobic (as BC) +! (Phillips et al. 2013 and GADS data) + NSPECIE = 4 ! DM1, DM2, BC, BIO+(O) + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.025E-6, 0.2E-6/) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 1.6 /) + XRHO_IFN = (/2600., 2600., 1000., 1500./) + CASE DEFAULT + IF (NPHILLIPS == 8) THEN +! 4 species, according to Phillips et al. 2008 + NSPECIE = 4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.2E-6, 0.2E-6/) + XSIGMA_IFN = (/1.9, 1.6, 1.6, 1.6 /) + XRHO_IFN = (/2300., 2300., 1860., 1500./) + ELSE IF (NPHILLIPS == 13) THEN +! 4 species, according to Phillips et al. 2013 + NSPECIE = 4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 90.E-9, 0.163E-6/) + XSIGMA_IFN = (/1.9, 1.6, 1.6, 2.54 /) + XRHO_IFN = (/2300., 2300., 1860., 1000./) + END IF + ENDSELECT +! +! internal mixing +! + IF (.NOT.(ALLOCATED(XFRAC))) ALLOCATE(XFRAC(NSPECIE,NMOD_IFN)) + XFRAC(:,:)=0. + SELECT CASE (CINT_MIXING) + CASE ('DM1') + XFRAC(1,:)=1. + CASE ('DM2') + XFRAC(2,:)=1. + CASE ('BC') + XFRAC(3,:)=1. + CASE ('O') + XFRAC(4,:)=1. + CASE ('MACC') + XFRAC(1,1)=0.99 + XFRAC(2,1)=0.01 + XFRAC(3,1)=0. + XFRAC(4,1)=0. + XFRAC(1,2)=0. + XFRAC(2,2)=0. + XFRAC(3,2)=0.5 + XFRAC(4,2)=0.5 + CASE ('MACC_JPP') + XFRAC(1,1)=1.0 + XFRAC(2,1)=0.0 + XFRAC(3,1)=0.0 + XFRAC(4,1)=0.0 + XFRAC(1,2)=0.0 + XFRAC(2,2)=0.0 + XFRAC(3,2)=0.5 + XFRAC(4,2)=0.5 + CASE DEFAULT + XFRAC(1,:)=0.6 + XFRAC(2,:)=0.009 + XFRAC(3,:)=0.33 + XFRAC(4,:)=0.06 + ENDSELECT +! +! Phillips 08 alpha (table 1) + IF (.NOT.(ALLOCATED(XFRAC_REF))) ALLOCATE(XFRAC_REF(4)) + IF (NPHILLIPS == 13) THEN + XFRAC_REF(1)=0.66 + XFRAC_REF(2)=0.66 + XFRAC_REF(3)=0.31 + XFRAC_REF(4)=0.03 + ELSE IF (NPHILLIPS == 8) THEN + XFRAC_REF(1)=0.66 + XFRAC_REF(2)=0.66 + XFRAC_REF(3)=0.28 + XFRAC_REF(4)=0.06 + END IF +! +! Immersion modes +! + 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 .GE. 1) THEN + DO J = 0, NMOD_IMM-1 + NIMM(NMOD_CCN-J)=1 + NINDICE_CCN_IMM(NMOD_IMM-J) = NMOD_CCN-J + END DO +! ELSE IF (NMOD_IMM == 0) THEN ! PNIS existe mais vaut 0, pour l'appel à resolved_cloud +! NMOD_IMM = 1 +! NINDICE_CCN_IMM(1) = 0 + END IF +! +END IF ! NMOD_IFN > 0 +! +END SUBROUTINE INIT_AEROSOL_PROPERTIES diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90 new file mode 100644 index 000000000..02450c133 --- /dev/null +++ b/src/MNH/lima_adjust.f90 @@ -0,0 +1,1216 @@ +! ####################### + MODULE MODI_LIMA_ADJUST +! ####################### +! +INTERFACE +! + SUBROUTINE LIMA_ADJUST(KRR, KMI, HFMFILE, HLUOUT, HRAD, & + HTURBDIM, OCLOSE_OUT, OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR ) + ! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +CHARACTER*4, INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +CHARACTER*4, INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the OUTPUT FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentration source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +END SUBROUTINE LIMA_ADJUST +! +END INTERFACE +! +END MODULE MODI_LIMA_ADJUST +! +! ########################################################################## + SUBROUTINE LIMA_ADJUST(KRR, KMI, HFMFILE, HLUOUT, HRAD, & + HTURBDIM, OCLOSE_OUT, OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR ) +! ########################################################################## +! +!!**** *MIMA_ADJUST* - compute the fast microphysical sources +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through an explict scheme and a saturation ajustement procedure. +!! +!! +!!** METHOD +!! ------ +!! Reisin et al., 1996 for the explicit scheme when ice is present +!! Langlois, Tellus, 1973 for the implict adjustment for the cloud water +!! (refer also to book 1 of the documentation). +!! +!! Computations are done separately for three cases : +!! - ri>0 and rc=0 +!! - rc>0 and ri=0 +!! - ri>0 and rc>0 +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! NBUPROCCTR +!! LBU_RTH +!! LBU_RRV +!! LBU_RRC +!! Module MODD_LES : NCTR_LES,LTURB_LES,NMODNBR_LES +!! XNA declaration (cloud fraction as global var) +!! +!! REFERENCE +!! --------- +!! +!! Book 1 and Book2 of documentation ( routine FAST_TERMS ) +!! Langlois, Tellus, 1973 +!! +!! AUTHOR +!! ------ +!! E. Richard * Laboratoire d'Aerologie* +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy* jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CST +USE MODD_CONF +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +USE MODD_NSV +USE MODD_BUDGET +! +USE MODI_CONDENS +USE MODI_BUDGET +USE MODI_LIMA_FUNCTIONS +! +USE MODE_FM +USE MODE_FMWRIT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +CHARACTER*4, INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +CHARACTER*4, INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the OUTPUT FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentration source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +! +!* 0.2 Declarations of local variables : +! +! 3D Microphysical variables +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Aggregate m.r. at t + PRGT, & ! Graupel m.r. at t +! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Cloud ice m.r. source + PRSS, & ! Aggregate m.r. source + PRGS, & ! Graupel m.r. source +! + PCCT, & ! Cloud water conc. at t + PCIT, & ! Cloud ice conc. at t +! + PCCS, & ! Cloud water C. source + PMAS, & ! Mass of scavenged AP + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE & + :: PNFS, & ! Free CCN C. source + PNAS, & ! Activated CCN C. source + PIFS, & ! Free IFN C. source + PINS, & ! Nucleated IFN C. source + PNIS ! Acti. IMM. nuclei C. source +! +! +! +REAL :: ZEPS ! Mv/Md +REAL :: ZDT ! Time increment (2*Delta t or Delta t if cold start) +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: ZEXNS,& ! guess of the Exner function at t+1 + ZT, & ! guess of the temperature at t+1 + ZCPH, & ! guess of the CPh for the mixing + ZW, & + ZW1, & + ZW2, & + ZLV, & ! guess of the Lv at t+1 + ZLS, & ! guess of the Ls at t+1 + ZMASK +LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: GMICRO, GMICRO_RI, GMICRO_RC ! Test where to compute cond/dep proc. +INTEGER :: IMICRO +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRVT, ZRCT, ZRIT, ZRVS, ZRCS, ZRIS, ZTHS, & + ZCCT, ZCIT, ZCCS, ZCIS, & + ZRHODREF, ZZT, ZPRES, ZEXNREF, ZZCPH, & + ZZW, ZLVFACT, ZLSFACT, & + ZRVSATW, ZRVSATI, ZRVSATW_PRIME, ZRVSATI_PRIME, & + ZAW, ZAI, ZCJ, ZKA, ZDV, ZITW, ZITI, ZAWW, ZAIW, & + ZAWI, ZAII, ZFACT, ZDELTW, & + ZDELTI, ZDELT1, ZDELT2, ZCND, ZDEP +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILENG ! Length of comment string in LFIFM file +INTEGER :: IGRID ! C-grid indicator in LFIFM file +INTEGER :: ILENCH ! Length of comment string in LFIFM file +INTEGER :: IKB ! K index value of the first inner mass point +INTEGER :: IKE ! K index value of the last inner mass point +INTEGER :: IIB,IJB ! Horz index values of the first inner mass points +INTEGER :: IIE,IJE ! Horz index values of the last inner mass points +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +CHARACTER (LEN=100) :: YCOMMENT ! Comment string in LFIFM file +CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file +! +INTEGER :: ISIZE +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN +! +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: JMOD, JMOD_IFN, JMOD_IMM +! +INTEGER , DIMENSION(3) :: BV +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP) +! +IIB = 1 + JPHEXT +IIE = SIZE(PRHODJ,1) - JPHEXT +IJB = 1 + JPHEXT +IJE = SIZE(PRHODJ,2) - JPHEXT +IKB = 1 + JPVEXT +IKE = SIZE(PRHODJ,3) - JPVEXT +! +ZEPS= XMV / XMD +! +IF (OSUBG_COND) THEN + ITERMAX=2 +ELSE + ITERMAX=1 +END IF +! +ZDT = PTSTEP +! +ISIZE = SIZE(XRTMIN) +ALLOCATE(ZRTMIN(ISIZE)) +ZRTMIN(:) = XRTMIN(:) / ZDT +ISIZE = SIZE(XCTMIN) +ALLOCATE(ZCTMIN(ISIZE)) +ZCTMIN(:) = XCTMIN(:) / ZDT +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( LSCAV .AND. LAERO_MASS ) PMAS(:,:,:) = PSVS(:,:,:,NSV_LIMA_SCAVMASS) +! +IF ( LWARM .AND. NMOD_CCN.GE.1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +END IF +! +IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 remove negative non-precipitating negative water +! ------------------------------------------------ +! +IF (ANY(PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) .AND. NVERB>5) THEN + WRITE(ILUOUT,*) 'LIMA_ADJUST: negative values of total water (reset to zero)' + WRITE(ILUOUT,*) ' location of minimum PRVS+PRCS+PRIS:',MINLOC(PRVS+PRCS+PRIS) + WRITE(ILUOUT,*) ' value of minimum PRVS+PRCS+PRIS:',MINVAL(PRVS+PRCS+PRIS) +END IF +! +WHERE ( PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) + PRVS(:,:,:) = - PRCS(:,:,:) - PRIS(:,:,:) +END WHERE +! +!* 2.2 estimate the Exner function at t+1 +! +ZEXNS(:,:,:) = ( (2. * PPABST(:,:,:) - PPABSM(:,:,:)) / XP00 ) ** (XRD/XCPD) +! +! beginning of the iterative loop +! +DO JITER =1,ITERMAX +! +!* 2.3 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) +! +!* 2.4 compute the specific heat for moist air (Cph) at t+1 +! + ZCPH(:,:,:) = XCPD + XCPV *ZDT* PRVS(:,:,:) & + + XCL *ZDT* ( PRCS(:,:,:) + PRRS(:,:,:) ) & + + XCI *ZDT* ( PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:) ) +! +!* 2.5 compute the latent heat of vaporization Lv(T*) at t+1 +! and of sublimation Ls(T*) at t+1 +! + ZLV(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZT(:,:,:) -XTT ) + ZLS(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZT(:,:,:) -XTT ) +! +! +!------------------------------------------------------------------------------- +! +!* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME +! --------------------------------------- +! + IF ( OSUBG_COND ) THEN +! +! not yet available +! + STOP + ELSE +! +!------------------------------------------------------------------------------- +! +! +!* 4. FULLY EXPLICIT SCHEME FROM TZIVION et al. (1989) +! ----------------------------------------------- +! +!* select cases where r_i>0 and r_c=0 +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + (PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) .AND. & + PCIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ) & + .AND. .NOT. (PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) +GMICRO_RI(:,:,:) = GMICRO(:,:,:) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) !!!BVIE!!! + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) !!!BVIE!!! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ALLOCATE(ZRVSATI(IMICRO)) + ALLOCATE(ZRVSATI_PRIME(IMICRO)) + ALLOCATE(ZDELTI(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZITI(IMICRO)) +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) +! + ZDELTI(:) = ZRVS(:)*ZDT - ZRVSATI(:) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIT(:),XCTMIN(4)) & + /(MAX(ZRIT(:),XRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ALLOCATE(ZAII(IMICRO)) + ALLOCATE(ZDEP(IMICRO)) +! + ZAII(:) = 1.0 + ZRVSATI_PRIME(:)*ZLSFACT(:) + ZDEP(:) = 0.0 +! + ZZW(:) = ZAII(:)*ZITI(:)*ZDT ! R*delta_T + WHERE( ZZW(:)<1.0E-2 ) + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - (ZZW(:)/2.0)*(1.0-ZZW(:)/3.0)) + ELSEWHERE + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - EXP(-ZZW(:)))/ZZW(:) + END WHERE +! +! Integration +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) +! ZDEP(:) = MIN ( ZDEP(:), ZCIS(:)*5.E-10 ) !!!BVIE!!! + END WHERE + WHERE( ZRIS(:) < ZRTMIN(4) ) + ZDEP(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +! Implicit ice crystal sublimation if ice saturated conditions are not met +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZCIS) !!!BVIE!!! + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZRVSATI) + DEALLOCATE(ZRVSATI_PRIME) + DEALLOCATE(ZDELTI) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZITI) + DEALLOCATE(ZAII) + DEALLOCATE(ZDEP) +END IF ! IMICRO +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. FULLY IMPLICIT CONDENSATION SCHEME +! --------------------------------- +! +!* select cases where r_c>0 and r_i=0 +! +! +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + .NOT. GMICRO_RI(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. ( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) & + .AND. .NOT. ( PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) .AND. & + PCIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ) +GMICRO_RC(:,:,:) = GMICRO(:,:,:) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ALLOCATE(ZRVSATW(IMICRO)) + ALLOCATE(ZRVSATW_PRIME(IMICRO)) +! + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ALLOCATE(ZAWW(IMICRO)) + ALLOCATE(ZDELT1(IMICRO)) + ALLOCATE(ZDELT2(IMICRO)) + ALLOCATE(ZCND(IMICRO)) +! + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) + ZDELT2(:) = (ZRVSATW_PRIME(:)*ZLVFACT(:)/ZAWW(:)) * & + ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & + + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) + ZDELT1(:) = (ZLVFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) + ZCND(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZLVFACT(:)*ZDT) +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZRVSATW) + DEALLOCATE(ZRVSATW_PRIME) + DEALLOCATE(ZAWW) + DEALLOCATE(ZDELT1) + DEALLOCATE(ZDELT2) + DEALLOCATE(ZCND) +END IF ! IMICRO +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. IMPLICIT-EXPLICIT SCHEME USING REISIN et al. (1996) +! --------------------------------------------------- +! +!* select cases where r_i>0 and r_c>0 (supercooled water) +! +! +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + .NOT. GMICRO_RI(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. .NOT. GMICRO_RC(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. ( PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) .AND. & + PCIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ) & + .AND. ( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ALLOCATE(ZRVSATW(IMICRO)) + ALLOCATE(ZRVSATI(IMICRO)) + ALLOCATE(ZRVSATW_PRIME(IMICRO)) + ALLOCATE(ZRVSATI_PRIME(IMICRO)) + ALLOCATE(ZDELTW(IMICRO)) + ALLOCATE(ZDELTI(IMICRO)) + ALLOCATE(ZAW(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZITW(IMICRO)) + ALLOCATE(ZITI(IMICRO)) +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +!* 6.2 implicit adjustment at water saturation +! + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZDELTW(:) = ABS( ZRVS(:)*ZDT - ZRVSATW(:) ) + ZAW(:) = ( XLSTT + (XCPV-XCL)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) + ZDELTI(:) = ABS( ZRVS(:)*ZDT - ZRVSATI(:) ) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = MIN(1.E8,( XLBC* MAX(ZCCT(:),XCTMIN(2)) & + /(MAX(ZRCT(:),XRTMIN(2))) )**XLBEXC) + ! Lbda_c + ZITW(:) = ZCCT(:) * (X0CNDC/ZZW(:) + X2CNDC*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDC+2.0)) & + / (ZRVSATW(:)*ZAW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIT(:),XCTMIN(4)) & + /(MAX(ZRIT(:),XRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ALLOCATE(ZAWW(IMICRO)) + ALLOCATE(ZAIW(IMICRO)) + ALLOCATE(ZAWI(IMICRO)) + ALLOCATE(ZAII(IMICRO)) +! + ALLOCATE(ZFACT(IMICRO)) + ALLOCATE(ZDELT1(IMICRO)) + ALLOCATE(ZDELT2(IMICRO)) +! + ZAII(:) = ZITI(:)*ZDELTI(:) + WHERE( ZAII(:)<1.0E-15 ) + ZFACT(:) = ZLVFACT(:) + ELSEWHERE + ZFACT(:) = (ZLVFACT(:)*ZITW(:)*ZDELTW(:)+ZLSFACT(:)*ZITI(:)*ZDELTI(:)) & + / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + END WHERE + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZFACT(:) +! + ZDELT2(:) = (ZRVSATW_PRIME(:)*ZFACT(:)/ZAWW(:)) * & + ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & + + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) + ZDELT1(:) = (ZFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) +! + ALLOCATE(ZCND(IMICRO)) + ALLOCATE(ZDEP(IMICRO)) + ZCND(:) = 0.0 + ZDEP(:) = 0.0 +! + ZZW(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZFACT(:)*ZDT) + WHERE( ZAII(:)<1.0E-15 ) + ZCND(:) = ZZW(:) + ZDEP(:) = 0.0 + ELSEWHERE + ZCND(:) = ZZW(:)*ZITW(:)*ZDELTW(:) / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + ZDEP(:) = ZZW(:)*ZITI(:)*ZDELTI(:) / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + END WHERE +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +!* 6.3 explicit integration of the final eva/dep rates +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si +! +! If Si < 0, implicit adjustment to Si=0 using ice only +! + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! Following the previous adjustment, the real procedure begins +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) +! + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZDELTW(:) = ZRVS(:)*ZDT - ZRVSATW(:) + ZAW(:) = ( XLSTT + (XCPV-XCL)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) + ZDELTI(:) = ZRVS(:)*ZDT - ZRVSATI(:) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = MIN(1.E8,( XLBC* MAX(ZCCS(:),ZCTMIN(2)) & + /(MAX(ZRCS(:),ZRTMIN(2))) )**XLBEXC) + ! Lbda_c + ZITW(:) = ZCCT(:) * (X0CNDC/ZZW(:) + X2CNDC*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDC+2.0)) & + / (ZRVSATW(:)*ZAW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIS(:),ZCTMIN(4)) & + /(MAX(ZRIS(:),ZRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) + ZAIW(:) = 1.0 + ZRVSATI_PRIME(:)*ZLVFACT(:) + ZAWI(:) = 1.0 + ZRVSATW_PRIME(:)*ZLSFACT(:) + ZAII(:) = 1.0 + ZRVSATI_PRIME(:)*ZLSFACT(:) +! + ZCND(:) = 0.0 + ZDEP(:) = 0.0 + ZZW(:) = ZAWW(:)*ZITW(:) + ZAII(:)*ZITI(:) ! R + WHERE( ZZW(:)<1.0E-2 ) + ZFACT(:) = ZDT*(0.5 - (ZZW(:)*ZDT)/6.0) + ELSEWHERE + ZFACT(:) = (1.0/ZZW(:))*(1.0-(1.0-EXP(-ZZW(:)*ZDT))/(ZZW(:)*ZDT)) + END WHERE + ZCND(:) = ZITW(:)*(ZDELTW(:)-( ZAWW(:)*ZITW(:)*ZDELTW(:) & + + ZAWI(:)*ZITI(:)*ZDELTI(:) )*ZFACT(:)) + ZDEP(:) = ZITI(:)*(ZDELTI(:)-( ZAIW(:)*ZITW(:)*ZDELTW(:) & + + ZAII(:)*ZITI(:)*ZDELTI(:) )*ZFACT(:)) +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + WHERE( ZRCS(:) < ZRTMIN(2) ) + ZCND(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) + END WHERE + WHERE( ZRIS(:) < ZRTMIN(4) ) + ZDEP(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +! Implicit ice crystal sublimation if ice saturated conditions are not met +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZRVSATW) + DEALLOCATE(ZRVSATI) + DEALLOCATE(ZRVSATW_PRIME) + DEALLOCATE(ZRVSATI_PRIME) + DEALLOCATE(ZDELTW) + DEALLOCATE(ZDELTI) + DEALLOCATE(ZAW) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZITW) + DEALLOCATE(ZITI) + DEALLOCATE(ZAWW) + DEALLOCATE(ZAIW) + DEALLOCATE(ZAWI) + DEALLOCATE(ZAII) + DEALLOCATE(ZFACT) + DEALLOCATE(ZDELT1) + DEALLOCATE(ZDELT2) + DEALLOCATE(ZCND) + DEALLOCATE(ZDEP) +END IF ! IMICRO +! +END IF ! OSUBG_COND +! +! full sublimation of the cloud ice crystals if there are few +! +ZMASK(:,:,:) = 0.0 +ZW(:,:,:) = 0. +WHERE (PRIS(:,:,:) <= ZRTMIN(4) .OR. PCIS(:,:,:) <= ZCTMIN(4)) + PRVS(:,:,:) = PRVS(:,:,:) + PRIS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRIS(:,:,:)*ZLS(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRIS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCIS(:,:,:),0.) + PCIS(:,:,:) = 0.0 +END WHERE +! +IF (LCOLD .AND. (NMOD_IFN .GE. 1 .OR. NMOD_IMM .GE. 1)) THEN + ZW1(:,:,:) = 0. + IF (NMOD_IFN .GE. 1) ZW1(:,:,:) = ZW1(:,:,:) + SUM(PINS,DIM=4) + IF (NMOD_IMM .GE. 1) ZW1(:,:,:) = ZW1(:,:,:) + SUM(PNIS,DIM=4) + ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) + ZW2(:,:,:) = 0. + WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) + ENDWHERE +END IF +! +IF (LCOLD .AND. NMOD_IFN.GE.1) THEN + DO JMOD_IFN = 1, NMOD_IFN + PIFS(:,:,:,JMOD_IFN) = PIFS(:,:,:,JMOD_IFN) + & + ZMASK(:,:,:) * PINS(:,:,:,JMOD_IFN) * ZW2(:,:,:) + PINS(:,:,:,JMOD_IFN) = PINS(:,:,:,JMOD_IFN) - & + ZMASK(:,:,:) * PINS(:,:,:,JMOD_IFN) * ZW2(:,:,:) + PINS(:,:,:,JMOD_IFN) = MAX( 0.0 , PINS(:,:,:,JMOD_IFN) ) + ENDDO +END IF +! +IF (LCOLD .AND. NMOD_IMM.GE.1) THEN + JMOD_IMM = 0 + DO JMOD = 1, NMOD_CCN + IF (NIMM(JMOD) == 1) THEN + JMOD_IMM = JMOD_IMM + 1 + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNIS(:,:,:,JMOD_IMM) * ZW2(:,:,:) + PNIS(:,:,:,JMOD_IMM) = PNIS(:,:,:,JMOD_IMM) - & + ZMASK(:,:,:) * PNIS(:,:,:,JMOD_IMM) * ZW2(:,:,:) + PNIS(:,:,:,JMOD_IMM) = MAX( 0.0 , PNIS(:,:,:,JMOD_IMM) ) + END IF + ENDDO +END IF +! +! complete evaporation of the cloud droplets if there are few +! +ZMASK(:,:,:) = 0.0 +ZW(:,:,:) = 0. +WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <= ZCTMIN(2)) + PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRCS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCCS(:,:,:),0.) + PCCS(:,:,:) = 0.0 +END WHERE +! +ZW1(:,:,:) = 0. +IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4) +ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) +ZW2(:,:,:) = 0. +WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) +ENDWHERE +! +IF (LWARM .AND. NMOD_CCN.GE.1) THEN + DO JMOD = 1, NMOD_CCN + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) - & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = MAX( 0.0 , PNAS(:,:,:,JMOD) ) + ENDDO +END IF +! +IF (LSCAV .AND. LAERO_MASS) PMAS(:,:,:) = PMAS(:,:,:) * (1-ZMASK(:,:,:)) +! +! end of the iterative loop +! +END DO +! +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +! +!* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) +! +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) > 1.E-12 / ZDT) + ZW(:,:,:) = 1. + ELSEWHERE + ZW(:,:,:) = 0. + ENDWHERE + IF ( SIZE(PSRCS,3) /= 0 ) THEN + PSRCS(:,:,:) = ZW(:,:,:) + END IF +END IF +! +IF ( HRAD /= 'NONE' ) THEN + PCLDFR(:,:,:) = ZW(:,:,:) +END IF +! +IF ( OCLOSE_OUT ) THEN + ILENCH=LEN(YCOMMENT) + YRECFM ='NEB' + YCOMMENT='X_Y_Z_NEB (0)' + IGRID = 1 + ILENG = SIZE(ZW,1)*SIZE(ZW,2)*SIZE(ZW,3) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZW,IGRID,ILENCH,YCOMMENT,IRESP) +END IF +! +! +!* 6. SAVE CHANGES IN PRS AND PSVS +! ---------------------------- +! +! +! Prepare 3D water mixing ratios +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( LSCAV .AND. LAERO_MASS ) PSVS(:,:,:,NSV_LIMA_SCAVMASS) = PMAS(:,:,:) +! +IF ( LWARM .AND. NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +IF ( LCOLD .AND. NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF +! +! write SSI in LFI +! +IF ( OCLOSE_OUT ) THEN + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) + ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) + ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) + ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 + + ILENCH=LEN(YCOMMENT) + YRECFM ='SSI' + YCOMMENT='X_Y_Z_SSI' + IGRID = 1 + ILENG = SIZE(ZW,1)*SIZE(ZW,2)*SIZE(ZW,3) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZW,IGRID,ILENCH,YCOMMENT,IRESP) +END IF +! +! +!* 7. STORE THE BUDGET TERMS +! ---------------------- +! +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'CEDS_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'CEDS_BU_RRV') + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'CEDS_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'CEDS_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET (PCCS(:,:,:) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'CEDS_BU_RSV') ! RCC + CALL BUDGET (PCIS(:,:,:) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'CEDS_BU_RSV') ! RCI + IF (NMOD_CCN .GE. 1) THEN + DO JL = 1, NMOD_CCN + CALL BUDGET (PNFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'CEDS_BU_RSV') ! RCC + END DO + END IF + IF (NMOD_IFN .GE. 1) THEN + DO JL = 1, NMOD_IFN + CALL BUDGET (PIFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'CEDS_BU_RSV') ! RCC + END DO + END IF + END IF +END IF +!++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +!--cb-- +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_ADJUST diff --git a/src/MNH/lima_cold.f90 b/src/MNH/lima_cold.f90 new file mode 100644 index 000000000..fe9e92e6b --- /dev/null +++ b/src/MNH/lima_cold.f90 @@ -0,0 +1,414 @@ +! ##################### + MODULE MODI_LIMA_COLD +! ##################### +! +INTERFACE + SUBROUTINE LIMA_COLD (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRS, PINPRG, PINPRH) +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +! +END SUBROUTINE LIMA_COLD +END INTERFACE +END MODULE MODI_LIMA_COLD +! +! ###################################################################### + SUBROUTINE LIMA_COLD (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRS, PINPRG, PINPRH) +! ###################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the cold-phase +!! microphysical sources involving only primary ice and snow, except for +!! the sedimentation which also includes graupelns, and the homogeneous +!! freezing of CCNs, cloud droplets and raindrops. +!! +!! +!!** METHOD +!! ------ +!! The nucleation of IFN is parameterized following either Meyers (1992) +!! or Phillips (2008, 2013). +!! +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! +!! REFERENCES +!! ---------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_NSV +USE MODD_PARAM_LIMA +! +USE MODI_LIMA_COLD_SEDIMENTATION +USE MODI_LIMA_MEYERS +USE MODI_LIMA_PHILLIPS +USE MODI_LIMA_COLD_HOM_NUCL +USE MODI_LIMA_COLD_SLOW_PROCESSES +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Snow/aggregate m.r. at t + PRGT, & ! Graupel m.r. at t + PRHT, & ! Graupel m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Pristine ice m.r. source + PRSS, & ! Snow/aggregate m.r. source + PRGS, & ! Graupel/hail m.r. source + PRHS, & ! Graupel/hail m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + PCIT, & ! Ice crystal C. at t + ! + PCCS, & ! Cloud water C. source + PCRS, & ! Rain water C. source + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), ALLOCATABLE :: PNHS ! Haze homogeneous activation +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +PRHT(:,:,:) = 0. +PRHS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +IF ( KRR .GE. 7 ) PRHT(:,:,:) = PRT(:,:,:,7) +IF ( KRR .GE. 7 ) PRHS(:,:,:) = PRS(:,:,:,7) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNFS(:,:,:,:) = 0. + PNAS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +ELSE + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PIFS(:,:,:,:) = 0. + PINS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +ELSE + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNIS(:,:,:,:) = 0.0 +END IF +! +IF ( OHHONI ) THEN + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) +ELSE + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = 0.0 +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +CALL LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS, PINPRG,& + PINPRH ) +!------------------------------------------------------------------------------- +! +! +! COMPUTE THE NUCLEATION PROCESS SOURCES +! -------------------------------------- +! +IF (LNUCL) THEN +! + IF ( LMEYERS ) THEN + PIFS(:,:,:,:) = 0.0 + PNIS(:,:,:,:) = 0.0 + CALL LIMA_MEYERS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) + ELSE + CALL LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) + END IF +! + IF (LWARM) THEN + CALL LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, & + PCIS, PNIS, PNHS ) + END IF +! +END IF +! +!------------------------------------------------------------------------------ +! +! +!* 4. SLOW PROCESSES: depositions, aggregation +! ---------------------------------------- +! +IF (LSNOW) THEN +! + CALL LIMA_COLD_SLOW_PROCESSES(PTSTEP, KMI, HFMFILE, HLUOUT, & + OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! +END IF +! +!------------------------------------------------------------------------------ +! +! +!* 4. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +IF ( KRR .GE. 7 ) PRS(:,:,:,7) = PRHS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF + +IF ( OHHONI ) PSVS(:,:,:,NSV_LIMA_HOM_HAZE) = PNHS(:,:,:) +! +!++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +IF (ALLOCATED(PNHS)) DEALLOCATE(PNHS) +!--cb-- +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_COLD diff --git a/src/MNH/lima_cold_hom_nucl.f90 b/src/MNH/lima_cold_hom_nucl.f90 new file mode 100644 index 000000000..a8e8c6f94 --- /dev/null +++ b/src/MNH/lima_cold_hom_nucl.f90 @@ -0,0 +1,684 @@ +! ###################### + MODULE MODI_LIMA_COLD_HOM_NUCL +! ###################### +! +INTERFACE + SUBROUTINE LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, & + PCIS, PNIS, PNHS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHS ! haze homogeneous freezing +! +END SUBROUTINE LIMA_COLD_HOM_NUCL +END INTERFACE +END MODULE MODI_LIMA_COLD_HOM_NUCL +! +! ###################################################################### + SUBROUTINE LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, & + PCIS, PNIS, PNHS ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the cold-phase homogeneous +!! freezing of CCN, droplets and drops (T<-35°C) +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy* jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST, ONLY : XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XG +USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IMM, XRTMIN, XCTMIN, XNUC +USE MODD_PARAM_LIMA_COLD, ONLY : XRCOEF_HONH, XCEXP_DIFVAP_HONH, XCOEF_DIFVAP_HONH,& + XCRITSAT1_HONH, XCRITSAT2_HONH, XTMAX_HONH, & + XTMIN_HONH, XC1_HONH, XC2_HONH, XC3_HONH, & + XDLNJODT1_HONH, XDLNJODT2_HONH, XRHOI_HONH, & + XC_HONC, XTEXP1_HONC, XTEXP2_HONC, XTEXP3_HONC, & + XTEXP4_HONC, XTEXP5_HONC +USE MODD_PARAM_LIMA_WARM, ONLY : XLBC +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +USE MODD_NSV +USE MODD_BUDGET +USE MODI_BUDGET +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHS ! haze homogeneous freezing +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFS ! available nucleus conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNIS ! Nucleated Ice nuclei conc. source + !by Immersion +REAL, DIMENSION(:), ALLOCATABLE :: ZZNHS ! Nucleated Ice nuclei conc. source + !by Homogeneous freezing +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZNHS ! Nucleated Ice nuclei conc. source + ! by Homogeneous freezing of haze +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & ! Saturation over ice + ZTCELSIUS,& + ZLS, & + ZPSI1, & + ZPSI2, & + ZTAU, & + ZBFACT, & + ZW_NU, & + ZFREECCN, & + ZCCNFROZEN +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IMM ! Loop index +! +INTEGER :: INEGT ! Case number of hom. nucleation +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the hom. nucleation +INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT +! +REAL :: ZEPS ! molar mass ratio +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +IF( OHHONI ) THEN + ZNHS(:,:,:) = PNHS(:,:,:) +ELSE + ZNHS(:,:,:) = 0.0 +END IF +! +! Computations only where the temperature is below -35°C +! PACK variables +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-35.0 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT.GT.0) THEN + + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) + ! + ALLOCATE(ZCCT(INEGT)) + ! + ALLOCATE(ZRVS(INEGT)) + ALLOCATE(ZRCS(INEGT)) + ALLOCATE(ZRRS(INEGT)) + ALLOCATE(ZRIS(INEGT)) + ALLOCATE(ZRGS(INEGT)) + ! + ALLOCATE(ZTHS(INEGT)) + ! + ALLOCATE(ZCCS(INEGT)) + ALLOCATE(ZCRS(INEGT)) + ALLOCATE(ZCIS(INEGT)) + ! + ALLOCATE(ZNFS(INEGT,NMOD_CCN)) + ALLOCATE(ZNIS(INEGT,NMOD_IMM)) + ALLOCATE(ZZNHS(INEGT)) + ! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + ! + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + ! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ! + DO JMOD_CCN = 1, NMOD_CCN + ZNFS(JL,JMOD_CCN) = PNFS(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + DO JMOD_IMM = 1, NMOD_IMM + ZNIS(JL,JMOD_IMM) = PNIS(I1(JL),I2(JL),I3(JL),JMOD_IMM) + ENDDO + ZZNHS(JL) = ZNHS(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! +! PACK : done +! Prepare computations +! + ALLOCATE( ZLSFACT (INEGT) ) + ALLOCATE( ZLVFACT (INEGT) ) + ALLOCATE( ZSI (INEGT) ) + ALLOCATE( ZTCELSIUS (INEGT) ) + ALLOCATE( ZLBDAC (INEGT) ) +! + ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 + ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 + ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! + ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. Haze homogeneous freezing +! ------------------------ +! +! +! Compute the haze homogeneous nucleation source: RHHONI +! + IF( OHHONI .AND. NMOD_CCN.GT.0 ) THEN + +! Sum of the available CCN + ALLOCATE( ZFREECCN(INEGT) ) + ALLOCATE( ZCCNFROZEN(INEGT) ) + ZFREECCN(:)=0. + ZCCNFROZEN(:)=0. + DO JMOD_CCN = 1, NMOD_CCN + ZFREECCN(:) = ZFREECCN(:) + ZNFS(:,JMOD_CCN) + END DO +! + ALLOCATE(ZW_NU(INEGT)) + DO JL=1,INEGT + ZW_NU(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + END DO +! + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZEPS = XMV / XMD + ZZY(:) = XCRITSAT1_HONH - & ! Critical Sat. + (MIN( XTMAX_HONH,MAX( XTMIN_HONH,ZZT(:) ) )/XCRITSAT2_HONH) +! + ALLOCATE(ZLS(INEGT)) + ALLOCATE(ZPSI1(INEGT)) + ALLOCATE(ZPSI2(INEGT)) + ALLOCATE(ZTAU(INEGT)) + ALLOCATE(ZBFACT(INEGT)) +! + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZSI(:)>ZZY(:)) .AND. (ZTHS(:)<-1.0E-6) ) + ZLS(:) = XLSTT+(XCPV-XCI)*ZTCELSIUS(:) ! Ls +! + ZPSI1(:) = ZZY(:) * (XG/(XRD*ZZT(:)))*(ZEPS*ZLS(:)/(XCPD*ZZT(:))-1.) +! ! Psi1 (a1*Scr in KL01) +! BV correction PSI2 enlever 1/ZEPS ? +! ZPSI2(:) = ZSI(:) * (1.0/ZEPS+1.0/ZRVT(:)) + & + ZPSI2(:) = ZSI(:) * (1.0/ZRVT(:)) + & + ZZY(:) * ((ZLS(:)/ZZT(:))**2)/(XCPD*XRV) +! ! Psi2 (a2+a3*Scr in KL01) + ZTAU(:) = 1.0 / ( MAX( XC1_HONH,XC1_HONH*(XC2_HONH-XC3_HONH*ZZT(:)) ) *& + ABS( (XDLNJODT1_HONH - XDLNJODT2_HONH*ZZT(:)) * & + ((ZPRES(:)/XP00)**(XRD/XCPD))*ZTHS(:) ) ) +! + ZBFACT(:) = (XRHOI_HONH/ZRHODREF(:)) * (ZSI(:)/(ZZY(:)-1.0)) & +! BV correction ZBFACT enlever 1/ZEPS ? +! * (1.0/ZRVT(:)+1.0/ZEPS) & + * (1.0/ZRVT(:)) & + / (XCOEF_DIFVAP_HONH*(ZZT(:)**XCEXP_DIFVAP_HONH /ZPRES(:))) +! +! BV correction ZZX rho_i{-1} ? +! ZZX(:) = MAX( MIN( XRHOI_HONH*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & + ZZX(:) = MAX( MIN( (1/XRHOI_HONH)*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & +! BV correction ZZX PTSTEP wrong place ? +! * (ZW_NU(:)/SQRT(ZTAU(:))), ZNFS(:,JMOD_CCN) )/PTSTEP , 0.) + * (ZW_NU(:)/SQRT(ZTAU(:)))/PTSTEP , ZFREECCN(:) ) , 0.) +! + ZZW(:) = MIN( XRCOEF_HONH*ZZX(:)*(ZTAU(:)/ZBFACT(:))**1.5 , ZRVS(:) ) + END WHERE +! +! Apply the changes to ZNFS, + DO JMOD_CCN = 1, NMOD_CCN + ZCCNFROZEN(:) = ZZX(:) * ZNFS(:,JMOD_CCN)/ZFREECCN(:) + ZNFS(:,JMOD_CCN) = ZNFS(:,JMOD_CCN) - ZCCNFROZEN(:) + ZW(:,:,:) = PNFS(:,:,:,JMOD_CCN) + PNFS(:,:,:,JMOD_CCN)=UNPACK( ZNFS(:,JMOD_CCN), MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:)) + END DO +! + ZZNHS(:) = ZZNHS(:) + ZZX(:) + ZNHS(:,:,:) = ZNHS(:,:,:) + UNPACK( ZZNHS(:), MASK=GNEGT(:,:,:),FIELD=0.0) + PNHS(:,:,:) = ZNHS(:,:,:) +! + DEALLOCATE(ZFREECCN) + DEALLOCATE(ZCCNFROZEN) + DEALLOCATE(ZLS) + DEALLOCATE(ZPSI1) + DEALLOCATE(ZPSI2) + DEALLOCATE(ZTAU) + DEALLOCATE(ZBFACT) + DEALLOCATE(ZW_NU) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RHHONI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +! + END IF ! OHHONI +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE .AND. OHHONI) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HONH_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET ( & + UNPACK(ZRVS(:),MASK=GNEGT(:,:,:),FIELD=PRVS)*PRHODJ(:,:,:),& + 6,'HONH_BU_RRV') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GNEGT(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'HONH_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GNEGT(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NI,'HONH_BU_RSV') ! RCI + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( UNPACK(ZNFS(:,JL),MASK=GNEGT(:,:,:),FIELD=PNFS(:,:,:,JL))*PRHODJ(:,:,:),& + 12+NSV_LIMA_CCN_FREE+JL-1,'HONH_BU_RSV') + END DO + END IF + END IF + END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. Cloud droplets homogeneous freezing +! ----------------------------------- +! +! +! Compute the droplet homogeneous nucleation source: RCHONI +! -> Pruppacher(1995) +! + ZZW(:) = 0.0 + ZZX(:) = 0.0 + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZCCT(:)>XCTMIN(2)) .AND. (ZRCT(:)>XRTMIN(2)) ) + ZLBDAC(:) = XLBC*ZCCT(:) / (ZRCT(:)) ! Lambda_c**3 + ZZX(:) = 1.0 / ( 1.0 + (XC_HONC/ZLBDAC(:))*PTSTEP* & + EXP( XTEXP1_HONC + ZTCELSIUS(:)*( & + XTEXP2_HONC + ZTCELSIUS(:)*( & + XTEXP3_HONC + ZTCELSIUS(:)*( & + XTEXP4_HONC + ZTCELSIUS(:)*XTEXP5_HONC))) ) )**XNUC + ZZW(:) = ZCCS(:) * (1.0 - ZZX(:)) ! CCHONI +! + ZCCS(:) = ZCCS(:) - ZZW(:) + ZCIS(:) = ZCIS(:) + ZZW(:) +! + ZZW(:) = ZRCS(:) * (1.0 - ZZX(:)) ! RCHONI +! + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCHONI)) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HONC_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GNEGT(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:),& + 7,'HONC_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GNEGT(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'HONC_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCCS(:),MASK=GNEGT(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NC,'HONC_BU_RSV') + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GNEGT(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NI,'HONC_BU_RSV') + END IF + END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Rain drops homogeneous freezing +! ------------------------------- +! +! +! Compute the drop homogeneous nucleation source: RRHONG +! + ZZW(:) = 0.0 + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRS(:)>0.) ) + ZZW(:) = ZRRS(:) ! Instantaneous freezing of the raindrops + ZRRS(:) = ZRRS(:) - ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRHONG)) +! + ZCRS(:) = 0.0 ! No more raindrops when T<-35 C + ENDWHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HONR_BU_RTH') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GNEGT(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:),& + 8,'HONR_BU_RRR') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GNEGT(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:),& + 11,'HONR_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCRS(:),MASK=GNEGT(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NR,'HONR_BU_RSV') + END IF + END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Unpack variables, clean +! ----------------------- +! +! +! End of homogeneous nucleation processes +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRGS(:,:,:) + PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZCCT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRGS) +! + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCIS) +! + DEALLOCATE(ZNFS) + DEALLOCATE(ZNIS) + DEALLOCATE(ZZNHS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) +! + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSI) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZLBDAC) +! + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) +! +ELSE +! +! Advance the budget calls +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) THEN + ZW(:,:,:) = PTHS(:,:,:)*PRHODJ(:,:,:) + IF( OHHONI ) CALL BUDGET (ZW,4,'HONH_BU_RTH') + CALL BUDGET (ZW,4,'HONC_BU_RTH') + CALL BUDGET (ZW,4,'HONR_BU_RTH') + ENDIF + IF (LBUDGET_RV) THEN + ZW(:,:,:) = PRVS(:,:,:)*PRHODJ(:,:,:) + IF( OHHONI ) CALL BUDGET (ZW,6,'HONH_BU_RRV') + ENDIF + IF (LBUDGET_RC) THEN + ZW(:,:,:) = PRCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,7,'HONC_BU_RRC') + ENDIF + IF (LBUDGET_RR) THEN + ZW(:,:,:) = PRRS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,8,'HONR_BU_RRR') + ENDIF + IF (LBUDGET_RI) THEN + ZW(:,:,:) = PRIS(:,:,:)*PRHODJ(:,:,:) + IF( OHHONI ) CALL BUDGET (ZW,9,'HONH_BU_RRI') + CALL BUDGET (ZW,9,'HONC_BU_RRI') + ENDIF + IF (LBUDGET_RG) THEN + ZW(:,:,:) = PRGS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,11,'HONR_BU_RRG') + ENDIF + IF (LBUDGET_SV) THEN + ZW(:,:,:) = PCCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NC,'HONC_BU_RSV') + ZW(:,:,:) = PCRS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NR,'HONR_BU_RSV') + ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) + IF( OHHONI ) CALL BUDGET (ZW,12+NSV_LIMA_NI,'HONH_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HONC_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( UNPACK(ZNFS(:,JL),MASK=GNEGT(:,:,:),FIELD=PNFS(:,:,:,JL))*PRHODJ(:,:,:),& + 12+NSV_LIMA_CCN_FREE+JL-1,'HONH_BU_RSV') + END DO + END IF + END IF + END IF +! +END IF ! INEGT>0 +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_COLD_HOM_NUCL diff --git a/src/MNH/lima_cold_sedimentation.f90 b/src/MNH/lima_cold_sedimentation.f90 new file mode 100644 index 000000000..dc65c211c --- /dev/null +++ b/src/MNH/lima_cold_sedimentation.f90 @@ -0,0 +1,378 @@ +! ################################### + MODULE MODI_LIMA_COLD_SEDIMENTATION +! ################################### +! +INTERFACE + SUBROUTINE LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS, PINPRG, PINPRH ) +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the FM file output +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian (Budgets) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip + +! + END SUBROUTINE LIMA_COLD_SEDIMENTATION +END INTERFACE +END MODULE MODI_LIMA_COLD_SEDIMENTATION +! +! +! ###################################################################### + SUBROUTINE LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS,PINPRG,& + PINPRH ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the sediimentation +!! of primary ice, snow and graupel. +!! +!! METHOD +!! ------ +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA_COLD, ONLY : XLBEXI, XLBI, XDI, & + XFSEDRI, XFSEDCI, XFSEDS, XEXSEDS +USE MODD_PARAM_LIMA_MIXED, ONLY : XFSEDG, XEXSEDG, XFSEDH, XEXSEDH +USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN, XCTMIN +USE MODD_CST, ONLY : XRHOLW +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +USE MODD_NSV +USE MODD_BUDGET +USE MODI_BUDGET +!++cb++ +IMPLICIT NONE +!--cb-- + +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the FM file output +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian (Budgets) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip + +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK, JL, JN ! Loop index +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: ISEDIM ! Case number of sedimentation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GSEDIM ! Test where to compute the SED processes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, & ! Work array + ZWSEDR, & ! Sedimentation of MMR + ZWSEDC ! Sedimentation of number conc. +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRIS, & ! Pristine ice m.r. source + ZCIS, & ! Pristine ice conc. source + ZRSS, & ! Snow/aggregate m.r. source + ZRGS, & ! Graupel/hail m.r. source + ZRHS, & ! Graupel/hail m.r. source + ZRIT, & ! Pristine ice m.r. at t + ZCIT, & ! Pristine ice conc. at t + ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZRTMIN +! +INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL :: ZTSPLITG ! Small time step for rain sedimentation +! +! +!------------------------------------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Time splitting and ZRTMIN +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +! +ZTSPLITG= PTSTEP / FLOAT(KSPLITG) +! +! ################################ +! Compute the sedimentation fluxes +! ################################ +! +DO JN = 1 , KSPLITG + ! Computation only where enough ice, snow, graupel or hail + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(5) & + .OR. PRGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(6) & + .OR. PRHS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(7) + IF( OSEDI ) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) & + .OR. PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) + END IF +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN +! + IF( JN==1 ) THEN + IF( OSEDI ) THEN + PCIS(:,:,:) = PCIS(:,:,:) * PTSTEP + PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + END IF + PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + DO JK = IKB , IKE + ZW(:,:,JK)=ZTSPLITG/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) + END DO + END IF +! + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 + ALLOCATE(ZZX(ISEDIM)) ; ZZX(:) = 0.0 + ALLOCATE(ZZY(ISEDIM)) ; ZZY(:) = 0.0 +! +!* 2.21 for pristine ice +! + IF( OSEDI.AND.MAXVAL(PRIS(:,:,:))>ZRTMIN(4) ) THEN + ALLOCATE(ZRIS(ISEDIM)) + ALLOCATE(ZCIS(ISEDIM)) + ALLOCATE(ZRIT(ISEDIM)) + ALLOCATE(ZCIT(ISEDIM)) + ALLOCATE(ZLBDAI(ISEDIM)) + DO JL = 1,ISEDIM + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDAI(:) = 1.E10 + WHERE (ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI + END WHERE + WHERE( ZRIS(:)>ZRTMIN(4) ) + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDAI(:)**(-XDI) + ZZW(:) = XFSEDRI * ZRIS(:) * ZZY(:) * ZRHODREF(:) + ZZX(:) = XFSEDCI * ZCIS(:) * ZZY(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCIS(:,:,JK) = PCIS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRIS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZLBDAI) + END IF +! +!* 2.22 for aggregates +! + ZZW(:) = 0. + IF( MAXVAL(PRSS(:,:,:))>ZRTMIN(5) ) THEN + ALLOCATE(ZRSS(ISEDIM)) + DO JL = 1,ISEDIM + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRSS(:)>ZRTMIN(5) ) +! Correction BVIE ZRHODREF +! ZZW(:) = XFSEDS * ZRSS(:)**XEXSEDS * ZRHODREF(:)**(XEXSEDS-XCEXVT) + ZZW(:) = XFSEDS * ZRSS(:)**XEXSEDS * ZRHODREF(:)**(-XCEXVT) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRSS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + IF( JN.EQ.1 ) THEN + PINPRS(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + END IF +! +!* 2.23 for graupeln +! + ZZW(:) = 0. + IF( MAXVAL(PRGS(:,:,:))>ZRTMIN(6) ) THEN + ALLOCATE(ZRGS(ISEDIM)) + DO JL = 1,ISEDIM + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRGS(:)>ZRTMIN(6) ) +! Correction BVIE ZRHODREF +! ZZW(:) = XFSEDG * ZRGS(:)**XEXSEDG * ZRHODREF(:)**(XEXSEDG-XCEXVT) + ZZW(:) = XFSEDG * ZRGS(:)**XEXSEDG * ZRHODREF(:)**(-XCEXVT) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRGS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + IF( JN.EQ.1 ) THEN + PINPRG(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + END IF +! +!* 2.23 for hail +! + ZZW(:) = 0. + IF( MAXVAL(PRHS(:,:,:))>ZRTMIN(7) ) THEN + ALLOCATE(ZRHS(ISEDIM)) + DO JL = 1,ISEDIM + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRHS(:)>ZRTMIN(7) ) +! Correction BVIE ZRHODREF +! ZZW(:) = XFSEDH * ZRHS(:)**XEXSEDH * ZRHODREF(:)**(XEXSEDH-XCEXVT) + ZZW(:) = XFSEDH * ZRHS(:)**XEXSEDH * ZRHODREF(:)**(-XCEXVT) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRHS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + IF( JN.EQ.1 ) THEN + PINPRH(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + END IF +! +!* 2.24 End of sedimentation +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + IF( JN==KSPLITG ) THEN + IF( OSEDI ) THEN + PRIS(:,:,:) = PRIS(:,:,:) / PTSTEP + PCIS(:,:,:) = PCIS(:,:,:) / PTSTEP + END IF + PRSS(:,:,:) = PRSS(:,:,:) / PTSTEP + PRGS(:,:,:) = PRGS(:,:,:) / PTSTEP + PRHS(:,:,:) = PRHS(:,:,:) / PTSTEP + END IF + END IF +END DO +! +! +! Budget storage +IF (LBU_ENABLE) THEN + IF (LBUDGET_RI .AND. OSEDI) & + CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9 ,'SEDI_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET (PRSS(:,:,:)*PRHODJ(:,:,:),10 ,'SEDI_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET (PRGS(:,:,:)*PRHODJ(:,:,:),11 ,'SEDI_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12 ,'SEDI_BU_RRH') + IF (LBUDGET_SV) THEN + IF (OSEDI) CALL BUDGET (PCIS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NI,'SEDI_BU_RSV') ! RCI + END IF +END IF +!++cb++ +DEALLOCATE(ZRTMIN) +!--cb-- +! +END SUBROUTINE LIMA_COLD_SEDIMENTATION +! +!------------------------------------------------------------------------------- diff --git a/src/MNH/lima_cold_slow_processes.f90 b/src/MNH/lima_cold_slow_processes.f90 new file mode 100644 index 000000000..bdbb4c64e --- /dev/null +++ b/src/MNH/lima_cold_slow_processes.f90 @@ -0,0 +1,568 @@ +! ##################### + MODULE MODI_LIMA_COLD_SLOW_PROCESSES +! ##################### +! +INTERFACE + SUBROUTINE LIMA_COLD_SLOW_PROCESSES (PTSTEP, KMI, HFMFILE, HLUOUT, & + OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +END SUBROUTINE LIMA_COLD_SLOW_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_COLD_SLOW_PROCESSES +! +! ###################################################################### + SUBROUTINE LIMA_COLD_SLOW_PROCESSES (PTSTEP, KMI, HFMFILE, HLUOUT, & + OCLOSE_OUT, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for slow cold processes : +!! - conversion of snow to ice +!! - deposition of vapor on snow +!! - conversion of ice to snow (Harrington 1995) +!! - aggregation of ice on snow +!! +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST, ONLY : XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & + XCL, XCI, XTT, XLSTT, XALPI, XBETAI, XGAMI +USE MODD_PARAM_LIMA, ONLY : LSNOW, XRTMIN, XCTMIN, XALPHAI, XALPHAS, & + XNUI +USE MODD_PARAM_LIMA_COLD, ONLY : XLBI, XLBEXI, XLBS, XLBEXS, XBI, XCXS, XCCS, & + XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & + XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & + XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & + XDICNVS_LIM, XLBDAICNVS_LIM, & + XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & + XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2 +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +USE MODD_BUDGET +USE MODD_NSV, ONLY : NSV_LIMA_NI +USE MODI_BUDGET + +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GMICRO ! Computations only where necessary +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace PACK +INTEGER :: JL ! and PACK intrinsics +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZSSI, & ! Supersaturation over ice + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZLBDAS, & ! Slope parameter of the aggregate distr. + ZAI, & ! Thermodynamical function + ZCJ, & ! used to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV, & ! Diffusivity of water vapor in the air + ZVISCA ! Viscosity of air +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT, ZW ! Temperature +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN, ZCTMIN +! +!------------------------------------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Physical limitations +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Looking for regions where computations are necessary +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(5) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN +! +!------------------------------------------------------------------------------ +! +! +!* 1. Optimization : packing variables +! -------------------------------- +! +! +! + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) +! + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) +! + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZCIS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + ALLOCATE(ZRHODJ(IMICRO)) + ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) ) + END IF +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. Microphysical computations +! -------------------------- +! +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZZX(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) + ALLOCATE(ZLBDAI(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZZW1(IMICRO,7)) +! +! Preliminary computations +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +! + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! Distribution parameters for ice and snow + ZLBDAI(:) = 1.E10 + WHERE (ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI + END WHERE + ZLBDAS(:) = 1.E10 + WHERE (ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS + END WHERE +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +! +! Thermodynamical function ZAI = A_i(T,P) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! ZCJ = c^prime_j/c_i (in the ventilation factor) ( c_i from v(D)=c_i*D^(d_i) ) + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +! +! +! +!* 2.1 Conversion of snow to r_i: RSCNVI +! ---------------------------------------- +! +! + WHERE ( ZRST(:)>0.0 ) + ZLBDAS(:) = MIN( XLBDAS_MAX, & + XLBS*( ZRHODREF(:)*MAX( ZRST(:),XRTMIN(5) ) )**XLBEXS ) + END WHERE + ZZW(:) = 0.0 + WHERE ( ZLBDAS(:)<XLBDASCNVI_MAX .AND. (ZRST(:)>XRTMIN(5)) & + .AND. (ZSSI(:)<0.0) ) + ZZW(:) = (ZLBDAS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (XCCS*ZLBDAS(:)**XCXS) * (ZZW(:)**XNUI) & + * EXP(-ZZW(:)) +! +! Correction BVIE RHODREF +! ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:)/ZRHODREF(:),ZRSS(:) ) + ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRSS(:) = ZRSS(:) - ZZW(:) +! + ZZW(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*ZCJ(:) )/( XR0DEPSI+XR1DEPSI*ZCJ(:) ) + ZCIS(:) = ZCIS(:) + ZZW(:) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'CNVI_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:),& + 10,'CNVI_BU_RRS') + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'CNVI_BU_RSV') + END IF +! +! +!* 2.2 Deposition of water vapor on r_s: RVDEPS +! ----------------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE ( (ZRST(:)>0.0) .AND. (ZRSS(:)>0.0) ) +!Correction BVIE rhodref +! ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & + ZZW(:) = ( ZSSI(:)/(ZAI(:)) ) * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'DEPS_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET ( & + UNPACK(ZRVS(:),MASK=GMICRO(:,:,:),FIELD=PRVS)*PRHODJ(:,:,:),& + 6,'DEPS_BU_RRV') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:),& + 10,'DEPS_BU_RRS') + END IF +! +! +!* 2.3 Conversion of pristine ice to r_s: RICNVS +! ------------------------------------------------ +! +! + ZZW(:) = 0.0 + WHERE ( (ZLBDAI(:)<XLBDAICNVS_LIM) .AND. (ZCIT(:)>XCTMIN(4)) & + .AND. (ZSSI(:)>0.0) ) + ZZW(:) = (ZLBDAI(:)*XDICNVS_LIM)**(XALPHAI) + ZZX(:) = ( ZSSI(:)/ZAI(:) )*ZCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) +! +! Correction BVIE +! ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:)/ZRHODREF(:) & + ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:) & + ,ZRIS(:) ) + ZRTMIN(5), ZRTMIN(5) ) - ZRTMIN(5) + ZRIS(:) = ZRIS(:) - ZZW(:) + ZRSS(:) = ZRSS(:) + ZZW(:) +! + ZZW(:) = MIN( ZZW(:)*(( XC0DEPIS+XC1DEPIS*ZCJ(:) ) & + /( XR0DEPIS+XR1DEPIS*ZCJ(:) )),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW(:) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'CNVS_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:),& + 10,'CNVS_BU_RRS') + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'CNVS_BU_RSV') + END IF +! +! +!* 2.4 Aggregation of r_i on r_s: CIAGGS and RIAGGS +! --------------------------------------------------- +! +! + WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>0.0) & + .AND. (ZCIS(:)>0.0) ) + ZZW1(:,3) = (ZLBDAI(:) / ZLBDAS(:))**3 + ZZW1(:,1) = (ZCIT(:)*(XCCS*ZLBDAS(:)**XCXS)*EXP( XCOLEXIS*(ZZT(:)-XTT) )) & + / (ZLBDAI(:)**3) + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW1(:,2) +! + ZZW1(:,1) = ZZW1(:,1) / ZLBDAI(:)**XBI + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:,3)),ZRIS(:) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) + ZZW1(:,2) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'AGGS_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'AGGS_BU_RRS') + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'AGGS_BU_RSV') + END IF +! +! +!------------------------------------------------------------------------------ +! +! +!* 3. Unpacking & Deallocating +! ------------------------ +! +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRSS(:,:,:) + PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZSSI) + DEALLOCATE(ZLBDAI) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZZW1) + IF (NBUMOD==KMI .AND. LBU_ENABLE) DEALLOCATE(ZRHODJ) +! +! +ELSE +! +! Advance the budget calls +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) THEN + ZW(:,:,:) = PTHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,4,'DEPS_BU_RTH') + ENDIF + IF (LBUDGET_RV) THEN + ZW(:,:,:) = PRVS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,6,'DEPS_BU_RRV') + ENDIF + IF (LBUDGET_RI) THEN + ZW(:,:,:) = PRIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,9,'CNVI_BU_RRI') + CALL BUDGET (ZW,9,'CNVS_BU_RRI') + CALL BUDGET (ZW,9,'AGGS_BU_RRI') + ENDIF + IF (LBUDGET_RS) THEN + ZW(:,:,:) = PRSS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,10,'CNVI_BU_RRS') + CALL BUDGET (ZW,10,'DEPS_BU_RRS') + CALL BUDGET (ZW,10,'CNVS_BU_RRS') + CALL BUDGET (ZW,10,'AGGS_BU_RRS') + ENDIF + IF (LBUDGET_SV) THEN + ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NI,'CNVI_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'CNVS_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'AGGS_BU_RSV') + ENDIF + ENDIF +! +END IF +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- +! +END SUBROUTINE LIMA_COLD_SLOW_PROCESSES diff --git a/src/MNH/lima_functions.f90 b/src/MNH/lima_functions.f90 new file mode 100644 index 000000000..8a7f46893 --- /dev/null +++ b/src/MNH/lima_functions.f90 @@ -0,0 +1,326 @@ +!################################# + MODULE MODI_LIMA_FUNCTIONS +!################################# +! +INTERFACE +! +FUNCTION COUNTJV(LTAB,I1,I2,I3) RESULT(IC) + LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: LTAB + INTEGER, DIMENSION(:), INTENT(INOUT) :: I1,I2,I3 + INTEGER :: IC +END FUNCTION COUNTJV +! +FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) + REAL, INTENT(IN) :: PALPHA + REAL, INTENT(IN) :: PNU + REAL, INTENT(IN) :: PP + REAL :: PMOMG +END FUNCTION MOMG +! +FUNCTION RECT(PA,PB,PX,PX1,PX2) RESULT(PRECT) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PRECT +END FUNCTION RECT +! +FUNCTION DELTA(PA,PB,PX,PX1,PX2) RESULT(PDELTA) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA +END FUNCTION DELTA +! +FUNCTION DELTA_VEC(PA,PB,PX,PX1,PX2) RESULT(PDELTA_VEC) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, DIMENSION(:), INTENT(IN) :: PX1 + REAL, DIMENSION(:), INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA_VEC +END FUNCTION DELTA_VEC +! +SUBROUTINE GAULAG(x,w,n,alf) + INTEGER, INTENT(IN) :: n + REAL, INTENT(IN) :: alf + REAL, DIMENSION(n), INTENT(INOUT) :: w, x +END SUBROUTINE GAULAG +! +SUBROUTINE GAUHER(x,w,n) + INTEGER, INTENT(IN) :: n + REAL, DIMENSION(n), INTENT(INOUT) :: w, x +END SUBROUTINE GAUHER +! +END INTERFACE +! +END MODULE MODI_LIMA_FUNCTIONS +! +!------------------------------------------------------------------------------ +! +!######################################### +FUNCTION COUNTJV(LTAB,I1,I2,I3) RESULT(IC) +!######################################### +! + IMPLICIT NONE +! + LOGICAL, DIMENSION(:,:,:) :: LTAB ! Mask + INTEGER, DIMENSION(:) :: I1,I2,I3 ! Used to replace the COUNT and PACK + INTEGER :: JI,JJ,JK,IC +! + IC = 0 + DO JK = 1,SIZE(LTAB,3) + DO JJ = 1,SIZE(LTAB,2) + DO JI = 1,SIZE(LTAB,1) + IF( LTAB(JI,JJ,JK) ) THEN + IC = IC +1 + I1(IC) = JI + I2(IC) = JJ + I3(IC) = JK + END IF + END DO + END DO + END DO +! +END FUNCTION COUNTJV +! +!------------------------------------------------------------------------------ +! +!########################################### +FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +!########################################### +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! + PMOMG = GAMMA_X0D(PNU+PP/PALPHA)/GAMMA_X0D(PNU) +! +END FUNCTION MOMG +! +!------------------------------------------------------------------------------ +! +!############################################# +FUNCTION RECT(PA,PB,PX,PX1,PX2) RESULT(PRECT) +!############################################# +! +! PRECT takes the value PA if PX1<=PX<PX2, and PB outside the [PX1;PX2[ interval +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PRECT +! + PRECT(:) = PB + WHERE (PX(:).GE.PX1 .AND. PX(:).LT.PX2) + PRECT(:) = PA + END WHERE + RETURN +! +END FUNCTION RECT +! +!------------------------------------------------------------------------------- +! +!############################################### +FUNCTION DELTA(PA,PB,PX,PX1,PX2) RESULT(PDELTA) +!############################################### +! +! PDELTA takes the value PA if PX<PX1, and PB if PX>=PX2 +! PDELTA is a cubic interpolation between PA and PB for PX between PX1 and PX2 +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA +! +!* local variable +! + REAL :: ZA +! + ZA = 6.0*(PA-PB)/(PX2-PX1)**3 + WHERE (PX(:).LT.PX1) + PDELTA(:) = PA + ELSEWHERE (PX(:).GE.PX2) + PDELTA(:) = PB + ELSEWHERE + PDELTA(:) = PA + ZA*PX1**2*(PX1/6.0 - 0.5*PX2) & + + ZA*PX1*PX2* (PX(:)) & + - (0.5*ZA*(PX1+PX2))* (PX(:)**2) & + + (ZA/3.0)* (PX(:)**3) + END WHERE + RETURN +! +END FUNCTION DELTA +! +!------------------------------------------------------------------------------- +! +!####################################################### +FUNCTION DELTA_VEC(PA,PB,PX,PX1,PX2) RESULT(PDELTA_VEC) +!####################################################### +! +! Same as DELTA for vectorized PX1 and PX2 arguments +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, DIMENSION(:), INTENT(IN) :: PX1 + REAL, DIMENSION(:), INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA_VEC +! +!* local variable +! + REAL, DIMENSION(SIZE(PX,1)) :: ZA +! + ZA(:) = 0.0 + wHERE (PX(:)<=PX1(:)) + PDELTA_VEC(:) = PA + ELSEWHERE (PX(:)>=PX2(:)) + PDELTA_VEC(:) = PB + ELSEWHERE + ZA(:) = 6.0*(PA-PB)/(PX2(:)-PX1(:))**3 + PDELTA_VEC(:) = PA + ZA(:)*PX1(:)**2*(PX1(:)/6.0 - 0.5*PX2(:)) & + + ZA(:)*PX1(:)*PX2(:)* (PX(:)) & + - (0.5*ZA(:)*(PX1(:)+PX2(:)))* (PX(:)**2) & + + (ZA(:)/3.0)* (PX(:)**3) + END WHERE + RETURN +! +END FUNCTION DELTA_VEC +! +!------------------------------------------------------------------------------- +! +!########################### +SUBROUTINE gaulag(x,w,n,alf) +!########################### + INTEGER n,MAXIT + REAL alf,w(n),x(n) + DOUBLE PRECISION EPS + PARAMETER (EPS=3.D-14,MAXIT=10) + INTEGER i,its,j + REAL ai + DOUBLE PRECISION p1,p2,p3,pp,z,z1 +! + REAL SUMW +! + do 13 i=1,n + if(i.eq.1)then + z=(1.+alf)*(3.+.92*alf)/(1.+2.4*n+1.8*alf) + else if(i.eq.2)then + z=z+(15.+6.25*alf)/(1.+.9*alf+2.5*n) + else + ai=i-2 + z=z+((1.+2.55*ai)/(1.9*ai)+1.26*ai*alf/(1.+3.5*ai))* & + (z-x(i-2))/(1.+.3*alf) + endif + do 12 its=1,MAXIT + p1=1.d0 + p2=0.d0 + do 11 j=1,n + p3=p2 + p2=p1 + p1=((2*j-1+alf-z)*p2-(j-1+alf)*p3)/j +11 continue + pp=(n*p1-(n+alf)*p2)/z + z1=z + z=z1-p1/pp + if(abs(z-z1).le.EPS)goto 1 +12 continue +1 x(i)=z + w(i)=-exp(gammln(alf+n)-gammln(float(n)))/(pp*n*p2) +13 continue +! +! NORMALISATION +! + SUMW = 0.0 + DO 14 I=1,N + SUMW = SUMW + W(I) +14 CONTINUE + DO 15 I=1,N + W(I) = W(I)/SUMW +15 CONTINUE +! + return +END SUBROUTINE gaulag +! +!------------------------------------------------------------------------------ +! +!########################################## +SUBROUTINE gauher(x,w,n) +!########################################## + INTEGER n,MAXIT + REAL w(n),x(n) + DOUBLE PRECISION EPS,PIM4 + PARAMETER (EPS=3.D-14,PIM4=.7511255444649425D0,MAXIT=10) + INTEGER i,its,j,m + DOUBLE PRECISION p1,p2,p3,pp,z,z1 +! + REAL SUMW +! + m=(n+1)/2 + do 13 i=1,m + if(i.eq.1)then + z=sqrt(float(2*n+1))-1.85575*(2*n+1)**(-.16667) + else if(i.eq.2)then + z=z-1.14*n**.426/z + else if (i.eq.3)then + z=1.86*z-.86*x(1) + else if (i.eq.4)then + z=1.91*z-.91*x(2) + else + z=2.*z-x(i-2) + endif + do 12 its=1,MAXIT + p1=PIM4 + p2=0.d0 + do 11 j=1,n + p3=p2 + p2=p1 + p1=z*sqrt(2.d0/j)*p2-sqrt(dble(j-1)/dble(j))*p3 +11 continue + pp=sqrt(2.d0*n)*p2 + z1=z + z=z1-p1/pp + if(abs(z-z1).le.EPS)goto 1 +12 continue +1 x(i)=z + x(n+1-i)=-z + pp=pp/PIM4 ! NORMALIZATION + w(i)=2.0/(pp*pp) + w(n+1-i)=w(i) +13 continue +! +! NORMALISATION +! + SUMW = 0.0 + DO 14 I=1,N + SUMW = SUMW + W(I) +14 CONTINUE + DO 15 I=1,N + W(I) = W(I)/SUMW +15 CONTINUE +! + return +END SUBROUTINE gauher +! +!------------------------------------------------------------------------------ diff --git a/src/MNH/lima_meyers.f90 b/src/MNH/lima_meyers.f90 new file mode 100644 index 000000000..1751a96eb --- /dev/null +++ b/src/MNH/lima_meyers.f90 @@ -0,0 +1,485 @@ +! ####################### + MODULE MODI_LIMA_MEYERS +! ####################### +! +INTERFACE + SUBROUTINE LIMA_MEYERS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT + !for IMMERSION +! +END SUBROUTINE LIMA_MEYERS +END INTERFACE +END MODULE MODI_LIMA_MEYERS +! +! ###################################################################### + SUBROUTINE LIMA_MEYERS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Phillips (2008). +!! +!! +!!** METHOD +!! ------ +!! The parameterization of Phillips (2008) is based on observed nucleation +!! in the CFDC for a range of T and Si values. Phillips therefore defines a +!! reference activity spectrum, that is, for given T and Si values, the +!! reference concentration of primary ice crystals. +!! +!! The activation of IFN is closely related to their total surface. Thus, +!! the activable fraction of each IFN specie is determined by an integration +!! over the particle size distributions. +!! +!! Subroutine organisation : +!! +!! 1- Preliminary computations +!! 2- Check where computations are necessary, and pack variables +!! 3- Compute the saturation over water and ice +!! 4- Compute the reference activity spectrum +!! -> CALL LIMA_PHILLIPS_REF_SPECTRUM +!! Integrate over the size distributions to compute the IFN activable fraction +!! -> CALL LIMA_PHILLIPS_INTEG +!! 5- Heterogeneous nucleation of insoluble IFN +!! 6- Heterogeneous nucleation of coated IFN +!! 7- Unpack variables & deallocations +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CST +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD +USE MODD_BUDGET +USE MODI_BUDGET +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NI +! +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +!++cb++ +IMPLICIT NONE +!--cb-- +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL ! Loop index +INTEGER :: INEGT ! Case number of nucleation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source + ! by Deposition/Contact +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZSSI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.8 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +IF( INEGT >= 1 ) THEN + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) +! + ALLOCATE(ZCCT(INEGT)) +! + ALLOCATE(ZRVS(INEGT)) + ALLOCATE(ZRCS(INEGT)) + ALLOCATE(ZRIS(INEGT)) +! + ALLOCATE(ZTHS(INEGT)) +! + ALLOCATE(ZCCS(INEGT)) + ALLOCATE(ZINS(INEGT,1)) + ALLOCATE(ZCIS(INEGT)) +! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(INEGT)) + ALLOCATE(ZZX(INEGT)) + ALLOCATE(ZZY(INEGT)) + ALLOCATE(ZLSFACT(INEGT)) + ALLOCATE(ZLVFACT(INEGT)) + ALLOCATE(ZSSI(INEGT)) + ALLOCATE(ZTCELSIUS(INEGT)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZTCELSIUS(:) = MAX( ZZT(:)-XTT,-50.0 ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:)) ) ! es_i + ZSSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) - 1.0 + ! Supersaturation over ice +! +!* compute the heterogeneous nucleation by deposition: RVHNDI +! + DO JL=1,INEGT + ZINS(JL,1) = PINS(I1(JL),I2(JL),I3(JL),1) + END DO + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZY(:) = XNUC_DEP*EXP( XEXSI_DEP*100.*MIN(1.,ZSSI(:))+XEX_DEP)/(PTSTEP*ZRHODREF(:)) + ZZX(:) = MAX( ZZY(:)-ZINS(:,1) , 0.0 ) + ZZW(:) = MIN( XMNU0*ZZX(:) , ZRVS(:) ) + END WHERE +! + ZINS(:,1) = ZINS(:,1) + ZZX(:) + ZW(:,:,:) = PINS(:,:,:,1) + PINS(:,:,:,1) = UNPACK( ZINS(:,1), MASK=GNEGT(:,:,:), FIELD=ZW(:,:,:) ) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RVHNDI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +! +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HIND_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET ( & + UNPACK(ZRVS(:),MASK=GNEGT(:,:,:),FIELD=PRVS)*PRHODJ(:,:,:),& + 6,'HIND_BU_RRV') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GNEGT(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'HIND_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GNEGT(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NI,'HIND_BU_RSV') + END IF + END IF +! +!* compute the heterogeneous nucleation by contact: RVHNCI +! + DO JL=1,INEGT + ZINS(JL,1) = PINS(I1(JL),I2(JL),I3(JL),1) + END DO + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-2.0 .AND. ZCCT(:)>XCTMIN(2) .AND. ZRCT(:)>XRTMIN(2) ) + ZZY(:) = MIN( XNUC_CON * EXP( XEXTT_CON*ZTCELSIUS(:)+XEX_CON ) & + /(PTSTEP*ZRHODREF(:)) , ZCCS(:) ) + ZZX(:) = MAX( ZZY(:)-ZINS(:,1),0.0 ) + ZZW(:) = MIN( (ZRCT(:)/ZCCT(:))*ZZX(:),ZRCS(:) ) + END WHERE +! + ZINS(:,1) = ZINS(:,1) + ZZX(:) + ZW(:,:,:) = PINS(:,:,:,1) + PINS(:,:,:,1) = UNPACK( ZINS(:,1), MASK=GNEGT(:,:,:), FIELD=ZW(:,:,:) ) +! + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RVHNCI)) + ZCCS(:) = ZCCS(:) - ZZX(:) + ZCIS(:) = ZCIS(:) + ZZX(:) +! +!* unpack variables +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)*PRHODJ(:,:,:), 4,'HINC_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:), 7,'HINC_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:), 9,'HINC_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'HINC_BU_RSV') + CALL BUDGET ( PCIS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NI,'HINC_BU_RSV') + END IF + END IF + +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZCCT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRIS) +! + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZINS) + DEALLOCATE(ZCIS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZSSI) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) +! +ELSE +! +! Advance the budget calls +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) THEN + ZW(:,:,:) = PTHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,4,'HIND_BU_RTH') + CALL BUDGET (ZW,4,'HINC_BU_RTH') + ENDIF + IF (LBUDGET_RV) THEN + ZW(:,:,:) = PRVS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,6,'HIND_BU_RRV') + ENDIF + IF (LBUDGET_RC) THEN + ZW(:,:,:) = PRCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,7,'HINC_BU_RRC') + ENDIF + IF (LBUDGET_RI) THEN + ZW(:,:,:) = PRIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,9,'HIND_BU_RRI') + CALL BUDGET (ZW,9,'HINC_BU_RRI') + ENDIF + IF (LBUDGET_SV) THEN + ZW(:,:,:) = PCCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NC,'HINC_BU_RSV') + ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HIND_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HINC_BU_RSV') + END IF + END IF +! +END IF + + + + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_MEYERS diff --git a/src/MNH/lima_mixed.f90 b/src/MNH/lima_mixed.f90 new file mode 100644 index 000000000..e557a1c3f --- /dev/null +++ b/src/MNH/lima_mixed.f90 @@ -0,0 +1,809 @@ +! ###################### + MODULE MODI_LIMA_MIXED +! ###################### +! +INTERFACE + SUBROUTINE LIMA_MIXED (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS ) +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integration for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t + +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +END SUBROUTINE LIMA_MIXED +END INTERFACE +END MODULE MODI_LIMA_MIXED +! +! ####################################################################### + SUBROUTINE LIMA_MIXED (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! microphysical processes +!! +!! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST, ONLY : XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & + XCL, XCI, XTT, XLSTT, XLVTT, & + XALPI, XBETAI, XGAMI +USE MODD_PARAM_LIMA, ONLY : NMOD_IFN, XRTMIN, XCTMIN, LWARM, LCOLD, & + NMOD_CCN, NMOD_IMM, LRAIN, LHAIL +USE MODD_PARAM_LIMA_WARM, ONLY : XLBC, XLBEXC, XLBR, XLBEXR +USE MODD_PARAM_LIMA_COLD, ONLY : XLBI, XLBEXI, XLBS, XLBEXS, XSCFAC +USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBH, XLBEXH +!USE MODD_BUDGET, ONLY : LBU_ENABLE, NBUMOD +! +USE MODD_NSV +! +USE MODD_BUDGET +USE MODI_BUDGET +! +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +USE MODI_LIMA_MIXED_SLOW_PROCESSES +USE MODI_LIMA_MIXED_FAST_PROCESSES +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integration for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t + +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +!* 0.2 Declarations of local variables : +! +!3D microphysical variables +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Snow/aggregate m.r. at t + PRGT, & ! Graupel m.r. at t + PRHT, & ! Hail m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Pristine ice m.r. source + PRSS, & ! Snow/aggregate m.r. source + PRGS, & ! Graupel m.r. source + PRHS, & ! Hail m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + PCIT, & ! Ice crystal C. at t + ! + PCCS, & ! Cloud water C. source + PCRS, & ! Rain water C. source + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), ALLOCATABLE :: PNHS ! Hom. freezing of CCN +! +! Replace PACK +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GMICRO +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed microphysical variables +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRHT ! Hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source +! +! Other packed variables +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZSSI, & ! Supersaturation over ice + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZLBDAR, & ! Slope parameter of the raindrop distr. + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZLBDAS, & ! Slope parameter of the aggregate distr. + ZLBDAG, & ! Slope parameter of the graupel distr. + ZLBDAH, & ! Slope parameter of the hail distr. + ZAI, & ! Thermodynamical function + ZCJ, & ! used to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV ! Diffusivity of water vapor in the air +! +! 3D Temperature +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZT, ZW +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JMOD_IFN ! Loop index +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +PRHT(:,:,:) = 0. +PRHS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +IF ( KRR .GE. 7 ) PRHT(:,:,:) = PRT(:,:,:,7) +IF ( KRR .GE. 7 ) PRHS(:,:,:) = PRS(:,:,:,7) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNFS(:,:,:,:) = 0. + PNAS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +ELSE + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PIFS(:,:,:,:) = 0. + PINS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +ELSE + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNIS(:,:,:,:) = 0.0 +END IF +! +IF ( OHHONI ) THEN + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) +ELSE + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = 0.0 +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. Pack variables, computations only where necessary +! ------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Looking for regions where computations are necessary +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(6) .OR. & + PRHT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(7) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN +! + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) + ALLOCATE(ZRHT(IMICRO)) + ! + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCRT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) + ! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) + ALLOCATE(ZRGS(IMICRO)) + ALLOCATE(ZRHS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) + ! + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) + ALLOCATE(ZIFS(IMICRO,NMOD_IFN)) + ALLOCATE(ZINS(IMICRO,NMOD_IFN)) + ! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + DO JMOD_IFN = 1, NMOD_IFN + ZIFS(JL,JMOD_IFN) = PIFS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ZINS(JL,JMOD_IFN) = PINS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ENDDO + ! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + ALLOCATE(ZRHODJ(IMICRO)) + ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) ) + END IF +! +! Atmospheric parameters +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +! + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +! +! Thermodynamical function ZAI = A_i(T,P) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! ZCJ = c^prime_j (in the ventilation factor) + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +! +! Particle distribution parameters +! + ALLOCATE(ZLBDAC(IMICRO)) + ALLOCATE(ZLBDAR(IMICRO)) + ALLOCATE(ZLBDAI(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZLBDAG(IMICRO)) + ALLOCATE(ZLBDAH(IMICRO)) + ZLBDAC(:) = 1.E10 + WHERE (ZRCT(:)>XRTMIN(2) .AND. ZCCT(:)>XCTMIN(2)) + ZLBDAC(:) = ( XLBC*ZCCT(:) / ZRCT(:) )**XLBEXC + END WHERE + ZLBDAR(:) = 1.E10 + WHERE (ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3)) + ZLBDAR(:) = ( XLBR*ZCRT(:) / ZRRT(:) )**XLBEXR + END WHERE + ZLBDAI(:) = 1.E10 + WHERE (ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI + END WHERE + ZLBDAS(:) = 1.E10 + WHERE (ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS + END WHERE + ZLBDAG(:) = 1.E10 + WHERE (ZRGT(:)>XRTMIN(6) ) + ZLBDAG(:) = XLBG*( ZRHODREF(:)*ZRGT(:) )**XLBEXG + END WHERE + ZLBDAH(:) = 1.E10 + WHERE (ZRHT(:)>XRTMIN(7) ) + ZLBDAH(:) = XLBH*( ZRHODREF(:)*ZRHT(:) )**XLBEXH + END WHERE +! +!------------------------------------------------------------------------------- +! +! +!* 2. Compute the slow processes involving cloud water and graupel +! ------------------------------------------------------------ +! + CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + ZRHODJ, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS ) +! +!------------------------------------------------------------------------------- +! +! +! 3. Compute the fast RS and RG processes +! ------------------------------------ +! + CALL LIMA_MIXED_FAST_PROCESSES(ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +! +!------------------------------------------------------------------------------- +! +! +! +! 4. Unpack variables +! ---------------- +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRSS(:,:,:) + PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRGS(:,:,:) + PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRHS(:,:,:) + PRHS(:,:,:) = UNPACK( ZRHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DO JMOD_IFN = 1, NMOD_IFN + ZW(:,:,:) = PIFS(:,:,:,JMOD_IFN) + PIFS(:,:,:,JMOD_IFN) = UNPACK( ZIFS(:,JMOD_IFN),MASK=GMICRO(:,:,:), & + FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PINS(:,:,:,JMOD_IFN) + PINS(:,:,:,JMOD_IFN) = UNPACK( ZINS(:,JMOD_IFN),MASK=GMICRO(:,:,:), & + FIELD=ZW(:,:,:) ) + ENDDO +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) + DEALLOCATE(ZRHT) +! + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZCIT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZRGS) + DEALLOCATE(ZRHS) + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZIFS) + DEALLOCATE(ZINS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) +! + DEALLOCATE(ZZW) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSSI) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) +! + DEALLOCATE(ZLBDAC) + DEALLOCATE(ZLBDAR) + DEALLOCATE(ZLBDAI) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZLBDAG) + DEALLOCATE(ZLBDAH) +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) DEALLOCATE(ZRHODJ) +! +! +ELSE +! +! Advance the budget calls +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) THEN + ZW(:,:,:) = PTHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,4,'DEPG_BU_RTH') + CALL BUDGET (ZW,4,'IMLT_BU_RTH') + CALL BUDGET (ZW,4,'BERFI_BU_RTH') + CALL BUDGET (ZW,4,'RIM_BU_RTH') + CALL BUDGET (ZW,4,'ACC_BU_RTH') + CALL BUDGET (ZW,4,'CFRZ_BU_RTH') + CALL BUDGET (ZW,4,'WETG_BU_RTH') + CALL BUDGET (ZW,4,'DRYG_BU_RTH') + CALL BUDGET (ZW,4,'GMLT_BU_RTH') + IF (LHAIL) CALL BUDGET (ZW,4,'WETH_BU_RTH') + IF (LHAIL) CALL BUDGET (ZW,4,'HMLT_BU_RTH') + ENDIF + IF (LBUDGET_RV) THEN + ZW(:,:,:) = PRVS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,6,'DEPG_BU_RRV') + ENDIF + IF (LBUDGET_RC) THEN + ZW(:,:,:) = PRCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,7,'IMLT_BU_RRC') + CALL BUDGET (ZW,7,'BERFI_BU_RRC') + CALL BUDGET (ZW,7,'RIM_BU_RRC') + CALL BUDGET (ZW,7,'WETG_BU_RRC') + CALL BUDGET (ZW,7,'DRYG_BU_RRC') + IF (LHAIL) CALL BUDGET (ZW,7,'WETH_BU_RRC') + ENDIF + IF (LBUDGET_RR) THEN + ZW(:,:,:) = PRRS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,8,'ACC_BU_RRR') + CALL BUDGET (ZW,8,'CFRZ_BU_RRR') + CALL BUDGET (ZW,8,'WETG_BU_RRR') + CALL BUDGET (ZW,8,'DRYG_BU_RRR') + CALL BUDGET (ZW,8,'GMLT_BU_RRR') + IF (LHAIL) CALL BUDGET (ZW,8,'WETH_BU_RRR') + IF (LHAIL) CALL BUDGET (ZW,8,'HMLT_BU_RRR') + ENDIF + IF (LBUDGET_RI) THEN + ZW(:,:,:) = PRIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,9,'IMLT_BU_RRI') + CALL BUDGET (ZW,9,'BERFI_BU_RRI') + CALL BUDGET (ZW,9,'HMS_BU_RRI') + CALL BUDGET (ZW,9,'CFRZ_BU_RRI') + CALL BUDGET (ZW,9,'WETG_BU_RRI') + CALL BUDGET (ZW,9,'DRYG_BU_RRI') + CALL BUDGET (ZW,9,'HMG_BU_RRI') + IF (LHAIL) CALL BUDGET (ZW,9,'WETH_BU_RRI') + ENDIF + IF (LBUDGET_RS) THEN + ZW(:,:,:) = PRSS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,10,'RIM_BU_RRS') + CALL BUDGET (ZW,10,'HMS_BU_RRS') + CALL BUDGET (ZW,10,'ACC_BU_RRS') + CALL BUDGET (ZW,10,'CMEL_BU_RRS') + CALL BUDGET (ZW,10,'WETG_BU_RRS') + CALL BUDGET (ZW,10,'DRYG_BU_RRS') + IF (LHAIL) CALL BUDGET (ZW,10,'WETH_BU_RRS') + ENDIF + IF (LBUDGET_RG) THEN + ZW(:,:,:) = PRGS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,11,'DEPG_BU_RRG') + CALL BUDGET (ZW,11,'RIM_BU_RRG') + CALL BUDGET (ZW,11,'ACC_BU_RRG') + CALL BUDGET (ZW,11,'CMEL_BU_RRG') + CALL BUDGET (ZW,11,'CFRZ_BU_RRG') + CALL BUDGET (ZW,11,'WETG_BU_RRG') + CALL BUDGET (ZW,11,'DRYG_BU_RRG') + CALL BUDGET (ZW,11,'HMG_BU_RRG') + CALL BUDGET (ZW,11,'GMLT_BU_RRG') + IF (LHAIL) CALL BUDGET (ZW,11,'WETH_BU_RRG') + IF (LHAIL) CALL BUDGET (ZW,11,'COHG_BU_RRG') + ENDIF + IF (LBUDGET_RH) THEN + ZW(:,:,:) = PRHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12,'WETG_BU_RRH') + IF (LHAIL) CALL BUDGET (ZW,12,'WETH_BU_RRH') + IF (LHAIL) CALL BUDGET (ZW,12,'COHG_BU_RRH') + IF (LHAIL) CALL BUDGET (ZW,12,'HMLT_BU_RRH') + ENDIF + IF (LBUDGET_SV) THEN + ZW(:,:,:) = PCCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NC,'IMLT_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NC,'RIM_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NC,'WETG_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NC,'DRYG_BU_RSV') + IF (LHAIL) CALL BUDGET (ZW,12+NSV_LIMA_NC,'WETH_BU_RSV') +! + ZW(:,:,:) = PCRS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NR,'ACC_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NR,'CFRZ_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NR,'WETG_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NR,'DRYG_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NR,'GMLT_BU_RSV') + IF (LHAIL) CALL BUDGET (ZW,12+NSV_LIMA_NR,'WETH_BU_RSV') + IF (LHAIL) CALL BUDGET (ZW,12+NSV_LIMA_NR,'HMLT_BU_RSV') +! + ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NI,'IMLT_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HMS_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'CFRZ_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'WETG_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'DRYG_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HMG_BU_RSV') + IF (LHAIL) CALL BUDGET (ZW,12+NSV_LIMA_NI,'WETH_BU_RSV') + ENDIF + ENDIF +! +END IF ! IMICRO >= 1 +! +!------------------------------------------------------------------------------ +! +! +!* 5. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +IF ( KRR .GE. 7 ) PRS(:,:,:,7) = PRHS(:,:,:) +! +! Prepare 3D number concentrations +! +PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF +! +!++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +IF (ALLOCATED(PNHS)) DEALLOCATE(PNHS) +!--cb-- +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_MIXED diff --git a/src/MNH/lima_mixed_fast_processes.f90 b/src/MNH/lima_mixed_fast_processes.f90 new file mode 100644 index 000000000..e7b9d55fe --- /dev/null +++ b/src/MNH/lima_mixed_fast_processes.f90 @@ -0,0 +1,1321 @@ +! ##################################### + MODULE MODI_LIMA_MIXED_FAST_PROCESSES +! ##################################### +! +INTERFACE + SUBROUTINE LIMA_MIXED_FAST_PROCESSES (ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZPRES ! Pressure +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZKA ! Thermal conductivity of the air +REAL, DIMENSION(:), INTENT(IN) :: ZDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! Ventilation coefficient ? +! +REAL, DIMENSION(:), INTENT(IN) :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAC ! Slope param of the cloud droplet distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAR ! Slope param of the raindrop distr +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAS ! Slope param of the aggregate distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope param of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope param of the hail distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: ZRHODJ +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +! +END SUBROUTINE LIMA_MIXED_FAST_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_MIXED_FAST_PROCESSES +! +! ####################################################################### + SUBROUTINE LIMA_MIXED_FAST_PROCESSES (ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! fast processes : +!! +!! - Fast RS processes : +!! - Cloud droplet riming of the aggregates +!! - Hallett-Mossop ice multiplication process due to snow riming +!! - Rain accretion onto the aggregates +!! - Conversion-Melting of the aggregates +!! +!! - Fast RG processes : +!! - Rain contact freezing +!! - Wet/Dry growth of the graupel +!! - Hallett-Mossop ice multiplication process due to graupel riming +!! - Melting of the graupeln +!! +!! +!!** METHOD +!! ------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +! +USE MODD_NSV +USE MODD_BUDGET +USE MODI_BUDGET +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZPRES ! Pressure +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZKA ! Thermal conductivity of the air +REAL, DIMENSION(:), INTENT(IN) :: ZDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! Ventilation coefficient ? +! +REAL, DIMENSION(:), INTENT(IN) :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAC ! Slope param of the cloud droplet distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAR ! Slope param of the raindrop distr +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAS ! Slope param of the aggregate distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope param of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope param of the hail distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: ZRHODJ +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS + +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(ZZT)) :: GRIM, GACC, GDRY, GWET, GHAIL ! Test where to compute +INTEGER :: IGRIM, IGACC, IGDRY, IGWET, IHAIL +INTEGER :: JJ +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors +REAL, DIMENSION(SIZE(ZZT)) :: ZZW, ZZX +REAL, DIMENSION(SIZE(ZZT)) :: ZRDRYG, ZRWETG +REAL, DIMENSION(SIZE(ZZT),7) :: ZZW1 +REAL :: NHAIL +REAL :: ZTHRH, ZTHRC +! +!------------------------------------------------------------------------------- +! +! ################# +! FAST RS PROCESSES +! ################# +! +IF (LSNOW) THEN +! +! +!* 1.1 Cloud droplet riming of the aggregates +! ------------------------------------------- +! +! +ZZW1(:,:) = 0.0 +! +GRIM(:) = (ZRCT(:)>0.0) .AND. (ZRST(:)>0.0) .AND. (ZRCS(:)>0.0) .AND. (ZZT(:)<XTT) +IGRIM = COUNT( GRIM(:) ) +! +IF( IGRIM>0 ) THEN +! +! 1.1.0 allocations +! + ALLOCATE(ZVEC1(IGRIM)) + ALLOCATE(ZVEC2(IGRIM)) + ALLOCATE(IVEC1(IGRIM)) + ALLOCATE(IVEC2(IGRIM)) +! +! 1.1.1 select the ZLBDAS +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GRIM(:) ) +! +! 1.1.2 find the next lower indice for the ZLBDAS in the geometrical +! set of Lbda_s used to tabulate some moments of the incomplete +! gamma function +! + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( FLOAT(NGAMINC)-0.00001, & + XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - FLOAT( IVEC2(1:IGRIM) ) +! +! 1.1.3 perform the linear interpolation of the normalized +! "2+XDS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +! 1.1.4 riming of the small sized aggregates +! + WHERE ( GRIM(:) ) + ZZW1(:,1) = MIN( ZRCS(:), & + XCRIMSS * ZZW(:) * ZRCT(:) & ! RCRIMSS + * ZLBDAS(:)**XEXCRIMSS & + * ZRHODREF(:)**(-XCEXVT) ) + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRSS(:) = ZRSS(:) + ZZW1(:,1) + ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/ZRCT(:)),0.0 ) ! Lambda_c**3 + END WHERE +! +! 1.1.5 perform the linear interpolation of the normalized +! "XBS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +! 1.1.6 riming-conversion of the large sized aggregates into graupeln +! +! + WHERE ( GRIM(:) .AND. (ZRSS(:)>0.0) ) + ZZW1(:,2) = MIN( ZRCS(:), & + XCRIMSG * ZRCT(:) & ! RCRIMSG + * ZLBDAS(:)**XEXCRIMSG & + * ZRHODREF(:)**(-XCEXVT) & + - ZZW1(:,1) ) + ZZW1(:,3) = MIN( ZRSS(:), & + XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG + * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:))) + ZRCS(:) = ZRCS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2) + ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,2)*(ZCCT(:)/ZRCT(:)),0.0 ) ! Lambda_c**3 + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & + 4,'RIM_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'RIM_BU_RRC') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'RIM_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'RIM_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET (UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NC,'RIM_BU_RSV') + END IF +END IF +! +! +!* 1.2 Hallett-Mossop ice multiplication process due to snow riming +! ----------------------------------------------------------------- +! +! +GRIM(:) = (ZZT(:)<XHMTMAX) .AND. (ZZT(:)>XHMTMIN) & + .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRCT(:)>XRTMIN(2)) +IGRIM = COUNT( GRIM(:) ) +IF( IGRIM>0 ) THEN + ALLOCATE(ZVEC1(IGRIM)) + ALLOCATE(ZVEC2(IGRIM)) + ALLOCATE(IVEC2(IGRIM)) +! + ZVEC1(:) = PACK( ZLBDAC(:),MASK=GRIM(:) ) + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( FLOAT(NGAMINC)-0.00001, & + XHMLINTP1 * LOG( ZVEC1(1:IGRIM) ) + XHMLINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - FLOAT( IVEC2(1:IGRIM) ) + ZVEC1(1:IGRIM) = XGAMINC_HMC( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_HMC( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZX(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) ! Large droplets +! + WHERE ( GRIM(:) .AND. ZZX(:)<0.99 ) + ZZW1(:,5) = (ZZW1(:,1)+ZZW1(:,2))*(ZCCT(:)/ZRCT(:))*(1.0-ZZX(:))* & + XHM_FACTS* & + MAX( 0.0, MIN( (ZZT(:)-XHMTMIN)/3.0,(XHMTMAX-ZZT(:))/2.0 ) ) ! CCHMSI + ZCIS(:) = ZCIS(:) + ZZW1(:,5) +! + ZZW1(:,6) = ZZW1(:,5) * XMNU0 ! RCHMSI + ZRIS(:) = ZRIS(:) + ZZW1(:,6) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO,FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'HMS_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO,FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'HMS_BU_RRS') + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCIS(:),MASK=GMICRO,FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'HMS_BU_RSV') +END IF +! +! +!* 1.3 Rain accretion onto the aggregates +! --------------------------------------- +! +! +ZZW1(:,2:3) = 0.0 +GACC(:) = (ZRRT(:)>0.0) .AND. (ZRST(:)>0.0) .AND. (ZRRS(:)>0.0) .AND. (ZZT(:)<XTT) +IGACC = COUNT( GACC(:) ) +! +IF( IGACC>0 ) THEN +! +! 1.3.0 allocations +! + ALLOCATE(ZVEC1(IGACC)) + ALLOCATE(ZVEC2(IGACC)) + ALLOCATE(ZVEC3(IGACC)) + ALLOCATE(IVEC1(IGACC)) + ALLOCATE(IVEC2(IGACC)) +! +! 1.3.1 select the (ZLBDAS,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) ) +! +! 1.3.2 find the next lower indice for the ZLBDAS and for the ZLBDAR +! in the geometrical set of (Lbda_s,Lbda_r) couplet use to +! tabulate the RACCSS-kernel +! + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAS)-0.00001, & + XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - FLOAT( IVEC1(1:IGACC) ) +! + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAR)-0.00001, & + XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - FLOAT( IVEC2(1:IGACC) ) +! +! 1.3.3 perform the bilinear interpolation of the normalized +! RACCSS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! +! 1.3.4 raindrop accretion on the small sized aggregates +! + WHERE ( GACC(:) ) + ZZW1(:,2) = & !! coef of RRACCS + XFRACCSS*( ZLBDAS(:)**XCXS )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRACCS1/((ZLBDAS(:)**2) ) + & + XLBRACCS2/( ZLBDAS(:) * ZLBDAR(:) ) + & + XLBRACCS3/( (ZLBDAR(:)**2)) )/ZLBDAR(:)**3 + ZZW1(:,4) = MIN( ZRRS(:),ZZW1(:,2)*ZZW(:) ) ! RRACCSS + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRSS(:) = ZRSS(:) + ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) +! + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 + END WHERE +! +! 1.3.4b perform the bilinear interpolation of the normalized +! RACCS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO + ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) !! RRACCS +! +! 1.3.5 perform the bilinear interpolation of the normalized +! SACCRG-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! +! 1.3.6 raindrop accretion-conversion of the large sized aggregates +! into graupeln +! + WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) ) + ZZW1(:,2) = MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ) ! RRACCSG + ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG + ( ZLBDAS(:)**(XCXS-XBS) )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSACCR1/((ZLBDAR(:)**2) ) + & + XLBSACCR2/( ZLBDAR(:) * ZLBDAS(:) ) + & + XLBSACCR3/( (ZLBDAS(:)**2)) ) ) + ZRRS(:) = ZRRS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSG)) +! + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,2)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'ACC_BU_RTH') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'ACC_BU_RRR') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'ACC_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'ACC_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET (UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'ACC_BU_RSV') + END IF +END IF +! +! +!* 1.4 Conversion-Melting of the aggregates +! ----------------------------------------- +! +! +ZZW(:) = 0.0 +WHERE( (ZRST(:)>0.0) .AND. (ZRSS(:)>0.0) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RSMLT +! + ZZW(:) = MIN( ZRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) * & + ( X0DEPS* ZLBDAS(:)**XEX0DEPS + & + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) +! +! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) +! because the graupeln produced by this process are still icy!!! +! + ZRSS(:) = ZRSS(:) - ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) +END WHERE +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'CMEL_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'CMEL_BU_RRG') +END IF +! +END IF ! LSNOW +! +!------------------------------------------------------------------------------ +! +! ################# +! FAST RG PROCESSES +! ################# +! +! +!* 2.1 Rain contact freezing +! -------------------------- +! +! +ZZW1(:,3:4) = 0.0 +WHERE( (ZRIT(:)>0.0) .AND. (ZRRT(:)>0.0) .AND. (ZRIS(:)>0.0) .AND. (ZRRS(:)>0.0) ) + ZZW1(:,3) = MIN( ZRIS(:),XICFRR * ZRIT(:) * ZCRT(:) & ! RICFRRG + * ZLBDAR(:)**XEXICFRR & + * ZRHODREF(:)**(-XCEXVT-1.0) ) +! + ZZW1(:,4) = MIN( ZRRS(:),XRCFRI * ZCIT(:) * ZCRT(:) & ! RRCFRIG + * ZLBDAR(:)**XEXRCFRI & + * ZRHODREF(:)**(-XCEXVT-2.0) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZZW1(:,3)+ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*RRCFRIG) +! + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,3)*(ZCIT(:)/ZRIT(:)),0.0 ) ! CICFRRG + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! CRCFRIG +END WHERE +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & + 4,'CFRZ_BU_RTH') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'CFRZ_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'CFRZ_BU_RRI') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'CFRZ_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'CFRZ_BU_RSV') + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'CFRZ_BU_RSV') + END IF +END IF +! +! +!* 2.2 Compute the Dry growth case +! -------------------------------- +! +! +ZZW1(:,:) = 0.0 +WHERE( ((ZRCT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRCS(:)>0.0)) .OR. & + ((ZRIT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRIS(:)>0.0)) ) + ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT) + ZZW1(:,1) = MIN( ZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) ) ! RCDRYG + ZZW1(:,2) = MIN( ZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) & + * ZRIT(:) * ZZW(:) ) ! RIDRYG +END WHERE +! +!* 2.2.1 accretion of aggregates on the graupeln +! ---------------------------------------------- +! +GDRY(:) = (ZRST(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRSS(:)>0.0) +IGDRY = COUNT( GDRY(:) ) +! +IF( IGDRY>0 ) THEN +! +!* 2.2.2 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 2.2.3 select the (ZLBDAG,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) ) +! +!* 2.2.4 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( FLOAT(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - FLOAT( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( FLOAT(NDRYLBDAS)-0.00001, & + XDRYINTP1S * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2S ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) ) +! +!* 2.2.5 perform the bilinear interpolation of the normalized +! SDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! + WHERE( GDRY(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG + * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & + XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & + XLBSDRYG3/( ZLBDAS(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +!* 2.2.6 accretion of raindrops on the graupeln +! --------------------------------------------- +! +GDRY(:) = (ZRRT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRRS(:)>0.0) +IGDRY = COUNT( GDRY(:) ) +! +IF( IGDRY>0 ) THEN +! +!* 2.2.7 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 2.2.8 select the (ZLBDAG,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) ) +! +!* 2.2.9 find the next lower indice for the ZLBDAG and for the ZLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( FLOAT(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - FLOAT( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( FLOAT(NDRYLBDAR)-0.00001, & + XDRYINTP1R * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2R ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) ) +! +!* 2.2.10 perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! + WHERE( GDRY(:) ) + ZZW1(:,4) = MIN( ZRRS(:),XFRDRYG*ZZW(:) & ! RRDRYG + *( ZLBDAR(:)**(-3) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRDRYG1/( ZLBDAG(:)**2 ) + & + XLBRDRYG2/( ZLBDAG(:) * ZLBDAR(:) ) + & + XLBRDRYG3/( ZLBDAR(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) +! +! +!* 2.3 Compute the Wet growth case +! -------------------------------- +! +! +ZZW(:) = 0.0 +ZRWETG(:) = 0.0 +WHERE( ZRGT(:)>0.0 ) + ZZW1(:,5) = MIN( ZRIS(:), & + ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG + ZZW1(:,6) = MIN( ZRSS(:), & + ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(ZZT(:)-XTT)) ) ) ! RSWETG +! + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RWETG +! + ZRWETG(:) = MAX( 0.0, & + ( ZZW(:) * ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + & + ( ZZW1(:,5)+ZZW1(:,6) ) * & + ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:))) ) ) / & + ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) +END WHERE +! +! +!* 2.4 Select Wet or Dry case +! --------------------------- +! +! +! Wet case and partial conversion to hail +! +ZZW(:) = 0.0 +NHAIL = 0. +IF (LHAIL) NHAIL = 1. +WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + .AND. ZRDRYG(:)>=ZRWETG(:) .AND. ZRWETG(:)>0.0 ) +! + ZZW(:) = ZRWETG(:) - ZZW1(:,5) - ZZW1(:,6) ! RCWETG+RRWETG +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,7) = MAX( 0.0,MIN( ZZW(:),ZRRS(:)+ZZW1(:,1) ) ) + ZZX(:) = ZZW1(:,7) / ZZW(:) + ZZW1(:,5) = ZZW1(:,5)*ZZX(:) + ZZW1(:,6) = ZZW1(:,6)*ZZX(:) + ZRWETG(:) = ZZW1(:,7) + ZZW1(:,5) + ZZW1(:,6) +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,5) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) +! +! assume a linear percent of conversion of graupel into hail +! + ZRGS(:) = ZRGS(:) + ZRWETG(:) + ZZW(:) = ZRGS(:)*ZRDRYG(:)*NHAIL/(ZRWETG(:)+ZRDRYG(:)) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,7) + ZZW1(:,1) ) + ZTHS(:) = ZTHS(:) + ZZW1(:,7)*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,5)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-MAX( ZZW1(:,7)-ZZW1(:,1),0.0 ) & + *(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) +END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'WETG_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'WETG_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'WETG_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'WETG_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'WETG_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'WETG_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET ( & + UNPACK(ZRHS(:),MASK=GMICRO(:,:,:),FIELD=PRHS)*PRHODJ(:,:,:), & + 12,'WETG_BU_RRH') + IF (LBUDGET_SV) THEN + CALL BUDGET (UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NC,'WETG_BU_RSV') + CALL BUDGET (UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'WETG_BU_RSV') + CALL BUDGET (UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'WETG_BU_RSV') + END IF + END IF +! +! Dry case +! +WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + .AND. ZRDRYG(:)<ZRWETG(:) .AND. ZRDRYG(:)>0.0 ) ! case + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZRDRYG(:) + ZTHS(:) = ZTHS(:) + (ZZW1(:,1)+ZZW1(:,4))*(ZLSFACT(:)-ZLVFACT(:)) ! + ! f(L_f*(RCDRYG+RRDRYG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,2)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) + ! Approximate rates +END WHERE +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'DRYG_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'DRYG_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'DRYG_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'DRYG_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'DRYG_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'DRYG_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NC,'DRYG_BU_RSV') + CALL BUDGET ( UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'DRYG_BU_RSV') + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'DRYG_BU_RSV') + END IF +END IF +! +! +!* 2.5 Hallett-Mossop ice multiplication process due to graupel riming +! -------------------------------------------------------------------- +! +! +GDRY(:) = (ZZT(:)<XHMTMAX) .AND. (ZZT(:)>XHMTMIN) .AND. (ZRDRYG(:)<ZZW(:))& + .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRCT(:)>XRTMIN(2)) +IGDRY = COUNT( GDRY(:) ) +IF( IGDRY>0 ) THEN + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! + ZVEC1(:) = PACK( ZLBDAC(:),MASK=GDRY(:) ) + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( FLOAT(NGAMINC)-0.00001, & + XHMLINTP1 * LOG( ZVEC1(1:IGDRY) ) + XHMLINTP2 ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) ) + ZVEC1(1:IGDRY) = XGAMINC_HMC( IVEC2(1:IGDRY)+1 )* ZVEC2(1:IGDRY) & + - XGAMINC_HMC( IVEC2(1:IGDRY) )*(ZVEC2(1:IGDRY) - 1.0) + ZZX(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GDRY,FIELD=0.0 ) ! Large droplets +! + WHERE ( GDRY(:) .AND. ZZX(:)<0.99 ) ! Dry case + ZZW1(:,5) = ZZW1(:,1)*(ZCCT(:)/ZRCT(:))*(1.0-ZZX(:))*XHM_FACTG* & + MAX( 0.0, MIN( (ZZT(:)-XHMTMIN)/3.0,(XHMTMAX-ZZT(:))/2.0 ) ) ! CCHMGI + ZCIS(:) = ZCIS(:) + ZZW1(:,5) +! + ZZW1(:,6) = ZZW1(:,5) * XMNU0 ! RCHMGI + ZRIS(:) = ZRIS(:) + ZZW1(:,6) + ZRGS(:) = ZRGS(:) - ZZW1(:,6) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO,FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'HMG_BU_RRI') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO,FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'HMG_BU_RRG') + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCIS(:),MASK=GMICRO,FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'HMG_BU_RSV') +END IF +! +! +!* 2.6 Melting of the graupeln +! ---------------------------- +! +! +ZZW(:) = 0.0 +WHERE( (ZRGT(:)>0.0) .AND. (ZRGS(:)>0.0) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RGMLTR +! + ZZW(:) = MIN( ZRGS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RGMLTR)) +! +! ZCRS(:) = MAX( ZCRS(:) + ZZW(:)*(XCCG*ZLBDAG(:)**XCXG/ZRGT(:)),0.0 ) + ZCRS(:) = ZCRS(:) + ZZW(:)*5.0E6 ! obtained after averaging + ! Dshed=1mm and 500 microns +END WHERE +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'GMLT_BU_RTH') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'GMLT_BU_RRR') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'GMLT_BU_RRG') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'GMLT_BU_RSV') + END IF +END IF +! +! +!------------------------------------------------------------------------------ +! +! ################# +! FAST RH PROCESSES +! ################# +! +! +IF (LHAIL) THEN +! +GHAIL(:) = ZRHT(:)>XRTMIN(7) +IHAIL = COUNT(GHAIL(:)) +! +IF( IHAIL>0 ) THEN +! +!* 3.1 Wet growth of hail +! ---------------------------- +! + ZZW1(:,:) = 0.0 + WHERE( GHAIL(:) .AND. ( (ZRCT(:)>XRTMIN(2) .AND. ZRCS(:)>0.0) .OR. & + (ZRIT(:)>XRTMIN(4) .AND. ZRIS(:)>0.0) ) ) + ZZW(:) = ZLBDAH(:)**(XCXH-XDH-2.0) * ZRHODREF(:)**(-XCEXVT) + ZZW1(:,1) = MIN( ZRCS(:),XFWETH * ZRCT(:) * ZZW(:) ) ! RCWETH + ZZW1(:,2) = MIN( ZRIS(:),XFWETH * ZRIT(:) * ZZW(:) ) ! RIWETH + END WHERE +! +!* 3.1.1 accretion of aggregates on the hailstones +! ------------------------------------------------ +! + GWET(:) = GHAIL(:) .AND. (ZRST(:)>XRTMIN(5) .AND. ZRSS(:)>0.0) + IGWET = COUNT( GWET(:) ) +! + IF( IGWET>0 ) THEN +! +!* 3.1.2 allocations +! + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 3.1.3 select the (ZLBDAH,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GWET(:) ) +! +!* 3.1.4 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_h,Lbda_s) couplet use to +! tabulate the SWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAH)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAS)-0.00001, & + XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) +! +!* 3.1.5 perform the bilinear interpolation of the normalized +! SWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE( GWET(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSWETH*ZZW(:) & ! RSWETH + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAH(:)**XCXH ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSWETH1/( ZLBDAH(:)**2 ) + & + XLBSWETH2/( ZLBDAH(:) * ZLBDAS(:) ) + & + XLBSWETH3/( ZLBDAS(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 3.1.6 accretion of graupeln on the hailstones +! ---------------------------------------------- +! + GWET(:) = GHAIL(:) .AND. (ZRGT(:)>XRTMIN(6) .AND. ZRGS(:)>0.0) + IGWET = COUNT( GWET(:) ) +! + IF( IGWET>0 ) THEN +! +!* 3.1.7 allocations +! + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 3.1.8 select the (ZLBDAH,ZLBDAG) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAG(:),MASK=GWET(:) ) +! +!* 3.1.9 find the next lower indice for the ZLBDAH and for the ZLBDAG +! in the geometrical set of (Lbda_h,Lbda_g) couplet use to +! tabulate the GWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & + XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) +! +!* 3.1.10 perform the bilinear interpolation of the normalized +! GWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE( GWET(:) ) + ZZW1(:,5) = MAX(MIN( ZRGS(:),XFGWETH*ZZW(:) & ! RGWETH + *( ZLBDAG(:)**(XCXG-XBG) )*( ZLBDAH(:)**XCXH ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBGWETH1/( ZLBDAH(:)**2 ) + & + XLBGWETH2/( ZLBDAH(:) * ZLBDAG(:) ) + & + XLBGWETH3/( ZLBDAG(:)**2) ) ),0. ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 3.2 compute the Wet growth of hail +! ------------------------------------- +! + ZZW(:) = 0.0 + WHERE( GHAIL(:) .AND. ZZT(:)<XTT ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RWETH +! + ZZW(:) = MAX(0., ( ZZW(:) * ( X0DEPH* ZLBDAH(:)**XEX0DEPH + & + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) + & + ( ZZW1(:,2)+ZZW1(:,3)+ZZW1(:,5) ) * & + ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:))) ) ) / & + ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) +! + ZZW1(:,6) = MAX( ZZW(:) - ZZW1(:,2) - ZZW1(:,3) - ZZW1(:,5),0.) ! RCWETH+RRWETH + END WHERE + WHERE ( GHAIL(:) .AND. ZZT(:)<XTT .AND. ZZW1(:,6)/=0.) +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,4) = MAX( 0.0,MIN( ZZW1(:,6),ZRRS(:)+ZZW1(:,1) ) ) + ZZX(:) = ZZW1(:,4) / ZZW1(:,6) + ZZW1(:,2) = ZZW1(:,2)*ZZX(:) + ZZW1(:,3) = ZZW1(:,3)*ZZX(:) + ZZW1(:,5) = ZZW1(:,5)*ZZX(:) + ZZW(:) = ZZW1(:,4) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,5) +! +!* 3.2.1 integrate the Wet growth of hail +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) - ZZW1(:,5) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,4) + ZZW1(:,1) ) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETH+RRWETH)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,2)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-MAX( ZZW1(:,4)-ZZW1(:,1),0.0 ) & + *(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) + END WHERE +! +END IF ! IHAIL>0 +! +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & + 4,'WETH_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'WETH_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'WETH_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'WETH_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET ( & + UNPACK(ZRSS(:),MASK=GMICRO(:,:,:),FIELD=PRSS)*PRHODJ(:,:,:), & + 10,'WETH_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'WETH_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET ( & + UNPACK(ZRHS(:),MASK=GMICRO(:,:,:),FIELD=PRHS)*PRHODJ(:,:,:), & + 12,'WETH_BU_RRH') + IF (LBUDGET_SV) THEN + CALL BUDGET (UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NC,'WETH_BU_RSV') + CALL BUDGET (UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'WETH_BU_RSV') + CALL BUDGET (UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'WETH_BU_RSV') + END IF +END IF +! +! +! Partial reconversion of hail to graupel when rc and rh are small +! +! +!* 3.3 Conversion of the hailstones into graupel +! ----------------------------------------------- +! +IF ( IHAIL>0 ) THEN + ZTHRH=0.01E-3 + ZTHRC=0.001E-3 + ZZW(:) = 0.0 + WHERE( ZRHT(:)<ZTHRH .AND. ZRCT(:)<ZTHRC .AND. ZZT(:)<XTT ) + ZZW(:) = MIN( 1.0,MAX( 0.0,1.0-(ZRCT(:)/ZTHRC) ) ) +! +! assume a linear percent conversion rate of hail into graupel +! + ZZW(:) = ZRHS(:)*ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) ! partial conversion + ZRHS(:) = ZRHS(:) - ZZW(:) ! of hail into graupel +! + END WHERE +END IF +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'COHG_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET ( & + UNPACK(ZRHS(:),MASK=GMICRO(:,:,:),FIELD=PRHS)*PRHODJ(:,:,:), & + 12,'COHG_BU_RRH') +END IF +! +! +!* 3.4 Melting of the hailstones +! +IF ( IHAIL>0 ) THEN + ZZW(:) = 0.0 + WHERE( GHAIL(:) .AND. (ZRHS(:)>0.0) .AND. (ZRHT(:)>0.0) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RHMLTR +! + ZZW(:) = MIN( ZRHS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPH* ZLBDAH(:)**XEX0DEPH + & + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) - & + ZZW1(:,6)*( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRHS(:) = ZRHS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RHMLTR)) +! + ZCRS(:) = MAX( ZCRS(:) + ZZW(:)*(XCCH*ZLBDAH(:)**XCXH/ZRHT(:)),0.0 ) +! + END WHERE +END IF +! +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HMLT_BU_RTH') + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=PRRS)*PRHODJ(:,:,:), & + 8,'HMLT_BU_RRR') + IF (LBUDGET_RH) CALL BUDGET ( & + UNPACK(ZRHS(:),MASK=GMICRO(:,:,:),FIELD=PRHS)*PRHODJ(:,:,:), & + 12,'HMLT_BU_RRH') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=PCRS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NR,'HMLT_BU_RSV') + END IF +END IF +! +END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_MIXED_FAST_PROCESSES diff --git a/src/MNH/lima_mixed_slow_processes.f90 b/src/MNH/lima_mixed_slow_processes.f90 new file mode 100644 index 000000000..85c78adeb --- /dev/null +++ b/src/MNH/lima_mixed_slow_processes.f90 @@ -0,0 +1,277 @@ +! ##################################### + MODULE MODI_LIMA_MIXED_SLOW_PROCESSES +! ##################################### +! +INTERFACE + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + ZRHODJ, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS ) +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient +! +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: ZRHODJ +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +! +END SUBROUTINE LIMA_MIXED_SLOW_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_MIXED_SLOW_PROCESSES +! +! ####################################################################### + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + ZRHODJ, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! slow processes : +!! +!! Deposition of water vapor on graupeln +!! Cloud ice Melting +!! Bergeron-Findeisen effect +!! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XALPI, XBETAI, XGAMI, & + XALPW, XBETAW, XGAMW +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, NMOD_IFN +USE MODD_PARAM_LIMA_COLD, ONLY : XDI, X0DEPI, X2DEPI, XSCFAC +USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBDAG_MAX, & + X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG +! +USE MODD_NSV +USE MODD_BUDGET +USE MODI_BUDGET +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient +! +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: ZRHODJ +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(ZZT)) :: ZZW, ZMASK ! Work vectors +! +INTEGER :: JMOD_IFN +! +!------------------------------------------------------------------------------- +! +!* 1 Deposition of water vapor on r_g: RVDEPG +! --------------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) ) +!Correction BVIE RHODREF +! ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & + ZZW(:) = ( ZSSI(:)/(ZAI(:)) ) * & + ( X0DEPG*ZLBDAG(:)**XEX0DEPG + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'DEPG_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET ( & + UNPACK(ZRVS(:),MASK=GMICRO(:,:,:),FIELD=PRVS)*PRHODJ(:,:,:),& + 6,'DEPG_BU_RRV') + IF (LBUDGET_RG) CALL BUDGET ( & + UNPACK(ZRGS(:),MASK=GMICRO(:,:,:),FIELD=PRGS)*PRHODJ(:,:,:), & + 11,'DEPG_BU_RRG') + END IF +! +! +!* 2 cloud ice Melting: RIMLTC and CIMLTC +! ----------------------------------------- +! +! + ZMASK(:) = 1.0 + WHERE( (ZRIS(:)>0.0) .AND. (ZZT(:)>XTT) ) + ZRCS(:) = ZRCS(:) + ZRIS(:) + ZTHS(:) = ZTHS(:) - ZRIS(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RIMLTC)) + ZRIS(:) = 0.0 +! + ZCCS(:) = ZCCS(:) + ZCIS(:) + ZCIS(:) = 0.0 + ZMASK(:)= 0.0 + END WHERE + DO JMOD_IFN = 1,NMOD_IFN +! Correction BVIE aerosols not released but in droplets +! ZIFS(:,JMOD_IFN) = ZIFS(:,JMOD_IFN) + ZINS(:,JMOD_IFN)*(1.-ZMASK(:)) + ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) * ZMASK(:) + ENDDO +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'IMLT_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'IMLT_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'IMLT_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET (UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NC,'IMLT_BU_RSV') + CALL BUDGET (UNPACK(ZCIS(:),MASK=GMICRO(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:), & + 12+NSV_LIMA_NI,'IMLT_BU_RSV') + END IF + END IF +! +! +!* 3 Bergeron-Findeisen effect: RCBERI +! -------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE( (ZRCS(:)>0.0) .AND. (ZRIS(:)>0.0) .AND. (ZCIT(:)>XCTMIN(4)) ) + ZZW(:) = EXP( (XALPW-XALPI) - (XBETAW-XBETAI)/ZZT(:) & + - (XGAMW-XGAMI)*ALOG(ZZT(:)) ) -1.0 + ! supersaturation of saturated water over ice + ZZW(:) = MIN( ZRCS(:),( ZZW(:) / ZAI(:) ) * ZCIT(:) * & + ( X0DEPI/ZLBDAI(:)+X2DEPI*ZCJ(:)*ZCJ(:)/ZLBDAI(:)**(XDI+2.0) ) ) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCBERI)) + END WHERE +! +! Budget storage + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'BERFI_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:), & + 7,'BERFI_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GMICRO(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:), & + 9,'BERFI_BU_RRI') + END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_MIXED_SLOW_PROCESSES diff --git a/src/MNH/lima_phillips.f90 b/src/MNH/lima_phillips.f90 new file mode 100644 index 000000000..f0674dc86 --- /dev/null +++ b/src/MNH/lima_phillips.f90 @@ -0,0 +1,670 @@ +! ######################### + MODULE MODI_LIMA_PHILLIPS +! ######################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +! +END SUBROUTINE LIMA_PHILLIPS +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS +! +! ###################################################################### + SUBROUTINE LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Phillips (2008). +!! +!! +!!** METHOD +!! ------ +!! The parameterization of Phillips (2008) is based on observed nucleation +!! in the CFDC for a range of T and Si values. Phillips therefore defines a +!! reference activity spectrum, that is, for given T and Si values, the +!! reference concentration of primary ice crystals. +!! +!! The activation of IFN is closely related to their total surface. Thus, +!! the activable fraction of each IFN specie is determined by an integration +!! over the particle size distributions. +!! +!! Subroutine organisation : +!! +!! 1- Preliminary computations +!! 2- Check where computations are necessary, and pack variables +!! 3- Compute the saturation over water and ice +!! 4- Compute the reference activity spectrum +!! -> CALL LIMA_PHILLIPS_REF_SPECTRUM +!! Integrate over the size distributions to compute the IFN activable fraction +!! -> CALL LIMA_PHILLIPS_INTEG +!! 5- Heterogeneous nucleation of insoluble IFN +!! 6- Heterogeneous nucleation of coated IFN +!! 7- Unpack variables & deallocations +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST, ONLY : XP00, XRD, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XALPW, XBETAW, XGAMW, XPI +USE MODD_PARAM_LIMA, ONLY : NMOD_IFN, NSPECIE, XFRAC, & + NMOD_CCN, NMOD_IMM, NIND_SPECIE, NINDICE_CCN_IMM, & + XDSI0, XRTMIN, XCTMIN, NPHILLIPS +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0 +! +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +USE MODI_LIMA_PHILLIPS_REF_SPECTRUM +USE MODI_LIMA_PHILLIPS_INTEG +! +USE MODD_BUDGET +USE MODI_BUDGET +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_IFN_FREE +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IFN, JSPECIE, JMOD_IMM ! Loop index +INTEGER :: INEGT ! Case number of sedimentation, nucleation, +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAS ! Cloud Cond. nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source + !by Deposition/Contact +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNIS ! Nucleated Ice nuclei conc. source + !by Immersion +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & + ZSW, & + ZSI_W +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN, ZCTMIN +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSI0, & ! Si threshold in H_X for X={DM,BC,O} + Z_FRAC_ACT ! Activable frac. of each AP species +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS, ZZT_SI0_BC +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Physical limitations +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTATIONS ONLY WHERE NECESSARY : PACK +! ---------------------------------------- +! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-2.0 .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.95 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT > 0) THEN +! +ALLOCATE(ZRVT(INEGT)) +ALLOCATE(ZRCT(INEGT)) +ALLOCATE(ZRRT(INEGT)) +ALLOCATE(ZRIT(INEGT)) +ALLOCATE(ZRST(INEGT)) +ALLOCATE(ZRGT(INEGT)) +! +ALLOCATE(ZCIT(INEGT)) +! +ALLOCATE(ZRVS(INEGT)) +ALLOCATE(ZRCS(INEGT)) +ALLOCATE(ZRIS(INEGT)) +! +ALLOCATE(ZTHS(INEGT)) +! +ALLOCATE(ZCCS(INEGT)) +ALLOCATE(ZCIS(INEGT)) +! +ALLOCATE(ZNAS(INEGT,NMOD_CCN)) +ALLOCATE(ZIFS(INEGT,NMOD_IFN)) +ALLOCATE(ZINS(INEGT,NMOD_IFN)) +ALLOCATE(ZNIS(INEGT,NMOD_IMM)) +! +ALLOCATE(ZRHODREF(INEGT)) +ALLOCATE(ZZT(INEGT)) +ALLOCATE(ZPRES(INEGT)) +ALLOCATE(ZEXNREF(INEGT)) +! +DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + DO JMOD_CCN = 1, NMOD_CCN + ZNAS(JL,JMOD_CCN) = PNAS(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + DO JMOD_IFN = 1, NMOD_IFN + ZIFS(JL,JMOD_IFN) = PIFS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ZINS(JL,JMOD_IFN) = PINS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ENDDO + DO JMOD_IMM = 1, NMOD_IMM + ZNIS(JL,JMOD_IMM) = PNIS(I1(JL),I2(JL),I3(JL),JMOD_IMM) + ENDDO + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) +ENDDO +! +! PACK : done +! Prepare computations +! +ALLOCATE( ZLSFACT (INEGT) ) +ALLOCATE( ZLVFACT (INEGT) ) +ALLOCATE( ZSI (INEGT) ) +ALLOCATE( ZTCELSIUS (INEGT) ) +ALLOCATE( ZZT_SI0_BC (INEGT) ) +ALLOCATE( ZLBDAC (INEGT) ) +ALLOCATE( ZSI0 (INEGT,NSPECIE) ) +ALLOCATE( Z_FRAC_ACT (INEGT,NSPECIE) ) ; Z_FRAC_ACT(:,:) = 0.0 +ALLOCATE( ZSW (INEGT) ) +ALLOCATE( ZSI_W (INEGT) ) +! +ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 +ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 +ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. COMPUTE THE SATURATION OVER WATER AND ICE +! ----------------------------------------- +! +! +ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] +ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) +ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! +ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i +ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! +ZZY(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w +ZSW(:) = ZRVT(:)*(ZPRES(:)-ZZY(:))/((XMV/XMD)*ZZY(:)) ! Saturation over water +! +ZSI_W(:)= ZZY(:)/ZZW(:) ! Saturation over ice at water saturation: es_w/es_i +! +! Saturation parameters for H_X, with X={Dust/Metallic (2 modes), Black Carbon, Organic} +! +ZSI0(:,1) = 1.0 + 10.0**( -1.0261 + 3.1656E-3* ZTCELSIUS(:) & + + 5.3938E-4*(ZTCELSIUS(:)**2) & + + 8.2584E-6*(ZTCELSIUS(:)**3) ) ! with T [°C] +ZSI0(:,2) = ZSI0(:,1) ! DM2 = DM1 +ZSI0(:,3) = 0.0 ! BC +ZZT_SI0_BC(:) = MAX( 198.0, MIN( 239.0,ZZT(:) ) ) +ZSI0(:,3) = (-3.118E-5*ZZT_SI0_BC(:)+1.085E-2)*ZZT_SI0_BC(:)+0.5652 - XDSI0(3) +IF (NPHILLIPS == 8) THEN + ZSI0(:,4) = ZSI0(:,3) ! O = BC +ELSE IF (NPHILLIPS == 13) THEN + ZSI0(:,4) = 1.15 ! BIO +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. COMPUTE THE ACTIVABLE FRACTION OF EACH IFN SPECIE +! ------------------------------------------------- +! +! +! Computation of the reference activity spectrum ( ZZY = N_{IN,1,*} ) +! +CALL LIMA_PHILLIPS_REF_SPECTRUM(ZZT, ZSI, ZSI_W, ZZY) +! +! For each aerosol species (DM1, DM2, BC, O), compute the fraction that may be activated +! Z_FRAC_ACT(INEGT,NSPECIE) = fraction of each species that may be activated +! +CALL LIMA_PHILLIPS_INTEG(ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. COMPUTE THE HETEROGENEOUS NUCLEATION OF INSOLUBLE IFN +! ----------------------------------------------------- +! +! +! +DO JMOD_IFN = 1,NMOD_IFN ! IFN modes + ZZX(:)=0. + DO JSPECIE = 1, NSPECIE ! Each IFN mode is mixed with DM1, DM2, BC, O + ZZX(:)=ZZX(:)+XFRAC(JSPECIE,JMOD_IFN)*(ZIFS(:,JMOD_IFN)+ZINS(:,JMOD_IFN))* & + Z_FRAC_ACT(:,JSPECIE) + END DO +! Now : ZZX(:) = number of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZIFS(:,JMOD_IFN), MAX( (ZZX(:)-ZINS(:,JMOD_IFN)),0.0 )) +! Correction BVIE division by PTSTEP ? +! ZZW(:) = MIN( XMNU0*ZZX(:) / PTSTEP , ZRVS(:) ) + ZZW(:) = MIN( XMNU0*ZZX(:), ZRVS(:) ) +! +! Update the concentrations and MMR +! + ZIFS(:,JMOD_IFN) = ZIFS(:,JMOD_IFN) - ZZX(:) + ZW(:,:,:) = PIFS(:,:,:,JMOD_IFN) + PIFS(:,:,:,JMOD_IFN) = UNPACK( ZIFS(:,JMOD_IFN), MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:) ) +! + ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) + ZZX(:) + ZW(:,:,:) = PINS(:,:,:,JMOD_IFN) + PINS(:,:,:,JMOD_IFN) = UNPACK( ZINS(:,JMOD_IFN), MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:) ) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) !-ZLVFACT(:)) ! f(L_s*(RVHNDI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +END DO +! +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HIND_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET ( & + UNPACK(ZRVS(:),MASK=GNEGT(:,:,:),FIELD=PRVS)*PRHODJ(:,:,:),& + 6,'HIND_BU_RRV') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GNEGT(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'HIND_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GNEGT(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NI,'HIND_BU_RSV') + IF (NMOD_IFN.GE.1) THEN + DO JL=1, NMOD_IFN + CALL BUDGET ( PIFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'HIND_BU_RSV') + END DO + END IF + END IF +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. COMPUTE THE HETEROGENEOUS NUCLEATION OF COATED IFN +! -------------------------------------------------- +! +! +! Heterogeneous nucleation by immersion of the activated CCN +! Currently, we represent coated IFN as a pure aerosol type (NIND_SPECIE) +! +! +DO JMOD_IMM = 1,NMOD_IMM ! Coated IFN modes + JMOD_CCN = NINDICE_CCN_IMM(JMOD_IMM) ! Corresponding CCN mode + IF (JMOD_CCN .GT. 0) THEN +! +! OLD LIMA : Compute the appropriate mean diameter and sigma +! XMDIAM_IMM = MIN( XMDIAM_IFN(NIND_SPECIE) , XR_MEAN_CCN(JMOD_CCN)*2. ) +! XSIGMA_IMM = MIN( XSIGMA_IFN(JSPECIE) , EXP(XLOGSIG_CCN(JMOD_CCN)) ) +! + ZZW(:) = MIN( ZCCS(:) , ZNAS(:,JMOD_CCN) ) + ZZX(:)= ( ZZW(:)+ZNIS(:,JMOD_IMM) ) * Z_FRAC_ACT(:,NIND_SPECIE) +! Now : ZZX(:) = number of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZZW(:), MAX( (ZZX(:)-ZNIS(:,JMOD_IMM)),0.0 ) ) +! Correction BVIE division by PTSTEP ? +! ZZY(:) = MIN( XMNU0*ZZX(:) / PTSTEP , ZRVS(:) ) + ZZY(:) = MIN( XMNU0*ZZX(:) , ZRVS(:) ) +! +! Update the concentrations and MMR +! + ZNAS(:,JMOD_CCN) = ZNAS(:,JMOD_CCN) - ZZX(:) + ZW(:,:,:) = PNAS(:,:,:,JMOD_CCN) + PNAS(:,:,:,JMOD_CCN) = UNPACK(ZNAS(:,JMOD_CCN),MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:)) + ZNIS(:,JMOD_IMM) = ZNIS(:,JMOD_IMM) + ZZX(:) + ZW(:,:,:) = PNIS(:,:,:,JMOD_IMM) + PNIS(:,:,:,JMOD_IMM) = UNPACK(ZNIS(:,JMOD_IMM),MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:)) +! + ZRCS(:) = ZRCS(:) - ZZY(:) + ZRIS(:) = ZRIS(:) + ZZY(:) + ZTHS(:) = ZTHS(:) + ZZY(:)*ZLSFACT(:) !-ZLVFACT(:)) ! f(L_s*(RVHNCI)) + ZCCS(:) = ZCCS(:) - ZZX(:) + ZCIS(:) = ZCIS(:) + ZZX(:) + END IF +END DO +! +! Budget storage +IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) CALL BUDGET ( & + UNPACK(ZTHS(:),MASK=GNEGT(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:),& + 4,'HINC_BU_RTH') + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GNEGT(:,:,:),FIELD=PRCS)*PRHODJ(:,:,:),& + 7,'HINC_BU_RRC') + IF (LBUDGET_RI) CALL BUDGET ( & + UNPACK(ZRIS(:),MASK=GNEGT(:,:,:),FIELD=PRIS)*PRHODJ(:,:,:),& + 9,'HINC_BU_RRI') + IF (LBUDGET_SV) THEN + CALL BUDGET ( UNPACK(ZCCS(:),MASK=GNEGT(:,:,:),FIELD=PCCS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NC,'HINC_BU_RSV') + CALL BUDGET ( UNPACK(ZCIS(:),MASK=GNEGT(:,:,:),FIELD=PCIS)*PRHODJ(:,:,:),& + 12+NSV_LIMA_NI,'HINC_BU_RSV') + END IF +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 7. UNPACK VARIABLES AND CLEAN +! -------------------------- +! +! +! End of the heterogeneous nucleation following Phillips 08 +! Unpack variables, deallocate... +! +! +ZW(:,:,:) = PRVS(:,:,:) +PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PRCS(:,:,:) +PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PRIS(:,:,:) +PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PTHS(:,:,:) +PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PCCS(:,:,:) +PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PCIS(:,:,:) +PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +DEALLOCATE(ZRVT) +DEALLOCATE(ZRCT) +DEALLOCATE(ZRRT) +DEALLOCATE(ZRIT) +DEALLOCATE(ZRST) +DEALLOCATE(ZRGT) +DEALLOCATE(ZCIT) +DEALLOCATE(ZRVS) +DEALLOCATE(ZRCS) +DEALLOCATE(ZRIS) +DEALLOCATE(ZTHS) +DEALLOCATE(ZCCS) +DEALLOCATE(ZCIS) +DEALLOCATE(ZNAS) +DEALLOCATE(ZIFS) +DEALLOCATE(ZINS) +DEALLOCATE(ZNIS) +DEALLOCATE(ZRHODREF) +DEALLOCATE(ZZT) +DEALLOCATE(ZPRES) +DEALLOCATE(ZEXNREF) +DEALLOCATE(ZLSFACT) +DEALLOCATE(ZLVFACT) +DEALLOCATE(ZSI) +DEALLOCATE(ZTCELSIUS) +DEALLOCATE(ZZT_SI0_BC) +DEALLOCATE(ZLBDAC) +DEALLOCATE(ZSI0) +DEALLOCATE(Z_FRAC_ACT) +DEALLOCATE(ZSW) +DEALLOCATE(ZZW) +DEALLOCATE(ZZX) +DEALLOCATE(ZZY) +!++cb++ + DEALLOCATE(ZSI_W) +!--cb-- +! +! +ELSE +! +! Advance the budget calls +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + IF (LBUDGET_TH) THEN + ZW(:,:,:) = PTHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,4,'HIND_BU_RTH') + CALL BUDGET (ZW,4,'HINC_BU_RTH') + ENDIF + IF (LBUDGET_RV) THEN + ZW(:,:,:) = PRVS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,6,'HIND_BU_RRV') + ENDIF + IF (LBUDGET_RC) THEN + ZW(:,:,:) = PRCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,7,'HINC_BU_RRC') + ENDIF + IF (LBUDGET_RI) THEN + ZW(:,:,:) = PRIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,9,'HIND_BU_RRI') + CALL BUDGET (ZW,9,'HINC_BU_RRI') + ENDIF + IF (LBUDGET_SV) THEN +!print*, 'LBUDGET_SV dans lima_phillips = ', LBUDGET_SV + ZW(:,:,:) = PCCS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NC,'HINC_BU_RSV') + ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HIND_BU_RSV') + CALL BUDGET (ZW,12+NSV_LIMA_NI,'HINC_BU_RSV') + IF (NMOD_IFN.GE.1) THEN + DO JL=1, NMOD_IFN + CALL BUDGET ( PIFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'HIND_BU_RSV') + END DO + END IF + END IF + END IF +! +! +END IF ! INEGT > 0 +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_PHILLIPS diff --git a/src/MNH/lima_phillips_integ.f90 b/src/MNH/lima_phillips_integ.f90 new file mode 100644 index 000000000..26a653b6a --- /dev/null +++ b/src/MNH/lima_phillips_integ.f90 @@ -0,0 +1,143 @@ +! ############################### + MODULE MODI_LIMA_PHILLIPS_INTEG +! ############################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS_INTEG (ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT +REAL, DIMENSION(:), INTENT(IN) :: ZSI +REAL, DIMENSION(:,:), INTENT(IN) :: ZSI0 +REAL, DIMENSION(:), INTENT(IN) :: ZSW +REAL, DIMENSION(:), INTENT(IN) :: ZZY +REAL, DIMENSION(:,:), INTENT(INOUT) :: Z_FRAC_ACT +! +END SUBROUTINE LIMA_PHILLIPS_INTEG +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS_INTEG +! +! ###################################################################### + SUBROUTINE LIMA_PHILLIPS_INTEG (ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fraction of each aerosol +!! species (DM1, DM2, BC, O) that may be activated, following Phillips (2008) +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XPI +USE MODD_PARAM_LIMA, ONLY : XMDIAM_IFN, XSIGMA_IFN, NSPECIE, XFRAC_REF, & + XH, XAREA1, XGAMMA, XABSCISS, XWEIGHT, NDIAM, & + XT0, XDT0, XDSI0, XSW0, XTX1, XTX2 +USE MODI_LIMA_FUNCTIONS, ONLY : DELTA, DELTA_VEC +USE MODI_GAMMA_INC +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT +REAL, DIMENSION(:), INTENT(IN) :: ZSI +REAL, DIMENSION(:,:), INTENT(IN) :: ZSI0 +REAL, DIMENSION(:), INTENT(IN) :: ZSW +REAL, DIMENSION(:), INTENT(IN) :: ZZY +REAL, DIMENSION(:,:), INTENT(INOUT) :: Z_FRAC_ACT +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JSPECIE, JL +REAL :: XB +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZX, & ! Work array + ZFACTOR, & + ZSUBSAT, & + ZEMBRYO +! +LOGICAL, DIMENSION(:), ALLOCATABLE :: GINTEG ! Mask to integrate over the + ! AP size spectrum +! +! +!------------------------------------------------------------------------------- +! +! +DO JSPECIE = 1, NSPECIE ! = 4 = {DM1, DM2, BC, O} respectively +! + ALLOCATE(ZZX (SIZE(ZZT)) ) ; ZZX(:) = 0.0 + ALLOCATE(ZFACTOR (SIZE(ZZT)) ) + ALLOCATE(ZSUBSAT (SIZE(ZZT)) ) + ALLOCATE(ZEMBRYO (SIZE(ZZT)) ) + ALLOCATE(GINTEG (SIZE(ZZT)) ) + +! Compute log in advance for efficiency + XB = LOG(0.1E-6/XMDIAM_IFN(JSPECIE))/(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))) +! ZFACTOR = f_c + ZFACTOR(:) = DELTA(1.,XH(JSPECIE),ZZT(:),XT0(JSPECIE),XT0(JSPECIE)+XDT0(JSPECIE)) & + * DELTA_VEC(0.,1.,ZSI(:),ZSI0(:,JSPECIE),ZSI0(:,JSPECIE)+XDSI0(JSPECIE)) / XGAMMA +! ZSUBSAT = H_X + ZSUBSAT(:) = MIN(ZFACTOR(:)+(1.0-ZFACTOR(:))*DELTA(0.,1.,ZSW(:),XSW0,1.) , 1.0) +! ZEMBRYO = µ_X/(pi*(D_X)**2) = A + ZEMBRYO(:) = ZSUBSAT(:)*DELTA(1.,0.,ZZT(:),XTX1(JSPECIE),XTX2(JSPECIE)) & + * XFRAC_REF(JSPECIE)*ZZY(:)/XAREA1(JSPECIE) +! +! For T warmer than -35°C, the integration is approximated with µ_X << 1 +! Error function : GAMMA_INC(1/2, x**2) = ERF(x) !!! for x>=0 !!! +! + WHERE (ZZT(:)>(XTT-35.) .AND. ZEMBRYO(:)>1.0E-8) + ZZX(:) = ZZX(:) + ZEMBRYO(:) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & + * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & + * (1.0+GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) + END WHERE +! +! For other T, integration between 0 and infinity is made with a Gauss-Hermite +! quadrature method and integration between 0 and 0.1 uses e(x) ~ 1+x+O(x**2) +! Beware : here, weights are normalized : XWEIGHT = wi/sqrt(pi) +! + GINTEG(:) = ZZT(:)<=(XTT-35.) .AND. ZSI(:)>1.0 .AND. ZEMBRYO(:)>1.0E-8 +! + DO JL = 1, NDIAM + WHERE (GINTEG(:)) + ZZX(:) = ZZX(:) - XWEIGHT(JL)*EXP(-ZEMBRYO(:)*XPI*(XMDIAM_IFN(JSPECIE))**2 & + * EXP(2.0*SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE)) * XABSCISS(JL)) ) + END WHERE + ENDDO +! + WHERE (GINTEG(:)) + ZZX(:) = ZZX(:) + 0.5* XPI*ZEMBRYO(:)*(XMDIAM_IFN(JSPECIE))**2 & + * (1.0-( 1.0-GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) & + * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) ) + END WHERE +! + Z_FRAC_ACT(:,JSPECIE)=ZZX(:) +! + DEALLOCATE(ZZX) + DEALLOCATE(ZFACTOR) + DEALLOCATE(ZSUBSAT) + DEALLOCATE(ZEMBRYO) + DEALLOCATE(GINTEG) +! +ENDDO +! +END SUBROUTINE LIMA_PHILLIPS_INTEG diff --git a/src/MNH/lima_phillips_ref_spectrum.f90 b/src/MNH/lima_phillips_ref_spectrum.f90 new file mode 100644 index 000000000..c2fcff114 --- /dev/null +++ b/src/MNH/lima_phillips_ref_spectrum.f90 @@ -0,0 +1,136 @@ +! ###################################### + MODULE MODI_LIMA_PHILLIPS_REF_SPECTRUM +! ###################################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM (ZZT, ZSI, ZSI_W, ZZY) +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSI ! Saturation over ice +REAL, DIMENSION(:), INTENT(IN) :: ZSI_W ! Saturation over ice at water sat. +REAL, DIMENSION(:), INTENT(INOUT) :: ZZY ! Reference activity spectrum +! +END SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS_REF_SPECTRUM +! +! ###################################################################### + SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM (ZZT, ZSI, ZSI_W, ZZY) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the reference activation spectrum +!! described by Phillips (2008) +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XGAMMA, XRHO_CFDC +USE MODI_LIMA_FUNCTIONS, ONLY : RECT, DELTA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSI ! Saturation over ice +REAL, DIMENSION(:), INTENT(IN) :: ZSI_W ! Saturation over ice at water sat. +REAL, DIMENSION(:), INTENT(INOUT) :: ZZY ! Reference activity spectrum +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(:), ALLOCATABLE :: ZMAX, & + ZMOY, & + ZZY1, & + ZZY2, & + Z1, & + Z2 +! +REAL :: XPSI +! +!------------------------------------------------------------------------------- +! +ALLOCATE(ZMAX(SIZE(ZZT))) ; ZMAX(:)= 0.0 +ALLOCATE(ZMOY(SIZE(ZZT))) ; ZMOY(:)= 0.0 +ALLOCATE(ZZY1(SIZE(ZZT))) ; ZZY1(:)= 0.0 +ALLOCATE(ZZY2(SIZE(ZZT))) ; ZZY2(:)= 0.0 +ALLOCATE(Z1(SIZE(ZZT))) ; Z1(:) = 0.0 +ALLOCATE(Z2(SIZE(ZZT))) ; Z2(:) = 0.0 +! +ZZY(:) = 0.0 +! +XPSI = 0.058707*XGAMMA/XRHO_CFDC +! +WHERE( ZSI(:)>1.0 ) +! +!* T <= -35 C +! + ZZY(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(MIN(ZSI(:),7.)-1.1)) )**0.3 & + * RECT(1.,0.,ZZT(:),(XTT-80.),(XTT-35.)) +! +!* -35 C < T <= -25 C (in Appendix A) +! + ZZY1(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(MIN(ZSI(:),7.)-1.1)) )**0.3 + ZZY2(:) =1000.*XPSI & + * EXP(12.96*(MIN(ZSI(:),7.)-1.0)-0.639) +! +!* -35 C < T <= -30 C +! + ZMAX(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(ZSI_W(:)-1.1)) )**0.3 & + * RECT(1.,0.,ZZT(:),(XTT-35.),(XTT-30.)) +! +!* -30 C < T <= -25 C +! + ZMAX(:) = ZMAX(:) +1000.*XPSI & + * EXP( 12.96*(ZSI_W(:)-1.0)-0.639 ) & + * RECT(1.,0.,ZZT(:),(XTT-30.),(XTT-25.)) + Z1(:) = MIN(ZZY1(:), ZMAX(:)) + Z2(:) = MIN(ZZY2(:), ZMAX(:)) +! +!* T > -25 C +! + ZZY(:) = ZZY(:) + 1000.*XPSI & + * EXP( 12.96*(MIN(ZSI(:),7.)-1.0)-0.639 ) & + * RECT(1.,0.,ZZT(:),(XTT-25.),(XTT-2.)) +END WHERE +! +WHERE (Z2(:)>0.0 .AND. Z1(:)>0.0) + ZMOY(:) = Z2(:)*(Z1(:)/Z2(:))**DELTA(1.,0.,ZZT(:),(XTT-35.),(XTT-25.)) + ZZY(:) = ZZY(:) + MIN(ZMOY(:),ZMAX(:)) ! N_{IN,1,*} +END WHERE +! +!++cb++ +DEALLOCATE(ZMAX) +DEALLOCATE(ZMOY) +DEALLOCATE(ZZY1) +DEALLOCATE(ZZY2) +DEALLOCATE(Z1) +DEALLOCATE(Z2) +!--cb-- +! +END SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM diff --git a/src/MNH/lima_precip_scavenging.f90 b/src/MNH/lima_precip_scavenging.f90 new file mode 100644 index 000000000..4daf15b8a --- /dev/null +++ b/src/MNH/lima_precip_scavenging.f90 @@ -0,0 +1,831 @@ +! ################################## + MODULE MODI_LIMA_PRECIP_SCAVENGING +! ################################## +! +INTERFACE + SUBROUTINE LIMA_PRECIP_SCAVENGING (HCLOUD, KLUOUT, KTCOUNT, PTSTEP, & + PRRT, PRHODREF, PRHODJ, PZZ, & + PPABST, PTHT, PSVT, PRSVS, PINPAP ) +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! cloud paramerization +INTEGER, INTENT(IN) :: KLUOUT ! unit for output listing +INTEGER, INTENT(IN) :: KTCOUNT ! iteration count +REAL, INTENT(IN) :: PTSTEP ! Double timestep except + ! for the first time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain mixing ratio at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Air Density [kg/m**3] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Particle Concentration [kg-1] +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Total Number Scavenging Rate +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +END SUBROUTINE LIMA_PRECIP_SCAVENGING +END INTERFACE +END MODULE MODI_LIMA_PRECIP_SCAVENGING +! +!######################################################################## + SUBROUTINE LIMA_PRECIP_SCAVENGING (HCLOUD, KLUOUT, KTCOUNT, PTSTEP, & + PRRT, PRHODREF, PRHODJ, PZZ, & + PPABST, PTHT, PSVT, PRSVS, PINPAP ) +!########################################################################x +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the total number +!! below-cloud scavenging rate. +!! +!! +!!** METHOD +!! ------ +!! We assume a generalized gamma distribution law for the raindrop. +!! The aerosols particles distribution follows a log-normal law. +!! First, we have to compute the Collision Efficiency, which takes +!! account of the three most important wet removal mechanism : +!! Brownian diffusion, interception and inertial impaction. +!! It is a function of several number (like Reynolds, Schmidt +!! or Stokes number for instance). Consequently, +!! we need first to calculate these numbers. +!! +!! Then the scavenging coefficient is deduced from the integration +!! of the droplet size distribution, the falling velocity of +!! raindrop and aerosol, their diameter, and the collision +!! (or collection) efficiency, over the spectrum of droplet +!! diameters. +!! +!! The total scavenging rate of aerosol is computed from the +!! integration, over all the spectrum of particles aerosols +!! diameters, of the scavenging coefficient. +!! +!! +!! EXTERNAL +!! -------- +!! Subroutine SCAV_MASS_SEDIMENTATION +!! +!! Function COLL_EFFIC : computes the collision efficiency +!! +!! Function CONTJV | +!! Function GAUHER | +!! Function GAULAG |-> in lima_functions.f90 +!! Function GAMMLN | +!! +!! +!! REFERENCES +!! ---------- +!! Seinfeld and Pandis +!! Andronache +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0.DECLARATIONS +! -------------- +! +USE MODD_NSV +USE MODD_CST +USE MODD_PARAMETERS +USE MODI_INI_NSV +USE MODI_GAMMA +USE MODI_LIMA_FUNCTIONS +! +! Previous versions by S. Berthet were compatible with all schemes +! Here : Compatibility with LIMA only +USE MODD_PARAM_LIMA, ONLY : NMOD_IFN, NSPECIE, XFRAC, & + XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, & + NMOD_CCN, XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN, & + XALPHAR, XNUR, & + LAERO_MASS, NDIAMR, NDIAMP, XT0SCAV, XTREF, XNDO, & + XMUA0, XT_SUTH_A, XMFPA0, XVISCW, XRHO00, & + XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XCR, XDR +! +USE MODD_BUDGET +USE MODI_BUDGET +! +IMPLICIT NONE +! +!* 0.1 declarations of dummy arguments : +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! cloud paramerization +INTEGER, INTENT(IN) :: KLUOUT ! unit for output listing +INTEGER, INTENT(IN) :: KTCOUNT ! iteration count +REAL, INTENT(IN) :: PTSTEP ! Double timestep except + ! for the first time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain mixing ratio at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Air Density [kg/m**3] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Particle Concentration [/m**3] +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Total Number Scavenging Rate +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! +! +INTEGER :: JSV ! CCN or IFN mode +INTEGER :: J1, J2, IJ, JMOD +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GRAIN, &! Test where rain is present + GSCAV ! Test where rain is present +INTEGER , DIMENSION(SIZE(GSCAV)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: ISCAV +! +REAL :: ZDENS_RATIO, & !density ratio + ZNUM, & !PNU-1. + ZSHAPE_FACTOR +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZW ! work array +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: PCRT ! cloud droplet conc. +! +REAL, DIMENSION(:), ALLOCATABLE :: ZLAMBDAR, & !slope parameter of the + ! generalized Gamma + !distribution law for the + !raindrop + ZVISC_RATIO, & !viscosity ratio + ZMFPA, & !Mean Free Path + ZRHODREF, & !Air Density [kg/m**3] + ZVISCA, & !Viscosity of Air [kg/(m*s)] + ZT, & !Absolute Temperature + ZPABST, & + ZRRT, & + ZCONCP, & + ZCONCR, & + ZTOT_SCAV_RATE,& + ZTOT_MASS_RATE,& + ZMEAN_SCAV_COEF +! +REAL, DIMENSION(:,:), ALLOCATABLE :: & + ZVOLDR, & !Mean volumic Raindrop diameter [m] + ZBC_SCAV_COEF, & + ZCUNSLIP, & !CUnningham SLIP correction factor + ZST_STAR, & !critical Stokes number for impaction + ZSC, & !aerosol particle Schmidt number + ZRE, & !raindrop Reynolds number (for radius) + ZFVELR, & !Falling VELocity of the Raindrop + ZRELT, & !RELaxation Time of the particle [s] + ZDIFF !Particle Diffusivity +! +REAL, DIMENSION(NDIAMP) :: ZVOLDP, & !Mean volumic diameter [m] + ZABSCISSP, & !Aerosol Abscisses + ZWEIGHTP !Aerosol Weights +REAL, DIMENSION(NDIAMR) :: ZABSCISSR, & !Raindrop Abscisses + ZWEIGHTR !Raindrop Weights +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOL_EF, &! Collision efficiency + ZSIZE_RATIO, &! Size Ratio + ZST ! Stokes number +! +REAL, DIMENSION(SIZE(PRRT,1),SIZE(PRRT,2),SIZE(PRRT,3)) :: ZRRS +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: PMEAN_SCAV_COEF, & !Mean Scavenging + ! Coefficient + PTOT_SCAV_RATE, & !Total Number + ! Scavenging Rate + PTOT_MASS_RATE !Total Mass + ! Scavenging Rate +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3),NDIAMP) & + ::PBC_SCAV_COEF !Scavenging Coefficient +REAL, DIMENSION(:), ALLOCATABLE :: ZKNUDSEN ! Knuudsen number +! +! Opt. BVIE +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT_3D, ZCONCR_3D, ZVISCA_3D, ZMFPA_3D, & + ZVISC_RATIO_3D, ZLAMBDAR_3D, FACTOR_3D +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3),NDIAMP) & + :: ZVOLDR_3D, ZVOLDR_3D_INV, ZVOLDR_3D_POW, & + ZFVELR_3D, ZRE_3D, ZRE_3D_SQRT, ZST_STAR_3D +REAL, DIMENSION(:), ALLOCATABLE :: FACTOR +REAL, DIMENSION(:,:), ALLOCATABLE :: & + ZRE_SQRT, & ! SQRT of raindrop Reynolds number + ZRE_INV, & ! INV of raindrop Reynolds number + ZSC_INV, & ! INV of aerosol particle Schmidt number + ZSC_SQRT, & ! SQRT of aerosol particle Schmidt number + ZSC_3SQRT, & ! aerosol particle Schmidt number**(1./3.) + ZVOLDR_POW, & ! Mean volumic Raindrop diameter [m] **(2+ZDR) + ZVOLDR_INV ! INV of Mean volumic Raindrop diameter [m] +REAL :: ZDENS_RATIO_SQRT +INTEGER :: SV_VAR, NM, JM +REAL :: XMDIAMP +REAL :: XSIGMAP +REAL :: XRHOP +REAL :: XFRACP +! +! +! +!------------------------------------------------------------------------------ +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +! PCRT +PCRT(:,:,:)=PSVT(:,:,:,NSV_LIMA_NR) +! +! Rain mask +GRAIN(:,:,:) = .FALSE. +GRAIN(IIB:IIE,IJB:IJE,IKB:IKE) = (PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) & + .AND. PCRT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(3) ) +! +! Initialize the total mass scavenging rate if LAERO_MASS=T +IF (LAERO_MASS) PTOT_MASS_RATE(:,:,:) = 0. +! +! Quadrature method: compute absissae and weights +CALL GAUHER(ZABSCISSP,ZWEIGHTP,NDIAMP) +ZNUM = XNUR-1.0E0 +CALL GAULAG(ZABSCISSR,ZWEIGHTR,NDIAMR,ZNUM) +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. NUMERICAL OPTIMIZATION +! ---------------------- +! +! +! Optimization : compute in advance parameters depending on rain particles and +! environment conditions only, to avoid multiple identical computations in loops +! +! +ZSHAPE_FACTOR = GAMMA_X0D(XNUR+3./XALPHAR)/GAMMA_X0D(XNUR) +! +WHERE ( GRAIN(:,:,:) ) + ! + ZT_3D(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 )**(XRD/XCPD) + ZCONCR_3D(:,:,:) = PCRT(:,:,:) * PRHODREF(:,:,:) ![/m3] + ! Sutherland law for viscosity of air + ZVISCA_3D(:,:,:) = XMUA0*(ZT_3D(:,:,:)/XTREF)**(3/2)*(XTREF+XT_SUTH_A) & + /(XT_SUTH_A+ZT_3D(:,:,:)) + ! Air mean free path + ZMFPA_3D(:,:,:) = XMFPA0*(XP00*ZT_3D(:,:,:))/(PPABST(:,:,:)*XT0SCAV) + ! Viscosity ratio + ZVISC_RATIO_3D(:,:,:) = ZVISCA_3D(:,:,:)/XVISCW !!!!! inversé par rapport à orig. ! + ! Rain drops parameters + ZLAMBDAR_3D(:,:,:) = ( ((XPI/6.)*ZSHAPE_FACTOR*XRHOLW*ZCONCR_3D(:,:,:)) & + /(PRHODREF(:,:,:)*PRRT(:,:,:)) )**(1./3.) ![/m] + FACTOR_3D(:,:,:) = XPI*0.25*ZCONCR_3D(:,:,:)*XCR*(XRHO00/PRHODREF(:,:,:))**(0.4) + ! +END WHERE +! +DO J2=1,NDIAMR + WHERE ( GRAIN(:,:,:) ) + ! exchange of variables: [m] + ZVOLDR_3D(:,:,:,J2) = ZABSCISSR(J2)**(1./XALPHAR)/ZLAMBDAR_3D(:,:,:) + ZVOLDR_3D_INV(:,:,:,J2) = 1./ZVOLDR_3D(:,:,:,J2) + ZVOLDR_3D_POW(:,:,:,J2) = ZVOLDR_3D(:,:,:,J2)**(2.+XDR) + ! Raindrop Falling VELocity [m/s] + ZFVELR_3D(:,:,:,J2) = XCR*(ZVOLDR_3D(:,:,:,J2)**XDR)*(XRHO00/PRHODREF(:,:,:))**(0.4) + ! Reynolds number + ZRE_3D(:,:,:,J2) = ZVOLDR_3D(:,:,:,J2)*ZFVELR_3D(:,:,:,J2) & + *PRHODREF(:,:,:)/(2.0*ZVISCA_3D(:,:,:)) + ZRE_3D_SQRT(:,:,:,J2) = SQRT( ZRE_3D(:,:,:,J2) ) + ! Critical Stokes number + ZST_STAR_3D(:,:,:,J2) = (1.2+(LOG(1.+ZRE_3D(:,:,:,J2)))/12.) & + /(1.+LOG(1.+ZRE_3D(:,:,:,J2))) + END WHERE +END DO +! +! +!------------------------------------------------------------------------------ +! +! +!* 3. AEROSOL SCAVENGING +! ------------------ +! +! +! Iteration over the aerosol type and mode +! +DO JSV = 1, NMOD_CCN+NMOD_IFN +! + IF (JSV .LE. NMOD_CCN) THEN + JMOD = JSV + SV_VAR = NSV_LIMA_CCN_FREE -1 + JMOD ! Variable number in PSVT + NM = 1 ! Number of species (for IFN int. mixing) + ELSE + JMOD = JSV - NMOD_CCN + SV_VAR = NSV_LIMA_IFN_FREE -1 + JMOD + NM = NSPECIE + END IF +! + PBC_SCAV_COEF(:,:,:,:) = 0. + PMEAN_SCAV_COEF(:,:,:) = 0. + PTOT_SCAV_RATE(:,:,:) = 0. +! + GSCAV(:,:,:) = .FALSE. + GSCAV(IIB:IIE,IJB:IJE,IKB:IKE) =GRAIN(IIB:IIE,IJB:IJE,IKB:IKE) .AND. & + (PSVT(IIB:IIE,IJB:IJE,IKB:IKE,SV_VAR)>1.0E-2) + ISCAV = COUNTJV(GSCAV(:,:,:),I1(:),I2(:),I3(:)) +! + IF( ISCAV>=1 ) THEN + ALLOCATE(ZVISC_RATIO(ISCAV)) + ALLOCATE(ZRHODREF(ISCAV)) + ALLOCATE(ZVISCA(ISCAV)) + ALLOCATE(ZT(ISCAV)) + ALLOCATE(ZRRT(ISCAV)) + ALLOCATE(ZCONCR(ISCAV)) + ALLOCATE(ZLAMBDAR(ISCAV)) + ALLOCATE(ZCONCP(ISCAV)) + ALLOCATE(ZMFPA(ISCAV)) + ALLOCATE(ZTOT_SCAV_RATE(ISCAV)) + ALLOCATE(ZTOT_MASS_RATE(ISCAV)) + ALLOCATE(ZMEAN_SCAV_COEF(ISCAV)) + ALLOCATE(ZPABST(ISCAV)) + ALLOCATE(ZKNUDSEN(ISCAV)) + ALLOCATE(FACTOR(ISCAV)) +! + ALLOCATE(ZCUNSLIP(ISCAV,NDIAMP)) + ALLOCATE(ZBC_SCAV_COEF(ISCAV,NDIAMP)) + ALLOCATE(ZSC(ISCAV,NDIAMP)) + ALLOCATE(ZSC_INV(ISCAV,NDIAMP)) + ALLOCATE(ZSC_SQRT(ISCAV,NDIAMP)) + ALLOCATE(ZSC_3SQRT(ISCAV,NDIAMP)) + ALLOCATE(ZRELT(ISCAV,NDIAMP)) + ALLOCATE(ZDIFF(ISCAV,NDIAMP)) + ALLOCATE(ZVOLDR(ISCAV,NDIAMR)) + ALLOCATE(ZVOLDR_POW(ISCAV,NDIAMR)) + ALLOCATE(ZVOLDR_INV(ISCAV,NDIAMR)) + ALLOCATE(ZRE(ISCAV,NDIAMR)) + ALLOCATE(ZRE_INV(ISCAV,NDIAMR)) + ALLOCATE(ZRE_SQRT(ISCAV,NDIAMR)) + ALLOCATE(ZST_STAR(ISCAV,NDIAMR)) + ALLOCATE(ZFVELR(ISCAV,NDIAMR)) + ALLOCATE(ZST(ISCAV,NDIAMP,NDIAMR)) + ALLOCATE(ZCOL_EF(ISCAV,NDIAMP,NDIAMR)) + ALLOCATE(ZSIZE_RATIO(ISCAV,NDIAMP,NDIAMR)) +! + ZMEAN_SCAV_COEF(:)=0. + ZTOT_SCAV_RATE(:) =0. + ZTOT_MASS_RATE(:) =0. + DO JL=1,ISCAV + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZT(JL) = ZT_3D(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZCONCP(JL) = PSVT(I1(JL),I2(JL),I3(JL),SV_VAR)*ZRHODREF(JL)![/m3] + ZCONCR(JL) = ZCONCR_3D(I1(JL),I2(JL),I3(JL)) ![/m3] + ZVISCA(JL) = ZVISCA_3D(I1(JL),I2(JL),I3(JL)) + ZMFPA(JL) = ZMFPA_3D(I1(JL),I2(JL),I3(JL)) + ZVISC_RATIO(JL) = ZVISC_RATIO_3D(I1(JL),I2(JL),I3(JL)) + ZLAMBDAR(JL) = ZLAMBDAR_3D(I1(JL),I2(JL),I3(JL)) + FACTOR(JL) = FACTOR_3D(I1(JL),I2(JL),I3(JL)) + ZVOLDR(JL,:) = ZVOLDR_3D(I1(JL),I2(JL),I3(JL),:) + ZVOLDR_POW(JL,:) = ZVOLDR_3D_POW(I1(JL),I2(JL),I3(JL),:) + ZVOLDR_INV(JL,:) = ZVOLDR_3D_INV(I1(JL),I2(JL),I3(JL),:) + ZFVELR(JL,:) = ZFVELR_3D(I1(JL),I2(JL),I3(JL),:) + ZRE(JL,:) = ZRE_3D(I1(JL),I2(JL),I3(JL),:) + ZRE_SQRT(JL,:) = ZRE_3D_SQRT(I1(JL),I2(JL),I3(JL),:) + ZST_STAR(JL,:) = ZST_STAR_3D(I1(JL),I2(JL),I3(JL),:) + ENDDO + ZRE_INV(:,:) = 1./ZRE(:,:) + + IF (ANY(ZCONCR .eq. 0.)) print *, 'valeur nulle dans ZLAMBDAR !' + IF (ANY(ZLAMBDAR .eq. 0.)) print *, 'valeur nulle dans ZLAMBDAR !' +! +!------------------------------------------------------------------------------------ +! +! Loop over the different species (for IFN int. mixing) +! + DO JM = 1, NM ! species (DM1,DM2,BC,O) for IFN + IF ( JSV .LE. NMOD_CCN ) THEN ! CCN case + XRHOP = XRHO_CCN(JMOD) + XMDIAMP = 2*XR_MEAN_CCN(JMOD) + XSIGMAP = EXP(XLOGSIG_CCN(JMOD)) + XFRACP = 1.0 + ELSE ! IFN case + XRHOP = XRHO_IFN(JM) + XMDIAMP = XMDIAM_IFN(JM) + XSIGMAP = XSIGMA_IFN(JM) + XFRACP = XFRAC(JM,JMOD) + END IF + !----------------------------------------------------------------------------- + ! Loop over the aerosols particles diameters (log normal distribution law) : + ! + DO J1=1,NDIAMP + ! exchange of variables: [m] + ZVOLDP(J1) = XMDIAMP * EXP(ZABSCISSP(J1)*SQRT(2.)*LOG(XSIGMAP)) + ! Cunningham slip correction factor (1+alpha*Knudsen) + ZKNUDSEN(:) = MIN( 20.,ZVOLDP(J1)/ZMFPA(:) ) + ZCUNSLIP(:,J1) = 1.0+2.0/ZKNUDSEN(:)*(1.257+0.4*EXP(-0.55*ZKNUDSEN(:))) + ! Diffusion coefficient + ZDIFF(:,J1) = XBOLTZ*ZT(:)*ZCUNSLIP(:,J1)/(3.*XPI*ZVISCA(:)*ZVOLDP(J1)) + ! Schmidt number + ZSC(:,J1) = ZVISCA(:)/(ZRHODREF(:)*ZDIFF(:,J1)) + ZSC_INV(:,J1) = 1./ZSC(:,J1) + ZSC_SQRT(:,J1) = SQRT( ZSC(:,J1) ) + ZSC_3SQRT(:,J1) = ZSC(:,J1)**(1./3.) + ! Characteristic Time Required for reaching terminal velocity + ZRELT(:,J1) = (ZVOLDP(J1)**2)*ZCUNSLIP(:,J1)*XRHOP/(18.*ZVISCA(:)) + ! Density number + ZDENS_RATIO = XRHOP/XRHOLW + ZDENS_RATIO_SQRT = SQRT(ZDENS_RATIO) + ! Initialisation + ZBC_SCAV_COEF(:,J1)=0. + !------------------------------------------------------------------------- + ! Loop over the drops diameters (generalized Gamma distribution) : + ! + DO J2=1,NDIAMR + ! Stokes number + ZST(:,J1,J2) = 2.*ZRELT(:,J1)*(ZFVELR(:,J2)-ZRELT(1,J1)*XG) & + *ZVOLDR_INV(:,J2) + ! Size Ratio + ZSIZE_RATIO(:,J1,J2) = ZVOLDP(J1)*ZVOLDR_INV(:,J2) + ! Collision Efficiency + ZCOL_EF(:,J1,J2) = COLL_EFFI(ZRE, ZRE_INV, ZRE_SQRT, ZSC, ZSC_INV, & + ZSC_SQRT, ZSC_3SQRT, ZST, ZST_STAR, & + ZSIZE_RATIO, ZVISC_RATIO, ZDENS_RATIO_SQRT) + ! Below-Cloud Scavenging Coefficient for a fixed ZVOLDP: [/s] + ZBC_SCAV_COEF(:,J1) = ZBC_SCAV_COEF(:,J1) + & + ZCOL_EF(:,J1,J2) * ZWEIGHTR(J2) * FACTOR(:) * ZVOLDR_POW(:,J2) + END DO + ! End of the loop over the drops diameters + !-------------------------------------------------------------------------- + + ! Total NUMBER Scavenging Rate of aerosol [m**-3.s**-1] + ZTOT_SCAV_RATE(:) = ZTOT_SCAV_RATE(:) - & + ZWEIGHTP(J1)*XFRACP*ZCONCP(:)*ZBC_SCAV_COEF(:,J1) + ! Total MASS Scavenging Rate of aerosol [kg.m**-3.s**-1] + ZTOT_MASS_RATE(:) = ZTOT_MASS_RATE(:) + & + ZWEIGHTP(J1)*XFRACP*ZCONCP(:)*ZBC_SCAV_COEF(:,J1) & + *XPI/6.*XRHOP*(ZVOLDP(J1)**3) + END DO + ! End of the loop over the drops diameters + !-------------------------------------------------------------------------- + + ! Total NUMBER Scavenging Rate of aerosol [m**-3.s**-1] + PTOT_SCAV_RATE(:,:,:)=UNPACK(ZTOT_SCAV_RATE(:),MASK=GSCAV(:,:,:),FIELD=0.0) + ! Free particles (CCN or IFN) [/s]: + PRSVS(:,:,:,SV_VAR) = max(PRSVS(:,:,:,SV_VAR)+PTOT_SCAV_RATE(:,:,:) & + * PRHODJ(:,:,:)/PRHODREF(:,:,:) , 0.0 ) + ! Total MASS Scavenging Rate of aerosol which REACH THE FLOOR because of + ! rain sedimentation [kg.m**-3.s**-1] + IF (LAERO_MASS)THEN + PTOT_MASS_RATE(:,:,:) = PTOT_MASS_RATE(:,:,:) + & + UNPACK(ZTOT_MASS_RATE(:), MASK=GSCAV(:,:,:), FIELD=0.0) + CALL SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ, & + PRHODREF, PRRT, PSVT(:,:,:,NSV_LIMA_SCAVMASS),& + PRSVS(:,:,:,NSV_LIMA_SCAVMASS), PINPAP ) + PRSVS(:,:,:,NSV_LIMA_SCAVMASS)=PRSVS(:,:,:,NSV_LIMA_SCAVMASS) + & + PTOT_MASS_RATE(:,:,:)*PRHODJ(:,:,:)/PRHODREF(:,:,:) + END IF + ENDDO +! End of the loop over the aerosol species +!-------------------------------------------------------------------------- +! +! +! + DEALLOCATE(FACTOR) + DEALLOCATE(ZSC_INV) + DEALLOCATE(ZSC_SQRT) + DEALLOCATE(ZSC_3SQRT) + DEALLOCATE(ZRE_INV) + DEALLOCATE(ZRE_SQRT) + DEALLOCATE(ZVOLDR_POW) + DEALLOCATE(ZVOLDR_INV) +! + DEALLOCATE(ZFVELR) + DEALLOCATE(ZRE) + DEALLOCATE(ZST_STAR) + DEALLOCATE(ZST) + DEALLOCATE(ZSIZE_RATIO) + DEALLOCATE(ZCOL_EF) + DEALLOCATE(ZVOLDR) + DEALLOCATE(ZDIFF) + DEALLOCATE(ZRELT) + DEALLOCATE(ZSC) + DEALLOCATE(ZCUNSLIP) + DEALLOCATE(ZBC_SCAV_COEF) +! + DEALLOCATE(ZTOT_SCAV_RATE) + DEALLOCATE(ZTOT_MASS_RATE) + DEALLOCATE(ZMEAN_SCAV_COEF) +! + DEALLOCATE(ZRRT) + DEALLOCATE(ZCONCR) + DEALLOCATE(ZLAMBDAR) + DEALLOCATE(ZCONCP) + DEALLOCATE(ZVISC_RATIO) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZVISCA) + DEALLOCATE(ZPABST) + DEALLOCATE(ZKNUDSEN) + DEALLOCATE(ZT) + DEALLOCATE(ZMFPA) + ENDIF +ENDDO +! +IF (LBUDGET_SV) THEN + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-1), & + 12+NSV_LIMA_CCN_FREE+JL-1,'SCAV_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JL=1, NMOD_IFN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-1), & + 12+NSV_LIMA_IFN_FREE+JL-1,'SCAV_BU_RSV') + END DO + END IF +END IF +! +!------------------------------------------------------------------------------ +! +! +!* 3. SUBROUTINE AND FUNCTION +! ----------------------- +! +! +CONTAINS +! +!------------------------------------------------------------------------------ +! ########################################################################## + SUBROUTINE SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ,& + PRHODREF, PRAIN, PSVT_MASS, PRSVS_MASS, PINPAP ) +! ########################################################################## +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the total mass of aerosol +!! scavenged by precipitations +!! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! +!! REFERENCE +!! --------- +!! Book1 of the documentation ( routine CH_AQUEOUS_SEDIMENTATION ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 22/07/07 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CONF +! +USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XBR, XDR, XFSEDRR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KTCOUNT ! Current time step number +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRAIN ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVT_MASS ! Precip. aerosols at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSVS_MASS ! Precip. aerosols source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JJ, JK, JN, JRR ! Loop indexes +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +REAL :: ZTSPLITR ! Small time step for rain sedimentation +REAL :: ZTSTEP ! Large time step for rain sedimentation +! +! +LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: GSEDIM ! where to compute the SED processes +INTEGER :: ISEDIM +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: ZW, & ! work array + ZWSED, & ! sedimentation fluxes + ZZS ! Rain water m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS, & ! Rain water m.r. source + ZRHODREF, & ! RHO Dry REFerence + ZZW ! Work array +! +REAL, DIMENSION(3) :: ZRTMIN +! +! +REAL :: ZVTRMAX, ZDZMIN, ZT +REAL, SAVE :: ZEXSEDR +LOGICAL, SAVE :: GSFIRSTCALL = .TRUE. +INTEGER, SAVE :: ISPLITR +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE LOOP BOUNDS +! ----------------------- +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +!* 2.1 splitting factor for high Courant number C=v_fall*(del_Z/del_T) +! +firstcall : IF (GSFIRSTCALL) THEN + GSFIRSTCALL = .FALSE. + ZVTRMAX = 10. + ZDZMIN = MINVAL(PZZ(IIB:IIE,IJB:IJE,IKB+1:IKE+1)-PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) + ISPLITR = 1 + SPLIT : DO + ZT = 2.* PTSTEP / FLOAT(ISPLITR) + IF ( ZT * ZVTRMAX / ZDZMIN .LT. 1.) EXIT SPLIT + ISPLITR = ISPLITR + 1 + END DO SPLIT +! + ZEXSEDR = (XBR+XDR+1.0)/(XBR+1.0) +! +END IF firstcall +! +!* 2.2 time splitting loop initialization +! +IF( (KTCOUNT==1) .AND. (CCONF=='START') ) THEN + ZTSPLITR = PTSTEP / FLOAT(ISPLITR) ! Small time step + ZTSTEP = PTSTEP ! Large time step + ELSE + ZTSPLITR= 2. * PTSTEP / FLOAT(ISPLITR) + ZTSTEP = 2. * PTSTEP +END IF +! +!* 2.3 compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! +ZRTMIN(:) = XRTMIN(:) / ZTSTEP +ZZS(:,:,:) = PRAIN(:,:,:) +DO JN = 1 , ISPLITR + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = ZZS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(3) +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN + IF( JN==1 ) THEN + ZZS(:,:,:) = ZZS(:,:,:) * ZTSTEP + DO JK = IKB , IKE-1 + ZW(:,:,JK) =ZTSPLITR*2./(PRHODREF(:,:,JK)*(PZZ(:,:,JK+2)-PZZ(:,:,JK))) + END DO + ZW(:,:,IKE) =ZTSPLITR/(PRHODREF(:,:,IKE)*(PZZ(:,:,IKE+1)-PZZ(:,:,IKE))) + END IF + ALLOCATE(ZRRS(ISEDIM)) + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL=1,ISEDIM + ZRRS(JL) = ZZS(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 +! +!* 2.2.1 for rain +! + ZZW(:) = XFSEDRR * ZRRS(:)**(ZEXSEDR) * ZRHODREF(:)**(ZEXSEDR-XCEXVT) + ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + ZZS(:,:,JK) = ZZS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) + END DO + IF( JN==1 ) THEN + PINPAP(:,:) = ZWSED(:,:,IKB)* & + ( PSVT_MASS(:,:,IKB)/MAX(ZRTMIN(3),PRRT(:,:,IKB)) ) + END IF + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZRRS) + DEALLOCATE(ZZW) + IF( JN==ISPLITR ) THEN + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = ZZS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(3) + ZWSED(:,:,:) = 0.0 + WHERE( GSEDIM(:,:,:) ) + ZWSED(:,:,:) = 1.0/ZTSTEP - PRAIN(:,:,:)/ZZS(:,:,:) + END WHERE + END IF + END IF +END DO +! +! Apply the rain sedimentation rate to the WR_xxx aqueous species +! +PRSVS_MASS(:,:,:) = PRSVS_MASS(:,:,:) + ZWSED(:,:,:)*PSVT_MASS(:,:,:) +! +END SUBROUTINE SCAV_MASS_SEDIMENTATION +! +!------------------------------------------------------------------------------ +! +!################################################################### + FUNCTION COLL_EFFI (PRE, PRE_INV, PRE_SQRT, PSC, PSC_INV, PSC_SQRT, & + PSC_3SQRT, PST, PST_STAR, PSIZE_RATIO, & + PVISC_RATIO, PDENS_RATIO_SQRT) RESULT(PCOL_EF) +!################################################################### +! +!Compute the Raindrop-Aerosol Collision Efficiency +! +!* 0. DECLARATIONS +! --------------- +! + IMPLICIT NONE +! + INTEGER :: I +! + REAL, DIMENSION(:,:), INTENT(IN) :: PRE + REAL, DIMENSION(:,:), INTENT(IN) :: PRE_INV + REAL, DIMENSION(:,:), INTENT(IN) :: PRE_SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PSC + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_INV + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_3SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PST_STAR +! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIZE_RATIO +! + REAL, DIMENSION(:), INTENT(IN) :: PVISC_RATIO + REAL, INTENT(IN) :: PDENS_RATIO_SQRT +! + REAL, DIMENSION(SIZE(ZRE,1)) :: PCOL_EF !result : collision efficiency +! +!------------------------------------------------------------------------------- +! + PCOL_EF(:) = (4.*PSC_INV(:,J1)*PRE_INV(:,J2)*(1.+0.4*PRE_SQRT(:,J2) & + *PSC_3SQRT(:,J1)+0.16*PRE_SQRT(:,J2)*PSC_SQRT(:,J1))) & + +(4.*PSIZE_RATIO(:,J1,J2)*(PVISC_RATIO(:) & + +(1.+2.*PRE_SQRT(:,J2))*PSIZE_RATIO(:,J1,J2))) + DO I=1,ISCAV + IF (PST(I,J1,J2)>PST_STAR(I,J2)) THEN + PCOL_EF(I) = PCOL_EF(I) & + +(PDENS_RATIO_SQRT*((PST(I,J1,J2)-PST_STAR(I,J2)) & + /(PST(I,J1,J2)-PST_STAR(I,J2)+2./3.))**(3./2.)) + ENDIF + ENDDO + END FUNCTION COLL_EFFI +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_PRECIP_SCAVENGING diff --git a/src/MNH/lima_warm.f90 b/src/MNH/lima_warm.f90 new file mode 100644 index 000000000..ef46126cc --- /dev/null +++ b/src/MNH/lima_warm.f90 @@ -0,0 +1,440 @@ +! ##################### + MODULE MODI_LIMA_WARM +! ##################### +! +INTERFACE + SUBROUTINE LIMA_WARM (OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ,& + PRHODREF, PEXNREF, PW_NU, PPABSM, PPABST, & + PTHM, PRCM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D ) +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +! +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +END SUBROUTINE LIMA_WARM +END INTERFACE +END MODULE MODI_LIMA_WARM +! ##################################################################### + SUBROUTINE LIMA_WARM (OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ,& + PRHODREF, PEXNREF, PW_NU, PPABSM, PPABST, & + PTHM, PRCM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D ) +! ##################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the warm microphysical +!! sources: nucleation, sedimentation, autoconversion, accretion, +!! self-collection and vaporisation which are parameterized according +!! to Cohard and Pinty, QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. Then assuming a +!! generalized gamma distribution law for the cloud droplets and the +!! raindrops, the zeroth and third order moments tendencies are evaluated +!! for all the coalescence terms by integrating the Stochastic Collection +!! Equation. As autoconversion is a process that cannot be resolved +!! analytically, the Berry-Reinhardt parameterisation is employed with +!! modifications to initiate the raindrop spectrum mode. The integration +!! of the raindrop evaporation below clouds is straightforward. +!! +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CST +USE MODD_CONF +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_NSV +! +! +USE MODD_BUDGET +USE MODI_BUDGET +! +USE MODE_FM +USE MODE_FMWRIT +! +USE MODI_LIMA_WARM_SEDIM +USE MODI_LIMA_WARM_NUCL +USE MODI_LIMA_WARM_COAL +USE MODI_LIMA_WARM_EVAP +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +! +! +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + ! + PCCS, & ! Cloud water C. source + PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +! +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT, ZTM +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZWLBDR,ZWLBDR3,ZWLBDC,ZWLBDC3 +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNFS(:,:,:,:) = 0. + PNAS(:,:,:,:) = 0. +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE SLOPE PARAMETERS ZLBDC,ZLBDR +! ---------------------------------------- +! +! +ZWLBDC3(:,:,:) = 1.E45 +ZWLBDC(:,:,:) = 1.E15 +! +WHERE (PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) + ZWLBDC3(:,:,:) = XLBC * PCCT(:,:,:) / PRCT(:,:,:) + ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC +END WHERE +! +ZWLBDR3(:,:,:) = 1.E30 +ZWLBDR(:,:,:) = 1.E10 +WHERE (PRRT(:,:,:)>XRTMIN(3) .AND. PCRT(:,:,:)>XCTMIN(3)) + ZWLBDR3(:,:,:) = XLBR * PCRT(:,:,:) / PRRT(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR +END WHERE +ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) +ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +! +CALL LIMA_WARM_SEDIM (OSEDC, KSPLITR, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, & + PINPRR3D ) +! +IF (LBUDGET_RC .AND. OSEDC) & + CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'SEDI_BU_RRC') +IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'SEDI_BU_RRR') +IF (LBUDGET_SV) THEN + IF (OSEDC) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,& + &'SEDI_BU_RSV') ! RCC + IF (ORAIN) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NR,& + &'SEDI_BU_RSV') ! RCR +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTES THE NUCLEATION PROCESS SOURCES +! -------------------------------------- +! +! +IF (LACTI) THEN +! + CALL LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT,& + PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) +! + IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)*PRHODJ(:,:,:),4,'HENU_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:)*PRHODJ(:,:,:),6,'HENU_BU_RRV') + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7,'HENU_BU_RRC') + IF (LBUDGET_SV) THEN + CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'HENU_BU_RSV') ! RCN + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( PNFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'HENU_BU_RSV') + END DO + END IF + END IF +! +END IF ! LACTI +! +! +!------------------------------------------------------------------------------ +! +!* 3. COALESCENCE PROCESSES +! --------------------- +! +! + CALL LIMA_WARM_COAL (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! +! +!------------------------------------------------------------------------------- +! +! 4. EVAPORATION OF RAINDROPS +! ------------------------ +! +! +IF (ORAIN) THEN +! + CALL LIMA_WARM_EVAP (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D ) +! + IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:)*PRHODJ(:,:,:),6 ,'REVA_BU_RRV') + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'REVA_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'REVA_BU_RRR') + IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)*PRHODJ(:,:,:),4 ,'REVA_BU_RTH') + IF (LBUDGET_SV) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'REVA_BU_RSV') + IF (LBUDGET_SV) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NR,'REVA_BU_RSV') +! +! +!------------------------------------------------------------------------------- +! +! 5. SPONTANEOUS BREAK-UP (NUMERICAL FILTER) +! -------------------- +! + ZWLBDR(:,:,:) = 1.E10 + WHERE (PRRS(:,:,:)>0.0.AND.PCRS(:,:,:)>0.0 ) + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE + WHERE (ZWLBDR(:,:,:)<(XACCR1/XSPONBUD1)) + PCRS(:,:,:) = PCRS(:,:,:)*MAX((1.+XSPONCOEF2*(XACCR1/ZWLBDR(:,:,:)-XSPONBUD1)**2),& + (XACCR1/ZWLBDR(:,:,:)/XSPONBUD3)**3) + END WHERE +! +! Budget storage + IF (LBUDGET_SV) & + CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NR,& + &'BRKU_BU_RSV') + +! +ENDIF ! ORAIN +! +!------------------------------------------------------------------------------ +! +! +!* 6. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +!++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +!--cb-- +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM diff --git a/src/MNH/lima_warm_coal.f90 b/src/MNH/lima_warm_coal.f90 new file mode 100644 index 000000000..db696298c --- /dev/null +++ b/src/MNH/lima_warm_coal.f90 @@ -0,0 +1,495 @@ +! ########################## + MODULE MODI_LIMA_WARM_COAL +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_COAL (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +! + END SUBROUTINE LIMA_WARM_COAL +END INTERFACE +END MODULE MODI_LIMA_WARM_COAL +! ############################################################################# + SUBROUTINE LIMA_WARM_COAL (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources: +!! nucleation, sedimentation, autoconversion, accretion, self-collection +!! and vaporisation which are parameterized according to Cohard and Pinty +!! QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! Assuming a generalized gamma distribution law for the cloud droplets +!! and the raindrops, the zeroth and third order moments tendencies +!! are evaluated for all the coalescence terms by integrating the +!! Stochastic Collection Equation. As autoconversion is a process that +!! cannot be resolved analytically, the Berry-Reinhardt parameterisation +!! is employed with modifications to initiate the raindrop spectrum mode. +!! +!! Computation steps : +!! 1- Check where computations are necessary, pack variables +!! 2- Self collection of cloud droplets +!! 3- Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +!! 4- Accretion sources +!! 5- Self collection - Coalescence/Break-up +!! 6- Unpack variables, clean +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +! +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR +USE MODD_BUDGET +USE MODI_BUDGET +! +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GMICRO +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCT ! cloud conc. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRS ! rain conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC3 +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR3 +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR +! +! Work arrays +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZW +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZSCBU +LOGICAL, DIMENSION(:), ALLOCATABLE :: GSELF, & + GACCR, & + GSCBU, & + GENABLE_ACCR_SCBU +! +! +INTEGER :: ISELF, IACCR, ISCBU +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCRT(IMICRO)) +! + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) +! + ALLOCATE(ZLBDC(IMICRO)) + ALLOCATE(ZLBDC3(IMICRO)) + ALLOCATE(ZLBDR(IMICRO)) + ALLOCATE(ZLBDR3(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + DO JL=1,IMICRO + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZLBDR3(JL) = ZWLBDR3(I1(JL),I2(JL),I3(JL)) + ZLBDC(JL) = ZWLBDC(I1(JL),I2(JL),I3(JL)) + ZLBDC3(JL) = ZWLBDC3(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(GSELF(IMICRO)) + ALLOCATE(GACCR(IMICRO)) + ALLOCATE(GSCBU(IMICRO)) + ALLOCATE(ZZW1(IMICRO)) + ALLOCATE(ZZW2(IMICRO)) + ALLOCATE(ZZW3(IMICRO)) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. Self-collection of cloud droplets +! ------------------------------------ +! +! + GSELF(:) = ZCCT(:)>XCTMIN(2) + ISELF = COUNT(GSELF(:)) + IF( ISELF>0 ) THEN + ZZW1(:) = XSELFC*(ZCCT(:)/ZLBDC3(:))**2 * ZRHODREF(:) ! analytical integration + WHERE( GSELF(:) ) + ZCCS(:) = ZCCS(:) - MIN( ZCCS(:),ZZW1(:) ) + END WHERE + END IF +! +! + ZW(:,:,:) = PCCS(:,:,:) + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:))& + &*PRHODJ(:,:,:),12+NSV_LIMA_NC,'SELF_BU_RSV') +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +! ---------------------------------------------------------------------- +! +! +IF (LRAIN) THEN +! + ZZW2(:) = 0.0 + ZZW1(:) = 0.0 + WHERE( ZRCT(:)>XRTMIN(2) ) + ZZW2(:) = MAX( 0.0,XLAUTR*ZRHODREF(:)*ZRCT(:)* & + (XAUTO1/ZLBDC(:)**4-XLAUTR_THRESHOLD) ) ! L +! + ZZW3(:) = MIN( ZRCS(:), MAX( 0.0,XITAUTR*ZZW2(:)*ZRCT(:)* & + (XAUTO2/ZLBDC(:)-XITAUTR_THRESHOLD) ) ) ! L/tau +! + ZRCS(:) = ZRCS(:) - ZZW3(:) + ZRRS(:) = ZRRS(:) + ZZW3(:) +! + ZZW1(:) = MIN( MIN( 1.2E4,(XACCR4/ZLBDC(:)-XACCR5)/XACCR3), & + ZLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for + ! switching the autoconversion regimes + ! min (80 microns, D_h, D_r) + ZZW3(:) = ZZW3(:) * MAX( 0.0,ZZW1(:) )**3 / XAC + ZCRS(:) = ZCRS(:) + ZZW3(:) + END WHERE +! +! + ZW(:,:,:) = PRCS(:,:,:) + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),7 ,'AUTO_BU_RRC') + + ZW(:,:,:) = PRRS(:,:,:) + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),8 ,'AUTO_BU_RRR') + ZW(:,:,:) = PCRS(:,:,:) + IF (LBUDGET_SV) THEN + ZW(:,:,:) = PCRS(:,:,:) + CALL BUDGET (UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),12+NSV_LIMA_NR,'AUTO_BU_RSV') + ZW(:,:,:) = PCCS(:,:,:) + CALL BUDGET (UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),12+NSV_LIMA_NC,'AUTO_BU_RSV') + END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Accretion sources +! -------------------- +! +! + GACCR(:) = ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3) + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + ALLOCATE(ZZW4(IMICRO)); ZZW4(:) = XACCR1/ZLBDR(:) + ALLOCATE(GENABLE_ACCR_SCBU(IMICRO)) + GENABLE_ACCR_SCBU(:) = ZRRT(:)>1.2*ZZW2(:)/ZRHODREF(:) .OR. & + ZZW4(:)>=MAX( XACCR2,XACCR3/(XACCR4/ZLBDC(:)-XACCR5) ) + GACCR(:) = GACCR(:) .AND. ZRCT(:)>XRTMIN(2) .AND. GENABLE_ACCR_SCBU(:) + END IF +! + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + WHERE( GACCR(:).AND.(ZZW4(:)>1.E-4) ) ! Accretion for D>100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ( ZZW1(:) / ZLBDC3(:) ) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW3(:)),ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + WHERE( GACCR(:).AND.(ZZW4(:)<=1.E-4) ) ! Accretion for D<100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:)**2 )*ZRHODREF(:) + ZZW3(:) = ZZW3(:)**2 + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW3(:)) & + ,ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + END IF +! +! + ZW(:,:,:) = PRCS(:,:,:) + IF (LBUDGET_RC) CALL BUDGET ( & + UNPACK(ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),7 ,'ACCR_BU_RRC') + ZW(:,:,:) = PRRS(:,:,:) + IF (LBUDGET_RR) CALL BUDGET ( & + UNPACK(ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),8 ,'ACCR_BU_RRR') + ZW(:,:,:) = PCCS(:,:,:) + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),12+NSV_LIMA_NC,'ACCR_BU_RSV') +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. Self collection - Coalescence/Break-up +! ----------------------------------------- +! +! + IF( IACCR>0 ) THEN + GSCBU(:) = ZCRT(:)>XCTMIN(3) .AND. GENABLE_ACCR_SCBU(:) + ISCBU = COUNT(GSCBU(:)) + ELSE + ISCBU = 0.0 + END IF + IF( ISCBU>0 ) THEN +! +!* 5.1 efficiencies +! + IF (.NOT.ALLOCATED(ZZW4)) ALLOCATE(ZZW4(IMICRO)) + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean diameter + ALLOCATE(ZSCBU(IMICRO)) + ZSCBU(:) = 1.0 + WHERE (ZZW4(:)>=XSCBU_EFF1 .AND. GSCBU(:)) ZSCBU(:) = & ! Coalescence + EXP(XSCBUEXP1*(ZZW4(:)-XSCBU_EFF1)) ! efficiency + WHERE (ZZW4(:)>=XSCBU_EFF2) ZSCBU(:) = 0.0 ! Break-up +! +!* 5.2 integration +! + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean volume drop diameter + WHERE (GSCBU(:).AND.(ZZW4(:)>1.E-4)) ! analytical integration + ZZW1(:) = XSCBU2 * ZCRT(:)**2 / ZLBDR3(:) ! D>100 10-6 m + ZZW3(:) = ZZW1(:)*ZSCBU(:) + END WHERE + WHERE (GSCBU(:).AND.(ZZW4(:)<=1.E-4)) + ZZW2(:) = XSCBU3 *(ZCRT(:) / ZLBDR3(:))**2 ! D<100 10-6 m + ZZW3(:) = ZZW2(:) + END WHERE + ZCRS(:) = ZCRS(:) - MIN( ZCRS(:),ZZW3(:) * ZRHODREF(:) ) + DEALLOCATE(ZSCBU) + END IF +! +! + ZW(:,:,:) = PCRS(:,:,:) + IF (LBUDGET_SV) CALL BUDGET ( & + UNPACK(ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:)) & + *PRHODJ(:,:,:),12+NSV_LIMA_NR,'SCBU_BU_RSV') +! +END IF ! LRAIN +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. Unpack and clean +! ------------------- +! +! + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(GSELF) + DEALLOCATE(GACCR) + DEALLOCATE(GSCBU) + IF( ALLOCATED(GENABLE_ACCR_SCBU) ) DEALLOCATE(GENABLE_ACCR_SCBU) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + IF( ALLOCATED(ZZW4) ) DEALLOCATE(ZZW4) + DEALLOCATE(ZLBDR3) + DEALLOCATE(ZLBDC3) + DEALLOCATE(ZLBDR) + DEALLOCATE(ZLBDC) +! +! +!------------------------------------------------------------------------------- +! +ELSE +!* 7. Budgets are forwarded +! ------------------------ +! +! + IF (LBUDGET_SV) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'SELF_BU_RSV') +! + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'AUTO_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'AUTO_BU_RRR') + IF (LBUDGET_SV) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NR,'AUTO_BU_RSV') + IF (LBUDGET_SV) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'AUTO_BU_RSV') +! + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'ACCR_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'ACCR_BU_RRR') + IF (LBUDGET_SV) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'ACCR_BU_RSV') +! + IF (LBUDGET_SV) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NR,'SCBU_BU_RSV') + +END IF ! IMICRO +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_COAL diff --git a/src/MNH/lima_warm_evap.f90 b/src/MNH/lima_warm_evap.f90 new file mode 100644 index 000000000..09a90d093 --- /dev/null +++ b/src/MNH/lima_warm_evap.f90 @@ -0,0 +1,352 @@ +! ########################## + MODULE MODI_LIMA_WARM_EVAP +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_EVAP (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D) +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! + END SUBROUTINE LIMA_WARM_EVAP +END INTERFACE +END MODULE MODI_LIMA_WARM_EVAP +! ############################################################################# + SUBROUTINE LIMA_WARM_EVAP (PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the raindrop evaporation +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +! +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GEVAP, GMICRO +INTEGER :: IEVAP, IMICRO +INTEGER , DIMENSION(SIZE(GEVAP)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZTHS ! Theta source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZEXNREF ! EXNer Pressure REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZZT ! Temperature +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR ! Lambda(rain) +! +! Work arrays +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, & + ZRTMIN, ZCTMIN, & + ZZLV ! Latent heat of vaporization at T +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZW2, ZRVSAT +! +! +REAL :: ZEPS, ZFACT +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +ZEPS= XMV / XMD +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) + +! +GEVAP(:,:,:) = .FALSE. +GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +! +IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IEVAP >= 1 ) THEN + ALLOCATE(ZRVT(IEVAP)) + ALLOCATE(ZRCT(IEVAP)) + ALLOCATE(ZRRT(IEVAP)) + ALLOCATE(ZCRT(IEVAP)) +! + ALLOCATE(ZRVS(IEVAP)) + ALLOCATE(ZRRS(IEVAP)) + ALLOCATE(ZTHS(IEVAP)) +! + ALLOCATE(ZLBDR(IEVAP)) +! + ALLOCATE(ZRHODREF(IEVAP)) + ALLOCATE(ZEXNREF(IEVAP)) +! + ALLOCATE(ZZT(IEVAP)) + ALLOCATE(ZZLV(IEVAP)) + ALLOCATE(ZZW1(IEVAP)) + DO JL=1,IEVAP + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + END DO + ZZLV(:) = XLVTT + (XCPV-XCL)*(ZZT(:)-XTT) +! + ALLOCATE(ZZW2(IEVAP)) + ALLOCATE(ZZW3(IEVAP)) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the evaporation of rain drops +! ---------------------------------------- +! +! + ZZW3(:) = MAX((1.0 - ZRVT(:)/ZZW1(:)),0.0) ! Subsaturation +! +! Compute the function G(T) +! + ZZW2(:) = 1. / ( XRHOLW*((((ZZLV(:)/ZZT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*ZZT(:))/(XDIVA*EXP(XALPW-XBETAW/ZZT(:)-XGAMW*ALOG(ZZT(:)))))) +! +! Compute the evaporation tendency +! + ZZW2(:) = MIN( ZZW2(:) * ZZW3(:) * ZRRT(:) * & + (X0EVAR*ZLBDR(:)**XEX0EVAR + X1EVAR*ZRHODREF(:)**XEX2EVAR* & + ZLBDR(:)**XEX1EVAR),ZRRS(:) ) + ZZW2(:) = MAX(ZZW2(:),0.0) +! +! Adjust sources +! + ZRVS(:) = ZRVS(:) + ZZW2(:) + ZRRS(:) = ZRRS(:) - ZZW2(:) + ZTHS(:) = ZTHS(:) - ZZW2(:)*ZZLV(:) / & + ( ZEXNREF(:)*(XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:) + ZRRT(:)) ) ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. Unpack and clean +! ------------------- +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:)= PEVAP3D(:,:,:) + PEVAP3D(:,:,:) = UNPACK( ZZW2(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRVT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZZLV) + DEALLOCATE(ZZT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZLBDR) +! +! +!----------------------------------------------------------------------------- +! +! +!* 4. Update Nr if: 80 microns < Dr < D_h +! --------------------------------------- +! +! + GEVAP(:,:,:) = PRRS(:,:,:)>ZRTMIN(3) .AND. PCRS(:,:,:)>ZCTMIN(3) .AND. & + PRCS(:,:,:)>ZRTMIN(2) .AND. PCCS(:,:,:)>ZCTMIN(2) + WHERE (GEVAP(:,:,:)) + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR +! + ZWLBDC3(:,:,:) = XLBC * PCCS(:,:,:) / PRCS(:,:,:) + ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC + ZWLBDC3(:,:,:) = (XACCR1/XACCR3)*(XACCR4/ZWLBDC(:,:,:)-XACCR5) ! 1/D_h, not "Lambda_h" + END WHERE +! + GMICRO(:,:,:) = GEVAP(:,:,:) .AND. ZWLBDR(:,:,:)>ZWLBDC3(:,:,:) + ! the raindrops are too small, that is lower than D_h + ZFACT = 1.2E4*XACCR1 + WHERE (GMICRO(:,:,:)) + ZWLBDC(:,:,:) = XLBR / MIN( ZFACT,ZWLBDC3(:,:,:) )**3 + ZW(:,:,:) = MIN( MAX( & + (PRHODREF(:,:,:)*PRRS(:,:,:) - ZWLBDC(:,:,:)*PCRS(:,:,:)) / & + (PRHODREF(:,:,:)*PRCS(:,:,:)/PCCS(:,:,:) - ZWLBDC(:,:,:)) , & + 0.0 ),PCRS(:,:,:), & + PCCS(:,:,:)*PRRS(:,:,:)/(PRCS(:,:,:))) +! +! Compute the percent (=1 if (ZWLBDR/XACCR1) >= 1.2E4 +! of transfer with (=0 if (ZWLBDR/XACCR1) <= (XACCR4/ZWLBDC-XACCR5)/XACCR3 +! + ZW(:,:,:) = ZW(:,:,:)*( (MIN(ZWLBDR(:,:,:),1.2E4*XACCR1)-ZWLBDC3(:,:,:)) / & + ( 1.2E4*XACCR1 -ZWLBDC3(:,:,:)) ) +! + ZW2(:,:,:) = PCCS(:,:,:) !temporary storage + PCCS(:,:,:) = PCCS(:,:,:)+ZW(:,:,:) + PCRS(:,:,:) = PCRS(:,:,:)-ZW(:,:,:) + ZW(:,:,:) = ZW(:,:,:) * (PRHODREF(:,:,:)*PRCS(:,:,:)/ZW2(:,:,:)) + PRCS(:,:,:) = PRCS(:,:,:)+ZW(:,:,:) + PRRS(:,:,:) = PRRS(:,:,:)-ZW(:,:,:) + END WHERE +! + GEVAP(:,:,:) = PRRS(:,:,:)<ZRTMIN(3) .OR. PCRS(:,:,:)<ZCTMIN(3) + WHERE (GEVAP(:,:,:)) + PCRS(:,:,:) = 0.0 + PRRS(:,:,:) = 0.0 + END WHERE +! +END IF ! IEVAP +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_EVAP diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 new file mode 100644 index 000000000..165ac242d --- /dev/null +++ b/src/MNH/lima_warm_nucl.f90 @@ -0,0 +1,818 @@ +! ########################## + MODULE MODI_LIMA_WARM_NUCL +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT,& + PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the output FM file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +! +REAL, DIMENSION(:,:,:) , INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! CCN C. activated source +! +END SUBROUTINE LIMA_WARM_NUCL +END INTERFACE +END MODULE MODI_LIMA_WARM_NUCL +! ############################################################################# + SUBROUTINE LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, HFMFILE, HLUOUT, OCLOSE_OUT,& + PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the activation of CCN +!! according to Cohard and Pinty, QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. +!! +!! Computation steps : +!! 1- Check where computations are necessary +!! 2- and 3- Compute the maximum of supersaturation using the iterative +!! Ridder algorithm +!! 4- Compute the nucleation source +!! 5- Deallocate local variables +!! +!! Contains : +!! 6- Functions : Ridder algorithm +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +! +USE MODI_GAMMA +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the output FM file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +! +REAL, DIMENSION(:,:,:) , INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! CCN C. activated source +! +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GNUCT +INTEGER :: INUCT +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFS ! available nucleus conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAS ! activated nucleus conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZEXNREF ! EXNer Pressure REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZZT ! Temperature +! +! Work arrays +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, & + ZCTMIN, & + ZZTDT, & ! dT/dt + ZSMAX, & ! Maximum supersaturation + ZVEC1 +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTMP, ZCHEN_MULTI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZTDT, ZDRC, ZRVSAT, ZW +REAL, DIMENSION(SIZE(PNFS,1),SIZE(PNFS,2),SIZE(PNFS,3)) & + :: ZCONC_TOT ! total CCN C. available +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for + ! interpolations +! +! +REAL :: ZEPS ! molar mass ratio +REAL :: ZS1, ZS2, ZXACC +INTEGER :: JMOD +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +!++cb++ +!ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +!--cb-- +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +!++cb++ +!ZRTMIN(:) = XRTMIN(:) / PTSTEP +!--cb-- +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Saturation vapor mixing ratio and radiative tendency +! +ZEPS= XMV / XMD +! +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) +ZTDT(:,:,:) = 0. +ZDRC(:,:,:) = 0. +IF (OACTIT) THEN + ZTDT(:,:,:) = (ZT(:,:,:)-ZTM(:,:,:))/PTSTEP ! dT/dt +!!! JPP +!!! JPP +!!! ZDRC(:,:,:) = (PRCT(:,:,:)-PRCM(:,:,:))/PTSTEP ! drc/dt + ZDRC(:,:,:) = PRCS(:,:,:)-(PRCT(:,:,:)/PTSTEP) ! drc/dt +!!! JPP +!!! JPP + ZTDT(:,:,:) = MIN(0.,ZTDT(:,:,:)+(XG*PW_NU(:,:,:))/XCPD- & + (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) +END IF +! +! find locations where CCN are available +! +ZCONC_TOT(:,:,:) = 0.0 +DO JMOD = 1, NMOD_CCN + ZCONC_TOT(:,:,:) = ZCONC_TOT(:,:,:) + PNFS(:,:,:,JMOD) ! sum over the free CCN +ENDDO +! +! optimization by looking for locations where +! the updraft velocity is positive!!! +! +GNUCT(:,:,:) = .FALSE. +! +! NEW : -22°C = limit sup for condensation freezing in Fridlin et al., 2007 +IF( OACTIT ) THEN + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & + ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN) .AND.& + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& + .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) +ELSE + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .AND.& + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& + .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) +END IF +INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) +! +! +IF( INUCT >= 1 ) THEN +! + ALLOCATE(ZNFS(INUCT,NMOD_CCN)) + ALLOCATE(ZNAS(INUCT,NMOD_CCN)) + ALLOCATE(ZTMP(INUCT,NMOD_CCN)) + ALLOCATE(ZCCS(INUCT)) + ALLOCATE(ZZT(INUCT)) + ALLOCATE(ZZTDT(INUCT)) + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW3(INUCT)) + ALLOCATE(ZZW4(INUCT)) + ALLOCATE(ZZW5(INUCT)) + ALLOCATE(ZZW6(INUCT)) + ALLOCATE(ZCHEN_MULTI(INUCT,NMOD_CCN)) + ALLOCATE(ZVEC1(INUCT)) + ALLOCATE(IVEC1(INUCT)) + ALLOCATE(ZRHODREF(INUCT)) + ALLOCATE(ZEXNREF(INUCT)) + DO JL=1,INUCT + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + ZZTDT(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + DO JMOD = 1,NMOD_CCN + ZNFS(JL,JMOD) = PNFS(I1(JL),I2(JL),I3(JL),JMOD) + ZNAS(JL,JMOD) = PNAS(I1(JL),I2(JL),I3(JL),JMOD) + ZCHEN_MULTI(JL,JMOD) = (ZNFS(JL,JMOD)+ZNAS(JL,JMOD))*PTSTEP*ZRHODREF(JL) & + / XLIMIT_FACTOR(JMOD) + ENDDO + ENDDO +! + ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & + + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the constant term (ZZW3) relative to smax +! ---------------------------------------------------- +! +! Remark : in LIMA's nucleation parameterization, Smax=0.01 for a supersaturation of 1% ! +! +! + ZVEC1(:) = MAX( 1.00001, MIN( FLOAT(NAHEN)-0.00001, & + XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - FLOAT( IVEC1(:) ) + ALLOCATE(ZSMAX(INUCT)) +! +! + IF (OACTIT) THEN ! including a cooling rate +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1*w+Psi3*DT/Dt)**1.5 +! ZZW3 = XAHENG*(Psi1*w + Psi3*DT/Dt)**1.5 = ------------------------ +! 2*pi*rho_l*G**(3/2) +! +! + ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZZTDT(:) + ZZW5(:)=XPSI1( IVEC1(:) )*ZZW2(:)+XPSI3(IVEC1(:) )*ZZTDT(:) + WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) + ZZW4(:) = 0. + ZZW5(:) = 0. + END WHERE + ZZW3(:) = XAHENG( IVEC1(:)+1)*(ZZW4(:)**1.5)* ZVEC1(:) & + - XAHENG( IVEC1(:) )*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0) + ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 +! +! + ELSE ! OACTIT , for clouds +! +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1 * w)**1.5 +! ZZW3 = XAHENG * (Psi1 * w)**1.5 = ------------------------- +! 2 pi rho_l * G**(3/2) +! +! + ZZW3(:)=XAHENG(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & + -XAHENG(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**1.5)*(ZVEC1(:)-1.0) +! + END IF ! OACTIT +! +! +! (Psi1*w+Psi3*DT/Dt)**1.5 rho_air +! ZZW3 = ------------------------ * ------- +! 2*pi*rho_l*G**(3/2) Psi2 +! + ZZW5(:) = 1. + ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of Eq 9 of CPB 98 but + ! for multiple aerosol modes + WHERE (ZZW3(:) == 0.) + ZZW5(:) = -1. + END WHERE +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. Compute the maximum of supersaturation +! ----------------------------------------- +! +! +! estimate S_max for the CPB98 parameterization with SEVERAL aerosols mode +! Reminder : Smax=0.01 for a 1% supersaturation +! +! Interval bounds to tabulate sursaturation Smax +! Check with values used for tabulation in ini_lima_warm.f90 + ZS1 = 1.0E-5 ! corresponds to 0.001% supersaturation + ZS2 = 5.0E-2 ! corresponds to 5.0% supersaturation + ZXACC = 1.0E-7 ! Accuracy needed for the search in [NO UNITS] +! + ZSMAX(:) = ZRIDDR(ZS1,ZS2,ZXACC,ZZW3(:),INUCT) ! ZSMAX(:) is in [NO UNITS] +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Compute the nucleus source +! ----------------------------- +! +! +! Again : Smax=0.01 for a 1% supersaturation +! Modified values for Beta and C (see in init_aerosol_properties) account for that +! + WHERE (ZZW5(:) > 0. .AND. ZSMAX(:) > 0.) + ZVEC1(:) = MAX( 1.00001, MIN( FLOAT(NHYP)-0.00001, & + XHYPINTP1*LOG(ZSMAX(:))+XHYPINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - FLOAT( IVEC1(:) ) + END WHERE + ZZW6(:) = 0. ! initialize the change of cloud droplet concentration +! + ZTMP(:,:)=0.0 +! +! Compute the concentration of activable aerosols for each mode +! based on the max of supersaturation ( -> ZTMP ) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( ZSMAX(:)>0.0 ) + ZZW2(:) = XHYPF12( IVEC1(:)+1,JMOD )* ZVEC1(:) & ! hypergeo function + - XHYPF12( IVEC1(:) ,JMOD )*(ZVEC1(:) - 1.0) ! XHYPF12 is tabulated + ! + ZTMP(:,JMOD) = (ZCHEN_MULTI(:,JMOD)/ZRHODREF(:))*ZSMAX(:)**XKHEN_MULTI(JMOD) & + *ZZW2(:)/PTSTEP + ENDWHERE + ENDDO +! +! Compute the concentration of aerosols activated at this time step +! as the difference between ZTMP and the aerosols already activated at t-dt (ZZW1) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( SUM(ZTMP(:,:),DIM=2)*PTSTEP .GT. 25.E6/ZRHODREF(:) ) + ZZW1(:) = MIN( ZNFS(:,JMOD),MAX( ZTMP(:,JMOD)- ZNAS(:,JMOD) , 0.0 ) ) + ENDWHERE + ! + !* update the concentration of activated CCN = Na + ! + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) + & + UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* update the concentration of free CCN = Nf + ! + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) - & + UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* prepare to update the cloud water concentration + ! + ZZW6(:) = ZZW6(:) + ZZW1(:) + ENDDO +! +! Update PRVS, PRCS, PCCS, and PTHS +! + ZZW1(:)=0. + WHERE (ZZW5(:)>0.0 .AND. ZSMAX(:)>0.0) ! ZZW1 is computed with ZSMAX [NO UNIT] + ZZW1(:) = MIN(XCSTDCRIT*ZZW6(:)/(((ZZT(:)*ZSMAX(:))**3)*ZRHODREF(:)),1.E-5) + END WHERE + ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) +! + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) + ZW(:,:,:) = ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))/ & + (PEXNREF(:,:,:)*(XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZZW6(:)+ZCCS(:),MASK=GNUCT(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = UNPACK( 100.0*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. Cleaning +! ----------- +! +! + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZNFS) + DEALLOCATE(ZNAS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZZT) + DEALLOCATE(ZSMAX) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW5) + DEALLOCATE(ZZW6) + DEALLOCATE(ZZTDT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZCHEN_MULTI) + DEALLOCATE(ZEXNREF) +! +END IF ! INUCT +! +!++cb++ +DEALLOCATE(ZCTMIN) +!--cb-- +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. Functions used to compute the maximum of supersaturation +! ----------------------------------------------------------- +! +! +CONTAINS +!------------------------------------------------------------------------------ +! + FUNCTION ZRIDDR(PX1,PX2INIT,PXACC,PZZW3,NPTS) RESULT(PZRIDDR) +! +! +!!**** *ZRIDDR* - iterative algorithm to find root of a function +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to find the root of a given function +!! the arguments are the brackets bounds (the interval where to find the root) +!! the accuracy needed and the input parameters of the given function. +!! Using Ridders' method, return the root of a function known to lie between +!! PX1 and PX2. The root, returned as PZRIDDR, will be refined to an approximate +!! accuracy PXACC. +!! +!!** METHOD +!! ------ +!! Ridders' method +!! +!! EXTERNAL +!! -------- +!! FUNCSMAX +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! NUMERICAL RECIPES IN FORTRAN 77: THE ART OF SCIENTIFIC COMPUTING +!! (ISBN 0-521-43064-X) +!! Copyright (C) 1986-1992 by Cambridge University Press. +!! Programs Copyright (C) 1986-1992 by Numerical Recipes Software. +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.BERTHET 2008 vectorization +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, DIMENSION(:), INTENT(IN) :: PZZW3 +REAL, INTENT(IN) :: PX1, PX2INIT, PXACC +REAL, DIMENSION(:), ALLOCATABLE :: PZRIDDR +! +!* 0.2 declarations of local variables +! +! +INTEGER, PARAMETER :: MAXIT=60 +REAL, PARAMETER :: UNUSED=0.0 !-1.11e30 +REAL, DIMENSION(:), ALLOCATABLE :: fh,fl, fm,fnew +REAL :: s,xh,xl,xm,xnew +REAL :: PX2 +INTEGER :: j, JL +! +ALLOCATE( fh(NPTS)) +ALLOCATE( fl(NPTS)) +ALLOCATE( fm(NPTS)) +ALLOCATE(fnew(NPTS)) +ALLOCATE(PZRIDDR(NPTS)) +! +PZRIDDR(:)= UNUSED +PX2 = PX2INIT +fl(:) = FUNCSMAX(PX1,PZZW3(:),NPTS) +fh(:) = FUNCSMAX(PX2,PZZW3(:),NPTS) +! +DO JL = 1, NPTS + PX2 = PX2INIT +100 if ((fl(JL) > 0.0 .and. fh(JL) < 0.0) .or. (fl(JL) < 0.0 .and. fh(JL) > 0.0)) then + xl = PX1 + xh = PX2 + do j=1,MAXIT + xm = 0.5*(xl+xh) + fm(JL) = SINGL_FUNCSMAX(xm,PZZW3(JL),JL) + s = sqrt(fm(JL)**2-fl(JL)*fh(JL)) + if (s == 0.0) then + GO TO 101 + endif + xnew = xm+(xm-xl)*(sign(1.0,fl(JL)-fh(JL))*fm(JL)/s) + if (abs(xnew - PZRIDDR(JL)) <= PXACC) then + GO TO 101 + endif + PZRIDDR(JL) = xnew + fnew(JL) = SINGL_FUNCSMAX(PZRIDDR(JL),PZZW3(JL),JL) + if (fnew(JL) == 0.0) then + GO TO 101 + endif + if (sign(fm(JL),fnew(JL)) /= fm(JL)) then + xl =xm + fl(JL)=fm(JL) + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fl(JL),fnew(JL)) /= fl(JL)) then + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fh(JL),fnew(JL)) /= fh(JL)) then + xl =PZRIDDR(JL) + fl(JL)=fnew(JL) + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),JL) + go to 100 + print*, 'PZRIDDR: never get here' + STOP + end if + if (abs(xh-xl) <= PXACC) then + GO TO 101 + endif +!!SB +!!$ if (j == MAXIT .and. (abs(xh-xl) > PXACC) ) then +!!$ PZRIDDR(JL)=0.0 +!!$ go to 101 +!!$ endif +!!SB + end do + print*, 'PZRIDDR: exceeded maximum iterations',j + STOP + else if (fl(JL) == 0.0) then + PZRIDDR(JL)=PX1 + else if (fh(JL) == 0.0) then + PZRIDDR(JL)=PX2 + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),JL) + go to 100 + else +!!$ print*, 'PZRIDDR: root must be bracketed' +!!$ print*,'npts ',NPTS,'jl',JL +!!$ print*, 'PX1,PX2,fl,fh',PX1,PX2,fl(JL),fh(JL) +!!$ print*, 'PX2 = 30 % of supersaturation, there is no solution for Smax' +!!$ print*, 'try to put greater PX2 (upper bound for Smax research)' +!!$ STOP + PZRIDDR(JL)=0.0 + go to 101 + end if +101 ENDDO +! +DEALLOCATE( fh) +DEALLOCATE( fl) +DEALLOCATE( fm) +DEALLOCATE(fnew) +! +END FUNCTION ZRIDDR +! +!------------------------------------------------------------------------------ +! + FUNCTION FUNCSMAX(PPZSMAX,PPZZW3,NPTS) RESULT(PFUNCSMAX) +! +! +!!**** *FUNCSMAX* - function describing SMAX function that you want to find the root +!! +!! +!! PURPOSE +!! ------- +!! This function describe the equilibrium between Smax and two aerosol mode +!! acting as CCN. This function is derive from eq. (9) of CPB98 but for two +!! aerosols mode described by their respective parameters C, k, Mu, Beta. +!! the arguments are the supersaturation in "no unit" and the r.h.s. of this eq. +!! and the ratio of concentration of injected aerosols on maximum concentration +!! of injected aerosols ever. +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAM_LIMA_WARM +!! XHYPF32 +!! +!! XHYPINTP1 +!! XHYPINTP2 +!! +!! Module MODD_PARAM_C2R2 +!! XKHEN_MULTI() +!! NMOD_CCN +!! +!! REFERENCE +!! --------- +!! Cohard, J.M., J.P.Pinty, K.Suhre, 2000:"On the parameterization of activation +!! spectra from cloud condensation nuclei microphysical properties", +!! J. Geophys. Res., Vol.105, N0.D9, pp. 11753-11766 +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.Berthet 19/03/08 Extension a une population multimodale d aerosols +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is already in no units +REAL, DIMENSION(:), INTENT(IN) :: PPZZW3 ! +REAL, DIMENSION(:), ALLOCATABLE :: PFUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +ALLOCATE(PFUNCSMAX(NPTS)) +! +PFUNCSMAX(:) = 0. +PZVEC1 = MAX( 1.00001,MIN( FLOAT(NHYP)-0.00001, & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - FLOAT( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * beta(ki/2,3/2) + PFUNCSMAX(:) = PFUNCSMAX(:) + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(:,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PFUNCSMAX(:) = PFUNCSMAX(:) - PPZZW3(:) +! +END FUNCTION FUNCSMAX +! +!------------------------------------------------------------------------------ +! + FUNCTION SINGL_FUNCSMAX(PPZSMAX,PPZZW3,KINDEX) RESULT(PSINGL_FUNCSMAX) +! +! +!!**** *SINGL_FUNCSMAX* - same function as FUNCSMAX +!! +!! +!! PURPOSE +!! ------- +! As for FUNCSMAX but for a scalar +!! +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KINDEX +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is "no unit" +REAL, INTENT(IN) :: PPZZW3 ! +REAL :: PSINGL_FUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +PSINGL_FUNCSMAX = 0. +PZVEC1 = MAX( 1.00001,MIN( FLOAT(NHYP)-0.00001, & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - FLOAT( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * bêta(ki/2,3/2) + PSINGL_FUNCSMAX = PSINGL_FUNCSMAX + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(KINDEX,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PSINGL_FUNCSMAX = PSINGL_FUNCSMAX - PPZZW3 +! +END FUNCTION SINGL_FUNCSMAX +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_NUCL diff --git a/src/MNH/lima_warm_sedim.f90 b/src/MNH/lima_warm_sedim.f90 new file mode 100644 index 000000000..416291ed8 --- /dev/null +++ b/src/MNH/lima_warm_sedim.f90 @@ -0,0 +1,397 @@ +! ########################### + MODULE MODI_LIMA_WARM_SEDIM +! ########################### +! +INTERFACE + SUBROUTINE LIMA_WARM_SEDIM (OSEDC, KSPLITR, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D ) +! +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! libre parcours moyen +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +! +END SUBROUTINE LIMA_WARM_SEDIM +END INTERFACE +END MODULE MODI_LIMA_WARM_SEDIM +! ##################################################################### + SUBROUTINE LIMA_WARM_SEDIM (OSEDC, KSPLITR, PTSTEP, KMI, & + HFMFILE, HLUOUT, OCLOSE_OUT, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D ) +! ##################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the sedimentation +!! of cloud droplets and rain drops +!! +!! +!!** METHOD +!! ------ +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_CST, ONLY : XRHOLW +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAC, XNUC, XCEXVT +USE MODD_PARAM_LIMA_WARM, ONLY : XLBC, XLBEXC, XLBR, XLBEXR, & + XFSEDRC, XFSEDCC, XFSEDRR, XFSEDCR,& + XDC, XDR +USE MODI_LIMA_FUNCTIONS, ONLY : COUNTJV +USE MODI_GAMMA, ONLY : GAMMA_X0D +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output FM-file +CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for + ! model n +LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of + ! the tput FM fileoutp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! libre parcours moyen +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +! +! +!* 0.2 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GSEDIM +INTEGER :: ISEDIM +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCT ! cloud conc. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRS ! rain conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR +! +! Work arrays +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, & + ZWLBDA, & ! Mean free path + ZWSEDR, ZWSEDC, & ! Sedim. fluxes + ZRAY, & ! Mean volumic radius + ZCC ! Terminal vertical velocity +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, & + ZTCC, & + ZRTMIN, ZCTMIN +! +! +INTEGER :: JK ! Vertical loop index for the rain sedimentation +INTEGER :: JN ! Temporal loop index for the rain sedimentation +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +REAL :: ZTSPLITR ! Small time step for rain sedimentation +! +!------------------------------------------------------------------------------- +! +! 0. Prepare computations +! ----------------------- +! +! +ALLOCATE(ZRTMIN(SIZE(XCTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +ZTSPLITR= PTSTEP / FLOAT(KSPLITR) +! +IF (OSEDC) THEN + ZWLBDA(:,:,:) = 0. + ZRAY(:,:,:) = 0. + ZCC(:,:,:) = 1. + DO JK=IKB,IKE + ZWLBDA(:,:,JK) = 6.6E-8*(101325./PPABST(:,:,JK))*(ZT(:,:,JK)/293.15) + END DO + WHERE (PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) + ZRAY(:,:,:) = 0.5*GAMMA_X0D(XNUC+1./XALPHAC)/(GAMMA_X0D(XNUC)*ZWLBDC(:,:,:)) + ! ZCC : Corrective Cunningham term for the terminal velocity + ZCC(:,:,:)=1.+1.26*ZWLBDA(:,:,:)/ZRAY(:,:,:) + END WHERE +END IF +! +!------------------------------------------------------------------------------- +! +! +! 1. Computations only where necessary +! ------------------------------------ +! +! +DO JN = 1 , KSPLITR + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) & + .AND. PCRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(3) + IF( OSEDC ) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + (PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) & + .AND. PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) + END IF +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN +! + IF( JN==1 ) THEN + IF( OSEDC ) THEN + PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + PCCS(:,:,:) = PCCS(:,:,:) * PTSTEP + END IF + PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + PCRS(:,:,:) = PCRS(:,:,:) * PTSTEP + DO JK = IKB , IKE + ZW(:,:,JK)=ZTSPLITR/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) + END DO + END IF +! + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW1(ISEDIM)) + ALLOCATE(ZZW2(ISEDIM)) + ALLOCATE(ZZW3(ISEDIM)) +! +! +!------------------------------------------------------------------------------- +! +! +! 2. Cloud droplets sedimentation +! ------------------------------- +! +! + IF( OSEDC .AND. MAXVAL(PRCS(:,:,:))>ZRTMIN(2) ) THEN + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ALLOCATE(ZRCS(ISEDIM)) + ALLOCATE(ZCCS(ISEDIM)) + ALLOCATE(ZRCT(ISEDIM)) + ALLOCATE(ZCCT(ISEDIM)) + ALLOCATE(ZTCC(ISEDIM)) + ALLOCATE(ZLBDC(ISEDIM)) + DO JL = 1,ISEDIM + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZTCC(JL) = ZCC (I1(JL),I2(JL),I3(JL)) + END DO + ZLBDC(:) = 1.E15 + WHERE (ZRCT(:)>XRTMIN(2) .AND. ZCCT(:)>XCTMIN(2)) + ZLBDC(:) = ( XLBC*ZCCT(:) / ZRCT(:) )**XLBEXC + END WHERE + WHERE( ZRCS(:)>XRTMIN(2) ) + ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDC(:)**(-XDC) + ZZW1(:) = ZTCC(:) * XFSEDRC * ZRCS(:) * ZZW3(:) * ZRHODREF(:) + ZZW2(:) = ZTCC(:) * XFSEDCC * ZCCS(:) * ZZW3(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCCS(:,:,JK) = PCCS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRCS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRCT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZTCC) + DEALLOCATE(ZLBDC) +! + PINPRC(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF ! OSEDC +! +! +!------------------------------------------------------------------------------- +! +! +! 2. Rain drops sedimentation +! --------------------------- +! +! + IF( MAXVAL(PRRS(:,:,:))>ZRTMIN(3) ) THEN + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ALLOCATE(ZRRS(ISEDIM)) + ALLOCATE(ZCRS(ISEDIM)) + ALLOCATE(ZRRT(ISEDIM)) + ALLOCATE(ZCRT(ISEDIM)) + ALLOCATE(ZLBDR(ISEDIM)) + DO JL = 1,ISEDIM + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDR(:) = 1.E10 + WHERE (ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3)) + ZLBDR(:) = ( XLBR*ZCRT(:) / ZRRT(:) )**XLBEXR + END WHERE + WHERE( ZRRS(:)>XRTMIN(3) ) + ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDR(:)**(-XDR)) + ZZW1(:) = XFSEDRR * ZRRS(:) * ZZW3(:) * ZRHODREF(:) + ZZW2(:) = XFSEDCR * ZCRS(:) * ZZW3(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCRS(:,:,JK) = PCRS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZLBDR) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF ! max PRRS > ZRTMIN(3) +! + IF( JN.EQ.1 ) THEN + PINPRR(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + PINPRR3D(:,:,:) = ZWSEDR(:,:,:)/XRHOLW ! in m/s + END IF +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + IF( JN==KSPLITR ) THEN + IF( OSEDC ) THEN + PRCS(:,:,:) = PRCS(:,:,:) / PTSTEP + PCCS(:,:,:) = PCCS(:,:,:) / PTSTEP + END IF + PRRS(:,:,:) = PRRS(:,:,:) / PTSTEP + PCRS(:,:,:) = PCRS(:,:,:) / PTSTEP + END IF + END IF ! ISEDIM +END DO ! KSPLITR +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_SEDIM diff --git a/src/MNH/modd_lima_precip_scavengingn.f90 b/src/MNH/modd_lima_precip_scavengingn.f90 new file mode 100644 index 000000000..a0866da9d --- /dev/null +++ b/src/MNH/modd_lima_precip_scavengingn.f90 @@ -0,0 +1,59 @@ +! #################################### + MODULE MODD_LIMA_PRECIP_SCAVENGING_n +! #################################### +! +!!**** *MODD_PRECIP_SCAVENGING$n* - declaration of scavenged aerosols +!! precipitating fields +!! +!! PURPOSE +!! ------- +! Stores the INstantaneous and ACcumulated PRecipitating fields of +!! scavenged aerosol by rain +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +TYPE LIMA_PRECIP_SCAVENGING_t + REAL, DIMENSION(:,:), POINTER :: XINPAP=>NULL(), XACPAP=>NULL() + ! Instant and cumul of ground + ! precipitation fields of Scavenged + ! Aerosol Particles +END TYPE LIMA_PRECIP_SCAVENGING_t + +TYPE(LIMA_PRECIP_SCAVENGING_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PRECIP_SCAVENGING_MODEL + +REAL, DIMENSION(:,:), POINTER :: XINPAP=>NULL(), XACPAP=>NULL() + +CONTAINS + +SUBROUTINE LIMA_PRECIP_SCAVENGING_GOTO_MODEL(KFROM, KTO) + INTEGER, INTENT(IN) :: KFROM, KTO + ! + ! Save current state for allocated arrays + PRECIP_SCAVENGING_MODEL(KFROM)%XINPAP=>XINPAP + PRECIP_SCAVENGING_MODEL(KFROM)%XACPAP=>XACPAP + ! + ! Current model is set to model KTO + XINPAP=>PRECIP_SCAVENGING_MODEL(KTO)%XINPAP + XACPAP=>PRECIP_SCAVENGING_MODEL(KTO)%XACPAP + ! +END SUBROUTINE LIMA_PRECIP_SCAVENGING_GOTO_MODEL +! +! +END MODULE MODD_LIMA_PRECIP_SCAVENGING_n diff --git a/src/MNH/modd_param_lima.f90 b/src/MNH/modd_param_lima.f90 new file mode 100644 index 000000000..6c838bb17 --- /dev/null +++ b/src/MNH/modd_param_lima.f90 @@ -0,0 +1,185 @@ +! ###################### + MODULE MODD_PARAM_LIMA +! ###################### +! +!!**** *MODD_PARAM_LIMA* - declaration of the control parameters +!! for use in the LIMA scheme. +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to declare the microphysical +!! constants. This includes the descriptive parameters for the raindrop +!! and the parameters relevant of the dimensional distributions. +!! +!! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +USE MODD_PARAMETERS, ONLY : JPLIMACCNMAX, JPLIMAIFNMAX +! +IMPLICIT NONE +! +LOGICAL, SAVE :: LLIMA_DIAG ! Compute diagnostics for concentration /m3 +! +!* 1. COLD SCHEME +! ----------- +! +! 1.1 Cold scheme configuration +! +LOGICAL, SAVE :: LCOLD ! TRUE to enable the cold scheme +LOGICAL, SAVE :: LNUCL ! TRUE to enable ice nucleation +LOGICAL, SAVE :: LSEDI ! TRUE to enable pristine ice sedimentation +LOGICAL, SAVE :: LHHONI ! TRUE to enable freezing of haze particules +LOGICAL, SAVE :: LSNOW ! TRUE to enable snow and graupel +LOGICAL, SAVE :: LHAIL ! TRUE to enable hail +LOGICAL, SAVE :: LMEYERS ! TRUE to use Meyers nucleation +! +! 1.2 IFN initialisation +! +INTEGER, SAVE :: NMOD_IFN ! Number of IFN modes +REAL, DIMENSION(JPLIMAIFNMAX), SAVE :: XIFN_CONC ! Ref. concentration of IFN(#/L) +LOGICAL, SAVE :: LIFN_HOM ! True for z-homogeneous IFN concentrations +CHARACTER(LEN=8), SAVE :: CIFN_SPECIES ! Internal mixing species definitions +CHARACTER(LEN=8), SAVE :: CINT_MIXING ! Internal mixing type selection (pure DM1 ...) +INTEGER, SAVE :: NMOD_IMM ! Number of CCN modes acting by immersion +INTEGER, SAVE :: NIND_SPECIE ! CCN acting by immersion are considered pure + ! IFN of either DM = 1, BC = 2 or O = 3 +INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NIMM ! Link between CCN and IMM modes +INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NINDICE_CCN_IMM ! ?????????? +INTEGER, SAVE :: NSPECIE ! Internal mixing number of species +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XMDIAM_IFN ! Mean diameter of IFN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XSIGMA_IFN ! Sigma of IFN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XRHO_IFN ! Density of IFN modes +REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XFRAC ! Composition of each IFN mode +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XFRAC_REF ! AP compostion in Phillips 08 +! +! 1.3 Ice characteristics +! +CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE_LIMA ! Pristine type PLAT, COLU or BURO +CHARACTER(LEN=4), SAVE :: CHEVRIMED_ICE_LIMA ! Heavily rimed type GRAU or HAIL +REAL,SAVE :: XALPHAI,XNUI, & ! Pristine ice distribution parameters + XALPHAS,XNUS, & ! Snow/aggregate distribution parameters + XALPHAG,XNUG ! Graupel distribution parameters +! +! 1.4 Phillips (2013) nucleation parameterization +! +INTEGER, SAVE :: NPHILLIPS ! =8 for Phillips08, =13 for Phillips13 +! +REAL, DIMENSION(4), SAVE :: XT0 ! Threshold of T in H_X for X={DM1,DM2,BC,O} [K] +REAL, DIMENSION(4), SAVE :: XDT0 ! Range in T for transition of H_X near XT0 [K] +REAL, DIMENSION(4), SAVE :: XDSI0 ! Range in Si for transition of H_X near XSI0 +REAL, SAVE :: XSW0 ! Threshold of Sw in H_X +REAL, SAVE :: XRHO_CFDC ! Air density at which CFDC data were reported [kg m**3] +REAL, DIMENSION(4), SAVE :: XH ! Fraction<<1 of aerosol for X={DM,BC,O} +REAL, DIMENSION(4), SAVE :: XAREA1 ! Total surface of all aerosols in group X with + ! diameters between 0.1 and 1 µm, for X={DM1,DM2,BC,O} [m**2 kg**-1] +REAL, SAVE :: XGAMMA ! Factor boosting IN concentration due to + ! bulk-liquid modes +! +REAL, DIMENSION(4), SAVE :: XTX1 ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K] +REAL, DIMENSION(4), SAVE :: XTX2 ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K] +! +REAL,DIMENSION(:), SAVE, ALLOCATABLE :: XABSCISS, XWEIGHT ! Gauss quadrature method +INTEGER, SAVE :: NDIAM ! Gauss quadrature accuracy +! +! 1.5 Meyers (1992) nucleation parameterization +! +REAL,SAVE :: XFACTNUC_DEP,XFACTNUC_CON ! Amplification factor for IN conc. + ! DEP refers to DEPosition mode + ! CON refers to CONtact mode +! +!------------------------------------------------------------------------------- +! +! +!* 2. WARM SCHEME +! ----------- +! +! 2.1 Warm scheme configuration +! +LOGICAL, SAVE :: LWARM ! TRUE to enable the warm scheme +LOGICAL, SAVE :: LACTI ! TRUE to enable CCN activation +LOGICAL, SAVE :: LRAIN ! TRUE to enable the formation of rain +LOGICAL, SAVE :: LSEDC ! TRUE to enable the droplet sedimentation +LOGICAL, SAVE :: LACTIT ! TRUE to enable the usage of dT/dt in CCN activation +LOGICAL, SAVE :: LBOUND ! TRUE to enable the continuously replenishing + ! aerosol concentrations through the open + ! lateral boundaries -> boundaries.f90 +! +! 2.2 CCN initialisation +! +INTEGER, SAVE :: NMOD_CCN ! Number of CCN modes +REAL, DIMENSION(JPLIMACCNMAX), SAVE :: XCCN_CONC ! CCN conc. (#/cm3) +LOGICAL, SAVE :: LCCN_HOM ! True for z-homogeneous CCN concentrations +CHARACTER(LEN=8),SAVE :: CCCN_MODES ! CCN modes characteristics (Jungfraujoch ...) +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XR_MEAN_CCN, & ! Mean radius of CCN modes + XLOGSIG_CCN, & ! Log of geometric dispersion of the CCN modes + XRHO_CCN ! Density of the CCN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XKHEN_MULTI, & ! Parameters defining the CCN activation + XMUHEN_MULTI, & ! spectra for a multimodal aerosol distribution + XBETAHEN_MULTI ! +REAL, DIMENSION(:,:,:) ,SAVE, ALLOCATABLE :: XCONC_CCN_TOT !* Total aerosol number concentration +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XLIMIT_FACTOR !* compute CHEN ???????????? +! +! 2.3 Water particles characteristics +! +REAL,SAVE :: XALPHAR,XNUR, & ! Raindrop distribution parameters + XALPHAC,XNUC ! Cloud droplet distribution parameters +! +! 2.4 CCN activation +! +CHARACTER(LEN=3),SAVE :: HPARAM_CCN = 'CPB' ! Parameterization of the CCN activation +CHARACTER(LEN=3),SAVE :: HINI_CCN ! Initialization type of CCN activation +CHARACTER(LEN=1),DIMENSION(JPLIMACCNMAX),SAVE :: HTYPE_CCN ! 'M' or 'C' CCN type +REAL,SAVE :: XFSOLUB_CCN, & ! Fractionnal solubility of the CCN + XACTEMP_CCN, & ! Expected temperature of CCN activation + XAERDIFF, XAERHEIGHT ! For the vertical gradient of aerosol distribution +! +!------------------------------------------------------------------------------- +! +! +!* 3. BELOW CLOUD SCAVENGING +! ---------------------- +! +LOGICAL, SAVE :: LSCAV ! TRUE for aerosol scavenging by precipitations +LOGICAL, SAVE :: LAERO_MASS ! TRUE to compute the total aerosol mass scavenging rate +! +INTEGER :: NDIAMR = 20 ! Max Number of droplet for quadrature method +INTEGER :: NDIAMP = 20 ! Max Number of aerosol particle for quadrature method +! +REAL, SAVE :: XT0SCAV = 293.15 ! [K] +REAL, SAVE :: XTREF = 273.15 ! [K] +REAL, SAVE :: XNDO = 8.*1.0E6 ! [/m**4] +! +!------------------------------------------------------------------------------- +! +! +!* 4. ATMOSPHERIC & OTHER PARAMETERS +! ------------------------------ +! +REAL, SAVE :: XMUA0 = 1.711E-05 ![Pa.s] Air Viscosity at T=273.15K +REAL, SAVE :: XT_SUTH_A = 110.4 ![K] Sutherland Temperature for Air +REAL, SAVE :: XMFPA0 = 6.6E-08 ![m] Mean Free Path of Air under standard conditions +! +REAL, SAVE :: XVISCW = 1.0E-3 ![Pa.s] water viscosity at 20°C +REAL, SAVE :: XRHO00 = 1.292 !rho on the floor [Kg/m**3] +! +REAL,SAVE :: XCEXVT ! air density fall speed correction +! +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN ! Min values of the mixing ratios +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XCTMIN ! Min values of the drop concentrations +! +END MODULE MODD_PARAM_LIMA diff --git a/src/MNH/modd_param_lima_cold.f90 b/src/MNH/modd_param_lima_cold.f90 new file mode 100644 index 000000000..2df3032ba --- /dev/null +++ b/src/MNH/modd_param_lima_cold.f90 @@ -0,0 +1,122 @@ +! ########################### + MODULE MODD_PARAM_LIMA_COLD +! ########################### +! +!!**** *MODD_PARAM_LIMA_COLD* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA cold scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +! Declaration of microphysical constants, including the descriptive +! parameters for the raindrop and the ice crystal habits, and the +! parameters relevant of the dimensional distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! N(Lbda) = XCCx * Lbda**XCXx : NumberConc-Slopeparam relationship +! XF0x, XF1x, XF2x : Ventilation factors +! XC1x : Shape parameter for deposition +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the +! distribution law +! +REAL,SAVE :: XLBEXI,XLBI ! Prist. ice distribution parameters +REAL,SAVE :: XLBEXS,XLBS ! Snow/agg. distribution parameters +! +REAL,SAVE :: XAI,XBI,XC_I,XDI ,XF0I,XF2I,XC1I ! Cloud ice charact. +REAL,SAVE :: XF0IS,XF1IS ! (large Di vent. coef.) +REAL,SAVE :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg. charact. +! +REAL,SAVE :: XLBDAS_MAX ! Max values allowed for the shape + ! parameter of snow +! +CHARACTER(LEN=8),DIMENSION(5),PARAMETER & + :: CLIMA_COLD_NAMES=(/'CICE ','CIFNFREE','CIFNNUCL', & + 'CCNINIMM','CCCNNUCL'/) + ! basenames of the SV articles stored + ! in the binary files + !with IF:Ice-nuclei Free (nonactivated IFN by Dep/Cond) + ! IN:Ice-nuclei Nucleated (activated IFN by Dep/Cond) + ! NI:Nuclei Immersed (activated IFN by Imm) + ! HF:Homogeneous Freezing +CHARACTER(LEN=3),DIMENSION(5),PARAMETER & + :: CLIMA_COLD_CONC=(/'NI ','NIF','NIN','NNI','NNH'/)!for DIAG +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS +! --------------------- +! +REAL,SAVE :: XFSEDRI,XFSEDCI, & ! Constants for sedimentation + XFSEDS, XEXSEDS ! fluxes of ice and snow +! +REAL,SAVE :: XNUC_DEP,XEXSI_DEP,XEX_DEP, & ! Constants for heterogeneous + XNUC_CON,XEXTT_CON,XEX_CON, & ! ice nucleation : DEP et CON + XMNU0 ! mass of nucleated ice crystal +! +REAL,SAVE :: XRHOI_HONH,XCEXP_DIFVAP_HONH, & ! Constants for homogeneous + XCOEF_DIFVAP_HONH,XRCOEF_HONH, & ! haze freezing : HHONI + XCRITSAT1_HONH,XCRITSAT2_HONH, & + XTMIN_HONH,XTMAX_HONH, & + XDLNJODT1_HONH,XDLNJODT2_HONH, & + XC1_HONH,XC2_HONH,XC3_HONH +! +REAL,SAVE :: XC_HONC,XR_HONC, & ! Constants for homogeneous + XTEXP1_HONC,XTEXP2_HONC, & ! droplet freezing : CHONI + XTEXP3_HONC,XTEXP4_HONC, & + XTEXP5_HONC +! +REAL,SAVE :: XCSCNVI_MAX, XLBDASCNVI_MAX, & + XRHORSMIN, & + XDSCNVI_LIM, XLBDASCNVI_LIM, & ! Constants for snow + XC0DEPSI,XC1DEPSI, & ! sublimation conversion to + XR0DEPSI,XR1DEPSI ! pristine ice : SCNVI +! +REAL,SAVE :: XSCFAC, & ! Constants for the Bergeron + X0DEPI,X2DEPI, & ! Findeisen process and + X0DEPS,X1DEPS,XEX0DEPS,XEX1DEPS ! deposition +! +REAL,SAVE :: XDICNVS_LIM, XLBDAICNVS_LIM, & ! Constants for pristine ice + XC0DEPIS,XC1DEPIS, & ! deposition conversion to + XR0DEPIS,XR1DEPIS ! snow : ICNVS +! +REAL,SAVE :: XCOLEXIS, & ! Constants for snow + XAGGS_CLARGE1,XAGGS_CLARGE2, & ! aggregation : AGG + XAGGS_RLARGE1,XAGGS_RLARGE2 +! +!?????????????????? +REAL,SAVE :: XKER_ZRNIC_A1,XKER_ZRNIC_A2 ! Long-Zrnic Kernels (ini_ice_coma) +! +REAL,SAVE :: XSELFI,XCOLEXII ! Constants for pristine ice + ! self-collection (ini_ice_coma) +! +REAL,SAVE :: XAUTO3, XAUTO4, & ! Constants for pristine ice + XLAUTS, XLAUTS_THRESHOLD, & ! autoconversion : AUT + XITAUTS, XITAUTS_THRESHOLD, & ! (ini_ice_com) + XTEXAUTI +! +REAL,SAVE :: XCONCI_MAX ! Limitation of the pristine + ! ice concentration (init and grid-nesting) +REAL,SAVE :: XFREFFI ! Factor to compute the cloud ice effective radius +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_COLD diff --git a/src/MNH/modd_param_lima_mixed.f90 b/src/MNH/modd_param_lima_mixed.f90 new file mode 100644 index 000000000..f13accfc6 --- /dev/null +++ b/src/MNH/modd_param_lima_mixed.f90 @@ -0,0 +1,169 @@ +! ############################ + MODULE MODD_PARAM_LIMA_MIXED +! ###########################{ +! +!!**** *MODD_PARAM_LIMA_MIXED* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA mixed scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +! Declaration of microphysical constants, including the descriptive +! parameters for the raindrop and the ice crystal habits, and the +! parameters relevant of the dimensional distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! N(Lbda) = XCCx * Lbda**XCXx : NumberConc-Slopeparam relationship +! XF0x, XF1x, XF2x : Ventilation factors +! XC1x : Shape parameter for deposition +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the +! distribution law +! +REAL,SAVE :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel charact. +REAL,SAVE :: XLBEXG,XLBG ! Graupel distribution parameters +REAL,SAVE :: XLBDAG_MAX ! Max values allowed for the shape + ! parameter of graupeln +! +REAL,SAVE :: XAH,XBH,XCH,XDH,XCCH,XCXH,XF0H,XF1H,XC1H ! Hail charact. +REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail distribution parameters +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS - Graupel +! ------------------------------- +! +REAL,SAVE :: XFSEDG, XEXSEDG ! Sedimentation fluxes of Graupel +! +REAL,SAVE :: X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG ! Deposition on graupel +! +REAL,SAVE :: XHMTMIN,XHMTMAX,XHM1,XHM2, & ! Constants for the + XHM_YIELD,XHM_COLLCS,XHM_FACTS, & ! revised + XHM_COLLCG,XHM_FACTG, & ! Hallett-Mossop process + XGAMINC_HMC_BOUND_MIN, & ! Min val. of Lbda_c for HMC + XGAMINC_HMC_BOUND_MAX, & ! Max val. of Lbda_c for HMC + XHMSINTP1,XHMSINTP2, & ! (this is no more used !) + XHMLINTP1,XHMLINTP2 +! +REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of + XEXCRIMSS,XCRIMSS, & ! the aggregates : RIM + XEXCRIMSG,XCRIMSG, & ! + XEXSRIMCG,XSRIMCG, & ! + XGAMINC_BOUND_MIN, & ! Min val. of Lbda_s for RIM + XGAMINC_BOUND_MAX, & ! Max val. of Lbda_s for RIM + XRIMINTP1,XRIMINTP2 ! Csts for lin. interpol. of + ! the tab. incomplete Gamma law +INTEGER,SAVE :: NGAMINC ! Number of tab. Lbda_s +REAL, DIMENSION(:), SAVE, ALLOCATABLE & + :: XGAMINC_RIM1, & ! Tab. incomplete Gamma funct. + XGAMINC_RIM2, & ! for XDS+2 and for XBS + XGAMINC_HMC ! and for the HM process +! +REAL,SAVE :: XFRACCSS, & ! Constants for the accretion + XLBRACCS1,XLBRACCS2,XLBRACCS3, & ! raindrops onto the aggregates + XFSACCRG, & ! ACC (processes RACCSS and + XLBSACCR1,XLBSACCR2,XLBSACCR3, & ! SACCRG) + XACCLBDAS_MIN, & ! Min val. of Lbda_s for ACC + XACCLBDAS_MAX, & ! Max val. of Lbda_s for ACC + XACCLBDAR_MIN, & ! Min val. of Lbda_r for ACC + XACCLBDAR_MAX, & ! Max val. of Lbda_r for ACC + XACCINTP1S,XACCINTP2S, & ! Csts for bilin. interpol. of + XACCINTP1R,XACCINTP2R ! Lbda_s and Lbda_r in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +INTEGER,SAVE :: NACCLBDAS, & ! Number of Lbda_s values and + NACCLBDAR ! of Lbda_r values in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_RACCSS, & ! Normalized kernel for RACCSS + XKER_RACCS, & ! Normalized kernel for RACCS + XKER_SACCRG ! Normalized kernel for SACCRG +REAL,SAVE :: XFSCVMG ! Melting-conversion factor of + ! the aggregates +! +REAL,SAVE :: XCOLIR, & ! Constants for rain contact + XEXRCFRI,XRCFRI, & ! freezing : CFR + XEXICFRR,XICFRR ! +! +REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth + XCOLCG, & ! of the graupeln : + XCOLIG,XCOLEXIG,XFIDRYG, & ! + XCOLSG,XCOLEXSG,XFSDRYG, & ! RCDRYG + XLBSDRYG1,XLBSDRYG2,XLBSDRYG3, & ! RIDRYG + XFRDRYG, & ! RSDRYG + XLBRDRYG1,XLBRDRYG2,XLBRDRYG3, & ! RRDRYG + XDRYLBDAR_MIN, & ! Min val. of Lbda_r for DRY + XDRYLBDAR_MAX, & ! Max val. of Lbda_r for DRY + XDRYLBDAS_MIN, & ! Min val. of Lbda_s for DRY + XDRYLBDAS_MAX, & ! Max val. of Lbda_s for DRY + XDRYLBDAG_MIN, & ! Min val. of Lbda_g for DRY + XDRYLBDAG_MAX, & ! Max val. of Lbda_g for DRY + XDRYINTP1R,XDRYINTP2R, & ! Csts for bilin. interpol. of + XDRYINTP1S,XDRYINTP2S, & ! Lbda_r, Lbda_s and Lbda_g in + XDRYINTP1G,XDRYINTP2G ! the XKER_SDRYG and XKER_RDRYG + ! tables +INTEGER,SAVE :: NDRYLBDAR, & ! Number of Lbda_r, + NDRYLBDAS, & ! of Lbda_s and + NDRYLBDAG ! of Lbda_g values in + ! the XKER_SDRYG and XKER_RDRYG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SDRYG, & ! Normalized kernel for SDRYG + XKER_RDRYG ! Normalized kernel for RDRYG +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS - Hail +! ---------------------------- +! +REAL,SAVE :: XFSEDH,XEXSEDH ! Constants for sedimentation +! +! +REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition +! +REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth + XLBSWETH1,XLBSWETH2,XLBSWETH3, & ! of the hailstones : WET + XFGWETH, & ! processes RSWETH + XLBGWETH1,XLBGWETH2,XLBGWETH3, & ! RGWETH + XWETLBDAS_MIN, & ! Min val. of Lbda_s for WET + XWETLBDAS_MAX, & ! Max val. of Lbda_s for WET + XWETLBDAG_MIN, & ! Min val. of Lbda_g for WET + XWETLBDAG_MAX, & ! Max val. of Lbda_g for WET + XWETLBDAH_MIN, & ! Min val. of Lbda_h for WET + XWETLBDAH_MAX, & ! Max val. of Lbda_h for WET + XWETINTP1S,XWETINTP2S, & ! Csts for bilin. interpol. of + XWETINTP1G,XWETINTP2G, & ! Lbda_r, Lbda_s and Lbda_g in + XWETINTP1H,XWETINTP2H ! the XKER_SWETH and XKER_GWETH + ! tables +INTEGER,SAVE :: NWETLBDAS, & ! Number of Lbda_s, + NWETLBDAG, & ! of Lbda_g and + NWETLBDAH ! of Lbda_h values in + ! the XKER_SWETH and XKER_GWETH + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SWETH, & ! Normalized kernel for SWETH + XKER_GWETH ! Normalized kernel for GWETH + +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_MIXED diff --git a/src/MNH/modd_param_lima_warm.f90 b/src/MNH/modd_param_lima_warm.f90 new file mode 100644 index 000000000..d0688aa72 --- /dev/null +++ b/src/MNH/modd_param_lima_warm.f90 @@ -0,0 +1,119 @@ +! ########################### + MODULE MODD_PARAM_LIMA_WARM +! ########################### +! +!!**** *MODD_PARAM_LIMA_WARM* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA warm scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +REAL,SAVE :: XLBC, XLBEXC, & ! shape parameters of the cloud droplets + XLBR, XLBEXR ! shape parameters of the raindrops +! +REAL,SAVE :: XAR,XBR,XCR,XDR,XF0R,XF1R, & ! Raindrop charact. + XCCR, & !For diagnostics + XAC,XBC,XCC,XDC,XF0C,XF2C,XC1C ! Cloud droplet charact. +! +! +CHARACTER(LEN=8),DIMENSION(4),PARAMETER & + :: CLIMA_WARM_NAMES=(/'CCLOUD ','CRAIN ','CCCNFREE','CCCNACTI'/) + ! basenames of the SV articles stored + ! in the binary files +CHARACTER(LEN=5),DIMENSION(4),PARAMETER & + :: CLIMA_WARM_CONC=(/'NC ','NR ','NFREE','NCCN '/) +! ! basenames of the SV articles stored +! ! in the binary files for DIAG +! +!* Special issue for Below-Cloud SCAVenging of Aerosol particles +CHARACTER(LEN=6),DIMENSION(2) :: CAERO_MASS =(/'MASSAP', 'MAP '/) +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS +! --------------------- +! +REAL,SAVE :: XFSEDRR,XFSEDCR, & ! Constants for sedimentation + XFSEDRC,XFSEDCC ! fluxes of R, C +! +! +REAL,SAVE :: XDIVA, & ! Diffusivity of water vapor + XTHCO ! Thermal conductivity +REAL,SAVE :: XWMIN ! Min value of updraft velocity + ! to enable nucleation process +REAL,SAVE :: XTMIN ! Min value of + ! temperature evolution + ! to enable nucleation process +REAL,SAVE :: XCSTHEN,XCSTDCRIT ! Cst for HEN precalculations +INTEGER, SAVE :: NHYP ! Number of value of the HYP + ! functions +REAL,SAVE :: XHYPINTP1, XHYPINTP2 ! Factors defining the + ! supersaturation log scale +REAL, DIMENSION(:,:), SAVE, ALLOCATABLE & ! Tabulated HYPgeometric + :: XHYPF12, XHYPF32 ! functions used in HEN +INTEGER, SAVE :: NAHEN ! Number of value of the AHEN + ! functions +REAL,SAVE :: XAHENINTP1, XAHENINTP2 ! Factors defining the + ! temperatures in lin scale +REAL, DIMENSION(:), SAVE, ALLOCATABLE & ! + :: XAHENG,XPSI1, XPSI3, & ! Twomey-CPB98 and + XAHENF,XAHENY ! Feingold-Heymsfield + ! parameterization to compute Smax +REAL,SAVE :: XWCOEF_F1, XWCOEF_F2, XWCOEF_F3, & ! COEF_F of the polynomial temp. + XWCOEF_Y1, XWCOEF_Y2, XWCOEF_Y3 ! COEF_Y of the polynomial temp. + ! function powering W +! +! +REAL,SAVE :: XKERA1, XKERA2 ! Constants to define the lin + ! and parabolic kernel param. +REAL,SAVE :: XSELFC ! Constants for cloud droplet + ! selfcollection : SELF +! +REAL,SAVE :: XAUTO1, XAUTO2, XCAUTR, & ! Constants for cloud droplet + XLAUTR, XLAUTR_THRESHOLD, & ! autoconversion : AUT + XITAUTR, XITAUTR_THRESHOLD +! +REAL,SAVE :: XACCR1, XACCR2, XACCR3, & ! Constants for the accretion + XACCR4, XACCR5, XACCR6, & ! process + XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, & + XACCR_CSMALL1, XACCR_CSMALL2, XACCR_RSMALL1, XACCR_RSMALL2 +! +REAL,SAVE :: XSCBU2, XSCBU3, & ! Constants for the raindrop + XSCBU_EFF1, XSCBU_EFF2, XSCBUEXP1 ! breakup-selfcollection: SCBU +! +REAL,SAVE :: XSPONBUD1,XSPONBUD2,XSPONBUD3, & ! Spontaneous Break-up + XSPONCOEF2 ! (drop size limiter) +! +REAL,SAVE :: X0EVAR, X1EVAR, & ! Constants for raindrop + XEX0EVAR, XEX1EVAR, XEX2EVAR ! evaporation: EVA +! +REAL,DIMENSION(:,:,:,:), SAVE, ALLOCATABLE :: XCONCC_INI +REAL,SAVE :: XCONCR_PARAM_INI + ! Used to initialize the + ! concentrations from mixing ratios + ! (init and grid-nesting from Kessler) +! +REAL,SAVE :: X0CNDC, X2CNDC ! Constants for cloud droplet + ! condensation/evaporation +REAL,SAVE :: XFREFFC ! Factor to compute the cloud droplet effective radius +REAL,SAVE :: XFREFFR ! Factor to compute the rain drop effective radius +REAL,SAVE :: XCREC, XCRER + ! Factors to compute reff when cloud and rain are present +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_WARM diff --git a/src/MNH/modn_param_lima.f90 b/src/MNH/modn_param_lima.f90 new file mode 100644 index 000000000..e65579400 --- /dev/null +++ b/src/MNH/modn_param_lima.f90 @@ -0,0 +1,29 @@ +! ###################### + MODULE MODN_PARAM_LIMA +! ###################### +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA +! +IMPLICIT NONE +! +! +NAMELIST/NAM_PARAM_LIMA/LCOLD, LNUCL, LSEDI, LSNOW, LHAIL, LHHONI, LMEYERS,& + NMOD_IFN, XIFN_CONC, LIFN_HOM, & + CIFN_SPECIES, CINT_MIXING, NMOD_IMM, NIND_SPECIE, & + CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & + XALPHAI, XNUI, XALPHAS, XNUS, XALPHAG, XNUG, & + XFACTNUC_DEP, XFACTNUC_CON, NPHILLIPS, & +! + LWARM, LACTI, LRAIN, LSEDC, LACTIT, LBOUND, & + NMOD_CCN, XCCN_CONC, & + LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN, & + XALPHAC, XNUC, XALPHAR, XNUR, & + XFSOLUB_CCN, XACTEMP_CCN, XAERDIFF, XAERHEIGHT, & + LSCAV, LAERO_MASS +! +END MODULE MODN_PARAM_LIMA diff --git a/src/MNH/set_conc_lima.f90 b/src/MNH/set_conc_lima.f90 new file mode 100644 index 000000000..05c009405 --- /dev/null +++ b/src/MNH/set_conc_lima.f90 @@ -0,0 +1,182 @@ +! ####################################### + MODULE MODI_SET_CONC_LIMA +! ####################################### +! +INTERFACE +! + SUBROUTINE SET_CONC_LIMA (HLUOUT,HGETCLOUD,PRHODREF,PRT,PSVT) +! +CHARACTER (LEN=*), INTENT(IN) :: HLUOUT ! name of the output-listing +CHARACTER (LEN=4), INTENT(IN) :: HGETCLOUD ! Get indicator +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! microphysical mixing ratios +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PSVT ! microphys. concentrations +! +! +END SUBROUTINE SET_CONC_LIMA +! +END INTERFACE +! +END MODULE MODI_SET_CONC_LIMA +! +! ########################################################################### + SUBROUTINE SET_CONC_LIMA (HLUOUT,HGETCLOUD,PRHODREF,PRT,PSVT) +! ########################################################################### +! +!!**** *SET_CONC_LIMA * - initialize droplet, raindrop and ice +!! concentration for a RESTArt simulation of the LIMA scheme +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize cloud droplet and rain drop +!! concentrations when the cloud droplet and rain drop mixing ratios are +!! only available (generally from a previous run using the Kessler scheme). +!! This routine is used to initialize the droplet/drop concentrations +!! using the r_c and r_r of a previous REVE or KESS run but also to compute +!! the LB tendencies in ONE_WAY$n in case of grid-nesting when the optional +!! argument PTIME is set (a LIMA run embedded in a KESS or REVE run). +!! +!!** METHOD +!! ------ +!! The method assumes a Csk law for the activation of aerososl with "s" +!! the supersaturation (here 0.05 % is chosen). A Marshall-Palmer law with +!! N_o=10**(-7) m**(-4) is assumed for the rain drop concentration. +!! The initialization of the PSVT is straightforward for the cloud droplets +!! while N_r=N_0/Lambda_r with Rho*r_r=Pi*Rho_w*N_0/(Lambda_r**4) is used for +!! the rain drops. The HGETCLOUD test is used to discriminate between the +!! 'REVE' and 'KESS' options for CCLOUD in the previous run (from which +!! PRT was calculated). +!! +!! EXTERNAL +!! -------- +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_RAIN_C2R2_DESCR, ONLY : XRTMIN, XCTMIN +!! Module MODD_RAIN_C2R2_KHKO_PARAM, ONLY : XCONCC_INI, XCONCR_PARAM_INI +!! Module MODD_CONF, ONLY : NVERB +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine SET_CONC_RAIN_C2R2 ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! P. Jabouille * CNRM/GMME * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/11/00 +!! 2014 G.Delautier : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LCOLD, LWARM +USE MODD_PARAM_LIMA_COLD, ONLY : XAI, XBI +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_ACTI, NSV_LIMA_NI, NSV_LIMA_IFN_NUCL +USE MODD_CST, ONLY : XPI, XRHOLW, XRHOLI +USE MODD_CONF, ONLY : NVERB +! +USE MODE_FM +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +CHARACTER (LEN=*), INTENT(IN) :: HLUOUT ! name of the output-listing +CHARACTER (LEN=4), INTENT(IN) :: HGETCLOUD ! Get indicator +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! microphysical mixing ratios +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PSVT ! microphys. concentrations +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILUOUT ! Logical unit number of output-listing +REAL :: ZCONCC, ZCONCR, ZCONCI +! +!------------------------------------------------------------------------------- +!* 1. RETRIEVE LOGICAL UNIT NUMBER +! ---------------------------- +! +CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP) +! +!* 2. INITIALIZATION +! -------------- +! +IF (LWARM) THEN +! +! droplets +! + ZCONCC = 300 ! droplet concentration set at 300 cm-3 + WHERE ( PRT(:,:,:,2) > XRTMIN(2) ) + PSVT(:,:,:,NSV_LIMA_NC) = ZCONCC + PSVT(:,:,:,NSV_LIMA_CCN_ACTI) = ZCONCC + END WHERE + WHERE ( PRT(:,:,:,2) <= XRTMIN(2) ) + PRT(:,:,:,2) = 0.0 + PSVT(:,:,:,NSV_LIMA_NC) = 0.0 + PSVT(:,:,:,NSV_LIMA_CCN_ACTI) = 0.0 + END WHERE + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The droplet concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF +! +! drops +! + ZCONCR = (1.E7)**3/(XPI*XRHOLW) ! cf XCONCR_PARAM_INI in ini_rain_c2r2.f90 + IF (HGETCLOUD == 'INI1') THEN ! init from REVE scheme + PSVT(:,:,:,NSV_LIMA_NR) = 0.0 + ELSE ! init from KESS, ICE3... + WHERE ( PRT(:,:,:,3) > XRTMIN(3) ) + PSVT(:,:,:,NSV_LIMA_NR) = MAX( SQRT(SQRT(PRHODREF(:,:,:)*PRT(:,:,:,3) & + *ZCONCR)),XCTMIN(3) ) + END WHERE + WHERE ( PRT(:,:,:,3) <= XRTMIN(3) ) + PRT(:,:,:,3) = 0.0 + PSVT(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The raindrop concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF + END IF +! +ENDIF +! +IF (LCOLD) THEN +! +! ice crystals +! + ZCONCI = 100.E3 ! maximum ice concentration set at 100/L + WHERE ( PRT(:,:,:,4) > XRTMIN(4) ) + PSVT(:,:,:,NSV_LIMA_NI) = MIN( PRHODREF(:,:,:) / & + ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), & + ZCONCI ) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) = PSVT(:,:,:,NSV_LIMA_NI) + END WHERE + WHERE ( PRT(:,:,:,4) <= XRTMIN(4) ) + PRT(:,:,:,4) = 0.0 + PSVT(:,:,:,NSV_LIMA_NI) = 0.0 + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) = 0.0 + END WHERE + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The cloud ice concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF +! +END IF +! +END SUBROUTINE SET_CONC_LIMA -- GitLab