MDStressLab++
Loading...
Searching...
No Matches
StressTuple.h
Go to the documentation of this file.
1/*
2 * StressTuple.h
3 *
4 * Created on: Dec 15, 2019
5 * Author: Nikhil
6 */
7
8#ifndef INCLUDE_STRESSTUPLE_H_
9#define INCLUDE_STRESSTUPLE_H_
10
11// Recursively build stress of a type sType= Piola/Cauchy
12template<std::size_t I=0, typename ...TStress>
13inline typename std::enable_if<I == sizeof...(TStress), void>::type
14 recursiveBuildStress(const double& fij,
15 const Vector3d& ra,
16 const Vector3d& rA,
17 const Vector3d& rb,
18 const Vector3d& rB,
19 const Vector3d& rab,
20 const Vector3d& rAB,
21 const int& i_gridPoint,
22 const int& i_stress,
23 std::tuple<TStress&...> t)
24{
25 if (sizeof...(TStress)!=0)
26 assert(0);
27}
28template<std::size_t I=0, StressType stressType, typename ...BF>
29inline typename std::enable_if<I < sizeof...(BF), void>::type
30 recursiveBuildStress(const double& fij,
31 const Vector3d& ra,
32 const Vector3d& rA,
33 const Vector3d& rb,
34 const Vector3d& rB,
35 const Vector3d& rab,
36 const Vector3d& rAB,
37 const int& i_gridPoint,
38 const int& i_stress,
39 std::tuple<Stress<BF,stressType>&...> t)
40{
41 if (I == i_stress && stressType == Cauchy)
42 {
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();
46 }
47 else if (I == i_stress && stressType == Piola)
48 {
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();
52 }
53 else
54 recursiveBuildStress<I+1>(fij,ra,rA,rb,rB,rab,rAB,i_gridPoint,i_stress,t);
55}
56
57// Recursively build the kinetic part of a Cauchy stress field.
58template<std::size_t I=0, typename ...TStress>
59inline typename std::enable_if<I == sizeof...(TStress), void>::type
60recursiveBuildContinuumFields(const double& mass,
61 const Vector3d& velocity,
62 const Vector3d& position,
63 const int& i_gridPoint,
64 const int& i_stress,
65 std::tuple<TStress&...> t)
66{
67 if (sizeof...(TStress)!=0)
68 assert(0);
69}
70template<std::size_t I=0, typename ...BF>
71inline typename std::enable_if<I < sizeof...(BF), void>::type
72recursiveBuildContinuumFields(const double& mass,
73 const Vector3d& velocity,
74 const Vector3d& position,
75 const int& i_gridPoint,
76 const int& i_stress,
77 std::tuple<Stress<BF,Cauchy>&...> t)
78{
79 if (I == i_stress)
80 {
81 auto& stress= std::get<I>(t);
82 if (position.norm() >= stress.method.getAveragingDomainSize())
83 return;
84 double weight= stress.method(position);
85 stress.massDensityField[i_gridPoint]+= mass*weight;
86 stress.momentumDensityField[i_gridPoint]+= mass*weight*velocity;
87 }
88 else
89 recursiveBuildContinuumFields<I+1>(mass,velocity,position,i_gridPoint,i_stress,t);
90}
91
92template<std::size_t I=0, typename ...TStress>
93inline typename std::enable_if<I == sizeof...(TStress), void>::type
94recursiveFinalizeContinuumVelocity(const int& i_gridPoint,
95 const int& i_stress,
96 std::tuple<TStress&...> t)
97{
98 if (sizeof...(TStress)!=0)
99 assert(0);
100}
101template<std::size_t I=0, typename ...BF>
102inline typename std::enable_if<I < sizeof...(BF), void>::type
103recursiveFinalizeContinuumVelocity(const int& i_gridPoint,
104 const int& i_stress,
105 std::tuple<Stress<BF,Cauchy>&...> t)
106{
107 if (I == i_stress)
108 {
109 auto& stress= std::get<I>(t);
110 if (stress.massDensityField[i_gridPoint] > epsilon)
111 stress.velocityField[i_gridPoint]= stress.momentumDensityField[i_gridPoint]/stress.massDensityField[i_gridPoint];
112 else
113 stress.velocityField[i_gridPoint]= Vector3d::Zero();
114 }
115 else
116 recursiveFinalizeContinuumVelocity<I+1>(i_gridPoint,i_stress,t);
117}
118
119template<std::size_t I=0, typename ...TStress>
120inline typename std::enable_if<I == sizeof...(TStress), Vector3d>::type
121recursiveGetContinuumVelocity(const int& i_gridPoint,
122 const int& i_stress,
123 std::tuple<TStress&...> t)
124{
125 if (sizeof...(TStress)!=0)
126 assert(0);
127 return Vector3d::Zero();
128}
129template<std::size_t I=0, typename ...BF>
130inline typename std::enable_if<I < sizeof...(BF), Vector3d>::type
131recursiveGetContinuumVelocity(const int& i_gridPoint,
132 const int& i_stress,
133 std::tuple<Stress<BF,Cauchy>&...> t)
134{
135 if (I == i_stress)
136 return std::get<I>(t).velocityField[i_gridPoint];
137 return recursiveGetContinuumVelocity<I+1>(i_gridPoint,i_stress,t);
138}
139
140template<std::size_t I=0, typename ...TStress>
141inline typename std::enable_if<I == sizeof...(TStress), void>::type
142recursiveBuildKineticStress(const double& mass,
143 const Vector3d& velocity,
144 const Vector3d& position,
145 const int& i_gridPoint,
146 const int& i_stress,
147 std::tuple<TStress&...> t)
148{
149 if (sizeof...(TStress)!=0)
150 assert(0);
151}
152template<std::size_t I=0, typename ...BF>
153inline typename std::enable_if<I < sizeof...(BF), void>::type
154recursiveBuildKineticStress(const double& mass,
155 const Vector3d& velocity,
156 const Vector3d& position,
157 const int& i_gridPoint,
158 const int& i_stress,
159 std::tuple<Stress<BF,Cauchy>&...> t)
160{
161 if (I == i_stress)
162 {
163 auto& stress= std::get<I>(t);
164 if (position.norm() >= stress.method.getAveragingDomainSize())
165 return;
166 stress.field[i_gridPoint]= stress.field[i_gridPoint] -
168 stress.method(position)*mass*velocity.transpose()*velocity;
169 }
170 else
171 recursiveBuildKineticStress<I+1>(mass,velocity,position,i_gridPoint,i_stress,t);
172}
173
174// Recursively nullify stress of a type sType= Piola/Cauchy
175template<std::size_t I=0, typename ...TStress>
176inline typename std::enable_if<I == sizeof...(TStress), void>::type
177recursiveNullifyStress(std::tuple<TStress&...> t)
178{
179}
180template<std::size_t I=0, StressType stressType, typename ...BF>
181inline typename std::enable_if<I < sizeof...(BF), void>::type
182recursiveNullifyStress(std::tuple<Stress<BF,stressType>&...> t)
183{
184 auto& stress= std::get<I>(t);
185 std::fill(stress.field.begin(), stress.field.end(),Matrix3d::Zero());
186 if constexpr (stressType==Cauchy)
187 {
188 std::fill(stress.momentumDensityField.begin(), stress.momentumDensityField.end(),Vector3d::Zero());
189 std::fill(stress.massDensityField.begin(), stress.massDensityField.end(),0.0);
190 std::fill(stress.velocityField.begin(), stress.velocityField.end(),Vector3d::Zero());
191 }
192 recursiveNullifyStress<I+1>(t);
193}
194
196double averagingDomainSize_max(const std::tuple<> t)
197{
198 return 0;
199}
200template<std::size_t I=0, typename ...TStress>
201inline typename std::enable_if<I == sizeof...(TStress)-1, double>::type
202 averagingDomainSize_max(const std::tuple<TStress&...> t)
203{
204 return std::get<I>(t).method.getAveragingDomainSize();
205}
206template<std::size_t I=0, typename ...TStress>
207inline typename std::enable_if<I < sizeof...(TStress)-1, double>::type
208 averagingDomainSize_max(const std::tuple<TStress&...> t)
209{
210 return std::max(std::get<I>(t).method.getAveragingDomainSize(),averagingDomainSize_max<I+1>(t));
211}
212
215std::map<Grid<Reference>*,double> recursiveGridMaxAveragingDomainSizeMap(const std::tuple<>& t)
216{
217std::map<Grid<Reference>*,double> map;
218return map;
219}
220template<std::size_t I=0, StressType stressType,
221 typename TGrid= typename std::conditional<stressType == Piola,Grid<Reference>,Grid<Current>>::type,
222 typename ...BF>
223inline typename std::enable_if<I == sizeof...(BF), std::map<TGrid*,double>>::type
224 recursiveGridMaxAveragingDomainSizeMap(const std::tuple<Stress<BF,stressType>&...> t)
225{
226 std::map<TGrid*,double> map;
227 return map;
228}
229template<std::size_t I=0, StressType stressType,
230 typename TGrid= typename std::conditional<stressType == Piola,Grid<Reference>,Grid<Current>>::type,
231 typename ...BF>
232inline typename std::enable_if<I < sizeof...(BF), std::map<TGrid*,double>>::type
233 recursiveGridMaxAveragingDomainSizeMap(const std::tuple<Stress<BF,stressType>&...> t)
234{
235 std::map<TGrid*,double> map;
236 const std::map<TGrid*,double>& rmap= recursiveGridMaxAveragingDomainSizeMap<I+1>(t);
237 map[std::get<I>(t).pgrid]= std::get<I>(t).method.getAveragingDomainSize();
238
239 // Loop over rmap
240 for (const auto& pair : rmap)
241 if (std::get<I>(t).pgrid == pair.first)
242 {
243 map[pair.first]= std::max(map.at(std::get<I>(t).pgrid),pair.second);
244 }
245 else
246 {
247 auto result= map.insert(pair);
248 assert(result.second==true);
249 }
250 return map;
251}
252
254
255inline std::vector<std::pair<Grid<Current>*,double>> getTGridDomainSizePairs(const std::tuple<>& emptyTuple)
256{
257 std::vector<std::pair<Grid<Current>*,double>> emptyVectorPair;
258 return emptyVectorPair;
259}
260inline std::vector<std::pair<Grid<Reference>*,double>> getTGridDomainSizePairs(std::tuple<>&& emptyTuple)
261{
262 std::vector<std::pair<Grid<Reference>*,double>> emptyVectorPair;
263 return emptyVectorPair;
264}
265template<std::size_t I=0, StressType stressType,
266 typename TGrid= typename std::conditional<stressType == Piola,Grid<Reference>,Grid<Current>>::type,
267 typename ...BF>
268inline typename std::enable_if<I == sizeof...(BF)-1, std::vector<std::pair<TGrid*,double>>>::type
269 getTGridDomainSizePairs(const std::tuple<Stress<BF,stressType>&...> t)
270{
271 std::vector<std::pair<TGrid*,double>> vectorPair;
272 vectorPair.push_back({std::get<I>(t).pgrid,std::get<I>(t).method.getAveragingDomainSize()});
273 return vectorPair;
274}
275template<std::size_t I=0, StressType stressType,
276 typename TGrid= typename std::conditional<stressType == Piola,Grid<Reference>,Grid<Current>>::type,
277 typename ...BF>
278inline typename std::enable_if< I < sizeof...(BF)-1, std::vector<std::pair<TGrid*,double>> >::type
279 getTGridDomainSizePairs(const std::tuple<Stress<BF,stressType>&...> t)
280{
281 std::vector<std::pair<TGrid*,double>> vectorPair;
282 vectorPair.push_back({std::get<I>(t).pgrid,std::get<I>(t).method.getAveragingDomainSize()});
283 std::vector<std::pair<TGrid*,double>> next= getTGridDomainSizePairs<I+1>(t);
284 vectorPair.insert(vectorPair.end(),next.begin(),next.end());
285 return vectorPair;
286}
287
289std::vector<GridBase*> getBaseGridList(const std::tuple<> t)
290{
291 std::vector<GridBase*> pgridBaseVector;
292 return pgridBaseVector;
293}
294template<std::size_t I=0, typename ...TStress>
295inline typename std::enable_if<I == sizeof...(TStress)-1, std::vector<GridBase*>>::type
296 getBaseGridList(const std::tuple<TStress&...> t)
297{
298 std::vector<GridBase*> pgridBaseVector;
299 pgridBaseVector.push_back(std::get<I>(t).pgrid);
300 return pgridBaseVector;
301}
302template<std::size_t I=0,typename ...TStress>
303inline typename std::enable_if<I < sizeof...(TStress)-1, std::vector<GridBase*>>::type
304 getBaseGridList(const std::tuple<TStress&...> t)
305{
306 std::vector<GridBase*> pgridBaseVector;
307
308 pgridBaseVector.push_back(std::get<I>(t).pgrid);
309 std::vector<GridBase*> next= getBaseGridList<I+1>(t);
310 pgridBaseVector.insert(pgridBaseVector.end(),next.begin(),next.end());
312
313}
314
316template<std::size_t I=0, typename ...TStress>
317inline typename std::enable_if<I == sizeof...(TStress), void>::type
318 recursiveFold(const Vector3d& origin, const Matrix3d& cell, const Vector3i& pbc, const std::tuple<TStress&...> t)
319{ }
320template<std::size_t I=0, typename ...TStress>
321inline typename std::enable_if<I < sizeof...(TStress), void>::type
322 recursiveFold(const Vector3d& origin,
323 const Matrix3d& cell,
324 const Vector3i& pbc,
325 std::tuple<TStress&...> t)
326{
327 BoxPoints boxPoints(origin,cell, std::get<I>(t).pgrid->coordinates);
328 std::cout << "Folding grid points in grid: " << std::get<I>(t).pgrid << " if necessary...."<<"\n";
329 boxPoints.fold(pbc);
330 std::cout << std::endl;
331 recursiveFold<I+1>(origin,cell,pbc,t);
332}
333
334// Write grid data for each requested stress field
335template<std::size_t I=0, typename ...TStress>
336inline typename std::enable_if<I == sizeof...(TStress), void>::type
337 recursiveWriteStressAndGrid(std::tuple<TStress&...> t)
338{ }
339
340template<std::size_t I=0, typename ...TStress>
341inline typename std::enable_if<I < sizeof...(TStress), void>::type
342 recursiveWriteStressAndGrid(std::tuple<TStress&...> t)
343{
344 std::cout << "Writing stress and grid of " << std::get<I>(t).name << std::endl;
345 std::get<I>(t).write();
346 std::get<I>(t).pgrid->write(std::get<I>(t).name);
348}
349
350#endif
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)
Definition StressTuple.h:14
return pgridBaseVector
recursiveWriteStressAndGrid< I+1 >(t)
std::enable_if< I==sizeof...(TStress), void >::type recursiveWriteStressAndGrid(std::tuple< TStress &... > t)
std::enable_if< I==sizeof...(TStress), void >::type recursiveFold(const Vector3d &origin, const Matrix3d &cell, const Vector3i &pbc, const std::tuple< TStress &... > t)
std::enable_if< I< sizeof...(BF), 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< Stress< BF, stressType > &... > t){ if(I==i_stress &&stressType==Cauchy) { assert(rab.squaredNorm()>epsilon);std::get< I >(t).field[i_gridPoint]=std::get< I >(t).field[i_gridPoint]+std::get< I >(t).method.bondFunction(ra, rb) *fij *rab.transpose() *rab/rab.norm();} else if(I==i_stress &&stressType==Piola) { assert(rab.squaredNorm()>epsilon);std::get< I >(t).field[i_gridPoint]=std::get< I >(t).field[i_gridPoint]+std::get< I >(t).method.bondFunction(rA, rB) *fij *rAB.transpose() *rab/rab.norm();} else recursiveBuildStress< I+1 >(fij, ra, rA, rb, rB, rab, rAB, i_gridPoint, i_stress, t);}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress), void >::typerecursiveBuildContinuumFields(const double &mass, const Vector3d &velocity, const Vector3d &position, const int &i_gridPoint, const int &i_stress, std::tuple< TStress &... > t){ if(sizeof...(TStress)!=0) assert(0);}template< std::size_t I=0, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), void >::typerecursiveBuildContinuumFields(const double &mass, const Vector3d &velocity, const Vector3d &position, const int &i_gridPoint, const int &i_stress, std::tuple< Stress< BF, Cauchy > &... > t){ if(I==i_stress) { auto &stress=std::get< I >(t);if(position.norm() >=stress.method.getAveragingDomainSize()) return;double weight=stress.method(position);stress.massDensityField[i_gridPoint]+=mass *weight;stress.momentumDensityField[i_gridPoint]+=mass *weight *velocity;} else recursiveBuildContinuumFields< I+1 >(mass, velocity, position, i_gridPoint, i_stress, t);}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress), void >::typerecursiveFinalizeContinuumVelocity(const int &i_gridPoint, const int &i_stress, std::tuple< TStress &... > t){ if(sizeof...(TStress)!=0) assert(0);}template< std::size_t I=0, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), void >::typerecursiveFinalizeContinuumVelocity(const int &i_gridPoint, const int &i_stress, std::tuple< Stress< BF, Cauchy > &... > t){ if(I==i_stress) { auto &stress=std::get< I >(t);if(stress.massDensityField[i_gridPoint] > epsilon) stress.velocityField[i_gridPoint]=stress.momentumDensityField[i_gridPoint]/stress.massDensityField[i_gridPoint];else stress.velocityField[i_gridPoint]=Vector3d::Zero();} else recursiveFinalizeContinuumVelocity< I+1 >(i_gridPoint, i_stress, t);}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress), Vector3d >::typerecursiveGetContinuumVelocity(const int &i_gridPoint, const int &i_stress, std::tuple< TStress &... > t){ if(sizeof...(TStress)!=0) assert(0);return Vector3d::Zero();}template< std::size_t I=0, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), Vector3d >::typerecursiveGetContinuumVelocity(const int &i_gridPoint, const int &i_stress, std::tuple< Stress< BF, Cauchy > &... > t){ if(I==i_stress) return std::get< I >(t).velocityField[i_gridPoint];return recursiveGetContinuumVelocity< I+1 >(i_gridPoint, i_stress, t);}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress), void >::typerecursiveBuildKineticStress(const double &mass, const Vector3d &velocity, const Vector3d &position, const int &i_gridPoint, const int &i_stress, std::tuple< TStress &... > t){ if(sizeof...(TStress)!=0) assert(0);}template< std::size_t I=0, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), void >::typerecursiveBuildKineticStress(const double &mass, const Vector3d &velocity, const Vector3d &position, const int &i_gridPoint, const int &i_stress, std::tuple< Stress< BF, Cauchy > &... > t){ if(I==i_stress) { auto &stress=std::get< I >(t);if(position.norm() >=stress.method.getAveragingDomainSize()) return;stress.field[i_gridPoint]=stress.field[i_gridPoint] - amuAngstromSquaredPerPicosecondSquaredToEv *stress.method(position) *mass *velocity.transpose() *velocity;} else recursiveBuildKineticStress< I+1 >(mass, velocity, position, i_gridPoint, i_stress, t);}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress), void >::typerecursiveNullifyStress(std::tuple< TStress &... > t){}template< std::size_t I=0, StressType stressType, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), void >::typerecursiveNullifyStress(std::tuple< Stress< BF, stressType > &... > t){ auto &stress=std::get< I >(t);std::fill(stress.field.begin(), stress.field.end(), Matrix3d::Zero());if constexpr(stressType==Cauchy) { std::fill(stress.momentumDensityField.begin(), stress.momentumDensityField.end(), Vector3d::Zero());std::fill(stress.massDensityField.begin(), stress.massDensityField.end(), 0.0);std::fill(stress.velocityField.begin(), stress.velocityField.end(), Vector3d::Zero());} recursiveNullifyStress< I+1 >(t);}double averagingDomainSize_max(const std::tuple<> t){ return 0;}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress) -1, double >::type averagingDomainSize_max(const std::tuple< TStress &... > t){ return std::get< I >(t).method.getAveragingDomainSize();}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I< sizeof...(TStress) -1, double >::type averagingDomainSize_max(const std::tuple< TStress &... > t){ return std::max(std::get< I >(t).method.getAveragingDomainSize(), averagingDomainSize_max< I+1 >(t));}std::map< Grid< Reference > *, double > recursiveGridMaxAveragingDomainSizeMap(const std::tuple<> &t){std::map< Grid< Reference > *, double > map;return map;}template< std::size_t I=0, StressType stressType, typename TGrid=typename std::conditional< stressType==Piola, Grid< Reference >, Grid< Current > >::type, typename ...BF >inline typename std::enable_if< I==sizeof...(BF), std::map< TGrid *, double > >::type recursiveGridMaxAveragingDomainSizeMap(const std::tuple< Stress< BF, stressType > &... > t){ std::map< TGrid *, double > map;return map;}template< std::size_t I=0, StressType stressType, typename TGrid=typename std::conditional< stressType==Piola, Grid< Reference >, Grid< Current > >::type, typename ...BF >inline typename std::enable_if< I< sizeof...(BF), std::map< TGrid *, double > >::type recursiveGridMaxAveragingDomainSizeMap(const std::tuple< Stress< BF, stressType > &... > t){ std::map< TGrid *, double > map;const std::map< TGrid *, double > &rmap=recursiveGridMaxAveragingDomainSizeMap< I+1 >(t);map[std::get< I >(t).pgrid]=std::get< I >(t).method.getAveragingDomainSize();for(const auto &pair :rmap) if(std::get< I >(t).pgrid==pair.first) { map[pair.first]=std::max(map.at(std::get< I >(t).pgrid), pair.second);} else { auto result=map.insert(pair);assert(result.second==true);} return map;}inline std::vector< std::pair< Grid< Current > *, double > > getTGridDomainSizePairs(const std::tuple<> &emptyTuple){ std::vector< std::pair< Grid< Current > *, double > > emptyVectorPair;return emptyVectorPair;}inline std::vector< std::pair< Grid< Reference > *, double > > getTGridDomainSizePairs(std::tuple<> &&emptyTuple){ std::vector< std::pair< Grid< Reference > *, double > > emptyVectorPair;return emptyVectorPair;}template< std::size_t I=0, StressType stressType, typename TGrid=typename std::conditional< stressType==Piola, Grid< Reference >, Grid< Current > >::type, typename ...BF >inline typename std::enable_if< I==sizeof...(BF) -1, std::vector< std::pair< TGrid *, double > > >::type getTGridDomainSizePairs(const std::tuple< Stress< BF, stressType > &... > t){ std::vector< std::pair< TGrid *, double > > vectorPair;vectorPair.push_back({std::get< I >(t).pgrid, std::get< I >(t).method.getAveragingDomainSize()});return vectorPair;}template< std::size_t I=0, StressType stressType, typename TGrid=typename std::conditional< stressType==Piola, Grid< Reference >, Grid< Current > >::type, typename ...BF >inline typename std::enable_if< I< sizeof...(BF) -1, std::vector< std::pair< TGrid *, double > > >::type getTGridDomainSizePairs(const std::tuple< Stress< BF, stressType > &... > t){ std::vector< std::pair< TGrid *, double > > vectorPair;vectorPair.push_back({std::get< I >(t).pgrid, std::get< I >(t).method.getAveragingDomainSize()});std::vector< std::pair< TGrid *, double > > next=getTGridDomainSizePairs< I+1 >(t);vectorPair.insert(vectorPair.end(), next.begin(), next.end());return vectorPair;}std::vector< GridBase * > getBaseGridList(const std::tuple<> t){ std::vector< GridBase * > pgridBaseVector;return pgridBaseVector;}template< std::size_t I=0, typename ...TStress >inline typename std::enable_if< I==sizeof...(TStress) -1, std::vector< GridBase * > >::type getBaseGridList(const std::tuple< TStress &... > t){ std::vector< GridBase * > pgridBaseVector;pgridBaseVector.push_back(std::get< I >(t).pgrid);return pgridBaseVector;}template< std::size_t I=0, typename ...TStress > std::enable_if< I< sizeof...(TStress) -1, std::vector< GridBase * > >::type getBaseGridList(const std::tuple< TStress &... > t){ std::vector< GridBase * > pgridBaseVector;pgridBaseVector.push_back(std::get< I >(t).pgrid);std::vector< GridBase * > next
Definition Grid.h:38
Three-dimensional stress field on a grid.
Definition Stress.h:42
const double amuAngstromSquaredPerPicosecondSquaredToEv
Definition typedef.h:74
Eigen::Matrix< double, DIM, DIM, Eigen::RowMajor > Matrix3d
Definition typedef.h:56
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Definition typedef.h:60
Eigen::Matrix< int, 1, DIM, Eigen::RowMajor > Vector3i
Definition typedef.h:61
StressType
Definition typedef.h:63
@ Cauchy
Definition typedef.h:64
@ Piola
Definition typedef.h:65
const double epsilon
Definition typedef.h:73