v0.13.2
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | List of all members
SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap Struct Reference

Tangent opeerator for contrains equation for change of spatial positions on master and slave. More...

#include <users_modules/mortar_contact/src/SimpleContact.hpp>

Inheritance diagram for SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap:
[legend]
Collaboration diagram for SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap:
[legend]

Public Member Functions

 OpLhsConvectIntegrationPtsConstrainMasterGap (const string lagrange_field_name, const string field_name, boost::shared_ptr< CommonDataSimpleContact > common_data_contact, boost::shared_ptr< double > cn, const ContactOp::FaceType face_type, boost::shared_ptr< MatrixDouble > diff_convect)
 
MoFEMErrorCode doWork (int row_side, int col_side, EntityType row_type, EntityType col_type, EntData &row_data, EntData &col_data)
 

Private Attributes

MatrixDouble matLhs
 
boost::shared_ptr< CommonDataSimpleContactcommonDataSimpleContact
 
boost::shared_ptr< doublecNPtr
 
boost::shared_ptr< MatrixDouble > diffConvect
 

Detailed Description

Tangent opeerator for contrains equation for change of spatial positions on master and slave.

Definition at line 2427 of file SimpleContact.hpp.

Constructor & Destructor Documentation

◆ OpLhsConvectIntegrationPtsConstrainMasterGap()

SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::OpLhsConvectIntegrationPtsConstrainMasterGap ( const string  lagrange_field_name,
const string  field_name,
boost::shared_ptr< CommonDataSimpleContact common_data_contact,
boost::shared_ptr< double cn,
const ContactOp::FaceType  face_type,
boost::shared_ptr< MatrixDouble >  diff_convect 
)
inline

Definition at line 2429 of file SimpleContact.hpp.

2434 : ContactOp(lagrange_field_name, field_name, UserDataOperator::OPROWCOL,
2435 face_type),
2436 commonDataSimpleContact(common_data_contact), cNPtr(cn),
2437 diffConvect(diff_convect) {
2438 sYmm = false;
2439 }
double cn
Definition: contact.cpp:124
constexpr auto field_name
boost::shared_ptr< CommonDataSimpleContact > commonDataSimpleContact
ContactPrismElementForcesAndSourcesCore::UserDataOperator ContactOp

Member Function Documentation

◆ doWork()

MoFEMErrorCode SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::doWork ( int  row_side,
int  col_side,
EntityType  row_type,
EntityType  col_type,
EntData row_data,
EntData col_data 
)

Definition at line 2987 of file SimpleContact.cpp.

2989 {
2991
2992 const int nb_row = row_data.getIndices().size();
2993 const int nb_col = col_data.getIndices().size();
2994
2995 if (nb_row && nb_col && col_type == MBVERTEX) {
2996
2997 const int nb_gauss_pts = row_data.getN().size1();
2998 int nb_base_fun_row = nb_row;
2999 int nb_base_fun_col = nb_col / 3;
3000
3001 const double area_slave =
3002 commonDataSimpleContact->areaSlave; // same area in master and slave
3003
3004 matLhs.resize(nb_row, nb_col, false);
3005 matLhs.clear();
3006
3007 auto get_diff_ksi = [](auto &m, auto gg) {
3009 &m(0, gg), &m(1, gg), &m(2, gg), &m(3, gg), &m(4, gg), &m(5, gg));
3010 };
3011
3012 auto get_tensor_from_vec = [](VectorDouble &n) {
3013 return FTensor::Tensor1<double *, 3>(&n(0), &n(1), &n(2));
3014 };
3015
3019
3020 auto t_const_unit_n =
3021 get_tensor_from_vec(*(commonDataSimpleContact->normalVectorSlavePtr));
3022
3023 auto t_lagrange_slave =
3024 getFTensor0FromVec(*commonDataSimpleContact->lagMultAtGaussPtsPtr);
3025 auto t_gap_gp = getFTensor0FromVec(*commonDataSimpleContact->gapPtr);
3026 auto &xi_grad_mat =
3027 *(commonDataSimpleContact->gradKsiPositionAtGaussPtsPtr);
3028 auto t_grad = getFTensor2FromMat<3, 2>(xi_grad_mat);
3029
3030 auto t_w = getFTensor0IntegrationWeightSlave();
3031 const double cn_value = *cNPtr.get();
3032 for (int gg = 0; gg != nb_gauss_pts; ++gg) {
3033 const double val_m = SimpleContactProblem::ConstrainFunction(
3034 cn_value, t_gap_gp, t_lagrange_slave) *
3035 t_w * area_slave;
3036 const double val_diff_m_l = SimpleContactProblem::ConstrainFunction_dl(
3037 cn_value, t_gap_gp, t_lagrange_slave) *
3038 t_w * area_slave;
3039 const double val_diff_m_g = SimpleContactProblem::ConstrainFunction_dg(
3040 cn_value, t_gap_gp, t_lagrange_slave) *
3041 t_w * area_slave;
3042
3043 auto t_base_lambda = row_data.getFTensor0N(gg, 0);
3044 auto t_base_diff_lambda = row_data.getFTensor1DiffN<2>(gg, 0);
3045
3047 &matLhs(0, 0), &matLhs(0, 1), &matLhs(0, 2)};
3048
3049 for (int bbr = 0; bbr != nb_base_fun_row; ++bbr) {
3050
3051 auto t_base_diff_disp = col_data.getFTensor1DiffN<2>(gg, 0);
3052 auto t_diff_convect = get_diff_ksi(*diffConvect, 3 * gg);
3053
3054 for (int bbc = 0; bbc != nb_base_fun_col; ++bbc) {
3055
3056 t_mat(i) += t_base_lambda * val_diff_m_g * t_const_unit_n(j) *
3057 t_grad(j, I) * t_diff_convect(I, i);
3058
3059 ++t_base_diff_disp;
3060 ++t_diff_convect;
3061 ++t_mat;
3062 }
3063
3064 ++t_base_lambda;
3065 ++t_base_diff_lambda;
3066 }
3067
3068 ++t_gap_gp;
3069 ++t_lagrange_slave;
3070 ++t_grad;
3071 ++t_w;
3072 }
3073
3074 CHKERR MatSetValues(getSNESB(), row_data, col_data, &*matLhs.data().begin(),
3075 ADD_VALUES);
3076 }
3078}
#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
#define CHKERR
Inline error check.
Definition: definitions.h:535
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:135
constexpr IntegrationType I
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorInt & getIndices() const
Get global indices of dofs on entity.
static double ConstrainFunction_dg(const double cn, const double g, const double l)
static double ConstrainFunction(const double cn, const double g, const double l)
static double ConstrainFunction_dl(const double cn, const double g, const double l)

Member Data Documentation

◆ cNPtr

boost::shared_ptr<double> SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::cNPtr
private

Definition at line 2448 of file SimpleContact.hpp.

◆ commonDataSimpleContact

boost::shared_ptr<CommonDataSimpleContact> SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::commonDataSimpleContact
private

Definition at line 2447 of file SimpleContact.hpp.

◆ diffConvect

boost::shared_ptr<MatrixDouble> SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::diffConvect
private

Definition at line 2449 of file SimpleContact.hpp.

◆ matLhs

MatrixDouble SimpleContactProblem::OpLhsConvectIntegrationPtsConstrainMasterGap::matLhs
private

Definition at line 2446 of file SimpleContact.hpp.


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