Alamo
Voronoi.H
Go to the documentation of this file.
1 #ifndef IC_VORONOI_H_
2 #define IC_VORONOI_H_
3 
4 #include "Set/Set.H"
5 #include "IC/IC.H"
6 #include "IO/ParmParse.H"
7 
8 namespace IC
9 {
10 class Voronoi : public IC
11 {
12 public:
14 
15  Voronoi (amrex::Vector<amrex::Geometry> &_geom) : IC(_geom) {}
16  Voronoi (amrex::Vector<amrex::Geometry> &_geom,IO::ParmParse &pp, std::string name) : IC(_geom)
17  {pp_queryclass(name,*this);}
18  Voronoi (amrex::Vector<amrex::Geometry> &_geom, int _number_of_grains, Set::Scalar a_alpha) : IC(_geom)
19  {
20  Define(_number_of_grains,a_alpha);
21  }
22  Voronoi (amrex::Vector<amrex::Geometry> &a_geom, int a_number_of_grains) : IC(a_geom)
23  {
24  Define(a_number_of_grains,1.0);
25  }
26 
27  void Define (int a_number_of_grains, Set::Scalar a_alpha)
28  {
29  Define(a_number_of_grains, std::vector<Set::Scalar>(a_number_of_grains,a_alpha),Type::Partition);
30  }
31 
32  void Define (int a_number_of_grains,
33  std::vector<Set::Scalar> a_alpha,
34  Type a_type = Type::Values)
35  {
36  number_of_grains = a_number_of_grains;
37  alpha = a_alpha;
38  type = a_type;
39 
40  voronoi.resize(number_of_grains);
41  srand(seed);
42  for (int n = 0; n<number_of_grains; n++)
43  {
44  AMREX_D_TERM(voronoi[n](0) = geom[0].ProbLo(0) + (geom[0].ProbHi(0)-geom[0].ProbLo(0))*Util::Random();,
45  voronoi[n](1) = geom[0].ProbLo(1) + (geom[0].ProbHi(1)-geom[0].ProbLo(1))*Util::Random();,
46  voronoi[n](2) = geom[0].ProbLo(2) + (geom[0].ProbHi(2)-geom[0].ProbLo(2))*Util::Random(););
47  }
48  };
49 
50  void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar)
51  {
52  Set::Vector size;
53  AMREX_D_TERM(size(0) = geom[0].ProbHi()[0] - geom[0].ProbLo()[0];,
54  size(1) = geom[0].ProbHi()[1] - geom[0].ProbLo()[1];,
55  size(2) = geom[0].ProbHi()[2] - geom[0].ProbLo()[2];)
56 
57  for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
58  {
59  amrex::Box bx = mfi.tilebox();
60  bx.grow(a_field[lev]->nGrow());
61  int ncomp = a_field[lev]->nComp();
62  amrex::Array4<Set::Scalar> const& field = a_field[lev]->array(mfi);
63  amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
64 
65  Set::Vector x;
66  AMREX_D_TERM(x(0) = geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) * geom[lev].CellSize()[0];,
67  x(1) = geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) * geom[lev].CellSize()[1];,
68  x(2) = geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) * geom[lev].CellSize()[2];);
69 
70  amrex::Real min_distance = std::numeric_limits<amrex::Real>::infinity();
71  int min_grain_id = -1;
72 
73  for (int n = 0; n<number_of_grains; n++)
74  {
75  Set::Scalar d = (x - voronoi[n]).lpNorm<2>();
76 
77  if (geom[0].isPeriodic(0))
78  {
79  d = std::min(d,
80  std::min( (x-voronoi[n] + size(0)*Set::Vector::Unit(0)).lpNorm<2>(),
81  (x-voronoi[n] - size(0)*Set::Vector::Unit(0)).lpNorm<2>()));
82  }
83 #if AMREX_SPACEDIM>1
84  if (geom[0].isPeriodic(1))
85  {
86  d = std::min(d,
87  std::min( (x-voronoi[n] + size(0)*Set::Vector::Unit(1)).lpNorm<2>(),
88  (x-voronoi[n] - size(0)*Set::Vector::Unit(1)).lpNorm<2>()));
89  }
90 #endif
91 #if AMREX_SPACEDIM>2
92  if (geom[0].isPeriodic(2))
93  {
94  d = std::min(d,
95  std::min( (x-voronoi[n] + size(0)*Set::Vector::Unit(2)).lpNorm<2>(),
96  (x-voronoi[n] - size(0)*Set::Vector::Unit(2)).lpNorm<2>()));
97  }
98 #endif
99  if (d<min_distance)
100  {
101  min_distance = d;
102  min_grain_id = n;
103  }
104  }
105 
106  if (type == Type::Values) field(i,j,k) = alpha[min_grain_id];
107  else if (type == Type::Partition) field(i,j,k,min_grain_id % ncomp) = alpha[min_grain_id];
108  });
109  }
110  }
111 
112  static void Parse(Voronoi &value, IO::ParmParse &pp)
113  {
114  pp_query("number_of_grains",value.number_of_grains); // Number of grains
115  if (pp.contains("alpha"))
116  {
117  pp_queryarr("alpha",value.alpha); // Value to take in the region [1.0]
118  value.Define(value.number_of_grains,value.alpha);
119  }
120  else
121  {
122  value.Define(value.number_of_grains,1.0);
123  }
124  pp_query("seed",value.seed); // Random seed to use
125  }
126 
127 private:
129  int seed = 1;
130  std::vector<Set::Scalar> alpha;
131  std::vector<Set::Vector> voronoi;
133 };
134 }
135 #endif
IC::Voronoi::seed
int seed
Definition: Voronoi.H:129
IC::IC::geom
amrex::Vector< amrex::Geometry > & geom
Definition: IC.H:45
IC::Voronoi::number_of_grains
int number_of_grains
Definition: Voronoi.H:128
IC::Voronoi::alpha
std::vector< Set::Scalar > alpha
Definition: Voronoi.H:130
IC::Voronoi::voronoi
std::vector< Set::Vector > voronoi
Definition: Voronoi.H:131
IC::Voronoi::Type
Type
Definition: Voronoi.H:13
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::Voronoi::Parse
static void Parse(Voronoi &value, IO::ParmParse &pp)
Definition: Voronoi.H:112
Util::Random
Set::Scalar Random()
Definition: Set.cpp:9
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
pp_queryclass
#define pp_queryclass(...)
Definition: ParmParse.H:105
IC::Voronoi
Definition: Voronoi.H:10
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &_geom, int _number_of_grains, Set::Scalar a_alpha)
Definition: Voronoi.H:18
IC::Voronoi::Values
@ Values
Definition: Voronoi.H:13
IO::ParmParse::contains
bool contains(std::string name)
Definition: ParmParse.H:151
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &_geom)
Definition: Voronoi.H:15
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &a_geom, int a_number_of_grains)
Definition: Voronoi.H:22
IC::Voronoi::Define
void Define(int a_number_of_grains, std::vector< Set::Scalar > a_alpha, Type a_type=Type::Values)
Definition: Voronoi.H:32
IC::Voronoi::Define
void Define(int a_number_of_grains, Set::Scalar a_alpha)
Definition: Voronoi.H:27
IC::Voronoi::Add
void Add(const int &lev, Set::Field< Set::Scalar > &a_field, Set::Scalar)
Definition: Voronoi.H:50
IC::Voronoi::type
Type type
Definition: Voronoi.H:132
Set.H
IC
Definition: Affine.H:18
IO::ParmParse
Definition: ParmParse.H:110
IC::Voronoi::Partition
@ Partition
Definition: Voronoi.H:13
IC.H
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &_geom, IO::ParmParse &pp, std::string name)
Definition: Voronoi.H:16
pp_queryarr
#define pp_queryarr(...)
Definition: ParmParse.H:103