Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
UniformPeriodicGrid.cpp
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MODEL is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_UniformPeriodicGrid_cpp_
9#define model_UniformPeriodicGrid_cpp_
10
11#include <UniformPeriodicGrid.h>
12#include <CTM.h>
13
14
15namespace model
16{
17
18 template <int dim>
19 UniformPeriodicGrid<dim>::UniformPeriodicGrid(const ArrayDimI& gridSize_in,const ArrayDimD& gridSpacing_in) :
20 /* init */ gridSize(gridSize_in)
21 /* init */,gridSpacing(gridSpacing_in)
22 {
23
24 }
25
26 template <int dim>
27 std::array<typename UniformPeriodicGrid<dim>::ArrayDimI,CTM::pow(2,dim)> UniformPeriodicGrid<dim>::cornerIdx(const std::pair<ArrayDimI,ArrayDimI>& idx)
28 {
29 std::array<ArrayDimI,CTM::pow(2,dim)> temp;
30 for(int p=0;p<std::pow(2,dim);++p)
31 {
32 for(int i=0;i<dim;++i)
33 {
34 const bool isSecond((p%CTM::pow(2,dim-i))/CTM::pow(2,dim-1-i));
35 temp[p](i)= (isSecond? idx.second(i) : idx.first(i));
36 }
37 }
38 return temp;
39 }
40
41 template <int dim>
42 std::array<typename UniformPeriodicGrid<dim>::ArrayDimI,CTM::pow(2,dim)> UniformPeriodicGrid<dim>::posToCornerIdx(const ArrayDimD& localPos) const
43 {
44 return cornerIdx(posToIdx(localPos));
45 }
46
47 template <int dim>
48 std::array<typename UniformPeriodicGrid<dim>::ArrayDimI,CTM::pow(2,dim)> UniformPeriodicGrid<dim>::posToPeriodicCornerIdx(const ArrayDimD& localPos) const
49 {
50 return cornerIdx(posToPeriodicIdx(localPos));
51 }
52
53 template <int dim>
55 {
56 return idx.template cast<double>()*gridSpacing;
57 }
58
59 template <int dim>
60 std::array<double,CTM::pow(2,dim)> UniformPeriodicGrid<dim>::posToWeights(const ArrayDimD& localPos) const
61 {
62 const auto cidx(posToCornerIdx(localPos));
63 const double vol(gridSpacing.prod());
64 std::array<double,CTM::pow(2,dim)> temp;
65 for(int p=0;p<CTM::pow(2,dim);++p)
66 {
67 temp[p]=(gridSpacing-(idxToPos(cidx[p])-localPos).abs()).prod()/vol;
68 }
69 return temp;
70 }
71
72 template <int dim>
73 std::pair<std::array<typename UniformPeriodicGrid<dim>::ArrayDimI,CTM::pow(2,dim)>,std::array<double,CTM::pow(2,dim)>> UniformPeriodicGrid<dim>::posToPeriodicCornerIdxAndWeights(const ArrayDimD& localPos) const
74 {
75 return std::make_pair(cornerIdx(posToPeriodicIdx(localPos)),posToWeights(localPos));
76 }
77
78 template <int dim>
79 std::pair<typename UniformPeriodicGrid<dim>::ArrayDimI,typename UniformPeriodicGrid<dim>::ArrayDimI> UniformPeriodicGrid<dim>::posToIdx(const ArrayDimD& localPos) const
80 {
93 const ArrayDimI highIndex((localPos/gridSpacing).ceil().template cast<int>());
94 return std::make_pair(highIndex-1,highIndex);
95 }
96
97 template <int dim>
98 std::pair<typename UniformPeriodicGrid<dim>::ArrayDimI,typename UniformPeriodicGrid<dim>::ArrayDimI> UniformPeriodicGrid<dim>::posToPeriodicIdx(const ArrayDimD& localPos) const
99 {
102 return idxToPeriodicIdx(posToIdx(localPos));
103 }
104
105 template <int dim>
107 {
110 const ArrayDimD gd(gi.template cast<double>());
111 return gi-(gd/gridSize.template cast<double>()).floor().template cast<int>()*gridSize;
112 }
113
114 template <int dim>
115 std::pair<typename UniformPeriodicGrid<dim>::ArrayDimI,typename UniformPeriodicGrid<dim>::ArrayDimI> UniformPeriodicGrid<dim>::idxToPeriodicIdx(const std::pair<ArrayDimI,ArrayDimI>& idx) const
116 {
119 return std::make_pair(idxToPeriodicIdx(idx.first),idxToPeriodicIdx(idx.second));
120 }
121
122 template struct UniformPeriodicGrid<1>;
123 template struct UniformPeriodicGrid<2>;
124 template struct UniformPeriodicGrid<3>;
125}
126#endif
static constexpr int pow(int x, int n)
A compile-time implementation of the power function.
Definition CTM.h:40
ArrayDimI idxToPeriodicIdx(const ArrayDimI &gi) const
static std::array< ArrayDimI, CTM::pow(2, dim)> cornerIdx(const std::pair< ArrayDimI, ArrayDimI > &idx)
Eigen::Array< double, dim, 1 > ArrayDimD
Eigen::Array< int,dim, 1 > ArrayDimI
std::pair< ArrayDimI, ArrayDimI > posToIdx(const ArrayDimD &localPos) const
ArrayDimD idxToPos(const ArrayDimI &idx) const
UniformPeriodicGrid(const ArrayDimI &gridSize_in, const ArrayDimD &gridSpacing_in)
std::pair< ArrayDimI, ArrayDimI > posToPeriodicIdx(const ArrayDimD &localPos) const
std::pair< std::array< ArrayDimI, CTM::pow(2, dim)>, std::array< double, CTM::pow(2, dim)> > posToPeriodicCornerIdxAndWeights(const ArrayDimD &localPos) const
std::array< double, CTM::pow(2, dim)> posToWeights(const ArrayDimD &localPos) const
std::array< ArrayDimI, CTM::pow(2, dim)> posToPeriodicCornerIdx(const ArrayDimD &localPos) const
std::array< ArrayDimI, CTM::pow(2, dim)> posToCornerIdx(const ArrayDimD &localPos) const
vertex p[3]
int i
vertex temp