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.