8 #ifndef __CONTACTOPS_HPP__
9 #define __CONTACTOPS_HPP__
14 struct CommonData :
public boost::enable_shared_from_this<CommonData> {
27 static SmartPetscObj<Vec>
31 constexpr
int ghosts[] = {0, 1, 2};
56 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
61 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
contactDisp);
65 return boost::shared_ptr<VectorDouble>(shared_from_this(), &
sdfVals);
69 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
gradsSdf);
73 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
hessSdf);
77 return boost::shared_ptr<VectorDouble>(shared_from_this(), &
constraintVals);
88 SDFPython() =
default;
89 virtual ~SDFPython() =
default;
96 auto main_module = bp::import(
"__main__");
97 mainNamespace = main_module.attr(
"__dict__");
98 bp::exec_file(py_file.c_str(), mainNamespace, mainNamespace);
100 sdfFun = mainNamespace[
"sdf"];
101 sdfGradFun = mainNamespace[
"grad_sdf"];
102 sdfHessFun = mainNamespace[
"hess_sdf"];
104 }
catch (bp::error_already_set
const &) {
112 template <
typename T>
113 inline std::vector<T>
114 py_list_to_std_vector(
const boost::python::object &iterable) {
115 return std::vector<T>(boost::python::stl_input_iterator<T>(iterable),
116 boost::python::stl_input_iterator<T>());
121 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
122 np::ndarray tx, np::ndarray ty, np::ndarray tz,
int block_id,
130 sdf = bp::extract<np::ndarray>(
131 sdfFun(delta_t,
t, x, y, z, tx, ty, tz, block_id));
133 }
catch (bp::error_already_set
const &) {
143 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
144 np::ndarray tx, np::ndarray ty, np::ndarray tz,
int block_id,
152 grad_sdf = bp::extract<np::ndarray>(
153 sdfGradFun(delta_t,
t, x, y, z, tx, ty, tz, block_id));
155 }
catch (bp::error_already_set
const &) {
165 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
166 np::ndarray tx, np::ndarray ty, np::ndarray tz,
int block_id,
174 hess_sdf = bp::extract<np::ndarray>(
175 sdfHessFun(delta_t,
t, x, y, z, tx, ty, tz, block_id));
177 }
catch (bp::error_already_set
const &) {
186 bp::object mainNamespace;
188 bp::object sdfGradFun;
189 bp::object sdfHessFun;
192 static boost::weak_ptr<SDFPython> sdfPythonWeakPtr;
194 inline np::ndarray convert_to_numpy(
VectorDouble &data,
int nb_gauss_pts,
196 auto dtype = np::dtype::get_builtin<double>();
197 auto size = bp::make_tuple(nb_gauss_pts);
198 auto stride = bp::make_tuple(3 *
sizeof(
double));
199 return (np::from_data(&data[
id], dtype, size, stride, bp::object()));
205 double delta_t,
double t,
int nb_gauss_pts,
MatrixDouble &spatial_coords,
209 double delta_t,
double t,
int nb_gauss_pts,
MatrixDouble &spatial_coords,
213 double delta_t,
double t,
int nb_gauss_pts,
MatrixDouble &spatial_coords,
223 if (
auto sdf_ptr = sdfPythonWeakPtr.lock()) {
225 VectorDouble v_spatial_coords = m_spatial_coords.data();
228 bp::list python_coords;
229 bp::list python_normals;
231 for (
int idx = 0; idx < 3; ++idx) {
232 python_coords.append(
233 convert_to_numpy(v_spatial_coords, nb_gauss_pts, idx));
234 python_normals.append(
235 convert_to_numpy(v_normal_at_pts, nb_gauss_pts, idx));
238 np::ndarray np_sdf = np::empty(bp::make_tuple(nb_gauss_pts),
239 np::dtype::get_builtin<double>());
241 bp::extract<np::ndarray>(python_coords[0]),
242 bp::extract<np::ndarray>(python_coords[1]),
243 bp::extract<np::ndarray>(python_coords[2]),
244 bp::extract<np::ndarray>(python_normals[0]),
245 bp::extract<np::ndarray>(python_normals[1]),
246 bp::extract<np::ndarray>(python_normals[2]),
248 "Failed python call");
250 double *sdf_val_ptr =
reinterpret_cast<double *
>(np_sdf.get_data());
253 v_sdf.resize(nb_gauss_pts,
false);
255 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg)
256 v_sdf[gg] = *(sdf_val_ptr + gg);
262 v_sdf.resize(nb_gauss_pts,
false);
263 m_spatial_coords.resize(3, nb_gauss_pts);
264 auto t_coords = getFTensor1FromMat<3>(m_spatial_coords);
266 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg)
267 v_sdf[gg] = t_coords(1) + 0.5;
277 if (
auto sdf_ptr = sdfPythonWeakPtr.lock()) {
279 VectorDouble v_spatial_coords = m_spatial_coords.data();
282 bp::list python_coords;
283 bp::list python_normals;
285 for (
int idx = 0; idx < 3; ++idx) {
286 python_coords.append(
287 convert_to_numpy(v_spatial_coords, nb_gauss_pts, idx));
288 python_normals.append(
289 convert_to_numpy(v_normal_at_pts, nb_gauss_pts, idx));
292 np::ndarray np_grad_sdf = np::empty(bp::make_tuple(nb_gauss_pts, 3),
293 np::dtype::get_builtin<double>());
295 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
296 bp::extract<np::ndarray>(python_coords[1]),
297 bp::extract<np::ndarray>(python_coords[2]),
298 bp::extract<np::ndarray>(python_normals[0]),
299 bp::extract<np::ndarray>(python_normals[1]),
300 bp::extract<np::ndarray>(python_normals[2]), block_id,
302 "Failed python call");
304 double *grad_ptr =
reinterpret_cast<double *
>(np_grad_sdf.get_data());
307 m_grad_sdf.resize(3, nb_gauss_pts,
false);
308 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg) {
309 for (
int idx = 0; idx < 3; ++idx)
310 m_grad_sdf(idx, gg) = *(grad_ptr + (3 * gg + idx));
316 m_grad_sdf.resize(3, nb_gauss_pts,
false);
319 auto t_grad_sdf = getFTensor1FromMat<3>(m_grad_sdf);
321 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg) {
322 t_grad_sdf(
i) = t_grad_sdf_set(
i);
334 if (
auto sdf_ptr = sdfPythonWeakPtr.lock()) {
336 VectorDouble v_spatial_coords = m_spatial_coords.data();
339 bp::list python_coords;
340 bp::list python_normals;
342 for (
int idx = 0; idx < 3; ++idx) {
343 python_coords.append(
344 convert_to_numpy(v_spatial_coords, nb_gauss_pts, idx));
345 python_normals.append(
346 convert_to_numpy(v_normal_at_pts, nb_gauss_pts, idx));
349 np::ndarray np_hess_sdf = np::empty(bp::make_tuple(nb_gauss_pts, 6),
350 np::dtype::get_builtin<double>());
352 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
353 bp::extract<np::ndarray>(python_coords[1]),
354 bp::extract<np::ndarray>(python_coords[2]),
355 bp::extract<np::ndarray>(python_normals[0]),
356 bp::extract<np::ndarray>(python_normals[1]),
357 bp::extract<np::ndarray>(python_normals[2]), block_id,
359 "Failed python call");
361 double *hess_ptr =
reinterpret_cast<double *
>(np_hess_sdf.get_data());
364 m_hess_sdf.resize(6, nb_gauss_pts,
false);
365 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg) {
366 for (
int idx = 0; idx < 6; ++idx)
367 m_hess_sdf(idx, gg) =
368 *(hess_ptr + (6 * gg + idx));
374 m_hess_sdf.resize(6, nb_gauss_pts,
false);
378 auto t_hess_sdf = getFTensor2SymmetricFromMat<3>(m_hess_sdf);
380 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg) {
381 t_hess_sdf(
i,
j) = t_hess_sdf_set(
i,
j);
389 template <
int DIM, IntegrationType I,
typename BoundaryEleOp>
392 template <
int DIM, IntegrationType I,
typename BoundaryEleOp>
395 template <
int DIM, IntegrationType I,
typename AssemblyBoundaryEleOp>
398 template <
int DIM, IntegrationType I,
typename AssemblyBoundaryEleOp>
401 template <
int DIM, IntegrationType I,
typename AssemblyBoundaryEleOp>
404 template <
typename T1,
typename T2,
int DIM1,
int DIM2>
407 size_t nb_gauss_pts) {
409 m_spatial_coords.clear();
410 auto t_spatial_coords = getFTensor1FromPtr<3>(&m_spatial_coords(0, 0));
412 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
413 t_spatial_coords(
i) = t_coords(
i) + t_disp(
i);
418 return m_spatial_coords;
421 template <
typename T1,
int DIM1>
423 size_t nb_gauss_pts) {
425 m_normals_at_pts.clear();
427 auto t_set_normal = getFTensor1FromMat<3>(m_normals_at_pts);
428 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
429 t_set_normal(
i) = t_normal_at_pts(
i) / t_normal_at_pts.l2();
433 return m_normals_at_pts;
436 template <
int DIM,
typename BoundaryEleOp>
440 boost::shared_ptr<CommonData> common_data_ptr,
double scale = 1,
450 template <
int DIM,
typename BoundaryEleOp>
465 template <
int DIM,
typename AssemblyBoundaryEleOp>
469 boost::shared_ptr<CommonData> common_data_ptr,
482 template <
int DIM,
typename AssemblyBoundaryEleOp>
486 const std::string col_field_name,
487 boost::shared_ptr<CommonData> common_data_ptr,
502 template <
int DIM,
typename AssemblyBoundaryEleOp>
506 const std::string row_field_name,
const std::string col_field_name,
507 boost::shared_ptr<CommonData> common_data_ptr,
523 template <
int DIM, IntegrationType I>
527 template <
int DIM, IntegrationType I>
535 template <
int DIM, IntegrationType I>
539 template <
int DIM, IntegrationType I>
543 template <
int DIM, IntegrationType I>
550 constexpr
auto eps = std::numeric_limits<float>::epsilon();
551 if (std::abs(x) <
eps)
559 inline double w(
const double sdf,
const double tn) {
577 template <
int DIM,
typename BoundaryEleOp>
578 OpAssembleTotalContactTractionImpl<DIM, GAUSS, BoundaryEleOp>::
579 OpAssembleTotalContactTractionImpl(
580 boost::shared_ptr<CommonData> common_data_ptr,
double scale,
583 commonDataPtr(common_data_ptr), scaleTraction(
scale),
586 template <
int DIM,
typename BoundaryEleOp>
596 auto t_traction = getFTensor1FromMat<DIM>(commonDataPtr->contactTraction);
600 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
601 double jacobian = 1.;
602 if (isAxisymmetric) {
603 jacobian = 2. * M_PI * t_coords(0);
606 t_sum_t(
i) += alpha * t_traction(
i);
612 t_sum_t(
i) *= scaleTraction;
614 constexpr
int ind[] = {0, 1, 2};
621 template <
int DIM,
typename BoundaryEleOp>
623 boost::shared_ptr<CommonData> common_data_ptr)
625 commonDataPtr(common_data_ptr) {}
627 template <
int DIM,
typename BoundaryEleOp>
634 auto &sdf_vec = commonDataPtr->sdfVals;
635 auto &grad_mat = commonDataPtr->gradsSdf;
636 auto &hess_mat = commonDataPtr->hessSdf;
637 auto &constraint_vec = commonDataPtr->constraintVals;
638 auto &contactTraction_mat = commonDataPtr->contactTraction;
640 sdf_vec.resize(nb_gauss_pts,
false);
641 grad_mat.resize(DIM, nb_gauss_pts,
false);
642 hess_mat.resize((DIM * (DIM + 1)) / 2, nb_gauss_pts,
false);
643 constraint_vec.resize(nb_gauss_pts,
false);
645 auto t_traction = getFTensor1FromMat<DIM>(contactTraction_mat);
648 auto t_grad_sdf = getFTensor1FromMat<DIM>(grad_mat);
649 auto t_hess_sdf = getFTensor2SymmetricFromMat<DIM>(hess_mat);
652 auto t_disp = getFTensor1FromMat<DIM>(commonDataPtr->contactDisp);
664 getFTensor1FromMat<DIM>(commonDataPtr->contactDisp), nb_gauss_pts);
672 surfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
673 m_spatial_coords, m_normals_at_pts, block_id);
676 gradSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
677 m_spatial_coords, m_normals_at_pts, block_id);
680 hessSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
681 m_spatial_coords, m_normals_at_pts, block_id);
684 auto t_grad_sdf_v = getFTensor1FromMat<3>(m_grad_sdf);
685 auto t_hess_sdf_v = getFTensor2SymmetricFromMat<3>(m_hess_sdf);
699 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
701 auto tn = -t_traction(
i) * t_grad_sdf_v(
i);
705 t_grad_sdf(
i) = t_grad_sdf_v(
i);
706 t_hess_sdf(
i,
j) = t_hess_sdf_v(
i,
j);
715 template <
int DIM,
typename AssemblyBoundaryEleOp>
718 boost::shared_ptr<CommonData> common_data_ptr,
724 template <
int DIM,
typename AssemblyBoundaryEleOp>
735 const size_t nb_gauss_pts = AssemblyBoundaryEleOp::getGaussPts().size2();
739 auto t_normal_at_pts = AssemblyBoundaryEleOp::getFTensor1NormalsAtGaussPts();
741 auto t_w = AssemblyBoundaryEleOp::getFTensor0IntegrationWeight();
742 auto t_disp = getFTensor1FromMat<DIM>(commonDataPtr->contactDisp);
743 auto t_traction = getFTensor1FromMat<DIM>(commonDataPtr->contactTraction);
744 auto t_coords = AssemblyBoundaryEleOp::getFTensor1CoordsAtGaussPts();
746 size_t nb_base_functions = data.getN().size2() / 3;
747 auto t_base = data.getFTensor1N<3>();
751 getFTensor1FromMat<DIM>(commonDataPtr->contactDisp), nb_gauss_pts);
755 auto t_normal = getFTensor1FromMat<3>(m_normals_at_pts);
757 auto ts_time = AssemblyBoundaryEleOp::getTStime();
758 auto ts_time_step = AssemblyBoundaryEleOp::getTStimeStep();
764 surfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
765 m_spatial_coords, m_normals_at_pts, block_id);
768 gradSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
769 m_spatial_coords, m_normals_at_pts, block_id);
772 auto t_grad_sdf = getFTensor1FromMat<3>(m_grad_sdf);
774 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
776 auto t_nf = getFTensor1FromPtr<DIM>(&nf[0]);
778 double jacobian = 1.;
779 if (isAxisymmetric) {
780 jacobian = 2. * M_PI * t_coords(0);
782 const double alpha = t_w * jacobian * AssemblyBoundaryEleOp::getMeasure();
784 auto tn = -t_traction(
i) * t_grad_sdf(
i);
788 t_cP(
i,
j) = (
c * t_grad_sdf(
i)) * t_grad_sdf(
j);
799 t_cP(
i,
j) * t_disp(
j) +
800 c * (t_sdf * t_grad_sdf(
i));
804 const double beta = alpha * (t_base(
i) * t_normal(
i));
805 t_nf(
i) -= beta * t_rhs(
i);
810 for (; bb < nb_base_functions; ++bb)
825 template <
int DIM,
typename AssemblyBoundaryEleOp>
828 const std::string col_field_name,
829 boost::shared_ptr<CommonData> common_data_ptr,
834 AssemblyBoundaryEleOp::sYmm =
false;
837 template <
int DIM,
typename AssemblyBoundaryEleOp>
848 const size_t nb_gauss_pts = AssemblyBoundaryEleOp::getGaussPts().size2();
851 auto t_normal_at_pts = AssemblyBoundaryEleOp::getFTensor1NormalsAtGaussPts();
852 auto t_traction = getFTensor1FromMat<DIM>(commonDataPtr->contactTraction);
853 auto t_coords = AssemblyBoundaryEleOp::getFTensor1CoordsAtGaussPts();
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;
863 getFTensor1FromMat<DIM>(commonDataPtr->contactDisp), nb_gauss_pts);
867 auto t_normal = getFTensor1FromMat<3>(m_normals_at_pts);
869 auto ts_time = AssemblyBoundaryEleOp::getTStime();
870 auto ts_time_step = AssemblyBoundaryEleOp::getTStimeStep();
876 surfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
877 m_spatial_coords, m_normals_at_pts, block_id);
880 gradSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
881 m_spatial_coords, m_normals_at_pts, block_id);
884 hessSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
885 m_spatial_coords, m_normals_at_pts, block_id);
888 auto t_grad_sdf = getFTensor1FromMat<3>(m_grad_sdf);
889 auto t_hess_sdf = getFTensor2SymmetricFromMat<3>(m_hess_sdf);
891 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
893 double jacobian = 1.;
894 if (isAxisymmetric) {
895 jacobian = 2. * M_PI * t_coords(0);
897 const double alpha = t_w * jacobian * AssemblyBoundaryEleOp::getMeasure();
899 auto tn = -t_traction(
i) * t_grad_sdf(
i);
903 t_cP(
i,
j) = (
c * t_grad_sdf(
i)) * t_grad_sdf(
j);
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);
921 auto t_mat = getFTensor2FromArray<DIM, DIM, DIM>(locMat, DIM * rr);
923 const double row_base = t_row_base(
i) * t_normal(
i);
925 auto t_col_base = col_data.getFTensor0N(gg, 0);
927 const double beta = alpha * row_base * t_col_base;
929 t_mat(
i,
j) -= beta * t_res_dU(
i,
j);
937 for (; rr < nb_face_functions; ++rr)
952 template <
int DIM,
typename AssemblyBoundaryEleOp>
955 const std::string row_field_name,
const std::string col_field_name,
960 AssemblyBoundaryEleOp::sYmm =
false;
963 template <
int DIM,
typename AssemblyBoundaryEleOp>
974 const size_t nb_gauss_pts = AssemblyBoundaryEleOp::getGaussPts().size2();
977 auto t_normal_at_pts = AssemblyBoundaryEleOp::getFTensor1NormalsAtGaussPts();
978 auto t_traction = getFTensor1FromMat<DIM>(commonDataPtr->contactTraction);
979 auto t_coords = AssemblyBoundaryEleOp::getFTensor1CoordsAtGaussPts();
981 auto t_w = AssemblyBoundaryEleOp::getFTensor0IntegrationWeight();
982 auto t_row_base = row_data.getFTensor1N<3>();
983 size_t nb_face_functions = row_data.getN().size2() / 3;
987 getFTensor1FromMat<DIM>(commonDataPtr->contactDisp), nb_gauss_pts);
991 auto t_normal = getFTensor1FromMat<3>(m_normals_at_pts);
993 auto ts_time = AssemblyBoundaryEleOp::getTStime();
994 auto ts_time_step = AssemblyBoundaryEleOp::getTStimeStep();
1000 surfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
1001 m_spatial_coords, m_normals_at_pts, block_id);
1004 gradSurfaceDistanceFunction(ts_time_step, ts_time, nb_gauss_pts,
1005 m_spatial_coords, m_normals_at_pts, block_id);
1008 auto t_grad_sdf = getFTensor1FromMat<3>(m_grad_sdf);
1010 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
1012 double jacobian = 1.;
1013 if (isAxisymmetric) {
1014 jacobian = 2. * M_PI * t_coords(0);
1016 const double alpha = t_w * jacobian * AssemblyBoundaryEleOp::getMeasure();
1018 auto tn = -t_traction(
i) * t_grad_sdf(
i);
1022 t_cP(
i,
j) = (
c * t_grad_sdf(
i)) * t_grad_sdf(
j);
1032 auto t_mat = getFTensor2FromArray<DIM, DIM, DIM>(locMat, DIM * rr);
1033 const double row_base = t_row_base(
i) * t_normal(
i);
1035 auto t_col_base = col_data.getFTensor1N<3>(gg, 0);
1037 const double col_base = t_col_base(
i) * t_normal(
i);
1038 const double beta = alpha * row_base * col_base;
1040 t_mat(
i,
j) -= beta * t_res_dt(
i,
j);
1048 for (; rr < nb_face_functions; ++rr)
1062 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1064 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1068 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1069 A>::template LinearForm<I>;
1070 using OpMixDivURhs =
typename B::template OpMixDivTimesU<3, DIM, DIM>;
1071 using OpMixDivUCylRhs =
1072 typename B::template OpMixDivTimesU<3, DIM, DIM, CYLINDRICAL>;
1074 using OpMixLambdaGradURhs =
typename B::template OpMixTensorTimesGradU<DIM>;
1075 using OpMixUTimesDivLambdaRhs =
1076 typename B::template OpMixVecTimesDivLambda<SPACE_DIM>;
1077 using OpMixUTimesLambdaRhs =
1080 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
1081 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
1082 auto div_stress_ptr = boost::make_shared<MatrixDouble>();
1083 auto contact_stress_ptr = boost::make_shared<MatrixDouble>();
1088 return 2. * M_PI *
r;
1093 pip.push_back(
new OpCalculateVectorFieldValues<DIM>(
1094 u, common_data_ptr->contactDispPtr()));
1096 new OpCalculateHVecTensorField<DIM, DIM>(sigma, contact_stress_ptr));
1100 new OpCalculateHVecTensorDivergence<DIM, DIM>(sigma, div_stress_ptr));
1102 pip.push_back(
new OpCalculateHVecTensorDivergence<DIM, DIM, CYLINDRICAL>(
1103 sigma, div_stress_ptr));
1110 new OpMixDivURhs(sigma, common_data_ptr->contactDispPtr(), jacobian));
1112 pip.push_back(
new OpMixDivUCylRhs(sigma, common_data_ptr->contactDispPtr(),
1116 pip.push_back(
new OpMixLambdaGradURhs(sigma, mat_grad_ptr, jacobian));
1117 pip.push_back(
new OpMixUTimesDivLambdaRhs(u, div_stress_ptr, jacobian));
1118 pip.push_back(
new OpMixUTimesLambdaRhs(u, contact_stress_ptr, jacobian));
1124 using OpMixLhs::OpMixLhs;
1126 EntityType col_type,
1130 auto side_fe_entity = OpMixLhs::getSidePtrFE()->getFEEntityHandle();
1131 auto side_fe_data = OpMixLhs::getSideEntity(row_side, row_type);
1133 if (side_fe_entity == side_fe_data) {
1134 CHKERR OpMixLhs::doWork(row_side, col_side, row_type, col_type, row_data,
1141 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEle>
1144 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1145 std::string fe_domain_name, std::string sigma, std::string u,
1146 std::string geom, ForcesAndSourcesCore::RuleHookFun rule,
1152 auto op_loop_side =
new OpLoopSide<DomainEle>(
1153 m_field, fe_domain_name, DIM, Sev::noisy,
1154 boost::make_shared<ForcesAndSourcesCore::UserDataOperator::AdjCache>());
1155 pip.push_back(op_loop_side);
1157 CHKERR AddHOOps<DIM, DIM, DIM>::add(op_loop_side->getOpPtrVector(),
1160 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1163 using OpMixDivULhs =
typename B::template OpMixDivTimesVec<DIM>;
1164 using OpMixDivUCylLhs =
1165 typename B::template OpMixDivTimesVec<DIM, CYLINDRICAL>;
1166 using OpLambdaGraULhs =
typename B::template OpMixTensorTimesGrad<DIM>;
1172 auto unity = []() {
return 1; };
1176 return 2. * M_PI *
r;
1182 op_loop_side->getOpPtrVector().push_back(
1183 new OpMixDivULhsSide(sigma, u, unity, jacobian,
true));
1185 op_loop_side->getOpPtrVector().push_back(
1186 new OpMixDivUCylLhsSide(sigma, u, unity, jacobian,
true));
1188 op_loop_side->getOpPtrVector().push_back(
1189 new OpLambdaGraULhsSide(sigma, u, unity, jacobian,
true));
1191 op_loop_side->getSideFEPtr()->getRuleHook = rule;
1195 template <
int DIM, AssemblyType A, IntegrationType I,
typename BoundaryEleOp>
1197 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1203 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
1205 pip.push_back(
new OpCalculateVectorFieldValues<DIM>(
1206 u, common_data_ptr->contactDispPtr()));
1207 pip.push_back(
new OpCalculateHVecTensorTrace<DIM, BoundaryEleOp>(
1208 sigma, common_data_ptr->contactTractionPtr()));
1210 new typename C::template Assembly<A>::template OpConstrainBoundaryLhs_dU<
1212 pip.push_back(
new typename C::template Assembly<A>::
1213 template OpConstrainBoundaryLhs_dTraction<DIM, GAUSS>(
1219 template <
int DIM, AssemblyType A, IntegrationType I,
typename BoundaryEleOp>
1221 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1227 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
1229 pip.push_back(
new OpCalculateVectorFieldValues<DIM>(
1230 u, common_data_ptr->contactDispPtr()));
1231 pip.push_back(
new OpCalculateHVecTensorTrace<DIM, BoundaryEleOp>(
1232 sigma, common_data_ptr->contactTractionPtr()));
1234 new typename C::template Assembly<A>::template OpConstrainBoundaryRhs<
1240 template <
int DIM, IntegrationType I,
typename BoundaryEleOp>
1242 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1248 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
1249 pip.push_back(
new OpCalculateHVecTensorTrace<DIM, BoundaryEleOp>(
1250 sigma, common_data_ptr->contactTractionPtr()));
1251 pip.push_back(
new typename C::template OpAssembleTotalContactTraction<DIM, I>(
1259 #endif // __CONTACTOPS_HPP__