ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SuperDropletPCCoalescence.H
Go to the documentation of this file.
1 #ifndef SUPERDROPLET_PC_COALESCENCE_H_
2 #define SUPERDROPLET_PC_COALESCENCE_H_
3 
4 #include <algorithm>
5 #include "ERF_Constants.H"
6 
7 #ifdef ERF_USE_PARTICLES
8 
9 /*! \brief Coalescence kernels
10 
11  Reference for Long's and Hall's kernels:
12  + Shima et al., 2009, "The super-droplet method for the numerical simulation of clouds and
13  precipitation: A particle-based and probabilistic microphysics model coupled with a non-
14  hydrostatic model." Quart. J. Roy. Meteorol. Soc., 135: 1307-1320
15  + https://github.com/Shima-Lab/SCALE-SDM_BOMEX_Sato2018/blob/master/contrib/SDM/sdm_motion.f90
16 */
17 template<typename RT, int SPACEDIM>
18 struct CollisionKernel
19 {
20  /*! \brief Golovin kernel */
21  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
22  RT golovin ( const RT a_r1, /*!< radius of droplet 1 */
23  const RT a_r2 /*!< radius of droplet 2 */ ) const noexcept
24  {
25  RT b = amrex::Real(1.5e03);
26  auto X_1 = (amrex::Real(4.0)*PI/three) * a_r1*a_r1*a_r1;
27  auto X_2 = (amrex::Real(4.0)*PI/three) * a_r2*a_r2*a_r2;
28  return b * (X_1 + X_2);
29  }
30 
31  /* The following code is adapted from SCALE-SDM:
32  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
33  /*! \brief Calculate collision kernel for gravitational sedimentation
34  *
35  * This function computes the collision kernel for collisions driven by
36  * differential gravitational settling. It uses the terminal velocities
37  * of particles to determine collision probability.
38  *
39  * \param[in] a_r1 Radius of particle 1 (m)
40  * \param[in] a_r2 Radius of particle 2 (m)
41  * \param[in] a_v1 Pointer to velocity vector of particle 1 (m/s)
42  * \param[in] a_v2 Pointer to velocity vector of particle 2 (m/s)
43  * \return Collision kernel value (m³/s)
44  */
45  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
46  RT sedimentation ( const RT a_r1,
47  const RT a_r2,
48  const RT* const a_v1,
49  const RT* const a_v2 ) const noexcept
50  {
51  auto p = std::min(a_r1,a_r2) / std::max(a_r1,a_r2);
52  auto E = myhalf*p*p / ((one+p)*(one+p));
53  RT dv = 0;
54  for (int d = 0; d < SPACEDIM; d++) {
55  dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
56  }
57  dv = std::sqrt(dv);
58  return PI*(a_r1+a_r2)*(a_r1+a_r2)*E*dv;
59  }
60 
61  /* The following code is adapted from SCALE-SDM:
62  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
63  /*! \brief Calculate collision kernel using Long's formulation
64  *
65  * Long's kernel is an empirical formulation for cloud droplet collision-coalescence
66  * that accounts for different collision rates based on droplet size. It is particularly
67  * effective for smaller cloud droplets where hydrodynamic effects are important.
68  *
69  * Reference: Long, A. B., 1974: Solutions to the droplet collection equation
70  * for polynomial kernels. J. Atmos. Sci., 31, 1040-amrex::Real(1052.)
71  *
72  * \param[in] a_r1 Radius of particle 1 (m)
73  * \param[in] a_r2 Radius of particle 2 (m)
74  * \param[in] a_v1 Pointer to velocity vector of particle 1 (m/s)
75  * \param[in] a_v2 Pointer to velocity vector of particle 2 (m/s)
76  * \return Collision kernel value (m³/s)
77  */
78  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
79  RT Longs ( const RT a_r1,
80  const RT a_r2,
81  const RT* const a_v1,
82  const RT* const a_v2 ) const noexcept
83  {
84  auto r1 = std::max( a_r1, a_r2 ); // large
85  auto r2 = std::min( a_r1, a_r2 ); // small
86  auto sumr = r1 + r2;
87 
88  RT c_rate = one;
89  if( r1 <= amrex::Real(5.E-5) ) {
90  c_rate = amrex::Real(4.5E+8) * ( r1*r1 ) * ( one - amrex::Real(3.E-6)/(std::max(amrex::Real(3.01E-6),r1)) );
91  }
92  c_rate *= (PI*sumr*sumr);
93 
94  RT dv = 0;
95  for (int d = 0; d < SPACEDIM; d++) {
96  dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
97  }
98  dv = std::sqrt(dv);
99 
100  return c_rate*dv;
101  }
102 
103  /* The following code is adapted from SCALE-SDM:
104  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
105  /*! \brief r0col data for Hall's kernel */
106  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
107  RT Halls_data_r0col (const int a_i /*!< index */) const noexcept
108  {
109  static const RT vec[15] = { amrex::Real(6.0),
110  amrex::Real(8.0),
111  amrex::Real(10.0),
112  amrex::Real(15.0),
113  amrex::Real(20.0),
114  amrex::Real(25.0),
115  amrex::Real(30.0),
116  amrex::Real(40.0),
117  amrex::Real(50.0),
118  amrex::Real(60.0),
119  amrex::Real(70.0),
120  amrex::Real(100.0),
121  amrex::Real(150.0),
122  amrex::Real(200.0),
123  amrex::Real(300.0)};
124  return vec[a_i];
125  }
126 
127  /* The following code is adapted from SCALE-SDM:
128  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
129  /*! \brief r0col data for Hall's kernel */
130  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
131  int Halls_data_r0col ( const RT a_r /*!< radius */) const noexcept
132  {
133  auto radius_microns = a_r*amrex::Real(1.0e6); // [m] -> [mu-m]
134  int i;
135  for (i = 0; i < 15; i++) {
136  if (radius_microns <= Halls_data_r0col(i)) { return i; }
137  }
138  return i;
139  }
140 
141  /* The following code is adapted from SCALE-SDM:
142  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
143  /*! \brief ratcol data for Hall's kernel */
144  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
145  RT Halls_data_ratcol ( const int a_i /*!< index */) const noexcept
146  {
147  static const RT vec[21] = {amrex::Real(0.00),
148  amrex::Real(0.05),
149  amrex::Real(0.10),
150  amrex::Real(0.15),
151  amrex::Real(0.20),
152  fourth,
153  amrex::Real(0.30),
154  amrex::Real(0.35),
155  amrex::Real(0.40),
156  amrex::Real(0.45),
157  amrex::Real(0.50),
158  amrex::Real(0.55),
159  amrex::Real(0.60),
160  amrex::Real(0.65),
161  amrex::Real(0.70),
162  amrex::Real(0.75),
163  amrex::Real(0.80),
164  amrex::Real(0.85),
165  amrex::Real(0.90),
166  amrex::Real(0.95),
167  amrex::Real(1.00)};
168  return vec[a_i];
169  }
170 
171  /* The following code is adapted from SCALE-SDM:
172  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
173  /*! \brief ratcol data for Hall's kernel */
174  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
175  int Halls_data_ratcol ( const RT a_r /*!< ratio */) const noexcept
176  {
177  int i;
178  for (i = 1; i < 20; i++) {
179  if (a_r <= Halls_data_ratcol(i)) { return i; }
180  }
181  return i;
182  }
183 
184  /* The following code is adapted from SCALE-SDM:
185  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
186  /*! \brief ecoll data for Hall's kernel */
187  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
188  RT Halls_data_ecoll ( const int a_i, /*!< row index */
189  const int a_j /*!< column index */) const noexcept
190  {
191  const RT ecoll[21][15] =
192  { {amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010),amrex::Real(0.0010)},
193  {amrex::Real(0.0030),amrex::Real(0.0030),amrex::Real(0.0030),amrex::Real(0.0040),amrex::Real(0.0050),amrex::Real(0.0050),amrex::Real(0.0050),amrex::Real(0.0100),amrex::Real(0.1000),amrex::Real(0.0500),amrex::Real(0.2000),amrex::Real(0.5000),amrex::Real(0.7700),amrex::Real(0.8700),amrex::Real(0.9700)},
194  {amrex::Real(0.0070),amrex::Real(0.0070),amrex::Real(0.0070),amrex::Real(0.0080),amrex::Real(0.0090),amrex::Real(0.0100),amrex::Real(0.0100),amrex::Real(0.0700),amrex::Real(0.4000),amrex::Real(0.4300),amrex::Real(0.5800),amrex::Real(0.7900),amrex::Real(0.9300),amrex::Real(0.9600),amrex::Real(1.0000)},
195  {amrex::Real(0.0090),amrex::Real(0.0090),amrex::Real(0.0090),amrex::Real(0.0120),amrex::Real(0.0150),amrex::Real(0.0100),amrex::Real(0.0200),amrex::Real(0.2800),amrex::Real(0.6000),amrex::Real(0.6400),amrex::Real(0.7500),amrex::Real(0.9100),amrex::Real(0.9700),amrex::Real(0.9800),amrex::Real(1.0000)},
196  {amrex::Real(0.0140),amrex::Real(0.0140),amrex::Real(0.0140),amrex::Real(0.0150),amrex::Real(0.0160),amrex::Real(0.0300),amrex::Real(0.0600),amrex::Real(0.5000),amrex::Real(0.7000),amrex::Real(0.7700),amrex::Real(0.8400),amrex::Real(0.9500),amrex::Real(0.9700),amrex::Real(1.0000),amrex::Real(1.0000)},
197  {amrex::Real(0.0170),amrex::Real(0.0170),amrex::Real(0.0170),amrex::Real(0.0200),amrex::Real(0.0220),amrex::Real(0.0600),amrex::Real(0.1000),amrex::Real(0.6200),amrex::Real(0.7800),amrex::Real(0.8400),amrex::Real(0.8800),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
198  {amrex::Real(0.0300),amrex::Real(0.0300),amrex::Real(0.0240),amrex::Real(0.0220),amrex::Real(0.0320),amrex::Real(0.0620),amrex::Real(0.2000),amrex::Real(0.6800),amrex::Real(0.8300),amrex::Real(0.8700),amrex::Real(0.9000),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
199  {amrex::Real(0.0250),amrex::Real(0.0250),amrex::Real(0.0250),amrex::Real(0.0360),amrex::Real(0.0430),amrex::Real(0.1300),amrex::Real(0.2700),amrex::Real(0.7400),amrex::Real(0.8600),amrex::Real(0.8900),amrex::Real(0.9200),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
200  {amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.0400),amrex::Real(0.0520),amrex::Real(0.2000),amrex::Real(0.4000),amrex::Real(0.7800),amrex::Real(0.8800),amrex::Real(0.9000),amrex::Real(0.9400),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
201  {amrex::Real(0.0300),amrex::Real(0.0300),amrex::Real(0.0300),amrex::Real(0.0470),amrex::Real(0.0640),amrex::Real(0.2500),amrex::Real(0.5000),amrex::Real(0.8000),amrex::Real(0.9000),amrex::Real(0.9100),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
202  {amrex::Real(0.0400),amrex::Real(0.0400),amrex::Real(0.0330),amrex::Real(0.0370),amrex::Real(0.0680),amrex::Real(0.2400),amrex::Real(0.5500),amrex::Real(0.8000),amrex::Real(0.9000),amrex::Real(0.9100),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
203  {amrex::Real(0.0350),amrex::Real(0.0350),amrex::Real(0.0350),amrex::Real(0.0550),amrex::Real(0.0790),amrex::Real(0.2900),amrex::Real(0.5800),amrex::Real(0.8000),amrex::Real(0.9000),amrex::Real(0.9100),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
204  {amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0620),amrex::Real(0.0820),amrex::Real(0.2900),amrex::Real(0.5900),amrex::Real(0.7800),amrex::Real(0.9000),amrex::Real(0.9100),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
205  {amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0600),amrex::Real(0.0800),amrex::Real(0.2900),amrex::Real(0.5800),amrex::Real(0.7700),amrex::Real(0.8900),amrex::Real(0.9100),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
206  {amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0410),amrex::Real(0.0750),amrex::Real(0.2500),amrex::Real(0.5400),amrex::Real(0.7600),amrex::Real(0.8800),amrex::Real(0.9200),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
207  {amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0520),amrex::Real(0.0670),amrex::Real(0.2500),amrex::Real(0.5100),amrex::Real(0.7700),amrex::Real(0.8800),amrex::Real(0.9300),amrex::Real(0.9700),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
208  {amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0370),amrex::Real(0.0470),amrex::Real(0.0570),amrex::Real(0.2500),amrex::Real(0.4900),amrex::Real(0.7700),amrex::Real(0.8900),amrex::Real(0.9500),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000),amrex::Real(1.0000)},
209  {amrex::Real(0.0360),amrex::Real(0.0360),amrex::Real(0.0360),amrex::Real(0.0420),amrex::Real(0.0480),amrex::Real(0.2300),amrex::Real(0.4700),amrex::Real(0.7800),amrex::Real(0.9200),amrex::Real(1.0000),amrex::Real(1.0200),amrex::Real(1.0200),amrex::Real(1.0200),amrex::Real(1.0200),amrex::Real(1.0200)},
210  {amrex::Real(0.0400),amrex::Real(0.0400),amrex::Real(0.0350),amrex::Real(0.0330),amrex::Real(0.0400),amrex::Real(0.1120),amrex::Real(0.4500),amrex::Real(0.7900),amrex::Real(1.0100),amrex::Real(1.0300),amrex::Real(1.0400),amrex::Real(1.0400),amrex::Real(1.0400),amrex::Real(1.0400),amrex::Real(1.0400)},
211  {amrex::Real(0.0330),amrex::Real(0.0330),amrex::Real(0.0330),amrex::Real(0.0330),amrex::Real(0.0330),amrex::Real(0.1190),amrex::Real(0.4700),amrex::Real(0.9500),amrex::Real(1.3000),amrex::Real(1.7000),amrex::Real(2.3000),amrex::Real(2.3000),amrex::Real(2.3000),amrex::Real(2.3000),amrex::Real(2.3000)},
212  {amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.0270),amrex::Real(0.1250),amrex::Real(0.5200),amrex::Real(1.4000),amrex::Real(2.3000),amrex::Real(3.0000),amrex::Real(4.0000),amrex::Real(4.0000),amrex::Real(4.0000),amrex::Real(4.0000),amrex::Real(4.0000)} };
213  return ecoll[a_i][a_j];
214  }
215 
216 
217  /* The following code is adapted from SCALE-SDM:
218  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
219  /*! \brief Hall's kernel */
220  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
221  RT Halls ( const RT a_r1, /*!< radius of particle 1 */
222  const RT a_r2, /*!< radius of particle 2 */
223  const RT* const a_v1, /*!< velocity of particle 1 */
224  const RT* const a_v2 /*!< velocity of particle 2 */) const noexcept
225  {
226  auto r1 = std::max( a_r1, a_r2 ); // large
227  auto r2 = std::min( a_r1, a_r2 ); // small
228  auto ratio = r2 / r1;
229  auto sumr = r1 + r2;
230 
231  int irr = Halls_data_r0col(r1);
232  int iqq = Halls_data_ratcol(ratio);
233 
234  RT c_rate = one;
235 
236  if( irr >= 15 ) {
237 
238  RT q = ( ratio - Halls_data_ratcol(iqq-1) )
239  / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
240 
241  RT ek = (one-q) * Halls_data_ecoll(iqq-1,14)
242  + q * Halls_data_ecoll(iqq ,14);
243 
244  c_rate = std::min( ek, amrex::Real(1.0) );
245 
246  } else if ((irr >= 1) && (irr < 15)) {
247 
248  RT p = ( r1*amrex::Real(1.0e6) - Halls_data_r0col(irr-1) )
249  / ( Halls_data_r0col(irr) - Halls_data_r0col(irr-1) );
250 
251  RT q = ( ratio - Halls_data_ratcol(iqq-1) )
252  / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
253 
254  c_rate = (one-p) * (one-q) * Halls_data_ecoll(iqq-1,irr-1)
255  + p * (one-q) * Halls_data_ecoll(iqq-1,irr )
256  + (one-p) * q * Halls_data_ecoll(iqq ,irr-1)
257  + p * q * Halls_data_ecoll(iqq ,irr );
258 
259  } else {
260 
261  RT q = ( ratio - Halls_data_ratcol(iqq-1) )
262  / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
263 
264  c_rate = (one-q) * Halls_data_ecoll(iqq-1,0)
265  + q * Halls_data_ecoll(iqq ,0);
266 
267  }
268  c_rate *= (PI*sumr*sumr);
269 
270  RT dv = 0;
271  for (int d = 0; d < SPACEDIM; d++) {
272  dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
273  }
274  dv = std::sqrt(dv);
275 
276  return c_rate*dv;
277  }
278 
279  /* The following code is adapted from SCALE-SDM:
280  * Copyright (c) 2012-2014, Team SCALE, All rights reserved. */
281  /*! \brief Brownian kernel */
282  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
283  RT Brownian_SeinfeldPandis ( const RT a_r1, /*!< radius of particle 1 */
284  const RT a_r2, /*!< radius of particle 2 */
285  const RT a_mass_1, /*!< total mass of particle 1 */
286  const RT a_mass_2, /*!< total mass of particle 2 */
287  const RT a_pressure, /*!< pressure */
288  const RT a_temperature /*!< temperature */ ) const noexcept
289  {
290  // diameter of droplets
291  RT diameter_1 = 2*a_r1;
292  RT diameter_2 = 2*a_r2;
293 
294  RT p_crs = a_pressure; // [Pa]
295  RT t_crs = a_temperature; // [K]
296 
297  // dynamic viscosity [Pa*s] (Pruppacher & Klett,1997)
298  RT T_degC = t_crs - amrex::Real(273.15); // [K] => [degC]
299  RT vis_crs = zero;
300  if( T_degC >= zero ) {
301  vis_crs = ( amrex::Real(1.7180) + amrex::Real(4.9E-3)*T_degC ) * amrex::Real(1.E-5);
302  } else {
303  vis_crs = ( amrex::Real(1.7180) + amrex::Real(4.9E-3)*T_degC -amrex::Real(1.2E-5)*T_degC*T_degC ) * amrex::Real(1.E-5);
304  }
305 
306  //air mean free path [m]
307  RT lambda_crs = (two*vis_crs) / (p_crs*std::sqrt(amrex::Real(8.0)*mwdair*amrex::Real(1.E-3)/(PI*R_d*t_crs)));
308 
309  // temporary var
310  RT dtmp = zero;
311 
312  // slip correction of droplets [-]
313  dtmp = amrex::Real(1.2570) + amrex::Real(0.40) * exp(-amrex::Real(0.550)*diameter_1/lambda_crs);
314  RT slip_corr_1 = one + (two*lambda_crs*dtmp)/(diameter_1);
315  dtmp = amrex::Real(1.2570) + amrex::Real(0.40) * exp(-amrex::Real(0.550)*diameter_2/lambda_crs);
316  RT slip_corr_2 = one + (two*lambda_crs*dtmp)/(diameter_2);
317 
318  // diffusion term [m*m/s]
319  dtmp = (boltz*t_crs)/(three*PI*vis_crs);
320  RT diff_term_1 = dtmp * (slip_corr_1/diameter_1);
321  RT diff_term_2 = dtmp * (slip_corr_2/diameter_2);
322 
323  // velocity term [m/s]
324  dtmp = (amrex::Real(8.0)*boltz*t_crs)/PI;
325  RT vel_term_1 = std::sqrt(dtmp/a_mass_1);
326  RT vel_term_2 = std::sqrt(dtmp/a_mass_2);
327 
328  // mean free path of droplets [m]
329  dtmp = amrex::Real(8.0)/PI;
330  RT lambda_1 = dtmp * (diff_term_1/vel_term_1);
331  RT lambda_2 = dtmp * (diff_term_2/vel_term_2);
332 
333  //length term [m]
334  dtmp = (diameter_1+lambda_1)*(diameter_1+lambda_1)*(diameter_1+lambda_1)
335  - std::exp(amrex::Real(1.5)*std::log(diameter_1*diameter_1+lambda_1*lambda_1));
336  RT length_term_1 = dtmp/(three*diameter_1*lambda_1) - diameter_1;
337  dtmp = (diameter_2+lambda_2)*(diameter_2+lambda_2)*(diameter_2+lambda_2)
338  - std::exp(amrex::Real(1.5)*std::log(diameter_2*diameter_2+lambda_2*lambda_2));
339  RT length_term_2 = dtmp/(three*diameter_2*lambda_2) - diameter_2;
340 
341  // Brownian Coagulation Coefficient K12 [m3/s]
342  RT sumdia = diameter_1 + diameter_2;
343  RT sumd = diff_term_1 + diff_term_2;
344  RT sumc = std::sqrt( vel_term_1*vel_term_1 + vel_term_2*vel_term_2 );
345  RT sumg = std::sqrt( two*length_term_1*length_term_1 + two*length_term_2*length_term_2 );
346 
347  dtmp = sumdia/(sumdia+two*sumg) + (amrex::Real(8.0)*sumd)/(sumdia*sumc);
348  RT k12 = two*PI * sumdia*sumd/dtmp;
349 
350  return k12;
351  }
352 
353 };
354 
355 #endif
356 #endif
357 
constexpr amrex::Real three
Definition: ERF_Constants.H:9
constexpr amrex::Real two
Definition: ERF_Constants.H:8
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real fourth
Definition: ERF_Constants.H:12
constexpr amrex::Real mwdair
Definition: ERF_Constants.H:74
constexpr amrex::Real boltz
Definition: ERF_Constants.H:72
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
constexpr amrex::Real PI
Definition: ERF_Constants.H:16
constexpr amrex::Real R_d
Definition: ERF_Constants.H:20
Real * p
Definition: ERF_InitCustomPert_SquallLine.H:61
amrex::Real Real
Definition: ERF_ShocInterface.H:19