8#ifndef model_ClusterDynamics_cpp_
9#define model_ClusterDynamics_cpp_
66 for(
const auto& pair :
cdp.D)
68 MatrixVoigt C(MatrixVoigt::Zero());
69 const auto& grainID(pair.first);
70 for(
size_t k=0;
k<pair.second.size();++
k)
72 const auto& Dm(pair.second[
k]);
73 C.template block<dim,dim>(
k*dim,
k*dim)=Dm;
76 const auto f0(VectorVoigt::Zero());
77 const auto f0Dot(VectorVoigt::Zero());
78 const auto g0(VectorVoigt::Zero());
79 const auto g0Dot(VectorVoigt::Zero());
80 const auto stiffnessRatio(VectorVoigt::Ones()*1.0e20);
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())
139 periodicNodes.insert(pair.source);
140 periodicNodes.insert(pair.sink);
142 for(
const auto& node : fem.mobileClusters->fe().nodes())
144 const auto sink=fem.sinkNormals.find(node.gID);
146 if(!
cdp.computeReactions && sink==fem.sinkNormals.end() && !periodicNodes.count(node.gID))
150 VectorMSize otherConcentration=VectorMSize::Zero();
155 otherConcentration+=microstructure->mobileConcentration(node.P0,&node,
nullptr,
nullptr);
158 offset.template segment<mSize>(
mSize*node.gID)=-otherConcentration;
159 if(sink!=fem.sinkNormals.end())
161 const MatrixDim sigma=this->microstructures.stress(node.P0,&node,
nullptr,
nullptr);
162 double normalTraction=0.0;
163 for(
const auto& normal : sink->second)
165 normalTraction+=normal.dot(sigma*normal)/double(sink->second.size());
167 const auto concentration=
cdp.boundaryMobileConcentration(sigma.trace(),normalTraction);
170 prescribed.emplace(
mSize*node.gID+
c,concentration(
c)-otherConcentration(
c));
174 fem.mobileClusters->setPeriodicNodalOffset(offset);
175 fem.mobileClusters->dirichletConditions()=std::move(prescribed);
187 std::cout<<
", mobile BCs"<<std::flush;
191 const bool hasDiscreteLoops(DN? (DN->loops().size()>0?
true :
false) :
false);
212 const bool hasDiscreteLoops(DN? (DN->loops().size()>0 ?
true :
false) :
false);
215 if constexpr (
iSize > 0)
217 if(!hasDiscreteLoops)
244 configIO.cdMatrix().resize(nNodes,
mSize+
iSize);
263 return VectorDim::Zero();
276 return MatrixDim::Zero();
283 return MatrixDim::Zero();
289 return VectorDim::Zero();
295 return MatrixDim::Zero();
307 const auto grainID(grain->grainID);
309 averageVal += controller->grad(this->
microstructures.ddBase.simulationParameters.totalTime).reshaped(dim,
mSize).transpose()*
x;
357 return MatrixDim::Zero();
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
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
void applyBoundaryConditions()
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)
const bool useClusterDynamicsFEM
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