1#ifndef AssembleFE_SCI_SMC_MLCK_DEF_hpp
2#define AssembleFE_SCI_SMC_MLCK_DEF_hpp
4#include "AssembleFE_SCI_SMC_MLCK_decl.hpp"
6#ifdef FEDD_HAVE_ACEGENINTERFACE
7#include <aceinterface.hpp>
15template <
class SC,
class LO,
class GO,
class NO>
16AssembleFE_SCI_SMC_MLCK<SC,LO,GO,NO>::AssembleFE_SCI_SMC_MLCK(
int flag, vec2D_dbl_Type nodesRefConfig, ParameterListPtr_Type params,tuple_disk_vec_ptr_Type tuple):
17AssembleFE<SC,LO,GO,NO>(flag, nodesRefConfig, params, tuple)
53 fA_= this->params_->sublist(
"Parameter Solid").get(
"FA",30.e0);
54 lambdaC50_ = this->params_->sublist(
"Parameter Solid").get(
"LambdaC50",0.12e1);
55 gamma3_= this->params_->sublist(
"Parameter Solid").get(
"Gamma3",0.9e0);
56 lambdaBarCDotMax_= this->params_->sublist(
"Parameter Solid").get(
"LambdaBarCDotMax",0.3387e-1);
57 lambdaBarCDotMin_= this->params_->sublist(
"Parameter Solid").get(
"LambdaBarCDotMin",-0.3387e-1);
58 gamma2_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma2",50.0e0);
59 gamma1_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma1",0.50247e0);
60 eta1_ = this->params_->sublist(
"Parameter Solid").get(
"Eta1",0.18745e0);
61 ca50_ = this->params_->sublist(
"Parameter Solid").get(
"Ca50",0.4e0);
62 k2_ = this->params_->sublist(
"Parameter Solid").get(
"K2",0.2e0);
63 k5_ = this->params_->sublist(
"Parameter Solid").get(
"K5",0.2e0);
64 k3_ = this->params_->sublist(
"Parameter Solid").get(
"K3",0.134e0);
65 k4_ = this->params_->sublist(
"Parameter Solid").get(
"K4",0.166e-2);
66 k7_= this->params_->sublist(
"Parameter Solid").get(
"K7",0.66e-4);
67 kappaC_ = this->params_->sublist(
"Parameter Solid").get(
"KappaC",146.36600000000002e0);
68 beta1_ = this->params_->sublist(
"Parameter Solid").get(
"Beta1",0.10097e-2);
69 muA_ = this->params_->sublist(
"Parameter Solid").get(
"MuA",0.9291e1);
70 alpha_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha",0.2668e2);
71 epsilon1_ = this->params_->sublist(
"Parameter Solid").get(
"Epsilon1", 0.15173775e3);
72 epsilon2_ = this->params_->sublist(
"Parameter Solid").get(
"Epsilon2",0.27566199999999996e1);
73 c1_ = this->params_->sublist(
"Parameter Solid").get(
"C1",11.52507e0);
74 alpha1_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha1",1.27631e0);
75 alpha2_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha2",0.308798e1);
76 p1_ = this->params_->sublist(
"Parameter Solid").get(
"P1",0.3e0);
77 p3_ = this->params_->sublist(
"Parameter Solid").get(
"P3",0.2e0);
78 c50_ = this->params_->sublist(
"Parameter Solid").get(
"C50",0.5e0);
79 d0_ = this->params_->sublist(
"Parameter Diffusion").get(
"D0",6.e-05);
80 m_ = this->params_->sublist(
"Parameter Solid").get(
"m",0.e0);
81 startTime_ = this->params_->sublist(
"Parameter Solid").get(
"ActiveStartTime",1001.e0);
82 rho_ = this->params_->sublist(
"Parameter Solid").get(
"Rho",1.e0);
87 FEType_ = std::get<1>(this->diskTuple_->at(0));
88 dofsSolid_ = std::get<2>(this->diskTuple_->at(0));
89 dofsChem_ = std::get<2>(this->diskTuple_->at(1));
91 numNodesSolid_ = std::get<3>(this->diskTuple_->at(0));
92 numNodesChem_ = std::get<3>(this->diskTuple_->at(1));
94 dofsElement_ = dofsSolid_*numNodesSolid_ + dofsChem_*numNodesChem_;
97 history_ ={1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0};
100 historyUpdated_.resize(48,0.);
102 solutionC_n_.resize(10,0.);
103 solutionC_n1_.resize(10,0.);
105 this->solution_.reset(
new vec_dbl_Type ( dofsElement_,0.) );
121template <
class SC,
class LO,
class GO,
class NO>
124 SmallMatrixPtr_Type elementMatrix = Teuchos::rcp(
new SmallMatrix_Type(dofsElement_,0.));
126 assemble_SCI_SMC_MLCK(elementMatrix);
128 this->jacobian_ = elementMatrix;
131template <
class SC,
class LO,
class GO,
class NO>
139 this->timeStep_ = this->timeStep_ + this->timeIncrement_;
141 this->timeIncrement_ = dt;
143 for(
int i=0; i< 48; i++){
145 history_[i] = historyUpdated_[i];
149 for(
int i=0; i< 10 ; i++)
150 solutionC_n_[i]=(*this->solution_)[i+30];
155template <
class SC,
class LO,
class GO,
class NO>
158 this->rhsVec_.reset(
new vec_dbl_Type ( dofsElement_,0.) );
160#ifdef FEDD_HAVE_ACEGENINTERFACE
165 double positions[30];
168 for(
int i=0;i<10;i++){
169 for(
int j=0;j<3;j++){
177 double displacements[30];
178 for(
int i = 0; i < 30; i++)
180 displacements[i]=(*this->solution_)[i];
184 for(
int i = 0; i < history_.size(); i++)
185 history[i] = history_[i];
188 double concentrations[10];
189 for(
int i = 0; i < 10; i++)
191 concentrations[i]= (*this->solution_)[i+30];
192 solutionC_n1_[i] = (*this->solution_)[i+30];
195 double accelerations[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
197 double domainData[] = {fA_, lambdaC50_, gamma3_, lambdaBarCDotMax_, lambdaBarCDotMin_,
198 gamma2_ , gamma1_, eta1_, ca50_, k2_, k5_, k3_, k4_, k7_ , kappaC_ ,
199 beta1_ , muA_ , alpha_, epsilon1_,epsilon2_,c1_,alpha1_,alpha2_,
200 p1_,p3_,c50_,d0_,m_,startTime_,rho_};
204 for(
int i=0; i<10 ; i++){
205 rates[i] =(solutionC_n1_[i]-solutionC_n_[i])/deltaT;
210 double subIterationTolerance = 1.e-7;
213 double historyUpdated[] = {1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0};
215 AceGenInterface::DeformationDiffusionSmoothMuscleMLCKOnlyTetrahedra3D10 elem(positions, displacements, concentrations, accelerations, rates, domainData, history, subIterationTolerance, deltaT, time, iCode_);
218 double *residuumRint = elem.getResiduumVectorRint();
220 double *residuumRDyn = elem.getResiduumVectorRdyn();
225 for(
int i=0; i< 30 ; i++){
226 (*this->rhsVec_)[i] = residuumRint[i];
228 double *residuumRc = elem.getResiduumVectorRc();
232 for(
int i=0; i< 10 ; i++){
233 (*this->rhsVec_)[i+30] = residuumRc[i];
264template <
class SC,
class LO,
class GO,
class NO>
265void AssembleFE_SCI_SMC_MLCK<SC,LO,GO,NO>::assemble_SCI_SMC_MLCK(SmallMatrixPtr_Type &elementMatrix){
270#ifdef FEDD_HAVE_ACEGENINTERFACE
272 double deltaT=this->getTimeIncrement();
274 double positions[30];
276 for(
int i=0;i<10;i++){
277 for(
int j=0;j<3;j++){
278 positions[count] = this->getNodesRefConfig()[i][j];
282 double displacements[30];
283 for(
int i = 0; i < 30; i++)
285 displacements[i]= (*this->solution_)[i];
289 for(
int i = 0; i < history_.size(); i++)
290 history[i] = history_[i];
293 double concentrations[10];
294 for(
int i = 0; i < 10; i++)
296 concentrations[i]=(*this->solution_)[i+30];
297 solutionC_n1_[i]=(*this->solution_)[i+30];
300 double accelerations[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
302 double domainData[] = {fA_, lambdaC50_, gamma3_, lambdaBarCDotMax_, lambdaBarCDotMin_,
303 gamma2_ , gamma1_, eta1_, ca50_, k2_, k5_, k3_, k4_, k7_ , kappaC_ ,
304 beta1_ , muA_ , alpha_, epsilon1_,epsilon2_,c1_,alpha1_,alpha2_,
305 p1_,p3_,c50_,d0_,m_,startTime_,rho_};
308 for(
int i=0; i<10 ; i++){
309 rates[i] =(solutionC_n1_[i]-solutionC_n_[i]) / deltaT;
313 double time = this->getTimeStep()+deltaT;
314 double subIterationTolerance = 1.e-7;
319 AceGenInterface::DeformationDiffusionSmoothMuscleMLCKOnlyTetrahedra3D10 elem(positions, displacements, concentrations, accelerations, rates, domainData, history, subIterationTolerance, deltaT, time, iCode_);
322 double *historyUpdated = elem.getHistoryUpdated();
324 double** stiffnessMatrixKuu = elem.getStiffnessMatrixKuu();
325 double** stiffnessMatrixKuc = elem.getStiffnessMatrixKuc();
326 double** stiffnessMatrixKcu = elem.getStiffnessMatrixKcu();
327 double** stiffnessMatrixKcc = elem.getStiffnessMatrixKcc();
328 double** massMatrixMc = elem.getMassMatrixMc();
331 for(
int i=0; i< 48; i++){
332 historyUpdated_[i] = historyUpdated[i];
335 for(
int i=0; i< 30; i++){
336 for(
int j=0; j<30; j++){
340 (*elementMatrix)[i][j]=stiffnessMatrixKuu[i][j];
343 for(
int i=0; i< 30; i++){
344 for(
int j=0; j<10; j++){
348 (*elementMatrix)[i][j+30]=stiffnessMatrixKuc[i][j];
351 for(
int i=0; i< 10; i++){
352 for(
int j=0; j<30; j++){
356 (*elementMatrix)[i+30][j]=stiffnessMatrixKcu[i][j];
359 for(
int i=0; i< 10; i++){
360 for(
int j=0; j<10; j++){
364 (*elementMatrix)[i+30][j+30] =stiffnessMatrixKcc[i][j] +(1./deltaT)*massMatrixMc[i][j];
void assembleJacobian() override
Assemble the element Jacobian matrix.
Definition AssembleFE_SCI_SMC_MLCK_def.hpp:122
void advanceInTime(double dt) override
This function is called every time the FEDDLib proceeds from one to the next time step....
Definition AssembleFE_SCI_SMC_MLCK_def.hpp:132
void assembleRHS() override
Assemble the element right hand side vector.
Definition AssembleFE_SCI_SMC_MLCK_def.hpp:156
This abstract class defining the interface for any type of element assembly rountines in the FEDDLib.
Definition AssembleFE_decl.hpp:61
double getTimeIncrement()
Definition AssembleFE_decl.hpp:204
vec2D_dbl_Type getNodesRefConfig()
Definition AssembleFE_def.hpp:144
double getTimeStep()
Definition AssembleFE_def.hpp:90
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5