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

Public Member Functions

 OpRhsSkeleton (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...
 
VectorDouble resSkelton
 

Detailed Description

Examples
level_set.cpp.

Definition at line 435 of file level_set.cpp.

Constructor & Destructor Documentation

◆ OpRhsSkeleton()

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

Definition at line 598 of file level_set.cpp.

601  : BoundaryEleOp(NOSPACE, BoundaryEleOp::OPSPACE),
602  sideDataPtr(side_data_ptr), sideFEPtr(side_fe_ptr) {}

Member Function Documentation

◆ doWork()

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

Definition at line 703 of file level_set.cpp.

704  {
706 
707  // Collect data from side domain elements
708  CHKERR loopSideFaces("dFE", *sideFEPtr);
709  const auto in_the_loop =
710  sideFEPtr->nInTheLoop; // return number of elements on the side
711 
712  auto not_side = [](auto s) {
713  return s == LEFT_SIDE ? RIGHT_SIDE : LEFT_SIDE;
714  };
715 
716  auto get_ntensor = [](auto &base_mat) {
718  &*base_mat.data().begin());
719  };
720 
721  if (in_the_loop > 0) {
722 
723  // get normal of the face or edge
724  auto t_normal = getFTensor1Normal();
725  const auto nb_gauss_pts = getGaussPts().size2();
726 
727  for (auto s0 : {LEFT_SIDE, RIGHT_SIDE}) {
728 
729  // gent number of DOFs on the right side.
730  const auto nb_rows = sideDataPtr->indicesRowSideMap[s0].size();
731 
732  if (nb_rows) {
733 
734  resSkelton.resize(nb_rows, false);
735  resSkelton.clear();
736 
737  // get orientation of the local element edge
738  const auto opposite_s0 = not_side(s0);
739  const auto sense_row = sideDataPtr->senseMap[s0];
740 #ifndef NDEBUG
741  const auto opposite_sense_row = sideDataPtr->senseMap[opposite_s0];
742  if (sense_row * opposite_sense_row > 0)
743  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
744  "Should be opposite sign");
745 #endif
746 
747  // iterate the side cols
748  const auto nb_row_base_functions =
749  sideDataPtr->rowBaseSideMap[s0].size2();
750 
751  auto t_w = getFTensor0IntegrationWeight();
752  auto arr_t_l = make_array(
753  getFTensor2FromMat<DIM1, DIM2>(sideDataPtr->lVec[LEFT_SIDE]),
754  getFTensor2FromMat<DIM1, DIM2>(sideDataPtr->lVec[RIGHT_SIDE]));
755  auto arr_t_vel = make_array(
756  getFTensor1FromMat<SPACE_DIM>(sideDataPtr->velMat[LEFT_SIDE]),
757  getFTensor1FromMat<SPACE_DIM>(sideDataPtr->velMat[RIGHT_SIDE]));
758 
759  auto next = [&]() {
760  for (auto &t_l : arr_t_l)
761  ++t_l;
762  for (auto &t_vel : arr_t_vel)
763  ++t_vel;
764  };
765 
766 #ifndef NDEBUG
767  if (nb_gauss_pts != sideDataPtr->rowBaseSideMap[s0].size1())
768  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
769  "Inconsistent number of DOFs");
770 #endif
771 
772  auto t_row_base = get_ntensor(sideDataPtr->rowBaseSideMap[s0]);
773  for (int gg = 0; gg != nb_gauss_pts; ++gg) {
775  t_vel(i) = (arr_t_vel[LEFT_SIDE](i) + arr_t_vel[RIGHT_SIDE](i)) / 2.;
776  const auto dot = sense_row * (t_normal(i) * t_vel(i));
777  const auto l_upwind_side = (dot > 0) ? s0 : opposite_s0;
778  const auto l_upwind = arr_t_l[l_upwind_side];
780  t_res(I, J) = t_w * dot * l_upwind(I, J);
781  next();
782  ++t_w;
783 
784  auto t_res_skeleton =
785  getFTensor2FromPtr<DIM1, DIM2>(&*resSkelton.data().begin());
786  auto rr = 0;
787  for (; rr != nb_rows; ++rr) {
788  t_res_skeleton(I, J) += t_row_base * t_res(I, J);
789  ++t_row_base;
790  ++t_res_skeleton;
791  }
792  for (; rr < nb_row_base_functions; ++rr) {
793  ++t_row_base;
794  }
795  }
796  // assemble local operator vector to global vector
797  CHKERR ::VecSetValues(getTSf(),
798  sideDataPtr->indicesRowSideMap[s0].size(),
799  &*sideDataPtr->indicesRowSideMap[s0].begin(),
800  &*resSkelton.begin(), ADD_VALUES);
801  }
802  }
803  }
804 
806 }

Member Data Documentation

◆ resSkelton

VectorDouble LevelSet::OpRhsSkeleton::resSkelton
private

Definition at line 447 of file level_set.cpp.

◆ sideDataPtr

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

Definition at line 443 of file level_set.cpp.

◆ sideFEPtr

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

pointer to element to get data on edge/face sides

Definition at line 445 of file level_set.cpp.


The documentation for this struct was generated from the following file:
NOSPACE
@ NOSPACE
Definition: definitions.h:83
FTensor::Tensor1
Definition: Tensor1_value.hpp:8
LevelSet::OpRhsSkeleton::sideFEPtr
boost::shared_ptr< FaceSideEle > sideFEPtr
pointer to element to get data on edge/face sides
Definition: level_set.cpp:445
J
FTensor::Index< 'J', DIM1 > J
Definition: level_set.cpp:30
MoFEM::VecSetValues
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
Definition: EntitiesFieldData.hpp:1589
FTensor::Tensor2
Definition: Tensor2_value.hpp:16
I
FTensor::Index< 'I', DIM1 > I
Definition: level_set.cpp:29
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
Poisson2DiscontGalerkinOperators::get_ntensor
auto get_ntensor(T &base_mat)
Definition: PoissonDiscontinousGalerkin.hpp:90
LevelSet::OpRhsSkeleton::resSkelton
VectorDouble resSkelton
Definition: level_set.cpp:447
LevelSet::OpRhsSkeleton::sideDataPtr
boost::shared_ptr< SideData > sideDataPtr
Definition: level_set.cpp:443
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
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
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