/wrfv2_fire/phys/module_mp_morr_two_moment.F
FORTRAN Legacy | 4277 lines | 2282 code | 883 blank | 1112 comment | 8 complexity | e220149e4d11905453d573b2401b0487 MD5 | raw file
Possible License(s): AGPL-1.0
- !WRF:MODEL_LAYER:PHYSICS
- !
- ! THIS MODULE CONTAINS THE TWO-MOMENT MICROPHYSICS CODE DESCRIBED BY
- ! MORRISON ET AL. (2009, MWR)
- ! CHANGES FOR V3.2, RELATIVE TO MOST RECENT (BUG-FIX) CODE FOR V3.1
- ! 1) ADDED ACCELERATED MELTING OF GRAUPEL/SNOW DUE TO COLLISION WITH RAIN, FOLLOWING LIN ET AL. (1983)
- ! 2) INCREASED MINIMUM LAMBDA FOR RAIN, AND ADDED RAIN DROP BREAKUP FOLLOWING MODIFIED VERSION
- ! OF VERLINDE AND COTTON (1993)
- ! 3) CHANGE MINIMUM ALLOWED MIXING RATIOS IN DRY CONDITIONS (RH < 90%), THIS IMPROVES RADAR REFLECTIIVITY
- ! IN LOW REFLECTIVITY REGIONS
- ! 4) BUG FIX TO MAXIMUM ALLOWED PARTICLE FALLSPEEDS AS A FUNCTION OF AIR DENSITY
- ! 5) BUG FIX TO CALCULATION OF LIQUID WATER SATURATION VAPOR PRESSURE (CHANGE IS VERY MINOR)
- ! 6) INCLUDE WRF CONSTANTS PER SUGGESTION OF JIMY
- ! bug fix, 5/12/10
- ! 7) bug fix for saturation vapor pressure in low pressure, to avoid division by zero
- ! 8) include 'EP2' WRF constant for saturation mixing ratio calculation, instead of hardwire constant
- ! CHANGES FOR V3.3
- ! 1) MODIFICATION FOR COUPLING WITH WRF-CHEM (PREDICTED DROPLET NUMBER CONCENTRATION) AS AN OPTION
- ! 2) MODIFY FALLSPEED BELOW THE LOWEST LEVEL OF PRECIPITATION, WHICH PREVENTS
- ! POTENTIAL FOR SPURIOUS ACCUMULATION OF PRECIPITATION DURING SUB-STEPPING FOR SEDIMENTATION
- ! 3) BUG FIX TO LATENT HEAT RELEASE DUE TO COLLISIONS OF CLOUD ICE WITH RAIN
- ! 4) CLEAN UP OF COMMENTS IN THE CODE
-
- ! additional minor bug fixes and small changes, 5/30/2011
- ! minor revisions by A. Ackerman April 2011:
- ! 1) replaced kinematic with dynamic viscosity
- ! 2) replaced scaling by air density for cloud droplet sedimentation
- ! with viscosity-dependent Stokes expression
- ! 3) use Ikawa and Saito (1991) air-density scaling for cloud ice
- ! 4) corrected typo in 2nd digit of ventilation constant F2R
- ! additional fixes:
- ! 5) TEMPERATURE FOR ACCELERATED MELTING DUE TO COLLIIONS OF SNOW AND GRAUPEL
- ! WITH RAIN SHOULD USE CELSIUS, NOT KELVIN (BUG REPORTED BY K. VAN WEVERBERG)
- ! 6) NPRACS IS NOT SUBTRACTED FROM SNOW NUMBER CONCENTRATION, SINCE
- ! DECREASE IN SNOW NUMBER IS ALREADY ACCOUNTED FOR BY NSMLTS
- ! 7) fix for switch for running w/o graupel/hail (cloud ice and snow only)
- ! hm bug fix 3/16/12
- ! 1) very minor change to limits on autoconversion source of rain number when cloud water is depleted
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! THIS SCHEME IS A BULK DOUBLE-MOMENT SCHEME THAT PREDICTS MIXING
- ! RATIOS AND NUMBER CONCENTRATIONS OF FIVE HYDROMETEOR SPECIES:
- ! CLOUD DROPLETS, CLOUD (SMALL) ICE, RAIN, SNOW, AND GRAUPEL.
- MODULE MODULE_MP_MORR_TWO_MOMENT
- USE module_wrf_error
- ! USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm ! GT
- ! USE module_domain, ONLY : HISTORY_ALARM, Is_alarm_tstep ! GT
- ! USE WRF PHYSICS CONSTANTS
- use module_model_constants, ONLY: CP, G, R => r_d, RV => r_v, EP_2
- ! USE module_state_description
- IMPLICIT NONE
- REAL, PARAMETER :: PI = 3.1415926535897932384626434
- REAL, PARAMETER :: SQRTPI = 0.9189385332046727417803297
- PUBLIC :: MP_MORR_TWO_MOMENT
- PUBLIC :: POLYSVP
- PRIVATE :: GAMMA, DERF1
- PRIVATE :: PI, SQRTPI
- PRIVATE :: MORR_TWO_MOMENT_MICRO
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! SWITCHES FOR MICROPHYSICS SCHEME
- ! IACT = 1, USE POWER-LAW CCN SPECTRA, NCCN = CS^K
- ! IACT = 2, USE LOGNORMAL AEROSOL SIZE DIST TO DERIVE CCN SPECTRA
- ! IACT = 3, ACTIVATION CALCULATED IN MODULE_MIXACTIVATE
- INTEGER, PRIVATE :: IACT
- ! INUM = 0, PREDICT DROPLET CONCENTRATION
- ! INUM = 1, ASSUME CONSTANT DROPLET CONCENTRATION
- ! !!!NOTE: PREDICTED DROPLET CONCENTRATION NOT AVAILABLE IN THIS VERSION
- ! CONTACT HUGH MORRISON (morrison@ucar.edu) FOR FURTHER INFORMATION
- INTEGER, PRIVATE :: INUM
- ! FOR INUM = 1, SET CONSTANT DROPLET CONCENTRATION (CM-3)
- REAL, PRIVATE :: NDCNST
- ! SWITCH FOR LIQUID-ONLY RUN
- ! ILIQ = 0, INCLUDE ICE
- ! ILIQ = 1, LIQUID ONLY, NO ICE
- INTEGER, PRIVATE :: ILIQ
- ! SWITCH FOR ICE NUCLEATION
- ! INUC = 0, USE FORMULA FROM RASMUSSEN ET AL. 2002 (MID-LATITUDE)
- ! = 1, USE MPACE OBSERVATIONS
- INTEGER, PRIVATE :: INUC
- ! IBASE = 1, NEGLECT DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
- ! UNRESOLVED ENTRAINMENT AND MIXING, ACTIVATE
- ! AT CLOUD BASE OR IN REGION WITH LITTLE CLOUD WATER USING
- ! NON-EQULIBRIUM SUPERSATURATION,
- ! IN CLOUD INTERIOR ACTIVATE USING EQUILIBRIUM SUPERSATURATION
- ! IBASE = 2, ASSUME DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
- ! UNRESOLVED ENTRAINMENT AND MIXING DOMINATES,
- ! ACTIVATE DROPLETS EVERYWHERE IN THE CLOUD USING NON-EQUILIBRIUM
- ! SUPERSATURATION, BASED ON THE
- ! LOCAL SUB-GRID AND/OR GRID-SCALE VERTICAL VELOCITY
- ! AT THE GRID POINT
- ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
- INTEGER, PRIVATE :: IBASE
- ! INCLUDE SUB-GRID VERTICAL VELOCITY IN DROPLET ACTIVATION
- ! ISUB = 0, INCLUDE SUB-GRID W (RECOMMENDED FOR LOWER RESOLUTION)
- ! ISUB = 1, EXCLUDE SUB-GRID W, ONLY USE GRID-SCALE W
- INTEGER, PRIVATE :: ISUB
- ! SWITCH FOR GRAUPEL/NO GRAUPEL
- ! IGRAUP = 0, INCLUDE GRAUPEL
- ! IGRAUP = 1, NO GRAUPEL
- INTEGER, PRIVATE :: IGRAUP
- ! HM ADDED NEW OPTION FOR HAIL
- ! SWITCH FOR HAIL/GRAUPEL
- ! IHAIL = 0, DENSE PRECIPITATING ICE IS GRAUPEL
- ! IHAIL = 1, DENSE PRECIPITATING GICE IS HAIL
- INTEGER, PRIVATE :: IHAIL
- ! CLOUD MICROPHYSICS CONSTANTS
- REAL, PRIVATE :: AI,AC,AS,AR,AG ! 'A' PARAMETER IN FALLSPEED-DIAM RELATIONSHIP
- REAL, PRIVATE :: BI,BC,BS,BR,BG ! 'B' PARAMETER IN FALLSPEED-DIAM RELATIONSHIP
- ! REAL, PRIVATE :: R ! GAS CONSTANT FOR AIR
- ! REAL, PRIVATE :: RV ! GAS CONSTANT FOR WATER VAPOR
- ! REAL, PRIVATE :: CP ! SPECIFIC HEAT AT CONSTANT PRESSURE FOR DRY AIR
- REAL, PRIVATE :: RHOSU ! STANDARD AIR DENSITY AT 850 MB
- REAL, PRIVATE :: RHOW ! DENSITY OF LIQUID WATER
- REAL, PRIVATE :: RHOI ! BULK DENSITY OF CLOUD ICE
- REAL, PRIVATE :: RHOSN ! BULK DENSITY OF SNOW
- REAL, PRIVATE :: RHOG ! BULK DENSITY OF GRAUPEL
- REAL, PRIVATE :: AIMM ! PARAMETER IN BIGG IMMERSION FREEZING
- REAL, PRIVATE :: BIMM ! PARAMETER IN BIGG IMMERSION FREEZING
- REAL, PRIVATE :: ECR ! COLLECTION EFFICIENCY BETWEEN DROPLETS/RAIN AND SNOW/RAIN
- REAL, PRIVATE :: DCS ! THRESHOLD SIZE FOR CLOUD ICE AUTOCONVERSION
- REAL, PRIVATE :: MI0 ! INITIAL SIZE OF NUCLEATED CRYSTAL
- REAL, PRIVATE :: MG0 ! MASS OF EMBRYO GRAUPEL
- REAL, PRIVATE :: F1S ! VENTILATION PARAMETER FOR SNOW
- REAL, PRIVATE :: F2S ! VENTILATION PARAMETER FOR SNOW
- REAL, PRIVATE :: F1R ! VENTILATION PARAMETER FOR RAIN
- REAL, PRIVATE :: F2R ! VENTILATION PARAMETER FOR RAIN
- ! REAL, PRIVATE :: G ! GRAVITATIONAL ACCELERATION
- REAL, PRIVATE :: QSMALL ! SMALLEST ALLOWED HYDROMETEOR MIXING RATIO
- REAL, PRIVATE :: CI,DI,CS,DS,CG,DG ! SIZE DISTRIBUTION PARAMETERS FOR CLOUD ICE, SNOW, GRAUPEL
- REAL, PRIVATE :: EII ! COLLECTION EFFICIENCY, ICE-ICE COLLISIONS
- REAL, PRIVATE :: ECI ! COLLECTION EFFICIENCY, ICE-DROPLET COLLISIONS
- REAL, PRIVATE :: RIN ! RADIUS OF CONTACT NUCLEI (M)
- ! hm, add for V3.2
- REAL, PRIVATE :: CPW ! SPECIFIC HEAT OF LIQUID WATER
- ! CCN SPECTRA FOR IACT = 1
- REAL, PRIVATE :: C1 ! 'C' IN NCCN = CS^K (CM-3)
- REAL, PRIVATE :: K1 ! 'K' IN NCCN = CS^K
- ! AEROSOL PARAMETERS FOR IACT = 2
- REAL, PRIVATE :: MW ! MOLECULAR WEIGHT WATER (KG/MOL)
- REAL, PRIVATE :: OSM ! OSMOTIC COEFFICIENT
- REAL, PRIVATE :: VI ! NUMBER OF ION DISSOCIATED IN SOLUTION
- REAL, PRIVATE :: EPSM ! AEROSOL SOLUBLE FRACTION
- REAL, PRIVATE :: RHOA ! AEROSOL BULK DENSITY (KG/M3)
- REAL, PRIVATE :: MAP ! MOLECULAR WEIGHT AEROSOL (KG/MOL)
- REAL, PRIVATE :: MA ! MOLECULAR WEIGHT OF 'AIR' (KG/MOL)
- REAL, PRIVATE :: RR ! UNIVERSAL GAS CONSTANT
- REAL, PRIVATE :: BACT ! ACTIVATION PARAMETER
- REAL, PRIVATE :: RM1 ! GEOMETRIC MEAN RADIUS, MODE 1 (M)
- REAL, PRIVATE :: RM2 ! GEOMETRIC MEAN RADIUS, MODE 2 (M)
- REAL, PRIVATE :: NANEW1 ! TOTAL AEROSOL CONCENTRATION, MODE 1 (M^-3)
- REAL, PRIVATE :: NANEW2 ! TOTAL AEROSOL CONCENTRATION, MODE 2 (M^-3)
- REAL, PRIVATE :: SIG1 ! STANDARD DEVIATION OF AEROSOL S.D., MODE 1
- REAL, PRIVATE :: SIG2 ! STANDARD DEVIATION OF AEROSOL S.D., MODE 2
- REAL, PRIVATE :: F11 ! CORRECTION FACTOR FOR ACTIVATION, MODE 1
- REAL, PRIVATE :: F12 ! CORRECTION FACTOR FOR ACTIVATION, MODE 1
- REAL, PRIVATE :: F21 ! CORRECTION FACTOR FOR ACTIVATION, MODE 2
- REAL, PRIVATE :: F22 ! CORRECTION FACTOR FOR ACTIVATION, MODE 2
- REAL, PRIVATE :: MMULT ! MASS OF SPLINTERED ICE PARTICLE
- REAL, PRIVATE :: LAMMAXI,LAMMINI,LAMMAXR,LAMMINR,LAMMAXS,LAMMINS,LAMMAXG,LAMMING
- ! CONSTANTS TO IMPROVE EFFICIENCY
- REAL, PRIVATE :: CONS1,CONS2,CONS3,CONS4,CONS5,CONS6,CONS7,CONS8,CONS9,CONS10
- REAL, PRIVATE :: CONS11,CONS12,CONS13,CONS14,CONS15,CONS16,CONS17,CONS18,CONS19,CONS20
- REAL, PRIVATE :: CONS21,CONS22,CONS23,CONS24,CONS25,CONS26,CONS27,CONS28,CONS29,CONS30
- REAL, PRIVATE :: CONS31,CONS32,CONS33,CONS34,CONS35,CONS36,CONS37,CONS38,CONS39,CONS40
- REAL, PRIVATE :: CONS41
- CONTAINS
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- SUBROUTINE MORR_TWO_MOMENT_INIT
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! THIS SUBROUTINE INITIALIZES ALL PHYSICAL CONSTANTS AMND PARAMETERS
- ! NEEDED BY THE MICROPHYSICS SCHEME.
- ! NEEDS TO BE CALLED AT FIRST TIME STEP, PRIOR TO CALL TO MAIN MICROPHYSICS INTERFACE
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- IMPLICIT NONE
- integer n,i
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! THE FOLLOWING PARAMETERS ARE USER-DEFINED SWITCHES AND NEED TO BE
- ! SET PRIOR TO CODE COMPILATION
- ! INUM IS AUTOMATICALLY SET TO 0 FOR WRF-CHEM BELOW,
- ! ALLOWING PREDICTION OF DROPLET CONCENTRATION
- ! THUS, THIS PARAMETER SHOULD NOT BE CHANGED HERE
- ! AND SHOULD BE LEFT TO 1
- INUM = 1
- ! SET CONSTANT DROPLET CONCENTRATION (UNITS OF CM-3)
- ! IF NO COUPLING WITH WRF-CHEM
- NDCNST = 250.
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! NOTE, THE FOLLOWING OPTIONS RELATED TO DROPLET ACTIVATION
- ! (IACT, IBASE, ISUB) ARE NOT AVAILABLE IN CURRENT VERSION
- ! FOR WRF-CHEM, DROPLET ACTIVATION IS PERFORMED
- ! IN 'MIX_ACTIVATE', NOT IN MICROPHYSICS SCHEME
- ! IACT = 1, USE POWER-LAW CCN SPECTRA, NCCN = CS^K
- ! IACT = 2, USE LOGNORMAL AEROSOL SIZE DIST TO DERIVE CCN SPECTRA
- IACT = 2
- ! IBASE = 1, NEGLECT DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
- ! UNRESOLVED ENTRAINMENT AND MIXING, ACTIVATE
- ! AT CLOUD BASE OR IN REGION WITH LITTLE CLOUD WATER USING
- ! NON-EQULIBRIUM SUPERSATURATION ASSUMING NO INITIAL CLOUD WATER,
- ! IN CLOUD INTERIOR ACTIVATE USING EQUILIBRIUM SUPERSATURATION
- ! IBASE = 2, ASSUME DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
- ! UNRESOLVED ENTRAINMENT AND MIXING DOMINATES,
- ! ACTIVATE DROPLETS EVERYWHERE IN THE CLOUD USING NON-EQUILIBRIUM
- ! SUPERSATURATION ASSUMING NO INITIAL CLOUD WATER, BASED ON THE
- ! LOCAL SUB-GRID AND/OR GRID-SCALE VERTICAL VELOCITY
- ! AT THE GRID POINT
- ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
-
- IBASE = 2
- ! INCLUDE SUB-GRID VERTICAL VELOCITY (standard deviation of w) IN DROPLET ACTIVATION
- ! ISUB = 0, INCLUDE SUB-GRID W (RECOMMENDED FOR LOWER RESOLUTION)
- ! currently, sub-grid w is constant of 0.5 m/s (not coupled with PBL/turbulence scheme)
- ! ISUB = 1, EXCLUDE SUB-GRID W, ONLY USE GRID-SCALE W
- ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
- ISUB = 0
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! SWITCH FOR LIQUID-ONLY RUN
- ! ILIQ = 0, INCLUDE ICE
- ! ILIQ = 1, LIQUID ONLY, NO ICE
- ILIQ = 0
- ! SWITCH FOR ICE NUCLEATION
- ! INUC = 0, USE FORMULA FROM RASMUSSEN ET AL. 2002 (MID-LATITUDE)
- ! = 1, USE MPACE OBSERVATIONS (ARCTIC ONLY)
- INUC = 0
- ! SWITCH FOR GRAUPEL/HAIL NO GRAUPEL/HAIL
- ! IGRAUP = 0, INCLUDE GRAUPEL/HAIL
- ! IGRAUP = 1, NO GRAUPEL/HAIL
- IGRAUP = 0
- ! HM ADDED 11/7/07
- ! SWITCH FOR HAIL/GRAUPEL
- ! IHAIL = 0, DENSE PRECIPITATING ICE IS GRAUPEL
- ! IHAIL = 1, DENSE PRECIPITATING ICE IS HAIL
- ! NOTE ---> RECOMMEND IHAIL = 1 FOR CONTINENTAL DEEP CONVECTION
- IHAIL = 0
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! SET PHYSICAL CONSTANTS
- ! FALLSPEED PARAMETERS (V=AD^B)
- AI = 700.
- AC = 3.E7
- AS = 11.72
- AR = 841.99667
- BI = 1.
- BC = 2.
- BS = 0.41
- BR = 0.8
- IF (IHAIL.EQ.0) THEN
- AG = 19.3
- BG = 0.37
- ELSE ! (MATSUN AND HUGGINS 1980)
- AG = 114.5
- BG = 0.5
- END IF
- ! CONSTANTS AND PARAMETERS
- ! R = 287.15
- ! RV = 461.5
- ! CP = 1005.
- RHOSU = 85000./(287.15*273.15)
- RHOW = 997.
- RHOI = 500.
- RHOSN = 100.
- IF (IHAIL.EQ.0) THEN
- RHOG = 400.
- ELSE
- RHOG = 900.
- END IF
- AIMM = 0.66
- BIMM = 100.
- ECR = 1.
- DCS = 125.E-6
- MI0 = 4./3.*PI*RHOI*(10.E-6)**3
- MG0 = 1.6E-10
- F1S = 0.86
- F2S = 0.28
- F1R = 0.78
- ! F2R = 0.32
- ! fix 053011
- F2R = 0.308
- ! G = 9.806
- QSMALL = 1.E-14
- EII = 0.1
- ECI = 0.7
- ! HM, ADD FOR V3.2
- CPW = 4218.
- ! SIZE DISTRIBUTION PARAMETERS
- CI = RHOI*PI/6.
- DI = 3.
- CS = RHOSN*PI/6.
- DS = 3.
- CG = RHOG*PI/6.
- DG = 3.
- ! RADIUS OF CONTACT NUCLEI
- RIN = 0.1E-6
- MMULT = 4./3.*PI*RHOI*(5.E-6)**3
- ! SIZE LIMITS FOR LAMBDA
- LAMMAXI = 1./1.E-6
- LAMMINI = 1./(2.*DCS+100.E-6)
- LAMMAXR = 1./20.E-6
- ! LAMMINR = 1./500.E-6
- LAMMINR = 1./2800.E-6
- LAMMAXS = 1./10.E-6
- LAMMINS = 1./2000.E-6
- LAMMAXG = 1./20.E-6
- LAMMING = 1./2000.E-6
- ! CCN SPECTRA FOR IACT = 1
- ! MARITIME
- ! MODIFIED FROM RASMUSSEN ET AL. 2002
- ! NCCN = C*S^K, NCCN IS IN CM-3, S IS SUPERSATURATION RATIO IN %
- K1 = 0.4
- C1 = 120.
- ! CONTINENTAL
- ! K1 = 0.5
- ! C1 = 1000.
- ! AEROSOL ACTIVATION PARAMETERS FOR IACT = 2
- ! PARAMETERS CURRENTLY SET FOR AMMONIUM SULFATE
- MW = 0.018
- OSM = 1.
- VI = 3.
- EPSM = 0.7
- RHOA = 1777.
- MAP = 0.132
- MA = 0.0284
- RR = 8.3187
- BACT = VI*OSM*EPSM*MW*RHOA/(MAP*RHOW)
- ! AEROSOL SIZE DISTRIBUTION PARAMETERS CURRENTLY SET FOR MPACE
- ! (see morrison et al. 2007, JGR)
- ! MODE 1
- RM1 = 0.052E-6
- SIG1 = 2.04
- NANEW1 = 72.2E6
- F11 = 0.5*EXP(2.5*(LOG(SIG1))**2)
- F21 = 1.+0.25*LOG(SIG1)
- ! MODE 2
- RM2 = 1.3E-6
- SIG2 = 2.5
- NANEW2 = 1.8E6
- F12 = 0.5*EXP(2.5*(LOG(SIG2))**2)
- F22 = 1.+0.25*LOG(SIG2)
- ! CONSTANTS FOR EFFICIENCY
- CONS1=GAMMA(1.+DS)*CS
- CONS2=GAMMA(1.+DG)*CG
- CONS3=GAMMA(4.+BS)/6.
- CONS4=GAMMA(4.+BR)/6.
- CONS5=GAMMA(1.+BS)
- CONS6=GAMMA(1.+BR)
- CONS7=GAMMA(4.+BG)/6.
- CONS8=GAMMA(1.+BG)
- CONS9=GAMMA(5./2.+BR/2.)
- CONS10=GAMMA(5./2.+BS/2.)
- CONS11=GAMMA(5./2.+BG/2.)
- CONS12=GAMMA(1.+DI)*CI
- CONS13=GAMMA(BS+3.)*PI/4.*ECI
- CONS14=GAMMA(BG+3.)*PI/4.*ECI
- CONS15=-1108.*EII*PI**((1.-BS)/3.)*RHOSN**((-2.-BS)/3.)/(4.*720.)
- CONS16=GAMMA(BI+3.)*PI/4.*ECI
- CONS17=4.*2.*3.*RHOSU*PI*ECI*ECI*GAMMA(2.*BS+2.)/(8.*(RHOG-RHOSN))
- CONS18=RHOSN*RHOSN
- CONS19=RHOW*RHOW
- CONS20=20.*PI*PI*RHOW*BIMM
- CONS21=4./(DCS*RHOI)
- CONS22=PI*RHOI*DCS**3/6.
- CONS23=PI/4.*EII*GAMMA(BS+3.)
- CONS24=PI/4.*ECR*GAMMA(BR+3.)
- CONS25=PI*PI/24.*RHOW*ECR*GAMMA(BR+6.)
- CONS26=PI/6.*RHOW
- CONS27=GAMMA(1.+BI)
- CONS28=GAMMA(4.+BI)/6.
- CONS29=4./3.*PI*RHOW*(25.E-6)**3
- CONS30=4./3.*PI*RHOW
- CONS31=PI*PI*ECR*RHOSN
- CONS32=PI/2.*ECR
- CONS33=PI*PI*ECR*RHOG
- CONS34=5./2.+BR/2.
- CONS35=5./2.+BS/2.
- CONS36=5./2.+BG/2.
- CONS37=4.*PI*1.38E-23/(6.*PI*RIN)
- CONS38=PI*PI/3.*RHOW
- CONS39=PI*PI/36.*RHOW*BIMM
- CONS40=PI/6.*BIMM
- CONS41=PI*PI*ECR*RHOW
- END SUBROUTINE MORR_TWO_MOMENT_INIT
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! THIS SUBROUTINE IS MAIN INTERFACE WITH THE TWO-MOMENT MICROPHYSICS SCHEME
- ! THIS INTERFACE TAKES IN 3D VARIABLES FROM DRIVER MODEL, CONVERTS TO 1D FOR
- ! CALL TO THE MAIN MICROPHYSICS SUBROUTINE (SUBROUTINE MORR_TWO_MOMENT_MICRO)
- ! WHICH OPERATES ON 1D VERTICAL COLUMNS.
- ! 1D VARIABLES FROM THE MAIN MICROPHYSICS SUBROUTINE ARE THEN REASSIGNED BACK TO 3D FOR OUTPUT
- ! BACK TO DRIVER MODEL USING THIS INTERFACE.
- ! MICROPHYSICS TENDENCIES ARE ADDED TO VARIABLES HERE BEFORE BEING PASSED BACK TO DRIVER MODEL.
- ! THIS CODE WAS WRITTEN BY HUGH MORRISON (NCAR) AND SLAVA TATARSKII (GEORGIA TECH).
- ! FOR QUESTIONS, CONTACT: HUGH MORRISON, E-MAIL: MORRISON@UCAR.EDU, PHONE:303-497-8916
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- SUBROUTINE MP_MORR_TWO_MOMENT(ITIMESTEP, &
- TH, QV, QC, QR, QI, QS, QG, NI, NS, NR, NG, &
- RHO, PII, P, DT_IN, DZ, HT, W, &
- RAINNC, RAINNCV, SR, &
- qrcuten, qscuten, qicuten, mu & ! hm added
- ,F_QNDROP, qndrop & ! hm added, wrf-chem
- ,IDS,IDE, JDS,JDE, KDS,KDE & ! domain dims
- ,IMS,IME, JMS,JME, KMS,KME & ! memory dims
- ,ITS,ITE, JTS,JTE, KTS,KTE & ! tile dims )
- !jdf ,C2PREC3D,CSED3D,ISED3D,SSED3D,GSED3D,RSED3D & ! HM ADD, WRF-CHEM
- ,QLSINK,PRECR,PRECI,PRECS,PRECG & ! HM ADD, WRF-CHEM
- )
-
- ! QV - water vapor mixing ratio (kg/kg)
- ! QC - cloud water mixing ratio (kg/kg)
- ! QR - rain water mixing ratio (kg/kg)
- ! QI - cloud ice mixing ratio (kg/kg)
- ! QS - snow mixing ratio (kg/kg)
- ! QG - graupel mixing ratio (KG/KG)
- ! NI - cloud ice number concentration (1/kg)
- ! NS - Snow Number concentration (1/kg)
- ! NR - Rain Number concentration (1/kg)
- ! NG - Graupel number concentration (1/kg)
- ! NOTE: RHO AND HT NOT USED BY THIS SCHEME AND DO NOT NEED TO BE PASSED INTO SCHEME!!!!
- ! P - AIR PRESSURE (PA)
- ! W - VERTICAL AIR VELOCITY (M/S)
- ! TH - POTENTIAL TEMPERATURE (K)
- ! PII - exner function - used to convert potential temp to temp
- ! DZ - difference in height over interface (m)
- ! DT_IN - model time step (sec)
- ! ITIMESTEP - time step counter
- ! RAINNC - accumulated grid-scale precipitation (mm)
- ! RAINNCV - one time step grid scale precipitation (mm/time step)
- ! SR - one time step mass ratio of snow to total precip
- ! qrcuten, rain tendency from parameterized cumulus convection
- ! qscuten, snow tendency from parameterized cumulus convection
- ! qicuten, cloud ice tendency from parameterized cumulus convection
- ! variables below currently not in use, not coupled to PBL or radiation codes
- ! TKE - turbulence kinetic energy (m^2 s-2), NEEDED FOR DROPLET ACTIVATION (SEE CODE BELOW)
- ! NCTEND - droplet concentration tendency from pbl (kg-1 s-1)
- ! NCTEND - CLOUD ICE concentration tendency from pbl (kg-1 s-1)
- ! KZH - heat eddy diffusion coefficient from YSU scheme (M^2 S-1), NEEDED FOR DROPLET ACTIVATION (SEE CODE BELOW)
- ! EFFCS - CLOUD DROPLET EFFECTIVE RADIUS OUTPUT TO RADIATION CODE (micron)
- ! EFFIS - CLOUD DROPLET EFFECTIVE RADIUS OUTPUT TO RADIATION CODE (micron)
- ! HM, ADDED FOR WRF-CHEM COUPLING
- ! QLSINK - TENDENCY OF CLOUD WATER TO RAIN, SNOW, GRAUPEL (KG/KG/S)
- ! CSED,ISED,SSED,GSED,RSED - SEDIMENTATION FLUXES (KG/M^2/S) FOR CLOUD WATER, ICE, SNOW, GRAUPEL, RAIN
- ! PRECI,PRECS,PRECG,PRECR - SEDIMENTATION FLUXES (KG/M^2/S) FOR ICE, SNOW, GRAUPEL, RAIN
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! reflectivity currently not included!!!!
- ! REFL_10CM - CALCULATED RADAR REFLECTIVITY AT 10 CM (DBZ)
- !................................
- ! GRID_CLOCK, GRID_ALARMS - parameters to limit radar reflectivity calculation only when needed
- ! otherwise radar reflectivity calculation every time step is too slow
- ! only needed for coupling with WRF, see code below for details
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! EFFC - DROPLET EFFECTIVE RADIUS (MICRON)
- ! EFFR - RAIN EFFECTIVE RADIUS (MICRON)
- ! EFFS - SNOW EFFECTIVE RADIUS (MICRON)
- ! EFFI - CLOUD ICE EFFECTIVE RADIUS (MICRON)
- ! ADDITIONAL OUTPUT FROM MICRO - SEDIMENTATION TENDENCIES, NEEDED FOR LIQUID-ICE STATIC ENERGY
- ! QGSTEN - GRAUPEL SEDIMENTATION TEND (KG/KG/S)
- ! QRSTEN - RAIN SEDIMENTATION TEND (KG/KG/S)
- ! QISTEN - CLOUD ICE SEDIMENTATION TEND (KG/KG/S)
- ! QNISTEN - SNOW SEDIMENTATION TEND (KG/KG/S)
- ! QCSTEN - CLOUD WATER SEDIMENTATION TEND (KG/KG/S)
- ! WVAR - STANDARD DEVIATION OF SUB-GRID VERTICAL VELOCITY (M/S)
- IMPLICIT NONE
- INTEGER, INTENT(IN ) :: ids, ide, jds, jde, kds, kde , &
- ims, ime, jms, jme, kms, kme , &
- its, ite, jts, jte, kts, kte
- ! Temporary changed from INOUT to IN
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
- qv, qc, qr, qi, qs, qg, ni, ns, nr, TH, NG
- !jdf qndrop ! hm added, wrf-chem
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT):: qndrop
- !jdf REAL, DIMENSION(ims:ime, kms:kme, jms:jme),INTENT(INOUT):: CSED3D, &
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT):: QLSINK, &
- PRECI,PRECS,PRECG,PRECR ! HM, WRF-CHEM
- !, effcs, effis
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
- pii, p, dz, rho, w !, tke, nctend, nitend,kzh
- REAL, INTENT(IN):: dt_in
- INTEGER, INTENT(IN):: ITIMESTEP
- REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: &
- RAINNC, RAINNCV, SR
- ! REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: & ! GT
- ! refl_10cm
- REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: ht
- ! TYPE (WRFU_Clock):: grid_clock ! GT
- ! TYPE (WRFU_Alarm), POINTER:: grid_alarms(:) ! GT
- ! LOCAL VARIABLES
- REAL, DIMENSION(its:ite, kts:kte, jts:jte):: &
- effi, effs, effr, EFFG
- REAL, DIMENSION(its:ite, kts:kte, jts:jte):: &
- T, WVAR, EFFC
- REAL, DIMENSION(kts:kte) :: &
- QC_TEND1D, QI_TEND1D, QNI_TEND1D, QR_TEND1D, &
- NI_TEND1D, NS_TEND1D, NR_TEND1D, &
- QC1D, QI1D, QR1D,NI1D, NS1D, NR1D, QS1D, &
- T_TEND1D,QV_TEND1D, T1D, QV1D, P1D, W1D, WVAR1D, &
- EFFC1D, EFFI1D, EFFS1D, EFFR1D,DZ1D, &
- ! HM ADD GRAUPEL
- QG_TEND1D, NG_TEND1D, QG1D, NG1D, EFFG1D, &
- ! ADD SEDIMENTATION TENDENCIES (UNITS OF KG/KG/S)
- QGSTEN,QRSTEN, QISTEN, QNISTEN, QCSTEN, &
- ! ADD CUMULUS TENDENCIES
- QRCU1D, QSCU1D, QICU1D
- ! add cumulus tendencies
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
- qrcuten, qscuten, qicuten
- REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN):: &
- mu
- LOGICAL, INTENT(IN), OPTIONAL :: F_QNDROP ! wrf-chem
- LOGICAL :: flag_qndrop ! wrf-chem
- integer :: iinum ! wrf-chem
- ! wrf-chem
- REAL, DIMENSION(kts:kte) :: nc1d, nc_tend1d,C2PREC,CSED,ISED,SSED,GSED,RSED
- ! HM add reflectivity
- ! dbz
-
- REAL PRECPRT1D, SNOWRT1D
- INTEGER I,K,J
- REAL DT
- ! LOGICAL:: dBZ_tstep ! GT
- ! below for wrf-chem
- flag_qndrop = .false.
- IF ( PRESENT ( f_qndrop ) ) flag_qndrop = f_qndrop
- !!!!!!!!!!!!!!!!!!!!!!
- ! Initialize tendencies (all set to 0) and transfer
- ! array to local variables
- DT = DT_IN
- DO I=ITS,ITE
- DO J=JTS,JTE
- DO K=KTS,KTE
- T(I,K,J) = TH(i,k,j)*PII(i,k,j)
- ! NOTE: WVAR NOT CURRENTLY USED IN CODE !!!!!!!!!!
- ! currently assign wvar to 0.5 m/s (not coupled with PBL scheme)
- WVAR(I,K,J) = 0.5
- ! currently mixing of number concentrations also is neglected (not coupled with PBL schemes)
- END DO
- END DO
- END DO
- do i=its,ite ! i loop (east-west)
- do j=jts,jte ! j loop (north-south)
- !
- ! Transfer 3D arrays into 1D for microphysical calculations
- !
- ! hm , initialize 1d tendency arrays to zero
- do k=kts,kte ! k loop (vertical)
- QC_TEND1D(k) = 0.
- QI_TEND1D(k) = 0.
- QNI_TEND1D(k) = 0.
- QR_TEND1D(k) = 0.
- NI_TEND1D(k) = 0.
- NS_TEND1D(k) = 0.
- NR_TEND1D(k) = 0.
- T_TEND1D(k) = 0.
- QV_TEND1D(k) = 0.
- nc_tend1d(k) = 0. ! wrf-chem
- QC1D(k) = QC(i,k,j)
- QI1D(k) = QI(i,k,j)
- QS1D(k) = QS(i,k,j)
- QR1D(k) = QR(i,k,j)
- NI1D(k) = NI(i,k,j)
- NS1D(k) = NS(i,k,j)
- NR1D(k) = NR(i,k,j)
- ! HM ADD GRAUPEL
- QG1D(K) = QG(I,K,j)
- NG1D(K) = NG(I,K,j)
- QG_TEND1D(K) = 0.
- NG_TEND1D(K) = 0.
- T1D(k) = T(i,k,j)
- QV1D(k) = QV(i,k,j)
- P1D(k) = P(i,k,j)
- DZ1D(k) = DZ(i,k,j)
- W1D(k) = W(i,k,j)
- WVAR1D(k) = WVAR(i,k,j)
- ! add cumulus tendencies, decouple from mu
- qrcu1d(k) = qrcuten(i,k,j)/mu(i,j)
- qscu1d(k) = qscuten(i,k,j)/mu(i,j)
- qicu1d(k) = qicuten(i,k,j)/mu(i,j)
- end do !jdf added this
- ! below for wrf-chem
- IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
- iact = 3
- DO k = kts, kte
- nc1d(k)=qndrop(i,k,j)
- iinum=0
- ENDDO
- ELSE
- DO k = kts, kte
- nc1d(k)=0. ! temporary placeholder, set to constant in microphysics subroutine
- iinum=1
- ENDDO
- ENDIF
- !jdf end do
- call MORR_TWO_MOMENT_MICRO(QC_TEND1D, QI_TEND1D, QNI_TEND1D, QR_TEND1D, &
- NI_TEND1D, NS_TEND1D, NR_TEND1D, &
- QC1D, QI1D, QS1D, QR1D,NI1D, NS1D, NR1D, &
- T_TEND1D,QV_TEND1D, T1D, QV1D, P1D, DZ1D, W1D, WVAR1D, &
- PRECPRT1D,SNOWRT1D, &
- EFFC1D,EFFI1D,EFFS1D,EFFR1D,DT, &
- IMS,IME, JMS,JME, KMS,KME, &
- ITS,ITE, JTS,JTE, KTS,KTE, & ! HM ADD GRAUPEL
- QG_TEND1D,NG_TEND1D,QG1D,NG1D,EFFG1D, &
- qrcu1d, qscu1d, qicu1d, &
- ! ADD SEDIMENTATION TENDENCIES
- QGSTEN,QRSTEN,QISTEN,QNISTEN,QCSTEN, &
- nc1d, nc_tend1d, iinum, C2PREC,CSED,ISED,SSED,GSED,RSED & !wrf-chem
- )
- !
- ! Transfer 1D arrays back into 3D arrays
- !
- do k=kts,kte
- ! hm, add tendencies to update global variables
- ! HM, TENDENCIES FOR Q AND N NOW ADDED IN M2005MICRO, SO WE
- ! ONLY NEED TO TRANSFER 1D VARIABLES BACK TO 3D
- QC(i,k,j) = QC1D(k)
- QI(i,k,j) = QI1D(k)
- QS(i,k,j) = QS1D(k)
- QR(i,k,j) = QR1D(k)
- NI(i,k,j) = NI1D(k)
- NS(i,k,j) = NS1D(k)
- NR(i,k,j) = NR1D(k)
- QG(I,K,j) = QG1D(K)
- NG(I,K,j) = NG1D(K)
- T(i,k,j) = T1D(k)
- TH(I,K,J) = T(i,k,j)/PII(i,k,j) ! CONVERT TEMP BACK TO POTENTIAL TEMP
- QV(i,k,j) = QV1D(k)
- EFFC(i,k,j) = EFFC1D(k)
- EFFI(i,k,j) = EFFI1D(k)
- EFFS(i,k,j) = EFFS1D(k)
- EFFR(i,k,j) = EFFR1D(k)
- EFFG(I,K,j) = EFFG1D(K)
- ! wrf-chem
- IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
- qndrop(i,k,j) = nc1d(k)
- !jdf CSED3D(I,K,J) = CSED(K)
- END IF
- IF ( PRESENT( QLSINK ) ) THEN
- if(qc(i,k,j)>1.e-10) then
- QLSINK(I,K,J) = C2PREC(K)/QC(I,K,J)
- else
- QLSINK(I,K,J) = 0.0
- endif
- END IF
- IF ( PRESENT( PRECR ) ) PRECR(I,K,J) = RSED(K)
- IF ( PRESENT( PRECI ) ) PRECI(I,K,J) = ISED(K)
- IF ( PRESENT( PRECS ) ) PRECS(I,K,J) = SSED(K)
- IF ( PRESENT( PRECG ) ) PRECG(I,K,J) = GSED(K)
- ! EFFECTIVE RADIUS FOR RADIATION CODE (currently not coupled)
- ! HM, ADD LIMIT TO PREVENT BLOWING UP OPTICAL PROPERTIES, 8/18/07
- ! EFFCS(I,K,J) = MIN(EFFC(I,K,J),50.)
- ! EFFCS(I,K,J) = MAX(EFFCS(I,K,J),1.)
- ! EFFIS(I,K,J) = MIN(EFFI(I,K,J),130.)
- ! EFFIS(I,K,J) = MAX(EFFIS(I,K,J),13.)
- end do
- ! hm modified so that m2005 precip variables correctly match wrf precip variables
- RAINNC(i,j) = RAINNC(I,J)+PRECPRT1D
- RAINNCV(i,j) = PRECPRT1D
- SR(i,j) = SNOWRT1D/(PRECPRT1D+1.E-12)
- end do
- end do
- END SUBROUTINE MP_MORR_TWO_MOMENT
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- SUBROUTINE MORR_TWO_MOMENT_MICRO(QC3DTEN,QI3DTEN,QNI3DTEN,QR3DTEN, &
- NI3DTEN,NS3DTEN,NR3DTEN,QC3D,QI3D,QNI3D,QR3D,NI3D,NS3D,NR3D, &
- T3DTEN,QV3DTEN,T3D,QV3D,PRES,DZQ,W3D,WVAR,PRECRT,SNOWRT, &
- EFFC,EFFI,EFFS,EFFR,DT, &
- IMS,IME, JMS,JME, KMS,KME, &
- ITS,ITE, JTS,JTE, KTS,KTE, & ! ADD GRAUPEL
- QG3DTEN,NG3DTEN,QG3D,NG3D,EFFG,qrcu1d,qscu1d, qicu1d, &
- QGSTEN,QRSTEN,QISTEN,QNISTEN,QCSTEN, &
- nc3d,nc3dten,iinum, & ! wrf-chem
- c2prec,CSED,ISED,SSED,GSED,RSED & ! hm added, wrf-chem
- )
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! THIS PROGRAM IS THE MAIN TWO-MOMENT MICROPHYSICS SUBROUTINE DESCRIBED BY
- ! MORRISON ET AL. 2005 JAS; MORRISON AND PINTO 2005 JAS.
- ! ADDITIONAL CHANGES ARE DESCRIBED IN DETAIL BY MORRISON, THOMPSON, TATARSKII (MWR, SUBMITTED)
- ! THIS SCHEME IS A BULK DOUBLE-MOMENT SCHEME THAT PREDICTS MIXING
- ! RATIOS AND NUMBER CONCENTRATIONS OF FIVE HYDROMETEOR SPECIES:
- ! CLOUD DROPLETS, CLOUD (SMALL) ICE, RAIN, SNOW, AND GRAUPEL.
- ! CODE STRUCTURE: MAIN SUBROUTINE IS 'MORR_TWO_MOMENT'. ALSO INCLUDED IN THIS FILE IS
- ! 'FUNCTION POLYSVP', 'FUNCTION DERF1', AND
- ! 'FUNCTION GAMMA'.
- ! NOTE: THIS SUBROUTINE USES 1D ARRAY IN VERTICAL (COLUMN), EVEN THOUGH VARIABLES ARE CALLED '3D'......
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! DECLARATIONS
- IMPLICIT NONE
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! THESE VARIABLES BELOW MUST BE LINKED WITH THE MAIN MODEL.
- ! DEFINE ARRAY SIZES
- ! INPUT NUMBER OF GRID CELLS
- ! INPUT/OUTPUT PARAMETERS ! DESCRIPTION (UNITS)
- INTEGER, INTENT( IN) :: IMS,IME, JMS,JME, KMS,KME, &
- ITS,ITE, JTS,JTE, KTS,KTE
- REAL, DIMENSION(KTS:KTE) :: QC3DTEN ! CLOUD WATER MIXING RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QI3DTEN ! CLOUD ICE MIXING RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QNI3DTEN ! SNOW MIXING RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QR3DTEN ! RAIN MIXING RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: NI3DTEN ! CLOUD ICE NUMBER CONCENTRATION (1/KG/S)
- REAL, DIMENSION(KTS:KTE) :: NS3DTEN ! SNOW NUMBER CONCENTRATION (1/KG/S)
- REAL, DIMENSION(KTS:KTE) :: NR3DTEN ! RAIN NUMBER CONCENTRATION (1/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QC3D ! CLOUD WATER MIXING RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: QI3D ! CLOUD ICE MIXING RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: QNI3D ! SNOW MIXING RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: QR3D ! RAIN MIXING RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: NI3D ! CLOUD ICE NUMBER CONCENTRATION (1/KG)
- REAL, DIMENSION(KTS:KTE) :: NS3D ! SNOW NUMBER CONCENTRATION (1/KG)
- REAL, DIMENSION(KTS:KTE) :: NR3D ! RAIN NUMBER CONCENTRATION (1/KG)
- REAL, DIMENSION(KTS:KTE) :: T3DTEN ! TEMPERATURE TENDENCY (K/S)
- REAL, DIMENSION(KTS:KTE) :: QV3DTEN ! WATER VAPOR MIXING RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: T3D ! TEMPERATURE (K)
- REAL, DIMENSION(KTS:KTE) :: QV3D ! WATER VAPOR MIXING RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: PRES ! ATMOSPHERIC PRESSURE (PA)
- REAL, DIMENSION(KTS:KTE) :: DZQ ! DIFFERENCE IN HEIGHT ACROSS LEVEL (m)
- REAL, DIMENSION(KTS:KTE) :: W3D ! GRID-SCALE VERTICAL VELOCITY (M/S)
- REAL, DIMENSION(KTS:KTE) :: WVAR ! SUB-GRID VERTICAL VELOCITY (M/S)
- ! below for wrf-chem
- REAL, DIMENSION(KTS:KTE) :: nc3d
- REAL, DIMENSION(KTS:KTE) :: nc3dten
- integer, intent(in) :: iinum
- ! HM ADDED GRAUPEL VARIABLES
- REAL, DIMENSION(KTS:KTE) :: QG3DTEN ! GRAUPEL MIX RATIO TENDENCY (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: NG3DTEN ! GRAUPEL NUMB CONC TENDENCY (1/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QG3D ! GRAUPEL MIX RATIO (KG/KG)
- REAL, DIMENSION(KTS:KTE) :: NG3D ! GRAUPEL NUMBER CONC (1/KG)
- ! HM, ADD 1/16/07, SEDIMENTATION TENDENCIES FOR MIXING RATIO
- REAL, DIMENSION(KTS:KTE) :: QGSTEN ! GRAUPEL SED TEND (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QRSTEN ! RAIN SED TEND (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QISTEN ! CLOUD ICE SED TEND (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QNISTEN ! SNOW SED TEND (KG/KG/S)
- REAL, DIMENSION(KTS:KTE) :: QCSTEN ! CLOUD WAT SED TEND (KG/KG/S)
- ! hm add cumulus tendencies for precip
- REAL, DIMENSION(KTS:KTE) :: qrcu1d
- REAL, DIMENSION(KTS:KTE) :: qscu1d
- REAL, DIMENSION(KTS:KTE) :: qicu1d
- ! OUTPUT VARIABLES
- REAL PRECRT ! TOTAL PRECIP PER TIME STEP (mm)
- REAL SNOWRT ! SNOW PER TIME STEP (mm)
- REAL, DIMENSION(KTS:KTE) :: EFFC ! DROPLET EFFECTIVE RADIUS (MICRON)
- REAL, DIMENSION(KTS:KTE) :: EFFI ! CLOUD ICE EFFECTIVE RADIUS (MICRON)
- REAL, DIMENSION(KTS:KTE) :: EFFS ! SNOW EFFECTIVE RADIUS (MICRON)
- REAL, DIMENSION(KTS:KTE) :: EFFR ! RAIN EFFECTIVE RADIUS (MICRON)
- REAL, DIMENSION(KTS:KTE) :: EFFG ! GRAUPEL EFFECTIVE RADIUS (MICRON)
- ! MODEL INPUT PARAMETERS (FORMERLY IN COMMON BLOCKS)
- REAL DT ! MODEL TIME STEP (SEC)
- !.....................................................................................................
- ! LOCAL VARIABLES: ALL PARAMETERS BELOW ARE LOCAL TO SCHEME AND DON'T NEED TO COMMUNICATE WITH THE
- ! REST OF THE MODEL.
- ! SIZE PARAMETER VARIABLES
- REAL, DIMENSION(KTS:KTE) :: LAMC ! SLOPE PARAMETER FOR DROPLETS (M-1)
- REAL, DIMENSION(KTS:KTE) :: LAMI ! SLOPE PARAMETER FOR CLOUD ICE (M-1)
- REAL, DIMENSION(KTS:KTE) :: LAMS ! SLOPE PARAMETER FOR SNOW (M-1)
- REAL, DIMENSION(KTS:KTE) :: LAMR ! SLOPE PARAMETER FOR RAIN (M-1)
- REAL, DIMENSION(KTS:KTE) :: LAMG ! SLOPE PARAMETER FOR GRAUPEL (M-1)
- REAL, DIMENSION(KTS:KTE) :: CDIST1 ! PSD PARAMETER FOR DROPLETS
- REAL, DIMENSION(KTS:KTE) :: N0I ! INTERCEPT PARAMETER FOR CLOUD ICE (KG-1 M-1)
- REAL, DIMENSION(KTS:KTE) :: N0S ! INTERCEPT PARAMETER FOR SNOW (KG-1 M-1)
- REAL, DIMENSION(KTS:KTE) :: N0RR ! INTERCEPT PARAMETER FOR RAIN (KG-1 M-1)
- REAL, DIMENSION(KTS:KTE) :: N0G ! INTERCEPT PARAMETER FOR GRAUPEL (KG-1 M-1)
- REAL, DIMENSION(KTS:KTE) :: PGAM ! SPECTRAL SHAPE PARAMETER FOR DROPLETS
- ! MICROPHYSICAL PROCESSES
- REAL, DIMENSION(KTS:KTE) :: NSUBC ! LOSS OF NC DURING EVAP
- REAL, DIMENSION(KTS:KTE) :: NSUBI ! LOSS OF NI DURING SUB.
- REAL, DIMENSION(KTS:KTE) :: NSUBS ! LOSS OF NS DURING SUB.
- REAL, DIMENSION(KTS:KTE) :: NSUBR ! LOSS OF NR DURING EVAP
- REAL, DIMENSION(KTS:KTE) :: PRD ! DEP CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: PRE ! EVAP OF RAIN
- REAL, DIMENSION(KTS:KTE) :: PRDS ! DEP SNOW
- REAL, DIMENSION(KTS:KTE) :: NNUCCC ! CHANGE N DUE TO CONTACT FREEZ DROPLETS
- REAL, DIMENSION(KTS:KTE) :: MNUCCC ! CHANGE Q DUE TO CONTACT FREEZ DROPLETS
- REAL, DIMENSION(KTS:KTE) :: PRA ! ACCRETION DROPLETS BY RAIN
- REAL, DIMENSION(KTS:KTE) :: PRC ! AUTOCONVERSION DROPLETS
- REAL, DIMENSION(KTS:KTE) :: PCC ! COND/EVAP DROPLETS
- REAL, DIMENSION(KTS:KTE) :: NNUCCD ! CHANGE N FREEZING AEROSOL (PRIM ICE NUCLEATION)
- REAL, DIMENSION(KTS:KTE) :: MNUCCD ! CHANGE Q FREEZING AEROSOL (PRIM ICE NUCLEATION)
- REAL, DIMENSION(KTS:KTE) :: MNUCCR ! CHANGE Q DUE TO CONTACT FREEZ RAIN
- REAL, DIMENSION(KTS:KTE) :: NNUCCR ! CHANGE N DUE TO CONTACT FREEZ RAIN
- REAL, DIMENSION(KTS:KTE) :: NPRA ! CHANGE IN N DUE TO DROPLET ACC BY RAIN
- REAL, DIMENSION(KTS:KTE) :: NRAGG ! SELF-COLLECTION OF RAIN
- REAL, DIMENSION(KTS:KTE) :: NSAGG ! SELF-COLLECTION OF SNOW
- REAL, DIMENSION(KTS:KTE) :: NPRC ! CHANGE NC AUTOCONVERSION DROPLETS
- REAL, DIMENSION(KTS:KTE) :: NPRC1 ! CHANGE NR AUTOCONVERSION DROPLETS
- REAL, DIMENSION(KTS:KTE) :: PRAI ! CHANGE Q AUTOCONVERSION CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: PRCI ! CHANGE Q ACCRETION CLOUD ICE BY SNOW
- REAL, DIMENSION(KTS:KTE) :: PSACWS ! CHANGE Q DROPLET ACCRETION BY SNOW
- REAL, DIMENSION(KTS:KTE) :: NPSACWS ! CHANGE N DROPLET ACCRETION BY SNOW
- REAL, DIMENSION(KTS:KTE) :: PSACWI ! CHANGE Q DROPLET ACCRETION BY CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: NPSACWI ! CHANGE N DROPLET ACCRETION BY CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: NPRCI ! CHANGE N AUTOCONVERSION CLOUD ICE BY SNOW
- REAL, DIMENSION(KTS:KTE) :: NPRAI ! CHANGE N ACCRETION CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: NMULTS ! ICE MULT DUE TO RIMING DROPLETS BY SNOW
- REAL, DIMENSION(KTS:KTE) :: NMULTR ! ICE MULT DUE TO RIMING RAIN BY SNOW
- REAL, DIMENSION(KTS:KTE) :: QMULTS ! CHANGE Q DUE TO ICE MULT DROPLETS/SNOW
- REAL, DIMENSION(KTS:KTE) :: QMULTR ! CHANGE Q DUE TO ICE RAIN/SNOW
- REAL, DIMENSION(KTS:KTE) :: PRACS ! CHANGE Q RAIN-SNOW COLLECTION
- REAL, DIMENSION(KTS:KTE) :: NPRACS ! CHANGE N RAIN-SNOW COLLECTION
- REAL, DIMENSION(KTS:KTE) :: PCCN ! CHANGE Q DROPLET ACTIVATION
- REAL, DIMENSION(KTS:KTE) :: PSMLT ! CHANGE Q MELTING SNOW TO RAIN
- REAL, DIMENSION(KTS:KTE) :: EVPMS ! CHNAGE Q MELTING SNOW EVAPORATING
- REAL, DIMENSION(KTS:KTE) :: NSMLTS ! CHANGE N MELTING SNOW
- REAL, DIMENSION(KTS:KTE) :: NSMLTR ! CHANGE N MELTING SNOW TO RAIN
- ! HM ADDED 12/13/06
- REAL, DIMENSION(KTS:KTE) :: PIACR ! CHANGE QR, ICE-RAIN COLLECTION
- REAL, DIMENSION(KTS:KTE) :: NIACR ! CHANGE N, ICE-RAIN COLLECTION
- REAL, DIMENSION(KTS:KTE) :: PRACI ! CHANGE QI, ICE-RAIN COLLECTION
- REAL, DIMENSION(KTS:KTE) :: PIACRS ! CHANGE QR, ICE RAIN COLLISION, ADDED TO SNOW
- REAL, DIMENSION(KTS:KTE) :: NIACRS ! CHANGE N, ICE RAIN COLLISION, ADDED TO SNOW
- REAL, DIMENSION(KTS:KTE) :: PRACIS ! CHANGE QI, ICE RAIN COLLISION, ADDED TO SNOW
- REAL, DIMENSION(KTS:KTE) :: EPRD ! SUBLIMATION CLOUD ICE
- REAL, DIMENSION(KTS:KTE) :: EPRDS ! SUBLIMATION SNOW
- ! HM ADDED GRAUPEL PROCESSES
- REAL, DIMENSION(KTS:KTE) :: PRACG ! CHANGE IN Q COLLECTION RAIN BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: PSACWG ! CHANGE IN Q COLLECTION DROPLETS BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: PGSACW ! CONVERSION Q TO GRAUPEL DUE TO COLLECTION DROPLETS BY SNOW
- REAL, DIMENSION(KTS:KTE) :: PGRACS ! CONVERSION Q TO GRAUPEL DUE TO COLLECTION RAIN BY SNOW
- REAL, DIMENSION(KTS:KTE) :: PRDG ! DEP OF GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: EPRDG ! SUB OF GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: EVPMG ! CHANGE Q MELTING OF GRAUPEL AND EVAPORATION
- REAL, DIMENSION(KTS:KTE) :: PGMLT ! CHANGE Q MELTING OF GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: NPRACG ! CHANGE N COLLECTION RAIN BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: NPSACWG ! CHANGE N COLLECTION DROPLETS BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: NSCNG ! CHANGE N CONVERSION TO GRAUPEL DUE TO COLLECTION DROPLETS BY SNOW
- REAL, DIMENSION(KTS:KTE) :: NGRACS ! CHANGE N CONVERSION TO GRAUPEL DUE TO COLLECTION RAIN BY SNOW
- REAL, DIMENSION(KTS:KTE) :: NGMLTG ! CHANGE N MELTING GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: NGMLTR ! CHANGE N MELTING GRAUPEL TO RAIN
- REAL, DIMENSION(KTS:KTE) :: NSUBG ! CHANGE N SUB/DEP OF GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: PSACR ! CONVERSION DUE TO COLL OF SNOW BY RAIN
- REAL, DIMENSION(KTS:KTE) :: NMULTG ! ICE MULT DUE TO ACC DROPLETS BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: NMULTRG ! ICE MULT DUE TO ACC RAIN BY GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: QMULTG ! CHANGE Q DUE TO ICE MULT DROPLETS/GRAUPEL
- REAL, DIMENSION(KTS:KTE) :: QMULTRG ! CHANGE Q DUE TO ICE MULT RAIN/GRAUPEL
- ! TIME-VARYING ATMOSPHERIC PARAMETERS
- REAL, DIMENSION(KTS:KTE) :: KAP ! THERMAL CONDUCTIVITY OF AIR
- REAL, DIMENSION(KTS:KTE) :: EVS ! SATURATION VAPOR PRESSURE
- REAL, DIMENSION(KTS:KTE) :: EIS ! ICE SATURATION VAPOR PRESSURE
- REAL, DIMENSION(KTS:KTE) :: QVS ! SATURATION MIXING RATIO
- REAL, DIMENSION(KTS:KTE) :: QVI ! ICE SATURATION MIXING RATIO
- REAL, DIMENSION(KTS:KTE) :: QVQVS ! SAUTRATION RATIO
- REAL, DIMENSION(KTS:KTE) :: QVQVSI! ICE SATURAION RATIO
- REAL, DIMENSION(KTS:KTE) :: DV ! DIFFUSIVITY OF WATER VAPOR IN AIR
- REAL, DIMENSION(KTS:KTE) :: XXLS ! LATENT HEAT OF SUBLIMATION
- REAL, DIMENSION(KTS:KTE) :: XXLV ! LATENT HEAT OF VAPORIZATION
- REAL, DIMENSION(KTS:KTE) :: CPM ! SPECIFIC HEAT AT CONST PRESSURE FOR MOIST AIR
- REAL, DIMENSION(KTS:KTE) :: MU ! VISCOCITY OF AIR
- REAL, DIMENSION(KTS:KTE) :: SC ! SCHMIDT NUMBER
- REAL, DIMENSION(KTS:KTE) :: XLF ! LATENT HEAT OF FREEZING
- REAL, DIMENSION(KTS:KTE) :: RHO ! AIR DENSITY
- REAL, DIMENSION(KTS:KTE) :: AB ! CORRECTION TO CONDENSATION RATE DUE TO LATENT HEATING
- REAL, DIMENSION(KTS:KTE) :: ABI ! CORRECTION TO DEPOSITION RATE DUE TO LATENT HEATING
- ! TIME-VARYING MICROPHYSICS PARAMETERS
- REAL, DIMENSION(KTS:KTE) :: DAP ! DIFFUSIVITY OF AEROSOL
- REAL NACNT ! NUMBER OF CONTACT IN
- REAL FMULT ! TEMP.-DEP. PARAMETER FOR RIME-SPLINTERING
- REAL COFFI ! ICE AUTOCONVERSION PARAMETER
- ! FALL SPEED WORKING VARIABLES (DEFINED IN CODE)
- REAL, DIMENSION(KTS:KTE) :: DUMI,DUMR,DUMFNI,DUMG,DUMFNG
- REAL UNI, UMI,UMR
- REAL, DIMENSION(KTS:KTE) :: FR, FI, FNI,FG,FNG
- REAL RGVM
- REAL, DIMENSION(KTS:KTE) :: FALOUTR,FALOUTI,FALOUTNI
- REAL FALTNDR,FALTNDI,FALTNDNI,RHO2
- REAL, DIMENSION(KTS:KTE) :: DUMQS,DUMFNS
- REAL UMS,UNS
- REAL, DIMENSION(KTS:KTE) :: FS,FNS, FALOUTS,FALOUTNS,FALOUTG,FALOUTNG
- REAL FALTNDS,FALTNDNS,UNR,FALTNDG,FALTNDNG
- REAL, DIMENSION(KTS:KTE) :: DUMC,DUMFNC
- REAL UNC,UMC,UNG,UMG
- REAL, DIMENSION(KTS:KTE) :: FC,FALOUTC,FALOUTNC
- REAL FALTNDC,FALTNDNC
- REAL, DIMENSION(KTS:KTE) :: FNC,DUMFNR,FALOUTNR
- REAL FALTNDNR
- REAL, DIMENSION(KTS:KTE) :: FNR
- ! FALL-SPEED PARAMETER 'A' WITH AIR DENSITY CORRECTION
- REAL, DIMENSION(KTS:KTE) :: AIN,ARN,ASN,ACN,AGN
- ! EXTERNAL FUNCTION CALL RETURN VARIABLES
- ! REAL GAMMA, ! EULER GAMMA FUNCTION
- ! REAL POLYSVP, ! SAT. PRESSURE FUNCTION
- ! REAL DERF1 ! ERROR FUNCTION
- ! DUMMY VARIABLES
- REAL DUM,DUM1,DUM2,DUMT,DUMQV,DUMQSS,DUMQSI,DUMS
- ! PROGNOSTIC SUPERSATURATION
- REAL DQSDT ! CHANGE OF SAT. MIX. RAT. WITH TEMPERATURE
- REAL DQSIDT ! CHANGE IN ICE SAT. MIXING RAT. WITH T
- REAL EPSI ! 1/PHASE REL. TIME (SEE M2005), ICE
- REAL EPSS ! 1/PHASE REL. TIME (SEE M2005), SNOW
- REAL EPSR ! 1/PHASE REL. TIME (SEE M2005), RAIN
- REAL EPSG ! 1/PHASE REL. TIME (SEE M2005), GRAUPEL
- ! NEW DROPLET ACTIVATION VARIABLES
- REAL TAUC ! PHASE REL. TIME (SEE M2005), DROPLETS
- REAL TAUR ! PHASE REL. TIME (SEE M2005), RAIN
- REAL TAUI ! PHASE REL. TIME (SEE M2005), CLOUD ICE
- REAL TAUS ! PHASE REL. TIME (SEE M2005), SNOW
- REAL TAUG ! PHASE REL. TIME (SEE M2005), GRAUPEL
- REAL DUMACT,DUM3
- ! COUNTING/INDEX VARIABLES
- INTEGER K,NSTEP,N ! ,I
- ! LTRUE IS ONLY USED TO SPEED UP THE CODE !!
- ! LTRUE, SWITCH = 0, NO HYDROMETEORS IN COLUMN,
- ! = 1, HYDROMETEORS IN COLUMN
- INTEGER LTRUE
- ! DROPLET ACTIVATION/FREEZING AEROSOL
- REAL CT ! DROPLET ACTIVATION PARAMETER
- REAL TEMP1 ! DUMMY TEMPERATURE
- REAL SAT1 ! DUMMY SATURATION
- REAL SIGVL ! SURFACE TENSION LIQ/VAPOR
- REAL KEL ! KELVIN PARAMETER
- REAL KC2 ! TOTAL ICE NUCLEATION RATE
- REAL CRY,KRY ! AEROSOL ACTIVATION PARAMETERS
- ! MORE WORKING/DUMMY VARIABLES
- REAL DUMQI,DUMNI,DC0,DS0,DG0
- REAL DUMQC,DUMQR,RATIO,SUM_DEP,FUDGEF
- ! EFFECTIVE VERTICAL VELOCITY (M/S)
- REAL WEF
- ! WORKING PARAMETERS FOR ICE NUCLEATION
- REAL ANUC,BNUC
- ! WORKING PARAMETERS FOR AEROSOL ACTIVATION
- REAL AACT,GAMM,GG,PSI,ETA1,ETA2,SM1,SM2,SMAX,UU1,UU2,ALPHA
- ! DUMMY SIZE DISTRIBUTION PARAMETERS
- REAL DLAMS,DLAMR,DLAMI,DLAMC,DLAMG,LAMMAX,LAMMIN
- INTEGER IDROP
- ! FOR WRF-CHEM
- REAL, DIMENSION(KTS:KTE)::C2PREC,CSED,ISED,SSED,GSED,RSED
- ! comment lines for wrf-chem since these are intent(in) in that case
- ! REAL, DIMENSION(KTS:KTE) :: NC3DTEN ! CLOUD DROPLET NUMBER CONCENTRATION (1/KG/S)
- ! REAL, DIMENSION(KTS:KTE) :: NC3D ! CLOUD DROPLET NUMBER CONCENTRATION (1/KG)
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! SET LTRUE INITIALLY TO 0
- LTRUE = 0
- ! ATMOSPHERIC PARAMETERS THAT VARY IN TIME AND HEIGHT
- DO K = KTS,KTE
- ! NC3DTEN LOCAL ARRAY INITIALIZED
- NC3DTEN(K) = 0.
- ! INITIALIZE VARIABLES FOR WRF-CHEM OUTPUT TO ZERO
- C2PREC(K)=0.
- CSED(K)=0.
- ISED(K)=0.
- SSED(K)=0.
- GSED(K)=0.
- RSED(K)=0.
- ! LATENT HEAT OF VAPORATION
- XXLV(K) = 3.1484E6-2370.*T3D(K)
- ! LATENT HEAT OF SUBLIMATION
- XXLS(K) = 3.15E6-2370.*T3D(K)+0.3337E6
- CPM(K) = CP*(1.+0.887*QV3D(K))
- ! SATURATION VAPOR PRESSURE AND MIXING RATIO
- ! hm, add fix for low pressure, 5/12/10
- EVS(K) = min(0.99*pres(k),POLYSVP(T3D(K),0)) ! PA
- EIS(K) = min(0.99*pres(k),POLYSVP(T3D(K),1)) ! PA
- ! MAKE SURE ICE SATURATION DOESN'T EXCEED WATER SAT. NEAR FREEZING
- IF (EIS(K).GT.EVS(K)) EIS(K) = EVS(K)
- QVS(K) = EP_2*EVS(K)/(PRES(K)-EVS(K))
- QVI(K) = EP_2*EIS(K)/(PRES(K)-EIS(K))
- QVQVS(K) = QV3D(K)/QVS(K)
- QVQVSI(K) = QV3D(K)/QVI(K)
- ! AIR DENSITY
- RHO(K) = PRES(K)/(R*T3D(K))
- ! ADD NUMBER CONCENTRATION DUE TO CUMULUS TENDENCY
- ! ASSUME N0 ASSOCIATED WITH CUMULUS PARAM RAIN IS 10^7 M^-4
- ! ASSUME N0 ASSOCIATED WITH CUMULUS PARAM SNOW IS 2 X 10^7 M^-4
- ! FOR DETRAINED CLOUD ICE, ASSUME MEAN VOLUME DIAM OF 80 MICRON
- IF (QRCU1D(K).GE.1.E-10) THEN
- DUM=1.8e5*(QRCU1D(K)*DT/(PI*RHOW*RHO(K)**3))**0.25
- NR3D(K)=NR3D(K)+DUM
- END IF
- IF (QSCU1D(K).GE.1.E-10) THEN
- DUM=3.e5*(QSCU1D(K)*DT/(CONS1*RHO(K)**3))**(1./(DS+1.))
- NS3D(K)=NS3D(K)+DUM
- END IF
- IF (QICU1D(K).GE.1.E-10) THEN
- DUM=QICU1D(K)*DT/(CI*(80.E-6)**DI)
- NI3D(K)=NI3D(K)+DUM
- END IF
- ! AT SUBSATURATION, REMOVE SMALL AMOUNTS OF CLOUD/PRECIP WATER
- ! hm modify 7/0/09 change limit to 1.e-8
- IF (QVQVS(K).LT.0.9) THEN
- IF (QR3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QR3D(K)
- T3D(K)=T3D(K)-QR3D(K)*XXLV(K)/CPM(K)
- QR3D(K)=0.
- END IF
- IF (QC3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QC3D(K)
- T3D(K)=T3D(K)-QC3D(K)*XXLV(K)/CPM(K)
- QC3D(K)=0.
- END IF
- END IF
- IF (QVQVSI(K).LT.0.9) THEN
- IF (QI3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QI3D(K)
- T3D(K)=T3D(K)-QI3D(K)*XXLS(K)/CPM(K)
- QI3D(K)=0.
- END IF
- IF (QNI3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QNI3D(K)
- T3D(K)=T3D(K)-QNI3D(K)*XXLS(K)/CPM(K)
- QNI3D(K)=0.
- END IF
- IF (QG3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QG3D(K)
- T3D(K)=T3D(K)-QG3D(K)*XXLS(K)/CPM(K)
- QG3D(K)=0.
- END IF
- END IF
- ! HEAT OF FUSION
- XLF(K) = XXLS(K)-XXLV(K)
- !..................................................................
- ! IF MIXING RATIO < QSMALL SET MIXING RATIO AND NUMBER CONC TO ZERO
- IF (QC3D(K).LT.QSMALL) THEN
- QC3D(K) = 0.
- NC3D(K) = 0.
- EFFC(K) = 0.
- END IF
- IF (QR3D(K).LT.QSMALL) THEN
- QR3D(K) = 0.
- NR3D(K) = 0.
- EFFR(K) = 0.
- END IF
- IF (QI3D(K).LT.QSMALL) THEN
- QI3D(K) = 0.
- NI3D(K) = 0.
- EFFI(K) = 0.
- END IF
- IF (QNI3D(K).LT.QSMALL) THEN
- QNI3D(K) = 0.
- NS3D(K) = 0.
- EFFS(K) = 0.
- END IF
- IF (QG3D(K).LT.QSMALL) THEN
- QG3D(K) = 0.
- NG3D(K) = 0.
- EFFG(K) = 0.
- END IF
- ! INITIALIZE SEDIMENTATION TENDENCIES FOR MIXING RATIO
- QRSTEN(K) = 0.
- QISTEN(K) = 0.
- QNISTEN(K) = 0.
- QCSTEN(K) = 0.
- QGSTEN(K) = 0.
- !..................................................................
- ! MICROPHYSICS PARAMETERS VARYING IN TIME/HEIGHT
- ! fix 053011
- MU(K) = 1.496E-6*T3D(K)**1.5/(T3D(K)+120.)
- ! FALL SPEED WITH DENSITY CORRECTION (HEYMSFIELD AND BENSSEMER 2006)
- DUM = (RHOSU/RHO(K))**0.54
- ! fix 053011
- ! AIN(K) = DUM*AI
- ! AA revision 4/1/11: Ikawa and Saito 1991 air-density correction
- AIN(K) = (RHOSU/RHO(K))**0.35*AI
- ARN(K) = DUM*AR
- ASN(K) = DUM*AS
- ! ACN(K) = DUM*AC
- ! AA revision 4/1/11: temperature-dependent Stokes fall speed
- ACN(K) = G*RHOW/(18.*MU(K))
- ! HM ADD GRAUPEL 8/28/06
- AGN(K) = DUM*AG
- !hm 4/7/09 bug fix, initialize lami to prevent later division by zero
- LAMI(K)=0.
- !..................................
- ! IF THERE IS NO CLOUD/PRECIP WATER, AND IF SUBSATURATED, THEN SKIP MICROPHYSICS
- ! FOR THIS LEVEL
- IF (QC3D(K).LT.QSMALL.AND.QI3D(K).LT.QSMALL.AND.QNI3D(K).LT.QSMALL &
- .AND.QR3D(K).LT.QSMALL.AND.QG3D(K).LT.QSMALL) THEN
- IF (T3D(K).LT.273.15.AND.QVQVSI(K).LT.0.999) GOTO 200
- IF (T3D(K).GE.273.15.AND.QVQVS(K).LT.0.999) GOTO 200
- END IF
- ! THERMAL CONDUCTIVITY FOR AIR
- ! fix 053011
- KAP(K) = 1.414E3*MU(K)
- ! DIFFUSIVITY OF WATER VAPOR
- DV(K) = 8.794E-5*T3D(K)**1.81/PRES(K)
- ! SCHMIT NUMBER
- ! fix 053011
- SC(K) = MU(K)/(RHO(K)*DV(K))
- ! PSYCHOMETIC CORRECTIONS
- ! RATE OF CHANGE SAT. MIX. RATIO WITH TEMPERATURE
- DUM = (RV*T3D(K)**2)
- DQSDT = XXLV(K)*QVS(K)/DUM
- DQSIDT = XXLS(K)*QVI(K)/DUM
- ABI(K) = 1.+DQSIDT*XXLS(K)/CPM(K)
- AB(K) = 1.+DQSDT*XXLV(K)/CPM(K)
- !
- !.....................................................................
- !.....................................................................
- ! CASE FOR TEMPERATURE ABOVE FREEZING
- IF (T3D(K).GE.273.15) THEN
- !......................................................................
- !HM ADD, ALLOW FOR CONSTANT DROPLET NUMBER
- ! INUM = 0, PREDICT DROPLET NUMBER
- ! INUM = 1, SET CONSTANT DROPLET NUMBER
- IF (iinum.EQ.1) THEN
- ! CONVERT NDCNST FROM CM-3 TO KG-1
- NC3D(K)=NDCNST*1.E6/RHO(K)
- END IF
- ! GET SIZE DISTRIBUTION PARAMETERS
- ! MELT VERY SMALL SNOW AND GRAUPEL MIXING RATIOS, ADD TO RAIN
- IF (QNI3D(K).LT.1.E-6) THEN
- QR3D(K)=QR3D(K)+QNI3D(K)
- NR3D(K)=NR3D(K)+NS3D(K)
- T3D(K)=T3D(K)-QNI3D(K)*XLF(K)/CPM(K)
- QNI3D(K) = 0.
- NS3D(K) = 0.
- END IF
- IF (QG3D(K).LT.1.E-6) THEN
- QR3D(K)=QR3D(K)+QG3D(K)
- NR3D(K)=NR3D(K)+NG3D(K)
- T3D(K)=T3D(K)-QG3D(K)*XLF(K)/CPM(K)
- QG3D(K) = 0.
- NG3D(K) = 0.
- END IF
- IF (QC3D(K).LT.QSMALL.AND.QNI3D(K).LT.1.E-8.AND.QR3D(K).LT.QSMALL.AND.QG3D(K).LT.1.E-8) GOTO 300
- ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
- NS3D(K) = MAX(0.,NS3D(K))
- NC3D(K) = MAX(0.,NC3D(K))
- NR3D(K) = MAX(0.,NR3D(K))
- NG3D(K) = MAX(0.,NG3D(K))
- !......................................................................
- ! RAIN
- IF (QR3D(K).GE.QSMALL) THEN
- LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
- N0RR(K) = NR3D(K)*LAMR(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMR(K).LT.LAMMINR) THEN
- LAMR(K) = LAMMINR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- ELSE IF (LAMR(K).GT.LAMMAXR) THEN
- LAMR(K) = LAMMAXR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- END IF
- END IF
- !......................................................................
- ! CLOUD DROPLETS
- ! MARTIN ET AL. (1994) FORMULA FOR PGAM
- IF (QC3D(K).GE.QSMALL) THEN
- DUM = PRES(K)/(287.15*T3D(K))
- PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
- PGAM(K)=1./(PGAM(K)**2)-1.
- PGAM(K)=MAX(PGAM(K),2.)
- PGAM(K)=MIN(PGAM(K),10.)
- ! CALCULATE LAMC
- LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
- (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
- ! LAMMIN, 60 MICRON DIAMETER
- ! LAMMAX, 1 MICRON
- LAMMIN = (PGAM(K)+1.)/60.E-6
- LAMMAX = (PGAM(K)+1.)/1.E-6
- IF (LAMC(K).LT.LAMMIN) THEN
- LAMC(K) = LAMMIN
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- ELSE IF (LAMC(K).GT.LAMMAX) THEN
- LAMC(K) = LAMMAX
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- END IF
- END IF
- !......................................................................
- ! SNOW
- IF (QNI3D(K).GE.QSMALL) THEN
- LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
- N0S(K) = NS3D(K)*LAMS(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMS(K).LT.LAMMINS) THEN
- LAMS(K) = LAMMINS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- ELSE IF (LAMS(K).GT.LAMMAXS) THEN
- LAMS(K) = LAMMAXS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- END IF
- END IF
- !......................................................................
- ! GRAUPEL
- IF (QG3D(K).GE.QSMALL) THEN
- LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
- N0G(K) = NG3D(K)*LAMG(K)
- ! ADJUST VARS
- IF (LAMG(K).LT.LAMMING) THEN
- LAMG(K) = LAMMING
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- ELSE IF (LAMG(K).GT.LAMMAXG) THEN
- LAMG(K) = LAMMAXG
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- END IF
- END IF
- !.....................................................................
- ! ZERO OUT PROCESS RATES
- PRC(K) = 0.
- NPRC(K) = 0.
- NPRC1(K) = 0.
- PRA(K) = 0.
- NPRA(K) = 0.
- NRAGG(K) = 0.
- PSMLT(K) = 0.
- NSMLTS(K) = 0.
- NSMLTR(K) = 0.
- EVPMS(K) = 0.
- PCC(K) = 0.
- PRE(K) = 0.
- NSUBC(K) = 0.
- NSUBR(K) = 0.
- PRACG(K) = 0.
- NPRACG(K) = 0.
- PSMLT(K) = 0.
- EVPMS(K) = 0.
- PGMLT(K) = 0.
- EVPMG(K) = 0.
- PRACS(K) = 0.
- NPRACS(K) = 0.
- NGMLTG(K) = 0.
- NGMLTR(K) = 0.
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CALCULATION OF MICROPHYSICAL PROCESS RATES, T > 273.15 K
- !.................................................................
- !.......................................................................
- ! AUTOCONVERSION OF CLOUD LIQUID WATER TO RAIN
- ! FORMULA FROM BEHENG (1994)
- ! USING NUMERICAL SIMULATION OF STOCHASTIC COLLECTION EQUATION
- ! AND INITIAL CLOUD DROPLET SIZE DISTRIBUTION SPECIFIED
- ! AS A GAMMA DISTRIBUTION
- ! USE MINIMUM VALUE OF 1.E-6 TO PREVENT FLOATING POINT ERROR
- IF (QC3D(K).GE.1.E-6) THEN
- ! HM ADD 12/13/06, REPLACE WITH NEWER FORMULA
- ! FROM KHAIROUTDINOV AND KOGAN 2000, MWR
- PRC(K)=1350.*QC3D(K)**2.47* &
- (NC3D(K)/1.e6*RHO(K))**(-1.79)
- ! note: nprc1 is change in Nr,
- ! nprc is change in Nc
- NPRC1(K) = PRC(K)/CONS29
- NPRC(K) = PRC(K)/(QC3D(k)/NC3D(K))
- ! hm bug fix 3/20/12
- NPRC(K) = MIN(NPRC(K),NC3D(K)/DT)
- NPRC1(K) = MIN(NPRC1(K),NPRC(K))
- END IF
- !.......................................................................
- ! HM ADD 12/13/06, COLLECTION OF SNOW BY RAIN ABOVE FREEZING
- ! FORMULA FROM IKAWA AND SAITO (1991)
- IF (QR3D(K).GE.1.E-8.AND.QNI3D(K).GE.1.E-8) THEN
- UMS = ASN(K)*CONS3/(LAMS(K)**BS)
- UMR = ARN(K)*CONS4/(LAMR(K)**BR)
- UNS = ASN(K)*CONS5/LAMS(K)**BS
- UNR = ARN(K)*CONS6/LAMR(K)**BR
- ! SET REASLISTIC LIMITS ON FALLSPEEDS
- ! bug fix, 10/08/09
- dum=(rhosu/rho(k))**0.54
- UMS=MIN(UMS,1.2*dum)
- UNS=MIN(UNS,1.2*dum)
- UMR=MIN(UMR,9.1*dum)
- UNR=MIN(UNR,9.1*dum)
- PRACS(K) = CONS31*(((1.2*UMR-0.95*UMS)**2+ &
- 0.08*UMS*UMR)**0.5*RHO(K)* &
- N0RR(K)*N0S(K)/LAMS(K)**3* &
- (5./(LAMS(K)**3*LAMR(K))+ &
- 2./(LAMS(K)**2*LAMR(K)**2)+ &
- 0.5/(LAMS(K)*LAMR(K)**3)))
- ! fix 053011, npracs no longer subtracted from snow
- ! NPRACS(K) = CONS32*RHO(K)*(1.7*(UNR-UNS)**2+ &
- ! 0.3*UNR*UNS)**0.5*N0RR(K)*N0S(K)* &
- ! (1./(LAMR(K)**3*LAMS(K))+ &
- ! 1./(LAMR(K)**2*LAMS(K)**2)+ &
- ! 1./(LAMR(K)*LAMS(K)**3))
- END IF
- ! ADD COLLECTION OF GRAUPEL BY RAIN ABOVE FREEZING
- ! ASSUME ALL RAIN COLLECTION BY GRAUPEL ABOVE FREEZING IS SHED
- ! ASSUME SHED DROPS ARE 1 MM IN SIZE
- IF (QR3D(K).GE.1.E-8.AND.QG3D(K).GE.1.E-8) THEN
- UMG = AGN(K)*CONS7/(LAMG(K)**BG)
- UMR = ARN(K)*CONS4/(LAMR(K)**BR)
- UNG = AGN(K)*CONS8/LAMG(K)**BG
- UNR = ARN(K)*CONS6/LAMR(K)**BR
- ! SET REASLISTIC LIMITS ON FALLSPEEDS
- ! bug fix, 10/08/09
- dum=(rhosu/rho(k))**0.54
- UMG=MIN(UMG,20.*dum)
- UNG=MIN(UNG,20.*dum)
- UMR=MIN(UMR,9.1*dum)
- UNR=MIN(UNR,9.1*dum)
- ! PRACG IS MIXING RATIO OF RAIN PER SEC COLLECTED BY GRAUPEL/HAIL
- PRACG(K) = CONS41*(((1.2*UMR-0.95*UMG)**2+ &
- 0.08*UMG*UMR)**0.5*RHO(K)* &
- N0RR(K)*N0G(K)/LAMR(K)**3* &
- (5./(LAMR(K)**3*LAMG(K))+ &
- 2./(LAMR(K)**2*LAMG(K)**2)+ &
- 0.5/(LAMR(k)*LAMG(k)**3)))
- ! ASSUME 1 MM DROPS ARE SHED, GET NUMBER SHED PER SEC
- DUM = PRACG(K)/5.2E-7
- NPRACG(K) = CONS32*RHO(K)*(1.7*(UNR-UNG)**2+ &
- 0.3*UNR*UNG)**0.5*N0RR(K)*N0G(K)* &
- (1./(LAMR(K)**3*LAMG(K))+ &
- 1./(LAMR(K)**2*LAMG(K)**2)+ &
- 1./(LAMR(K)*LAMG(K)**3))
- NPRACG(K)=MAX(NPRACG(K)-DUM,0.)
- END IF
- !.......................................................................
- ! ACCRETION OF CLOUD LIQUID WATER BY RAIN
- ! CONTINUOUS COLLECTION EQUATION WITH
- ! GRAVITATIONAL COLLECTION KERNEL, DROPLET FALL SPEED NEGLECTED
- IF (QR3D(K).GE.1.E-8 .AND. QC3D(K).GE.1.E-8) THEN
- ! 12/13/06 HM ADD, REPLACE WITH NEWER FORMULA FROM
- ! KHAIROUTDINOV AND KOGAN 2000, MWR
- DUM=(QC3D(K)*QR3D(K))
- PRA(K) = 67.*(DUM)**1.15
- NPRA(K) = PRA(K)/(QC3D(K)/NC3D(K))
- END IF
- !.......................................................................
- ! SELF-COLLECTION OF RAIN DROPS
- ! FROM BEHENG(1994)
- ! FROM NUMERICAL SIMULATION OF THE STOCHASTIC COLLECTION EQUATION
- ! AS DESCRINED ABOVE FOR AUTOCONVERSION
- IF (QR3D(K).GE.1.E-8) THEN
- ! include breakup add 10/09/09
- dum1=300.e-6
- if (1./lamr(k).lt.dum1) then
- dum=1.
- else if (1./lamr(k).ge.dum1) then
- dum=2.-exp(2300.*(1./lamr(k)-dum1))
- end if
- ! NRAGG(K) = -8.*NR3D(K)*QR3D(K)*RHO(K)
- NRAGG(K) = -5.78*dum*NR3D(K)*QR3D(K)*RHO(K)
- END IF
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CALCULATE EVAP OF RAIN (RUTLEDGE AND HOBBS 1983)
- IF (QR3D(K).GE.QSMALL) THEN
- EPSR = 2.*PI*N0RR(K)*RHO(K)*DV(K)* &
- (F1R/(LAMR(K)*LAMR(K))+ &
- F2R*(ARN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS9/ &
- (LAMR(K)**CONS34))
- ELSE
- EPSR = 0.
- END IF
- ! NO CONDENSATION ONTO RAIN, ONLY EVAP ALLOWED
- IF (QV3D(K).LT.QVS(K)) THEN
- PRE(K) = EPSR*(QV3D(K)-QVS(K))/AB(K)
- PRE(K) = MIN(PRE(K),0.)
- ELSE
- PRE(K) = 0.
- END IF
- !.......................................................................
- ! MELTING OF SNOW
- ! SNOW MAY PERSITS ABOVE FREEZING, FORMULA FROM RUTLEDGE AND HOBBS, 1984
- ! IF WATER SUPERSATURATION, SNOW MELTS TO FORM RAIN
- IF (QNI3D(K).GE.1.E-8) THEN
- ! fix 053011
- ! HM, MODIFY FOR V3.2, ADD ACCELERATED MELTING DUE TO COLLISION WITH RAIN
- ! DUM = -CPW/XLF(K)*T3D(K)*PRACS(K)
- DUM = -CPW/XLF(K)*(T3D(K)-273.15)*PRACS(K)
- PSMLT(K)=2.*PI*N0S(K)*KAP(K)*(273.15-T3D(K))/ &
- XLF(K)*RHO(K)*(F1S/(LAMS(K)*LAMS(K))+ &
- F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS10/ &
- (LAMS(K)**CONS35))+DUM
- ! IN WATER SUBSATURATION, SNOW MELTS AND EVAPORATES
- IF (QVQVS(K).LT.1.) THEN
- EPSS = 2.*PI*N0S(K)*RHO(K)*DV(K)* &
- (F1S/(LAMS(K)*LAMS(K))+ &
- F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS10/ &
- (LAMS(K)**CONS35))
- ! hm fix 8/4/08
- EVPMS(K) = (QV3D(K)-QVS(K))*EPSS/AB(K)
- EVPMS(K) = MAX(EVPMS(K),PSMLT(K))
- PSMLT(K) = PSMLT(K)-EVPMS(K)
- END IF
- END IF
- !.......................................................................
- ! MELTING OF GRAUPEL
- ! GRAUPEL MAY PERSITS ABOVE FREEZING, FORMULA FROM RUTLEDGE AND HOBBS, 1984
- ! IF WATER SUPERSATURATION, GRAUPEL MELTS TO FORM RAIN
- IF (QG3D(K).GE.1.E-8) THEN
- ! fix 053011
- ! HM, MODIFY FOR V3.2, ADD ACCELERATED MELTING DUE TO COLLISION WITH RAIN
- ! DUM = -CPW/XLF(K)*T3D(K)*PRACG(K)
- DUM = -CPW/XLF(K)*(T3D(K)-273.15)*PRACG(K)
- PGMLT(K)=2.*PI*N0G(K)*KAP(K)*(273.15-T3D(K))/ &
- XLF(K)*RHO(K)*(F1S/(LAMG(K)*LAMG(K))+ &
- F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS11/ &
- (LAMG(K)**CONS36))+DUM
- ! IN WATER SUBSATURATION, GRAUPEL MELTS AND EVAPORATES
- IF (QVQVS(K).LT.1.) THEN
- EPSG = 2.*PI*N0G(K)*RHO(K)*DV(K)* &
- (F1S/(LAMG(K)*LAMG(K))+ &
- F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS11/ &
- (LAMG(K)**CONS36))
- ! hm fix 8/4/08
- EVPMG(K) = (QV3D(K)-QVS(K))*EPSG/AB(K)
- EVPMG(K) = MAX(EVPMG(K),PGMLT(K))
- PGMLT(K) = PGMLT(K)-EVPMG(K)
- END IF
- END IF
- ! HM, V3.2
- ! RESET PRACG AND PRACS TO ZERO, THIS IS DONE BECAUSE THERE IS NO
- ! TRANSFER OF MASS FROM SNOW AND GRAUPEL TO RAIN DIRECTLY FROM COLLECTION
- ! ABOVE FREEZING, IT IS ONLY USED FOR ENHANCEMENT OF MELTING AND SHEDDING
- PRACG(K) = 0.
- PRACS(K) = 0.
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! FOR CLOUD ICE, ONLY PROCESSES OPERATING AT T > 273.15 IS
- ! MELTING, WHICH IS ALREADY CONSERVED DURING PROCESS
- ! CALCULATION
- ! CONSERVATION OF QC
- DUM = (PRC(K)+PRA(K))*DT
- IF (DUM.GT.QC3D(K).AND.QC3D(K).GE.QSMALL) THEN
- RATIO = QC3D(K)/DUM
- PRC(K) = PRC(K)*RATIO
- PRA(K) = PRA(K)*RATIO
- END IF
- ! CONSERVATION OF SNOW
- DUM = (-PSMLT(K)-EVPMS(K)+PRACS(K))*DT
- IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
- ! NO SOURCE TERMS FOR SNOW AT T > FREEZING
- RATIO = QNI3D(K)/DUM
- PSMLT(K) = PSMLT(K)*RATIO
- EVPMS(K) = EVPMS(K)*RATIO
- PRACS(K) = PRACS(K)*RATIO
- END IF
- ! CONSERVATION OF GRAUPEL
- DUM = (-PGMLT(K)-EVPMG(K)+PRACG(K))*DT
- IF (DUM.GT.QG3D(K).AND.QG3D(K).GE.QSMALL) THEN
- ! NO SOURCE TERM FOR GRAUPEL ABOVE FREEZING
- RATIO = QG3D(K)/DUM
- PGMLT(K) = PGMLT(K)*RATIO
- EVPMG(K) = EVPMG(K)*RATIO
- PRACG(K) = PRACG(K)*RATIO
- END IF
- ! CONSERVATION OF QR
- ! HM 12/13/06, ADDED CONSERVATION OF RAIN SINCE PRE IS NEGATIVE
- DUM = (-PRACS(K)-PRACG(K)-PRE(K)-PRA(K)-PRC(K)+PSMLT(K)+PGMLT(K))*DT
- IF (DUM.GT.QR3D(K).AND.QR3D(K).GE.QSMALL) THEN
- RATIO = (QR3D(K)/DT+PRACS(K)+PRACG(K)+PRA(K)+PRC(K)-PSMLT(K)-PGMLT(K))/ &
- (-PRE(K))
- PRE(K) = PRE(K)*RATIO
-
- END IF
- !....................................
- QV3DTEN(K) = QV3DTEN(K)+(-PRE(K)-EVPMS(K)-EVPMG(K))
- T3DTEN(K) = T3DTEN(K)+(PRE(K)*XXLV(K)+(EVPMS(K)+EVPMG(K))*XXLS(K)+&
- (PSMLT(K)+PGMLT(K)-PRACS(K)-PRACG(K))*XLF(K))/CPM(K)
- QC3DTEN(K) = QC3DTEN(K)+(-PRA(K)-PRC(K))
- QR3DTEN(K) = QR3DTEN(K)+(PRE(K)+PRA(K)+PRC(K)-PSMLT(K)-PGMLT(K)+PRACS(K)+PRACG(K))
- QNI3DTEN(K) = QNI3DTEN(K)+(PSMLT(K)+EVPMS(K)-PRACS(K))
- QG3DTEN(K) = QG3DTEN(K)+(PGMLT(K)+EVPMG(K)-PRACG(K))
- ! fix 053011
- ! NS3DTEN(K) = NS3DTEN(K)-NPRACS(K)
- ! HM, bug fix 5/12/08, npracg is subtracted from nr not ng
- ! NG3DTEN(K) = NG3DTEN(K)
- NC3DTEN(K) = NC3DTEN(K)+ (-NPRA(K)-NPRC(K))
- NR3DTEN(K) = NR3DTEN(K)+ (NPRC1(K)+NRAGG(K)-NPRACG(K))
- ! HM ADD, WRF-CHEM, ADD TENDENCIES FOR C2PREC
- C2PREC(K) = PRA(K)+PRC(K)
- IF (PRE(K).LT.0.) THEN
- DUM = PRE(K)*DT/QR3D(K)
- DUM = MAX(-1.,DUM)
- NSUBR(K) = DUM*NR3D(K)/DT
- END IF
- IF (EVPMS(K)+PSMLT(K).LT.0.) THEN
- DUM = (EVPMS(K)+PSMLT(K))*DT/QNI3D(K)
- DUM = MAX(-1.,DUM)
- NSMLTS(K) = DUM*NS3D(K)/DT
- END IF
- IF (PSMLT(K).LT.0.) THEN
- DUM = PSMLT(K)*DT/QNI3D(K)
- DUM = MAX(-1.0,DUM)
- NSMLTR(K) = DUM*NS3D(K)/DT
- END IF
- IF (EVPMG(K)+PGMLT(K).LT.0.) THEN
- DUM = (EVPMG(K)+PGMLT(K))*DT/QG3D(K)
- DUM = MAX(-1.,DUM)
- NGMLTG(K) = DUM*NG3D(K)/DT
- END IF
- IF (PGMLT(K).LT.0.) THEN
- DUM = PGMLT(K)*DT/QG3D(K)
- DUM = MAX(-1.0,DUM)
- NGMLTR(K) = DUM*NG3D(K)/DT
- END IF
- NS3DTEN(K) = NS3DTEN(K)+(NSMLTS(K))
- NG3DTEN(K) = NG3DTEN(K)+(NGMLTG(K))
- NR3DTEN(K) = NR3DTEN(K)+(NSUBR(K)-NSMLTR(K)-NGMLTR(K))
- 300 CONTINUE
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! NOW CALCULATE SATURATION ADJUSTMENT TO CONDENSE EXTRA VAPOR ABOVE
- ! WATER SATURATION
- DUMT = T3D(K)+DT*T3DTEN(K)
- DUMQV = QV3D(K)+DT*QV3DTEN(K)
- ! hm, add fix for low pressure, 5/12/10
- dum=min(0.99*pres(k),POLYSVP(DUMT,0))
- DUMQSS = EP_2*dum/(PRES(K)-dum)
- DUMQC = QC3D(K)+DT*QC3DTEN(K)
- DUMQC = MAX(DUMQC,0.)
- ! SATURATION ADJUSTMENT FOR LIQUID
- DUMS = DUMQV-DUMQSS
- PCC(K) = DUMS/(1.+XXLV(K)**2*DUMQSS/(CPM(K)*RV*DUMT**2))/DT
- IF (PCC(K)*DT+DUMQC.LT.0.) THEN
- PCC(K) = -DUMQC/DT
- END IF
- QV3DTEN(K) = QV3DTEN(K)-PCC(K)
- T3DTEN(K) = T3DTEN(K)+PCC(K)*XXLV(K)/CPM(K)
- QC3DTEN(K) = QC3DTEN(K)+PCC(K)
- !.......................................................................
- ! ACTIVATION OF CLOUD DROPLETS
- ! ACTIVATION OF DROPLET CURRENTLY NOT CALCULATED
- ! DROPLET CONCENTRATION IS SPECIFIED !!!!!
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! SUBLIMATE, MELT, OR EVAPORATE NUMBER CONCENTRATION
- ! THIS FORMULATION ASSUMES 1:1 RATIO BETWEEN MASS LOSS AND
- ! LOSS OF NUMBER CONCENTRATION
- ! IF (PCC(K).LT.0.) THEN
- ! DUM = PCC(K)*DT/QC3D(K)
- ! DUM = MAX(-1.,DUM)
- ! NSUBC(K) = DUM*NC3D(K)/DT
- ! END IF
- ! UPDATE TENDENCIES
- ! NC3DTEN(K) = NC3DTEN(K)+NSUBC(K)
- !.....................................................................
- !.....................................................................
- ELSE ! TEMPERATURE < 273.15
- !......................................................................
- !HM ADD, ALLOW FOR CONSTANT DROPLET NUMBER
- ! INUM = 0, PREDICT DROPLET NUMBER
- ! INUM = 1, SET CONSTANT DROPLET NUMBER
- IF (iinum.EQ.1) THEN
- ! CONVERT NDCNST FROM CM-3 TO KG-1
- NC3D(K)=NDCNST*1.E6/RHO(K)
- END IF
- ! CALCULATE SIZE DISTRIBUTION PARAMETERS
- ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
- NI3D(K) = MAX(0.,NI3D(K))
- NS3D(K) = MAX(0.,NS3D(K))
- NC3D(K) = MAX(0.,NC3D(K))
- NR3D(K) = MAX(0.,NR3D(K))
- NG3D(K) = MAX(0.,NG3D(K))
- !......................................................................
- ! CLOUD ICE
- IF (QI3D(K).GE.QSMALL) THEN
- LAMI(K) = (CONS12* &
- NI3D(K)/QI3D(K))**(1./DI)
- N0I(K) = NI3D(K)*LAMI(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMI(K).LT.LAMMINI) THEN
- LAMI(K) = LAMMINI
- N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
- NI3D(K) = N0I(K)/LAMI(K)
- ELSE IF (LAMI(K).GT.LAMMAXI) THEN
- LAMI(K) = LAMMAXI
- N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
- NI3D(K) = N0I(K)/LAMI(K)
- END IF
- END IF
- !......................................................................
- ! RAIN
- IF (QR3D(K).GE.QSMALL) THEN
- LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
- N0RR(K) = NR3D(K)*LAMR(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMR(K).LT.LAMMINR) THEN
- LAMR(K) = LAMMINR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- ELSE IF (LAMR(K).GT.LAMMAXR) THEN
- LAMR(K) = LAMMAXR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- END IF
- END IF
- !......................................................................
- ! CLOUD DROPLETS
- ! MARTIN ET AL. (1994) FORMULA FOR PGAM
- IF (QC3D(K).GE.QSMALL) THEN
- DUM = PRES(K)/(287.15*T3D(K))
- PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
- PGAM(K)=1./(PGAM(K)**2)-1.
- PGAM(K)=MAX(PGAM(K),2.)
- PGAM(K)=MIN(PGAM(K),10.)
- ! CALCULATE LAMC
- LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
- (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
- ! LAMMIN, 60 MICRON DIAMETER
- ! LAMMAX, 1 MICRON
- LAMMIN = (PGAM(K)+1.)/60.E-6
- LAMMAX = (PGAM(K)+1.)/1.E-6
- IF (LAMC(K).LT.LAMMIN) THEN
- LAMC(K) = LAMMIN
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- ELSE IF (LAMC(K).GT.LAMMAX) THEN
- LAMC(K) = LAMMAX
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- END IF
- ! TO CALCULATE DROPLET FREEZING
- CDIST1(K) = NC3D(K)/GAMMA(PGAM(K)+1.)
- END IF
- !......................................................................
- ! SNOW
- IF (QNI3D(K).GE.QSMALL) THEN
- LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
- N0S(K) = NS3D(K)*LAMS(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMS(K).LT.LAMMINS) THEN
- LAMS(K) = LAMMINS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- ELSE IF (LAMS(K).GT.LAMMAXS) THEN
- LAMS(K) = LAMMAXS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- END IF
- END IF
- !......................................................................
- ! GRAUPEL
- IF (QG3D(K).GE.QSMALL) THEN
- LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
- N0G(K) = NG3D(K)*LAMG(K)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMG(K).LT.LAMMING) THEN
- LAMG(K) = LAMMING
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- ELSE IF (LAMG(K).GT.LAMMAXG) THEN
- LAMG(K) = LAMMAXG
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- END IF
- END IF
- !.....................................................................
- ! ZERO OUT PROCESS RATES
- MNUCCC(K) = 0.
- NNUCCC(K) = 0.
- PRC(K) = 0.
- NPRC(K) = 0.
- NPRC1(K) = 0.
- NSAGG(K) = 0.
- PSACWS(K) = 0.
- NPSACWS(K) = 0.
- PSACWI(K) = 0.
- NPSACWI(K) = 0.
- PRACS(K) = 0.
- NPRACS(K) = 0.
- NMULTS(K) = 0.
- QMULTS(K) = 0.
- NMULTR(K) = 0.
- QMULTR(K) = 0.
- NMULTG(K) = 0.
- QMULTG(K) = 0.
- NMULTRG(K) = 0.
- QMULTRG(K) = 0.
- MNUCCR(K) = 0.
- NNUCCR(K) = 0.
- PRA(K) = 0.
- NPRA(K) = 0.
- NRAGG(K) = 0.
- PRCI(K) = 0.
- NPRCI(K) = 0.
- PRAI(K) = 0.
- NPRAI(K) = 0.
- NNUCCD(K) = 0.
- MNUCCD(K) = 0.
- PCC(K) = 0.
- PRE(K) = 0.
- PRD(K) = 0.
- PRDS(K) = 0.
- EPRD(K) = 0.
- EPRDS(K) = 0.
- NSUBC(K) = 0.
- NSUBI(K) = 0.
- NSUBS(K) = 0.
- NSUBR(K) = 0.
- PIACR(K) = 0.
- NIACR(K) = 0.
- PRACI(K) = 0.
- PIACRS(K) = 0.
- NIACRS(K) = 0.
- PRACIS(K) = 0.
- ! HM: ADD GRAUPEL PROCESSES
- PRACG(K) = 0.
- PSACR(K) = 0.
- PSACWG(K) = 0.
- PGSACW(K) = 0.
- PGRACS(K) = 0.
- PRDG(K) = 0.
- EPRDG(K) = 0.
- NPRACG(K) = 0.
- NPSACWG(K) = 0.
- NSCNG(K) = 0.
- NGRACS(K) = 0.
- NSUBG(K) = 0.
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CALCULATION OF MICROPHYSICAL PROCESS RATES
- ! ACCRETION/AUTOCONVERSION/FREEZING/MELTING/COAG.
- !.......................................................................
- ! FREEZING OF CLOUD DROPLETS
- ! ONLY ALLOWED BELOW -4 C
- IF (QC3D(K).GE.QSMALL .AND. T3D(K).LT.269.15) THEN
- ! NUMBER OF CONTACT NUCLEI (M^-3) FROM MEYERS ET AL., 1992
- ! FACTOR OF 1000 IS TO CONVERT FROM L^-1 TO M^-3
- ! MEYERS CURVE
- NACNT = EXP(-2.80+0.262*(273.15-T3D(K)))*1000.
- ! COOPER CURVE
- ! NACNT = 5.*EXP(0.304*(273.15-T3D(K)))
- ! FLECTHER
- ! NACNT = 0.01*EXP(0.6*(273.15-T3D(K)))
- ! CONTACT FREEZING
- ! MEAN FREE PATH
- DUM = 7.37*T3D(K)/(288.*10.*PRES(K))/100.
- ! EFFECTIVE DIFFUSIVITY OF CONTACT NUCLEI
- ! BASED ON BROWNIAN DIFFUSION
- DAP(K) = CONS37*T3D(K)*(1.+DUM/RIN)/MU(K)
-
- MNUCCC(K) = CONS38*DAP(K)*NACNT*EXP(LOG(CDIST1(K))+ &
- LOG(GAMMA(PGAM(K)+5.))-4.*LOG(LAMC(K)))
- NNUCCC(K) = 2.*PI*DAP(K)*NACNT*CDIST1(K)* &
- GAMMA(PGAM(K)+2.)/ &
- LAMC(K)
- ! IMMERSION FREEZING (BIGG 1953)
- MNUCCC(K) = MNUCCC(K)+CONS39* &
- EXP(LOG(CDIST1(K))+LOG(GAMMA(7.+PGAM(K)))-6.*LOG(LAMC(K)))* &
- EXP(AIMM*(273.15-T3D(K)))
- NNUCCC(K) = NNUCCC(K)+ &
- CONS40*EXP(LOG(CDIST1(K))+LOG(GAMMA(PGAM(K)+4.))-3.*LOG(LAMC(K))) &
- *EXP(AIMM*(273.15-T3D(K)))
- ! PUT IN A CATCH HERE TO PREVENT DIVERGENCE BETWEEN NUMBER CONC. AND
- ! MIXING RATIO, SINCE STRICT CONSERVATION NOT CHECKED FOR NUMBER CONC
- NNUCCC(K) = MIN(NNUCCC(K),NC3D(K)/DT)
- END IF
- !.................................................................
- !.......................................................................
- ! AUTOCONVERSION OF CLOUD LIQUID WATER TO RAIN
- ! FORMULA FROM BEHENG (1994)
- ! USING NUMERICAL SIMULATION OF STOCHASTIC COLLECTION EQUATION
- ! AND INITIAL CLOUD DROPLET SIZE DISTRIBUTION SPECIFIED
- ! AS A GAMMA DISTRIBUTION
- ! USE MINIMUM VALUE OF 1.E-6 TO PREVENT FLOATING POINT ERROR
- IF (QC3D(K).GE.1.E-6) THEN
- ! HM ADD 12/13/06, REPLACE WITH NEWER FORMULA
- ! FROM KHAIROUTDINOV AND KOGAN 2000, MWR
- PRC(K)=1350.*QC3D(K)**2.47* &
- (NC3D(K)/1.e6*RHO(K))**(-1.79)
- ! note: nprc1 is change in Nr,
- ! nprc is change in Nc
- NPRC1(K) = PRC(K)/CONS29
- NPRC(K) = PRC(K)/(QC3D(K)/NC3D(K))
- ! hm bug fix 3/20/12
- NPRC(K) = MIN(NPRC(K),NC3D(K)/DT)
- NPRC1(K) = MIN(NPRC1(K),NPRC(K))
- END IF
- !.......................................................................
- ! SELF-COLLECTION OF DROPLET NOT INCLUDED IN KK2000 SCHEME
- ! SNOW AGGREGATION FROM PASSARELLI, 1978, USED BY REISNER, 1998
- ! THIS IS HARD-WIRED FOR BS = 0.4 FOR NOW
- IF (QNI3D(K).GE.1.E-8) THEN
- NSAGG(K) = CONS15*ASN(K)*RHO(K)** &
- ((2.+BS)/3.)*QNI3D(K)**((2.+BS)/3.)* &
- (NS3D(K)*RHO(K))**((4.-BS)/3.)/ &
- (RHO(K))
- END IF
- !.......................................................................
- ! ACCRETION OF CLOUD DROPLETS ONTO SNOW/GRAUPEL
- ! HERE USE CONTINUOUS COLLECTION EQUATION WITH
- ! SIMPLE GRAVITATIONAL COLLECTION KERNEL IGNORING
- ! SNOW
- IF (QNI3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
- PSACWS(K) = CONS13*ASN(K)*QC3D(K)*RHO(K)* &
- N0S(K)/ &
- LAMS(K)**(BS+3.)
- NPSACWS(K) = CONS13*ASN(K)*NC3D(K)*RHO(K)* &
- N0S(K)/ &
- LAMS(K)**(BS+3.)
- END IF
- !............................................................................
- ! COLLECTION OF CLOUD WATER BY GRAUPEL
- IF (QG3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
- PSACWG(K) = CONS14*AGN(K)*QC3D(K)*RHO(K)* &
- N0G(K)/ &
- LAMG(K)**(BG+3.)
- NPSACWG(K) = CONS14*AGN(K)*NC3D(K)*RHO(K)* &
- N0G(K)/ &
- LAMG(K)**(BG+3.)
- END IF
- !.......................................................................
- ! HM, ADD 12/13/06
- ! CLOUD ICE COLLECTING DROPLETS, ASSUME THAT CLOUD ICE MEAN DIAM > 100 MICRON
- ! BEFORE RIMING CAN OCCUR
- ! ASSUME THAT RIME COLLECTED ON CLOUD ICE DOES NOT LEAD
- ! TO HALLET-MOSSOP SPLINTERING
- IF (QI3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
- ! PUT IN SIZE DEPENDENT COLLECTION EFFICIENCY BASED ON STOKES LAW
- ! FROM THOMPSON ET AL. 2004, MWR
- IF (1./LAMI(K).GE.100.E-6) THEN
- PSACWI(K) = CONS16*AIN(K)*QC3D(K)*RHO(K)* &
- N0I(K)/ &
- LAMI(K)**(BI+3.)
- NPSACWI(K) = CONS16*AIN(K)*NC3D(K)*RHO(K)* &
- N0I(K)/ &
- LAMI(K)**(BI+3.)
- END IF
- END IF
- !.......................................................................
- ! ACCRETION OF RAIN WATER BY SNOW
- ! FORMULA FROM IKAWA AND SAITO, 1991, USED BY REISNER ET AL, 1998
- IF (QR3D(K).GE.1.E-8.AND.QNI3D(K).GE.1.E-8) THEN
- UMS = ASN(K)*CONS3/(LAMS(K)**BS)
- UMR = ARN(K)*CONS4/(LAMR(K)**BR)
- UNS = ASN(K)*CONS5/LAMS(K)**BS
- UNR = ARN(K)*CONS6/LAMR(K)**BR
- ! SET REASLISTIC LIMITS ON FALLSPEEDS
- ! bug fix, 10/08/09
- dum=(rhosu/rho(k))**0.54
- UMS=MIN(UMS,1.2*dum)
- UNS=MIN(UNS,1.2*dum)
- UMR=MIN(UMR,9.1*dum)
- UNR=MIN(UNR,9.1*dum)
- PRACS(K) = CONS41*(((1.2*UMR-0.95*UMS)**2+ &
- 0.08*UMS*UMR)**0.5*RHO(K)* &
- N0RR(K)*N0S(K)/LAMR(K)**3* &
- (5./(LAMR(K)**3*LAMS(K))+ &
- 2./(LAMR(K)**2*LAMS(K)**2)+ &
- 0.5/(LAMR(k)*LAMS(k)**3)))
- NPRACS(K) = CONS32*RHO(K)*(1.7*(UNR-UNS)**2+ &
- 0.3*UNR*UNS)**0.5*N0RR(K)*N0S(K)* &
- (1./(LAMR(K)**3*LAMS(K))+ &
- 1./(LAMR(K)**2*LAMS(K)**2)+ &
- 1./(LAMR(K)*LAMS(K)**3))
- ! MAKE SURE PRACS DOESN'T EXCEED TOTAL RAIN MIXING RATIO
- ! AS THIS MAY OTHERWISE RESULT IN TOO MUCH TRANSFER OF WATER DURING
- ! RIME-SPLINTERING
- PRACS(K) = MIN(PRACS(K),QR3D(K)/DT)
- ! COLLECTION OF SNOW BY RAIN - NEEDED FOR GRAUPEL CONVERSION CALCULATIONS
- ! ONLY CALCULATE IF SNOW AND RAIN MIXING RATIOS EXCEED 0.1 G/KG
- ! ASSUME COLLECTION OF SNOW BY RAIN PRODUCES GRAUPEL NOT HAIL
- ! HM MODIFY FOR WRFV3.1
- ! IF (IHAIL.EQ.0) THEN
- IF (QNI3D(K).GE.0.1E-3.AND.QR3D(K).GE.0.1E-3) THEN
- PSACR(K) = CONS31*(((1.2*UMR-0.95*UMS)**2+ &
- 0.08*UMS*UMR)**0.5*RHO(K)* &
- N0RR(K)*N0S(K)/LAMS(K)**3* &
- (5./(LAMS(K)**3*LAMR(K))+ &
- 2./(LAMS(K)**2*LAMR(K)**2)+ &
- 0.5/(LAMS(K)*LAMR(K)**3)))
- END IF
- ! END IF
- END IF
- !.......................................................................
- ! COLLECTION OF RAINWATER BY GRAUPEL, FROM IKAWA AND SAITO 1990,
- ! USED BY REISNER ET AL 1998
- IF (QR3D(K).GE.1.E-8.AND.QG3D(K).GE.1.E-8) THEN
- UMG = AGN(K)*CONS7/(LAMG(K)**BG)
- UMR = ARN(K)*CONS4/(LAMR(K)**BR)
- UNG = AGN(K)*CONS8/LAMG(K)**BG
- UNR = ARN(K)*CONS6/LAMR(K)**BR
- ! SET REASLISTIC LIMITS ON FALLSPEEDS
- ! bug fix, 10/08/09
- dum=(rhosu/rho(k))**0.54
- UMG=MIN(UMG,20.*dum)
- UNG=MIN(UNG,20.*dum)
- UMR=MIN(UMR,9.1*dum)
- UNR=MIN(UNR,9.1*dum)
- PRACG(K) = CONS41*(((1.2*UMR-0.95*UMG)**2+ &
- 0.08*UMG*UMR)**0.5*RHO(K)* &
- N0RR(K)*N0G(K)/LAMR(K)**3* &
- (5./(LAMR(K)**3*LAMG(K))+ &
- 2./(LAMR(K)**2*LAMG(K)**2)+ &
- 0.5/(LAMR(k)*LAMG(k)**3)))
- NPRACG(K) = CONS32*RHO(K)*(1.7*(UNR-UNG)**2+ &
- 0.3*UNR*UNG)**0.5*N0RR(K)*N0G(K)* &
- (1./(LAMR(K)**3*LAMG(K))+ &
- 1./(LAMR(K)**2*LAMG(K)**2)+ &
- 1./(LAMR(K)*LAMG(K)**3))
- ! MAKE SURE PRACG DOESN'T EXCEED TOTAL RAIN MIXING RATIO
- ! AS THIS MAY OTHERWISE RESULT IN TOO MUCH TRANSFER OF WATER DURING
- ! RIME-SPLINTERING
- PRACG(K) = MIN(PRACG(K),QR3D(K)/DT)
- END IF
- !.......................................................................
- ! RIME-SPLINTERING - SNOW
- ! HALLET-MOSSOP (1974)
- ! NUMBER OF SPLINTERS FORMED IS BASED ON MASS OF RIMED WATER
- ! DUM1 = MASS OF INDIVIDUAL SPLINTERS
- ! HM ADD THRESHOLD SNOW AND DROPLET MIXING RATIO FOR RIME-SPLINTERING
- ! TO LIMIT RIME-SPLINTERING IN STRATIFORM CLOUDS
- ! THESE THRESHOLDS CORRESPOND WITH GRAUPEL THRESHOLDS IN RH 1984
- !v1.4
- IF (QNI3D(K).GE.0.1E-3) THEN
- IF (QC3D(K).GE.0.5E-3.OR.QR3D(K).GE.0.1E-3) THEN
- IF (PSACWS(K).GT.0..OR.PRACS(K).GT.0.) THEN
- IF (T3D(K).LT.270.16 .AND. T3D(K).GT.265.16) THEN
- IF (T3D(K).GT.270.16) THEN
- FMULT = 0.
- ELSE IF (T3D(K).LE.270.16.AND.T3D(K).GT.268.16) THEN
- FMULT = (270.16-T3D(K))/2.
- ELSE IF (T3D(K).GE.265.16.AND.T3D(K).LE.268.16) THEN
- FMULT = (T3D(K)-265.16)/3.
- ELSE IF (T3D(K).LT.265.16) THEN
- FMULT = 0.
- END IF
- ! 1000 IS TO CONVERT FROM KG TO G
- ! SPLINTERING FROM DROPLETS ACCRETED ONTO SNOW
- IF (PSACWS(K).GT.0.) THEN
- NMULTS(K) = 35.E4*PSACWS(K)*FMULT*1000.
- QMULTS(K) = NMULTS(K)*MMULT
- ! CONSTRAIN SO THAT TRANSFER OF MASS FROM SNOW TO ICE CANNOT BE MORE MASS
- ! THAN WAS RIMED ONTO SNOW
- QMULTS(K) = MIN(QMULTS(K),PSACWS(K))
- PSACWS(K) = PSACWS(K)-QMULTS(K)
- END IF
- ! RIMING AND SPLINTERING FROM ACCRETED RAINDROPS
- IF (PRACS(K).GT.0.) THEN
- NMULTR(K) = 35.E4*PRACS(K)*FMULT*1000.
- QMULTR(K) = NMULTR(K)*MMULT
- ! CONSTRAIN SO THAT TRANSFER OF MASS FROM SNOW TO ICE CANNOT BE MORE MASS
- ! THAN WAS RIMED ONTO SNOW
- QMULTR(K) = MIN(QMULTR(K),PRACS(K))
- PRACS(K) = PRACS(K)-QMULTR(K)
- END IF
- END IF
- END IF
- END IF
- END IF
- !.......................................................................
- ! RIME-SPLINTERING - GRAUPEL
- ! HALLET-MOSSOP (1974)
- ! NUMBER OF SPLINTERS FORMED IS BASED ON MASS OF RIMED WATER
- ! DUM1 = MASS OF INDIVIDUAL SPLINTERS
- ! HM ADD THRESHOLD SNOW MIXING RATIO FOR RIME-SPLINTERING
- ! TO LIMIT RIME-SPLINTERING IN STRATIFORM CLOUDS
- ! ONLY CALCULATE FOR GRAUPEL NOT HAIL
- ! IF (IHAIL.EQ.0) THEN
- ! v1.4
- IF (QG3D(K).GE.0.1E-3) THEN
- IF (QC3D(K).GE.0.5E-3.OR.QR3D(K).GE.0.1E-3) THEN
- IF (PSACWG(K).GT.0..OR.PRACG(K).GT.0.) THEN
- IF (T3D(K).LT.270.16 .AND. T3D(K).GT.265.16) THEN
- IF (T3D(K).GT.270.16) THEN
- FMULT = 0.
- ELSE IF (T3D(K).LE.270.16.AND.T3D(K).GT.268.16) THEN
- FMULT = (270.16-T3D(K))/2.
- ELSE IF (T3D(K).GE.265.16.AND.T3D(K).LE.268.16) THEN
- FMULT = (T3D(K)-265.16)/3.
- ELSE IF (T3D(K).LT.265.16) THEN
- FMULT = 0.
- END IF
- ! 1000 IS TO CONVERT FROM KG TO G
- ! SPLINTERING FROM DROPLETS ACCRETED ONTO GRAUPEL
- IF (PSACWG(K).GT.0.) THEN
- NMULTG(K) = 35.E4*PSACWG(K)*FMULT*1000.
- QMULTG(K) = NMULTG(K)*MMULT
- ! CONSTRAIN SO THAT TRANSFER OF MASS FROM GRAUPEL TO ICE CANNOT BE MORE MASS
- ! THAN WAS RIMED ONTO GRAUPEL
- QMULTG(K) = MIN(QMULTG(K),PSACWG(K))
- PSACWG(K) = PSACWG(K)-QMULTG(K)
- END IF
- ! RIMING AND SPLINTERING FROM ACCRETED RAINDROPS
- IF (PRACG(K).GT.0.) THEN
- NMULTRG(K) = 35.E4*PRACG(K)*FMULT*1000.
- QMULTRG(K) = NMULTRG(K)*MMULT
- ! CONSTRAIN SO THAT TRANSFER OF MASS FROM GRAUPEL TO ICE CANNOT BE MORE MASS
- ! THAN WAS RIMED ONTO GRAUPEL
- QMULTRG(K) = MIN(QMULTRG(K),PRACG(K))
- PRACG(K) = PRACG(K)-QMULTRG(K)
- END IF
- END IF
- END IF
- END IF
- END IF
- ! END IF
- !........................................................................
- ! CONVERSION OF RIMED CLOUD WATER ONTO SNOW TO GRAUPEL
- ! ASSUME CONVERTED SNOW FORMS GRAUPEL NOT HAIL
- ! HAIL ASSUMED TO ONLY FORM BY FREEZING OF RAIN
- ! OR COLLISIONS OF RAIN WITH CLOUD ICE
- ! IF (IHAIL.EQ.0) THEN
- IF (PSACWS(K).GT.0.) THEN
- ! ONLY ALLOW CONVERSION IF QNI > 0.1 AND QC > 0.5 G/KG FOLLOWING RUTLEDGE AND HOBBS (1984)
- IF (QNI3D(K).GE.0.1E-3.AND.QC3D(K).GE.0.5E-3) THEN
- ! PORTION OF RIMING CONVERTED TO GRAUPEL (REISNER ET AL. 1998, ORIGINALLY IS1991)
- PGSACW(K) = MIN(PSACWS(K),CONS17*DT*N0S(K)*QC3D(K)*QC3D(K)* &
- ASN(K)*ASN(K)/ &
- (RHO(K)*LAMS(K)**(2.*BS+2.)))
- ! MIX RAT CONVERTED INTO GRAUPEL AS EMBRYO (REISNER ET AL. 1998, ORIG M1990)
- DUM = MAX(RHOSN/(RHOG-RHOSN)*PGSACW(K),0.)
- ! NUMBER CONCENTRAITON OF EMBRYO GRAUPEL FROM RIMING OF SNOW
- NSCNG(K) = DUM/MG0*RHO(K)
- ! LIMIT MAX NUMBER CONVERTED TO SNOW NUMBER
- NSCNG(K) = MIN(NSCNG(K),NS3D(K)/DT)
- ! PORTION OF RIMING LEFT FOR SNOW
- PSACWS(K) = PSACWS(K) - PGSACW(K)
- END IF
- END IF
- ! CONVERSION OF RIMED RAINWATER ONTO SNOW CONVERTED TO GRAUPEL
- IF (PRACS(K).GT.0.) THEN
- ! ONLY ALLOW CONVERSION IF QNI > 0.1 AND QR > 0.1 G/KG FOLLOWING RUTLEDGE AND HOBBS (1984)
- IF (QNI3D(K).GE.0.1E-3.AND.QR3D(K).GE.0.1E-3) THEN
- ! PORTION OF COLLECTED RAINWATER CONVERTED TO GRAUPEL (REISNER ET AL. 1998)
- DUM = CONS18*(4./LAMS(K))**3*(4./LAMS(K))**3 &
- /(CONS18*(4./LAMS(K))**3*(4./LAMS(K))**3+ &
- CONS19*(4./LAMR(K))**3*(4./LAMR(K))**3)
- DUM=MIN(DUM,1.)
- DUM=MAX(DUM,0.)
- PGRACS(K) = (1.-DUM)*PRACS(K)
- NGRACS(K) = (1.-DUM)*NPRACS(K)
- ! LIMIT MAX NUMBER CONVERTED TO MIN OF EITHER RAIN OR SNOW NUMBER CONCENTRATION
- NGRACS(K) = MIN(NGRACS(K),NR3D(K)/DT)
- NGRACS(K) = MIN(NGRACS(K),NS3D(K)/DT)
- ! AMOUNT LEFT FOR SNOW PRODUCTION
- PRACS(K) = PRACS(K) - PGRACS(K)
- NPRACS(K) = NPRACS(K) - NGRACS(K)
- ! CONVERSION TO GRAUPEL DUE TO COLLECTION OF SNOW BY RAIN
- PSACR(K)=PSACR(K)*(1.-DUM)
- END IF
- END IF
- ! END IF
- !.......................................................................
- ! FREEZING OF RAIN DROPS
- ! FREEZING ALLOWED BELOW -4 C
- IF (T3D(K).LT.269.15.AND.QR3D(K).GE.QSMALL) THEN
- ! IMMERSION FREEZING (BIGG 1953)
- MNUCCR(K) = CONS20*NR3D(K)*EXP(AIMM*(273.15-T3D(K)))/LAMR(K)**3 &
- /LAMR(K)**3
- NNUCCR(K) = PI*NR3D(K)*BIMM*EXP(AIMM*(273.15-T3D(K)))/LAMR(K)**3
- ! PREVENT DIVERGENCE BETWEEN MIXING RATIO AND NUMBER CONC
- NNUCCR(K) = MIN(NNUCCR(K),NR3D(K)/DT)
- END IF
- !.......................................................................
- ! ACCRETION OF CLOUD LIQUID WATER BY RAIN
- ! CONTINUOUS COLLECTION EQUATION WITH
- ! GRAVITATIONAL COLLECTION KERNEL, DROPLET FALL SPEED NEGLECTED
- IF (QR3D(K).GE.1.E-8 .AND. QC3D(K).GE.1.E-8) THEN
- ! 12/13/06 HM ADD, REPLACE WITH NEWER FORMULA FROM
- ! KHAIROUTDINOV AND KOGAN 2000, MWR
- DUM=(QC3D(K)*QR3D(K))
- PRA(K) = 67.*(DUM)**1.15
- NPRA(K) = PRA(K)/(QC3D(K)/NC3D(K))
- END IF
- !.......................................................................
- ! SELF-COLLECTION OF RAIN DROPS
- ! FROM BEHENG(1994)
- ! FROM NUMERICAL SIMULATION OF THE STOCHASTIC COLLECTION EQUATION
- ! AS DESCRINED ABOVE FOR AUTOCONVERSION
- IF (QR3D(K).GE.1.E-8) THEN
- ! include breakup add 10/09/09
- dum1=300.e-6
- if (1./lamr(k).lt.dum1) then
- dum=1.
- else if (1./lamr(k).ge.dum1) then
- dum=2.-exp(2300.*(1./lamr(k)-dum1))
- end if
- ! NRAGG(K) = -8.*NR3D(K)*QR3D(K)*RHO(K)
- NRAGG(K) = -5.78*dum*NR3D(K)*QR3D(K)*RHO(K)
- END IF
- !.......................................................................
- ! AUTOCONVERSION OF CLOUD ICE TO SNOW
- ! FOLLOWING HARRINGTON ET AL. (1995) WITH MODIFICATION
- ! HERE IT IS ASSUMED THAT AUTOCONVERSION CAN ONLY OCCUR WHEN THE
- ! ICE IS GROWING, I.E. IN CONDITIONS OF ICE SUPERSATURATION
- IF (QI3D(K).GE.1.E-8 .AND.QVQVSI(K).GE.1.) THEN
- ! COFFI = 2./LAMI(K)
- ! IF (COFFI.GE.DCS) THEN
- NPRCI(K) = CONS21*(QV3D(K)-QVI(K))*RHO(K) &
- *N0I(K)*EXP(-LAMI(K)*DCS)*DV(K)/ABI(K)
- PRCI(K) = CONS22*NPRCI(K)
- NPRCI(K) = MIN(NPRCI(K),NI3D(K)/DT)
- ! END IF
- END IF
- !.......................................................................
- ! ACCRETION OF CLOUD ICE BY SNOW
- ! FOR THIS CALCULATION, IT IS ASSUMED THAT THE VS >> VI
- ! AND DS >> DI FOR CONTINUOUS COLLECTION
- IF (QNI3D(K).GE.1.E-8 .AND. QI3D(K).GE.QSMALL) THEN
- PRAI(K) = CONS23*ASN(K)*QI3D(K)*RHO(K)*N0S(K)/ &
- LAMS(K)**(BS+3.)
- NPRAI(K) = CONS23*ASN(K)*NI3D(K)* &
- RHO(K)*N0S(K)/ &
- LAMS(K)**(BS+3.)
- NPRAI(K)=MIN(NPRAI(K),NI3D(K)/DT)
- END IF
- !.......................................................................
- ! HM, ADD 12/13/06, COLLISION OF RAIN AND ICE TO PRODUCE SNOW OR GRAUPEL
- ! FOLLOWS REISNER ET AL. 1998
- ! ASSUMED FALLSPEED AND SIZE OF ICE CRYSTAL << THAN FOR RAIN
- IF (QR3D(K).GE.1.E-8.AND.QI3D(K).GE.1.E-8.AND.T3D(K).LE.273.15) THEN
- ! ALLOW GRAUPEL FORMATION FROM RAIN-ICE COLLISIONS ONLY IF RAIN MIXING RATIO > 0.1 G/KG,
- ! OTHERWISE ADD TO SNOW
- IF (QR3D(K).GE.0.1E-3) THEN
- NIACR(K)=CONS24*NI3D(K)*N0RR(K)*ARN(K) &
- /LAMR(K)**(BR+3.)*RHO(K)
- PIACR(K)=CONS25*NI3D(K)*N0RR(K)*ARN(K) &
- /LAMR(K)**(BR+3.)/LAMR(K)**3*RHO(K)
- PRACI(K)=CONS24*QI3D(K)*N0RR(K)*ARN(K)/ &
- LAMR(K)**(BR+3.)*RHO(K)
- NIACR(K)=MIN(NIACR(K),NR3D(K)/DT)
- NIACR(K)=MIN(NIACR(K),NI3D(K)/DT)
- ELSE
- NIACRS(K)=CONS24*NI3D(K)*N0RR(K)*ARN(K) &
- /LAMR(K)**(BR+3.)*RHO(K)
- PIACRS(K)=CONS25*NI3D(K)*N0RR(K)*ARN(K) &
- /LAMR(K)**(BR+3.)/LAMR(K)**3*RHO(K)
- PRACIS(K)=CONS24*QI3D(K)*N0RR(K)*ARN(K)/ &
- LAMR(K)**(BR+3.)*RHO(K)
- NIACRS(K)=MIN(NIACRS(K),NR3D(K)/DT)
- NIACRS(K)=MIN(NIACRS(K),NI3D(K)/DT)
- END IF
- END IF
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! NUCLEATION OF CLOUD ICE FROM HOMOGENEOUS AND HETEROGENEOUS FREEZING ON AEROSOL
- IF (INUC.EQ.0) THEN
- ! add threshold according to Greg Thomspon
- if ((QVQVS(K).GE.0.999.and.T3D(K).le.265.15).or. &
- QVQVSI(K).ge.1.08) then
- ! hm, modify dec. 5, 2006, replace with cooper curve
- kc2 = 0.005*exp(0.304*(273.15-T3D(K)))*1000. ! convert from L-1 to m-3
- ! limit to 500 L-1
- kc2 = min(kc2,500.e3)
- kc2=MAX(kc2/rho(k),0.) ! convert to kg-1
- IF (KC2.GT.NI3D(K)+NS3D(K)+NG3D(K)) THEN
- NNUCCD(K) = (KC2-NI3D(K)-NS3D(K)-NG3D(K))/DT
- MNUCCD(K) = NNUCCD(K)*MI0
- END IF
- END IF
- ELSE IF (INUC.EQ.1) THEN
- IF (T3D(K).LT.273.15.AND.QVQVSI(K).GT.1.) THEN
- KC2 = 0.16*1000./RHO(K) ! CONVERT FROM L-1 TO KG-1
- IF (KC2.GT.NI3D(K)+NS3D(K)+NG3D(K)) THEN
- NNUCCD(K) = (KC2-NI3D(K)-NS3D(K)-NG3D(K))/DT
- MNUCCD(K) = NNUCCD(K)*MI0
- END IF
- END IF
- END IF
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- 101 CONTINUE
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CALCULATE EVAP/SUB/DEP TERMS FOR QI,QNI,QR
- ! NO VENTILATION FOR CLOUD ICE
- IF (QI3D(K).GE.QSMALL) THEN
- EPSI = 2.*PI*N0I(K)*RHO(K)*DV(K)/(LAMI(K)*LAMI(K))
- ELSE
- EPSI = 0.
- END IF
- IF (QNI3D(K).GE.QSMALL) THEN
- EPSS = 2.*PI*N0S(K)*RHO(K)*DV(K)* &
- (F1S/(LAMS(K)*LAMS(K))+ &
- F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS10/ &
- (LAMS(K)**CONS35))
- ELSE
- EPSS = 0.
- END IF
- IF (QG3D(K).GE.QSMALL) THEN
- EPSG = 2.*PI*N0G(K)*RHO(K)*DV(K)* &
- (F1S/(LAMG(K)*LAMG(K))+ &
- F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS11/ &
- (LAMG(K)**CONS36))
- ELSE
- EPSG = 0.
- END IF
- IF (QR3D(K).GE.QSMALL) THEN
- EPSR = 2.*PI*N0RR(K)*RHO(K)*DV(K)* &
- (F1R/(LAMR(K)*LAMR(K))+ &
- F2R*(ARN(K)*RHO(K)/MU(K))**0.5* &
- SC(K)**(1./3.)*CONS9/ &
- (LAMR(K)**CONS34))
- ELSE
- EPSR = 0.
- END IF
- ! ONLY INCLUDE REGION OF ICE SIZE DIST < DCS
- ! DUM IS FRACTION OF D*N(D) < DCS
- ! LOGIC BELOW FOLLOWS THAT OF HARRINGTON ET AL. 1995 (JAS)
- IF (QI3D(K).GE.QSMALL) THEN
- DUM=(1.-EXP(-LAMI(K)*DCS)*(1.+LAMI(K)*DCS))
- PRD(K) = EPSI*(QV3D(K)-QVI(K))/ABI(K)*DUM
- ELSE
- DUM=0.
- END IF
- ! ADD DEPOSITION IN TAIL OF ICE SIZE DIST TO SNOW IF SNOW IS PRESENT
- IF (QNI3D(K).GE.QSMALL) THEN
- PRDS(K) = EPSS*(QV3D(K)-QVI(K))/ABI(K)+ &
- EPSI*(QV3D(K)-QVI(K))/ABI(K)*(1.-DUM)
- ! OTHERWISE ADD TO CLOUD ICE
- ELSE
- PRD(K) = PRD(K)+EPSI*(QV3D(K)-QVI(K))/ABI(K)*(1.-DUM)
- END IF
- ! VAPOR DPEOSITION ON GRAUPEL
- PRDG(K) = EPSG*(QV3D(K)-QVI(K))/ABI(K)
- ! NO CONDENSATION ONTO RAIN, ONLY EVAP
- IF (QV3D(K).LT.QVS(K)) THEN
- PRE(K) = EPSR*(QV3D(K)-QVS(K))/AB(K)
- PRE(K) = MIN(PRE(K),0.)
- ELSE
- PRE(K) = 0.
- END IF
- ! MAKE SURE NOT PUSHED INTO ICE SUPERSAT/SUBSAT
- ! FORMULA FROM REISNER 2 SCHEME
- DUM = (QV3D(K)-QVI(K))/DT
- FUDGEF = 0.9999
- SUM_DEP = PRD(K)+PRDS(K)+MNUCCD(K)+PRDG(K)
- IF( (DUM.GT.0. .AND. SUM_DEP.GT.DUM*FUDGEF) .OR. &
- (DUM.LT.0. .AND. SUM_DEP.LT.DUM*FUDGEF) ) THEN
- MNUCCD(K) = FUDGEF*MNUCCD(K)*DUM/SUM_DEP
- PRD(K) = FUDGEF*PRD(K)*DUM/SUM_DEP
- PRDS(K) = FUDGEF*PRDS(K)*DUM/SUM_DEP
- PRDG(K) = FUDGEF*PRDG(K)*DUM/SUM_DEP
- ENDIF
- ! IF CLOUD ICE/SNOW/GRAUPEL VAP DEPOSITION IS NEG, THEN ASSIGN TO SUBLIMATION PROCESSES
- IF (PRD(K).LT.0.) THEN
- EPRD(K)=PRD(K)
- PRD(K)=0.
- END IF
- IF (PRDS(K).LT.0.) THEN
- EPRDS(K)=PRDS(K)
- PRDS(K)=0.
- END IF
- IF (PRDG(K).LT.0.) THEN
- EPRDG(K)=PRDG(K)
- PRDG(K)=0.
- END IF
- !.......................................................................
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CONSERVATION OF WATER
- ! THIS IS ADOPTED LOOSELY FROM MM5 RESINER CODE. HOWEVER, HERE WE
- ! ONLY ADJUST PROCESSES THAT ARE NEGATIVE, RATHER THAN ALL PROCESSES.
- ! IF MIXING RATIOS LESS THAN QSMALL, THEN NO DEPLETION OF WATER
- ! THROUGH MICROPHYSICAL PROCESSES, SKIP CONSERVATION
- ! NOTE: CONSERVATION CHECK NOT APPLIED TO NUMBER CONCENTRATION SPECIES. ADDITIONAL CATCH
- ! BELOW WILL PREVENT NEGATIVE NUMBER CONCENTRATION
- ! FOR EACH MICROPHYSICAL PROCESS WHICH PROVIDES A SOURCE FOR NUMBER, THERE IS A CHECK
- ! TO MAKE SURE THAT CAN'T EXCEED TOTAL NUMBER OF DEPLETED SPECIES WITH THE TIME
- ! STEP
- !****SENSITIVITY - NO ICE
- IF (ILIQ.EQ.1) THEN
- MNUCCC(K)=0.
- NNUCCC(K)=0.
- MNUCCR(K)=0.
- NNUCCR(K)=0.
- MNUCCD(K)=0.
- NNUCCD(K)=0.
- END IF
- ! ****SENSITIVITY - NO GRAUPEL
- IF (IGRAUP.EQ.1) THEN
- PRACG(K) = 0.
- PSACR(K) = 0.
- PSACWG(K) = 0.
- PGSACW(K) = 0.
- PGRACS(K) = 0.
- PRDG(K) = 0.
- EPRDG(K) = 0.
- EVPMG(K) = 0.
- PGMLT(K) = 0.
- NPRACG(K) = 0.
- NPSACWG(K) = 0.
- NSCNG(K) = 0.
- NGRACS(K) = 0.
- NSUBG(K) = 0.
- NGMLTG(K) = 0.
- NGMLTR(K) = 0.
- ! fix 053011
- PIACRS(K)=PIACRS(K)+PIACR(K)
- PIACR(K) = 0.
- END IF
- ! CONSERVATION OF QC
- DUM = (PRC(K)+PRA(K)+MNUCCC(K)+PSACWS(K)+PSACWI(K)+QMULTS(K)+PSACWG(K)+PGSACW(K)+QMULTG(K))*DT
- IF (DUM.GT.QC3D(K).AND.QC3D(K).GE.QSMALL) THEN
- RATIO = QC3D(K)/DUM
- PRC(K) = PRC(K)*RATIO
- PRA(K) = PRA(K)*RATIO
- MNUCCC(K) = MNUCCC(K)*RATIO
- PSACWS(K) = PSACWS(K)*RATIO
- PSACWI(K) = PSACWI(K)*RATIO
- QMULTS(K) = QMULTS(K)*RATIO
- QMULTG(K) = QMULTG(K)*RATIO
- PSACWG(K) = PSACWG(K)*RATIO
- PGSACW(K) = PGSACW(K)*RATIO
- END IF
-
- ! CONSERVATION OF QI
- DUM = (-PRD(K)-MNUCCC(K)+PRCI(K)+PRAI(K)-QMULTS(K)-QMULTG(K)-QMULTR(K)-QMULTRG(K) &
- -MNUCCD(K)+PRACI(K)+PRACIS(K)-EPRD(K)-PSACWI(K))*DT
- IF (DUM.GT.QI3D(K).AND.QI3D(K).GE.QSMALL) THEN
- RATIO = (QI3D(K)/DT+PRD(K)+MNUCCC(K)+QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+ &
- MNUCCD(K)+PSACWI(K))/ &
- (PRCI(K)+PRAI(K)+PRACI(K)+PRACIS(K)-EPRD(K))
- PRCI(K) = PRCI(K)*RATIO
- PRAI(K) = PRAI(K)*RATIO
- PRACI(K) = PRACI(K)*RATIO
- PRACIS(K) = PRACIS(K)*RATIO
- EPRD(K) = EPRD(K)*RATIO
- END IF
- ! CONSERVATION OF QR
- DUM=((PRACS(K)-PRE(K))+(QMULTR(K)+QMULTRG(K)-PRC(K))+(MNUCCR(K)-PRA(K))+ &
- PIACR(K)+PIACRS(K)+PGRACS(K)+PRACG(K))*DT
- IF (DUM.GT.QR3D(K).AND.QR3D(K).GE.QSMALL) THEN
- RATIO = (QR3D(K)/DT+PRC(K)+PRA(K))/ &
- (-PRE(K)+QMULTR(K)+QMULTRG(K)+PRACS(K)+MNUCCR(K)+PIACR(K)+PIACRS(K)+PGRACS(K)+PRACG(K))
- PRE(K) = PRE(K)*RATIO
- PRACS(K) = PRACS(K)*RATIO
- QMULTR(K) = QMULTR(K)*RATIO
- QMULTRG(K) = QMULTRG(K)*RATIO
- MNUCCR(K) = MNUCCR(K)*RATIO
- PIACR(K) = PIACR(K)*RATIO
- PIACRS(K) = PIACRS(K)*RATIO
- PGRACS(K) = PGRACS(K)*RATIO
- PRACG(K) = PRACG(K)*RATIO
- END IF
- ! CONSERVATION OF QNI
- ! CONSERVATION FOR GRAUPEL SCHEME
- IF (IGRAUP.EQ.0) THEN
- DUM = (-PRDS(K)-PSACWS(K)-PRAI(K)-PRCI(K)-PRACS(K)-EPRDS(K)+PSACR(K)-PIACRS(K)-PRACIS(K))*DT
- IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
- RATIO = (QNI3D(K)/DT+PRDS(K)+PSACWS(K)+PRAI(K)+PRCI(K)+PRACS(K)+PIACRS(K)+PRACIS(K))/(-EPRDS(K)+PSACR(K))
- EPRDS(K) = EPRDS(K)*RATIO
- PSACR(K) = PSACR(K)*RATIO
- END IF
- ! FOR NO GRAUPEL, NEED TO INCLUDE FREEZING OF RAIN FOR SNOW
- ELSE IF (IGRAUP.EQ.1) THEN
- DUM = (-PRDS(K)-PSACWS(K)-PRAI(K)-PRCI(K)-PRACS(K)-EPRDS(K)+PSACR(K)-PIACRS(K)-PRACIS(K)-MNUCCR(K))*DT
- IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
- RATIO = (QNI3D(K)/DT+PRDS(K)+PSACWS(K)+PRAI(K)+PRCI(K)+PRACS(K)+PIACRS(K)+PRACIS(K)+MNUCCR(K))/(-EPRDS(K)+PSACR(K))
- EPRDS(K) = EPRDS(K)*RATIO
- PSACR(K) = PSACR(K)*RATIO
- END IF
- END IF
- ! CONSERVATION OF QG
- DUM = (-PSACWG(K)-PRACG(K)-PGSACW(K)-PGRACS(K)-PRDG(K)-MNUCCR(K)-EPRDG(K)-PIACR(K)-PRACI(K)-PSACR(K))*DT
- IF (DUM.GT.QG3D(K).AND.QG3D(K).GE.QSMALL) THEN
- RATIO = (QG3D(K)/DT+PSACWG(K)+PRACG(K)+PGSACW(K)+PGRACS(K)+PRDG(K)+MNUCCR(K)+PSACR(K)+&
- PIACR(K)+PRACI(K))/(-EPRDG(K))
- EPRDG(K) = EPRDG(K)*RATIO
- END IF
- ! TENDENCIES
- QV3DTEN(K) = QV3DTEN(K)+(-PRE(K)-PRD(K)-PRDS(K)-MNUCCD(K)-EPRD(K)-EPRDS(K)-PRDG(K)-EPRDG(K))
- ! BUG FIX HM, 3/1/11, INCLUDE PIACR AND PIACRS
- T3DTEN(K) = T3DTEN(K)+(PRE(K) &
- *XXLV(K)+(PRD(K)+PRDS(K)+ &
- MNUCCD(K)+EPRD(K)+EPRDS(K)+PRDG(K)+EPRDG(K))*XXLS(K)+ &
- (PSACWS(K)+PSACWI(K)+MNUCCC(K)+MNUCCR(K)+ &
- QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+PRACS(K) &
- +PSACWG(K)+PRACG(K)+PGSACW(K)+PGRACS(K)+PIACR(K)+PIACRS(K))*XLF(K))/CPM(K)
- QC3DTEN(K) = QC3DTEN(K)+ &
- (-PRA(K)-PRC(K)-MNUCCC(K)+PCC(K)- &
- PSACWS(K)-PSACWI(K)-QMULTS(K)-QMULTG(K)-PSACWG(K)-PGSACW(K))
- QI3DTEN(K) = QI3DTEN(K)+ &
- (PRD(K)+EPRD(K)+PSACWI(K)+MNUCCC(K)-PRCI(K)- &
- PRAI(K)+QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+MNUCCD(K)-PRACI(K)-PRACIS(K))
- QR3DTEN(K) = QR3DTEN(K)+ &
- (PRE(K)+PRA(K)+PRC(K)-PRACS(K)-MNUCCR(K)-QMULTR(K)-QMULTRG(K) &
- -PIACR(K)-PIACRS(K)-PRACG(K)-PGRACS(K))
- IF (IGRAUP.EQ.0) THEN
- QNI3DTEN(K) = QNI3DTEN(K)+ &
- (PRAI(K)+PSACWS(K)+PRDS(K)+PRACS(K)+PRCI(K)+EPRDS(K)-PSACR(K)+PIACRS(K)+PRACIS(K))
- NS3DTEN(K) = NS3DTEN(K)+(NSAGG(K)+NPRCI(K)-NSCNG(K)-NGRACS(K)+NIACRS(K))
- QG3DTEN(K) = QG3DTEN(K)+(PRACG(K)+PSACWG(K)+PGSACW(K)+PGRACS(K)+ &
- PRDG(K)+EPRDG(K)+MNUCCR(K)+PIACR(K)+PRACI(K)+PSACR(K))
- NG3DTEN(K) = NG3DTEN(K)+(NSCNG(K)+NGRACS(K)+NNUCCR(K)+NIACR(K))
- ! FOR NO GRAUPEL, NEED TO INCLUDE FREEZING OF RAIN FOR SNOW
- ELSE IF (IGRAUP.EQ.1) THEN
- QNI3DTEN(K) = QNI3DTEN(K)+ &
- (PRAI(K)+PSACWS(K)+PRDS(K)+PRACS(K)+PRCI(K)+EPRDS(K)-PSACR(K)+PIACRS(K)+PRACIS(K)+MNUCCR(K))
- NS3DTEN(K) = NS3DTEN(K)+(NSAGG(K)+NPRCI(K)-NSCNG(K)-NGRACS(K)+NIACRS(K)+NNUCCR(K))
- END IF
- NC3DTEN(K) = NC3DTEN(K)+(-NNUCCC(K)-NPSACWS(K) &
- -NPRA(K)-NPRC(K)-NPSACWI(K)-NPSACWG(K))
- NI3DTEN(K) = NI3DTEN(K)+ &
- (NNUCCC(K)-NPRCI(K)-NPRAI(K)+NMULTS(K)+NMULTG(K)+NMULTR(K)+NMULTRG(K)+ &
- NNUCCD(K)-NIACR(K)-NIACRS(K))
- NR3DTEN(K) = NR3DTEN(K)+(NPRC1(K)-NPRACS(K)-NNUCCR(K) &
- +NRAGG(K)-NIACR(K)-NIACRS(K)-NPRACG(K)-NGRACS(K))
- ! HM ADD, WRF-CHEM, ADD TENDENCIES FOR C2PREC
- C2PREC(K) = PRA(K)+PRC(K)+PSACWS(K)+QMULTS(K)+QMULTG(K)+PSACWG(K)+ &
- PGSACW(K)+MNUCCC(K)+PSACWI(K)
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! NOW CALCULATE SATURATION ADJUSTMENT TO CONDENSE EXTRA VAPOR ABOVE
- ! WATER SATURATION
- DUMT = T3D(K)+DT*T3DTEN(K)
- DUMQV = QV3D(K)+DT*QV3DTEN(K)
- ! hm, add fix for low pressure, 5/12/10
- dum=min(0.99*pres(k),POLYSVP(DUMT,0))
- DUMQSS = EP_2*dum/(PRES(K)-dum)
- DUMQC = QC3D(K)+DT*QC3DTEN(K)
- DUMQC = MAX(DUMQC,0.)
- ! SATURATION ADJUSTMENT FOR LIQUID
- DUMS = DUMQV-DUMQSS
- PCC(K) = DUMS/(1.+XXLV(K)**2*DUMQSS/(CPM(K)*RV*DUMT**2))/DT
- IF (PCC(K)*DT+DUMQC.LT.0.) THEN
- PCC(K) = -DUMQC/DT
- END IF
- QV3DTEN(K) = QV3DTEN(K)-PCC(K)
- T3DTEN(K) = T3DTEN(K)+PCC(K)*XXLV(K)/CPM(K)
- QC3DTEN(K) = QC3DTEN(K)+PCC(K)
- !.......................................................................
- ! ACTIVATION OF CLOUD DROPLETS
- ! ACTIVATION OF DROPLET CURRENTLY NOT CALCULATED
- ! DROPLET CONCENTRATION IS SPECIFIED !!!!!
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! SUBLIMATE, MELT, OR EVAPORATE NUMBER CONCENTRATION
- ! THIS FORMULATION ASSUMES 1:1 RATIO BETWEEN MASS LOSS AND
- ! LOSS OF NUMBER CONCENTRATION
- ! IF (PCC(K).LT.0.) THEN
- ! DUM = PCC(K)*DT/QC3D(K)
- ! DUM = MAX(-1.,DUM)
- ! NSUBC(K) = DUM*NC3D(K)/DT
- ! END IF
- IF (EPRD(K).LT.0.) THEN
- DUM = EPRD(K)*DT/QI3D(K)
- DUM = MAX(-1.,DUM)
- NSUBI(K) = DUM*NI3D(K)/DT
- END IF
- IF (EPRDS(K).LT.0.) THEN
- DUM = EPRDS(K)*DT/QNI3D(K)
- DUM = MAX(-1.,DUM)
- NSUBS(K) = DUM*NS3D(K)/DT
- END IF
- IF (PRE(K).LT.0.) THEN
- DUM = PRE(K)*DT/QR3D(K)
- DUM = MAX(-1.,DUM)
- NSUBR(K) = DUM*NR3D(K)/DT
- END IF
- IF (EPRDG(K).LT.0.) THEN
- DUM = EPRDG(K)*DT/QG3D(K)
- DUM = MAX(-1.,DUM)
- NSUBG(K) = DUM*NG3D(K)/DT
- END IF
- ! nsubr(k)=0.
- ! nsubs(k)=0.
- ! nsubg(k)=0.
- ! UPDATE TENDENCIES
- ! NC3DTEN(K) = NC3DTEN(K)+NSUBC(K)
- NI3DTEN(K) = NI3DTEN(K)+NSUBI(K)
- NS3DTEN(K) = NS3DTEN(K)+NSUBS(K)
- NG3DTEN(K) = NG3DTEN(K)+NSUBG(K)
- NR3DTEN(K) = NR3DTEN(K)+NSUBR(K)
- END IF !!!!!! TEMPERATURE
- ! SWITCH LTRUE TO 1, SINCE HYDROMETEORS ARE PRESENT
- LTRUE = 1
- 200 CONTINUE
- END DO
- ! INITIALIZE PRECIP AND SNOW RATES
- PRECRT = 0.
- SNOWRT = 0.
- ! IF THERE ARE NO HYDROMETEORS, THEN SKIP TO END OF SUBROUTINE
- IF (LTRUE.EQ.0) GOTO 400
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- !.......................................................................
- ! CALCULATE SEDIMENATION
- ! THE NUMERICS HERE FOLLOW FROM REISNER ET AL. (1998)
- ! FALLOUT TERMS ARE CALCULATED ON SPLIT TIME STEPS TO ENSURE NUMERICAL
- ! STABILITY, I.E. COURANT# < 1
- !.......................................................................
- NSTEP = 1
- DO K = KTE,KTS,-1
- DUMI(K) = QI3D(K)+QI3DTEN(K)*DT
- DUMQS(K) = QNI3D(K)+QNI3DTEN(K)*DT
- DUMR(K) = QR3D(K)+QR3DTEN(K)*DT
- DUMFNI(K) = NI3D(K)+NI3DTEN(K)*DT
- DUMFNS(K) = NS3D(K)+NS3DTEN(K)*DT
- DUMFNR(K) = NR3D(K)+NR3DTEN(K)*DT
- DUMC(K) = QC3D(K)+QC3DTEN(K)*DT
- DUMFNC(K) = NC3D(K)+NC3DTEN(K)*DT
- DUMG(K) = QG3D(K)+QG3DTEN(K)*DT
- DUMFNG(K) = NG3D(K)+NG3DTEN(K)*DT
- ! SWITCH FOR CONSTANT DROPLET NUMBER
- IF (iinum.EQ.1) THEN
- DUMFNC(K) = NC3D(K)
- END IF
- ! GET DUMMY LAMDA FOR SEDIMENTATION CALCULATIONS
- ! MAKE SURE NUMBER CONCENTRATIONS ARE POSITIVE
- DUMFNI(K) = MAX(0.,DUMFNI(K))
- DUMFNS(K) = MAX(0.,DUMFNS(K))
- DUMFNC(K) = MAX(0.,DUMFNC(K))
- DUMFNR(K) = MAX(0.,DUMFNR(K))
- DUMFNG(K) = MAX(0.,DUMFNG(K))
- !......................................................................
- ! CLOUD ICE
- IF (DUMI(K).GE.QSMALL) THEN
- DLAMI = (CONS12*DUMFNI(K)/DUMI(K))**(1./DI)
- DLAMI=MAX(DLAMI,LAMMINI)
- DLAMI=MIN(DLAMI,LAMMAXI)
- END IF
- !......................................................................
- ! RAIN
- IF (DUMR(K).GE.QSMALL) THEN
- DLAMR = (PI*RHOW*DUMFNR(K)/DUMR(K))**(1./3.)
- DLAMR=MAX(DLAMR,LAMMINR)
- DLAMR=MIN(DLAMR,LAMMAXR)
- END IF
- !......................................................................
- ! CLOUD DROPLETS
- IF (DUMC(K).GE.QSMALL) THEN
- DUM = PRES(K)/(287.15*T3D(K))
- PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
- PGAM(K)=1./(PGAM(K)**2)-1.
- PGAM(K)=MAX(PGAM(K),2.)
- PGAM(K)=MIN(PGAM(K),10.)
- DLAMC = (CONS26*DUMFNC(K)*GAMMA(PGAM(K)+4.)/(DUMC(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
- LAMMIN = (PGAM(K)+1.)/60.E-6
- LAMMAX = (PGAM(K)+1.)/1.E-6
- DLAMC=MAX(DLAMC,LAMMIN)
- DLAMC=MIN(DLAMC,LAMMAX)
- END IF
- !......................................................................
- ! SNOW
- IF (DUMQS(K).GE.QSMALL) THEN
- DLAMS = (CONS1*DUMFNS(K)/ DUMQS(K))**(1./DS)
- DLAMS=MAX(DLAMS,LAMMINS)
- DLAMS=MIN(DLAMS,LAMMAXS)
- END IF
- !......................................................................
- ! GRAUPEL
- IF (DUMG(K).GE.QSMALL) THEN
- DLAMG = (CONS2*DUMFNG(K)/ DUMG(K))**(1./DG)
- DLAMG=MAX(DLAMG,LAMMING)
- DLAMG=MIN(DLAMG,LAMMAXG)
- END IF
- !......................................................................
- ! CALCULATE NUMBER-WEIGHTED AND MASS-WEIGHTED TERMINAL FALL SPEEDS
- ! CLOUD WATER
- IF (DUMC(K).GE.QSMALL) THEN
- UNC = ACN(K)*GAMMA(1.+BC+PGAM(K))/ (DLAMC**BC*GAMMA(PGAM(K)+1.))
- UMC = ACN(K)*GAMMA(4.+BC+PGAM(K))/ (DLAMC**BC*GAMMA(PGAM(K)+4.))
- ELSE
- UMC = 0.
- UNC = 0.
- END IF
- IF (DUMI(K).GE.QSMALL) THEN
- UNI = AIN(K)*CONS27/DLAMI**BI
- UMI = AIN(K)*CONS28/(DLAMI**BI)
- ELSE
- UMI = 0.
- UNI = 0.
- END IF
- IF (DUMR(K).GE.QSMALL) THEN
- UNR = ARN(K)*CONS6/DLAMR**BR
- UMR = ARN(K)*CONS4/(DLAMR**BR)
- ELSE
- UMR = 0.
- UNR = 0.
- END IF
- IF (DUMQS(K).GE.QSMALL) THEN
- UMS = ASN(K)*CONS3/(DLAMS**BS)
- UNS = ASN(K)*CONS5/DLAMS**BS
- ELSE
- UMS = 0.
- UNS = 0.
- END IF
- IF (DUMG(K).GE.QSMALL) THEN
- UMG = AGN(K)*CONS7/(DLAMG**BG)
- UNG = AGN(K)*CONS8/DLAMG**BG
- ELSE
- UMG = 0.
- UNG = 0.
- END IF
- ! SET REALISTIC LIMITS ON FALLSPEED
- ! bug fix, 10/08/09
- dum=(rhosu/rho(k))**0.54
- UMS=MIN(UMS,1.2*dum)
- UNS=MIN(UNS,1.2*dum)
- ! fix 053011
- ! fix for correction by AA 4/6/11
- UMI=MIN(UMI,1.2*(rhosu/rho(k))**0.35)
- UNI=MIN(UNI,1.2*(rhosu/rho(k))**0.35)
- UMR=MIN(UMR,9.1*dum)
- UNR=MIN(UNR,9.1*dum)
- UMG=MIN(UMG,20.*dum)
- UNG=MIN(UNG,20.*dum)
- FR(K) = UMR
- FI(K) = UMI
- FNI(K) = UNI
- FS(K) = UMS
- FNS(K) = UNS
- FNR(K) = UNR
- FC(K) = UMC
- FNC(K) = UNC
- FG(K) = UMG
- FNG(K) = UNG
- ! V3.3 MODIFY FALLSPEED BELOW LEVEL OF PRECIP
- IF (K.LE.KTE-1) THEN
- IF (FR(K).LT.1.E-10) THEN
- FR(K)=FR(K+1)
- END IF
- IF (FI(K).LT.1.E-10) THEN
- FI(K)=FI(K+1)
- END IF
- IF (FNI(K).LT.1.E-10) THEN
- FNI(K)=FNI(K+1)
- END IF
- IF (FS(K).LT.1.E-10) THEN
- FS(K)=FS(K+1)
- END IF
- IF (FNS(K).LT.1.E-10) THEN
- FNS(K)=FNS(K+1)
- END IF
- IF (FNR(K).LT.1.E-10) THEN
- FNR(K)=FNR(K+1)
- END IF
- IF (FC(K).LT.1.E-10) THEN
- FC(K)=FC(K+1)
- END IF
- IF (FNC(K).LT.1.E-10) THEN
- FNC(K)=FNC(K+1)
- END IF
- IF (FG(K).LT.1.E-10) THEN
- FG(K)=FG(K+1)
- END IF
- IF (FNG(K).LT.1.E-10) THEN
- FNG(K)=FNG(K+1)
- END IF
- END IF ! K LE KTE-1
- ! CALCULATE NUMBER OF SPLIT TIME STEPS
- RGVM = MAX(FR(K),FI(K),FS(K),FC(K),FNI(K),FNR(K),FNS(K),FNC(K),FG(K),FNG(K))
- ! VVT CHANGED IFIX -> INT (GENERIC FUNCTION)
- NSTEP = MAX(INT(RGVM*DT/DZQ(K)+1.),NSTEP)
- ! MULTIPLY VARIABLES BY RHO
- DUMR(k) = DUMR(k)*RHO(K)
- DUMI(k) = DUMI(k)*RHO(K)
- DUMFNI(k) = DUMFNI(K)*RHO(K)
- DUMQS(k) = DUMQS(K)*RHO(K)
- DUMFNS(k) = DUMFNS(K)*RHO(K)
- DUMFNR(k) = DUMFNR(K)*RHO(K)
- DUMC(k) = DUMC(K)*RHO(K)
- DUMFNC(k) = DUMFNC(K)*RHO(K)
- DUMG(k) = DUMG(K)*RHO(K)
- DUMFNG(k) = DUMFNG(K)*RHO(K)
- END DO
- DO N = 1,NSTEP
- DO K = KTS,KTE
- FALOUTR(K) = FR(K)*DUMR(K)
- FALOUTI(K) = FI(K)*DUMI(K)
- FALOUTNI(K) = FNI(K)*DUMFNI(K)
- FALOUTS(K) = FS(K)*DUMQS(K)
- FALOUTNS(K) = FNS(K)*DUMFNS(K)
- FALOUTNR(K) = FNR(K)*DUMFNR(K)
- FALOUTC(K) = FC(K)*DUMC(K)
- FALOUTNC(K) = FNC(K)*DUMFNC(K)
- FALOUTG(K) = FG(K)*DUMG(K)
- FALOUTNG(K) = FNG(K)*DUMFNG(K)
- END DO
- ! TOP OF MODEL
- K = KTE
- FALTNDR = FALOUTR(K)/DZQ(k)
- FALTNDI = FALOUTI(K)/DZQ(k)
- FALTNDNI = FALOUTNI(K)/DZQ(k)
- FALTNDS = FALOUTS(K)/DZQ(k)
- FALTNDNS = FALOUTNS(K)/DZQ(k)
- FALTNDNR = FALOUTNR(K)/DZQ(k)
- FALTNDC = FALOUTC(K)/DZQ(k)
- FALTNDNC = FALOUTNC(K)/DZQ(k)
- FALTNDG = FALOUTG(K)/DZQ(k)
- FALTNDNG = FALOUTNG(K)/DZQ(k)
- ! ADD FALLOUT TERMS TO EULERIAN TENDENCIES
- QRSTEN(K) = QRSTEN(K)-FALTNDR/NSTEP/RHO(k)
- QISTEN(K) = QISTEN(K)-FALTNDI/NSTEP/RHO(k)
- NI3DTEN(K) = NI3DTEN(K)-FALTNDNI/NSTEP/RHO(k)
- QNISTEN(K) = QNISTEN(K)-FALTNDS/NSTEP/RHO(k)
- NS3DTEN(K) = NS3DTEN(K)-FALTNDNS/NSTEP/RHO(k)
- NR3DTEN(K) = NR3DTEN(K)-FALTNDNR/NSTEP/RHO(k)
- QCSTEN(K) = QCSTEN(K)-FALTNDC/NSTEP/RHO(k)
- NC3DTEN(K) = NC3DTEN(K)-FALTNDNC/NSTEP/RHO(k)
- QGSTEN(K) = QGSTEN(K)-FALTNDG/NSTEP/RHO(k)
- NG3DTEN(K) = NG3DTEN(K)-FALTNDNG/NSTEP/RHO(k)
- DUMR(K) = DUMR(K)-FALTNDR*DT/NSTEP
- DUMI(K) = DUMI(K)-FALTNDI*DT/NSTEP
- DUMFNI(K) = DUMFNI(K)-FALTNDNI*DT/NSTEP
- DUMQS(K) = DUMQS(K)-FALTNDS*DT/NSTEP
- DUMFNS(K) = DUMFNS(K)-FALTNDNS*DT/NSTEP
- DUMFNR(K) = DUMFNR(K)-FALTNDNR*DT/NSTEP
- DUMC(K) = DUMC(K)-FALTNDC*DT/NSTEP
- DUMFNC(K) = DUMFNC(K)-FALTNDNC*DT/NSTEP
- DUMG(K) = DUMG(K)-FALTNDG*DT/NSTEP
- DUMFNG(K) = DUMFNG(K)-FALTNDNG*DT/NSTEP
- DO K = KTE-1,KTS,-1
- FALTNDR = (FALOUTR(K+1)-FALOUTR(K))/DZQ(K)
- FALTNDI = (FALOUTI(K+1)-FALOUTI(K))/DZQ(K)
- FALTNDNI = (FALOUTNI(K+1)-FALOUTNI(K))/DZQ(K)
- FALTNDS = (FALOUTS(K+1)-FALOUTS(K))/DZQ(K)
- FALTNDNS = (FALOUTNS(K+1)-FALOUTNS(K))/DZQ(K)
- FALTNDNR = (FALOUTNR(K+1)-FALOUTNR(K))/DZQ(K)
- FALTNDC = (FALOUTC(K+1)-FALOUTC(K))/DZQ(K)
- FALTNDNC = (FALOUTNC(K+1)-FALOUTNC(K))/DZQ(K)
- FALTNDG = (FALOUTG(K+1)-FALOUTG(K))/DZQ(K)
- FALTNDNG = (FALOUTNG(K+1)-FALOUTNG(K))/DZQ(K)
- ! ADD FALLOUT TERMS TO EULERIAN TENDENCIES
- QRSTEN(K) = QRSTEN(K)+FALTNDR/NSTEP/RHO(k)
- QISTEN(K) = QISTEN(K)+FALTNDI/NSTEP/RHO(k)
- NI3DTEN(K) = NI3DTEN(K)+FALTNDNI/NSTEP/RHO(k)
- QNISTEN(K) = QNISTEN(K)+FALTNDS/NSTEP/RHO(k)
- NS3DTEN(K) = NS3DTEN(K)+FALTNDNS/NSTEP/RHO(k)
- NR3DTEN(K) = NR3DTEN(K)+FALTNDNR/NSTEP/RHO(k)
- QCSTEN(K) = QCSTEN(K)+FALTNDC/NSTEP/RHO(k)
- NC3DTEN(K) = NC3DTEN(K)+FALTNDNC/NSTEP/RHO(k)
- QGSTEN(K) = QGSTEN(K)+FALTNDG/NSTEP/RHO(k)
- NG3DTEN(K) = NG3DTEN(K)+FALTNDNG/NSTEP/RHO(k)
- DUMR(K) = DUMR(K)+FALTNDR*DT/NSTEP
- DUMI(K) = DUMI(K)+FALTNDI*DT/NSTEP
- DUMFNI(K) = DUMFNI(K)+FALTNDNI*DT/NSTEP
- DUMQS(K) = DUMQS(K)+FALTNDS*DT/NSTEP
- DUMFNS(K) = DUMFNS(K)+FALTNDNS*DT/NSTEP
- DUMFNR(K) = DUMFNR(K)+FALTNDNR*DT/NSTEP
- DUMC(K) = DUMC(K)+FALTNDC*DT/NSTEP
- DUMFNC(K) = DUMFNC(K)+FALTNDNC*DT/NSTEP
- DUMG(K) = DUMG(K)+FALTNDG*DT/NSTEP
- DUMFNG(K) = DUMFNG(K)+FALTNDNG*DT/NSTEP
- ! FOR WRF-CHEM, NEED PRECIP RATES (UNITS OF KG/M^2/S)
- CSED(K)=CSED(K)+FALOUTC(K)/NSTEP
- ISED(K)=ISED(K)+FALOUTI(K)/NSTEP
- SSED(K)=SSED(K)+FALOUTS(K)/NSTEP
- GSED(K)=GSED(K)+FALOUTG(K)/NSTEP
- RSED(K)=RSED(K)+FALOUTR(K)/NSTEP
- END DO
- ! GET PRECIPITATION AND SNOWFALL ACCUMULATION DURING THE TIME STEP
- ! FACTOR OF 1000 CONVERTS FROM M TO MM, BUT DIVISION BY DENSITY
- ! OF LIQUID WATER CANCELS THIS FACTOR OF 1000
- PRECRT = PRECRT+(FALOUTR(KTS)+FALOUTC(KTS)+FALOUTS(KTS)+FALOUTI(KTS)+FALOUTG(KTS)) &
- *DT/NSTEP
- SNOWRT = SNOWRT+(FALOUTS(KTS)+FALOUTI(KTS)+FALOUTG(KTS))*DT/NSTEP
- END DO
- DO K=KTS,KTE
- ! ADD ON SEDIMENTATION TENDENCIES FOR MIXING RATIO TO REST OF TENDENCIES
- QR3DTEN(K)=QR3DTEN(K)+QRSTEN(K)
- QI3DTEN(K)=QI3DTEN(K)+QISTEN(K)
- QC3DTEN(K)=QC3DTEN(K)+QCSTEN(K)
- QG3DTEN(K)=QG3DTEN(K)+QGSTEN(K)
- QNI3DTEN(K)=QNI3DTEN(K)+QNISTEN(K)
- ! PUT ALL CLOUD ICE IN SNOW CATEGORY IF MEAN DIAMETER EXCEEDS 2 * dcs
- !hm 4/7/09 bug fix
- ! IF (QI3D(K).GE.QSMALL.AND.T3D(K).LT.273.15) THEN
- IF (QI3D(K).GE.QSMALL.AND.T3D(K).LT.273.15.AND.LAMI(K).GE.1.E-10) THEN
- IF (1./LAMI(K).GE.2.*DCS) THEN
- QNI3DTEN(K) = QNI3DTEN(K)+QI3D(K)/DT+ QI3DTEN(K)
- NS3DTEN(K) = NS3DTEN(K)+NI3D(K)/DT+ NI3DTEN(K)
- QI3DTEN(K) = -QI3D(K)/DT
- NI3DTEN(K) = -NI3D(K)/DT
- END IF
- END IF
- ! hm add tendencies here, then call sizeparameter
- ! to ensure consisitency between mixing ratio and number concentration
- QC3D(k) = QC3D(k)+QC3DTEN(k)*DT
- QI3D(k) = QI3D(k)+QI3DTEN(k)*DT
- QNI3D(k) = QNI3D(k)+QNI3DTEN(k)*DT
- QR3D(k) = QR3D(k)+QR3DTEN(k)*DT
- NC3D(k) = NC3D(k)+NC3DTEN(k)*DT
- NI3D(k) = NI3D(k)+NI3DTEN(k)*DT
- NS3D(k) = NS3D(k)+NS3DTEN(k)*DT
- NR3D(k) = NR3D(k)+NR3DTEN(k)*DT
- IF (IGRAUP.EQ.0) THEN
- QG3D(k) = QG3D(k)+QG3DTEN(k)*DT
- NG3D(k) = NG3D(k)+NG3DTEN(k)*DT
- END IF
- ! ADD TEMPERATURE AND WATER VAPOR TENDENCIES FROM MICROPHYSICS
- T3D(K) = T3D(K)+T3DTEN(k)*DT
- QV3D(K) = QV3D(K)+QV3DTEN(k)*DT
- ! SATURATION VAPOR PRESSURE AND MIXING RATIO
- ! hm, add fix for low pressure, 5/12/10
- EVS(K) = min(0.99*pres(k),POLYSVP(T3D(K),0)) ! PA
- EIS(K) = min(0.99*pres(k),POLYSVP(T3D(K),1)) ! PA
- ! MAKE SURE ICE SATURATION DOESN'T EXCEED WATER SAT. NEAR FREEZING
- IF (EIS(K).GT.EVS(K)) EIS(K) = EVS(K)
- QVS(K) = EP_2*EVS(K)/(PRES(K)-EVS(K))
- QVI(K) = EP_2*EIS(K)/(PRES(K)-EIS(K))
- QVQVS(K) = QV3D(K)/QVS(K)
- QVQVSI(K) = QV3D(K)/QVI(K)
- ! AT SUBSATURATION, REMOVE SMALL AMOUNTS OF CLOUD/PRECIP WATER
- ! hm 7/9/09 change limit to 1.e-8
- IF (QVQVS(K).LT.0.9) THEN
- IF (QR3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QR3D(K)
- T3D(K)=T3D(K)-QR3D(K)*XXLV(K)/CPM(K)
- QR3D(K)=0.
- END IF
- IF (QC3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QC3D(K)
- T3D(K)=T3D(K)-QC3D(K)*XXLV(K)/CPM(K)
- QC3D(K)=0.
- END IF
- END IF
- IF (QVQVSI(K).LT.0.9) THEN
- IF (QI3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QI3D(K)
- T3D(K)=T3D(K)-QI3D(K)*XXLS(K)/CPM(K)
- QI3D(K)=0.
- END IF
- IF (QNI3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QNI3D(K)
- T3D(K)=T3D(K)-QNI3D(K)*XXLS(K)/CPM(K)
- QNI3D(K)=0.
- END IF
- IF (QG3D(K).LT.1.E-8) THEN
- QV3D(K)=QV3D(K)+QG3D(K)
- T3D(K)=T3D(K)-QG3D(K)*XXLS(K)/CPM(K)
- QG3D(K)=0.
- END IF
- END IF
- !..................................................................
- ! IF MIXING RATIO < QSMALL SET MIXING RATIO AND NUMBER CONC TO ZERO
- IF (QC3D(K).LT.QSMALL) THEN
- QC3D(K) = 0.
- NC3D(K) = 0.
- EFFC(K) = 0.
- END IF
- IF (QR3D(K).LT.QSMALL) THEN
- QR3D(K) = 0.
- NR3D(K) = 0.
- EFFR(K) = 0.
- END IF
- IF (QI3D(K).LT.QSMALL) THEN
- QI3D(K) = 0.
- NI3D(K) = 0.
- EFFI(K) = 0.
- END IF
- IF (QNI3D(K).LT.QSMALL) THEN
- QNI3D(K) = 0.
- NS3D(K) = 0.
- EFFS(K) = 0.
- END IF
- IF (QG3D(K).LT.QSMALL) THEN
- QG3D(K) = 0.
- NG3D(K) = 0.
- EFFG(K) = 0.
- END IF
- !..................................
- ! IF THERE IS NO CLOUD/PRECIP WATER, THEN SKIP CALCULATIONS
- IF (QC3D(K).LT.QSMALL.AND.QI3D(K).LT.QSMALL.AND.QNI3D(K).LT.QSMALL &
- .AND.QR3D(K).LT.QSMALL.AND.QG3D(K).LT.QSMALL) GOTO 500
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- ! CALCULATE INSTANTANEOUS PROCESSES
- ! ADD MELTING OF CLOUD ICE TO FORM RAIN
- IF (QI3D(K).GE.QSMALL.AND.T3D(K).GE.273.15) THEN
- QR3D(K) = QR3D(K)+QI3D(K)
- T3D(K) = T3D(K)-QI3D(K)*XLF(K)/CPM(K)
- QI3D(K) = 0.
- NR3D(K) = NR3D(K)+NI3D(K)
- NI3D(K) = 0.
- END IF
- ! ****SENSITIVITY - NO ICE
- IF (ILIQ.EQ.1) GOTO 778
- ! HOMOGENEOUS FREEZING OF CLOUD WATER
- IF (T3D(K).LE.233.15.AND.QC3D(K).GE.QSMALL) THEN
- QI3D(K)=QI3D(K)+QC3D(K)
- T3D(K)=T3D(K)+QC3D(K)*XLF(K)/CPM(K)
- QC3D(K)=0.
- NI3D(K)=NI3D(K)+NC3D(K)
- NC3D(K)=0.
- END IF
- ! HOMOGENEOUS FREEZING OF RAIN
- IF (IGRAUP.EQ.0) THEN
- IF (T3D(K).LE.233.15.AND.QR3D(K).GE.QSMALL) THEN
- QG3D(K) = QG3D(K)+QR3D(K)
- T3D(K) = T3D(K)+QR3D(K)*XLF(K)/CPM(K)
- QR3D(K) = 0.
- NG3D(K) = NG3D(K)+ NR3D(K)
- NR3D(K) = 0.
- END IF
- ELSE IF (IGRAUP.EQ.1) THEN
- IF (T3D(K).LE.233.15.AND.QR3D(K).GE.QSMALL) THEN
- QNI3D(K) = QNI3D(K)+QR3D(K)
- T3D(K) = T3D(K)+QR3D(K)*XLF(K)/CPM(K)
- QR3D(K) = 0.
- NS3D(K) = NS3D(K)+NR3D(K)
- NR3D(K) = 0.
- END IF
- END IF
- 778 CONTINUE
- ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
- NI3D(K) = MAX(0.,NI3D(K))
- NS3D(K) = MAX(0.,NS3D(K))
- NC3D(K) = MAX(0.,NC3D(K))
- NR3D(K) = MAX(0.,NR3D(K))
- NG3D(K) = MAX(0.,NG3D(K))
- !......................................................................
- ! CLOUD ICE
- IF (QI3D(K).GE.QSMALL) THEN
- LAMI(K) = (CONS12* &
- NI3D(K)/QI3D(K))**(1./DI)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMI(K).LT.LAMMINI) THEN
- LAMI(K) = LAMMINI
- N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
- NI3D(K) = N0I(K)/LAMI(K)
- ELSE IF (LAMI(K).GT.LAMMAXI) THEN
- LAMI(K) = LAMMAXI
- N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
- NI3D(K) = N0I(K)/LAMI(K)
- END IF
- END IF
- !......................................................................
- ! RAIN
- IF (QR3D(K).GE.QSMALL) THEN
- LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMR(K).LT.LAMMINR) THEN
- LAMR(K) = LAMMINR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- ELSE IF (LAMR(K).GT.LAMMAXR) THEN
- LAMR(K) = LAMMAXR
- N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
- NR3D(K) = N0RR(K)/LAMR(K)
- END IF
- END IF
- !......................................................................
- ! CLOUD DROPLETS
- ! MARTIN ET AL. (1994) FORMULA FOR PGAM
- IF (QC3D(K).GE.QSMALL) THEN
- DUM = PRES(K)/(287.15*T3D(K))
- PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
- PGAM(K)=1./(PGAM(K)**2)-1.
- PGAM(K)=MAX(PGAM(K),2.)
- PGAM(K)=MIN(PGAM(K),10.)
- ! CALCULATE LAMC
- LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
- (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
- ! LAMMIN, 60 MICRON DIAMETER
- ! LAMMAX, 1 MICRON
- LAMMIN = (PGAM(K)+1.)/60.E-6
- LAMMAX = (PGAM(K)+1.)/1.E-6
- IF (LAMC(K).LT.LAMMIN) THEN
- LAMC(K) = LAMMIN
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- ELSE IF (LAMC(K).GT.LAMMAX) THEN
- LAMC(K) = LAMMAX
- NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
- LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
- END IF
- END IF
- !......................................................................
- ! SNOW
- IF (QNI3D(K).GE.QSMALL) THEN
- LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMS(K).LT.LAMMINS) THEN
- LAMS(K) = LAMMINS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- ELSE IF (LAMS(K).GT.LAMMAXS) THEN
- LAMS(K) = LAMMAXS
- N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
- NS3D(K) = N0S(K)/LAMS(K)
- END IF
- END IF
- !......................................................................
- ! GRAUPEL
- IF (QG3D(K).GE.QSMALL) THEN
- LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
- ! CHECK FOR SLOPE
- ! ADJUST VARS
- IF (LAMG(K).LT.LAMMING) THEN
- LAMG(K) = LAMMING
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- ELSE IF (LAMG(K).GT.LAMMAXG) THEN
- LAMG(K) = LAMMAXG
- N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
- NG3D(K) = N0G(K)/LAMG(K)
- END IF
- END IF
- 500 CONTINUE
- ! CALCULATE EFFECTIVE RADIUS
- IF (QI3D(K).GE.QSMALL) THEN
- EFFI(K) = 3./LAMI(K)/2.*1.E6
- ELSE
- EFFI(K) = 25.
- END IF
- IF (QNI3D(K).GE.QSMALL) THEN
- EFFS(K) = 3./LAMS(K)/2.*1.E6
- ELSE
- EFFS(K) = 25.
- END IF
- IF (QR3D(K).GE.QSMALL) THEN
- EFFR(K) = 3./LAMR(K)/2.*1.E6
- ELSE
- EFFR(K) = 25.
- END IF
- IF (QC3D(K).GE.QSMALL) THEN
- EFFC(K) = GAMMA(PGAM(K)+4.)/ &
- GAMMA(PGAM(K)+3.)/LAMC(K)/2.*1.E6
- ELSE
- EFFC(K) = 25.
- END IF
- IF (QG3D(K).GE.QSMALL) THEN
- EFFG(K) = 3./LAMG(K)/2.*1.E6
- ELSE
- EFFG(K) = 25.
- END IF
- ! HM ADD 1/10/06, ADD UPPER BOUND ON ICE NUMBER, THIS IS NEEDED
- ! TO PREVENT VERY LARGE ICE NUMBER DUE TO HOMOGENEOUS FREEZING
- ! OF DROPLETS, ESPECIALLY WHEN INUM = 1, SET MAX AT 10 CM-3
- NI3D(K) = MIN(NI3D(K),10.E6/RHO(K))
- ! ADD BOUND ON DROPLET NUMBER - CANNOT EXCEED AEROSOL CONCENTRATION
- IF (iinum.EQ.0.AND.IACT.EQ.2) THEN
- NC3D(K) = MIN(NC3D(K),(NANEW1+NANEW2)/RHO(K))
- END IF
- ! SWITCH FOR CONSTANT DROPLET NUMBER
- IF (iinum.EQ.1) THEN
- ! CHANGE NDCNST FROM CM-3 TO KG-1
- NC3D(K) = NDCNST*1.E6/RHO(K)
- END IF
- END DO !!! K LOOP
- 400 CONTINUE
- ! ALL DONE !!!!!!!!!!!
- RETURN
- END SUBROUTINE MORR_TWO_MOMENT_MICRO
- !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
- REAL FUNCTION POLYSVP (T,TYPE)
- !-------------------------------------------
- ! COMPUTE SATURATION VAPOR PRESSURE
- ! POLYSVP RETURNED IN UNITS OF PA.
- ! T IS INPUT IN UNITS OF K.
- ! TYPE REFERS TO SATURATION WITH RESPECT TO LIQUID (0) OR ICE (1)
- ! REPLACE GOFF-GRATCH WITH FASTER FORMULATION FROM FLATAU ET AL. 1992, TABLE 4 (RIGHT-HAND COLUMN)
- IMPLICIT NONE
- REAL DUM
- REAL T
- INTEGER TYPE
- ! ice
- real a0i,a1i,a2i,a3i,a4i,a5i,a6i,a7i,a8i
- data a0i,a1i,a2i,a3i,a4i,a5i,a6i,a7i,a8i /&
- 6.11147274, 0.503160820, 0.188439774e-1, &
- 0.420895665e-3, 0.615021634e-5,0.602588177e-7, &
- 0.385852041e-9, 0.146898966e-11, 0.252751365e-14/
- ! liquid
- real a0,a1,a2,a3,a4,a5,a6,a7,a8
- ! V1.7
- data a0,a1,a2,a3,a4,a5,a6,a7,a8 /&
- 6.11239921, 0.443987641, 0.142986287e-1, &
- 0.264847430e-3, 0.302950461e-5, 0.206739458e-7, &
- 0.640689451e-10,-0.952447341e-13,-0.976195544e-15/
- real dt
- ! ICE
- IF (TYPE.EQ.1) THEN
- ! POLYSVP = 10.**(-9.09718*(273.16/T-1.)-3.56654* &
- ! LOG10(273.16/T)+0.876793*(1.-T/273.16)+ &
- ! LOG10(6.1071))*100.
- dt = max(-80.,t-273.16)
- polysvp = a0i + dt*(a1i+dt*(a2i+dt*(a3i+dt*(a4i+dt*(a5i+dt*(a6i+dt*(a7i+a8i*dt)))))))
- polysvp = polysvp*100.
- END IF
- ! LIQUID
- IF (TYPE.EQ.0) THEN
- dt = max(-80.,t-273.16)
- polysvp = a0 + dt*(a1+dt*(a2+dt*(a3+dt*(a4+dt*(a5+dt*(a6+dt*(a7+a8*dt)))))))
- polysvp = polysvp*100.
- ! POLYSVP = 10.**(-7.90298*(373.16/T-1.)+ &
- ! 5.02808*LOG10(373.16/T)- &
- ! 1.3816E-7*(10**(11.344*(1.-T/373.16))-1.)+ &
- ! 8.1328E-3*(10**(-3.49149*(373.16/T-1.))-1.)+ &
- ! LOG10(1013.246))*100.
- END IF
- END FUNCTION POLYSVP
- !------------------------------------------------------------------------------
- REAL FUNCTION GAMMA(X)
- !----------------------------------------------------------------------
- !
- ! THIS ROUTINE CALCULATES THE GAMMA FUNCTION FOR A REAL ARGUMENT X.
- ! COMPUTATION IS BASED ON AN ALGORITHM OUTLINED IN REFERENCE 1.
- ! THE PROGRAM USES RATIONAL FUNCTIONS THAT APPROXIMATE THE GAMMA
- ! FUNCTION TO AT LEAST 20 SIGNIFICANT DECIMAL DIGITS. COEFFICIENTS
- ! FOR THE APPROXIMATION OVER THE INTERVAL (1,2) ARE UNPUBLISHED.
- ! THOSE FOR THE APPROXIMATION FOR X .GE. 12 ARE FROM REFERENCE 2.
- ! THE ACCURACY ACHIEVED DEPENDS ON THE ARITHMETIC SYSTEM, THE
- ! COMPILER, THE INTRINSIC FUNCTIONS, AND PROPER SELECTION OF THE
- ! MACHINE-DEPENDENT CONSTANTS.
- !
- !
- !*******************************************************************
- !*******************************************************************
- !
- ! EXPLANATION OF MACHINE-DEPENDENT CONSTANTS
- !
- ! BETA - RADIX FOR THE FLOATING-POINT REPRESENTATION
- ! MAXEXP - THE SMALLEST POSITIVE POWER OF BETA THAT OVERFLOWS
- ! XBIG - THE LARGEST ARGUMENT FOR WHICH GAMMA(X) IS REPRESENTABLE
- ! IN THE MACHINE, I.E., THE SOLUTION TO THE EQUATION
- ! GAMMA(XBIG) = BETA**MAXEXP
- ! XINF - THE LARGEST MACHINE REPRESENTABLE FLOATING-POINT NUMBER;
- ! APPROXIMATELY BETA**MAXEXP
- ! EPS - THE SMALLEST POSITIVE FLOATING-POINT NUMBER SUCH THAT
- ! 1.0+EPS .GT. 1.0
- ! XMININ - THE SMALLEST POSITIVE FLOATING-POINT NUMBER SUCH THAT
- ! 1/XMININ IS MACHINE REPRESENTABLE
- !
- ! APPROXIMATE VALUES FOR SOME IMPORTANT MACHINES ARE:
- !
- ! BETA MAXEXP XBIG
- !
- ! CRAY-1 (S.P.) 2 8191 966.961
- ! CYBER 180/855
- ! UNDER NOS (S.P.) 2 1070 177.803
- ! IEEE (IBM/XT,
- ! SUN, ETC.) (S.P.) 2 128 35.040
- ! IEEE (IBM/XT,
- ! SUN, ETC.) (D.P.) 2 1024 171.624
- ! IBM 3033 (D.P.) 16 63 57.574
- ! VAX D-FORMAT (D.P.) 2 127 34.844
- ! VAX G-FORMAT (D.P.) 2 1023 171.489
- !
- ! XINF EPS XMININ
- !
- ! CRAY-1 (S.P.) 5.45E+2465 7.11E-15 1.84E-2466
- ! CYBER 180/855
- ! UNDER NOS (S.P.) 1.26E+322 3.55E-15 3.14E-294
- ! IEEE (IBM/XT,
- ! SUN, ETC.) (S.P.) 3.40E+38 1.19E-7 1.18E-38
- ! IEEE (IBM/XT,
- ! SUN, ETC.) (D.P.) 1.79D+308 2.22D-16 2.23D-308
- ! IBM 3033 (D.P.) 7.23D+75 2.22D-16 1.39D-76
- ! VAX D-FORMAT (D.P.) 1.70D+38 1.39D-17 5.88D-39
- ! VAX G-FORMAT (D.P.) 8.98D+307 1.11D-16 1.12D-308
- !
- !*******************************************************************
- !*******************************************************************
- !
- ! ERROR RETURNS
- !
- ! THE PROGRAM RETURNS THE VALUE XINF FOR SINGULARITIES OR
- ! WHEN OVERFLOW WOULD OCCUR. THE COMPUTATION IS BELIEVED
- ! TO BE FREE OF UNDERFLOW AND OVERFLOW.
- !
- !
- ! INTRINSIC FUNCTIONS REQUIRED ARE:
- !
- ! INT, DBLE, EXP, LOG, REAL, SIN
- !
- !
- ! REFERENCES: AN OVERVIEW OF SOFTWARE DEVELOPMENT FOR SPECIAL
- ! FUNCTIONS W. J. CODY, LECTURE NOTES IN MATHEMATICS,
- ! 506, NUMERICAL ANALYSIS DUNDEE, 1975, G. A. WATSON
- ! (ED.), SPRINGER VERLAG, BERLIN, 1976.
- !
- ! COMPUTER APPROXIMATIONS, HART, ET. AL., WILEY AND
- ! SONS, NEW YORK, 1968.
- !
- ! LATEST MODIFICATION: OCTOBER 12, 1989
- !
- ! AUTHORS: W. J. CODY AND L. STOLTZ
- ! APPLIED MATHEMATICS DIVISION
- ! ARGONNE NATIONAL LABORATORY
- ! ARGONNE, IL 60439
- !
- !----------------------------------------------------------------------
- implicit none
- INTEGER I,N
- LOGICAL PARITY
- REAL &
- CONV,EPS,FACT,HALF,ONE,RES,SUM,TWELVE, &
- TWO,X,XBIG,XDEN,XINF,XMININ,XNUM,Y,Y1,YSQ,Z,ZERO
- REAL, DIMENSION(7) :: C
- REAL, DIMENSION(8) :: P
- REAL, DIMENSION(8) :: Q
- !----------------------------------------------------------------------
- ! MATHEMATICAL CONSTANTS
- !----------------------------------------------------------------------
- DATA ONE,HALF,TWELVE,TWO,ZERO/1.0E0,0.5E0,12.0E0,2.0E0,0.0E0/
- !----------------------------------------------------------------------
- ! MACHINE DEPENDENT PARAMETERS
- !----------------------------------------------------------------------
- DATA XBIG,XMININ,EPS/35.040E0,1.18E-38,1.19E-7/,XINF/3.4E38/
- !----------------------------------------------------------------------
- ! NUMERATOR AND DENOMINATOR COEFFICIENTS FOR RATIONAL MINIMAX
- ! APPROXIMATION OVER (1,2).
- !----------------------------------------------------------------------
- DATA P/-1.71618513886549492533811E+0,2.47656508055759199108314E+1, &
- -3.79804256470945635097577E+2,6.29331155312818442661052E+2, &
- 8.66966202790413211295064E+2,-3.14512729688483675254357E+4, &
- -3.61444134186911729807069E+4,6.64561438202405440627855E+4/
- DATA Q/-3.08402300119738975254353E+1,3.15350626979604161529144E+2, &
- -1.01515636749021914166146E+3,-3.10777167157231109440444E+3, &
- 2.25381184209801510330112E+4,4.75584627752788110767815E+3, &
- -1.34659959864969306392456E+5,-1.15132259675553483497211E+5/
- !----------------------------------------------------------------------
- ! COEFFICIENTS FOR MINIMAX APPROXIMATION OVER (12, INF).
- !----------------------------------------------------------------------
- DATA C/-1.910444077728E-03,8.4171387781295E-04, &
- -5.952379913043012E-04,7.93650793500350248E-04, &
- -2.777777777777681622553E-03,8.333333333333333331554247E-02, &
- 5.7083835261E-03/
- !----------------------------------------------------------------------
- ! STATEMENT FUNCTIONS FOR CONVERSION BETWEEN INTEGER AND FLOAT
- !----------------------------------------------------------------------
- CONV(I) = REAL(I)
- PARITY=.FALSE.
- FACT=ONE
- N=0
- Y=X
- IF(Y.LE.ZERO)THEN
- !----------------------------------------------------------------------
- ! ARGUMENT IS NEGATIVE
- !----------------------------------------------------------------------
- Y=-X
- Y1=AINT(Y)
- RES=Y-Y1
- IF(RES.NE.ZERO)THEN
- IF(Y1.NE.AINT(Y1*HALF)*TWO)PARITY=.TRUE.
- FACT=-PI/SIN(PI*RES)
- Y=Y+ONE
- ELSE
- RES=XINF
- GOTO 900
- ENDIF
- ENDIF
- !----------------------------------------------------------------------
- ! ARGUMENT IS POSITIVE
- !----------------------------------------------------------------------
- IF(Y.LT.EPS)THEN
- !----------------------------------------------------------------------
- ! ARGUMENT .LT. EPS
- !----------------------------------------------------------------------
- IF(Y.GE.XMININ)THEN
- RES=ONE/Y
- ELSE
- RES=XINF
- GOTO 900
- ENDIF
- ELSEIF(Y.LT.TWELVE)THEN
- Y1=Y
- IF(Y.LT.ONE)THEN
- !----------------------------------------------------------------------
- ! 0.0 .LT. ARGUMENT .LT. 1.0
- !----------------------------------------------------------------------
- Z=Y
- Y=Y+ONE
- ELSE
- !----------------------------------------------------------------------
- ! 1.0 .LT. ARGUMENT .LT. 12.0, REDUCE ARGUMENT IF NECESSARY
- !----------------------------------------------------------------------
- N=INT(Y)-1
- Y=Y-CONV(N)
- Z=Y-ONE
- ENDIF
- !----------------------------------------------------------------------
- ! EVALUATE APPROXIMATION FOR 1.0 .LT. ARGUMENT .LT. 2.0
- !----------------------------------------------------------------------
- XNUM=ZERO
- XDEN=ONE
- DO I=1,8
- XNUM=(XNUM+P(I))*Z
- XDEN=XDEN*Z+Q(I)
- END DO
- RES=XNUM/XDEN+ONE
- IF(Y1.LT.Y)THEN
- !----------------------------------------------------------------------
- ! ADJUST RESULT FOR CASE 0.0 .LT. ARGUMENT .LT. 1.0
- !----------------------------------------------------------------------
- RES=RES/Y1
- ELSEIF(Y1.GT.Y)THEN
- !----------------------------------------------------------------------
- ! ADJUST RESULT FOR CASE 2.0 .LT. ARGUMENT .LT. 12.0
- !----------------------------------------------------------------------
- DO I=1,N
- RES=RES*Y
- Y=Y+ONE
- END DO
- ENDIF
- ELSE
- !----------------------------------------------------------------------
- ! EVALUATE FOR ARGUMENT .GE. 12.0,
- !----------------------------------------------------------------------
- IF(Y.LE.XBIG)THEN
- YSQ=Y*Y
- SUM=C(7)
- DO I=1,6
- SUM=SUM/YSQ+C(I)
- END DO
- SUM=SUM/Y-Y+SQRTPI
- SUM=SUM+(Y-HALF)*LOG(Y)
- RES=EXP(SUM)
- ELSE
- RES=XINF
- GOTO 900
- ENDIF
- ENDIF
- !----------------------------------------------------------------------
- ! FINAL ADJUSTMENTS AND RETURN
- !----------------------------------------------------------------------
- IF(PARITY)RES=-RES
- IF(FACT.NE.ONE)RES=FACT/RES
- 900 GAMMA=RES
- RETURN
- ! ---------- LAST LINE OF GAMMA ----------
- END FUNCTION GAMMA
- REAL FUNCTION DERF1(X)
- IMPLICIT NONE
- REAL X
- REAL, DIMENSION(0 : 64) :: A, B
- REAL W,T,Y
- INTEGER K,I
- DATA A/ &
- 0.00000000005958930743E0, -0.00000000113739022964E0, &
- 0.00000001466005199839E0, -0.00000016350354461960E0, &
- 0.00000164610044809620E0, -0.00001492559551950604E0, &
- 0.00012055331122299265E0, -0.00085483269811296660E0, &
- 0.00522397762482322257E0, -0.02686617064507733420E0, &
- 0.11283791670954881569E0, -0.37612638903183748117E0, &
- 1.12837916709551257377E0, &
- 0.00000000002372510631E0, -0.00000000045493253732E0, &
- 0.00000000590362766598E0, -0.00000006642090827576E0, &
- 0.00000067595634268133E0, -0.00000621188515924000E0, &
- 0.00005103883009709690E0, -0.00037015410692956173E0, &
- 0.00233307631218880978E0, -0.01254988477182192210E0, &
- 0.05657061146827041994E0, -0.21379664776456006580E0, &
- 0.84270079294971486929E0, &
- 0.00000000000949905026E0, -0.00000000018310229805E0, &
- 0.00000000239463074000E0, -0.00000002721444369609E0, &
- 0.00000028045522331686E0, -0.00000261830022482897E0, &
- 0.00002195455056768781E0, -0.00016358986921372656E0, &
- 0.00107052153564110318E0, -0.00608284718113590151E0, &
- 0.02986978465246258244E0, -0.13055593046562267625E0, &
- 0.67493323603965504676E0, &
- 0.00000000000382722073E0, -0.00000000007421598602E0, &
- 0.00000000097930574080E0, -0.00000001126008898854E0, &
- 0.00000011775134830784E0, -0.00000111992758382650E0, &
- 0.00000962023443095201E0, -0.00007404402135070773E0, &
- 0.00050689993654144881E0, -0.00307553051439272889E0, &
- 0.01668977892553165586E0, -0.08548534594781312114E0, &
- 0.56909076642393639985E0, &
- 0.00000000000155296588E0, -0.00000000003032205868E0, &
- 0.00000000040424830707E0, -0.00000000471135111493E0, &
- 0.00000005011915876293E0, -0.00000048722516178974E0, &
- 0.00000430683284629395E0, -0.00003445026145385764E0, &
- 0.00024879276133931664E0, -0.00162940941748079288E0, &
- 0.00988786373932350462E0, -0.05962426839442303805E0, &
- 0.49766113250947636708E0 /
- DATA (B(I), I = 0, 12) / &
- -0.00000000029734388465E0, 0.00000000269776334046E0, &
- -0.00000000640788827665E0, -0.00000001667820132100E0, &
- -0.00000021854388148686E0, 0.00000266246030457984E0, &
- 0.00001612722157047886E0, -0.00025616361025506629E0, &
- 0.00015380842432375365E0, 0.00815533022524927908E0, &
- -0.01402283663896319337E0, -0.19746892495383021487E0, &
- 0.71511720328842845913E0 /
- DATA (B(I), I = 13, 25) / &
- -0.00000000001951073787E0, -0.00000000032302692214E0, &
- 0.00000000522461866919E0, 0.00000000342940918551E0, &
- -0.00000035772874310272E0, 0.00000019999935792654E0, &
- 0.00002687044575042908E0, -0.00011843240273775776E0, &
- -0.00080991728956032271E0, 0.00661062970502241174E0, &
- 0.00909530922354827295E0, -0.20160072778491013140E0, &
- 0.51169696718727644908E0 /
- DATA (B(I), I = 26, 38) / &
- 0.00000000003147682272E0, -0.00000000048465972408E0, &
- 0.00000000063675740242E0, 0.00000003377623323271E0, &
- -0.00000015451139637086E0, -0.00000203340624738438E0, &
- 0.00001947204525295057E0, 0.00002854147231653228E0, &
- -0.00101565063152200272E0, 0.00271187003520095655E0, &
- 0.02328095035422810727E0, -0.16725021123116877197E0, &
- 0.32490054966649436974E0 /
- DATA (B(I), I = 39, 51) / &
- 0.00000000002319363370E0, -0.00000000006303206648E0, &
- -0.00000000264888267434E0, 0.00000002050708040581E0, &
- 0.00000011371857327578E0, -0.00000211211337219663E0, &
- 0.00000368797328322935E0, 0.00009823686253424796E0, &
- -0.00065860243990455368E0, -0.00075285814895230877E0, &
- 0.02585434424202960464E0, -0.11637092784486193258E0, &
- 0.18267336775296612024E0 /
- DATA (B(I), I = 52, 64) / &
- -0.00000000000367789363E0, 0.00000000020876046746E0, &
- -0.00000000193319027226E0, -0.00000000435953392472E0, &
- 0.00000018006992266137E0, -0.00000078441223763969E0, &
- -0.00000675407647949153E0, 0.00008428418334440096E0, &
- -0.00017604388937031815E0, -0.00239729611435071610E0, &
- 0.02064129023876022970E0, -0.06905562880005864105E0, &
- 0.09084526782065478489E0 /
- W = ABS(X)
- IF (W .LT. 2.2D0) THEN
- T = W * W
- K = INT(T)
- T = T - K
- K = K * 13
- Y = ((((((((((((A(K) * T + A(K + 1)) * T + &
- A(K + 2)) * T + A(K + 3)) * T + A(K + 4)) * T + &
- A(K + 5)) * T + A(K + 6)) * T + A(K + 7)) * T + &
- A(K + 8)) * T + A(K + 9)) * T + A(K + 10)) * T + &
- A(K + 11)) * T + A(K + 12)) * W
- ELSE IF (W .LT. 6.9D0) THEN
- K = INT(W)
- T = W - K
- K = 13 * (K - 2)
- Y = (((((((((((B(K) * T + B(K + 1)) * T + &
- B(K + 2)) * T + B(K + 3)) * T + B(K + 4)) * T + &
- B(K + 5)) * T + B(K + 6)) * T + B(K + 7)) * T + &
- B(K + 8)) * T + B(K + 9)) * T + B(K + 10)) * T + &
- B(K + 11)) * T + B(K + 12)
- Y = Y * Y
- Y = Y * Y
- Y = Y * Y
- Y = 1 - Y * Y
- ELSE
- Y = 1
- END IF
- IF (X .LT. 0) Y = -Y
- DERF1 = Y
- END FUNCTION DERF1
- !+---+-----------------------------------------------------------------+
- END MODULE module_mp_morr_two_moment