4 #include <deal.II/base/conditional_ostream.h>     6 #include <deal.II/dofs/dof_tools.h>     8 #include <deal.II/grid/grid_generator.h>     9 #include <deal.II/grid/grid_refinement.h>    10 #include <deal.II/grid/grid_tools.h>    12 #include <deal.II/numerics/vector_tools.h>    16 #include "physics/physics_factory.h"    17 #include "physics/manufactured_solution.h"    18 #include "parameters/all_parameters.h"    19 #include "parameters/parameters.h"    20 #include "ode_solver/ode_solver_factory.h"    21 #include "dg/dg_factory.hpp"    22 #include "functional/target_functional.h"    24 const double STEPSIZE = 1e-7;
    25 const double TOLERANCE = 1e-4;
    28     using Triangulation = dealii::Triangulation<PHILIP_DIM>;
    30     using Triangulation = dealii::parallel::distributed::Triangulation<PHILIP_DIM>;
    33 template <
int dim, 
int nstate, 
typename real>
    48 template <
int dim, 
int nstate>
    51     dealii::LinearAlgebra::distributed::Vector<double> solution_no_ghost;
    57 int main(
int argc, 
char *argv[])
    60  const int dim = PHILIP_DIM;
    62  int fail_bool = 
false;
    65  dealii::Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
    66  const int this_mpi_process = dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD);
    67  dealii::ConditionalOStream 
pcout(std::cout, this_mpi_process==0);
    70  dealii::ParameterHandler parameter_handler;
    76  const unsigned poly_degree = 1;
    79     std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
    83         typename dealii::Triangulation<dim>::MeshSmoothing(
    84             dealii::Triangulation<dim>::smoothing_on_refinement |
    85             dealii::Triangulation<dim>::smoothing_on_coarsening));
    87     const unsigned int n_refinements = 2;
    90  const bool colorize = 
true;
    92  dealii::GridGenerator::hyper_cube(*grid, left, right, colorize);
    93     grid->refine_global(n_refinements);
    94     const double random_factor = 0.2;
    95     const bool keep_boundary = 
false;
    96     if (random_factor > 0.0) dealii::GridTools::distort_random (random_factor, *grid, keep_boundary);
    98  pcout << 
"Grid generated and refined" << std::endl;
   102  pcout << 
"dg created" << std::endl;
   104  dg->allocate_system();
   105  pcout << 
"dg allocated" << std::endl;
   107     const int n_refine = 2;
   108     for (
int i=0; i<n_refine;i++) {
   109         dg->high_order_grid->prepare_for_coarsening_and_refinement();
   110         grid->prepare_coarsening_and_refinement();
   111         unsigned int icell = 0;
   112         for (
auto cell = grid->begin_active(); cell!=grid->end(); ++cell) {
   114             if (!cell->is_locally_owned()) 
continue;
   115             if (icell < grid->n_global_active_cells()/2) {
   116                 cell->set_refine_flag();
   119         grid->execute_coarsening_and_refinement();
   120         bool mesh_out = (i==n_refine-1);
   121         dg->high_order_grid->execute_coarsening_and_refinement(mesh_out);
   123     dg->allocate_system ();
   126     using FadType = Sacado::Fad::DFad<double>;
   128  pcout << 
"Physics created" << std::endl;
   131  initialize_perturbed_solution(*dg, *physics_double);
   132  pcout << 
"solution initialized" << std::endl;
   135  pcout << std::endl << 
"Starting AD... " << std::endl;
   137     dg->solution.add(1.0);
   140  dealii::LinearAlgebra::distributed::Vector<double> 
dIdw = l2norm.
dIdw;
   141  dealii::LinearAlgebra::distributed::Vector<double> 
dIdX = l2norm.
dIdX;
   143  pcout << std::endl << 
"Overall error (its ok since we added 1.0 to the target solution): " << l2error_mpi_sum2 << std::endl;
   146  pcout << std::endl << 
"Starting FD dIdW... " << std::endl;
   150  pcout << std::endl << 
"Starting FD dIdX... " << std::endl;
   154  dealii::LinearAlgebra::distributed::Vector<double> dIdw_difference = 
dIdw;
   155  dIdw_difference -= dIdw_FD;
   156  double dIdW_L2_diff = dIdw_difference.l2_norm();
   157  pcout << 
"L2 norm of FD-AD dIdW: " << dIdW_L2_diff << std::endl;
   160  dealii::LinearAlgebra::distributed::Vector<double> dIdX_difference = 
dIdX;
   161  dIdX_difference -= dIdX_FD;
   162  double dIdX_L2_diff = dIdX_difference.l2_norm();
   163  pcout << 
"L2 norm of FD-AD dIdX: " << dIdX_L2_diff << std::endl;
   165  fail_bool = dIdW_L2_diff > TOLERANCE || dIdX_L2_diff > TOLERANCE;
 const bool uses_solution_gradient
Will evaluate solution gradient at quadrature points. 
dealii::LinearAlgebra::distributed::Vector< real > dIdX
Vector for storing the derivatives with respect to each grid DoF. 
TargetFunctional base class. 
const bool uses_solution_values
Will evaluate solution values at quadrature points. 
dealii::LinearAlgebra::distributed::Vector< real > dIdw
Vector for storing the derivatives with respect to each solution DoF. 
Files for the baseline physics. 
Main parameter class that contains the various other sub-parameter classes. 
dealii::LinearAlgebra::distributed::Vector< double > solution
Current modal coefficients of the solution. 
TargetFunctional(std::shared_ptr< DGBase< dim, real >> dg_input, const bool uses_solution_values=true, const bool uses_solution_gradient=true)
Constructor. 
dealii::IndexSet locally_owned_dofs
Locally own degrees of freedom. 
L2_Norm_Functional(std::shared_ptr< PHiLiP::DGBase< dim, real >> dg_input, const bool uses_solution_values=true, const bool uses_solution_gradient=false)
Constructor. 
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives. 
static std::shared_ptr< DGBase< dim, real, MeshType > > create_discontinuous_galerkin(const Parameters::AllParameters *const parameters_input, const unsigned int degree, const unsigned int max_degree_input, const unsigned int grid_degree_input, const std::shared_ptr< Triangulation > triangulation_input)
Creates a derived object DG, but returns it as DGBase. 
dealii::LinearAlgebra::distributed::Vector< real > evaluate_dIdw_finiteDifferences(DGBase< dim, real, dealii::parallel::distributed::Triangulation< dim > > &dg, const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const double stepsize)
dealii::LinearAlgebra::distributed::Vector< real > evaluate_dIdX_finiteDifferences(DGBase< dim, real, dealii::parallel::distributed::Triangulation< dim > > &dg, const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const double stepsize)
static std::shared_ptr< PhysicsBase< dim, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file. 
void parse_parameters(dealii::ParameterHandler &prm)
Retrieve parameters from dealii::ParameterHandler. 
dealii::DoFHandler< dim > dof_handler
Finite Element Collection to represent the high-order grid. 
static void declare_parameters(dealii::ParameterHandler &prm)
Declare parameters that can be set as inputs and set up the default options. 
std::shared_ptr< DGBase< dim, real, dealii::parallel::distributed::Triangulation< dim > > > dg
Smart pointer to DGBase. 
DGBase is independent of the number of state variables. 
std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function
Manufactured solution function. 
virtual real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false)
Evaluates the functional derivative with respect to the solution variable. 
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.