26 Ellipse (amrex::Vector<amrex::Geometry> &_geom) :
IC(_geom) {}
33 amrex::IndexType type = a_field[lev]->ixType();
34 int ncomp = a_field[lev]->nComp();
36 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
39 if (type == amrex::IndexType::TheNodeType()) bx = mfi.grownnodaltilebox();
40 if (type == amrex::IndexType::TheCellType()) bx = mfi.growntilebox();
42 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
43 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
47 if (type == amrex::IndexType::TheNodeType())
49 AMREX_D_TERM(x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i)) *
geom[lev].CellSize()[0];,
50 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j)) *
geom[lev].CellSize()[1];,
51 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k)) *
geom[lev].CellSize()[2];);
53 else if (type == amrex::IndexType::TheCellType())
55 AMREX_D_TERM(x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) *
geom[lev].CellSize()[0];,
56 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) *
geom[lev].CellSize()[1];,
57 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) *
geom[lev].CellSize()[2];);
63 field(i,j,k,0) = 0.5 - 0.5*std::erf(((x-
center[0]).transpose() *
A[0] * (x-
center[0]) - 1.0) /
eps[0] / norm);
64 if (
invert) field(i,j,k,0) = 1.0 - field(i,j,k,0);
65 if (ncomp > 1) field(i,j,k,1) = 1.0 - field(i,j,k,0);
74 value += 0.5 - 0.5*std::erf(((x-
center[m]).transpose() *
A[m] * (x-
center[m]) - 1.0) /
eps[m] / norm);
79 field (i,j,k,
invert) = 1.0 - value;
80 field (i,j,k,1-
invert) = value;
83 if (field(i,j,k,1-
invert) < 0.) field(i,j,k,1-
invert) = 0.;
84 if (field(i,j,k,1-
invert) > 1.) field(i,j,k,1-
invert) = 1.;
89 a_field[lev]->FillBoundary();
95 amrex::Vector<Set::Matrix>
A;
96 amrex::Vector<Set::Scalar>
eps;
102 amrex::Vector<Set::Scalar> x0;
103 if(!(pp.
contains(
"number_of_inclusions")))
115 value.
eps.push_back(_eps);
121 value.
A.push_back(_A);
128 for (
int d = 0; d < AMREX_SPACEDIM; d++) _A(d,d) = 1./a(d)/a(d);
129 value.
A.push_back(_A);
149 for (
int i = 0; i < x0.size(); i+= AMREX_SPACEDIM)
154 amrex::Vector<Set::Scalar> _A;
156 if(_A.size() != value.
number_of_inclusions*AMREX_SPACEDIM*AMREX_SPACEDIM && _A.size() != AMREX_SPACEDIM*AMREX_SPACEDIM)
158 if(_A.size() == AMREX_SPACEDIM*AMREX_SPACEDIM)
163 value.
A.push_back(_A1);
170 AMREX_D_PICK( _A1(0,0) = _A[i];
172 _A1(0,0) = _A[i]; _A1(0,1) = _A[i+1];
173 _A1(1,0) = _A[i+2]; _A1(1,1) = _A[i+3];
175 _A1(0,0) = _A[i+0]; _A1(0,1) = _A[i+1]; _A1(0,2) = _A[i+2];
176 _A1(1,0) = _A[i+3]; _A1(1,1) = _A[i+4]; _A1(1,2) = _A[i+5];
177 _A1(2,0) = _A[i+6]; _A1(2,1) = _A[i+7]; _A1(2,2) = _A[i+8];
179 value.
A.push_back(_A1);
185 amrex::Vector<Set::Scalar> _r;
189 Util::Abort(
INFO,
"Invalid value of radius for ellipse initialization");
190 if(_r.size() == AMREX_SPACEDIM)
193 for (
int i = 0; i< AMREX_SPACEDIM; i++) _A1(i,i) = 1.0/(_r[i]*_r[i]);
195 value.
A.push_back(_A1);
202 for (
int d = 0; d < AMREX_SPACEDIM; d++) _A1(d,d) = 1.0/_r[i+d]/_r[i+d];
203 value.
A.push_back(_A1);
208 amrex::Vector<Set::Scalar> _eps;
211 Util::Abort(
INFO,
"Incorrect eps. Check the number of values specified");
213 if (_eps.size() == 1)