[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.cpp
1 #include "grid_refinement.h"
2 
3 #include <deal.II/base/quadrature_lib.h>
4 #include <deal.II/distributed/grid_refinement.h>
5 #include <deal.II/distributed/shared_tria.h>
6 #include <deal.II/distributed/tria.h>
7 #include <deal.II/dofs/dof_tools.h>
8 #include <deal.II/fe/fe_values.h>
9 #include <deal.II/grid/grid_in.h>
10 #include <deal.II/grid/grid_out.h>
11 #include <deal.II/grid/grid_refinement.h>
12 #include <deal.II/grid/tria.h>
13 #include <deal.II/numerics/data_out.h>
14 
15 #include <vector>
16 
17 #include "dg/dg_base.hpp"
18 #include "functional/adjoint.h"
19 #include "functional/functional.h"
20 #include "grid_refinement/field.h"
21 #include "grid_refinement/gmsh_out.h"
22 #include "grid_refinement/grid_refinement_continuous.h"
23 #include "grid_refinement/grid_refinement_fixed_fraction.h"
24 #include "grid_refinement/grid_refinement_uniform.h"
25 #include "grid_refinement/msh_out.h"
26 #include "grid_refinement/reconstruct_poly.h"
27 #include "grid_refinement/size_field.h"
28 #include "mesh/high_order_grid.h"
29 #include "parameters/all_parameters.h"
30 #include "parameters/parameters_grid_refinement.h"
31 #include "physics/physics.h"
32 #include "post_processor/physics_post_processor.h"
33 
34 namespace PHiLiP {
35 
36 namespace GridRefinement {
37 
38 // output results functions
39 template <int dim, int nstate, typename real, typename MeshType>
41 {
42  // creating the data out stream
43  dealii::DataOut<dim, dealii::DoFHandler<dim>> data_out;
44  data_out.attach_dof_handler(dg->dof_handler);
45 
46  // dg should always be valid
47  std::shared_ptr< dealii::DataPostprocessor<dim> > post_processor;
48  dealii::Vector<float> subdomain;
49  std::vector<unsigned int> active_fe_indices;
50  dealii::Vector<double> cell_poly_degree;
51  std::vector<std::string> residual_names;
52  if(dg)
53  output_results_vtk_dg(data_out, post_processor, subdomain, active_fe_indices, cell_poly_degree, residual_names);
54 
55  // checking nullptr for each subsection
56  // functional
57  if(functional)
58  output_results_vtk_functional(data_out);
59 
60  // physics
61  if(physics)
62  output_results_vtk_physics(data_out);
63 
64  // adjoint
65  /*
66  std::vector<std::string> dIdw_names_coarse;
67  std::vector<std::string> adjoint_names_coarse;
68  std::vector<std::string> dIdw_names_fine;
69  std::vector<std::string> adjoint_names_fine;
70  if(adjoint)
71  output_results_vtk_adjoint(data_out, dIdw_names_coarse, adjoint_names_coarse, dIdw_names_fine, adjoint_names_fine);
72  */
73 
74  // plotting the error compared to the manufactured solution
75  dealii::Vector<real> l2_error_vec;
76  if(physics && physics->manufactured_solution_function)
77  output_results_vtk_error(data_out, l2_error_vec);
78 
79  // virtual method to call each refinement type
80  // gets a vector of pairs and strings to be returned (needed to be kept in scope for output)
81  std::vector< std::pair<dealii::Vector<real>, std::string> > data_out_vector = output_results_vtk_method();
82 
83  // looping through the vector list to assign the items
84  for(unsigned int index = 0; index < data_out_vector.size(); index++){
85  data_out.add_data_vector(
86  data_out_vector[index].first,
87  data_out_vector[index].second,
88  dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_cell_data);
89  }
90 
91  // performing the ouput on each core
92  const int iproc = dealii::Utilities::MPI::this_mpi_process(mpi_communicator);
93 
94  // default
95  data_out.build_patches();
96 
97  // curved
98  // typename dealii::DataOut<dim,dealii::DoFHandler<dim>>::CurvedCellRegion curved
99  // = dealii::DataOut<dim,dealii::DoFHandler<dim>>::CurvedCellRegion::curved_inner_cells;
100  // const dealii::Mapping<dim> &mapping = (*(dg->high_order_grid.mapping_fe_field));
101  // const int n_subdivisions = dg->max_degree;
102  // data_out.build_patches(mapping, n_subdivisions, curved);
103  // const bool write_higher_order_cells = (dim>1) ? true : false;
104  // dealii::DataOutBase::VtkFlags vtkflags(0.0,igrid,true,dealii::DataOutBase::VtkFlags::ZlibCompressionLevel::best_compression,write_higher_order_cells);
105  // data_out.set_flags(vtkflags);
106 
107  std::string filename = "gridRefinement-"
108  // + dealii::Utilities::int_to_string(dim, 1) + "D-"
109  + dealii::Utilities::int_to_string(iref, 4) + "."
110  + dealii::Utilities::int_to_string(iteration, 4) + "."
111  + dealii::Utilities::int_to_string(iproc, 4) + ".vtu";
112  std::ofstream output(filename);
113  data_out.write_vtu(output);
114 
115  // master file
116  if(iproc == 0){
117  std::vector<std::string> filenames;
118  for(unsigned int iproc = 0; iproc < dealii::Utilities::MPI::n_mpi_processes(mpi_communicator); ++iproc){
119  std::string fn = "gridRefinement-"
120  // + dealii::Utilities::int_to_string(dim, 1) + "D-"
121  + dealii::Utilities::int_to_string(iref, 4) + "."
122  + dealii::Utilities::int_to_string(iteration, 4) + "."
123  + dealii::Utilities::int_to_string(iproc, 4) + ".vtu";
124  filenames.push_back(fn);
125  }
126 
127  std::string master_filename = "gridRefinement-"
128  // + dealii::Utilities::int_to_string(dim, 1) + "D-"
129  + dealii::Utilities::int_to_string(iref, 4) + "."
130  + dealii::Utilities::int_to_string(iteration, 4) + ".pvtu";
131  std::ofstream master_output(master_filename);
132  data_out.write_pvtu_record(master_output, filenames);
133  }
134 
135 }
136 
137 template <int dim, int nstate, typename real, typename MeshType>
139  dealii::DataOut<dim, dealii::DoFHandler<dim>> & data_out,
140  std::shared_ptr< dealii::DataPostprocessor<dim> > &post_processor,
141  dealii::Vector<float> & subdomain,
142  std::vector<unsigned int> & active_fe_indices,
143  dealii::Vector<double> & cell_poly_degree,
144  std::vector<std::string> & residual_names)
145 {
146  post_processor = std::make_shared< PHiLiP::Postprocess::PhysicsPostprocessor<dim,nstate> >(dg->all_parameters);
147  data_out.add_data_vector(dg->solution, *post_processor);
148 
149  subdomain.reinit(dg->triangulation->n_active_cells());
150  for (unsigned int i = 0; i < subdomain.size(); ++i) {
151  subdomain(i) = dg->triangulation->locally_owned_subdomain();
152  }
153  data_out.add_data_vector(subdomain, "subdomain", dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_cell_data);
154 
155  // Output the polynomial degree in each cell
156  dg->dof_handler.get_active_fe_indices(active_fe_indices);
157  dealii::Vector<double> active_fe_indices_dealiivector(active_fe_indices.begin(), active_fe_indices.end());
158  cell_poly_degree = active_fe_indices_dealiivector;
159 
160  data_out.add_data_vector(cell_poly_degree, "PolynomialDegree", dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_cell_data);
161 
162  for(int s=0;s<nstate;++s) {
163  std::string varname = "residual" + dealii::Utilities::int_to_string(s,1);
164  residual_names.push_back(varname);
165  }
166 
167  data_out.add_data_vector(dg->right_hand_side, residual_names, dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_dof_data);
168 }
169 
170 template <int dim, int nstate, typename real, typename MeshType>
172  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out)
173 {
174  // nothing here for now, could plot the contributions or weighting function
175  (void) data_out;
176 }
177 
178 template <int dim, int nstate, typename real, typename MeshType>
180  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out)
181 {
182  // TODO: plot the function value, gradient, tensor, etc.
183  (void) data_out;
184 }
185 
186 template <int dim, int nstate, typename real, typename MeshType>
188  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out,
189  std::vector<std::string> & dIdw_names_coarse,
190  std::vector<std::string> & adjoint_names_coarse,
191  std::vector<std::string> & dIdw_names_fine,
192  std::vector<std::string> & adjoint_names_fine)
193 {
194  // starting with coarse grid results
195  adjoint->reinit();
196  adjoint->coarse_grid_adjoint();
197 
198  for(int s=0;s<nstate;++s) {
199  std::string varname = "dIdw" + dealii::Utilities::int_to_string(s,1) + "_coarse";
200  dIdw_names_coarse.push_back(varname);
201  }
202  data_out.add_data_vector(adjoint->dIdw_coarse, dIdw_names_coarse, dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_dof_data);
203 
204  for(int s=0;s<nstate;++s) {
205  std::string varname = "psi" + dealii::Utilities::int_to_string(s,1) + "_coarse";
206  adjoint_names_coarse.push_back(varname);
207  }
208  data_out.add_data_vector(adjoint->adjoint_coarse, adjoint_names_coarse, dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_dof_data);
209 
210  // next for fine grid results
211  adjoint->fine_grid_adjoint();
212  adjoint->dual_weighted_residual();
213 
214  for(int s=0;s<nstate;++s) {
215  std::string varname = "dIdw" + dealii::Utilities::int_to_string(s,1) + "_fine";
216  dIdw_names_fine.push_back(varname);
217  }
218  // data_out.add_data_vector(adjoint->dIdw_fine, dIdw_names_fine, dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_dof_data);
219 
220  for(int s=0;s<nstate;++s) {
221  std::string varname = "psi" + dealii::Utilities::int_to_string(s,1) + "_fine";
222  adjoint_names_fine.push_back(varname);
223  }
224  // data_out.add_data_vector(adjoint->adjoint_fine, adjoint_names_fine, dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_dof_data);
225 
226  data_out.add_data_vector(adjoint->dual_weighted_residual_fine, "DWR", dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_cell_data);
227 
228  // returning to original state
230 }
231 
232 template <int dim, int nstate, typename real, typename MeshType>
234  dealii::DataOut<dim, dealii::DoFHandler<dim>> &data_out,
235  dealii::Vector<real> & l2_error_vec)
236 {
237  int overintegrate = 10;
238  int poly_degree = dg->get_max_fe_degree();
239  dealii::QGauss<dim> quad_extra(dg->max_degree+overintegrate);
240  dealii::FEValues<dim,dim> fe_values_extra(*(dg->high_order_grid->mapping_fe_field), dg->fe_collection[poly_degree], quad_extra,
241  dealii::update_values | dealii::update_JxW_values | dealii::update_quadrature_points);
242  const unsigned int n_quad_pts = fe_values_extra.n_quadrature_points;
243  std::array<real,nstate> soln_at_q;
244  std::vector<dealii::types::global_dof_index> dofs_indices (fe_values_extra.dofs_per_cell);
245 
246  // L2 error (squared) contribution per cell
247  l2_error_vec.reinit(tria->n_active_cells());
248  for(auto cell = dg->dof_handler.begin_active(); cell < dg->dof_handler.end(); ++cell){
249  if(!cell->is_locally_owned()) continue;
250 
251  fe_values_extra.reinit(cell);
252  cell->get_dof_indices(dofs_indices);
253 
254  real cell_l2_error = 0.0;
255 
256  for(unsigned int iquad = 0; iquad < n_quad_pts; ++iquad){
257  std::fill(soln_at_q.begin(), soln_at_q.end(), 0);
258  for(unsigned int idof = 0; idof < fe_values_extra.dofs_per_cell; ++idof){
259  const unsigned int istate = fe_values_extra.get_fe().system_to_component_index(idof).first;
260  soln_at_q[istate] += dg->solution[dofs_indices[idof]] * fe_values_extra.shape_value_component(idof, iquad, istate);
261  }
262 
263  const dealii::Point<dim> qpoint = (fe_values_extra.quadrature_point(iquad));
264 
265  for(unsigned int istate = 0; istate < nstate; ++istate){
266  const double uexact = physics->manufactured_solution_function->value(qpoint, istate);
267  cell_l2_error += pow(soln_at_q[istate] - uexact, 2) * fe_values_extra.JxW(iquad);
268  }
269  }
270 
271  l2_error_vec[cell->active_cell_index()] += cell_l2_error;
272  }
273 
274  data_out.add_data_vector(l2_error_vec, "l2_error", dealii::DataOut_DoFData<dealii::DoFHandler<dim>,dim>::DataVectorType::type_cell_data);
275 }
276 
277 // constructors for GridRefinementBase
278 template <int dim, int nstate, typename real, typename MeshType>
281  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj_input,
282  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input) :
283  GridRefinementBase<dim,nstate,real,MeshType>(
284  gr_param_input,
285  adj_input,
286  adj_input->functional,
287  adj_input->dg,
288  physics_input){}
289 
290 template <int dim, int nstate, typename real, typename MeshType>
293  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
294  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input,
295  std::shared_ptr< PHiLiP::Functional<dim, nstate, real, MeshType> > functional_input) :
296  GridRefinementBase<dim,nstate,real,MeshType>(
297  gr_param_input,
298  nullptr,
299  functional_input,
300  dg_input,
301  physics_input){}
302 
303 template <int dim, int nstate, typename real, typename MeshType>
306  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
307  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input) :
308  GridRefinementBase<dim,nstate,real,MeshType>(
309  gr_param_input,
310  nullptr,
311  nullptr,
312  dg_input,
313  physics_input){}
314 
315 template <int dim, int nstate, typename real, typename MeshType>
318  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input) :
319  GridRefinementBase<dim,nstate,real,MeshType>(
320  gr_param_input,
321  nullptr,
322  nullptr,
323  dg_input,
324  nullptr){}
325 
326 // main constructor is private for constructor delegation
327 template <int dim, int nstate, typename real, typename MeshType>
330  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj_input,
331  std::shared_ptr< PHiLiP::Functional<dim, nstate, real, MeshType> > functional_input,
332  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg_input,
333  std::shared_ptr< PHiLiP::Physics::PhysicsBase<dim,nstate,real> > physics_input) :
334  grid_refinement_param(gr_param_input),
335  error_indicator_type(gr_param_input.error_indicator),
336  adjoint(adj_input),
337  functional(functional_input),
338  dg(dg_input),
339  physics(physics_input),
340  tria(dg_input->triangulation),
341  iteration(0),
342  mpi_communicator(MPI_COMM_WORLD),
343  pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_communicator)==0){}
344 
345 // factory for different options, ensures that the provided
346 // values match with the selected refinement type
347 
348 // adjoint (dg + functional)
349 template <int dim, int nstate, typename real, typename MeshType>
350 std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
353  std::shared_ptr< PHiLiP::Adjoint<dim, nstate, real, MeshType> > adj,
355 {
356  // all adjoint based methods should be constructed here
359  RefinementMethodEnum refinement_method = gr_param.refinement_method;
360  ErrorIndicatorEnum error_indicator = gr_param.error_indicator;
361 
362  // adjoint (dg + functional)
363  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
364  error_indicator == ErrorIndicatorEnum::adjoint_based){
365  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, adj, physics);
366  }else if(refinement_method == RefinementMethodEnum::continuous &&
367  error_indicator == ErrorIndicatorEnum::adjoint_based){
368  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, adj, physics);
369  }
370 
371  // dg + physics
372  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
373  error_indicator == ErrorIndicatorEnum::hessian_based){
374  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, adj, physics);
375  }else if(refinement_method == RefinementMethodEnum::fixed_fraction &&
376  error_indicator == ErrorIndicatorEnum::error_based){
377  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, adj, physics);
378  }else if(refinement_method == RefinementMethodEnum::continuous &&
379  error_indicator == ErrorIndicatorEnum::hessian_based){
380  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, adj, physics);
381  }else if(refinement_method == RefinementMethodEnum::continuous &&
382  error_indicator == ErrorIndicatorEnum::error_based){
383  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, adj, physics);
384  }
385 
386  // dg
387  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
388  error_indicator == ErrorIndicatorEnum::residual_based){
389  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, adj, physics);
390  }else if(refinement_method == RefinementMethodEnum::continuous &&
391  error_indicator == ErrorIndicatorEnum::residual_based){
392  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, adj, physics);
393  }else if(refinement_method == RefinementMethodEnum::uniform){
394  return std::make_shared< GridRefinement_Uniform<dim,nstate,real,MeshType> >(gr_param, adj, physics);
395  }
396 
397  return create_GridRefinement(gr_param, adj->dg, physics, adj->functional);
398 }
399 
400 // dg + physics + Functional
401 template <int dim, int nstate, typename real, typename MeshType>
402 std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
405  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg,
408 {
409  // hessian and error based
412  RefinementMethodEnum refinement_method = gr_param.refinement_method;
413  ErrorIndicatorEnum error_indicator = gr_param.error_indicator;
414 
415  // dg + physics
416  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
417  error_indicator == ErrorIndicatorEnum::hessian_based){
418  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
419  }else if(refinement_method == RefinementMethodEnum::fixed_fraction &&
420  error_indicator == ErrorIndicatorEnum::error_based){
421  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
422  }else if(refinement_method == RefinementMethodEnum::continuous &&
423  error_indicator == ErrorIndicatorEnum::hessian_based){
424  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
425  }else if(refinement_method == RefinementMethodEnum::continuous &&
426  error_indicator == ErrorIndicatorEnum::error_based){
427  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
428  }
429 
430  // dg
431  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
432  error_indicator == ErrorIndicatorEnum::residual_based){
433  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
434  }else if(refinement_method == RefinementMethodEnum::continuous &&
435  error_indicator == ErrorIndicatorEnum::residual_based){
436  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
437  }else if(refinement_method == RefinementMethodEnum::uniform){
438  return std::make_shared< GridRefinement_Uniform<dim,nstate,real,MeshType> >(gr_param, dg, physics, functional);
439  }
440 
441  return create_GridRefinement(gr_param, dg, physics);
442 }
443 
444 // dg + physics
445 template <int dim, int nstate, typename real, typename MeshType>
446 std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
449  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg,
451 {
452  // hessian and error based
455  RefinementMethodEnum refinement_method = gr_param.refinement_method;
456  ErrorIndicatorEnum error_indicator = gr_param.error_indicator;
457 
458  // dg + physics
459  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
460  error_indicator == ErrorIndicatorEnum::hessian_based){
461  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics);
462  }else if(refinement_method == RefinementMethodEnum::fixed_fraction &&
463  error_indicator == ErrorIndicatorEnum::error_based){
464  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics);
465  }else if(refinement_method == RefinementMethodEnum::continuous &&
466  error_indicator == ErrorIndicatorEnum::hessian_based){
467  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics);
468  }else if(refinement_method == RefinementMethodEnum::continuous &&
469  error_indicator == ErrorIndicatorEnum::error_based){
470  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics);
471  }
472 
473  // dg
474  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
475  error_indicator == ErrorIndicatorEnum::residual_based){
476  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg, physics);
477  }else if(refinement_method == RefinementMethodEnum::continuous &&
478  error_indicator == ErrorIndicatorEnum::residual_based){
479  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg, physics);
480  }else if(refinement_method == RefinementMethodEnum::uniform){
481  return std::make_shared< GridRefinement_Uniform<dim,nstate,real,MeshType> >(gr_param, dg, physics);
482  }
483 
484  return create_GridRefinement(gr_param, dg);
485 }
486 
487 // dg
488 template <int dim, int nstate, typename real, typename MeshType>
489 std::shared_ptr< GridRefinementBase<dim,nstate,real,MeshType> >
492  std::shared_ptr< PHiLiP::DGBase<dim, real, MeshType> > dg)
493 {
494  // residual based or uniform
497  RefinementMethodEnum refinement_method = gr_param.refinement_method;
498  ErrorIndicatorEnum error_indicator = gr_param.error_indicator;
499 
500  if(refinement_method == RefinementMethodEnum::fixed_fraction &&
501  error_indicator == ErrorIndicatorEnum::residual_based){
502  return std::make_shared< GridRefinement_FixedFraction<dim,nstate,real,MeshType> >(gr_param, dg);
503  }else if(refinement_method == RefinementMethodEnum::continuous &&
504  error_indicator == ErrorIndicatorEnum::residual_based){
505  return std::make_shared< GridRefinement_Continuous<dim,nstate,real,MeshType> >(gr_param, dg);
506  }else if(refinement_method == RefinementMethodEnum::uniform){
507  return std::make_shared< GridRefinement_Uniform<dim,nstate,real,MeshType> >(gr_param, dg);
508  }
509 
510  std::cout << "Invalid GridRefinement." << std::endl;
511 
512  return nullptr;
513 }
514 
515 // large amount of templating to be done, move to an .inst file
516 // could also try reducing this with BOOST
517 
518 // dealii::Triangulation<PHILIP_DIM>
524 
530 
531 // dealii::parallel::shared::Triangulation<PHILIP_DIM>
537 
543 
544 #if PHILIP_DIM != 1
545 // dealii::parallel::distributed::Triangulation<PHILIP_DIM>
551 
557 #endif
558 
559 } // namespace GridRefinement
560 
561 } // namespace PHiLiP
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.
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.
unsigned int iteration
Internal refinement steps iteration counter.
RefinementMethod
Controls the underlying method of refinement.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
ErrorIndicator error_indicator
Selected error indicator type.
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.
RefinementMethod refinement_method
Selected method of refinement.
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.
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)
static std::shared_ptr< GridRefinementBase< dim, nstate, real, MeshType > > create_GridRefinement(PHiLiP::Parameters::GridRefinementParam gr_param, std::shared_ptr< PHiLiP::Adjoint< dim, nstate, real, MeshType > > adj, std::shared_ptr< PHiLiP::Physics::PhysicsBase< dim, nstate, real > > physics_input)
Construct grid refinement class based on adjoint and physics.
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.