v0.14.0
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp > Struct Template Reference

#include <users_modules/tutorials/adv-1/src/ContactOps.hpp>

Inheritance diagram for ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >:
[legend]
Collaboration diagram for ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >:
[legend]

Public Member Functions

 OpConstrainBoundaryLhs_dUImpl (const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr, bool is_axisymmetric=false)
 
MoFEMErrorCode iNtegrate (EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
 
 OpConstrainBoundaryLhs_dUImpl (const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > common_data_ptr)
 
MoFEMErrorCode iNtegrate (EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
 

Public Attributes

SurfaceDistanceFunction surfaceDistanceFunction = surface_distance_function
 
GradSurfaceDistanceFunction gradSurfaceDistanceFunction
 
HessSurfaceDistanceFunction hessSurfaceDistanceFunction
 
boost::shared_ptr< CommonDatacommonDataPtr
 
bool isAxisymmetric
 

Detailed Description

template<int DIM, typename AssemblyBoundaryEleOp>
struct ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >

Definition at line 483 of file ContactOps.hpp.

Constructor & Destructor Documentation

◆ OpConstrainBoundaryLhs_dUImpl() [1/2]

template<int DIM, typename AssemblyBoundaryEleOp >
ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::OpConstrainBoundaryLhs_dUImpl ( const std::string  row_field_name,
const std::string  col_field_name,
boost::shared_ptr< CommonData common_data_ptr,
bool  is_axisymmetric = false 
)

Definition at line 826 of file ContactOps.hpp.

831 : AssemblyBoundaryEleOp(row_field_name, col_field_name,
832 AssemblyBoundaryEleOp::OPROWCOL),
833 commonDataPtr(common_data_ptr), isAxisymmetric(is_axisymmetric) {
834 AssemblyBoundaryEleOp::sYmm = false;
835}
PetscBool is_axisymmetric
Definition: contact.cpp:137
FormsIntegrators< BoundaryEleOp >::Assembly< A >::OpBase AssemblyBoundaryEleOp

◆ OpConstrainBoundaryLhs_dUImpl() [2/2]

template<int DIM, typename AssemblyBoundaryEleOp >
ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::OpConstrainBoundaryLhs_dUImpl ( const std::string  row_field_name,
const std::string  col_field_name,
boost::shared_ptr< CommonData common_data_ptr 
)

Definition at line 603 of file ContactOps.hpp.

607 : AssemblyBoundaryEleOp(row_field_name, col_field_name,
608 AssemblyBoundaryEleOp::OPROWCOL),
609 commonDataPtr(common_data_ptr) {
610 AssemblyBoundaryEleOp::sYmm = false;
611}

Member Function Documentation

◆ iNtegrate() [1/2]

template<int DIM, typename AssemblyBoundaryEleOp >
MoFEMErrorCode ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::iNtegrate ( EntitiesFieldData::EntData &  row_data,
EntitiesFieldData::EntData &  col_data 
)

Definition at line 839 of file ContactOps.hpp.

841 {
843
847
848 const size_t nb_gauss_pts = AssemblyBoundaryEleOp::getGaussPts().size2();
849 auto &locMat = AssemblyBoundaryEleOp::locMat;
850
851 auto t_normal_at_pts = AssemblyBoundaryEleOp::getFTensor1NormalsAtGaussPts();
852 auto t_traction = getFTensor1FromMat<DIM>(commonDataPtr->contactTraction);
853 auto t_coords = AssemblyBoundaryEleOp::getFTensor1CoordsAtGaussPts();
854
855 auto t_w = AssemblyBoundaryEleOp::getFTensor0IntegrationWeight();
856 auto t_row_base = row_data.getFTensor1N<3>();
857 size_t nb_face_functions = row_data.getN().size2() / 3;
858
859 constexpr auto t_kd = FTensor::Kronecker_Delta<int>();
860
861 auto m_spatial_coords = get_spatial_coords(
863 getFTensor1FromMat<DIM>(commonDataPtr->contactDisp), nb_gauss_pts);
864 auto m_normals_at_pts = get_normalize_normals(
866
867 auto t_normal = getFTensor1FromMat<3>(m_normals_at_pts);
868
869 auto ts_time = AssemblyBoundaryEleOp::getTStime();
870 auto ts_time_step = AssemblyBoundaryEleOp::getTStimeStep();
871
872 // placeholder to pass boundary block id to python
873 int block_id = 0;
874
875 auto v_sdf =
876 surfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
877 m_spatial_coords, m_normals_at_pts, block_id);
878
879 auto m_grad_sdf =
880 gradSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
881 m_spatial_coords, m_normals_at_pts, block_id);
882
883 auto m_hess_sdf =
884 hessSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
885 m_spatial_coords, m_normals_at_pts, block_id);
886
887 auto t_sdf = getFTensor0FromVec(v_sdf);
888 auto t_grad_sdf = getFTensor1FromMat<3>(m_grad_sdf);
889 auto t_hess_sdf = getFTensor2SymmetricFromMat<3>(m_hess_sdf);
890
891 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
892
893 double jacobian = 1.;
894 if (isAxisymmetric) {
895 jacobian = 2. * M_PI * t_coords(0);
896 }
897 const double alpha = t_w * jacobian * AssemblyBoundaryEleOp::getMeasure();
898
899 auto tn = -t_traction(i) * t_grad_sdf(i);
900 auto c = constrain(t_sdf, tn);
901
903 t_cP(i, j) = (c * t_grad_sdf(i)) * t_grad_sdf(j);
905 t_cQ(i, j) = kronecker_delta(i, j) - t_cP(i, j);
906
908 t_res_dU(i, j) = kronecker_delta(i, j) + t_cP(i, j);
909
910 if (c > 0) {
911 t_res_dU(i, j) +=
912 (c * cn_contact) *
913 (t_hess_sdf(i, j) * (t_grad_sdf(k) * t_traction(k)) +
914 t_grad_sdf(i) * t_hess_sdf(k, j) * t_traction(k)) +
915 c * t_sdf * t_hess_sdf(i, j);
916 }
917
918 size_t rr = 0;
919 for (; rr != AssemblyBoundaryEleOp::nbRows / DIM; ++rr) {
920
921 auto t_mat = getFTensor2FromArray<DIM, DIM, DIM>(locMat, DIM * rr);
922
923 const double row_base = t_row_base(i) * t_normal(i);
924
925 auto t_col_base = col_data.getFTensor0N(gg, 0);
926 for (size_t cc = 0; cc != AssemblyBoundaryEleOp::nbCols / DIM; ++cc) {
927 const double beta = alpha * row_base * t_col_base;
928
929 t_mat(i, j) -= beta * t_res_dU(i, j);
930
931 ++t_col_base;
932 ++t_mat;
933 }
934
935 ++t_row_base;
936 }
937 for (; rr < nb_face_functions; ++rr)
938 ++t_row_base;
939
940 ++t_traction;
941 ++t_coords;
942 ++t_w;
943 ++t_normal;
944 ++t_sdf;
945 ++t_grad_sdf;
946 ++t_hess_sdf;
947 }
948
950}
Kronecker Delta class.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
constexpr auto t_kd
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
auto get_normalize_normals(FTensor::Tensor1< T1, DIM1 > &&t_normal_at_pts, size_t nb_gauss_pts)
Definition: ContactOps.hpp:422
auto get_spatial_coords(FTensor::Tensor1< T1, DIM1 > &&t_coords, FTensor::Tensor1< T2, DIM2 > &&t_disp, size_t nb_gauss_pts)
Definition: ContactOps.hpp:405
double constrain(double sdf, double tn)
constrain function
Definition: ContactOps.hpp:572
Tensor2_Expr< Kronecker_Delta< T >, T, Dim0, Dim1, i, j > kronecker_delta(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
Rank 2.
auto getFTensor1CoordsAtGaussPts()
Get coordinates at integration points assuming linear geometry.
int nbRows
number of dofs on rows
MatrixDouble locMat
local entity block matrix
int nbCols
number if dof on column

◆ iNtegrate() [2/2]

template<int DIM, typename AssemblyBoundaryEleOp >
MoFEMErrorCode ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::iNtegrate ( EntitiesFieldData::EntData &  row_data,
EntitiesFieldData::EntData &  col_data 
)

Member Data Documentation

◆ commonDataPtr

template<int DIM, typename AssemblyBoundaryEleOp >
boost::shared_ptr< CommonData > ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::commonDataPtr

Definition at line 498 of file ContactOps.hpp.

◆ gradSurfaceDistanceFunction

template<int DIM, typename AssemblyBoundaryEleOp >
GradSurfaceDistanceFunction ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::gradSurfaceDistanceFunction
Initial value:
=
MatrixDouble grad_surface_distance_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_spatial_coords, MatrixDouble &m_normals_at_pts, int block_id)
Definition: ContactOps.hpp:273

Definition at line 493 of file ContactOps.hpp.

◆ hessSurfaceDistanceFunction

template<int DIM, typename AssemblyBoundaryEleOp >
HessSurfaceDistanceFunction ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::hessSurfaceDistanceFunction
Initial value:
=
MatrixDouble hess_surface_distance_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_spatial_coords, MatrixDouble &m_normals_at_pts, int block_id)
Definition: ContactOps.hpp:330

Definition at line 495 of file ContactOps.hpp.

◆ isAxisymmetric

template<int DIM, typename AssemblyBoundaryEleOp >
bool ContactOps::OpConstrainBoundaryLhs_dUImpl< DIM, GAUSS, AssemblyBoundaryEleOp >::isAxisymmetric

Definition at line 499 of file ContactOps.hpp.

◆ surfaceDistanceFunction

Definition at line 492 of file ContactOps.hpp.


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