21 #ifndef FUB_AMREX_CUTCELL_MASSFLOW_BOUNDARY2_HPP
22 #define FUB_AMREX_CUTCELL_MASSFLOW_BOUNDARY2_HPP
60 void FillBoundary(::amrex::MultiFab& mf, const ::amrex::MultiFab& alphas,
61 const ::amrex::Geometry& geom);
77 template <
typename EulerEquation>
80 : equation_{eq}, options_{options} {}
82 template <
typename EulerEquation>
86 const ::amrex::MultiFab& alphas = factory->getVolFrac();
90 template <
typename EulerEquation>
92 ::amrex::MultiFab& mf, const ::amrex::MultiFab& alphas,
93 const ::amrex::Geometry& geom) {
97 ::amrex::FArrayBox& fab = mf[mfi];
98 const ::amrex::FArrayBox& alpha = alphas[mfi];
100 mfi.growntilebox() & options_.boundary_section;
101 if (!box_to_fill.isEmpty()) {
102 auto states = MakeView<Complete>(fab, equation_, mfi.growntilebox());
104 AsIndexBox<EulerEquation::Rank()>(box_to_fill), [&](auto... is) {
105 Index<EulerEquation::Rank()> dest{is...};
106 Index<EulerEquation::Rank()> src =
107 MapToSrc(dest, geom, options_.side, options_.dir);
108 ::amrex::IntVect src_iv{
109 AMREX_D_DECL(int(src[0]), int(src[1]), int(src[2]))};
111 AMREX_D_DECL(int(dest[0]), int(dest[1]), int(dest[2]))};
112 if (alpha(iv) > 0.0 && alpha(src_iv) > 0.0) {
113 Load(state, states, src);
114 ExpandState(expanded, state);
115 Store(states, expanded, dest);
122 template <
typename EulerEquation>
131 const double c2 = c*c;
132 const int dir_v =
static_cast<int>(options_.dir);
133 const double u = prim.velocity[dir_v];
134 const double u2 = u * u;
135 const double Ma2 = u2 / c2;
137 const double gammaMinus = gamma - 1.0;
138 const double gammaPlus = gamma + 1.0;
141 const double p_0 = p * std::pow(1.0 + 0.5 * Ma2 * gammaMinus, gamma / gammaMinus);
142 const double rho_0 = rho * std::pow(1.0 + 0.5 * Ma2 * gammaMinus, 1.0 / gammaMinus);
144 const double Ma_r = options_.required_mach_number;
145 const double Ma2_r = Ma_r * Ma_r;
146 const double laval2_n = Ma2_r * gammaPlus / (Ma2_r * gammaMinus + 2.0);
149 const double p_n = p_0 * std::pow(1.0 - gammaMinus / gammaPlus * laval2_n, gamma / gammaMinus);
150 const double rho_n = rho_0 * std::pow(1.0 - gammaMinus / gammaPlus * laval2_n, 1.0 / gammaPlus);
151 prim.density = rho_n;
154 const double c2_critical = (c2 + 0.5 * gammaMinus * u2) * 2.0 / gammaPlus;
155 const double u2_n = laval2_n * c2_critical;
156 prim.velocity[dir_v] = std::sqrt(u2_n);
This class modifies and initializes a cutcell::PatchLevel in a cutcell::PatchHierarchy.
Definition: AMReX/cutcell/GriddingAlgorithm.hpp:56
const PatchHierarchy & GetPatchHierarchy() const noexcept
Definition: MachnumberBoundary.hpp:50
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level)
Definition: MachnumberBoundary.hpp:83
MachnumberBoundary(const EulerEquation &eq, const MachnumberBoundaryOptions &options)
Definition: MachnumberBoundary.hpp:78
MachnumberBoundaryOptions options_
Definition: MachnumberBoundary.hpp:74
void ExpandState(Complete &expanded, const Complete &source)
Definition: MachnumberBoundary.hpp:123
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level, Direction dir)
Definition: MachnumberBoundary.hpp:63
EulerEquation equation_
Definition: MachnumberBoundary.hpp:73
const std::shared_ptr<::amrex::EBFArrayBoxFactory > & GetEmbeddedBoundary(int level) const
Returns the number of cycles done for a specific level.
const ::amrex::Geometry & GetGeometry(int level) const
Returns the number of cycles done for a specific level.
void ForEachFab(Tag, const ::amrex::FabArrayBase &fabarray, F function)
Iterate through all local FArrayBox objects in a MultiFab.
Definition: ForEachFab.hpp:34
Definition: FillCutCellData.hpp:30
void ExpandState(EulerEquation &eq, Complete< EulerEquation > &dest, const Complete< EulerEquation > &src, double pressure_dest, double efficiency)
Definition: boundary_condition/IsentropicPressureExpansion.hpp:71
constexpr struct fub::euler::SpeedOfSoundFn SpeedOfSound
constexpr struct fub::euler::GammaFn Gamma
constexpr struct fub::euler::PressureFn Pressure
constexpr struct fub::euler::DensityFn Density
constexpr SequentialTag seq
Definition: Execution.hpp:31
void PrimFromComplete(const PerfectGas< Rank > &, Primitive< PerfectGas< Rank >> &prim, const Complete< PerfectGas< Rank >> &complete)
Definition: PerfectGas.hpp:322
void CompleteFromPrim(const PerfectGas< Rank > &equation, Complete< PerfectGas< Rank >> &complete, const Primitive< PerfectGas< Rank >> &prim)
Definition: PerfectGas.hpp:314
boost::log::sources::severity_logger< boost::log::trivial::severity_level > SeverityLogger
Definition: Log.hpp:46
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
IndexBox< Rank > Box(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:486
std::map< std::string, pybind11::object > ProgramOptions
Definition: ProgramOptions.hpp:40
Definition: MachnumberBoundary.hpp:35
std::string channel_name
Definition: MachnumberBoundary.hpp:41
double required_mach_number
Definition: MachnumberBoundary.hpp:43
int side
Definition: MachnumberBoundary.hpp:45
MachnumberBoundaryOptions()=default
::amrex::Box boundary_section
Definition: MachnumberBoundary.hpp:42
void Print(SeverityLogger &log) const
MachnumberBoundaryOptions(const ProgramOptions &options)
Direction dir
Definition: MachnumberBoundary.hpp:44