28 #ifndef BC_CONSTANT_H_
29 #define BC_CONSTANT_H_
31 #include <AMReX_ParallelDescriptor.H>
32 #include <AMReX_ParmParse.H>
33 #include <AMReX_BCRec.H>
34 #include <AMReX_PhysBCFunct.H>
35 #include <AMReX_Array.H>
44 :
public BC<Set::Scalar>
52 #elif AMREX_SPACEDIM==3
54 XLO, YLO, ZLO, XHI, YHI, ZHI,
60 static constexpr
const char*
name =
"constant";
68 Constant(
int ncomp, amrex::Vector<std::string> bc_hi_str,
69 amrex::Vector<std::string> bc_lo_str,
71 amrex::Vector<amrex::Real> _bc_lo_2,
72 amrex::Vector<amrex::Real> _bc_lo_3),
74 amrex::Vector<amrex::Real> _bc_hi_2,
75 amrex::Vector<amrex::Real> _bc_hi_3));
81 for (
int d = 0; d < m_nfaces; d++)
84 for (
int n = 0; n < ncomp; n++)
86 ret.
m_bc_type[d].push_back((
int)amrex::LinOpBCType::Neumann);
98 for (
int d = 0; d < m_nfaces; d++)
99 for (
int n = 0; n < ncomp; n++)
101 ret.
m_bc_type[n][d] = (int)amrex::LinOpBCType::Dirichlet;
111 virtual void FillBoundary(amrex::BaseFab<Set::Scalar>& in,
const amrex::Box& box,
112 int ngrow,
int dcomp,
int ncomp, amrex::Real time,
114 const amrex::Mask* mask =
nullptr)
override;
119 virtual amrex::Array<int, AMREX_SPACEDIM>
IsPeriodic()
override;
120 virtual amrex::Periodicity
Periodicity()
const override;
121 virtual amrex::Periodicity
Periodicity(
const amrex::Box& b)
override;
126 const amrex::Array<amrex::Array<T, AMREX_SPACEDIM>, 2>
GetBCTypes()
134 #if AMREX_SPACEDIM==2
135 static const int m_nfaces = 4;
136 #elif AMREX_SPACEDIM==3
137 static const int m_nfaces = 6;
148 std::array<std::vector<Numeric::Interpolator::Linear<Set::Scalar>>, m_nfaces>
m_bc_val;
153 std::map<std::string, int> bcmap;
154 bcmap[
"BOGUS_BC"] = amrex::BCType::mathematicalBndryTypes::bogus;
155 bcmap[
"INT_DIR"] = amrex::BCType::mathematicalBndryTypes::int_dir;
156 bcmap[
"REFLECT_ODD"] = amrex::BCType::mathematicalBndryTypes::reflect_odd;
157 bcmap[
"INT_DIR"] = amrex::BCType::mathematicalBndryTypes::int_dir;
158 bcmap[
"REFLECT_EVEN"] = amrex::BCType::mathematicalBndryTypes::reflect_even;
159 bcmap[
"FOEXTRAP"] = amrex::BCType::mathematicalBndryTypes::foextrap;
160 bcmap[
"EXT_DIR"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
161 bcmap[
"HOEXTRAP"] = amrex::BCType::mathematicalBndryTypes::hoextrap;
162 bcmap[
"Interior"] = amrex::BCType::mathematicalBndryTypes::int_dir;
163 bcmap[
"Inflow"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
164 bcmap[
"Outflow"] = amrex::BCType::mathematicalBndryTypes::foextrap;
165 bcmap[
"Symmetry"] = amrex::BCType::mathematicalBndryTypes::reflect_even;
166 bcmap[
"SlipWall"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
167 bcmap[
"NoSlipWall"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
169 bcmap[
"interior"] = (int)amrex::LinOpBCType::interior;
170 bcmap[
"Dirichlet"] = (int)amrex::LinOpBCType::Dirichlet;
171 bcmap[
"dirichlet"] = (int)amrex::LinOpBCType::Dirichlet;
172 bcmap[
"Neumann"] = (int)amrex::LinOpBCType::Neumann;
173 bcmap[
"NEUMANN"] = (int)amrex::LinOpBCType::Neumann;
174 bcmap[
"neumann"] = (int)amrex::LinOpBCType::Neumann;
175 bcmap[
"reflect_odd"] = (int)amrex::LinOpBCType::reflect_odd;
176 bcmap[
"Marshak"] = (int)amrex::LinOpBCType::Marshak;
177 bcmap[
"SanchezPomraning"] = (int)amrex::LinOpBCType::SanchezPomraning;
178 bcmap[
"inflow"] = (int)amrex::LinOpBCType::inflow;
179 bcmap[
"Periodic"] = (int)amrex::LinOpBCType::Periodic;
180 bcmap[
"periodic"] = (int)amrex::LinOpBCType::Periodic;
188 #if AMREX_SPACEDIM == 3
195 std::vector<std::string> str;
197 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
198 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::XLO].push_back(bcmap[str[i]]);
199 else if (str.size() == 1) value.
m_bc_type[Face::XLO].resize(value.
m_ncomp, bcmap[str[0]]);
202 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
203 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::XHI].push_back(bcmap[str[i]]);
204 else if (str.size() == 1) value.
m_bc_type[Face::XHI].resize(value.
m_ncomp, bcmap[str[0]]);
207 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
208 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::YLO].push_back(bcmap[str[i]]);
209 else if (str.size() == 1) value.
m_bc_type[Face::YLO].resize(value.
m_ncomp, bcmap[str[0]]);
212 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
213 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::YHI].push_back(bcmap[str[i]]);
214 else if (str.size() == 1) value.
m_bc_type[Face::YHI].resize(value.
m_ncomp, bcmap[str[0]]);
217 #if AMREX_SPACEDIM==3
218 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
219 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::ZLO].push_back(bcmap[str[i]]);
220 else if (str.size() == 1) value.
m_bc_type[Face::ZLO].resize(value.
m_ncomp, bcmap[str[0]]);
224 #if AMREX_SPACEDIM==3
225 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Exception(
INFO,
"Invalid BC: ", str[i]);
226 if (str.size() == value.
m_ncomp)
for (
unsigned int i = 0; i < value.
m_ncomp; i++) value.
m_bc_type[Face::ZHI].push_back(bcmap[str[i]]);
227 else if (str.size() == 1) value.
m_bc_type[Face::ZHI].resize(value.
m_ncomp, bcmap[str[0]]);
232 std::vector<std::string> val;
237 else if (val.size() == 0) value.
m_bc_val[Face::XLO].resize(value.
m_ncomp, 0.0);
243 else if (val.size() == 0) value.
m_bc_val[Face::XHI].resize(value.
m_ncomp, 0.0);
249 else if (val.size() == 0) value.
m_bc_val[Face::YLO].resize(value.
m_ncomp, 0.0);
255 else if (val.size() == 0) value.
m_bc_val[Face::YHI].resize(value.
m_ncomp, 0.0);
258 #if AMREX_SPACEDIM==3
262 else if (val.size() == 0) value.
m_bc_val[Face::ZLO].resize(value.
m_ncomp, 0.0);
266 #if AMREX_SPACEDIM==3
270 else if (val.size() == 0) value.
m_bc_val[Face::ZHI].resize(value.
m_ncomp, 0.0);