v0.16.0
Loading...
Searching...
No Matches
PlasticOpsGeneric.hpp
Go to the documentation of this file.
1
2
3/** \file PlasticOpsGeneric.hpp
4 * \example mofem/tutorials/adv-0_plasticity/src/PlasticOpsGeneric.hpp
5 */
6
7namespace PlasticOps {
8
9template <typename T>
10inline double trace(FTensor::Tensor2_symmetric<T, 2> &t_stress) {
11 constexpr double third = boost::math::constants::third<double>();
12 return (t_stress(0, 0) + t_stress(1, 1)) * third;
13};
14
15template <typename T>
16inline double trace(FTensor::Tensor2_symmetric<T, 3> &t_stress) {
17 constexpr double third = boost::math::constants::third<double>();
18 return (t_stress(0, 0) + t_stress(1, 1) + t_stress(2, 2)) * third;
19};
20
21template <typename T, int DIM>
22inline auto deviator(
23
26
27) {
29 t_dev(I, J) = 0;
30 for (int ii = 0; ii != DIM; ++ii)
31 for (int jj = ii; jj != DIM; ++jj)
32 t_dev(ii, jj) = t_stress(ii, jj);
33 t_dev(0, 0) -= trace;
34 t_dev(1, 1) -= trace;
35 t_dev(2, 2) -= trace;
36 for (int ii = 0; ii != DIM; ++ii)
37 for (int jj = ii; jj != DIM; ++jj)
38 t_dev(ii, jj) -= t_alpha(ii, jj);
39 return t_dev;
40};
41
42template <typename T>
43inline auto deviator(FTensor::Tensor2_symmetric<T, 2> &t_stress, double trace,
45 return deviator(t_stress, trace, t_alpha, FTensor::Number<2>());
46};
47
48template <typename T>
49inline auto deviator(FTensor::Tensor2_symmetric<T, 3> &t_stress, double trace,
51 return deviator(t_stress, trace, t_alpha, FTensor::Number<3>());
52};
53
54/**
55 *
56
57\f[
58\begin{split}
59f&=\sqrt{s_{ij}s_{ij}}\\
60A_{ij}&=\frac{\partial f}{\partial \sigma_{ij}}=
61\frac{1}{f} s_{kl} \frac{\partial s_{kl}}{\partial \sigma_{ij}}\\
62\frac{\partial A_{ij}}{\partial \sigma_{kl}}&= \frac{\partial^2 f}{\partial
63\sigma_{ij}\partial\sigma_{mn}}= \frac{1}{f} \left( \frac{\partial
64s_{kl}}{\partial \sigma_{mn}}\frac{\partial s_{kl}}{\partial \sigma_{ij}}
65-A_{mn}A_{ij}
66\right)\\
67\frac{\partial f}{\partial \varepsilon_{ij}}&=A_{mn}D_{mnij}
68\\
69\frac{\partial A_{ij}}{\partial \varepsilon_{kl}}&=
70\frac{\partial A_{ij}}{\partial \sigma_{mn}} \frac{\partial
71\sigma_{mn}}{\partial \varepsilon_{kl}}= \frac{\partial A_{ij}}{\partial
72\sigma_{mn}} D_{mnkl}
73\end{split}
74\f]
75
76 */
77inline double
79 return std::sqrt(1.5 * t_stress_deviator(I, J) * t_stress_deviator(I, J)) +
80 std::numeric_limits<double>::epsilon();
81};
82
83template <int DIM, class T>
84inline auto plastic_flow(long double f,
86 const FTensor::DiffDeviator<T, DIM> &t_diff_deviator) {
87 FTensor::Index<'k', DIM> k;
88 FTensor::Index<'l', DIM> l;
90 t_diff_f(k, l) =
91 (1.5 * (t_dev_stress(I, J) * t_diff_deviator(I, J, k, l))) / f;
92 return t_diff_f;
93};
94
95template <typename T, int DIM, class U>
96inline auto
99 const FTensor::DiffDeviator<U, DIM> &t_diff_deviator) {
100 FTensor::Index<'i', DIM> i;
101 FTensor::Index<'j', DIM> j;
102 FTensor::Index<'k', DIM> k;
103 FTensor::Index<'l', DIM> l;
105 t_diff_flow(i, j, k, l) =
106 (1.5 * (t_diff_deviator(M, N, i, j) * t_diff_deviator(M, N, k, l) -
107 (2. / 3.) * t_flow(i, j) * t_flow(k, l))) /
108 f;
109 return t_diff_flow;
110};
111
112template <typename T, int DIM>
115 FTensor::Ddg<double, DIM, DIM> &&t_diff_plastic_flow_dstress) {
116 FTensor::Index<'i', DIM> i;
117 FTensor::Index<'j', DIM> j;
118 FTensor::Index<'k', DIM> k;
119 FTensor::Index<'l', DIM> l;
120 FTensor::Index<'m', DIM> m;
121 FTensor::Index<'n', DIM> n;
123 t_diff_flow(i, j, k, l) =
124 t_diff_plastic_flow_dstress(i, j, m, n) * t_D(m, n, k, l);
125 return t_diff_flow;
126};
127
128// inline double constrain_diff_sign(double x) {
129// const auto y = x / zeta;
130// if (y > std::numeric_limits<float>::max_exponent10 ||
131// y < std::numeric_limits<float>::min_exponent10) {
132// return 0;
133// } else {
134// const auto e = std::exp(y);
135// const auto ep1 = e + 1;
136// return (2 / zeta) * (e / (ep1 * ep1));
137// }
138// };
139
140inline double constrian_sign(double x, double dt) {
141 const auto y = x / (zeta / dt);
142 if (y > std::numeric_limits<float>::max_exponent10 ||
143 y < std::numeric_limits<float>::min_exponent10) {
144 if (x > 0)
145 return 1.;
146 else
147 return -1.;
148 } else {
149 const auto e = std::exp(y);
150 return (e - 1) / (1 + e);
151 }
152};
153
154inline double constrain_abs(double x, double dt) {
155 const auto y = -x / (zeta / dt);
156 if (y > std::numeric_limits<float>::max_exponent10 ||
157 y < std::numeric_limits<float>::min_exponent10) {
158 return std::abs(x);
159 } else {
160 const double e = std::exp(y);
161 return x + 2 * (zeta / dt) * std::log1p(e);
162 }
163};
164
165inline double w(double eqiv, double dot_tau, double f, double sigma_y,
166 double sigma_Y) {
167 return (1. / cn1) * ((f - sigma_y) / sigma_Y) + dot_tau;
168};
169
170/**
171
172\f[
173v^H \cdot \dot{\tau} +
174\left(\frac{\sigma_Y}{2}\right) \cdot
175\left(
176 \left(
177 c_{\textrm{n0}} \cdot c_{\textrm{n1}} \cdot \left(\dot{\tau} - \dot{e_{\textrm{p}}}\right)
178 \right) +
179 \left(
180 c_{\textrm{n1}} \cdot \left(\dot{\tau} - \frac{1}{c_{\textrm{n1}}} \cdot \frac{f - \sigma_y}{\sigma_Y} - \text{abs\_w}\right)
181 \right)
182\right)
183\f]
184 */
185inline double constraint(double eqiv, double dot_tau, double f, double sigma_y,
186 double abs_w, double vis_H, double sigma_Y) {
187
188 return
189
190 vis_H * dot_tau +
191 (sigma_Y / 2) *
192 (
193
194 (cn0 * cn1 * ((dot_tau - eqiv)) +
195
196 cn1 * ((dot_tau) - (1. / cn1) * (f - sigma_y) / sigma_Y - abs_w))
197
198 );
199};
200
201inline double diff_constrain_ddot_tau(double sign, double eqiv, double dot_tau,
202 double vis_H, double sigma_Y) {
203 return vis_H + (sigma_Y / 2) * (cn0 * cn1 + cn1 * (1 - sign));
204};
205
206inline double diff_constrain_deqiv(double sign, double eqiv, double dot_tau,
207 double sigma_Y) {
208 return (sigma_Y / 2) * (-cn0 * cn1);
209};
210
211inline auto diff_constrain_df(double sign) { return (-1 - sign) / 2; };
212
213inline auto diff_constrain_dsigma_y(double sign) { return (1 + sign) / 2; }
214
215template <typename T, int DIM>
216inline auto
218 FTensor::Tensor2_symmetric<T, DIM> &t_plastic_flow) {
219 FTensor::Index<'i', DIM> i;
220 FTensor::Index<'j', DIM> j;
221 FTensor::Tensor2_symmetric<double, DIM> t_diff_constrain_dstress;
222 t_diff_constrain_dstress(i, j) = diff_constrain_df * t_plastic_flow(i, j);
223 return t_diff_constrain_dstress;
224};
225
226template <typename T1, typename T2, int DIM>
227inline auto diff_constrain_dstrain(T1 &t_D, T2 &&t_diff_constrain_dstress) {
228 FTensor::Index<'i', DIM> i;
229 FTensor::Index<'j', DIM> j;
230 FTensor::Index<'k', DIM> k;
231 FTensor::Index<'l', DIM> l;
232 FTensor::Tensor2_symmetric<double, DIM> t_diff_constrain_dstrain;
233 t_diff_constrain_dstrain(k, l) =
234 t_diff_constrain_dstress(i, j) * t_D(i, j, k, l);
235 return t_diff_constrain_dstrain;
236};
237
238template <typename T, int DIM>
240 FTensor::Tensor2_symmetric<T, DIM> &t_plastic_strain_dot) {
241 FTensor::Index<'i', DIM> i;
242 FTensor::Index<'j', DIM> j;
243 constexpr double A = 2. / 3;
244 return std::sqrt(A * t_plastic_strain_dot(i, j) *
245 t_plastic_strain_dot(i, j)) +
246 std::numeric_limits<double>::epsilon();
247};
248
249template <typename T1, typename T2, typename T3, int DIM>
250inline auto diff_equivalent_strain_dot(const T1 eqiv, T2 &t_plastic_strain_dot,
251 T3 &t_diff_plastic_strain,
253 FTensor::Index<'i', DIM> i;
254 FTensor::Index<'j', DIM> j;
255 FTensor::Index<'k', DIM> k;
256 FTensor::Index<'l', DIM> l;
257 constexpr double A = 2. / 3;
259 t_diff_eqiv(i, j) = A * (t_plastic_strain_dot(k, l) / eqiv) *
260 t_diff_plastic_strain(k, l, i, j);
261 return t_diff_eqiv;
262};
263
264//! [Lambda functions]
265
266//! [Auxiliary functions functions
267static inline auto get_mat_tensor_sym_dvector(size_t rr, MatrixDouble &mat,
270 &mat(3 * rr + 0, 0), &mat(3 * rr + 0, 1), &mat(3 * rr + 1, 0),
271 &mat(3 * rr + 1, 1), &mat(3 * rr + 2, 0), &mat(3 * rr + 2, 1)};
272}
273
274static inline auto get_mat_tensor_sym_dvector(size_t rr, MatrixDouble &mat,
277 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
278 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
279 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
280 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
281 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
282 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2)};
283}
284
285//! [Auxiliary functions functions
286
287template <int DIM, typename DomainEleOp>
289 : public DomainEleOp {
291 boost::shared_ptr<CommonData> common_data_ptr);
292 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
293
294protected:
295 boost::shared_ptr<CommonData> commonDataPtr;
296};
297
298template <int DIM, typename DomainEleOp>
301 boost::shared_ptr<CommonData> common_data_ptr)
303 commonDataPtr(common_data_ptr) {
304 // Operator is only executed for vertices
305 std::fill(&DomainEleOp::doEntities[MBEDGE],
306 &DomainEleOp::doEntities[MBMAXTYPE], false);
307}
308
309template <int DIM, typename DomainEleOp>
311 int side, EntityType type, EntData &data) {
313
314 FTensor::Index<'i', DIM> i;
315 FTensor::Index<'j', DIM> j;
316
317 const size_t nb_gauss_pts = commonDataPtr->mStressPtr->size1();
318 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
319 auto t_plastic_strain =
320 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
321
322 commonDataPtr->plasticSurface.resize(nb_gauss_pts, false);
323 commonDataPtr->plasticFlow.resize(nb_gauss_pts, size_symm, false);
324 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
325
326 auto &params = commonDataPtr->blockParams;
327
328 for (auto &f : commonDataPtr->plasticSurface) {
329
330 f = platsic_surface(
331
332 deviator(
333 t_stress, trace(t_stress),
334 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k]))
335
336 );
337
338 auto t_flow_tmp =
339 plastic_flow(f,
340
341 deviator(t_stress, trace(t_stress),
342 kinematic_hardening(t_plastic_strain,
343 params[CommonData::C1_k])),
344
345 FTensor::diff_deviator<double, DIM>());
346 t_flow(i, j) = t_flow_tmp(i, j);
347
348 ++t_plastic_strain;
349 ++t_flow;
350 ++t_stress;
351 }
352
354}
355
356template <int DIM, typename DomainEleOp>
358 OpCalculatePlasticityImpl(const std::string field_name,
359 boost::shared_ptr<CommonData> common_data_ptr,
360 boost::shared_ptr<MatrixDouble> m_D_ptr);
361 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
362
363protected:
364 boost::shared_ptr<CommonData> commonDataPtr;
365 boost::shared_ptr<MatrixDouble> mDPtr;
366};
367
368template <int DIM, typename DomainEleOp>
370 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
371 boost::shared_ptr<MatrixDouble> m_D_ptr)
373 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
374 // Opetor is only executed for vertices
375 std::fill(&DomainEleOp::doEntities[MBEDGE],
376 &DomainEleOp::doEntities[MBMAXTYPE], false);
377}
378
379template <int DIM, typename DomainEleOp>
381 int side, EntityType type, EntData &data) {
383
384 FTensor::Index<'i', DIM> i;
385 FTensor::Index<'j', DIM> j;
386 FTensor::Index<'k', DIM> k;
387 FTensor::Index<'l', DIM> l;
388 FTensor::Index<'m', DIM> m;
389 FTensor::Index<'n', DIM> n;
390
391 auto &params = commonDataPtr->blockParams; ///< material parameters
392
393 auto nb_gauss_pts = DomainEleOp::getGaussPts().size2();
394 auto t_w = DomainEleOp::getFTensor0IntegrationWeight();
395 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
396 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
397 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
398 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
399 auto t_plastic_strain =
400 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
401 auto t_plastic_strain_dot =
402 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrainDot);
403 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
404
405 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
406
407 auto t_diff_plastic_strain = FTensor::diff_tensor<double>();
408 auto t_diff_deviator = FTensor::diff_deviator<double, DIM>();
409
410 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstress;
411 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstrain;
412 t_flow_dir_dstress(i, j, k, l) =
413 1.5 * (t_diff_deviator(M, N, i, j) * t_diff_deviator(M, N, k, l));
414 t_flow_dir_dstrain(i, j, k, l) =
415 t_flow_dir_dstress(i, j, m, n) * t_D_Op(m, n, k, l);
416
417
418 auto t_alpha_dir =
419 kinematic_hardening_dplastic_strain<DIM>(params[CommonData::C1_k]);
420
421 commonDataPtr->resC.resize(nb_gauss_pts, false);
422 commonDataPtr->resCdTau.resize(nb_gauss_pts, false);
423 commonDataPtr->resCdStrain.resize(nb_gauss_pts, size_symm, false);
424 commonDataPtr->resCdPlasticStrain.resize(nb_gauss_pts, size_symm, false);
425 commonDataPtr->resFlow.resize(nb_gauss_pts, size_symm, false);
426 commonDataPtr->resFlowDtau.resize(nb_gauss_pts, size_symm, false);
427 commonDataPtr->resFlowDstrain.resize(nb_gauss_pts, size_symm * size_symm,
428 false);
429 commonDataPtr->resFlowDstrainDot.resize(nb_gauss_pts, size_symm * size_symm,
430 false);
431
432 commonDataPtr->resC.clear();
433 commonDataPtr->resCdTau.clear();
434 commonDataPtr->resCdStrain.clear();
435 commonDataPtr->resCdPlasticStrain.clear();
436 commonDataPtr->resFlow.clear();
437 commonDataPtr->resFlowDtau.clear();
438 commonDataPtr->resFlowDstrain.clear();
439 commonDataPtr->resFlowDstrainDot.clear();
440
441 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
442 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
443 auto t_res_c_dstrain =
444 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
445 auto t_res_c_plastic_strain =
446 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
447 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
448 auto t_res_flow_dtau =
449 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
450 auto t_res_flow_dstrain =
451 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
452 auto t_res_flow_dplastic_strain =
453 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
454
455 auto next = [&]() {
456 ++t_tau;
457 ++t_tau_dot;
458 ++t_f;
459 ++t_flow;
460 ++t_plastic_strain;
461 ++t_plastic_strain_dot;
462 ++t_stress;
463 ++t_res_c;
464 ++t_res_c_dtau;
465 ++t_res_c_dstrain;
466 ++t_res_c_plastic_strain;
467 ++t_res_flow;
468 ++t_res_flow_dtau;
469 ++t_res_flow_dstrain;
470 ++t_res_flow_dplastic_strain;
471 ++t_w;
472 };
473
474 auto get_avtive_pts = [&]() {
475 int nb_points_avtive_on_elem = 0;
476 int nb_points_on_elem = 0;
477
478 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
479 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
480 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
481 auto t_plastic_strain_dot =
482 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
483
484 auto dt = this->getTStimeStep();
485
486 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
487 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
488 const auto ww = w(
489 eqiv, t_tau_dot, t_f,
490 iso_hardening(t_tau, params[CommonData::H], params[CommonData::QINF],
491 params[CommonData::BISO], params[CommonData::SIGMA_Y]),
492 params[CommonData::SIGMA_Y]);
493 const auto sign_ww = constrian_sign(ww, dt);
494
495 ++nb_points_on_elem;
496 if (sign_ww > 0) {
497 ++nb_points_avtive_on_elem;
498 }
499
500 ++t_tau;
501 ++t_tau_dot;
502 ++t_f;
503 ++t_plastic_strain_dot;
504 }
505
506 int &active_points = PlasticOps::CommonData::activityData[0];
507 int &avtive_full_elems = PlasticOps::CommonData::activityData[1];
508 int &avtive_elems = PlasticOps::CommonData::activityData[2];
509 int &nb_points = PlasticOps::CommonData::activityData[3];
510 int &nb_elements = PlasticOps::CommonData::activityData[4];
511
512 ++nb_elements;
513 nb_points += nb_points_on_elem;
514 if (nb_points_avtive_on_elem > 0) {
515 ++avtive_elems;
516 active_points += nb_points_avtive_on_elem;
517 if (nb_points_avtive_on_elem == nb_points_on_elem) {
518 ++avtive_full_elems;
519 }
520 }
521
522 if (nb_points_avtive_on_elem != nb_points_on_elem)
523 return 1;
524 else
525 return 0;
526 };
527
528 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
529 get_avtive_pts();
530 }
531
532 auto dt = this->getTStimeStep();
533 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
534
535 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
536 auto t_diff_eqiv = diff_equivalent_strain_dot(eqiv, t_plastic_strain_dot,
537 t_diff_plastic_strain,
539
540 const auto sigma_y =
541 iso_hardening(t_tau, params[CommonData::H], params[CommonData::QINF],
542 params[CommonData::BISO], params[CommonData::SIGMA_Y]);
543 const auto d_sigma_y =
544 iso_hardening_dtau(t_tau, params[CommonData::H],
545 params[CommonData::QINF], params[CommonData::BISO]);
546
547 auto ww = w(eqiv, t_tau_dot, t_f, sigma_y, params[CommonData::SIGMA_Y]);
548 auto abs_ww = constrain_abs(ww, dt);
549 auto sign_ww = constrian_sign(ww, dt);
550
551 auto c = constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
552 params[CommonData::VIS_H], params[CommonData::SIGMA_Y]);
553 auto c_dot_tau = diff_constrain_ddot_tau(sign_ww, eqiv, t_tau_dot,
554 params[CommonData::VIS_H],
555 params[CommonData::SIGMA_Y]);
556 auto c_equiv = diff_constrain_deqiv(sign_ww, eqiv, t_tau_dot,
557 params[CommonData::SIGMA_Y]);
558 auto c_sigma_y = diff_constrain_dsigma_y(sign_ww);
559 auto c_f = diff_constrain_df(sign_ww);
560
561 auto t_dev_stress = deviator(
562
563 t_stress, trace(t_stress),
564
565 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k])
566
567 );
568
570 t_flow_dir(k, l) = 1.5 * (t_dev_stress(I, J) * t_diff_deviator(I, J, k, l));
572 t_flow_dstrain(i, j) = t_flow(k, l) * t_D_Op(k, l, i, j);
573
574 auto get_res_c = [&]() { return c; };
575
576 auto get_res_c_dstrain = [&](auto &t_diff_res) {
577 t_diff_res(i, j) = c_f * t_flow_dstrain(i, j);
578 };
579
580 auto get_res_c_dplastic_strain = [&](auto &t_diff_res) {
581 t_diff_res(i, j) = (this->getTSa() * c_equiv) * t_diff_eqiv(i, j);
582 t_diff_res(k, l) -= c_f * t_flow(i, j) * t_alpha_dir(i, j, k, l);
583 };
584
585 auto get_res_c_dtau = [&]() {
586 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
587 };
588
589 [[maybe_unused]] auto get_res_c_plastic_strain = [&](auto &t_diff_res) {
590 t_diff_res(k, l) = -c_f * t_flow(i, j) * t_alpha_dir(i, j, k, l);
591 };
592
593 auto get_res_flow = [&](auto &t_res_flow) {
594 const auto a = sigma_y;
595 const auto b = t_tau_dot;
596 t_res_flow(k, l) = a * t_plastic_strain_dot(k, l) - b * t_flow_dir(k, l);
597 };
598
599 auto get_res_flow_dtau = [&](auto &t_res_flow_dtau) {
600 const auto da = d_sigma_y;
601 const auto db = this->getTSa();
602 t_res_flow_dtau(k, l) =
603 da * t_plastic_strain_dot(k, l) - db * t_flow_dir(k, l);
604 };
605
606 auto get_res_flow_dstrain = [&](auto &t_res_flow_dstrain) {
607 const auto b = t_tau_dot;
608 t_res_flow_dstrain(m, n, k, l) = -t_flow_dir_dstrain(m, n, k, l) * b;
609 };
610
611 auto get_res_flow_dplastic_strain = [&](auto &t_res_flow_dplastic_strain) {
612 const auto a = sigma_y;
613 t_res_flow_dplastic_strain(m, n, k, l) =
614 (a * this->getTSa()) * t_diff_plastic_strain(m, n, k, l);
615 const auto b = t_tau_dot;
616 t_res_flow_dplastic_strain(m, n, i, j) +=
617 (t_flow_dir_dstrain(m, n, k, l) * t_alpha_dir(k, l, i, j)) * b;
618 };
619
620 t_res_c = get_res_c();
621 get_res_flow(t_res_flow);
622
623 if (this->getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
624 t_res_c_dtau = get_res_c_dtau();
625 get_res_c_dstrain(t_res_c_dstrain);
626 get_res_c_dplastic_strain(t_res_c_plastic_strain);
627 get_res_flow_dtau(t_res_flow_dtau);
628 get_res_flow_dstrain(t_res_flow_dstrain);
629 get_res_flow_dplastic_strain(t_res_flow_dplastic_strain);
630 }
631
632 next();
633 }
634
636}
637
638template <int DIM, typename DomainEleOp>
639struct OpPlasticStressImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
640
641 /**
642 * @deprecated do not use this constructor
643 */
644 DEPRECATED OpPlasticStressImpl(const std::string field_name,
645 boost::shared_ptr<CommonData> common_data_ptr,
646 boost::shared_ptr<MatrixDouble> mDPtr);
647 OpPlasticStressImpl(boost::shared_ptr<CommonData> common_data_ptr,
648 boost::shared_ptr<MatrixDouble> mDPtr);
649
650 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
651
652private:
653 boost::shared_ptr<MatrixDouble> mDPtr;
654 boost::shared_ptr<CommonData> commonDataPtr;
655};
656
657template <int DIM, typename DomainEleOp>
659 const std::string field_name, boost::shared_ptr<CommonData> common_data_ptr,
660 boost::shared_ptr<MatrixDouble> m_D_ptr)
662 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
663 // Operator is only executed for vertices
664 std::fill(&DomainEleOp::doEntities[MBEDGE],
665 &DomainEleOp::doEntities[MBMAXTYPE], false);
666}
667
668template <int DIM, typename DomainEleOp>
670 boost::shared_ptr<CommonData> common_data_ptr,
671 boost::shared_ptr<MatrixDouble> m_D_ptr)
672 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE),
673 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
674
675//! [Calculate stress]
676template <int DIM, typename DomainEleOp>
677MoFEMErrorCode
679 EntData &data) {
681
682 FTensor::Index<'i', DIM> i;
683 FTensor::Index<'j', DIM> j;
684 FTensor::Index<'k', DIM> k;
685 FTensor::Index<'l', DIM> l;
686
687 const size_t nb_gauss_pts = commonDataPtr->mStrainPtr->size1();
688 commonDataPtr->mStressPtr->resize(nb_gauss_pts, (DIM * (DIM + 1)) / 2);
689 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
690 auto t_strain = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStrainPtr));
691 auto t_plastic_strain =
692 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
693 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
694
695 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
696 t_stress(i, j) =
697 t_D(i, j, k, l) * (t_strain(k, l) - t_plastic_strain(k, l));
698 ++t_strain;
699 ++t_plastic_strain;
700 ++t_stress;
701 }
702
704}
705//! [Calculate stress]
706
707template <int DIM, typename AssemblyDomainEleOp>
709 : public AssemblyDomainEleOp {
711 boost::shared_ptr<CommonData> common_data_ptr,
712 boost::shared_ptr<MatrixDouble> m_D_ptr);
713 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
714
715private:
716 boost::shared_ptr<CommonData> commonDataPtr;
717 boost::shared_ptr<MatrixDouble> mDPtr;
718};
719
720template <int DIM, typename AssemblyDomainEleOp>
723 boost::shared_ptr<CommonData> common_data_ptr,
724 boost::shared_ptr<MatrixDouble> m_D_ptr)
726 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
727
728template <int DIM, typename AssemblyDomainEleOp>
729MoFEMErrorCode
731 EntitiesFieldData::EntData &data) {
733
734 FTensor::Index<'i', DIM> i;
735 FTensor::Index<'j', DIM> j;
736 FTensor::Index<'k', DIM> k;
737 FTensor::Index<'l', DIM> l;
738 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
740
741 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
742 const auto nb_base_functions = data.getN().size2();
743
744 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
745
746 auto t_L = FTensor::symm_l_tensor<double, DIM>();
747
748 auto next = [&]() { ++t_res_flow; };
749
750 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
751 auto t_base = data.getFTensor0N();
752 auto &nf = AssemblyDomainEleOp::locF;
753 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
754 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
755 ++t_w;
756
758 t_rhs(L) = alpha * (t_res_flow(i, j) * t_L(i, j, L));
759 next();
760
761 auto t_nf = getFTensor1FromArray<size_symm, size_symm>(nf);
762 size_t bb = 0;
763 for (; bb != AssemblyDomainEleOp::nbRows / size_symm; ++bb) {
764 t_nf(L) += t_base * t_rhs(L);
765 ++t_base;
766 ++t_nf;
767 }
768 for (; bb < nb_base_functions; ++bb)
769 ++t_base;
770 }
771
773}
774
775template <typename AssemblyDomainEleOp>
777 : public AssemblyDomainEleOp {
779 boost::shared_ptr<CommonData> common_data_ptr,
780 boost::shared_ptr<MatrixDouble> m_D_ptr);
781 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
782
783private:
784 boost::shared_ptr<CommonData> commonDataPtr;
785 boost::shared_ptr<MatrixDouble> mDPtr;
786};
787
788template <typename AssemblyDomainEleOp>
791 boost::shared_ptr<CommonData> common_data_ptr,
792 boost::shared_ptr<MatrixDouble> m_D_ptr)
794 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {}
795
796template <typename AssemblyDomainEleOp>
797MoFEMErrorCode
799 EntitiesFieldData::EntData &data) {
801
802 const size_t nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
803 const size_t nb_base_functions = data.getN().size2();
804
805 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
806
807 auto next = [&]() { ++t_res_c; };
808
809 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
810 auto &nf = AssemblyDomainEleOp::locF;
811 auto t_base = data.getFTensor0N();
812 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
813 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
814 ++t_w;
815 const auto res = alpha * t_res_c;
816 next();
817
818 size_t bb = 0;
819 for (; bb != AssemblyDomainEleOp::nbRows; ++bb) {
820 nf[bb] += t_base * res;
821 ++t_base;
822 }
823 for (; bb < nb_base_functions; ++bb)
824 ++t_base;
825 }
826
828}
829
830template <int DIM, typename AssemblyDomainEleOp>
832 : public AssemblyDomainEleOp {
834 const std::string row_field_name, const std::string col_field_name,
835 boost::shared_ptr<CommonData> common_data_ptr,
836 boost::shared_ptr<MatrixDouble> m_D_ptr);
837 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
838 EntitiesFieldData::EntData &col_data);
839
840private:
841 boost::shared_ptr<CommonData> commonDataPtr;
842 boost::shared_ptr<MatrixDouble> mDPtr;
843};
844
845template <int DIM, typename AssemblyDomainEleOp>
848 const std::string row_field_name, const std::string col_field_name,
849 boost::shared_ptr<CommonData> common_data_ptr,
850 boost::shared_ptr<MatrixDouble> m_D_ptr)
851 : AssemblyDomainEleOp(row_field_name, col_field_name,
852 AssemblyDomainEleOp::OPROWCOL),
853 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
854 AssemblyDomainEleOp::sYmm = false;
855}
856
857static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
860 &mat(3 * rr + 0, 0), &mat(3 * rr + 0, 1), &mat(3 * rr + 0, 2),
861 &mat(3 * rr + 1, 0), &mat(3 * rr + 1, 1), &mat(3 * rr + 1, 2),
862 &mat(3 * rr + 2, 0), &mat(3 * rr + 2, 1), &mat(3 * rr + 2, 2)};
863}
864
865static inline auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat,
868 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
869 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
870 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
871 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
872 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
873 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
874 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
875 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
876 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
877 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
878 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
879 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
880}
881
882template <int DIM, typename AssemblyDomainEleOp>
883MoFEMErrorCode
885 EntitiesFieldData::EntData &row_data,
886 EntitiesFieldData::EntData &col_data) {
888
889 FTensor::Index<'i', DIM> i;
890 FTensor::Index<'j', DIM> j;
891 FTensor::Index<'k', DIM> k;
892 FTensor::Index<'l', DIM> l;
893 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
896
897 auto &locMat = AssemblyDomainEleOp::locMat;
898
899 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
900 const auto nb_row_base_functions = row_data.getN().size2();
901
902 auto t_res_flow_dstrain =
903 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
904 auto t_res_flow_dplastic_strain =
905 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
906 auto t_L = FTensor::symm_l_tensor<double, DIM>();
907
908 auto next = [&]() {
909 ++t_res_flow_dstrain;
910 ++t_res_flow_dplastic_strain;
911 };
912
913 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
914 auto t_row_base = row_data.getFTensor0N();
915 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
916 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
917 ++t_w;
918
920 t_res_mat(O, L) =
921 alpha * (t_L(i, j, O) * ((t_res_flow_dplastic_strain(i, j, k, l) -
922 t_res_flow_dstrain(i, j, k, l)) *
923 t_L(k, l, L)));
924 next();
925
926 size_t rr = 0;
927 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
928 auto t_mat = get_mat_tensor_sym_dtensor_sym(rr, locMat,
930 auto t_col_base = col_data.getFTensor0N(gg, 0);
931 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; ++cc) {
932 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
933 ++t_mat;
934 ++t_col_base;
935 }
936
937 ++t_row_base;
938 }
939
940 for (; rr < nb_row_base_functions; ++rr)
941 ++t_row_base;
942 }
943
945}
946
947template <int DIM, typename AssemblyDomainEleOp>
949 : public AssemblyDomainEleOp {
951 const std::string row_field_name, const std::string col_field_name,
952 boost::shared_ptr<CommonData> common_data_ptr,
953 boost::shared_ptr<MatrixDouble> m_D_ptr);
954 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
955 EntitiesFieldData::EntData &col_data);
956
957private:
958 boost::shared_ptr<CommonData> commonDataPtr;
959 boost::shared_ptr<MatrixDouble> mDPtr;
960};
961
962template <int DIM, typename AssemblyDomainEleOp>
964 : public AssemblyDomainEleOp {
966 const std::string row_field_name, const std::string col_field_name,
967 boost::shared_ptr<CommonData> common_data_ptr,
968 boost::shared_ptr<MatrixDouble> m_D_ptr);
969 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
970 EntitiesFieldData::EntData &col_data);
971
972private:
973 boost::shared_ptr<CommonData> commonDataPtr;
974 boost::shared_ptr<MatrixDouble> mDPtr;
975};
976
977template <int DIM, typename AssemblyDomainEleOp>
980 const std::string row_field_name, const std::string col_field_name,
981 boost::shared_ptr<CommonData> common_data_ptr,
982 boost::shared_ptr<MatrixDouble> m_D_ptr)
983 : AssemblyDomainEleOp(row_field_name, col_field_name,
984 DomainEleOp::OPROWCOL),
985 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
986 AssemblyDomainEleOp::sYmm = false;
987}
988
989static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
992 &mat(3 * rr + 0, 0), &mat(3 * rr + 1, 0), &mat(3 * rr + 2, 0)};
993}
994
995static inline auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat,
998 &mat(6 * rr + 0, 0), &mat(6 * rr + 1, 0), &mat(6 * rr + 2, 0),
999 &mat(6 * rr + 3, 0), &mat(6 * rr + 4, 0), &mat(6 * rr + 5, 0)};
1000}
1001
1002template <int DIM, typename AssemblyDomainEleOp>
1003MoFEMErrorCode
1005 EntitiesFieldData::EntData &row_data,
1006 EntitiesFieldData::EntData &col_data) {
1008
1009 FTensor::Index<'i', DIM> i;
1010 FTensor::Index<'j', DIM> j;
1011 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1012 FTensor::Index<'L', size_symm> L;
1013
1014 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1015 const size_t nb_row_base_functions = row_data.getN().size2();
1016 auto &locMat = AssemblyDomainEleOp::locMat;
1017
1018 auto t_res_flow_dtau =
1019 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1020
1021 auto t_L = FTensor::symm_l_tensor<double, DIM>();
1022
1023 auto next = [&]() { ++t_res_flow_dtau; };
1024
1025 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1026 auto t_row_base = row_data.getFTensor0N();
1027 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1028 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1029 ++t_w;
1031 t_res_vec(L) = alpha * (t_res_flow_dtau(i, j) * t_L(i, j, L));
1032 next();
1033
1034 size_t rr = 0;
1035 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
1036 auto t_mat =
1038 auto t_col_base = col_data.getFTensor0N(gg, 0);
1039 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1040 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1041 ++t_mat;
1042 ++t_col_base;
1043 }
1044 ++t_row_base;
1045 }
1046 for (; rr != nb_row_base_functions; ++rr)
1047 ++t_row_base;
1048 }
1049
1051}
1052
1053template <int DIM, typename AssemblyDomainEleOp>
1055 : public AssemblyDomainEleOp {
1057 const std::string row_field_name, const std::string col_field_name,
1058 boost::shared_ptr<CommonData> common_data_ptr,
1059 boost::shared_ptr<MatrixDouble> mat_D_ptr);
1060 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1061 EntitiesFieldData::EntData &col_data);
1062
1063private:
1064 boost::shared_ptr<CommonData> commonDataPtr;
1065 boost::shared_ptr<MatrixDouble> mDPtr;
1066};
1067
1068template <int DIM, typename AssemblyDomainEleOp>
1071 const std::string row_field_name, const std::string col_field_name,
1072 boost::shared_ptr<CommonData> common_data_ptr,
1073 boost::shared_ptr<MatrixDouble> m_D_ptr)
1074 : AssemblyDomainEleOp(row_field_name, col_field_name,
1075 DomainEleOp::OPROWCOL),
1076 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
1077 AssemblyDomainEleOp::sYmm = false;
1078}
1079
1082 &mat(0, 0), &mat(0, 1), &mat(0, 2)};
1083}
1084
1087 &mat(0, 0), &mat(0, 1), &mat(0, 2), &mat(0, 3), &mat(0, 4), &mat(0, 5)};
1088}
1089
1090template <int DIM, typename AssemblyDomainEleOp>
1091MoFEMErrorCode
1093 EntitiesFieldData::EntData &row_data,
1094 EntitiesFieldData::EntData &col_data) {
1096
1097 FTensor::Index<'i', DIM> i;
1098 FTensor::Index<'j', DIM> j;
1099 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1100 FTensor::Index<'L', size_symm> L;
1101
1102 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1103 const auto nb_row_base_functions = row_data.getN().size2();
1104
1105 auto t_c_dstrain =
1106 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1107 auto t_c_dplastic_strain =
1108 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1109
1110 auto next = [&]() {
1111 ++t_c_dstrain;
1112 ++t_c_dplastic_strain;
1113 };
1114
1115 auto t_L = FTensor::symm_l_tensor<double, SPACE_DIM>();
1116
1117 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1118 auto t_row_base = row_data.getFTensor0N();
1119 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
1120 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1121 ++t_w;
1122
1124 t_res_vec(L) =
1125 t_L(i, j, L) * (t_c_dplastic_strain(i, j) - t_c_dstrain(i, j));
1126 next();
1127
1128 auto t_mat = get_mat_scalar_dtensor_sym(AssemblyDomainEleOp::locMat,
1130 size_t rr = 0;
1131 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1132 const auto row_base = alpha * t_row_base;
1133 auto t_col_base = col_data.getFTensor0N(gg, 0);
1134 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; cc++) {
1135 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1136 ++t_mat;
1137 ++t_col_base;
1138 }
1139 ++t_row_base;
1140 }
1141 for (; rr != nb_row_base_functions; ++rr)
1142 ++t_row_base;
1143 }
1144
1146}
1147
1148template <typename AssemblyDomainEleOp>
1150 : public AssemblyDomainEleOp {
1152 const std::string row_field_name, const std::string col_field_name,
1153 boost::shared_ptr<CommonData> common_data_ptr);
1154 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
1155 EntitiesFieldData::EntData &col_data);
1156
1157private:
1158 boost::shared_ptr<CommonData> commonDataPtr;
1159};
1160
1161template <typename AssemblyDomainEleOp>
1164 const std::string row_field_name, const std::string col_field_name,
1165 boost::shared_ptr<CommonData> common_data_ptr)
1166 : AssemblyDomainEleOp(row_field_name, col_field_name,
1167 DomainEleOp::OPROWCOL),
1168 commonDataPtr(common_data_ptr) {
1169 AssemblyDomainEleOp::sYmm = false;
1170}
1171
1172template <typename AssemblyDomainEleOp>
1173MoFEMErrorCode
1175 EntitiesFieldData::EntData &row_data,
1176 EntitiesFieldData::EntData &col_data) {
1178
1179 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1180 const auto nb_row_base_functions = row_data.getN().size2();
1181
1182 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1183 auto next = [&]() { ++t_res_c_dtau; };
1184
1185 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1186 auto t_row_base = row_data.getFTensor0N();
1187 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
1188 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1189 ++t_w;
1190
1191 const auto res = alpha * (t_res_c_dtau);
1192 next();
1193
1194 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1195 size_t rr = 0;
1196 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1197 auto t_col_base = col_data.getFTensor0N(gg, 0);
1198 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1199 *mat_ptr += t_row_base * t_col_base * res;
1200 ++t_col_base;
1201 ++mat_ptr;
1202 }
1203 ++t_row_base;
1204 }
1205 for (; rr < nb_row_base_functions; ++rr)
1206 ++t_row_base;
1207 }
1208
1210}
1211}; // namespace PlasticOps
constexpr double third
std::string type
constexpr double a
Fourth-order differential deviator tensor.
@ 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()
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
static auto get_mat_tensor_sym_dtensor_sym(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
FTensor::Index< 'N', 3 > N
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 get_mat_scalar_dtensor_sym(MatrixDouble &mat, FTensor::Number< 2 >)
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)
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 plastic_flow(long double f, FTensor::Tensor2_symmetric< double, 3 > &&t_dev_stress, const FTensor::DiffDeviator< T, DIM > &t_diff_deviator)
auto diff_plastic_flow_dstress(long double f, FTensor::Tensor2_symmetric< T, DIM > &t_flow, const FTensor::DiffDeviator< U, DIM > &t_diff_deviator)
FTensor::Index< 'I', 3 > I
[Common data]
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 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
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
auto kinematic_hardening(FTensor::Tensor2_symmetric< T, DIM > &t_plastic_strain, double C1_k)
Definition plastic.cpp:93
double iso_hardening_dtau(double tau, double H, double Qinf, double b_iso)
Definition plastic.cpp:79
constexpr auto size_symm
Definition plastic.cpp:42
double zeta
Viscous hardening.
Definition plastic.cpp:131
double cn0
Definition plastic.cpp:136
double iso_hardening(double tau, double H, double Qinf, double b_iso, double sigmaY)
Definition plastic.cpp:74
double cn1
Definition plastic.cpp:137