1 #ifndef SUPERDROPLET_PC_COALESCENCE_H_
2 #define SUPERDROPLET_PC_COALESCENCE_H_
7 #ifdef ERF_USE_PARTICLES
17 template<
typename RT,
int SPACEDIM>
18 struct CollisionKernel
21 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
22 RT golovin (
const RT a_r1,
23 const RT a_r2 )
const noexcept
28 return b * (X_1 + X_2);
45 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
46 RT sedimentation (
const RT a_r1,
49 const RT*
const a_v2 )
const noexcept
51 auto p = std::min(a_r1,a_r2) / std::max(a_r1,a_r2);
54 for (
int d = 0; d < SPACEDIM; d++) {
55 dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
58 return PI*(a_r1+a_r2)*(a_r1+a_r2)*E*dv;
78 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
79 RT Longs (
const RT a_r1,
82 const RT*
const a_v2 )
const noexcept
84 auto r1 = std::max( a_r1, a_r2 );
85 auto r2 = std::min( a_r1, a_r2 );
92 c_rate *= (
PI*sumr*sumr);
95 for (
int d = 0; d < SPACEDIM; d++) {
96 dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
106 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
107 RT Halls_data_r0col (
const int a_i )
const noexcept
130 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
131 int Halls_data_r0col (
const RT a_r )
const noexcept
135 for (i = 0; i < 15; i++) {
136 if (radius_microns <= Halls_data_r0col(i)) {
return i; }
144 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
145 RT Halls_data_ratcol (
const int a_i )
const noexcept
174 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
175 int Halls_data_ratcol (
const RT a_r )
const noexcept
178 for (i = 1; i < 20; i++) {
179 if (a_r <= Halls_data_ratcol(i)) {
return i; }
187 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
188 RT Halls_data_ecoll (
const int a_i,
189 const int a_j )
const noexcept
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];
220 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
221 RT Halls (
const RT a_r1,
223 const RT*
const a_v1,
224 const RT*
const a_v2 )
const noexcept
226 auto r1 = std::max( a_r1, a_r2 );
227 auto r2 = std::min( a_r1, a_r2 );
228 auto ratio = r2 / r1;
231 int irr = Halls_data_r0col(r1);
232 int iqq = Halls_data_ratcol(ratio);
238 RT q = ( ratio - Halls_data_ratcol(iqq-1) )
239 / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
241 RT ek = (
one-q) * Halls_data_ecoll(iqq-1,14)
242 + q * Halls_data_ecoll(iqq ,14);
246 }
else if ((irr >= 1) && (irr < 15)) {
248 RT
p = ( r1*
amrex::Real(1.0e6) - Halls_data_r0col(irr-1) )
249 / ( Halls_data_r0col(irr) - Halls_data_r0col(irr-1) );
251 RT q = ( ratio - Halls_data_ratcol(iqq-1) )
252 / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
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 );
261 RT q = ( ratio - Halls_data_ratcol(iqq-1) )
262 / ( Halls_data_ratcol(iqq) - Halls_data_ratcol(iqq-1) );
264 c_rate = (
one-q) * Halls_data_ecoll(iqq-1,0)
265 + q * Halls_data_ecoll(iqq ,0);
268 c_rate *= (
PI*sumr*sumr);
271 for (
int d = 0; d < SPACEDIM; d++) {
272 dv += (a_v1[d]-a_v2[d])*(a_v1[d]-a_v2[d]);
282 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
283 RT Brownian_SeinfeldPandis (
const RT a_r1,
288 const RT a_temperature )
const noexcept
291 RT diameter_1 = 2*a_r1;
292 RT diameter_2 = 2*a_r2;
294 RT p_crs = a_pressure;
295 RT t_crs = a_temperature;
300 if( T_degC >=
zero ) {
314 RT slip_corr_1 =
one + (
two*lambda_crs*dtmp)/(diameter_1);
316 RT slip_corr_2 =
one + (
two*lambda_crs*dtmp)/(diameter_2);
320 RT diff_term_1 = dtmp * (slip_corr_1/diameter_1);
321 RT diff_term_2 = dtmp * (slip_corr_2/diameter_2);
325 RT vel_term_1 = std::sqrt(dtmp/a_mass_1);
326 RT vel_term_2 = std::sqrt(dtmp/a_mass_2);
330 RT lambda_1 = dtmp * (diff_term_1/vel_term_1);
331 RT lambda_2 = dtmp * (diff_term_2/vel_term_2);
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;
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 );
347 dtmp = sumdia/(sumdia+
two*sumg) + (
amrex::Real(8.0)*sumd)/(sumdia*sumc);
348 RT k12 =
two*
PI * sumdia*sumd/dtmp;
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