!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 ! WRFV3.5 ! hm/A. Ackerman bug fix 11/08/12 ! 1) for accelerated melting from collisions, should use rain mass collected by snow, not snow mass ! collected by rain ! 2) minor changes to some comments ! 3) reduction of maximum-allowed ice concentration from 10 cm-3 to 0.3 ! cm-3. This was done to address the problem of excessive and persistent ! anvil cirrus produced by the scheme. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! 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 2 USE module_wrf_error USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm ! GT USE module_domain, ONLY : HISTORY_ALARM, Is_alarm_tstep ! GT USE module_mp_radar ! 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 1,18 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! 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 !+---+-----------------------------------------------------------------+ !..Set these variables needed for computing radar reflectivity. These !.. get used within radar_init to create other variables used in the !.. radar module. xam_r = PI*RHOW/6. xbm_r = 3. xmu_r = 0. xam_s = CS xbm_s = DS xmu_s = 0. xam_g = CG xbm_g = DG xmu_g = 0. call radar_init !+---+-----------------------------------------------------------------+ 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, & 1,2 TH, QV, QC, QR, QI, QS, QG, NI, NS, NR, NG, & RHO, PII, P, DT_IN, DZ, HT, W, & RAINNC, RAINNCV, SR, & refl_10cm, diagflag, do_radar_ref, & ! GT added for reflectivity calcs 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) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! 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 ! 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 REAL, DIMENSION(kts:kte) :: dBZ REAL PRECPRT1D, SNOWRT1D INTEGER I,K,J REAL DT LOGICAL, OPTIONAL, INTENT(IN) :: diagflag INTEGER, OPTIONAL, INTENT(IN) :: do_radar_ref ! 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) !+---+-----------------------------------------------------------------+ IF ( PRESENT (diagflag) ) THEN if (diagflag .and. do_radar_ref == 1) then call refl10cm_hm (qv1d, qr1d, nr1d, qs1d, ns1d, qg1d, ng1d, & t1d, p1d, dBZ, kts, kte, i, j) do k = kts, kte refl_10cm(i,k,j) = MAX(-35., dBZ(k)) enddo endif ENDIF !+---+-----------------------------------------------------------------+ end do end do END SUBROUTINE MP_MORR_TWO_MOMENT !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE MORR_TWO_MOMENT_MICRO(QC3DTEN,QI3DTEN,QNI3DTEN,QR3DTEN, & 1,1 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 ACCRETION CLOUD ICE BY SNOW REAL, DIMENSION(KTS:KTE) :: PRCI ! CHANGE Q AUTOCONVERSIN CLOUD ICE TO 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. 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) ! hm fix, 2/12/13 ! for above freezing conditions to get accelerated melting of snow, ! we need collection of rain by snow (following Lin et al. 1983) ! 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))) 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))) ! 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)) ! HM, 12/28/12, LOWER MAXIMUM ICE CONCENTRATION TO ADDRESS PROBLEM ! OF EXCESSIVE AND PERSISTENT ANVIL ! NOTE: THIS MAY CHANGE/REDUCE SENSITIVITY TO AEROSOL/CCN CONCENTRATION NI3D(K) = MIN(NI3D(K),0.3E6/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) 26 !------------------------------------------- ! 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) 124 !---------------------------------------------------------------------- ! ! 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 !+---+-----------------------------------------------------------------+ subroutine refl10cm_hm (qv1d, qr1d, nr1d, qs1d, ns1d, qg1d, ng1d, & 1,2 t1d, p1d, dBZ, kts, kte, ii, jj) IMPLICIT NONE !..Sub arguments INTEGER, INTENT(IN):: kts, kte, ii, jj REAL, DIMENSION(kts:kte), INTENT(IN):: & qv1d, qr1d, nr1d, qs1d, ns1d, qg1d, ng1d, t1d, p1d REAL, DIMENSION(kts:kte), INTENT(INOUT):: dBZ !..Local variables REAL, DIMENSION(kts:kte):: temp, pres, qv, rho REAL, DIMENSION(kts:kte):: rr, nr, rs, ns, rg, ng DOUBLE PRECISION, DIMENSION(kts:kte):: ilamr, ilamg, ilams DOUBLE PRECISION, DIMENSION(kts:kte):: N0_r, N0_g, N0_s DOUBLE PRECISION:: lamr, lamg, lams LOGICAL, DIMENSION(kts:kte):: L_qr, L_qs, L_qg REAL, DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel DOUBLE PRECISION:: fmelt_s, fmelt_g DOUBLE PRECISION:: cback, x, eta, f_d INTEGER:: i, k, k_0, kbot, n LOGICAL:: melti !+---+ do k = kts, kte dBZ(k) = -35.0 enddo !+---+-----------------------------------------------------------------+ !..Put column of data into local arrays. !+---+-----------------------------------------------------------------+ do k = kts, kte temp(k) = t1d(k) qv(k) = MAX(1.E-10, qv1d(k)) pres(k) = p1d(k) rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622)) if (qr1d(k) .gt. 1.E-9) then rr(k) = qr1d(k)*rho(k) nr(k) = nr1d(k)*rho(k) lamr = (xam_r*xcrg(3)*xorg2*nr(k)/rr(k))**xobmr ilamr(k) = 1./lamr N0_r(k) = nr(k)*xorg2*lamr**xcre(2) L_qr(k) = .true. else rr(k) = 1.E-12 nr(k) = 1.E-12 L_qr(k) = .false. endif if (qs1d(k) .gt. 1.E-9) then rs(k) = qs1d(k)*rho(k) ns(k) = ns1d(k)*rho(k) lams = (xam_s*xcsg(3)*xosg2*ns(k)/rs(k))**xobms ilams(k) = 1./lams N0_s(k) = ns(k)*xosg2*lams**xcse(2) L_qs(k) = .true. else rs(k) = 1.E-12 ns(k) = 1.E-12 L_qs(k) = .false. endif if (qg1d(k) .gt. 1.E-9) then rg(k) = qg1d(k)*rho(k) ng(k) = ng1d(k)*rho(k) lamg = (xam_g*xcgg(3)*xogg2*ng(k)/rg(k))**xobmg ilamg(k) = 1./lamg N0_g(k) = ng(k)*xogg2*lamg**xcge(2) L_qg(k) = .true. else rg(k) = 1.E-12 ng(k) = 1.E-12 L_qg(k) = .false. endif enddo !+---+-----------------------------------------------------------------+ !..Locate K-level of start of melting (k_0 is level above). !+---+-----------------------------------------------------------------+ melti = .false. k_0 = kts do k = kte-1, kts, -1 if ( (temp(k).gt.273.15) .and. L_qr(k) & .and. (L_qs(k+1).or.L_qg(k+1)) ) then k_0 = MAX(k+1, k_0) melti=.true. goto 195 endif enddo 195 continue !+---+-----------------------------------------------------------------+ !..Assume Rayleigh approximation at 10 cm wavelength. Rain (all temps) !.. and non-water-coated snow and graupel when below freezing are !.. simple. Integrations of m(D)*m(D)*N(D)*dD. !+---+-----------------------------------------------------------------+ do k = kts, kte ze_rain(k) = 1.e-22 ze_snow(k) = 1.e-22 ze_graupel(k) = 1.e-22 if (L_qr(k)) ze_rain(k) = N0_r(k)*xcrg(4)*ilamr(k)**xcre(4) if (L_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/PI)*(6.0/PI) & * (xam_s/900.0)*(xam_s/900.0) & * N0_s(k)*xcsg(4)*ilams(k)**xcse(4) if (L_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/PI)*(6.0/PI) & * (xam_g/900.0)*(xam_g/900.0) & * N0_g(k)*xcgg(4)*ilamg(k)**xcge(4) enddo !+---+-----------------------------------------------------------------+ !..Special case of melting ice (snow/graupel) particles. Assume the !.. ice is surrounded by the liquid water. Fraction of meltwater is !.. extremely simple based on amount found above the melting level. !.. Uses code from Uli Blahak (rayleigh_soak_wetgraupel and supporting !.. routines). !+---+-----------------------------------------------------------------+ if (melti .and. k_0.ge.kts+1) then do k = k_0-1, kts, -1 !..Reflectivity contributed by melting snow if (L_qs(k) .and. L_qs(k_0) ) then fmelt_s = MAX(0.005d0, MIN(1.0d0-rs(k)/rs(k_0), 0.99d0)) eta = 0.d0 lams = 1./ilams(k) do n = 1, nrbins x = xam_s * xxDs(n)**xbm_s call rayleigh_soak_wetgraupel (x,DBLE(xocms),DBLE(xobms), & fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, & CBACK, mixingrulestring_s, matrixstring_s, & inclusionstring_s, hoststring_s, & hostmatrixstring_s, hostinclusionstring_s) f_d = N0_s(k)*xxDs(n)**xmu_s * DEXP(-lams*xxDs(n)) eta = eta + f_d * CBACK * simpson(n) * xdts(n) enddo ze_snow(k) = SNGL(lamda4 / (pi5 * K_w) * eta) endif !..Reflectivity contributed by melting graupel if (L_qg(k) .and. L_qg(k_0) ) then fmelt_g = MAX(0.005d0, MIN(1.0d0-rg(k)/rg(k_0), 0.99d0)) eta = 0.d0 lamg = 1./ilamg(k) do n = 1, nrbins x = xam_g * xxDg(n)**xbm_g call rayleigh_soak_wetgraupel (x,DBLE(xocmg),DBLE(xobmg), & fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, & CBACK, mixingrulestring_g, matrixstring_g, & inclusionstring_g, hoststring_g, & hostmatrixstring_g, hostinclusionstring_g) f_d = N0_g(k)*xxDg(n)**xmu_g * DEXP(-lamg*xxDg(n)) eta = eta + f_d * CBACK * simpson(n) * xdtg(n) enddo ze_graupel(k) = SNGL(lamda4 / (pi5 * K_w) * eta) endif enddo endif do k = kte, kts, -1 dBZ(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18) enddo end subroutine refl10cm_hm !+---+-----------------------------------------------------------------+ END MODULE module_mp_morr_two_moment !+---+-----------------------------------------------------------------+ !+---+-----------------------------------------------------------------+