Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
src/DefectiveCrystal/DefectiveCrystalBase.cpp
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * Additional contributors:
5 * Nicholas Huebner Julian <njulian@lanl.gov>
6 *
7 * MoDELib is distributed without any warranty under the
8 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
9 */
10
11#ifndef model_DefectiveCrystalBase_CPP_
12#define model_DefectiveCrystalBase_CPP_
13
18#include <CTM.h>
19#include <StrUtilities.h>
20#include <sstream>
21#include <algorithm>
22namespace model
23{
24
25 namespace
26 {
27 std::vector<std::string> parsePhysics(const std::string& input)
28 {
29 std::vector<std::string> result;
30 std::istringstream stream(input);
31 std::string name;
32 while(stream >> name)
33 {
35 if(name=="none")
36 {
37 continue;
38 }
39 if(name!="dislocationdynamics" && name!="clusterdynamics" && name!="elasticdeformation" && name!="inclusionmicrostructure")
40 {
41 throw std::runtime_error("Unknown physics '"+name+"'.");
42 }
43 if(std::find(result.begin(),result.end(),name)==result.end())
44 {
45 result.push_back(name);
46 }
47 }
48 return result;
49 }
50 }
51
52 template <int dim>
53 std::vector<Eigen::Matrix<double,dim,1>> getPeriodicShifts(const Eigen::Matrix<double,dim,Eigen::Dynamic>& shiftVectors,const std::vector<int>& periodicImageSize)
54 {
55 typedef Eigen::Matrix<double,dim,1> VectorDim;
56 std::vector<VectorDim> temp;
57 temp.push_back(VectorDim::Zero());
58 if(periodicImageSize.size())
59 {
60 std::cout<<"Box periodicity basis ("<<shiftVectors.size()<<") in columns:"<<std::endl<<shiftVectors<<std::endl;
61 if(shiftVectors.cols()!=int(periodicImageSize.size()))
62 {
63 std::cout<<"shiftVectors.size()="<<shiftVectors.size()<<std::endl;
64 std::cout<<"periodicImageSize.size()="<<periodicImageSize.size()<<std::endl;
65 throw std::runtime_error("shiftVectors.size() must equal periodicImageSize.size()");
66 }
67
68 for(int k=0;k<shiftVectors.cols();++k)
69 {
70 const auto shiftVector(shiftVectors.col(k));
71 const int imageSize(std::abs(periodicImageSize[k]));
72 std::vector<VectorDim> newTemp;
73 for(const auto& v:temp)
74 {// grab existing shift vectors
75 for(int i=-imageSize;i<=imageSize;++i)
76 {// add current shift times corresponding image size
77 newTemp.push_back(v+i*shiftVector);
78 }
79 }
80 temp.swap(newTemp);
81 }
82 }
83 return temp;
84 }
85
86 template <int _dim>
87 DefectiveCrystalBase<_dim>::DefectiveCrystalBase( const std::string& folderName) :
88 /* init */ simulationParameters( folderName)
89 /* init */,voigtTraits((typename SymmetricVoigtTraits<3>::VoigtSizeMatrixType()<<0,0,1,1,2,2,0,1,1,2,0,2).finished())
90 /* init */,meshOwner(std::make_shared<const SimplicialMesh<dim>>(simulationParameters.traitsIO.meshFile,
91 TextFileParser(simulationParameters.traitsIO.polyFile).readMatrix<double>("F",_dim,_dim,true),
92 TextFileParser(simulationParameters.traitsIO.polyFile).readMatrix<double>("X0",1,_dim,true).transpose(),
93 simulationParameters.periodicFaceIDs))
94 /* init */,mesh(*meshOwner)
95 /* init */,periodicImageSize(mesh.periodicBasis().cols()>0? TextFileParser(simulationParameters.traitsIO.dcFile).readArray<int>("periodicImageSize",true) : std::vector<int>())
96 /* init */,periodicLatticeBasis(mesh.periodicBasis())
99 /* init */,polyOwner(std::make_shared<const Polycrystal<dim>>(simulationParameters.traitsIO.polyFile,mesh))
100 /* init */,poly(*polyOwner)
101 /* init */,fe(simulationParameters.useFEM ? new FiniteElement<ElementType>(meshOwner) : nullptr)
102 /* init */,activePhysics(parsePhysics(simulationParameters.physics))
103 /* init */,dislocationDynamicsBase(hasPhysics("DislocationDynamics") ? std::make_shared<DislocationDynamicsBase<dim>>(meshOwner,polyOwner,periodicLatticeBasis,simulationParameters.traitsIO.dcFile) : nullptr)
104 /* init */,clusterDynamicsBase(hasPhysics("ClusterDynamics") ? std::make_shared<ClusterDynamicsBase<dim>>(*this) : nullptr)
105 /* init */,elasticDeformationBase(hasPhysics("ElasticDeformation") ? std::make_shared<ElasticDeformationBase<dim>>(*this) : nullptr)
106 {
107 if(!mesh.simplices().size())
108 {
109 throw std::runtime_error("Mesh is empty");
110 }
111
112 for(const auto& region : mesh.regions())
113 {
114 for(const auto& face : region.second->faces())
115 {
116 if(face.second->isExternal() && face.second->periodicFacePair.second)
117 {
118 const Eigen::Matrix<double,Eigen::Dynamic,1> pd(periodicLatticeReciprocalBasis.transpose()*face.second->periodicFacePair.first);
119 const Eigen::Matrix<double,Eigen::Dynamic,1> pn(pd.array().round());
120 if((pd-pn).norm()>FLT_EPSILON*pd.norm())
121 {
122 std::cout<<"region="<<region.second->regionID<<std::endl;
123 std::cout<<"face="<<face.second->sID<<std::endl;
124 std::cout<<"pd="<<pd.transpose()<<std::endl;
125 std::cout<<"pn="<<pn.transpose()<<std::endl;
126 throw std::runtime_error("Face shift must be an intiger combination of the periodicity vectors");
127 }
128 }
129 }
130 }
131
132 std::cout<<"periodicLatticeBasis="<<periodicLatticeBasis<<std::endl;
133 std::cout<<"periodicLatticeReciprocalBasis="<<periodicLatticeReciprocalBasis<<std::endl;
134 std::cout<<"periodicShifts("<<periodicShifts.size()<<")="<<std::endl;
135 for(const auto& shift : periodicShifts)
136 {
137 std::cout<<shift.transpose()<<std::endl;
138 }
139 }
140
141 template <int _dim>
143 {
144 const VectorDim dx(x-mesh.xCenter());
145 return periodicLatticeReciprocalBasis.transpose()*dx;
146 }
147
148 template<int dim>
149 bool DefectiveCrystalBase<dim>::hasPhysics(const std::string& name) const
150 {
151 return std::find(activePhysics.begin(),activePhysics.end(),StrUtilities::lowercase(name))!=activePhysics.end();
152 }
153
154 template<int dim>
156 {
158 {
159 throw std::runtime_error("DislocationDynamics physics is not enabled.");
160 }
162 }
163
164 template<int dim>
166 {
168 {
169 throw std::runtime_error("ClusterDynamics physics is not enabled.");
170 }
171 return *clusterDynamicsBase;
172 }
173
174 template<int dim>
176 {
178 {
179 throw std::runtime_error("ElasticDeformation physics is not enabled.");
180 }
182 }
183
184 template struct DefectiveCrystalBase<3>;
185
186} // namespace model
187#endif
the R vector(source to field) R
x
Definition int_R.m:12
std::vector< Eigen::Matrix< double, dim, 1 > > getPeriodicShifts(const Eigen::Matrix< double, dim, Eigen::Dynamic > &shiftVectors, const std::vector< int > &periodicImageSize)
Eigen::VectorXd periodicCoordinates(const VectorDim &x) const
DefectiveCrystalParameters simulationParameters
const std::vector< std::string > activePhysics
const std::shared_ptr< const Polycrystal< dim > > polyOwner
LagrangeElement< 3, 2 > ElementType
const Polycrystal< dim > & poly
const Eigen::Matrix< double, dim, Eigen::Dynamic > periodicLatticeBasis
const std::vector< int > periodicImageSize
const SymmetricVoigtTraits< dim > voigtTraits
const SimplicialMesh< dim > & mesh
ElasticDeformationBase< dim > & elasticDeformation() const
const std::shared_ptr< const SimplicialMesh< dim > > meshOwner
const std::shared_ptr< ElasticDeformationBase< dim > > elasticDeformationBase
const std::shared_ptr< ClusterDynamicsBase< dim > > clusterDynamicsBase
const std::vector< VectorDim > periodicShifts
const Eigen::Matrix< double, dim, Eigen::Dynamic > periodicLatticeReciprocalBasis
std::shared_ptr< FiniteElement< ElementType > > fe
DislocationDynamicsBase< dim > & dislocationDynamics() const
Eigen::Matrix< double, dim, 1 > VectorDim
const std::shared_ptr< DislocationDynamicsBase< dim > > dislocationDynamicsBase
ClusterDynamicsBase< dim > & clusterDynamics() const
static std::string lowercase(std::string text)
REAL dx
int k
int i
vertex temp
result
REAL v[4]