Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
BCClattice.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_BCClattice_cpp_
10#define model_BCClattice_cpp_
11
12#include <BCClattice.h>
14#include <GlidePlaneNoise.h>
15
16namespace model
17{
18
19 Eigen::Matrix<double,3,3> BCClattice<3>::getLatticeBasis()
20 {
23 Eigen::Matrix<double,dim,dim> temp;
24 temp << -1.0, 1.0, 1.0,
25 /* */ 1.0, -1.0, 1.0,
26 /* */ 1.0, 1.0, -1.0;
27 return temp/sqrt(3.0);
28 }
29
31 const Lattice<dim>& lat)
32 {
35
36 LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
37 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
38 LatticeVectorType a3((VectorDimI()<<0,0,1).finished(),lat);
39 LatticeVectorType y((VectorDimI()<<-1,-1,-1).finished(),lat);
40
42
43 if( material.isEnabledPlane("{110}")
44 || material.isEnabledPlane("{101}")
45 || material.isEnabledPlane("{011}"))
46 {
47 temp.emplace(temp.size(),new GlidePlaneBase(a3,a1,nullptr));
48 temp.emplace(temp.size(),new GlidePlaneBase( y,a2,nullptr));
49 temp.emplace(temp.size(),new GlidePlaneBase(a2,a3,nullptr));
50 temp.emplace(temp.size(),new GlidePlaneBase( y,a1,nullptr));
51 temp.emplace(temp.size(),new GlidePlaneBase(a1,a2,nullptr));
52 temp.emplace(temp.size(),new GlidePlaneBase( y,a3,nullptr));
53 }
54 return temp;
55 }
56
58 const Lattice<dim>& lat,
59 const PlaneNormalContainerType& plN)
60 {
63
64 DislocationMobilitySelector mobilitySelector;
65
67
68 if(material.isEnabledSlipSystem("a/2<111>{110}"))
69 {
70 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_a/2<111>{110}",true));
71 const std::shared_ptr<DislocationMobility> mobility(mobilitySelector.getMobility(material,dislocationMobilityType));
72 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
73 const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
74
75 for(const auto& planeBase : plN)
76 {
77 if(std::fabs(planeBase.second->planeSpacing()-d110)<FLT_EPSILON)
78 {// a {110} plane
79 const auto& a1(planeBase.second->primitiveVectors.first);
80 const auto& a3(planeBase.second->primitiveVectors.second);
81
82 std::vector<RationalLatticeDirection<3>> slipDirs;
83 slipDirs.emplace_back(Rational( 1,1),a1);
84 slipDirs.emplace_back(Rational(-1,1),a1);
85 slipDirs.emplace_back(Rational( 1,1),a3);
86 slipDirs.emplace_back(Rational(-1,1),a3);
87
88 for(const auto& slipDir : slipDirs)
89 {
90 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility,planeNoise));
91 }
92 }
93 }
94 }
95
96 if(material.isEnabledSlipSystem("a<100>{110}"))
97 {
98 const std::string dislocationMobilityType(TextFileParser(material.materialFile).readString("mobility_a<100>{110}",true));
99 const std::shared_ptr<DislocationMobility> mobility110(mobilitySelector.getMobility(material,dislocationMobilityType));
100 std::shared_ptr<GlidePlaneNoise> planeNoise(new GlidePlaneNoise(material));
101 const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
102
103 for(const auto& planeBase : plN)
104 {
105 if(std::fabs(planeBase.second->planeSpacing()-d110)<FLT_EPSILON)
106 {// a {110} plane
107 const auto& a1(planeBase.second->primitiveVectors.first);
108 const auto& a3(planeBase.second->primitiveVectors.second);
109
110 std::vector<RationalLatticeDirection<3>> slipDirs;
111 slipDirs.emplace_back(Rational( 1,1),a1+a3);
112 slipDirs.emplace_back(Rational(-1,1),a1+a3);
113
114 for(const auto& slipDir : slipDirs)
115 {
116 temp.emplace(temp.size(),new SlipSystem(*planeBase.second, slipDir,mobility110,planeNoise));
117 }
118 }
119 }
120 }
121
122
123 return temp;
124 }
125
127 const Lattice<dim>& lat,
128 const PlaneNormalContainerType& plN)
129 { LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
130 LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
131 LatticeVectorType a3((VectorDimI()<<0,0,1).finished(),lat);
132
134
135 for(const std::string& sp : material.enabledSecondPhases)
136 {
137 if(sp=="chi")
138 {
139 Eigen::Matrix<double,Eigen::Dynamic,2> waveVectors110(TextFileParser(material.materialFile).readMatrixCols<double>("chiWaveVectors110",2,true));
140 Eigen::Matrix<double,Eigen::Dynamic,3> fr110(TextFileParser(material.materialFile).readMatrixCols<double>("chiGammaSurfacePoints110",3,true));
141 const int rotSymm110(1);
142 const Eigen::Matrix<double,2,2> A110(GlidePlaneBase(a3,a1,nullptr).localBasis()*(Eigen::Matrix<double,2,2>()<<2, 1, 0, 1).finished());
143 std::vector<Eigen::Matrix<double,2,1>> mirSymm110 = {
144 (A110.col(1)).normalized(),
145 (A110.col(0)-A110.col(1)).normalized()
146 };
147
148 Eigen::Matrix<double,Eigen::Dynamic,3> f110(fr110);
149 f110.block(0,0,fr110.rows(),2) = (A110 * fr110.block(0,0,fr110.rows(),2).transpose()).transpose();
150 f110.col(2) = fr110.col(2) / (material.mu_SI * material.b_SI);
151
152 std::shared_ptr<GammaSurface> gammaSurface110(new GammaSurface(A110,waveVectors110,f110,rotSymm110,mirSymm110));
153 const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
154 std::map<const GlidePlaneBase*,std::shared_ptr<GammaSurface>> gsMap;
155 for(const auto& pn : plN)
156 {
157 if(std::abs(pn.second->planeSpacing()-d110)<FLT_EPSILON)
158 {
159 gsMap.emplace(pn.second.get(),gammaSurface110);
160 }
161 }
162 std::shared_ptr<SecondPhase<dim>> sp(new SecondPhase<dim>("chi",gsMap,plN));
163 temp.emplace(sp->sID,sp);
164 }
165 else if(sp=="sigma")
166 {
167 Eigen::Matrix<double,Eigen::Dynamic,2> waveVectors110(TextFileParser(material.materialFile).readMatrixCols<double>("sigmaWaveVectors110",2,true));
168 Eigen::Matrix<double,Eigen::Dynamic,3> fr110(TextFileParser(material.materialFile).readMatrixCols<double>("sigmaGammaSurfacePoints110",3,true));
169 const int rotSymm110(1);
170 const Eigen::Matrix<double,2,2> A110(GlidePlaneBase(a3,a1,nullptr).localBasis()*(Eigen::Matrix<double,2,2>()<<2, 1, 0, 1).finished());
171 std::vector<Eigen::Matrix<double,2,1>> mirSymm110 = {
172 (A110.col(1)).normalized(),
173 (A110.col(0)-A110.col(1)).normalized()
174 };
175
176 Eigen::Matrix<double,Eigen::Dynamic,3> f110(fr110);
177 f110.block(0,0,fr110.rows(),2) = (A110 * fr110.block(0,0,fr110.rows(),2).transpose()).transpose();
178 f110.col(2) = fr110.col(2) / (material.mu_SI * material.b_SI);
179
180 std::shared_ptr<GammaSurface> gammaSurface110(new GammaSurface(A110,waveVectors110,f110,rotSymm110,mirSymm110));
181 const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
182 std::map<const GlidePlaneBase*,std::shared_ptr<GammaSurface>> gsMap;
183 for(const auto& pn : plN)
184 {
185 if(std::abs(pn.second->planeSpacing()-d110)<FLT_EPSILON)
186 {
187 gsMap.emplace(pn.second.get(),gammaSurface110);
188 }
189 else
190 {
191 gsMap.emplace(pn.second.get(),nullptr);
192 }
193 }
194 std::shared_ptr<SecondPhase<dim>> sp(new SecondPhase<dim>("sigma",gsMap,plN));
195 temp.emplace(sp->sID,sp);
196 }
197
198 else
199 {
200 throw std::runtime_error("Unknown SecondPhase "+sp+" in BCC crystals.");
201 }
202 }
203 return temp;
204 }
205
206// typename BCClattice<3>::SecondPhaseContainerType BCClattice<3>::secondPhases(const PolycrystallineMaterialBase& material,
207// const Lattice<dim>& lat,
208// const PlaneNormalContainerType& plN)
209// { LatticeVectorType a1((VectorDimI()<<1,0,0).finished(),lat);
210// LatticeVectorType a2((VectorDimI()<<0,1,0).finished(),lat);
211// LatticeVectorType a3((VectorDimI()<<0,0,1).finished(),lat);
212//
213// SecondPhaseContainerType temp;
214//
215// for(const std::string& sp : material.enabledSecondPhases)
216// {
217// if(sp=="chi")
218// {
219// Eigen::Matrix<double,Eigen::Dynamic,2> waveVectors110(TextFileParser(material.materialFile).readMatrixCols<double>("chiWaveVectors110",2,true));
220// Eigen::Matrix<double,Eigen::Dynamic,3> fr110(TextFileParser(material.materialFile).readMatrixCols<double>("chiGammaSurfacePoints110",3,true));
221// const int rotSymm110(1);
222// const Eigen::Matrix<double,2,2> A110(2.0*GlidePlaneBase(a3,a1,nullptr).localBasis());
223// std::vector<Eigen::Matrix<double,2,1>> mirSymm110 = {
224// (A110.col(0)+A110.col(1)).normalized(),
225// (A110.col(0)-A110.col(1)).normalized()
226// };
227//
228// Eigen::Matrix<double,Eigen::Dynamic,3> f110(fr110);
229// f110.block(0,0,fr110.rows(),2) = (A110 * fr110.block(0,0,fr110.rows(),2).transpose()).transpose();
230// f110.col(2) = fr110.col(2) / (material.mu_SI * material.b_SI);
231//
232// std::shared_ptr<GammaSurface> gammaSurface110(new GammaSurface(A110,waveVectors110,f110,rotSymm110,mirSymm110));
233// const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
234// std::map<const GlidePlaneBase*,std::shared_ptr<GammaSurface>> gsMap;
235// for(const auto& pn : plN)
236// {
237// if(std::abs(pn.second->planeSpacing()-d110)<FLT_EPSILON)
238// {
239// gsMap.emplace(pn.second.get(),gammaSurface110);
240// }
241// }
242// std::shared_ptr<SecondPhase<dim>> sp(new SecondPhase<dim>("chi",gsMap,plN));
243// temp.emplace(sp->sID,sp);
244// }
245// else if(sp=="sigma")
246// {
247// Eigen::Matrix<double,Eigen::Dynamic,2> waveVectors110(TextFileParser(material.materialFile).readMatrixCols<double>("sigmaWaveVectors110",2,true));
248// Eigen::Matrix<double,Eigen::Dynamic,3> fr110(TextFileParser(material.materialFile).readMatrixCols<double>("sigmaGammaSurfacePoints110",3,true));
249// const int rotSymm110(1);
250// const Eigen::Matrix<double,2,2> A110(2.0*GlidePlaneBase(a3,a1,nullptr).localBasis());
251// std::vector<Eigen::Matrix<double,2,1>> mirSymm110 = {
252// (A110.col(0)+A110.col(1)).normalized(),
253// (A110.col(0)-A110.col(1)).normalized()
254// };
255//
256// Eigen::Matrix<double,Eigen::Dynamic,3> f110(fr110);
257// f110.block(0,0,fr110.rows(),2) = (A110 * fr110.block(0,0,fr110.rows(),2).transpose()).transpose();
258// f110.col(2) = fr110.col(2) / (material.mu_SI * material.b_SI);
259//
260// std::shared_ptr<GammaSurface> gammaSurface110(new GammaSurface(A110,waveVectors110,f110,rotSymm110,mirSymm110));
261// const double d110(lat.reciprocalLatticeDirection(lat.C2G*(VectorDimD()<<1.0,1.0,0.0).finished()).planeSpacing());
262// std::map<const GlidePlaneBase*,std::shared_ptr<GammaSurface>> gsMap;
263// for(const auto& pn : plN)
264// {
265// if(std::abs(pn.second->planeSpacing()-d110)<FLT_EPSILON)
266// {
267// gsMap.emplace(pn.second.get(),gammaSurface110);
268// }
269// }
270// std::shared_ptr<SecondPhase<dim>> sp(new SecondPhase<dim>("sigma",gsMap,plN));
271// temp.emplace(sp->sID,sp);
272// }
273//
274// else
275// {
276// throw std::runtime_error("Unnown SecondPhase "+sp+" in BCC crystals.");
277// }
278// }
279// return temp;
280// }
281
282} // namespace model
283#endif
ReciprocalLatticeDirectionType reciprocalLatticeDirection(const VectorDimD &d) const
const MatrixDimD C2G
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)
Eigen::Matrix< long int, dim, 1 > VectorDimI
Definition BCClattice.h:40
LatticeVector< dim > LatticeVectorType
Definition BCClattice.h:41
TypeTraits< SingleCrystalBase< dim > >::PlaneNormalContainerType PlaneNormalContainerType
Definition BCClattice.h:44
Eigen::Matrix< double, dim, 1 > VectorDimD
Definition BCClattice.h:39
TypeTraits< SingleCrystalBase< dim > >::SecondPhaseContainerType SecondPhaseContainerType
Definition BCClattice.h:46
TypeTraits< SingleCrystalBase< dim > >::SlipSystemContainerType SlipSystemContainerType
Definition BCClattice.h:45
std::shared_ptr< DislocationMobility > getMobility(const PolycrystallineMaterialBase &material, const std::string &tag) const
bool isEnabledPlane(const std::string &planeStr) const
const std::set< std::string > enabledSecondPhases
bool isEnabledSlipSystem(const std::string &ssStr) const
vertex temp