Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
src/DefectiveCrystal/MicrostructureBase.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_MicrostructureBase_cpp_
9#define model_MicrostructureBase_cpp_
10
11#ifdef _OPENMP
12#include <omp.h>
13#endif
14
15#include <fstream>
16#include <map>
21
22namespace model
23{
24 template <int dim>
26 /* init */ tag(tag_in)
27 /* init */,microstructures(m_in)
28 {
29 // The container's shared-base reference is not initialized during this constructor.
30 if(tag!="MicrostructureContainer" && !microstructures.ddBase.hasPhysics(tag))
31 {
32 throw std::runtime_error(tag+" physics is not enabled.");
33 }
34 }
35
36 template <int dim>
38 {
39 return microstructures.ddBase.simulationParameters.totalTime-lastUpdateTime;
40 }
41
42 template <int dim>
43 Eigen::Matrix<double,Eigen::Dynamic,dim> MicrostructureBase<dim>::displacement(Eigen::Ref<const Eigen::Matrix<double,Eigen::Dynamic,dim>> points) const
44 {
45 Eigen::Matrix<double,Eigen::Dynamic,dim> temp(Eigen::Matrix<double,Eigen::Dynamic,3>::Zero(points.rows(),dim));
46 #ifdef _OPENMP
47 #pragma omp parallel for
48 #endif
49 for(long int k=0;k<points.rows();++k)
50 {
51 temp.row(k)=displacement(points.row(k),nullptr,nullptr,nullptr);
52 }
53 return temp;
54 }
55
56template <int dim>
57std::vector<Eigen::Matrix<double,dim,dim>> MicrostructureBase<dim>::stress(Eigen::Ref<const Eigen::Matrix<double,Eigen::Dynamic,dim>> points) const
58{
59 std::vector<Eigen::Matrix<double,dim,dim>> temp(points.rows(),Eigen::Matrix<double,dim,dim>::Zero());
60 #ifdef _OPENMP
61 #pragma omp parallel for
62 #endif
63 for(long int k=0;k<points.rows();++k)
64 {
65 temp[k]=stress(points.row(k),nullptr,nullptr,nullptr);
66 }
67 return temp;
68}
69
70template <int dim>
71std::set<const Grain<dim>*> MicrostructureBase<dim>::pointGrains(const VectorDim& x, const NodeType* const node, const ElementType* const ele,const SimplexDim* const guess) const
72{
73 std::set<const Grain<dim>*> temp;
74 if(node)
75 {
76 for(const auto& nodeEle : *node)
77 {
78 temp.emplace(microstructures.ddBase.poly.grain(nodeEle->simplex.region->regionID).get());
79 }
80 }
81 else
82 {
83 if(ele)
84 {
85 temp.emplace(microstructures.ddBase.poly.grain(ele->simplex.region->regionID).get());
86 }
87 else
88 {
89 const std::pair<bool,const Simplex<dim,dim>*> found(microstructures.ddBase.mesh.searchWithGuess(x,guess));
90 if(found.first)
91 {
92 temp.emplace(microstructures.ddBase.poly.grain(found.second->region->regionID).get());
93 }
94 }
95 }
96 return temp;
97}
98
99 template struct MicrostructureBase<3>;
100
101}
102#endif
const Simplex< dim, dim > & simplex
A const reference to the Simplex that this element refers to.
const std::shared_ptr< MeshRegionType > region
Shared pointer to MeshRegioin containing *this.
Definition Simplex.h:150
x
Definition int_R.m:12
virtual VectorDim displacement(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const =0
std::set< const Grain< dim > * > pointGrains(const VectorDim &x, const NodeType *const node, const ElementType *const ele, const SimplexDim *const guess) const
ElementType::NodeType NodeType
MicrostructureBase(const std::string &tag_in, MicrostructureContainer< dim > &m_in)
Eigen::Matrix< double, dim, 1 > VectorDim
MicrostructureContainerType & microstructures
DefectiveCrystalBase< dim >::ElementType ElementType
Simplex< dim, dim > SimplexDim
virtual MatrixDim stress(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const =0
int k
vertex temp