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

LHS-operator for the simple contact element. More...

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

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

Public Member Functions

MoFEMErrorCode iNtegrate (EntData &row_data, EntData &col_data)
 Integrates linearisation of the complementarity function at slave face gauss points and assembles components to LHS global matrix. More...
 
 OpCalDerIntCompFunSlaveSlave_dX (const string lagrange_field_name, const string mesh_nodes_field, boost::shared_ptr< double > cn, boost::shared_ptr< CommonDataSimpleContact > common_data_contact, int row_rank, const int col_rank)
 
- Public Member Functions inherited from SimpleContactProblem::OpContactALELhs
MoFEMErrorCode doWork (int row_side, int col_side, EntityType row_type, EntityType col_type, EntData &row_data, EntData &col_data)
 
virtual MoFEMErrorCode iNtegrate (EntData &row_data, EntData &col_data)
 
MoFEMErrorCode aSsemble (EntData &row_data, EntData &col_data)
 
 OpContactALELhs (const string field_name_1, const string field_name_2, boost::shared_ptr< CommonDataSimpleContact > common_data_contact, const ContactOp::FaceType face_type, const int rank_row, const int rank_col)
 

Private Attributes

boost::shared_ptr< doublecNPtr
 

Additional Inherited Members

- Public Attributes inherited from SimpleContactProblem::OpContactALELhs
boost::shared_ptr< CommonDataSimpleContactcommonDataSimpleContact
 
MatrixDouble matLhs
 
VectorInt rowIndices
 
VectorInt colIndices
 
int row_nb_dofs
 
int col_nb_dofs
 
int nb_gauss_pts
 
int nb_base_fun_row
 
int nb_base_fun_col
 
int rankRow
 
int rankCol
 

Detailed Description

LHS-operator for the simple contact element.

Integrates the variation with respect to slave material positions of the complementarity function to fulfill KKT conditions in the integral sense and assembles components to LHS global matrix.

Definition at line 3236 of file SimpleContact.hpp.

Constructor & Destructor Documentation

◆ OpCalDerIntCompFunSlaveSlave_dX()

SimpleContactProblem::OpCalDerIntCompFunSlaveSlave_dX::OpCalDerIntCompFunSlaveSlave_dX ( const string  lagrange_field_name,
const string  mesh_nodes_field,
boost::shared_ptr< double cn,
boost::shared_ptr< CommonDataSimpleContact common_data_contact,
int  row_rank,
const int  col_rank 
)
inline
Parameters
lagrange_field_nameString of field name for lagrange multipliers for rows
mesh_nodes_fieldString of field name for material positions for columns
cnregularisation/augmentation parameter affecting convergence
common_data_contactPointer to the common data for simple contact element
row_rankParameter setting the dimension of the associated field for rows (in this case is 1)
col_rankParameter setting the dimension of the associated field for cols (in this case is 3)

Definition at line 3315 of file SimpleContact.hpp.

3320 : OpContactALELhs(lagrange_field_name, mesh_nodes_field,
3321 common_data_contact, ContactOp::FACESLAVESLAVE,
3322 row_rank, col_rank),
3323 cNPtr(cn) {
3324 sYmm = false; // This will make sure to loop over all intities (e.g.
3325 // for order=2 it will make doWork to loop 16 time)
3326 }
double cn
Definition: contact.cpp:124
OpContactALELhs(const string field_name_1, const string field_name_2, boost::shared_ptr< CommonDataSimpleContact > common_data_contact, const ContactOp::FaceType face_type, const int rank_row, const int rank_col)

Member Function Documentation

◆ iNtegrate()

MoFEMErrorCode SimpleContactProblem::OpCalDerIntCompFunSlaveSlave_dX::iNtegrate ( EntData row_data,
EntData col_data 
)
virtual

Integrates linearisation of the complementarity function at slave face gauss points and assembles components to LHS global matrix.

Integrates and assembles the variation with respect to slave spatial positions of the complementarity function to fulfill KKT conditions in the integral sense and assembles components to LHS global matrix.

\[ {\text D}{\overline C(\lambda, \mathbf{x}^{(i)}, \mathbf{X}^{(1)}, \delta \lambda)}[\Delta \mathbf{X}^{(1)}] = \int_{{{\mathcal{T}}^{(1)}_{\xi}}} -\left[ \textrm{D}\mathbf{N}^{(1)}(\mathbf{X}^{(1)})[\Delta\mathbf{X}^{(1)}] - \frac{\mathbf{N}^{(1)}(\mathbf{X}^{(1)})}{||{{\mathbf N}^{(1)}(\xi, \eta)}||} \textrm{D}\mathbf{N}^{(1)}(\mathbf{X}^{(1)})[\Delta\mathbf{X}^{(1)}] \cdot \frac{\mathbf{N}^{(1)}(\mathbf{X}^{(1)})}{||{{\mathbf N}^{(1)}(\xi, \eta)}||} \right] \cdot \left( {\mathbf{x}}^{(1)} - {\mathbf{x}}^{(2)}\right) c_{\text n} \left( 1 + {\text {sign}}\left( \lambda - c_{\text n} g_{\textrm{n}} \right) {\left| \lambda - c_{\text n} g_{\textrm{n}}\right|}^{r-1}\right) \delta{{\lambda}} \,\,{ {\text d} {\xi} {\text d} {\eta}} \\ + \int_{{{\mathcal{T}}^{(1)}_{\xi}}} \overline C(\lambda, \mathbf{x}^{(i)}, \mathbf{X}^{(1)}, \delta \lambda) \textrm{D}\mathbf{N}^{(1)}(\mathbf{X}^{(1)})[\Delta\mathbf{X}^{(1)}] \cdot \frac{\mathbf{N}^{(1)}(\mathbf{X}^{(1)})}{||{{\mathbf N}^{(1)}(\xi, \eta)}||} \delta{{\lambda}} \,\,{ {\text d} {\xi} {\text d} {\eta}} \]

where

\[ \textrm{D}\mathbf{N}^{(1)}(\mathbf{X}^{(1)})[\Delta\mathbf{X}^{(1)}] = \frac{\partial{\Delta\mathbf{X}}^{(1)}} {\partial\xi} \times \frac{\partial {\mathbf{X}}^{(1)}}{\partial\eta} + \frac{\partial{\mathbf{X}}^{(1)}} {\partial\xi} \times \frac{\partial {\Delta\mathbf{X}}^{(1)}}{\partial\eta} \]

where \(\xi, \eta\) are coordinates in the parent space \(({\mathcal{T}}^{(1)}_\xi)\) of the slave surface, \( \lambda\) is the Lagrange multiplier, \(\mathbf{x}^{(i)}\) are the coordinates of the overlapping gauss points at slave and master triangles for \(i = 1\) and \(i = 2\), respectively. Furthermore, \( c_{\text n}\) works as an augmentation parameter and affects convergence, \(r\) is regularisation parameter that here is chosen to be \(r = 1\) and \( g_{\textrm{n}}\) is the gap function evaluated at the slave triangle gauss points as:

\[ g_{\textrm{n}} = - \mathbf{N}(\mathbf{X}^{(1)}) \cdot \left( \mathbf{x}^{(1)} - \mathbf{x}^{(2)} \right) \]

Reimplemented from SimpleContactProblem::OpContactALELhs.

Definition at line 3716 of file SimpleContact.cpp.

3717 {
3719
3720 const int nb_row = row_data.getIndices().size();
3721 if (!nb_row)
3723 const int nb_col = col_data.getIndices().size();
3724 if (!nb_col)
3726 const int nb_gauss_pts = row_data.getN().size1();
3727 int nb_base_fun_row = row_data.getFieldData().size();
3728 int nb_base_fun_col = col_data.getFieldData().size() / 3;
3729
3730 matLhs.resize(nb_base_fun_row, 3 * nb_base_fun_col, false);
3731 matLhs.clear();
3732
3733 auto get_tensor_vec = [](VectorDouble &n) {
3734 return FTensor::Tensor1<double *, 3>(&n(0), &n(1), &n(2));
3735 };
3736
3737 auto get_vec_from_mat = [](MatrixDouble &m, const int r, const int c) {
3738 return FTensor::Tensor1<double *, 3>(&m(r + 0, c + 0), &m(r + 0, c + 1),
3739 &m(r + 0, c + 2));
3740 };
3741
3745
3746 auto make_vec_der = [&](auto t_N, auto t_1, auto t_2) {
3748 t_n(i, j) = 0;
3749 t_n(i, j) += FTensor::levi_civita(i, j, k) * t_2(k) * t_N(0);
3750 t_n(i, j) -= FTensor::levi_civita(i, j, k) * t_1(k) * t_N(1);
3751 return t_n;
3752 };
3753
3754 auto x_m = getFTensor1FromMat<3>(
3755 *commonDataSimpleContact->positionAtGaussPtsMasterPtr);
3756 auto x_s = getFTensor1FromMat<3>(
3757 *commonDataSimpleContact->positionAtGaussPtsSlavePtr);
3758 auto t_lagrange_slave =
3759 getFTensor0FromVec(*commonDataSimpleContact->lagMultAtGaussPtsPtr);
3760
3761 const double length_normal = commonDataSimpleContact->areaSlave;
3762
3763 auto normal_at_gp =
3764 get_tensor_vec(*commonDataSimpleContact->normalVectorSlavePtr);
3765
3766 auto t_w = getFTensor0IntegrationWeightSlave();
3767 auto t_1 = get_tensor_vec(*commonDataSimpleContact->tangentOneVectorSlavePtr);
3768 auto t_2 = get_tensor_vec(*commonDataSimpleContact->tangentTwoVectorSlavePtr);
3769 auto t_gap_gp = getFTensor0FromVec(*commonDataSimpleContact->gapPtr);
3770 const double cn_value = *cNPtr.get();
3771 for (int gg = 0; gg != nb_gauss_pts; ++gg) {
3772 double val_s = t_w * 0.5;
3773 auto t_N = col_data.getFTensor1DiffN<2>(gg, 0);
3774
3775 for (int bbc = 0; bbc != nb_base_fun_col; ++bbc) {
3776 FTensor::Tensor0<double *> t_base_lambda(&row_data.getN()(gg, 0));
3777
3778 for (int bbr = 0; bbr != nb_base_fun_row; ++bbr) {
3779 const double s = val_s * t_base_lambda;
3780
3781 auto t_d_n = make_vec_der(t_N, t_1, t_2);
3782
3783 auto assemble_mat = get_vec_from_mat(matLhs, bbr, 3 * bbc);
3784
3785 assemble_mat(j) -=
3786 0.5 *
3787 (t_d_n(i, j) - normal_at_gp(i) * t_d_n(k, j) * normal_at_gp(k)) *
3788 (x_s(i) - x_m(i)) * s * cn_value *
3789 (1 + SimpleContactProblem::Sign(t_lagrange_slave -
3790 cn_value * t_gap_gp));
3791
3792 assemble_mat(j) += t_d_n(i, j) * normal_at_gp(i) * s *
3794 cn_value, t_gap_gp, t_lagrange_slave);
3795
3796 ++t_base_lambda; // update rows
3797 }
3798 ++t_N;
3799 }
3800
3801 ++x_m;
3802 ++x_s;
3803 ++t_lagrange_slave;
3804 ++t_gap_gp;
3805 ++t_w;
3806 }
3807
3809}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
#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
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:135
int r
Definition: sdf.py:5
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorDouble & getFieldData() const
get dofs values
const VectorInt & getIndices() const
Get global indices of dofs on entity.
boost::shared_ptr< CommonDataSimpleContact > commonDataSimpleContact
static double Sign(double x)
static double ConstrainFunction(const double cn, const double g, const double l)

Member Data Documentation

◆ cNPtr

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

Definition at line 3329 of file SimpleContact.hpp.


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