27 amrex::Array4<amrex::Real const>
const& volfrac,
30 amrex::Real& mz)
noexcept
33 volfrac(i - 1, j - 1, k - 1) + volfrac(i - 1, j - 1, k + 1) +
34 volfrac(i - 1, j + 1, k - 1) + volfrac(i - 1, j + 1, k + 1) +
35 2.0_rt * (volfrac(i - 1, j - 1, k) + volfrac(i - 1, j + 1, k) +
36 volfrac(i - 1, j, k - 1) + volfrac(i - 1, j, k + 1)) +
37 4.0_rt * volfrac(i - 1, j, k);
39 volfrac(i + 1, j - 1, k - 1) + volfrac(i + 1, j - 1, k + 1) +
40 volfrac(i + 1, j + 1, k - 1) + volfrac(i + 1, j + 1, k + 1) +
41 2.0_rt * (volfrac(i + 1, j - 1, k) + volfrac(i + 1, j + 1, k) +
42 volfrac(i + 1, j, k - 1) + volfrac(i + 1, j, k + 1)) +
43 4.0_rt * volfrac(i + 1, j, k);
46 mm1 = volfrac(i - 1, j - 1, k - 1) + volfrac(i - 1, j - 1, k + 1) +
47 volfrac(i + 1, j - 1, k - 1) + volfrac(i + 1, j - 1, k + 1) +
48 2.0_rt * (volfrac(i - 1, j - 1, k) + volfrac(i + 1, j - 1, k) +
49 volfrac(i, j - 1, k - 1) + volfrac(i, j - 1, k + 1)) +
50 4.0_rt * volfrac(i, j - 1, k);
51 mm2 = volfrac(i - 1, j + 1, k - 1) + volfrac(i - 1, j + 1, k + 1) +
52 volfrac(i + 1, j + 1, k - 1) + volfrac(i + 1, j + 1, k + 1) +
53 2.0_rt * (volfrac(i - 1, j + 1, k) + volfrac(i + 1, j + 1, k) +
54 volfrac(i, j + 1, k - 1) + volfrac(i, j + 1, k + 1)) +
55 4.0_rt * volfrac(i, j + 1, k);
58 mm1 = volfrac(i - 1, j - 1, k - 1) + volfrac(i - 1, j + 1, k - 1) +
59 volfrac(i + 1, j - 1, k - 1) + volfrac(i + 1, j + 1, k - 1) +
60 2.0_rt * (volfrac(i - 1, j, k - 1) + volfrac(i + 1, j, k - 1) +
61 volfrac(i, j - 1, k - 1) + volfrac(i, j + 1, k - 1)) +
62 4.0_rt * volfrac(i, j, k - 1);
63 mm2 = volfrac(i - 1, j - 1, k + 1) + volfrac(i - 1, j + 1, k + 1) +
64 volfrac(i + 1, j - 1, k + 1) + volfrac(i + 1, j + 1, k + 1) +
65 2.0_rt * (volfrac(i - 1, j, k + 1) + volfrac(i + 1, j, k + 1) +
66 volfrac(i, j - 1, k + 1) + volfrac(i, j + 1, k + 1)) +
67 4.0_rt * volfrac(i, j, k + 1);
79 amrex::Array4<amrex::Real const>
const& volfrac,
82 amrex::Real& mz)
noexcept
85 const int im1 = ibdy == -1 ? i : i - 1;
86 const int jm1 = jbdy == -1 ? j : j - 1;
87 const int km1 = kbdy == -1 ? k : k - 1;
88 const int ip1 = ibdy == +1 ? i : i + 1;
89 const int jp1 = jbdy == +1 ? j : j + 1;
90 const int kp1 = kbdy == +1 ? k : k + 1;
92 amrex::Real mm1 = volfrac(im1, jm1, km1) + volfrac(im1, jm1, kp1) +
93 volfrac(im1, jp1, km1) + volfrac(im1, jp1, kp1) +
94 2.0_rt * (volfrac(im1, jm1, k) + volfrac(im1, jp1, k) +
95 volfrac(im1, j, km1) + volfrac(im1, j, kp1)) +
96 4.0_rt * volfrac(im1, j, k);
97 amrex::Real mm2 = volfrac(ip1, jm1, km1) + volfrac(ip1, jm1, kp1) +
98 volfrac(ip1, jp1, km1) + volfrac(ip1, jp1, kp1) +
99 2.0_rt * (volfrac(ip1, jm1, k) + volfrac(ip1, jp1, k) +
100 volfrac(ip1, j, km1) + volfrac(ip1, j, kp1)) +
101 4.0_rt * volfrac(ip1, j, k);
104 mm1 = volfrac(im1, jm1, km1) + volfrac(im1, jm1, kp1) +
105 volfrac(ip1, jm1, km1) + volfrac(ip1, jm1, kp1) +
106 2.0_rt * (volfrac(im1, jm1, k) + volfrac(ip1, jm1, k) +
107 volfrac(i, jm1, km1) + volfrac(i, jm1, kp1)) +
108 4.0_rt * volfrac(i, jm1, k);
109 mm2 = volfrac(im1, jp1, km1) + volfrac(im1, jp1, kp1) +
110 volfrac(ip1, jp1, km1) + volfrac(ip1, jp1, kp1) +
111 2.0_rt * (volfrac(im1, jp1, k) + volfrac(ip1, jp1, k) +
112 volfrac(i, jp1, km1) + volfrac(i, jp1, kp1)) +
113 4.0_rt * volfrac(i, jp1, k);
116 mm1 = volfrac(im1, jm1, km1) + volfrac(im1, jp1, km1) +
117 volfrac(ip1, jm1, km1) + volfrac(ip1, jp1, km1) +
118 2.0_rt * (volfrac(im1, j, km1) + volfrac(ip1, j, km1) +
119 volfrac(i, jm1, km1) + volfrac(i, jp1, km1)) +
120 4.0_rt * volfrac(i, j, km1);
121 mm2 = volfrac(im1, jm1, kp1) + volfrac(im1, jp1, kp1) +
122 volfrac(ip1, jm1, kp1) + volfrac(ip1, jp1, kp1) +
123 2.0_rt * (volfrac(im1, j, kp1) + volfrac(ip1, j, kp1) +
124 volfrac(i, jm1, kp1) + volfrac(i, jp1, kp1)) +
125 4.0_rt * volfrac(i, j, kp1);
133 amrex::Array4<amrex::Real const>
const& volfrac,
136 amrex::Real& mz)
noexcept
138 amrex::Array2D<amrex::Real, 0, AMREX_SPACEDIM + 1, 0, AMREX_SPACEDIM> m;
141 amrex::Real m1 = volfrac(i - 1, j, k - 1) + volfrac(i - 1, j, k + 1) +
142 volfrac(i - 1, j - 1, k) + volfrac(i - 1, j + 1, k) +
143 volfrac(i - 1, j, k);
144 amrex::Real m2 = volfrac(i + 1, j, k - 1) + volfrac(i + 1, j, k + 1) +
145 volfrac(i + 1, j - 1, k) + volfrac(i + 1, j + 1, k) +
146 volfrac(i + 1, j, k);
148 m(0, 0) = (m1 > m2) ? 1.0_rt : -1.0_rt;
150 m1 = volfrac(i - 1, j - 1, k) + volfrac(i + 1, j - 1, k) +
151 volfrac(i, j - 1, k);
152 m2 = volfrac(i - 1, j + 1, k) + volfrac(i + 1, j + 1, k) +
153 volfrac(i, j + 1, k);
154 m(0, 1) = 0.5_rt * (m1 - m2);
156 m1 = volfrac(i - 1, j, k - 1) + volfrac(i + 1, j, k - 1) +
157 volfrac(i, j, k - 1);
158 m2 = volfrac(i - 1, j, k + 1) + volfrac(i + 1, j, k + 1) +
159 volfrac(i, j, k + 1);
160 m(0, 2) = 0.5_rt * (m1 - m2);
165 m1 = volfrac(i - 1, j - 1, k) + volfrac(i - 1, j + 1, k) +
166 volfrac(i - 1, j, k);
167 m2 = volfrac(i + 1, j - 1, k) + volfrac(i + 1, j + 1, k) +
168 volfrac(i + 1, j, k);
169 m(1, 0) = 0.5_rt * (m1 - m2);
171 m1 = volfrac(i, j - 1, k - 1) + volfrac(i, j - 1, k + 1) +
172 volfrac(i + 1, j - 1, k) + volfrac(i - 1, j - 1, k) +
173 volfrac(i, j - 1, k);
174 m2 = volfrac(i, j + 1, k - 1) + volfrac(i, j + 1, k + 1) +
175 volfrac(i + 1, j + 1, k) + volfrac(i - 1, j + 1, k) +
176 volfrac(i, j + 1, k);
178 m(1, 1) = (m1 > m2) ? 1.0_rt : -1.0_rt;
180 m1 = volfrac(i, j - 1, k - 1) + volfrac(i, j, k - 1) +
181 volfrac(i, j + 1, k - 1);
182 m2 = volfrac(i, j - 1, k + 1) + volfrac(i, j, k + 1) +
183 volfrac(i, j + 1, k + 1);
184 m(1, 2) = 0.5_rt * (m1 - m2);
189 m1 = volfrac(i - 1, j, k - 1) + volfrac(i - 1, j, k + 1) +
190 volfrac(i - 1, j, k);
191 m2 = volfrac(i + 1, j, k - 1) + volfrac(i + 1, j, k + 1) +
192 volfrac(i + 1, j, k);
193 m(2, 0) = 0.5_rt * (m1 - m2);
195 m1 = volfrac(i, j - 1, k - 1) + volfrac(i, j - 1, k + 1) +
196 volfrac(i, j - 1, k);
197 m2 = volfrac(i, j + 1, k - 1) + volfrac(i, j + 1, k + 1) +
198 volfrac(i, j + 1, k);
199 m(2, 1) = 0.5_rt * (m1 - m2);
201 m1 = volfrac(i - 1, j, k - 1) + volfrac(i + 1, j, k - 1) +
202 volfrac(i, j - 1, k - 1) + volfrac(i, j + 1, k - 1) +
203 volfrac(i, j, k - 1);
204 m2 = volfrac(i - 1, j, k + 1) + volfrac(i + 1, j, k + 1) +
205 volfrac(i, j - 1, k + 1) + volfrac(i, j + 1, k + 1) +
206 volfrac(i, j, k + 1);
208 m(2, 2) = (m1 > m2) ? 1.0_rt : -1.0_rt;
211 amrex::Real t0, t1, t2;
213 t0 = std::abs(m(0, 0)) + std::abs(m(0, 1)) + std::abs(m(0, 2));
214 m(0, 0) = m(0, 0) / t0;
215 m(0, 1) = m(0, 1) / t0;
216 m(0, 2) = m(0, 2) / t0;
218 t0 = std::abs(m(1, 0)) + std::abs(m(1, 1)) + std::abs(m(1, 2));
219 m(1, 0) = m(1, 0) / t0;
220 m(1, 1) = m(1, 1) / t0;
221 m(1, 2) = m(1, 2) / t0;
223 t0 = std::abs(m(2, 0)) + std::abs(m(2, 1)) + std::abs(m(2, 2));
224 m(2, 0) = m(2, 0) / t0;
225 m(2, 1) = m(2, 1) / t0;
226 m(2, 2) = m(2, 2) / t0;
229 t0 = std::abs(m(0, 0));
230 t1 = std::abs(m(1, 1));
231 t2 = std::abs(m(2, 2));
245 i, j, k, volfrac, m(3, 0), m(3, 1), m(3, 2));
247 constexpr amrex::Real tiny = std::numeric_limits<amrex::Real>::epsilon();
248 t0 = std::abs(m(3, 0)) + std::abs(m(3, 1)) + std::abs(m(3, 2)) + tiny;
249 m(3, 0) = m(3, 0) / t0;
250 m(3, 1) = m(3, 1) / t0;
251 m(3, 2) = m(3, 2) / t0;
254 t0 = std::abs(m(3, 0));
255 t1 = std::abs(m(3, 1));
256 t2 = std::abs(m(3, 2));
264 if (std::abs(m(cn, cn)) > t0 && t0 > 0.0_rt) {
279 const amrex::Real b1,
280 const amrex::Real b2,
281 const amrex::Real b3,
282 const amrex::Real volF)
noexcept
284 amrex::Real const_tiny = std::numeric_limits<amrex::Real>::epsilon();
290 amrex::Real m1 = amrex::min(b1, b2);
291 amrex::Real m3 = amrex::max(b1, b2);
299 }
else if (m2 > m3) {
305 amrex::Real m12 = m1 + m2;
306 amrex::Real pr = amrex::max<amrex::Real>(6.0_rt * m1 * m2 * m3, const_tiny);
307 amrex::Real V1 = m1 * m1 * m1 / pr;
308 amrex::Real V2 = V1 + 0.5_rt * (m2 - m1) / m3;
313 V3 = (m3 * m3 * (3.0_rt * m12 - m3) + m1 * m1 * (m1 - 3.0_rt * m3) +
314 m2 * m2 * (m2 - 3.0_rt * m3)) /
318 V3 = 0.5_rt * mm / m3;
321 amrex::Real ch = amrex::min<amrex::Real>(volF, 1.0_rt - volF);
323 amrex::Real alpha, p, q, p12, teta, cs;
325 alpha = std::cbrt(pr * ch);
326 }
else if (ch < V2) {
328 0.50_rt * (m1 + std::sqrt(m1 * m1 + 8.0_rt * m2 * m3 * (ch - V1)));
329 }
else if (ch < V3) {
330 p = 2.0_rt * m1 * m2;
331 q = 1.5_rt * m1 * m2 * (m12 - 2.0_rt * m3 * ch);
335 q / (p * p12 + std::numeric_limits<amrex::Real>::epsilon())) /
338 alpha = p12 * (std::sqrt(3.0_rt * (1.0_rt - cs * cs)) - cs) + m12;
339 }
else if (m12 < m3) {
340 alpha = m3 * ch + 0.5_rt * mm;
342 p = m1 * (m2 + m3) + m2 * m3 - 0.25_rt;
343 q = 1.5_rt * m1 * m2 * m3 * (0.5_rt - ch);
347 q / (p * p12 + std::numeric_limits<amrex::Real>::epsilon())) /
350 alpha = p12 * (std::sqrt(3.0_rt * (1.0_rt - cs * cs)) - cs) + 0.5_rt;
354 alpha = 1.0_rt - alpha;
368AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real
cut_volume(
369 const amrex::Real m1,
370 const amrex::Real m2,
371 const amrex::Real m3,
372 const amrex::Real alpha,
373 const amrex::Real r0,
374 const amrex::Real dr0)
noexcept
376 const amrex::Real const_tiny = std::numeric_limits<amrex::Real>::epsilon();
380 al = alpha - m1 * r0;
383 al = al + amrex::max<amrex::Real>(0.0_rt, -m1 * dr0) +
384 amrex::max<amrex::Real>(0.0_rt, -m2) +
385 amrex::max<amrex::Real>(0.0_rt, -m3);
389 amrex::Real tmp = std::abs(m1) * dr0 + std::abs(m2) + std::abs(m3);
390 amrex::Real n1 = std::abs(m1) / tmp;
391 amrex::Real n2 = std::abs(m2) / tmp;
392 amrex::Real n3 = std::abs(m3) / tmp;
393 al = amrex::max<amrex::Real>(
394 0.0_rt, amrex::min<amrex::Real>(
397 amrex::min<amrex::Real>(al, 1.0_rt - al);
400 amrex::Real b1 = amrex::min(n1 * dr0, n2);
401 amrex::Real b3 = amrex::max(n1 * dr0, n2);
408 }
else if (b2 > b3) {
414 amrex::Real b12 = b1 + b2;
418 amrex::Real vm1 = b1;
419 amrex::Real vm3 = b3;
420 amrex::Real vm2 = b2;
421 amrex::Real vm12 = b12;
423 amrex::Real v = 0.0_rt;
427 v = a * a * a / (6.0_rt * vm1 * vm2 * vm3);
428 }
else if (a < vm2) {
429 v = a * (a - vm1) / (2.0_rt * vm2 * vm3) +
430 vm1 * vm1 / (6.0_rt * vm2 * vm3 + const_tiny);
431 }
else if (a < amrex::min(vm12, vm3)) {
432 v = (a * a * (3.0_rt * vm12 - a) + vm1 * vm1 * (vm1 - 3.0_rt * a) +
433 vm2 * vm2 * (vm2 - 3.0_rt * a)) /
434 (6.0_rt * vm1 * vm2 * vm3);
435 }
else if (vm3 < vm12) {
436 v = (a * a * (3.0_rt - 2.0_rt * a) +
437 vm1 * vm1 * (vm1 - 3.0_rt * a) +
438 vm2 * vm2 * (vm2 - 3.0_rt * a) +
439 vm3 * vm3 * (vm3 - 3.0_rt * a)) /
440 (6.0_rt * vm1 * vm2 * vm3);
442 v = (a - 0.5_rt * vm12) / vm3;
451 FL3D = (1.0_rt - tmp);