https://mooseframework.inl.gov
Loading...
Searching...
No Matches
GapConductanceStatefulConstraint.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11
13
16{
19 "Computes the residual and Jacobian contributions for the 'Lagrange Multiplier' "
20 "implementation of the thermal contact problem. It pulls an auxiliary variable that acts as "
21 "an old material property recovered at the node using the nodal patch recovery capability.");
22 params.addRequiredParam<Real>("k", "Gap conductance.");
23 params.addCoupledVar(
24 "stateful_variable",
25 "The history variable whose old state we use for the constraint computation.");
26 params.addParam<Real>("min_gap",
27 1e-3,
28 "The minimum gap distance allowed. This helps with preventing the heat "
29 "flux from going to infinity as the gap approaches zero.");
30 params.addCoupledVar("displacements", "Displacement variables.");
31 return params;
32}
33
35 const InputParameters & parameters)
36 : ADMortarConstraint(parameters),
37 _k(getParam<Real>("k")),
38 _min_gap(getParam<Real>("min_gap")),
39 _disp_name(parameters.getVecMooseType("displacements")),
40 _n_disp(_disp_name.size()),
41 _disp_secondary(_n_disp),
42 _disp_primary(_n_disp),
43 _stress_old(isCoupled("stateful_variable") ? coupledValueOld("stateful_variable") : _zero),
44 _stress_neighbor_old(
45 isCoupled("stateful_variable") ? coupledNeighborValueOld("stateful_variable") : _zero)
46{
47 for (unsigned int i = 0; i < _n_disp; ++i)
48 {
49 auto & disp_var = _subproblem.getStandardVariable(_tid, _disp_name[i]);
50 _disp_secondary[i] = &disp_var.adSln();
51 _disp_primary[i] = &disp_var.adSlnNeighbor();
52 }
53}
54
57{
58 using std::max, std::abs;
59
60 switch (mortar_type)
61 {
62 case Moose::MortarType::Primary:
63 return _lambda[_qp] * _test_primary[_i][_qp];
64 case Moose::MortarType::Secondary:
65 return -_lambda[_qp] * _test_secondary[_i][_qp];
66 case Moose::MortarType::Lower:
67 {
68 // we are creating an AD version of phys points primary and secondary here...
69 ADRealVectorValue ad_phys_points_primary = _phys_points_primary[_qp];
70 ADRealVectorValue ad_phys_points_secondary = _phys_points_secondary[_qp];
71
72 // ...which uses the derivative vector of the primary and secondary displacements as
73 // an approximation of the true phys points derivatives when the mesh is displacing
74 if (_displaced)
75 for (unsigned int i = 0; i < _n_disp; ++i)
76 {
77 ad_phys_points_primary(i).derivatives() = (*_disp_primary[i])[_qp].derivatives();
78 ad_phys_points_secondary(i).derivatives() = (*_disp_secondary[i])[_qp].derivatives();
79 }
80
81 auto l = max((ad_phys_points_primary - ad_phys_points_secondary) * _normals[_qp], _min_gap);
82 return (_lambda[_qp] - (_k + abs(_stress_old[_qp] + _stress_neighbor_old[_qp])) *
83 (_u_primary[_qp] - _u_secondary[_qp]) / l) *
84 _test[_i][_qp];
85 }
86
87 default:
88 return 0;
89 }
90}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("CombinedTestApp", GapConductanceStatefulConstraint)
const ADVariableValue & _u_secondary
const ADVariableValue & _lambda
const ADVariableValue & _u_primary
static InputParameters validParams()
unsigned int _qp
unsigned int _i
virtual ADReal computeQpResidual(Moose::MortarType mortar_type) override
Computes the residual for the LM equation, lambda = (k/l)*(T^(1) - PT^(2)).
std::vector< const ADVariableValue * > _disp_primary
const VariableValue & _stress_neighbor_old
Old stress variable (possibly nodally recovered property) on primary surface.
const Real _k
Thermal conductivity of the gap medium (e.g. air).
std::vector< const ADVariableValue * > _disp_secondary
GapConductanceStatefulConstraint(const InputParameters &parameters)
const VariableValue & _stress_old
Old stress variable (possibly nodally recovered property) on secondary surface.
const Real _min_gap
Minimum gap distance allowed.
const std::vector< std::string > _disp_name
Displacement variables.
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void addCoupledVar(const std::string &name, const std::string &doc_string)
const ADTemplateVariableValue< OutputType > & adSln() const override
const VariableTestValue & _test_secondary
const VariableTestValue & _test
const VariableTestValue & _test_primary
const bool _displaced
const MooseArray< Point > & _phys_points_secondary
const MooseArray< Point > & _phys_points_primary
std::vector< Point > _normals
SubProblem & _subproblem
virtual MooseVariable & getStandardVariable(const THREAD_ID tid, const std::string &var_name)=0