4 #ifndef BC_EXPRESSION_H_
5 #define BC_EXPRESSION_H_
7 #include <AMReX_ParallelDescriptor.H>
8 #include <AMReX_ParmParse.H>
9 #include <AMReX_BCRec.H>
10 #include <AMReX_PhysBCFunct.H>
11 #include <AMReX_Array.H>
12 #include <AMReX_Parser.H>
21 :
public BC<Set::Scalar>
24 static constexpr
const char*
name =
"expression";
28 static const constexpr
char *
const facestr[] = {
29 "xlo",
"ylo",
"xhi",
"yhi"
31 #elif AMREX_SPACEDIM==3
32 static const constexpr
char *
const facestr[] = {
33 "xlo",
"ylo",
"zlo",
"xhi",
"yhi",
"zhi",
42 #elif AMREX_SPACEDIM==3
44 XLO, YLO, ZLO, XHI, YHI, ZHI,
59 virtual void FillBoundary(amrex::BaseFab<Set::Scalar>& in,
const amrex::Box& box,
60 int ngrow,
int dcomp,
int ncomp, amrex::Real time,
62 const amrex::Mask* mask =
nullptr)
override;
67 virtual amrex::Array<int, AMREX_SPACEDIM>
IsPeriodic()
override;
68 virtual amrex::Periodicity
Periodicity()
const override;
69 virtual amrex::Periodicity
Periodicity(
const amrex::Box& b)
override;
74 const amrex::Array<amrex::Array<T, AMREX_SPACEDIM>, 2>
GetBCTypes()
83 static const int m_nfaces = 4;
84 #elif AMREX_SPACEDIM==3
85 static const int m_nfaces = 6;
92 std::array<std::vector<amrex::ParserExecutor<4>>, m_nfaces>
m_bc_func;
99 std::map<std::string, int> bcmap;
100 bcmap[
"BOGUS_BC"] = amrex::BCType::mathematicalBndryTypes::bogus;
101 bcmap[
"INT_DIR"] = amrex::BCType::mathematicalBndryTypes::int_dir;
102 bcmap[
"REFLECT_ODD"] = amrex::BCType::mathematicalBndryTypes::reflect_odd;
103 bcmap[
"INT_DIR"] = amrex::BCType::mathematicalBndryTypes::int_dir;
104 bcmap[
"REFLECT_EVEN"] = amrex::BCType::mathematicalBndryTypes::reflect_even;
105 bcmap[
"FOEXTRAP"] = amrex::BCType::mathematicalBndryTypes::foextrap;
106 bcmap[
"EXT_DIR"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
107 bcmap[
"HOEXTRAP"] = amrex::BCType::mathematicalBndryTypes::hoextrap;
108 bcmap[
"Interior"] = amrex::BCType::mathematicalBndryTypes::int_dir;
109 bcmap[
"Inflow"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
110 bcmap[
"Outflow"] = amrex::BCType::mathematicalBndryTypes::foextrap;
111 bcmap[
"Symmetry"] = amrex::BCType::mathematicalBndryTypes::reflect_even;
112 bcmap[
"SlipWall"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
113 bcmap[
"NoSlipWall"] = amrex::BCType::mathematicalBndryTypes::ext_dir;
115 bcmap[
"interior"] = (int)amrex::LinOpBCType::interior;
116 bcmap[
"Dirichlet"] = (int)amrex::LinOpBCType::Dirichlet;
117 bcmap[
"dirichlet"] = (int)amrex::LinOpBCType::Dirichlet;
118 bcmap[
"Neumann"] = (int)amrex::LinOpBCType::Neumann;
119 bcmap[
"NEUMANN"] = (int)amrex::LinOpBCType::Neumann;
120 bcmap[
"neumann"] = (int)amrex::LinOpBCType::Neumann;
121 bcmap[
"reflect_odd"] = (int)amrex::LinOpBCType::reflect_odd;
122 bcmap[
"Marshak"] = (int)amrex::LinOpBCType::Marshak;
123 bcmap[
"SanchezPomraning"] = (int)amrex::LinOpBCType::SanchezPomraning;
124 bcmap[
"inflow"] = (int)amrex::LinOpBCType::inflow;
125 bcmap[
"Periodic"] = (int)amrex::LinOpBCType::Periodic;
126 bcmap[
"periodic"] = (int)amrex::LinOpBCType::Periodic;
132 std::vector<std::string> str;
134 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
135 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]]);
136 else if (str.size() == 1) value.
m_bc_type[Face::XLO].resize(value.
m_ncomp, bcmap[str[0]]);
139 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
140 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]]);
141 else if (str.size() == 1) value.
m_bc_type[Face::XHI].resize(value.
m_ncomp, bcmap[str[0]]);
144 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
145 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]]);
146 else if (str.size() == 1) value.
m_bc_type[Face::YLO].resize(value.
m_ncomp, bcmap[str[0]]);
149 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
150 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]]);
151 else if (str.size() == 1) value.
m_bc_type[Face::YHI].resize(value.
m_ncomp, bcmap[str[0]]);
154 #if AMREX_SPACEDIM==3
155 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
156 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]]);
157 else if (str.size() == 1) value.
m_bc_type[Face::ZLO].resize(value.
m_ncomp, bcmap[str[0]]);
161 #if AMREX_SPACEDIM==3
162 for (
unsigned int i = 0; i < str.size(); i++)
if (!bcmap.count(str[i]))
Util::Abort(
INFO,
"Invalid BC: ", str[i]);
163 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]]);
164 else if (str.size() == 1) value.
m_bc_type[Face::ZHI].resize(value.
m_ncomp, bcmap[str[0]]);
169 std::vector<std::string> val;
170 for (
int face = 0; face != Face::INT; face++)
172 std::string querystr = std::string(
"val.") + std::string(facestr[face]);
174 else val.resize(value.
m_ncomp,
"0.0");
175 if (val.size() != value.
m_ncomp)
Util::Abort(
INFO,
"Incorrect number of expressions specified for ",querystr,
": expected 1 or ",value.
m_ncomp,
" but received ",val.size());
179 for (
unsigned int i = 0 ; i < value.
m_ncomp; i++)
187 #if AMREX_SPACEDIM==2
190 std::vector<std::string> ignore_in_2d = {
192 "zhixlo",
"zloxlo",
"zhixhi",
"zloxhi",
"ylozlo",
"ylozhi",
"yhizlo",
"yhizhi",
193 "xloylozlo",
"xloylozhi",
"xloyhizlo",
"xloyhizhi",
"xhiylozlo",
"xhiylozhi",
"xhiyhizlo",
"xhiyhizhi"};
194 for (
unsigned int n = 0; n < ignore_in_2d.size(); n++)
196 std::string querystr = std::string(
"val.") + ignore_in_2d[n];
198 querystr = std::string(
"type.") + ignore_in_2d[n];