13 static constexpr
const char*
name =
"voronoi";
17 Voronoi (amrex::Vector<amrex::Geometry> &_geom) :
IC(_geom) {}
22 Define(_number_of_grains,a_alpha);
24 Voronoi (amrex::Vector<amrex::Geometry> &a_geom,
int a_number_of_grains) :
IC(a_geom)
26 Define(a_number_of_grains,1.0);
31 Define(a_number_of_grains, std::vector<Set::Scalar>(a_number_of_grains,a_alpha),Type::Partition);
35 std::vector<Set::Scalar> a_alpha,
36 Type a_type = Type::Values)
55 AMREX_D_TERM(size(0) =
geom[0].ProbHi()[0] -
geom[0].ProbLo()[0];,
56 size(1) =
geom[0].ProbHi()[1] -
geom[0].ProbLo()[1];,
57 size(2) =
geom[0].ProbHi()[2] -
geom[0].ProbLo()[2];)
59 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
61 amrex::Box bx = mfi.tilebox();
62 bx.grow(a_field[lev]->nGrow());
63 int ncomp = a_field[lev]->nComp();
64 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
65 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
68 AMREX_D_TERM(x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) *
geom[lev].CellSize()[0];,
69 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) *
geom[lev].CellSize()[1];,
70 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) *
geom[lev].CellSize()[2];);
72 amrex::Real min_distance = std::numeric_limits<amrex::Real>::infinity();
73 int min_grain_id = -1;
79 if (
geom[0].isPeriodic(0))
82 std::min( (x-
voronoi[n] + size(0)*Set::Vector::Unit(0)).lpNorm<2>(),
83 (x-
voronoi[n] - size(0)*Set::Vector::Unit(0)).lpNorm<2>()));
86 if (
geom[0].isPeriodic(1))
89 std::min( (x-
voronoi[n] + size(0)*Set::Vector::Unit(1)).lpNorm<2>(),
90 (x-
voronoi[n] - size(0)*Set::Vector::Unit(1)).lpNorm<2>()));
94 if (
geom[0].isPeriodic(2))
97 std::min( (x-
voronoi[n] + size(0)*Set::Vector::Unit(2)).lpNorm<2>(),
98 (x-
voronoi[n] - size(0)*Set::Vector::Unit(2)).lpNorm<2>()));
108 if (
type == Type::Values) field(i,j,k) =
alpha[min_grain_id];
109 else if (
type == Type::Partition) field(i,j,k,min_grain_id % ncomp) =
alpha[min_grain_id];