Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
ClusterDynamics.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_ClusterDynamics_cpp_
9#define model_ClusterDynamics_cpp_
10
11#ifdef _OPENMP
14#include <omp.h>
15#endif
16
17#include <ClusterDynamics.h>
18//#include <ExternalAndInternalBoundary.h>
19//#include <Fix.h>
20#include <DislocationNetwork.h>
22
23namespace model
24{
25
26 //template <int dim>
27 //struct BoundaryConcentration
28 //{
29 // const IrradiationClimbParameters<dim>& icp;
30 // const Eigen::Matrix<double,dim,dim>& stress;
31 //
32 // /**********************************************************************/
33 // BoundaryConcentration(const IrradiationClimbParameters<dim>& icp_in,const Eigen::Matrix<double,dim,dim>& stress_in) :
34 // /* */ icp(icp_in)
35 // /* */,stress(stress_in)
36 // {
37 //
38 // }
39 //
40 // /**********************************************************************/
41 // template <typename NodeType,int dofPerNode>
42 // Eigen::Matrix<double,dofPerNode,1> operator()(const NodeType& node,
43 // Eigen::Matrix<double,dofPerNode,1>& val) const
44 // {
45 //
46 // const auto v1(icp.equilibriumClusterConcentration(stress.trace()));
47 //
48 // const auto outNormal(node.outNormal()); // used to compute traction
49 // const double tn = outNormal.dot(stress*outNormal);
50 //
51 // val=(v1.array()*exp(-tn*icp.omega/icp.kB/icp.T*icp.speciesVector)).matrix().transpose();
52 //
53 // return val;
54 //
55 // }
56 //
57 //};
58
59template <int dim>
61{
62 typedef typename UniformControllerType::MatrixVoigt MatrixVoigt;
63 typedef typename UniformControllerType::VectorVoigt VectorVoigt;
64
66 for(const auto& pair : cdp.D)
67 {
68 MatrixVoigt C(MatrixVoigt::Zero());
69 const auto& grainID(pair.first);
70 for(size_t k=0;k<pair.second.size();++k)
71 {
72 const auto& Dm(pair.second[k]);
73 C.template block<dim,dim>(k*dim,k*dim)=Dm;
74 }
75
76 const auto f0(VectorVoigt::Zero()); // flux
77 const auto f0Dot(VectorVoigt::Zero()); // flux rate
78 const auto g0(VectorVoigt::Zero()); // Concentration gradient
79 const auto g0Dot(VectorVoigt::Zero()); // Concentration gradient rate
80 const auto stiffnessRatio(VectorVoigt::Ones()*1.0e20); // impose concentration gradient
81 const double t0(0.0);
82
83 temp.emplace(grainID,new UniformControllerType(t0,C,stiffnessRatio,g0,g0Dot,f0,f0Dot));
84 }
85 return temp;
86}
87
88
89 template<int dim>
91 /* init */ MicrostructureBase<dim>("ClusterDynamics",mc)
92 /* init */,cdp(this->microstructures.ddBase.clusterDynamics())
93// /* init */,ClusterDynamicsBase<dim>(this->microstructures.ddBase)
94 // /* init */,useClusterDynamicsFEM(this->microstructures.ddBase.clusterDynamics().useClusterDynamicsFEM)
95 /* init */,useClusterDynamicsFEM(this->microstructures.ddBase.clusterDynamics().useClusterDynamicsFEM)
96// /* init */,useClusterDynamicsFEM(this->microstructures.ddBase.clusterDynamics().useClusterDynamicsFEM)
97 /* init */,clusterDynamicsFEM(useClusterDynamicsFEM? new ClusterDynamicsFEM<dim>(this->microstructures.ddBase,cdp) : nullptr)
99// /* init */,mobileClustersIncrement(this->microstructures.ddBase.fe->template trial<'d',mSize>())
100// /* init */,dV(this->microstructures.ddBase.fe->template domain<EntireDomain,dVorder,GaussLegendre>())
101// /* init */,mBWF((test(this->mobileGrad),-this->microstructures.ddBase.poly.Omega*this->mobileFlux)*dV)
102// /* init */,dmBWF((test(grad(mobileClustersIncrement)),-this->microstructures.ddBase.poly.Omega*(FluxMatrix<dim>(this->cdp)*grad(mobileClustersIncrement)))*dV)
103// /* init */,mSolver(true,FLT_EPSILON)
105// /* init */,cascadeGlobalProduction(((test(clusterDynamicsFEM->mobileClusters),make_constant(this->cdp.G))*dV)->globalVector())
107 {
108// mobileClustersIncrement->setConstant(Eigen::Matrix<double,mSize,1>::Zero());
109// std::cout<<cascadeGlobalProduction<<std::endl;
110 }
111
112
113
114 template<int dim>
115 void ClusterDynamics<dim>::initializeConfiguration(const DefectiveCrystalConfigIO<dim>& configIO,const std::ofstream& f_file,const std::ofstream& F_labels)
116 {
117 this->lastUpdateTime=this->microstructures.ddBase.simulationParameters.totalTime;
118
120 {
121 clusterDynamicsFEM->initializeConfiguration(configIO,f_file,F_labels);
122 }
123 else
124 {// nothing to initialize for uniformControllers
125
126 }
127 }
128
129template<int dim>
131{
132
133 auto& fem=*clusterDynamicsFEM;
134 Eigen::VectorXd offset=Eigen::VectorXd::Zero(fem.mobileClusters->gSize());
135 std::map<size_t,double> prescribed;
136 std::set<size_t> periodicNodes;
137 for(const auto& pair : fem.mobileClusters->fe().periodicNodePairs())
138 {
139 periodicNodes.insert(pair.source);
140 periodicNodes.insert(pair.sink);
141 }
142 for(const auto& node : fem.mobileClusters->fe().nodes())
143 {
144 const auto sink=fem.sinkNormals.find(node.gID);
145 // Nonlinear positivity checks require the known concentration throughout the domain.
146 if(!cdp.computeReactions && sink==fem.sinkNormals.end() && !periodicNodes.count(node.gID))
147 {
148 continue;
149 }
150 VectorMSize otherConcentration=VectorMSize::Zero();
151 for(const auto& microstructure : this->microstructures)
152 {
153 if(microstructure.get()!=static_cast<const MicrostructureBase<dim>*>(this))
154 {
155 otherConcentration+=microstructure->mobileConcentration(node.P0,&node,nullptr,nullptr);
156 }
157 }
158 offset.template segment<mSize>(mSize*node.gID)=-otherConcentration;
159 if(sink!=fem.sinkNormals.end())
160 {
161 const MatrixDim sigma=this->microstructures.stress(node.P0,&node,nullptr,nullptr);
162 double normalTraction=0.0;
163 for(const auto& normal : sink->second)
164 {
165 normalTraction+=normal.dot(sigma*normal)/double(sink->second.size());
166 }
167 const auto concentration=cdp.boundaryMobileConcentration(sigma.trace(),normalTraction);
168 for(int c=0;c<mSize;++c)
169 {
170 prescribed.emplace(mSize*node.gID+c,concentration(c)-otherConcentration(c));
171 }
172 }
173 }
174 fem.mobileClusters->setPeriodicNodalOffset(offset);
175 fem.mobileClusters->dirichletConditions()=std::move(prescribed);
176}
177
178 template<int dim>
180 {
182 {
183 if(!clusterDynamicsFEM->solverInitialized)
184 {
185 clusterDynamicsFEM->initializeSolver();
186 }
187 std::cout<<", mobile BCs"<<std::flush;
189
190 auto DN(this->microstructures.template getUniqueTypedMicrostructure<DislocationNetwork<dim>>());
191 const bool hasDiscreteLoops(DN? (DN->loops().size()>0? true : false) : false);
192 clusterDynamicsFEM->solve(hasDiscreteLoops);
193 }
194 else
195 {
196
197 }
198 }
199
200 template<int dim>
202 {
203 solve();
204 }
205
206 template<int dim>
208 {
210 {
211 auto DN(this->microstructures.template getUniqueTypedMicrostructure<DislocationNetwork<dim>>());
212 const bool hasDiscreteLoops(DN? (DN->loops().size()>0 ? true : false) : false);
213 const double dt(this->microstructures.getDt());
214
215 if constexpr (iSize > 0)
216 {
217 if(!hasDiscreteLoops)
218 {
219 clusterDynamicsFEM->updateImmobileClusters(dt);
220 }
221
222 // if(cdp.discretizationTime <= this->microstructures.ddBase.simulationParameters.totalTime && !hasDiscreteLoops)
223 // {
224 // std::cout << " initializing discrete climb loops, " << std::endl;
225 // initializeDiscreteClimbLoops();
226 // }
227 }
228 }
229 this->lastUpdateTime=this->microstructures.ddBase.simulationParameters.totalTime;
230 }
231
232 template<int dim>
234 {
235 return this->microstructures.ddBase.simulationParameters.dtMax;
236 }
237
238 template<int dim>
239 void ClusterDynamics<dim>::output(DefectiveCrystalConfigIO<dim>& configIO,DefectiveCrystalAuxIO<dim>& auxIO,std::ofstream& f_file,std::ofstream& F_labels) const
240 {
242 {
243 const size_t nNodes(clusterDynamicsFEM->mobileClusters->fe().nodes().size());
244 configIO.cdMatrix().resize(nNodes,mSize+iSize);
245 configIO.cdMatrix().block(0,0,nNodes,mSize)=clusterDynamicsFEM->mobileClusters->dofVector().reshaped(mSize,nNodes).transpose();
246 configIO.cdMatrix().block(0,mSize,nNodes,iSize)=clusterDynamicsFEM->immobileClusters->dofVector().reshaped(iSize,nNodes).transpose();
247 }
248 else
249 {
250
251 }
252 }
253
254 template<int dim>
255 typename ClusterDynamics<dim>::VectorDim ClusterDynamics<dim>::inelasticDisplacementRate(const VectorDim& x, const NodeType* const node, const ElementType* const ele,const SimplexDim* const guess) const
256 {
258 {
259 return clusterDynamicsFEM->inelasticDisplacementRate(x,node,ele,guess);
260 }
261 else
262 {
263 return VectorDim::Zero();
264 }
265 }
266
267 template<int dim>
269 {
271 {
272 return clusterDynamicsFEM->averageBetaP()+clusterDynamicsFEM->averageBetaV();
273 }
274 else
275 {
276 return MatrixDim::Zero();
277 }
278 }
279
280 template<int dim>
282 {
283 return MatrixDim::Zero();
284 }
285
286 template<int dim>
288 {
289 return VectorDim::Zero();
290 }
291
292 template<int dim>
293 typename ClusterDynamics<dim>::MatrixDim ClusterDynamics<dim>::stress(const VectorDim&,const NodeType* const,const ElementType* const,const SimplexDim* const) const
294 {
295 return MatrixDim::Zero();
296 }
297
298 template<int dim>
299 typename ClusterDynamics<dim>::VectorMSize ClusterDynamics<dim>::mobileConcentration(const VectorDim& x,const NodeType* const node,const ElementType* const ele,const SimplexDim* const guess) const
300 {
301 if(uniformControllers.size())
302 {
303 const auto pointGrains(this->pointGrains(x,node,ele,guess));
304 VectorMSize averageVal(VectorMSize::Zero());
305 for(const auto& grain : pointGrains)
306 {
307 const auto grainID(grain->grainID);
308 const auto& controller(uniformControllers.at(grainID));
309 averageVal += controller->grad(this->microstructures.ddBase.simulationParameters.totalTime).reshaped(dim,mSize).transpose()*x;
310 }
311 return averageVal/pointGrains.size();
312 }
313 else
314 {
315 if(node)
316 {
317 return (*eval(clusterDynamicsFEM->mobileClusters))(*node);
318 }
319 else
320 {
321 if(ele)
322 {
323 return (*eval(clusterDynamicsFEM->mobileClusters))(*ele,ele->simplex.pos2bary(x));
324 }
325 else
326 {
327 return (*eval(clusterDynamicsFEM->mobileClusters))(x,guess);
328 }
329 }
330 }
331 }
332
333 template<int dim>
334 typename ClusterDynamics<dim>::VectorISize ClusterDynamics<dim>::immobileClusters(const VectorDim& x,const NodeType* const node,const ElementType* const ele,const SimplexDim* const guess) const
335 {
336 if(node)
337 {
338 return (*eval(clusterDynamicsFEM->immobileClusters))(*node);
339 }
340 else
341 {
342 if(ele)
343 {
344 return (*eval(clusterDynamicsFEM->immobileClusters))(*ele,ele->simplex.pos2bary(x));
345 }
346 else
347 {
348 return (*eval(clusterDynamicsFEM->immobileClusters))(x,guess);
349 }
350 }
351 }
352
353
354 template<int dim>
356 {
357 return MatrixDim::Zero();
358 }
359
360
361 // template<int dim>
362 // std::set<const Simplex<dim,dim>*> ClusterDynamics<dim>::vertexSetNeighbors(const std::set<const Simplex<dim,dim>*>& inSet, const std::set<const Simplex<dim,dim>*>& usedEle) const
363 // {
364 // std::set<const Simplex<dim,dim>*> outSet;
365 // for(const auto& tet : inSet)
366 // {
367 // const auto neighbors(tet->vertexNeighbors());
368 // for(const auto& neighbor : neighbors)
369 // {
370 // if(usedEle.find(neighbor)==usedEle.end())
371 // {
372 // outSet.insert(neighbor);
373 // }
374 // }
375 // }
376 // return outSet;
377 // }
378
379 // template<int dim>
380 // std::pair<double,double> ClusterDynamics<dim>::groupNi(const std::set<const Simplex<dim,dim>*>& inSet, const int &k) const
381 // {
382 // double nIT(0.0);
383 // double cIT(0.0);
384 // for(const auto& tet : inSet)
385 // {
386 // const auto& ele(this->microstructures.ddBase.fe->elements().at(tet->xID));
387 // Eigen::Matrix<double,dim+1,1> bary(Eigen::Matrix<double,dim+1,1>::Constant(0.25));
388 // const Eigen::Matrix<double,iSize,1> sinkValue((*eval(clusterDynamicsFEM->immobileClusters))(ele,bary));
389 // // ADDED A CORRECTED SINK VALUE HERE -> SOME BARYCENTERS HAVE NEGATIVE VALUES, BUT NODES WERE NOT NEGATIVE
390 // Eigen::Matrix<double,iSize,1> correctedSinkValue(sinkValue);
391 // for(int dof=0;dof<iSize/2;dof++)
392 // { // Corrected sink strength is to adjust for negative values at the barycenter of the quadratic elements where we have a sharp gradient of sink values between two end nodes
393 // const double cmin = cdp.n_min(dof)*cdp.omega*correctedSinkValue(dof);
394 // if(correctedSinkValue(iSize/2+dof)<cmin)
395 // { // defect size cannot be smaller than a minimal value
396 // correctedSinkValue(iSize/2+dof)=cmin;
397 // }
398 // }
399 // const auto cI(correctedSinkValue.template block<iSize/2,1>(iSize/2,0));
400 // const auto nI(correctedSinkValue.template block<iSize/2,1>(0,0));
401 // // const auto cI(sinkValue.template block<iSize/2,1>(iSize/2,0));
402 // // const auto nI(sinkValue.template block<iSize/2,1>(0,0));
403 // nIT+=nI(k)*tet->vol0;
404 // cIT+=cI(k)*tet->vol0/cdp.omega;
405 // }
406 // return std::make_pair(nIT,cIT);
407 // }
408
409 // template<int dim>
410 // void ClusterDynamics<dim>::initializeDiscreteClimbLoops()
411 // {
412 // if constexpr (iSize == 0)
413 // {
414 // return;
415 // }
416 // else
417 // {
418 // std::default_random_engine generator;
419 // auto DN(this->microstructures.template getUniqueTypedMicrostructure<DislocationNetwork<dim>>());
420
421 // for(int k=0; k < iSize/2; ++k)
422 // { //Iteration species-wise
423 // // for(const auto& ele : this->microstructures.ddBase.fe->elements())
424 // // {
425 // // Eigen::Matrix<double,dim+1,1> bary(Eigen::Matrix<double,dim+1,1>::Constant(0.25));
426 // // const Eigen::Matrix<double,iSize,1> sinkValue((*eval(clusterDynamicsFEM->immobileClusters))(ele.second,bary));
427 // // const auto cI(sinkValue.template block<iSize/2,1>(iSize/2,0));
428 // // if(cI(0)>0)
429 // // {
430 // // std::cout<< "ClusterDynamics: Negative concentration for species " << k << " in element " << ele.first << ". Concentration: " << cI(k) << std::endl;
431 // // }
432 // // }
433 // double tetSize(0.0);
434 // std::multimap<double,const ElementType* const> CiMap; //Create Map
435 // for(const auto& ele : this->microstructures.ddBase.fe->elements())
436 // {
437 // Eigen::Matrix<double,dim+1,1> bary(Eigen::Matrix<double,dim+1,1>::Constant(0.25));
438 // const Eigen::Matrix<double,iSize,1> sinkValue((*eval(clusterDynamicsFEM->immobileClusters))(ele.second,bary));
439 // const auto cI(sinkValue.template block<iSize/2,1>(iSize/2,0));
440 // const auto cT(cI*ele.second.simplex.vol0/cdp.omega);
441 // CiMap.emplace(cT(k),&ele.second);
442 // }
443 // std::set<const Simplex<dim,dim>*> usedEle;
444 // for(typename std::multimap<double,const ElementType* const>::reverse_iterator rIter=CiMap.rbegin(); rIter!=CiMap.rend(); rIter++)
445 // {
446 // const ElementType* const ele(rIter->second);
447 // if(usedEle.find(&ele->simplex)==usedEle.end())
448 // {
449 // std::set<const Simplex<dim,dim>*> currentTets;
450 // currentTets.insert(&(ele->simplex));
451 // auto NiCiK(groupNi(currentTets,k));
452 // size_t currentTetsOldSize(currentTets.size());
453 // while(NiCiK.first<cdp.discretizationFactor)
454 // { //If not enough defects to create a loop, grab neighboring elements
455 // currentTets=vertexSetNeighbors(currentTets,usedEle);
456 // NiCiK=groupNi(currentTets,k);
457 // if(currentTets.size()==currentTetsOldSize)
458 // {
459 // break;
460 // }
461 // else
462 // {
463 // currentTetsOldSize=currentTets.size();
464 // }
465 // }
466
467 // for(const auto &tet : currentTets)
468 // {
469 // usedEle.insert(tet);
470 // }
471 // tetSize+=currentTets.size();
472
473 // const double radius(sqrt(NiCiK.second*cdp.omega/(M_PI*cdp.b*cdp.immobileSpeciesBurgersMagnitude(k))));
474 // Eigen::Matrix<double,dim+1,1> bary(Eigen::Matrix<double,dim+1,1>::Constant(0.25));
475 // const auto &grain(this->microstructures.ddBase.poly.grains.at(ele->simplex.region->regionID));
476 // std::uniform_int_distribution<int> tetDistribution(0,currentTets.size()-1);
477 // auto tetIter(currentTets.begin());
478 // std::advance(tetIter,tetDistribution(generator));
479 // const VectorDim b(grain->latticeBasis*cdp.immobileSpeciesBurgers.col(k));
480 // const ReciprocalLatticeDirection<dim> n(grain->reciprocalLatticeDirection(b));
481 // VectorDim tetCenter((*tetIter)->bary2pos(bary).transpose());
482
483 // bool insertedLoop(false);
484 // while(!insertedLoop)
485 // {
486 // const long int planeIndex(n.closestPlaneIndexOfPoint(tetCenter));
487 // GlidePlaneKey<dim> glidePlaneKey(planeIndex,n);
488 // std::shared_ptr<PeriodicGlidePlane<dim>> periodicGlidePlane(this->microstructures.ddBase.dislocationDynamics().periodicGlidePlaneFactory.get(glidePlaneKey));
489 // const VectorDim loopCenter(periodicGlidePlane->referencePlane->snapToPlane(tetCenter));
490 // std::vector<VectorDim> pts;
491 // if(radius > cdp.minimumLoopSize)
492 // {
493 // const int loopSides(12);
494 // for(int j=0; j<loopSides; ++j)
495 // {
496 // Eigen::Matrix<double,2,1> pLocal(std::cos(2.0*M_PI/loopSides*j),std::sin(2.0*M_PI/loopSides*j));
497 // Eigen::Matrix<double,3,1> pGlobal(periodicGlidePlane->referencePlane->globalPosition(radius*pLocal) - periodicGlidePlane->referencePlane->P + loopCenter);
498 // if(this->microstructures.ddBase.poly.mesh.searchRegionWithGuess(pGlobal,&ele->simplex).first)
499 // {
500 // pts.push_back(pGlobal);
501 // }
502 // else
503 // {
504 // break;
505 // }
506 // }
507 // if(pts.size()==loopSides)
508 // {
509 // insertedLoop=true;
510 // VectorDim nA(VectorDim::Zero());
511 // for(size_t k=0; k<pts.size(); ++k)
512 // {
513 // nA += 0.5 * (pts[k]-pts.front()).cross((pts[(k+1)%pts.size()]-pts[k]));
514 // }
515 // const double trBetaLoop(-b.dot(nA.normalized()));
516 // const int signedb(cdp.immobileSpeciesVector(k)/abs(cdp.immobileSpeciesVector(k))); //negative for vacancy, positive for interstitial loops
517 // const VectorDim loopBurgers((trBetaLoop * signedb > 0)? b : -b);
518
519 // auto newLoop(DN->loops().create(loopBurgers, this->microstructures.ddBase.dislocationDynamics().glidePlaneFactory.getFromKey(glidePlaneKey)));
520 // std::vector<std::shared_ptr<DislocationLoopNode<dim>>> loopNodes;
521 // for(const auto &pGlobal:pts)
522 // {
523 // auto newNetNode(DN->networkNodes().create(pGlobal));
524 // const auto periodicPatch(newLoop->periodicGlidePlane? newLoop->periodicGlidePlane->patches().getFromKey(VectorDim::Zero()) : nullptr);
525 // const auto periodicPlaneEdge(std::make_pair(nullptr,nullptr));
526 // loopNodes.push_back(DN->loopNodes().create(newLoop,newNetNode,pGlobal,periodicPatch,periodicPlaneEdge));
527 // }
528 // // const int bdn(loopBurgers.dot(nA.normalized()));
529 // // std::cout<<"Species: "<<k<<"b dot n: "<< bdn <<std::endl;
530 // DN->insertLoop(newLoop, loopNodes);
531 // }
532 // else
533 // {
534 // // std::cout<< "Some Nodes outside of Mesh: "<<std::endl;
535 // const VectorDim regionCenter(grain->region.regionCenter());
536 // tetCenter+=(0.1)*(regionCenter-tetCenter);
537 // }
538 // }
539 // }
540 // }
541 // }
542 // }
543 // // std::cout<<"Removing values for continuous immobile clusters"<<std::endl;
544 // for(size_t nodeID=0; nodeID<clusterDynamicsFEM->immobileClusters->nodeSize(); nodeID++)
545 // {
546 // for(int dof=0; dof<iSize; dof++)
547 // {
548 // // clusterDynamicsFEM->immobileClusters->dofVector()(iSize*nodeID+dof)=1e-33;
549 // TrialBase<typename ClusterDynamicsFEM<dim>::ImmobileTrialType>::dofVector()(iSize*nodeID+dof)=1e-33;
550 // }
551 // }
552
553 // }
554
555 // }
556
557
558
559 template struct ClusterDynamics<3>;
560}
561#endif
562
563
564//template<int dim>
565//void ClusterDynamics<dim>::solveDiffusiveDisplacement()
566//{
567// std::cout<<"Solving diffusiveDisplacementRate..."<<std::flush;
568// const auto t0= std::chrono::system_clock::now();
569// diffusiveDisplacementRate=Eigen::VectorXd::Zero(this->diffusiveDisplacement.gSize());
570// for(const auto& node: this->microstructures.ddBase.fe->nodes())
571// {
572// const Eigen::Matrix<double,dim*mSize,1> speciesFlux((*eval(this->mobileFlux))(node));
573// Eigen::Matrix<double,dim,1> netFlux(Eigen::Matrix<double,dim,1>::Zero());
574// for(int i=0; i<mSize; i++)
575// {
576// const int mSgn(this->cdp.msVector(i)/std::abs(this->cdp.msVector(i)));
577// netFlux+= speciesFlux.template block<dim,1>(i*dim,0)*mSgn;
578// }
579// diffusiveDisplacementRate.template segment<dim>(dim*node.gID)=netFlux;
580// }
581// std::cout<<magentaColor<<" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" sec]"<<defaultColor<<std::endl;
582//
583//}
const Simplex< dim, dim > & simplex
A const reference to the Simplex that this element refers to.
Eigen::Matrix< double, dim+1, 1 > pos2bary(const Eigen::Matrix< double, dim, 1 > &P) const
Definition Simplex.cpp:374
c
Definition int_R.m:15
x
Definition int_R.m:12
auto eval(const std::shared_ptr< T > &t)
void updateConfiguration() override
VectorDim displacement(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
const ClusterDynamicsParameters< dim > & cdp
static constexpr int iSize
double getDt() const override
UniformControllerContainerType uniformControllers
MicrostructureBase< dim >::ElementType ElementType
VectorMSize mobileConcentration(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
MicrostructureBase< dim >::VectorISize VectorISize
static UniformControllerContainerType getUniformControllers(const DefectiveCrystalBase< dim > &ddBase, const ClusterDynamicsParameters< dim > &cdp)
MicrostructureBase< dim >::VectorMSize VectorMSize
MatrixDim averageStress() const override
const std::unique_ptr< ClusterDynamicsFEM< dim > > clusterDynamicsFEM
static constexpr int mSize
MicrostructureBase< dim >::MatrixDim MatrixDim
MatrixDim stress(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
MatrixDim averagePlasticDistortionRate() const override
VectorDim inelasticDisplacementRate(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
void initializeConfiguration(const DefectiveCrystalConfigIO< dim > &configIO, const std::ofstream &f_file, const std::ofstream &F_labels) override
MicrostructureContainer< dim > MicrostructureContainerType
MatrixDim averagePlasticDistortion() const override
MicrostructureBase< dim >::SimplexDim SimplexDim
ClusterDynamics(MicrostructureContainerType &mc)
UniformController< mSize *dim > UniformControllerType
VectorISize immobileClusters(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
MicrostructureBase< dim >::NodeType NodeType
void output(DefectiveCrystalConfigIO< dim > &configIO, DefectiveCrystalAuxIO< dim > &auxIO, std::ofstream &f_file, std::ofstream &F_labels) const override
MicrostructureBase< dim >::VectorDim VectorDim
std::map< size_t, const std::unique_ptr< UniformControllerType > > UniformControllerContainerType
std::set< const Grain< dim > * > pointGrains(const VectorDim &x, const NodeType *const node, const ElementType *const ele, const SimplexDim *const guess) const
MicrostructureBase(const std::string &tag_in, MicrostructureContainer< dim > &m_in)
MicrostructureContainerType & microstructures
Eigen::Matrix< double, voigtSize, 1 > VectorVoigt
Eigen::Matrix< double, voigtSize, voigtSize > MatrixVoigt
REAL t0
int k
vertex temp