12 #include "AddVariableAction.h"
13 #include "FEProblem.h"
14 #include "libmesh/string_to_enum.h"
17 #include "NonlinearSystem.h"
32 params.addClassDescription(
33 "Action that controls the creation of all of the necessary objects for "
34 "calculation of Thermal Contact");
36 params.addParam<std::string>(
39 "A string representing the Moose object that will be used for computing the gap size");
40 params.addRequiredParam<NonlinearVariableName>(
"variable",
"The variable for thermal contact");
41 params.addRequiredParam<BoundaryName>(
"master",
"The master surface");
42 params.addRequiredParam<BoundaryName>(
"slave",
"The slave surface");
43 params.addRangeCheckedParam<Real>(
"tangential_tolerance",
44 "tangential_tolerance>=0",
45 "Tangential distance to extend edges of contact surfaces");
46 params.addRangeCheckedParam<Real>(
47 "normal_smoothing_distance",
48 "normal_smoothing_distance>=0 & normal_smoothing_distance<=1",
49 "Distance from edge in parametric coordinates over which to smooth contact normal");
50 params.addParam<std::string>(
"normal_smoothing_method",
51 "Method to use to smooth normals (edge_based|nodal_normal_based)");
53 MooseEnum orders(AddVariableAction::getNonlinearVariableOrders());
54 params.addParam<MooseEnum>(
"order", orders,
"The finite element order");
56 params.addParam<
bool>(
57 "warnings",
false,
"Whether to output warning messages concerning nodes not being found");
58 params.addParam<
bool>(
59 "quadrature",
false,
"Whether or not to use quadrature point based gap heat transfer");
61 params.addParam<std::string>(
62 "appended_property_name",
"",
"Name appended to material properties to make them unique");
63 params.addRequiredParam<std::string>(
65 "A string representing the Moose object that will be used for heat conduction over the gap");
67 params.addParam<std::vector<VariableName>>(
"disp_x",
"The x displacement");
68 params.addParam<std::vector<VariableName>>(
"disp_y",
"The y displacement");
69 params.addParam<std::vector<VariableName>>(
"disp_z",
"The z displacement");
70 params.addParam<std::vector<VariableName>>(
72 "The displacements appropriate for the simulation geometry and coordinate system");
74 params.addParam<std::vector<AuxVariableName>>(
75 "save_in",
"The Auxiliary Variable to (optionally) save the boundary flux in");
76 params.addRangeCheckedParam<Real>(
"gap_conductivity",
79 "The thermal conductivity of the gap material");
80 params.addParam<FunctionName>(
81 "gap_conductivity_function",
82 "Thermal conductivity of the gap material as a function. Multiplied by gap_conductivity.");
83 params.addParam<std::vector<VariableName>>(
84 "gap_conductivity_function_variable",
85 "Variable to be used in gap_conductivity_function in place of time");
95 _quadrature(getParam<bool>(
"quadrature")),
96 _order(getParam<MooseEnum>(
"order")),
97 _penetration_var_name(_quadrature ?
"qpoint_penetration" :
"penetration"),
98 _gap_value_name(
"paired_" + getParam<NonlinearVariableName>(
"variable")),
99 _gap_conductivity_name(
"paired_k_" + getParam<NonlinearVariableName>(
"variable"))
106 if (_current_task ==
"add_aux_kernel")
108 else if (_current_task ==
"add_aux_variable")
110 else if (_current_task ==
"add_bc")
112 else if (_current_task ==
"add_dirac_kernel")
114 else if (_current_task ==
"add_material")
116 else if (_current_task ==
"add_slave_flux_vector")
125 InputParameters params = _factory.getValidParams(getParam<std::string>(
"gap_aux_type"));
127 params.applySpecificParameters(parameters(),
128 {
"tangential_tolerance",
129 "normal_smoothing_distance",
130 "normal_smoothing_method",
134 params.set<ExecFlagEnum>(
"execute_on",
true) = {EXEC_INITIAL, EXEC_LINEAR};
135 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"slave")};
136 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"master");
137 params.set<VariableName>(
"paired_variable") = getParam<NonlinearVariableName>(
"variable");
139 _problem->addAuxKernel(getParam<std::string>(
"gap_aux_type"),
"gap_value_" +
name(), params);
143 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"master")};
144 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"slave");
146 _problem->addAuxKernel(
147 getParam<std::string>(
"gap_aux_type"),
"gap_value_master_" +
name(), params);
153 InputParameters params = _factory.getValidParams(
"PenetrationAux");
155 params.applySpecificParameters(
157 {
"tangential_tolerance",
"normal_smoothing_distance",
"normal_smoothing_method",
"order"});
159 params.set<ExecFlagEnum>(
"execute_on",
true) = {EXEC_INITIAL, EXEC_LINEAR};
160 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"slave")};
161 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"master");
163 _problem->addAuxKernel(
"PenetrationAux",
"penetration_" +
name(), params);
173 MooseEnum order = getParam<MooseEnum>(
"order");
174 std::string family =
"LAGRANGE";
183 AddVariableAction::determineType(FEType(order, Utility::string_to_enum<FEFamily>(family)), 1);
184 auto var_params = _factory.getValidParams(var_type);
185 var_params.set<MooseEnum>(
"order") = order;
186 var_params.set<MooseEnum>(
"family") = family;
195 const std::string object_name = getParam<std::string>(
"type");
196 InputParameters params = _factory.getValidParams(object_name);
197 params.applyParameters(parameters());
201 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"master");
202 params.set<
bool>(
"use_displaced_mesh") =
true;
206 params.set<std::vector<VariableName>>(
"gap_distance") = {
"penetration"};
210 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"slave")};
212 _problem->addBoundaryCondition(object_name,
"gap_bc_" +
name(), params);
217 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"master")};
218 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"slave");
220 _problem->addBoundaryCondition(object_name,
"gap_bc_master_" +
name(), params);
230 const std::string object_name =
"GapHeatPointSourceMaster";
231 InputParameters params = _factory.getValidParams(object_name);
232 params.applySpecificParameters(parameters(),
233 {
"tangential_tolerance",
234 "normal_smoothing_distance",
235 "normal_smoothing_method",
239 params.set<BoundaryName>(
"boundary") = getParam<BoundaryName>(
"master");
241 _problem->addDiracKernel(object_name, object_name +
"_" +
name(), params);
247 if (getParam<std::string>(
"type") !=
"GapHeatTransfer")
250 if (parameters().isParamSetByUser(
"gap_conductance"))
252 if (parameters().isParamSetByUser(
"gap_conductivity") ||
253 parameters().isParamSetByUser(
"gap_conductivity_function"))
255 "Cannot specify both gap_conductance and gap_conductivity or gap_conductivity_function");
257 const std::string object_type =
"GapConductanceConstant";
258 InputParameters params = _factory.getValidParams(object_type);
259 params.applyParameters(parameters());
260 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"slave")};
261 _problem->addMaterial(object_type,
name() +
"_" +
"gap_value", params);
265 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"master")};
266 _problem->addMaterial(object_type,
name() +
"_" +
"gap_value_master", params);
271 const std::string object_type =
"GapConductance";
273 InputParameters params = _factory.getValidParams(object_type);
274 params.applyParameters(parameters(), {
"variable"});
276 params.set<std::vector<VariableName>>(
"variable") = {
277 getParam<NonlinearVariableName>(
"variable")};
278 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"slave")};
282 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"master");
287 params.set<std::vector<VariableName>>(
"gap_distance") = {
"penetration"};
290 _problem->addMaterial(object_type,
name() +
"_" +
"gap_value", params);
294 params.set<BoundaryName>(
"paired_boundary") = getParam<BoundaryName>(
"slave");
295 params.set<std::vector<BoundaryName>>(
"boundary") = {getParam<BoundaryName>(
"master")};
297 _problem->addMaterial(object_type,
name() +
"_" +
"gap_value_master", params);
305 _problem->getNonlinearSystemBase().addVector(
"slave_flux",
false, GHOSTED);
306 _problem->getNonlinearSystemBase().zeroVectorForResidual(
"slave_flux");
312 if (!_problem->isSNESMFReuseBaseSetbyUser())
313 _problem->setSNESMFReuseBase(
false,
false);