v0.14.0
Public Member Functions | Private Attributes | List of all members
LevelSet::OpLhsSkeleton Struct Reference
Inheritance diagram for LevelSet::OpLhsSkeleton:
[legend]
Collaboration diagram for LevelSet::OpLhsSkeleton:
[legend]

Public Member Functions

 OpLhsSkeleton (boost::shared_ptr< SideData > side_data_ptr, boost::shared_ptr< FaceSideEle > side_fe_ptr)
 
MoFEMErrorCode doWork (int side, EntityType type, EntitiesFieldData::EntData &data)
 

Private Attributes

boost::shared_ptr< SideDatasideDataPtr
 
boost::shared_ptr< FaceSideElesideFEPtr
 pointer to element to get data on edge/face sides More...
 
MatrixDouble matSkeleton
 

Detailed Description

Examples
level_set.cpp.

Definition at line 450 of file level_set.cpp.

Constructor & Destructor Documentation

◆ OpLhsSkeleton()

LevelSet::OpLhsSkeleton::OpLhsSkeleton ( boost::shared_ptr< SideData side_data_ptr,
boost::shared_ptr< FaceSideEle side_fe_ptr 
)
Examples
level_set.cpp.

Definition at line 604 of file level_set.cpp.

607  : BoundaryEleOp(NOSPACE, BoundaryEleOp::OPSPACE),
608  sideDataPtr(side_data_ptr), sideFEPtr(side_fe_ptr) {}

Member Function Documentation

◆ doWork()

MoFEMErrorCode LevelSet::OpLhsSkeleton::doWork ( int  side,
EntityType  type,
EntitiesFieldData::EntData data 
)
Examples
level_set.cpp.

Definition at line 809 of file level_set.cpp.

810  {
812 
813  // Collect data from side domain elements
814  CHKERR loopSideFaces("dFE", *sideFEPtr);
815  const auto in_the_loop =
816  sideFEPtr->nInTheLoop; // return number of elements on the side
817 
818  auto not_side = [](auto s) {
819  return s == LEFT_SIDE ? RIGHT_SIDE : LEFT_SIDE;
820  };
821 
822  auto get_ntensor = [](auto &base_mat) {
824  &*base_mat.data().begin());
825  };
826 
827  if (in_the_loop > 0) {
828 
829  // get normal of the face or edge
830  auto t_normal = getFTensor1Normal();
831  const auto nb_gauss_pts = getGaussPts().size2();
832 
833  for (auto s0 : {LEFT_SIDE, RIGHT_SIDE}) {
834 
835  // gent number of DOFs on the right side.
836  const auto nb_rows = sideDataPtr->indicesRowSideMap[s0].size();
837 
838  if (nb_rows) {
839 
840  // get orientation of the local element edge
841  const auto opposite_s0 = not_side(s0);
842  const auto sense_row = sideDataPtr->senseMap[s0];
843 
844  // iterate the side cols
845  const auto nb_row_base_functions =
846  sideDataPtr->rowBaseSideMap[s0].size2();
847 
848  for (auto s1 : {LEFT_SIDE, RIGHT_SIDE}) {
849 
850  // gent number of DOFs on the right side.
851  const auto nb_cols = sideDataPtr->indicesColSideMap[s1].size();
852  const auto sense_col = sideDataPtr->senseMap[s1];
853 
854  // resize local element matrix
855  matSkeleton.resize(nb_rows, nb_cols, false);
856  matSkeleton.clear();
857 
858  auto t_w = getFTensor0IntegrationWeight();
859  auto arr_t_vel = make_array(
860  getFTensor1FromMat<SPACE_DIM>(sideDataPtr->velMat[LEFT_SIDE]),
861  getFTensor1FromMat<SPACE_DIM>(sideDataPtr->velMat[RIGHT_SIDE]));
862 
863  auto next = [&]() {
864  for (auto &t_vel : arr_t_vel)
865  ++t_vel;
866  };
867 
868  auto t_row_base = get_ntensor(sideDataPtr->rowBaseSideMap[s0]);
869  for (int gg = 0; gg != nb_gauss_pts; ++gg) {
871  t_vel(i) =
872  (arr_t_vel[LEFT_SIDE](i) + arr_t_vel[RIGHT_SIDE](i)) / 2.;
873  const auto dot = sense_row * (t_normal(i) * t_vel(i));
874  const auto l_upwind_side = (dot > 0) ? s0 : opposite_s0;
875  const auto sense_upwind = sideDataPtr->senseMap[l_upwind_side];
877  t_res(I, J) = t_w * dot;
878  next();
879  ++t_w;
880  auto rr = 0;
881  if (s1 == l_upwind_side) {
882  for (; rr != nb_rows; ++rr) {
883  auto get_ntensor = [](auto &base_mat, auto gg, auto bb) {
884  double *ptr = &base_mat(gg, bb);
886  };
887  auto t_col_base =
888  get_ntensor(sideDataPtr->colBaseSideMap[s1], gg, 0);
889 
890  auto t_mat_skeleton =
891  getFTensor2FromPtr<DIM1, DIM2>(&matSkeleton(rr * DIM1, 0));
893  t_res_row(I, J) = t_res(I, J) * t_row_base;
894  ++t_row_base;
895  // iterate columns
896  for (size_t cc = 0; cc != nb_cols; ++cc) {
897  t_mat_skeleton(I, J) += t_res_row(I, J) * t_col_base;
898  ++t_col_base;
899  ++t_mat_skeleton;
900  }
901  }
902  }
903  for (; rr < nb_row_base_functions; ++rr) {
904  ++t_row_base;
905  }
906  }
907  // assemble system
908  CHKERR ::MatSetValues(getTSB(),
909  sideDataPtr->indicesRowSideMap[s0].size(),
910  &*sideDataPtr->indicesRowSideMap[s0].begin(),
911  sideDataPtr->indicesColSideMap[s1].size(),
912  &*sideDataPtr->indicesColSideMap[s1].begin(),
913  &*matSkeleton.data().begin(), ADD_VALUES);
914  }
915  }
916  }
917  }
919 }

Member Data Documentation

◆ matSkeleton

MatrixDouble LevelSet::OpLhsSkeleton::matSkeleton
private

Definition at line 461 of file level_set.cpp.

◆ sideDataPtr

boost::shared_ptr<SideData> LevelSet::OpLhsSkeleton::sideDataPtr
private

Definition at line 457 of file level_set.cpp.

◆ sideFEPtr

boost::shared_ptr<FaceSideEle> LevelSet::OpLhsSkeleton::sideFEPtr
private

pointer to element to get data on edge/face sides

Definition at line 459 of file level_set.cpp.


The documentation for this struct was generated from the following file:
NOSPACE
@ NOSPACE
Definition: definitions.h:83
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:1644
FTensor::Tensor1
Definition: Tensor1_value.hpp:8
J
FTensor::Index< 'J', DIM1 > J
Definition: level_set.cpp:30
FTensor::Tensor2
Definition: Tensor2_value.hpp:16
I
FTensor::Index< 'I', DIM1 > I
Definition: level_set.cpp:29
LevelSet::OpLhsSkeleton::matSkeleton
MatrixDouble matSkeleton
Definition: level_set.cpp:461
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
DIM1
constexpr int DIM1
Definition: level_set.cpp:21
Poisson2DiscontGalerkinOperators::get_ntensor
auto get_ntensor(T &base_mat)
Definition: PoissonDiscontinousGalerkin.hpp:90
LevelSet::OpLhsSkeleton::sideDataPtr
boost::shared_ptr< SideData > sideDataPtr
Definition: level_set.cpp:457
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: level_set.cpp:579
BoundaryEleOp
BoundaryEle::UserDataOperator BoundaryEleOp
Definition: level_set.cpp:44
FTensor::Tensor0
Definition: Tensor0.hpp:16
LevelSet::OpLhsSkeleton::sideFEPtr
boost::shared_ptr< FaceSideEle > sideFEPtr
pointer to element to get data on edge/face sides
Definition: level_set.cpp:459
LevelSet::LEFT_SIDE
@ LEFT_SIDE
Definition: level_set.cpp:367
MoFEM::make_array
constexpr auto make_array(Arg &&...arg)
Create Array.
Definition: Templates.hpp:1990
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
LevelSet::RIGHT_SIDE
@ RIGHT_SIDE
Definition: level_set.cpp:367
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359