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