[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
target_functional.h
1 #ifndef __TARGET_FUNCTIONAL_H__
2 #define __TARGET_FUNCTIONAL_H__
3 
4 /* includes */
5 #include <deal.II/differentiation/ad/sacado_math.h>
6 #include <deal.II/differentiation/ad/sacado_number_types.h>
7 #include <deal.II/differentiation/ad/sacado_product_types.h>
8 #include <deal.II/fe/fe_q.h>
9 #include <deal.II/fe/fe_values.h>
10 #include <deal.II/lac/la_parallel_vector.h>
11 
12 #include <Sacado.hpp>
13 #include <iostream>
14 #include <vector>
15 
16 #include "dg/dg_base.hpp"
17 #include "functional.h"
18 #include "physics/physics.h"
19 
20 namespace PHiLiP {
21 
23 
43 template <int dim, int nstate, typename real>
44 class TargetFunctional : public Functional<dim,nstate,real>
45 {
46 public:
47  using FadType = Sacado::Fad::DFad<real>;
48  using FadFadType = Sacado::Fad::DFad<FadType>;
49 
62 
63 protected:
68 
73 
75 
80 
83  // * us, but is a typical bug that other people have. This 'using' imports the base class function
84  // * to our derived class even though we don't need it.
85  // */
86  //using Functional<dim,nstate,real>::evaluate_cell_boundary;
87 
89 
94 
95 
98 
99 protected:
101  const dealii::LinearAlgebra::distributed::Vector<real> target_solution;
102 
103 public:
105 
112  std::shared_ptr<DGBase<dim,real>> dg_input,
113  const bool uses_solution_values = true,
114  const bool uses_solution_gradient = true);
116 
123  std::shared_ptr<DGBase<dim,real>> dg_input,
124  const dealii::LinearAlgebra::distributed::Vector<real> &target_solution,
125  const bool uses_solution_values = true,
126  const bool uses_solution_gradient = true);
127 
129 
133  std::shared_ptr<DGBase<dim,real>> dg_input,
134  std::shared_ptr< Physics::PhysicsBase<dim,nstate,Sacado::Fad::DFad<Sacado::Fad::DFad<real>>> > _physics_fad_fad,
135  const bool uses_solution_values = true,
136  const bool uses_solution_gradient = true);
137 
139 
143  std::shared_ptr<DGBase<dim,real>> dg_input,
144  const dealii::LinearAlgebra::distributed::Vector<real> &target_solution,
145  std::shared_ptr< Physics::PhysicsBase<dim,nstate,Sacado::Fad::DFad<Sacado::Fad::DFad<real>>> > _physics_fad_fad,
146  const bool uses_solution_values = true,
147  const bool uses_solution_gradient = true);
148 
149 public:
151 
164  virtual real evaluate_functional(
165  const bool compute_dIdW = false,
166  const bool compute_dIdX = false,
167  const bool compute_d2I = false) override;
168 
171  dealii::LinearAlgebra::distributed::Vector<real> evaluate_dIdw_finiteDifferences(
174  const double stepsize);
175 
178  dealii::LinearAlgebra::distributed::Vector<real> evaluate_dIdX_finiteDifferences(
181  const double stepsize);
182 
183 private:
185  template <typename real2>
188  const std::vector< real2 > &soln_coeff,
189  const std::vector< real > &target_soln_coeff,
190  const dealii::FESystem<dim> &fe_solution,
191  const std::vector< real2 > &coords_coeff,
192  const dealii::FESystem<dim> &fe_metric,
193  const dealii::Quadrature<dim> &volume_quadrature) const;
194 
195 protected:
197  virtual real evaluate_volume_cell_functional(
199  const std::vector< real > &soln_coeff,
200  const std::vector< real > &target_soln_coeff,
201  const dealii::FESystem<dim> &fe_solution,
202  const std::vector< real > &coords_coeff,
203  const dealii::FESystem<dim> &fe_metric,
204  const dealii::Quadrature<dim> &volume_quadrature) const;
206  virtual Sacado::Fad::DFad<Sacado::Fad::DFad<real>> evaluate_volume_cell_functional(
207  const Physics::PhysicsBase<dim,nstate,Sacado::Fad::DFad<Sacado::Fad::DFad<real>>> &physics_fad_fad,
208  const std::vector< Sacado::Fad::DFad<Sacado::Fad::DFad<real>> > &soln_coeff,
209  const std::vector< real > &target_soln_coeff,
210  const dealii::FESystem<dim> &fe_solution,
211  const std::vector< Sacado::Fad::DFad<Sacado::Fad::DFad<real>> > &coords_coeff,
212  const dealii::FESystem<dim> &fe_metric,
213  const dealii::Quadrature<dim> &volume_quadrature) const;
214 
215 private:
217  template <typename real2>
220  const unsigned int boundary_id,
221  const std::vector< real2 > &soln_coeff,
222  const std::vector< real > &target_soln_coeff,
223  const dealii::FESystem<dim> &fe_solution,
224  const std::vector< real2 > &coords_coeff,
225  const dealii::FESystem<dim> &fe_metric,
226  const dealii::Quadrature<dim-1> &face_quadrature,
227  const unsigned int face_number) const;
228 protected:
232  const unsigned int boundary_id,
233  const std::vector< real > &soln_coeff,
234  const std::vector< real > &target_soln_coeff,
235  const dealii::FESystem<dim> &fe_solution,
236  const std::vector< real > &coords_coeff,
237  const dealii::FESystem<dim> &fe_metric,
238  const dealii::Quadrature<dim-1> &face_quadrature,
239  const unsigned int face_number) const;
240 
242  virtual Sacado::Fad::DFad<Sacado::Fad::DFad<real>> evaluate_boundary_cell_functional(
243  const Physics::PhysicsBase<dim,nstate,Sacado::Fad::DFad<Sacado::Fad::DFad<real>>> &physics_fad_fad,
244  const unsigned int boundary_id,
245  const std::vector< Sacado::Fad::DFad<Sacado::Fad::DFad<real>> > &soln_coeff,
246  const std::vector< real > &target_soln_coeff,
247  const dealii::FESystem<dim> &fe_solution,
248  const std::vector< Sacado::Fad::DFad<Sacado::Fad::DFad<real>> > &coords_coeff,
249  const dealii::FESystem<dim> &fe_metric,
250  const dealii::Quadrature<dim-1> &face_quadrature,
251  const unsigned int face_number) const;
252 
254 
257  const dealii::Point<dim,real> &/*phys_coord*/,
258  const std::array<real,nstate> &soln_at_q,
259  const std::array<real,nstate> &target_soln_at_q,
260  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_at_q*/,
261  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*target_soln_grad_at_q*/) const
262  {
263  real l2error = 0;
264 
265  for (int istate=0; istate<nstate; ++istate) {
266  l2error += std::pow(soln_at_q[istate] - target_soln_at_q[istate], 2);
267  }
268 
269  return l2error;
270  }
272 
275  const dealii::Point<dim,FadFadType> &/*phys_coord*/,
276  const std::array<FadFadType,nstate> &soln_at_q,
277  const std::array<real,nstate> &target_soln_at_q,
278  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*soln_grad_at_q*/,
279  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*target_soln_grad_at_q*/) const
280  {
281  FadFadType l2error = 0;
282  for (int istate=0; istate<nstate; ++istate) {
283  l2error += std::pow(soln_at_q[istate] - target_soln_at_q[istate], 2);
284  }
285  return l2error;
286  }
287 
289 
292  const unsigned int /*boundary_id*/,
293  const dealii::Point<dim,real> &,//phys_coord,
294  const dealii::Tensor<1,dim,real> &/*normal*/,
295  const std::array<real,nstate> &soln_at_q,
296  const std::array<real,nstate> &target_soln_at_q,
297  const std::array<dealii::Tensor<1,dim,real>,nstate> &,//soln_grad_at_q,
298  const std::array<dealii::Tensor<1,dim,real>,nstate> &)//target_soln_grad_at_q)
299  const
300  {
301  real l2error = 0;
302  for (int istate=0; istate<nstate; ++istate) {
303  l2error += std::pow(soln_at_q[istate] - target_soln_at_q[istate], 2);
304  }
305  return l2error;
306  }
308 
311  const unsigned int /*boundary_id*/,
312  const dealii::Point<dim,FadFadType> &,//phys_coord,
313  const dealii::Tensor<1,dim,FadFadType> &/*normal*/,
314  const std::array<FadFadType,nstate> &soln_at_q,
315  const std::array<real,nstate> &target_soln_at_q,
316  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &,//soln_grad_at_q,
317  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &)//target_soln_grad_at_q)
318  const
319  {
320  FadFadType l2error = 0;
321  for (int istate=0; istate<nstate; ++istate) {
322  l2error += std::pow(soln_at_q[istate] - target_soln_at_q[istate], 2);
323  }
324  return l2error;
325  }
326 
327  // /// Virtual function for computation of cell boundary functional term
328  // /** Used only in the computation of evaluate_function(). If not overriden returns 0. */
329  // virtual real evaluate_cell_boundary(
330  // const PHiLiP::Physics::PhysicsBase<dim,nstate,real> &/*physics*/,
331  // const unsigned int /*boundary_id*/,
332  // const dealii::FEFaceValues<dim,dim> &/*fe_values_boundary*/,
333  // std::vector<real> /*soln_coeff*/,
334  // std::vector<real> /*target_soln_coeff*/)
335  // {
336  // return (real) 0.0;
337  // }
338 
339  // /// Virtual function for Sacado computation of cell boundary functional term and derivatives
340  // /** Used only in the computation of evaluate_dIdw(). If not overriden returns 0. */
341  // virtual FadFadType evaluate_cell_boundary(
342  // const PHiLiP::Physics::PhysicsBase<dim,nstate,FadFadType> &/*physics*/,
343  // const unsigned int /*boundary_id*/,
344  // const dealii::FEFaceValues<dim,dim> &/*fe_values_boundary*/,
345  // std::vector<FadFadType> /*soln_coeff*/,
346  // std::vector<real> /*target_soln_coeff*/)
347  // {
348  // return (FadFadType) 0.0;
349  // }
350 
351 }; // TargetFunctional class
352 } // PHiLiP namespace
353 
354 #endif // __TARGET_FUNCTIONAL_H__
const bool uses_solution_gradient
Will evaluate solution gradient at quadrature points.
Definition: functional.h:315
TargetFunctional base class.
const bool uses_solution_values
Will evaluate solution values at quadrature points.
Definition: functional.h:314
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
virtual real evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &, const unsigned int, const dealii::Point< dim, real > &, const dealii::Tensor< 1, dim, real > &, const std::array< real, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &) const
Virtual function for computation of cell face functional term.
dealii::LinearAlgebra::distributed::Vector< real > evaluate_dIdX_finiteDifferences(DGBase< dim, real > &dg, const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const double stepsize)
virtual real evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &, const dealii::Point< dim, real > &, const std::array< real, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &) const
Virtual function for computation of cell volume functional term.
Files for the baseline physics.
Definition: ADTypes.hpp:10
virtual real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Evaluates the functional derivative with respect to the solution variable.
real2 evaluate_boundary_cell_functional(const Physics::PhysicsBase< dim, nstate, real2 > &physics, const unsigned int boundary_id, const std::vector< real2 > &soln_coeff, const std::vector< real > &target_soln_coeff, const dealii::FESystem< dim > &fe_solution, const std::vector< real2 > &coords_coeff, const dealii::FESystem< dim > &fe_metric, const dealii::Quadrature< dim-1 > &face_quadrature, const unsigned int face_number) const
Templated function to evaluate a cell&#39;s face functional.
TargetFunctional(std::shared_ptr< DGBase< dim, real >> dg_input, const bool uses_solution_values=true, const bool uses_solution_gradient=true)
Constructor.
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
virtual FadFadType evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType > &, const unsigned int, const dealii::Point< dim, FadFadType > &, const dealii::Tensor< 1, dim, FadFadType > &, const std::array< FadFadType, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &) const
Virtual function for Sacado computation of cell face functional term and derivatives.
const dealii::LinearAlgebra::distributed::Vector< real > target_solution
Solution used to evaluate target functional.
virtual FadFadType evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType > &, const dealii::Point< dim, FadFadType > &, const std::array< FadFadType, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &) const
Virtual function for Sacado computation of cell volume functional term and derivatives.
real2 evaluate_volume_cell_functional(const Physics::PhysicsBase< dim, nstate, real2 > &physics, const std::vector< real2 > &soln_coeff, const std::vector< real > &target_soln_coeff, const dealii::FESystem< dim > &fe_solution, const std::vector< real2 > &coords_coeff, const dealii::FESystem< dim > &fe_metric, const dealii::Quadrature< dim > &volume_quadrature) const
Templated function to evaluate a cell&#39;s volume functional.
dealii::LinearAlgebra::distributed::Vector< real > evaluate_dIdw_finiteDifferences(DGBase< dim, real > &dg, const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const double stepsize)
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
std::shared_ptr< Physics::PhysicsBase< dim, nstate, FadFadType > > physics_fad_fad
Physics that should correspond to the one in DGBase.
Definition: functional.h:54
Functional base class.
Definition: functional.h:43
std::shared_ptr< DGBase< dim, real, dealii::parallel::distributed::Triangulation< dim > > > dg
Smart pointer to DGBase.
Definition: functional.h:50
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82