1 #ifndef VERTEXCFD_EQUATIONSET_RAD_IMPL_HPP
2 #define VERTEXCFD_EQUATIONSET_RAD_IMPL_HPP
4 #include <Panzer_BasisIRLayout.hpp>
5 #include <Panzer_IntegrationRule.hpp>
7 #include <Panzer_Integrator_BasisTimesScalar.hpp>
8 #include <Panzer_Integrator_GradBasisDotVector.hpp>
10 #include <Phalanx_FieldManager.hpp>
12 #include <Teuchos_ParameterList.hpp>
13 #include <Teuchos_RCP.hpp>
14 #include <Teuchos_StandardParameterEntryValidators.hpp>
21 template<
class EvalType>
22 RAD<EvalType>::RAD(
const Teuchos::RCP<Teuchos::ParameterList>& params,
23 const int& default_integration_order,
24 const panzer::CellData& cell_data,
25 const Teuchos::RCP<panzer::GlobalData>& global_data,
26 const bool build_transient_support)
27 : panzer::EquationSet_DefaultImpl<EvalType>(params,
28 default_integration_order,
31 build_transient_support)
34 if (!this->buildTransientSupport())
36 throw std::logic_error(
37 "Transient support is required for solving all equation sets.");
41 _num_space_dim = cell_data.baseCellDimension();
42 if (!(_num_space_dim == 2 || _num_space_dim == 3))
44 throw std::runtime_error(
"Number of space dimensions not supported");
48 Teuchos::ParameterList valid_parameters;
49 this->setDefaultValidParameters(valid_parameters);
51 "Model ID",
"",
"Closure model id associated with this equation set");
52 valid_parameters.set(
"Basis Order", 1,
"Order of the basis");
53 valid_parameters.set(
"Integration Order", 2,
"Order of the integration");
54 valid_parameters.set(
"Build Reaction Bateman Source",
56 "Reaction boolean with Bateman term");
57 valid_parameters.set(
"Build Advection",
false,
"Advection boolean");
58 valid_parameters.set(
"Build Diffusion",
false,
"Diffusion boolean");
60 "Build Fission Source",
false,
"Fission source boolean");
61 valid_parameters.set(
"Build Reaction Transmutation Source",
63 "Reaction boolean with Transmutation term");
64 valid_parameters.set(
"Number of Species", 1,
"Number of species");
66 params->validateParametersAndSetDefaults(valid_parameters);
69 const int basis_order = params->get<
int>(
"Basis Order", 1);
70 const int integration_order
71 = params->get<
int>(
"Integration Order", basis_order + 1);
72 const std::string model_id = params->get<std::string>(
"Model ID");
73 _build_bateman = params->get<
bool>(
"Build Reaction Bateman Source",
false);
74 _build_advection = params->get<
bool>(
"Build Advection",
false);
75 _build_diffusion = params->get<
bool>(
"Build Diffusion",
false);
76 _build_fission_source = params->get<
bool>(
"Build Fission Source",
false);
78 = params->get<
bool>(
"Build Reaction Transmutation Source",
false);
79 const int _num_species = params->get<
int>(
"Number of Species", 1);
83 for (
int d = 0; d < _num_species; ++d)
85 const std::string ds = std::to_string(d);
86 _equ_dof_rad_pair.insert(
87 {
"reaction_advection_diffusion_equation_" + ds,
"species_" + ds});
92 = [&,
this](
const std::string& equ_name,
const std::string& dof_name) {
93 const std::string residual_name =
"RESIDUAL_" + equ_name;
94 const std::string scatter_name =
"SCATTER_" + equ_name;
95 const std::string basis_type =
"HGrad";
96 this->addDOF(dof_name,
102 this->addDOFGrad(dof_name);
103 this->addDOFTimeDerivative(dof_name);
107 for (
const auto& [equ_name, dof_name] : _equ_dof_rad_pair)
109 set_dofs(equ_name, dof_name);
113 this->addClosureModel(model_id);
118 template<
class EvalType>
119 void RAD<EvalType>::buildAndRegisterEquationSetEvaluators(
120 PHX::FieldManager<panzer::Traits>& fm,
121 const panzer::FieldLibrary&,
122 const Teuchos::ParameterList&)
const
126 const auto it = _equ_dof_rad_pair.begin();
127 const auto ir = this->getIntRuleForDOF(it->second);
128 const auto basis = this->getBasisIRLayoutForDOF(it->second);
131 auto add_basis_time_scalar_residual = [&,
this](
132 const std::string& equ_name,
133 const std::string& residual_name,
134 const double& multiplier,
135 std::vector<std::string>& op_names) {
136 const std::string closure_model_residual = residual_name +
"_"
138 const std::string full_residual =
"RESIDUAL_" + closure_model_residual;
139 auto op = Teuchos::rcp(
140 new panzer::Integrator_BasisTimesScalar<EvalType, panzer::Traits>(
141 panzer::EvaluatorStyle::EVALUATES,
143 closure_model_residual,
147 this->
template registerEvaluator<EvalType>(fm, op);
148 op_names.push_back(full_residual);
152 auto add_grad_basis_time_residual = [&,
this](
153 const std::string& equ_name,
154 const std::string& residual_name,
155 const double& multiplier,
156 std::vector<std::string>& op_names) {
157 const std::string closure_model_residual = residual_name +
"_"
159 const std::string full_residual =
"RESIDUAL_" + closure_model_residual;
160 auto op = Teuchos::rcp(
161 new panzer::Integrator_GradBasisDotVector<EvalType, panzer::Traits>(
162 panzer::EvaluatorStyle::EVALUATES,
164 closure_model_residual,
168 this->
template registerEvaluator<EvalType>(fm, op);
169 op_names.push_back(full_residual);
173 for (
const auto& [equ_name, dof_name] : _equ_dof_rad_pair)
176 std::vector<std::string> residual_operator_names;
179 add_basis_time_scalar_residual(
180 equ_name,
"DQDT", 1.0, residual_operator_names);
183 if (_build_bateman || _build_transmutation)
185 add_basis_time_scalar_residual(
186 equ_name,
"REACTION_TERM", -1.0, residual_operator_names);
190 if (_build_advection)
192 add_grad_basis_time_residual(
193 equ_name,
"ADVECTION_FLUX", -1.0, residual_operator_names);
197 if (_build_diffusion)
199 add_grad_basis_time_residual(
200 equ_name,
"DIFFUSION_FLUX", 1.0, residual_operator_names);
204 if (_build_fission_source)
206 add_basis_time_scalar_residual(
207 equ_name,
"FISSION_SOURCE", -1.0, residual_operator_names);
211 this->buildAndRegisterResidualSummationEvaluator(
212 fm, dof_name, residual_operator_names,
"RESIDUAL_" + equ_name);
221 #endif // end VERTEXCFD_EQUATIONSET_RAD_IMPL_HPP