5 #include <deal.II/base/utilities.h> 6 #include <deal.II/base/mpi.h> 15 template <
int dim,
int nstate,
typename real>
18 const bool has_nonzero_diffusion_input,
19 const bool has_nonzero_physical_source_input,
20 const dealii::Tensor<2,3,double> input_diffusion_tensor,
22 : has_nonzero_diffusion(has_nonzero_diffusion_input)
23 , has_nonzero_physical_source(has_nonzero_physical_source_input)
24 , all_parameters(parameters_input)
25 , non_physical_behavior_type(all_parameters->non_physical_behavior_type)
26 , manufactured_solution_function(manufactured_solution_function_input)
27 , pcout(
std::cout, dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD)==0)
31 if(!manufactured_solution_function)
32 manufactured_solution_function = std::make_shared<ManufacturedSolutionSine<dim,real>>(nstate);
35 diffusion_tensor[0][0] = input_diffusion_tensor[0][0];
36 if constexpr(dim >= 2) {
37 diffusion_tensor[0][1] = input_diffusion_tensor[0][1];
38 diffusion_tensor[1][0] = input_diffusion_tensor[1][0];
39 diffusion_tensor[1][1] = input_diffusion_tensor[1][1];
41 if constexpr(dim >= 3) {
42 diffusion_tensor[0][2] = input_diffusion_tensor[0][2];
43 diffusion_tensor[2][0] = input_diffusion_tensor[2][0];
44 diffusion_tensor[1][2] = input_diffusion_tensor[1][2];
45 diffusion_tensor[2][1] = input_diffusion_tensor[2][1];
46 diffusion_tensor[2][2] = input_diffusion_tensor[2][2];
50 template <
int dim,
int nstate,
typename real>
53 const bool has_nonzero_diffusion_input,
54 const bool has_nonzero_physical_source_input,
58 has_nonzero_diffusion_input,
59 has_nonzero_physical_source_input,
60 Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(),
61 manufactured_solution_function_input)
64 template <
int dim,
int nstate,
typename real>
66 const std::array<real,nstate> &,
67 const std::array<real,nstate> &)
const 69 pcout <<
"ERROR: convective_numerical_split_flux() has not yet been implemented for (overridden by) the selected PDE. Aborting..." <<std::flush;
71 std::array<dealii::Tensor<1,dim,real>,nstate> dummy;
75 template <
int dim,
int nstate,
typename real>
78 const std::array<real,nstate> &conservative_soln,
79 const dealii::Tensor<1,dim,real> &)
const 81 return max_convective_eigenvalue(conservative_soln);
101 template <
int dim,
int nstate,
typename real>
104 const real viscosity_coefficient,
105 const dealii::Point<dim,real> &pos,
106 const std::array<real,nstate> &)
const 108 std::array<real,nstate> source;
110 dealii::Tensor<2,dim,double> artificial_diffusion_tensor;
111 for (
int i=0;i<dim;i++)
112 for (
int j=0;j<dim;j++)
113 artificial_diffusion_tensor[i][j] = (i==j) ? 1.0 : 0.0;
115 for (
int istate=0; istate<nstate; istate++) {
116 dealii::SymmetricTensor<2,dim,real> manufactured_hessian = this->manufactured_solution_function->hessian (pos, istate);
118 source[istate] = 0.0;
119 for (
int dr=0; dr<dim; ++dr) {
120 for (
int dc=0; dc<dim; ++dc) {
121 source[istate] += artificial_diffusion_tensor[dr][dc] * manufactured_hessian[dr][dc];
124 source[istate] *= -viscosity_coefficient;
129 template <
int dim,
int nstate,
typename real>
132 const dealii::Point<dim,real> &,
133 const std::array<real,nstate> &,
134 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
135 const dealii::types::global_dof_index )
const 137 std::array<real,nstate> physical_source;
138 for (
int i=0; i<nstate; i++) {
139 physical_source[i] = 0;
141 return physical_source;
144 template <
int dim,
int nstate,
typename real>
146 const dealii::Vector<double> &uh,
147 const std::vector<dealii::Tensor<1,dim> > &,
148 const std::vector<dealii::Tensor<2,dim> > &,
149 const dealii::Tensor<1,dim> &,
150 const dealii::Point<dim> &)
const 152 dealii::Vector<double> computed_quantities(nstate);
153 for (
unsigned int s=0; s<nstate; ++s) {
154 computed_quantities(s) = uh(s);
156 return computed_quantities;
159 template <
int dim,
int nstate,
typename real>
162 const dealii::Tensor<1,dim> &,
163 const dealii::Tensor<2,dim> &,
164 const dealii::Tensor<1,dim> &,
165 const dealii::Point<dim> &)
const 168 dealii::Vector<double> computed_quantities(nstate);
169 for (
unsigned int s=0; s<nstate; ++s) {
170 computed_quantities(s) = uh;
172 return computed_quantities;
175 template <
int dim,
int nstate,
typename real>
178 std::vector<std::string> names;
179 for (
unsigned int s=0; s<nstate; ++s) {
180 std::string varname =
"state" + dealii::Utilities::int_to_string(s,1);
181 names.push_back(varname);
186 template <
int dim,
int nstate,
typename real>
190 namespace DCI = dealii::DataComponentInterpretation;
191 std::vector<DCI::DataComponentInterpretation> interpretation;
192 for (
unsigned int s=0; s<nstate; ++s) {
193 interpretation.push_back (DCI::component_is_scalar);
195 return interpretation;
198 template <
int dim,
int nstate,
typename real>
202 return dealii::update_values;
205 template <
int dim,
int nstate,
typename real>
206 template<
typename real2>
210 if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::abort_run) {
211 std::cout <<
"ERROR: Non-physical result has been detected. ";
212 if (!message.empty()) {
213 std::cout << std::endl <<
" Message: " << message << std::endl;
215 std::cout <<
" Aborting... " << std::endl << std::flush;
217 }
else if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::print_warning) {
218 std::cout <<
"WARNING: Non-physical result has been detected at a node." << std::endl;
219 if (!message.empty()) {
220 std::cout << std::endl <<
" Message: " << message << std::endl;
222 }
else if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::return_big_number) {
226 return (real2)BIG_NUMBER;
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Manufactured solution used for grid studies to check convergence orders.
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
PhysicsBase(const Parameters::AllParameters *const parameters_input, const bool has_nonzero_diffusion_input, const bool has_nonzero_physical_source_input, const dealii::Tensor< 2, 3, double > input_diffusion_tensor=Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(), std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function_input=nullptr)
Default constructor that will set the constants.
Files for the baseline physics.
Main parameter class that contains the various other sub-parameter classes.
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.