v0.16.0
Loading...
Searching...
No Matches
EshelbianPlasticity.hpp
Go to the documentation of this file.
1/**
2 * \file EshelbianPlasticity.hpp
3 * \brief Eshelbian plasticity interface
4 *
5 * \brief Problem implementation for mix element for large-strain elasticity
6 *
7 * For reference on mixed formulation see: \cite gopalakrishnan2012second and
8 * \cite cockburn2010new
9 *
10 * \todo Implementation of plasticity
11 */
12
13// DO NOT DELETE MIGHT BE USEFULL
14// #include <boost/multiprecision/mpfr.hpp>
15// using mpfr50 = boost::multiprecision::number<
16// boost::multiprecision::mpfr_float_backend<50>>;
17
18// inline mpfr50 exp_hi(const mpfr50 x) { return boost::multiprecision::exp(x);
19// } inline mpfr50 log_hi(const mpfr50 x) { return
20// boost::multiprecision::log(x); }
21
22constexpr int SPACE_DIM = 3;
23// constexpr auto A = AssemblyType::BLOCK_SCHUR;
24constexpr auto A = AssemblyType::BLOCK_MAT;
25
26#include "MatOps.hpp"
27
28#ifndef __ESHELBIAN_PLASTICITY_HPP__
29 #define __ESHELBIAN_PLASTICITY_HPP__
30
32
33namespace EshelbianPlasticity {
34
35using DL = DataLayoutTraits<DataLayout::GaussByCoeffs>;
36
37struct ContactTree;
38
43 LOG /*linear extension*/,
44 LOG_QUADRATIC /*quadratic extension*/,
46};
48
49using MatrixPtr = boost::shared_ptr<MatrixDouble>;
50using VectorPtr = boost::shared_ptr<VectorDouble>;
51
52using EntData = EntitiesFieldData::EntData;
53using UserDataOperator = ForcesAndSourcesCore::UserDataOperator;
54using VolUserDataOperator = VolumeElementForcesAndSourcesCore::UserDataOperator;
55using FaceUserDataOperator = FaceElementForcesAndSourcesCore::UserDataOperator;
56using EleOnSide = PipelineManager::ElementsAndOpsByDim<SPACE_DIM>::FaceSideEle;
57using SideEleOp = EleOnSide::UserDataOperator;
58
60struct TopologicalData;
61
62struct AnalyticalExprPython;
63
65 : public boost::enable_shared_from_this<MatOpsDataAtIntegrationPts> {
66
69 matOpsData->insertCommonData("approxPAtPts");
70 matOpsData->insertCommonData("approxP0AtPts");
71 matOpsData->insertCommonData("divPAtPts");
72 matOpsData->insertCommonData("wL2AtPts");
73 matOpsData->insertCommonData("wL2DotAtPts");
74 matOpsData->insertCommonData("wL2DotDotAtPts");
75 matOpsData->insertCommonData("logStretchTensorAtPts");
76 matOpsData->insertCommonData("logStretchTensor0AtPts");
77 matOpsData->insertCommonData("logStretchDotTensorAtPts");
78 matOpsData->insertCommonData("gradLogStretchDotTensorAtPts");
79 matOpsData->insertCommonData("rotAxisAtPts");
80 matOpsData->insertCommonData("rotAxis0AtPts");
81 matOpsData->insertCommonData("rotAxisGradAtPts");
82 matOpsData->insertCommonData("rotAxisDotAtPts");
83 matOpsData->insertCommonData("rotAxisGradDotAtPts");
84 matOpsData->insertCommonData("stretchH1AtPts");
85 matOpsData->insertCommonData("wGradH1AtPts");
86 matOpsData->insertCommonData("stretchTensorAtPts");
87 matOpsData->insertCommonData("diffStretchH1AtPts");
88 matOpsData->insertCommonData("diffStretchTensorAtPts");
89 matOpsData->insertCommonData("hAtPts");
90 matOpsData->insertCommonData("adjointPdstretchAtPts");
91 matOpsData->insertCommonData("adjointPdUAtPts");
92 matOpsData->insertCommonData("adjointPdUdOmegaAtPts");
93 matOpsData->insertCommonData("adjointPdUdPAtPts");
94 matOpsData->insertCommonData("eigenVals");
95 matOpsData->insertCommonData("eigenVecs");
96 matOpsData->insertCommonData("PAtPts");
97 matOpsData->insertCommonData("PAtPts_du");
98 }
99
100 boost::shared_ptr<MatOps::MatOpsData> matOpsData;
101};
102
104
105 MatrixDouble tractionAtPts;
106
107 MatrixDouble wH1AtPts;
108 MatrixDouble XH1AtPts;
109 MatrixDouble contactL2AtPts;
110 MatrixDouble logStretch2H1AtPts;
112
113 MatrixDouble hdOmegaAtPts;
114 MatrixDouble hdLogStretchAtPts;
115 MatrixDouble leviKirchhoffAtPts;
120 MatrixDouble rotMatAtPts;
121 MatrixDouble SigmaAtPts;
122 VectorDouble energyAtPts; //< this is density of energy at integration points
123
124 MatrixDouble varRotAxis;
125 MatrixDouble varGradRotAxis;
126 MatrixDouble varLogStreach;
127 MatrixDouble varPiola;
128 MatrixDouble varDivPiola;
129 MatrixDouble varWL2;
130 MatrixDouble varHybridDispAtPts;
131
132 VectorInt nbUniq;
133 MatrixDouble eigenValsC;
134 MatrixDouble eigenVecsC;
135 VectorInt nbUniqC;
136
137 MatrixDouble matD;
138 MatrixDouble matAxiatorD;
139 MatrixDouble matDeviatorD;
140 MatrixDouble matInvD;
141
143
144 MatrixDouble hybridDispAtPts;
148
149 MatrixDouble gradientAtPts;
150
151 double mu;
152 double lambda;
153 VectorDouble muAtPts;
154 VectorDouble lambdaAtPts;
155 VectorDouble youngModulusAtPts;
156 double piolaScale = 1.;
157
158 inline auto getPiolaScalePtr() {
159 return boost::shared_ptr<double>(shared_from_this(), &piolaScale);
160 }
161
162 static constexpr int SizeSymm = (SPACE_DIM * (SPACE_DIM + 1)) / 2;
163
164 template <class Tensor>
165 static inline auto getFTensor(MatrixDouble &m, const int nb_gauss_pts) {
166 return MatrixSizeHelper<Tensor, DL>::get(m, nb_gauss_pts)();
167 }
168
169 template <class Tensor>
170 static inline auto getFTensor(MatrixPtr m, const int nb_gauss_pts) {
171 return getFTensor<Tensor>(*m, nb_gauss_pts);
172 }
173
174 inline auto getFTensorApproxP(const int nb_gauss_pts) {
175 return getFTensor<
176 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
177 matOpsData->getCommonDataPtr("approxPAtPts"), nb_gauss_pts);
178 }
179
180 inline auto getFTensorApproxP0(const int nb_gauss_pts) {
181 return getFTensor<
182 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
183 matOpsData->getCommonDataPtr("approxP0AtPts"), nb_gauss_pts);
184 }
185
186 inline auto getFTensorP(const int nb_gauss_pts) {
187 return getFTensor<
188 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
189 matOpsData->getCommonDataPtr("PAtPts"), nb_gauss_pts);
190 }
191
192 inline auto getFTensorPDu(const int nb_gauss_pts) {
193 return getFTensor<GetFTensor4FromMatType<
195 matOpsData->getCommonDataPtr("PAtPts_du"), nb_gauss_pts);
196 }
197
198 inline auto getFTensorDivP(const int nb_gauss_pts) {
199 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
200 matOpsData->getCommonDataPtr("divPAtPts"), nb_gauss_pts);
201 }
202
203 inline auto getFTensorSmallWL2(const int nb_gauss_pts) {
204 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
205 matOpsData->getCommonDataPtr("wL2AtPts"), nb_gauss_pts);
206 }
207
208 inline auto getFTensorSmallWL2Dot(const int nb_gauss_pts) {
209 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
210 matOpsData->getCommonDataPtr("wL2DotAtPts"), nb_gauss_pts);
211 }
212
213 inline auto getFTensorSmallWL2DotDot(const int nb_gauss_pts) {
214 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
215 matOpsData->getCommonDataPtr("wL2DotDotAtPts"), nb_gauss_pts);
216 }
217
218 inline auto getFTensorLogStretch(const int nb_gauss_pts) {
219 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
220 matOpsData->getCommonDataPtr("logStretchTensorAtPts"),
221 nb_gauss_pts);
222 }
223
224 inline auto getFTensorLogStretch0(const int nb_gauss_pts) {
225 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
226 matOpsData->getCommonDataPtr("logStretchTensor0AtPts"),
227 nb_gauss_pts);
228 }
229
230 inline auto getFTensorLogStretchDot(const int nb_gauss_pts) {
231 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
232 matOpsData->getCommonDataPtr("logStretchDotTensorAtPts"),
233 nb_gauss_pts);
234 }
235
236 inline auto getFTensorGradLogStretchDot(const int nb_gauss_pts) {
237 return getFTensor<GetFTensor2FromMatType<SizeSymm, SPACE_DIM, -1, DL>>(
238 matOpsData->getCommonDataPtr("gradLogStretchDotTensorAtPts"),
239 nb_gauss_pts);
240 }
241
242 inline auto getFTensorRotAxis(const int nb_gauss_pts) {
243 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
244 matOpsData->getCommonDataPtr("rotAxisAtPts"), nb_gauss_pts);
245 }
246
247 inline auto getFTensorRotAxis0(const int nb_gauss_pts) {
248 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
249 matOpsData->getCommonDataPtr("rotAxis0AtPts"), nb_gauss_pts);
250 }
251
252 inline auto getFTensorRotAxisGrad(const int nb_gauss_pts) {
253 return getFTensor<
254 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
255 matOpsData->getCommonDataPtr("rotAxisGradAtPts"), nb_gauss_pts);
256 }
257
258 inline auto getFTensorRotAxisDot(const int nb_gauss_pts) {
259 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
260 matOpsData->getCommonDataPtr("rotAxisDotAtPts"), nb_gauss_pts);
261 }
262
263 inline auto getFTensorRotAxisGradDot(const int nb_gauss_pts) {
264 return getFTensor<
265 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
266 matOpsData->getCommonDataPtr("rotAxisGradDotAtPts"), nb_gauss_pts);
267 }
268
269 inline auto getFTensorStretchH1(const int nb_gauss_pts) {
270 return getFTensor<
271 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
272 matOpsData->getCommonDataPtr("stretchH1AtPts"), nb_gauss_pts);
273 }
274
275 inline auto getFTensorSmallWGradH1(const int nb_gauss_pts) {
276 return getFTensor<
277 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
278 matOpsData->getCommonDataPtr("wGradH1AtPts"), nb_gauss_pts);
279 }
280
281 inline auto getFTensorStretch(const int nb_gauss_pts) {
282 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
283 matOpsData->getCommonDataPtr("stretchTensorAtPts"), nb_gauss_pts);
284 }
285
286 inline auto getFTensorDiffStretchH1(const int nb_gauss_pts) {
287 return getFTensor<GetFTensor4FromMatType<
289 matOpsData->getCommonDataPtr("diffStretchH1AtPts"), nb_gauss_pts);
290 }
291
292 inline auto getFTensorDiffStretch(const int nb_gauss_pts) {
293 return getFTensor<
294 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
295 matOpsData->getCommonDataPtr("diffStretchTensorAtPts"),
296 nb_gauss_pts);
297 }
298
299 inline auto getFTensorSmallH(const int nb_gauss_pts) {
300 return getFTensor<
301 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
302 matOpsData->getCommonDataPtr("hAtPts"), nb_gauss_pts);
303 }
304
305 inline auto getFTensorAdjointPdstretch(const int nb_gauss_pts) {
306 return getFTensor<
307 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
308 matOpsData->getCommonDataPtr("adjointPdstretchAtPts"),
309 nb_gauss_pts);
310 }
311
312 inline auto getFTensorAdjointPdU(const int nb_gauss_pts) {
313 return getFTensor<GetFTensor1FromMatType<SizeSymm, -1, DL>>(
314 matOpsData->getCommonDataPtr("adjointPdUAtPts"), nb_gauss_pts);
315 }
316
317 inline auto getFTensorAdjointPdUdOmega(const int nb_gauss_pts) {
318 return getFTensor<GetFTensor2FromMatType<SPACE_DIM, SizeSymm, -1, DL>>(
319 matOpsData->getCommonDataPtr("adjointPdUdOmegaAtPts"),
320 nb_gauss_pts);
321 }
322
323 inline auto getFTensorAdjointPdUdP(const int nb_gauss_pts) {
324 return getFTensor<
325 GetFTensor3FromMatType<SPACE_DIM, SPACE_DIM, SizeSymm, -1, DL>>(
326 matOpsData->getCommonDataPtr("adjointPdUdPAtPts"), nb_gauss_pts);
327 }
328
329 inline auto getFTensorEigenVals(const int nb_gauss_pts) {
330 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
331 matOpsData->getCommonDataPtr("eigenVals"), nb_gauss_pts);
332 }
333
334 inline auto getFTensorEigenVecs(const int nb_gauss_pts) {
335 return getFTensor<
336 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
337 matOpsData->getCommonDataPtr("eigenVecs"), nb_gauss_pts);
338 }
339
341 return matOpsData->getCommonDataPtr("approxPAtPts");
342 }
343
345 return matOpsData->getCommonDataPtr("approxP0AtPts");
346 }
347
348 inline MatrixPtr getPAtPts() { return matOpsData->getCommonDataPtr("PAtPts"); }
349
351 return matOpsData->getCommonDataPtr("PAtPts_du");
352 }
353
355 return matOpsData->getCommonDataPtr("diffStretchH1AtPts");
356 }
357
359 return matOpsData->getCommonDataPtr("stretchH1AtPts");
360 }
361
363 return matOpsData->getCommonDataPtr("adjointPdstretchAtPts");
364 }
365
367 return matOpsData->getCommonDataPtr("adjointPdUAtPts");
368 }
369
371 return matOpsData->getCommonDataPtr("adjointPdUdOmegaAtPts");
372 }
373
375 return matOpsData->getCommonDataPtr("adjointPdUdPAtPts");
376 }
377
379 return matOpsData->getCommonDataPtr("eigenVals");
380 }
381
383 return matOpsData->getCommonDataPtr("eigenVecs");
384 }
385
387 return matOpsData->getCommonDataPtr("divPAtPts");
388 }
389
391 return matOpsData->getCommonDataPtr("wL2AtPts");
392 }
393
395 return matOpsData->getCommonDataPtr("wL2DotAtPts");
396 }
397
399 return matOpsData->getCommonDataPtr("wL2DotDotAtPts");
400 }
401
403 return matOpsData->getCommonDataPtr("logStretchTensorAtPts");
404 }
405
407 return boost::shared_ptr<MatrixDouble>(
408 shared_from_this(), &logStretchTotalTensorAtPts);
409 }
410
412 return matOpsData->getCommonDataPtr("logStretchTensor0AtPts");
413 }
414
416 return matOpsData->getCommonDataPtr("stretchTensorAtPts");
417 }
418
420 return matOpsData->getCommonDataPtr("diffStretchTensorAtPts");
421 }
422
424 return matOpsData->getCommonDataPtr("hAtPts");
425 }
426
428 return matOpsData->getCommonDataPtr("logStretchDotTensorAtPts");
429 }
430
432 return matOpsData->getCommonDataPtr("gradLogStretchDotTensorAtPts");
433 }
434
436 return matOpsData->getCommonDataPtr("rotAxisAtPts");
437 }
438
440 return matOpsData->getCommonDataPtr("rotAxis0AtPts");
441 }
442
444 return matOpsData->getCommonDataPtr("rotAxisGradAtPts");
445 }
446
448 return matOpsData->getCommonDataPtr("rotAxisDotAtPts");
449 }
450
452 return matOpsData->getCommonDataPtr("rotAxisGradDotAtPts");
453 }
454
456 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matD);
457 }
458
460 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matInvD);
461 }
462
464 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matAxiatorD);
465 }
466
468 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matDeviatorD);
469 }
470
472 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &wH1AtPts);
473 }
474
476 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &XH1AtPts);
477 }
478
480 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &contactL2AtPts);
481 }
482
484 return matOpsData->getCommonDataPtr("wGradH1AtPts");
485 }
486
488 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
490 };
491
493 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varRotAxis);
494 }
495
497 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varGradRotAxis);
498 }
499
501 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varLogStreach);
502 }
503
505 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varPiola);
506 }
507
509 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varDivPiola);
510 }
511
513 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &varWL2);
514 }
515
517 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
519 }
520
522 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
524 }
525
527 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
529 }
530
532 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
534 }
535
537 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &gradientAtPts);
538 }
539
541 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &rotMatAtPts);
542 }
543
544 inline auto getFTensorEigenValsC(const int nb_gauss_pts) {
545 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
546 eigenValsC, nb_gauss_pts);
547 }
548
549 inline auto getFTensorEigenVecsC(const int nb_gauss_pts) {
550 return getFTensor<
551 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(eigenVecsC,
552 nb_gauss_pts);
553 }
554
555 inline auto getFTensorTraction(const int nb_gauss_pts) {
556 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
557 tractionAtPts, nb_gauss_pts);
558 }
559
560 inline auto getFTensorLogStretch2H1(const int nb_gauss_pts) {
561 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
562 logStretch2H1AtPts, nb_gauss_pts);
563 }
564
565 inline auto getFTensorLogStretchTotal(const int nb_gauss_pts) {
566 return getFTensor<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>>(
567 logStretchTotalTensorAtPts, nb_gauss_pts);
568 }
569
570 inline auto getFTensorSmallHdOmega(const int nb_gauss_pts) {
571 return getFTensor<GetFTensor3FromMatType<SPACE_DIM, SPACE_DIM, SPACE_DIM,
572 -1, DL>>(hdOmegaAtPts,
573 nb_gauss_pts);
574 }
575
576 inline auto getFTensorSmallHdLogStretch(const int nb_gauss_pts) {
577 return getFTensor<
578 GetFTensor3FromMatType<SPACE_DIM, SPACE_DIM, SizeSymm, -1, DL>>(
579 hdLogStretchAtPts, nb_gauss_pts);
580 }
581
582 inline auto getFTensorLeviKirchhoff(const int nb_gauss_pts) {
583 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
584 leviKirchhoffAtPts, nb_gauss_pts);
585 }
586
587 inline auto getFTensorLeviKirchhoff0(const int nb_gauss_pts) {
588 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
589 leviKirchhoff0AtPts, nb_gauss_pts);
590 }
591
592 inline auto getFTensorLeviKirchhoffdOmega(const int nb_gauss_pts) {
593 return getFTensor<
594 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
595 leviKirchhoffdOmegaAtPts, nb_gauss_pts);
596 }
597
598 inline auto getFTensorLeviKirchhoffdLogStretch(const int nb_gauss_pts) {
599 return getFTensor<GetFTensor2FromMatType<SPACE_DIM, SizeSymm, -1, DL>>(
600 leviKirchhoffdLogStreatchAtPts, nb_gauss_pts);
601 }
602
603 inline auto getFTensorLeviKirchhoffP(const int nb_gauss_pts) {
604 return getFTensor<GetFTensor3FromMatType<SPACE_DIM, SPACE_DIM, SPACE_DIM,
606 nb_gauss_pts);
607 }
608
609 inline auto getFTensorRotMat(const int nb_gauss_pts) {
610 return getFTensor<
611 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(rotMatAtPts,
612 nb_gauss_pts);
613 }
614
615 inline auto getFTensorSigma(const int nb_gauss_pts) {
616 return getFTensor<
617 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(SigmaAtPts,
618 nb_gauss_pts);
619 }
620
621 inline auto getFTensorVarRotAxis(const int nb_gauss_pts) {
622 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
623 varRotAxis, nb_gauss_pts);
624 }
625
626 inline auto getFTensorVarGradRotAxis(const int nb_gauss_pts) {
627 return getFTensor<
628 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
629 varGradRotAxis, nb_gauss_pts);
630 }
631
632 inline auto getFTensorVarLogStreach(const int nb_gauss_pts) {
633 return getFTensor<GetFTensor1FromMatType<SizeSymm, -1, DL>>(
634 varLogStreach, nb_gauss_pts);
635 }
636
637 inline auto getFTensorVarPiola(const int nb_gauss_pts) {
638 return getFTensor<
639 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(varPiola,
640 nb_gauss_pts);
641 }
642
643 inline auto getFTensorDivVarPiola(const int nb_gauss_pts) {
644 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
645 varDivPiola, nb_gauss_pts);
646 }
647
648 inline auto getFTensorVarWL2(const int nb_gauss_pts) {
649 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
650 varWL2, nb_gauss_pts);
651 }
652
653 inline auto getFTensorInternalStress(const int nb_gauss_pts) {
654 return getFTensor<
655 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
656 internalStressAtPts, nb_gauss_pts);
657 }
658
659 inline auto getFTensorInternalStressVec(const int nb_gauss_pts) {
660 return getFTensor<GetFTensor1FromMatType<SPACE_DIM * SPACE_DIM, -1, DL>>(
661 internalStressAtPts, nb_gauss_pts);
662 }
663
664 inline auto getFTensorSmallWH1(const int nb_gauss_pts) {
665 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(wH1AtPts,
666 nb_gauss_pts);
667 }
668
669 inline auto getFTensorSmallHybridDisp(const int nb_gauss_pts) {
670 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
671 hybridDispAtPts, nb_gauss_pts);
672 }
673
674 inline auto getFTensorGradHybridDisp(const int nb_gauss_pts) {
675 return getFTensor<
676 GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
677 gradHybridDispAtPts, nb_gauss_pts);
678 }
679
680 inline auto getFTensorFaceMaterialForce(const int nb_gauss_pts) {
681 return getFTensor<GetFTensor1FromMatType<SPACE_DIM, -1, DL>>(
682 faceMaterialForceAtPts, nb_gauss_pts);
683 }
684
685 inline auto getFTensorGradient(const int nb_gauss_pts) {
686 return getFTensor<GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>>(
687 gradientAtPts, nb_gauss_pts);
688 }
689
690 boost::shared_ptr<PhysicalEquations> physicsPtr;
691};
692
693struct OpJacobian;
694
695// Forward declarations
696struct ExternalStrain;
697using ExternalStrainVec = std::vector<ExternalStrain>;
698
700
701 PhysicalEquations() = default;
702 virtual ~PhysicalEquations() = default;
703
704 virtual UserDataOperator *
705 returnOpJacobian(const bool eval_rhs, const bool eval_lhs,
706 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
707 boost::shared_ptr<PhysicalEquations> physics_ptr);
708
709 virtual VolUserDataOperator *
710 returnOpSpatialPhysical(const std::string &field_name,
711 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
712 const double alpha_u);
713
715 const std::string &field_name,
716 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
717 boost::shared_ptr<ExternalStrainVec> external_strain_vec_ptr,
718 std::map<std::string, boost::shared_ptr<ScalingMethod>> smv);
719
721 std::string row_field, std::string col_field,
722 boost::shared_ptr<DataAtIntegrationPts> data_ptr, const double alpha);
723
725 const std::string &field_name,
726 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
727 SmartPetscObj<Vec> assemble_vec,
728 boost::shared_ptr<TopologicalData> topo_ptr, const double alpha_u,
729 boost::shared_ptr<double> J_ptr);
730
731 virtual VolUserDataOperator *
732 returnOpCalculateEnergy(boost::shared_ptr<DataAtIntegrationPts> data_ptr,
733 boost::shared_ptr<double> total_energy_ptr);
734
736 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
737 boost::shared_ptr<PhysicalEquations> physics_ptr,
738 boost::shared_ptr<MatrixDouble> strain_ptr = nullptr);
739
741 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
742 boost::shared_ptr<PhysicalEquations> physics_ptr,
743 boost::shared_ptr<MatrixDouble> strain_ptr,
744 VectorPtr external_pressure_ptr);
745
747 VectorPtr external_pressure_ptr,
748 boost::shared_ptr<ExternalStrainVec> external_strain_vec_ptr,
749 std::map<std::string, boost::shared_ptr<ScalingMethod>> smv);
750
752 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
753 boost::shared_ptr<PhysicalEquations> physics_ptr);
754};
755
756struct BcDisp {
757 BcDisp(std::string name, std::vector<double> attr, Range faces,
758 std::string load_history_file = "");
759 std::string blockName;
760 std::string loadHistoryFile;
762 VectorDouble3 vals;
763 VectorInt3 flags;
764};
765using BcDispVec = std::vector<BcDisp>;
766
767struct BcRot {
768 BcRot(std::string name, std::vector<double> attr, Range faces,
769 std::string load_history_file = "");
770 std::string blockName;
771 std::string loadHistoryFile;
773 VectorDouble vals;
774 double theta;
775};
776using BcRotVec = std::vector<BcRot>;
777
778typedef std::vector<Range> TractionFreeBc;
779
781 TractionBc(std::string name, std::vector<double> attr, Range faces,
782 std::string load_history_file = "");
783 std::string blockName;
784 std::string loadHistoryFile;
786 VectorDouble3 vals;
787 VectorInt3 flags;
788};
789using TractionBcVec = std::vector<TractionBc>;
790
792 NormalDisplacementBc(std::string name, std::vector<double> attr, Range faces,
793 std::string load_history_file = "");
794 std::string blockName;
795 std::string loadHistoryFile;
797 double val;
798};
799using NormalDisplacementBcVec = std::vector<NormalDisplacementBc>;
800
801struct SpringBc {
802 SpringBc(std::string name, std::vector<double> attr, Range faces);
803 std::string blockName;
807};
808using SpringBcVec = std::vector<SpringBc>;
809
811 AnalyticalDisplacementBc(std::string name, std::vector<double> attr,
812 Range faces, std::string load_history_file = "");
813 std::string blockName;
815 VectorInt3 flags;
816};
817using AnalyticalDisplacementBcVec = std::vector<AnalyticalDisplacementBc>;
818
820 AnalyticalTractionBc(std::string name, std::vector<double> attr, Range faces,
821 std::string load_history_file = "");
822 std::string blockName;
824 VectorInt3 flags;
825};
826using AnalyticalTractionBcVec = std::vector<AnalyticalTractionBc>;
827
829 PressureBc(std::string name, std::vector<double> attr, Range faces,
830 std::string load_history_file = "");
831 std::string blockName;
832 std::string loadHistoryFile;
834 double val;
835};
836using PressureBcVec = std::vector<PressureBc>;
837
839 ExternalStrain(std::string name, std::vector<double> attr, Range ents,
840 std::string load_history_file = "");
841 std::string blockName;
842 std::string loadHistoryFile;
844 double val;
846};
847
848/**
849 * @brief Push pointwise external-pressure evaluation before stress recovery.
850 *
851 * Materials which do not use an external pressure in their local recovery
852 * return a null pressure operator and retain their existing behaviour.
853 */
854template <typename OpVector>
856 OpVector &op_vector, boost::shared_ptr<PhysicalEquations> physics_ptr,
857 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
858 boost::shared_ptr<ExternalStrainVec> external_strain_vec_ptr,
859 const std::map<std::string, boost::shared_ptr<ScalingMethod>> &smv,
860 boost::shared_ptr<MatrixDouble> strain_ptr = nullptr) {
861 auto external_pressure_ptr = boost::make_shared<VectorDouble>();
862 if (auto op = physics_ptr->returnOpCalculateExternalPressure(
863 external_pressure_ptr, std::move(external_strain_vec_ptr), smv)) {
864 op_vector.push_back(op);
865 }
866 op_vector.push_back(physics_ptr->returnOpCalculateStretchFromStress(
867 std::move(data_ptr), physics_ptr, std::move(strain_ptr),
868 std::move(external_pressure_ptr)));
869}
870
871template <typename OP_PTR>
872std::tuple<std::string, MatrixDouble>
873getAnalyticalExpr(OP_PTR op_ptr, MatrixDouble &analytical_expr,
874 const std::string block_name);
875
876template <typename OP_PTR>
877std::tuple<std::string, VectorDouble>
878getAnalyticalExternalStrain(OP_PTR op_ptr, VectorDouble &analytical_expr,
879 const std::string block_name);
880
881template <typename OP_PTR>
882VectorDouble getAnalyticalElastic(OP_PTR op_ptr, const std::string block_name);
883
884MatrixDouble analytical_expr_function(double delta_t, double t,
885 int nb_gauss_pts,
886 MatrixDouble &m_ref_coords,
887 MatrixDouble &m_ref_normals,
888 const std::string block_name);
889
890VectorDouble analytical_externalstrain_function(double delta_t, double t,
891 int nb_gauss_pts,
892 MatrixDouble &m_ref_coords,
893 const std::string block_name);
894
895VectorDouble analytical_elastic_function(double delta_t, double t,
896 int nb_gauss_pts,
897 MatrixDouble &m_ref_coords,
898 const std::string block_name);
899
901 #include "EshelbianCore.hpp"
902 #include "EshelbianOperators.hpp"
903
904} // namespace EshelbianPlasticity
905
906#endif //__ESHELBIAN_PLASTICITY_HPP__
Analytical expression Python bridge.
constexpr int SPACE_DIM
constexpr auto A
constexpr int SPACE_DIM
VectorDouble analytical_externalstrain_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, const std::string block_name)
boost::shared_ptr< MatrixDouble > MatrixPtr
std::vector< AnalyticalTractionBc > AnalyticalTractionBcVec
std::vector< TractionBc > TractionBcVec
std::tuple< std::string, VectorDouble > getAnalyticalExternalStrain(OP_PTR op_ptr, VectorDouble &analytical_expr, const std::string block_name)
std::vector< AnalyticalDisplacementBc > AnalyticalDisplacementBcVec
std::vector< PressureBc > PressureBcVec
std::vector< SpringBc > SpringBcVec
std::tuple< std::string, MatrixDouble > getAnalyticalExpr(OP_PTR op_ptr, MatrixDouble &analytical_expr, const std::string block_name)
VectorDouble analytical_elastic_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, const std::string block_name)
std::vector< Range > TractionFreeBc
std::vector< ExternalStrain > ExternalStrainVec
ForcesAndSourcesCore::UserDataOperator UserDataOperator
VectorDouble getAnalyticalElastic(OP_PTR op_ptr, const std::string block_name)
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
std::vector< BcRot > BcRotVec
void pushOpCalculateStretchFromStress(OpVector &op_vector, boost::shared_ptr< PhysicalEquations > physics_ptr, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< ExternalStrainVec > external_strain_vec_ptr, const std::map< std::string, boost::shared_ptr< ScalingMethod > > &smv, boost::shared_ptr< MatrixDouble > strain_ptr=nullptr)
Push pointwise external-pressure evaluation before stress recovery.
std::vector< NormalDisplacementBc > NormalDisplacementBcVec
FaceElementForcesAndSourcesCore::UserDataOperator FaceUserDataOperator
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::FaceSideEle EleOnSide
MatrixDouble analytical_expr_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, MatrixDouble &m_ref_normals, const std::string block_name)
std::vector< BcDisp > BcDispVec
boost::shared_ptr< VectorDouble > VectorPtr
boost::shared_ptr< MatOpsData > createMatOpsDataPtr()
Definition MatOps.cpp:671
constexpr double t
plate stiffness
Definition plate.cpp:58
constexpr auto field_name
FTensor::Index< 'm', 3 > m
auto getFTensorLogStretchDot(const int nb_gauss_pts)
auto getFTensorVarGradRotAxis(const int nb_gauss_pts)
auto getFTensorEigenVecsC(const int nb_gauss_pts)
auto getFTensorSmallWL2Dot(const int nb_gauss_pts)
auto getFTensorRotAxisGrad(const int nb_gauss_pts)
auto getFTensorSmallHdLogStretch(const int nb_gauss_pts)
auto getFTensorAdjointPdstretch(const int nb_gauss_pts)
auto getFTensorSmallHybridDisp(const int nb_gauss_pts)
auto getFTensorVarRotAxis(const int nb_gauss_pts)
auto getFTensorLeviKirchhoffP(const int nb_gauss_pts)
auto getFTensorLeviKirchhoff(const int nb_gauss_pts)
auto getFTensorGradHybridDisp(const int nb_gauss_pts)
auto getFTensorVarLogStreach(const int nb_gauss_pts)
auto getFTensorRotAxisDot(const int nb_gauss_pts)
auto getFTensorAdjointPdUdOmega(const int nb_gauss_pts)
auto getFTensorInternalStressVec(const int nb_gauss_pts)
auto getFTensorLeviKirchhoffdOmega(const int nb_gauss_pts)
auto getFTensorInternalStress(const int nb_gauss_pts)
auto getFTensorSmallWL2DotDot(const int nb_gauss_pts)
auto getFTensorEigenValsC(const int nb_gauss_pts)
auto getFTensorLogStretchTotal(const int nb_gauss_pts)
static auto getFTensor(MatrixDouble &m, const int nb_gauss_pts)
auto getFTensorLeviKirchhoffdLogStretch(const int nb_gauss_pts)
auto getFTensorDiffStretchH1(const int nb_gauss_pts)
auto getFTensorFaceMaterialForce(const int nb_gauss_pts)
auto getFTensorLogStretch2H1(const int nb_gauss_pts)
auto getFTensorLeviKirchhoff0(const int nb_gauss_pts)
auto getFTensorSmallWGradH1(const int nb_gauss_pts)
auto getFTensorLogStretch0(const int nb_gauss_pts)
auto getFTensorSmallHdOmega(const int nb_gauss_pts)
auto getFTensorDivVarPiola(const int nb_gauss_pts)
auto getFTensorAdjointPdU(const int nb_gauss_pts)
auto getFTensorRotAxisGradDot(const int nb_gauss_pts)
auto getFTensorLogStretch(const int nb_gauss_pts)
auto getFTensorGradLogStretchDot(const int nb_gauss_pts)
boost::shared_ptr< PhysicalEquations > physicsPtr
auto getFTensorAdjointPdUdP(const int nb_gauss_pts)
static auto getFTensor(MatrixPtr m, const int nb_gauss_pts)
auto getFTensorDiffStretch(const int nb_gauss_pts)
boost::shared_ptr< MatOps::MatOpsData > matOpsData
virtual VolUserDataOperator * returnOpCalculateExternalPressure(VectorPtr external_pressure_ptr, boost::shared_ptr< ExternalStrainVec > external_strain_vec_ptr, std::map< std::string, boost::shared_ptr< ScalingMethod > > smv)
virtual VolUserDataOperator * returnOpCalculateVarStretchFromStress(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr)
virtual VolUserDataOperator * returnOpCalculateEnergy(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< double > total_energy_ptr)
virtual UserDataOperator * returnOpJacobian(const bool eval_rhs, const bool eval_lhs, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr)
virtual VolUserDataOperator * returnOpSpatialPhysical(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, const double alpha_u)
virtual VolUserDataOperator * returnOpSpatialPhysicalExternalStrain(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< ExternalStrainVec > external_strain_vec_ptr, std::map< std::string, boost::shared_ptr< ScalingMethod > > smv)
virtual VolUserDataOperator * returnOpTopoSpatialPhysical(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, SmartPetscObj< Vec > assemble_vec, boost::shared_ptr< TopologicalData > topo_ptr, const double alpha_u, boost::shared_ptr< double > J_ptr)
virtual VolUserDataOperator * returnOpCalculateStretchFromStress(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr, boost::shared_ptr< MatrixDouble > strain_ptr=nullptr)
virtual VolUserDataOperator * returnOpSpatialPhysical_du_du(std::string row_field, std::string col_field, boost::shared_ptr< DataAtIntegrationPts > data_ptr, const double alpha)
Data on single entity (This is passed as argument to DataOperator::doWork)