118 {
120
124
131
136 ->resize(1, DIM * DIM, false);
137
138 auto t_F = getFTensor2FromPtr<DIM, DIM>(
140 auto t_P = getFTensor2FromPtr<DIM, DIM>(
143
145
152
154
161
164
166 auto p_alpha = mkparam(
alpha);
167 auto p_beta = mkparam(
beta);
168 auto p_lambda = mkparam(
lambda);
169 auto p_epsilon = mkparam(
epsilon);
170 const auto ta_alpha = 1 * p_alpha;
171 const auto ta_beta = 1 * p_beta;
172 const auto ta_lambda = 1 * p_lambda;
173 const auto ta_epsilon = 1 * p_epsilon;
174
175 ta_F(
i,
J) <<= t_F(
i,
J);
176
179 }
180
183
184 ta_Cof(
i,
I) = det_aF * ta_invF(
I,
i);
185
186 A = ta_F(
k,
K) * ta_F(
k,
K);
187 B = ta_Cof(
k,
K) * ta_Cof(
k,
K);
188
189 ta_BF(
i,
I) = 4 * ta_alpha * (
A * ta_F(
i,
I));
190 ta_BCof(
i,
I) = 4 * ta_beta * (
B * ta_Cof(
i,
I));
191 ta_Bj = (-12 * ta_alpha - 24 * ta_beta) / det_aF +
192 0.5 * (ta_lambda / ta_epsilon) *
193 (pow(det_aF, ta_epsilon - 1) - pow(det_aF, -ta_epsilon - 1));
194
195 ta_P(
i,
I) = ta_BF(
i,
I);
198 ta_P(
i,
I) += ta_Cof(
i,
I) * ta_Bj;
199
200 ta_energy = ta_alpha *
A *
A + ta_beta *
B *
B +
201 (-12 * ta_alpha - 24 * ta_beta) * log(det_aF) +
202 0.5 * (ta_lambda / (ta_epsilon * ta_epsilon)) *
203 (pow(det_aF, ta_epsilon) + pow(det_aF, -ta_epsilon) - 2.) -
204 (DIM * DIM) * (ta_alpha + ta_beta);
205
206
207 ta_P(
i,
I) >>= t_P(
i,
I);
208 ta_energy >>= (*energy_ptr)(0, 0);
209
210 trace_off();
211
213 }
#define FTENSOR_INDEX(DIM, I)
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
UBlasMatrix< double > MatrixDouble
static MoFEMErrorCode invertTensor(FTensor::Tensor2< T1, DIM, DIM > &t, T2 &det, FTensor::Tensor2< T3, DIM, DIM > &inv_t)
static auto determinantTensor(FTensor::Tensor2< T, DIM, DIM > &t)
Calculate the determinant of a tensor of rank DIM.
constexpr IntegrationType I
static bool useDeformationGradient
Otherwise the displacement gradient is supplied and I is added.
boost::shared_ptr< MatOpsData > matOpsDataPtr