Line data Source code
1 : //
2 : // Basic IC that just sets the entire field to a constant value.
3 : // Works with a single or multiple-component field.
4 : //
5 :
6 : #ifndef IC_CONSTANT_H_
7 : #define IC_CONSTANT_H_
8 :
9 : #include "AMReX_Config.H"
10 : #include "IC/IC.H"
11 : #include "IO/ParmParse.H"
12 : #include "Util/Util.H"
13 : #include "Unit/Unit.H"
14 :
15 : namespace IC
16 : {
17 : class Constant : public IC<Set::Scalar>, public IC<Set::Vector>
18 : {
19 : public:
20 : static constexpr const char* name = "constant";
21 :
22 94 : virtual ~Constant() = default;
23 :
24 : Constant (amrex::Vector<amrex::Geometry> &_geom) :
25 : IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom) {}
26 : Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp) :
27 : IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
28 : {pp_queryclass(*this);}
29 45 : Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp, std::string name) :
30 45 : IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
31 45 : {pp_queryclass(name,*this);}
32 2 : Constant (amrex::Vector<amrex::Geometry> &_geom, Unit a_unit, IO::ParmParse &pp, std::string name) :
33 2 : IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom), unit(a_unit)
34 2 : {pp_queryclass(name,*this);}
35 :
36 :
37 3589 : virtual void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar /*time*/) override
38 : {
39 25123 : Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == (int)a_field[lev]->nComp())));
40 7322 : for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
41 : {
42 3733 : const amrex::Box& bx = mfi.growntilebox();
43 3733 : amrex::Array4<Set::Scalar> const& field = a_field[lev]->array(mfi);
44 7483 : for (int m = 0; m < a_field[lev]->nComp(); m++)
45 3750 : amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
46 10861416 : field(i,j,k,m) += m_value.size() == 1 ? m_value[0] : m_value[m];
47 10861416 : });
48 3589 : }
49 3589 : }
50 :
51 0 : virtual void Add(const int &lev, Set::Field<Set::Vector> &a_field, Set::Scalar /*time*/) override
52 : {
53 0 : Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == AMREX_SPACEDIM)));
54 0 : for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
55 : {
56 0 : const amrex::Box& bx = mfi.growntilebox();
57 0 : amrex::Array4<Set::Vector> const& field = a_field[lev]->array(mfi);
58 0 : for (int m = 0; m < a_field[lev]->nComp(); m++)
59 0 : amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
60 0 : field(i,j,k)(m) += m_value.size() == 1 ? m_value[0] : m_value[m];
61 0 : });
62 0 : }
63 0 : }
64 :
65 47 : static void Parse(Constant & value, IO::ParmParse & pp)
66 : {
67 : // Default: set equal to one everywhere
68 47 : value.m_value.clear();
69 :
70 : // Value (or values if multicomponent) to set field to
71 94 : pp.queryarr_required("value", value.m_value, value.unit);
72 47 : }
73 : private:
74 : std::vector<Set::Scalar> m_value;
75 : Unit unit;
76 : };
77 : }
78 : #endif
|