Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
src/DefectiveCrystal/DefectiveCrystal.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#ifndef model_DefectiveCrystal_cpp_
9#define model_DefectiveCrystal_cpp_
10
12#include <ElasticDeformation.h>
13#include <ClusterDynamics.h>
14#include <DislocationNetwork.h>
16#include <StrUtilities.h>
17
18namespace model
19{
20 template <int _dim>
22 /* init */ MicrostructureContainerType(ddBase_in)
23 /* init */,f_file(this->ddBase.simulationParameters.traitsIO.fFile,std::ios_base::app)
24 /* init */,F_labels(this->ddBase.simulationParameters.traitsIO.flabFile,std::ios_base::app)
25 {
26 if (!f_file.is_open())
27 {
28 throw std::runtime_error("Cannot open file "+this->ddBase.simulationParameters.traitsIO.fFile);
29 }
30 if (!F_labels.is_open())
31 {
32 throw std::runtime_error("Cannot open file "+this->ddBase.simulationParameters.traitsIO.flabFile);
33 }
34
35
36
37 const auto& physics(this->ddBase.activePhysics);
38 const std::string availablePhysics("DislocationDynamics, ClusterDynamics, ElasticDeformation, InclusionMicrostructure");
39 for(const auto& phys : physics)
40 {
41 const std::string lowerPhys(StrUtilities::lowercase(phys));
42 if(lowerPhys=="none")
43 {// placeholder value of the template Library/DefectiveCrystal/DefectiveCrystal.txt
44 continue;
45 }
46 else if(lowerPhys=="inclusionmicrostructure")
47 {
49 {
50 this->emplace_back(new InclusionMicrostructureType(*this));
51 }
52 }
53 else if(lowerPhys=="dislocationdynamics")
54 {
56 {
57 this->emplace_back(new DislocationNetworkType(*this));
58 }
59 }
60 else if(lowerPhys=="clusterdynamics")
61 {
62 if(this->template getUniqueTypedMicrostructure<ClusterDynamicsType>()==nullptr)
63 {
64 this->emplace_back(new ClusterDynamicsType(*this));
65 }
66 }
67 else if(lowerPhys=="elasticdeformation")
68 {
70 {
71 this->emplace_back(new ElasticDeformationType(*this));
72 }
73 }
74 else
75 {
76 throw std::runtime_error("Unknown physics '"+phys+"' in "+this->ddBase.simulationParameters.traitsIO.dcFile+". Available physics (separated by spaces): "+availablePhysics+".");
77 }
78 }
79 if(this->empty())
80 {
81 throw std::runtime_error("No physics selected. Set physics= in "+this->ddBase.simulationParameters.traitsIO.dcFile+" to one or more of (separated by spaces): "+availablePhysics+".");
82 }
83
84// if(this->ddBase.simulationParameters.useInclusions)
85// {
86// this->emplace_back(new InclusionMicrostructureType(*this));
87// }
88// if(this->ddBase.simulationParameters.useDislocations)
89// {
90// this->emplace_back(new DislocationNetworkType(*this));
91// }
92// if(this->ddBase.simulationParameters.useClusterDynamics)
93// {
94// this->emplace_back(new ClusterDynamicsType(*this));
95// }
96// if(this->ddBase.simulationParameters.useElasticDeformation)
97// {
98// this->emplace_back(new ElasticDeformationType(*this));
99// }
100
101// std::cout<<"Defective Crystal Done Constructor"<<std::endl;
102 }
103
104 template <int _dim>
106 {
107 this->initializeConfiguration(configIO,f_file,F_labels);
108 }
109
110 template <int _dim>
112 {
113 std::cout<<"\n"<<blueBoldColor<< "runID="<<this->ddBase.simulationParameters.runID<<" (of "<<this->ddBase.simulationParameters.Nsteps<<")"
114 /* */<< ", time="<<this->ddBase.simulationParameters.totalTime<<defaultColor<<std::endl;
115
116 this->solve();
117 for(int r=0;r<this->ddBase.simulationParameters.maxResolveSteps;++r)
118 {
119 this->reSolve();
120 }
121 this->ddBase.simulationParameters.dt=this->getDt();
122
123 if (!(this->ddBase.simulationParameters.runID%this->ddBase.simulationParameters.outputFrequency))
124 {
125 DefectiveCrystalConfigIO<dim> configIO(this->ddBase.simulationParameters.traitsIO.configFolder);
126 DefectiveCrystalAuxIO<dim> auxIO(this->ddBase.simulationParameters.traitsIO.auxFolder);
127
128 f_file<< this->ddBase.simulationParameters.runID<<" "<<std::setprecision(15)<<std::scientific<<this->ddBase.simulationParameters.totalTime<<" "<<this->ddBase.simulationParameters.dt<<" ";
129
130 const Eigen::Matrix<double,dim,dim> pD(this->averagePlasticDistortion());
131 f_file<<pD.row(0)<<" "<<pD.row(1)<<" "<<pD.row(2)<<" "<<pD.trace()<<" "<<pD.norm()<<" ";
132
133 const Eigen::Matrix<double,dim,dim> pDR(this->averagePlasticDistortionRate());
134 f_file<<pDR.row(0)<<" "<<pDR.row(1)<<" "<<pDR.row(2)<<" "<<pDR.trace()<<" "<<pDR.norm()<<" ";
135
136 if(this->ddBase.simulationParameters.runID==0)
137 {
138 F_labels<<"runID\n";
139 F_labels<<"time [b/cs]\n";
140 F_labels<<"dt [b/cs]\n";
141
142 F_labels<<"betaP_11\n";
143 F_labels<<"betaP_12\n";
144 F_labels<<"betaP_13\n";
145 F_labels<<"betaP_21\n";
146 F_labels<<"betaP_22\n";
147 F_labels<<"betaP_23\n";
148 F_labels<<"betaP_31\n";
149 F_labels<<"betaP_32\n";
150 F_labels<<"betaP_33\n";
151 F_labels<<"tr(betaP)\n";
152 F_labels<<"norm(betaP)\n";
153
154 F_labels<<"dotBetaP_11 [cs/b]\n";
155 F_labels<<"dotBetaP_12 [cs/b]\n";
156 F_labels<<"dotBetaP_13 [cs/b]\n";
157 F_labels<<"dotBetaP_21 [cs/b]\n";
158 F_labels<<"dotBetaP_22 [cs/b]\n";
159 F_labels<<"dotBetaP_23 [cs/b]\n";
160 F_labels<<"dotBetaP_31 [cs/b]\n";
161 F_labels<<"dotBetaP_32 [cs/b]\n";
162 F_labels<<"dotBetaP_33 [cs/b]\n";
163 F_labels<<"tr(dotBetaP) [cs/b]\n";
164 F_labels<<"norm(dotBetaP) [cs/b]\n";
165 }
166
167 this->output(configIO,auxIO,f_file,F_labels);
168 f_file<<std::endl;
169
170 if(this->ddBase.simulationParameters.runID==0)
171 {
172 F_labels<<std::flush;
173 }
174 configIO.write(this->ddBase.simulationParameters.runID,this->ddBase.simulationParameters.outputBinary);
175 auxIO.write(this->ddBase.simulationParameters.runID,this->ddBase.simulationParameters.outputBinary);
176 }
177
178 // updateConfiguration
179 this->updateConfiguration();
180
181 // Increment runID and time
182 this->ddBase.simulationParameters.totalTime+=this->ddBase.simulationParameters.dt;
183 ++this->ddBase.simulationParameters.runID;
184 }
185
186 template <int _dim>
188 {
190 const auto t0= std::chrono::system_clock::now();
191// this->updateConfiguration(); // added to compute right-handed normals. Now removed since DislocationNetwork::updateGeometry is called during initialization
192 while (this->ddBase.simulationParameters.runID<this->ddBase.simulationParameters.Nsteps)
193 {
195 }
196 std::cout<<greenBoldColor<<std::setprecision(3)<<std::scientific<<this->ddBase.simulationParameters.Nsteps<< " simulation steps completed in "<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" [sec]"<<defaultColor<<std::endl;
197 }
198
199 template <int _dim>
201 {
202 const auto ptrDN(this->template getUniqueTypedMicrostructure<DislocationNetwork<_dim>>());
203 if(ptrDN)
204 {
205 return *ptrDN;
206 }
207 else
208 {
209 throw std::runtime_error("Unique DislocationNetwork<_dim,0> does not exist");
210 return *ptrDN;
211 }
212 }
213
214
215 template class DefectiveCrystal<3>;
216}
217#endif
InclusionMicrostructure< dim > InclusionMicrostructureType
ClusterDynamics< dim > ClusterDynamicsType
DislocationNetwork< dim > DislocationNetworkType
ElasticDeformation< dim > ElasticDeformationType
DefectiveCrystal(DefectiveCrystalBase< _dim > &ddBase_in)
MicrostructureContainer< _dim > MicrostructureContainerType
void initializeConfiguration(const DefectiveCrystalConfigIO< dim > &configIO)
const DislocationNetwork< _dim > & dislocationNetwork() const
size_t InstanceCount< Derived >::count
static std::string greenBoldColor
static std::string defaultColor
static std::string blueBoldColor
void write(const size_t &runID, const bool &outputBinary)
std::shared_ptr< MicrostructureType > getUniqueTypedMicrostructure() const
MatrixDim averagePlasticDistortionRate() const override
MatrixDim averagePlasticDistortion() const override
void output(DefectiveCrystalConfigIO< dim > &configIO, DefectiveCrystalAuxIO< dim > &auxIO, std::ofstream &f_file, std::ofstream &F_labels) const override
static std::string lowercase(std::string text)
REAL t0
if(maxlen > 0.05 *(triorg[0] *triorg[0]+triorg[1] *triorg[1])+0.02)