[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
grid_refinement.h
1 #ifndef __GRID_REFINEMENT_H__
2 #define __GRID_REFINEMENT_H__
3 
4 #include <deal.II/grid/tria.h>
5 
6 #include "dg/dg_base.hpp"
7 #include "functional/adjoint.h"
8 #include "functional/functional.h"
9 #include "grid_refinement/field.h"
10 #include "parameters/all_parameters.h"
11 #include "parameters/parameters_grid_refinement.h"
12 #include "physics/physics.h"
13 
14 namespace PHiLiP {
15 
16 namespace GridRefinement {
17 
19 
37 #if PHILIP_DIM==1
38 template <int dim, int nstate, typename real, typename MeshType = dealii::Triangulation<dim>>
39 #else
40 template <int dim, int nstate, typename real, typename MeshType = dealii::parallel::distributed::Triangulation<dim>>
41 #endif
43 {
44 public:
46  virtual ~GridRefinementBase() = default;
47 
51  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj_input,
52  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input);
53 
57  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
58  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input,
59  std::shared_ptr< PHiLiP::Functional<dim, nstate, real, MeshType> > functional_input);
60 
64  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
65  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input);
66 
70  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input);
71 
72 protected:
76  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj_input,
77  std::shared_ptr< PHiLiP::Functional<dim, nstate, real, MeshType> > functional_input,
78  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
79  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input);
80 
81 public:
83 
89  virtual void refine_grid() = 0;
90 
91 public:
93 
98  void output_results_vtk(const unsigned int iref);
99 
100 protected:
101  // helper output classes
102 
105  dealii::DataOut<dim, dealii::DoFHandler<dim>> & data_out,
106  std::shared_ptr< dealii::DataPostprocessor<dim> > &post_processor,
107  dealii::Vector<float> & subdomain,
108  std::vector<unsigned int> & active_fe_indices,
109  dealii::Vector<double> & cell_poly_degree,
110  std::vector<std::string> & residual_names);
111 
114  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out);
115 
118  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out);
119 
122  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out,
123  std::vector<std::string> & dIdw_names_coarse,
124  std::vector<std::string> & adjoint_names_coarse,
125  std::vector<std::string> & dIdw_names_fine,
126  std::vector<std::string> & adjoint_names_fine);
127 
130  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out,
131  dealii::Vector<real> & l2_error_vec);
132 
133 protected:
135 
137  virtual std::vector< std::pair<dealii::Vector<real>, std::string> > output_results_vtk_method() = 0;
138 
141 
143  // Error indicator type
144  ErrorIndicatorEnum error_indicator_type;
145 
147  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adjoint;
148 
150  std::shared_ptr< PHiLiP::Functional<dim, nstate, real, MeshType> > functional;
151 
153  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg;
154 
155  // high order grid, not a pointer
156  // so needs to be manipulated through dg->high_order_grid
157  // HighOrderGrid<dim,real> high_order_grid
158 
160  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics;
161 
162  // triangulation
163  // dealii::Triangulation<dim, dim> &tria;
164  // Triangulation &tria;
165 
167 
169  std::shared_ptr<MeshType> tria;
170 
172  unsigned int iteration;
173 
174  MPI_Comm mpi_communicator;
175  dealii::ConditionalOStream pcout;
176 
178  const dealii::UpdateFlags volume_update_flags =
179  dealii::update_values |
180  dealii::update_gradients |
181  dealii::update_quadrature_points |
182  dealii::update_JxW_values |
183  dealii::update_inverse_jacobians;
184 
186  const dealii::UpdateFlags face_update_flags =
187  dealii::update_values |
188  dealii::update_gradients |
189  dealii::update_quadrature_points |
190  dealii::update_JxW_values |
191  dealii::update_normal_vectors |
192  dealii::update_jacobians;
193 
195  const dealii::UpdateFlags neighbor_face_update_flags =
196  dealii::update_values |
197  dealii::update_gradients |
198  dealii::update_quadrature_points |
199  dealii::update_JxW_values;
200 };
201 
203 
216 #if PHILIP_DIM==1
217 template <int dim, int nstate, typename real, typename MeshType = dealii::Triangulation<dim>>
218 #else
219 template <int dim, int nstate, typename real, typename MeshType = dealii::parallel::distributed::Triangulation<dim>>
220 #endif
222 {
223 public:
224 
226 
229  static std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
230  create_GridRefinement(
232  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj,
233  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input);
234 
236 
241  static std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
242  create_GridRefinement(
244  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg,
247 
249 
252  static std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
253  create_GridRefinement(
255  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg,
257 
259 
262  static std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
263  create_GridRefinement(
265  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg);
266 
267 };
268 
269 } // namespace GridRefinement
270 
271 } // namespace PHiLiP
272 
273 #endif // __GRID_REFINEMENT_H__
ErrorIndicator
Types of error indicator to be used in the grid refinement.
PHiLiP::Parameters::GridRefinementParam grid_refinement_param
Grid refinement parameters.
std::shared_ptr< PHiLiP::Adjoint< dim, nstate, real, MeshType > > adjoint
Adjoint object (if provided to factory)
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
Adjoint class.
Definition: adjoint.h:39
std::shared_ptr< MeshType > tria
Triangulation object of templated mesh type.
virtual std::vector< std::pair< dealii::Vector< real >, std::string > > output_results_vtk_method()=0
Output refinement method dependent results.
void output_results_vtk_physics(dealii::DataOut< dim, dealii::DoFHandler< dim >> &data_out)
Output refinement results related to the problem physics.
Files for the baseline physics.
Definition: ADTypes.hpp:10
void output_results_vtk_adjoint(dealii::DataOut< dim, dealii::DoFHandler< dim >> &data_out, std::vector< std::string > &dIdw_names_coarse, std::vector< std::string > &adjoint_names_coarse, std::vector< std::string > &dIdw_names_fine, std::vector< std::string > &adjoint_names_fine)
Output refinement results related to the adjoint object.
const dealii::UpdateFlags volume_update_flags
update flags needed at volume points
unsigned int iteration
Internal refinement steps iteration counter.
virtual ~GridRefinementBase()=default
Destructor.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
std::shared_ptr< PHiLiP::Functional< dim, nstate, real, MeshType > > functional
Functional object (if provided to factory, directly or indirectly)
void output_results_vtk_error(dealii::DataOut< dim, dealii::DoFHandler< dim >> &data_out, dealii::Vector< real > &l2_error_vec)
Output refinement results related to the solution error.
const dealii::UpdateFlags face_update_flags
update flags needed at face points
std::shared_ptr< PHiLiP::DGBase< dim, real, MeshType > > dg
Discontinuous Galerkin object.
void output_results_vtk(const unsigned int iref)
Write information about the grid refinement step to a .vtk file.
void output_results_vtk_functional(dealii::DataOut< dim, dealii::DoFHandler< dim >> &data_out)
Output refinement results related to the functional object.
const dealii::UpdateFlags neighbor_face_update_flags
update flags needed at neighbor&#39;s face points
Parameters related to individual grid refinement run.
std::shared_ptr< PHiLiP::Physics::PhysicsBase< dim, nstate, real > > physics
Problem physics (if provided to factory, directly or indirectly)
virtual void refine_grid()=0
Perform call to the grid refinement object of choice.
GridRefinementBase(PHiLiP::Parameters::GridRefinementParam gr_param_input, std::shared_ptr< PHiLiP::Adjoint< dim, nstate, real, MeshType > > adj_input, std::shared_ptr< PHiLiP::Physics::PhysicsBase< dim, nstate, real > > physics_input)
Constructor. Stores the adjoint object, physics and parameters.
Functional base class.
Definition: functional.h:43
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
void output_results_vtk_dg(dealii::DataOut< dim, dealii::DoFHandler< dim >> &data_out, std::shared_ptr< dealii::DataPostprocessor< dim > > &post_processor, dealii::Vector< float > &subdomain, std::vector< unsigned int > &active_fe_indices, dealii::Vector< double > &cell_poly_degree, std::vector< std::string > &residual_names)
Output refinement results related to the DG object.
MPI_Comm mpi_communicator
MPI communicator.