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:
13  static constexpr const char* name = "voronoi";
14 
16 
17  Voronoi (amrex::Vector<amrex::Geometry> &_geom) : IC(_geom) {}
18  Voronoi (amrex::Vector<amrex::Geometry> &_geom,IO::ParmParse &pp, std::string name) : IC(_geom)
19  {pp_queryclass(name,*this);}
20  Voronoi (amrex::Vector<amrex::Geometry> &_geom, int _number_of_grains, Set::Scalar a_alpha) : IC(_geom)
21  {
22  Define(_number_of_grains,a_alpha);
23  }
24  Voronoi (amrex::Vector<amrex::Geometry> &a_geom, int a_number_of_grains) : IC(a_geom)
25  {
26  Define(a_number_of_grains,1.0);
27  }
28 
29  void Define (int a_number_of_grains, Set::Scalar a_alpha)
30  {
31  Define(a_number_of_grains, std::vector<Set::Scalar>(a_number_of_grains,a_alpha),Type::Partition);
32  }
33 
34  void Define (int a_number_of_grains,
35  std::vector<Set::Scalar> a_alpha,
36  Type a_type = Type::Values)
37  {
38  number_of_grains = a_number_of_grains;
39  alpha = a_alpha;
40  type = a_type;
41 
42  voronoi.resize(number_of_grains);
43  srand(seed);
44  for (int n = 0; n<number_of_grains; n++)
45  {
46  AMREX_D_TERM(voronoi[n](0) = geom[0].ProbLo(0) + (geom[0].ProbHi(0)-geom[0].ProbLo(0))*Util::Random();,
47  voronoi[n](1) = geom[0].ProbLo(1) + (geom[0].ProbHi(1)-geom[0].ProbLo(1))*Util::Random();,
48  voronoi[n](2) = geom[0].ProbLo(2) + (geom[0].ProbHi(2)-geom[0].ProbLo(2))*Util::Random(););
49  }
50  };
51 
52  void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar)
53  {
54  Set::Vector size;
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];)
58 
59  for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
60  {
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) {
66 
67  Set::Vector x;
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];);
71 
72  amrex::Real min_distance = std::numeric_limits<amrex::Real>::infinity();
73  int min_grain_id = -1;
74 
75  for (int n = 0; n<number_of_grains; n++)
76  {
77  Set::Scalar d = (x - voronoi[n]).lpNorm<2>();
78 
79  if (geom[0].isPeriodic(0))
80  {
81  d = std::min(d,
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>()));
84  }
85 #if AMREX_SPACEDIM>1
86  if (geom[0].isPeriodic(1))
87  {
88  d = std::min(d,
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>()));
91  }
92 #endif
93 #if AMREX_SPACEDIM>2
94  if (geom[0].isPeriodic(2))
95  {
96  d = std::min(d,
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>()));
99  }
100 #endif
101  if (d<min_distance)
102  {
103  min_distance = d;
104  min_grain_id = n;
105  }
106  }
107 
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];
110  });
111  }
112  }
113 
114  static void Parse(Voronoi &value, IO::ParmParse &pp)
115  {
116  pp_query("number_of_grains",value.number_of_grains); // Number of grains
117  if (pp.contains("alpha"))
118  {
119  pp_queryarr("alpha",value.alpha); // Value to take in the region [1.0]
120  value.Define(value.number_of_grains,value.alpha);
121  }
122  else
123  {
124  value.Define(value.number_of_grains,1.0);
125  }
126  pp_query("seed",value.seed); // Random seed to use
127  }
128 
129 private:
131  int seed = 1;
132  std::vector<Set::Scalar> alpha;
133  std::vector<Set::Vector> voronoi;
135 };
136 }
137 #endif
IC::Voronoi::seed
int seed
Definition: Voronoi.H:131
IC::IC::geom
amrex::Vector< amrex::Geometry > & geom
Definition: IC.H:54
IC::Voronoi::number_of_grains
int number_of_grains
Definition: Voronoi.H:130
IC::Voronoi::alpha
std::vector< Set::Scalar > alpha
Definition: Voronoi.H:132
IC::Voronoi::voronoi
std::vector< Set::Vector > voronoi
Definition: Voronoi.H:133
IC::Voronoi::Type
Type
Definition: Voronoi.H:15
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:105
IC::Voronoi::Parse
static void Parse(Voronoi &value, IO::ParmParse &pp)
Definition: Voronoi.H:114
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:106
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:20
IC::Voronoi::Values
@ Values
Definition: Voronoi.H:15
IO::ParmParse::contains
bool contains(std::string name)
Definition: ParmParse.H:153
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &_geom)
Definition: Voronoi.H:17
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &a_geom, int a_number_of_grains)
Definition: Voronoi.H:24
IC::Voronoi::Define
void Define(int a_number_of_grains, std::vector< Set::Scalar > a_alpha, Type a_type=Type::Values)
Definition: Voronoi.H:34
IC::Voronoi::Define
void Define(int a_number_of_grains, Set::Scalar a_alpha)
Definition: Voronoi.H:29
IC::Voronoi::Add
void Add(const int &lev, Set::Field< Set::Scalar > &a_field, Set::Scalar)
Definition: Voronoi.H:52
IC::Voronoi::type
Type type
Definition: Voronoi.H:134
Set.H
IC
Definition: BMP.H:18
IC::Voronoi::name
static constexpr const char * name
Definition: Voronoi.H:13
IO::ParmParse
Definition: ParmParse.H:112
IC::Voronoi::Partition
@ Partition
Definition: Voronoi.H:15
IC.H
IC::Voronoi::Voronoi
Voronoi(amrex::Vector< amrex::Geometry > &_geom, IO::ParmParse &pp, std::string name)
Definition: Voronoi.H:18
pp_queryarr
#define pp_queryarr(...)
Definition: ParmParse.H:103