25 boost::shared_ptr<MatrixDouble>
mDPtr;
46 boost::shared_ptr<CommonData> common_data_ptr);
55 const std::string col_field_name,
56 boost::shared_ptr<CommonData> common_data_ptr);
66 const std::string row_field_name,
const std::string col_field_name,
67 boost::shared_ptr<CommonData> common_data_ptr);
75template <
typename T1,
typename T2>
88 return (-0.5 - t_coords(1)) * t_normal(1);
94 return t_disp(
i) * t_normal(
i);
100 return -t_traction(
i) * t_normal(
i);
112inline double w(
const double g,
const double t) {
return g -
cn *
t; }
115 return (
w(
g - g0,
t) + std::abs(
w(
g - g0,
t))) / 2 + g0;
119 return -
cn * (1 +
sign(
w(
g - g0,
t))) / 2;
123 return (1 +
sign(
w(
g - g0,
t))) / 2;
127 const std::string
field_name, boost::shared_ptr<CommonData> common_data_ptr)
129 commonDataPtr(common_data_ptr) {}
135 const size_t nb_gauss_pts = AssemblyBoundaryEleOp::getGaussPts().size2();
137 auto &nf = AssemblyBoundaryEleOp::locF;
139 auto t_normal = getFTensor1Normal();
140 t_normal(
i) /= sqrt(t_normal(
j) * t_normal(
j));
142 auto t_w = getFTensor0IntegrationWeight();
143 auto t_disp = getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactDispPtr));
145 getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactTractionPtr));
146 auto t_coords = getFTensor1CoordsAtGaussPts();
148 size_t nb_base_functions = data.getN().size2() / 3;
149 auto t_base = data.getFTensor1N<3>();
150 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
152 auto t_nf = getFTensor1FromPtr<SPACE_DIM>(&nf[0]);
154 const double alpha = t_w * getMeasure();
156 auto t_contact_normal =
normal(t_coords, t_disp);
158 t_P(
i,
j) = t_contact_normal(
i) * t_contact_normal(
j);
165 t_rhs_constrains(
i) =
166 t_contact_normal(
i) *
168 gap(t_disp, t_contact_normal),
172 t_rhs_tangent_traction;
173 t_rhs_tangent_disp(
i) = t_Q(
i,
j) * t_disp(
j);
174 t_rhs_tangent_traction(
i) =
cn * t_Q(
i,
j) * t_traction(
j);
177 for (; bb != AssemblyBoundaryEleOp::nbRows /
SPACE_DIM; ++bb) {
178 const double beta =
alpha * (t_base(
i) * t_normal(
i));
180 t_nf(
i) -=
beta * t_rhs_constrains(
i);
181 t_nf(
i) -=
beta * t_rhs_tangent_disp(
i);
182 t_nf(
i) +=
beta * t_rhs_tangent_traction(
i);
187 for (; bb < nb_base_functions; ++bb)
200 const std::string row_field_name,
const std::string col_field_name,
201 boost::shared_ptr<CommonData> common_data_ptr)
204 commonDataPtr(common_data_ptr) {
213 const size_t nb_gauss_pts = getGaussPts().size2();
214 auto &locMat = AssemblyBoundaryEleOp::locMat;
216 auto t_normal = getFTensor1Normal();
217 t_normal(
i) /= sqrt(t_normal(
j) * t_normal(
j));
219 auto t_disp = getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactDispPtr));
221 getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactTractionPtr));
222 auto t_coords = getFTensor1CoordsAtGaussPts();
224 auto t_w = getFTensor0IntegrationWeight();
225 auto t_row_base = row_data.getFTensor1N<3>();
226 size_t nb_face_functions = row_data.getN().size2() / 3;
228 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
230 const double alpha = t_w * getMeasure();
232 auto t_contact_normal =
normal(t_coords, t_disp);
234 t_P(
i,
j) = t_contact_normal(
i) * t_contact_normal(
j);
240 gap0(t_coords, t_contact_normal),
gap(t_disp, t_contact_normal),
244 for (; rr != AssemblyBoundaryEleOp::nbRows /
SPACE_DIM; ++rr) {
246 auto t_mat = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
249 const double row_base = t_row_base(
i) * t_normal(
i);
251 auto t_col_base = col_data.getFTensor0N(gg, 0);
252 for (
size_t cc = 0; cc != AssemblyBoundaryEleOp::nbCols /
SPACE_DIM;
254 const double beta =
alpha * row_base * t_col_base;
256 t_mat(
i,
j) -= (
beta * diff_constrain) * t_P(
i,
j);
265 for (; rr < nb_face_functions; ++rr)
278 const std::string row_field_name,
const std::string col_field_name,
279 boost::shared_ptr<CommonData> common_data_ptr)
282 commonDataPtr(common_data_ptr) {
291 const size_t nb_gauss_pts = getGaussPts().size2();
292 auto &locMat = AssemblyBoundaryEleOp::locMat;
294 auto t_normal = getFTensor1Normal();
295 t_normal(
i) /= sqrt(t_normal(
j) * t_normal(
j));
297 auto t_disp = getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactDispPtr));
299 getFTensor1FromMat<SPACE_DIM>(*(
commonDataPtr->contactTractionPtr));
300 auto t_coords = getFTensor1CoordsAtGaussPts();
302 auto t_w = getFTensor0IntegrationWeight();
303 auto t_row_base = row_data.getFTensor1N<3>();
304 size_t nb_face_functions = row_data.getN().size2() / 3;
306 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
308 const double alpha = t_w * getMeasure();
310 auto t_contact_normal =
normal(t_coords, t_disp);
312 t_P(
i,
j) = t_contact_normal(
i) * t_contact_normal(
j);
318 gap0(t_coords, t_contact_normal),
gap(t_disp, t_contact_normal),
322 for (; rr != AssemblyBoundaryEleOp::nbRows /
SPACE_DIM; ++rr) {
324 auto t_mat = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
326 const double row_base = t_row_base(
i) * t_normal(
i);
328 auto t_col_base = col_data.getFTensor1N<3>(gg, 0);
329 for (
size_t cc = 0; cc != AssemblyBoundaryEleOp::nbCols /
SPACE_DIM;
331 const double col_base = t_col_base(
i) * t_normal(
i);
332 const double beta =
alpha * row_base * col_base;
334 t_mat(
i,
j) += (
beta * diff_traction) * t_P(
i,
j);
343 for (; rr < nb_face_functions; ++rr)
EntitiesFieldData::EntData EntData
#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()
Tensor2_Expr< Kronecker_Delta< T >, T, Dim0, Dim1, i, j > kronecker_delta(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
Rank 2.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
constexpr double t
plate stiffness
constexpr auto field_name