Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
ClusterDynamicsFEM.h
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_ClusterDynamicsFEM_H_
9#define model_ClusterDynamicsFEM_H_
10
11#ifdef MODELIB_CHOLMOD // SuiteSparse Cholmod module
12#include <Eigen/CholmodSupport>
13#endif
14
15#ifdef MODELIB_UMFPACK // SuiteSparse UMFPACK module
16#include <Eigen/UmfPackSupport>
17#endif
18
19
22#include <EvalFunction.h>
23#include <WeakProblem.h>
27#include <SecondOrderReaction.h>
28#include <FirstOrderReaction.h>
29#include <ImmobileSinkRate.h>
31
32namespace model
33{
34
35 template <int dim>
36 struct FluxMatrix : public EvalFunction<FluxMatrix<dim>>
37 {
39 typedef Eigen::Matrix<double,dim+1,1> BaryType;
41 constexpr static int rows=dim*mSize;
42 constexpr static int cols=rows;
43 typedef Eigen::Matrix<double,rows,cols> MatrixType;
44
46
48 const MatrixType operator() (const ElementType& elem, const BaryType& bary) const;
49 };
50
51 template <int dim>
52 struct InvDscaling : public EvalFunction<InvDscaling<dim>>
53 {
55 typedef Eigen::Matrix<double,dim+1,1> BaryType;
57 constexpr static int rows=mSize;
58 constexpr static int cols=rows;
59 typedef Eigen::Matrix<double,rows,cols> MatrixType;
60
62
64 const MatrixType operator() (const ElementType& elem, const BaryType& bary) const;
65 };
66
67 template<int dim>
69 {
77 static constexpr int dVorder=4;
86
90
91// typedef BilinearForm<MobileGradType,TrialProd<Constant<double,1,1>,MobileFluxType>> MobileBilinearFormType;
93
97
102
103 using SparseMatrixType=Eigen::SparseMatrix<double>;
104 using Problem=WeakProblem<Eigen::SparseLU<SparseMatrixType>,Eigen::BiCGSTAB<SparseMatrixType>>;
105 template<class Trial>
106 struct Load
107 {
108 std::shared_ptr<Trial> trial;
109 Eigen::VectorXd value;
110 const auto& field() const
111 {
112 return trial->field();
113 }
114 Eigen::VectorXd globalVector() const
115 {
116 return value;
117 }
118 };
119 template<class Trial>
121 {
122 std::shared_ptr<Trial> trial;
123 std::vector<Eigen::Triplet<double>> entries;
124 const auto& field() const
125 {
126 return trial->field();
127 }
128 auto globalTriplets() const
129 {
130 return entries;
131 }
132 };
136 const std::shared_ptr<InvDscaling<dim>> iDs;
137
138 const Eigen::Matrix<double,mSize,mSize> invTrD;
139
140 std::shared_ptr<MobileTrialType> mobileClusters;
141 std::shared_ptr<MobileGradType> mobileGrad;
142 std::shared_ptr<MobileFluxType> mobileFlux;
143 std::shared_ptr<ImmobileTrialType> immobileClusters;
144
145 const std::map<size_t,std::vector<VectorDim>> sinkNormals;
146 std::shared_ptr<MobileIncrementTrialType> mobileClustersIncrement;
148 std::shared_ptr<MobileBilinearWeakFormType> mBWF;
149 std::shared_ptr<MobileIncrementBilinearWeakFormType> dmBWF;
150
151 std::shared_ptr<Problem> mSolver,rSolver,iSolver;
152 std::shared_ptr<Load<MobileTrialType>> mobileLoad;
153 std::shared_ptr<Load<MobileIncrementTrialType>> reactionLoad;
154 std::shared_ptr<MatrixForm<MobileIncrementTrialType>> reactionMatrix;
155 std::shared_ptr<ImmobileRateTrialType> immobileRateTrial;
157 std::vector<Eigen::Triplet<double>> diffusionTriplets;
158 Eigen::MatrixXd meanRows;
159 Eigen::MatrixXd conservedRows(const bool useImmobileClusters) const;
162
163 const Eigen::VectorXd cascadeGlobalProduction;
164 Eigen::VectorXd immobileClusterRate;
165
166// ClusterDynamicsFEM(const DefectiveCrystalBase<dim>& ddBase_in,const ClusterDynamicsParameters<dim>& cdp_in);
167// void solveMobileClusters();
168// void solveImmobileClusters();
169// void solve();
170// // void applyBoundaryConditions();
171// void initializeConfiguration(const DefectiveCrystalConfigIO<dim>& configIO,const std::ofstream& f_file,const std::ofstream& F_labels);
172// void initializeSolver();
173// VectorDim inelasticDisplacementRate(const VectorDim&, const NodeType* const, const ElementType* const,const SimplexDim* const) const;
174
176 void solveMobileClusters(const bool hasDiscreteLoops);
178 void updateImmobileClusters(const double dt);
179 void solve(const bool hasDiscreteLoops);
180// void applyBoundaryConditions();
181 void initializeConfiguration(const DefectiveCrystalConfigIO<dim>& configIO,const std::ofstream& f_file,const std::ofstream& F_labels);
182 void initializeSolver();
183 VectorDim inelasticDisplacementRate(const VectorDim&, const NodeType* const, const ElementType* const,const SimplexDim* const) const;
184
185 // Added all this below :
186 typedef Eigen::Matrix<double,dim+1,1> BaryType;
187 std::vector<Eigen::Matrix<double,dim,dim>> betaP(const ElementType& ele, const BaryType& bary) const;
188 std::vector<Eigen::Matrix<double,dim,dim>> betaV(const ElementType& ele, const BaryType& bary) const;
189 MatrixDim averageBetaP() const;
190 MatrixDim averageBetaPKernel(const Eigen::Matrix<double,dim,1>& a1, const ElementType& ele) const;
191 MatrixDim averageBetaV() const;
192 MatrixDim averageBetaVKernel(const Eigen::Matrix<double,dim,1>& a1, const ElementType& ele) const;
193
194 };
195
196}
197#endif
198
Eigen::VectorXd globalVector() const
std::vector< Eigen::Triplet< double > > entries
MicrostructureBase< dim >::NodeType NodeType
std::shared_ptr< MobileGradType > mobileGrad
const std::shared_ptr< InvDscaling< dim > > iDs
void solve(const bool hasDiscreteLoops)
const ClusterDynamicsParameters< dim > & cdp
TrialFunction< 'd', mSize, FiniteElementType > MobileIncrementTrialType
std::shared_ptr< MobileFluxType > mobileFlux
std::shared_ptr< MobileBilinearWeakFormType > mBWF
VectorDim inelasticDisplacementRate(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const
std::shared_ptr< ImmobileRateTrialType > immobileRateTrial
TrialGrad< MobileIncrementTrialType > MobileIncrementGradType
MatrixDim averageBetaVKernel(const Eigen::Matrix< double, dim, 1 > &a1, const ElementType &ele) const
TrialGrad< MobileTestType > MobileTestGradType
std::shared_ptr< MobileIncrementTrialType > mobileClustersIncrement
std::vector< Eigen::Matrix< double, dim, dim > > betaV(const ElementType &ele, const BaryType &bary) const
std::shared_ptr< Problem > mSolver
TrialProd< FluxMatrix< dim >, MobileGradType > MobileFluxType
void updateImmobileClusters(const double dt)
static constexpr int mSize
static constexpr int dVorder
std::shared_ptr< ImmobileTrialType > immobileClusters
TrialFunction< 'r', iSize, FiniteElementType > ImmobileRateTrialType
std::shared_ptr< Load< MobileIncrementTrialType > > reactionLoad
TrialFunction< 'z', dim, FiniteElementType > DiffusiveTrialType
const std::map< size_t, std::vector< VectorDim > > sinkNormals
static constexpr int iSize
TrialFunction< 'm', mSize, FiniteElementType > MobileTrialType
BilinearForm< MobileTestGradType, TrialProd< Constant< double, 1, 1 >, MobileFluxType > > MobileBilinearFormType
std::vector< Eigen::Matrix< double, dim, dim > > betaP(const ElementType &ele, const BaryType &bary) const
Eigen::SparseMatrix< double > SparseMatrixType
MatrixDim averageBetaPKernel(const Eigen::Matrix< double, dim, 1 > &a1, const ElementType &ele) const
BilinearWeakForm< MobileBilinearFormType, VolumeIntegrationDomainType > MobileBilinearWeakFormType
MicrostructureBase< dim >::SimplexDim SimplexDim
std::shared_ptr< MobileTrialType > mobileClusters
IntegrationDomain< FiniteElementType, 0, dVorder, GaussLegendre > VolumeIntegrationDomainType
std::shared_ptr< Load< MobileTrialType > > mobileLoad
std::shared_ptr< MobileIncrementBilinearWeakFormType > dmBWF
VolumeIntegrationDomainType dV
MicrostructureBase< dim >::ElementType ElementType
MicrostructureBase< dim >::MatrixDim MatrixDim
MicrostructureBase< dim >::VectorDim VectorDim
void initializeConfiguration(const DefectiveCrystalConfigIO< dim > &configIO, const std::ofstream &f_file, const std::ofstream &F_labels)
FiniteElement< ElementType > FiniteElementType
TrialFunction< 'i', iSize, FiniteElementType > ImmobileTrialType
std::shared_ptr< MatrixForm< MobileIncrementTrialType > > reactionMatrix
const Eigen::Matrix< double, mSize, mSize > invTrD
TrialProd< InvDscaling< dim >, MobileTrialType > MobileTestType
std::vector< Eigen::Triplet< double > > diffusionTriplets
const Eigen::VectorXd cascadeGlobalProduction
BilinearWeakForm< MobileIncrementBilinearFormType, VolumeIntegrationDomainType > MobileIncrementBilinearWeakFormType
std::shared_ptr< Problem > rSolver
TrialGrad< MobileIncrementTestType > MobileIncrementTestGradType
TrialGrad< MobileTrialType > MobileGradType
TrialProd< InvDscaling< dim >, MobileIncrementTrialType > MobileIncrementTestType
TrialProd< FluxMatrix< dim >, MobileIncrementGradType > MobileIncrementFluxType
const DefectiveCrystalBase< dim > & ddBase
BilinearForm< MobileIncrementTestGradType, TrialProd< Constant< double, 1, 1 >, MobileIncrementFluxType > > MobileIncrementBilinearFormType
Eigen::MatrixXd conservedRows(const bool useImmobileClusters) const
void solveMobileClusters(const bool hasDiscreteLoops)
WeakProblem< Eigen::SparseLU< SparseMatrixType >, Eigen::BiCGSTAB< SparseMatrixType > > Problem
ClusterDynamicsFEM(DefectiveCrystalBase< dim > &ddBase_in, const ClusterDynamicsParameters< dim > &cdp_in)
MicrostructureBase< dim >::VectorMSize VectorMSize
std::shared_ptr< Problem > iSolver
Eigen::Matrix< double, dim+1, 1 > BaryType
LagrangeElement< 3, 2 > ElementType
FluxMatrix(const ClusterDynamicsParameters< dim > &cdp_in)
static constexpr int mSize
static constexpr int rows
Eigen::Matrix< double, dim+1, 1 > BaryType
const MatrixType operator()(const ElementType &elem, const BaryType &bary) const
static constexpr int cols
const ClusterDynamicsParameters< dim > & cdp
Eigen::Matrix< double, rows, cols > MatrixType
DefectiveCrystalBase< dim >::ElementType ElementType
const MatrixType operator()(const ElementType &elem, const BaryType &bary) const
DefectiveCrystalBase< dim >::ElementType ElementType
const ClusterDynamicsParameters< dim > & cdp
InvDscaling(const ClusterDynamicsParameters< dim > &cdp_in)
Eigen::Matrix< double, dim+1, 1 > BaryType
static constexpr int cols
static constexpr int rows
Eigen::Matrix< double, rows, cols > MatrixType
static constexpr int mSize
Eigen::Matrix< double, mSize, 1 > VectorMSize
Eigen::Matrix< double, dim, dim > MatrixDim
ElementType::NodeType NodeType
Eigen::Matrix< double, dim, 1 > VectorDim
DefectiveCrystalBase< dim >::ElementType ElementType
Simplex< dim, dim > SimplexDim