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