19 const amrex::Real dtdx,
20 const amrex::Real velL,
21 const amrex::Real velR,
22 amrex::Array4<amrex::Real const>
const& volfrac,
23 amrex::Array4<amrex::Real>
const& vofL,
24 amrex::Array4<amrex::Real>
const& vofR)
26 constexpr amrex::Real tiny =
27 std::numeric_limits<amrex::Real>::epsilon() * 1.0e4_rt;
28 amrex::Real mx = 0.0_rt, my = 0.0_rt, mz = 0.0_rt, alpha = 0.0_rt;
29 amrex::Real x0, deltax;
30 amrex::Real aL = velL * dtdx;
31 amrex::Real aR = velR * dtdx;
33 vofL(i, j, k) = 0.0_rt;
34 vofR(i, j, k) = 0.0_rt;
36 if (std::abs(volfrac(i, j, k) - 1.0_rt) <= tiny) {
38 vofL(i, j, k) = 1.0_rt;
41 vofR(i, j, k) = 1.0_rt;
43 }
else if (volfrac(i, j, k) > tiny) {
44 fit_plane(i, j, k, volfrac, mx, my, mz, alpha);
50 vofL(i, j, k) =
cut_volume(mx, my, mz, alpha, x0, deltax);
55 vofR(i, j, k) =
cut_volume(mx, my, mz, alpha, x0, deltax);
57 }
else if (dir == 1) {
60 vofL(i, j, k) =
cut_volume(my, mz, mx, alpha, x0, deltax);
65 vofR(i, j, k) =
cut_volume(my, mz, mx, alpha, x0, deltax);
67 }
else if (dir == 2) {
70 vofL(i, j, k) =
cut_volume(mz, mx, my, alpha, x0, deltax);
75 vofR(i, j, k) =
cut_volume(mz, mx, my, alpha, x0, deltax);
86 const amrex::Real dxi,
87 const amrex::Real velL,
88 const amrex::Real velR,
89 amrex::Array4<amrex::Real>
const& volfrac,
90 amrex::Array4<amrex::Real const>
const& fluxF,
91 amrex::Array4<amrex::Real const>
const& fluxC)
95 volfrac(i, j, k) += (fluxF(i, j, k) - fluxF(i + 1, j, k)) * dxi +
96 fluxC(i, j, k) * (velR - velL);
97 }
else if (dir == 1) {
98 volfrac(i, j, k) += (fluxF(i, j, k) - fluxF(i, j + 1, k)) * dxi +
99 fluxC(i, j, k) * (velR - velL);
100 }
else if (dir == 2) {
101 volfrac(i, j, k) += (fluxF(i, j, k) - fluxF(i, j, k + 1)) * dxi +
102 fluxC(i, j, k) * (velR - velL);
105 volfrac(i, j, k) = amrex::max<amrex::Real>(
106 0.0_rt, amrex::min<amrex::Real>(1.0_rt, volfrac(i, j, k)));
114 const amrex::Real disp,
115 amrex::Array4<amrex::Real>
const& f_f,
116 amrex::Array4<amrex::Real>
const& vofL,
117 amrex::Array4<amrex::Real>
const& vofR,
118 amrex::Array4<amrex::Real>
const& advalpha_f,
119 amrex::GpuArray<BC, AMREX_SPACEDIM * 2> BCs,
123 auto bclo = BCs[amrex::Orientation(dir, amrex::Orientation::low)];
124 auto bchi = BCs[amrex::Orientation(dir, amrex::Orientation::high)];
131 vofR(domlo - 1, j, k) = 0.0_rt;
132 vofL(domlo, j, k) = 0.0_rt;
138 if (i == domhi + 1) {
139 vofL(domhi + 1, j, k) = 0.0_rt;
140 vofR(domhi, j, k) = 0.0_rt;
145 advalpha_f(i, j, k) = vofR(i - 1, j, k) + vofL(i, j, k);
146 f_f(i, j, k) = advalpha_f(i, j, k) * disp;
149 }
else if (dir == 1) {
153 vofR(i, domlo - 1, k) = 0.0_rt;
154 vofL(i, domlo, k) = 0.0_rt;
159 if (j == domhi + 1) {
160 vofL(i, domhi + 1, k) = 0.0_rt;
161 vofR(i, domhi, k) = 0.0_rt;
164 advalpha_f(i, j, k) = vofR(i, j - 1, k) + vofL(i, j, k);
165 f_f(i, j, k) = advalpha_f(i, j, k) * disp;
166 }
else if (dir == 2) {
170 vofR(i, j, domlo - 1) = 0.0_rt;
171 vofL(i, j, domlo) = 0.0_rt;
176 if (k == domhi + 1) {
177 vofL(i, j, domhi + 1) = 0.0_rt;
178 vofR(i, j, domhi) = 0.0_rt;
181 advalpha_f(i, j, k) = vofR(i, j, k - 1) + vofL(i, j, k);
182 f_f(i, j, k) = advalpha_f(i, j, k) * disp;
186AMREX_GPU_DEVICE AMREX_FORCE_INLINE
void c_mask(
190 amrex::Array4<amrex::Real>
const& volfrac,
191 amrex::Array4<amrex::Real>
const& volfrac_masked)
193 if (volfrac(i, j, k) > 0.5_rt) {
194 volfrac_masked(i, j, k) = 1.0_rt;
196 volfrac_masked(i, j, k) = 0.0_rt;
204 amrex::Array4<amrex::Real>
const& volfrac)
206 amrex::Real small_vof = 1.0e-6_rt;
207 amrex::Real volFxL = volfrac(i - 1, j, k);
208 amrex::Real volFxR = volfrac(i + 1, j, k);
209 amrex::Real volFyL = volfrac(i, j - 1, k);
210 amrex::Real volFyR = volfrac(i, j + 1, k);
211 amrex::Real volFzL = volfrac(i, j, k - 1);
212 amrex::Real volFzR = volfrac(i, j, k + 1);
214 if (volfrac(i, j, k) > 0.0_rt && volFxL < small_vof && volFxR < small_vof &&
215 volFyL < small_vof && volFyR < small_vof && volFzL < small_vof &&
216 volFzR < small_vof) {
217 volfrac(i, j, k) = 0.0_rt;
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void fit_plane(const int i, const int j, const int k, amrex::Array4< amrex::Real const > const &volfrac, amrex::Real &mx, amrex::Real &my, amrex::Real &mz, amrex::Real &alpha)
Definition volume_fractions.H:457
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void balance_eulerian_fluxes(const int i, const int j, const int k, const int dir, const amrex::Real dxi, const amrex::Real velL, const amrex::Real velR, amrex::Array4< amrex::Real > const &volfrac, amrex::Array4< amrex::Real const > const &fluxF, amrex::Array4< amrex::Real const > const &fluxC)
Definition split_advection.H:81
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void eulerian_implicit(const int i, const int j, const int k, const int dir, const amrex::Real dtdx, const amrex::Real velL, const amrex::Real velR, amrex::Array4< amrex::Real const > const &volfrac, amrex::Array4< amrex::Real > const &vofL, amrex::Array4< amrex::Real > const &vofR)
Definition split_advection.H:14
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void c_mask(const int i, const int j, const int k, amrex::Array4< amrex::Real > const &volfrac, amrex::Array4< amrex::Real > const &volfrac_masked)
Definition split_advection.H:186
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real cut_volume(const amrex::Real m1, const amrex::Real m2, const amrex::Real m3, const amrex::Real alpha, const amrex::Real r0, const amrex::Real dr0) noexcept
Definition volume_fractions.H:368
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void fluxes_bc_save(const int i, const int j, const int k, const int dir, const amrex::Real disp, amrex::Array4< amrex::Real > const &f_f, amrex::Array4< amrex::Real > const &vofL, amrex::Array4< amrex::Real > const &vofR, amrex::Array4< amrex::Real > const &advalpha_f, amrex::GpuArray< BC, AMREX_SPACEDIM *2 > BCs, const int domlo, const int domhi)
Definition split_advection.H:109
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void remove_vof_debris(const int i, const int j, const int k, amrex::Array4< amrex::Real > const &volfrac)
Definition split_advection.H:200