v0.15.0
Loading...
Searching...
No Matches
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
 
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) {}
BoundaryEle::UserDataOperator BoundaryEleOp
@ NOSPACE
Definition definitions.h:83
boost::shared_ptr< SideData > sideDataPtr
boost::shared_ptr< FaceSideEle > sideFEPtr
pointer to element to get data on edge/face sides

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(
755 auto arr_t_vel = make_array(
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 =
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}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FTensor::Index< 'I', DIM1 > I
Definition level_set.cpp:29
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
Definition level_set.cpp:30
auto getFTensor2FromPtr(double *ptr)
Make Tensor2 from pointer.
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
FTensor::Tensor2< FTensor::PackPtr< double *, 1 >, Tensor_Dim1, Tensor_Dim2 > getFTensor2FromMat(MatrixDouble &data)
Get tensor rank 2 (matrix) form data matrix.
constexpr auto make_array(Arg &&...arg)
Create Array.
auto get_ntensor(T &base_mat)
Definition plate.cpp:468

Member Data Documentation

◆ resSkelton

VectorDouble LevelSet::OpRhsSkeleton::resSkelton
private
Examples
level_set.cpp.

Definition at line 447 of file level_set.cpp.

◆ sideDataPtr

boost::shared_ptr<SideData> LevelSet::OpRhsSkeleton::sideDataPtr
private
Examples
level_set.cpp.

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

Examples
level_set.cpp.

Definition at line 445 of file level_set.cpp.


The documentation for this struct was generated from the following file: