Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
HEXlattice.cpp
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8
9#ifndef model_HEXlattice_cpp_
10#define model_HEXlattice_cpp_
11
12#include <HEXlattice.h>
14#include <GlidePlaneNoise.h>
15
16
17namespace model
18{
19
20 Eigen::Matrix<double,3,3> HEXlattice<3>::getLatticeBasis()
21 {
24 Eigen::Matrix<double,dim,dim> temp;
25 temp << 1.0, 0.5, 0.0,
26 /* */ 0.0, 0.5*sqrt(3.0), 0.0,
27 /* */ 0.0, 0.0, sqrt(8.0/3.0);
28 return temp;
29 }
30
32 const Lattice<dim>& lat)
33 {
36
37 typedef Eigen::Matrix<long int,dim,1> VectorDimI;
38
40 LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
41 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
42 LatticeVectorType a3(a2-a1);
43 LatticeVectorType c((VectorDimI()<<0,0,1).finished(),lat);
44
46 if(material.isEnabledPlane("basal"))
47 {
48
49 const double ISF(TextFileParser(material.materialFile).readScalar<double>("basalISF_SI",true)/(material.mu_SI*material.b_SI));
50 const double USF(TextFileParser(material.materialFile).readScalar<double>("basalUSF_SI",true)/(material.mu_SI*material.b_SI));
51 const double MSF(TextFileParser(material.materialFile).readScalar<double>("basalMSF_SI",true)/(material.mu_SI*material.b_SI));
52
53 const Eigen::Matrix<double,3,2> waveVectors((Eigen::Matrix<double,3,2>()<<0.0, 0.0,
54 /* */ 0.0, 1.0,
55 /* */ 1.0,-1.0
56 ).finished());
57
58 const Eigen::Matrix<double,4,3> f((Eigen::Matrix<double,4,3>()<<0.00,0.0, 0.0,
59 /* */ 0.50,sqrt(3.0)/6.0, ISF,
60 /* */ 0.25,sqrt(3.0)/12.0,USF,
61 /* */ 1.00,sqrt(3.0)/3.0, MSF).finished());
62
63 const int rotSymm(3);
64 const std::vector<Eigen::Matrix<double,2,1>> mirSymm;
65 const Eigen::Matrix<double,2,2> A(GlidePlaneBase(a1,a2,nullptr).localBasis());
66
67 std::shared_ptr<GammaSurface> gammaSurface(new GammaSurface(A,waveVectors,f,rotSymm,mirSymm));
68 temp.emplace(temp.size(),new GlidePlaneBase(a1,a2,gammaSurface)); // basal plane
69
70 }
71
72 if(material.isEnabledPlane("prismatic"))
73 {
74 Eigen::Matrix<double,Eigen::Dynamic,2> waveVectors(TextFileParser(material.materialFile).readMatrixCols<double>("prismaticWaveVectors",2,true));
75 Eigen::Matrix<double,Eigen::Dynamic,3> fr(TextFileParser(material.materialFile).readMatrixCols<double>("prismaticGammaSurfacePoints",3,true));
76 const Eigen::Matrix<double,2,2> A(GlidePlaneBase(a1,c,nullptr).localBasis());
77 Eigen::Matrix<double,Eigen::Dynamic,3> f(fr);
78 f.block(0,0,fr.rows(),2)=(A*fr.block(0,0,fr.rows(),2).transpose()).transpose();
79 f.col(2)=fr.col(2)/(material.mu_SI*material.b_SI);
80 const int rotSymm(1);
81 std::vector<Eigen::Matrix<double,2,1>> mirSymm;
82 mirSymm.push_back((Eigen::Matrix<double,2,1>()<<1.0,0.0).finished()); // symm with respect to local y-axis
83 mirSymm.push_back((Eigen::Matrix<double,2,1>()<<0.0,1.0).finished()); // symm with respect to local x-axis
84
85 std::shared_ptr<GammaSurface> gammaSurface(new GammaSurface(A,waveVectors,f,rotSymm,mirSymm));
86 temp.emplace(temp.size(),new GlidePlaneBase(a1 ,c,gammaSurface)); // prismatic plane
87 temp.emplace(temp.size(),new GlidePlaneBase(a3 ,c,gammaSurface)); // prismatic plane
88 temp.emplace(temp.size(),new GlidePlaneBase(a2*(-1),c,gammaSurface)); // prismatic plane
89 }
90
91 if(material.isEnabledPlane("pyramidal"))
92 {
93 temp.emplace(temp.size(),new GlidePlaneBase(a1 ,a2+c,nullptr)); // pyramidal plane
94 temp.emplace(temp.size(),new GlidePlaneBase(a2 ,a3+c,nullptr)); // pyramidal plane
95 temp.emplace(temp.size(),new GlidePlaneBase(a3 ,c-a1,nullptr)); // pyramidal plane
96 temp.emplace(temp.size(),new GlidePlaneBase(a1*(-1),c-a2,nullptr)); // pyramidal plane
97 temp.emplace(temp.size(),new GlidePlaneBase(a2*(-1),c-a3,nullptr)); // pyramidal plane
98 temp.emplace(temp.size(),new GlidePlaneBase(a3*(-1),a1+c,nullptr)); // pyramidal plane
99 }
100
101 return temp;
102 }
103
105 const Lattice<dim>& lat,
106 const PlaneNormalContainerType& plN)
107 {
110 typedef Eigen::Matrix<long int,dim,1> VectorDimI;
112 typedef ReciprocalLatticeDirection<dim> ReciprocalLatticeDirectionType;
113 LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
114 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
115 LatticeVectorType c((VectorDimI()<<0,0,1).finished(),lat);
116
117
118 DislocationMobilitySelector mobilitySelector;
119 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
121
122 if(material.isEnabledSlipSystem("<a>{basal}"))
123 {
124 const double dBasal(ReciprocalLatticeDirectionType(a1.cross(a2)).planeSpacing());
125 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_<a>{basal}",true));
126 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
127
128 for(const auto& planeBase : plN)
129 {
130 if(std::fabs(planeBase.second->planeSpacing()-dBasal)<FLT_EPSILON)
131 {
132 const auto& b1(planeBase.second->primitiveVectors.first);
133 const auto& b2(planeBase.second->primitiveVectors.second);
134 const auto b3(b2-b1);
135
136 std::vector<RationalLatticeDirection<3>> slipDirs;
137 slipDirs.emplace_back(Rational( 1,1),b1);
138 slipDirs.emplace_back(Rational(-1,1),b1);
139 slipDirs.emplace_back(Rational( 1,1),b2);
140 slipDirs.emplace_back(Rational(-1,1),b2);
141 slipDirs.emplace_back(Rational( 1,1),b3);
142 slipDirs.emplace_back(Rational(-1,1),b3);
143
144 for(const auto& slipDir : slipDirs)
145 {
146 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
147 }
148 }
149 }
150 }
151
152 if(material.isEnabledSlipSystem("<Shockley>{basal}"))
153 {
154 const double dBasal(ReciprocalLatticeDirectionType(a1.cross(a2)).planeSpacing());
155 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_<Shockley>{basal}",true));
156 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
157
158 for(const auto& planeBase : plN)
159 {
160 if(std::fabs(planeBase.second->planeSpacing()-dBasal)<FLT_EPSILON)
161 {
162 const auto& b1(planeBase.second->primitiveVectors.first);
163 const auto& b2(planeBase.second->primitiveVectors.second);
164 const auto b3(b2-b1);
165
166 std::vector<RationalLatticeDirection<3>> slipDirs;
167 slipDirs.emplace_back(Rational(1,3),b1-b3);
168 slipDirs.emplace_back(Rational(1,3),b1-b2);
169 slipDirs.emplace_back(Rational(1,3),b2-b1);
170 slipDirs.emplace_back(Rational(1,3),b2-b3);
171 slipDirs.emplace_back(Rational(1,3),b3-b2);
172 slipDirs.emplace_back(Rational(1,3),b3-b1);
173
174 for(const auto& slipDir : slipDirs)
175 {
176 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
177 }
178 }
179 }
180 }
181
182 if(material.isEnabledSlipSystem("<a>{prismatic}"))
183 {
184 const double dPrismatic(ReciprocalLatticeDirectionType(a1.cross(c)).planeSpacing());
185 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_<a>{prismatic}",true));
186 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
187
188 for(const auto& planeBase : plN)
189 {
190 if(std::fabs(planeBase.second->planeSpacing()-dPrismatic)<FLT_EPSILON)
191 {
192 const auto& b(planeBase.second->primitiveVectors.first);
193
194
195 std::vector<RationalLatticeDirection<3>> slipDirs;
196 slipDirs.emplace_back(Rational( 1,1),b);
197 slipDirs.emplace_back(Rational(-1,1),b);
198
199 for(const auto& slipDir : slipDirs)
200 {
201 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
202 }
203 }
204 }
205 }
206
207 if(material.isEnabledSlipSystem("<a>{pyramidal}"))
208 {
209 const double dPyramidal(ReciprocalLatticeDirectionType(a1.cross(a2+c)).planeSpacing());
210 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_<a>{pyramidal}",true));
211 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
212
213 for(const auto& planeBase : plN)
214 {
215 if(std::fabs(planeBase.second->planeSpacing()-dPyramidal)<FLT_EPSILON)
216 {
217 const auto& b(planeBase.second->primitiveVectors.first);
218
219
220 std::vector<RationalLatticeDirection<3>> slipDirs;
221 slipDirs.emplace_back(Rational( 1,1),b);
222 slipDirs.emplace_back(Rational(-1,1),b);
223
224 for(const auto& slipDir : slipDirs)
225 {
226 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
227 }
228 }
229 }
230 }
231
232// const std::string dislocationMobilityTypeBasal(TextFileParser(material.materialFile).readString("dislocationMobilityTypeBasal",true));
233// DislocationMobilitySelector mobilitySelector("HEXbasal");
234// const std::shared_ptr<DislocationMobility> hexMobilityBasal(mobilitySelector.getMobility(dislocationMobilityTypeBasal,material));
235//
236// const std::string dislocationMobilityTypePrismatic(TextFileParser(material.materialFile).readString("dislocationMobilityTypePrismatic",true));
237// DislocationMobilitySelector mobilitySelectorPrismatic("HEXprismatic");
238// const std::shared_ptr<DislocationMobility> hexMobilityPrismatic(mobilitySelectorPrismatic.getMobility(dislocationMobilityTypePrismatic,material));
239//
240// const std::string dislocationMobilityTypePyramidal(TextFileParser(material.materialFile).readString("dislocationMobilityTypePyramidal",true));
241// DislocationMobilitySelector mobilitySelectorPyramidal("HEXpyramidal");
242// const std::shared_ptr<DislocationMobility> hexMobilityPyramidal(mobilitySelectorPyramidal.getMobility(dislocationMobilityTypePyramidal,material));
243//
244// std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
245//
246// typedef Eigen::Matrix<long int,dim,1> VectorDimI;
247// typedef LatticeVector<dim> LatticeVectorType;
248// typedef ReciprocalLatticeDirection<dim> ReciprocalLatticeDirectionType;
249// LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
250// LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
251// LatticeVectorType c((VectorDimI()<<0,0,1).finished(),lat);
252//
253// const double dBasal(ReciprocalLatticeDirectionType(a1.cross(a2)).planeSpacing());
254// const double dPrismatic(ReciprocalLatticeDirectionType(a1.cross(c)).planeSpacing());
255// const double dPyramidal(ReciprocalLatticeDirectionType(a1.cross(a2+c)).planeSpacing());
256//
257// SlipSystemContainerType temp;
258// for(const auto& planeBase : plN)
259// {
260// if(std::fabs(planeBase.second->planeSpacing()-dBasal)<FLT_EPSILON)
261// {
262// const auto& a1(planeBase.second->primitiveVectors.first);
263// const auto& a2(planeBase.second->primitiveVectors.second);
264//
265// const auto b1(a1);
266// const auto b2(a2);
267// const auto b3(b2-b1);
268//
269// std::vector<RationalLatticeDirection<3>> slipDirs;
270//
271// if(material.enabledSlipSystems.find("fullBasal")!=material.enabledSlipSystems.end())
272// {
273// // Full slip systems
274// slipDirs.emplace_back(Rational( 1,1),b1);
275// slipDirs.emplace_back(Rational(-1,1),b1);
276// slipDirs.emplace_back(Rational( 1,1),b2);
277// slipDirs.emplace_back(Rational(-1,1),b2);
278// slipDirs.emplace_back(Rational( 1,1),b3);
279// slipDirs.emplace_back(Rational(-1,1),b3);
280// }
281//
282// if(material.enabledSlipSystems.find("ShockleyBasal")!=material.enabledSlipSystems.end())
283// {
284// // Shockley partials
285// slipDirs.emplace_back(Rational(1,3),b1-b3);
286// slipDirs.emplace_back(Rational(1,3),b1-b2);
287// slipDirs.emplace_back(Rational(1,3),b2-b1);
288// slipDirs.emplace_back(Rational(1,3),b2-b3);
289// slipDirs.emplace_back(Rational(1,3),b3-b2);
290// slipDirs.emplace_back(Rational(1,3),b3-b1);
291// }
292//
293// for(const auto& slipDir : slipDirs)
294// {
295// temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,hexMobilityBasal,planeNoise));
296// }
297//
298// }
299//
300// if(std::fabs(planeBase.second->planeSpacing()-dPrismatic)<FLT_EPSILON)
301// {
302// const auto& b(planeBase.second->primitiveVectors.first);
303// std::vector<RationalLatticeDirection<3>> slipDirs;
304//
305// if(material.enabledSlipSystems.find("fullPrismatic")!=material.enabledSlipSystems.end())
306// {
307// // Full slip systems
308// slipDirs.emplace_back(Rational( 1,1),b);
309// slipDirs.emplace_back(Rational(-1,1),b);
310// }
311//
312// for(const auto& slipDir : slipDirs)
313// {
314// temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,hexMobilityPrismatic,planeNoise));
315// }
316// }
317//
318// if(std::fabs(planeBase.second->planeSpacing()-dPyramidal)<FLT_EPSILON)
319// {
320// const auto& b(planeBase.second->primitiveVectors.first);
321// std::vector<RationalLatticeDirection<3>> slipDirs;
322//
323// if(material.enabledSlipSystems.find("fullPyramidal")!=material.enabledSlipSystems.end())
324// {
325// // Full slip systems
326// slipDirs.emplace_back(Rational( 1,1),b);
327// slipDirs.emplace_back(Rational(-1,1),b);
328// }
329//
330// for(const auto& slipDir : slipDirs)
331// {
332// temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,hexMobilityPyramidal,planeNoise));
333// }
334// }
335//
336// }
337
338 return temp;
339 }
340
341
342
344 const Lattice<dim>& lat,
345 const PlaneNormalContainerType& plN)
346 {
348
349 for(const std::string& sp : material.enabledSecondPhases)
350 {
351 throw std::runtime_error("Unnown SecondPhase "+sp+" in HEX crystals.");
352 }
353 return temp;
354 }
355
356} // namespace model
357#endif
358
ReciprocalLatticeDirectionType cross(const LatticeVectorType &other) const
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > readMatrixCols(const std::string &key, const size_t &cols, const bool &verbose=false)
std::string readString(const std::string &key, const bool &verbose=false)
Scalar readScalar(const std::string &key, const bool &verbose=false)
function infiniteDisplacement syms Ax Ay Az Bx By Bz qx qy qz u L x y z real A
c
Definition int_R.m:15
function int_R syms a b c u real f
Definition int_R.m:4
b
Definition int_R.m:16
std::shared_ptr< DislocationMobility > getMobility(const PolycrystallineMaterialBase &material, const std::string &tag) const
TypeTraits< SingleCrystalBase< dim > >::PlaneNormalContainerType PlaneNormalContainerType
Definition HEXlattice.h:41
TypeTraits< SingleCrystalBase< dim > >::SlipSystemContainerType SlipSystemContainerType
Definition HEXlattice.h:42
Eigen::Matrix< long int, dim, 1 > VectorDimI
Definition HEXlattice.h:37
TypeTraits< SingleCrystalBase< dim > >::SecondPhaseContainerType SecondPhaseContainerType
Definition HEXlattice.h:43
LatticeVector< dim > LatticeVectorType
Definition HEXlattice.h:38
bool isEnabledPlane(const std::string &planeStr) const
const std::set< std::string > enabledSecondPhases
bool isEnabledSlipSystem(const std::string &ssStr) const
vertex temp