Function for computing the momentum RHS for diffusion operator without terrain.
413 Real dx = dx_arr[0],
dy = dx_arr[1],
dz = dx_arr[2];
431 const auto& u_flagfab = u_factory->getMultiEBCellFlagFab()[mfi];
432 const auto& v_flagfab = v_factory->getMultiEBCellFlagFab()[mfi];
433 const auto& w_flagfab = w_factory->getMultiEBCellFlagFab()[mfi];
435 FabType u_type = u_flagfab.getType();
436 FabType v_type = v_flagfab.getType();
437 FabType w_type = w_flagfab.getType();
439 const bool l_wall_model = l_no_slip || l_surface_layer;
440 const bool l_u_correction = l_wall_model && !l_constraint_x &&
441 u_type == FabType::singlevalued;
442 const bool l_v_correction = l_wall_model && !l_constraint_y &&
443 v_type == FabType::singlevalued;
444 const bool l_w_correction = l_wall_model && !l_constraint_z &&
445 w_type == FabType::singlevalued;
446 const bool l_any_correction = l_u_correction || l_v_correction || l_w_correction;
448 Array4<const Real> u_volfrac = u_factory->getVolFrac().const_array(mfi);
449 Array4<const Real> v_volfrac = v_factory->getVolFrac().const_array(mfi);
450 Array4<const Real> w_volfrac = w_factory->getVolFrac().const_array(mfi);
452 Array4<const EBCellFlag> u_cellflg = u_flagfab.const_array();
453 Array4<const EBCellFlag> v_cellflg = v_flagfab.const_array();
454 Array4<const EBCellFlag> w_cellflg = w_flagfab.const_array();
455 Array4<const Real> u_volcent{};
456 Array4<const Real> v_volcent{};
457 Array4<const Real> w_volcent{};
459 if (l_any_correction) {
460 if (u_type == FabType::singlevalued) {
461 u_volcent = u_factory->getCentroid().const_array(mfi);
463 if (v_type == FabType::singlevalued) {
464 v_volcent = v_factory->getCentroid().const_array(mfi);
466 if (w_type == FabType::singlevalued) {
467 w_volcent = w_factory->getCentroid().const_array(mfi);
471 Array4<const Real> u_afrac_x{};
472 Array4<const Real> u_afrac_y{};
473 Array4<const Real> u_afrac_z{};
474 Array4<const Real> v_afrac_x{};
475 Array4<const Real> v_afrac_y{};
476 Array4<const Real> v_afrac_z{};
477 Array4<const Real> w_afrac_x{};
478 Array4<const Real> w_afrac_y{};
479 Array4<const Real> w_afrac_z{};
481 if (u_type == FabType::singlevalued) {
482 u_afrac_x = u_factory->getAreaFrac()[0]->const_array(mfi);
483 u_afrac_y = u_factory->getAreaFrac()[1]->const_array(mfi);
484 u_afrac_z = u_factory->getAreaFrac()[2]->const_array(mfi);
486 if (v_type == FabType::singlevalued) {
487 v_afrac_x = v_factory->getAreaFrac()[0]->const_array(mfi);
488 v_afrac_y = v_factory->getAreaFrac()[1]->const_array(mfi);
489 v_afrac_z = v_factory->getAreaFrac()[2]->const_array(mfi);
491 if (w_type == FabType::singlevalued) {
492 w_afrac_x = w_factory->getAreaFrac()[0]->const_array(mfi);
493 w_afrac_y = w_factory->getAreaFrac()[1]->const_array(mfi);
494 w_afrac_z = w_factory->getAreaFrac()[2]->const_array(mfi);
497 Array4<const Real> u_bcent{};
498 Array4<const Real> u_bnorm{};
499 Array4<const Real> v_bcent{};
500 Array4<const Real> v_bnorm{};
501 Array4<const Real> w_bcent{};
502 Array4<const Real> w_bnorm{};
504 if (l_u_correction) {
505 u_bcent = u_factory->getBndryCent().const_array(mfi);
506 u_bnorm = u_factory->getBndryNormal().const_array(mfi);
508 if (l_v_correction) {
509 v_bcent = v_factory->getBndryCent().const_array(mfi);
510 v_bnorm = v_factory->getBndryNormal().const_array(mfi);
512 if (l_w_correction) {
513 w_bcent = w_factory->getBndryCent().const_array(mfi);
514 w_bnorm = w_factory->getBndryNormal().const_array(mfi);
517 const Array4<const Real> unused_real{};
520 if (u_type == FabType::regular) {
522 ParallelFor(bxx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
524 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
526 rho_u_rhs(i,j,k) -= ( (
tau11(i , j , k ) -
tau11(i-1, j , k ) ) * dxinv * mfsq
527 + (
tau12(i , j+1, k ) -
tau12(i , j , k ) ) * dyinv * mfsq
528 + (
tau13(i , j , k+1) -
tau13(i , j , k ) ) * dzinv );
531 }
else if (u_type == FabType::singlevalued) {
533 ParallelFor(bxx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
534 EBCellFlag
const cell_flag = u_cellflg(i,j,k);
536 if (cell_flag.isRegular()) {
537 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
539 rho_u_rhs(i,j,k) -= ( (
tau11(i , j , k ) -
tau11(i-1, j , k ) ) * dxinv * mfsq
540 + (
tau12(i , j+1, k ) -
tau12(i , j , k ) ) * dyinv * mfsq
541 + (
tau13(i , j , k+1) -
tau13(i , j , k ) ) * dzinv );
542 }
else if (cell_flag.isSingleValued()) {
543 Real vfrac = u_volfrac(i,j,k);
544 if (vfrac <=
zero) {
return; }
547 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
549 Real diffContrib = ( (
tau11(i , j , k ) * u_afrac_x(i+1,j ,k )
550 -
tau11(i-1, j , k ) * u_afrac_x(i ,j ,k ) ) * dxinv * mfsq
551 + (
tau12(i , j+1, k ) * u_afrac_y(i ,j+1,k )
552 -
tau12(i , j , k ) * u_afrac_y(i ,j ,k ) ) * dyinv * mfsq
553 + (
tau13(i , j , k+1) * u_afrac_z(i ,j ,k+1)
554 -
tau13(i , j , k ) * u_afrac_z(i ,j ,k )) * dzinv );
555 diffContrib /= vfrac;
557 rho_u_rhs(i,j,k) -= diffContrib;
562 if (l_u_correction) {
564 launch_eb_wall_correction<0,EBBoundaryType::NoSlipWall>(
565 bxx, u_cut_cells, rho_u_rhs, u_arr, v_arr, w_arr,
566 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
567 unused_real, unused_real, unused_real, u_volfrac,
568 u_afrac_x, u_afrac_y, u_afrac_z, u_bcent, u_bnorm,
569 unused_real, unused_real,
dx,
dy,
dz, vol, mu_eff);
571 launch_eb_wall_correction<0,EBBoundaryType::SurfaceLayer>(
572 bxx, u_cut_cells, rho_u_rhs, u_arr, v_arr, w_arr,
573 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
574 u_volfrac, v_volfrac, w_volfrac, u_volfrac,
575 u_afrac_x, u_afrac_y, u_afrac_z, u_bcent, u_bnorm,
576 u_tau_eb13, u_tau_eb23,
dx,
dy,
dz, vol, mu_eff);
581 if (v_type == FabType::regular) {
583 ParallelFor(bxy, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
585 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
587 rho_v_rhs(i,j,k) -= ( (
tau12(i+1, j , k ) -
tau12(i , j , k ) ) * dxinv * mfsq
588 + (
tau22(i , j , k ) -
tau22(i , j-1, k ) ) * dyinv * mfsq
589 + (
tau23(i , j , k+1) -
tau23(i , j , k ) ) * dzinv );
591 }
else if (v_type == FabType::singlevalued) {
593 ParallelFor(bxy, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
594 EBCellFlag
const cell_flag = v_cellflg(i,j,k);
596 if (cell_flag.isRegular()) {
597 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
599 rho_v_rhs(i,j,k) -= ( (
tau12(i+1, j , k ) -
tau12(i , j , k ) ) * dxinv * mfsq
600 + (
tau22(i , j , k ) -
tau22(i , j-1, k ) ) * dyinv * mfsq
601 + (
tau23(i , j , k+1) -
tau23(i , j , k ) ) * dzinv );
602 }
else if (cell_flag.isSingleValued()) {
603 Real vfrac = v_volfrac(i,j,k);
604 if (vfrac <=
zero) {
return; }
607 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
609 Real diffContrib = ( (
tau12(i+1, j , k ) * v_afrac_x(i+1,j ,k )
610 -
tau12(i , j , k ) * v_afrac_x(i ,j ,k ) ) * dxinv * mfsq
611 + (
tau22(i , j , k ) * v_afrac_y(i ,j+1,k )
612 -
tau22(i , j-1, k ) * v_afrac_y(i ,j ,k ) ) * dyinv * mfsq
613 + (
tau23(i , j , k+1) * v_afrac_z(i ,j ,k+1)
614 -
tau23(i , j , k ) * v_afrac_z(i ,j ,k ) ) * dzinv );
615 diffContrib /= vfrac;
617 rho_v_rhs(i,j,k) -= diffContrib;
622 if (l_v_correction) {
624 launch_eb_wall_correction<1,EBBoundaryType::NoSlipWall>(
625 bxy, v_cut_cells, rho_v_rhs, u_arr, v_arr, w_arr,
626 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
627 unused_real, unused_real, unused_real, v_volfrac,
628 v_afrac_x, v_afrac_y, v_afrac_z, v_bcent, v_bnorm,
629 unused_real, unused_real,
dx,
dy,
dz, vol, mu_eff);
631 launch_eb_wall_correction<1,EBBoundaryType::SurfaceLayer>(
632 bxy, v_cut_cells, rho_v_rhs, u_arr, v_arr, w_arr,
633 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
634 u_volfrac, v_volfrac, w_volfrac, v_volfrac,
635 v_afrac_x, v_afrac_y, v_afrac_z, v_bcent, v_bnorm,
636 v_tau_eb13, v_tau_eb23,
dx,
dy,
dz, vol, mu_eff);
641 if (w_type == FabType::regular) {
643 ParallelFor(bxz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
645 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
647 rho_w_rhs(i,j,k) -= ( (
tau13(i+1, j , k ) -
tau13(i , j , k ) ) * dxinv * mfsq
648 + (
tau23(i , j+1, k ) -
tau23(i , j , k ) ) * dyinv * mfsq
649 + (
tau33(i , j , k ) -
tau33(i , j , k-1) ) * dzinv );
652 }
else if (w_type == FabType::singlevalued) {
654 ParallelFor(bxz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
655 EBCellFlag
const cell_flag = w_cellflg(i,j,k);
657 if (cell_flag.isRegular()) {
658 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
660 rho_w_rhs(i,j,k) -= ( (
tau13(i+1, j , k ) -
tau13(i , j , k ) ) * dxinv * mfsq
661 + (
tau23(i , j+1, k ) -
tau23(i , j , k ) ) * dyinv * mfsq
662 + (
tau33(i , j , k ) -
tau33(i , j , k-1) ) * dzinv );
663 }
else if (cell_flag.isSingleValued()) {
664 Real vfrac = w_volfrac(i,j,k);
665 if (vfrac <=
zero) {
return; }
668 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
670 Real diffContrib = ( (
tau13(i+1, j , k ) * w_afrac_x(i+1,j ,k )
671 -
tau13(i , j , k ) * w_afrac_x(i ,j ,k ) ) * dxinv * mfsq
672 + (
tau23(i , j+1, k ) * w_afrac_y(i ,j+1,k )
673 -
tau23(i , j , k ) * w_afrac_y(i ,j ,k ) ) * dyinv * mfsq
674 + (
tau33(i , j , k ) * w_afrac_z(i ,j ,k+1)
675 -
tau33(i , j , k-1) * w_afrac_z(i ,j ,k ) ) * dzinv );
676 diffContrib /= vfrac;
678 rho_w_rhs(i,j,k) -= diffContrib;
683 if (l_w_correction) {
685 launch_eb_wall_correction<2,EBBoundaryType::NoSlipWall>(
686 bxz, w_cut_cells, rho_w_rhs, u_arr, v_arr, w_arr,
687 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
688 unused_real, unused_real, unused_real, w_volfrac,
689 w_afrac_x, w_afrac_y, w_afrac_z, w_bcent, w_bnorm,
690 unused_real, unused_real,
dx,
dy,
dz, vol, mu_eff);
692 launch_eb_wall_correction<2,EBBoundaryType::SurfaceLayer>(
693 bxz, w_cut_cells, rho_w_rhs, u_arr, v_arr, w_arr,
694 u_cellflg, v_cellflg, w_cellflg, u_volcent, v_volcent, w_volcent,
695 u_volfrac, v_volfrac, w_volfrac, w_volfrac,
696 w_afrac_x, w_afrac_y, w_afrac_z, w_bcent, w_bnorm,
697 w_tau_eb13, w_tau_eb23,
dx,
dy,
dz, vol, mu_eff);
@ tau12
Definition: ERF_DataStruct.H:49
@ tau23
Definition: ERF_DataStruct.H:49
@ tau33
Definition: ERF_DataStruct.H:49
@ tau22
Definition: ERF_DataStruct.H:49
@ tau11
Definition: ERF_DataStruct.H:49
@ tau13
Definition: ERF_DataStruct.H:49
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
CutCellList const & get_u_cut_cells(int grid_index) const noexcept
Return cut x-faces owned by a grid, cached when the EB factories are built.
Definition: ERF_EB.H:106
CutCellList const & get_v_cut_cells(int grid_index) const noexcept
Return cut y-faces owned by a grid, cached when the EB factories are built.
Definition: ERF_EB.H:112
CutCellList const & get_w_cut_cells(int grid_index) const noexcept
Return cut z-faces owned by a grid, cached when the EB factories are built.
Definition: ERF_EB.H:118
amrex::EBFArrayBoxFactory const * get_w_const_factory() const noexcept
Return the native AMReX z-face EB factory.
Definition: ERF_EB.H:148
amrex::EBFArrayBoxFactory const * get_u_const_factory() const noexcept
Return the native AMReX x-face EB factory.
Definition: ERF_EB.H:144
amrex::EBFArrayBoxFactory const * get_v_const_factory() const noexcept
Return the native AMReX y-face EB factory.
Definition: ERF_EB.H:146
@ dz
Definition: ERF_AdvanceWDM6.cpp:273
Definition: ERF_DiffStruct.H:24
bool eb_diff_constraint_z
Whether to constrain EB diffusion in the z direction.
Definition: ERF_DiffStruct.H:111
MolecDiffType molec_diff_type
Selected molecular transport model.
Definition: ERF_DiffStruct.H:96
bool eb_diff_constraint_y
Whether to constrain EB diffusion in the y direction.
Definition: ERF_DiffStruct.H:110
bool eb_diff_constraint_x
Whether to constrain EB diffusion in the x direction.
Definition: ERF_DiffStruct.H:109
amrex::Real dynamic_viscosity
Dynamic viscosity for momentum diffusion [kg/(m-s)].
Definition: ERF_DiffStruct.H:108
amrex::Real rho0_trans
Reference density used to compute dynamic diffusion coefficients [kg/m3].
Definition: ERF_DiffStruct.H:103
Definition: ERF_EBStruct.H:36
EBChoice ebChoice
Embedded-boundary options.
Definition: ERF_DataStruct.H:2621
DiffChoice diffChoice
Diffusion-related options.
Definition: ERF_DataStruct.H:2617