https://mooseframework.inl.gov
Loading...
Searching...
No Matches
HeatConductionPhysicsBase.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
14{
16 params.addClassDescription("Add the heat conduction physics");
17
18 params.addParam<VariableName>("temperature_name", "T", "Variable name for the temperature");
19 params.addParam<VariableName>("heat_source_var", "Variable providing the heat source");
20 params.addParam<std::vector<SubdomainName>>("heat_source_blocks",
21 "Block restriction of the heat source");
22 params.addParam<MooseFunctorName>("heat_source_functor", "Functor providing the heat source");
23
24 params.addParam<FunctionName>(
25 "initial_temperature", 300, "Initial value of the temperature variable");
26
27 // Boundary conditions
28 params.addParam<std::vector<BoundaryName>>(
29 "heat_flux_boundaries", {}, "Boundaries on which to apply a heat flux");
30 params.addParam<std::vector<MooseFunctorName>>(
31 "boundary_heat_fluxes",
32 {},
33 "Functors to compute the heat flux on each boundary in 'heat_flux_boundaries'");
34 params.addParam<std::vector<BoundaryName>>(
35 "insulated_boundaries", {}, "Boundaries on which to apply a zero heat flux");
36 params.addParam<std::vector<BoundaryName>>(
37 "fixed_temperature_boundaries", {}, "Boundaries on which to apply a fixed temperature");
38 params.addParam<std::vector<MooseFunctorName>>(
39 "boundary_temperatures",
40 {},
41 "Functors to compute the heat flux on each boundary in 'fixed_temperature_boundaries'");
42 params.addParam<std::vector<BoundaryName>>(
43 "fixed_convection_boundaries",
44 {},
45 "Boundaries on which to apply convection with a neighboring fluid");
46 params.addParam<std::vector<MooseFunctorName>>(
47 "fixed_convection_T_fluid",
48 {},
49 "Temperature of the convecting fluid. The user should note that numerous heat transfer "
50 "coefficient correlation will require this fluid temperature to be the bulk fluid "
51 "temperature / fluid temperature at an infinite distance.");
52 params.addParam<std::vector<MooseFunctorName>>(
53 "fixed_convection_htc", {}, "Heat transfer coefficient for convection with a fluid");
55 "heat_flux_boundaries insulated_boundaries fixed_temperature_boundaries boundary_heat_fluxes "
56 "boundary_temperatures",
57 "Thermal boundaries");
58
59 // Preconditioning is implemented so let's use it by default
60 MooseEnum pc_options("default defer", "default");
61 params.addParam<MooseEnum>(
62 "preconditioning", pc_options, "Which preconditioning to use for this Physics");
63
64 return params;
65}
66
68 : PhysicsBase(parameters), _temperature_name(getParam<VariableName>("temperature_name"))
69{
70 // Save variables (for initialization from file for example)
72
73 // Parameter checking
74 checkVectorParamsSameLength<BoundaryName, MooseFunctorName>("heat_flux_boundaries",
75 "boundary_heat_fluxes");
76 checkVectorParamsSameLength<BoundaryName, MooseFunctorName>("fixed_temperature_boundaries",
77 "boundary_temperatures");
78 checkVectorParamsNoOverlap<BoundaryName>({"heat_flux_boundaries",
79 "insulated_boundaries",
80 "fixed_temperature_boundaries",
81 "fixed_convection_boundaries"});
82
83 addRequiredPhysicsTask("add_preconditioning");
84}
85
86void
88{
89 // error on inconsistent user selections
90 if (getParam<bool>("initialize_variables_from_mesh_file") &&
91 isParamSetByUser("initial_temperature"))
92 paramError("initial_temperature",
93 "Initial temperature should not be set if the variables should be initialized from "
94 "the mesh file");
95 // do not set initial conditions if we load from file
96 if (getParam<bool>("initialize_variables_from_mesh_file"))
97 return;
98
99 // Always obey the user, but dont set a hidden default when restarting
101 _blocks,
102 /*whether IC is a default*/ !isParamSetByUser("initial_temperature"),
103 /*error if already an IC*/ isParamSetByUser("initial_temperature")))
104 {
105 InputParameters params = getFactory().getValidParams("FunctionIC");
106 assignBlocks(params, _blocks);
107 params.set<VariableName>("variable") = _temperature_name;
108 params.set<FunctionName>("function") = getParam<FunctionName>("initial_temperature");
109 getProblem().addInitialCondition("FunctionIC", prefix() + _temperature_name + "_ic", params);
110 }
111}
112
113void
115{
116 // Use a multigrid method, known to work for elliptic problems such as diffusion
117 if (_preconditioning == "default")
118 {
119 // We only pass petsc options as that's all that's needed to set up the preconditioner
120 const auto option_pair1 =
121 std::make_pair<MooseEnumItem, std::string>(MooseEnumItem("-pc_type"), "hypre");
122 const auto option_pair2 =
123 std::make_pair<MooseEnumItem, std::string>(MooseEnumItem("-pc_hypre_type"), "boomeramg");
124 addPetscPairsToPetscOptions({option_pair1, option_pair2});
125 }
126}
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters &parameters)
InputParameters getValidParams(const std::string &name) const
const VariableName & _temperature_name
Name of the temperature variable.
static InputParameters validParams()
virtual void addPreconditioning() override
virtual void addInitialConditions() override
HeatConductionPhysicsBase(const InputParameters &parameters)
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
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)
T & set(const std::string &name, bool quiet_mode=false)
void paramError(const std::string &param, Args... args) const
bool isParamSetByUser(const std::string &name) const
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string > > &petsc_pair_options)
static InputParameters validParams()
virtual FEProblemBase & getProblem()
Factory & getFactory()
bool shouldCreateIC(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool ic_is_default_ic, const bool error_if_already_defined) const
void assignBlocks(InputParameters &params, const std::vector< SubdomainName > &blocks) const
void saveSolverVariableName(const VariableName &var_name)
std::string prefix() const
std::vector< SubdomainName > _blocks
const MooseEnum & _preconditioning
void addRequiredPhysicsTask(const std::string &task)