v0.15.0
Loading...
Searching...
No Matches
ThermoPlasticOps.hpp
Go to the documentation of this file.
1/**
2 * \file ThermoPlasticOps.hpp
3 * \example ThermoPlasticOps.hpp
4 *
5 * @copyright Copyright (c) 2024
6 */
7
8#ifndef __THERMO_PLASTIC_OPS_HPP__
9#define __THERMO_PLASTIC_OPS_HPP__
10
12
14 : public boost::enable_shared_from_this<BlockedParameters> {
16 double refTemp;
20
21 inline auto getCoeffExpansionPtr();
22 inline auto getRefTempPtr();
24 inline auto getHeatCapacityPtr();
26};
27
29 : public boost::enable_shared_from_this<ThermoPlasticBlockedParameters> {
30 double omega0;
31 double omegaH;
33 double temp0;
34 VectorDouble temperature;
35 MatrixDouble heat_flux;
36
37 VectorDouble resCdTemperature;
38 MatrixDouble resFlowDtemp;
39
40 inline auto getOmega0Ptr() {
41 return boost::shared_ptr<double>(shared_from_this(), &omega0);
42 }
43
44 inline auto getOmegaHPtr() {
45 return boost::shared_ptr<double>(shared_from_this(), &omegaH);
46 }
47
49 return boost::shared_ptr<double>(shared_from_this(),
51 }
52
53 inline auto getTemp0Ptr() {
54 return boost::shared_ptr<double>(shared_from_this(), &temp0);
55 }
56
57 inline auto getTempPtr() {
58 return boost::shared_ptr<VectorDouble>(shared_from_this(), &temperature);
59 }
60
61 inline auto getHeatFluxPtr() {
62 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &heat_flux);
63 }
64};
65
67 MoFEM::Interface &m_field,
68 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
69 std::string thermoplastic_block_name,
70 boost::shared_ptr<ThermoPlasticBlockedParameters> blockedParamsPtr,
71 boost::shared_ptr<ThermoElasticOps::BlockedThermalParameters>
72 &blockedThermalParamsPtr,
74
75template <int DIM, IntegrationType I, typename DomainEleOp>
77 MoFEM::Interface &m_field, std::string plastic_block_name,
78 std::string thermal_block_name, std::string thermoelastic_block_name,
79 std::string thermoplastic_block_name,
80 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
81 std::string u, std::string ep, std::string tau, std::string temperature,
82 double scale,
86 bool with_rates = true);
87
88template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
90
91// Calculate deltaT \zeta \bm{T} : \dot{\bm{E}}_p
92// Calculate deltaT \zeta T_ij : \dot{E_ij}_p
93template <int DIM, typename AssemblyDomainEleOp>
95 : public AssemblyDomainEleOp {
96
98 const std::string field_name,
99 boost::shared_ptr<MatrixDouble> stress_measure,
100 boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
101 ScalarFun inelastic_heating_function,
102 boost::shared_ptr<Range> ents_ptr = nullptr)
104 stressMeasurePtr(stress_measure),
105 plasticStrainRateMeasurePtr(plastic_strain_rate_measure),
106 inelasticHeatingFunction(inelastic_heating_function) {}
107
108protected:
109 boost::shared_ptr<MatrixDouble> stressMeasurePtr;
110 boost::shared_ptr<MatrixDouble> plasticStrainRateMeasurePtr;
112 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
113};
114
115template <int DIM, typename AssemblyDomainEleOp>
116MoFEMErrorCode
118 EntitiesFieldData::EntData &data) {
120
121 FTensor::Index<'i', DIM> i;
122 FTensor::Index<'j', DIM> j;
123
124 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
125
126 // get stress and strain values
127 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*stressMeasurePtr);
128 auto t_plastic_strain_rate =
129 getFTensor2SymmetricFromMat<DIM>(*plasticStrainRateMeasurePtr);
130
131 // get element volume
132 const double vol = AssemblyDomainEleOp::getMeasure();
133 // get integration weights
134 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
135 // get base function gradient on rows
136 auto t_row_base = data.getFTensor0N();
137
138 // get coordinate at integration points
139 auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
140
141 // loop over integration points
142 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
143 // take into account Jacobian
144 const double alpha =
145 t_w * vol *
146 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
147 t_stress(i, j) * t_plastic_strain_rate(i, j);
148
149 // loop over rows base functions
150 size_t rr = 0;
151 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
152 AssemblyDomainEleOp::locF[rr] += alpha * t_row_base;
153 ++t_row_base;
154 }
155 for (; rr < AssemblyDomainEleOp::nbRowBaseFunctions; ++rr)
156 ++t_row_base;
157 ++t_w; // move to another integration weight
158 ++t_coords;
159 ++t_stress;
160 ++t_plastic_strain_rate;
161 };
163}
164
165// Templated on IS_LARGE_STRAINS to allow different implementations at compile
166// time
167template <int SPACE_DIM, IntegrationType I, typename AssemblyDomainEleOp,
168 bool IS_LARGE_STRAINS>
170
171template <int SPACE_DIM, IntegrationType I, typename AssemblyDomainEleOp>
173 : public OpCalculateAdiabaticHeatingRhsImpl<SPACE_DIM, GAUSS,
174 AssemblyDomainEleOp> {
176 const std::string field_name,
177 boost::shared_ptr<MatrixDouble> stress_measure,
178 boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
179 ScalarFun inelastic_heating_function,
180 boost::shared_ptr<Range> ents_ptr = nullptr)
183 field_name, stress_measure, plastic_strain_rate_measure,
184 inelastic_heating_function, ents_ptr) {}
185};
186
187template <int SPACE_DIM, IntegrationType I, typename AssemblyDomainEleOp>
189 : public OpCalculateAdiabaticHeatingRhsImpl<SPACE_DIM, GAUSS,
190 AssemblyDomainEleOp> {
192 const std::string field_name,
193 boost::shared_ptr<MatrixDouble> stress_measure,
194 boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
195 ScalarFun inelastic_heating_function,
196 boost::shared_ptr<Range> ents_ptr = nullptr)
199 field_name, stress_measure, plastic_strain_rate_measure,
200 inelastic_heating_function, ents_ptr) {}
201};
202
203template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
205
206template <int DIM, typename AssemblyDomainEleOp>
208 : public AssemblyDomainEleOp {
210 const std::string row_field_name, const std::string col_field_name,
211 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
212 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
213 ScalarFun inelastic_heating_function,
214 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
215 boost::shared_ptr<Range> ents_ptr = nullptr)
216 : AssemblyDomainEleOp(row_field_name, col_field_name,
217 AssemblyDomainEleOp::OPROWCOL),
218 elasticCommonDataPtr(elastic_common_data_ptr),
219 plasticCommonDataPtr(plastic_common_data_ptr),
220 inelasticHeatingFunction(inelastic_heating_function),
221 coeffExpansionPtr(coeff_expansion_ptr), entsPtr(ents_ptr) {}
222
223protected:
224 boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
225 boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
227 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
228 boost::shared_ptr<Range> entsPtr;
229 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
230 EntitiesFieldData::EntData &col_data);
231};
232
233template <int DIM, typename AssemblyDomainEleOp>
234MoFEMErrorCode
236 iNtegrate(EntitiesFieldData::EntData &row_data,
237 EntitiesFieldData::EntData &col_data) {
239
240 const auto nb_integration_pts = row_data.getN().size1();
241 const auto nb_row_base_functions = row_data.getN().size2();
242 auto t_w = this->getFTensor0IntegrationWeight();
243
244 constexpr auto t_kd = FTensor::Kronecker_Delta<int>();
245 auto t_row_base = row_data.getFTensor0N();
246
247 // get plastic strain rate values
248 auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
249 *(plasticCommonDataPtr->getPlasticStrainDotPtr()));
250
251 // get elasticity tensor
252 auto t_D =
253 getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
254
255 // get coordinate at integration points
256 auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
257
258 FTensor::Index<'i', DIM> i;
259 FTensor::Index<'j', DIM> j;
260 FTensor::Index<'k', DIM> k;
261 FTensor::Index<'l', DIM> l;
262
264 t_coeff_exp(i, j) = 0;
265 for (auto d = 0; d != SPACE_DIM; ++d) {
266 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
267 }
268
269 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
270
271 double alpha = this->getMeasure() * t_w;
272 auto rr = 0;
273 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
274 auto t_col_base = col_data.getFTensor0N(gg, 0);
275 for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
276#ifdef HENCKY_SMALL_STRAIN
277 AssemblyDomainEleOp::locMat(rr, cc) -=
278 alpha * t_row_base *
279 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
280 t_coeff_exp(i, j) * t_D(i, j, k, l) * t_plastic_strain_rate(k, l) *
281 t_col_base;
282#else
283 AssemblyDomainEleOp::locMat(rr, cc) -=
284 alpha * t_row_base *
285 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
286 t_coeff_exp(i, j) * t_D(i, j, k, l) * t_plastic_strain_rate(k, l) *
287 t_col_base;
288#endif
289 ++t_col_base;
290 }
291
292 ++t_row_base;
293 }
294 for (; rr != nb_row_base_functions; ++rr)
295 ++t_row_base;
296
297 ++t_w;
298 ++t_plastic_strain_rate;
299 ++t_D;
300 ++t_coords;
301 }
302
304}
305
306template <int DIM, IntegrationType I, typename AssemblyDomainEleOp,
307 bool IS_LARGE_STRAINS>
309
310template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
312 : public OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS,
313 AssemblyDomainEleOp> {
315 const std::string row_field_name, const std::string col_field_name,
316 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
317 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
318 ScalarFun inelastic_heating_function,
319 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
320 boost::shared_ptr<Range> ents_ptr = nullptr)
322 row_field_name, col_field_name, elastic_common_data_ptr,
323 plastic_common_data_ptr, inelastic_heating_function,
324 coeff_expansion_ptr, ents_ptr) {}
325};
326
327template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
329 : public OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS,
330 AssemblyDomainEleOp> {
332 const std::string row_field_name, const std::string col_field_name,
333 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
334 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
335 ScalarFun inelastic_heating_function,
336 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
337 boost::shared_ptr<Range> ents_ptr = nullptr)
339 row_field_name, col_field_name, elastic_common_data_ptr,
340 plastic_common_data_ptr, inelastic_heating_function,
341 coeff_expansion_ptr, ents_ptr) {}
342};
343
344template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
346
347template <int DIM, typename AssemblyDomainEleOp>
349 : public AssemblyDomainEleOp {
351 const std::string row_field_name, const std::string col_field_name,
352 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
353 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
354 ScalarFun inelastic_heating_function,
355 boost::shared_ptr<Range> ents_ptr = nullptr)
356 : AssemblyDomainEleOp(row_field_name, col_field_name,
357 AssemblyDomainEleOp::OPROWCOL),
358 elasticCommonDataPtr(elastic_common_data_ptr),
359 plasticCommonDataPtr(plastic_common_data_ptr),
360 inelasticHeatingFunction(inelastic_heating_function),
361 entsPtr(ents_ptr) {
362 this->sYmm = false;
363 }
364
365protected:
366 boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
367 boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
369 boost::shared_ptr<Range> entsPtr;
370 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
371 EntitiesFieldData::EntData &col_data);
372};
373
374template <int DIM, typename AssemblyDomainEleOp>
375MoFEMErrorCode
377 iNtegrate(EntitiesFieldData::EntData &row_data,
378 EntitiesFieldData::EntData &col_data) {
380
381 FTensor::Index<'i', DIM> i;
382 FTensor::Index<'j', DIM> j;
383 FTensor::Index<'k', DIM> k;
384 FTensor::Index<'l', DIM> l;
385 FTensor::Index<'m', DIM> m;
386 FTensor::Index<'n', DIM> n;
387 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
389
390 const auto nb_integration_pts = row_data.getN().size1();
391 const auto nb_row_base_functions = row_data.getN().size2();
392 auto t_w = this->getFTensor0IntegrationWeight();
393
395
396 constexpr auto t_kd = FTensor::Kronecker_Delta<int>();
397 auto t_row_base = row_data.getFTensor0N();
398
399 auto t_stress = getFTensor2SymmetricFromMat<DIM>(
400 *(elasticCommonDataPtr->getMatHenckyStress()));
401
402 // get plastic strain rate values
403 auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
404 *(plasticCommonDataPtr->getPlasticStrainDotPtr()));
405
406 // get elasticity tensor
407 auto t_D =
408 getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
409
410 // get coordinate at integration points
411 auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
412
414
415 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
416 // get the local vector to store the symmetric tensor of size_symm
417 auto t_vec = getFTensor1FromPtr<size_symm>(&this->locMat(0, 0));
418 double alpha = this->getMeasure() * t_w;
419 auto rr = 0;
420 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
421 auto t_col_base = col_data.getFTensor0N(gg, 0);
422 for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols / size_symm; cc++) {
423#ifdef HENCKY_SMALL_STRAIN
424 t_vec(L) -=
425 alpha * t_row_base *
426 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
427 (t_plastic_strain_rate(i, j) * t_D(i, j, k, l) *
428 t_diff(k, l, m, n) -
429 this->getTSa() * t_stress(i, j) * t_diff(i, j, m, n)) *
430 t_col_base * t_L(m, n, L);
431#else
432 t_vec(L) -=
433 alpha * t_row_base *
434 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
435 (t_plastic_strain_rate(i, j) * t_D(i, j, k, l) *
436 t_diff(k, l, m, n) -
437 this->getTSa() * t_stress(i, j) * t_diff(i, j, m, n)) *
438 t_col_base * t_L(m, n, L);
439#endif
440 ++t_vec;
441 ++t_col_base;
442 }
443
444 ++t_row_base;
445 }
446 for (; rr != nb_row_base_functions; ++rr)
447 ++t_row_base;
448
449 ++t_w;
450 ++t_plastic_strain_rate;
451 ++t_D;
452 ++t_coords;
453 ++t_stress;
454 }
455
457}
458
459template <int DIM, IntegrationType I, typename AssemblyDomainEleOp,
460 bool IS_LARGE_STRAINS>
462
463template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
465 : public OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS,
466 AssemblyDomainEleOp> {
468 const std::string row_field_name, const std::string col_field_name,
469 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
470 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
471 ScalarFun inelastic_heating_function,
472 boost::shared_ptr<Range> ents_ptr = nullptr)
474 row_field_name, col_field_name, elastic_common_data_ptr,
475 plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
476};
477
478template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
480 : public OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS,
481 AssemblyDomainEleOp> {
483 const std::string row_field_name, const std::string col_field_name,
484 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
485 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
486 ScalarFun inelastic_heating_function,
487 boost::shared_ptr<Range> ents_ptr = nullptr)
489 row_field_name, col_field_name, elastic_common_data_ptr,
490 plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
491};
492
493template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
495
496template <int DIM, typename AssemblyDomainEleOp>
498 : public AssemblyDomainEleOp {
500 const std::string row_field_name, const std::string col_field_name,
501 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
502 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
503 ScalarFun inelastic_heating_function,
504 boost::shared_ptr<Range> ents_ptr = nullptr)
505 : AssemblyDomainEleOp(row_field_name, col_field_name,
506 AssemblyDomainEleOp::OPROWCOL),
507 elasticCommonDataPtr(elastic_common_data_ptr),
508 plasticCommonDataPtr(plastic_common_data_ptr),
509 inelasticHeatingFunction(inelastic_heating_function),
510 entsPtr(ents_ptr) {
511 this->sYmm = false;
512 }
513
514protected:
515 boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
516 boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
518 boost::shared_ptr<Range> entsPtr;
519 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
520 EntitiesFieldData::EntData &col_data);
521};
522
523template <int DIM, typename AssemblyDomainEleOp>
524MoFEMErrorCode
526 iNtegrate(EntitiesFieldData::EntData &row_data,
527 EntitiesFieldData::EntData &col_data) {
529
530 FTensor::Index<'i', DIM> i;
531 FTensor::Index<'j', DIM> j;
532 FTensor::Index<'k', DIM> k;
533 FTensor::Index<'l', DIM> l;
534 FTensor::Index<'m', DIM> m;
535 FTensor::Index<'n', DIM> n;
536 FTensor::Index<'o', DIM> o;
537 FTensor::Index<'p', DIM> p;
538
539 const auto nb_integration_pts = row_data.getN().size1();
540 const auto nb_row_base_functions = row_data.getN().size2();
541
542 auto t_w = this->getFTensor0IntegrationWeight();
543
544 auto t_row_base = row_data.getFTensor0N();
545
546 auto t_logC_dC =
547 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
548 auto t_C_dF =
549 getFTensor4FromMat<DIM, DIM, DIM, DIM, 1>(elasticCommonDataPtr->matCdF);
550
551 // get plastic strain rate values
552 auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
553 *(plasticCommonDataPtr->getPlasticStrainDotPtr()));
554
555 // get elasticity tensor
556 auto t_D =
557 getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
558
559 // get coordinate at integration points
560 auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
561
562 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
563 auto t_vec = getFTensor1FromPtr<DIM>(&this->locMat(0, 0));
564 double alpha = this->getMeasure() * t_w;
565
566 auto rr = 0;
567 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
568 auto t_col_grad_base = col_data.getFTensor1DiffN<DIM>(gg, 0);
569 for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols / DIM; cc++) {
570#ifdef HENCKY_SMALL_STRAIN
571 // TODO: implement correct small strain problem
572 t_vec(m) +=
573 0.5 * alpha * t_row_base *
574 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
575 (t_plastic_strain_rate(i, j) * t_D(i, j, k, l) *
576 t_logC_dC(k, l, o, p) * t_C_dF(o, p, m, n)) *
577 t_col_grad_base(n);
578#else
579 // Multiply by a half for dEdC from dlogCdC
580 t_vec(m) +=
581 0.5 * alpha * t_row_base *
582 inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
583 (t_plastic_strain_rate(i, j) * t_D(i, j, k, l) *
584 t_logC_dC(k, l, o, p) * t_C_dF(o, p, m, n)) *
585 t_col_grad_base(n);
586#endif
587 ++t_col_grad_base;
588 ++t_vec;
589 }
590
591 ++t_row_base;
592 }
593 for (; rr != nb_row_base_functions; ++rr)
594 ++t_row_base;
595
596 ++t_w;
597 ++t_plastic_strain_rate;
598 ++t_D;
599 ++t_coords;
600 ++t_logC_dC;
601 ++t_C_dF;
602 }
603
605}
606
607template <int DIM, IntegrationType I, typename AssemblyDomainEleOp,
608 bool IS_LARGE_STRAINS>
610
611template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
613 : public OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS,
614 AssemblyDomainEleOp> {
616 const std::string row_field_name, const std::string col_field_name,
617 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
618 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
619 ScalarFun inelastic_heating_function,
620 boost::shared_ptr<Range> ents_ptr = nullptr)
622 row_field_name, col_field_name, elastic_common_data_ptr,
623 plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
624};
625
626template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
628 : public OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS,
629 AssemblyDomainEleOp> {
631 const std::string row_field_name, const std::string col_field_name,
632 boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
633 boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
634 ScalarFun inelastic_heating_function,
635 boost::shared_ptr<Range> ents_ptr = nullptr)
637 row_field_name, col_field_name, elastic_common_data_ptr,
638 plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
639};
640
641template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
643 MoFEM::Interface &m_field, std::string block_name,
644 std::string thermal_block_name,
645 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
646 std::string u, std::string ep, std::string tau, std::string temperature);
647
648template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
650 MoFEM::Interface &m_field, std::string block_name,
651 std::string thermal_block_name,
652 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
653 std::string u, std::string ep, std::string tau, std::string temperature);
654
655template <IntegrationType I, typename AssemblyDomainEleOp>
657
658template <IntegrationType I>
661
662template <typename AssemblyDomainEleOp>
664 : public AssemblyDomainEleOp {
666 const std::string row_field_name, const std::string col_field_name,
667 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
668 TP_common_data_ptr);
669 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
670 EntitiesFieldData::EntData &col_data);
671
672private:
673 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
675};
676
677template <typename AssemblyDomainEleOp>
680 const std::string row_field_name, const std::string col_field_name,
681 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
682 TP_common_data_ptr)
683 : AssemblyDomainEleOp(row_field_name, col_field_name,
684 DomainEleOp::OPROWCOL),
685 TPcommonDataPtr(TP_common_data_ptr) {
686 AssemblyDomainEleOp::sYmm = false;
687}
688
689template <typename AssemblyDomainEleOp>
690MoFEMErrorCode
692 EntitiesFieldData::EntData &row_data,
693 EntitiesFieldData::EntData &col_data) {
695
696 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
697 const auto nb_row_base_functions = row_data.getN().size2();
698
699 auto t_res_c_dtemperature =
700 getFTensor0FromVec(TPcommonDataPtr->resCdTemperature);
701 auto next = [&]() { ++t_res_c_dtemperature; };
702
703 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
704 auto t_row_base = row_data.getFTensor0N();
705 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
706 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
707 ++t_w;
708
709 const auto res = alpha * (t_res_c_dtemperature);
710 next();
711
712 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
713 size_t rr = 0;
714 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
715 auto t_col_base = col_data.getFTensor0N(gg, 0);
716 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
717 *mat_ptr += t_row_base * t_col_base * res;
718 ++t_col_base;
719 ++mat_ptr;
720 }
721 ++t_row_base;
722 }
723 for (; rr < nb_row_base_functions; ++rr)
724 ++t_row_base;
725 }
726
728}
729
730template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
732
733template <int DIM, IntegrationType I>
736
737template <int DIM, typename AssemblyDomainEleOp>
739 : public AssemblyDomainEleOp {
741 const std::string row_field_name, const std::string col_field_name,
742 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
743 common_TP_data_ptr);
744 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
745 EntitiesFieldData::EntData &col_data);
746
747private:
748 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
750};
751
752template <int DIM, typename AssemblyDomainEleOp>
755 const std::string row_field_name, const std::string col_field_name,
756 boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
757 common_TP_data_ptr)
758 : AssemblyDomainEleOp(row_field_name, col_field_name,
759 DomainEleOp::OPROWCOL),
760 commonTPDataPtr(common_TP_data_ptr) {
761 AssemblyDomainEleOp::sYmm = false;
762}
763
764template <int DIM, typename AssemblyDomainEleOp>
765MoFEMErrorCode
767 EntitiesFieldData::EntData &row_data,
768 EntitiesFieldData::EntData &col_data) {
770
771 FTensor::Index<'i', DIM> i;
772 FTensor::Index<'j', DIM> j;
773 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
775
776 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
777 const size_t nb_row_base_functions = row_data.getN().size2();
778 auto &locMat = AssemblyDomainEleOp::locMat;
779
780 auto t_res_flow_dtemp =
781 getFTensor2SymmetricFromMat<DIM>(commonTPDataPtr->resFlowDtemp);
782
784
785 auto next = [&]() { ++t_res_flow_dtemp; };
786
787 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
788 auto t_row_base = row_data.getFTensor0N();
789 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
790 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
791 ++t_w;
793 t_res_vec(L) = alpha * (t_res_flow_dtemp(i, j) * t_L(i, j, L));
794 next();
795
796 size_t rr = 0;
797 for (; rr != AssemblyDomainEleOp::nbRows / size_symm; ++rr) {
799 rr, locMat, FTensor::Number<DIM>());
800 auto t_col_base = col_data.getFTensor0N(gg, 0);
801 for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
802 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
803 ++t_mat;
804 ++t_col_base;
805 }
806 ++t_row_base;
807 }
808 for (; rr != nb_row_base_functions; ++rr)
809 ++t_row_base;
810 }
811
813}
814
815}; // namespace ThermoPlasticOps
816
817#endif // __FINITE_THERMAL_OPS_HPP__
constexpr int SPACE_DIM
[Define dimension]
Kronecker Delta class.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
constexpr auto t_kd
FTensor::Index< 'i', SPACE_DIM > i
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_dscalar(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
auto symm_L_tensor(FTensor::Number< DIM >)
auto diff_tensor(FTensor::Number< DIM >)
[Lambda functions]
MoFEMErrorCode opThermoPlasticFactoryDomainLhs(MoFEM::Interface &m_field, std::string block_name, std::string thermal_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature)
MoFEMErrorCode opThermoPlasticFactoryDomainRhs(MoFEM::Interface &m_field, std::string block_name, std::string thermal_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature)
auto createCommonThermoPlasticOps(MoFEM::Interface &m_field, std::string plastic_block_name, std::string thermal_block_name, std::string thermoelastic_block_name, std::string thermoplastic_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature, double scale, ScalerFunTwoArgs thermal_conductivity_scaling, ScalerFunTwoArgs heat_capacity_scaling, ScalerFunThreeArgs inelastic_heat_fraction_scaling, Sev sev, bool with_rates=true)
MoFEMErrorCode addMatThermoPlasticBlockOps(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string thermoplastic_block_name, boost::shared_ptr< ThermoPlasticBlockedParameters > blockedParamsPtr, boost::shared_ptr< ThermoElasticOps::BlockedThermalParameters > &blockedThermalParamsPtr, Sev sev, ScalerFunThreeArgs inelastic_heat_fraction_scaling)
constexpr IntegrationType I
constexpr auto field_name
FTensor::Index< 'm', 3 > m
Deprecated interface functions.
OpCalculateAdiabaticHeatingLhsdEPImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdEP(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdEP(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdTImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< VectorDouble > coeff_expansion_ptr, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdT(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< VectorDouble > coeff_expansion_ptr, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdT(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< VectorDouble > coeff_expansion_ptr, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdUImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdU(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingLhsdU(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_data_ptr, boost::shared_ptr< PlasticOps::CommonData > plastic_common_data_ptr, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingRhsImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > stress_measure, boost::shared_ptr< MatrixDouble > plastic_strain_rate_measure, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > stress_measure, boost::shared_ptr< MatrixDouble > plastic_strain_rate_measure, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
OpCalculateAdiabaticHeatingRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > stress_measure, boost::shared_ptr< MatrixDouble > plastic_strain_rate_measure, ScalarFun inelastic_heating_function, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > TPcommonDataPtr
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > commonTPDataPtr
FormsIntegrators< DomainEleOp >::Assembly< A >::OpBase AssemblyDomainEleOp
ScalerFunTwoArgs heat_capacity_scaling
ScalerFunThreeArgs inelastic_heat_fraction_scaling
boost::function< double(const double, const double, const double)> ScalerFunThreeArgs
boost::function< double(const double, const double)> ScalerFunTwoArgs
ScalerFunTwoArgs thermal_conductivity_scaling
double scale
Definition plastic.cpp:123
constexpr auto size_symm
Definition plastic.cpp:42
constexpr bool IS_LARGE_STRAINS