8 #ifndef INCLUDE_STRESSTUPLE_H_ 9 #define INCLUDE_STRESSTUPLE_H_ 12 template<std::size_t I=0,
typename ...TStress>
13 inline typename std::enable_if<I ==
sizeof...(TStress),
void>::type
21 const int& i_gridPoint,
23 std::tuple<TStress&...> t)
25 if (
sizeof...(TStress)!=0)
28 template<std::size_t I=0,
StressType stressType,
typename ...BF>
29 inline typename std::enable_if<I <
sizeof...(BF),
void>::type
37 const int& i_gridPoint,
41 if (I == i_stress && stressType ==
Cauchy)
43 assert(rab.squaredNorm()>
epsilon);
44 std::get<I>(t).field[i_gridPoint]= std::get<I>(t).field[i_gridPoint] +
45 std::get<I>(t).method.bondFunction(ra,rb)*fij*rab.transpose()*rab/rab.norm();
47 else if (I == i_stress && stressType ==
Piola)
49 assert(rab.squaredNorm()>
epsilon);
50 std::get<I>(t).field[i_gridPoint]= std::get<I>(t).field[i_gridPoint] +
51 std::get<I>(t).method.bondFunction(rA,rB)*fij*rAB.transpose()*rab/rab.norm();
54 recursiveBuildStress<I+1>(fij,ra,rA,rb,rB,rab,rAB,i_gridPoint,i_stress,t);
58 template<std::size_t I=0,
typename ...TStress>
59 inline typename std::enable_if<I ==
sizeof...(TStress),
void>::type
60 recursiveNullifyStress(std::tuple<TStress&...> t)
63 template<std::size_t I=0,
StressType stressType,
typename ...BF>
64 inline typename std::enable_if<I <
sizeof...(BF),
void>::type
67 std::fill(std::get<I>(t).field.begin(), std::get<I>(t).field.end(),Matrix3d::Zero() );
68 recursiveNullifyStress<I+1>(t);
72 double averagingDomainSize_max(
const std::tuple<> t)
76 template<std::size_t I=0,
typename ...TStress>
77 inline typename std::enable_if<I ==
sizeof...(TStress)-1,
double>::type
78 averagingDomainSize_max(
const std::tuple<TStress&...> t)
80 return std::get<I>(t).method.getAveragingDomainSize();
82 template<std::size_t I=0,
typename ...TStress>
83 inline typename std::enable_if<I <
sizeof...(TStress)-1,
double>::type
84 averagingDomainSize_max(
const std::tuple<TStress&...> t)
86 return std::max(std::get<I>(t).method.getAveragingDomainSize(),averagingDomainSize_max<I+1>(t));
91 std::map<Grid<Reference>*,
double> recursiveGridMaxAveragingDomainSizeMap(
const std::tuple<>& t)
93 std::map<Grid<Reference>*,
double> map;
96 template<std::size_t I=0,
StressType stressType,
97 typename TGrid=
typename std::conditional<stressType == Piola,Grid<Reference>,
Grid<Current>>::type,
99 inline typename std::enable_if<I ==
sizeof...(BF), std::map<TGrid*,double>>::type
102 std::map<TGrid*,double> map;
105 template<std::size_t I=0,
StressType stressType,
106 typename TGrid=
typename std::conditional<stressType == Piola,Grid<Reference>,
Grid<Current>>::type,
108 inline typename std::enable_if<I <
sizeof...(BF), std::map<TGrid*,double>>::type
111 std::map<TGrid*,double> map;
112 const std::map<TGrid*,double>& rmap= recursiveGridMaxAveragingDomainSizeMap<I+1>(t);
113 map[std::get<I>(t).pgrid]= std::get<I>(t).method.getAveragingDomainSize();
116 for (
const auto& pair : rmap)
117 if (std::get<I>(t).pgrid == pair.first)
119 map[pair.first]= std::max(map.at(std::get<I>(t).pgrid),pair.second);
123 auto result= map.insert(pair);
124 assert(result.second==
true);
131 inline std::vector<std::pair<Grid<Reference>*,
double>> getTGridDomainSizePairs(
const std::tuple<> emptyTuple)
133 std::vector<std::pair<Grid<Reference>*,
double>> emptyVectorPair;
134 return emptyVectorPair;
136 template<std::size_t I=0,
StressType stressType,
137 typename TGrid=
typename std::conditional<stressType == Piola,Grid<Reference>,
Grid<Current>>::type,
139 inline typename std::enable_if<I ==
sizeof...(BF)-1, std::vector<std::pair<TGrid*,double>>>::type
142 std::vector<std::pair<TGrid*,double>> vectorPair;
143 vectorPair.push_back({std::get<I>(t).pgrid,std::get<I>(t).method.getAveragingDomainSize()});
146 template<std::size_t I=0,
StressType stressType,
147 typename TGrid=
typename std::conditional<stressType == Piola,Grid<Reference>,
Grid<Current>>::type,
149 inline typename std::enable_if< I <
sizeof...(BF)-1, std::vector<std::pair<TGrid*,double>> >::type
152 std::vector<std::pair<TGrid*,double>> vectorPair;
153 vectorPair.push_back({std::get<I>(t).pgrid,std::get<I>(t).method.getAveragingDomainSize()});
154 std::vector<std::pair<TGrid*,double>> next= getTGridDomainSizePairs<I+1>(t);
155 vectorPair.insert(vectorPair.end(),next.begin(),next.end());
160 std::vector<GridBase*> getBaseGridList(
const std::tuple<> t)
162 std::vector<GridBase*> pgridBaseVector;
163 return pgridBaseVector;
165 template<std::size_t I=0,
typename ...TStress>
166 inline typename std::enable_if<I ==
sizeof...(TStress)-1, std::vector<GridBase*>>::type
167 getBaseGridList(
const std::tuple<TStress&...> t)
169 std::vector<GridBase*> pgridBaseVector;
170 pgridBaseVector.push_back(std::get<I>(t).pgrid);
171 return pgridBaseVector;
173 template<std::size_t I=0,
typename ...TStress>
174 inline typename std::enable_if<I <
sizeof...(TStress)-1, std::vector<GridBase*>>::type
175 getBaseGridList(
const std::tuple<TStress&...> t)
177 std::vector<GridBase*> pgridBaseVector;
179 pgridBaseVector.push_back(std::get<I>(t).pgrid);
180 std::vector<GridBase*> next= getBaseGridList<I+1>(t);
181 pgridBaseVector.insert(pgridBaseVector.end(),next.begin(),next.end());
182 return pgridBaseVector;
187 template<std::size_t I=0,
typename ...TStress>
188 inline typename std::enable_if<I ==
sizeof...(TStress),
void>::type
191 template<std::size_t I=0,
typename ...TStress>
192 inline typename std::enable_if<I <
sizeof...(TStress),
void>::type
193 recursiveFold(
const Vector3d& origin,
196 std::tuple<TStress&...> t)
198 BoxPoints boxPoints(origin,step, std::get<I>(t).pgrid->coordinates);
199 std::cout <<
"Folding grid points in grid: " << std::get<I>(t).pgrid <<
" if necessary...."<<
"\n";
201 std::cout << std::endl;
202 recursiveFold<I+1>(origin,step,pbc,t);
206 template<std::size_t I=0,
typename ...TStress>
207 inline typename std::enable_if<I ==
sizeof...(TStress),
void>::type
208 recursiveWriteStressAndGrid(std::tuple<TStress&...> t)
211 template<std::size_t I=0,
typename ...TStress>
212 inline typename std::enable_if<I <
sizeof...(TStress),
void>::type
213 recursiveWriteStressAndGrid(std::tuple<TStress&...> t)
215 std::cout <<
"Writing stress and grid of " << std::get<I>(t).name << std::endl;
216 std::get<I>(t).write();
217 std::get<I>(t).pgrid->write(std::get<I>(t).name);
218 recursiveWriteStressAndGrid<I+1>(t);
std::enable_if< I==sizeof...(TStress), void >::type recursiveBuildStress(const double &fij, const Vector3d &ra, const Vector3d &rA, const Vector3d &rb, const Vector3d &rB, const Vector3d &rab, const Vector3d &rAB, const int &i_gridPoint, const int &i_stress, std::tuple< TStress &... > t)
void fold(const Vector3i &pbc)
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Eigen::Matrix< int, 1, DIM, Eigen::RowMajor > Vector3i