11 #include "SubProblem.h"
18 params.addParam<NonlinearVariableName>(
"slave_disp_y",
19 "The y displacement variable on the slave face");
20 params.addParam<NonlinearVariableName>(
"master_disp_y",
21 "The y displacement variable on the master face");
22 MooseEnum ncp_type(
"min fb",
"min");
23 params.addParam<MooseEnum>(
"ncp_function_type",
25 "The type of the nonlinear complimentarity function; options are "
26 "min or fb where fb stands for Fischer-Burmeister"););
28 template <ComputeStage compute_stage>
30 const InputParameters & parameters)
31 : ADMortarConstraint<compute_stage>(parameters),
32 _slave_disp_y(isParamValid(
"slave_disp_y") ? &this->_subproblem.getStandardVariable(
33 _tid, parameters.getMooseType(
"slave_disp_y"))
36 isParamValid(
"master_disp_y")
37 ? &this->_subproblem.getStandardVariable(_tid, parameters.getMooseType(
"master_disp_y"))
38 : isParamValid(
"slave_disp_y") ? &this->_subproblem.getStandardVariable(
39 _tid, parameters.getMooseType(
"slave_disp_y"))
41 _computing_gap_dependence(false),
42 _slave_disp_y_sln(nullptr),
43 _master_disp_y_sln(nullptr),
44 _epsilon(std::numeric_limits<Real>::epsilon()),
45 _ncp_type(getParam<MooseEnum>(
"ncp_function_type"))
50 "It doesn't make any sense that we have a slave displacement variable and not a "
51 "master displacement variable");
64 case Moose::MortarType::Lower:
68 auto gap_vec = _phys_points_master[_qp] - _phys_points_slave[_qp];
69 auto gap = gap_vec * _normals[_qp];
71 const auto & a = _lambda[_qp];
75 if (_ncp_type ==
"fb")
78 fb_function = a + b - std::sqrt(a * a + b * b + _epsilon);
80 fb_function = std::min(a, b);
82 return _test[_i][_qp] * fb_function;
85 return _test[_i][_qp] * _lambda[_qp];
99 case Moose::MortarType::Lower:
103 DualRealVectorValue gap_vec = _phys_points_master[_qp] - _phys_points_slave[_qp];
104 if (_computing_gap_dependence)
108 gap_vec(0).derivatives() = _u_master[_qp].derivatives() - _u_slave[_qp].derivatives();
109 gap_vec(1).derivatives() =
110 (*_master_disp_y_sln)[_qp].derivatives() - (*_slave_disp_y_sln)[_qp].derivatives();
113 auto gap = gap_vec * _normals[_qp];
115 const auto & a = _lambda[_qp];
116 const auto & b = gap;
118 DualReal fb_function;
119 if (_ncp_type ==
"fb")
122 fb_function = a + b - std::sqrt(a * a + b * b + _epsilon);
124 fb_function = std::min(a, b);
126 return _test[_i][_qp] * fb_function;
129 return _test[_i][_qp] * _lambda[_qp];