[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
solve_KKT.cpp
1 #include <Epetra_RowMatrixTransposer.h>
2 
3 #include <deal.II/base/conditional_ostream.h>
4 
5 #include <deal.II/distributed/tria.h>
6 #include <deal.II/grid/grid_generator.h>
7 #include <deal.II/grid/grid_tools.h>
8 
9 #include <deal.II/numerics/vector_tools.h>
10 
11 #include "physics/physics_factory.h"
12 #include "parameters/all_parameters.h"
13 #include "dg/dg_factory.hpp"
14 #include "functional/functional.h"
15 
16 #include <deal.II/lac/full_matrix.h>
17 
18 #include <deal.II/lac/solver_bicgstab.h>
19 #include <deal.II/lac/solver_cg.h>
20 #include <deal.II/lac/solver_gmres.h>
21 #include <deal.II/lac/solver_minres.h>
22 
23 #include <deal.II/lac/block_sparsity_pattern.h>
24 
25 #include <deal.II/lac/precondition.h>
26 
27 #include <deal.II/lac/trilinos_block_sparse_matrix.h>
28 #include <deal.II/lac/trilinos_precondition.h>
29 #include <deal.II/lac/trilinos_solver.h>
30 #include <deal.II/lac/trilinos_sparsity_pattern.h>
31 #include <deal.II/lac/trilinos_sparse_matrix.h>
32 
33 #include <deal.II/lac/trilinos_parallel_block_vector.h>
34 #include <deal.II/lac/la_parallel_block_vector.h>
35 
36 
37 #include <deal.II/lac/packaged_operation.h>
38 #include <deal.II/lac/trilinos_linear_operator.h>
39 
40 //#include <deal.II/lac/block_linear_operator.h>
41 #include <deal.II/lac/solver_control.h>
42 
43 
44 #include <deal.II/lac/read_write_vector.h>
45 
46 const double STEPSIZE = 1e-7;
47 const double TOLERANCE = 1e-6;
48 
49 #if PHILIP_DIM==1
50  using Triangulation = dealii::Triangulation<PHILIP_DIM>;
51 #else
52  using Triangulation = dealii::parallel::distributed::Triangulation<PHILIP_DIM>;
53 #endif
54 
55 std::pair<unsigned int, double>
57  dealii::TrilinosWrappers::BlockSparseMatrix &matrix_A,
58  dealii::LinearAlgebra::distributed::BlockVector<double> &right_hand_side,
59  dealii::LinearAlgebra::distributed::BlockVector<double> &solution,
61 {
62 
63  //const dealii::BlockLinearOperator kkt_operator = dealii::block_operator (matrix_A);
64  using block_vec = dealii::LinearAlgebra::distributed::BlockVector<double>;
65  const auto kkt_operator = dealii::block_operator<block_vec> (matrix_A);
66  dealii::SolverControl solver_control(100000, 1.e-15, true, true);
67  const unsigned int max_n_tmp_vectors = 2000;
68  const bool right_preconditioning = false;
69  const bool use_default_residual = true;
70  const bool force_re_orthogonalization = false;
71  dealii::SolverGMRES<block_vec>::AdditionalData add_data( max_n_tmp_vectors, right_preconditioning, use_default_residual, force_re_orthogonalization);
72  dealii::SolverGMRES<block_vec> solver_gmres(solver_control, add_data);
73  auto kkt_inv = inverse_operator(kkt_operator, solver_gmres, dealii::PreconditionIdentity());
74  solution = kkt_inv * right_hand_side;
75 
76  return {-1.0, -1.0};
77 }
78 
80 template <int dim, int nspecies, int nstate, typename real>
81 class L2_Norm_Functional : public PHiLiP::Functional<dim, nspecies, nstate, real>
82 {
83 
84  using FadType = Sacado::Fad::DFad<real>;
85  using FadFadType = Sacado::Fad::DFad<FadType>;
86 public:
89  std::shared_ptr<PHiLiP::DGBase<dim,nspecies,real>> dg_input,
90  const bool uses_solution_values = true,
91  const bool uses_solution_gradient = false)
92  : PHiLiP::Functional<dim,nspecies,nstate,real>(dg_input,uses_solution_values,uses_solution_gradient)
93  {}
94 
96  template <typename real2>
99  const dealii::Point<dim,real2> &phys_coord,
100  const std::array<real2,nstate> &soln_at_q,
101  const std::array<dealii::Tensor<1,dim,real2>,nstate> &/*soln_grad_at_q*/) const
102  {
103  real2 l2error = 0;
104  for (int istate=0; istate<nstate; ++istate) {
105  const real2 uexact = physics.manufactured_solution_function->value(phys_coord, istate);
106  l2error += std::pow(soln_at_q[istate] - uexact, 2);
107  }
108  return l2error;
109  }
110 
112 
113  template<typename real2>
116  const unsigned int /*boundary_id*/,
117  const dealii::Point<dim,real2> &phys_coord,
118  const dealii::Tensor<1,dim,real2> &/*normal*/,
119  const std::array<real2,nstate> &soln_at_q,
120  const std::array<dealii::Tensor<1,dim,real2>,nstate> &/*soln_grad_at_q*/) const
121  {
122  real2 l1error = 0;
123  for (int istate=0; istate<nstate; ++istate) {
124  const real2 uexact = physics.manufactured_solution_function->value(phys_coord, istate);
125  l1error += std::abs(soln_at_q[istate] - uexact);
126  }
127  return l1error;
128  }
129 
131 
134  const unsigned int boundary_id,
135  const dealii::Point<dim,real> &phys_coord,
136  const dealii::Tensor<1,dim,real> &normal,
137  const std::array<real,nstate> &soln_at_q,
138  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q) const override
139  {
140  return evaluate_boundary_integrand<real>(
141  physics,
142  boundary_id,
143  phys_coord,
144  normal,
145  soln_at_q,
146  soln_grad_at_q);
147  }
149 
152  const unsigned int boundary_id,
153  const dealii::Point<dim,FadFadType> &phys_coord,
154  const dealii::Tensor<1,dim,FadFadType> &normal,
155  const std::array<FadFadType,nstate> &soln_at_q,
156  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q) const override
157  {
158  return evaluate_boundary_integrand<FadFadType>(
159  physics,
160  boundary_id,
161  phys_coord,
162  normal,
163  soln_at_q,
164  soln_grad_at_q);
165  }
166 
167 
168 
172  const dealii::Point<dim,real> &phys_coord,
173  const std::array<real,nstate> &soln_at_q,
174  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q) const override
175  {
176  return evaluate_volume_integrand<>(physics, phys_coord, soln_at_q, soln_grad_at_q);
177  }
181  const dealii::Point<dim,FadFadType> &phys_coord,
182  const std::array<FadFadType,nstate> &soln_at_q,
183  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q) const override
184  {
185  return evaluate_volume_integrand<>(physics, phys_coord, soln_at_q, soln_grad_at_q);
186  }
187 
188 };
189 
190 
191 template <int dim, int nspecies, int nstate>
193 {
194  dealii::LinearAlgebra::distributed::Vector<double> solution_no_ghost;
195  solution_no_ghost.reinit(dg.locally_owned_dofs, MPI_COMM_WORLD);
196  dealii::VectorTools::interpolate(dg.dof_handler, *physics.manufactured_solution_function, solution_no_ghost);
197  dg.solution = solution_no_ghost;
198 }
199 
200 int main(int argc, char *argv[])
201 {
202 
203  const int dim = PHILIP_DIM;
204  const int nspecies = 1;
205  const int nstate = 1;
206  int fail_bool = false;
207 
208  // Initializing MPI
209  dealii::Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
210  const int this_mpi_process = dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD);
211  dealii::ConditionalOStream pcout(std::cout, this_mpi_process==0);
212 
213  // Initializing parameter handling
214  dealii::ParameterHandler parameter_handler;
216  PHiLiP::Parameters::AllParameters all_parameters;
217  all_parameters.parse_parameters(parameter_handler);
218 
219  // polynomial order and mesh size
220  const unsigned poly_degree = 1;
221 
222  // creating the grid
223  std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
224 #if PHILIP_DIM!=1
225  MPI_COMM_WORLD,
226 #endif
227  typename dealii::Triangulation<dim>::MeshSmoothing(
228  dealii::Triangulation<dim>::smoothing_on_refinement |
229  dealii::Triangulation<dim>::smoothing_on_coarsening));
230 
231  const unsigned int n_refinements = 2;
232  double left = 0.0;
233  double right = 2.0;
234  const bool colorize = true;
235 
236  dealii::GridGenerator::hyper_cube(*grid, left, right, colorize);
237  grid->refine_global(n_refinements);
238  const double random_factor = 0.2;
239  const bool keep_boundary = false;
240  if (random_factor > 0.0) dealii::GridTools::distort_random (random_factor, *grid, keep_boundary);
241 
242  pcout << "Grid generated and refined" << std::endl;
243 
244  // creating the dg
245  std::shared_ptr < PHiLiP::DGBase<dim, nspecies, double> > dg = PHiLiP::DGFactory<dim,nspecies,double>::create_discontinuous_galerkin(&all_parameters, poly_degree, grid);
246  pcout << "dg created" << std::endl;
247 
248  dg->allocate_system();
249  pcout << "dg allocated" << std::endl;
250 
251  const int n_refine = 2;
252  for (int i=0; i<n_refine;i++) {
253  dg->high_order_grid->prepare_for_coarsening_and_refinement();
254  grid->prepare_coarsening_and_refinement();
255  unsigned int icell = 0;
256  for (auto cell = grid->begin_active(); cell!=grid->end(); ++cell) {
257  icell++;
258  if (!cell->is_locally_owned()) continue;
259  if (icell < grid->n_global_active_cells()/2) {
260  cell->set_refine_flag();
261  }
262  }
263  grid->execute_coarsening_and_refinement();
264  bool mesh_out = (i==n_refine-1);
265  dg->high_order_grid->execute_coarsening_and_refinement(mesh_out);
266  }
267  dg->allocate_system ();
268 
269  // manufactured solution function
270  std::shared_ptr <PHiLiP::Physics::PhysicsBase<dim,nspecies,nstate,double>> physics_double = PHiLiP::Physics::PhysicsFactory<dim, nspecies, nstate, double>::create_Physics(&all_parameters);
271  pcout << "Physics created" << std::endl;
272 
273  // performing the interpolation for the intial conditions
274  initialize_perturbed_solution(*dg, *physics_double);
275  pcout << "solution initialized" << std::endl;
276 
277  // evaluating the derivative (using SACADO)
278  pcout << std::endl << "Starting Hessian AD... " << std::endl;
279  L2_Norm_Functional<dim,nspecies,nstate,double> functional(dg,true,false);
280  const bool compute_dIdW = false, compute_dIdX = false, compute_d2I = true;
281  double functional_value = functional.evaluate_functional(compute_dIdW, compute_dIdX, compute_d2I);
282  (void) functional_value;
283 
284  // Evaluate residual Hessians
285  bool compute_dRdW, compute_dRdX, compute_d2R;
286 
287  pcout << "Evaluating RHS only to use as dual variables..." << std::endl;
288  compute_dRdW = false; compute_dRdX = false, compute_d2R = false;
289  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R);
290  dealii::LinearAlgebra::distributed::Vector<double> dummy_dual(dg->right_hand_side);
291  dg->set_dual(dummy_dual);
292 
293  pcout << "Evaluating RHS with d2R..." << std::endl;
294  compute_dRdW = true; compute_dRdX = false, compute_d2R = false;
295  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R);
296  compute_dRdW = false; compute_dRdX = true, compute_d2R = false;
297  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R);
298  compute_dRdW = false; compute_dRdX = false, compute_d2R = true;
299  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R);
300  dealii::LinearAlgebra::distributed::Vector<double> rhs_d2R(dg->right_hand_side);
301  // pcout << "*******************************************************************************" << std::endl;
302 
303  dealii::TrilinosWrappers::SparseMatrix dRdW_transpose;
304  {
305  Epetra_CrsMatrix *transpose_CrsMatrix;
306  Epetra_RowMatrixTransposer epmt(const_cast<Epetra_CrsMatrix *>(&dg->system_matrix.trilinos_matrix()));
307  epmt.CreateTranspose(false, transpose_CrsMatrix);
308  dRdW_transpose.reinit(*transpose_CrsMatrix);
309  }
310 
311  dealii::TrilinosWrappers::SparseMatrix dRdX_transpose;
312  {
313  Epetra_CrsMatrix *transpose_CrsMatrix;
314  Epetra_RowMatrixTransposer epmt(const_cast<Epetra_CrsMatrix *>(&dg->dRdXv.trilinos_matrix()));
315  epmt.CreateTranspose(false, transpose_CrsMatrix);
316  dRdX_transpose.reinit(*transpose_CrsMatrix);
317  }
318 
319  dealii::TrilinosWrappers::SparseMatrix d2RdXdW;
320  {
321  Epetra_CrsMatrix *transpose_CrsMatrix;
322  Epetra_RowMatrixTransposer epmt(const_cast<Epetra_CrsMatrix *>(&dg->d2RdWdX.trilinos_matrix()));
323  epmt.CreateTranspose(false, transpose_CrsMatrix);
324  d2RdXdW.reinit(*transpose_CrsMatrix);
325  }
326  dealii::TrilinosWrappers::SparseMatrix d2IdXdW;
327  {
328  Epetra_CrsMatrix *transpose_CrsMatrix;
329  Epetra_RowMatrixTransposer epmt(const_cast<Epetra_CrsMatrix *>(&functional.d2IdWdX->trilinos_matrix()));
330  epmt.CreateTranspose(false, transpose_CrsMatrix);
331  d2IdXdW.reinit(*transpose_CrsMatrix);
332  }
333 
334  // Form Lagrangian Hessian
335  functional.d2IdWdW->add(1.0,dg->d2RdWdW);
336  functional.d2IdWdX->add(1.0,dg->d2RdWdX);
337  d2IdXdW.add(1.0,d2RdXdW);
338  functional.d2IdXdX->add(1.0,dg->d2RdXdX);
339 
340 
341  // Block Sparsity pattern
342  // L_ww L_wx R_w^T
343  // L_xw L_xx R_x^T
344  // R_w R_x 0
345  // const unsigned int n_constraints = rhs_only.size();
346  // const unsigned int n_flow_var = dg->dof_handler.n_dofs();
347  // const unsigned int n_geom_var = dg->high_order_grid->dof_handler_grid.n_dofs();
348  //BlockDynamicSparsityPattern dsp(3, 3);
349  //dsp.block(0, 0).reinit(n_flow_var, n_flow_var);
350  //dsp.block(0, 1).reinit(n_flow_var, n_geom_var);
351  //dsp.block(0, 2).reinit(n_flow_var, n_constraints);
352 
353  //dsp.block(1, 0).reinit(n_geom_var, n_flow_var);
354  //dsp.block(1, 1).reinit(n_geom_var, n_geom_var);
355  //dsp.block(1, 2).reinit(n_geom_var, n_constraints);
356 
357  //dsp.block(2, 0).reinit(n_constraints, n_flow_var);
358  //dsp.block(2, 1).reinit(n_constraints, n_geom_var);
359  //dsp.block(2, 2).reinit(n_constraints, n_constraints);
360 
361  dealii::TrilinosWrappers::BlockSparseMatrix kkt_hessian;
362  kkt_hessian.reinit(3,3);
363  kkt_hessian.block(0, 0).copy_from( *functional.d2IdWdW);
364  kkt_hessian.block(0, 1).copy_from( *functional.d2IdWdX);
365  kkt_hessian.block(0, 2).copy_from( dRdW_transpose);
366 
367  kkt_hessian.block(1, 0).copy_from( d2IdXdW);
368  kkt_hessian.block(1, 1).copy_from( *functional.d2IdXdX);
369  kkt_hessian.block(1, 2).copy_from( dRdX_transpose);
370 
371  kkt_hessian.block(2, 0).copy_from( dg->system_matrix);
372  kkt_hessian.block(2, 1).copy_from( dg->dRdXv);
373  dealii::TrilinosWrappers::SparsityPattern zero_sparsity_pattern(dg->locally_owned_dofs, MPI_COMM_WORLD, 0);
374  //dealii::TrilinosWrappers::SparseMatrix zero_block;//(n_constraints, n_constraints, 0);
375  //zero_block.reinit(dg->locally_owned_dofs, zero_sparsity_pattern, MPI_COMM_WORLD);
376  // zero_block.reinit(dg->locally_owned_dofs);
377  // dealii::TrilinosWrappers::SparseMatrix zero_block(dg->locally_owned_dofs);
378  // kkt_hessian.block(2, 2).copy_from( zero_block );
379  zero_sparsity_pattern.compress();
380  kkt_hessian.block(2, 2).reinit(zero_sparsity_pattern);
381 
382  kkt_hessian.collect_sizes();
383 
384  pcout << "kkt_hessian.frobenius_norm() " << kkt_hessian.frobenius_norm() << std::endl;
385 
386  // const int n_mpi_processes = dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD);
387  // if (n_mpi_processes == 1) {
388  // dealii::FullMatrix<double> fullA(kkt_hessian.m());
389  // fullA.copy_from(kkt_hessian);
390  // pcout<<"d2IdWdW:"<<std::endl;
391  // if (pcout.is_active()) fullA.print_formatted(pcout.get_stream(), 3, true, 10, "0", 1., 0.);
392  // }
393 
394  dealii::LinearAlgebra::distributed::BlockVector<double> block_vector(3);
395  block_vector.block(0) = dg->solution;
396  block_vector.block(1) = dg->high_order_grid->volume_nodes;
397  block_vector.block(2) = dummy_dual;
398  dealii::LinearAlgebra::distributed::BlockVector<double> Hv(3);
399  dealii::LinearAlgebra::distributed::BlockVector<double> Htv(3);
400  Hv.reinit(block_vector);
401  Htv.reinit(block_vector);
402 
403  kkt_hessian.vmult(Hv,block_vector);
404  kkt_hessian.Tvmult(Htv,block_vector);
405 
406  Htv.sadd(-1.0, Hv);
407 
408  const double vector_norm = Hv.l2_norm();
409  const double vector_abs_diff = Htv.l2_norm();
410  const double vector_rel_diff = vector_abs_diff / vector_norm;
411 
412  const double tol = 1e-11;
413  pcout << "Error: "
414  << " vector_abs_diff: " << vector_abs_diff
415  << " vector_rel_diff: " << vector_rel_diff
416  << std::endl
417  << " vector_abs_diff: " << vector_abs_diff
418  << " vector_rel_diff: " << vector_rel_diff
419  << std::endl;
420  if (vector_abs_diff > tol && vector_rel_diff > tol) fail_bool = true;
421 
422  const int n_mpi_processes = dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD);
423  if (n_mpi_processes == 1) {
424  dealii::FullMatrix<double> fullA(kkt_hessian.m());
425  fullA.copy_from(kkt_hessian);
426  const int n_digits = 8;
427  if (pcout.is_active()) fullA.print_formatted(pcout.get_stream(), n_digits, true, n_digits+7, "0", 1., 0.);
428  }
429 
430  dealii::deallog.depth_console(3);
431  solve_linear (
432  kkt_hessian,
433  Hv, // b
434  Htv, // x
435  all_parameters.linear_solver_param);
436 
437  dealii::LinearAlgebra::distributed::BlockVector<double> diff(3);
438  diff.reinit(block_vector);
439  kkt_hessian.vmult(diff,Htv);
440  diff -= Hv;
441  double diff_norm = diff.l2_norm();
442  std::cout
443  << " diff_norm "
444  << diff_norm
445  << std::endl;
446 
447  return fail_bool;
448 }
449 
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > d2IdWdW
Sparse matrix for storing the functional partial second derivatives.
Definition: functional.h:124
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Parameters related to the linear solver.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
std::pair< unsigned int, double > solve_linear(const dealii::TrilinosWrappers::SparseMatrix &system_matrix, dealii::LinearAlgebra::distributed::Vector< double > &right_hand_side, dealii::LinearAlgebra::distributed::Vector< double > &solution, const Parameters::LinearSolverParam &param)
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > d2IdWdX
Sparse matrix for storing the functional partial second derivatives.
Definition: functional.h:126
real2 evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, real2 > &physics, const dealii::Point< dim, real2 > &phys_coord, const std::array< real2, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &) const
Templated volume integrand.
Definition: solve_KKT.cpp:97
Functional(std::shared_ptr< PHiLiP::DGBase< dim, nspecies, real, dealii::parallel::distributed::Triangulation< dim > >> _dg, const bool _uses_solution_values=true, const bool _uses_solution_gradient=true)
virtual real evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, real > &physics, const unsigned int boundary_id, const dealii::Point< dim, real > &phys_coord, const dealii::Tensor< 1, dim, real > &normal, const std::array< real, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_at_q) const override
Virtual function for computation of cell boundary functional term.
Definition: solve_KKT.cpp:132
Files for the baseline physics.
Definition: ADTypes.hpp:10
std::shared_ptr< DGBase< dim, nspecies, real, dealii::parallel::distributed::Triangulation< dim > > > dg
Smart pointer to DGBase.
Definition: functional.h:50
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71
real evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, real > &physics, const dealii::Point< dim, real > &phys_coord, const std::array< real, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_at_q) const override
non-template functions to override the template classes
Definition: solve_KKT.cpp:170
Main parameter class that contains the various other sub-parameter classes.
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.
Definition: functional.cpp:794
dealii::DoFHandler< dim > dof_handler
Finite Element Collection to represent the high-order grid.
Definition: dg_base.hpp:1175
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > d2IdXdX
Sparse matrix for storing the functional partial second derivatives.
Definition: functional.h:128
const bool uses_solution_values
Will evaluate solution values at quadrature points.
Definition: functional.h:314
LinearSolverParam linear_solver_param
Contains parameters for linear solver.
dealii::IndexSet locally_owned_dofs
Locally own degrees of freedom.
Definition: dg_base.hpp:398
const bool uses_solution_gradient
Will evaluate solution gradient at quadrature points.
Definition: functional.h:315
static std::shared_ptr< DGBase< dim, nspecies, 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.
Definition: dg_factory.cpp:11
dealii::LinearAlgebra::distributed::Vector< double > solution
Current modal coefficients of the solution.
Definition: dg_base.hpp:409
L2_Norm_Functional(std::shared_ptr< PHiLiP::DGBase< dim, nspecies, real >> dg_input, const bool uses_solution_values=true, const bool uses_solution_gradient=false)
Constructor.
Definition: solve_KKT.cpp:88
void parse_parameters(dealii::ParameterHandler &prm)
Retrieve parameters from dealii::ParameterHandler.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
Definition: functional.h:317
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
real2 evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, real2 > &physics, const unsigned int, const dealii::Point< dim, real2 > &phys_coord, const dealii::Tensor< 1, dim, real2 > &, const std::array< real2, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &) const
Virtual function for computation of cell boundary functional term.
Definition: solve_KKT.cpp:114
FadFadType evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, FadFadType > &physics, const dealii::Point< dim, FadFadType > &phys_coord, const std::array< FadFadType, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &soln_grad_at_q) const override
non-template functions to override the template classes
Definition: solve_KKT.cpp:179
Functional base class.
Definition: functional.h:43
static void declare_parameters(dealii::ParameterHandler &prm)
Declare parameters that can be set as inputs and set up the default options.
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
virtual FadFadType evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, FadFadType > &physics, const unsigned int boundary_id, const dealii::Point< dim, FadFadType > &phys_coord, const dealii::Tensor< 1, dim, FadFadType > &normal, const std::array< FadFadType, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &soln_grad_at_q) const override
Virtual function for Sacado computation of cell boundary functional term and derivatives.
Definition: solve_KKT.cpp:150