1#ifndef AssembleFE_SCI_SMC_Active_Growth_Reorientation_DEF_hpp
2#define AssembleFE_SCI_SMC_Active_Growth_Reorientation_DEF_hpp
4#ifdef FEDD_HAVE_ACEGENINTERFACE
5#include <aceinterface.hpp>
13template <
class SC,
class LO,
class GO,
class NO>
14AssembleFE_SCI_SMC_Active_Growth_Reorientation<SC,LO,GO,NO>::AssembleFE_SCI_SMC_Active_Growth_Reorientation(
int flag, vec2D_dbl_Type nodesRefConfig, ParameterListPtr_Type params,tuple_disk_vec_ptr_Type tuple):
15AssembleFE<SC,LO,GO,NO>(flag, nodesRefConfig, params, tuple)
80 fA_= this->params_->sublist(
"Parameter Solid").get(
"FA",30.e0);
81 lambdaC50_ = this->params_->sublist(
"Parameter Solid").get(
"LambdaC50",0.12e1);
82 gamma3_= this->params_->sublist(
"Parameter Solid").get(
"Gamma3",0.9e0);
83 lambdaBarCDotMax_= this->params_->sublist(
"Parameter Solid").get(
"LambdaBarCDotMax",0.443e-1);
84 lambdaBarCDotMin_= this->params_->sublist(
"Parameter Solid").get(
"LambdaBarCDotMin",-0.443e-1);
85 gamma2_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma2",50.0e0);
86 gamma1_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma1",0.5131e0);
87 eta_ = this->params_->sublist(
"Parameter Solid").get(
"Eta",0.18745e0);
88 ca50_ = this->params_->sublist(
"Parameter Solid").get(
"Ca50",0.4e0);
89 k2_ = this->params_->sublist(
"Parameter Solid").get(
"K2",0.2e0);
90 k5_ = this->params_->sublist(
"Parameter Solid").get(
"K5",0.2e0);
91 k3_ = this->params_->sublist(
"Parameter Solid").get(
"K3",0.134e0);
92 k4_ = this->params_->sublist(
"Parameter Solid").get(
"K4",0.166e-2);
93 k7_= this->params_->sublist(
"Parameter Solid").get(
"K7",0.66e-4);
94 kappa_ = this->params_->sublist(
"Parameter Solid").get(
"Kappa",0.148262e0);
95 beta1_ = this->params_->sublist(
"Parameter Solid").get(
"Beta1",0.1006e-2);
96 muA_ = this->params_->sublist(
"Parameter Solid").get(
"MuA",0.11857e-1);
97 beta2_ = this->params_->sublist(
"Parameter Solid").get(
"Beta2",0.2668e-1);
98 alpha2_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha2",0.15173775e0);
99 alpha3_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha3",0.275662e1);
100 alpha1_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha1",11.52507e-3);
101 alpha4_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha4",1.27631e-3);
102 alpha5_ = this->params_->sublist(
"Parameter Solid").get(
"Alpha5",0.308798e1);
103 gamma6_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma6",0.15e1);
104 lambdaP50_ = this->params_->sublist(
"Parameter Solid").get(
"LambdaP50",1.0e0);
105 kDotMin_ = this->params_->sublist(
"Parameter Solid").get(
"KDotMin",-0.10694e-1);
106 zeta1_ = this->params_->sublist(
"Parameter Solid").get(
"Zeta1",100.e0);
107 kDotMax_ = this->params_->sublist(
"Parameter Solid").get(
"KDotMax",0.9735e-3);
108 gamma4_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma4",200.e0);
109 lambdaBarDotPMin_ = this->params_->sublist(
"Parameter Solid").get(
"LambdaBarDotMin",-0.2323e-3);
110 lambdaBarDotPMax_ = this->params_->sublist(
"Parameter Solid").get(
"LambdaBarDotMax",0.699e-4);
111 gamma5_ = this->params_->sublist(
"Parameter Solid").get(
"Gamma5", 50.e0 );
112 zeta2_ = this->params_->sublist(
"Parameter Solid").get(
"Zeta2", 1000.e0 );
113 DeltaLambdaBarPMin_ =this->params_->sublist(
"Parameter Solid").get(
"DeltaLambdaBarPMin", -0.1e-4);
114 p1_ = this->params_->sublist(
"Parameter Solid").get(
"P1",0.6e0);
115 p3_ = this->params_->sublist(
"Parameter Solid").get(
"P3",0.6e0);
116 c50_ = this->params_->sublist(
"Parameter Solid").get(
"C50",0.5e0);
117 d0_ = this->params_->sublist(
"Parameter Diffusion").get(
"D0",6.e-05);
118 m_ = this->params_->sublist(
"Parameter Solid").get(
"m",0.e0);
119 activeStartTime_ = this->params_->sublist(
"Parameter Solid").get(
"ActiveStartTime",1.0);
120 kEtaPlus_ = this->params_->sublist(
"Parameter Solid").get(
"KEtaPlus",0.1e-3);
121 mEtaPlus_ = this->params_->sublist(
"Parameter Solid").get(
"MEtaPlus",5.0e0);
122 growthStartTime_ = this->params_->sublist(
"Parameter Solid").get(
"GrowthStartTime",0.e0);
123 reorientationStartTime_ = this->params_->sublist(
"Parameter Solid").get(
"ReorientationStartTime",0.e0);
124 growthEndTime_ = this->params_->sublist(
"Parameter Solid").get(
"GrowthEndTime",0.e0);
125 reorientationEndTime_ = this->params_->sublist(
"Parameter Solid").get(
"ReorientationEndTime",0.e0);
126 kThetaPlus_ = this->params_->sublist(
"Parameter Solid").get(
"KThetaPlus",1.e-4);
127 kThetaMinus_ = this->params_->sublist(
"Parameter Solid").get(
"KThetaMinus",1.e-4);
128 mThetaPlus_ = this->params_->sublist(
"Parameter Solid").get(
"MThetaPlus",3.e0);
129 mThetaMinus_ = this->params_->sublist(
"Parameter Solid").get(
"MThetaMinus",3.e0);
130 thetaPlus1_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaPlus1",1.005063);
131 thetaPlus2_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaPlus2",1.020595);
132 thetaPlus3_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaPlus3",1.119918);
133 thetaMinus1_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaMinus1",0.98e0);
134 thetaMinus2_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaMinus2",0.98e0);
135 thetaMinus3_ = this->params_->sublist(
"Parameter Solid").get(
"ThetaMinus3",0.98e0);
136 kMin_ = this->params_->sublist(
"Parameter Solid").get(
"KMin",0.15e0);
137 rho_ = this->params_->sublist(
"Parameter Solid").get(
"Rho",1.e0);
142 FEType_ = std::get<1>(this->diskTuple_->at(0));
143 dofsSolid_ = std::get<2>(this->diskTuple_->at(0));
144 dofsChem_ = std::get<2>(this->diskTuple_->at(1));
146 numNodesSolid_ = std::get<3>(this->diskTuple_->at(0));
147 numNodesChem_ = std::get<3>(this->diskTuple_->at(1));
149 dofsElement_ = dofsSolid_*numNodesSolid_ + dofsChem_*numNodesChem_;
152 this->history_ ={1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.82758, 1.82758, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
153 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.82758, 1.82758, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
154 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.82758, 1.82758, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
155 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.82758, 1.82758, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
161 this->historyLength_ = 0;
162#ifdef FEDD_HAVE_ACEGENINTERFACE
163 AceGenInterface::DeformationDiffusionSmoothMuscleActiveGrowthReorientationTetrahedra3D10 tempElem(iCode_);
164 this->historyLength_ = tempElem.getHistoryLength();
166 TEUCHOS_TEST_FOR_EXCEPTION(this->historyLength_ != this->history_.size(), std::logic_error,
"History input length does not match history size of model! \n Hisory input length: " << this->history_.size() <<
"\n History size of model: " << this->historyLength_ <<
"\n");
169 this->historyUpdated_.resize(this->historyLength_,0.);
172 solutionC_n_.resize(10,0.);
173 solutionC_n1_.resize(10,0.);
175 this->solution_.reset(
new vec_dbl_Type ( dofsElement_,0.) );
188 massMatrix_ = Teuchos::rcp(
new SmallMatrix_Type(10,0.));
191template <
class SC,
class LO,
class GO,
class NO>
194 SmallMatrixPtr_Type elementMatrix = Teuchos::rcp(
new SmallMatrix_Type(this->dofsElement_,0.));
196 assemble_SCI_SMC_Active_Growth_Reorientation(elementMatrix);
198 this->jacobian_ = elementMatrix;
201template <
class SC,
class LO,
class GO,
class NO>
210 this->timeStep_ = this->timeStep_ + this->timeIncrement_;
212 this->timeIncrement_ = dt;
214 for(
int i=0; i< this->historyLength_; i++){
216 this->history_[i] = this->historyUpdated_[i];
219 for(
int i=0; i< 10 ; i++)
220 this->solutionC_n_[i]=(*this->solution_)[i+30];
225template <
class SC,
class LO,
class GO,
class NO>
228 this->rhsVec_.reset(
new vec_dbl_Type ( this->dofsElement_,0.) );
230#ifdef FEDD_HAVE_ACEGENINTERFACE
235 double positions[30];
238 for(
int i=0;i<10;i++){
239 for(
int j=0;j<3;j++){
256 double displacements[30];
257 for(
int i = 0; i < 30; i++)
259 displacements[i]=(*this->solution_)[i];
263 std::vector<double> history(this->historyLength_, 0.0);
264 for(
int i = 0; i < this->historyLength_; i++){
265 history[i] = this->history_[i];
268 double concentrations[10];
269 for(
int i = 0; i < 10; i++)
271 concentrations[i]= (*this->solution_)[i+30];
272 this->solutionC_n1_[i] = (*this->solution_)[i+30];
275 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};
277 std::vector<double> domainData = {this->fA_, this->lambdaC50_, this->gamma3_, this->lambdaBarCDotMax_, this->lambdaBarCDotMin_, this->gamma2_, this->gamma1_, this->eta_, this->ca50_, this->k2_, this->k5_,
278 this->k3_, this->k4_, this->k7_, this->kappa_, this->beta1_, this->muA_, this->beta2_, this->alpha2_, this->alpha3_, this->alpha1_, this->alpha4_, this->alpha5_,
279 this->gamma6_, this->lambdaP50_, this->kDotMin_, this->zeta1_, this->kDotMax_, this->gamma4_, this->lambdaBarDotPMin_, this->lambdaBarDotPMax_, this->gamma5_, this->zeta2_,
280 this->DeltaLambdaBarPMin_, this->p1_, this->p3_, this->c50_, this->d0_, this->m_, this->activeStartTime_, this->kEtaPlus_, this->mEtaPlus_, this->growthStartTime_,
281 this->reorientationStartTime_, this->growthEndTime_, this->reorientationEndTime_, this->kThetaPlus_, this->kThetaMinus_, this->mThetaPlus_, this->mThetaMinus_, this->thetaPlus1_,
282 this->thetaPlus2_, this->thetaPlus3_, this->thetaMinus1_, this->thetaMinus2_, this->thetaMinus3_, this->kMin_, this->rho_};
286 for(
int i=0; i<10 ; i++){
287 rates[i] =(this->solutionC_n1_[i]-this->solutionC_n_[i])/deltaT;
293 double subIterationTolerance = 1.e-7;
296 double historyUpdated[] = {1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.512656, 1.512656, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
297 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.512656, 1.512656, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
298 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.512656, 1.512656, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
299 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.512656, 1.512656, 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
301 AceGenInterface::DeformationDiffusionSmoothMuscleActiveGrowthReorientationTetrahedra3D10 elem(positions, displacements, concentrations, accelerations, rates, &domainData[0], &history[0], subIterationTolerance, deltaT, time, this->iCode_,this->getGlobalElementID());
302 int errorCode = elem.compute();
304 TEUCHOS_TEST_FOR_EXCEPTION(errorCode == 2, std::runtime_error,
"Subiteration Fail in Element" << this->getGlobalElementID() );
307 double *residuumRint = elem.getResiduumVectorRint();
318 double *residuumRDyn = elem.getResiduumVectorRdyn();
320 for(
int i=0; i< 30 ; i++){
321 (*this->rhsVec_)[i] = residuumRint[i];
324 double *residuumRc = elem.getResiduumVectorRc();
326 for(
int i=0; i< 10 ; i++){
327 (*this->rhsVec_)[i+30] = residuumRc[i];
355template <
class SC,
class LO,
class GO,
class NO>
356void AssembleFE_SCI_SMC_Active_Growth_Reorientation<SC,LO,GO,NO>::assemble_SCI_SMC_Active_Growth_Reorientation(SmallMatrixPtr_Type &elementMatrix){
360#ifdef FEDD_HAVE_ACEGENINTERFACE
362 double deltaT=this->getTimeIncrement();
364 double positions[30];
366 for(
int i=0;i<10;i++){
367 for(
int j=0;j<3;j++){
368 positions[count] = this->getNodesRefConfig()[i][j];
372 double displacements[30];
373 for(
int i = 0; i < 30; i++)
375 displacements[i]= (*this->solution_)[i];
378 std::vector<double> history(this->historyLength_,0.0);
380 for(
int i = 0; i < this->historyLength_; i++){
381 history[i] = this->history_[i];
387 double concentrations[10];
388 for(
int i = 0; i < 10; i++)
390 concentrations[i]=(*this->solution_)[i+30];
391 solutionC_n1_[i]=(*this->solution_)[i+30];
394 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};
397 std::vector<double> domainData = {this->fA_, this->lambdaC50_, this->gamma3_, this->lambdaBarCDotMax_, this->lambdaBarCDotMin_, this->gamma2_, this->gamma1_, this->eta_, this->ca50_, this->k2_, this->k5_,
398 this->k3_, this->k4_, this->k7_, this->kappa_, this->beta1_, this->muA_, this->beta2_, this->alpha2_, this->alpha3_, this->alpha1_, this->alpha4_, this->alpha5_,
399 this->gamma6_, this->lambdaP50_, this->kDotMin_, this->zeta1_, this->kDotMax_, this->gamma4_, this->lambdaBarDotPMin_, this->lambdaBarDotPMax_, this->gamma5_, this->zeta2_,
400 this->DeltaLambdaBarPMin_, this->p1_, this->p3_, this->c50_, this->d0_, this->m_, this->activeStartTime_, this->kEtaPlus_, this->mEtaPlus_, this->growthStartTime_,
401 this->reorientationStartTime_, this->growthEndTime_, this->reorientationEndTime_, this->kThetaPlus_, this->kThetaMinus_, this->mThetaPlus_, this->mThetaMinus_, this->thetaPlus1_,
402 this->thetaPlus2_, this->thetaPlus3_, this->thetaMinus1_, this->thetaMinus2_, this->thetaMinus3_, this->kMin_, this->rho_};
406 for(
int i=0; i<10 ; i++){
407 rates[i] =(this->solutionC_n1_[i]-this->solutionC_n_[i]) / deltaT;
413 double time = this->getTimeStep()+deltaT;
414 double subIterationTolerance = 1.e-7;
419 AceGenInterface::DeformationDiffusionSmoothMuscleActiveGrowthReorientationTetrahedra3D10 elem(positions, displacements, concentrations, accelerations, rates, &domainData[0], &history[0], subIterationTolerance, deltaT, time, this->iCode_,this->getGlobalElementID());
420 int errorCode = elem.compute();
421 TEUCHOS_TEST_FOR_EXCEPTION(errorCode == 2, std::runtime_error,
"Subiteration Fail in Element" << this->getGlobalElementID() );
423 double *historyUpdated = elem.getHistoryUpdated();
425 double** stiffnessMatrixKuu = elem.getStiffnessMatrixKuu();
426 double** stiffnessMatrixKuc = elem.getStiffnessMatrixKuc();
427 double** stiffnessMatrixKcu = elem.getStiffnessMatrixKcu();
428 double** stiffnessMatrixKcc = elem.getStiffnessMatrixKcc();
429 double** massMatrixMc = elem.getMassMatrixMc();
431 for(
int i=0; i< this->historyLength_; i++){
432 this->historyUpdated_[i] = historyUpdated[i];
435 for(
int i=0; i< 30; i++){
436 for(
int j=0; j<30; j++){
440 (*elementMatrix)[i][j]=stiffnessMatrixKuu[i][j];
445 for(
int i=0; i< 30; i++){
446 for(
int j=0; j<10; j++){
450 (*elementMatrix)[i][j+30]=stiffnessMatrixKuc[i][j];
453 for(
int i=0; i< 10; i++){
454 for(
int j=0; j<30; j++){
458 (*elementMatrix)[i+30][j]=stiffnessMatrixKcu[i][j];
461 for(
int i=0; i< 10; i++){
462 for(
int j=0; j<10; j++){
466 (*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_Active_Growth_Reorientation_def.hpp:192
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_Active_Growth_Reorientation_def.hpp:202
void assembleRHS() override
Assemble the element right hand side vector.
Definition AssembleFE_SCI_SMC_Active_Growth_Reorientation_def.hpp:226
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:203
vec2D_dbl_Type getNodesRefConfig()
Definition AssembleFE_def.hpp:142
double getTimeStep()
Definition AssembleFE_def.hpp:88
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement_decl.hpp:36