12 #include "MooseMesh.h"
13 #include "MeshGeneratorMesh.h"
14 #include "FEProblemBase.h"
25 InputParameters params = validParams<Action>();
26 params.addClassDescription(
27 "This action sets up the net radiation calculation between specified sidesets.");
29 params.addRequiredParam<std::vector<boundary_id_type>>(
30 "sidesets",
"The sidesets that participate in the radiative exchange.");
32 params.addParam<std::vector<boundary_id_type>>(
33 "adiabatic_sidesets",
"The adiabatic sidesets that participate in the radiative exchange.");
35 params.addParam<std::vector<boundary_id_type>>(
36 "fixed_temperature_sidesets",
37 "The fixed temperature sidesets that participate in the radiative exchange.");
39 params.addParam<std::vector<FunctionName>>(
"fixed_boundary_temperatures",
40 "The temperatures of the fixed boundary.");
42 params.addRequiredParam<std::vector<unsigned int>>(
"n_patches",
43 "Number of radiation patches per sideset.");
44 MultiMooseEnum partitioning(
45 "default=-3 metis=-2 parmetis=-1 linear=0 centroid hilbert_sfc morton_sfc",
"default");
46 params.addParam<MultiMooseEnum>(
49 "Specifies a mesh partitioner to use when preparing the radiation patches.");
51 params.addRequiredParam<MeshGeneratorName>(
"final_mesh_generator",
52 "Name of the final mesh generator.");
54 MultiMooseEnum direction(
"x y z radial");
55 params.addParam<MultiMooseEnum>(
"centroid_partitioner_directions",
57 "Specifies the sort direction if using the centroid partitioner. "
58 "Available options: x, y, z, radial");
60 params.addRequiredParam<VariableName>(
"temperature",
"The coupled temperature variable.");
61 params.addRequiredParam<std::vector<Real>>(
"emissivity",
"Emissivities for each boundary.");
67 _boundary_ids(getParam<std::vector<boundary_id_type>>(
"sidesets")),
68 _n_patches(getParam<std::vector<unsigned int>>(
"n_patches"))
75 if (_current_task ==
"add_mesh_generator")
77 else if (_current_task ==
"setup_mesh_complete")
79 else if (_current_task ==
"add_user_object")
84 else if (_current_task ==
"add_bc")
91 InputParameters params = _factory.getValidParams(
"GrayLambertNeumannBC");
95 std::vector<BoundaryName> boundary_names;
96 for (
auto & e1 : radiation_patch_names)
98 boundary_names.push_back(e2);
99 params.set<std::vector<BoundaryName>>(
"boundary") = boundary_names;
102 params.set<NonlinearVariableName>(
"variable") = getParam<VariableName>(
"temperature");
107 _problem->addBoundaryCondition(
"GrayLambertNeumannBC",
"gray_lamber_neumann_bc_" + _name, params);
115 InputParameters params = _factory.getValidParams(
"UnobstructedPlanarViewFactor");
118 std::vector<BoundaryName> boundary_names;
119 for (
auto & e1 : radiation_patch_names)
121 boundary_names.push_back(e2);
122 params.set<std::vector<BoundaryName>>(
"boundary") = boundary_names;
125 ExecFlagEnum exec_enum = MooseUtils::getDefaultExecFlagEnum();
126 exec_enum = {EXEC_INITIAL};
127 params.set<ExecFlagEnum>(
"execute_on") = exec_enum;
135 return "view_factor_uo_" + _name;
141 return "view_factor_surface_radiation_" + _name;
150 std::vector<Real> emissivity = getParam<std::vector<Real>>(
"emissivity");
152 mooseError(
"emissivity parameter needs to be the same size as the sidesets parameter.");
156 InputParameters params = _factory.getValidParams(
"ViewFactorObjectSurfaceRadiation");
157 params.set<std::vector<VariableName>>(
"temperature") = {getParam<VariableName>(
"temperature")};
159 std::vector<Real> extended_emissivity;
161 for (
unsigned int i = 0; i <
_n_patches[j]; ++i)
162 extended_emissivity.push_back(emissivity[j]);
163 params.set<std::vector<Real>>(
"emissivity") = extended_emissivity;
166 std::vector<BoundaryName> boundary_names;
167 for (
auto & e1 : radiation_patch_names)
169 boundary_names.push_back(e2);
170 params.set<std::vector<BoundaryName>>(
"boundary") = boundary_names;
173 if (isParamValid(
"adiabatic_sidesets"))
175 std::vector<boundary_id_type> adiabatic_boundary_ids =
176 getParam<std::vector<boundary_id_type>>(
"adiabatic_sidesets");
177 std::vector<BoundaryName> adiabatic_boundary_names;
178 for (
unsigned int k = 0; k < adiabatic_boundary_ids.size(); ++k)
180 boundary_id_type abid = adiabatic_boundary_ids[k];
187 mooseError(
"Adiabatic sideset ", abid,
" not present in sidesets.");
194 for (
auto & e : radiation_patch_names[index])
195 adiabatic_boundary_names.push_back(e);
197 params.set<std::vector<BoundaryName>>(
"adiabatic_boundary") = adiabatic_boundary_names;
201 if (isParamValid(
"fixed_temperature_sidesets"))
203 if (!isParamValid(
"fixed_boundary_temperatures"))
204 mooseError(
"fixed_temperature_sidesets is provided so fixed_boundary_temperatures must be "
207 std::vector<boundary_id_type> fixed_T_boundary_ids =
208 getParam<std::vector<boundary_id_type>>(
"fixed_temperature_sidesets");
210 std::vector<FunctionName> fixed_T_funcs =
211 getParam<std::vector<FunctionName>>(
"fixed_boundary_temperatures");
214 if (fixed_T_funcs.size() != fixed_T_boundary_ids.size())
215 mooseError(
"Size of parameter fixed_boundary_temperatures and fixed_temperature_sidesets "
218 std::vector<BoundaryName> fixed_T_boundary_names;
219 std::vector<FunctionName> fixed_T_function_names;
220 for (
unsigned int k = 0; k < fixed_T_boundary_ids.size(); ++k)
222 boundary_id_type bid = fixed_T_boundary_ids[k];
229 mooseError(
"Fixed temperature sideset ", bid,
" not present in sidesets.");
236 for (
auto & e : radiation_patch_names[index])
238 fixed_T_boundary_names.push_back(e);
239 fixed_T_function_names.push_back(fixed_T_funcs[k]);
242 params.set<std::vector<BoundaryName>>(
"fixed_temperature_boundary") = fixed_T_boundary_names;
243 params.set<std::vector<FunctionName>>(
"fixed_boundary_temperatures") = fixed_T_function_names;
250 ExecFlagEnum exec_enum = MooseUtils::getDefaultExecFlagEnum();
251 exec_enum = {EXEC_LINEAR, EXEC_TIMESTEP_END};
252 params.set<ExecFlagEnum>(
"execute_on") = exec_enum;
255 _problem->addUserObject(
"ViewFactorObjectSurfaceRadiation",
radiationObjectName(), params);
258 std::vector<std::vector<std::string>>
261 std::vector<std::vector<std::string>> radiation_patch_names(
_boundary_ids.size());
265 std::string base_name = _mesh->getBoundaryName(bid);
266 std::vector<std::string> bnames;
267 for (
unsigned int i = 0; i <
_n_patches[j]; ++i)
269 std::stringstream ss;
270 ss << base_name <<
"_" << i;
271 bnames.push_back(ss.str());
273 radiation_patch_names[j] = bnames;
275 return radiation_patch_names;
281 MultiMooseEnum partitioners = getParam<MultiMooseEnum>(
"partitioners");
282 if (!_pars.isParamSetByUser(
"partitioners"))
284 partitioners.clear();
286 partitioners.push_back(
"metis");
289 MultiMooseEnum direction = getParam<MultiMooseEnum>(
"centroid_partitioner_directions");
293 mooseError(
"n_patches parameter must have same length as sidesets parameter.");
296 mooseError(
"partitioners parameter must have same length as sidesets parameter.");
298 for (
unsigned int j = 0; j < partitioners.size(); ++j)
299 if (partitioners[j] ==
"centroid" && direction.size() !=
_boundary_ids.size())
301 "centroid partitioner is selected for at least one sideset. "
302 "centroid_partitioner_directions parameter must have same length as sidesets parameter.");
305 std::shared_ptr<MeshGeneratorMesh> mg_mesh = std::dynamic_pointer_cast<MeshGeneratorMesh>(_mesh);
307 mooseError(
"This action adds MeshGenerator objects and therefore only works with a "
308 "MeshGeneratorMesh.");
310 MeshGeneratorName input = getParam<MeshGeneratorName>(
"final_mesh_generator");
317 std::stringstream ss;
318 ss <<
"patch_side_set_generator_" << bid;
319 MeshGeneratorName mg_name = ss.str();
321 InputParameters params = _factory.getValidParams(
"PatchSidesetGenerator");
322 params.set<MeshGeneratorName>(
"input") = input;
323 params.set<boundary_id_type>(
"sideset") = bid;
324 params.set<
unsigned int>(
"n_patches") =
_n_patches[j];
325 params.set<MooseEnum>(
"partitioner") = partitioners[j];
327 if (partitioners[j] ==
"centroid")
328 params.set<MooseEnum>(
"centroid_partitioner_direction") = direction[j];
330 _app.addMeshGenerator(
"PatchSidesetGenerator", mg_name, params);