Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
FCClattice.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_FCClattice_cpp_
10#define model_FCClattice_cpp_
11
12#include <FCClattice.h>
14#include <GlidePlaneNoise.h>
15
16namespace model
17{
18
19 Eigen::Matrix<double,3,3> FCClattice<3>::getLatticeBasis()
20 {
23 Eigen::Matrix<double,dim,dim> temp;
24 temp << 0.0, 1.0, 1.0,
25 /* */ 1.0, 0.0, 1.0,
26 /* */ 1.0, 1.0, 0.0;
27 return temp/sqrt(2.0);
28 }
29
31 const Lattice<dim>& lat)
32 {
35 LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
36 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
37 LatticeVectorType a3((VectorDimI()<<0,0,1).finished(),lat);
38
40
41// const bool enable111planes(true);
42// const bool enable100planes(false);
43
44 if(material.isEnabledPlane("{111}"))
45 {
46 const double ISF(TextFileParser(material.materialFile).readScalar<double>("ISF_SI",true)/(material.mu_SI*material.b_SI));
47 const double USF(TextFileParser(material.materialFile).readScalar<double>("USF_SI",true)/(material.mu_SI*material.b_SI));
48 const double MSF(TextFileParser(material.materialFile).readScalar<double>("MSF_SI",true)/(material.mu_SI*material.b_SI));
49
50 const Eigen::Matrix<double,3,2> waveVectors((Eigen::Matrix<double,3,2>()<<0.0, 0.0,
51 /* */ 0.0, 1.0,
52 /* */ 1.0,-1.0).finished());
53
54 const Eigen::Matrix<double,4,3> f((Eigen::Matrix<double,4,3>()<<0.00,0.0, 0.0,
55 /* */ 0.50,sqrt(3.0)/6.0, ISF,
56 /* */ 0.25,sqrt(3.0)/12.0,USF,
57 /* */ 1.00,sqrt(3.0)/3.0, MSF).finished());
58
59 // const int rotSymm(3);
60 // const std::vector<Eigen::Matrix<double,2,1>> mirSymm;
61 const Eigen::Matrix<double,2,2> A111(GlidePlaneBase(a1,a3,nullptr).localBasis());
62 std::shared_ptr<GammaSurface> gammaSurface111(new GammaSurface(A111,waveVectors,f,3,std::vector<Eigen::Matrix<double,2,1>>()));
63
64 temp.emplace(temp.size(),new GlidePlaneBase(a1,a3,gammaSurface111)); // is (-1, 1,-1) in cartesian
65 temp.emplace(temp.size(),new GlidePlaneBase(a3,a2,gammaSurface111)); // is ( 1,-1,-1) in cartesian
66 temp.emplace(temp.size(),new GlidePlaneBase(a2,a1,gammaSurface111)); // is (-1,-1, 1) in cartesian
67 temp.emplace(temp.size(),new GlidePlaneBase(a1-a3,a2-a3,gammaSurface111)); // is ( 1, 1, 1) in cartesian
68 }
69
70 if( material.isEnabledPlane("{100}")
71 || material.isEnabledPlane("{010}")
72 || material.isEnabledPlane("{001}"))
73 {
74 const auto c1(a2+a3-a1);
75 const auto c2(a3+a1-a2);
76 const auto c3(a1+a2-a3);
77
78 // TEMPORARY CONSTANT GSFE FOR 100 planes
79 const Eigen::Matrix<double,1,2> waveVectors((Eigen::Matrix<double,1,2>()<<0.0, 0.0).finished());
80 const double GSFEval_SI(100.0);
81 const Eigen::Matrix<double,1,3> f((Eigen::Matrix<double,1,3>()<<0.5,0.5, GSFEval_SI/(material.mu_SI*material.b_SI)).finished());
82 const Eigen::Matrix<double,2,2> A100(GlidePlaneBase(c1,c2,nullptr).localBasis());
83 std::shared_ptr<GammaSurface> gammaSurface100(new GammaSurface(A100,waveVectors,f,1,std::vector<Eigen::Matrix<double,2,1>>()));
84
85 temp.emplace(temp.size(),new GlidePlaneBase(c1,c2,gammaSurface100)); // is (-1, 1,-1) in cartesian
86 temp.emplace(temp.size(),new GlidePlaneBase(c2,c3,gammaSurface100)); // is ( 1,-1,-1) in cartesian
87 temp.emplace(temp.size(),new GlidePlaneBase(c3,c1,gammaSurface100)); // is (-1,-1, 1) in cartesian
88 }
89 return temp;
90 }
91
93 const Lattice<dim>& lat,
94 const PlaneNormalContainerType& plN)
95 {
98
99 DislocationMobilitySelector mobilitySelector;
101
102 if(material.isEnabledSlipSystem("a/2<110>{111}"))
103 {// Full dislocations
104 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_a/2<110>{111}",true));
105 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
106 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
107 const double d111(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,1.0).finished()).planeSpacing());
108 for(const auto& planeBase : plN)
109 {
110 if(std::fabs(planeBase.second->planeSpacing()-d111)<FLT_EPSILON)
111 {// a {111} plane
112 const auto& a1(planeBase.second->primitiveVectors.first);
113 const auto& a3(planeBase.second->primitiveVectors.second);
114
115 const auto b1(a1);
116 const auto b2(a3-a1);
117 const auto b3(a3*(-1));
118
119 std::vector<RationalLatticeDirection<3>> slipDirs;
120 slipDirs.emplace_back(Rational( 1,1),b1);
121 slipDirs.emplace_back(Rational(-1,1),b1);
122 slipDirs.emplace_back(Rational( 1,1),b2);
123 slipDirs.emplace_back(Rational(-1,1),b2);
124 slipDirs.emplace_back(Rational( 1,1),b3);
125 slipDirs.emplace_back(Rational(-1,1),b3);
126
127 for(const auto& slipDir : slipDirs)
128 {
129 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
130 }
131 }
132 }
133 }
134
135 if(material.isEnabledSlipSystem("a/6<112>{111}"))
136 {// Shockley dislocations
137 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_a/6<112>{111}",true));
138 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
139 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
140 const double d111(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,1.0).finished()).planeSpacing());
141 for(const auto& planeBase : plN)
142 {
143 if(std::fabs(planeBase.second->planeSpacing()-d111)<FLT_EPSILON)
144 {// a {111} plane
145 const auto& a1(planeBase.second->primitiveVectors.first);
146 const auto& a3(planeBase.second->primitiveVectors.second);
147
148 const auto b1(a1);
149 const auto b2(a3-a1);
150 const auto b3(a3*(-1));
151
152 std::vector<RationalLatticeDirection<3>> slipDirs;
153 slipDirs.emplace_back(Rational(1,3),b1-b3);
154 slipDirs.emplace_back(Rational(1,3),b1-b2);
155 slipDirs.emplace_back(Rational(1,3),b2-b1);
156 slipDirs.emplace_back(Rational(1,3),b2-b3);
157 slipDirs.emplace_back(Rational(1,3),b3-b2);
158 slipDirs.emplace_back(Rational(1,3),b3-b1);
159
160 for(const auto& slipDir : slipDirs)
161 {
162 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
163 }
164 }
165 }
166 }
167
168 if(material.isEnabledSlipSystem("a/3<112>{111}"))
169 {// Kear dislocations
170 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_a/6<112>{111}",true));
171 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
172 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
173 const double d111(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,1.0).finished()).planeSpacing());
174 for(const auto& planeBase : plN)
175 {
176 if(std::fabs(planeBase.second->planeSpacing()-d111)<FLT_EPSILON)
177 {// a {111} plane
178 const auto& a1(planeBase.second->primitiveVectors.first);
179 const auto& a3(planeBase.second->primitiveVectors.second);
180
181 const auto b1(a1);
182 const auto b2(a3-a1);
183 const auto b3(a3*(-1));
184
185 std::vector<RationalLatticeDirection<3>> slipDirs;
186 slipDirs.emplace_back(Rational(2,3),b1-b3);
187 slipDirs.emplace_back(Rational(2,3),b1-b2);
188 slipDirs.emplace_back(Rational(2,3),b2-b1);
189 slipDirs.emplace_back(Rational(2,3),b2-b3);
190 slipDirs.emplace_back(Rational(2,3),b3-b2);
191 slipDirs.emplace_back(Rational(2,3),b3-b1);
192
193 for(const auto& slipDir : slipDirs)
194 {
195 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
196 }
197 }
198 }
199 }
200
201// const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("dislocationMobilityType",true));
202// const std::shared_ptr<DislocationMobility> fccMobility(mobilitySelector.getMobility(material,dislocationMobilityType));
203//
204// std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
205//
206// const double d111(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,1.0).finished()).planeSpacing());
207//
208// for(const auto& planeBase : plN)
209// {
210// if(std::fabs(planeBase.second->planeSpacing()-d111)<FLT_EPSILON)
211// {// a {111} plane
212// const auto& a1(planeBase.second->primitiveVectors.first);
213// const auto& a3(planeBase.second->primitiveVectors.second);
214//
215// const auto b1(a1);
216// const auto b2(a3-a1);
217// const auto b3(a3*(-1));
218//
219// std::vector<RationalLatticeDirection<3>> slipDirs;
220//
221// if( material.enabledSlipSystems.find("Full")!=material.enabledSlipSystems.end()
222// || material.enabledSlipSystems.find("full")!=material.enabledSlipSystems.end())
223// {
224// // Full slip systems
225// slipDirs.emplace_back(Rational( 1,1),b1);
226// slipDirs.emplace_back(Rational(-1,1),b1);
227// slipDirs.emplace_back(Rational( 1,1),b2);
228// slipDirs.emplace_back(Rational(-1,1),b2);
229// slipDirs.emplace_back(Rational( 1,1),b3);
230// slipDirs.emplace_back(Rational(-1,1),b3);
231// }
232// if( material.enabledSlipSystems.find("Shockley")!=material.enabledSlipSystems.end()
233// || material.enabledSlipSystems.find("shockley")!=material.enabledSlipSystems.end())
234// {
235// // Shockley partials
236// slipDirs.emplace_back(Rational(1,3),b1-b3);
237// slipDirs.emplace_back(Rational(1,3),b1-b2);
238// slipDirs.emplace_back(Rational(1,3),b2-b1);
239// slipDirs.emplace_back(Rational(1,3),b2-b3);
240// slipDirs.emplace_back(Rational(1,3),b3-b2);
241// slipDirs.emplace_back(Rational(1,3),b3-b1);
242// }
243// if( material.enabledSlipSystems.find("Kear")!=material.enabledSlipSystems.end()
244// || material.enabledSlipSystems.find("kear")!=material.enabledSlipSystems.end())
245// {
246// // Kear partials
247// slipDirs.emplace_back(Rational(2,3),b1-b3);
248// slipDirs.emplace_back(Rational(2,3),b1-b2);
249// slipDirs.emplace_back(Rational(2,3),b2-b1);
250// slipDirs.emplace_back(Rational(2,3),b2-b3);
251// slipDirs.emplace_back(Rational(2,3),b3-b2);
252// slipDirs.emplace_back(Rational(2,3),b3-b1);
253// }
254//
255// for(const auto& slipDir : slipDirs)
256// {
257// temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,fccMobility,planeNoise));
258// }
259// }
260// }
261 return temp;
262 }
263
264
265
267 const Lattice<dim>& lat,
268 const PlaneNormalContainerType& plN)
269 {
270
271 LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
272 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
273 LatticeVectorType a3((VectorDimI()<<0,0,1).finished(),lat);
274
275 const auto c1(a2+a3-a1);
276 const auto c2(a3+a1-a2);
277 const auto c3(a1+a2-a3);
278
279
281
282 for(const std::string& sp : material.enabledSecondPhases)
283 {
284 if(sp=="L12")
285 {
286 const double APB(TextFileParser(material.materialFile).readScalar<double>("APB_SI",true)/(material.mu_SI*material.b_SI));
287 const double SISF(TextFileParser(material.materialFile).readScalar<double>("SISF_SI",true)/(material.mu_SI*material.b_SI));
288 const double CESF(TextFileParser(material.materialFile).readScalar<double>("CESF_SI",true)/(material.mu_SI*material.b_SI));
289 const double CISF(TextFileParser(material.materialFile).readScalar<double>("CISF_SI",true)/(material.mu_SI*material.b_SI));
290 const double SESF(TextFileParser(material.materialFile).readScalar<double>("SESF_SI",true)/(material.mu_SI*material.b_SI));
291
292 const Eigen::Matrix<double,4,2> waveVectors111((Eigen::Matrix<double,4,2>()<<0.0, 0.0,
293 /* */ 0.0, 1.0,
294 /* */ 1.0,-1.0,
295 // /* */ 1.0,1.0,
296 /* */ 2.0, 0.0).finished()); // the factor 0.5 accounts for the fact that A_L12=2*A_fcc
297 const Eigen::Matrix<double,6,3> f111((Eigen::Matrix<double,6,3>()<<0.00,0.0, 0.0,
298 /* */ 0.50,sqrt(3.0)/6.0, CISF,
299 /* */ 1.00,sqrt(3.0)/3.0,SESF,
300 /* */ 1.50,sqrt(3.0)/2.0, APB,
301 /* */ 2.00,2.0*sqrt(3.0)/3.0, SISF,
302 /* */ 2.50,5.0*sqrt(3.0)/6.0, CESF).finished());
303// const int rotSymm111(3);
304// const std::vector<Eigen::Matrix<double,2,1>> mirSymm111;
305 const Eigen::Matrix<double,2,2> A111(2.0*GlidePlaneBase(a1,a3,nullptr).localBasis()); // double the matrix basis
306 std::shared_ptr<GammaSurface> gammaSurface111(new GammaSurface(A111,waveVectors111,f111,3,std::vector<Eigen::Matrix<double,2,1>>()));
307
308
309 // TEMPORARY CONSTANT GSFE FOR 100 planes
310 const Eigen::Matrix<double,1,2> waveVectors100((Eigen::Matrix<double,1,2>()<<0.0, 0.0).finished());
311 const double GSFEval100_SI(50.0);
312 const Eigen::Matrix<double,1,3> f100((Eigen::Matrix<double,1,3>()<<0.5,0.5, GSFEval100_SI/(material.mu_SI*material.b_SI)).finished());
313 const Eigen::Matrix<double,2,2> A100(2.0*GlidePlaneBase(c1,c2,nullptr).localBasis()); // double the matrix basis
314 std::shared_ptr<GammaSurface> gammaSurface100(new GammaSurface(A100,waveVectors100,f100,1,std::vector<Eigen::Matrix<double,2,1>>()));
315
316
317 const double d111(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,1.0).finished()).planeSpacing());
318 const double d100(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,0.0,0.0).finished()).planeSpacing());
319
320 std::map<const GlidePlaneBase*,std::shared_ptr<GammaSurface>> gsMap;
321 for(const auto& pn : plN)
322 {
323 if(std::abs(pn.second->planeSpacing()-d111)<FLT_EPSILON)
324 {// a 111 plane
325 gsMap.emplace(pn.second.get(),gammaSurface111);
326 }
327 else if(std::abs(pn.second->planeSpacing()-d100)<FLT_EPSILON)
328 {
329 gsMap.emplace(pn.second.get(),gammaSurface100);
330 }
331 else
332 {
333 gsMap.emplace(pn.second.get(),nullptr);
334 }
335 }
336
337 std::shared_ptr<SecondPhase<dim>> sp(new SecondPhase<dim>("L12",gsMap,plN));
338 temp.emplace(sp->sID,sp);
339 }
340 else
341 {
342 throw std::runtime_error("Unnown SecondPhase "+sp+" in FCC crystals.");
343 }
344 }
345 return temp;
346 }
347
348} // namespace model
349#endif
350
ReciprocalLatticeDirectionType reciprocalLatticeDirection(const VectorDimD &d) const
const MatrixDimD C2G
std::string readString(const std::string &key, const bool &verbose=false)
Scalar readScalar(const std::string &key, const bool &verbose=false)
function int_R syms a b c u real f
Definition int_R.m:4
std::shared_ptr< DislocationMobility > getMobility(const PolycrystallineMaterialBase &material, const std::string &tag) const
Eigen::Matrix< long int, dim, 1 > VectorDimI
Definition FCClattice.h:38
TypeTraits< SingleCrystalBase< dim > >::SlipSystemContainerType SlipSystemContainerType
Definition FCClattice.h:43
Eigen::Matrix< double, dim, 1 > VectorDimD
Definition FCClattice.h:37
LatticeVector< dim > LatticeVectorType
Definition FCClattice.h:39
TypeTraits< SingleCrystalBase< dim > >::PlaneNormalContainerType PlaneNormalContainerType
Definition FCClattice.h:42
TypeTraits< SingleCrystalBase< dim > >::SecondPhaseContainerType SecondPhaseContainerType
Definition FCClattice.h:44
bool isEnabledPlane(const std::string &planeStr) const
const std::set< std::string > enabledSecondPhases
bool isEnabledSlipSystem(const std::string &ssStr) const
vertex temp