Alamo
Constant.H
Go to the documentation of this file.
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
14namespace IC
15{
16class Constant : public IC<Set::Scalar>, public IC<Set::Vector>
17{
18public:
19 static constexpr const char* name = "constant";
20
21 virtual ~Constant() = default;
22
23 Constant (amrex::Vector<amrex::Geometry> &_geom) :
24 IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom) {}
25 Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp) :
26 IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
27 {pp_queryclass(*this);}
28 Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp, std::string name) :
29 IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
30 {pp_queryclass(name,*this);}
31
32
33 virtual void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar /*time*/) override
34 {
35 Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == (int)a_field[lev]->nComp())));
36 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
37 {
38 const amrex::Box& bx = mfi.growntilebox();
39 amrex::Array4<Set::Scalar> const& field = a_field[lev]->array(mfi);
40 for (int m = 0; m < a_field[lev]->nComp(); m++)
41 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
42 field(i,j,k,m) += m_value.size() == 1 ? m_value[0] : m_value[m];
43 });
44 }
45 }
46
47 virtual void Add(const int &lev, Set::Field<Set::Vector> &a_field, Set::Scalar /*time*/) override
48 {
49 Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == AMREX_SPACEDIM)));
50 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
51 {
52 const amrex::Box& bx = mfi.growntilebox();
53 amrex::Array4<Set::Vector> const& field = a_field[lev]->array(mfi);
54 for (int m = 0; m < a_field[lev]->nComp(); m++)
55 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
56 field(i,j,k)(m) += m_value.size() == 1 ? m_value[0] : m_value[m];
57 });
58 }
59 }
60
61 static void Parse(Constant & value, IO::ParmParse & pp)
62 {
63 // Default: set equal to one everywhere
64 value.m_value.clear();
65 // Array of constant values. The number of values should equal either 1 or N where N is the number of fab components
66 pp_queryarr_required("value",value.m_value);
67 }
68private:
69 std::vector<Set::Scalar> m_value;
70};
71}
72#endif
#define pp_queryarr_required(...)
Definition ParmParse.H:104
#define pp_queryclass(...)
Definition ParmParse.H:107
#define TEST(x)
Definition Util.H:21
#define INFO
Definition Util.H:20
static void Parse(Constant &value, IO::ParmParse &pp)
Definition Constant.H:61
Constant(amrex::Vector< amrex::Geometry > &_geom, IO::ParmParse &pp, std::string name)
Definition Constant.H:28
Constant(amrex::Vector< amrex::Geometry > &_geom)
Definition Constant.H:23
Constant(amrex::Vector< amrex::Geometry > &_geom, IO::ParmParse &pp)
Definition Constant.H:25
virtual void Add(const int &lev, Set::Field< Set::Scalar > &a_field, Set::Scalar) override
Definition Constant.H:33
static constexpr const char * name
Definition Constant.H:19
virtual void Add(const int &lev, Set::Field< Set::Vector > &a_field, Set::Scalar) override
Definition Constant.H:47
std::vector< Set::Scalar > m_value
Definition Constant.H:69
virtual ~Constant()=default
Initialize a spherical inclusion.
Definition BMP.H:19
A collection of data types and symmetry-reduced data structures.
Definition Base.H:18
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:20
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition Util.H:70