Alamo
Ellipsoid.H
Go to the documentation of this file.
1 // This IC initializes a single-component fab using the formula
2 //
3 // .. math::
4 //
5 // \phi = \begin{cases}
6 // \alpha_{in} & (\mathbf{x}-\mathbf{x}_0)^T\mathbf{A}(\mathbf{x}-\mathbf{x}_0) \le r \\
7 // \alpha_{out} & \text{else}
8 // \end{cases}
9 //
10 // The boundary can be mollified using an error function with parameter :math:`\varepsilon`
11 //
12 // .. WARNING::
13 //
14 // This IC is redundant with :ref:`IC::Ellipse` and :ref:`IC::Expression` and will probably be consolidated
15 //
16 
17 #ifndef IC_ELLIPSOID_H_
18 #define IC_ELLIPSOID_H_
19 
20 #include "IC/IC.H"
21 #include "Util/Util.H"
22 #include "IO/ParmParse.H"
23 
24 /// \class Ellipsoid
25 /// \brief Initialize an ellipsoidal inclusion
26 namespace IC
27 {
28 class Ellipsoid : public IC
29 {
30 public:
32 
33  Ellipsoid (amrex::Vector<amrex::Geometry> &_geom) : IC(_geom) {}
34 
35  void Add(const int &lev,Set::Field<Set::Scalar> &a_field, Set::Scalar)
36  {
37  for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
38  {
39  amrex::Box bx = mfi.tilebox();
40  bx.grow(a_field[lev]->nGrow());
41  amrex::IndexType type = a_field[lev]->ixType();
42 
43  amrex::Array4<Set::Scalar> const& field = a_field[lev]->array(mfi);
44  amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
45 
46  Set::Vector x = Set::Position(i,j,k,geom[lev],type);
47 
48  Set::Scalar min_value = field(i,j,k);
49  for (int i=0 ; i < center.size(); i++)
50  {
51  Set::Scalar value = 0.;
52  Set::Scalar norm = (A[i]*(x-center[i])).lpNorm<2>();
53  value = 0.5 + 0.5*std::erf(((x-center[i]).transpose() * A[i] * (x-center[i]) - 1.0) / eps[i] / norm);
54  value = in_value + value*(out_value - in_value);
55  min_value = value < min_value ? value : min_value;
56  }
57  field(i,j,k) = min_value;
58  if (field(i,j,k) < std::min(in_value,out_value)) field(i,j,k) = std::min(in_value,out_value);
59  if (field(i,j,k) > std::max(in_value,out_value)) field(i,j,k) = std::max(in_value,out_value);
60  });
61  }
62  a_field[lev]->FillBoundary();
63  };
64 
65 private:
67  amrex::Vector<Set::Vector> center;
68  amrex::Vector<Set::Scalar> eps;
69  amrex::Vector<Set::Matrix> A;
70  Mollifier moll = Mollifier::Dirac;
71 
72 public:
73  static void Parse(Ellipsoid & value, IO::ParmParse & pp)
74  {
75  amrex::Vector<Set::Scalar> center;
76  if(pp.contains("center")) pp_queryarr("center",center); // Center of the ellipse :math:`\mathbf{x}_0`
77 
78  if(center.size() < AMREX_SPACEDIM) value.center.push_back(Set::Vector::Zero());
79  else
80  {
81  for (int i = 0; i<center.size(); i+=AMREX_SPACEDIM)
82  value.center.push_back(Set::Vector(AMREX_D_DECL(center[i],center[i+1],center[i+2])));
83  }
84 
85  amrex::Vector<Set::Scalar> A;
86  if (pp.contains("A"))
87  {
88  pp_queryarr("A", A); // Matrix defining elipse radii and orientation
89  if(A.size() < AMREX_SPACEDIM*AMREX_SPACEDIM) value.A.push_back(Set::Matrix::Identity());
90  else
91  {
92  int i=0, j=0;
93  Set::Matrix temp = Set::Matrix::Zero();
94  for (i=0; i<A.size(); i+=AMREX_SPACEDIM)
95  {
96  for (j=0; j<AMREX_SPACEDIM; j++)
97  temp(i,j) = A[i+j];
98 
99  if((i+j) % (AMREX_SPACEDIM*AMREX_SPACEDIM) == 0)
100  {
101  value.A.push_back(temp);
102  temp = Set::Matrix::Zero();
103  }
104  }
105  }
106  }
107  if (pp.contains("radius"))
108  {
109  amrex::Vector<Set::Scalar> a_radius;
110  pp_queryarr("radius",a_radius); // "Vector of radii (use instead of A)"
111 
112  if (a_radius.size() < AMREX_SPACEDIM) value.A.push_back(Set::Matrix::Identity());
113  else
114  {
115  for (int i = 0; i<a_radius.size(); i+=AMREX_SPACEDIM)
116  {
117  Set::Matrix temp = Set::Matrix::Zero();
118  AMREX_D_TERM( temp(0,0) = 1./(a_radius[i]*a_radius[i]) ;, temp(1,1) = 1./(a_radius[i+1]*a_radius[i+1]) ;, temp(2,2) = 1./(a_radius[i+2]*a_radius[i+2]) ; );
119  value.A.push_back(temp);
120  }
121  }
122  }
123 
124  amrex::Vector<Set::Scalar> eps;
125  pp_queryarr("eps", eps); // Mollifying value for erf
126 
127  if(eps.size() < 1) value.eps.push_back(1.e-5);
128  for (int i =0; i < value.A.size(); i++)
129  {
130  if (eps[i] <= 0.0) eps[i] = 1.e-5;
131  value.eps.push_back(eps[i]);
132  }
133  //if(value.eps <= 0.) value.eps = 1.e-5;
134 
135  pp_query_default("in_value", value.in_value, 0.0); // Value of field inside ellipse
136  pp_query_default("out_value", value.out_value, 1.0); // Value of field outside ellipse
137 
138  std::string mollifier;
139  pp_query("mollifier",mollifier); // Type of mollifier to use (options: dirac, [gaussian])
140  if(mollifier == "Dirac" || mollifier == "dirac")
141  value.moll = Mollifier::Dirac;
142  else
143  value.moll = Mollifier::Gaussian;
144  }
145 };
146 }
147 #endif
IC::Ellipsoid::in_value
Set::Scalar in_value
Definition: Ellipsoid.H:66
IC::Ellipsoid::eps
amrex::Vector< Set::Scalar > eps
Definition: Ellipsoid.H:68
IC::IC::geom
amrex::Vector< amrex::Geometry > & geom
Definition: IC.H:45
Set::Position
AMREX_FORCE_INLINE Vector Position(const int &i, const int &j, const int &k, const amrex::Geometry &geom, const amrex::IndexType &ixType)
Definition: Base.H:121
BC::AMREX_D_DECL
@ AMREX_D_DECL
Definition: BC.H:34
Util.H
IC::Ellipsoid::A
amrex::Vector< Set::Matrix > A
Definition: Ellipsoid.H:69
IC::Ellipsoid::Dirac
@ Dirac
Definition: Ellipsoid.H:31
Set::Field< Set::Scalar >
Definition: Set.H:236
Set::Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition: Base.H:20
ParmParse.H
pp_query
#define pp_query(...)
Definition: ParmParse.H:104
IC::Ellipsoid::Parse
static void Parse(Ellipsoid &value, IO::ParmParse &pp)
Definition: Ellipsoid.H:73
IC::Ellipsoid::Mollifier
Mollifier
Definition: Ellipsoid.H:31
Util::Gaussian
Set::Scalar Gaussian(amrex::Real mean, amrex::Real std_deviation)
Definition: Set.cpp:13
IC::Ellipsoid::Add
void Add(const int &lev, Set::Field< Set::Scalar > &a_field, Set::Scalar)
Definition: Ellipsoid.H:35
IC::Ellipsoid::Gaussian
@ Gaussian
Definition: Ellipsoid.H:31
IC::Ellipsoid
Definition: Ellipsoid.H:28
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
Set::Matrix
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition: Base.H:23
IC::Ellipsoid::moll
Mollifier moll
Definition: Ellipsoid.H:70
IO::ParmParse::contains
bool contains(std::string name)
Definition: ParmParse.H:151
pp_query_default
#define pp_query_default(...)
Definition: ParmParse.H:100
IC
Definition: Affine.H:18
IO::ParmParse
Definition: ParmParse.H:110
IC::Ellipsoid::center
amrex::Vector< Set::Vector > center
Definition: Ellipsoid.H:67
IC::Ellipsoid::Ellipsoid
Ellipsoid(amrex::Vector< amrex::Geometry > &_geom)
Definition: Ellipsoid.H:33
IC.H
IC::Ellipsoid::out_value
Set::Scalar out_value
Definition: Ellipsoid.H:66
pp_queryarr
#define pp_queryarr(...)
Definition: ParmParse.H:103