v0.14.0
Public Member Functions | Private Attributes | List of all members
OpH1LhsSkeleton Struct Reference

Operator the left hand side matrix. More...

Inheritance diagram for OpH1LhsSkeleton:
[legend]
Collaboration diagram for OpH1LhsSkeleton:
[legend]

Public Member Functions

 OpH1LhsSkeleton (boost::shared_ptr< FaceSideEle > side_fe_ptr, boost::shared_ptr< MatrixDouble > d_mat_ptr)
 Construct a new OpH1LhsSkeleton. More...
 
MoFEMErrorCode doWork (int side, EntityType type, EntitiesFieldData::EntData &data)
 

Private Attributes

boost::shared_ptr< FaceSideElesideFEPtr
 pointer to element to get data on edge/face sides More...
 
MatrixDouble locMat
 local operator matrix More...
 
boost::shared_ptr< MatrixDouble > dMatPtr
 

Detailed Description

Operator the left hand side matrix.

Examples
plate.cpp.

Definition at line 121 of file plate.cpp.

Constructor & Destructor Documentation

◆ OpH1LhsSkeleton()

OpH1LhsSkeleton::OpH1LhsSkeleton ( boost::shared_ptr< FaceSideEle side_fe_ptr,
boost::shared_ptr< MatrixDouble >  mat_d_ptr 
)

Construct a new OpH1LhsSkeleton.

Parameters
side_fe_ptrpointer to FE to evaluate side elements
Examples
plate.cpp.

Definition at line 506 of file plate.cpp.

509  dMatPtr(mat_d_ptr) {}

Member Function Documentation

◆ doWork()

MoFEMErrorCode OpH1LhsSkeleton::doWork ( int  side,
EntityType  type,
EntitiesFieldData::EntData data 
)
Examples
plate.cpp.

Definition at line 511 of file plate.cpp.

512  {
514 
515  // Collect data from side domian elements
516  CHKERR loopSideFaces("dFE", *sideFEPtr);
517  const auto in_the_loop =
518  sideFEPtr->nInTheLoop; // return number of elements on the side
519 
520  // calculate penalty
521  const double s = getMeasure() / (areaMap[0] + areaMap[1]);
522  const double p = penalty * s;
523 
524  // get normal of the face or edge
525  auto t_normal = getFTensor1Normal();
526  t_normal.normalize();
527 
528  // Elastic stiffness tensor (4th rank tensor with minor and major
529  // symmetry)
530  auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*dMatPtr);
531 
532  // get number of integration points on face
533  const size_t nb_integration_pts = getGaussPts().size2();
534 
535  // beta paramter is zero, when penalty method is used, also, takes value 1,
536  // when boundary edge/face is evaluated, and 2 when is skeleton edge/face.
537  const double beta = static_cast<double>(nitsche) / (in_the_loop + 1);
538 
539  auto integrate = [&](auto sense_row, auto &row_ind, auto &row_diff,
540  auto &row_diff2, auto sense_col, auto &col_ind,
541  auto &col_diff, auto &col_diff2) {
543 
544  // number of dofs, for homogenous approximation this value is
545  // constant.
546  const auto nb_rows = row_ind.size();
547  const auto nb_cols = col_ind.size();
548 
549  const auto nb_row_base_functions = row_diff.size2() / SPACE_DIM;
550 
551  if (nb_cols) {
552 
553  // resize local element matrix
554  locMat.resize(nb_rows, nb_cols, false);
555  locMat.clear();
556 
557  // get base functions, and integration weights
558  auto t_diff_row_base = get_diff_ntensor(row_diff);
559  auto t_diff2_row_base = get_diff2_ntensor(row_diff2);
560 
561  auto t_w = getFTensor0IntegrationWeight();
562 
563  // iterate integration points on face/edge
564  for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
565 
566  // t_w is integration weight, and measure is element area, or
567  // volume, depending if problem is in 2d/3d.
568  const double alpha = getMeasure() * t_w;
569  auto t_mat = locMat.data().begin();
570 
571  // iterate rows
572  size_t rr = 0;
573  for (; rr != nb_rows; ++rr) {
574 
576  t_mv(i, j) = t_D(i, j, k, l) * t_diff2_row_base(k, l);
577 
578  // calculate tetting function
580  t_vn_plus(i, j) = beta * (phi * t_mv(i, j) / p);
582  t_vn(i, j) = (t_diff_row_base(j) * (t_normal(i) * sense_row)) -
583  t_vn_plus(i, j);
584 
585  // get base functions on columns
586  auto t_diff_col_base = get_diff_ntensor(col_diff, gg, 0);
587  auto t_diff2_col_base = get_diff2_ntensor(col_diff2, gg, 0);
588 
589  // iterate columns
590  for (size_t cc = 0; cc != nb_cols; ++cc) {
591 
593  t_mu(i, j) = t_D(i, j, k, l) * t_diff2_col_base(k, l);
594 
595  // // calculate variance of tested function
597  t_un(i, j) = -p * ((t_diff_col_base(j) * (t_normal(i) * sense_col) -
598  beta * t_mu(i, j) / p));
599 
600  // assemble matrix
601  *t_mat -= alpha * (t_vn(i, j) * t_un(i, j));
602  *t_mat -= alpha * (t_vn_plus(i, j) * (beta * t_mu(i, j)));
603 
604  // move to next column base and element of matrix
605  ++t_diff_col_base;
606  ++t_diff2_col_base;
607  ++t_mat;
608  }
609 
610  // move to next row base
611  ++t_diff_row_base;
612  ++t_diff2_row_base;
613  }
614 
615  // this is obsolete for this particular example, we keep it for
616  // generality. in case of multi-physcis problems diffrent fields
617  // can chare hierarchical base but use diffrent approx. order,
618  // so is possible to have more base functions than DOFs on
619  // element.
620  for (; rr < nb_row_base_functions; ++rr) {
621  ++t_diff_row_base;
622  ++t_diff2_row_base;
623  }
624 
625  ++t_w;
626  }
627 
628  // assemble system
629  CHKERR ::MatSetValues(getKSPB(), nb_rows, &*row_ind.begin(),
630  col_ind.size(), &*col_ind.begin(),
631  &*locMat.data().begin(), ADD_VALUES);
632  }
633 
635  };
636 
637  // iterate the sides rows
638  for (auto s0 : {LEFT_SIDE, RIGHT_SIDE}) {
639 
640  const auto sense_row = senseMap[s0];
641 
642  for (auto x0 = 0; x0 != indicesSideMap[s0].size(); ++x0) {
643 
644  for (auto s1 : {LEFT_SIDE, RIGHT_SIDE}) {
645  const auto sense_col = senseMap[s1];
646 
647  for (auto x1 = 0; x1 != indicesSideMap[s1].size(); ++x1) {
648 
649  CHKERR integrate(sense_row, indicesSideMap[s0][x0],
650  diffBaseSideMap[s0][x0], diff2BaseSideMap[s0][x0],
651 
652  sense_col, indicesSideMap[s1][x1],
653  diffBaseSideMap[s1][x1], diff2BaseSideMap[s1][x1]
654 
655  );
656  }
657  }
658  }
659  }
660 
662 }

Member Data Documentation

◆ dMatPtr

boost::shared_ptr<MatrixDouble> OpH1LhsSkeleton::dMatPtr
private
Examples
plate.cpp.

Definition at line 138 of file plate.cpp.

◆ locMat

MatrixDouble OpH1LhsSkeleton::locMat
private

local operator matrix

Examples
plate.cpp.

Definition at line 137 of file plate.cpp.

◆ sideFEPtr

boost::shared_ptr<FaceSideEle> OpH1LhsSkeleton::sideFEPtr
private

pointer to element to get data on edge/face sides

Examples
plate.cpp.

Definition at line 136 of file plate.cpp.


The documentation for this struct was generated from the following file:
NOSPACE
@ NOSPACE
Definition: definitions.h:83
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
senseMap
std::array< int, 2 > senseMap
Definition: plate.cpp:103
MoFEM::MatSetValues
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
Definition: EntitiesFieldData.hpp:1631
OpH1LhsSkeleton::sideFEPtr
boost::shared_ptr< FaceSideEle > sideFEPtr
pointer to element to get data on edge/face sides
Definition: plate.cpp:136
k
FTensor::Index< 'k', SPACE_DIM > k
Definition: plate.cpp:63
MoFEM::ForcesAndSourcesCore::UserDataOperator::OPSPACE
@ OPSPACE
operator do Work is execute on space data
Definition: ForcesAndSourcesCore.hpp:570
SPACE_DIM
constexpr int SPACE_DIM
dimension of space
Definition: plate.cpp:18
l
FTensor::Index< 'l', SPACE_DIM > l
Definition: plate.cpp:64
nitsche
static double nitsche
Definition: plate.cpp:69
FTensor::Tensor2_symmetric
Definition: Tensor2_symmetric_value.hpp:13
diff2BaseSideMap
std::array< std::vector< MatrixDouble >, 2 > diff2BaseSideMap
Definition: plate.cpp:101
RIGHT_SIDE
@ RIGHT_SIDE
Definition: plate.cpp:93
get_diff_ntensor
auto get_diff_ntensor(T &base_mat)
Definition: plate.cpp:479
FTensor::Tensor2
Definition: Tensor2_value.hpp:16
indicesSideMap
std::array< std::vector< VectorInt >, 2 > indicesSideMap
indices on rows for left hand-side
Definition: plate.cpp:97
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:535
OpH1LhsSkeleton::locMat
MatrixDouble locMat
local operator matrix
Definition: plate.cpp:137
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: plate.cpp:61
areaMap
std::array< double, 2 > areaMap
Definition: plate.cpp:102
OpH1LhsSkeleton::dMatPtr
boost::shared_ptr< MatrixDouble > dMatPtr
Definition: plate.cpp:138
penalty
static double penalty
Definition: plate.cpp:66
diffBaseSideMap
std::array< std::vector< MatrixDouble >, 2 > diffBaseSideMap
Definition: plate.cpp:99
get_diff2_ntensor
auto get_diff2_ntensor(T &base_mat)
Definition: plate.cpp:490
LEFT_SIDE
@ LEFT_SIDE
Definition: plate.cpp:93
j
FTensor::Index< 'j', SPACE_DIM > j
Definition: plate.cpp:62
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
BoundaryEleOp
BoundaryEle::UserDataOperator BoundaryEleOp
Definition: plate.cpp:33
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
phi
static double phi
Definition: plate.cpp:67