5 #include <deal.II/base/utilities.h> 6 #include <deal.II/base/mpi.h> 7 #include <boost/preprocessor/seq/for_each.hpp> 16 template <
int dim,
int nspecies,
int nstate,
typename real>
19 const bool has_nonzero_diffusion_input,
20 const bool has_nonzero_physical_source_input,
21 const dealii::Tensor<2,3,double> input_diffusion_tensor,
23 : has_nonzero_diffusion(has_nonzero_diffusion_input)
24 , has_nonzero_physical_source(has_nonzero_physical_source_input)
25 , all_parameters(parameters_input)
26 , non_physical_behavior_type(all_parameters->non_physical_behavior_type)
27 , manufactured_solution_function(manufactured_solution_function_input)
28 , pcout(
std::cout, dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD)==0)
32 if(!manufactured_solution_function)
33 manufactured_solution_function = std::make_shared<ManufacturedSolutionSine<dim,nspecies,real>>(nstate);
36 diffusion_tensor[0][0] = input_diffusion_tensor[0][0];
37 if constexpr(dim >= 2) {
38 diffusion_tensor[0][1] = input_diffusion_tensor[0][1];
39 diffusion_tensor[1][0] = input_diffusion_tensor[1][0];
40 diffusion_tensor[1][1] = input_diffusion_tensor[1][1];
42 if constexpr(dim >= 3) {
43 diffusion_tensor[0][2] = input_diffusion_tensor[0][2];
44 diffusion_tensor[2][0] = input_diffusion_tensor[2][0];
45 diffusion_tensor[1][2] = input_diffusion_tensor[1][2];
46 diffusion_tensor[2][1] = input_diffusion_tensor[2][1];
47 diffusion_tensor[2][2] = input_diffusion_tensor[2][2];
51 template <
int dim,
int nspecies,
int nstate,
typename real>
54 const bool has_nonzero_diffusion_input,
55 const bool has_nonzero_physical_source_input,
59 has_nonzero_diffusion_input,
60 has_nonzero_physical_source_input,
61 Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(),
62 manufactured_solution_function_input)
65 template <
int dim,
int nspecies,
int nstate,
typename real>
67 const std::array<real,nstate> &,
68 const std::array<real,nstate> &)
const 70 pcout <<
"ERROR: convective_numerical_split_flux() has not yet been implemented for (overridden by) the selected PDE. Aborting..." <<std::flush;
72 std::array<dealii::Tensor<1,dim,real>,nstate> dummy;
76 template <
int dim,
int nspecies,
int nstate,
typename real>
79 const std::array<real,nstate> &conservative_soln,
80 const dealii::Tensor<1,dim,real> &)
const 82 return max_convective_eigenvalue(conservative_soln);
103 template <
int dim,
int nspecies,
int nstate,
typename real>
106 const std::array<real,nstate> &solution,
107 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
108 const std::array<real,nstate> &filtered_solution,
109 const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
111 const dealii::types::global_dof_index cell_index,
112 const dealii::Tensor<1,dim,real> &normal,
115 std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux = this->dissipative_flux(solution,solution_gradient,filtered_solution,filtered_solution_gradient,cell_index);
116 std::array<real,nstate> dissipative_flux_dot_normal;
117 dissipative_flux_dot_normal.fill(0.0);
118 for (
int s=0; s<nstate; s++) {
119 for (
int d=0; d<dim; ++d) {
120 dissipative_flux_dot_normal[s] += dissipative_flux[s][d] * normal[d];
123 return dissipative_flux_dot_normal;
126 template <
int dim,
int nspecies,
int nstate,
typename real>
129 const std::array<real,nstate> &solution,
130 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
131 const std::array<real,nstate> &,
132 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
133 const dealii::types::global_dof_index cell_index)
135 return this->dissipative_flux(solution,solution_gradient,cell_index);
138 template <
int dim,
int nspecies,
int nstate,
typename real>
141 const real viscosity_coefficient,
142 const dealii::Point<dim,real> &pos,
143 const std::array<real,nstate> &)
const 145 std::array<real,nstate> source;
147 dealii::Tensor<2,dim,double> artificial_diffusion_tensor;
148 for (
int i=0;i<dim;i++)
149 for (
int j=0;j<dim;j++)
150 artificial_diffusion_tensor[i][j] = (i==j) ? 1.0 : 0.0;
152 for (
int istate=0; istate<nstate; istate++) {
153 dealii::SymmetricTensor<2,dim,real> manufactured_hessian = this->manufactured_solution_function->hessian (pos, istate);
155 source[istate] = 0.0;
156 for (
int dr=0; dr<dim; ++dr) {
157 for (
int dc=0; dc<dim; ++dc) {
158 source[istate] += artificial_diffusion_tensor[dr][dc] * manufactured_hessian[dr][dc];
161 source[istate] *= -viscosity_coefficient;
166 template <
int dim,
int nspecies,
int nstate,
typename real>
170 std::cout <<
"The compute_pressure function has not been implemented for this PDE...Aborting." << std::endl;
175 template <
int dim,
int nspecies,
int nstate,
typename real>
179 std::cout <<
"The compute_entropy function has not been implemented for this PDE...Aborting." << std::endl;
184 template <
int dim,
int nspecies,
int nstate,
typename real>
188 std::cout <<
"The compute_gamma function has not been implemented for this PDE...Aborting." << std::endl;
193 template <
int dim,
int nspecies,
int nstate,
typename real>
197 std::cout <<
"The compute_kinetic_energy_variables function has not been implemented for this PDE...Aborting." << std::endl;
200 std::array<real,nstate> kinetic_energy_var;
201 std::fill(kinetic_energy_var.begin(), kinetic_energy_var.end(), 0.0);
203 return kinetic_energy_var;
206 template <
int dim,
int nspecies,
int nstate,
typename real>
209 const int boundary_type,
210 const dealii::Point<dim, real> &pos,
211 const dealii::Tensor<1,dim,real> &normal,
212 const std::array<real,nstate> &soln_int,
213 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
214 const std::array<real,nstate> &,
215 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
216 std::array<real,nstate> &soln_bc,
217 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 219 this->boundary_face_values(boundary_type,
228 template <
int dim,
int nspecies,
int nstate,
typename real>
231 const int boundary_type,
232 const dealii::Point<dim, real> &pos,
233 const dealii::Tensor<1,dim,real> &normal,
234 const std::array<real,nstate> &soln_int,
235 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
236 const std::array<real,nstate> &,
237 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
238 std::array<real,nstate> &soln_bc,
239 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 241 this->boundary_face_values(boundary_type,
250 template <
int dim,
int nspecies,
int nstate,
typename real>
253 const dealii::Point<dim,real> &,
254 const std::array<real,nstate> &,
255 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
256 const dealii::types::global_dof_index )
const 258 std::array<real,nstate> physical_source;
259 for (
int i=0; i<nstate; i++) {
260 physical_source[i] = 0;
262 return physical_source;
265 template <
int dim,
int nspecies,
int nstate,
typename real>
267 const dealii::Vector<double> &uh,
268 const std::vector<dealii::Tensor<1,dim> > &,
269 const std::vector<dealii::Tensor<2,dim> > &,
270 const dealii::Tensor<1,dim> &,
271 const dealii::Point<dim> &)
const 273 dealii::Vector<double> computed_quantities(nstate);
274 for (
unsigned int s=0; s<nstate; ++s) {
275 computed_quantities(s) = uh(s);
277 return computed_quantities;
280 template <
int dim,
int nspecies,
int nstate,
typename real>
283 const dealii::Tensor<1,dim> &,
284 const dealii::Tensor<2,dim> &,
285 const dealii::Tensor<1,dim> &,
286 const dealii::Point<dim> &)
const 289 dealii::Vector<double> computed_quantities(nstate);
290 for (
unsigned int s=0; s<nstate; ++s) {
291 computed_quantities(s) = uh;
293 return computed_quantities;
296 template <
int dim,
int nspecies,
int nstate,
typename real>
299 std::vector<std::string> names;
300 for (
unsigned int s=0; s<nstate; ++s) {
301 std::string varname =
"state" + dealii::Utilities::int_to_string(s,1);
302 names.push_back(varname);
307 template <
int dim,
int nspecies,
int nstate,
typename real>
311 namespace DCI = dealii::DataComponentInterpretation;
312 std::vector<DCI::DataComponentInterpretation> interpretation;
313 for (
unsigned int s=0; s<nstate; ++s) {
314 interpretation.push_back (DCI::component_is_scalar);
316 return interpretation;
319 template <
int dim,
int nspecies,
int nstate,
typename real>
323 return dealii::update_values;
326 template <
int dim,
int nspecies,
int nstate,
typename real>
327 template<
typename real2>
331 if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::abort_run) {
332 std::cout <<
"ERROR: Non-physical result has been detected. ";
333 if (!message.empty()) {
334 std::cout << std::endl <<
" Message: " << message << std::endl;
336 std::cout <<
" Aborting... " << std::endl << std::flush;
338 }
else if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::print_warning) {
339 std::cout <<
"WARNING: Non-physical result has been detected at a node." << std::endl;
340 if (!message.empty()) {
341 std::cout << std::endl <<
" Message: " << message << std::endl;
343 }
else if (this->non_physical_behavior_type == NonPhysicalBehaviorEnum::return_big_number) {
347 return (real2)BIG_NUMBER;
349 #if PHILIP_SPECIES==1 351 #define POSSIBLE_NSTATE (1)(2)(3)(4)(5)(6)(8) 354 #define INSTANTIATE_FOR_NSTATE(r, data, nstate) \ 355 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, double >; \ 356 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, FadType >; \ 357 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadType >; \ 358 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType >; \ 359 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType >; \ 361 template double PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, double >::handle_non_physical_result<double>(const std::string message) const; \ 362 template FadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, FadType >::handle_non_physical_result<FadType>(const std::string message) const; \ 363 template RadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadType >::handle_non_physical_result<RadType>(const std::string message) const; \ 364 template FadFadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType >::handle_non_physical_result<FadFadType>(const std::string message) const; \ 365 template RadFadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType >::handle_non_physical_result<RadFadType>(const std::string message) const; \ 367 template FadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, double >::handle_non_physical_result<FadType>(const std::string message) const; \ 368 template FadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadType >::handle_non_physical_result<FadType>(const std::string message) const; \ 369 template FadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType >::handle_non_physical_result<FadType>(const std::string message) const; \ 370 template FadType PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType >::handle_non_physical_result<FadType>(const std::string message) const; 371 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_FOR_NSTATE, _, POSSIBLE_NSTATE)
373 #define POSSIBLE_TYPE (double)(FadType)(RadType)(FadFadType)(RadFadType) 374 #define INSTANTIATE_TYPES(r, data, type) \ 375 template class PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type >; \ 376 template type PhysicsBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type >::handle_non_physical_result<type>(const std::string message) const; 377 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_TYPES, _, POSSIBLE_TYPE)
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.
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, nspecies, 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.