v0.15.0
Loading...
Searching...
No Matches
PlasticOpsGeneric.hpp
Go to the documentation of this file.
1
2
3/** \file PlasticOpsGeneric.hpp
4 * \example PlasticOpsGeneric.hpp
5 */
6
7namespace ThermoPlasticOps {
8struct ThermoPlasticBlockedParameters;
9}
11namespace PlasticOps {
12
13//! [Lambda functions]
14template <int DIM> inline auto diff_tensor(FTensor::Number<DIM>) {
15 FTensor::Index<'i', DIM> i;
16 FTensor::Index<'j', DIM> j;
17 FTensor::Index<'k', DIM> k;
18 FTensor::Index<'l', DIM> l;
21 t_diff(i, j, k, l) = (t_kd(i, k) ^ t_kd(j, l)) / 4.;
22 return t_diff;
23};
24
25template <int DIM> inline auto symm_L_tensor(FTensor::Number<DIM>) {
26 FTensor::Index<'i', DIM> i;
27 FTensor::Index<'j', DIM> j;
28 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
31 t_L(i, j, L) = 0;
32 if constexpr (DIM == 2) {
33 t_L(0, 0, 0) = 1;
34 t_L(1, 0, 1) = 1;
35 t_L(1, 1, 2) = 1;
36 } else {
37 t_L(0, 0, 0) = 1;
38 t_L(1, 0, 1) = 1;
39 t_L(2, 0, 2) = 1;
40 t_L(1, 1, 3) = 1;
41 t_L(2, 1, 4) = 1;
42 t_L(2, 2, 5) = 1;
43 }
44 return t_L;
45}
46
47template <int DIM> inline auto diff_symmetrize(FTensor::Number<DIM>) {
48
49 FTensor::Index<'i', DIM> i;
50 FTensor::Index<'j', DIM> j;
51 FTensor::Index<'k', DIM> k;
52 FTensor::Index<'l', DIM> l;
53
55
56 t_diff(i, j, k, l) = 0;
57 t_diff(0, 0, 0, 0) = 1;
58 t_diff(1, 1, 1, 1) = 1;
59
60 t_diff(1, 0, 1, 0) = 0.5;
61 t_diff(1, 0, 0, 1) = 0.5;
62
63 t_diff(0, 1, 0, 1) = 0.5;
64 t_diff(0, 1, 1, 0) = 0.5;
65
66 if constexpr (DIM == 3) {
67 t_diff(2, 2, 2, 2) = 1;
68
69 t_diff(2, 0, 2, 0) = 0.5;
70 t_diff(2, 0, 0, 2) = 0.5;
71 t_diff(0, 2, 0, 2) = 0.5;
72 t_diff(0, 2, 2, 0) = 0.5;
73
74 t_diff(2, 1, 2, 1) = 0.5;
75 t_diff(2, 1, 1, 2) = 0.5;
76 t_diff(1, 2, 1, 2) = 0.5;
77 t_diff(1, 2, 2, 1) = 0.5;
78 }
79
80 return t_diff;
81};
82
83template <typename T>
84inline double trace(FTensor::Tensor2_symmetric<T, 2> &t_stress) {
85 constexpr double third = boost::math::constants::third<double>();
86 return (t_stress(0, 0) + t_stress(1, 1)) * third;
87};
88
89template <typename T>
90inline double trace(FTensor::Tensor2_symmetric<T, 3> &t_stress) {
91 constexpr double third = boost::math::constants::third<double>();
92 return (t_stress(0, 0) + t_stress(1, 1) + t_stress(2, 2)) * third;
93};
94
95template <typename T, int DIM>
96inline auto deviator(
97
100
101) {
103 t_dev(I, J) = 0;
104 for (int ii = 0; ii != DIM; ++ii)
105 for (int jj = ii; jj != DIM; ++jj)
106 t_dev(ii, jj) = t_stress(ii, jj);
107 t_dev(0, 0) -= trace;
108 t_dev(1, 1) -= trace;
109 t_dev(2, 2) -= trace;
110 for (int ii = 0; ii != DIM; ++ii)
111 for (int jj = ii; jj != DIM; ++jj)
112 t_dev(ii, jj) -= t_alpha(ii, jj);
113 return t_dev;
114};
115
116template <typename T>
117inline auto deviator(FTensor::Tensor2_symmetric<T, 2> &t_stress, double trace,
119 return deviator(t_stress, trace, t_alpha, FTensor::Number<2>());
120};
121
122template <typename T>
123inline auto deviator(FTensor::Tensor2_symmetric<T, 3> &t_stress, double trace,
125 return deviator(t_stress, trace, t_alpha, FTensor::Number<3>());
126};
127
128template <int DIM>
129inline auto diff_deviator(FTensor::Ddg<double, DIM, DIM> &&t_diff_stress,
131 FTensor::Index<'k', DIM> k;
132 FTensor::Index<'l', DIM> l;
133 FTensor::Ddg<double, 3, DIM> t_diff_deviator;
134 t_diff_deviator(I, J, k, l) = 0;
135 for (int ii = 0; ii != DIM; ++ii)
136 for (int jj = ii; jj != DIM; ++jj)
137 for (int kk = 0; kk != DIM; ++kk)
138 for (int ll = kk; ll != DIM; ++ll)
139 t_diff_deviator(ii, jj, kk, ll) = t_diff_stress(ii, jj, kk, ll);
140
141 constexpr double third = boost::math::constants::third<double>();
142
143 t_diff_deviator(0, 0, 0, 0) -= third;
144 t_diff_deviator(0, 0, 1, 1) -= third;
145
146 t_diff_deviator(1, 1, 0, 0) -= third;
147 t_diff_deviator(1, 1, 1, 1) -= third;
148
149 t_diff_deviator(2, 2, 0, 0) -= third;
150 t_diff_deviator(2, 2, 1, 1) -= third;
151
152 if constexpr (DIM == 3) {
153 t_diff_deviator(0, 0, 2, 2) -= third;
154 t_diff_deviator(1, 1, 2, 2) -= third;
155 t_diff_deviator(2, 2, 2, 2) -= third;
156 }
158 return t_diff_deviator;
159};
160
161inline auto diff_deviator(FTensor::Ddg<double, 2, 2> &&t_diff_stress) {
162 return diff_deviator(std::move(t_diff_stress), FTensor::Number<2>());
163}
164
165inline auto diff_deviator(FTensor::Ddg<double, 3, 3> &&t_diff_stress) {
166 return diff_deviator(std::move(t_diff_stress), FTensor::Number<3>());
167}
168
169/**
170 *
171
172\f[
173\begin{split}
174f&=\sqrt{s_{ij}s_{ij}}\\
175A_{ij}&=\frac{\partial f}{\partial \sigma_{ij}}=
176\frac{1}{f} s_{kl} \frac{\partial s_{kl}}{\partial \sigma_{ij}}\\
177\frac{\partial A_{ij}}{\partial \sigma_{kl}}&= \frac{\partial^2 f}{\partial
178\sigma_{ij}\partial\sigma_{mn}}= \frac{1}{f} \left( \frac{\partial
179s_{kl}}{\partial \sigma_{mn}}\frac{\partial s_{kl}}{\partial \sigma_{ij}}
180-A_{mn}A_{ij}
181\right)\\
182\frac{\partial f}{\partial \varepsilon_{ij}}&=A_{mn}D_{mnij}
183\\
184\frac{\partial A_{ij}}{\partial \varepsilon_{kl}}&=
185\frac{\partial A_{ij}}{\partial \sigma_{mn}} \frac{\partial
186\sigma_{mn}}{\partial \varepsilon_{kl}}= \frac{\partial A_{ij}}{\partial
187\sigma_{mn}} D_{mnkl}
188\end{split}
189\f]
190
191 */
192inline double
194 return std::sqrt(1.5 * t_stress_deviator(I, J) * t_stress_deviator(I, J)) +
195 std::numeric_limits<double>::epsilon();
196};
197
198template <int DIM>
199inline auto plastic_flow(long double f,
201 FTensor::Ddg<double, 3, DIM> &&t_diff_deviator) {
202 FTensor::Index<'k', DIM> k;
203 FTensor::Index<'l', DIM> l;
205 t_diff_f(k, l) =
206 (1.5 * (t_dev_stress(I, J) * t_diff_deviator(I, J, k, l))) / f;
207 return t_diff_f;
209
210template <typename T, int DIM>
211inline auto
212diff_plastic_flow_dstress(long double f,
214 FTensor::Ddg<double, 3, DIM> &&t_diff_deviator) {
215 FTensor::Index<'i', DIM> i;
216 FTensor::Index<'j', DIM> j;
217 FTensor::Index<'k', DIM> k;
218 FTensor::Index<'l', DIM> l;
220 t_diff_flow(i, j, k, l) =
221 (1.5 * (t_diff_deviator(M, N, i, j) * t_diff_deviator(M, N, k, l) -
222 (2. / 3.) * t_flow(i, j) * t_flow(k, l))) /
223 f;
224 return t_diff_flow;
225};
226
227template <typename T, int DIM>
228inline auto diff_plastic_flow_dstrain(
230 FTensor::Ddg<double, DIM, DIM> &&t_diff_plastic_flow_dstress) {
231 FTensor::Index<'i', DIM> i;
232 FTensor::Index<'j', DIM> j;
233 FTensor::Index<'k', DIM> k;
234 FTensor::Index<'l', DIM> l;
235 FTensor::Index<'m', DIM> m;
236 FTensor::Index<'n', DIM> n;
238 t_diff_flow(i, j, k, l) =
239 t_diff_plastic_flow_dstress(i, j, m, n) * t_D(m, n, k, l);
240 return t_diff_flow;
241};
242
243// inline double constrain_diff_sign(double x) {
244// const auto y = x / zeta;
245// if (y > std::numeric_limits<float>::max_exponent10 ||
246// y < std::numeric_limits<float>::min_exponent10) {
247// return 0;
248// } else {
249// const auto e = std::exp(y);
250// const auto ep1 = e + 1;
251// return (2 / zeta) * (e / (ep1 * ep1));
252// }
253// };
254
255inline double constrian_sign(double x, double dt) {
256 const auto y = x / (zeta / dt);
257 if (y > std::numeric_limits<float>::max_exponent10 ||
258 y < std::numeric_limits<float>::min_exponent10) {
259 if (x > 0)
260 return 1.;
261 else
262 return -1.;
263 } else {
264 const auto e = std::exp(y);
265 return (e - 1) / (1 + e);
266 }
267};
268
269inline double constrain_abs(double x, double dt) {
270 const auto y = -x / (zeta / dt);
271 if (y > std::numeric_limits<float>::max_exponent10 ||
272 y < std::numeric_limits<float>::min_exponent10) {
273 return std::abs(x);
274 } else {
275 const double e = std::exp(y);
276 return x + 2 * (zeta / dt) * std::log1p(e);
277 }
278};
279
280inline double w(double eqiv, double dot_tau, double f, double sigma_y,
281 double sigma_Y) {
282 return (1. / cn1) * ((f - sigma_y) / sigma_Y) + dot_tau;
283};
284
285/**
286
287\f[
288v^H \cdot \dot{\tau} +
289\left(\frac{\sigma_Y}{2}\right) \cdot
290\left(
291 \left(
292 c_{\textrm{n0}} \cdot c_{\textrm{n1}} \cdot \left(\dot{\tau} - \dot{e_{\textrm{p}}}\right)
293 \right) +
294 \left(
295 c_{\textrm{n1}} \cdot \left(\dot{\tau} - \frac{1}{c_{\textrm{n1}}} \cdot \frac{f - \sigma_y}{\sigma_Y} - \text{abs\_w}\right)
296 \right)
297\right)
298\f]
299 */
300inline double constraint(double eqiv, double dot_tau, double f, double sigma_y,
301 double abs_w, double vis_H, double sigma_Y) {
302
303 return
304
305 vis_H * dot_tau +
306 (sigma_Y / 2) *
307 (
308
309 (cn0 * cn1 * ((dot_tau - eqiv)) +
310
311 cn1 * ((dot_tau) - (1. / cn1) * (f - sigma_y) / sigma_Y - abs_w))
313 );
314};
315
316inline double diff_constrain_ddot_tau(double sign, double eqiv, double dot_tau,
317 double vis_H, double sigma_Y) {
318 return vis_H + (sigma_Y / 2) * (cn0 * cn1 + cn1 * (1 - sign));
319};
320
321inline double diff_constrain_deqiv(double sign, double eqiv, double dot_tau,
322 double sigma_Y) {
323 return (sigma_Y / 2) * (-cn0 * cn1);
325
326inline auto diff_constrain_df(double sign) { return (-1 - sign) / 2; };
327
328inline auto diff_constrain_dsigma_y(double sign) { return (1 + sign) / 2; }
329
330inline auto diff_constrain_dtemp(double dc_dsigmay, double dsigma_y_dtemp) {
331 return dc_dsigmay * dsigma_y_dtemp;
332}
333
334template <typename T, int DIM>
335inline auto
337 FTensor::Tensor2_symmetric<T, DIM> &t_plastic_flow) {
338 FTensor::Index<'i', DIM> i;
339 FTensor::Index<'j', DIM> j;
340 FTensor::Tensor2_symmetric<double, DIM> t_diff_constrain_dstress;
341 t_diff_constrain_dstress(i, j) = diff_constrain_df * t_plastic_flow(i, j);
342 return t_diff_constrain_dstress;
343};
344
345template <typename T1, typename T2, int DIM>
346inline auto diff_constrain_dstrain(T1 &t_D, T2 &&t_diff_constrain_dstress) {
347 FTensor::Index<'i', DIM> i;
348 FTensor::Index<'j', DIM> j;
349 FTensor::Index<'k', DIM> k;
350 FTensor::Index<'l', DIM> l;
351 FTensor::Tensor2_symmetric<double, DIM> t_diff_constrain_dstrain;
352 t_diff_constrain_dstrain(k, l) =
353 t_diff_constrain_dstress(i, j) * t_D(i, j, k, l);
354 return t_diff_constrain_dstrain;
355};
356
357template <typename T, int DIM>
358inline auto equivalent_strain_dot(
359 FTensor::Tensor2_symmetric<T, DIM> &t_plastic_strain_dot) {
360 FTensor::Index<'i', DIM> i;
361 FTensor::Index<'j', DIM> j;
362 constexpr double A = 2. / 3;
363 return std::sqrt(A * t_plastic_strain_dot(i, j) *
364 t_plastic_strain_dot(i, j)) +
365 std::numeric_limits<double>::epsilon();
366};
367
368template <typename T1, typename T2, typename T3, int DIM>
369inline auto diff_equivalent_strain_dot(const T1 eqiv, T2 &t_plastic_strain_dot,
370 T3 &t_diff_plastic_strain,
372 FTensor::Index<'i', DIM> i;
373 FTensor::Index<'j', DIM> j;
374 FTensor::Index<'k', DIM> k;
375 FTensor::Index<'l', DIM> l;
376 constexpr double A = 2. / 3;
378 t_diff_eqiv(i, j) = A * (t_plastic_strain_dot(k, l) / eqiv) *
379 t_diff_plastic_strain(k, l, i, j);
380 return t_diff_eqiv;
381};
382
383//! [Lambda functions]
384
385//! [Auxiliary functions functions
386static inline auto get_mat_tensor_sym_dvector(size_t rr, MatrixDouble &mat,
389 &mat(3 * rr + 0, 0), &mat(3 * rr + 0, 1), &mat(3 * rr + 1, 0),
390 &mat(3 * rr + 1, 1), &mat(3 * rr + 2, 0), &mat(3 * rr + 2, 1)};
391}
392
393static inline auto get_mat_tensor_sym_dvector(size_t rr, MatrixDouble &mat,
396 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
397 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
398 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
399 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
400 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
401 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2)};
402}
403
404//! [Auxiliary functions functions
405
406template <int DIM, typename DomainEleOp>
408 : public DomainEleOp {
410 const std::string field_name,
411 boost::shared_ptr<CommonData> plastic_common_data_ptr,
412 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
413 tp_common_data_ptr = nullptr);
414 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
415
416protected:
417 boost::shared_ptr<CommonData> commonDataPtr;
418 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
420};
422template <int DIM, typename DomainEleOp>
425 const std::string field_name,
426 boost::shared_ptr<CommonData> common_data_ptr,
427 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
428 tp_common_data_ptr)
430 commonDataPtr(common_data_ptr), commonTPDataPtr(tp_common_data_ptr) {
431 // Operator is only executed for vertices
432 std::fill(&DomainEleOp::doEntities[MBEDGE],
433 &DomainEleOp::doEntities[MBMAXTYPE], false);
434}
435
436template <int DIM, typename DomainEleOp>
438 int side, EntityType type, EntData &data) {
440
441 FTENSOR_INDEX(DIM, i);
442 FTENSOR_INDEX(DIM, j);
443
444 const size_t nb_gauss_pts = commonDataPtr->mStressPtr->size2();
445
446 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
447 auto t_plastic_strain =
448 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
449 auto t_temp = getFTensor0FromVec(commonTPDataPtr->temperature);
450
451 commonDataPtr->plasticIsoHardening.resize(nb_gauss_pts, false);
452 // commonDataPtr->plasticKinHardening.resize(size_symm, nb_gauss_pts, false);
453 // TODO: sort issue with FTensor::Tensor2_symmetric<double, DIM> for kinematic
454 // hardening
455 // commonDataPtr->plasticKinHardening.resize(size_symm, nb_gauss_pts, false);
456 auto t_iso_hardening = getFTensor0FromVec(commonDataPtr->plasticIsoHardening);
457 // auto t_kin_hardening =
458 // getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticKinHardening);
459
460 auto &params = commonDataPtr->blockParams;
461
462 for (int i = 0; i != nb_gauss_pts; ++i) {
463 t_iso_hardening =
464 iso_hardening(t_tau, params[CommonData::H], commonTPDataPtr->omega0,
465 params[CommonData::QINF], commonTPDataPtr->omegaH,
466 params[CommonData::BISO], params[CommonData::SIGMA_Y],
467 commonTPDataPtr->temp0, t_temp);
468
469 // auto t_kin_hardening_tmp =
470 // kinematic_hardening(t_plastic_strain, params[CommonData::C1_k]);
471
472 // t_kin_hardening(i, j) = t_kin_hardening_tmp(i, j);
473
474 ++t_tau;
475 ++t_plastic_strain;
476 ++t_temp;
477 ++t_iso_hardening;
478 // ++t_kin_hardening;
479 }
480
482}
483
484template <int DIM, typename DomainEleOp>
486 : public DomainEleOp {
488 boost::shared_ptr<CommonData> common_data_ptr);
489 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
490
491protected:
492 boost::shared_ptr<CommonData> commonDataPtr;
493};
494
495template <int DIM, typename DomainEleOp>
498 boost::shared_ptr<CommonData> common_data_ptr)
500 commonDataPtr(common_data_ptr) {
501 // Operator is only executed for vertices
502 std::fill(&DomainEleOp::doEntities[MBEDGE],
503 &DomainEleOp::doEntities[MBMAXTYPE], false);
504}
505
506template <int DIM, typename DomainEleOp>
507MoFEMErrorCode OpCalculatePlasticSurfaceImpl<DIM, GAUSS, DomainEleOp>::doWork(
508 int side, EntityType type, EntData &data) {
510
511 FTensor::Index<'i', DIM> i;
512 FTensor::Index<'j', DIM> j;
513
514 const size_t nb_gauss_pts = commonDataPtr->mStressPtr->size2();
515 auto t_stress =
516 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
517 auto t_plastic_strain =
518 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
519
520 commonDataPtr->plasticSurface.resize(nb_gauss_pts, false);
521 commonDataPtr->plasticFlow.resize(size_symm, nb_gauss_pts, false);
522 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
523
524 auto &params = commonDataPtr->blockParams;
525
526 for (auto &f : commonDataPtr->plasticSurface) {
527
528 f = platsic_surface(
529
530 deviator(
531 t_stress, trace(t_stress),
532 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k]))
533
534 );
535
536 auto t_flow_tmp =
537 plastic_flow(f,
538
539 deviator(t_stress, trace(t_stress),
540 kinematic_hardening(t_plastic_strain,
541 params[CommonData::C1_k])),
542
544 t_flow(i, j) = t_flow_tmp(i, j);
545
546 ++t_plastic_strain;
547 ++t_flow;
548 ++t_stress;
549 }
550
552}
553
554template <int DIM, typename DomainEleOp>
555struct OpCalculatePlasticityImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
556 OpCalculatePlasticityImpl(
557 const std::string field_name,
558 boost::shared_ptr<CommonData> common_data_ptr,
559 boost::shared_ptr<MatrixDouble> m_D_ptr,
560 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
561 tp_common_data_ptr = nullptr);
562 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
563
564protected:
565 boost::shared_ptr<CommonData> commonDataPtr;
566 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
568 boost::shared_ptr<MatrixDouble> mDPtr;
569};
570
571template <int DIM, typename DomainEleOp>
573 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
574 boost::shared_ptr<MatrixDouble> m_D_ptr,
575 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
576 tp_common_data_ptr)
578 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr),
579 TPCommonDataPtr(tp_common_data_ptr) {
580 // Opetor is only executed for vertices
581 std::fill(&DomainEleOp::doEntities[MBEDGE],
582 &DomainEleOp::doEntities[MBMAXTYPE], false);
583}
584
585template <int DIM, typename DomainEleOp>
587 int side, EntityType type, EntData &data) {
589
590 FTensor::Index<'i', DIM> i;
591 FTensor::Index<'j', DIM> j;
592 FTensor::Index<'k', DIM> k;
593 FTensor::Index<'l', DIM> l;
594 FTensor::Index<'m', DIM> m;
595 FTensor::Index<'n', DIM> n;
596
597 auto &params = commonDataPtr->blockParams; ///< material parameters
598
599 auto nb_gauss_pts = DomainEleOp::getGaussPts().size2();
600 auto t_w = DomainEleOp::getFTensor0IntegrationWeight();
601 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
602 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
603 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
604 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
605 auto t_plastic_strain =
606 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
607 auto t_plastic_strain_dot =
608 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrainDot);
609 auto t_stress =
610 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
611
612 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*commonDataPtr->mDPtr);
613 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
614
615 auto t_temp = getFTensor0FromVec(TPCommonDataPtr->temperature);
616
617 auto t_diff_plastic_strain = diff_tensor(FTensor::Number<DIM>());
618 auto t_diff_deviator = diff_deviator(diff_tensor(FTensor::Number<DIM>()));
619
620 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstress;
621 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstrain;
622 t_flow_dir_dstress(i, j, k, l) =
623 1.5 * (t_diff_deviator(M, N, i, j) * t_diff_deviator(M, N, k, l));
624 t_flow_dir_dstrain(i, j, k, l) =
625 t_flow_dir_dstress(i, j, m, n) * t_D_Op(m, n, k, l);
626
627 auto t_alpha_dir =
628 kinematic_hardening_dplastic_strain<DIM>(params[CommonData::C1_k]);
629
630 commonDataPtr->resC.resize(nb_gauss_pts, false);
631 commonDataPtr->resCdTau.resize(nb_gauss_pts, false);
632 commonDataPtr->resCdStrain.resize(size_symm, nb_gauss_pts, false);
633 commonDataPtr->resCdPlasticStrain.resize(size_symm, nb_gauss_pts, false);
634 TPCommonDataPtr->resCdTemperature.resize(nb_gauss_pts, false);
635 commonDataPtr->resFlow.resize(size_symm, nb_gauss_pts, false);
636 commonDataPtr->resFlowDtau.resize(size_symm, nb_gauss_pts, false);
637 commonDataPtr->resFlowDstrain.resize(size_symm * size_symm, nb_gauss_pts,
638 false);
639 commonDataPtr->resFlowDstrainDot.resize(size_symm * size_symm, nb_gauss_pts,
640 false);
641 TPCommonDataPtr->resFlowDtemp.resize(size_symm, nb_gauss_pts, false);
642
643 commonDataPtr->resC.clear();
644 commonDataPtr->resCdTau.clear();
645 commonDataPtr->resCdStrain.clear();
646 commonDataPtr->resCdPlasticStrain.clear();
647 TPCommonDataPtr->resCdTemperature.clear();
648 commonDataPtr->resFlow.clear();
649 commonDataPtr->resFlowDtau.clear();
650 commonDataPtr->resFlowDstrain.clear();
651 commonDataPtr->resFlowDstrainDot.clear();
652 TPCommonDataPtr->resFlowDtemp.clear();
653
654 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
655 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
656 auto t_res_c_dstrain =
657 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
658 auto t_res_c_plastic_strain =
659 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
660 auto t_res_c_temperature =
661 getFTensor0FromVec(TPCommonDataPtr->resCdTemperature);
662 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
663 auto t_res_flow_dtau =
664 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
665 auto t_res_flow_dstrain =
666 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
667 auto t_res_flow_dplastic_strain =
668 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
669 auto t_res_flow_dtemp =
670 getFTensor2SymmetricFromMat<DIM>(TPCommonDataPtr->resFlowDtemp);
671
672 auto next = [&]() {
673 ++t_tau;
674 ++t_tau_dot;
675 ++t_f;
676 ++t_flow;
677 ++t_plastic_strain;
678 ++t_plastic_strain_dot;
679 ++t_stress;
680 ++t_res_c;
681 ++t_res_c_dtau;
682 ++t_res_c_dstrain;
683 ++t_res_c_plastic_strain;
684 ++t_res_c_temperature;
685 ++t_res_flow;
686 ++t_res_flow_dtau;
687 ++t_res_flow_dstrain;
688 ++t_res_flow_dplastic_strain;
689 ++t_res_flow_dtemp;
690 ++t_w;
691 ++t_temp;
692 };
693
694 auto get_avtive_pts = [&]() {
695 int nb_points_avtive_on_elem = 0;
696 int nb_points_on_elem = 0;
697
698 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
699 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
700 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
701 auto t_plastic_strain_dot =
702 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
703 auto t_temp = getFTensor0FromVec(TPCommonDataPtr->temperature);
704
705 auto dt = this->getTStimeStep();
706
707 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
708 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
709 const auto ww =
710 w(eqiv, t_tau_dot, t_f,
711 iso_hardening(t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
712 params[CommonData::QINF], TPCommonDataPtr->omegaH,
713 params[CommonData::BISO], params[CommonData::SIGMA_Y],
714 TPCommonDataPtr->temp0, t_temp),
715 params[CommonData::SIGMA_Y]);
716 const auto sign_ww = constrian_sign(ww, dt);
717
718 ++nb_points_on_elem;
719 if (sign_ww > 0) {
720 ++nb_points_avtive_on_elem;
721 }
722
723 ++t_tau;
724 ++t_tau_dot;
725 ++t_f;
726 ++t_plastic_strain_dot;
727 ++t_temp;
728 }
729
730 int &active_points = PlasticOps::CommonData::activityData[0];
731 int &avtive_full_elems = PlasticOps::CommonData::activityData[1];
732 int &avtive_elems = PlasticOps::CommonData::activityData[2];
733 int &nb_points = PlasticOps::CommonData::activityData[3];
734 int &nb_elements = PlasticOps::CommonData::activityData[4];
735
736 ++nb_elements;
737 nb_points += nb_points_on_elem;
738 if (nb_points_avtive_on_elem > 0) {
739 ++avtive_elems;
740 active_points += nb_points_avtive_on_elem;
741 if (nb_points_avtive_on_elem == nb_points_on_elem) {
742 ++avtive_full_elems;
743 }
744 }
745
746 if (nb_points_avtive_on_elem != nb_points_on_elem)
747 return 1;
748 else
749 return 0;
750 };
751
752 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
753 get_avtive_pts();
754 }
755
756 auto dt = this->getTStimeStep();
757 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
758
759 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
760 auto t_diff_eqiv = diff_equivalent_strain_dot(eqiv, t_plastic_strain_dot,
761 t_diff_plastic_strain,
763
764 const auto sigma_y =
765 iso_hardening(t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
766 params[CommonData::QINF], TPCommonDataPtr->omegaH,
768 TPCommonDataPtr->temp0, t_temp);
769 const auto d_sigma_y = iso_hardening_dtau(
770 t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
771 params[CommonData::QINF], TPCommonDataPtr->omegaH,
773 TPCommonDataPtr->temp0, t_temp);
774
775 auto ww = w(eqiv, t_tau_dot, t_f, sigma_y, params[CommonData::SIGMA_Y]);
776 auto abs_ww = constrain_abs(ww, dt);
777 auto sign_ww = constrian_sign(ww, dt);
778
779 auto c = constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
780 params[CommonData::VIS_H], params[CommonData::SIGMA_Y]);
781 auto c_dot_tau = diff_constrain_ddot_tau(sign_ww, eqiv, t_tau_dot,
782 params[CommonData::VIS_H],
784 auto c_equiv = diff_constrain_deqiv(sign_ww, eqiv, t_tau_dot,
785 params[CommonData::SIGMA_Y]);
786 auto c_sigma_y = diff_constrain_dsigma_y(sign_ww);
787 auto c_f = diff_constrain_df(sign_ww);
788 auto d_sigma_y_dtemp = iso_hardening_dtemp(
789 t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
790 params[CommonData::QINF], TPCommonDataPtr->omegaH,
791 params[CommonData::BISO], params[CommonData::SIGMA_Y],
792 TPCommonDataPtr->temp0, t_temp);
793 auto c_temperature = diff_constrain_dtemp(c_sigma_y, d_sigma_y_dtemp);
794
795 auto t_dev_stress = deviator(
796
797 t_stress, trace(t_stress),
798
799 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k])
800
801 );
802
804 t_flow_dir(k, l) = 1.5 * (t_dev_stress(I, J) * t_diff_deviator(I, J, k, l));
806 t_flow_dstrain(i, j) = t_flow(k, l) * t_D_Op(k, l, i, j);
807
808 auto get_res_c = [&]() { return c; };
809
810 auto get_res_c_dstrain = [&](auto &t_diff_res) {
811 t_diff_res(i, j) = c_f * t_flow_dstrain(i, j);
812 };
813
814 auto get_res_c_dplastic_strain = [&](auto &t_diff_res) {
815 t_diff_res(i, j) = (this->getTSa() * c_equiv) * t_diff_eqiv(i, j);
816 t_diff_res(k, l) -= c_f * t_flow(i, j) * t_alpha_dir(i, j, k, l);
817 };
818
819 auto get_res_c_dtau = [&]() {
820 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
821 };
822
823 auto get_res_c_plastic_strain = [&](auto &t_diff_res) {
824 t_diff_res(k, l) = -c_f * t_flow(i, j) * t_alpha_dir(i, j, k, l);
825 };
826
827 auto get_res_c_dtemperature = [&]() { return c_temperature; };
828
829 auto get_res_flow = [&](auto &t_res_flow) {
830 const auto a = sigma_y;
831 const auto b = t_tau_dot;
832 t_res_flow(k, l) = a * t_plastic_strain_dot(k, l) - b * t_flow_dir(k, l);
833 };
834
835 auto get_res_flow_dtau = [&](auto &t_res_flow_dtau) {
836 const auto da = d_sigma_y;
837 const auto db = this->getTSa();
838 t_res_flow_dtau(k, l) =
839 da * t_plastic_strain_dot(k, l) - db * t_flow_dir(k, l);
840 };
841
842 auto get_res_flow_dstrain = [&](auto &t_res_flow_dstrain) {
843 const auto b = t_tau_dot;
844 t_res_flow_dstrain(m, n, k, l) = -t_flow_dir_dstrain(m, n, k, l) * b;
845 };
847 auto get_res_flow_dplastic_strain = [&](auto &t_res_flow_dplastic_strain) {
848 const auto a = sigma_y;
849 t_res_flow_dplastic_strain(m, n, k, l) =
850 (a * this->getTSa()) * t_diff_plastic_strain(m, n, k, l);
851 const auto b = t_tau_dot;
852 t_res_flow_dplastic_strain(m, n, i, j) +=
853 (t_flow_dir_dstrain(m, n, k, l) * t_alpha_dir(k, l, i, j)) * b;
854 };
855
856 auto get_res_flow_dtemp = [&](auto &t_res_flow_dtemp) {
857 const auto da = d_sigma_y_dtemp;
858 t_res_flow_dtemp(k, l) = da * t_plastic_strain_dot(k, l);
859 };
860
861 t_res_c = get_res_c();
862 get_res_flow(t_res_flow);
863
864 if (this->getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
865 t_res_c_dtau = get_res_c_dtau();
866 get_res_c_dstrain(t_res_c_dstrain);
867 get_res_c_dplastic_strain(t_res_c_plastic_strain);
868 t_res_c_temperature = get_res_c_dtemperature();
869 get_res_flow_dtau(t_res_flow_dtau);
870 get_res_flow_dstrain(t_res_flow_dstrain);
871 get_res_flow_dplastic_strain(t_res_flow_dplastic_strain);
872 get_res_flow_dtemp(t_res_flow_dtemp);
873 }
874
875 next();
876 }
877
879}
880
881template <int DIM, typename DomainEleOp>
884 const std::string field_name,
885 boost::shared_ptr<CommonData> common_data_ptr,
886 boost::shared_ptr<MatrixDouble> m_D_ptr,
887 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
888 tp_common_data_ptr = nullptr);
889 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
890
891protected:
892 boost::shared_ptr<CommonData> commonDataPtr;
893 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
895 boost::shared_ptr<MatrixDouble> mDPtr;
896};
897
898template <int DIM, typename DomainEleOp>
900 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
901 boost::shared_ptr<MatrixDouble> m_D_ptr,
902 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
903 tp_common_data_ptr)
905 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr),
906 TPCommonDataPtr(tp_common_data_ptr) {
907 // Opetor is only executed for vertices
908 std::fill(&DomainEleOp::doEntities[MBEDGE],
909 &DomainEleOp::doEntities[MBMAXTYPE], false);
910}
911
912template <int DIM, typename DomainEleOp>
914 int side, EntityType type, EntData &data) {
916
917 FTensor::Index<'i', DIM> i;
918 FTensor::Index<'j', DIM> j;
919 FTensor::Index<'k', DIM> k;
920 FTensor::Index<'l', DIM> l;
921 FTensor::Index<'m', DIM> m;
922 FTensor::Index<'n', DIM> n;
923
924 auto &params = commonDataPtr->blockParams; ///< material parameters
925
926 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
927 auto t_w = DomainEleOp::getFTensor0IntegrationWeight();
928 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
929 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
930 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
931 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
932 auto t_plastic_strain =
933 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
934 auto t_stress =
935 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
936
937 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*commonDataPtr->mDPtr);
938 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
939
940 auto t_temp = getFTensor0FromVec(TPCommonDataPtr->temperature);
941
942 auto t_diff_plastic_strain = diff_tensor(FTensor::Number<DIM>());
943 auto t_diff_deviator = diff_deviator(diff_tensor(FTensor::Number<DIM>()));
944
945 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstress;
946 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstrain;
947 t_flow_dir_dstress(i, j, k, l) =
948 1.5 * (t_diff_deviator(M, N, i, j) * t_diff_deviator(M, N, k, l));
949 t_flow_dir_dstrain(i, j, k, l) =
950 t_flow_dir_dstress(i, j, m, n) * t_D_Op(m, n, k, l);
951
952 auto t_alpha_dir =
953 kinematic_hardening_dplastic_strain<DIM>(params[CommonData::C1_k]);
954
955 commonDataPtr->resC.resize(nb_gauss_pts, false);
956 commonDataPtr->resCdTau.resize(nb_gauss_pts, false);
957 commonDataPtr->resCdStrain.resize(size_symm, nb_gauss_pts, false);
958 commonDataPtr->resCdPlasticStrain.resize(size_symm, nb_gauss_pts, false);
959 TPCommonDataPtr->resCdTemperature.resize(nb_gauss_pts, false);
960 commonDataPtr->resFlow.resize(size_symm, nb_gauss_pts, false);
961 commonDataPtr->resFlowDtau.resize(size_symm, nb_gauss_pts, false);
962 commonDataPtr->resFlowDstrain.resize(size_symm * size_symm, nb_gauss_pts,
963 false);
964 commonDataPtr->resFlowDstrainDot.resize(size_symm * size_symm, nb_gauss_pts,
965 false);
966 TPCommonDataPtr->resFlowDtemp.resize(size_symm, nb_gauss_pts, false);
967
968 commonDataPtr->resC.clear();
969 commonDataPtr->resCdTau.clear();
970 commonDataPtr->resCdStrain.clear();
971 commonDataPtr->resCdPlasticStrain.clear();
972 TPCommonDataPtr->resCdTemperature.clear();
973 commonDataPtr->resFlow.clear();
974 commonDataPtr->resFlowDtau.clear();
975 commonDataPtr->resFlowDstrain.clear();
976 commonDataPtr->resFlowDstrainDot.clear();
977 TPCommonDataPtr->resFlowDtemp.clear();
978
979 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
980 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
981 auto t_res_c_dstrain =
982 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
983 auto t_res_c_plastic_strain =
984 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
985 auto t_res_c_temperature =
986 getFTensor0FromVec(TPCommonDataPtr->resCdTemperature);
987 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
988 auto t_res_flow_dtau =
989 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
990 auto t_res_flow_dstrain =
991 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
992 auto t_res_flow_dplastic_strain =
993 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
994 auto t_res_flow_dtemp =
995 getFTensor2SymmetricFromMat<DIM>(TPCommonDataPtr->resFlowDtemp);
996
997 auto next = [&]() {
998 ++t_tau;
999 ++t_tau_dot;
1000 ++t_f;
1001 ++t_flow;
1002 ++t_plastic_strain;
1003 ++t_stress;
1004 ++t_res_c;
1005 ++t_res_c_dtau;
1006 ++t_res_c_dstrain;
1007 ++t_res_c_plastic_strain;
1008 ++t_res_c_temperature;
1009 ++t_res_flow;
1010 ++t_res_flow_dtau;
1011 ++t_res_flow_dstrain;
1012 ++t_res_flow_dplastic_strain;
1013 ++t_res_flow_dtemp;
1014 ++t_w;
1015 ++t_temp;
1016 };
1017
1018 auto get_avtive_pts = [&]() {
1019 int nb_points_avtive_on_elem = 0;
1020 int nb_points_on_elem = 0;
1021
1022 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
1023 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
1024 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
1025 auto t_plastic_strain_dot =
1026 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
1027 auto t_temp = getFTensor0FromVec(TPCommonDataPtr->temperature);
1028
1029 auto dt = this->getTStimeStep();
1030
1031 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
1032 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
1033 const auto ww =
1034 w(eqiv, t_tau_dot, t_f,
1035 iso_hardening(t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
1036 params[CommonData::QINF], TPCommonDataPtr->omegaH,
1037 params[CommonData::BISO], params[CommonData::SIGMA_Y],
1038 TPCommonDataPtr->temp0, t_temp),
1039 params[CommonData::SIGMA_Y]);
1040 const auto sign_ww = constrian_sign(ww, dt);
1041
1042 ++nb_points_on_elem;
1043 if (sign_ww > 0) {
1044 ++nb_points_avtive_on_elem;
1045 }
1046
1047 ++t_tau;
1048 ++t_tau_dot;
1049 ++t_f;
1050 ++t_plastic_strain_dot;
1051 ++t_temp;
1052 }
1053
1054 int &active_points = PlasticOps::CommonData::activityData[0];
1055 int &avtive_full_elems = PlasticOps::CommonData::activityData[1];
1056 int &avtive_elems = PlasticOps::CommonData::activityData[2];
1057 int &nb_points = PlasticOps::CommonData::activityData[3];
1058 int &nb_elements = PlasticOps::CommonData::activityData[4];
1059
1060 ++nb_elements;
1061 nb_points += nb_points_on_elem;
1062 if (nb_points_avtive_on_elem > 0) {
1063 ++avtive_elems;
1064 active_points += nb_points_avtive_on_elem;
1065 if (nb_points_avtive_on_elem == nb_points_on_elem) {
1066 ++avtive_full_elems;
1067 }
1068 }
1069
1070 if (nb_points_avtive_on_elem != nb_points_on_elem)
1071 return 1;
1072 else
1073 return 0;
1076 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
1077 get_avtive_pts();
1078 }
1080 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
1081
1082 double eqiv;
1084
1085 double c_dot_tau, c_sigma_y, c, c_f, c_equiv;
1086
1087 eqiv = 0.0;
1088 t_diff_eqiv(i, j) = 0.0;
1089 c = 0.0;
1090 c_dot_tau = 0.0;
1091 c_equiv = 0.0;
1092 c_sigma_y = 0.0;
1093 c_f = 0.0;
1095 auto t_dev_stress = deviator(
1096
1097 t_stress, trace(t_stress),
1098
1099 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k])
1100
1101 );
1102
1103 next();
1104 }
1107}
1108
1109template <int DIM, typename DomainEleOp>
1110struct OpPlasticStressImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
1112 /**
1113 * @deprecated do not use this constructor
1114 */
1116 boost::shared_ptr<CommonData> common_data_ptr,
1117 boost::shared_ptr<MatrixDouble> mDPtr);
1118 OpPlasticStressImpl(boost::shared_ptr<CommonData> common_data_ptr,
1119 boost::shared_ptr<MatrixDouble> mDPtr);
1121 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
1122
1123private:
1124 boost::shared_ptr<MatrixDouble> mDPtr;
1125 boost::shared_ptr<CommonData> commonDataPtr;
1126};
1127
1128template <int DIM, typename DomainEleOp>
1130 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
1131 boost::shared_ptr<MatrixDouble> m_D_ptr)
1133 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1134 // Operator is only executed for vertices
1135 std::fill(&DomainEleOp::doEntities[MBEDGE],
1136 &DomainEleOp::doEntities[MBMAXTYPE], false);
1137}
1138
1139template <int DIM, typename DomainEleOp>
1140OpPlasticStressImpl<DIM, GAUSS, DomainEleOp>::OpPlasticStressImpl(
1141 boost::shared_ptr<CommonData> common_data_ptr,
1142 boost::shared_ptr<MatrixDouble> m_D_ptr)
1143 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE),
1144 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1145
1146//! [Calculate stress]
1147template <int DIM, typename DomainEleOp>
1149OpPlasticStressImpl<DIM, GAUSS, DomainEleOp>::doWork(int side, EntityType type,
1150 EntData &data) {
1152
1153 FTensor::Index<'i', DIM> i;
1154 FTensor::Index<'j', DIM> j;
1155 FTensor::Index<'k', DIM> k;
1156 FTensor::Index<'l', DIM> l;
1157
1158 const size_t nb_gauss_pts = commonDataPtr->mStrainPtr->size2();
1159 commonDataPtr->mStressPtr->resize((DIM * (DIM + 1)) / 2, nb_gauss_pts);
1160 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
1161 auto t_strain =
1162 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStrainPtr));
1163 auto t_plastic_strain =
1164 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
1165 auto t_stress =
1166 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
1167
1168 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
1169 t_stress(i, j) =
1170 t_D(i, j, k, l) * (t_strain(k, l) - t_plastic_strain(k, l));
1171 ++t_strain;
1172 ++t_plastic_strain;
1173 ++t_stress;
1174 }
1175
1177}
1178//! [Calculate stress]
1179
1180template <int DIM, typename AssemblyDomainEleOp>
1182 : public AssemblyDomainEleOp {
1184 boost::shared_ptr<CommonData> common_data_ptr,
1185 boost::shared_ptr<MatrixDouble> m_D_ptr);
1186 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
1187
1188private:
1189 boost::shared_ptr<CommonData> commonDataPtr;
1190 boost::shared_ptr<MatrixDouble> mDPtr;
1191};
1192
1193template <int DIM, typename AssemblyDomainEleOp>
1196 boost::shared_ptr<CommonData> common_data_ptr,
1197 boost::shared_ptr<MatrixDouble> m_D_ptr)
1199 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1200
1201template <int DIM, typename AssemblyDomainEleOp>
1202MoFEMErrorCode
1204 EntitiesFieldData::EntData &data) {
1206
1207 FTensor::Index<'i', DIM> i;
1209 FTensor::Index<'k', DIM> k;
1210 FTensor::Index<'l', DIM> l;
1211 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1212 FTensor::Index<'L', size_symm> L;
1213
1214 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1215 const auto nb_base_functions = data.getN().size2();
1216
1217 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
1218
1219 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1220
1221 auto next = [&]() { ++t_res_flow; };
1222
1223 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1224 auto t_base = data.getFTensor0N();
1225 auto &nf = AssemblyDomainEleOp::locF;
1226 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1227 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1228 ++t_w;
1229
1231 t_rhs(L) = alpha * (t_res_flow(i, j) * t_L(i, j, L));
1232 next();
1233
1234 auto t_nf = getFTensor1FromArray<size_symm, size_symm>(nf);
1235 size_t bb = 0;
1236 for (; bb != AssemblyDomainEleOp::nbRows / size_symm; ++bb) {
1237 t_nf(L) += t_base * t_rhs(L);
1238 ++t_base;
1239 ++t_nf;
1240 }
1241 for (; bb < nb_base_functions; ++bb)
1242 ++t_base;
1243 }
1244
1246}
1247
1248template <typename AssemblyDomainEleOp>
1249struct OpCalculateConstraintsRhsImpl<GAUSS, AssemblyDomainEleOp>
1250 : public AssemblyDomainEleOp {
1252 boost::shared_ptr<CommonData> common_data_ptr,
1253 boost::shared_ptr<MatrixDouble> m_D_ptr);
1254 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
1255
1256private:
1257 boost::shared_ptr<CommonData> commonDataPtr;
1258 boost::shared_ptr<MatrixDouble> mDPtr;
1259};
1260
1261template <typename AssemblyDomainEleOp>
1264 boost::shared_ptr<CommonData> common_data_ptr,
1265 boost::shared_ptr<MatrixDouble> m_D_ptr)
1267 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1268
1269template <typename AssemblyDomainEleOp>
1270MoFEMErrorCode
1272 EntitiesFieldData::EntData &data) {
1275 const size_t nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1276 const size_t nb_base_functions = data.getN().size2();
1277
1278 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
1279
1280 auto next = [&]() { ++t_res_c; };
1281
1282 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1283 auto &nf = AssemblyDomainEleOp::locF;
1284 auto t_base = data.getFTensor0N();
1285 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1286 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1287 ++t_w;
1288 const auto res = alpha * t_res_c;
1289 next();
1291 size_t bb = 0;
1292 for (; bb != AssemblyDomainEleOp::nbRows; ++bb) {
1293 nf[bb] += t_base * res;
1294 ++t_base;
1295 }
1296 for (; bb < nb_base_functions; ++bb)
1297 ++t_base;
1298 }
1299
1301}
1302
1303template <int DIM, typename AssemblyDomainEleOp>
1304struct OpCalculatePlasticFlowLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>
1305 : public AssemblyDomainEleOp {
1307 const std::string row_field_name, const std::string col_field_name,
1308 boost::shared_ptr<CommonData> common_data_ptr,
1309 boost::shared_ptr<MatrixDouble> m_D_ptr);
1310 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1311 EntitiesFieldData::EntData &col_data);
1312
1313private:
1314 boost::shared_ptr<CommonData> commonDataPtr;
1315 boost::shared_ptr<MatrixDouble> mDPtr;
1316};
1317
1318template <int DIM, typename AssemblyDomainEleOp>
1321 const std::string row_field_name, const std::string col_field_name,
1322 boost::shared_ptr<CommonData> common_data_ptr,
1323 boost::shared_ptr<MatrixDouble> m_D_ptr)
1324 : AssemblyDomainEleOp(row_field_name, col_field_name,
1325 AssemblyDomainEleOp::OPROWCOL),
1326 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1327 AssemblyDomainEleOp::sYmm = false;
1328}
1329
1330static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
1333 &mat(3 * rr + 0, 0), &mat(3 * rr + 0, 1), &mat(3 * rr + 0, 2),
1334 &mat(3 * rr + 1, 0), &mat(3 * rr + 1, 1), &mat(3 * rr + 1, 2),
1335 &mat(3 * rr + 2, 0), &mat(3 * rr + 2, 1), &mat(3 * rr + 2, 2)};
1336}
1337
1338static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
1341 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
1342 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
1343 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
1344 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
1345 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
1346 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
1347 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
1348 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
1349 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
1350 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
1351 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
1352 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
1353}
1354
1355template <int DIM, typename AssemblyDomainEleOp>
1356MoFEMErrorCode
1357OpCalculatePlasticFlowLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1358 EntitiesFieldData::EntData &row_data,
1359 EntitiesFieldData::EntData &col_data) {
1361
1362 FTensor::Index<'i', DIM> i;
1363 FTensor::Index<'j', DIM> j;
1364 FTensor::Index<'k', DIM> k;
1365 FTensor::Index<'l', DIM> l;
1366 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1367 FTensor::Index<'L', size_symm> L;
1368 FTensor::Index<'O', size_symm> O;
1369
1370 auto &locMat = AssemblyDomainEleOp::locMat;
1371
1372 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1373 const auto nb_row_base_functions = row_data.getN().size2();
1374
1375 auto t_res_flow_dstrain =
1376 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
1377 auto t_res_flow_dplastic_strain =
1378 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
1379 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1380
1381 auto next = [&]() {
1382 ++t_res_flow_dstrain;
1383 ++t_res_flow_dplastic_strain;
1384 };
1385
1386 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1387 auto t_row_base = row_data.getFTensor0N();
1388 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1389 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1390 ++t_w;
1391
1393 t_res_mat(O, L) =
1394 alpha * (t_L(i, j, O) * ((t_res_flow_dplastic_strain(i, j, k, l) -
1395 t_res_flow_dstrain(i, j, k, l)) *
1396 t_L(k, l, L)));
1397 next();
1398
1399 size_t rr = 0;
1400 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
1401 auto t_mat = get_mat_tensor_sym_dtensor_sym(rr, locMat,
1403 auto t_col_base = col_data.getFTensor0N(gg, 0);
1404 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; ++cc) {
1405 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
1406 ++t_mat;
1407 ++t_col_base;
1408 }
1409
1410 ++t_row_base;
1411 }
1412
1413 for (; rr < nb_row_base_functions; ++rr)
1414 ++t_row_base;
1415 }
1416
1418}
1419
1420template <int DIM, typename AssemblyDomainEleOp>
1421struct OpCalculateConstraintsLhs_dUImpl<DIM, GAUSS, AssemblyDomainEleOp>
1422 : public AssemblyDomainEleOp {
1424 const std::string row_field_name, const std::string col_field_name,
1425 boost::shared_ptr<CommonData> common_data_ptr,
1426 boost::shared_ptr<MatrixDouble> m_D_ptr);
1427 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1428 EntitiesFieldData::EntData &col_data);
1429
1430private:
1431 boost::shared_ptr<CommonData> commonDataPtr;
1432 boost::shared_ptr<MatrixDouble> mDPtr;
1433};
1434
1435template <int DIM, typename AssemblyDomainEleOp>
1437 : public AssemblyDomainEleOp {
1439 const std::string row_field_name, const std::string col_field_name,
1440 boost::shared_ptr<CommonData> common_data_ptr,
1441 boost::shared_ptr<MatrixDouble> m_D_ptr);
1442 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1443 EntitiesFieldData::EntData &col_data);
1444
1445private:
1446 boost::shared_ptr<CommonData> commonDataPtr;
1447 boost::shared_ptr<MatrixDouble> mDPtr;
1448};
1449
1450template <int DIM, typename AssemblyDomainEleOp>
1453 const std::string row_field_name, const std::string col_field_name,
1454 boost::shared_ptr<CommonData> common_data_ptr,
1455 boost::shared_ptr<MatrixDouble> m_D_ptr)
1456 : AssemblyDomainEleOp(row_field_name, col_field_name,
1457 DomainEleOp::OPROWCOL),
1458 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1459 AssemblyDomainEleOp::sYmm = false;
1460}
1461
1462static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
1465 &mat(3 * rr + 0, 0), &mat(3 * rr + 1, 0), &mat(3 * rr + 2, 0)};
1466}
1467
1468static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
1471 &mat(6 * rr + 0, 0), &mat(6 * rr + 1, 0), &mat(6 * rr + 2, 0),
1472 &mat(6 * rr + 3, 0), &mat(6 * rr + 4, 0), &mat(6 * rr + 5, 0)};
1473}
1474
1475template <int DIM, typename AssemblyDomainEleOp>
1476MoFEMErrorCode
1477OpCalculatePlasticFlowLhs_dTAUImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1478 EntitiesFieldData::EntData &row_data,
1479 EntitiesFieldData::EntData &col_data) {
1481
1482 FTensor::Index<'i', DIM> i;
1483 FTensor::Index<'j', DIM> j;
1484 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1485 FTensor::Index<'L', size_symm> L;
1486
1487 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1488 const size_t nb_row_base_functions = row_data.getN().size2();
1489 auto &locMat = AssemblyDomainEleOp::locMat;
1490
1491 auto t_res_flow_dtau =
1492 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1493
1494 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1495
1496 auto next = [&]() { ++t_res_flow_dtau; };
1497
1498 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1499 auto t_row_base = row_data.getFTensor0N();
1500 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1501 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1502 ++t_w;
1504 t_res_vec(L) = alpha * (t_res_flow_dtau(i, j) * t_L(i, j, L));
1505 next();
1506
1507 size_t rr = 0;
1508 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
1509 auto t_mat =
1511 auto t_col_base = col_data.getFTensor0N(gg, 0);
1512 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1513 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1514 ++t_mat;
1515 ++t_col_base;
1516 }
1517 ++t_row_base;
1518 }
1519 for (; rr != nb_row_base_functions; ++rr)
1520 ++t_row_base;
1521 }
1522
1524}
1525
1526template <int DIM, typename AssemblyDomainEleOp>
1527struct OpCalculateConstraintsLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>
1528 : public AssemblyDomainEleOp {
1530 const std::string row_field_name, const std::string col_field_name,
1531 boost::shared_ptr<CommonData> common_data_ptr,
1532 boost::shared_ptr<MatrixDouble> mat_D_ptr);
1533 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1534 EntitiesFieldData::EntData &col_data);
1535
1536private:
1537 boost::shared_ptr<CommonData> commonDataPtr;
1538 boost::shared_ptr<MatrixDouble> mDPtr;
1539};
1540
1541template <int DIM, typename AssemblyDomainEleOp>
1544 const std::string row_field_name, const std::string col_field_name,
1545 boost::shared_ptr<CommonData> common_data_ptr,
1546 boost::shared_ptr<MatrixDouble> m_D_ptr)
1547 : AssemblyDomainEleOp(row_field_name, col_field_name,
1548 DomainEleOp::OPROWCOL),
1549 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1550 AssemblyDomainEleOp::sYmm = false;
1551}
1552
1553auto get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number<2>) {
1555 &mat(0, 0), &mat(0, 1), &mat(0, 2)};
1556}
1557
1558auto get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number<3>) {
1560 &mat(0, 0), &mat(0, 1), &mat(0, 2), &mat(0, 3), &mat(0, 4), &mat(0, 5)};
1561}
1562
1563template <int DIM, typename AssemblyDomainEleOp>
1565OpCalculateConstraintsLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1566 EntitiesFieldData::EntData &row_data,
1567 EntitiesFieldData::EntData &col_data) {
1569
1570 FTensor::Index<'i', DIM> i;
1571 FTensor::Index<'j', DIM> j;
1572 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1574
1575 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1576 const auto nb_row_base_functions = row_data.getN().size2();
1577
1578 auto t_c_dstrain =
1579 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1580 auto t_c_dplastic_strain =
1581 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1582
1583 auto next = [&]() {
1584 ++t_c_dstrain;
1585 ++t_c_dplastic_strain;
1586 };
1587
1589
1590 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1591 auto t_row_base = row_data.getFTensor0N();
1592 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
1593 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1594 ++t_w;
1595
1597 t_res_vec(L) =
1598 t_L(i, j, L) * (t_c_dplastic_strain(i, j) - t_c_dstrain(i, j));
1599 next();
1600
1601 auto t_mat = get_mat_scalar_dtensor_sym(AssemblyDomainEleOp::locMat,
1603 size_t rr = 0;
1604 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1605 const auto row_base = alpha * t_row_base;
1606 auto t_col_base = col_data.getFTensor0N(gg, 0);
1607 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; cc++) {
1608 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1609 ++t_mat;
1610 ++t_col_base;
1611 }
1612 ++t_row_base;
1613 }
1614 for (; rr != nb_row_base_functions; ++rr)
1615 ++t_row_base;
1616 }
1617
1619}
1620
1621template <typename AssemblyDomainEleOp>
1622struct OpCalculateConstraintsLhs_dTAUImpl<GAUSS, AssemblyDomainEleOp>
1623 : public AssemblyDomainEleOp {
1625 const std::string row_field_name, const std::string col_field_name,
1626 boost::shared_ptr<CommonData> common_data_ptr);
1627 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1628 EntitiesFieldData::EntData &col_data);
1629
1630private:
1631 boost::shared_ptr<CommonData> commonDataPtr;
1632};
1633
1634template <typename AssemblyDomainEleOp>
1637 const std::string row_field_name, const std::string col_field_name,
1638 boost::shared_ptr<CommonData> common_data_ptr)
1639 : AssemblyDomainEleOp(row_field_name, col_field_name,
1640 DomainEleOp::OPROWCOL),
1641 commonDataPtr(common_data_ptr) {
1642 AssemblyDomainEleOp::sYmm = false;
1643}
1644
1645template <typename AssemblyDomainEleOp>
1646MoFEMErrorCode
1647OpCalculateConstraintsLhs_dTAUImpl<GAUSS, AssemblyDomainEleOp>::iNtegrate(
1648 EntitiesFieldData::EntData &row_data,
1649 EntitiesFieldData::EntData &col_data) {
1651
1652 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1653 const auto nb_row_base_functions = row_data.getN().size2();
1654
1655 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1656 auto next = [&]() { ++t_res_c_dtau; };
1657
1658 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1659 auto t_row_base = row_data.getFTensor0N();
1660 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1661 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1662 ++t_w;
1663
1664 const auto res = alpha * (t_res_c_dtau);
1665 next();
1666
1667 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1668 size_t rr = 0;
1669 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1670 auto t_col_base = col_data.getFTensor0N(gg, 0);
1671 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1672 *mat_ptr += t_row_base * t_col_base * res;
1673 ++t_col_base;
1674 ++mat_ptr;
1675 }
1676 ++t_row_base;
1677 }
1678 for (; rr < nb_row_base_functions; ++rr)
1679 ++t_row_base;
1680 }
1681
1683}
1684}; // namespace PlasticOps
constexpr double third
#define FTENSOR_INDEX(DIM, I)
constexpr double a
EntitiesFieldData::EntData EntData
[Define entities]
Kronecker Delta class symmetric.
@ NOSPACE
Definition definitions.h:83
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define DEPRECATED
Definition definitions.h:17
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
constexpr auto t_kd
@ GAUSS
Gaussian quadrature integration.
FTensor::Index< 'i', SPACE_DIM > i
double dt
const double c
speed of light (cm/ns)
const double n
refractive index of diffusive medium
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
static auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
FTensor::Index< 'N', 3 > N
auto diff_plastic_flow_dstress(long double f, FTensor::Tensor2_symmetric< T, DIM > &t_flow, FTensor::Ddg< double, 3, DIM > &&t_diff_deviator)
static auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
double platsic_surface(FTensor::Tensor2_symmetric< double, 3 > &&t_stress_deviator)
auto diff_constrain_dtemp(double dc_dsigmay, double dsigma_y_dtemp)
auto get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number< 2 >)
auto symm_L_tensor(FTensor::Number< DIM >)
double diff_constrain_ddot_tau(double sign, double eqiv, double dot_tau, double vis_H, double sigma_Y)
auto diff_constrain_dstress(double diff_constrain_df, FTensor::Tensor2_symmetric< T, DIM > &t_plastic_flow)
double constrian_sign(double x, double dt)
FTensor::Index< 'J', 3 > J
double diff_constrain_deqiv(double sign, double eqiv, double dot_tau, double sigma_Y)
FTensor::Index< 'M', 3 > M
auto diff_equivalent_strain_dot(const T1 eqiv, T2 &t_plastic_strain_dot, T3 &t_diff_plastic_strain, FTensor::Number< DIM >)
double constraint(double eqiv, double dot_tau, double f, double sigma_y, double abs_w, double vis_H, double sigma_Y)
auto diff_constrain_df(double sign)
auto diff_constrain_dsigma_y(double sign)
auto diff_symmetrize(FTensor::Number< DIM >)
auto diff_tensor(FTensor::Number< DIM >)
[Lambda functions]
FTensor::Index< 'I', 3 > I
[Common data]
auto diff_deviator(FTensor::Ddg< double, DIM, DIM > &&t_diff_stress, FTensor::Number< DIM >)
double trace(FTensor::Tensor2_symmetric< T, 2 > &t_stress)
auto diff_plastic_flow_dstrain(FTensor::Ddg< T, DIM, DIM > &t_D, FTensor::Ddg< double, DIM, DIM > &&t_diff_plastic_flow_dstress)
auto plastic_flow(long double f, FTensor::Tensor2_symmetric< double, 3 > &&t_dev_stress, FTensor::Ddg< double, 3, DIM > &&t_diff_deviator)
auto deviator(FTensor::Tensor2_symmetric< T, DIM > &t_stress, double trace, FTensor::Tensor2_symmetric< double, DIM > &t_alpha, FTensor::Number< DIM >)
double w(double eqiv, double dot_tau, double f, double sigma_y, double sigma_Y)
auto diff_constrain_dstrain(T1 &t_D, T2 &&t_diff_constrain_dstress)
static auto get_mat_tensor_sym_dvector(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
[Lambda functions]
auto equivalent_strain_dot(FTensor::Tensor2_symmetric< T, DIM > &t_plastic_strain_dot)
double constrain_abs(double x, double dt)
constexpr AssemblyType A
[Define dimension]
constexpr auto field_name
FTensor::Index< 'm', 3 > m
Data on single entity (This is passed as argument to DataOperator::doWork)
static std::array< int, 5 > activityData
OpCalculateConstraintsLhs_dEPImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > mat_D_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculateConstraintsLhs_dTAUImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculateConstraintsLhs_dUImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculateConstraintsRhsImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculatePlasticFlowLhs_dEPImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculatePlasticFlowLhs_dTAUImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
OpCalculatePlasticFlowRhsImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > commonTPDataPtr
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpCalculatePlasticSurfaceImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > TPCommonDataPtr
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > TPCommonDataPtr
OpPlasticStressImpl(boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > mDPtr)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
DEPRECATED OpPlasticStressImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > mDPtr)
double iso_hardening_dtemp(double tau, double H, double omega_0, double Qinf, double omega_h, double b_iso, double sigmaY, double temp_0, double temp)
auto kinematic_hardening(FTensor::Tensor2_symmetric< T, DIM > &t_plastic_strain, double C1_k)
Definition plastic.cpp:92
double iso_hardening_dtau(double tau, double H, double Qinf, double b_iso)
Definition plastic.cpp:78
constexpr auto size_symm
Definition plastic.cpp:42
double zeta
Viscous hardening.
Definition plastic.cpp:130
double cn0
Definition plastic.cpp:135
double iso_hardening(double tau, double H, double Qinf, double b_iso, double sigmaY)
Definition plastic.cpp:73
double cn1
Definition plastic.cpp:136