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 const auto sigma_y =
1086 iso_hardening(t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
1087 params[CommonData::QINF], TPCommonDataPtr->omegaH,
1088 params[CommonData::BISO], params[CommonData::SIGMA_Y],
1089 TPCommonDataPtr->temp0, t_temp);
1090 const auto d_sigma_y = iso_hardening_dtau(
1091 t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
1092 params[CommonData::QINF], TPCommonDataPtr->omegaH,
1093 params[CommonData::BISO], params[CommonData::SIGMA_Y],
1094 TPCommonDataPtr->temp0, t_temp);
1095
1096 double c_dot_tau, c_sigma_y, c, c_f, c_temperature, c_equiv;
1097
1098 eqiv = 0.0;
1099 t_diff_eqiv(i, j) = 0.0;
1100 c = 0.0;
1101 c_dot_tau = 0.0;
1102 c_equiv = 0.0;
1103 c_sigma_y = 0.0;
1104 c_f = 0.0;
1106 auto d_sigma_y_dtemp = iso_hardening_dtemp(
1107 t_tau, params[CommonData::H], TPCommonDataPtr->omega0,
1108 params[CommonData::QINF], TPCommonDataPtr->omegaH,
1109 params[CommonData::BISO], params[CommonData::SIGMA_Y],
1110 TPCommonDataPtr->temp0, t_temp);
1112 auto t_dev_stress = deviator(
1113
1114 t_stress, trace(t_stress),
1115
1116 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k])
1117
1118 );
1119
1120 next();
1121 }
1122
1124}
1125
1126template <int DIM, typename DomainEleOp>
1127struct OpPlasticStressImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
1128
1129 /**
1130 * @deprecated do not use this constructor
1131 */
1133 boost::shared_ptr<CommonData> common_data_ptr,
1134 boost::shared_ptr<MatrixDouble> mDPtr);
1135 OpPlasticStressImpl(boost::shared_ptr<CommonData> common_data_ptr,
1136 boost::shared_ptr<MatrixDouble> mDPtr);
1137
1138 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
1139
1140private:
1141 boost::shared_ptr<MatrixDouble> mDPtr;
1142 boost::shared_ptr<CommonData> commonDataPtr;
1143};
1144
1145template <int DIM, typename DomainEleOp>
1147 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
1148 boost::shared_ptr<MatrixDouble> m_D_ptr)
1150 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1151 // Operator is only executed for vertices
1152 std::fill(&DomainEleOp::doEntities[MBEDGE],
1153 &DomainEleOp::doEntities[MBMAXTYPE], false);
1154}
1155
1156template <int DIM, typename DomainEleOp>
1157OpPlasticStressImpl<DIM, GAUSS, DomainEleOp>::OpPlasticStressImpl(
1158 boost::shared_ptr<CommonData> common_data_ptr,
1159 boost::shared_ptr<MatrixDouble> m_D_ptr)
1160 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE),
1161 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1162
1163//! [Calculate stress]
1164template <int DIM, typename DomainEleOp>
1166OpPlasticStressImpl<DIM, GAUSS, DomainEleOp>::doWork(int side, EntityType type,
1167 EntData &data) {
1169
1171 FTensor::Index<'j', DIM> j;
1172 FTensor::Index<'k', DIM> k;
1173 FTensor::Index<'l', DIM> l;
1174
1175 const size_t nb_gauss_pts = commonDataPtr->mStrainPtr->size2();
1176 commonDataPtr->mStressPtr->resize((DIM * (DIM + 1)) / 2, nb_gauss_pts);
1177 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
1178 auto t_strain =
1179 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStrainPtr));
1180 auto t_plastic_strain =
1181 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
1182 auto t_stress =
1183 getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
1184
1185 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
1186 t_stress(i, j) =
1187 t_D(i, j, k, l) * (t_strain(k, l) - t_plastic_strain(k, l));
1188 ++t_strain;
1189 ++t_plastic_strain;
1190 ++t_stress;
1191 }
1192
1194}
1195//! [Calculate stress]
1197template <int DIM, typename AssemblyDomainEleOp>
1199 : public AssemblyDomainEleOp {
1201 boost::shared_ptr<CommonData> common_data_ptr,
1202 boost::shared_ptr<MatrixDouble> m_D_ptr);
1203 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
1204
1205private:
1206 boost::shared_ptr<CommonData> commonDataPtr;
1207 boost::shared_ptr<MatrixDouble> mDPtr;
1209
1210template <int DIM, typename AssemblyDomainEleOp>
1213 boost::shared_ptr<CommonData> common_data_ptr,
1214 boost::shared_ptr<MatrixDouble> m_D_ptr)
1216 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1217
1218template <int DIM, typename AssemblyDomainEleOp>
1219MoFEMErrorCode
1220OpCalculatePlasticFlowRhsImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1221 EntitiesFieldData::EntData &data) {
1223
1224 FTensor::Index<'i', DIM> i;
1225 FTensor::Index<'j', DIM> j;
1226 FTensor::Index<'k', DIM> k;
1227 FTensor::Index<'l', DIM> l;
1228 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1229 FTensor::Index<'L', size_symm> L;
1230
1231 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1232 const auto nb_base_functions = data.getN().size2();
1233
1234 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
1235
1236 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1237
1238 auto next = [&]() { ++t_res_flow; };
1239
1240 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1241 auto t_base = data.getFTensor0N();
1242 auto &nf = AssemblyDomainEleOp::locF;
1243 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1244 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1245 ++t_w;
1246
1248 t_rhs(L) = alpha * (t_res_flow(i, j) * t_L(i, j, L));
1249 next();
1250
1251 auto t_nf = getFTensor1FromArray<size_symm, size_symm>(nf);
1252 size_t bb = 0;
1253 for (; bb != AssemblyDomainEleOp::nbRows / size_symm; ++bb) {
1254 t_nf(L) += t_base * t_rhs(L);
1255 ++t_base;
1256 ++t_nf;
1257 }
1258 for (; bb < nb_base_functions; ++bb)
1259 ++t_base;
1260 }
1261
1263}
1264
1265template <typename AssemblyDomainEleOp>
1267 : public AssemblyDomainEleOp {
1269 boost::shared_ptr<CommonData> common_data_ptr,
1270 boost::shared_ptr<MatrixDouble> m_D_ptr);
1271 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
1272
1273private:
1274 boost::shared_ptr<CommonData> commonDataPtr;
1275 boost::shared_ptr<MatrixDouble> mDPtr;
1276};
1277
1278template <typename AssemblyDomainEleOp>
1281 boost::shared_ptr<CommonData> common_data_ptr,
1282 boost::shared_ptr<MatrixDouble> m_D_ptr)
1284 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
1285
1286template <typename AssemblyDomainEleOp>
1287MoFEMErrorCode
1289 EntitiesFieldData::EntData &data) {
1291
1292 const size_t nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1293 const size_t nb_base_functions = data.getN().size2();
1294
1295 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
1296
1297 auto next = [&]() { ++t_res_c; };
1298
1299 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1300 auto &nf = AssemblyDomainEleOp::locF;
1301 auto t_base = data.getFTensor0N();
1302 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1303 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1304 ++t_w;
1305 const auto res = alpha * t_res_c;
1306 next();
1307
1308 size_t bb = 0;
1309 for (; bb != AssemblyDomainEleOp::nbRows; ++bb) {
1310 nf[bb] += t_base * res;
1311 ++t_base;
1312 }
1313 for (; bb < nb_base_functions; ++bb)
1314 ++t_base;
1315 }
1316
1318}
1319
1320template <int DIM, typename AssemblyDomainEleOp>
1321struct OpCalculatePlasticFlowLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>
1322 : public AssemblyDomainEleOp {
1324 const std::string row_field_name, const std::string col_field_name,
1325 boost::shared_ptr<CommonData> common_data_ptr,
1326 boost::shared_ptr<MatrixDouble> m_D_ptr);
1327 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1328 EntitiesFieldData::EntData &col_data);
1329
1330private:
1331 boost::shared_ptr<CommonData> commonDataPtr;
1332 boost::shared_ptr<MatrixDouble> mDPtr;
1333};
1334
1335template <int DIM, typename AssemblyDomainEleOp>
1338 const std::string row_field_name, const std::string col_field_name,
1339 boost::shared_ptr<CommonData> common_data_ptr,
1340 boost::shared_ptr<MatrixDouble> m_D_ptr)
1341 : AssemblyDomainEleOp(row_field_name, col_field_name,
1342 AssemblyDomainEleOp::OPROWCOL),
1343 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1344 AssemblyDomainEleOp::sYmm = false;
1345}
1346
1347static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
1350 &mat(3 * rr + 0, 0), &mat(3 * rr + 0, 1), &mat(3 * rr + 0, 2),
1351 &mat(3 * rr + 1, 0), &mat(3 * rr + 1, 1), &mat(3 * rr + 1, 2),
1352 &mat(3 * rr + 2, 0), &mat(3 * rr + 2, 1), &mat(3 * rr + 2, 2)};
1353}
1354
1355static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
1358 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
1359 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
1360 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
1361 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
1362 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
1363 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
1364 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
1365 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
1366 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
1367 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
1368 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
1369 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
1370}
1371
1372template <int DIM, typename AssemblyDomainEleOp>
1373MoFEMErrorCode
1374OpCalculatePlasticFlowLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1375 EntitiesFieldData::EntData &row_data,
1376 EntitiesFieldData::EntData &col_data) {
1378
1379 FTensor::Index<'i', DIM> i;
1380 FTensor::Index<'j', DIM> j;
1381 FTensor::Index<'k', DIM> k;
1382 FTensor::Index<'l', DIM> l;
1383 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1384 FTensor::Index<'L', size_symm> L;
1385 FTensor::Index<'O', size_symm> O;
1386
1387 auto &locMat = AssemblyDomainEleOp::locMat;
1388
1389 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1390 const auto nb_row_base_functions = row_data.getN().size2();
1391
1392 auto t_res_flow_dstrain =
1393 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
1394 auto t_res_flow_dplastic_strain =
1395 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
1396 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1397
1398 auto next = [&]() {
1399 ++t_res_flow_dstrain;
1400 ++t_res_flow_dplastic_strain;
1401 };
1402
1403 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1404 auto t_row_base = row_data.getFTensor0N();
1405 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1406 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1407 ++t_w;
1408
1410 t_res_mat(O, L) =
1411 alpha * (t_L(i, j, O) * ((t_res_flow_dplastic_strain(i, j, k, l) -
1412 t_res_flow_dstrain(i, j, k, l)) *
1413 t_L(k, l, L)));
1414 next();
1415
1416 size_t rr = 0;
1417 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
1418 auto t_mat = get_mat_tensor_sym_dtensor_sym(rr, locMat,
1420 auto t_col_base = col_data.getFTensor0N(gg, 0);
1421 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; ++cc) {
1422 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
1423 ++t_mat;
1424 ++t_col_base;
1425 }
1426
1427 ++t_row_base;
1428 }
1429
1430 for (; rr < nb_row_base_functions; ++rr)
1431 ++t_row_base;
1432 }
1433
1435}
1436
1437template <int DIM, typename AssemblyDomainEleOp>
1438struct OpCalculateConstraintsLhs_dUImpl<DIM, GAUSS, AssemblyDomainEleOp>
1439 : public AssemblyDomainEleOp {
1441 const std::string row_field_name, const std::string col_field_name,
1442 boost::shared_ptr<CommonData> common_data_ptr,
1443 boost::shared_ptr<MatrixDouble> m_D_ptr);
1444 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1445 EntitiesFieldData::EntData &col_data);
1446
1447private:
1448 boost::shared_ptr<CommonData> commonDataPtr;
1449 boost::shared_ptr<MatrixDouble> mDPtr;
1450};
1451
1452template <int DIM, typename AssemblyDomainEleOp>
1454 : public AssemblyDomainEleOp {
1456 const std::string row_field_name, const std::string col_field_name,
1457 boost::shared_ptr<CommonData> common_data_ptr,
1458 boost::shared_ptr<MatrixDouble> m_D_ptr);
1459 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1460 EntitiesFieldData::EntData &col_data);
1461
1462private:
1463 boost::shared_ptr<CommonData> commonDataPtr;
1464 boost::shared_ptr<MatrixDouble> mDPtr;
1465};
1466
1467template <int DIM, typename AssemblyDomainEleOp>
1470 const std::string row_field_name, const std::string col_field_name,
1471 boost::shared_ptr<CommonData> common_data_ptr,
1472 boost::shared_ptr<MatrixDouble> m_D_ptr)
1473 : AssemblyDomainEleOp(row_field_name, col_field_name,
1474 DomainEleOp::OPROWCOL),
1475 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1476 AssemblyDomainEleOp::sYmm = false;
1477}
1478
1479static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
1482 &mat(3 * rr + 0, 0), &mat(3 * rr + 1, 0), &mat(3 * rr + 2, 0)};
1483}
1484
1485static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
1488 &mat(6 * rr + 0, 0), &mat(6 * rr + 1, 0), &mat(6 * rr + 2, 0),
1489 &mat(6 * rr + 3, 0), &mat(6 * rr + 4, 0), &mat(6 * rr + 5, 0)};
1490}
1491
1492template <int DIM, typename AssemblyDomainEleOp>
1493MoFEMErrorCode
1494OpCalculatePlasticFlowLhs_dTAUImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1495 EntitiesFieldData::EntData &row_data,
1496 EntitiesFieldData::EntData &col_data) {
1498
1499 FTensor::Index<'i', DIM> i;
1500 FTensor::Index<'j', DIM> j;
1501 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1502 FTensor::Index<'L', size_symm> L;
1503
1504 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1505 const size_t nb_row_base_functions = row_data.getN().size2();
1506 auto &locMat = AssemblyDomainEleOp::locMat;
1507
1508 auto t_res_flow_dtau =
1509 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1510
1511 auto t_L = symm_L_tensor(FTensor::Number<DIM>());
1512
1513 auto next = [&]() { ++t_res_flow_dtau; };
1514
1515 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1516 auto t_row_base = row_data.getFTensor0N();
1517 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1518 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1519 ++t_w;
1521 t_res_vec(L) = alpha * (t_res_flow_dtau(i, j) * t_L(i, j, L));
1522 next();
1523
1524 size_t rr = 0;
1525 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
1526 auto t_mat =
1528 auto t_col_base = col_data.getFTensor0N(gg, 0);
1529 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1530 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1531 ++t_mat;
1532 ++t_col_base;
1533 }
1534 ++t_row_base;
1535 }
1536 for (; rr != nb_row_base_functions; ++rr)
1537 ++t_row_base;
1538 }
1539
1541}
1542
1543template <int DIM, typename AssemblyDomainEleOp>
1544struct OpCalculateConstraintsLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>
1545 : public AssemblyDomainEleOp {
1547 const std::string row_field_name, const std::string col_field_name,
1548 boost::shared_ptr<CommonData> common_data_ptr,
1549 boost::shared_ptr<MatrixDouble> mat_D_ptr);
1550 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1551 EntitiesFieldData::EntData &col_data);
1552
1553private:
1554 boost::shared_ptr<CommonData> commonDataPtr;
1555 boost::shared_ptr<MatrixDouble> mDPtr;
1556};
1557
1558template <int DIM, typename AssemblyDomainEleOp>
1561 const std::string row_field_name, const std::string col_field_name,
1562 boost::shared_ptr<CommonData> common_data_ptr,
1563 boost::shared_ptr<MatrixDouble> m_D_ptr)
1564 : AssemblyDomainEleOp(row_field_name, col_field_name,
1565 DomainEleOp::OPROWCOL),
1566 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1567 AssemblyDomainEleOp::sYmm = false;
1568}
1569
1570auto get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number<2>) {
1572 &mat(0, 0), &mat(0, 1), &mat(0, 2)};
1573}
1574
1575auto get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number<3>) {
1577 &mat(0, 0), &mat(0, 1), &mat(0, 2), &mat(0, 3), &mat(0, 4), &mat(0, 5)};
1578}
1579
1580template <int DIM, typename AssemblyDomainEleOp>
1582OpCalculateConstraintsLhs_dEPImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
1583 EntitiesFieldData::EntData &row_data,
1584 EntitiesFieldData::EntData &col_data) {
1586
1587 FTensor::Index<'i', DIM> i;
1588 FTensor::Index<'j', DIM> j;
1589 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1591
1592 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1593 const auto nb_row_base_functions = row_data.getN().size2();
1594
1595 auto t_c_dstrain =
1596 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1597 auto t_c_dplastic_strain =
1598 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1599
1600 auto next = [&]() {
1601 ++t_c_dstrain;
1602 ++t_c_dplastic_strain;
1603 };
1604
1606
1607 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1608 auto t_row_base = row_data.getFTensor0N();
1609 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
1610 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1611 ++t_w;
1612
1614 t_res_vec(L) =
1615 t_L(i, j, L) * (t_c_dplastic_strain(i, j) - t_c_dstrain(i, j));
1616 next();
1617
1618 auto t_mat = get_mat_scalar_dtensor_sym(AssemblyDomainEleOp::locMat,
1620 size_t rr = 0;
1621 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1622 const auto row_base = alpha * t_row_base;
1623 auto t_col_base = col_data.getFTensor0N(gg, 0);
1624 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; cc++) {
1625 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1626 ++t_mat;
1627 ++t_col_base;
1628 }
1629 ++t_row_base;
1630 }
1631 for (; rr != nb_row_base_functions; ++rr)
1632 ++t_row_base;
1633 }
1634
1636}
1637
1638template <typename AssemblyDomainEleOp>
1639struct OpCalculateConstraintsLhs_dTAUImpl<GAUSS, AssemblyDomainEleOp>
1640 : public AssemblyDomainEleOp {
1642 const std::string row_field_name, const std::string col_field_name,
1643 boost::shared_ptr<CommonData> common_data_ptr);
1644 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1645 EntitiesFieldData::EntData &col_data);
1646
1647private:
1648 boost::shared_ptr<CommonData> commonDataPtr;
1649};
1650
1651template <typename AssemblyDomainEleOp>
1654 const std::string row_field_name, const std::string col_field_name,
1655 boost::shared_ptr<CommonData> common_data_ptr)
1656 : AssemblyDomainEleOp(row_field_name, col_field_name,
1657 DomainEleOp::OPROWCOL),
1658 commonDataPtr(common_data_ptr) {
1659 AssemblyDomainEleOp::sYmm = false;
1660}
1661
1662template <typename AssemblyDomainEleOp>
1663MoFEMErrorCode
1664OpCalculateConstraintsLhs_dTAUImpl<GAUSS, AssemblyDomainEleOp>::iNtegrate(
1665 EntitiesFieldData::EntData &row_data,
1666 EntitiesFieldData::EntData &col_data) {
1668
1669 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1670 const auto nb_row_base_functions = row_data.getN().size2();
1671
1672 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1673 auto next = [&]() { ++t_res_c_dtau; };
1674
1675 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1676 auto t_row_base = row_data.getFTensor0N();
1677 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1678 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1679 ++t_w;
1680
1681 const auto res = alpha * (t_res_c_dtau);
1682 next();
1683
1684 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1685 size_t rr = 0;
1686 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1687 auto t_col_base = col_data.getFTensor0N(gg, 0);
1688 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1689 *mat_ptr += t_row_base * t_col_base * res;
1690 ++t_col_base;
1691 ++mat_ptr;
1692 }
1693 ++t_row_base;
1694 }
1695 for (; rr < nb_row_base_functions; ++rr)
1696 ++t_row_base;
1697 }
1698
1700}
1701}; // 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