Convert velocity to momentum by multiplying by density averaged onto faces.
45 const BCRec* bc_ptr_h = domain_bcs_type_h.data();
49 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
51 for ( MFIter mfi(density,TilingIfNotGPU()); mfi.isValid(); ++mfi)
54 const Box& bx = mfi.tilebox();
57 tbx = mfi.tilebox(IntVect(1,0,0),xvel_ngrow);
58 tby = mfi.tilebox(IntVect(0,1,0),yvel_ngrow);
59 tbz = mfi.tilebox(IntVect(0,0,1),zvel_ngrow);
62 if (tbz.smallEnd(2) < domain.smallEnd(2)) tbz.setSmall(2,domain.smallEnd(2));
63 if (tbz.bigEnd(2) > domain.bigEnd(2)+1) tbz.setBig(2,domain.bigEnd(2)+1);
66 const Array4<const Real>& dens_arr = density.array(mfi);
69 Array4<Real>
const& momx =
xmom.array(mfi);
70 Array4<Real>
const& momy =
ymom.array(mfi);
71 Array4<Real>
const& momz =
zmom.array(mfi);
74 const Array4<Real const>& velx = xvel_in.const_array(mfi);
75 const Array4<Real const>& vely = yvel_in.const_array(mfi);
76 const Array4<Real const>& velz = zvel_in.const_array(mfi);
80 if (c_vfrac==
nullptr) {
81 ParallelFor(tbx, tby, tbz,
82 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
83 momx(i,j,k) = velx(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i-1,j,k,
Rho_comp));
85 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
86 momy(i,j,k) = vely(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i,j-1,k,
Rho_comp));
88 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
89 momz(i,j,k) = velz(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i,j,k-1,
Rho_comp));
93 const Array4<const Real>& c_vfrac_arr = c_vfrac->const_array(mfi);
95 ParallelFor(tbx, tby, tbz,
96 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
97 if (c_vfrac_arr(i,j,k) > 0.0 || c_vfrac_arr(i-1,j,k) > 0.0) {
99 + c_vfrac_arr(i-1,j,k) * dens_arr(i-1,j,k,
Rho_comp))
100 / (c_vfrac_arr(i,j,k) + c_vfrac_arr(i-1,j,k));
101 momx(i,j,k) = velx(i,j,k) *
rho;
103 momx(i,j,k) = velx(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i-1,j,k,
Rho_comp));
106 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
107 if (c_vfrac_arr(i,j,k) > 0.0 || c_vfrac_arr(i,j-1,k) > 0.0) {
109 + c_vfrac_arr(i,j-1,k) * dens_arr(i,j-1,k,
Rho_comp))
110 / (c_vfrac_arr(i,j,k) + c_vfrac_arr(i,j-1,k));
111 momy(i,j,k) = vely(i,j,k) *
rho;
113 momy(i,j,k) = vely(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i,j-1,k,
Rho_comp));
116 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
117 if (c_vfrac_arr(i,j,k) > 0.0 || c_vfrac_arr(i,j,k-1) > 0.0) {
119 + c_vfrac_arr(i,j,k-1) * dens_arr(i,j,k-1,
Rho_comp))
120 / (c_vfrac_arr(i,j,k) + c_vfrac_arr(i,j,k-1));
121 momz(i,j,k) = velz(i,j,k) *
rho;
123 momz(i,j,k) = velz(i,j,k) * 0.5 * (dens_arr(i,j,k,
Rho_comp) + dens_arr(i,j,k-1,
Rho_comp));
129 if (bx.smallEnd(0) == domain.smallEnd(0)) {
132 ParallelFor(makeSlab(tbx,0,domain.smallEnd(0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
133 momx(i,j,k) = velx(i,j,k) * dens_arr(i-1,j,k,
Rho_comp);
138 ParallelFor(makeSlab(tbx,0,domain.smallEnd(0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
139 if (velx(i,j,k) >= 0.) {
140 momx(i,j,k) = velx(i,j,k) * dens_arr(i-1,j,k,
Rho_comp);
146 if (bx.bigEnd(0) == domain.bigEnd(0)) {
149 ParallelFor(makeSlab(tbx,0,domain.bigEnd(0)+1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
150 momx(i,j,k) = velx(i,j,k) * dens_arr(i,j,k,
Rho_comp);
155 ParallelFor(makeSlab(tbx,0,domain.smallEnd(0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
156 if (velx(i,j,k) <= 0.) {
157 momx(i,j,k) = velx(i,j,k) * dens_arr(i,j,k,
Rho_comp);
163 if (bx.smallEnd(1) == domain.smallEnd(1)) {
166 ParallelFor(makeSlab(tby,1,domain.smallEnd(1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
167 momy(i,j,k) = vely(i,j,k) / dens_arr(i,j-1,k,
Rho_comp);
172 ParallelFor(makeSlab(tby,1,domain.smallEnd(1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
173 if (vely(i,j,k) >= 0.) {
174 momy(i,j,k) = vely(i,j,k) / dens_arr(i,j-1,k,
Rho_comp);
180 if (bx.bigEnd(1) == domain.bigEnd(1)) {
183 ParallelFor(makeSlab(tby,1,domain.bigEnd(1)+1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
184 momy(i,j,k) = vely(i,j,k) / dens_arr(i,j,k,
Rho_comp);
189 ParallelFor(makeSlab(tby,1,domain.smallEnd(1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
190 if (vely(i,j,k) <= 0.) {
191 momy(i,j,k) = vely(i,j,k) / dens_arr(i,j,k,
Rho_comp);
198 if (bx.bigEnd(2) == domain.bigEnd(2))
200 ParallelFor(makeSlab(tbx,2,domain.bigEnd(2)+1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
201 momx(i,j,k) = momx(i,j,k-1);
203 ParallelFor(makeSlab(tby,2,domain.bigEnd(2)+1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
204 momy(i,j,k) = momy(i,j,k-1);
#define Rho_comp
Definition: ERF_IndexDefines.H:36
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void VelocityToMomentum(const MultiFab &xvel_in, const IntVect &xvel_ngrow, const MultiFab &yvel_in, const IntVect &yvel_ngrow, const MultiFab &zvel_in, const IntVect &zvel_ngrow, const MultiFab &density, MultiFab &xmom, MultiFab &ymom, MultiFab &zmom, const Box &domain, const Vector< BCRec > &domain_bcs_type_h, const MultiFab *c_vfrac)
Definition: ERF_VelocityToMomentum.cpp:31
@ cons_bc
Definition: ERF_IndexDefines.H:76
@ ext_dir
Definition: ERF_IndexDefines.H:209
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:217
@ ymom
Definition: ERF_IndexDefines.H:160
@ zmom
Definition: ERF_IndexDefines.H:161
@ xmom
Definition: ERF_IndexDefines.H:159
@ rho
Definition: ERF_Kessler.H:22