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

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(
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 =
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}
#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.
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
constexpr int DIM1
Definition level_set.cpp:21
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.
constexpr auto make_array(Arg &&...arg)
Create Array.
auto get_ntensor(T &base_mat)
Definition plate.cpp:468

Member Data Documentation

◆ matSkeleton

MatrixDouble LevelSet::OpLhsSkeleton::matSkeleton
private
Examples
level_set.cpp.

Definition at line 461 of file level_set.cpp.

◆ sideDataPtr

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

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

Examples
level_set.cpp.

Definition at line 459 of file level_set.cpp.


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