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.