PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_mp_morr_two_moment.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 4277 lines | 2282 code | 883 blank | 1112 comment | 8 complexity | e220149e4d11905453d573b2401b0487 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. ! THIS MODULE CONTAINS THE TWO-MOMENT MICROPHYSICS CODE DESCRIBED BY
  4. ! MORRISON ET AL. (2009, MWR)
  5. ! CHANGES FOR V3.2, RELATIVE TO MOST RECENT (BUG-FIX) CODE FOR V3.1
  6. ! 1) ADDED ACCELERATED MELTING OF GRAUPEL/SNOW DUE TO COLLISION WITH RAIN, FOLLOWING LIN ET AL. (1983)
  7. ! 2) INCREASED MINIMUM LAMBDA FOR RAIN, AND ADDED RAIN DROP BREAKUP FOLLOWING MODIFIED VERSION
  8. ! OF VERLINDE AND COTTON (1993)
  9. ! 3) CHANGE MINIMUM ALLOWED MIXING RATIOS IN DRY CONDITIONS (RH < 90%), THIS IMPROVES RADAR REFLECTIIVITY
  10. ! IN LOW REFLECTIVITY REGIONS
  11. ! 4) BUG FIX TO MAXIMUM ALLOWED PARTICLE FALLSPEEDS AS A FUNCTION OF AIR DENSITY
  12. ! 5) BUG FIX TO CALCULATION OF LIQUID WATER SATURATION VAPOR PRESSURE (CHANGE IS VERY MINOR)
  13. ! 6) INCLUDE WRF CONSTANTS PER SUGGESTION OF JIMY
  14. ! bug fix, 5/12/10
  15. ! 7) bug fix for saturation vapor pressure in low pressure, to avoid division by zero
  16. ! 8) include 'EP2' WRF constant for saturation mixing ratio calculation, instead of hardwire constant
  17. ! CHANGES FOR V3.3
  18. ! 1) MODIFICATION FOR COUPLING WITH WRF-CHEM (PREDICTED DROPLET NUMBER CONCENTRATION) AS AN OPTION
  19. ! 2) MODIFY FALLSPEED BELOW THE LOWEST LEVEL OF PRECIPITATION, WHICH PREVENTS
  20. ! POTENTIAL FOR SPURIOUS ACCUMULATION OF PRECIPITATION DURING SUB-STEPPING FOR SEDIMENTATION
  21. ! 3) BUG FIX TO LATENT HEAT RELEASE DUE TO COLLISIONS OF CLOUD ICE WITH RAIN
  22. ! 4) CLEAN UP OF COMMENTS IN THE CODE
  23. ! additional minor bug fixes and small changes, 5/30/2011
  24. ! minor revisions by A. Ackerman April 2011:
  25. ! 1) replaced kinematic with dynamic viscosity
  26. ! 2) replaced scaling by air density for cloud droplet sedimentation
  27. ! with viscosity-dependent Stokes expression
  28. ! 3) use Ikawa and Saito (1991) air-density scaling for cloud ice
  29. ! 4) corrected typo in 2nd digit of ventilation constant F2R
  30. ! additional fixes:
  31. ! 5) TEMPERATURE FOR ACCELERATED MELTING DUE TO COLLIIONS OF SNOW AND GRAUPEL
  32. ! WITH RAIN SHOULD USE CELSIUS, NOT KELVIN (BUG REPORTED BY K. VAN WEVERBERG)
  33. ! 6) NPRACS IS NOT SUBTRACTED FROM SNOW NUMBER CONCENTRATION, SINCE
  34. ! DECREASE IN SNOW NUMBER IS ALREADY ACCOUNTED FOR BY NSMLTS
  35. ! 7) fix for switch for running w/o graupel/hail (cloud ice and snow only)
  36. ! hm bug fix 3/16/12
  37. ! 1) very minor change to limits on autoconversion source of rain number when cloud water is depleted
  38. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  39. ! THIS SCHEME IS A BULK DOUBLE-MOMENT SCHEME THAT PREDICTS MIXING
  40. ! RATIOS AND NUMBER CONCENTRATIONS OF FIVE HYDROMETEOR SPECIES:
  41. ! CLOUD DROPLETS, CLOUD (SMALL) ICE, RAIN, SNOW, AND GRAUPEL.
  42. MODULE MODULE_MP_MORR_TWO_MOMENT
  43. USE module_wrf_error
  44. ! USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm ! GT
  45. ! USE module_domain, ONLY : HISTORY_ALARM, Is_alarm_tstep ! GT
  46. ! USE WRF PHYSICS CONSTANTS
  47. use module_model_constants, ONLY: CP, G, R => r_d, RV => r_v, EP_2
  48. ! USE module_state_description
  49. IMPLICIT NONE
  50. REAL, PARAMETER :: PI = 3.1415926535897932384626434
  51. REAL, PARAMETER :: SQRTPI = 0.9189385332046727417803297
  52. PUBLIC :: MP_MORR_TWO_MOMENT
  53. PUBLIC :: POLYSVP
  54. PRIVATE :: GAMMA, DERF1
  55. PRIVATE :: PI, SQRTPI
  56. PRIVATE :: MORR_TWO_MOMENT_MICRO
  57. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  58. ! SWITCHES FOR MICROPHYSICS SCHEME
  59. ! IACT = 1, USE POWER-LAW CCN SPECTRA, NCCN = CS^K
  60. ! IACT = 2, USE LOGNORMAL AEROSOL SIZE DIST TO DERIVE CCN SPECTRA
  61. ! IACT = 3, ACTIVATION CALCULATED IN MODULE_MIXACTIVATE
  62. INTEGER, PRIVATE :: IACT
  63. ! INUM = 0, PREDICT DROPLET CONCENTRATION
  64. ! INUM = 1, ASSUME CONSTANT DROPLET CONCENTRATION
  65. ! !!!NOTE: PREDICTED DROPLET CONCENTRATION NOT AVAILABLE IN THIS VERSION
  66. ! CONTACT HUGH MORRISON (morrison@ucar.edu) FOR FURTHER INFORMATION
  67. INTEGER, PRIVATE :: INUM
  68. ! FOR INUM = 1, SET CONSTANT DROPLET CONCENTRATION (CM-3)
  69. REAL, PRIVATE :: NDCNST
  70. ! SWITCH FOR LIQUID-ONLY RUN
  71. ! ILIQ = 0, INCLUDE ICE
  72. ! ILIQ = 1, LIQUID ONLY, NO ICE
  73. INTEGER, PRIVATE :: ILIQ
  74. ! SWITCH FOR ICE NUCLEATION
  75. ! INUC = 0, USE FORMULA FROM RASMUSSEN ET AL. 2002 (MID-LATITUDE)
  76. ! = 1, USE MPACE OBSERVATIONS
  77. INTEGER, PRIVATE :: INUC
  78. ! IBASE = 1, NEGLECT DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
  79. ! UNRESOLVED ENTRAINMENT AND MIXING, ACTIVATE
  80. ! AT CLOUD BASE OR IN REGION WITH LITTLE CLOUD WATER USING
  81. ! NON-EQULIBRIUM SUPERSATURATION,
  82. ! IN CLOUD INTERIOR ACTIVATE USING EQUILIBRIUM SUPERSATURATION
  83. ! IBASE = 2, ASSUME DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
  84. ! UNRESOLVED ENTRAINMENT AND MIXING DOMINATES,
  85. ! ACTIVATE DROPLETS EVERYWHERE IN THE CLOUD USING NON-EQUILIBRIUM
  86. ! SUPERSATURATION, BASED ON THE
  87. ! LOCAL SUB-GRID AND/OR GRID-SCALE VERTICAL VELOCITY
  88. ! AT THE GRID POINT
  89. ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
  90. INTEGER, PRIVATE :: IBASE
  91. ! INCLUDE SUB-GRID VERTICAL VELOCITY IN DROPLET ACTIVATION
  92. ! ISUB = 0, INCLUDE SUB-GRID W (RECOMMENDED FOR LOWER RESOLUTION)
  93. ! ISUB = 1, EXCLUDE SUB-GRID W, ONLY USE GRID-SCALE W
  94. INTEGER, PRIVATE :: ISUB
  95. ! SWITCH FOR GRAUPEL/NO GRAUPEL
  96. ! IGRAUP = 0, INCLUDE GRAUPEL
  97. ! IGRAUP = 1, NO GRAUPEL
  98. INTEGER, PRIVATE :: IGRAUP
  99. ! HM ADDED NEW OPTION FOR HAIL
  100. ! SWITCH FOR HAIL/GRAUPEL
  101. ! IHAIL = 0, DENSE PRECIPITATING ICE IS GRAUPEL
  102. ! IHAIL = 1, DENSE PRECIPITATING GICE IS HAIL
  103. INTEGER, PRIVATE :: IHAIL
  104. ! CLOUD MICROPHYSICS CONSTANTS
  105. REAL, PRIVATE :: AI,AC,AS,AR,AG ! 'A' PARAMETER IN FALLSPEED-DIAM RELATIONSHIP
  106. REAL, PRIVATE :: BI,BC,BS,BR,BG ! 'B' PARAMETER IN FALLSPEED-DIAM RELATIONSHIP
  107. ! REAL, PRIVATE :: R ! GAS CONSTANT FOR AIR
  108. ! REAL, PRIVATE :: RV ! GAS CONSTANT FOR WATER VAPOR
  109. ! REAL, PRIVATE :: CP ! SPECIFIC HEAT AT CONSTANT PRESSURE FOR DRY AIR
  110. REAL, PRIVATE :: RHOSU ! STANDARD AIR DENSITY AT 850 MB
  111. REAL, PRIVATE :: RHOW ! DENSITY OF LIQUID WATER
  112. REAL, PRIVATE :: RHOI ! BULK DENSITY OF CLOUD ICE
  113. REAL, PRIVATE :: RHOSN ! BULK DENSITY OF SNOW
  114. REAL, PRIVATE :: RHOG ! BULK DENSITY OF GRAUPEL
  115. REAL, PRIVATE :: AIMM ! PARAMETER IN BIGG IMMERSION FREEZING
  116. REAL, PRIVATE :: BIMM ! PARAMETER IN BIGG IMMERSION FREEZING
  117. REAL, PRIVATE :: ECR ! COLLECTION EFFICIENCY BETWEEN DROPLETS/RAIN AND SNOW/RAIN
  118. REAL, PRIVATE :: DCS ! THRESHOLD SIZE FOR CLOUD ICE AUTOCONVERSION
  119. REAL, PRIVATE :: MI0 ! INITIAL SIZE OF NUCLEATED CRYSTAL
  120. REAL, PRIVATE :: MG0 ! MASS OF EMBRYO GRAUPEL
  121. REAL, PRIVATE :: F1S ! VENTILATION PARAMETER FOR SNOW
  122. REAL, PRIVATE :: F2S ! VENTILATION PARAMETER FOR SNOW
  123. REAL, PRIVATE :: F1R ! VENTILATION PARAMETER FOR RAIN
  124. REAL, PRIVATE :: F2R ! VENTILATION PARAMETER FOR RAIN
  125. ! REAL, PRIVATE :: G ! GRAVITATIONAL ACCELERATION
  126. REAL, PRIVATE :: QSMALL ! SMALLEST ALLOWED HYDROMETEOR MIXING RATIO
  127. REAL, PRIVATE :: CI,DI,CS,DS,CG,DG ! SIZE DISTRIBUTION PARAMETERS FOR CLOUD ICE, SNOW, GRAUPEL
  128. REAL, PRIVATE :: EII ! COLLECTION EFFICIENCY, ICE-ICE COLLISIONS
  129. REAL, PRIVATE :: ECI ! COLLECTION EFFICIENCY, ICE-DROPLET COLLISIONS
  130. REAL, PRIVATE :: RIN ! RADIUS OF CONTACT NUCLEI (M)
  131. ! hm, add for V3.2
  132. REAL, PRIVATE :: CPW ! SPECIFIC HEAT OF LIQUID WATER
  133. ! CCN SPECTRA FOR IACT = 1
  134. REAL, PRIVATE :: C1 ! 'C' IN NCCN = CS^K (CM-3)
  135. REAL, PRIVATE :: K1 ! 'K' IN NCCN = CS^K
  136. ! AEROSOL PARAMETERS FOR IACT = 2
  137. REAL, PRIVATE :: MW ! MOLECULAR WEIGHT WATER (KG/MOL)
  138. REAL, PRIVATE :: OSM ! OSMOTIC COEFFICIENT
  139. REAL, PRIVATE :: VI ! NUMBER OF ION DISSOCIATED IN SOLUTION
  140. REAL, PRIVATE :: EPSM ! AEROSOL SOLUBLE FRACTION
  141. REAL, PRIVATE :: RHOA ! AEROSOL BULK DENSITY (KG/M3)
  142. REAL, PRIVATE :: MAP ! MOLECULAR WEIGHT AEROSOL (KG/MOL)
  143. REAL, PRIVATE :: MA ! MOLECULAR WEIGHT OF 'AIR' (KG/MOL)
  144. REAL, PRIVATE :: RR ! UNIVERSAL GAS CONSTANT
  145. REAL, PRIVATE :: BACT ! ACTIVATION PARAMETER
  146. REAL, PRIVATE :: RM1 ! GEOMETRIC MEAN RADIUS, MODE 1 (M)
  147. REAL, PRIVATE :: RM2 ! GEOMETRIC MEAN RADIUS, MODE 2 (M)
  148. REAL, PRIVATE :: NANEW1 ! TOTAL AEROSOL CONCENTRATION, MODE 1 (M^-3)
  149. REAL, PRIVATE :: NANEW2 ! TOTAL AEROSOL CONCENTRATION, MODE 2 (M^-3)
  150. REAL, PRIVATE :: SIG1 ! STANDARD DEVIATION OF AEROSOL S.D., MODE 1
  151. REAL, PRIVATE :: SIG2 ! STANDARD DEVIATION OF AEROSOL S.D., MODE 2
  152. REAL, PRIVATE :: F11 ! CORRECTION FACTOR FOR ACTIVATION, MODE 1
  153. REAL, PRIVATE :: F12 ! CORRECTION FACTOR FOR ACTIVATION, MODE 1
  154. REAL, PRIVATE :: F21 ! CORRECTION FACTOR FOR ACTIVATION, MODE 2
  155. REAL, PRIVATE :: F22 ! CORRECTION FACTOR FOR ACTIVATION, MODE 2
  156. REAL, PRIVATE :: MMULT ! MASS OF SPLINTERED ICE PARTICLE
  157. REAL, PRIVATE :: LAMMAXI,LAMMINI,LAMMAXR,LAMMINR,LAMMAXS,LAMMINS,LAMMAXG,LAMMING
  158. ! CONSTANTS TO IMPROVE EFFICIENCY
  159. REAL, PRIVATE :: CONS1,CONS2,CONS3,CONS4,CONS5,CONS6,CONS7,CONS8,CONS9,CONS10
  160. REAL, PRIVATE :: CONS11,CONS12,CONS13,CONS14,CONS15,CONS16,CONS17,CONS18,CONS19,CONS20
  161. REAL, PRIVATE :: CONS21,CONS22,CONS23,CONS24,CONS25,CONS26,CONS27,CONS28,CONS29,CONS30
  162. REAL, PRIVATE :: CONS31,CONS32,CONS33,CONS34,CONS35,CONS36,CONS37,CONS38,CONS39,CONS40
  163. REAL, PRIVATE :: CONS41
  164. CONTAINS
  165. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  166. SUBROUTINE MORR_TWO_MOMENT_INIT
  167. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  168. ! THIS SUBROUTINE INITIALIZES ALL PHYSICAL CONSTANTS AMND PARAMETERS
  169. ! NEEDED BY THE MICROPHYSICS SCHEME.
  170. ! NEEDS TO BE CALLED AT FIRST TIME STEP, PRIOR TO CALL TO MAIN MICROPHYSICS INTERFACE
  171. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  172. IMPLICIT NONE
  173. integer n,i
  174. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  175. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  176. ! THE FOLLOWING PARAMETERS ARE USER-DEFINED SWITCHES AND NEED TO BE
  177. ! SET PRIOR TO CODE COMPILATION
  178. ! INUM IS AUTOMATICALLY SET TO 0 FOR WRF-CHEM BELOW,
  179. ! ALLOWING PREDICTION OF DROPLET CONCENTRATION
  180. ! THUS, THIS PARAMETER SHOULD NOT BE CHANGED HERE
  181. ! AND SHOULD BE LEFT TO 1
  182. INUM = 1
  183. ! SET CONSTANT DROPLET CONCENTRATION (UNITS OF CM-3)
  184. ! IF NO COUPLING WITH WRF-CHEM
  185. NDCNST = 250.
  186. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  187. ! NOTE, THE FOLLOWING OPTIONS RELATED TO DROPLET ACTIVATION
  188. ! (IACT, IBASE, ISUB) ARE NOT AVAILABLE IN CURRENT VERSION
  189. ! FOR WRF-CHEM, DROPLET ACTIVATION IS PERFORMED
  190. ! IN 'MIX_ACTIVATE', NOT IN MICROPHYSICS SCHEME
  191. ! IACT = 1, USE POWER-LAW CCN SPECTRA, NCCN = CS^K
  192. ! IACT = 2, USE LOGNORMAL AEROSOL SIZE DIST TO DERIVE CCN SPECTRA
  193. IACT = 2
  194. ! IBASE = 1, NEGLECT DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
  195. ! UNRESOLVED ENTRAINMENT AND MIXING, ACTIVATE
  196. ! AT CLOUD BASE OR IN REGION WITH LITTLE CLOUD WATER USING
  197. ! NON-EQULIBRIUM SUPERSATURATION ASSUMING NO INITIAL CLOUD WATER,
  198. ! IN CLOUD INTERIOR ACTIVATE USING EQUILIBRIUM SUPERSATURATION
  199. ! IBASE = 2, ASSUME DROPLET ACTIVATION AT LATERAL CLOUD EDGES DUE TO
  200. ! UNRESOLVED ENTRAINMENT AND MIXING DOMINATES,
  201. ! ACTIVATE DROPLETS EVERYWHERE IN THE CLOUD USING NON-EQUILIBRIUM
  202. ! SUPERSATURATION ASSUMING NO INITIAL CLOUD WATER, BASED ON THE
  203. ! LOCAL SUB-GRID AND/OR GRID-SCALE VERTICAL VELOCITY
  204. ! AT THE GRID POINT
  205. ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
  206. IBASE = 2
  207. ! INCLUDE SUB-GRID VERTICAL VELOCITY (standard deviation of w) IN DROPLET ACTIVATION
  208. ! ISUB = 0, INCLUDE SUB-GRID W (RECOMMENDED FOR LOWER RESOLUTION)
  209. ! currently, sub-grid w is constant of 0.5 m/s (not coupled with PBL/turbulence scheme)
  210. ! ISUB = 1, EXCLUDE SUB-GRID W, ONLY USE GRID-SCALE W
  211. ! NOTE: ONLY USED FOR PREDICTED DROPLET CONCENTRATION (INUM = 0)
  212. ISUB = 0
  213. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  214. ! SWITCH FOR LIQUID-ONLY RUN
  215. ! ILIQ = 0, INCLUDE ICE
  216. ! ILIQ = 1, LIQUID ONLY, NO ICE
  217. ILIQ = 0
  218. ! SWITCH FOR ICE NUCLEATION
  219. ! INUC = 0, USE FORMULA FROM RASMUSSEN ET AL. 2002 (MID-LATITUDE)
  220. ! = 1, USE MPACE OBSERVATIONS (ARCTIC ONLY)
  221. INUC = 0
  222. ! SWITCH FOR GRAUPEL/HAIL NO GRAUPEL/HAIL
  223. ! IGRAUP = 0, INCLUDE GRAUPEL/HAIL
  224. ! IGRAUP = 1, NO GRAUPEL/HAIL
  225. IGRAUP = 0
  226. ! HM ADDED 11/7/07
  227. ! SWITCH FOR HAIL/GRAUPEL
  228. ! IHAIL = 0, DENSE PRECIPITATING ICE IS GRAUPEL
  229. ! IHAIL = 1, DENSE PRECIPITATING ICE IS HAIL
  230. ! NOTE ---> RECOMMEND IHAIL = 1 FOR CONTINENTAL DEEP CONVECTION
  231. IHAIL = 0
  232. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  233. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  234. ! SET PHYSICAL CONSTANTS
  235. ! FALLSPEED PARAMETERS (V=AD^B)
  236. AI = 700.
  237. AC = 3.E7
  238. AS = 11.72
  239. AR = 841.99667
  240. BI = 1.
  241. BC = 2.
  242. BS = 0.41
  243. BR = 0.8
  244. IF (IHAIL.EQ.0) THEN
  245. AG = 19.3
  246. BG = 0.37
  247. ELSE ! (MATSUN AND HUGGINS 1980)
  248. AG = 114.5
  249. BG = 0.5
  250. END IF
  251. ! CONSTANTS AND PARAMETERS
  252. ! R = 287.15
  253. ! RV = 461.5
  254. ! CP = 1005.
  255. RHOSU = 85000./(287.15*273.15)
  256. RHOW = 997.
  257. RHOI = 500.
  258. RHOSN = 100.
  259. IF (IHAIL.EQ.0) THEN
  260. RHOG = 400.
  261. ELSE
  262. RHOG = 900.
  263. END IF
  264. AIMM = 0.66
  265. BIMM = 100.
  266. ECR = 1.
  267. DCS = 125.E-6
  268. MI0 = 4./3.*PI*RHOI*(10.E-6)**3
  269. MG0 = 1.6E-10
  270. F1S = 0.86
  271. F2S = 0.28
  272. F1R = 0.78
  273. ! F2R = 0.32
  274. ! fix 053011
  275. F2R = 0.308
  276. ! G = 9.806
  277. QSMALL = 1.E-14
  278. EII = 0.1
  279. ECI = 0.7
  280. ! HM, ADD FOR V3.2
  281. CPW = 4218.
  282. ! SIZE DISTRIBUTION PARAMETERS
  283. CI = RHOI*PI/6.
  284. DI = 3.
  285. CS = RHOSN*PI/6.
  286. DS = 3.
  287. CG = RHOG*PI/6.
  288. DG = 3.
  289. ! RADIUS OF CONTACT NUCLEI
  290. RIN = 0.1E-6
  291. MMULT = 4./3.*PI*RHOI*(5.E-6)**3
  292. ! SIZE LIMITS FOR LAMBDA
  293. LAMMAXI = 1./1.E-6
  294. LAMMINI = 1./(2.*DCS+100.E-6)
  295. LAMMAXR = 1./20.E-6
  296. ! LAMMINR = 1./500.E-6
  297. LAMMINR = 1./2800.E-6
  298. LAMMAXS = 1./10.E-6
  299. LAMMINS = 1./2000.E-6
  300. LAMMAXG = 1./20.E-6
  301. LAMMING = 1./2000.E-6
  302. ! CCN SPECTRA FOR IACT = 1
  303. ! MARITIME
  304. ! MODIFIED FROM RASMUSSEN ET AL. 2002
  305. ! NCCN = C*S^K, NCCN IS IN CM-3, S IS SUPERSATURATION RATIO IN %
  306. K1 = 0.4
  307. C1 = 120.
  308. ! CONTINENTAL
  309. ! K1 = 0.5
  310. ! C1 = 1000.
  311. ! AEROSOL ACTIVATION PARAMETERS FOR IACT = 2
  312. ! PARAMETERS CURRENTLY SET FOR AMMONIUM SULFATE
  313. MW = 0.018
  314. OSM = 1.
  315. VI = 3.
  316. EPSM = 0.7
  317. RHOA = 1777.
  318. MAP = 0.132
  319. MA = 0.0284
  320. RR = 8.3187
  321. BACT = VI*OSM*EPSM*MW*RHOA/(MAP*RHOW)
  322. ! AEROSOL SIZE DISTRIBUTION PARAMETERS CURRENTLY SET FOR MPACE
  323. ! (see morrison et al. 2007, JGR)
  324. ! MODE 1
  325. RM1 = 0.052E-6
  326. SIG1 = 2.04
  327. NANEW1 = 72.2E6
  328. F11 = 0.5*EXP(2.5*(LOG(SIG1))**2)
  329. F21 = 1.+0.25*LOG(SIG1)
  330. ! MODE 2
  331. RM2 = 1.3E-6
  332. SIG2 = 2.5
  333. NANEW2 = 1.8E6
  334. F12 = 0.5*EXP(2.5*(LOG(SIG2))**2)
  335. F22 = 1.+0.25*LOG(SIG2)
  336. ! CONSTANTS FOR EFFICIENCY
  337. CONS1=GAMMA(1.+DS)*CS
  338. CONS2=GAMMA(1.+DG)*CG
  339. CONS3=GAMMA(4.+BS)/6.
  340. CONS4=GAMMA(4.+BR)/6.
  341. CONS5=GAMMA(1.+BS)
  342. CONS6=GAMMA(1.+BR)
  343. CONS7=GAMMA(4.+BG)/6.
  344. CONS8=GAMMA(1.+BG)
  345. CONS9=GAMMA(5./2.+BR/2.)
  346. CONS10=GAMMA(5./2.+BS/2.)
  347. CONS11=GAMMA(5./2.+BG/2.)
  348. CONS12=GAMMA(1.+DI)*CI
  349. CONS13=GAMMA(BS+3.)*PI/4.*ECI
  350. CONS14=GAMMA(BG+3.)*PI/4.*ECI
  351. CONS15=-1108.*EII*PI**((1.-BS)/3.)*RHOSN**((-2.-BS)/3.)/(4.*720.)
  352. CONS16=GAMMA(BI+3.)*PI/4.*ECI
  353. CONS17=4.*2.*3.*RHOSU*PI*ECI*ECI*GAMMA(2.*BS+2.)/(8.*(RHOG-RHOSN))
  354. CONS18=RHOSN*RHOSN
  355. CONS19=RHOW*RHOW
  356. CONS20=20.*PI*PI*RHOW*BIMM
  357. CONS21=4./(DCS*RHOI)
  358. CONS22=PI*RHOI*DCS**3/6.
  359. CONS23=PI/4.*EII*GAMMA(BS+3.)
  360. CONS24=PI/4.*ECR*GAMMA(BR+3.)
  361. CONS25=PI*PI/24.*RHOW*ECR*GAMMA(BR+6.)
  362. CONS26=PI/6.*RHOW
  363. CONS27=GAMMA(1.+BI)
  364. CONS28=GAMMA(4.+BI)/6.
  365. CONS29=4./3.*PI*RHOW*(25.E-6)**3
  366. CONS30=4./3.*PI*RHOW
  367. CONS31=PI*PI*ECR*RHOSN
  368. CONS32=PI/2.*ECR
  369. CONS33=PI*PI*ECR*RHOG
  370. CONS34=5./2.+BR/2.
  371. CONS35=5./2.+BS/2.
  372. CONS36=5./2.+BG/2.
  373. CONS37=4.*PI*1.38E-23/(6.*PI*RIN)
  374. CONS38=PI*PI/3.*RHOW
  375. CONS39=PI*PI/36.*RHOW*BIMM
  376. CONS40=PI/6.*BIMM
  377. CONS41=PI*PI*ECR*RHOW
  378. END SUBROUTINE MORR_TWO_MOMENT_INIT
  379. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  380. ! THIS SUBROUTINE IS MAIN INTERFACE WITH THE TWO-MOMENT MICROPHYSICS SCHEME
  381. ! THIS INTERFACE TAKES IN 3D VARIABLES FROM DRIVER MODEL, CONVERTS TO 1D FOR
  382. ! CALL TO THE MAIN MICROPHYSICS SUBROUTINE (SUBROUTINE MORR_TWO_MOMENT_MICRO)
  383. ! WHICH OPERATES ON 1D VERTICAL COLUMNS.
  384. ! 1D VARIABLES FROM THE MAIN MICROPHYSICS SUBROUTINE ARE THEN REASSIGNED BACK TO 3D FOR OUTPUT
  385. ! BACK TO DRIVER MODEL USING THIS INTERFACE.
  386. ! MICROPHYSICS TENDENCIES ARE ADDED TO VARIABLES HERE BEFORE BEING PASSED BACK TO DRIVER MODEL.
  387. ! THIS CODE WAS WRITTEN BY HUGH MORRISON (NCAR) AND SLAVA TATARSKII (GEORGIA TECH).
  388. ! FOR QUESTIONS, CONTACT: HUGH MORRISON, E-MAIL: MORRISON@UCAR.EDU, PHONE:303-497-8916
  389. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  390. SUBROUTINE MP_MORR_TWO_MOMENT(ITIMESTEP, &
  391. TH, QV, QC, QR, QI, QS, QG, NI, NS, NR, NG, &
  392. RHO, PII, P, DT_IN, DZ, HT, W, &
  393. RAINNC, RAINNCV, SR, &
  394. qrcuten, qscuten, qicuten, mu & ! hm added
  395. ,F_QNDROP, qndrop & ! hm added, wrf-chem
  396. ,IDS,IDE, JDS,JDE, KDS,KDE & ! domain dims
  397. ,IMS,IME, JMS,JME, KMS,KME & ! memory dims
  398. ,ITS,ITE, JTS,JTE, KTS,KTE & ! tile dims )
  399. !jdf ,C2PREC3D,CSED3D,ISED3D,SSED3D,GSED3D,RSED3D & ! HM ADD, WRF-CHEM
  400. ,QLSINK,PRECR,PRECI,PRECS,PRECG & ! HM ADD, WRF-CHEM
  401. )
  402. ! QV - water vapor mixing ratio (kg/kg)
  403. ! QC - cloud water mixing ratio (kg/kg)
  404. ! QR - rain water mixing ratio (kg/kg)
  405. ! QI - cloud ice mixing ratio (kg/kg)
  406. ! QS - snow mixing ratio (kg/kg)
  407. ! QG - graupel mixing ratio (KG/KG)
  408. ! NI - cloud ice number concentration (1/kg)
  409. ! NS - Snow Number concentration (1/kg)
  410. ! NR - Rain Number concentration (1/kg)
  411. ! NG - Graupel number concentration (1/kg)
  412. ! NOTE: RHO AND HT NOT USED BY THIS SCHEME AND DO NOT NEED TO BE PASSED INTO SCHEME!!!!
  413. ! P - AIR PRESSURE (PA)
  414. ! W - VERTICAL AIR VELOCITY (M/S)
  415. ! TH - POTENTIAL TEMPERATURE (K)
  416. ! PII - exner function - used to convert potential temp to temp
  417. ! DZ - difference in height over interface (m)
  418. ! DT_IN - model time step (sec)
  419. ! ITIMESTEP - time step counter
  420. ! RAINNC - accumulated grid-scale precipitation (mm)
  421. ! RAINNCV - one time step grid scale precipitation (mm/time step)
  422. ! SR - one time step mass ratio of snow to total precip
  423. ! qrcuten, rain tendency from parameterized cumulus convection
  424. ! qscuten, snow tendency from parameterized cumulus convection
  425. ! qicuten, cloud ice tendency from parameterized cumulus convection
  426. ! variables below currently not in use, not coupled to PBL or radiation codes
  427. ! TKE - turbulence kinetic energy (m^2 s-2), NEEDED FOR DROPLET ACTIVATION (SEE CODE BELOW)
  428. ! NCTEND - droplet concentration tendency from pbl (kg-1 s-1)
  429. ! NCTEND - CLOUD ICE concentration tendency from pbl (kg-1 s-1)
  430. ! KZH - heat eddy diffusion coefficient from YSU scheme (M^2 S-1), NEEDED FOR DROPLET ACTIVATION (SEE CODE BELOW)
  431. ! EFFCS - CLOUD DROPLET EFFECTIVE RADIUS OUTPUT TO RADIATION CODE (micron)
  432. ! EFFIS - CLOUD DROPLET EFFECTIVE RADIUS OUTPUT TO RADIATION CODE (micron)
  433. ! HM, ADDED FOR WRF-CHEM COUPLING
  434. ! QLSINK - TENDENCY OF CLOUD WATER TO RAIN, SNOW, GRAUPEL (KG/KG/S)
  435. ! CSED,ISED,SSED,GSED,RSED - SEDIMENTATION FLUXES (KG/M^2/S) FOR CLOUD WATER, ICE, SNOW, GRAUPEL, RAIN
  436. ! PRECI,PRECS,PRECG,PRECR - SEDIMENTATION FLUXES (KG/M^2/S) FOR ICE, SNOW, GRAUPEL, RAIN
  437. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  438. ! reflectivity currently not included!!!!
  439. ! REFL_10CM - CALCULATED RADAR REFLECTIVITY AT 10 CM (DBZ)
  440. !................................
  441. ! GRID_CLOCK, GRID_ALARMS - parameters to limit radar reflectivity calculation only when needed
  442. ! otherwise radar reflectivity calculation every time step is too slow
  443. ! only needed for coupling with WRF, see code below for details
  444. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  445. ! EFFC - DROPLET EFFECTIVE RADIUS (MICRON)
  446. ! EFFR - RAIN EFFECTIVE RADIUS (MICRON)
  447. ! EFFS - SNOW EFFECTIVE RADIUS (MICRON)
  448. ! EFFI - CLOUD ICE EFFECTIVE RADIUS (MICRON)
  449. ! ADDITIONAL OUTPUT FROM MICRO - SEDIMENTATION TENDENCIES, NEEDED FOR LIQUID-ICE STATIC ENERGY
  450. ! QGSTEN - GRAUPEL SEDIMENTATION TEND (KG/KG/S)
  451. ! QRSTEN - RAIN SEDIMENTATION TEND (KG/KG/S)
  452. ! QISTEN - CLOUD ICE SEDIMENTATION TEND (KG/KG/S)
  453. ! QNISTEN - SNOW SEDIMENTATION TEND (KG/KG/S)
  454. ! QCSTEN - CLOUD WATER SEDIMENTATION TEND (KG/KG/S)
  455. ! WVAR - STANDARD DEVIATION OF SUB-GRID VERTICAL VELOCITY (M/S)
  456. IMPLICIT NONE
  457. INTEGER, INTENT(IN ) :: ids, ide, jds, jde, kds, kde , &
  458. ims, ime, jms, jme, kms, kme , &
  459. its, ite, jts, jte, kts, kte
  460. ! Temporary changed from INOUT to IN
  461. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
  462. qv, qc, qr, qi, qs, qg, ni, ns, nr, TH, NG
  463. !jdf qndrop ! hm added, wrf-chem
  464. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT):: qndrop
  465. !jdf REAL, DIMENSION(ims:ime, kms:kme, jms:jme),INTENT(INOUT):: CSED3D, &
  466. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT):: QLSINK, &
  467. PRECI,PRECS,PRECG,PRECR ! HM, WRF-CHEM
  468. !, effcs, effis
  469. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
  470. pii, p, dz, rho, w !, tke, nctend, nitend,kzh
  471. REAL, INTENT(IN):: dt_in
  472. INTEGER, INTENT(IN):: ITIMESTEP
  473. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: &
  474. RAINNC, RAINNCV, SR
  475. ! REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: & ! GT
  476. ! refl_10cm
  477. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: ht
  478. ! TYPE (WRFU_Clock):: grid_clock ! GT
  479. ! TYPE (WRFU_Alarm), POINTER:: grid_alarms(:) ! GT
  480. ! LOCAL VARIABLES
  481. REAL, DIMENSION(its:ite, kts:kte, jts:jte):: &
  482. effi, effs, effr, EFFG
  483. REAL, DIMENSION(its:ite, kts:kte, jts:jte):: &
  484. T, WVAR, EFFC
  485. REAL, DIMENSION(kts:kte) :: &
  486. QC_TEND1D, QI_TEND1D, QNI_TEND1D, QR_TEND1D, &
  487. NI_TEND1D, NS_TEND1D, NR_TEND1D, &
  488. QC1D, QI1D, QR1D,NI1D, NS1D, NR1D, QS1D, &
  489. T_TEND1D,QV_TEND1D, T1D, QV1D, P1D, W1D, WVAR1D, &
  490. EFFC1D, EFFI1D, EFFS1D, EFFR1D,DZ1D, &
  491. ! HM ADD GRAUPEL
  492. QG_TEND1D, NG_TEND1D, QG1D, NG1D, EFFG1D, &
  493. ! ADD SEDIMENTATION TENDENCIES (UNITS OF KG/KG/S)
  494. QGSTEN,QRSTEN, QISTEN, QNISTEN, QCSTEN, &
  495. ! ADD CUMULUS TENDENCIES
  496. QRCU1D, QSCU1D, QICU1D
  497. ! add cumulus tendencies
  498. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
  499. qrcuten, qscuten, qicuten
  500. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN):: &
  501. mu
  502. LOGICAL, INTENT(IN), OPTIONAL :: F_QNDROP ! wrf-chem
  503. LOGICAL :: flag_qndrop ! wrf-chem
  504. integer :: iinum ! wrf-chem
  505. ! wrf-chem
  506. REAL, DIMENSION(kts:kte) :: nc1d, nc_tend1d,C2PREC,CSED,ISED,SSED,GSED,RSED
  507. ! HM add reflectivity
  508. ! dbz
  509. REAL PRECPRT1D, SNOWRT1D
  510. INTEGER I,K,J
  511. REAL DT
  512. ! LOGICAL:: dBZ_tstep ! GT
  513. ! below for wrf-chem
  514. flag_qndrop = .false.
  515. IF ( PRESENT ( f_qndrop ) ) flag_qndrop = f_qndrop
  516. !!!!!!!!!!!!!!!!!!!!!!
  517. ! Initialize tendencies (all set to 0) and transfer
  518. ! array to local variables
  519. DT = DT_IN
  520. DO I=ITS,ITE
  521. DO J=JTS,JTE
  522. DO K=KTS,KTE
  523. T(I,K,J) = TH(i,k,j)*PII(i,k,j)
  524. ! NOTE: WVAR NOT CURRENTLY USED IN CODE !!!!!!!!!!
  525. ! currently assign wvar to 0.5 m/s (not coupled with PBL scheme)
  526. WVAR(I,K,J) = 0.5
  527. ! currently mixing of number concentrations also is neglected (not coupled with PBL schemes)
  528. END DO
  529. END DO
  530. END DO
  531. do i=its,ite ! i loop (east-west)
  532. do j=jts,jte ! j loop (north-south)
  533. !
  534. ! Transfer 3D arrays into 1D for microphysical calculations
  535. !
  536. ! hm , initialize 1d tendency arrays to zero
  537. do k=kts,kte ! k loop (vertical)
  538. QC_TEND1D(k) = 0.
  539. QI_TEND1D(k) = 0.
  540. QNI_TEND1D(k) = 0.
  541. QR_TEND1D(k) = 0.
  542. NI_TEND1D(k) = 0.
  543. NS_TEND1D(k) = 0.
  544. NR_TEND1D(k) = 0.
  545. T_TEND1D(k) = 0.
  546. QV_TEND1D(k) = 0.
  547. nc_tend1d(k) = 0. ! wrf-chem
  548. QC1D(k) = QC(i,k,j)
  549. QI1D(k) = QI(i,k,j)
  550. QS1D(k) = QS(i,k,j)
  551. QR1D(k) = QR(i,k,j)
  552. NI1D(k) = NI(i,k,j)
  553. NS1D(k) = NS(i,k,j)
  554. NR1D(k) = NR(i,k,j)
  555. ! HM ADD GRAUPEL
  556. QG1D(K) = QG(I,K,j)
  557. NG1D(K) = NG(I,K,j)
  558. QG_TEND1D(K) = 0.
  559. NG_TEND1D(K) = 0.
  560. T1D(k) = T(i,k,j)
  561. QV1D(k) = QV(i,k,j)
  562. P1D(k) = P(i,k,j)
  563. DZ1D(k) = DZ(i,k,j)
  564. W1D(k) = W(i,k,j)
  565. WVAR1D(k) = WVAR(i,k,j)
  566. ! add cumulus tendencies, decouple from mu
  567. qrcu1d(k) = qrcuten(i,k,j)/mu(i,j)
  568. qscu1d(k) = qscuten(i,k,j)/mu(i,j)
  569. qicu1d(k) = qicuten(i,k,j)/mu(i,j)
  570. end do !jdf added this
  571. ! below for wrf-chem
  572. IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
  573. iact = 3
  574. DO k = kts, kte
  575. nc1d(k)=qndrop(i,k,j)
  576. iinum=0
  577. ENDDO
  578. ELSE
  579. DO k = kts, kte
  580. nc1d(k)=0. ! temporary placeholder, set to constant in microphysics subroutine
  581. iinum=1
  582. ENDDO
  583. ENDIF
  584. !jdf end do
  585. call MORR_TWO_MOMENT_MICRO(QC_TEND1D, QI_TEND1D, QNI_TEND1D, QR_TEND1D, &
  586. NI_TEND1D, NS_TEND1D, NR_TEND1D, &
  587. QC1D, QI1D, QS1D, QR1D,NI1D, NS1D, NR1D, &
  588. T_TEND1D,QV_TEND1D, T1D, QV1D, P1D, DZ1D, W1D, WVAR1D, &
  589. PRECPRT1D,SNOWRT1D, &
  590. EFFC1D,EFFI1D,EFFS1D,EFFR1D,DT, &
  591. IMS,IME, JMS,JME, KMS,KME, &
  592. ITS,ITE, JTS,JTE, KTS,KTE, & ! HM ADD GRAUPEL
  593. QG_TEND1D,NG_TEND1D,QG1D,NG1D,EFFG1D, &
  594. qrcu1d, qscu1d, qicu1d, &
  595. ! ADD SEDIMENTATION TENDENCIES
  596. QGSTEN,QRSTEN,QISTEN,QNISTEN,QCSTEN, &
  597. nc1d, nc_tend1d, iinum, C2PREC,CSED,ISED,SSED,GSED,RSED & !wrf-chem
  598. )
  599. !
  600. ! Transfer 1D arrays back into 3D arrays
  601. !
  602. do k=kts,kte
  603. ! hm, add tendencies to update global variables
  604. ! HM, TENDENCIES FOR Q AND N NOW ADDED IN M2005MICRO, SO WE
  605. ! ONLY NEED TO TRANSFER 1D VARIABLES BACK TO 3D
  606. QC(i,k,j) = QC1D(k)
  607. QI(i,k,j) = QI1D(k)
  608. QS(i,k,j) = QS1D(k)
  609. QR(i,k,j) = QR1D(k)
  610. NI(i,k,j) = NI1D(k)
  611. NS(i,k,j) = NS1D(k)
  612. NR(i,k,j) = NR1D(k)
  613. QG(I,K,j) = QG1D(K)
  614. NG(I,K,j) = NG1D(K)
  615. T(i,k,j) = T1D(k)
  616. TH(I,K,J) = T(i,k,j)/PII(i,k,j) ! CONVERT TEMP BACK TO POTENTIAL TEMP
  617. QV(i,k,j) = QV1D(k)
  618. EFFC(i,k,j) = EFFC1D(k)
  619. EFFI(i,k,j) = EFFI1D(k)
  620. EFFS(i,k,j) = EFFS1D(k)
  621. EFFR(i,k,j) = EFFR1D(k)
  622. EFFG(I,K,j) = EFFG1D(K)
  623. ! wrf-chem
  624. IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
  625. qndrop(i,k,j) = nc1d(k)
  626. !jdf CSED3D(I,K,J) = CSED(K)
  627. END IF
  628. IF ( PRESENT( QLSINK ) ) THEN
  629. if(qc(i,k,j)>1.e-10) then
  630. QLSINK(I,K,J) = C2PREC(K)/QC(I,K,J)
  631. else
  632. QLSINK(I,K,J) = 0.0
  633. endif
  634. END IF
  635. IF ( PRESENT( PRECR ) ) PRECR(I,K,J) = RSED(K)
  636. IF ( PRESENT( PRECI ) ) PRECI(I,K,J) = ISED(K)
  637. IF ( PRESENT( PRECS ) ) PRECS(I,K,J) = SSED(K)
  638. IF ( PRESENT( PRECG ) ) PRECG(I,K,J) = GSED(K)
  639. ! EFFECTIVE RADIUS FOR RADIATION CODE (currently not coupled)
  640. ! HM, ADD LIMIT TO PREVENT BLOWING UP OPTICAL PROPERTIES, 8/18/07
  641. ! EFFCS(I,K,J) = MIN(EFFC(I,K,J),50.)
  642. ! EFFCS(I,K,J) = MAX(EFFCS(I,K,J),1.)
  643. ! EFFIS(I,K,J) = MIN(EFFI(I,K,J),130.)
  644. ! EFFIS(I,K,J) = MAX(EFFIS(I,K,J),13.)
  645. end do
  646. ! hm modified so that m2005 precip variables correctly match wrf precip variables
  647. RAINNC(i,j) = RAINNC(I,J)+PRECPRT1D
  648. RAINNCV(i,j) = PRECPRT1D
  649. SR(i,j) = SNOWRT1D/(PRECPRT1D+1.E-12)
  650. end do
  651. end do
  652. END SUBROUTINE MP_MORR_TWO_MOMENT
  653. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  654. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  655. SUBROUTINE MORR_TWO_MOMENT_MICRO(QC3DTEN,QI3DTEN,QNI3DTEN,QR3DTEN, &
  656. NI3DTEN,NS3DTEN,NR3DTEN,QC3D,QI3D,QNI3D,QR3D,NI3D,NS3D,NR3D, &
  657. T3DTEN,QV3DTEN,T3D,QV3D,PRES,DZQ,W3D,WVAR,PRECRT,SNOWRT, &
  658. EFFC,EFFI,EFFS,EFFR,DT, &
  659. IMS,IME, JMS,JME, KMS,KME, &
  660. ITS,ITE, JTS,JTE, KTS,KTE, & ! ADD GRAUPEL
  661. QG3DTEN,NG3DTEN,QG3D,NG3D,EFFG,qrcu1d,qscu1d, qicu1d, &
  662. QGSTEN,QRSTEN,QISTEN,QNISTEN,QCSTEN, &
  663. nc3d,nc3dten,iinum, & ! wrf-chem
  664. c2prec,CSED,ISED,SSED,GSED,RSED & ! hm added, wrf-chem
  665. )
  666. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  667. ! THIS PROGRAM IS THE MAIN TWO-MOMENT MICROPHYSICS SUBROUTINE DESCRIBED BY
  668. ! MORRISON ET AL. 2005 JAS; MORRISON AND PINTO 2005 JAS.
  669. ! ADDITIONAL CHANGES ARE DESCRIBED IN DETAIL BY MORRISON, THOMPSON, TATARSKII (MWR, SUBMITTED)
  670. ! THIS SCHEME IS A BULK DOUBLE-MOMENT SCHEME THAT PREDICTS MIXING
  671. ! RATIOS AND NUMBER CONCENTRATIONS OF FIVE HYDROMETEOR SPECIES:
  672. ! CLOUD DROPLETS, CLOUD (SMALL) ICE, RAIN, SNOW, AND GRAUPEL.
  673. ! CODE STRUCTURE: MAIN SUBROUTINE IS 'MORR_TWO_MOMENT'. ALSO INCLUDED IN THIS FILE IS
  674. ! 'FUNCTION POLYSVP', 'FUNCTION DERF1', AND
  675. ! 'FUNCTION GAMMA'.
  676. ! NOTE: THIS SUBROUTINE USES 1D ARRAY IN VERTICAL (COLUMN), EVEN THOUGH VARIABLES ARE CALLED '3D'......
  677. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  678. ! DECLARATIONS
  679. IMPLICIT NONE
  680. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  681. ! THESE VARIABLES BELOW MUST BE LINKED WITH THE MAIN MODEL.
  682. ! DEFINE ARRAY SIZES
  683. ! INPUT NUMBER OF GRID CELLS
  684. ! INPUT/OUTPUT PARAMETERS ! DESCRIPTION (UNITS)
  685. INTEGER, INTENT( IN) :: IMS,IME, JMS,JME, KMS,KME, &
  686. ITS,ITE, JTS,JTE, KTS,KTE
  687. REAL, DIMENSION(KTS:KTE) :: QC3DTEN ! CLOUD WATER MIXING RATIO TENDENCY (KG/KG/S)
  688. REAL, DIMENSION(KTS:KTE) :: QI3DTEN ! CLOUD ICE MIXING RATIO TENDENCY (KG/KG/S)
  689. REAL, DIMENSION(KTS:KTE) :: QNI3DTEN ! SNOW MIXING RATIO TENDENCY (KG/KG/S)
  690. REAL, DIMENSION(KTS:KTE) :: QR3DTEN ! RAIN MIXING RATIO TENDENCY (KG/KG/S)
  691. REAL, DIMENSION(KTS:KTE) :: NI3DTEN ! CLOUD ICE NUMBER CONCENTRATION (1/KG/S)
  692. REAL, DIMENSION(KTS:KTE) :: NS3DTEN ! SNOW NUMBER CONCENTRATION (1/KG/S)
  693. REAL, DIMENSION(KTS:KTE) :: NR3DTEN ! RAIN NUMBER CONCENTRATION (1/KG/S)
  694. REAL, DIMENSION(KTS:KTE) :: QC3D ! CLOUD WATER MIXING RATIO (KG/KG)
  695. REAL, DIMENSION(KTS:KTE) :: QI3D ! CLOUD ICE MIXING RATIO (KG/KG)
  696. REAL, DIMENSION(KTS:KTE) :: QNI3D ! SNOW MIXING RATIO (KG/KG)
  697. REAL, DIMENSION(KTS:KTE) :: QR3D ! RAIN MIXING RATIO (KG/KG)
  698. REAL, DIMENSION(KTS:KTE) :: NI3D ! CLOUD ICE NUMBER CONCENTRATION (1/KG)
  699. REAL, DIMENSION(KTS:KTE) :: NS3D ! SNOW NUMBER CONCENTRATION (1/KG)
  700. REAL, DIMENSION(KTS:KTE) :: NR3D ! RAIN NUMBER CONCENTRATION (1/KG)
  701. REAL, DIMENSION(KTS:KTE) :: T3DTEN ! TEMPERATURE TENDENCY (K/S)
  702. REAL, DIMENSION(KTS:KTE) :: QV3DTEN ! WATER VAPOR MIXING RATIO TENDENCY (KG/KG/S)
  703. REAL, DIMENSION(KTS:KTE) :: T3D ! TEMPERATURE (K)
  704. REAL, DIMENSION(KTS:KTE) :: QV3D ! WATER VAPOR MIXING RATIO (KG/KG)
  705. REAL, DIMENSION(KTS:KTE) :: PRES ! ATMOSPHERIC PRESSURE (PA)
  706. REAL, DIMENSION(KTS:KTE) :: DZQ ! DIFFERENCE IN HEIGHT ACROSS LEVEL (m)
  707. REAL, DIMENSION(KTS:KTE) :: W3D ! GRID-SCALE VERTICAL VELOCITY (M/S)
  708. REAL, DIMENSION(KTS:KTE) :: WVAR ! SUB-GRID VERTICAL VELOCITY (M/S)
  709. ! below for wrf-chem
  710. REAL, DIMENSION(KTS:KTE) :: nc3d
  711. REAL, DIMENSION(KTS:KTE) :: nc3dten
  712. integer, intent(in) :: iinum
  713. ! HM ADDED GRAUPEL VARIABLES
  714. REAL, DIMENSION(KTS:KTE) :: QG3DTEN ! GRAUPEL MIX RATIO TENDENCY (KG/KG/S)
  715. REAL, DIMENSION(KTS:KTE) :: NG3DTEN ! GRAUPEL NUMB CONC TENDENCY (1/KG/S)
  716. REAL, DIMENSION(KTS:KTE) :: QG3D ! GRAUPEL MIX RATIO (KG/KG)
  717. REAL, DIMENSION(KTS:KTE) :: NG3D ! GRAUPEL NUMBER CONC (1/KG)
  718. ! HM, ADD 1/16/07, SEDIMENTATION TENDENCIES FOR MIXING RATIO
  719. REAL, DIMENSION(KTS:KTE) :: QGSTEN ! GRAUPEL SED TEND (KG/KG/S)
  720. REAL, DIMENSION(KTS:KTE) :: QRSTEN ! RAIN SED TEND (KG/KG/S)
  721. REAL, DIMENSION(KTS:KTE) :: QISTEN ! CLOUD ICE SED TEND (KG/KG/S)
  722. REAL, DIMENSION(KTS:KTE) :: QNISTEN ! SNOW SED TEND (KG/KG/S)
  723. REAL, DIMENSION(KTS:KTE) :: QCSTEN ! CLOUD WAT SED TEND (KG/KG/S)
  724. ! hm add cumulus tendencies for precip
  725. REAL, DIMENSION(KTS:KTE) :: qrcu1d
  726. REAL, DIMENSION(KTS:KTE) :: qscu1d
  727. REAL, DIMENSION(KTS:KTE) :: qicu1d
  728. ! OUTPUT VARIABLES
  729. REAL PRECRT ! TOTAL PRECIP PER TIME STEP (mm)
  730. REAL SNOWRT ! SNOW PER TIME STEP (mm)
  731. REAL, DIMENSION(KTS:KTE) :: EFFC ! DROPLET EFFECTIVE RADIUS (MICRON)
  732. REAL, DIMENSION(KTS:KTE) :: EFFI ! CLOUD ICE EFFECTIVE RADIUS (MICRON)
  733. REAL, DIMENSION(KTS:KTE) :: EFFS ! SNOW EFFECTIVE RADIUS (MICRON)
  734. REAL, DIMENSION(KTS:KTE) :: EFFR ! RAIN EFFECTIVE RADIUS (MICRON)
  735. REAL, DIMENSION(KTS:KTE) :: EFFG ! GRAUPEL EFFECTIVE RADIUS (MICRON)
  736. ! MODEL INPUT PARAMETERS (FORMERLY IN COMMON BLOCKS)
  737. REAL DT ! MODEL TIME STEP (SEC)
  738. !.....................................................................................................
  739. ! LOCAL VARIABLES: ALL PARAMETERS BELOW ARE LOCAL TO SCHEME AND DON'T NEED TO COMMUNICATE WITH THE
  740. ! REST OF THE MODEL.
  741. ! SIZE PARAMETER VARIABLES
  742. REAL, DIMENSION(KTS:KTE) :: LAMC ! SLOPE PARAMETER FOR DROPLETS (M-1)
  743. REAL, DIMENSION(KTS:KTE) :: LAMI ! SLOPE PARAMETER FOR CLOUD ICE (M-1)
  744. REAL, DIMENSION(KTS:KTE) :: LAMS ! SLOPE PARAMETER FOR SNOW (M-1)
  745. REAL, DIMENSION(KTS:KTE) :: LAMR ! SLOPE PARAMETER FOR RAIN (M-1)
  746. REAL, DIMENSION(KTS:KTE) :: LAMG ! SLOPE PARAMETER FOR GRAUPEL (M-1)
  747. REAL, DIMENSION(KTS:KTE) :: CDIST1 ! PSD PARAMETER FOR DROPLETS
  748. REAL, DIMENSION(KTS:KTE) :: N0I ! INTERCEPT PARAMETER FOR CLOUD ICE (KG-1 M-1)
  749. REAL, DIMENSION(KTS:KTE) :: N0S ! INTERCEPT PARAMETER FOR SNOW (KG-1 M-1)
  750. REAL, DIMENSION(KTS:KTE) :: N0RR ! INTERCEPT PARAMETER FOR RAIN (KG-1 M-1)
  751. REAL, DIMENSION(KTS:KTE) :: N0G ! INTERCEPT PARAMETER FOR GRAUPEL (KG-1 M-1)
  752. REAL, DIMENSION(KTS:KTE) :: PGAM ! SPECTRAL SHAPE PARAMETER FOR DROPLETS
  753. ! MICROPHYSICAL PROCESSES
  754. REAL, DIMENSION(KTS:KTE) :: NSUBC ! LOSS OF NC DURING EVAP
  755. REAL, DIMENSION(KTS:KTE) :: NSUBI ! LOSS OF NI DURING SUB.
  756. REAL, DIMENSION(KTS:KTE) :: NSUBS ! LOSS OF NS DURING SUB.
  757. REAL, DIMENSION(KTS:KTE) :: NSUBR ! LOSS OF NR DURING EVAP
  758. REAL, DIMENSION(KTS:KTE) :: PRD ! DEP CLOUD ICE
  759. REAL, DIMENSION(KTS:KTE) :: PRE ! EVAP OF RAIN
  760. REAL, DIMENSION(KTS:KTE) :: PRDS ! DEP SNOW
  761. REAL, DIMENSION(KTS:KTE) :: NNUCCC ! CHANGE N DUE TO CONTACT FREEZ DROPLETS
  762. REAL, DIMENSION(KTS:KTE) :: MNUCCC ! CHANGE Q DUE TO CONTACT FREEZ DROPLETS
  763. REAL, DIMENSION(KTS:KTE) :: PRA ! ACCRETION DROPLETS BY RAIN
  764. REAL, DIMENSION(KTS:KTE) :: PRC ! AUTOCONVERSION DROPLETS
  765. REAL, DIMENSION(KTS:KTE) :: PCC ! COND/EVAP DROPLETS
  766. REAL, DIMENSION(KTS:KTE) :: NNUCCD ! CHANGE N FREEZING AEROSOL (PRIM ICE NUCLEATION)
  767. REAL, DIMENSION(KTS:KTE) :: MNUCCD ! CHANGE Q FREEZING AEROSOL (PRIM ICE NUCLEATION)
  768. REAL, DIMENSION(KTS:KTE) :: MNUCCR ! CHANGE Q DUE TO CONTACT FREEZ RAIN
  769. REAL, DIMENSION(KTS:KTE) :: NNUCCR ! CHANGE N DUE TO CONTACT FREEZ RAIN
  770. REAL, DIMENSION(KTS:KTE) :: NPRA ! CHANGE IN N DUE TO DROPLET ACC BY RAIN
  771. REAL, DIMENSION(KTS:KTE) :: NRAGG ! SELF-COLLECTION OF RAIN
  772. REAL, DIMENSION(KTS:KTE) :: NSAGG ! SELF-COLLECTION OF SNOW
  773. REAL, DIMENSION(KTS:KTE) :: NPRC ! CHANGE NC AUTOCONVERSION DROPLETS
  774. REAL, DIMENSION(KTS:KTE) :: NPRC1 ! CHANGE NR AUTOCONVERSION DROPLETS
  775. REAL, DIMENSION(KTS:KTE) :: PRAI ! CHANGE Q AUTOCONVERSION CLOUD ICE
  776. REAL, DIMENSION(KTS:KTE) :: PRCI ! CHANGE Q ACCRETION CLOUD ICE BY SNOW
  777. REAL, DIMENSION(KTS:KTE) :: PSACWS ! CHANGE Q DROPLET ACCRETION BY SNOW
  778. REAL, DIMENSION(KTS:KTE) :: NPSACWS ! CHANGE N DROPLET ACCRETION BY SNOW
  779. REAL, DIMENSION(KTS:KTE) :: PSACWI ! CHANGE Q DROPLET ACCRETION BY CLOUD ICE
  780. REAL, DIMENSION(KTS:KTE) :: NPSACWI ! CHANGE N DROPLET ACCRETION BY CLOUD ICE
  781. REAL, DIMENSION(KTS:KTE) :: NPRCI ! CHANGE N AUTOCONVERSION CLOUD ICE BY SNOW
  782. REAL, DIMENSION(KTS:KTE) :: NPRAI ! CHANGE N ACCRETION CLOUD ICE
  783. REAL, DIMENSION(KTS:KTE) :: NMULTS ! ICE MULT DUE TO RIMING DROPLETS BY SNOW
  784. REAL, DIMENSION(KTS:KTE) :: NMULTR ! ICE MULT DUE TO RIMING RAIN BY SNOW
  785. REAL, DIMENSION(KTS:KTE) :: QMULTS ! CHANGE Q DUE TO ICE MULT DROPLETS/SNOW
  786. REAL, DIMENSION(KTS:KTE) :: QMULTR ! CHANGE Q DUE TO ICE RAIN/SNOW
  787. REAL, DIMENSION(KTS:KTE) :: PRACS ! CHANGE Q RAIN-SNOW COLLECTION
  788. REAL, DIMENSION(KTS:KTE) :: NPRACS ! CHANGE N RAIN-SNOW COLLECTION
  789. REAL, DIMENSION(KTS:KTE) :: PCCN ! CHANGE Q DROPLET ACTIVATION
  790. REAL, DIMENSION(KTS:KTE) :: PSMLT ! CHANGE Q MELTING SNOW TO RAIN
  791. REAL, DIMENSION(KTS:KTE) :: EVPMS ! CHNAGE Q MELTING SNOW EVAPORATING
  792. REAL, DIMENSION(KTS:KTE) :: NSMLTS ! CHANGE N MELTING SNOW
  793. REAL, DIMENSION(KTS:KTE) :: NSMLTR ! CHANGE N MELTING SNOW TO RAIN
  794. ! HM ADDED 12/13/06
  795. REAL, DIMENSION(KTS:KTE) :: PIACR ! CHANGE QR, ICE-RAIN COLLECTION
  796. REAL, DIMENSION(KTS:KTE) :: NIACR ! CHANGE N, ICE-RAIN COLLECTION
  797. REAL, DIMENSION(KTS:KTE) :: PRACI ! CHANGE QI, ICE-RAIN COLLECTION
  798. REAL, DIMENSION(KTS:KTE) :: PIACRS ! CHANGE QR, ICE RAIN COLLISION, ADDED TO SNOW
  799. REAL, DIMENSION(KTS:KTE) :: NIACRS ! CHANGE N, ICE RAIN COLLISION, ADDED TO SNOW
  800. REAL, DIMENSION(KTS:KTE) :: PRACIS ! CHANGE QI, ICE RAIN COLLISION, ADDED TO SNOW
  801. REAL, DIMENSION(KTS:KTE) :: EPRD ! SUBLIMATION CLOUD ICE
  802. REAL, DIMENSION(KTS:KTE) :: EPRDS ! SUBLIMATION SNOW
  803. ! HM ADDED GRAUPEL PROCESSES
  804. REAL, DIMENSION(KTS:KTE) :: PRACG ! CHANGE IN Q COLLECTION RAIN BY GRAUPEL
  805. REAL, DIMENSION(KTS:KTE) :: PSACWG ! CHANGE IN Q COLLECTION DROPLETS BY GRAUPEL
  806. REAL, DIMENSION(KTS:KTE) :: PGSACW ! CONVERSION Q TO GRAUPEL DUE TO COLLECTION DROPLETS BY SNOW
  807. REAL, DIMENSION(KTS:KTE) :: PGRACS ! CONVERSION Q TO GRAUPEL DUE TO COLLECTION RAIN BY SNOW
  808. REAL, DIMENSION(KTS:KTE) :: PRDG ! DEP OF GRAUPEL
  809. REAL, DIMENSION(KTS:KTE) :: EPRDG ! SUB OF GRAUPEL
  810. REAL, DIMENSION(KTS:KTE) :: EVPMG ! CHANGE Q MELTING OF GRAUPEL AND EVAPORATION
  811. REAL, DIMENSION(KTS:KTE) :: PGMLT ! CHANGE Q MELTING OF GRAUPEL
  812. REAL, DIMENSION(KTS:KTE) :: NPRACG ! CHANGE N COLLECTION RAIN BY GRAUPEL
  813. REAL, DIMENSION(KTS:KTE) :: NPSACWG ! CHANGE N COLLECTION DROPLETS BY GRAUPEL
  814. REAL, DIMENSION(KTS:KTE) :: NSCNG ! CHANGE N CONVERSION TO GRAUPEL DUE TO COLLECTION DROPLETS BY SNOW
  815. REAL, DIMENSION(KTS:KTE) :: NGRACS ! CHANGE N CONVERSION TO GRAUPEL DUE TO COLLECTION RAIN BY SNOW
  816. REAL, DIMENSION(KTS:KTE) :: NGMLTG ! CHANGE N MELTING GRAUPEL
  817. REAL, DIMENSION(KTS:KTE) :: NGMLTR ! CHANGE N MELTING GRAUPEL TO RAIN
  818. REAL, DIMENSION(KTS:KTE) :: NSUBG ! CHANGE N SUB/DEP OF GRAUPEL
  819. REAL, DIMENSION(KTS:KTE) :: PSACR ! CONVERSION DUE TO COLL OF SNOW BY RAIN
  820. REAL, DIMENSION(KTS:KTE) :: NMULTG ! ICE MULT DUE TO ACC DROPLETS BY GRAUPEL
  821. REAL, DIMENSION(KTS:KTE) :: NMULTRG ! ICE MULT DUE TO ACC RAIN BY GRAUPEL
  822. REAL, DIMENSION(KTS:KTE) :: QMULTG ! CHANGE Q DUE TO ICE MULT DROPLETS/GRAUPEL
  823. REAL, DIMENSION(KTS:KTE) :: QMULTRG ! CHANGE Q DUE TO ICE MULT RAIN/GRAUPEL
  824. ! TIME-VARYING ATMOSPHERIC PARAMETERS
  825. REAL, DIMENSION(KTS:KTE) :: KAP ! THERMAL CONDUCTIVITY OF AIR
  826. REAL, DIMENSION(KTS:KTE) :: EVS ! SATURATION VAPOR PRESSURE
  827. REAL, DIMENSION(KTS:KTE) :: EIS ! ICE SATURATION VAPOR PRESSURE
  828. REAL, DIMENSION(KTS:KTE) :: QVS ! SATURATION MIXING RATIO
  829. REAL, DIMENSION(KTS:KTE) :: QVI ! ICE SATURATION MIXING RATIO
  830. REAL, DIMENSION(KTS:KTE) :: QVQVS ! SAUTRATION RATIO
  831. REAL, DIMENSION(KTS:KTE) :: QVQVSI! ICE SATURAION RATIO
  832. REAL, DIMENSION(KTS:KTE) :: DV ! DIFFUSIVITY OF WATER VAPOR IN AIR
  833. REAL, DIMENSION(KTS:KTE) :: XXLS ! LATENT HEAT OF SUBLIMATION
  834. REAL, DIMENSION(KTS:KTE) :: XXLV ! LATENT HEAT OF VAPORIZATION
  835. REAL, DIMENSION(KTS:KTE) :: CPM ! SPECIFIC HEAT AT CONST PRESSURE FOR MOIST AIR
  836. REAL, DIMENSION(KTS:KTE) :: MU ! VISCOCITY OF AIR
  837. REAL, DIMENSION(KTS:KTE) :: SC ! SCHMIDT NUMBER
  838. REAL, DIMENSION(KTS:KTE) :: XLF ! LATENT HEAT OF FREEZING
  839. REAL, DIMENSION(KTS:KTE) :: RHO ! AIR DENSITY
  840. REAL, DIMENSION(KTS:KTE) :: AB ! CORRECTION TO CONDENSATION RATE DUE TO LATENT HEATING
  841. REAL, DIMENSION(KTS:KTE) :: ABI ! CORRECTION TO DEPOSITION RATE DUE TO LATENT HEATING
  842. ! TIME-VARYING MICROPHYSICS PARAMETERS
  843. REAL, DIMENSION(KTS:KTE) :: DAP ! DIFFUSIVITY OF AEROSOL
  844. REAL NACNT ! NUMBER OF CONTACT IN
  845. REAL FMULT ! TEMP.-DEP. PARAMETER FOR RIME-SPLINTERING
  846. REAL COFFI ! ICE AUTOCONVERSION PARAMETER
  847. ! FALL SPEED WORKING VARIABLES (DEFINED IN CODE)
  848. REAL, DIMENSION(KTS:KTE) :: DUMI,DUMR,DUMFNI,DUMG,DUMFNG
  849. REAL UNI, UMI,UMR
  850. REAL, DIMENSION(KTS:KTE) :: FR, FI, FNI,FG,FNG
  851. REAL RGVM
  852. REAL, DIMENSION(KTS:KTE) :: FALOUTR,FALOUTI,FALOUTNI
  853. REAL FALTNDR,FALTNDI,FALTNDNI,RHO2
  854. REAL, DIMENSION(KTS:KTE) :: DUMQS,DUMFNS
  855. REAL UMS,UNS
  856. REAL, DIMENSION(KTS:KTE) :: FS,FNS, FALOUTS,FALOUTNS,FALOUTG,FALOUTNG
  857. REAL FALTNDS,FALTNDNS,UNR,FALTNDG,FALTNDNG
  858. REAL, DIMENSION(KTS:KTE) :: DUMC,DUMFNC
  859. REAL UNC,UMC,UNG,UMG
  860. REAL, DIMENSION(KTS:KTE) :: FC,FALOUTC,FALOUTNC
  861. REAL FALTNDC,FALTNDNC
  862. REAL, DIMENSION(KTS:KTE) :: FNC,DUMFNR,FALOUTNR
  863. REAL FALTNDNR
  864. REAL, DIMENSION(KTS:KTE) :: FNR
  865. ! FALL-SPEED PARAMETER 'A' WITH AIR DENSITY CORRECTION
  866. REAL, DIMENSION(KTS:KTE) :: AIN,ARN,ASN,ACN,AGN
  867. ! EXTERNAL FUNCTION CALL RETURN VARIABLES
  868. ! REAL GAMMA, ! EULER GAMMA FUNCTION
  869. ! REAL POLYSVP, ! SAT. PRESSURE FUNCTION
  870. ! REAL DERF1 ! ERROR FUNCTION
  871. ! DUMMY VARIABLES
  872. REAL DUM,DUM1,DUM2,DUMT,DUMQV,DUMQSS,DUMQSI,DUMS
  873. ! PROGNOSTIC SUPERSATURATION
  874. REAL DQSDT ! CHANGE OF SAT. MIX. RAT. WITH TEMPERATURE
  875. REAL DQSIDT ! CHANGE IN ICE SAT. MIXING RAT. WITH T
  876. REAL EPSI ! 1/PHASE REL. TIME (SEE M2005), ICE
  877. REAL EPSS ! 1/PHASE REL. TIME (SEE M2005), SNOW
  878. REAL EPSR ! 1/PHASE REL. TIME (SEE M2005), RAIN
  879. REAL EPSG ! 1/PHASE REL. TIME (SEE M2005), GRAUPEL
  880. ! NEW DROPLET ACTIVATION VARIABLES
  881. REAL TAUC ! PHASE REL. TIME (SEE M2005), DROPLETS
  882. REAL TAUR ! PHASE REL. TIME (SEE M2005), RAIN
  883. REAL TAUI ! PHASE REL. TIME (SEE M2005), CLOUD ICE
  884. REAL TAUS ! PHASE REL. TIME (SEE M2005), SNOW
  885. REAL TAUG ! PHASE REL. TIME (SEE M2005), GRAUPEL
  886. REAL DUMACT,DUM3
  887. ! COUNTING/INDEX VARIABLES
  888. INTEGER K,NSTEP,N ! ,I
  889. ! LTRUE IS ONLY USED TO SPEED UP THE CODE !!
  890. ! LTRUE, SWITCH = 0, NO HYDROMETEORS IN COLUMN,
  891. ! = 1, HYDROMETEORS IN COLUMN
  892. INTEGER LTRUE
  893. ! DROPLET ACTIVATION/FREEZING AEROSOL
  894. REAL CT ! DROPLET ACTIVATION PARAMETER
  895. REAL TEMP1 ! DUMMY TEMPERATURE
  896. REAL SAT1 ! DUMMY SATURATION
  897. REAL SIGVL ! SURFACE TENSION LIQ/VAPOR
  898. REAL KEL ! KELVIN PARAMETER
  899. REAL KC2 ! TOTAL ICE NUCLEATION RATE
  900. REAL CRY,KRY ! AEROSOL ACTIVATION PARAMETERS
  901. ! MORE WORKING/DUMMY VARIABLES
  902. REAL DUMQI,DUMNI,DC0,DS0,DG0
  903. REAL DUMQC,DUMQR,RATIO,SUM_DEP,FUDGEF
  904. ! EFFECTIVE VERTICAL VELOCITY (M/S)
  905. REAL WEF
  906. ! WORKING PARAMETERS FOR ICE NUCLEATION
  907. REAL ANUC,BNUC
  908. ! WORKING PARAMETERS FOR AEROSOL ACTIVATION
  909. REAL AACT,GAMM,GG,PSI,ETA1,ETA2,SM1,SM2,SMAX,UU1,UU2,ALPHA
  910. ! DUMMY SIZE DISTRIBUTION PARAMETERS
  911. REAL DLAMS,DLAMR,DLAMI,DLAMC,DLAMG,LAMMAX,LAMMIN
  912. INTEGER IDROP
  913. ! FOR WRF-CHEM
  914. REAL, DIMENSION(KTS:KTE)::C2PREC,CSED,ISED,SSED,GSED,RSED
  915. ! comment lines for wrf-chem since these are intent(in) in that case
  916. ! REAL, DIMENSION(KTS:KTE) :: NC3DTEN ! CLOUD DROPLET NUMBER CONCENTRATION (1/KG/S)
  917. ! REAL, DIMENSION(KTS:KTE) :: NC3D ! CLOUD DROPLET NUMBER CONCENTRATION (1/KG)
  918. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  919. ! SET LTRUE INITIALLY TO 0
  920. LTRUE = 0
  921. ! ATMOSPHERIC PARAMETERS THAT VARY IN TIME AND HEIGHT
  922. DO K = KTS,KTE
  923. ! NC3DTEN LOCAL ARRAY INITIALIZED
  924. NC3DTEN(K) = 0.
  925. ! INITIALIZE VARIABLES FOR WRF-CHEM OUTPUT TO ZERO
  926. C2PREC(K)=0.
  927. CSED(K)=0.
  928. ISED(K)=0.
  929. SSED(K)=0.
  930. GSED(K)=0.
  931. RSED(K)=0.
  932. ! LATENT HEAT OF VAPORATION
  933. XXLV(K) = 3.1484E6-2370.*T3D(K)
  934. ! LATENT HEAT OF SUBLIMATION
  935. XXLS(K) = 3.15E6-2370.*T3D(K)+0.3337E6
  936. CPM(K) = CP*(1.+0.887*QV3D(K))
  937. ! SATURATION VAPOR PRESSURE AND MIXING RATIO
  938. ! hm, add fix for low pressure, 5/12/10
  939. EVS(K) = min(0.99*pres(k),POLYSVP(T3D(K),0)) ! PA
  940. EIS(K) = min(0.99*pres(k),POLYSVP(T3D(K),1)) ! PA
  941. ! MAKE SURE ICE SATURATION DOESN'T EXCEED WATER SAT. NEAR FREEZING
  942. IF (EIS(K).GT.EVS(K)) EIS(K) = EVS(K)
  943. QVS(K) = EP_2*EVS(K)/(PRES(K)-EVS(K))
  944. QVI(K) = EP_2*EIS(K)/(PRES(K)-EIS(K))
  945. QVQVS(K) = QV3D(K)/QVS(K)
  946. QVQVSI(K) = QV3D(K)/QVI(K)
  947. ! AIR DENSITY
  948. RHO(K) = PRES(K)/(R*T3D(K))
  949. ! ADD NUMBER CONCENTRATION DUE TO CUMULUS TENDENCY
  950. ! ASSUME N0 ASSOCIATED WITH CUMULUS PARAM RAIN IS 10^7 M^-4
  951. ! ASSUME N0 ASSOCIATED WITH CUMULUS PARAM SNOW IS 2 X 10^7 M^-4
  952. ! FOR DETRAINED CLOUD ICE, ASSUME MEAN VOLUME DIAM OF 80 MICRON
  953. IF (QRCU1D(K).GE.1.E-10) THEN
  954. DUM=1.8e5*(QRCU1D(K)*DT/(PI*RHOW*RHO(K)**3))**0.25
  955. NR3D(K)=NR3D(K)+DUM
  956. END IF
  957. IF (QSCU1D(K).GE.1.E-10) THEN
  958. DUM=3.e5*(QSCU1D(K)*DT/(CONS1*RHO(K)**3))**(1./(DS+1.))
  959. NS3D(K)=NS3D(K)+DUM
  960. END IF
  961. IF (QICU1D(K).GE.1.E-10) THEN
  962. DUM=QICU1D(K)*DT/(CI*(80.E-6)**DI)
  963. NI3D(K)=NI3D(K)+DUM
  964. END IF
  965. ! AT SUBSATURATION, REMOVE SMALL AMOUNTS OF CLOUD/PRECIP WATER
  966. ! hm modify 7/0/09 change limit to 1.e-8
  967. IF (QVQVS(K).LT.0.9) THEN
  968. IF (QR3D(K).LT.1.E-8) THEN
  969. QV3D(K)=QV3D(K)+QR3D(K)
  970. T3D(K)=T3D(K)-QR3D(K)*XXLV(K)/CPM(K)
  971. QR3D(K)=0.
  972. END IF
  973. IF (QC3D(K).LT.1.E-8) THEN
  974. QV3D(K)=QV3D(K)+QC3D(K)
  975. T3D(K)=T3D(K)-QC3D(K)*XXLV(K)/CPM(K)
  976. QC3D(K)=0.
  977. END IF
  978. END IF
  979. IF (QVQVSI(K).LT.0.9) THEN
  980. IF (QI3D(K).LT.1.E-8) THEN
  981. QV3D(K)=QV3D(K)+QI3D(K)
  982. T3D(K)=T3D(K)-QI3D(K)*XXLS(K)/CPM(K)
  983. QI3D(K)=0.
  984. END IF
  985. IF (QNI3D(K).LT.1.E-8) THEN
  986. QV3D(K)=QV3D(K)+QNI3D(K)
  987. T3D(K)=T3D(K)-QNI3D(K)*XXLS(K)/CPM(K)
  988. QNI3D(K)=0.
  989. END IF
  990. IF (QG3D(K).LT.1.E-8) THEN
  991. QV3D(K)=QV3D(K)+QG3D(K)
  992. T3D(K)=T3D(K)-QG3D(K)*XXLS(K)/CPM(K)
  993. QG3D(K)=0.
  994. END IF
  995. END IF
  996. ! HEAT OF FUSION
  997. XLF(K) = XXLS(K)-XXLV(K)
  998. !..................................................................
  999. ! IF MIXING RATIO < QSMALL SET MIXING RATIO AND NUMBER CONC TO ZERO
  1000. IF (QC3D(K).LT.QSMALL) THEN
  1001. QC3D(K) = 0.
  1002. NC3D(K) = 0.
  1003. EFFC(K) = 0.
  1004. END IF
  1005. IF (QR3D(K).LT.QSMALL) THEN
  1006. QR3D(K) = 0.
  1007. NR3D(K) = 0.
  1008. EFFR(K) = 0.
  1009. END IF
  1010. IF (QI3D(K).LT.QSMALL) THEN
  1011. QI3D(K) = 0.
  1012. NI3D(K) = 0.
  1013. EFFI(K) = 0.
  1014. END IF
  1015. IF (QNI3D(K).LT.QSMALL) THEN
  1016. QNI3D(K) = 0.
  1017. NS3D(K) = 0.
  1018. EFFS(K) = 0.
  1019. END IF
  1020. IF (QG3D(K).LT.QSMALL) THEN
  1021. QG3D(K) = 0.
  1022. NG3D(K) = 0.
  1023. EFFG(K) = 0.
  1024. END IF
  1025. ! INITIALIZE SEDIMENTATION TENDENCIES FOR MIXING RATIO
  1026. QRSTEN(K) = 0.
  1027. QISTEN(K) = 0.
  1028. QNISTEN(K) = 0.
  1029. QCSTEN(K) = 0.
  1030. QGSTEN(K) = 0.
  1031. !..................................................................
  1032. ! MICROPHYSICS PARAMETERS VARYING IN TIME/HEIGHT
  1033. ! fix 053011
  1034. MU(K) = 1.496E-6*T3D(K)**1.5/(T3D(K)+120.)
  1035. ! FALL SPEED WITH DENSITY CORRECTION (HEYMSFIELD AND BENSSEMER 2006)
  1036. DUM = (RHOSU/RHO(K))**0.54
  1037. ! fix 053011
  1038. ! AIN(K) = DUM*AI
  1039. ! AA revision 4/1/11: Ikawa and Saito 1991 air-density correction
  1040. AIN(K) = (RHOSU/RHO(K))**0.35*AI
  1041. ARN(K) = DUM*AR
  1042. ASN(K) = DUM*AS
  1043. ! ACN(K) = DUM*AC
  1044. ! AA revision 4/1/11: temperature-dependent Stokes fall speed
  1045. ACN(K) = G*RHOW/(18.*MU(K))
  1046. ! HM ADD GRAUPEL 8/28/06
  1047. AGN(K) = DUM*AG
  1048. !hm 4/7/09 bug fix, initialize lami to prevent later division by zero
  1049. LAMI(K)=0.
  1050. !..................................
  1051. ! IF THERE IS NO CLOUD/PRECIP WATER, AND IF SUBSATURATED, THEN SKIP MICROPHYSICS
  1052. ! FOR THIS LEVEL
  1053. IF (QC3D(K).LT.QSMALL.AND.QI3D(K).LT.QSMALL.AND.QNI3D(K).LT.QSMALL &
  1054. .AND.QR3D(K).LT.QSMALL.AND.QG3D(K).LT.QSMALL) THEN
  1055. IF (T3D(K).LT.273.15.AND.QVQVSI(K).LT.0.999) GOTO 200
  1056. IF (T3D(K).GE.273.15.AND.QVQVS(K).LT.0.999) GOTO 200
  1057. END IF
  1058. ! THERMAL CONDUCTIVITY FOR AIR
  1059. ! fix 053011
  1060. KAP(K) = 1.414E3*MU(K)
  1061. ! DIFFUSIVITY OF WATER VAPOR
  1062. DV(K) = 8.794E-5*T3D(K)**1.81/PRES(K)
  1063. ! SCHMIT NUMBER
  1064. ! fix 053011
  1065. SC(K) = MU(K)/(RHO(K)*DV(K))
  1066. ! PSYCHOMETIC CORRECTIONS
  1067. ! RATE OF CHANGE SAT. MIX. RATIO WITH TEMPERATURE
  1068. DUM = (RV*T3D(K)**2)
  1069. DQSDT = XXLV(K)*QVS(K)/DUM
  1070. DQSIDT = XXLS(K)*QVI(K)/DUM
  1071. ABI(K) = 1.+DQSIDT*XXLS(K)/CPM(K)
  1072. AB(K) = 1.+DQSDT*XXLV(K)/CPM(K)
  1073. !
  1074. !.....................................................................
  1075. !.....................................................................
  1076. ! CASE FOR TEMPERATURE ABOVE FREEZING
  1077. IF (T3D(K).GE.273.15) THEN
  1078. !......................................................................
  1079. !HM ADD, ALLOW FOR CONSTANT DROPLET NUMBER
  1080. ! INUM = 0, PREDICT DROPLET NUMBER
  1081. ! INUM = 1, SET CONSTANT DROPLET NUMBER
  1082. IF (iinum.EQ.1) THEN
  1083. ! CONVERT NDCNST FROM CM-3 TO KG-1
  1084. NC3D(K)=NDCNST*1.E6/RHO(K)
  1085. END IF
  1086. ! GET SIZE DISTRIBUTION PARAMETERS
  1087. ! MELT VERY SMALL SNOW AND GRAUPEL MIXING RATIOS, ADD TO RAIN
  1088. IF (QNI3D(K).LT.1.E-6) THEN
  1089. QR3D(K)=QR3D(K)+QNI3D(K)
  1090. NR3D(K)=NR3D(K)+NS3D(K)
  1091. T3D(K)=T3D(K)-QNI3D(K)*XLF(K)/CPM(K)
  1092. QNI3D(K) = 0.
  1093. NS3D(K) = 0.
  1094. END IF
  1095. IF (QG3D(K).LT.1.E-6) THEN
  1096. QR3D(K)=QR3D(K)+QG3D(K)
  1097. NR3D(K)=NR3D(K)+NG3D(K)
  1098. T3D(K)=T3D(K)-QG3D(K)*XLF(K)/CPM(K)
  1099. QG3D(K) = 0.
  1100. NG3D(K) = 0.
  1101. END IF
  1102. 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
  1103. ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
  1104. NS3D(K) = MAX(0.,NS3D(K))
  1105. NC3D(K) = MAX(0.,NC3D(K))
  1106. NR3D(K) = MAX(0.,NR3D(K))
  1107. NG3D(K) = MAX(0.,NG3D(K))
  1108. !......................................................................
  1109. ! RAIN
  1110. IF (QR3D(K).GE.QSMALL) THEN
  1111. LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
  1112. N0RR(K) = NR3D(K)*LAMR(K)
  1113. ! CHECK FOR SLOPE
  1114. ! ADJUST VARS
  1115. IF (LAMR(K).LT.LAMMINR) THEN
  1116. LAMR(K) = LAMMINR
  1117. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  1118. NR3D(K) = N0RR(K)/LAMR(K)
  1119. ELSE IF (LAMR(K).GT.LAMMAXR) THEN
  1120. LAMR(K) = LAMMAXR
  1121. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  1122. NR3D(K) = N0RR(K)/LAMR(K)
  1123. END IF
  1124. END IF
  1125. !......................................................................
  1126. ! CLOUD DROPLETS
  1127. ! MARTIN ET AL. (1994) FORMULA FOR PGAM
  1128. IF (QC3D(K).GE.QSMALL) THEN
  1129. DUM = PRES(K)/(287.15*T3D(K))
  1130. PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
  1131. PGAM(K)=1./(PGAM(K)**2)-1.
  1132. PGAM(K)=MAX(PGAM(K),2.)
  1133. PGAM(K)=MIN(PGAM(K),10.)
  1134. ! CALCULATE LAMC
  1135. LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
  1136. (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
  1137. ! LAMMIN, 60 MICRON DIAMETER
  1138. ! LAMMAX, 1 MICRON
  1139. LAMMIN = (PGAM(K)+1.)/60.E-6
  1140. LAMMAX = (PGAM(K)+1.)/1.E-6
  1141. IF (LAMC(K).LT.LAMMIN) THEN
  1142. LAMC(K) = LAMMIN
  1143. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  1144. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  1145. ELSE IF (LAMC(K).GT.LAMMAX) THEN
  1146. LAMC(K) = LAMMAX
  1147. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  1148. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  1149. END IF
  1150. END IF
  1151. !......................................................................
  1152. ! SNOW
  1153. IF (QNI3D(K).GE.QSMALL) THEN
  1154. LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
  1155. N0S(K) = NS3D(K)*LAMS(K)
  1156. ! CHECK FOR SLOPE
  1157. ! ADJUST VARS
  1158. IF (LAMS(K).LT.LAMMINS) THEN
  1159. LAMS(K) = LAMMINS
  1160. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  1161. NS3D(K) = N0S(K)/LAMS(K)
  1162. ELSE IF (LAMS(K).GT.LAMMAXS) THEN
  1163. LAMS(K) = LAMMAXS
  1164. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  1165. NS3D(K) = N0S(K)/LAMS(K)
  1166. END IF
  1167. END IF
  1168. !......................................................................
  1169. ! GRAUPEL
  1170. IF (QG3D(K).GE.QSMALL) THEN
  1171. LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
  1172. N0G(K) = NG3D(K)*LAMG(K)
  1173. ! ADJUST VARS
  1174. IF (LAMG(K).LT.LAMMING) THEN
  1175. LAMG(K) = LAMMING
  1176. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  1177. NG3D(K) = N0G(K)/LAMG(K)
  1178. ELSE IF (LAMG(K).GT.LAMMAXG) THEN
  1179. LAMG(K) = LAMMAXG
  1180. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  1181. NG3D(K) = N0G(K)/LAMG(K)
  1182. END IF
  1183. END IF
  1184. !.....................................................................
  1185. ! ZERO OUT PROCESS RATES
  1186. PRC(K) = 0.
  1187. NPRC(K) = 0.
  1188. NPRC1(K) = 0.
  1189. PRA(K) = 0.
  1190. NPRA(K) = 0.
  1191. NRAGG(K) = 0.
  1192. PSMLT(K) = 0.
  1193. NSMLTS(K) = 0.
  1194. NSMLTR(K) = 0.
  1195. EVPMS(K) = 0.
  1196. PCC(K) = 0.
  1197. PRE(K) = 0.
  1198. NSUBC(K) = 0.
  1199. NSUBR(K) = 0.
  1200. PRACG(K) = 0.
  1201. NPRACG(K) = 0.
  1202. PSMLT(K) = 0.
  1203. EVPMS(K) = 0.
  1204. PGMLT(K) = 0.
  1205. EVPMG(K) = 0.
  1206. PRACS(K) = 0.
  1207. NPRACS(K) = 0.
  1208. NGMLTG(K) = 0.
  1209. NGMLTR(K) = 0.
  1210. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1211. ! CALCULATION OF MICROPHYSICAL PROCESS RATES, T > 273.15 K
  1212. !.................................................................
  1213. !.......................................................................
  1214. ! AUTOCONVERSION OF CLOUD LIQUID WATER TO RAIN
  1215. ! FORMULA FROM BEHENG (1994)
  1216. ! USING NUMERICAL SIMULATION OF STOCHASTIC COLLECTION EQUATION
  1217. ! AND INITIAL CLOUD DROPLET SIZE DISTRIBUTION SPECIFIED
  1218. ! AS A GAMMA DISTRIBUTION
  1219. ! USE MINIMUM VALUE OF 1.E-6 TO PREVENT FLOATING POINT ERROR
  1220. IF (QC3D(K).GE.1.E-6) THEN
  1221. ! HM ADD 12/13/06, REPLACE WITH NEWER FORMULA
  1222. ! FROM KHAIROUTDINOV AND KOGAN 2000, MWR
  1223. PRC(K)=1350.*QC3D(K)**2.47* &
  1224. (NC3D(K)/1.e6*RHO(K))**(-1.79)
  1225. ! note: nprc1 is change in Nr,
  1226. ! nprc is change in Nc
  1227. NPRC1(K) = PRC(K)/CONS29
  1228. NPRC(K) = PRC(K)/(QC3D(k)/NC3D(K))
  1229. ! hm bug fix 3/20/12
  1230. NPRC(K) = MIN(NPRC(K),NC3D(K)/DT)
  1231. NPRC1(K) = MIN(NPRC1(K),NPRC(K))
  1232. END IF
  1233. !.......................................................................
  1234. ! HM ADD 12/13/06, COLLECTION OF SNOW BY RAIN ABOVE FREEZING
  1235. ! FORMULA FROM IKAWA AND SAITO (1991)
  1236. IF (QR3D(K).GE.1.E-8.AND.QNI3D(K).GE.1.E-8) THEN
  1237. UMS = ASN(K)*CONS3/(LAMS(K)**BS)
  1238. UMR = ARN(K)*CONS4/(LAMR(K)**BR)
  1239. UNS = ASN(K)*CONS5/LAMS(K)**BS
  1240. UNR = ARN(K)*CONS6/LAMR(K)**BR
  1241. ! SET REASLISTIC LIMITS ON FALLSPEEDS
  1242. ! bug fix, 10/08/09
  1243. dum=(rhosu/rho(k))**0.54
  1244. UMS=MIN(UMS,1.2*dum)
  1245. UNS=MIN(UNS,1.2*dum)
  1246. UMR=MIN(UMR,9.1*dum)
  1247. UNR=MIN(UNR,9.1*dum)
  1248. PRACS(K) = CONS31*(((1.2*UMR-0.95*UMS)**2+ &
  1249. 0.08*UMS*UMR)**0.5*RHO(K)* &
  1250. N0RR(K)*N0S(K)/LAMS(K)**3* &
  1251. (5./(LAMS(K)**3*LAMR(K))+ &
  1252. 2./(LAMS(K)**2*LAMR(K)**2)+ &
  1253. 0.5/(LAMS(K)*LAMR(K)**3)))
  1254. ! fix 053011, npracs no longer subtracted from snow
  1255. ! NPRACS(K) = CONS32*RHO(K)*(1.7*(UNR-UNS)**2+ &
  1256. ! 0.3*UNR*UNS)**0.5*N0RR(K)*N0S(K)* &
  1257. ! (1./(LAMR(K)**3*LAMS(K))+ &
  1258. ! 1./(LAMR(K)**2*LAMS(K)**2)+ &
  1259. ! 1./(LAMR(K)*LAMS(K)**3))
  1260. END IF
  1261. ! ADD COLLECTION OF GRAUPEL BY RAIN ABOVE FREEZING
  1262. ! ASSUME ALL RAIN COLLECTION BY GRAUPEL ABOVE FREEZING IS SHED
  1263. ! ASSUME SHED DROPS ARE 1 MM IN SIZE
  1264. IF (QR3D(K).GE.1.E-8.AND.QG3D(K).GE.1.E-8) THEN
  1265. UMG = AGN(K)*CONS7/(LAMG(K)**BG)
  1266. UMR = ARN(K)*CONS4/(LAMR(K)**BR)
  1267. UNG = AGN(K)*CONS8/LAMG(K)**BG
  1268. UNR = ARN(K)*CONS6/LAMR(K)**BR
  1269. ! SET REASLISTIC LIMITS ON FALLSPEEDS
  1270. ! bug fix, 10/08/09
  1271. dum=(rhosu/rho(k))**0.54
  1272. UMG=MIN(UMG,20.*dum)
  1273. UNG=MIN(UNG,20.*dum)
  1274. UMR=MIN(UMR,9.1*dum)
  1275. UNR=MIN(UNR,9.1*dum)
  1276. ! PRACG IS MIXING RATIO OF RAIN PER SEC COLLECTED BY GRAUPEL/HAIL
  1277. PRACG(K) = CONS41*(((1.2*UMR-0.95*UMG)**2+ &
  1278. 0.08*UMG*UMR)**0.5*RHO(K)* &
  1279. N0RR(K)*N0G(K)/LAMR(K)**3* &
  1280. (5./(LAMR(K)**3*LAMG(K))+ &
  1281. 2./(LAMR(K)**2*LAMG(K)**2)+ &
  1282. 0.5/(LAMR(k)*LAMG(k)**3)))
  1283. ! ASSUME 1 MM DROPS ARE SHED, GET NUMBER SHED PER SEC
  1284. DUM = PRACG(K)/5.2E-7
  1285. NPRACG(K) = CONS32*RHO(K)*(1.7*(UNR-UNG)**2+ &
  1286. 0.3*UNR*UNG)**0.5*N0RR(K)*N0G(K)* &
  1287. (1./(LAMR(K)**3*LAMG(K))+ &
  1288. 1./(LAMR(K)**2*LAMG(K)**2)+ &
  1289. 1./(LAMR(K)*LAMG(K)**3))
  1290. NPRACG(K)=MAX(NPRACG(K)-DUM,0.)
  1291. END IF
  1292. !.......................................................................
  1293. ! ACCRETION OF CLOUD LIQUID WATER BY RAIN
  1294. ! CONTINUOUS COLLECTION EQUATION WITH
  1295. ! GRAVITATIONAL COLLECTION KERNEL, DROPLET FALL SPEED NEGLECTED
  1296. IF (QR3D(K).GE.1.E-8 .AND. QC3D(K).GE.1.E-8) THEN
  1297. ! 12/13/06 HM ADD, REPLACE WITH NEWER FORMULA FROM
  1298. ! KHAIROUTDINOV AND KOGAN 2000, MWR
  1299. DUM=(QC3D(K)*QR3D(K))
  1300. PRA(K) = 67.*(DUM)**1.15
  1301. NPRA(K) = PRA(K)/(QC3D(K)/NC3D(K))
  1302. END IF
  1303. !.......................................................................
  1304. ! SELF-COLLECTION OF RAIN DROPS
  1305. ! FROM BEHENG(1994)
  1306. ! FROM NUMERICAL SIMULATION OF THE STOCHASTIC COLLECTION EQUATION
  1307. ! AS DESCRINED ABOVE FOR AUTOCONVERSION
  1308. IF (QR3D(K).GE.1.E-8) THEN
  1309. ! include breakup add 10/09/09
  1310. dum1=300.e-6
  1311. if (1./lamr(k).lt.dum1) then
  1312. dum=1.
  1313. else if (1./lamr(k).ge.dum1) then
  1314. dum=2.-exp(2300.*(1./lamr(k)-dum1))
  1315. end if
  1316. ! NRAGG(K) = -8.*NR3D(K)*QR3D(K)*RHO(K)
  1317. NRAGG(K) = -5.78*dum*NR3D(K)*QR3D(K)*RHO(K)
  1318. END IF
  1319. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1320. ! CALCULATE EVAP OF RAIN (RUTLEDGE AND HOBBS 1983)
  1321. IF (QR3D(K).GE.QSMALL) THEN
  1322. EPSR = 2.*PI*N0RR(K)*RHO(K)*DV(K)* &
  1323. (F1R/(LAMR(K)*LAMR(K))+ &
  1324. F2R*(ARN(K)*RHO(K)/MU(K))**0.5* &
  1325. SC(K)**(1./3.)*CONS9/ &
  1326. (LAMR(K)**CONS34))
  1327. ELSE
  1328. EPSR = 0.
  1329. END IF
  1330. ! NO CONDENSATION ONTO RAIN, ONLY EVAP ALLOWED
  1331. IF (QV3D(K).LT.QVS(K)) THEN
  1332. PRE(K) = EPSR*(QV3D(K)-QVS(K))/AB(K)
  1333. PRE(K) = MIN(PRE(K),0.)
  1334. ELSE
  1335. PRE(K) = 0.
  1336. END IF
  1337. !.......................................................................
  1338. ! MELTING OF SNOW
  1339. ! SNOW MAY PERSITS ABOVE FREEZING, FORMULA FROM RUTLEDGE AND HOBBS, 1984
  1340. ! IF WATER SUPERSATURATION, SNOW MELTS TO FORM RAIN
  1341. IF (QNI3D(K).GE.1.E-8) THEN
  1342. ! fix 053011
  1343. ! HM, MODIFY FOR V3.2, ADD ACCELERATED MELTING DUE TO COLLISION WITH RAIN
  1344. ! DUM = -CPW/XLF(K)*T3D(K)*PRACS(K)
  1345. DUM = -CPW/XLF(K)*(T3D(K)-273.15)*PRACS(K)
  1346. PSMLT(K)=2.*PI*N0S(K)*KAP(K)*(273.15-T3D(K))/ &
  1347. XLF(K)*RHO(K)*(F1S/(LAMS(K)*LAMS(K))+ &
  1348. F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
  1349. SC(K)**(1./3.)*CONS10/ &
  1350. (LAMS(K)**CONS35))+DUM
  1351. ! IN WATER SUBSATURATION, SNOW MELTS AND EVAPORATES
  1352. IF (QVQVS(K).LT.1.) THEN
  1353. EPSS = 2.*PI*N0S(K)*RHO(K)*DV(K)* &
  1354. (F1S/(LAMS(K)*LAMS(K))+ &
  1355. F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
  1356. SC(K)**(1./3.)*CONS10/ &
  1357. (LAMS(K)**CONS35))
  1358. ! hm fix 8/4/08
  1359. EVPMS(K) = (QV3D(K)-QVS(K))*EPSS/AB(K)
  1360. EVPMS(K) = MAX(EVPMS(K),PSMLT(K))
  1361. PSMLT(K) = PSMLT(K)-EVPMS(K)
  1362. END IF
  1363. END IF
  1364. !.......................................................................
  1365. ! MELTING OF GRAUPEL
  1366. ! GRAUPEL MAY PERSITS ABOVE FREEZING, FORMULA FROM RUTLEDGE AND HOBBS, 1984
  1367. ! IF WATER SUPERSATURATION, GRAUPEL MELTS TO FORM RAIN
  1368. IF (QG3D(K).GE.1.E-8) THEN
  1369. ! fix 053011
  1370. ! HM, MODIFY FOR V3.2, ADD ACCELERATED MELTING DUE TO COLLISION WITH RAIN
  1371. ! DUM = -CPW/XLF(K)*T3D(K)*PRACG(K)
  1372. DUM = -CPW/XLF(K)*(T3D(K)-273.15)*PRACG(K)
  1373. PGMLT(K)=2.*PI*N0G(K)*KAP(K)*(273.15-T3D(K))/ &
  1374. XLF(K)*RHO(K)*(F1S/(LAMG(K)*LAMG(K))+ &
  1375. F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
  1376. SC(K)**(1./3.)*CONS11/ &
  1377. (LAMG(K)**CONS36))+DUM
  1378. ! IN WATER SUBSATURATION, GRAUPEL MELTS AND EVAPORATES
  1379. IF (QVQVS(K).LT.1.) THEN
  1380. EPSG = 2.*PI*N0G(K)*RHO(K)*DV(K)* &
  1381. (F1S/(LAMG(K)*LAMG(K))+ &
  1382. F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
  1383. SC(K)**(1./3.)*CONS11/ &
  1384. (LAMG(K)**CONS36))
  1385. ! hm fix 8/4/08
  1386. EVPMG(K) = (QV3D(K)-QVS(K))*EPSG/AB(K)
  1387. EVPMG(K) = MAX(EVPMG(K),PGMLT(K))
  1388. PGMLT(K) = PGMLT(K)-EVPMG(K)
  1389. END IF
  1390. END IF
  1391. ! HM, V3.2
  1392. ! RESET PRACG AND PRACS TO ZERO, THIS IS DONE BECAUSE THERE IS NO
  1393. ! TRANSFER OF MASS FROM SNOW AND GRAUPEL TO RAIN DIRECTLY FROM COLLECTION
  1394. ! ABOVE FREEZING, IT IS ONLY USED FOR ENHANCEMENT OF MELTING AND SHEDDING
  1395. PRACG(K) = 0.
  1396. PRACS(K) = 0.
  1397. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1398. ! FOR CLOUD ICE, ONLY PROCESSES OPERATING AT T > 273.15 IS
  1399. ! MELTING, WHICH IS ALREADY CONSERVED DURING PROCESS
  1400. ! CALCULATION
  1401. ! CONSERVATION OF QC
  1402. DUM = (PRC(K)+PRA(K))*DT
  1403. IF (DUM.GT.QC3D(K).AND.QC3D(K).GE.QSMALL) THEN
  1404. RATIO = QC3D(K)/DUM
  1405. PRC(K) = PRC(K)*RATIO
  1406. PRA(K) = PRA(K)*RATIO
  1407. END IF
  1408. ! CONSERVATION OF SNOW
  1409. DUM = (-PSMLT(K)-EVPMS(K)+PRACS(K))*DT
  1410. IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
  1411. ! NO SOURCE TERMS FOR SNOW AT T > FREEZING
  1412. RATIO = QNI3D(K)/DUM
  1413. PSMLT(K) = PSMLT(K)*RATIO
  1414. EVPMS(K) = EVPMS(K)*RATIO
  1415. PRACS(K) = PRACS(K)*RATIO
  1416. END IF
  1417. ! CONSERVATION OF GRAUPEL
  1418. DUM = (-PGMLT(K)-EVPMG(K)+PRACG(K))*DT
  1419. IF (DUM.GT.QG3D(K).AND.QG3D(K).GE.QSMALL) THEN
  1420. ! NO SOURCE TERM FOR GRAUPEL ABOVE FREEZING
  1421. RATIO = QG3D(K)/DUM
  1422. PGMLT(K) = PGMLT(K)*RATIO
  1423. EVPMG(K) = EVPMG(K)*RATIO
  1424. PRACG(K) = PRACG(K)*RATIO
  1425. END IF
  1426. ! CONSERVATION OF QR
  1427. ! HM 12/13/06, ADDED CONSERVATION OF RAIN SINCE PRE IS NEGATIVE
  1428. DUM = (-PRACS(K)-PRACG(K)-PRE(K)-PRA(K)-PRC(K)+PSMLT(K)+PGMLT(K))*DT
  1429. IF (DUM.GT.QR3D(K).AND.QR3D(K).GE.QSMALL) THEN
  1430. RATIO = (QR3D(K)/DT+PRACS(K)+PRACG(K)+PRA(K)+PRC(K)-PSMLT(K)-PGMLT(K))/ &
  1431. (-PRE(K))
  1432. PRE(K) = PRE(K)*RATIO
  1433. END IF
  1434. !....................................
  1435. QV3DTEN(K) = QV3DTEN(K)+(-PRE(K)-EVPMS(K)-EVPMG(K))
  1436. T3DTEN(K) = T3DTEN(K)+(PRE(K)*XXLV(K)+(EVPMS(K)+EVPMG(K))*XXLS(K)+&
  1437. (PSMLT(K)+PGMLT(K)-PRACS(K)-PRACG(K))*XLF(K))/CPM(K)
  1438. QC3DTEN(K) = QC3DTEN(K)+(-PRA(K)-PRC(K))
  1439. QR3DTEN(K) = QR3DTEN(K)+(PRE(K)+PRA(K)+PRC(K)-PSMLT(K)-PGMLT(K)+PRACS(K)+PRACG(K))
  1440. QNI3DTEN(K) = QNI3DTEN(K)+(PSMLT(K)+EVPMS(K)-PRACS(K))
  1441. QG3DTEN(K) = QG3DTEN(K)+(PGMLT(K)+EVPMG(K)-PRACG(K))
  1442. ! fix 053011
  1443. ! NS3DTEN(K) = NS3DTEN(K)-NPRACS(K)
  1444. ! HM, bug fix 5/12/08, npracg is subtracted from nr not ng
  1445. ! NG3DTEN(K) = NG3DTEN(K)
  1446. NC3DTEN(K) = NC3DTEN(K)+ (-NPRA(K)-NPRC(K))
  1447. NR3DTEN(K) = NR3DTEN(K)+ (NPRC1(K)+NRAGG(K)-NPRACG(K))
  1448. ! HM ADD, WRF-CHEM, ADD TENDENCIES FOR C2PREC
  1449. C2PREC(K) = PRA(K)+PRC(K)
  1450. IF (PRE(K).LT.0.) THEN
  1451. DUM = PRE(K)*DT/QR3D(K)
  1452. DUM = MAX(-1.,DUM)
  1453. NSUBR(K) = DUM*NR3D(K)/DT
  1454. END IF
  1455. IF (EVPMS(K)+PSMLT(K).LT.0.) THEN
  1456. DUM = (EVPMS(K)+PSMLT(K))*DT/QNI3D(K)
  1457. DUM = MAX(-1.,DUM)
  1458. NSMLTS(K) = DUM*NS3D(K)/DT
  1459. END IF
  1460. IF (PSMLT(K).LT.0.) THEN
  1461. DUM = PSMLT(K)*DT/QNI3D(K)
  1462. DUM = MAX(-1.0,DUM)
  1463. NSMLTR(K) = DUM*NS3D(K)/DT
  1464. END IF
  1465. IF (EVPMG(K)+PGMLT(K).LT.0.) THEN
  1466. DUM = (EVPMG(K)+PGMLT(K))*DT/QG3D(K)
  1467. DUM = MAX(-1.,DUM)
  1468. NGMLTG(K) = DUM*NG3D(K)/DT
  1469. END IF
  1470. IF (PGMLT(K).LT.0.) THEN
  1471. DUM = PGMLT(K)*DT/QG3D(K)
  1472. DUM = MAX(-1.0,DUM)
  1473. NGMLTR(K) = DUM*NG3D(K)/DT
  1474. END IF
  1475. NS3DTEN(K) = NS3DTEN(K)+(NSMLTS(K))
  1476. NG3DTEN(K) = NG3DTEN(K)+(NGMLTG(K))
  1477. NR3DTEN(K) = NR3DTEN(K)+(NSUBR(K)-NSMLTR(K)-NGMLTR(K))
  1478. 300 CONTINUE
  1479. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1480. ! NOW CALCULATE SATURATION ADJUSTMENT TO CONDENSE EXTRA VAPOR ABOVE
  1481. ! WATER SATURATION
  1482. DUMT = T3D(K)+DT*T3DTEN(K)
  1483. DUMQV = QV3D(K)+DT*QV3DTEN(K)
  1484. ! hm, add fix for low pressure, 5/12/10
  1485. dum=min(0.99*pres(k),POLYSVP(DUMT,0))
  1486. DUMQSS = EP_2*dum/(PRES(K)-dum)
  1487. DUMQC = QC3D(K)+DT*QC3DTEN(K)
  1488. DUMQC = MAX(DUMQC,0.)
  1489. ! SATURATION ADJUSTMENT FOR LIQUID
  1490. DUMS = DUMQV-DUMQSS
  1491. PCC(K) = DUMS/(1.+XXLV(K)**2*DUMQSS/(CPM(K)*RV*DUMT**2))/DT
  1492. IF (PCC(K)*DT+DUMQC.LT.0.) THEN
  1493. PCC(K) = -DUMQC/DT
  1494. END IF
  1495. QV3DTEN(K) = QV3DTEN(K)-PCC(K)
  1496. T3DTEN(K) = T3DTEN(K)+PCC(K)*XXLV(K)/CPM(K)
  1497. QC3DTEN(K) = QC3DTEN(K)+PCC(K)
  1498. !.......................................................................
  1499. ! ACTIVATION OF CLOUD DROPLETS
  1500. ! ACTIVATION OF DROPLET CURRENTLY NOT CALCULATED
  1501. ! DROPLET CONCENTRATION IS SPECIFIED !!!!!
  1502. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1503. ! SUBLIMATE, MELT, OR EVAPORATE NUMBER CONCENTRATION
  1504. ! THIS FORMULATION ASSUMES 1:1 RATIO BETWEEN MASS LOSS AND
  1505. ! LOSS OF NUMBER CONCENTRATION
  1506. ! IF (PCC(K).LT.0.) THEN
  1507. ! DUM = PCC(K)*DT/QC3D(K)
  1508. ! DUM = MAX(-1.,DUM)
  1509. ! NSUBC(K) = DUM*NC3D(K)/DT
  1510. ! END IF
  1511. ! UPDATE TENDENCIES
  1512. ! NC3DTEN(K) = NC3DTEN(K)+NSUBC(K)
  1513. !.....................................................................
  1514. !.....................................................................
  1515. ELSE ! TEMPERATURE < 273.15
  1516. !......................................................................
  1517. !HM ADD, ALLOW FOR CONSTANT DROPLET NUMBER
  1518. ! INUM = 0, PREDICT DROPLET NUMBER
  1519. ! INUM = 1, SET CONSTANT DROPLET NUMBER
  1520. IF (iinum.EQ.1) THEN
  1521. ! CONVERT NDCNST FROM CM-3 TO KG-1
  1522. NC3D(K)=NDCNST*1.E6/RHO(K)
  1523. END IF
  1524. ! CALCULATE SIZE DISTRIBUTION PARAMETERS
  1525. ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
  1526. NI3D(K) = MAX(0.,NI3D(K))
  1527. NS3D(K) = MAX(0.,NS3D(K))
  1528. NC3D(K) = MAX(0.,NC3D(K))
  1529. NR3D(K) = MAX(0.,NR3D(K))
  1530. NG3D(K) = MAX(0.,NG3D(K))
  1531. !......................................................................
  1532. ! CLOUD ICE
  1533. IF (QI3D(K).GE.QSMALL) THEN
  1534. LAMI(K) = (CONS12* &
  1535. NI3D(K)/QI3D(K))**(1./DI)
  1536. N0I(K) = NI3D(K)*LAMI(K)
  1537. ! CHECK FOR SLOPE
  1538. ! ADJUST VARS
  1539. IF (LAMI(K).LT.LAMMINI) THEN
  1540. LAMI(K) = LAMMINI
  1541. N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
  1542. NI3D(K) = N0I(K)/LAMI(K)
  1543. ELSE IF (LAMI(K).GT.LAMMAXI) THEN
  1544. LAMI(K) = LAMMAXI
  1545. N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
  1546. NI3D(K) = N0I(K)/LAMI(K)
  1547. END IF
  1548. END IF
  1549. !......................................................................
  1550. ! RAIN
  1551. IF (QR3D(K).GE.QSMALL) THEN
  1552. LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
  1553. N0RR(K) = NR3D(K)*LAMR(K)
  1554. ! CHECK FOR SLOPE
  1555. ! ADJUST VARS
  1556. IF (LAMR(K).LT.LAMMINR) THEN
  1557. LAMR(K) = LAMMINR
  1558. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  1559. NR3D(K) = N0RR(K)/LAMR(K)
  1560. ELSE IF (LAMR(K).GT.LAMMAXR) THEN
  1561. LAMR(K) = LAMMAXR
  1562. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  1563. NR3D(K) = N0RR(K)/LAMR(K)
  1564. END IF
  1565. END IF
  1566. !......................................................................
  1567. ! CLOUD DROPLETS
  1568. ! MARTIN ET AL. (1994) FORMULA FOR PGAM
  1569. IF (QC3D(K).GE.QSMALL) THEN
  1570. DUM = PRES(K)/(287.15*T3D(K))
  1571. PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
  1572. PGAM(K)=1./(PGAM(K)**2)-1.
  1573. PGAM(K)=MAX(PGAM(K),2.)
  1574. PGAM(K)=MIN(PGAM(K),10.)
  1575. ! CALCULATE LAMC
  1576. LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
  1577. (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
  1578. ! LAMMIN, 60 MICRON DIAMETER
  1579. ! LAMMAX, 1 MICRON
  1580. LAMMIN = (PGAM(K)+1.)/60.E-6
  1581. LAMMAX = (PGAM(K)+1.)/1.E-6
  1582. IF (LAMC(K).LT.LAMMIN) THEN
  1583. LAMC(K) = LAMMIN
  1584. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  1585. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  1586. ELSE IF (LAMC(K).GT.LAMMAX) THEN
  1587. LAMC(K) = LAMMAX
  1588. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  1589. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  1590. END IF
  1591. ! TO CALCULATE DROPLET FREEZING
  1592. CDIST1(K) = NC3D(K)/GAMMA(PGAM(K)+1.)
  1593. END IF
  1594. !......................................................................
  1595. ! SNOW
  1596. IF (QNI3D(K).GE.QSMALL) THEN
  1597. LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
  1598. N0S(K) = NS3D(K)*LAMS(K)
  1599. ! CHECK FOR SLOPE
  1600. ! ADJUST VARS
  1601. IF (LAMS(K).LT.LAMMINS) THEN
  1602. LAMS(K) = LAMMINS
  1603. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  1604. NS3D(K) = N0S(K)/LAMS(K)
  1605. ELSE IF (LAMS(K).GT.LAMMAXS) THEN
  1606. LAMS(K) = LAMMAXS
  1607. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  1608. NS3D(K) = N0S(K)/LAMS(K)
  1609. END IF
  1610. END IF
  1611. !......................................................................
  1612. ! GRAUPEL
  1613. IF (QG3D(K).GE.QSMALL) THEN
  1614. LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
  1615. N0G(K) = NG3D(K)*LAMG(K)
  1616. ! CHECK FOR SLOPE
  1617. ! ADJUST VARS
  1618. IF (LAMG(K).LT.LAMMING) THEN
  1619. LAMG(K) = LAMMING
  1620. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  1621. NG3D(K) = N0G(K)/LAMG(K)
  1622. ELSE IF (LAMG(K).GT.LAMMAXG) THEN
  1623. LAMG(K) = LAMMAXG
  1624. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  1625. NG3D(K) = N0G(K)/LAMG(K)
  1626. END IF
  1627. END IF
  1628. !.....................................................................
  1629. ! ZERO OUT PROCESS RATES
  1630. MNUCCC(K) = 0.
  1631. NNUCCC(K) = 0.
  1632. PRC(K) = 0.
  1633. NPRC(K) = 0.
  1634. NPRC1(K) = 0.
  1635. NSAGG(K) = 0.
  1636. PSACWS(K) = 0.
  1637. NPSACWS(K) = 0.
  1638. PSACWI(K) = 0.
  1639. NPSACWI(K) = 0.
  1640. PRACS(K) = 0.
  1641. NPRACS(K) = 0.
  1642. NMULTS(K) = 0.
  1643. QMULTS(K) = 0.
  1644. NMULTR(K) = 0.
  1645. QMULTR(K) = 0.
  1646. NMULTG(K) = 0.
  1647. QMULTG(K) = 0.
  1648. NMULTRG(K) = 0.
  1649. QMULTRG(K) = 0.
  1650. MNUCCR(K) = 0.
  1651. NNUCCR(K) = 0.
  1652. PRA(K) = 0.
  1653. NPRA(K) = 0.
  1654. NRAGG(K) = 0.
  1655. PRCI(K) = 0.
  1656. NPRCI(K) = 0.
  1657. PRAI(K) = 0.
  1658. NPRAI(K) = 0.
  1659. NNUCCD(K) = 0.
  1660. MNUCCD(K) = 0.
  1661. PCC(K) = 0.
  1662. PRE(K) = 0.
  1663. PRD(K) = 0.
  1664. PRDS(K) = 0.
  1665. EPRD(K) = 0.
  1666. EPRDS(K) = 0.
  1667. NSUBC(K) = 0.
  1668. NSUBI(K) = 0.
  1669. NSUBS(K) = 0.
  1670. NSUBR(K) = 0.
  1671. PIACR(K) = 0.
  1672. NIACR(K) = 0.
  1673. PRACI(K) = 0.
  1674. PIACRS(K) = 0.
  1675. NIACRS(K) = 0.
  1676. PRACIS(K) = 0.
  1677. ! HM: ADD GRAUPEL PROCESSES
  1678. PRACG(K) = 0.
  1679. PSACR(K) = 0.
  1680. PSACWG(K) = 0.
  1681. PGSACW(K) = 0.
  1682. PGRACS(K) = 0.
  1683. PRDG(K) = 0.
  1684. EPRDG(K) = 0.
  1685. NPRACG(K) = 0.
  1686. NPSACWG(K) = 0.
  1687. NSCNG(K) = 0.
  1688. NGRACS(K) = 0.
  1689. NSUBG(K) = 0.
  1690. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  1691. ! CALCULATION OF MICROPHYSICAL PROCESS RATES
  1692. ! ACCRETION/AUTOCONVERSION/FREEZING/MELTING/COAG.
  1693. !.......................................................................
  1694. ! FREEZING OF CLOUD DROPLETS
  1695. ! ONLY ALLOWED BELOW -4 C
  1696. IF (QC3D(K).GE.QSMALL .AND. T3D(K).LT.269.15) THEN
  1697. ! NUMBER OF CONTACT NUCLEI (M^-3) FROM MEYERS ET AL., 1992
  1698. ! FACTOR OF 1000 IS TO CONVERT FROM L^-1 TO M^-3
  1699. ! MEYERS CURVE
  1700. NACNT = EXP(-2.80+0.262*(273.15-T3D(K)))*1000.
  1701. ! COOPER CURVE
  1702. ! NACNT = 5.*EXP(0.304*(273.15-T3D(K)))
  1703. ! FLECTHER
  1704. ! NACNT = 0.01*EXP(0.6*(273.15-T3D(K)))
  1705. ! CONTACT FREEZING
  1706. ! MEAN FREE PATH
  1707. DUM = 7.37*T3D(K)/(288.*10.*PRES(K))/100.
  1708. ! EFFECTIVE DIFFUSIVITY OF CONTACT NUCLEI
  1709. ! BASED ON BROWNIAN DIFFUSION
  1710. DAP(K) = CONS37*T3D(K)*(1.+DUM/RIN)/MU(K)
  1711. MNUCCC(K) = CONS38*DAP(K)*NACNT*EXP(LOG(CDIST1(K))+ &
  1712. LOG(GAMMA(PGAM(K)+5.))-4.*LOG(LAMC(K)))
  1713. NNUCCC(K) = 2.*PI*DAP(K)*NACNT*CDIST1(K)* &
  1714. GAMMA(PGAM(K)+2.)/ &
  1715. LAMC(K)
  1716. ! IMMERSION FREEZING (BIGG 1953)
  1717. MNUCCC(K) = MNUCCC(K)+CONS39* &
  1718. EXP(LOG(CDIST1(K))+LOG(GAMMA(7.+PGAM(K)))-6.*LOG(LAMC(K)))* &
  1719. EXP(AIMM*(273.15-T3D(K)))
  1720. NNUCCC(K) = NNUCCC(K)+ &
  1721. CONS40*EXP(LOG(CDIST1(K))+LOG(GAMMA(PGAM(K)+4.))-3.*LOG(LAMC(K))) &
  1722. *EXP(AIMM*(273.15-T3D(K)))
  1723. ! PUT IN A CATCH HERE TO PREVENT DIVERGENCE BETWEEN NUMBER CONC. AND
  1724. ! MIXING RATIO, SINCE STRICT CONSERVATION NOT CHECKED FOR NUMBER CONC
  1725. NNUCCC(K) = MIN(NNUCCC(K),NC3D(K)/DT)
  1726. END IF
  1727. !.................................................................
  1728. !.......................................................................
  1729. ! AUTOCONVERSION OF CLOUD LIQUID WATER TO RAIN
  1730. ! FORMULA FROM BEHENG (1994)
  1731. ! USING NUMERICAL SIMULATION OF STOCHASTIC COLLECTION EQUATION
  1732. ! AND INITIAL CLOUD DROPLET SIZE DISTRIBUTION SPECIFIED
  1733. ! AS A GAMMA DISTRIBUTION
  1734. ! USE MINIMUM VALUE OF 1.E-6 TO PREVENT FLOATING POINT ERROR
  1735. IF (QC3D(K).GE.1.E-6) THEN
  1736. ! HM ADD 12/13/06, REPLACE WITH NEWER FORMULA
  1737. ! FROM KHAIROUTDINOV AND KOGAN 2000, MWR
  1738. PRC(K)=1350.*QC3D(K)**2.47* &
  1739. (NC3D(K)/1.e6*RHO(K))**(-1.79)
  1740. ! note: nprc1 is change in Nr,
  1741. ! nprc is change in Nc
  1742. NPRC1(K) = PRC(K)/CONS29
  1743. NPRC(K) = PRC(K)/(QC3D(K)/NC3D(K))
  1744. ! hm bug fix 3/20/12
  1745. NPRC(K) = MIN(NPRC(K),NC3D(K)/DT)
  1746. NPRC1(K) = MIN(NPRC1(K),NPRC(K))
  1747. END IF
  1748. !.......................................................................
  1749. ! SELF-COLLECTION OF DROPLET NOT INCLUDED IN KK2000 SCHEME
  1750. ! SNOW AGGREGATION FROM PASSARELLI, 1978, USED BY REISNER, 1998
  1751. ! THIS IS HARD-WIRED FOR BS = 0.4 FOR NOW
  1752. IF (QNI3D(K).GE.1.E-8) THEN
  1753. NSAGG(K) = CONS15*ASN(K)*RHO(K)** &
  1754. ((2.+BS)/3.)*QNI3D(K)**((2.+BS)/3.)* &
  1755. (NS3D(K)*RHO(K))**((4.-BS)/3.)/ &
  1756. (RHO(K))
  1757. END IF
  1758. !.......................................................................
  1759. ! ACCRETION OF CLOUD DROPLETS ONTO SNOW/GRAUPEL
  1760. ! HERE USE CONTINUOUS COLLECTION EQUATION WITH
  1761. ! SIMPLE GRAVITATIONAL COLLECTION KERNEL IGNORING
  1762. ! SNOW
  1763. IF (QNI3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
  1764. PSACWS(K) = CONS13*ASN(K)*QC3D(K)*RHO(K)* &
  1765. N0S(K)/ &
  1766. LAMS(K)**(BS+3.)
  1767. NPSACWS(K) = CONS13*ASN(K)*NC3D(K)*RHO(K)* &
  1768. N0S(K)/ &
  1769. LAMS(K)**(BS+3.)
  1770. END IF
  1771. !............................................................................
  1772. ! COLLECTION OF CLOUD WATER BY GRAUPEL
  1773. IF (QG3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
  1774. PSACWG(K) = CONS14*AGN(K)*QC3D(K)*RHO(K)* &
  1775. N0G(K)/ &
  1776. LAMG(K)**(BG+3.)
  1777. NPSACWG(K) = CONS14*AGN(K)*NC3D(K)*RHO(K)* &
  1778. N0G(K)/ &
  1779. LAMG(K)**(BG+3.)
  1780. END IF
  1781. !.......................................................................
  1782. ! HM, ADD 12/13/06
  1783. ! CLOUD ICE COLLECTING DROPLETS, ASSUME THAT CLOUD ICE MEAN DIAM > 100 MICRON
  1784. ! BEFORE RIMING CAN OCCUR
  1785. ! ASSUME THAT RIME COLLECTED ON CLOUD ICE DOES NOT LEAD
  1786. ! TO HALLET-MOSSOP SPLINTERING
  1787. IF (QI3D(K).GE.1.E-8 .AND. QC3D(K).GE.QSMALL) THEN
  1788. ! PUT IN SIZE DEPENDENT COLLECTION EFFICIENCY BASED ON STOKES LAW
  1789. ! FROM THOMPSON ET AL. 2004, MWR
  1790. IF (1./LAMI(K).GE.100.E-6) THEN
  1791. PSACWI(K) = CONS16*AIN(K)*QC3D(K)*RHO(K)* &
  1792. N0I(K)/ &
  1793. LAMI(K)**(BI+3.)
  1794. NPSACWI(K) = CONS16*AIN(K)*NC3D(K)*RHO(K)* &
  1795. N0I(K)/ &
  1796. LAMI(K)**(BI+3.)
  1797. END IF
  1798. END IF
  1799. !.......................................................................
  1800. ! ACCRETION OF RAIN WATER BY SNOW
  1801. ! FORMULA FROM IKAWA AND SAITO, 1991, USED BY REISNER ET AL, 1998
  1802. IF (QR3D(K).GE.1.E-8.AND.QNI3D(K).GE.1.E-8) THEN
  1803. UMS = ASN(K)*CONS3/(LAMS(K)**BS)
  1804. UMR = ARN(K)*CONS4/(LAMR(K)**BR)
  1805. UNS = ASN(K)*CONS5/LAMS(K)**BS
  1806. UNR = ARN(K)*CONS6/LAMR(K)**BR
  1807. ! SET REASLISTIC LIMITS ON FALLSPEEDS
  1808. ! bug fix, 10/08/09
  1809. dum=(rhosu/rho(k))**0.54
  1810. UMS=MIN(UMS,1.2*dum)
  1811. UNS=MIN(UNS,1.2*dum)
  1812. UMR=MIN(UMR,9.1*dum)
  1813. UNR=MIN(UNR,9.1*dum)
  1814. PRACS(K) = CONS41*(((1.2*UMR-0.95*UMS)**2+ &
  1815. 0.08*UMS*UMR)**0.5*RHO(K)* &
  1816. N0RR(K)*N0S(K)/LAMR(K)**3* &
  1817. (5./(LAMR(K)**3*LAMS(K))+ &
  1818. 2./(LAMR(K)**2*LAMS(K)**2)+ &
  1819. 0.5/(LAMR(k)*LAMS(k)**3)))
  1820. NPRACS(K) = CONS32*RHO(K)*(1.7*(UNR-UNS)**2+ &
  1821. 0.3*UNR*UNS)**0.5*N0RR(K)*N0S(K)* &
  1822. (1./(LAMR(K)**3*LAMS(K))+ &
  1823. 1./(LAMR(K)**2*LAMS(K)**2)+ &
  1824. 1./(LAMR(K)*LAMS(K)**3))
  1825. ! MAKE SURE PRACS DOESN'T EXCEED TOTAL RAIN MIXING RATIO
  1826. ! AS THIS MAY OTHERWISE RESULT IN TOO MUCH TRANSFER OF WATER DURING
  1827. ! RIME-SPLINTERING
  1828. PRACS(K) = MIN(PRACS(K),QR3D(K)/DT)
  1829. ! COLLECTION OF SNOW BY RAIN - NEEDED FOR GRAUPEL CONVERSION CALCULATIONS
  1830. ! ONLY CALCULATE IF SNOW AND RAIN MIXING RATIOS EXCEED 0.1 G/KG
  1831. ! ASSUME COLLECTION OF SNOW BY RAIN PRODUCES GRAUPEL NOT HAIL
  1832. ! HM MODIFY FOR WRFV3.1
  1833. ! IF (IHAIL.EQ.0) THEN
  1834. IF (QNI3D(K).GE.0.1E-3.AND.QR3D(K).GE.0.1E-3) THEN
  1835. PSACR(K) = CONS31*(((1.2*UMR-0.95*UMS)**2+ &
  1836. 0.08*UMS*UMR)**0.5*RHO(K)* &
  1837. N0RR(K)*N0S(K)/LAMS(K)**3* &
  1838. (5./(LAMS(K)**3*LAMR(K))+ &
  1839. 2./(LAMS(K)**2*LAMR(K)**2)+ &
  1840. 0.5/(LAMS(K)*LAMR(K)**3)))
  1841. END IF
  1842. ! END IF
  1843. END IF
  1844. !.......................................................................
  1845. ! COLLECTION OF RAINWATER BY GRAUPEL, FROM IKAWA AND SAITO 1990,
  1846. ! USED BY REISNER ET AL 1998
  1847. IF (QR3D(K).GE.1.E-8.AND.QG3D(K).GE.1.E-8) THEN
  1848. UMG = AGN(K)*CONS7/(LAMG(K)**BG)
  1849. UMR = ARN(K)*CONS4/(LAMR(K)**BR)
  1850. UNG = AGN(K)*CONS8/LAMG(K)**BG
  1851. UNR = ARN(K)*CONS6/LAMR(K)**BR
  1852. ! SET REASLISTIC LIMITS ON FALLSPEEDS
  1853. ! bug fix, 10/08/09
  1854. dum=(rhosu/rho(k))**0.54
  1855. UMG=MIN(UMG,20.*dum)
  1856. UNG=MIN(UNG,20.*dum)
  1857. UMR=MIN(UMR,9.1*dum)
  1858. UNR=MIN(UNR,9.1*dum)
  1859. PRACG(K) = CONS41*(((1.2*UMR-0.95*UMG)**2+ &
  1860. 0.08*UMG*UMR)**0.5*RHO(K)* &
  1861. N0RR(K)*N0G(K)/LAMR(K)**3* &
  1862. (5./(LAMR(K)**3*LAMG(K))+ &
  1863. 2./(LAMR(K)**2*LAMG(K)**2)+ &
  1864. 0.5/(LAMR(k)*LAMG(k)**3)))
  1865. NPRACG(K) = CONS32*RHO(K)*(1.7*(UNR-UNG)**2+ &
  1866. 0.3*UNR*UNG)**0.5*N0RR(K)*N0G(K)* &
  1867. (1./(LAMR(K)**3*LAMG(K))+ &
  1868. 1./(LAMR(K)**2*LAMG(K)**2)+ &
  1869. 1./(LAMR(K)*LAMG(K)**3))
  1870. ! MAKE SURE PRACG DOESN'T EXCEED TOTAL RAIN MIXING RATIO
  1871. ! AS THIS MAY OTHERWISE RESULT IN TOO MUCH TRANSFER OF WATER DURING
  1872. ! RIME-SPLINTERING
  1873. PRACG(K) = MIN(PRACG(K),QR3D(K)/DT)
  1874. END IF
  1875. !.......................................................................
  1876. ! RIME-SPLINTERING - SNOW
  1877. ! HALLET-MOSSOP (1974)
  1878. ! NUMBER OF SPLINTERS FORMED IS BASED ON MASS OF RIMED WATER
  1879. ! DUM1 = MASS OF INDIVIDUAL SPLINTERS
  1880. ! HM ADD THRESHOLD SNOW AND DROPLET MIXING RATIO FOR RIME-SPLINTERING
  1881. ! TO LIMIT RIME-SPLINTERING IN STRATIFORM CLOUDS
  1882. ! THESE THRESHOLDS CORRESPOND WITH GRAUPEL THRESHOLDS IN RH 1984
  1883. !v1.4
  1884. IF (QNI3D(K).GE.0.1E-3) THEN
  1885. IF (QC3D(K).GE.0.5E-3.OR.QR3D(K).GE.0.1E-3) THEN
  1886. IF (PSACWS(K).GT.0..OR.PRACS(K).GT.0.) THEN
  1887. IF (T3D(K).LT.270.16 .AND. T3D(K).GT.265.16) THEN
  1888. IF (T3D(K).GT.270.16) THEN
  1889. FMULT = 0.
  1890. ELSE IF (T3D(K).LE.270.16.AND.T3D(K).GT.268.16) THEN
  1891. FMULT = (270.16-T3D(K))/2.
  1892. ELSE IF (T3D(K).GE.265.16.AND.T3D(K).LE.268.16) THEN
  1893. FMULT = (T3D(K)-265.16)/3.
  1894. ELSE IF (T3D(K).LT.265.16) THEN
  1895. FMULT = 0.
  1896. END IF
  1897. ! 1000 IS TO CONVERT FROM KG TO G
  1898. ! SPLINTERING FROM DROPLETS ACCRETED ONTO SNOW
  1899. IF (PSACWS(K).GT.0.) THEN
  1900. NMULTS(K) = 35.E4*PSACWS(K)*FMULT*1000.
  1901. QMULTS(K) = NMULTS(K)*MMULT
  1902. ! CONSTRAIN SO THAT TRANSFER OF MASS FROM SNOW TO ICE CANNOT BE MORE MASS
  1903. ! THAN WAS RIMED ONTO SNOW
  1904. QMULTS(K) = MIN(QMULTS(K),PSACWS(K))
  1905. PSACWS(K) = PSACWS(K)-QMULTS(K)
  1906. END IF
  1907. ! RIMING AND SPLINTERING FROM ACCRETED RAINDROPS
  1908. IF (PRACS(K).GT.0.) THEN
  1909. NMULTR(K) = 35.E4*PRACS(K)*FMULT*1000.
  1910. QMULTR(K) = NMULTR(K)*MMULT
  1911. ! CONSTRAIN SO THAT TRANSFER OF MASS FROM SNOW TO ICE CANNOT BE MORE MASS
  1912. ! THAN WAS RIMED ONTO SNOW
  1913. QMULTR(K) = MIN(QMULTR(K),PRACS(K))
  1914. PRACS(K) = PRACS(K)-QMULTR(K)
  1915. END IF
  1916. END IF
  1917. END IF
  1918. END IF
  1919. END IF
  1920. !.......................................................................
  1921. ! RIME-SPLINTERING - GRAUPEL
  1922. ! HALLET-MOSSOP (1974)
  1923. ! NUMBER OF SPLINTERS FORMED IS BASED ON MASS OF RIMED WATER
  1924. ! DUM1 = MASS OF INDIVIDUAL SPLINTERS
  1925. ! HM ADD THRESHOLD SNOW MIXING RATIO FOR RIME-SPLINTERING
  1926. ! TO LIMIT RIME-SPLINTERING IN STRATIFORM CLOUDS
  1927. ! ONLY CALCULATE FOR GRAUPEL NOT HAIL
  1928. ! IF (IHAIL.EQ.0) THEN
  1929. ! v1.4
  1930. IF (QG3D(K).GE.0.1E-3) THEN
  1931. IF (QC3D(K).GE.0.5E-3.OR.QR3D(K).GE.0.1E-3) THEN
  1932. IF (PSACWG(K).GT.0..OR.PRACG(K).GT.0.) THEN
  1933. IF (T3D(K).LT.270.16 .AND. T3D(K).GT.265.16) THEN
  1934. IF (T3D(K).GT.270.16) THEN
  1935. FMULT = 0.
  1936. ELSE IF (T3D(K).LE.270.16.AND.T3D(K).GT.268.16) THEN
  1937. FMULT = (270.16-T3D(K))/2.
  1938. ELSE IF (T3D(K).GE.265.16.AND.T3D(K).LE.268.16) THEN
  1939. FMULT = (T3D(K)-265.16)/3.
  1940. ELSE IF (T3D(K).LT.265.16) THEN
  1941. FMULT = 0.
  1942. END IF
  1943. ! 1000 IS TO CONVERT FROM KG TO G
  1944. ! SPLINTERING FROM DROPLETS ACCRETED ONTO GRAUPEL
  1945. IF (PSACWG(K).GT.0.) THEN
  1946. NMULTG(K) = 35.E4*PSACWG(K)*FMULT*1000.
  1947. QMULTG(K) = NMULTG(K)*MMULT
  1948. ! CONSTRAIN SO THAT TRANSFER OF MASS FROM GRAUPEL TO ICE CANNOT BE MORE MASS
  1949. ! THAN WAS RIMED ONTO GRAUPEL
  1950. QMULTG(K) = MIN(QMULTG(K),PSACWG(K))
  1951. PSACWG(K) = PSACWG(K)-QMULTG(K)
  1952. END IF
  1953. ! RIMING AND SPLINTERING FROM ACCRETED RAINDROPS
  1954. IF (PRACG(K).GT.0.) THEN
  1955. NMULTRG(K) = 35.E4*PRACG(K)*FMULT*1000.
  1956. QMULTRG(K) = NMULTRG(K)*MMULT
  1957. ! CONSTRAIN SO THAT TRANSFER OF MASS FROM GRAUPEL TO ICE CANNOT BE MORE MASS
  1958. ! THAN WAS RIMED ONTO GRAUPEL
  1959. QMULTRG(K) = MIN(QMULTRG(K),PRACG(K))
  1960. PRACG(K) = PRACG(K)-QMULTRG(K)
  1961. END IF
  1962. END IF
  1963. END IF
  1964. END IF
  1965. END IF
  1966. ! END IF
  1967. !........................................................................
  1968. ! CONVERSION OF RIMED CLOUD WATER ONTO SNOW TO GRAUPEL
  1969. ! ASSUME CONVERTED SNOW FORMS GRAUPEL NOT HAIL
  1970. ! HAIL ASSUMED TO ONLY FORM BY FREEZING OF RAIN
  1971. ! OR COLLISIONS OF RAIN WITH CLOUD ICE
  1972. ! IF (IHAIL.EQ.0) THEN
  1973. IF (PSACWS(K).GT.0.) THEN
  1974. ! ONLY ALLOW CONVERSION IF QNI > 0.1 AND QC > 0.5 G/KG FOLLOWING RUTLEDGE AND HOBBS (1984)
  1975. IF (QNI3D(K).GE.0.1E-3.AND.QC3D(K).GE.0.5E-3) THEN
  1976. ! PORTION OF RIMING CONVERTED TO GRAUPEL (REISNER ET AL. 1998, ORIGINALLY IS1991)
  1977. PGSACW(K) = MIN(PSACWS(K),CONS17*DT*N0S(K)*QC3D(K)*QC3D(K)* &
  1978. ASN(K)*ASN(K)/ &
  1979. (RHO(K)*LAMS(K)**(2.*BS+2.)))
  1980. ! MIX RAT CONVERTED INTO GRAUPEL AS EMBRYO (REISNER ET AL. 1998, ORIG M1990)
  1981. DUM = MAX(RHOSN/(RHOG-RHOSN)*PGSACW(K),0.)
  1982. ! NUMBER CONCENTRAITON OF EMBRYO GRAUPEL FROM RIMING OF SNOW
  1983. NSCNG(K) = DUM/MG0*RHO(K)
  1984. ! LIMIT MAX NUMBER CONVERTED TO SNOW NUMBER
  1985. NSCNG(K) = MIN(NSCNG(K),NS3D(K)/DT)
  1986. ! PORTION OF RIMING LEFT FOR SNOW
  1987. PSACWS(K) = PSACWS(K) - PGSACW(K)
  1988. END IF
  1989. END IF
  1990. ! CONVERSION OF RIMED RAINWATER ONTO SNOW CONVERTED TO GRAUPEL
  1991. IF (PRACS(K).GT.0.) THEN
  1992. ! ONLY ALLOW CONVERSION IF QNI > 0.1 AND QR > 0.1 G/KG FOLLOWING RUTLEDGE AND HOBBS (1984)
  1993. IF (QNI3D(K).GE.0.1E-3.AND.QR3D(K).GE.0.1E-3) THEN
  1994. ! PORTION OF COLLECTED RAINWATER CONVERTED TO GRAUPEL (REISNER ET AL. 1998)
  1995. DUM = CONS18*(4./LAMS(K))**3*(4./LAMS(K))**3 &
  1996. /(CONS18*(4./LAMS(K))**3*(4./LAMS(K))**3+ &
  1997. CONS19*(4./LAMR(K))**3*(4./LAMR(K))**3)
  1998. DUM=MIN(DUM,1.)
  1999. DUM=MAX(DUM,0.)
  2000. PGRACS(K) = (1.-DUM)*PRACS(K)
  2001. NGRACS(K) = (1.-DUM)*NPRACS(K)
  2002. ! LIMIT MAX NUMBER CONVERTED TO MIN OF EITHER RAIN OR SNOW NUMBER CONCENTRATION
  2003. NGRACS(K) = MIN(NGRACS(K),NR3D(K)/DT)
  2004. NGRACS(K) = MIN(NGRACS(K),NS3D(K)/DT)
  2005. ! AMOUNT LEFT FOR SNOW PRODUCTION
  2006. PRACS(K) = PRACS(K) - PGRACS(K)
  2007. NPRACS(K) = NPRACS(K) - NGRACS(K)
  2008. ! CONVERSION TO GRAUPEL DUE TO COLLECTION OF SNOW BY RAIN
  2009. PSACR(K)=PSACR(K)*(1.-DUM)
  2010. END IF
  2011. END IF
  2012. ! END IF
  2013. !.......................................................................
  2014. ! FREEZING OF RAIN DROPS
  2015. ! FREEZING ALLOWED BELOW -4 C
  2016. IF (T3D(K).LT.269.15.AND.QR3D(K).GE.QSMALL) THEN
  2017. ! IMMERSION FREEZING (BIGG 1953)
  2018. MNUCCR(K) = CONS20*NR3D(K)*EXP(AIMM*(273.15-T3D(K)))/LAMR(K)**3 &
  2019. /LAMR(K)**3
  2020. NNUCCR(K) = PI*NR3D(K)*BIMM*EXP(AIMM*(273.15-T3D(K)))/LAMR(K)**3
  2021. ! PREVENT DIVERGENCE BETWEEN MIXING RATIO AND NUMBER CONC
  2022. NNUCCR(K) = MIN(NNUCCR(K),NR3D(K)/DT)
  2023. END IF
  2024. !.......................................................................
  2025. ! ACCRETION OF CLOUD LIQUID WATER BY RAIN
  2026. ! CONTINUOUS COLLECTION EQUATION WITH
  2027. ! GRAVITATIONAL COLLECTION KERNEL, DROPLET FALL SPEED NEGLECTED
  2028. IF (QR3D(K).GE.1.E-8 .AND. QC3D(K).GE.1.E-8) THEN
  2029. ! 12/13/06 HM ADD, REPLACE WITH NEWER FORMULA FROM
  2030. ! KHAIROUTDINOV AND KOGAN 2000, MWR
  2031. DUM=(QC3D(K)*QR3D(K))
  2032. PRA(K) = 67.*(DUM)**1.15
  2033. NPRA(K) = PRA(K)/(QC3D(K)/NC3D(K))
  2034. END IF
  2035. !.......................................................................
  2036. ! SELF-COLLECTION OF RAIN DROPS
  2037. ! FROM BEHENG(1994)
  2038. ! FROM NUMERICAL SIMULATION OF THE STOCHASTIC COLLECTION EQUATION
  2039. ! AS DESCRINED ABOVE FOR AUTOCONVERSION
  2040. IF (QR3D(K).GE.1.E-8) THEN
  2041. ! include breakup add 10/09/09
  2042. dum1=300.e-6
  2043. if (1./lamr(k).lt.dum1) then
  2044. dum=1.
  2045. else if (1./lamr(k).ge.dum1) then
  2046. dum=2.-exp(2300.*(1./lamr(k)-dum1))
  2047. end if
  2048. ! NRAGG(K) = -8.*NR3D(K)*QR3D(K)*RHO(K)
  2049. NRAGG(K) = -5.78*dum*NR3D(K)*QR3D(K)*RHO(K)
  2050. END IF
  2051. !.......................................................................
  2052. ! AUTOCONVERSION OF CLOUD ICE TO SNOW
  2053. ! FOLLOWING HARRINGTON ET AL. (1995) WITH MODIFICATION
  2054. ! HERE IT IS ASSUMED THAT AUTOCONVERSION CAN ONLY OCCUR WHEN THE
  2055. ! ICE IS GROWING, I.E. IN CONDITIONS OF ICE SUPERSATURATION
  2056. IF (QI3D(K).GE.1.E-8 .AND.QVQVSI(K).GE.1.) THEN
  2057. ! COFFI = 2./LAMI(K)
  2058. ! IF (COFFI.GE.DCS) THEN
  2059. NPRCI(K) = CONS21*(QV3D(K)-QVI(K))*RHO(K) &
  2060. *N0I(K)*EXP(-LAMI(K)*DCS)*DV(K)/ABI(K)
  2061. PRCI(K) = CONS22*NPRCI(K)
  2062. NPRCI(K) = MIN(NPRCI(K),NI3D(K)/DT)
  2063. ! END IF
  2064. END IF
  2065. !.......................................................................
  2066. ! ACCRETION OF CLOUD ICE BY SNOW
  2067. ! FOR THIS CALCULATION, IT IS ASSUMED THAT THE VS >> VI
  2068. ! AND DS >> DI FOR CONTINUOUS COLLECTION
  2069. IF (QNI3D(K).GE.1.E-8 .AND. QI3D(K).GE.QSMALL) THEN
  2070. PRAI(K) = CONS23*ASN(K)*QI3D(K)*RHO(K)*N0S(K)/ &
  2071. LAMS(K)**(BS+3.)
  2072. NPRAI(K) = CONS23*ASN(K)*NI3D(K)* &
  2073. RHO(K)*N0S(K)/ &
  2074. LAMS(K)**(BS+3.)
  2075. NPRAI(K)=MIN(NPRAI(K),NI3D(K)/DT)
  2076. END IF
  2077. !.......................................................................
  2078. ! HM, ADD 12/13/06, COLLISION OF RAIN AND ICE TO PRODUCE SNOW OR GRAUPEL
  2079. ! FOLLOWS REISNER ET AL. 1998
  2080. ! ASSUMED FALLSPEED AND SIZE OF ICE CRYSTAL << THAN FOR RAIN
  2081. IF (QR3D(K).GE.1.E-8.AND.QI3D(K).GE.1.E-8.AND.T3D(K).LE.273.15) THEN
  2082. ! ALLOW GRAUPEL FORMATION FROM RAIN-ICE COLLISIONS ONLY IF RAIN MIXING RATIO > 0.1 G/KG,
  2083. ! OTHERWISE ADD TO SNOW
  2084. IF (QR3D(K).GE.0.1E-3) THEN
  2085. NIACR(K)=CONS24*NI3D(K)*N0RR(K)*ARN(K) &
  2086. /LAMR(K)**(BR+3.)*RHO(K)
  2087. PIACR(K)=CONS25*NI3D(K)*N0RR(K)*ARN(K) &
  2088. /LAMR(K)**(BR+3.)/LAMR(K)**3*RHO(K)
  2089. PRACI(K)=CONS24*QI3D(K)*N0RR(K)*ARN(K)/ &
  2090. LAMR(K)**(BR+3.)*RHO(K)
  2091. NIACR(K)=MIN(NIACR(K),NR3D(K)/DT)
  2092. NIACR(K)=MIN(NIACR(K),NI3D(K)/DT)
  2093. ELSE
  2094. NIACRS(K)=CONS24*NI3D(K)*N0RR(K)*ARN(K) &
  2095. /LAMR(K)**(BR+3.)*RHO(K)
  2096. PIACRS(K)=CONS25*NI3D(K)*N0RR(K)*ARN(K) &
  2097. /LAMR(K)**(BR+3.)/LAMR(K)**3*RHO(K)
  2098. PRACIS(K)=CONS24*QI3D(K)*N0RR(K)*ARN(K)/ &
  2099. LAMR(K)**(BR+3.)*RHO(K)
  2100. NIACRS(K)=MIN(NIACRS(K),NR3D(K)/DT)
  2101. NIACRS(K)=MIN(NIACRS(K),NI3D(K)/DT)
  2102. END IF
  2103. END IF
  2104. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2105. ! NUCLEATION OF CLOUD ICE FROM HOMOGENEOUS AND HETEROGENEOUS FREEZING ON AEROSOL
  2106. IF (INUC.EQ.0) THEN
  2107. ! add threshold according to Greg Thomspon
  2108. if ((QVQVS(K).GE.0.999.and.T3D(K).le.265.15).or. &
  2109. QVQVSI(K).ge.1.08) then
  2110. ! hm, modify dec. 5, 2006, replace with cooper curve
  2111. kc2 = 0.005*exp(0.304*(273.15-T3D(K)))*1000. ! convert from L-1 to m-3
  2112. ! limit to 500 L-1
  2113. kc2 = min(kc2,500.e3)
  2114. kc2=MAX(kc2/rho(k),0.) ! convert to kg-1
  2115. IF (KC2.GT.NI3D(K)+NS3D(K)+NG3D(K)) THEN
  2116. NNUCCD(K) = (KC2-NI3D(K)-NS3D(K)-NG3D(K))/DT
  2117. MNUCCD(K) = NNUCCD(K)*MI0
  2118. END IF
  2119. END IF
  2120. ELSE IF (INUC.EQ.1) THEN
  2121. IF (T3D(K).LT.273.15.AND.QVQVSI(K).GT.1.) THEN
  2122. KC2 = 0.16*1000./RHO(K) ! CONVERT FROM L-1 TO KG-1
  2123. IF (KC2.GT.NI3D(K)+NS3D(K)+NG3D(K)) THEN
  2124. NNUCCD(K) = (KC2-NI3D(K)-NS3D(K)-NG3D(K))/DT
  2125. MNUCCD(K) = NNUCCD(K)*MI0
  2126. END IF
  2127. END IF
  2128. END IF
  2129. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2130. 101 CONTINUE
  2131. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2132. ! CALCULATE EVAP/SUB/DEP TERMS FOR QI,QNI,QR
  2133. ! NO VENTILATION FOR CLOUD ICE
  2134. IF (QI3D(K).GE.QSMALL) THEN
  2135. EPSI = 2.*PI*N0I(K)*RHO(K)*DV(K)/(LAMI(K)*LAMI(K))
  2136. ELSE
  2137. EPSI = 0.
  2138. END IF
  2139. IF (QNI3D(K).GE.QSMALL) THEN
  2140. EPSS = 2.*PI*N0S(K)*RHO(K)*DV(K)* &
  2141. (F1S/(LAMS(K)*LAMS(K))+ &
  2142. F2S*(ASN(K)*RHO(K)/MU(K))**0.5* &
  2143. SC(K)**(1./3.)*CONS10/ &
  2144. (LAMS(K)**CONS35))
  2145. ELSE
  2146. EPSS = 0.
  2147. END IF
  2148. IF (QG3D(K).GE.QSMALL) THEN
  2149. EPSG = 2.*PI*N0G(K)*RHO(K)*DV(K)* &
  2150. (F1S/(LAMG(K)*LAMG(K))+ &
  2151. F2S*(AGN(K)*RHO(K)/MU(K))**0.5* &
  2152. SC(K)**(1./3.)*CONS11/ &
  2153. (LAMG(K)**CONS36))
  2154. ELSE
  2155. EPSG = 0.
  2156. END IF
  2157. IF (QR3D(K).GE.QSMALL) THEN
  2158. EPSR = 2.*PI*N0RR(K)*RHO(K)*DV(K)* &
  2159. (F1R/(LAMR(K)*LAMR(K))+ &
  2160. F2R*(ARN(K)*RHO(K)/MU(K))**0.5* &
  2161. SC(K)**(1./3.)*CONS9/ &
  2162. (LAMR(K)**CONS34))
  2163. ELSE
  2164. EPSR = 0.
  2165. END IF
  2166. ! ONLY INCLUDE REGION OF ICE SIZE DIST < DCS
  2167. ! DUM IS FRACTION OF D*N(D) < DCS
  2168. ! LOGIC BELOW FOLLOWS THAT OF HARRINGTON ET AL. 1995 (JAS)
  2169. IF (QI3D(K).GE.QSMALL) THEN
  2170. DUM=(1.-EXP(-LAMI(K)*DCS)*(1.+LAMI(K)*DCS))
  2171. PRD(K) = EPSI*(QV3D(K)-QVI(K))/ABI(K)*DUM
  2172. ELSE
  2173. DUM=0.
  2174. END IF
  2175. ! ADD DEPOSITION IN TAIL OF ICE SIZE DIST TO SNOW IF SNOW IS PRESENT
  2176. IF (QNI3D(K).GE.QSMALL) THEN
  2177. PRDS(K) = EPSS*(QV3D(K)-QVI(K))/ABI(K)+ &
  2178. EPSI*(QV3D(K)-QVI(K))/ABI(K)*(1.-DUM)
  2179. ! OTHERWISE ADD TO CLOUD ICE
  2180. ELSE
  2181. PRD(K) = PRD(K)+EPSI*(QV3D(K)-QVI(K))/ABI(K)*(1.-DUM)
  2182. END IF
  2183. ! VAPOR DPEOSITION ON GRAUPEL
  2184. PRDG(K) = EPSG*(QV3D(K)-QVI(K))/ABI(K)
  2185. ! NO CONDENSATION ONTO RAIN, ONLY EVAP
  2186. IF (QV3D(K).LT.QVS(K)) THEN
  2187. PRE(K) = EPSR*(QV3D(K)-QVS(K))/AB(K)
  2188. PRE(K) = MIN(PRE(K),0.)
  2189. ELSE
  2190. PRE(K) = 0.
  2191. END IF
  2192. ! MAKE SURE NOT PUSHED INTO ICE SUPERSAT/SUBSAT
  2193. ! FORMULA FROM REISNER 2 SCHEME
  2194. DUM = (QV3D(K)-QVI(K))/DT
  2195. FUDGEF = 0.9999
  2196. SUM_DEP = PRD(K)+PRDS(K)+MNUCCD(K)+PRDG(K)
  2197. IF( (DUM.GT.0. .AND. SUM_DEP.GT.DUM*FUDGEF) .OR. &
  2198. (DUM.LT.0. .AND. SUM_DEP.LT.DUM*FUDGEF) ) THEN
  2199. MNUCCD(K) = FUDGEF*MNUCCD(K)*DUM/SUM_DEP
  2200. PRD(K) = FUDGEF*PRD(K)*DUM/SUM_DEP
  2201. PRDS(K) = FUDGEF*PRDS(K)*DUM/SUM_DEP
  2202. PRDG(K) = FUDGEF*PRDG(K)*DUM/SUM_DEP
  2203. ENDIF
  2204. ! IF CLOUD ICE/SNOW/GRAUPEL VAP DEPOSITION IS NEG, THEN ASSIGN TO SUBLIMATION PROCESSES
  2205. IF (PRD(K).LT.0.) THEN
  2206. EPRD(K)=PRD(K)
  2207. PRD(K)=0.
  2208. END IF
  2209. IF (PRDS(K).LT.0.) THEN
  2210. EPRDS(K)=PRDS(K)
  2211. PRDS(K)=0.
  2212. END IF
  2213. IF (PRDG(K).LT.0.) THEN
  2214. EPRDG(K)=PRDG(K)
  2215. PRDG(K)=0.
  2216. END IF
  2217. !.......................................................................
  2218. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2219. ! CONSERVATION OF WATER
  2220. ! THIS IS ADOPTED LOOSELY FROM MM5 RESINER CODE. HOWEVER, HERE WE
  2221. ! ONLY ADJUST PROCESSES THAT ARE NEGATIVE, RATHER THAN ALL PROCESSES.
  2222. ! IF MIXING RATIOS LESS THAN QSMALL, THEN NO DEPLETION OF WATER
  2223. ! THROUGH MICROPHYSICAL PROCESSES, SKIP CONSERVATION
  2224. ! NOTE: CONSERVATION CHECK NOT APPLIED TO NUMBER CONCENTRATION SPECIES. ADDITIONAL CATCH
  2225. ! BELOW WILL PREVENT NEGATIVE NUMBER CONCENTRATION
  2226. ! FOR EACH MICROPHYSICAL PROCESS WHICH PROVIDES A SOURCE FOR NUMBER, THERE IS A CHECK
  2227. ! TO MAKE SURE THAT CAN'T EXCEED TOTAL NUMBER OF DEPLETED SPECIES WITH THE TIME
  2228. ! STEP
  2229. !****SENSITIVITY - NO ICE
  2230. IF (ILIQ.EQ.1) THEN
  2231. MNUCCC(K)=0.
  2232. NNUCCC(K)=0.
  2233. MNUCCR(K)=0.
  2234. NNUCCR(K)=0.
  2235. MNUCCD(K)=0.
  2236. NNUCCD(K)=0.
  2237. END IF
  2238. ! ****SENSITIVITY - NO GRAUPEL
  2239. IF (IGRAUP.EQ.1) THEN
  2240. PRACG(K) = 0.
  2241. PSACR(K) = 0.
  2242. PSACWG(K) = 0.
  2243. PGSACW(K) = 0.
  2244. PGRACS(K) = 0.
  2245. PRDG(K) = 0.
  2246. EPRDG(K) = 0.
  2247. EVPMG(K) = 0.
  2248. PGMLT(K) = 0.
  2249. NPRACG(K) = 0.
  2250. NPSACWG(K) = 0.
  2251. NSCNG(K) = 0.
  2252. NGRACS(K) = 0.
  2253. NSUBG(K) = 0.
  2254. NGMLTG(K) = 0.
  2255. NGMLTR(K) = 0.
  2256. ! fix 053011
  2257. PIACRS(K)=PIACRS(K)+PIACR(K)
  2258. PIACR(K) = 0.
  2259. END IF
  2260. ! CONSERVATION OF QC
  2261. DUM = (PRC(K)+PRA(K)+MNUCCC(K)+PSACWS(K)+PSACWI(K)+QMULTS(K)+PSACWG(K)+PGSACW(K)+QMULTG(K))*DT
  2262. IF (DUM.GT.QC3D(K).AND.QC3D(K).GE.QSMALL) THEN
  2263. RATIO = QC3D(K)/DUM
  2264. PRC(K) = PRC(K)*RATIO
  2265. PRA(K) = PRA(K)*RATIO
  2266. MNUCCC(K) = MNUCCC(K)*RATIO
  2267. PSACWS(K) = PSACWS(K)*RATIO
  2268. PSACWI(K) = PSACWI(K)*RATIO
  2269. QMULTS(K) = QMULTS(K)*RATIO
  2270. QMULTG(K) = QMULTG(K)*RATIO
  2271. PSACWG(K) = PSACWG(K)*RATIO
  2272. PGSACW(K) = PGSACW(K)*RATIO
  2273. END IF
  2274. ! CONSERVATION OF QI
  2275. DUM = (-PRD(K)-MNUCCC(K)+PRCI(K)+PRAI(K)-QMULTS(K)-QMULTG(K)-QMULTR(K)-QMULTRG(K) &
  2276. -MNUCCD(K)+PRACI(K)+PRACIS(K)-EPRD(K)-PSACWI(K))*DT
  2277. IF (DUM.GT.QI3D(K).AND.QI3D(K).GE.QSMALL) THEN
  2278. RATIO = (QI3D(K)/DT+PRD(K)+MNUCCC(K)+QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+ &
  2279. MNUCCD(K)+PSACWI(K))/ &
  2280. (PRCI(K)+PRAI(K)+PRACI(K)+PRACIS(K)-EPRD(K))
  2281. PRCI(K) = PRCI(K)*RATIO
  2282. PRAI(K) = PRAI(K)*RATIO
  2283. PRACI(K) = PRACI(K)*RATIO
  2284. PRACIS(K) = PRACIS(K)*RATIO
  2285. EPRD(K) = EPRD(K)*RATIO
  2286. END IF
  2287. ! CONSERVATION OF QR
  2288. DUM=((PRACS(K)-PRE(K))+(QMULTR(K)+QMULTRG(K)-PRC(K))+(MNUCCR(K)-PRA(K))+ &
  2289. PIACR(K)+PIACRS(K)+PGRACS(K)+PRACG(K))*DT
  2290. IF (DUM.GT.QR3D(K).AND.QR3D(K).GE.QSMALL) THEN
  2291. RATIO = (QR3D(K)/DT+PRC(K)+PRA(K))/ &
  2292. (-PRE(K)+QMULTR(K)+QMULTRG(K)+PRACS(K)+MNUCCR(K)+PIACR(K)+PIACRS(K)+PGRACS(K)+PRACG(K))
  2293. PRE(K) = PRE(K)*RATIO
  2294. PRACS(K) = PRACS(K)*RATIO
  2295. QMULTR(K) = QMULTR(K)*RATIO
  2296. QMULTRG(K) = QMULTRG(K)*RATIO
  2297. MNUCCR(K) = MNUCCR(K)*RATIO
  2298. PIACR(K) = PIACR(K)*RATIO
  2299. PIACRS(K) = PIACRS(K)*RATIO
  2300. PGRACS(K) = PGRACS(K)*RATIO
  2301. PRACG(K) = PRACG(K)*RATIO
  2302. END IF
  2303. ! CONSERVATION OF QNI
  2304. ! CONSERVATION FOR GRAUPEL SCHEME
  2305. IF (IGRAUP.EQ.0) THEN
  2306. DUM = (-PRDS(K)-PSACWS(K)-PRAI(K)-PRCI(K)-PRACS(K)-EPRDS(K)+PSACR(K)-PIACRS(K)-PRACIS(K))*DT
  2307. IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
  2308. RATIO = (QNI3D(K)/DT+PRDS(K)+PSACWS(K)+PRAI(K)+PRCI(K)+PRACS(K)+PIACRS(K)+PRACIS(K))/(-EPRDS(K)+PSACR(K))
  2309. EPRDS(K) = EPRDS(K)*RATIO
  2310. PSACR(K) = PSACR(K)*RATIO
  2311. END IF
  2312. ! FOR NO GRAUPEL, NEED TO INCLUDE FREEZING OF RAIN FOR SNOW
  2313. ELSE IF (IGRAUP.EQ.1) THEN
  2314. DUM = (-PRDS(K)-PSACWS(K)-PRAI(K)-PRCI(K)-PRACS(K)-EPRDS(K)+PSACR(K)-PIACRS(K)-PRACIS(K)-MNUCCR(K))*DT
  2315. IF (DUM.GT.QNI3D(K).AND.QNI3D(K).GE.QSMALL) THEN
  2316. RATIO = (QNI3D(K)/DT+PRDS(K)+PSACWS(K)+PRAI(K)+PRCI(K)+PRACS(K)+PIACRS(K)+PRACIS(K)+MNUCCR(K))/(-EPRDS(K)+PSACR(K))
  2317. EPRDS(K) = EPRDS(K)*RATIO
  2318. PSACR(K) = PSACR(K)*RATIO
  2319. END IF
  2320. END IF
  2321. ! CONSERVATION OF QG
  2322. DUM = (-PSACWG(K)-PRACG(K)-PGSACW(K)-PGRACS(K)-PRDG(K)-MNUCCR(K)-EPRDG(K)-PIACR(K)-PRACI(K)-PSACR(K))*DT
  2323. IF (DUM.GT.QG3D(K).AND.QG3D(K).GE.QSMALL) THEN
  2324. RATIO = (QG3D(K)/DT+PSACWG(K)+PRACG(K)+PGSACW(K)+PGRACS(K)+PRDG(K)+MNUCCR(K)+PSACR(K)+&
  2325. PIACR(K)+PRACI(K))/(-EPRDG(K))
  2326. EPRDG(K) = EPRDG(K)*RATIO
  2327. END IF
  2328. ! TENDENCIES
  2329. QV3DTEN(K) = QV3DTEN(K)+(-PRE(K)-PRD(K)-PRDS(K)-MNUCCD(K)-EPRD(K)-EPRDS(K)-PRDG(K)-EPRDG(K))
  2330. ! BUG FIX HM, 3/1/11, INCLUDE PIACR AND PIACRS
  2331. T3DTEN(K) = T3DTEN(K)+(PRE(K) &
  2332. *XXLV(K)+(PRD(K)+PRDS(K)+ &
  2333. MNUCCD(K)+EPRD(K)+EPRDS(K)+PRDG(K)+EPRDG(K))*XXLS(K)+ &
  2334. (PSACWS(K)+PSACWI(K)+MNUCCC(K)+MNUCCR(K)+ &
  2335. QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+PRACS(K) &
  2336. +PSACWG(K)+PRACG(K)+PGSACW(K)+PGRACS(K)+PIACR(K)+PIACRS(K))*XLF(K))/CPM(K)
  2337. QC3DTEN(K) = QC3DTEN(K)+ &
  2338. (-PRA(K)-PRC(K)-MNUCCC(K)+PCC(K)- &
  2339. PSACWS(K)-PSACWI(K)-QMULTS(K)-QMULTG(K)-PSACWG(K)-PGSACW(K))
  2340. QI3DTEN(K) = QI3DTEN(K)+ &
  2341. (PRD(K)+EPRD(K)+PSACWI(K)+MNUCCC(K)-PRCI(K)- &
  2342. PRAI(K)+QMULTS(K)+QMULTG(K)+QMULTR(K)+QMULTRG(K)+MNUCCD(K)-PRACI(K)-PRACIS(K))
  2343. QR3DTEN(K) = QR3DTEN(K)+ &
  2344. (PRE(K)+PRA(K)+PRC(K)-PRACS(K)-MNUCCR(K)-QMULTR(K)-QMULTRG(K) &
  2345. -PIACR(K)-PIACRS(K)-PRACG(K)-PGRACS(K))
  2346. IF (IGRAUP.EQ.0) THEN
  2347. QNI3DTEN(K) = QNI3DTEN(K)+ &
  2348. (PRAI(K)+PSACWS(K)+PRDS(K)+PRACS(K)+PRCI(K)+EPRDS(K)-PSACR(K)+PIACRS(K)+PRACIS(K))
  2349. NS3DTEN(K) = NS3DTEN(K)+(NSAGG(K)+NPRCI(K)-NSCNG(K)-NGRACS(K)+NIACRS(K))
  2350. QG3DTEN(K) = QG3DTEN(K)+(PRACG(K)+PSACWG(K)+PGSACW(K)+PGRACS(K)+ &
  2351. PRDG(K)+EPRDG(K)+MNUCCR(K)+PIACR(K)+PRACI(K)+PSACR(K))
  2352. NG3DTEN(K) = NG3DTEN(K)+(NSCNG(K)+NGRACS(K)+NNUCCR(K)+NIACR(K))
  2353. ! FOR NO GRAUPEL, NEED TO INCLUDE FREEZING OF RAIN FOR SNOW
  2354. ELSE IF (IGRAUP.EQ.1) THEN
  2355. QNI3DTEN(K) = QNI3DTEN(K)+ &
  2356. (PRAI(K)+PSACWS(K)+PRDS(K)+PRACS(K)+PRCI(K)+EPRDS(K)-PSACR(K)+PIACRS(K)+PRACIS(K)+MNUCCR(K))
  2357. NS3DTEN(K) = NS3DTEN(K)+(NSAGG(K)+NPRCI(K)-NSCNG(K)-NGRACS(K)+NIACRS(K)+NNUCCR(K))
  2358. END IF
  2359. NC3DTEN(K) = NC3DTEN(K)+(-NNUCCC(K)-NPSACWS(K) &
  2360. -NPRA(K)-NPRC(K)-NPSACWI(K)-NPSACWG(K))
  2361. NI3DTEN(K) = NI3DTEN(K)+ &
  2362. (NNUCCC(K)-NPRCI(K)-NPRAI(K)+NMULTS(K)+NMULTG(K)+NMULTR(K)+NMULTRG(K)+ &
  2363. NNUCCD(K)-NIACR(K)-NIACRS(K))
  2364. NR3DTEN(K) = NR3DTEN(K)+(NPRC1(K)-NPRACS(K)-NNUCCR(K) &
  2365. +NRAGG(K)-NIACR(K)-NIACRS(K)-NPRACG(K)-NGRACS(K))
  2366. ! HM ADD, WRF-CHEM, ADD TENDENCIES FOR C2PREC
  2367. C2PREC(K) = PRA(K)+PRC(K)+PSACWS(K)+QMULTS(K)+QMULTG(K)+PSACWG(K)+ &
  2368. PGSACW(K)+MNUCCC(K)+PSACWI(K)
  2369. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2370. ! NOW CALCULATE SATURATION ADJUSTMENT TO CONDENSE EXTRA VAPOR ABOVE
  2371. ! WATER SATURATION
  2372. DUMT = T3D(K)+DT*T3DTEN(K)
  2373. DUMQV = QV3D(K)+DT*QV3DTEN(K)
  2374. ! hm, add fix for low pressure, 5/12/10
  2375. dum=min(0.99*pres(k),POLYSVP(DUMT,0))
  2376. DUMQSS = EP_2*dum/(PRES(K)-dum)
  2377. DUMQC = QC3D(K)+DT*QC3DTEN(K)
  2378. DUMQC = MAX(DUMQC,0.)
  2379. ! SATURATION ADJUSTMENT FOR LIQUID
  2380. DUMS = DUMQV-DUMQSS
  2381. PCC(K) = DUMS/(1.+XXLV(K)**2*DUMQSS/(CPM(K)*RV*DUMT**2))/DT
  2382. IF (PCC(K)*DT+DUMQC.LT.0.) THEN
  2383. PCC(K) = -DUMQC/DT
  2384. END IF
  2385. QV3DTEN(K) = QV3DTEN(K)-PCC(K)
  2386. T3DTEN(K) = T3DTEN(K)+PCC(K)*XXLV(K)/CPM(K)
  2387. QC3DTEN(K) = QC3DTEN(K)+PCC(K)
  2388. !.......................................................................
  2389. ! ACTIVATION OF CLOUD DROPLETS
  2390. ! ACTIVATION OF DROPLET CURRENTLY NOT CALCULATED
  2391. ! DROPLET CONCENTRATION IS SPECIFIED !!!!!
  2392. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2393. ! SUBLIMATE, MELT, OR EVAPORATE NUMBER CONCENTRATION
  2394. ! THIS FORMULATION ASSUMES 1:1 RATIO BETWEEN MASS LOSS AND
  2395. ! LOSS OF NUMBER CONCENTRATION
  2396. ! IF (PCC(K).LT.0.) THEN
  2397. ! DUM = PCC(K)*DT/QC3D(K)
  2398. ! DUM = MAX(-1.,DUM)
  2399. ! NSUBC(K) = DUM*NC3D(K)/DT
  2400. ! END IF
  2401. IF (EPRD(K).LT.0.) THEN
  2402. DUM = EPRD(K)*DT/QI3D(K)
  2403. DUM = MAX(-1.,DUM)
  2404. NSUBI(K) = DUM*NI3D(K)/DT
  2405. END IF
  2406. IF (EPRDS(K).LT.0.) THEN
  2407. DUM = EPRDS(K)*DT/QNI3D(K)
  2408. DUM = MAX(-1.,DUM)
  2409. NSUBS(K) = DUM*NS3D(K)/DT
  2410. END IF
  2411. IF (PRE(K).LT.0.) THEN
  2412. DUM = PRE(K)*DT/QR3D(K)
  2413. DUM = MAX(-1.,DUM)
  2414. NSUBR(K) = DUM*NR3D(K)/DT
  2415. END IF
  2416. IF (EPRDG(K).LT.0.) THEN
  2417. DUM = EPRDG(K)*DT/QG3D(K)
  2418. DUM = MAX(-1.,DUM)
  2419. NSUBG(K) = DUM*NG3D(K)/DT
  2420. END IF
  2421. ! nsubr(k)=0.
  2422. ! nsubs(k)=0.
  2423. ! nsubg(k)=0.
  2424. ! UPDATE TENDENCIES
  2425. ! NC3DTEN(K) = NC3DTEN(K)+NSUBC(K)
  2426. NI3DTEN(K) = NI3DTEN(K)+NSUBI(K)
  2427. NS3DTEN(K) = NS3DTEN(K)+NSUBS(K)
  2428. NG3DTEN(K) = NG3DTEN(K)+NSUBG(K)
  2429. NR3DTEN(K) = NR3DTEN(K)+NSUBR(K)
  2430. END IF !!!!!! TEMPERATURE
  2431. ! SWITCH LTRUE TO 1, SINCE HYDROMETEORS ARE PRESENT
  2432. LTRUE = 1
  2433. 200 CONTINUE
  2434. END DO
  2435. ! INITIALIZE PRECIP AND SNOW RATES
  2436. PRECRT = 0.
  2437. SNOWRT = 0.
  2438. ! IF THERE ARE NO HYDROMETEORS, THEN SKIP TO END OF SUBROUTINE
  2439. IF (LTRUE.EQ.0) GOTO 400
  2440. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2441. !.......................................................................
  2442. ! CALCULATE SEDIMENATION
  2443. ! THE NUMERICS HERE FOLLOW FROM REISNER ET AL. (1998)
  2444. ! FALLOUT TERMS ARE CALCULATED ON SPLIT TIME STEPS TO ENSURE NUMERICAL
  2445. ! STABILITY, I.E. COURANT# < 1
  2446. !.......................................................................
  2447. NSTEP = 1
  2448. DO K = KTE,KTS,-1
  2449. DUMI(K) = QI3D(K)+QI3DTEN(K)*DT
  2450. DUMQS(K) = QNI3D(K)+QNI3DTEN(K)*DT
  2451. DUMR(K) = QR3D(K)+QR3DTEN(K)*DT
  2452. DUMFNI(K) = NI3D(K)+NI3DTEN(K)*DT
  2453. DUMFNS(K) = NS3D(K)+NS3DTEN(K)*DT
  2454. DUMFNR(K) = NR3D(K)+NR3DTEN(K)*DT
  2455. DUMC(K) = QC3D(K)+QC3DTEN(K)*DT
  2456. DUMFNC(K) = NC3D(K)+NC3DTEN(K)*DT
  2457. DUMG(K) = QG3D(K)+QG3DTEN(K)*DT
  2458. DUMFNG(K) = NG3D(K)+NG3DTEN(K)*DT
  2459. ! SWITCH FOR CONSTANT DROPLET NUMBER
  2460. IF (iinum.EQ.1) THEN
  2461. DUMFNC(K) = NC3D(K)
  2462. END IF
  2463. ! GET DUMMY LAMDA FOR SEDIMENTATION CALCULATIONS
  2464. ! MAKE SURE NUMBER CONCENTRATIONS ARE POSITIVE
  2465. DUMFNI(K) = MAX(0.,DUMFNI(K))
  2466. DUMFNS(K) = MAX(0.,DUMFNS(K))
  2467. DUMFNC(K) = MAX(0.,DUMFNC(K))
  2468. DUMFNR(K) = MAX(0.,DUMFNR(K))
  2469. DUMFNG(K) = MAX(0.,DUMFNG(K))
  2470. !......................................................................
  2471. ! CLOUD ICE
  2472. IF (DUMI(K).GE.QSMALL) THEN
  2473. DLAMI = (CONS12*DUMFNI(K)/DUMI(K))**(1./DI)
  2474. DLAMI=MAX(DLAMI,LAMMINI)
  2475. DLAMI=MIN(DLAMI,LAMMAXI)
  2476. END IF
  2477. !......................................................................
  2478. ! RAIN
  2479. IF (DUMR(K).GE.QSMALL) THEN
  2480. DLAMR = (PI*RHOW*DUMFNR(K)/DUMR(K))**(1./3.)
  2481. DLAMR=MAX(DLAMR,LAMMINR)
  2482. DLAMR=MIN(DLAMR,LAMMAXR)
  2483. END IF
  2484. !......................................................................
  2485. ! CLOUD DROPLETS
  2486. IF (DUMC(K).GE.QSMALL) THEN
  2487. DUM = PRES(K)/(287.15*T3D(K))
  2488. PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
  2489. PGAM(K)=1./(PGAM(K)**2)-1.
  2490. PGAM(K)=MAX(PGAM(K),2.)
  2491. PGAM(K)=MIN(PGAM(K),10.)
  2492. DLAMC = (CONS26*DUMFNC(K)*GAMMA(PGAM(K)+4.)/(DUMC(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
  2493. LAMMIN = (PGAM(K)+1.)/60.E-6
  2494. LAMMAX = (PGAM(K)+1.)/1.E-6
  2495. DLAMC=MAX(DLAMC,LAMMIN)
  2496. DLAMC=MIN(DLAMC,LAMMAX)
  2497. END IF
  2498. !......................................................................
  2499. ! SNOW
  2500. IF (DUMQS(K).GE.QSMALL) THEN
  2501. DLAMS = (CONS1*DUMFNS(K)/ DUMQS(K))**(1./DS)
  2502. DLAMS=MAX(DLAMS,LAMMINS)
  2503. DLAMS=MIN(DLAMS,LAMMAXS)
  2504. END IF
  2505. !......................................................................
  2506. ! GRAUPEL
  2507. IF (DUMG(K).GE.QSMALL) THEN
  2508. DLAMG = (CONS2*DUMFNG(K)/ DUMG(K))**(1./DG)
  2509. DLAMG=MAX(DLAMG,LAMMING)
  2510. DLAMG=MIN(DLAMG,LAMMAXG)
  2511. END IF
  2512. !......................................................................
  2513. ! CALCULATE NUMBER-WEIGHTED AND MASS-WEIGHTED TERMINAL FALL SPEEDS
  2514. ! CLOUD WATER
  2515. IF (DUMC(K).GE.QSMALL) THEN
  2516. UNC = ACN(K)*GAMMA(1.+BC+PGAM(K))/ (DLAMC**BC*GAMMA(PGAM(K)+1.))
  2517. UMC = ACN(K)*GAMMA(4.+BC+PGAM(K))/ (DLAMC**BC*GAMMA(PGAM(K)+4.))
  2518. ELSE
  2519. UMC = 0.
  2520. UNC = 0.
  2521. END IF
  2522. IF (DUMI(K).GE.QSMALL) THEN
  2523. UNI = AIN(K)*CONS27/DLAMI**BI
  2524. UMI = AIN(K)*CONS28/(DLAMI**BI)
  2525. ELSE
  2526. UMI = 0.
  2527. UNI = 0.
  2528. END IF
  2529. IF (DUMR(K).GE.QSMALL) THEN
  2530. UNR = ARN(K)*CONS6/DLAMR**BR
  2531. UMR = ARN(K)*CONS4/(DLAMR**BR)
  2532. ELSE
  2533. UMR = 0.
  2534. UNR = 0.
  2535. END IF
  2536. IF (DUMQS(K).GE.QSMALL) THEN
  2537. UMS = ASN(K)*CONS3/(DLAMS**BS)
  2538. UNS = ASN(K)*CONS5/DLAMS**BS
  2539. ELSE
  2540. UMS = 0.
  2541. UNS = 0.
  2542. END IF
  2543. IF (DUMG(K).GE.QSMALL) THEN
  2544. UMG = AGN(K)*CONS7/(DLAMG**BG)
  2545. UNG = AGN(K)*CONS8/DLAMG**BG
  2546. ELSE
  2547. UMG = 0.
  2548. UNG = 0.
  2549. END IF
  2550. ! SET REALISTIC LIMITS ON FALLSPEED
  2551. ! bug fix, 10/08/09
  2552. dum=(rhosu/rho(k))**0.54
  2553. UMS=MIN(UMS,1.2*dum)
  2554. UNS=MIN(UNS,1.2*dum)
  2555. ! fix 053011
  2556. ! fix for correction by AA 4/6/11
  2557. UMI=MIN(UMI,1.2*(rhosu/rho(k))**0.35)
  2558. UNI=MIN(UNI,1.2*(rhosu/rho(k))**0.35)
  2559. UMR=MIN(UMR,9.1*dum)
  2560. UNR=MIN(UNR,9.1*dum)
  2561. UMG=MIN(UMG,20.*dum)
  2562. UNG=MIN(UNG,20.*dum)
  2563. FR(K) = UMR
  2564. FI(K) = UMI
  2565. FNI(K) = UNI
  2566. FS(K) = UMS
  2567. FNS(K) = UNS
  2568. FNR(K) = UNR
  2569. FC(K) = UMC
  2570. FNC(K) = UNC
  2571. FG(K) = UMG
  2572. FNG(K) = UNG
  2573. ! V3.3 MODIFY FALLSPEED BELOW LEVEL OF PRECIP
  2574. IF (K.LE.KTE-1) THEN
  2575. IF (FR(K).LT.1.E-10) THEN
  2576. FR(K)=FR(K+1)
  2577. END IF
  2578. IF (FI(K).LT.1.E-10) THEN
  2579. FI(K)=FI(K+1)
  2580. END IF
  2581. IF (FNI(K).LT.1.E-10) THEN
  2582. FNI(K)=FNI(K+1)
  2583. END IF
  2584. IF (FS(K).LT.1.E-10) THEN
  2585. FS(K)=FS(K+1)
  2586. END IF
  2587. IF (FNS(K).LT.1.E-10) THEN
  2588. FNS(K)=FNS(K+1)
  2589. END IF
  2590. IF (FNR(K).LT.1.E-10) THEN
  2591. FNR(K)=FNR(K+1)
  2592. END IF
  2593. IF (FC(K).LT.1.E-10) THEN
  2594. FC(K)=FC(K+1)
  2595. END IF
  2596. IF (FNC(K).LT.1.E-10) THEN
  2597. FNC(K)=FNC(K+1)
  2598. END IF
  2599. IF (FG(K).LT.1.E-10) THEN
  2600. FG(K)=FG(K+1)
  2601. END IF
  2602. IF (FNG(K).LT.1.E-10) THEN
  2603. FNG(K)=FNG(K+1)
  2604. END IF
  2605. END IF ! K LE KTE-1
  2606. ! CALCULATE NUMBER OF SPLIT TIME STEPS
  2607. RGVM = MAX(FR(K),FI(K),FS(K),FC(K),FNI(K),FNR(K),FNS(K),FNC(K),FG(K),FNG(K))
  2608. ! VVT CHANGED IFIX -> INT (GENERIC FUNCTION)
  2609. NSTEP = MAX(INT(RGVM*DT/DZQ(K)+1.),NSTEP)
  2610. ! MULTIPLY VARIABLES BY RHO
  2611. DUMR(k) = DUMR(k)*RHO(K)
  2612. DUMI(k) = DUMI(k)*RHO(K)
  2613. DUMFNI(k) = DUMFNI(K)*RHO(K)
  2614. DUMQS(k) = DUMQS(K)*RHO(K)
  2615. DUMFNS(k) = DUMFNS(K)*RHO(K)
  2616. DUMFNR(k) = DUMFNR(K)*RHO(K)
  2617. DUMC(k) = DUMC(K)*RHO(K)
  2618. DUMFNC(k) = DUMFNC(K)*RHO(K)
  2619. DUMG(k) = DUMG(K)*RHO(K)
  2620. DUMFNG(k) = DUMFNG(K)*RHO(K)
  2621. END DO
  2622. DO N = 1,NSTEP
  2623. DO K = KTS,KTE
  2624. FALOUTR(K) = FR(K)*DUMR(K)
  2625. FALOUTI(K) = FI(K)*DUMI(K)
  2626. FALOUTNI(K) = FNI(K)*DUMFNI(K)
  2627. FALOUTS(K) = FS(K)*DUMQS(K)
  2628. FALOUTNS(K) = FNS(K)*DUMFNS(K)
  2629. FALOUTNR(K) = FNR(K)*DUMFNR(K)
  2630. FALOUTC(K) = FC(K)*DUMC(K)
  2631. FALOUTNC(K) = FNC(K)*DUMFNC(K)
  2632. FALOUTG(K) = FG(K)*DUMG(K)
  2633. FALOUTNG(K) = FNG(K)*DUMFNG(K)
  2634. END DO
  2635. ! TOP OF MODEL
  2636. K = KTE
  2637. FALTNDR = FALOUTR(K)/DZQ(k)
  2638. FALTNDI = FALOUTI(K)/DZQ(k)
  2639. FALTNDNI = FALOUTNI(K)/DZQ(k)
  2640. FALTNDS = FALOUTS(K)/DZQ(k)
  2641. FALTNDNS = FALOUTNS(K)/DZQ(k)
  2642. FALTNDNR = FALOUTNR(K)/DZQ(k)
  2643. FALTNDC = FALOUTC(K)/DZQ(k)
  2644. FALTNDNC = FALOUTNC(K)/DZQ(k)
  2645. FALTNDG = FALOUTG(K)/DZQ(k)
  2646. FALTNDNG = FALOUTNG(K)/DZQ(k)
  2647. ! ADD FALLOUT TERMS TO EULERIAN TENDENCIES
  2648. QRSTEN(K) = QRSTEN(K)-FALTNDR/NSTEP/RHO(k)
  2649. QISTEN(K) = QISTEN(K)-FALTNDI/NSTEP/RHO(k)
  2650. NI3DTEN(K) = NI3DTEN(K)-FALTNDNI/NSTEP/RHO(k)
  2651. QNISTEN(K) = QNISTEN(K)-FALTNDS/NSTEP/RHO(k)
  2652. NS3DTEN(K) = NS3DTEN(K)-FALTNDNS/NSTEP/RHO(k)
  2653. NR3DTEN(K) = NR3DTEN(K)-FALTNDNR/NSTEP/RHO(k)
  2654. QCSTEN(K) = QCSTEN(K)-FALTNDC/NSTEP/RHO(k)
  2655. NC3DTEN(K) = NC3DTEN(K)-FALTNDNC/NSTEP/RHO(k)
  2656. QGSTEN(K) = QGSTEN(K)-FALTNDG/NSTEP/RHO(k)
  2657. NG3DTEN(K) = NG3DTEN(K)-FALTNDNG/NSTEP/RHO(k)
  2658. DUMR(K) = DUMR(K)-FALTNDR*DT/NSTEP
  2659. DUMI(K) = DUMI(K)-FALTNDI*DT/NSTEP
  2660. DUMFNI(K) = DUMFNI(K)-FALTNDNI*DT/NSTEP
  2661. DUMQS(K) = DUMQS(K)-FALTNDS*DT/NSTEP
  2662. DUMFNS(K) = DUMFNS(K)-FALTNDNS*DT/NSTEP
  2663. DUMFNR(K) = DUMFNR(K)-FALTNDNR*DT/NSTEP
  2664. DUMC(K) = DUMC(K)-FALTNDC*DT/NSTEP
  2665. DUMFNC(K) = DUMFNC(K)-FALTNDNC*DT/NSTEP
  2666. DUMG(K) = DUMG(K)-FALTNDG*DT/NSTEP
  2667. DUMFNG(K) = DUMFNG(K)-FALTNDNG*DT/NSTEP
  2668. DO K = KTE-1,KTS,-1
  2669. FALTNDR = (FALOUTR(K+1)-FALOUTR(K))/DZQ(K)
  2670. FALTNDI = (FALOUTI(K+1)-FALOUTI(K))/DZQ(K)
  2671. FALTNDNI = (FALOUTNI(K+1)-FALOUTNI(K))/DZQ(K)
  2672. FALTNDS = (FALOUTS(K+1)-FALOUTS(K))/DZQ(K)
  2673. FALTNDNS = (FALOUTNS(K+1)-FALOUTNS(K))/DZQ(K)
  2674. FALTNDNR = (FALOUTNR(K+1)-FALOUTNR(K))/DZQ(K)
  2675. FALTNDC = (FALOUTC(K+1)-FALOUTC(K))/DZQ(K)
  2676. FALTNDNC = (FALOUTNC(K+1)-FALOUTNC(K))/DZQ(K)
  2677. FALTNDG = (FALOUTG(K+1)-FALOUTG(K))/DZQ(K)
  2678. FALTNDNG = (FALOUTNG(K+1)-FALOUTNG(K))/DZQ(K)
  2679. ! ADD FALLOUT TERMS TO EULERIAN TENDENCIES
  2680. QRSTEN(K) = QRSTEN(K)+FALTNDR/NSTEP/RHO(k)
  2681. QISTEN(K) = QISTEN(K)+FALTNDI/NSTEP/RHO(k)
  2682. NI3DTEN(K) = NI3DTEN(K)+FALTNDNI/NSTEP/RHO(k)
  2683. QNISTEN(K) = QNISTEN(K)+FALTNDS/NSTEP/RHO(k)
  2684. NS3DTEN(K) = NS3DTEN(K)+FALTNDNS/NSTEP/RHO(k)
  2685. NR3DTEN(K) = NR3DTEN(K)+FALTNDNR/NSTEP/RHO(k)
  2686. QCSTEN(K) = QCSTEN(K)+FALTNDC/NSTEP/RHO(k)
  2687. NC3DTEN(K) = NC3DTEN(K)+FALTNDNC/NSTEP/RHO(k)
  2688. QGSTEN(K) = QGSTEN(K)+FALTNDG/NSTEP/RHO(k)
  2689. NG3DTEN(K) = NG3DTEN(K)+FALTNDNG/NSTEP/RHO(k)
  2690. DUMR(K) = DUMR(K)+FALTNDR*DT/NSTEP
  2691. DUMI(K) = DUMI(K)+FALTNDI*DT/NSTEP
  2692. DUMFNI(K) = DUMFNI(K)+FALTNDNI*DT/NSTEP
  2693. DUMQS(K) = DUMQS(K)+FALTNDS*DT/NSTEP
  2694. DUMFNS(K) = DUMFNS(K)+FALTNDNS*DT/NSTEP
  2695. DUMFNR(K) = DUMFNR(K)+FALTNDNR*DT/NSTEP
  2696. DUMC(K) = DUMC(K)+FALTNDC*DT/NSTEP
  2697. DUMFNC(K) = DUMFNC(K)+FALTNDNC*DT/NSTEP
  2698. DUMG(K) = DUMG(K)+FALTNDG*DT/NSTEP
  2699. DUMFNG(K) = DUMFNG(K)+FALTNDNG*DT/NSTEP
  2700. ! FOR WRF-CHEM, NEED PRECIP RATES (UNITS OF KG/M^2/S)
  2701. CSED(K)=CSED(K)+FALOUTC(K)/NSTEP
  2702. ISED(K)=ISED(K)+FALOUTI(K)/NSTEP
  2703. SSED(K)=SSED(K)+FALOUTS(K)/NSTEP
  2704. GSED(K)=GSED(K)+FALOUTG(K)/NSTEP
  2705. RSED(K)=RSED(K)+FALOUTR(K)/NSTEP
  2706. END DO
  2707. ! GET PRECIPITATION AND SNOWFALL ACCUMULATION DURING THE TIME STEP
  2708. ! FACTOR OF 1000 CONVERTS FROM M TO MM, BUT DIVISION BY DENSITY
  2709. ! OF LIQUID WATER CANCELS THIS FACTOR OF 1000
  2710. PRECRT = PRECRT+(FALOUTR(KTS)+FALOUTC(KTS)+FALOUTS(KTS)+FALOUTI(KTS)+FALOUTG(KTS)) &
  2711. *DT/NSTEP
  2712. SNOWRT = SNOWRT+(FALOUTS(KTS)+FALOUTI(KTS)+FALOUTG(KTS))*DT/NSTEP
  2713. END DO
  2714. DO K=KTS,KTE
  2715. ! ADD ON SEDIMENTATION TENDENCIES FOR MIXING RATIO TO REST OF TENDENCIES
  2716. QR3DTEN(K)=QR3DTEN(K)+QRSTEN(K)
  2717. QI3DTEN(K)=QI3DTEN(K)+QISTEN(K)
  2718. QC3DTEN(K)=QC3DTEN(K)+QCSTEN(K)
  2719. QG3DTEN(K)=QG3DTEN(K)+QGSTEN(K)
  2720. QNI3DTEN(K)=QNI3DTEN(K)+QNISTEN(K)
  2721. ! PUT ALL CLOUD ICE IN SNOW CATEGORY IF MEAN DIAMETER EXCEEDS 2 * dcs
  2722. !hm 4/7/09 bug fix
  2723. ! IF (QI3D(K).GE.QSMALL.AND.T3D(K).LT.273.15) THEN
  2724. IF (QI3D(K).GE.QSMALL.AND.T3D(K).LT.273.15.AND.LAMI(K).GE.1.E-10) THEN
  2725. IF (1./LAMI(K).GE.2.*DCS) THEN
  2726. QNI3DTEN(K) = QNI3DTEN(K)+QI3D(K)/DT+ QI3DTEN(K)
  2727. NS3DTEN(K) = NS3DTEN(K)+NI3D(K)/DT+ NI3DTEN(K)
  2728. QI3DTEN(K) = -QI3D(K)/DT
  2729. NI3DTEN(K) = -NI3D(K)/DT
  2730. END IF
  2731. END IF
  2732. ! hm add tendencies here, then call sizeparameter
  2733. ! to ensure consisitency between mixing ratio and number concentration
  2734. QC3D(k) = QC3D(k)+QC3DTEN(k)*DT
  2735. QI3D(k) = QI3D(k)+QI3DTEN(k)*DT
  2736. QNI3D(k) = QNI3D(k)+QNI3DTEN(k)*DT
  2737. QR3D(k) = QR3D(k)+QR3DTEN(k)*DT
  2738. NC3D(k) = NC3D(k)+NC3DTEN(k)*DT
  2739. NI3D(k) = NI3D(k)+NI3DTEN(k)*DT
  2740. NS3D(k) = NS3D(k)+NS3DTEN(k)*DT
  2741. NR3D(k) = NR3D(k)+NR3DTEN(k)*DT
  2742. IF (IGRAUP.EQ.0) THEN
  2743. QG3D(k) = QG3D(k)+QG3DTEN(k)*DT
  2744. NG3D(k) = NG3D(k)+NG3DTEN(k)*DT
  2745. END IF
  2746. ! ADD TEMPERATURE AND WATER VAPOR TENDENCIES FROM MICROPHYSICS
  2747. T3D(K) = T3D(K)+T3DTEN(k)*DT
  2748. QV3D(K) = QV3D(K)+QV3DTEN(k)*DT
  2749. ! SATURATION VAPOR PRESSURE AND MIXING RATIO
  2750. ! hm, add fix for low pressure, 5/12/10
  2751. EVS(K) = min(0.99*pres(k),POLYSVP(T3D(K),0)) ! PA
  2752. EIS(K) = min(0.99*pres(k),POLYSVP(T3D(K),1)) ! PA
  2753. ! MAKE SURE ICE SATURATION DOESN'T EXCEED WATER SAT. NEAR FREEZING
  2754. IF (EIS(K).GT.EVS(K)) EIS(K) = EVS(K)
  2755. QVS(K) = EP_2*EVS(K)/(PRES(K)-EVS(K))
  2756. QVI(K) = EP_2*EIS(K)/(PRES(K)-EIS(K))
  2757. QVQVS(K) = QV3D(K)/QVS(K)
  2758. QVQVSI(K) = QV3D(K)/QVI(K)
  2759. ! AT SUBSATURATION, REMOVE SMALL AMOUNTS OF CLOUD/PRECIP WATER
  2760. ! hm 7/9/09 change limit to 1.e-8
  2761. IF (QVQVS(K).LT.0.9) THEN
  2762. IF (QR3D(K).LT.1.E-8) THEN
  2763. QV3D(K)=QV3D(K)+QR3D(K)
  2764. T3D(K)=T3D(K)-QR3D(K)*XXLV(K)/CPM(K)
  2765. QR3D(K)=0.
  2766. END IF
  2767. IF (QC3D(K).LT.1.E-8) THEN
  2768. QV3D(K)=QV3D(K)+QC3D(K)
  2769. T3D(K)=T3D(K)-QC3D(K)*XXLV(K)/CPM(K)
  2770. QC3D(K)=0.
  2771. END IF
  2772. END IF
  2773. IF (QVQVSI(K).LT.0.9) THEN
  2774. IF (QI3D(K).LT.1.E-8) THEN
  2775. QV3D(K)=QV3D(K)+QI3D(K)
  2776. T3D(K)=T3D(K)-QI3D(K)*XXLS(K)/CPM(K)
  2777. QI3D(K)=0.
  2778. END IF
  2779. IF (QNI3D(K).LT.1.E-8) THEN
  2780. QV3D(K)=QV3D(K)+QNI3D(K)
  2781. T3D(K)=T3D(K)-QNI3D(K)*XXLS(K)/CPM(K)
  2782. QNI3D(K)=0.
  2783. END IF
  2784. IF (QG3D(K).LT.1.E-8) THEN
  2785. QV3D(K)=QV3D(K)+QG3D(K)
  2786. T3D(K)=T3D(K)-QG3D(K)*XXLS(K)/CPM(K)
  2787. QG3D(K)=0.
  2788. END IF
  2789. END IF
  2790. !..................................................................
  2791. ! IF MIXING RATIO < QSMALL SET MIXING RATIO AND NUMBER CONC TO ZERO
  2792. IF (QC3D(K).LT.QSMALL) THEN
  2793. QC3D(K) = 0.
  2794. NC3D(K) = 0.
  2795. EFFC(K) = 0.
  2796. END IF
  2797. IF (QR3D(K).LT.QSMALL) THEN
  2798. QR3D(K) = 0.
  2799. NR3D(K) = 0.
  2800. EFFR(K) = 0.
  2801. END IF
  2802. IF (QI3D(K).LT.QSMALL) THEN
  2803. QI3D(K) = 0.
  2804. NI3D(K) = 0.
  2805. EFFI(K) = 0.
  2806. END IF
  2807. IF (QNI3D(K).LT.QSMALL) THEN
  2808. QNI3D(K) = 0.
  2809. NS3D(K) = 0.
  2810. EFFS(K) = 0.
  2811. END IF
  2812. IF (QG3D(K).LT.QSMALL) THEN
  2813. QG3D(K) = 0.
  2814. NG3D(K) = 0.
  2815. EFFG(K) = 0.
  2816. END IF
  2817. !..................................
  2818. ! IF THERE IS NO CLOUD/PRECIP WATER, THEN SKIP CALCULATIONS
  2819. IF (QC3D(K).LT.QSMALL.AND.QI3D(K).LT.QSMALL.AND.QNI3D(K).LT.QSMALL &
  2820. .AND.QR3D(K).LT.QSMALL.AND.QG3D(K).LT.QSMALL) GOTO 500
  2821. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2822. ! CALCULATE INSTANTANEOUS PROCESSES
  2823. ! ADD MELTING OF CLOUD ICE TO FORM RAIN
  2824. IF (QI3D(K).GE.QSMALL.AND.T3D(K).GE.273.15) THEN
  2825. QR3D(K) = QR3D(K)+QI3D(K)
  2826. T3D(K) = T3D(K)-QI3D(K)*XLF(K)/CPM(K)
  2827. QI3D(K) = 0.
  2828. NR3D(K) = NR3D(K)+NI3D(K)
  2829. NI3D(K) = 0.
  2830. END IF
  2831. ! ****SENSITIVITY - NO ICE
  2832. IF (ILIQ.EQ.1) GOTO 778
  2833. ! HOMOGENEOUS FREEZING OF CLOUD WATER
  2834. IF (T3D(K).LE.233.15.AND.QC3D(K).GE.QSMALL) THEN
  2835. QI3D(K)=QI3D(K)+QC3D(K)
  2836. T3D(K)=T3D(K)+QC3D(K)*XLF(K)/CPM(K)
  2837. QC3D(K)=0.
  2838. NI3D(K)=NI3D(K)+NC3D(K)
  2839. NC3D(K)=0.
  2840. END IF
  2841. ! HOMOGENEOUS FREEZING OF RAIN
  2842. IF (IGRAUP.EQ.0) THEN
  2843. IF (T3D(K).LE.233.15.AND.QR3D(K).GE.QSMALL) THEN
  2844. QG3D(K) = QG3D(K)+QR3D(K)
  2845. T3D(K) = T3D(K)+QR3D(K)*XLF(K)/CPM(K)
  2846. QR3D(K) = 0.
  2847. NG3D(K) = NG3D(K)+ NR3D(K)
  2848. NR3D(K) = 0.
  2849. END IF
  2850. ELSE IF (IGRAUP.EQ.1) THEN
  2851. IF (T3D(K).LE.233.15.AND.QR3D(K).GE.QSMALL) THEN
  2852. QNI3D(K) = QNI3D(K)+QR3D(K)
  2853. T3D(K) = T3D(K)+QR3D(K)*XLF(K)/CPM(K)
  2854. QR3D(K) = 0.
  2855. NS3D(K) = NS3D(K)+NR3D(K)
  2856. NR3D(K) = 0.
  2857. END IF
  2858. END IF
  2859. 778 CONTINUE
  2860. ! MAKE SURE NUMBER CONCENTRATIONS AREN'T NEGATIVE
  2861. NI3D(K) = MAX(0.,NI3D(K))
  2862. NS3D(K) = MAX(0.,NS3D(K))
  2863. NC3D(K) = MAX(0.,NC3D(K))
  2864. NR3D(K) = MAX(0.,NR3D(K))
  2865. NG3D(K) = MAX(0.,NG3D(K))
  2866. !......................................................................
  2867. ! CLOUD ICE
  2868. IF (QI3D(K).GE.QSMALL) THEN
  2869. LAMI(K) = (CONS12* &
  2870. NI3D(K)/QI3D(K))**(1./DI)
  2871. ! CHECK FOR SLOPE
  2872. ! ADJUST VARS
  2873. IF (LAMI(K).LT.LAMMINI) THEN
  2874. LAMI(K) = LAMMINI
  2875. N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
  2876. NI3D(K) = N0I(K)/LAMI(K)
  2877. ELSE IF (LAMI(K).GT.LAMMAXI) THEN
  2878. LAMI(K) = LAMMAXI
  2879. N0I(K) = LAMI(K)**4*QI3D(K)/CONS12
  2880. NI3D(K) = N0I(K)/LAMI(K)
  2881. END IF
  2882. END IF
  2883. !......................................................................
  2884. ! RAIN
  2885. IF (QR3D(K).GE.QSMALL) THEN
  2886. LAMR(K) = (PI*RHOW*NR3D(K)/QR3D(K))**(1./3.)
  2887. ! CHECK FOR SLOPE
  2888. ! ADJUST VARS
  2889. IF (LAMR(K).LT.LAMMINR) THEN
  2890. LAMR(K) = LAMMINR
  2891. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  2892. NR3D(K) = N0RR(K)/LAMR(K)
  2893. ELSE IF (LAMR(K).GT.LAMMAXR) THEN
  2894. LAMR(K) = LAMMAXR
  2895. N0RR(K) = LAMR(K)**4*QR3D(K)/(PI*RHOW)
  2896. NR3D(K) = N0RR(K)/LAMR(K)
  2897. END IF
  2898. END IF
  2899. !......................................................................
  2900. ! CLOUD DROPLETS
  2901. ! MARTIN ET AL. (1994) FORMULA FOR PGAM
  2902. IF (QC3D(K).GE.QSMALL) THEN
  2903. DUM = PRES(K)/(287.15*T3D(K))
  2904. PGAM(K)=0.0005714*(NC3D(K)/1.E6*DUM)+0.2714
  2905. PGAM(K)=1./(PGAM(K)**2)-1.
  2906. PGAM(K)=MAX(PGAM(K),2.)
  2907. PGAM(K)=MIN(PGAM(K),10.)
  2908. ! CALCULATE LAMC
  2909. LAMC(K) = (CONS26*NC3D(K)*GAMMA(PGAM(K)+4.)/ &
  2910. (QC3D(K)*GAMMA(PGAM(K)+1.)))**(1./3.)
  2911. ! LAMMIN, 60 MICRON DIAMETER
  2912. ! LAMMAX, 1 MICRON
  2913. LAMMIN = (PGAM(K)+1.)/60.E-6
  2914. LAMMAX = (PGAM(K)+1.)/1.E-6
  2915. IF (LAMC(K).LT.LAMMIN) THEN
  2916. LAMC(K) = LAMMIN
  2917. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  2918. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  2919. ELSE IF (LAMC(K).GT.LAMMAX) THEN
  2920. LAMC(K) = LAMMAX
  2921. NC3D(K) = EXP(3.*LOG(LAMC(K))+LOG(QC3D(K))+ &
  2922. LOG(GAMMA(PGAM(K)+1.))-LOG(GAMMA(PGAM(K)+4.)))/CONS26
  2923. END IF
  2924. END IF
  2925. !......................................................................
  2926. ! SNOW
  2927. IF (QNI3D(K).GE.QSMALL) THEN
  2928. LAMS(K) = (CONS1*NS3D(K)/QNI3D(K))**(1./DS)
  2929. ! CHECK FOR SLOPE
  2930. ! ADJUST VARS
  2931. IF (LAMS(K).LT.LAMMINS) THEN
  2932. LAMS(K) = LAMMINS
  2933. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  2934. NS3D(K) = N0S(K)/LAMS(K)
  2935. ELSE IF (LAMS(K).GT.LAMMAXS) THEN
  2936. LAMS(K) = LAMMAXS
  2937. N0S(K) = LAMS(K)**4*QNI3D(K)/CONS1
  2938. NS3D(K) = N0S(K)/LAMS(K)
  2939. END IF
  2940. END IF
  2941. !......................................................................
  2942. ! GRAUPEL
  2943. IF (QG3D(K).GE.QSMALL) THEN
  2944. LAMG(K) = (CONS2*NG3D(K)/QG3D(K))**(1./DG)
  2945. ! CHECK FOR SLOPE
  2946. ! ADJUST VARS
  2947. IF (LAMG(K).LT.LAMMING) THEN
  2948. LAMG(K) = LAMMING
  2949. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  2950. NG3D(K) = N0G(K)/LAMG(K)
  2951. ELSE IF (LAMG(K).GT.LAMMAXG) THEN
  2952. LAMG(K) = LAMMAXG
  2953. N0G(K) = LAMG(K)**4*QG3D(K)/CONS2
  2954. NG3D(K) = N0G(K)/LAMG(K)
  2955. END IF
  2956. END IF
  2957. 500 CONTINUE
  2958. ! CALCULATE EFFECTIVE RADIUS
  2959. IF (QI3D(K).GE.QSMALL) THEN
  2960. EFFI(K) = 3./LAMI(K)/2.*1.E6
  2961. ELSE
  2962. EFFI(K) = 25.
  2963. END IF
  2964. IF (QNI3D(K).GE.QSMALL) THEN
  2965. EFFS(K) = 3./LAMS(K)/2.*1.E6
  2966. ELSE
  2967. EFFS(K) = 25.
  2968. END IF
  2969. IF (QR3D(K).GE.QSMALL) THEN
  2970. EFFR(K) = 3./LAMR(K)/2.*1.E6
  2971. ELSE
  2972. EFFR(K) = 25.
  2973. END IF
  2974. IF (QC3D(K).GE.QSMALL) THEN
  2975. EFFC(K) = GAMMA(PGAM(K)+4.)/ &
  2976. GAMMA(PGAM(K)+3.)/LAMC(K)/2.*1.E6
  2977. ELSE
  2978. EFFC(K) = 25.
  2979. END IF
  2980. IF (QG3D(K).GE.QSMALL) THEN
  2981. EFFG(K) = 3./LAMG(K)/2.*1.E6
  2982. ELSE
  2983. EFFG(K) = 25.
  2984. END IF
  2985. ! HM ADD 1/10/06, ADD UPPER BOUND ON ICE NUMBER, THIS IS NEEDED
  2986. ! TO PREVENT VERY LARGE ICE NUMBER DUE TO HOMOGENEOUS FREEZING
  2987. ! OF DROPLETS, ESPECIALLY WHEN INUM = 1, SET MAX AT 10 CM-3
  2988. NI3D(K) = MIN(NI3D(K),10.E6/RHO(K))
  2989. ! ADD BOUND ON DROPLET NUMBER - CANNOT EXCEED AEROSOL CONCENTRATION
  2990. IF (iinum.EQ.0.AND.IACT.EQ.2) THEN
  2991. NC3D(K) = MIN(NC3D(K),(NANEW1+NANEW2)/RHO(K))
  2992. END IF
  2993. ! SWITCH FOR CONSTANT DROPLET NUMBER
  2994. IF (iinum.EQ.1) THEN
  2995. ! CHANGE NDCNST FROM CM-3 TO KG-1
  2996. NC3D(K) = NDCNST*1.E6/RHO(K)
  2997. END IF
  2998. END DO !!! K LOOP
  2999. 400 CONTINUE
  3000. ! ALL DONE !!!!!!!!!!!
  3001. RETURN
  3002. END SUBROUTINE MORR_TWO_MOMENT_MICRO
  3003. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3004. REAL FUNCTION POLYSVP (T,TYPE)
  3005. !-------------------------------------------
  3006. ! COMPUTE SATURATION VAPOR PRESSURE
  3007. ! POLYSVP RETURNED IN UNITS OF PA.
  3008. ! T IS INPUT IN UNITS OF K.
  3009. ! TYPE REFERS TO SATURATION WITH RESPECT TO LIQUID (0) OR ICE (1)
  3010. ! REPLACE GOFF-GRATCH WITH FASTER FORMULATION FROM FLATAU ET AL. 1992, TABLE 4 (RIGHT-HAND COLUMN)
  3011. IMPLICIT NONE
  3012. REAL DUM
  3013. REAL T
  3014. INTEGER TYPE
  3015. ! ice
  3016. real a0i,a1i,a2i,a3i,a4i,a5i,a6i,a7i,a8i
  3017. data a0i,a1i,a2i,a3i,a4i,a5i,a6i,a7i,a8i /&
  3018. 6.11147274, 0.503160820, 0.188439774e-1, &
  3019. 0.420895665e-3, 0.615021634e-5,0.602588177e-7, &
  3020. 0.385852041e-9, 0.146898966e-11, 0.252751365e-14/
  3021. ! liquid
  3022. real a0,a1,a2,a3,a4,a5,a6,a7,a8
  3023. ! V1.7
  3024. data a0,a1,a2,a3,a4,a5,a6,a7,a8 /&
  3025. 6.11239921, 0.443987641, 0.142986287e-1, &
  3026. 0.264847430e-3, 0.302950461e-5, 0.206739458e-7, &
  3027. 0.640689451e-10,-0.952447341e-13,-0.976195544e-15/
  3028. real dt
  3029. ! ICE
  3030. IF (TYPE.EQ.1) THEN
  3031. ! POLYSVP = 10.**(-9.09718*(273.16/T-1.)-3.56654* &
  3032. ! LOG10(273.16/T)+0.876793*(1.-T/273.16)+ &
  3033. ! LOG10(6.1071))*100.
  3034. dt = max(-80.,t-273.16)
  3035. polysvp = a0i + dt*(a1i+dt*(a2i+dt*(a3i+dt*(a4i+dt*(a5i+dt*(a6i+dt*(a7i+a8i*dt)))))))
  3036. polysvp = polysvp*100.
  3037. END IF
  3038. ! LIQUID
  3039. IF (TYPE.EQ.0) THEN
  3040. dt = max(-80.,t-273.16)
  3041. polysvp = a0 + dt*(a1+dt*(a2+dt*(a3+dt*(a4+dt*(a5+dt*(a6+dt*(a7+a8*dt)))))))
  3042. polysvp = polysvp*100.
  3043. ! POLYSVP = 10.**(-7.90298*(373.16/T-1.)+ &
  3044. ! 5.02808*LOG10(373.16/T)- &
  3045. ! 1.3816E-7*(10**(11.344*(1.-T/373.16))-1.)+ &
  3046. ! 8.1328E-3*(10**(-3.49149*(373.16/T-1.))-1.)+ &
  3047. ! LOG10(1013.246))*100.
  3048. END IF
  3049. END FUNCTION POLYSVP
  3050. !------------------------------------------------------------------------------
  3051. REAL FUNCTION GAMMA(X)
  3052. !----------------------------------------------------------------------
  3053. !
  3054. ! THIS ROUTINE CALCULATES THE GAMMA FUNCTION FOR A REAL ARGUMENT X.
  3055. ! COMPUTATION IS BASED ON AN ALGORITHM OUTLINED IN REFERENCE 1.
  3056. ! THE PROGRAM USES RATIONAL FUNCTIONS THAT APPROXIMATE THE GAMMA
  3057. ! FUNCTION TO AT LEAST 20 SIGNIFICANT DECIMAL DIGITS. COEFFICIENTS
  3058. ! FOR THE APPROXIMATION OVER THE INTERVAL (1,2) ARE UNPUBLISHED.
  3059. ! THOSE FOR THE APPROXIMATION FOR X .GE. 12 ARE FROM REFERENCE 2.
  3060. ! THE ACCURACY ACHIEVED DEPENDS ON THE ARITHMETIC SYSTEM, THE
  3061. ! COMPILER, THE INTRINSIC FUNCTIONS, AND PROPER SELECTION OF THE
  3062. ! MACHINE-DEPENDENT CONSTANTS.
  3063. !
  3064. !
  3065. !*******************************************************************
  3066. !*******************************************************************
  3067. !
  3068. ! EXPLANATION OF MACHINE-DEPENDENT CONSTANTS
  3069. !
  3070. ! BETA - RADIX FOR THE FLOATING-POINT REPRESENTATION
  3071. ! MAXEXP - THE SMALLEST POSITIVE POWER OF BETA THAT OVERFLOWS
  3072. ! XBIG - THE LARGEST ARGUMENT FOR WHICH GAMMA(X) IS REPRESENTABLE
  3073. ! IN THE MACHINE, I.E., THE SOLUTION TO THE EQUATION
  3074. ! GAMMA(XBIG) = BETA**MAXEXP
  3075. ! XINF - THE LARGEST MACHINE REPRESENTABLE FLOATING-POINT NUMBER;
  3076. ! APPROXIMATELY BETA**MAXEXP
  3077. ! EPS - THE SMALLEST POSITIVE FLOATING-POINT NUMBER SUCH THAT
  3078. ! 1.0+EPS .GT. 1.0
  3079. ! XMININ - THE SMALLEST POSITIVE FLOATING-POINT NUMBER SUCH THAT
  3080. ! 1/XMININ IS MACHINE REPRESENTABLE
  3081. !
  3082. ! APPROXIMATE VALUES FOR SOME IMPORTANT MACHINES ARE:
  3083. !
  3084. ! BETA MAXEXP XBIG
  3085. !
  3086. ! CRAY-1 (S.P.) 2 8191 966.961
  3087. ! CYBER 180/855
  3088. ! UNDER NOS (S.P.) 2 1070 177.803
  3089. ! IEEE (IBM/XT,
  3090. ! SUN, ETC.) (S.P.) 2 128 35.040
  3091. ! IEEE (IBM/XT,
  3092. ! SUN, ETC.) (D.P.) 2 1024 171.624
  3093. ! IBM 3033 (D.P.) 16 63 57.574
  3094. ! VAX D-FORMAT (D.P.) 2 127 34.844
  3095. ! VAX G-FORMAT (D.P.) 2 1023 171.489
  3096. !
  3097. ! XINF EPS XMININ
  3098. !
  3099. ! CRAY-1 (S.P.) 5.45E+2465 7.11E-15 1.84E-2466
  3100. ! CYBER 180/855
  3101. ! UNDER NOS (S.P.) 1.26E+322 3.55E-15 3.14E-294
  3102. ! IEEE (IBM/XT,
  3103. ! SUN, ETC.) (S.P.) 3.40E+38 1.19E-7 1.18E-38
  3104. ! IEEE (IBM/XT,
  3105. ! SUN, ETC.) (D.P.) 1.79D+308 2.22D-16 2.23D-308
  3106. ! IBM 3033 (D.P.) 7.23D+75 2.22D-16 1.39D-76
  3107. ! VAX D-FORMAT (D.P.) 1.70D+38 1.39D-17 5.88D-39
  3108. ! VAX G-FORMAT (D.P.) 8.98D+307 1.11D-16 1.12D-308
  3109. !
  3110. !*******************************************************************
  3111. !*******************************************************************
  3112. !
  3113. ! ERROR RETURNS
  3114. !
  3115. ! THE PROGRAM RETURNS THE VALUE XINF FOR SINGULARITIES OR
  3116. ! WHEN OVERFLOW WOULD OCCUR. THE COMPUTATION IS BELIEVED
  3117. ! TO BE FREE OF UNDERFLOW AND OVERFLOW.
  3118. !
  3119. !
  3120. ! INTRINSIC FUNCTIONS REQUIRED ARE:
  3121. !
  3122. ! INT, DBLE, EXP, LOG, REAL, SIN
  3123. !
  3124. !
  3125. ! REFERENCES: AN OVERVIEW OF SOFTWARE DEVELOPMENT FOR SPECIAL
  3126. ! FUNCTIONS W. J. CODY, LECTURE NOTES IN MATHEMATICS,
  3127. ! 506, NUMERICAL ANALYSIS DUNDEE, 1975, G. A. WATSON
  3128. ! (ED.), SPRINGER VERLAG, BERLIN, 1976.
  3129. !
  3130. ! COMPUTER APPROXIMATIONS, HART, ET. AL., WILEY AND
  3131. ! SONS, NEW YORK, 1968.
  3132. !
  3133. ! LATEST MODIFICATION: OCTOBER 12, 1989
  3134. !
  3135. ! AUTHORS: W. J. CODY AND L. STOLTZ
  3136. ! APPLIED MATHEMATICS DIVISION
  3137. ! ARGONNE NATIONAL LABORATORY
  3138. ! ARGONNE, IL 60439
  3139. !
  3140. !----------------------------------------------------------------------
  3141. implicit none
  3142. INTEGER I,N
  3143. LOGICAL PARITY
  3144. REAL &
  3145. CONV,EPS,FACT,HALF,ONE,RES,SUM,TWELVE, &
  3146. TWO,X,XBIG,XDEN,XINF,XMININ,XNUM,Y,Y1,YSQ,Z,ZERO
  3147. REAL, DIMENSION(7) :: C
  3148. REAL, DIMENSION(8) :: P
  3149. REAL, DIMENSION(8) :: Q
  3150. !----------------------------------------------------------------------
  3151. ! MATHEMATICAL CONSTANTS
  3152. !----------------------------------------------------------------------
  3153. DATA ONE,HALF,TWELVE,TWO,ZERO/1.0E0,0.5E0,12.0E0,2.0E0,0.0E0/
  3154. !----------------------------------------------------------------------
  3155. ! MACHINE DEPENDENT PARAMETERS
  3156. !----------------------------------------------------------------------
  3157. DATA XBIG,XMININ,EPS/35.040E0,1.18E-38,1.19E-7/,XINF/3.4E38/
  3158. !----------------------------------------------------------------------
  3159. ! NUMERATOR AND DENOMINATOR COEFFICIENTS FOR RATIONAL MINIMAX
  3160. ! APPROXIMATION OVER (1,2).
  3161. !----------------------------------------------------------------------
  3162. DATA P/-1.71618513886549492533811E+0,2.47656508055759199108314E+1, &
  3163. -3.79804256470945635097577E+2,6.29331155312818442661052E+2, &
  3164. 8.66966202790413211295064E+2,-3.14512729688483675254357E+4, &
  3165. -3.61444134186911729807069E+4,6.64561438202405440627855E+4/
  3166. DATA Q/-3.08402300119738975254353E+1,3.15350626979604161529144E+2, &
  3167. -1.01515636749021914166146E+3,-3.10777167157231109440444E+3, &
  3168. 2.25381184209801510330112E+4,4.75584627752788110767815E+3, &
  3169. -1.34659959864969306392456E+5,-1.15132259675553483497211E+5/
  3170. !----------------------------------------------------------------------
  3171. ! COEFFICIENTS FOR MINIMAX APPROXIMATION OVER (12, INF).
  3172. !----------------------------------------------------------------------
  3173. DATA C/-1.910444077728E-03,8.4171387781295E-04, &
  3174. -5.952379913043012E-04,7.93650793500350248E-04, &
  3175. -2.777777777777681622553E-03,8.333333333333333331554247E-02, &
  3176. 5.7083835261E-03/
  3177. !----------------------------------------------------------------------
  3178. ! STATEMENT FUNCTIONS FOR CONVERSION BETWEEN INTEGER AND FLOAT
  3179. !----------------------------------------------------------------------
  3180. CONV(I) = REAL(I)
  3181. PARITY=.FALSE.
  3182. FACT=ONE
  3183. N=0
  3184. Y=X
  3185. IF(Y.LE.ZERO)THEN
  3186. !----------------------------------------------------------------------
  3187. ! ARGUMENT IS NEGATIVE
  3188. !----------------------------------------------------------------------
  3189. Y=-X
  3190. Y1=AINT(Y)
  3191. RES=Y-Y1
  3192. IF(RES.NE.ZERO)THEN
  3193. IF(Y1.NE.AINT(Y1*HALF)*TWO)PARITY=.TRUE.
  3194. FACT=-PI/SIN(PI*RES)
  3195. Y=Y+ONE
  3196. ELSE
  3197. RES=XINF
  3198. GOTO 900
  3199. ENDIF
  3200. ENDIF
  3201. !----------------------------------------------------------------------
  3202. ! ARGUMENT IS POSITIVE
  3203. !----------------------------------------------------------------------
  3204. IF(Y.LT.EPS)THEN
  3205. !----------------------------------------------------------------------
  3206. ! ARGUMENT .LT. EPS
  3207. !----------------------------------------------------------------------
  3208. IF(Y.GE.XMININ)THEN
  3209. RES=ONE/Y
  3210. ELSE
  3211. RES=XINF
  3212. GOTO 900
  3213. ENDIF
  3214. ELSEIF(Y.LT.TWELVE)THEN
  3215. Y1=Y
  3216. IF(Y.LT.ONE)THEN
  3217. !----------------------------------------------------------------------
  3218. ! 0.0 .LT. ARGUMENT .LT. 1.0
  3219. !----------------------------------------------------------------------
  3220. Z=Y
  3221. Y=Y+ONE
  3222. ELSE
  3223. !----------------------------------------------------------------------
  3224. ! 1.0 .LT. ARGUMENT .LT. 12.0, REDUCE ARGUMENT IF NECESSARY
  3225. !----------------------------------------------------------------------
  3226. N=INT(Y)-1
  3227. Y=Y-CONV(N)
  3228. Z=Y-ONE
  3229. ENDIF
  3230. !----------------------------------------------------------------------
  3231. ! EVALUATE APPROXIMATION FOR 1.0 .LT. ARGUMENT .LT. 2.0
  3232. !----------------------------------------------------------------------
  3233. XNUM=ZERO
  3234. XDEN=ONE
  3235. DO I=1,8
  3236. XNUM=(XNUM+P(I))*Z
  3237. XDEN=XDEN*Z+Q(I)
  3238. END DO
  3239. RES=XNUM/XDEN+ONE
  3240. IF(Y1.LT.Y)THEN
  3241. !----------------------------------------------------------------------
  3242. ! ADJUST RESULT FOR CASE 0.0 .LT. ARGUMENT .LT. 1.0
  3243. !----------------------------------------------------------------------
  3244. RES=RES/Y1
  3245. ELSEIF(Y1.GT.Y)THEN
  3246. !----------------------------------------------------------------------
  3247. ! ADJUST RESULT FOR CASE 2.0 .LT. ARGUMENT .LT. 12.0
  3248. !----------------------------------------------------------------------
  3249. DO I=1,N
  3250. RES=RES*Y
  3251. Y=Y+ONE
  3252. END DO
  3253. ENDIF
  3254. ELSE
  3255. !----------------------------------------------------------------------
  3256. ! EVALUATE FOR ARGUMENT .GE. 12.0,
  3257. !----------------------------------------------------------------------
  3258. IF(Y.LE.XBIG)THEN
  3259. YSQ=Y*Y
  3260. SUM=C(7)
  3261. DO I=1,6
  3262. SUM=SUM/YSQ+C(I)
  3263. END DO
  3264. SUM=SUM/Y-Y+SQRTPI
  3265. SUM=SUM+(Y-HALF)*LOG(Y)
  3266. RES=EXP(SUM)
  3267. ELSE
  3268. RES=XINF
  3269. GOTO 900
  3270. ENDIF
  3271. ENDIF
  3272. !----------------------------------------------------------------------
  3273. ! FINAL ADJUSTMENTS AND RETURN
  3274. !----------------------------------------------------------------------
  3275. IF(PARITY)RES=-RES
  3276. IF(FACT.NE.ONE)RES=FACT/RES
  3277. 900 GAMMA=RES
  3278. RETURN
  3279. ! ---------- LAST LINE OF GAMMA ----------
  3280. END FUNCTION GAMMA
  3281. REAL FUNCTION DERF1(X)
  3282. IMPLICIT NONE
  3283. REAL X
  3284. REAL, DIMENSION(0 : 64) :: A, B
  3285. REAL W,T,Y
  3286. INTEGER K,I
  3287. DATA A/ &
  3288. 0.00000000005958930743E0, -0.00000000113739022964E0, &
  3289. 0.00000001466005199839E0, -0.00000016350354461960E0, &
  3290. 0.00000164610044809620E0, -0.00001492559551950604E0, &
  3291. 0.00012055331122299265E0, -0.00085483269811296660E0, &
  3292. 0.00522397762482322257E0, -0.02686617064507733420E0, &
  3293. 0.11283791670954881569E0, -0.37612638903183748117E0, &
  3294. 1.12837916709551257377E0, &
  3295. 0.00000000002372510631E0, -0.00000000045493253732E0, &
  3296. 0.00000000590362766598E0, -0.00000006642090827576E0, &
  3297. 0.00000067595634268133E0, -0.00000621188515924000E0, &
  3298. 0.00005103883009709690E0, -0.00037015410692956173E0, &
  3299. 0.00233307631218880978E0, -0.01254988477182192210E0, &
  3300. 0.05657061146827041994E0, -0.21379664776456006580E0, &
  3301. 0.84270079294971486929E0, &
  3302. 0.00000000000949905026E0, -0.00000000018310229805E0, &
  3303. 0.00000000239463074000E0, -0.00000002721444369609E0, &
  3304. 0.00000028045522331686E0, -0.00000261830022482897E0, &
  3305. 0.00002195455056768781E0, -0.00016358986921372656E0, &
  3306. 0.00107052153564110318E0, -0.00608284718113590151E0, &
  3307. 0.02986978465246258244E0, -0.13055593046562267625E0, &
  3308. 0.67493323603965504676E0, &
  3309. 0.00000000000382722073E0, -0.00000000007421598602E0, &
  3310. 0.00000000097930574080E0, -0.00000001126008898854E0, &
  3311. 0.00000011775134830784E0, -0.00000111992758382650E0, &
  3312. 0.00000962023443095201E0, -0.00007404402135070773E0, &
  3313. 0.00050689993654144881E0, -0.00307553051439272889E0, &
  3314. 0.01668977892553165586E0, -0.08548534594781312114E0, &
  3315. 0.56909076642393639985E0, &
  3316. 0.00000000000155296588E0, -0.00000000003032205868E0, &
  3317. 0.00000000040424830707E0, -0.00000000471135111493E0, &
  3318. 0.00000005011915876293E0, -0.00000048722516178974E0, &
  3319. 0.00000430683284629395E0, -0.00003445026145385764E0, &
  3320. 0.00024879276133931664E0, -0.00162940941748079288E0, &
  3321. 0.00988786373932350462E0, -0.05962426839442303805E0, &
  3322. 0.49766113250947636708E0 /
  3323. DATA (B(I), I = 0, 12) / &
  3324. -0.00000000029734388465E0, 0.00000000269776334046E0, &
  3325. -0.00000000640788827665E0, -0.00000001667820132100E0, &
  3326. -0.00000021854388148686E0, 0.00000266246030457984E0, &
  3327. 0.00001612722157047886E0, -0.00025616361025506629E0, &
  3328. 0.00015380842432375365E0, 0.00815533022524927908E0, &
  3329. -0.01402283663896319337E0, -0.19746892495383021487E0, &
  3330. 0.71511720328842845913E0 /
  3331. DATA (B(I), I = 13, 25) / &
  3332. -0.00000000001951073787E0, -0.00000000032302692214E0, &
  3333. 0.00000000522461866919E0, 0.00000000342940918551E0, &
  3334. -0.00000035772874310272E0, 0.00000019999935792654E0, &
  3335. 0.00002687044575042908E0, -0.00011843240273775776E0, &
  3336. -0.00080991728956032271E0, 0.00661062970502241174E0, &
  3337. 0.00909530922354827295E0, -0.20160072778491013140E0, &
  3338. 0.51169696718727644908E0 /
  3339. DATA (B(I), I = 26, 38) / &
  3340. 0.00000000003147682272E0, -0.00000000048465972408E0, &
  3341. 0.00000000063675740242E0, 0.00000003377623323271E0, &
  3342. -0.00000015451139637086E0, -0.00000203340624738438E0, &
  3343. 0.00001947204525295057E0, 0.00002854147231653228E0, &
  3344. -0.00101565063152200272E0, 0.00271187003520095655E0, &
  3345. 0.02328095035422810727E0, -0.16725021123116877197E0, &
  3346. 0.32490054966649436974E0 /
  3347. DATA (B(I), I = 39, 51) / &
  3348. 0.00000000002319363370E0, -0.00000000006303206648E0, &
  3349. -0.00000000264888267434E0, 0.00000002050708040581E0, &
  3350. 0.00000011371857327578E0, -0.00000211211337219663E0, &
  3351. 0.00000368797328322935E0, 0.00009823686253424796E0, &
  3352. -0.00065860243990455368E0, -0.00075285814895230877E0, &
  3353. 0.02585434424202960464E0, -0.11637092784486193258E0, &
  3354. 0.18267336775296612024E0 /
  3355. DATA (B(I), I = 52, 64) / &
  3356. -0.00000000000367789363E0, 0.00000000020876046746E0, &
  3357. -0.00000000193319027226E0, -0.00000000435953392472E0, &
  3358. 0.00000018006992266137E0, -0.00000078441223763969E0, &
  3359. -0.00000675407647949153E0, 0.00008428418334440096E0, &
  3360. -0.00017604388937031815E0, -0.00239729611435071610E0, &
  3361. 0.02064129023876022970E0, -0.06905562880005864105E0, &
  3362. 0.09084526782065478489E0 /
  3363. W = ABS(X)
  3364. IF (W .LT. 2.2D0) THEN
  3365. T = W * W
  3366. K = INT(T)
  3367. T = T - K
  3368. K = K * 13
  3369. Y = ((((((((((((A(K) * T + A(K + 1)) * T + &
  3370. A(K + 2)) * T + A(K + 3)) * T + A(K + 4)) * T + &
  3371. A(K + 5)) * T + A(K + 6)) * T + A(K + 7)) * T + &
  3372. A(K + 8)) * T + A(K + 9)) * T + A(K + 10)) * T + &
  3373. A(K + 11)) * T + A(K + 12)) * W
  3374. ELSE IF (W .LT. 6.9D0) THEN
  3375. K = INT(W)
  3376. T = W - K
  3377. K = 13 * (K - 2)
  3378. Y = (((((((((((B(K) * T + B(K + 1)) * T + &
  3379. B(K + 2)) * T + B(K + 3)) * T + B(K + 4)) * T + &
  3380. B(K + 5)) * T + B(K + 6)) * T + B(K + 7)) * T + &
  3381. B(K + 8)) * T + B(K + 9)) * T + B(K + 10)) * T + &
  3382. B(K + 11)) * T + B(K + 12)
  3383. Y = Y * Y
  3384. Y = Y * Y
  3385. Y = Y * Y
  3386. Y = 1 - Y * Y
  3387. ELSE
  3388. Y = 1
  3389. END IF
  3390. IF (X .LT. 0) Y = -Y
  3391. DERF1 = Y
  3392. END FUNCTION DERF1
  3393. !+---+-----------------------------------------------------------------+
  3394. END MODULE module_mp_morr_two_moment