v0.14.0
Loading...
Searching...
No Matches
plate.cpp
Go to the documentation of this file.
1/**
2 * \file plate.cpp
3 * \example plate.cpp
4 *
5 * Implementation Kirchhoff-Love plate using Discointinous Galerkin (DG-Nitsche
6 * method)
7 */
8
9#include <MoFEM.hpp>
10
11using namespace MoFEM;
12
13static char help[] = "...\n\n";
14
15
16constexpr int BASE_DIM = 1; ///< dimension of base
17constexpr int SPACE_DIM = 2; ///< dimension of space
18constexpr int FIELD_DIM = 1; ///< dimension of approx. field
19
20template <int DIM> struct ElementsAndOps {};
21
22template <> struct ElementsAndOps<2> {
27};
28
30using DomainEleOp = DomainEle::UserDataOperator;
32using BoundaryEleOp = BoundaryEle::UserDataOperator;
33
35
38
39using DomainEleOp =
40 DomainEle::UserDataOperator; ///< Finire element operator type
41using EntData = EntitiesFieldData::EntData; ///< Data on entities
42
45
48 GAUSS>::OpGradGradSymTensorGradGrad<1, 1, SPACE_DIM, 0>;
51
52// Kronecker delta
54
55// material parameters
56constexpr double lambda = 1;
57constexpr double mu = 1; ///< lame parameter
58constexpr double t = 1; ///< plate stiffness
59
64
65static double penalty = 1e6;
66static double phi =
67 -1; // 1 - symmetric Nitsche, 0 - nonsymmetric, -1 antisymmetrica
68static double nitsche = 1;
69static int order = 4; // approximation order
70
71auto source = [](const double x, const double y, const double) {
72 return cos(2 * x * M_PI) * sin(2 * y * M_PI);
73};
74
75/**
76 * @brief get fourth-order constitutive tensor
77 *
78 */
79auto plate_stiffness = []() {
80 constexpr auto a = (SPACE_DIM * (SPACE_DIM + 1)) / 2;
81 auto mat_D_ptr = boost::make_shared<MatrixDouble>(a * a, 1);
82 auto t_D = getFTensor4DdgFromMat<2, 2, 0>(*(mat_D_ptr));
83 constexpr double t3 = t * t * t;
84 constexpr double A = mu * t3 / 12;
85 constexpr double B = lambda * t3 / 12;
86 t_D(i, j, k, l) =
87 2 * B * ((t_kd(i, k) ^ t_kd(j, l)) / 4.) + A * t_kd(i, j) * t_kd(k, l);
88 // t_D(i, j, k, l) = (t_kd(i, k) ^ t_kd(j, l)) / 4.;
89 return mat_D_ptr;
90};
91
93
94// data for skeleton computation
95std::array<std::vector<VectorInt>, 2>
96 indicesSideMap; ///< indices on rows for left hand-side
97std::array<std::vector<MatrixDouble>, 2>
98 diffBaseSideMap; // first derivative of base functions
99std::array<std::vector<MatrixDouble>, 2>
100 diff2BaseSideMap; // second derivative of base functions
101std::array<double, 2> areaMap; // area/volume of elements on the side
102std::array<int, 2> senseMap; // orientaton of local element edge/face in respect
103 // to global orientation of edge/face
104
105/**
106 * @brief Operator tp collect data from elements on the side of Edge/Face
107 *
108 */
110
111 OpCalculateSideData(std::string field_name, std::string col_field_name);
112
113 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
114};
115
116/**
117 * @brief Operator the left hand side matrix
118 *
119 */
121public:
122 /**
123 * @brief Construct a new OpH1LhsSkeleton
124 *
125 * @param side_fe_ptr pointer to FE to evaluate side elements
126 */
127 OpH1LhsSkeleton(boost::shared_ptr<FaceSideEle> side_fe_ptr,
128 boost::shared_ptr<MatrixDouble> d_mat_ptr);
129
130 MoFEMErrorCode doWork(int side, EntityType type,
132
133private:
134 boost::shared_ptr<FaceSideEle>
135 sideFEPtr; ///< pointer to element to get data on edge/face sides
136 MatrixDouble locMat; ///< local operator matrix
137 boost::shared_ptr<MatrixDouble> dMatPtr;
138};
139
156
157//! [Read mesh]
160
162 CHKERR simple->getOptions();
163 CHKERR simple->loadFile();
164
166}
167//! [Read mesh]
168
169//! [Set up problem]
172
174
175 CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-order", &order, PETSC_NULL);
176 CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-penalty", &penalty,
177 PETSC_NULL);
178 CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-phi", &phi, PETSC_NULL);
179 CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-nitsche", &nitsche,
180 PETSC_NULL);
181
182 MOFEM_LOG("WORLD", Sev::inform) << "Set order: " << order;
183 MOFEM_LOG("WORLD", Sev::inform) << "Set penalty: " << penalty;
184 MOFEM_LOG("WORLD", Sev::inform) << "Set phi: " << phi;
185 MOFEM_LOG("WORLD", Sev::inform) << "Set nitche: " << nitsche;
186
187 CHKERR simple->addDomainField("U", H1, AINSWORTH_LEGENDRE_BASE, FIELD_DIM);
188 CHKERR simple->addSkeletonField("U", H1, AINSWORTH_LEGENDRE_BASE, FIELD_DIM);
189 CHKERR simple->addBoundaryField("U", H1, AINSWORTH_LEGENDRE_BASE, FIELD_DIM);
190
191 CHKERR simple->setFieldOrder("U", order);
192 CHKERR simple->setUp();
193
195}
196//! [Set up problem]
197
198//! [Boundary condition]
201
202 // get edges and vertices on body skin
203 auto get_skin = [&]() {
204 Range body_ents;
206 mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, body_ents));
207 Skinner skin(&mField.get_moab());
208 Range skin_ents;
209 MOAB_THROW(skin.find_skin(0, body_ents, false, skin_ents));
210 Range verts;
211 MOAB_THROW(mField.get_moab().get_connectivity(skin_ents, verts, true));
212 skin_ents.merge(verts);
213 return skin_ents;
214 };
215
216 // remove dofs on skin edges from priblem
217 auto remove_dofs_from_problem = [&](Range &&skin) {
219 auto problem_mng = mField.getInterface<ProblemsManager>();
221 CHKERR problem_mng->removeDofsOnEntities(simple->getProblemName(), "U",
222 skin, 0, 1);
224 };
225
226 // it make plate simply supported
227 CHKERR remove_dofs_from_problem(get_skin());
228
230}
231//! [Boundary condition]
232
233//! [Push operators to pipeline]
236
237 auto pipeline_mng = mField.getInterface<PipelineManager>();
238
239 auto rule_lhs = [](int, int, int p) -> int { return 2 * p; };
240 auto rule_rhs = [](int, int, int p) -> int { return 2 * p; };
241 auto rule_2 = [this](int, int, int) { return 2 * order; };
242
243 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule_lhs);
244 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule_rhs);
245
246 CHKERR pipeline_mng->setSkeletonLhsIntegrationRule(rule_2);
247 CHKERR pipeline_mng->setSkeletonRhsIntegrationRule(rule_2);
248 CHKERR pipeline_mng->setBoundaryLhsIntegrationRule(rule_2);
249 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(rule_2);
250
251 auto det_ptr = boost::make_shared<VectorDouble>();
252 auto jac_ptr = boost::make_shared<MatrixDouble>();
253 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
254 auto base_mass_ptr = boost::make_shared<MatrixDouble>();
255 auto data_l2_ptr = boost::make_shared<EntitiesFieldData>(MBENTITYSET);
256
257 auto mat_D_ptr = plate_stiffness();
258
259 auto push_ho_direcatives = [&](auto &pipeline) {
260 pipeline.push_back(new OpBaseDerivativesMass<BASE_DIM>(
261 base_mass_ptr, data_l2_ptr, AINSWORTH_LEGENDRE_BASE, L2));
262 pipeline.push_back(new OpBaseDerivativesNext<BASE_DIM>(
263 BaseDerivatives::SecondDerivative, base_mass_ptr, data_l2_ptr,
265 };
266
267 /**
268 * @brief calculate jacobian
269 *
270 */
271 auto push_jacobian = [&](auto &pipeline) {
272 pipeline.push_back(new OpSetHOWeightsOnFace());
273 pipeline.push_back(new OpCalculateHOJac<SPACE_DIM>(jac_ptr));
274 pipeline.push_back(
275 new OpInvertMatrix<SPACE_DIM>(jac_ptr, det_ptr, inv_jac_ptr));
276 // push first base derivatives tp physical element shape
277 pipeline.push_back(new OpSetInvJacH1ForFace<1>(inv_jac_ptr));
278 // push second base derivatives tp physical element shape
279 pipeline.push_back(new OpSetInvJacH1ForFace<2>(inv_jac_ptr));
280 };
281
282 push_ho_direcatives(pipeline_mng->getOpDomainLhsPipeline());
283 push_jacobian(pipeline_mng->getOpDomainLhsPipeline());
284
285 pipeline_mng->getOpDomainLhsPipeline().push_back(
286 new OpDomainPlateStiffness("U", "U", mat_D_ptr));
287 // pipeline_mng->getOpDomainLhsPipeline().push_back(new OpDomainGradGrad(
288 // "U", "U", [](const double, const double, const double) { return 1; }));
289
290 pipeline_mng->getOpDomainRhsPipeline().push_back(
291 new OpDomainPlateLoad("U", source));
292
293 // Push operators to the Pipeline for Skeleton
294 auto side_fe_ptr = boost::make_shared<FaceSideEle>(mField);
295 push_ho_direcatives(side_fe_ptr->getOpPtrVector());
296 push_jacobian(side_fe_ptr->getOpPtrVector());
297 side_fe_ptr->getOpPtrVector().push_back(new OpCalculateSideData("U", "U"));
298
299 // Push operators to the Pipeline for Skeleton
300 pipeline_mng->getOpSkeletonLhsPipeline().push_back(
301 new OpH1LhsSkeleton(side_fe_ptr, mat_D_ptr));
302
304}
305//! [Push operators to pipeline]
306
307//! [Solve system]
310
311 auto pipeline_mng = mField.getInterface<PipelineManager>();
313
314 auto ksp_solver = pipeline_mng->createKSP();
315 CHKERR KSPSetFromOptions(ksp_solver);
316 CHKERR KSPSetUp(ksp_solver);
317
318 // Create RHS and solution vectors
319 auto dm = simple->getDM();
320 auto F = createDMVector(dm);
321 auto D = vectorDuplicate(F);
322
323 CHKERR KSPSolve(ksp_solver, F, D);
324
325 // Scatter result data on the mesh
326 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
327 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
328 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
329
331}
332//! [Solve system]
333
334//! [Output results]
337
338 auto pipeline_mng = mField.getInterface<PipelineManager>();
339 pipeline_mng->getDomainLhsFE().reset();
340 pipeline_mng->getSkeletonRhsFE().reset();
341 pipeline_mng->getSkeletonLhsFE().reset();
342 pipeline_mng->getBoundaryRhsFE().reset();
343 pipeline_mng->getBoundaryLhsFE().reset();
344
345 auto post_proc_fe = boost::make_shared<PostProcEle>(mField);
346
347 auto u_ptr = boost::make_shared<VectorDouble>();
348 post_proc_fe->getOpPtrVector().push_back(
349 new OpCalculateScalarFieldValues("U", u_ptr));
350
352
353 post_proc_fe->getOpPtrVector().push_back(
354
355 new OpPPMap(post_proc_fe->getPostProcMesh(),
356 post_proc_fe->getMapGaussPts(),
357
358 {{"U", u_ptr}},
359
360 {}, {}, {}
361
362 )
363
364 );
365
366 pipeline_mng->getDomainRhsFE() = post_proc_fe;
367 CHKERR pipeline_mng->loopFiniteElements();
368 CHKERR post_proc_fe->writeFile("out_result.h5m");
369
371}
372//! [Output results]
373
374//! [Run program]
388//! [Run program]
389
390int main(int argc, char *argv[]) {
391
392 // Initialisation of MoFEM/PETSc and MOAB data structures
393 const char param_file[] = "param_file.petsc";
394 MoFEM::Core::Initialize(&argc, &argv, param_file, help);
395
396 // Add logging channel for example
397 auto core_log = logging::core::get();
398 core_log->add_sink(LogManager::createSink(LogManager::getStrmWorld(), "PL"));
399 LogManager::setLog("PL");
400 MOFEM_LOG_TAG("PL", "plate");
401
402 try {
403
404 //! [Register MoFEM discrete manager in PETSc]
405 DMType dm_name = "DMMOFEM";
406 CHKERR DMRegister_MoFEM(dm_name);
407 //! [Register MoFEM discrete manager in PETSc
408
409 //! [Create MoAB]
410 moab::Core mb_instance; ///< mesh database
411 moab::Interface &moab = mb_instance; ///< mesh database interface
412 //! [Create MoAB]
413
414 //! [Create MoFEM]
415 MoFEM::Core core(moab); ///< finite element database
416 MoFEM::Interface &m_field = core; ///< finite element database insterface
417 //! [Create MoFEM]
418
419 //! [Plate]
420 Plate ex(m_field);
421 CHKERR ex.runProblem();
422 //! [Plate]
423 }
425
427}
428
430 std::string col_field_name)
431 : FaceSideOp(row_field_name, col_field_name, FaceSideOp::OPROW) {}
432
434 EntData &data) {
436
437 const auto nb_in_loop = getFEMethod()->nInTheLoop;
438
439 auto clear = [](auto nb) {
440 indicesSideMap[nb].clear();
441 diffBaseSideMap[nb].clear();
442 diff2BaseSideMap[nb].clear();
443 };
444
445 if (type == MBVERTEX) {
446 areaMap[nb_in_loop] = getMeasure();
447 senseMap[nb_in_loop] = getEdgeSense();
448 if (!nb_in_loop) {
449 clear(0);
450 clear(1);
451 areaMap[1] = 0;
452 senseMap[1] = 0;
453 }
454 }
455
456 const auto nb_dofs = data.getIndices().size();
457 if (nb_dofs) {
458 indicesSideMap[nb_in_loop].push_back(data.getIndices());
459 diffBaseSideMap[nb_in_loop].push_back(
460 data.getN(BaseDerivatives::FirstDerivative));
461 diff2BaseSideMap[nb_in_loop].push_back(
462 data.getN(BaseDerivatives::SecondDerivative));
463 }
464
466}
467
468template <typename T> inline auto get_ntensor(T &base_mat) {
470 &*base_mat.data().begin());
471};
472
473template <typename T> inline auto get_ntensor(T &base_mat, int gg, int bb) {
474 double *ptr = &base_mat(gg, bb);
476};
477
478template <typename T> inline auto get_diff_ntensor(T &base_mat) {
479 double *ptr = &*base_mat.data().begin();
480 return getFTensor1FromPtr<2>(ptr);
481};
482
483template <typename T>
484inline auto get_diff_ntensor(T &base_mat, int gg, int bb) {
485 double *ptr = &base_mat(gg, 2 * bb);
486 return getFTensor1FromPtr<2>(ptr);
487};
488
489template <typename T> inline auto get_diff2_ntensor(T &base_mat) {
490 double *ptr = &*base_mat.data().begin();
492};
493
494template <typename T>
495inline auto get_diff2_ntensor(T &base_mat, int gg, int bb) {
496 double *ptr = &base_mat(gg, 4 * bb);
498};
499
500/**
501 * @brief Construct a new OpH1LhsSkeleton
502 *
503 * @param side_fe_ptr pointer to FE to evaluate side elements
504 */
505OpH1LhsSkeleton::OpH1LhsSkeleton(boost::shared_ptr<FaceSideEle> side_fe_ptr,
506 boost::shared_ptr<MatrixDouble> mat_d_ptr)
507 : BoundaryEleOp(NOSPACE, BoundaryEleOp::OPSPACE), sideFEPtr(side_fe_ptr),
508 dMatPtr(mat_d_ptr) {}
509
510MoFEMErrorCode OpH1LhsSkeleton::doWork(int side, EntityType type,
513
514 // Collect data from side domian elements
515 CHKERR loopSideFaces("dFE", *sideFEPtr);
516 const auto in_the_loop =
517 sideFEPtr->nInTheLoop; // return number of elements on the side
518
519 // calculate penalty
520 const double s = getMeasure() / (areaMap[0] + areaMap[1]);
521 const double p = penalty * s;
522
523 // get normal of the face or edge
524 auto t_normal = getFTensor1Normal();
525 t_normal.normalize();
526
527 // Elastic stiffness tensor (4th rank tensor with minor and major
528 // symmetry)
530
531 // get number of integration points on face
532 const size_t nb_integration_pts = getGaussPts().size2();
533
534 // beta paramter is zero, when penalty method is used, also, takes value 1,
535 // when boundary edge/face is evaluated, and 2 when is skeleton edge/face.
536 const double beta = static_cast<double>(nitsche) / (in_the_loop + 1);
537
538 auto integrate = [&](auto sense_row, auto &row_ind, auto &row_diff,
539 auto &row_diff2, auto sense_col, auto &col_ind,
540 auto &col_diff, auto &col_diff2) {
542
543 // number of dofs, for homogenous approximation this value is
544 // constant.
545 const auto nb_rows = row_ind.size();
546 const auto nb_cols = col_ind.size();
547
548 const auto nb_row_base_functions = row_diff.size2() / SPACE_DIM;
549
550 if (nb_cols) {
551
552 // resize local element matrix
553 locMat.resize(nb_rows, nb_cols, false);
554 locMat.clear();
555
556 // get base functions, and integration weights
557 auto t_diff_row_base = get_diff_ntensor(row_diff);
558 auto t_diff2_row_base = get_diff2_ntensor(row_diff2);
559
560 auto t_w = getFTensor0IntegrationWeight();
561
562 // iterate integration points on face/edge
563 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
564
565 // t_w is integration weight, and measure is element area, or
566 // volume, depending if problem is in 2d/3d.
567 const double alpha = getMeasure() * t_w;
568 auto t_mat = locMat.data().begin();
569
570 // iterate rows
571 size_t rr = 0;
572 for (; rr != nb_rows; ++rr) {
573
575 t_mv(i, j) = t_D(i, j, k, l) * t_diff2_row_base(k, l);
576
577 // calculate tetting function
579 t_vn_plus(i, j) = beta * (phi * t_mv(i, j) / p);
581 t_vn(i, j) = (t_diff_row_base(j) * (t_normal(i) * sense_row)) -
582 t_vn_plus(i, j);
583
584 // get base functions on columns
585 auto t_diff_col_base = get_diff_ntensor(col_diff, gg, 0);
586 auto t_diff2_col_base = get_diff2_ntensor(col_diff2, gg, 0);
587
588 // iterate columns
589 for (size_t cc = 0; cc != nb_cols; ++cc) {
590
592 t_mu(i, j) = t_D(i, j, k, l) * t_diff2_col_base(k, l);
593
594 // // calculate variance of tested function
596 t_un(i, j) = -p * ((t_diff_col_base(j) * (t_normal(i) * sense_col) -
597 beta * t_mu(i, j) / p));
598
599 // assemble matrix
600 *t_mat -= alpha * (t_vn(i, j) * t_un(i, j));
601 *t_mat -= alpha * (t_vn_plus(i, j) * (beta * t_mu(i, j)));
602
603 // move to next column base and element of matrix
604 ++t_diff_col_base;
605 ++t_diff2_col_base;
606 ++t_mat;
607 }
608
609 // move to next row base
610 ++t_diff_row_base;
611 ++t_diff2_row_base;
612 }
613
614 // this is obsolete for this particular example, we keep it for
615 // generality. in case of multi-physcis problems diffrent fields
616 // can chare hierarchical base but use diffrent approx. order,
617 // so is possible to have more base functions than DOFs on
618 // element.
619 for (; rr < nb_row_base_functions; ++rr) {
620 ++t_diff_row_base;
621 ++t_diff2_row_base;
622 }
623
624 ++t_w;
625 }
626
627 // assemble system
628 CHKERR ::MatSetValues(getKSPB(), nb_rows, &*row_ind.begin(),
629 col_ind.size(), &*col_ind.begin(),
630 &*locMat.data().begin(), ADD_VALUES);
631 }
632
634 };
635
636 // iterate the sides rows
637 for (auto s0 : {LEFT_SIDE, RIGHT_SIDE}) {
638
639 const auto sense_row = senseMap[s0];
640
641 for (auto x0 = 0; x0 != indicesSideMap[s0].size(); ++x0) {
642
643 for (auto s1 : {LEFT_SIDE, RIGHT_SIDE}) {
644 const auto sense_col = senseMap[s1];
645
646 for (auto x1 = 0; x1 != indicesSideMap[s1].size(); ++x1) {
647
648 CHKERR integrate(sense_row, indicesSideMap[s0][x0],
649 diffBaseSideMap[s0][x0], diff2BaseSideMap[s0][x0],
650
651 sense_col, indicesSideMap[s1][x1],
652 diffBaseSideMap[s1][x1], diff2BaseSideMap[s1][x1]
653
654 );
655 }
656 }
657 }
658 }
659
661}
static auto get_skin(MoFEM::Interface &m_field, Range body_ents)
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
int main()
constexpr double a
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
[Define dimension]
Kronecker Delta class symmetric.
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
Definition definitions.h:60
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ L2
field with C-1 continuity
Definition definitions.h:88
@ H1
continuous field
Definition definitions.h:85
@ NOSPACE
Definition definitions.h:83
#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()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ F
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
Definition DMMoFEM.cpp:523
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition DMMoFEM.cpp:43
auto createDMVector(DM dm)
Get smart vector from DM.
Definition DMMoFEM.hpp:1099
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradGrad< 1, 1, SPACE_DIM > OpDomainGradGrad
Definition helmholtz.cpp:24
double D
PipelineManager::ElementsAndOpsByDim< FE_DIM >::FaceSideEle FaceSideEle
Definition level_set.cpp:41
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
static FTensor::Ddg< FTensor::PackPtr< T *, 1 >, Tensor_Dim01, Tensor_Dim23 > getFTensor4DdgFromMat(ublas::matrix< T, L, A > &data)
Get symmetric tensor rank 4 on first two and last indices from form data matrix.
FTensor::Tensor2_symmetric< FTensor::PackPtr< double *, 4 >, 2 > getFTensor2SymmetricLowerFromPtr< 2 >(double *ptr)
FTensor::Tensor1< FTensor::PackPtr< double *, S >, DIM > getFTensor1FromPtr(double *ptr)
Make Tensor1 from pointer.
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
constexpr double mu
lame parameter
Definition plate.cpp:57
auto get_diff_ntensor(T &base_mat)
Definition plate.cpp:478
ElementSide
Definition plate.cpp:92
@ LEFT_SIDE
Definition plate.cpp:92
@ RIGHT_SIDE
Definition plate.cpp:92
std::array< std::vector< MatrixDouble >, 2 > diff2BaseSideMap
Definition plate.cpp:100
FTensor::Index< 'j', SPACE_DIM > j
Definition plate.cpp:61
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, FIELD_DIM > OpDomainPlateLoad
Definition plate.cpp:49
static char help[]
Definition plate.cpp:13
std::array< std::vector< MatrixDouble >, 2 > diffBaseSideMap
Definition plate.cpp:98
FTensor::Index< 'k', SPACE_DIM > k
Definition plate.cpp:62
constexpr double lambda
Definition plate.cpp:56
FTensor::Index< 'i', SPACE_DIM > i
Definition plate.cpp:60
auto get_ntensor(T &base_mat)
Definition plate.cpp:468
constexpr auto t_kd
Definition plate.cpp:53
constexpr int SPACE_DIM
dimension of space
Definition plate.cpp:17
FTensor::Index< 'l', SPACE_DIM > l
Definition plate.cpp:63
auto source
Definition plate.cpp:71
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradGradSymTensorGradGrad< 1, 1, SPACE_DIM, 0 > OpDomainPlateStiffness
Definition plate.cpp:46
static double nitsche
Definition plate.cpp:68
constexpr int FIELD_DIM
dimension of approx. field
Definition plate.cpp:18
auto plate_stiffness
get fourth-order constitutive tensor
Definition plate.cpp:79
std::array< double, 2 > areaMap
Definition plate.cpp:101
std::array< std::vector< VectorInt >, 2 > indicesSideMap
indices on rows for left hand-side
Definition plate.cpp:96
std::array< int, 2 > senseMap
Definition plate.cpp:102
constexpr int BASE_DIM
dimension of base
Definition plate.cpp:16
constexpr double t
plate stiffness
Definition plate.cpp:58
static double penalty
Definition plate.cpp:65
static int order
Definition plate.cpp:69
static double phi
Definition plate.cpp:66
auto get_diff2_ntensor(T &base_mat)
Definition plate.cpp:489
constexpr auto field_name
virtual moab::Interface & get_moab()=0
Core (interface) class.
Definition Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:112
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorInt & getIndices() const
Get global indices of dofs on entity.
Base face element used to integrate on skeleton.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
Get value at integration points for scalar field.
Post post-proc data at points from hash maps.
Modify integration weights on face to take in account higher-order geometry.
PipelineManager interface.
boost::shared_ptr< FEMethod > & getDomainLhsFE()
MoFEM::FaceElementForcesAndSourcesCore FaceEle
MoFEM::EdgeElementForcesAndSourcesCore EdgeEle
MoFEMErrorCode setDomainLhsIntegrationRule(RuleHookFun rule)
Problem manager is used to build and partition problems.
Simple interface for fast problem set-up.
Definition Simple.hpp:27
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Operator tp collect data from elements on the side of Edge/Face.
Definition plate.cpp:109
OpCalculateSideData(std::string field_name, std::string col_field_name)
Definition plate.cpp:429
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Definition plate.cpp:433
Operator the left hand side matrix.
Definition plate.cpp:120
boost::shared_ptr< MatrixDouble > dMatPtr
Definition plate.cpp:137
boost::shared_ptr< FaceSideEle > sideFEPtr
pointer to element to get data on edge/face sides
Definition plate.cpp:135
MatrixDouble locMat
local operator matrix
Definition plate.cpp:136
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Definition plate.cpp:510
OpH1LhsSkeleton(boost::shared_ptr< FaceSideEle > side_fe_ptr, boost::shared_ptr< MatrixDouble > d_mat_ptr)
Construct a new OpH1LhsSkeleton.
Definition plate.cpp:505
MoFEMErrorCode setupProblem()
[Read mesh]
Definition plate.cpp:170
MoFEM::Interface & mField
Definition plate.cpp:154
MoFEMErrorCode runProblem()
[Output results]
Definition plate.cpp:375
MoFEMErrorCode boundaryCondition()
[Set up problem]
Definition plate.cpp:199
MoFEMErrorCode outputResults()
[Solve system]
Definition plate.cpp:335
MoFEMErrorCode solveSystem()
[Push operators to pipeline]
Definition plate.cpp:308
MoFEMErrorCode assembleSystem()
[Boundary condition]
Definition plate.cpp:234
Plate(MoFEM::Interface &m_field)
Definition plate.cpp:142
MoFEMErrorCode readMesh()
[Read mesh]
Definition plate.cpp:158