37 #ifndef GETFEM_CONTACT_AND_FRICTION_INTEGRAL_H__
38 #define GETFEM_CONTACT_AND_FRICTION_INTEGRAL_H__
66 (model &md,
const mesh_im &mim,
const std::string &varname_u,
67 const std::string &multname_n,
const std::string &dataname_obs,
68 const std::string &dataname_r,
size_type region,
int option = 1);
102 (model &md,
const mesh_im &mim,
const std::string &varname_u,
103 const std::string &multname,
const std::string &dataname_obs,
104 const std::string &dataname_r,
const std::string &dataname_friction_coeffs,
105 size_type region,
int option = 1,
const std::string &dataname_alpha =
"",
106 const std::string &dataname_wt =
"",
107 const std::string &dataname_gamma =
"",
108 const std::string &dataname_vt =
"");
126 (model &md,
const mesh_im &mim,
const std::string &varname_u,
127 const std::string &dataname_obs,
const std::string &dataname_r,
128 size_type region,
int option = 1,
const std::string &dataname_lambda_n =
"");
154 (model &md,
const mesh_im &mim,
const std::string &varname_u,
155 const std::string &dataname_obs,
const std::string &dataname_r,
156 const std::string &dataname_friction_coeffs,
157 size_type region,
int option = 1,
const std::string &dataname_lambda =
"",
158 const std::string &dataname_alpha =
"",
159 const std::string &dataname_wt =
"");
182 (model &md,
const mesh_im &mim,
const std::string &varname_u1,
183 const std::string &varname_u2,
const std::string &multname_n,
184 const std::string &dataname_r,
218 (model &md,
const mesh_im &mim,
const std::string &varname_u1,
219 const std::string &varname_u2,
const std::string &multname,
220 const std::string &dataname_r,
const std::string &dataname_friction_coeffs,
222 const std::string &dataname_alpha =
"",
223 const std::string &dataname_wt1 =
"",
224 const std::string &dataname_wt2 =
"");
240 (model &md,
const mesh_im &mim,
const std::string &varname_u1,
241 const std::string &varname_u2,
const std::string &dataname_r,
243 int option = 1,
const std::string &dataname_lambda_n =
"");
269 (model &md,
const mesh_im &mim,
const std::string &varname_u1,
270 const std::string &varname_u2,
const std::string &dataname_r,
271 const std::string &dataname_friction_coeffs,
273 const std::string &dataname_lambda =
"",
274 const std::string &dataname_alpha =
"",
275 const std::string &dataname_wt1 =
"",
276 const std::string &dataname_wt2 =
"");
279 enum contact_nonlinear_term_version { RHS_L_V1,
304 UZAWA_PROJ_FRICT_SAXCE,
326 class contact_nonlinear_term :
public nonlinear_elem_term {
332 base_small_vector lnt, lt;
334 base_small_vector zt;
337 base_small_vector no;
342 scalar_type tresca_lim;
346 base_small_vector aux1, auxN, V;
349 void adjust_tensor_size(
void);
358 bgeot::multi_index sizes_;
360 contact_nonlinear_term(dim_type N_,
size_type option_, scalar_type r_,
361 bool contact_only_ =
true,
362 scalar_type alpha_ = scalar_type(1)) :
363 tau_adh(0), tresca_lim(gmm::default_max(scalar_type())),
364 N(N_), option(option_), r(r_), contact_only(contact_only_),
alpha(alpha_) {
366 adjust_tensor_size();
369 const bgeot::multi_index &sizes(
size_type)
const {
return sizes_; }
371 virtual void friction_law(scalar_type p, scalar_type &tau);
372 virtual void friction_law(scalar_type p, scalar_type &tau, scalar_type &tau_grad);
374 virtual void compute(fem_interpolation_context&, bgeot::base_tensor &t);
375 virtual void prepare(fem_interpolation_context& ,
size_type )
376 { GMM_ASSERT1(
false,
"the prepare method has to be reimplemented in "
377 "a derived class"); }
382 class contact_rigid_obstacle_nonlinear_term :
public contact_nonlinear_term {
385 base_small_vector vt;
391 const mesh_fem &mf_u;
392 const mesh_fem &mf_obs;
393 const mesh_fem *pmf_lambda;
394 const mesh_fem *pmf_coeff;
395 base_vector U, obs, lambda, friction_coeff, tau_adhesion, tresca_limit, WT, VT;
398 template <
typename VECT1>
399 contact_rigid_obstacle_nonlinear_term
401 const mesh_fem &mf_u_,
const VECT1 &U_,
402 const mesh_fem &mf_obs_,
const VECT1 &obs_,
403 const mesh_fem *pmf_lambda_ = 0,
const VECT1 *lambda_ = 0,
404 const mesh_fem *pmf_coeff_ = 0,
const VECT1 *f_coeffs_ = 0,
405 scalar_type alpha_ = scalar_type(1),
const VECT1 *WT_ = 0,
406 scalar_type gamma_ = scalar_type(1),
const VECT1 *VT_ = 0
408 : contact_nonlinear_term(mf_u_.linked_mesh().dim(), option_, r_,
409 (f_coeffs_ == 0), alpha_
411 mf_u(mf_u_), mf_obs(mf_obs_),
412 pmf_lambda(pmf_lambda_), pmf_coeff(pmf_coeff_),
413 U(mf_u.nb_basic_dof()), obs(mf_obs.nb_basic_dof()),
414 lambda(0), friction_coeff(0), tau_adhesion(0), tresca_limit(0),
415 WT(0), VT(0), gamma(gamma_)
418 mf_u.extend_vector(U_, U);
419 mf_obs.extend_vector(obs_, obs);
422 lambda.resize(pmf_lambda->nb_basic_dof());
423 pmf_lambda->extend_vector(*lambda_, lambda);
428 f_coeff = (*f_coeffs_)[0];
429 if (gmm::vect_size(*f_coeffs_) > 1) tau_adh = (*f_coeffs_)[1];
430 if (gmm::vect_size(*f_coeffs_) > 2) tresca_lim = (*f_coeffs_)[2];
433 size_type ncoeffs = gmm::vect_size(*f_coeffs_)/pmf_coeff->nb_dof();
434 GMM_ASSERT1(ncoeffs >= 1 && ncoeffs <= 3,
"Wrong vector dimension for friction coefficients");
435 gmm::resize(friction_coeff, pmf_coeff->nb_basic_dof());
436 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(0,pmf_coeff->nb_dof(),ncoeffs)),
439 gmm::resize(tau_adhesion, pmf_coeff->nb_basic_dof());
440 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(1,pmf_coeff->nb_dof(),ncoeffs)),
444 gmm::resize(tresca_limit, pmf_coeff->nb_basic_dof());
445 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(2,pmf_coeff->nb_dof(),ncoeffs)),
450 if (WT_ && gmm::vect_size(*WT_)) {
451 WT.resize(mf_u.nb_basic_dof());
452 mf_u.extend_vector(*WT_, WT);
455 if (VT_ && gmm::vect_size(*VT_)) {
456 VT.resize(mf_u.nb_basic_dof());
457 mf_u.extend_vector(*VT_, VT);
464 GMM_ASSERT1(mf_u.get_qdim() == N,
"wrong qdim for the mesh_fem");
469 virtual void prepare(fem_interpolation_context& ctx,
size_type nb);
474 class contact_nonmatching_meshes_nonlinear_term :
public contact_nonlinear_term {
481 const mesh_fem &mf_u1;
482 const mesh_fem &mf_u2;
483 const mesh_fem *pmf_lambda;
484 const mesh_fem *pmf_coeff;
485 base_vector U1, U2, lambda, friction_coeff, tau_adhesion, tresca_limit, WT1, WT2;
487 template <
typename VECT1>
488 contact_nonmatching_meshes_nonlinear_term
490 const mesh_fem &mf_u1_,
const VECT1 &U1_,
491 const mesh_fem &mf_u2_,
const VECT1 &U2_,
492 const mesh_fem *pmf_lambda_ = 0,
const VECT1 *lambda_ = 0,
493 const mesh_fem *pmf_coeff_ = 0,
const VECT1 *f_coeffs_ = 0,
494 scalar_type alpha_ = scalar_type(1),
495 const VECT1 *WT1_ = 0,
const VECT1 *WT2_ = 0
497 : contact_nonlinear_term(mf_u1_.linked_mesh().dim(), option_, r_,
498 (f_coeffs_ == 0), alpha_
500 mf_u1(mf_u1_), mf_u2(mf_u2_),
501 pmf_lambda(pmf_lambda_), pmf_coeff(pmf_coeff_),
502 U1(mf_u1.nb_basic_dof()), U2(mf_u2.nb_basic_dof()),
503 lambda(0), friction_coeff(0), tau_adhesion(0), tresca_limit(0),
507 GMM_ASSERT1(mf_u2.linked_mesh().dim() == N,
508 "incompatible mesh dimensions for the given mesh_fem's");
510 mf_u1.extend_vector(U1_, U1);
511 mf_u2.extend_vector(U2_, U2);
514 lambda.resize(pmf_lambda->nb_basic_dof());
515 pmf_lambda->extend_vector(*lambda_, lambda);
520 f_coeff = (*f_coeffs_)[0];
521 if (gmm::vect_size(*f_coeffs_) > 1) tau_adh = (*f_coeffs_)[1];
522 if (gmm::vect_size(*f_coeffs_) > 2) tresca_lim = (*f_coeffs_)[2];
525 size_type ncoeffs = gmm::vect_size(*f_coeffs_)/pmf_coeff->nb_dof();
526 GMM_ASSERT1(ncoeffs >= 1 && ncoeffs <= 3,
"Wrong vector dimension for friction coefficients");
527 gmm::resize(friction_coeff, pmf_coeff->nb_basic_dof());
528 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(0,pmf_coeff->nb_dof(),ncoeffs)),
531 gmm::resize(tau_adhesion, pmf_coeff->nb_basic_dof());
532 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(1,pmf_coeff->nb_dof(),ncoeffs)),
536 gmm::resize(tresca_limit, pmf_coeff->nb_basic_dof());
537 pmf_coeff->extend_vector(gmm::sub_vector(*f_coeffs_, gmm::sub_slice(2,pmf_coeff->nb_dof(),ncoeffs)),
541 if (WT1_ && WT2_ && gmm::vect_size(*WT1_) && gmm::vect_size(*WT2_)) {
542 WT1.resize(mf_u1.nb_basic_dof());
543 mf_u1.extend_vector(*WT1_, WT1);
544 WT2.resize(mf_u2.nb_basic_dof());
545 mf_u2.extend_vector(*WT2_, WT2);
551 GMM_ASSERT1(mf_u1.get_qdim() == N,
"wrong qdim for the 1st mesh_fem");
552 GMM_ASSERT1(mf_u2.get_qdim() == N,
"wrong qdim for the 2nd mesh_fem");
557 virtual void prepare(fem_interpolation_context& ctx,
size_type nb);
565 template<
typename VECT1>
572 scalar_type r, scalar_type alpha,
const mesh_region &rg,
int option = 1) {
574 contact_rigid_obstacle_nonlinear_term
575 nterm1((option == 1) ? UZAWA_PROJ_FRICT : UZAWA_PROJ_FRICT_SAXCE, r,
576 mf_u, U, mf_obs, obs, &mf_lambda, &lambda,
577 pmf_coeff, &f_coeff, alpha, WT);
581 assem.set(
"V(#3)+=comp(NonLin$1(#1,#1,#2,#3,#4).vBase(#3))(i,:,i); ");
583 assem.set(
"V(#3)+=comp(NonLin$1(#1,#1,#2,#3).vBase(#3))(i,:,i); ");
598 template<
typename VECT1>
606 contact_rigid_obstacle_nonlinear_term
607 nterm1(UZAWA_PROJ, r, mf_u, U, mf_obs, obs, &mf_lambda, &lambda);
610 assem.set(
"V(#3)+=comp(NonLin$1(#1,#1,#2,#3).Base(#3))(i,:); ");
624 template<
typename VEC>
632 bool contact_only = (mf_lambda.
get_qdim() == 1);
635 gmm::resize(U, mf_u.
nb_dof());
636 scalar_type dummy_r(0.);
637 VEC dummy_f_coeff; gmm::resize(dummy_f_coeff,1);
638 contact_rigid_obstacle_nonlinear_term
639 nterm(RHS_U_V1, dummy_r, mf_u, U, mf_obs, obs, &mf_lambda, &lambda,
640 0, contact_only ? 0 : &dummy_f_coeff);
643 assem.set(
"V(#1)+=comp(NonLin$1(#1,#1,#2,#3).vBase(#1))(i,:,i); ");
653 template<
typename VEC>
654 scalar_type asm_level_set_contact_area
658 const mesh_region &rg, scalar_type threshold_factor=0.0,
660 scalar_type threshold_pressure_factor=0.0) {
662 if (!rg.get_parent_mesh())
663 rg.from_mesh(mim.linked_mesh());
665 mf_ca.set_classical_finite_element(rg.index(),1);
667 VEC mesh_size(mf_ca.nb_dof());
668 VEC mesh_size2(mf_ca.nb_dof());
671 assem_mesh_size.set(
"V(#1)+=comp(Base(#1))");
673 assem_mesh_size.
push_mf(mf_ca);
674 assem_mesh_size.
push_vec(mesh_size2);
676 for (dal::bv_visitor_c dof(mf_ca.basic_dof_on_region(rg));
677 !dof.finished(); ++dof)
678 mesh_size[dof] = sqrt(mesh_size2[dof]);
681 VEC threshold(mf_ca.nb_dof());
682 if (mf_lambda && lambda) {
683 VEC pressure(mf_ca.nb_dof());
684 VEC dummy_f_coeff(1);
685 bool contact_only = (mf_lambda->get_qdim() == 1);
686 contact_rigid_obstacle_nonlinear_term
687 nterm_pressure(CONTACT_PRESSURE, 0., mf_u, U, mf_obs, obs,
688 mf_lambda, lambda, 0, contact_only ? 0 : &dummy_f_coeff);
691 assem_pressure.set(
"V(#4)+=comp(NonLin(#1,#1,#2,#3).Base(#4))(i,:)");
694 assem_pressure.
push_mf(mf_obs);
695 assem_pressure.
push_mf(*mf_lambda);
700 for (dal::bv_visitor_c dof(mf_ca.basic_dof_on_region(rg));
701 !dof.finished(); ++dof)
702 pressure[dof] /= mesh_size2[dof];
706 scalar_type threshold_pressure(threshold_pressure_factor *
707 gmm::vect_norminf(pressure));
708 gmm::copy(gmm::scaled(mesh_size, scalar_type(-1)), threshold);
710 size_type nbdof = mf_ca.nb_basic_dof_of_face_of_element(v.cv(), v.f());
711 mesh_fem::ind_dof_face_ct::const_iterator
712 itdof = mf_ca.ind_basic_dof_of_face_of_element(v.cv(), v.f()).begin();
713 bool all_positive =
true;
714 for (
size_type k=0; k < nbdof; ++k, ++itdof)
715 if (pressure[*itdof] < threshold_pressure) { all_positive =
false;
break; }
717 itdof = mf_ca.ind_basic_dof_of_face_of_element(v.cv(), v.f()).begin();
718 for (
size_type k=0; k < nbdof; ++k, ++itdof)
719 threshold[*itdof] = threshold_factor * mesh_size[*itdof];
724 gmm::copy(gmm::scaled(mesh_size, threshold_factor), threshold);
728 contact_rigid_obstacle_nonlinear_term
729 nterm(CONTACT_FLAG, 0., mf_u, U, mf_obs, obs, &mf_ca, &threshold);
732 assem.set(
"V()+=comp(NonLin(#1,#1,#2,#3))(i)");
738 std::vector<scalar_type> v(1);
745 template<
typename VEC>
746 void asm_nonmatching_meshes_normal_source_term
747 (VEC &R,
const mesh_im &mim,
751 const mesh_region &rg) {
753 bool contact_only = (mf_lambda.
get_qdim() == 1);
758 scalar_type dummy_r(0);
760 contact_nonmatching_meshes_nonlinear_term
761 nterm(RHS_U_V1, dummy_r, mf_u1, U1, mf_u2_proj, U2_proj, &mf_lambda, &lambda,
762 0, contact_only ? 0 : &dummy_f_coeff);
765 assem.set(
"V(#1)+=comp(NonLin(#1,#1,#2,#3).vBase(#1))(i,:,i)");
775 template<
typename VEC>
776 scalar_type asm_nonmatching_meshes_contact_area
780 const mesh_region &rg, scalar_type threshold_factor=0.0,
782 scalar_type threshold_pressure_factor=0.0) {
784 if (!rg.get_parent_mesh())
785 rg.from_mesh(mim.linked_mesh());
787 mf_ca.set_classical_finite_element(rg.index(),1);
789 VEC mesh_size(mf_ca.nb_dof());
790 VEC mesh_size2(mf_ca.nb_dof());
793 assem_mesh_size.set(
"V(#1)+=comp(Base(#1))");
795 assem_mesh_size.
push_mf(mf_ca);
796 assem_mesh_size.
push_vec(mesh_size2);
798 for (dal::bv_visitor_c dof(mf_ca.basic_dof_on_region(rg));
799 !dof.finished(); ++dof)
800 mesh_size[dof] = sqrt(mesh_size2[dof]);
803 VEC threshold(mf_ca.nb_dof());
804 if (mf_lambda && lambda) {
805 VEC pressure(mf_ca.nb_dof());
806 VEC dummy_f_coeff(1);
807 bool contact_only = (mf_lambda->
get_qdim() == 1);
808 contact_nonmatching_meshes_nonlinear_term
809 nterm_pressure(CONTACT_PRESSURE, 0., mf_u1, U1, mf_u2_proj, U2_proj,
810 mf_lambda, lambda, 0, contact_only ? 0 : &dummy_f_coeff);
813 assem_pressure.set(
"V(#4)+=comp(NonLin(#1,#1,#2,#3).Base(#4))(i,:)");
816 assem_pressure.
push_mf(mf_u2_proj);
817 assem_pressure.
push_mf(*mf_lambda);
822 for (dal::bv_visitor_c dof(mf_ca.basic_dof_on_region(rg));
823 !dof.finished(); ++dof)
824 pressure[dof] /= mesh_size2[dof];
828 scalar_type threshold_pressure(threshold_pressure_factor *
829 gmm::vect_norminf(pressure));
830 gmm::copy(gmm::scaled(mesh_size, scalar_type(-1)), threshold);
832 size_type nbdof = mf_ca.nb_basic_dof_of_face_of_element(v.cv(), v.f());
833 mesh_fem::ind_dof_face_ct::const_iterator
834 itdof = mf_ca.ind_basic_dof_of_face_of_element(v.cv(), v.f()).begin();
835 bool all_positive =
true;
836 for (
size_type k=0; k < nbdof; ++k, ++itdof)
837 if (pressure[*itdof] < threshold_pressure) { all_positive =
false;
break; }
839 itdof = mf_ca.ind_basic_dof_of_face_of_element(v.cv(), v.f()).begin();
840 for (
size_type k=0; k < nbdof; ++k, ++itdof)
841 threshold[*itdof] = threshold_factor * mesh_size[*itdof];
846 gmm::copy(gmm::scaled(mesh_size, threshold_factor), threshold);
851 contact_nonmatching_meshes_nonlinear_term
852 nterm(CONTACT_FLAG, 0., mf_u1, U1, mf_u2_proj, U2_proj, &mf_ca, &threshold);
855 assem.set(
"V()+=comp(NonLin(#1,#1,#2,#3))(i)");
861 std::vector<scalar_type> v(1);
868 void compute_integral_contact_area_and_force
870 scalar_type &area, model_real_plain_vector &Forces);
896 (model &md,
const mesh_im &mim,
const std::string &varname_u,
897 const std::string &Neumannterm,
898 const std::string &expr_obs,
const std::string &dataname_gamma0,
900 std::string dataexpr_friction_coeff,
901 const std::string &dataname_alpha,
902 const std::string &dataname_wt,
905 #ifdef EXPERIMENTAL_PURPOSE_ONLY
924 size_type add_Nitsche_contact_with_rigid_obstacle_brick_modified_midpoint
925 (model &md,
const mesh_im &mim,
const std::string &varname_u,
926 const std::string &Neumannterm,
const std::string &Neumannterm_wt,
927 const std::string &obs,
const std::string &dataname_gamma0,
929 std::string dataname_friction_coeff,
930 const std::string &dataname_alpha,
931 const std::string &dataname_wt,
962 (
model &md,
const mesh_im &mim,
const std::string &varname_u1,
963 const std::string &varname_u2,
const std::string &dataname_d1,
964 const std::string &dataname_d2,
const std::string &dataname_gamma0,
966 const std::string &dataname_friction_coeff,
967 const std::string &dataname_alpha,
968 const std::string &dataname_wt1,
const std::string &dataname_wt2);
Generic assembly of vectors, matrices.
void push_vec(VEC &v)
Add a new output vector.
void assembly(const mesh_region ®ion=mesh_region::all_convexes())
do the assembly on the specified region (boundary or set of convexes)
void push_nonlinear_term(pnonlinear_elem_term net)
Add a new non-linear term.
void push_mi(const mesh_im &im_)
Add a new mesh_im.
void push_mf(const mesh_fem &mf_)
Add a new mesh_fem.
Describe a finite element method linked to a mesh.
virtual dim_type get_qdim() const
Return the Q dimension.
virtual size_type nb_dof() const
Return the total number of degrees of freedom.
const mesh & linked_mesh() const
Return a reference to the underlying mesh.
Describe an integration method linked to a mesh.
"iterator" class for regions.
structure used to hold a set of convexes and/or convex faces.
`‘Model’' variables store the variables, the data and the description of a model.
Generic assembly implementation.
Model representation in Getfem.
void copy(const L1 &l1, L2 &l2)
*/
void resize(V &v, size_type n)
*/
size_t size_type
used as the common size type in the library
size_type alpha(short_type n, short_type d)
Return the value of which is the number of monomials of a polynomial of variables and degree .
GEneric Tool for Finite Element Methods.
size_type add_integral_contact_between_nonmatching_meshes_brick(model &md, const mesh_im &mim, const std::string &varname_u1, const std::string &varname_u2, const std::string &multname_n, const std::string &dataname_r, size_type region1, size_type region2, int option=1)
Add a frictionless contact condition between nonmatching meshes to the model.
size_type add_integral_contact_with_rigid_obstacle_brick(model &md, const mesh_im &mim, const std::string &varname_u, const std::string &multname_n, const std::string &dataname_obs, const std::string &dataname_r, size_type region, int option=1)
Add a frictionless contact condition with a rigid obstacle to the model, which is defined in an integ...
size_type add_penalized_contact_with_rigid_obstacle_brick(model &md, const mesh_im &mim, const std::string &varname_u, const std::string &dataname_obs, const std::string &dataname_r, size_type region, int option=1, const std::string &dataname_lambda_n="")
Add a penalized contact frictionless condition with a rigid obstacle to the model.
void asm_level_set_normal_source_term(VEC &R, const mesh_im &mim, const getfem::mesh_fem &mf_u, const getfem::mesh_fem &mf_obs, const VEC &obs, const getfem::mesh_fem &mf_lambda, const VEC &lambda, const mesh_region &rg)
Specific assembly procedure for the use of an Uzawa algorithm to solve contact problems.
size_type add_Nitsche_fictitious_domain_contact_brick(model &md, const mesh_im &mim, const std::string &varname_u1, const std::string &varname_u2, const std::string &dataname_d1, const std::string &dataname_d2, const std::string &dataname_gamma0, scalar_type theta, const std::string &dataname_friction_coeff, const std::string &dataname_alpha, const std::string &dataname_wt1, const std::string &dataname_wt2)
Adds a contact condition with or without Coulomb friction between two bodies in a fictitious domain.
size_type add_penalized_contact_between_nonmatching_meshes_brick(model &md, const mesh_im &mim, const std::string &varname_u1, const std::string &varname_u2, const std::string &dataname_r, size_type region1, size_type region2, int option=1, const std::string &dataname_lambda_n="")
Add a penalized contact frictionless condition between nonmatching meshes to the model.
size_type add_Nitsche_contact_with_rigid_obstacle_brick(model &md, const mesh_im &mim, const std::string &varname_u, const std::string &Neumannterm, const std::string &expr_obs, const std::string &dataname_gamma0, scalar_type theta_, std::string dataexpr_friction_coeff, const std::string &dataname_alpha, const std::string &dataname_wt, size_type region)
Adds a contact condition with or without Coulomb friction on the variable varname_u and the mesh boun...
void asm_integral_contact_Uzawa_proj(VECT1 &R, const mesh_im &mim, const getfem::mesh_fem &mf_u, const VECT1 &U, const getfem::mesh_fem &mf_obs, const VECT1 &obs, const getfem::mesh_fem &mf_lambda, const VECT1 &lambda, const getfem::mesh_fem *pmf_coeff, const VECT1 &f_coeff, const VECT1 *WT, scalar_type r, scalar_type alpha, const mesh_region &rg, int option=1)
Specific assembly procedure for the use of an Uzawa algorithm to solve contact with rigid obstacle pr...