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);
52 auto E = RT(0.5)*
p*
p / ((RT(1.0)+
p)*(RT(1.0)+
p));
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 );
89 if( r1 <= RT(5.E-5) ) {
90 c_rate = RT(4.5E+8) * ( r1*r1 ) * ( RT(1.0) - RT(3.E-6)/(std::max(RT(3.01E-6),r1)) );
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
109 static const RT vec[15] = { RT(6.0),
130 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
131 int Halls_data_r0col (
const RT a_r )
const noexcept
133 auto radius_microns = a_r*RT(1.0e6);
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
147 static const RT vec[21] = {RT(0.00),
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 { {RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010),RT(0.0010)},
193 {RT(0.0030),RT(0.0030),RT(0.0030),RT(0.0040),RT(0.0050),RT(0.0050),RT(0.0050),RT(0.0100),RT(0.1000),RT(0.0500),RT(0.2000),RT(0.5000),RT(0.7700),RT(0.8700),RT(0.9700)},
194 {RT(0.0070),RT(0.0070),RT(0.0070),RT(0.0080),RT(0.0090),RT(0.0100),RT(0.0100),RT(0.0700),RT(0.4000),RT(0.4300),RT(0.5800),RT(0.7900),RT(0.9300),RT(0.9600),RT(1.0000)},
195 {RT(0.0090),RT(0.0090),RT(0.0090),RT(0.0120),RT(0.0150),RT(0.0100),RT(0.0200),RT(0.2800),RT(0.6000),RT(0.6400),RT(0.7500),RT(0.9100),RT(0.9700),RT(0.9800),RT(1.0000)},
196 {RT(0.0140),RT(0.0140),RT(0.0140),RT(0.0150),RT(0.0160),RT(0.0300),RT(0.0600),RT(0.5000),RT(0.7000),RT(0.7700),RT(0.8400),RT(0.9500),RT(0.9700),RT(1.0000),RT(1.0000)},
197 {RT(0.0170),RT(0.0170),RT(0.0170),RT(0.0200),RT(0.0220),RT(0.0600),RT(0.1000),RT(0.6200),RT(0.7800),RT(0.8400),RT(0.8800),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000)},
198 {RT(0.0300),RT(0.0300),RT(0.0240),RT(0.0220),RT(0.0320),RT(0.0620),RT(0.2000),RT(0.6800),RT(0.8300),RT(0.8700),RT(0.9000),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000)},
199 {RT(0.0250),RT(0.0250),RT(0.0250),RT(0.0360),RT(0.0430),RT(0.1300),RT(0.2700),RT(0.7400),RT(0.8600),RT(0.8900),RT(0.9200),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
200 {RT(0.0270),RT(0.0270),RT(0.0270),RT(0.0400),RT(0.0520),RT(0.2000),RT(0.4000),RT(0.7800),RT(0.8800),RT(0.9000),RT(0.9400),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
201 {RT(0.0300),RT(0.0300),RT(0.0300),RT(0.0470),RT(0.0640),RT(0.2500),RT(0.5000),RT(0.8000),RT(0.9000),RT(0.9100),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
202 {RT(0.0400),RT(0.0400),RT(0.0330),RT(0.0370),RT(0.0680),RT(0.2400),RT(0.5500),RT(0.8000),RT(0.9000),RT(0.9100),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
203 {RT(0.0350),RT(0.0350),RT(0.0350),RT(0.0550),RT(0.0790),RT(0.2900),RT(0.5800),RT(0.8000),RT(0.9000),RT(0.9100),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
204 {RT(0.0370),RT(0.0370),RT(0.0370),RT(0.0620),RT(0.0820),RT(0.2900),RT(0.5900),RT(0.7800),RT(0.9000),RT(0.9100),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
205 {RT(0.0370),RT(0.0370),RT(0.0370),RT(0.0600),RT(0.0800),RT(0.2900),RT(0.5800),RT(0.7700),RT(0.8900),RT(0.9100),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
206 {RT(0.0370),RT(0.0370),RT(0.0370),RT(0.0410),RT(0.0750),RT(0.2500),RT(0.5400),RT(0.7600),RT(0.8800),RT(0.9200),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
207 {RT(0.0370),RT(0.0370),RT(0.0370),RT(0.0520),RT(0.0670),RT(0.2500),RT(0.5100),RT(0.7700),RT(0.8800),RT(0.9300),RT(0.9700),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
208 {RT(0.0370),RT(0.0370),RT(0.0370),RT(0.0470),RT(0.0570),RT(0.2500),RT(0.4900),RT(0.7700),RT(0.8900),RT(0.9500),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000),RT(1.0000)},
209 {RT(0.0360),RT(0.0360),RT(0.0360),RT(0.0420),RT(0.0480),RT(0.2300),RT(0.4700),RT(0.7800),RT(0.9200),RT(1.0000),RT(1.0200),RT(1.0200),RT(1.0200),RT(1.0200),RT(1.0200)},
210 {RT(0.0400),RT(0.0400),RT(0.0350),RT(0.0330),RT(0.0400),RT(0.1120),RT(0.4500),RT(0.7900),RT(1.0100),RT(1.0300),RT(1.0400),RT(1.0400),RT(1.0400),RT(1.0400),RT(1.0400)},
211 {RT(0.0330),RT(0.0330),RT(0.0330),RT(0.0330),RT(0.0330),RT(0.1190),RT(0.4700),RT(0.9500),RT(1.3000),RT(1.7000),RT(2.3000),RT(2.3000),RT(2.3000),RT(2.3000),RT(2.3000)},
212 {RT(0.0270),RT(0.0270),RT(0.0270),RT(0.0270),RT(0.0270),RT(0.1250),RT(0.5200),RT(1.4000),RT(2.3000),RT(3.0000),RT(4.0000),RT(4.0000),RT(4.0000),RT(4.0000),RT(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);
244 c_rate = std::min( ek, RT(1.0) );
246 }
else if ((irr >= 1) && (irr < 15)) {
248 RT
p = ( r1*RT(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;
298 RT T_degC = t_crs - RT(273.15);
300 if( T_degC >=
zero ) {
301 vis_crs = ( RT(1.7180) + RT(4.9E-3)*T_degC ) * RT(1.E-5);
303 vis_crs = ( RT(1.7180) + RT(4.9E-3)*T_degC -RT(1.2E-5)*T_degC*T_degC ) * RT(1.E-5);
307 RT lambda_crs = (
two*vis_crs) / (p_crs*std::sqrt(RT(8.0)*
mwdair*RT(1.E-3)/(
PI*
R_d*t_crs)));
313 dtmp = RT(1.2570) + RT(0.40) * exp(-RT(0.550)*diameter_1/lambda_crs);
314 RT slip_corr_1 =
one + (
two*lambda_crs*dtmp)/(diameter_1);
315 dtmp = RT(1.2570) + RT(0.40) * exp(-RT(0.550)*diameter_2/lambda_crs);
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);
324 dtmp = (RT(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);
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(RT(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(RT(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) + (RT(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:75
constexpr amrex::Real boltz
Definition: ERF_Constants.H:73
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real PI
Definition: ERF_Constants.H:16
constexpr amrex::Real R_d
Definition: ERF_Constants.H:21
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:18
Real * p
Definition: ERF_InitCustomPert_SquallLine.H:61