1#ifndef ASSEMBLEFE_SCI_NH_DEF_hpp
2#define ASSEMBLEFE_SCI_NH_DEF_hpp
4#include "AssembleFE_SCI_NH_decl.hpp"
5#ifdef FEDD_HAVE_ACEGENINTERFACE
6#include <aceinterface.hpp>
15 template <
class SC,
class LO,
class GO,
class NO>
16 AssembleFE_SCI_NH<SC, LO, GO, NO>::AssembleFE_SCI_NH(
int flag, vec2D_dbl_Type nodesRefConfig, ParameterListPtr_Type params, tuple_disk_vec_ptr_Type tuple) :
AssembleFE<SC, LO, GO, NO>(flag, nodesRefConfig, params, tuple)
19 E0_ = this->params_->sublist(
"Parameter Solid").get(
"E", 379.95e-6);
20 E1_ = this->params_->sublist(
"Parameter Solid").get(
"E1", 300.0e-6);
21 poissonRatio_ = this->params_->sublist(
"Parameter Solid").get(
"Poisson Ratio", 0.49e-0);
22 c1_ = this->params_->sublist(
"Parameter Solid").get(
"c1", 0.25e-0);
23 D0_ = this->params_->sublist(
"Parameter Diffusion").get(
"D0", 6.0e-5);
24 m_ = this->params_->sublist(
"Parameter Diffusion").get(
"m", 0.0);
25 dofOrdering_ = this->params_->sublist(
"Parameter").get(
"Ordering", 2);
27 FEType_ = std::get<1>(this->diskTuple_->at(0));
28 dofsSolid_ = std::get<2>(this->diskTuple_->at(0));
29 dofsChem_ = std::get<2>(this->diskTuple_->at(1));
31 numNodesSolid_ = std::get<3>(this->diskTuple_->at(0));
32 numNodesChem_ = std::get<3>(this->diskTuple_->at(1));
34 dofsElement_ = dofsSolid_ * numNodesSolid_ + dofsChem_ * numNodesChem_;
36 solution_n_.resize(60, 0.);
37 solution_n1_.resize(60, 0.);
53 template <
class SC,
class LO,
class GO,
class NO>
57 SmallMatrixPtr_Type elementMatrix = Teuchos::rcp(
new SmallMatrix_Type(dofsElement_, 0.));
59 assembleDeformationDiffusionNeoHook(elementMatrix);
61 this->jacobian_ = elementMatrix;
64 template <
class SC,
class LO,
class GO,
class NO>
74 this->timeStep_ = this->timeStep_ + this->timeIncrement_;
76 this->timeIncrement_ = dt;
78 for (
int i = 0; i < 40; i++)
81 solution_n_[i] = (*this->solution_)[i];
83 solution_n_[i] = (*this->solution_)[i];
87 template <
class SC,
class LO,
class GO,
class NO>
91 this->rhsVec_.reset(
new vec_dbl_Type(dofsElement_, 0.));
92#ifdef FEDD_HAVE_ACEGENINTERFACE
94 std::vector<double> positions(30);
96 for (
int i = 0; i < 10; i++)
98 for (
int j = 0; j < 3; j++)
105 std::vector<double> displacements(30);
106 for (
int i = 0; i < 30; i++){
107 displacements[i] = (*this->solution_)[i];
109 std::vector<double> concentrations(10);
110 for (
int i = 0; i < 10; i++)
111 concentrations[i] = (*this->solution_)[i + 30];
113 std::vector<double> concentrationsLastConverged(10);
114 for (
int i = 0; i < 10; i++)
115 concentrationsLastConverged[i] = (solution_n_)[i + 30];
117 std::vector<double> domainData(6);
118 domainData[0] = this->E0_;
119 domainData[1] = this->E1_;
120 domainData[2] = this->poissonRatio_;
121 domainData[3] = this->c1_;
122 domainData[4] = this->D0_;
123 domainData[5] = this->m_;
127 int integrationCode = 19;
129 AceGenInterface::DeformationDiffusionNeoHookTetrahedra3D10 neoHookeElement(&positions[0], &displacements[0], &concentrations[0], &concentrationsLastConverged[0], &domainData[0], timeIncrement, integrationCode);
130 neoHookeElement.computeTangentResidual();
132 double *residuum = neoHookeElement.getResiduum();
134 for (
int i = 0; i < 40; i++)
135 (*this->rhsVec_)[i] = residuum[i];
143 template <
class SC,
class LO,
class GO,
class NO>
144 void AssembleFE_SCI_NH<SC, LO, GO, NO>::assembleDeformationDiffusionNeoHook(SmallMatrixPtr_Type &elementMatrix)
147 std::vector<double> positions(30);
148#ifdef FEDD_HAVE_ACEGENINTERFACE
151 for (
int i = 0; i < 10; i++)
153 for (
int j = 0; j < 3; j++)
155 positions[count] = this->getNodesRefConfig()[i][j];
160 std::vector<double> displacements(30);
161 for (
int i = 0; i < 30; i++)
162 displacements[i] = (*this->solution_)[i];
164 std::vector<double> concentrations(10);
165 for (
int i = 0; i < 10; i++)
166 concentrations[i] = (*this->solution_)[i + 30];
168 std::vector<double> concentrationsLastConverged(10);
169 for (
int i = 0; i < 10; i++)
170 concentrationsLastConverged[i] = (solution_n_)[i + 30];
172 std::vector<double> domainData(6);
173 domainData[0] = this->E0_;
174 domainData[1] = this->E1_;
175 domainData[2] = this->poissonRatio_;
176 domainData[3] = this->c1_;
177 domainData[4] = this->D0_;
178 domainData[5] = this->m_;
180 double timeIncrement = this->getTimeIncrement();
182 int integrationCode = 19;
184 AceGenInterface::DeformationDiffusionNeoHookTetrahedra3D10 neoHookeElement(&positions[0], &displacements[0], &concentrations[0], &concentrationsLastConverged[0], &domainData[0], timeIncrement, integrationCode);
185 neoHookeElement.computeTangentResidual();
187 double **stiffnessMatrix = neoHookeElement.getStiffnessMatrix();
190 for (UN i = 0; i < this->dofsElement_; i++)
192 for (UN j = 0; j < this->dofsElement_; j++)
194 (*elementMatrix)[i][j] = stiffnessMatrix[i][j];
void assembleRHS() override
Assemble the element right hand side vector.
Definition AssembleFE_SCI_NH_def.hpp:88
void advanceInTime(double dt) override
This function is called every time the FEDDLib proceeds from one to the next time step....
Definition AssembleFE_SCI_NH_def.hpp:65
void assembleJacobian() override
Assemble the element Jacobian matrix.
Definition AssembleFE_SCI_NH_def.hpp:54
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
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5