[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
weight_adjusted_mass_inverse_test.cpp
1 #include <iomanip>
2 #include <cmath>
3 #include <limits>
4 #include <type_traits>
5 #include <math.h>
6 #include <iostream>
7 #include <stdlib.h>
8 //#include <ctime>
9 #include <time.h>
10 
11 #include <deal.II/distributed/solution_transfer.h>
12 
13 #include "testing/tests.h"
14 
15 #include<fstream>
16 #include <deal.II/base/parameter_handler.h>
17 #include <deal.II/base/tensor.h>
18 #include <deal.II/numerics/vector_tools.h>
19 
20 #include <deal.II/grid/grid_generator.h>
21 #include <deal.II/grid/grid_refinement.h>
22 #include <deal.II/grid/grid_tools.h>
23 #include <deal.II/grid/grid_out.h>
24 #include <deal.II/grid/grid_in.h>
25 
26 #include <deal.II/dofs/dof_handler.h>
27 #include <deal.II/dofs/dof_tools.h>
28 #include <deal.II/dofs/dof_renumbering.h>
29 
30 #include <deal.II/dofs/dof_accessor.h>
31 
32 #include <deal.II/lac/vector.h>
33 #include <deal.II/lac/dynamic_sparsity_pattern.h>
34 #include <deal.II/lac/sparse_matrix.h>
35 
36 #include <deal.II/meshworker/dof_info.h>
37 
38 #include <deal.II/base/convergence_table.h>
39 
40 // Finally, we take our exact solution from the library as well as volume_quadrature
41 // and additional tools.
42 #include <deal.II/numerics/data_out.h>
43 #include <deal.II/numerics/data_out_dof_data.h>
44 #include <deal.II/numerics/vector_tools.h>
45 #include <deal.II/numerics/vector_tools.templates.h>
46 
47 #include "parameters/all_parameters.h"
48 #include "parameters/parameters.h"
49 #include "dg/dg_base.hpp"
50 #include <deal.II/grid/manifold_lib.h>
51 #include <deal.II/fe/mapping_q.h>
52 #include "dg/dg_factory.hpp"
53 #include "operators/operators.h"
54 //#include <GCL_test.h>
55 
56 const double TOLERANCE = 1E-6;
57 using namespace std;
58 //namespace PHiLiP {
59 
60 template <int dim>
61 class CurvManifold: public dealii::ChartManifold<dim,dim,dim> {
62  virtual dealii::Point<dim> pull_back(const dealii::Point<dim> &space_point) const override;
63  virtual dealii::Point<dim> push_forward(const dealii::Point<dim> &chart_point) const override;
64  virtual dealii::DerivativeForm<1,dim,dim> push_forward_gradient(const dealii::Point<dim> &chart_point) const override;
65 
66  virtual std::unique_ptr<dealii::Manifold<dim,dim> > clone() const override;
67 };
68 
69 template<int dim>
70 dealii::Point<dim> CurvManifold<dim>::pull_back(const dealii::Point<dim> &space_point) const
71 {
72  using namespace PHiLiP;
73  const double pi = atan(1)*4.0;
74  dealii::Point<dim> x_ref;
75  dealii::Point<dim> x_phys;
76  for(int idim=0; idim<dim; idim++){
77  x_ref[idim] = space_point[idim];
78  x_phys[idim] = space_point[idim];
79  }
80  dealii::Vector<double> function(dim);
81  dealii::FullMatrix<double> derivative(dim);
82  double beta =1.0/10.0;
83  double alpha =1.0/10.0;
84  int flag =0;
85  while(flag != dim){
86  if(dim==2){
87  function[0] = x_ref[0] - x_phys[0] +beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
88  function[1] = x_ref[1] - x_phys[1] +beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
89  }
90  else{
91  function[0] = x_ref[0] - x_phys[0] +alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
92  function[1] = x_ref[1] - x_phys[1] +alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
93  function[2] = x_ref[2] - x_phys[2] +1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
94  }
95 
96 
97  if(dim==2){
98  derivative[0][0] = 1.0 - beta* pi/2.0 * std::sin(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
99  derivative[0][1] = - beta*3.0 *pi/2.0 * std::cos(pi/2.0*x_ref[0])*std::sin(3.0*pi/2.0*x_ref[1]);
100 
101  derivative[1][0] = beta*2.0*pi*std::cos(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
102  derivative[1][1] = 1.0 -beta*pi/2.0*std::sin(2.0*pi*(x_ref[0]))*std::sin(pi/2.0*x_ref[1]);
103  }
104  else{
105  derivative[0][0] = 1.0;
106  derivative[0][1] = - alpha*pi*std::sin(pi*x_ref[1]);
107  derivative[0][2] = - alpha*pi*std::sin(pi*x_ref[2]);
108 
109  derivative[1][0] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[0]);
110  derivative[1][1] = 1.0 -alpha*exp(1.0-x_ref[1])*(std::sin(pi*x_ref[0])+std::sin(pi*x_ref[2]));
111  derivative[1][2] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[2]);
112  derivative[2][0] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[0]);
113  derivative[2][1] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[1]);
114  derivative[2][2] = 1.0;
115  }
116 
117  dealii::FullMatrix<double> Jacobian_inv(dim);
118  Jacobian_inv.invert(derivative);
119  dealii::Vector<double> Newton_Step(dim);
120  Jacobian_inv.vmult(Newton_Step, function);
121  for(int idim=0; idim<dim; idim++){
122  x_ref[idim] -= Newton_Step[idim];
123  }
124  flag=0;
125  for(int idim=0; idim<dim; idim++){
126  if(std::abs(function[idim]) < 1e-15)
127  flag++;
128  }
129  if(flag == dim)
130  break;
131  }
132  std::vector<double> function_check(dim);
133  if(dim==2){
134  function_check[0] = x_ref[0] + beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
135  function_check[1] = x_ref[1] + beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
136  }
137  else{
138  function_check[0] = x_ref[0] +alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
139  function_check[1] = x_ref[1] +alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
140  function_check[2] = x_ref[2] +1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
141  }
142  std::vector<double> error(dim);
143  for(int idim=0; idim<dim; idim++)
144  error[idim] = std::abs(function_check[idim] - x_phys[idim]);
145  if (error[0] > 1e-13) {
146  std::cout << "Large error " << error[0] << std::endl;
147  for(int idim=0;idim<dim; idim++)
148  std::cout << "dim " << idim << " xref " << x_ref[idim] << " x_phys " << x_phys[idim] << " function Check " << function_check[idim] << " Error " << error[idim] << " Flag " << flag << std::endl;
149  }
150 
151  return x_ref;
152 }
153 
154 template<int dim>
155 dealii::Point<dim> CurvManifold<dim>::push_forward(const dealii::Point<dim> &chart_point) const
156 {
157  const double pi = atan(1)*4.0;
158 
159  dealii::Point<dim> x_ref;
160  dealii::Point<dim> x_phys;
161  for(int idim=0; idim<dim; idim++)
162  x_ref[idim] = chart_point[idim];
163  double beta = 1.0/10.0;
164  double alpha = 1.0/10.0;
165  if(dim==2){
166  x_phys[0] = x_ref[0] + beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
167  x_phys[1] = x_ref[1] + beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
168  }
169  else{
170  x_phys[0] =x_ref[0] + alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
171  x_phys[1] =x_ref[1] + alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
172  x_phys[2] =x_ref[2] + 1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
173  }
174  return dealii::Point<dim> (x_phys); // Trigonometric
175 }
176 
177 template<int dim>
178 dealii::DerivativeForm<1,dim,dim> CurvManifold<dim>::push_forward_gradient(const dealii::Point<dim> &chart_point) const
179 {
180  const double pi = atan(1)*4.0;
181  dealii::DerivativeForm<1, dim, dim> dphys_dref;
182  double beta = 1.0/10.0;
183  double alpha = 1.0/10.0;
184  dealii::Point<dim> x_ref;
185  for(int idim=0; idim<dim; idim++){
186  x_ref[idim] = chart_point[idim];
187  }
188 
189  if(dim==2){
190  dphys_dref[0][0] = 1.0 - beta*pi/2.0 * std::sin(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
191  dphys_dref[0][1] = - beta*3.0*pi/2.0 * std::cos(pi/2.0*x_ref[0])*std::sin(3.0*pi/2.0*x_ref[1]);
192 
193  dphys_dref[1][0] = beta*2.0*pi*std::cos(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
194  dphys_dref[1][1] = 1.0 -beta*pi/2.0*std::sin(2.0*pi*(x_ref[0]))*std::sin(pi/2.0*x_ref[1]);
195  }
196  else{
197  dphys_dref[0][0] = 1.0;
198  dphys_dref[0][1] = - alpha*pi*std::sin(pi*x_ref[1]);
199  dphys_dref[0][2] = - alpha*pi*std::sin(pi*x_ref[2]);
200 
201  dphys_dref[1][0] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[0]);
202  dphys_dref[1][1] = 1.0 -alpha*exp(1.0-x_ref[1])*(std::sin(pi*x_ref[0])+std::sin(pi*x_ref[2]));
203  dphys_dref[1][2] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[2]);
204  dphys_dref[2][0] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[0]);
205  dphys_dref[2][1] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[1]);
206  dphys_dref[2][2] = 1.0;
207  }
208 
209  return dphys_dref;
210 }
211 
212 template<int dim>
213 std::unique_ptr<dealii::Manifold<dim,dim> > CurvManifold<dim>::clone() const
214 {
215  return std::make_unique<CurvManifold<dim>>();
216 }
217 
218 template <int dim>
219 static dealii::Point<dim> warp (const dealii::Point<dim> &p)
220 {
221  const double pi = atan(1)*4.0;
222  dealii::Point<dim> q = p;
223 
224  double beta =1.0/10.0;
225  double alpha =1.0/10.0;
226  if (dim == 2){
227  q[dim-2] =p[dim-2] + beta*std::cos(pi/2.0 * p[dim-2]) * std::cos(3.0 * pi/2.0 * p[dim-1]);
228  q[dim-1] =p[dim-1] + beta*std::sin(2.0 * pi * (p[dim-2])) * std::cos(pi /2.0 * p[dim-1]);
229  }
230  if(dim==3){
231  q[0] =p[0] + alpha*(std::cos(pi * p[2]) + std::cos(pi * p[1]));
232  q[1] =p[1] + alpha*exp(1.0-p[1])*(std::sin(pi * p[0]) + std::sin(pi* p[2]));
233  q[2] =p[2] + 1.0/20.0*( std::sin(2.0 * pi * p[0]) + std::sin(2.0 * pi * p[1]));
234  }
235 
236  return q;
237 }
238 
239 /****************************
240  * End of Curvilinear Grid
241  * ***************************/
242 
243 template <int dim, int nspecies, typename real>
244 void compute_inverse_mass_matrix(
245  std::shared_ptr < PHiLiP::OPERATOR::OperatorsBase<dim,real,2*dim> > &operators,
246  const std::array<std::vector<real>,PHILIP_DIM> &mapping_support_points,
247  const unsigned int n_metric_dofs,
248  const unsigned int n_quad_pts, const unsigned int n_dofs_cell,
249  const unsigned int poly_degree, const unsigned int grid_degree,
250  const std::vector<real> &quad_weights,
251  dealii::FullMatrix<real> &mass_inv)
252 {
253  std::vector<real> determinant_Jacobian(n_quad_pts);
254  operators->build_local_vol_determinant_Jac(grid_degree, poly_degree, n_quad_pts, n_metric_dofs, mapping_support_points, determinant_Jacobian);
255 
256  std::vector<real> JxW(n_quad_pts);
257  for(unsigned int iquad=0; iquad<n_quad_pts; iquad++){
258  JxW[iquad] = quad_weights[iquad] * determinant_Jacobian[iquad];
259  }
260  dealii::FullMatrix<real> local_mass_matrix(n_dofs_cell);
261  operators->build_local_Mass_Matrix(JxW, n_dofs_cell, n_quad_pts, poly_degree, local_mass_matrix);
262 
263  //For flux reconstruction
264  dealii::FullMatrix<real> Flux_Reconstruction_operator(n_dofs_cell);
265  operators->build_local_Flux_Reconstruction_operator(local_mass_matrix, n_dofs_cell, poly_degree, Flux_Reconstruction_operator);
266  for (unsigned int itest=0; itest<n_dofs_cell; ++itest) {
267  for (unsigned int itrial=0; itrial<n_dofs_cell; ++itrial) {
268  local_mass_matrix[itest][itrial] = local_mass_matrix[itest][itrial] + Flux_Reconstruction_operator[itest][itrial];
269  }
270  }
271 
272  mass_inv.invert(local_mass_matrix);
273 }
274 
275 template <int dim, int nspecies, typename real>
276 void compute_weighted_inverse_mass_matrix(std::shared_ptr < PHiLiP::OPERATOR::OperatorsBase<dim,real,2*dim> > &operators,
277  const std::array<std::vector<real>,PHILIP_DIM> &mapping_support_points, const unsigned int n_metric_dofs,
278  const unsigned int n_quad_pts, const unsigned int n_dofs_cell,
279  const unsigned int poly_degree, const unsigned int grid_degree,
280  const std::vector<real> &quad_weights,
281  dealii::FullMatrix<real> &mass_inv)
282 {
283  std::vector<real> determinant_Jacobian(n_quad_pts);
284  operators->build_local_vol_determinant_Jac(grid_degree, poly_degree, n_quad_pts, n_metric_dofs, mapping_support_points, determinant_Jacobian);
285 
286  std::vector<real> W_J_inv(n_quad_pts);
287  for(unsigned int iquad=0; iquad<n_quad_pts; iquad++){
288  W_J_inv[iquad] = quad_weights[iquad] / determinant_Jacobian[iquad];
289  }
290  dealii::FullMatrix<real> local_mass_matrix(n_dofs_cell);
291  operators->build_local_Mass_Matrix(W_J_inv, n_dofs_cell, n_quad_pts, poly_degree, local_mass_matrix);
292  // For flux reconstruction
293  dealii::FullMatrix<real> Flux_Reconstruction_operator(n_dofs_cell);
294  operators->build_local_Flux_Reconstruction_operator(local_mass_matrix, n_dofs_cell, poly_degree, Flux_Reconstruction_operator);
295  for (unsigned int itest=0; itest<n_dofs_cell; ++itest) {
296  for (unsigned int itrial=0; itrial<n_dofs_cell; ++itrial) {
297  // local_mass_matrix[itest][itrial] = local_mass_matrix[itest][itrial] + Flux_Reconstruction_operator[itest][itrial];
298  mass_inv[itest][itrial] = local_mass_matrix[itest][itrial] + Flux_Reconstruction_operator[itest][itrial];
299  }
300  }
301 }
302 
303 /*******************************
304  * END OF MASS INV FUNCTIONS
305  * ****************************/
306 
307 int main (int argc, char * argv[])
308 {
309  dealii::Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
310  using real = double;
311  using namespace PHiLiP;
312  std::cout << std::setprecision(std::numeric_limits<long double>::digits10 + 1) << std::scientific;
313  const int dim = PHILIP_DIM;
314  const int nspecies = 1;
315  dealii::ParameterHandler parameter_handler;
317  dealii::ConditionalOStream pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD)==0);
318 
319  PHiLiP::Parameters::AllParameters all_parameters_new;
320  all_parameters_new.parse_parameters (parameter_handler);
321 
322  // all_parameters_new.flux_nodes_type = Parameters::AllParameters::FluxNodes::GLL;
323  all_parameters_new.use_curvilinear_split_form=true;
324  all_parameters_new.flux_reconstruction_type = Parameters::AllParameters::Flux_Reconstruction::cPlus;
325 
326  // unsigned int poly_degree = 3;
327  double left = 0.0;
328  double right = 1.0;
329  const bool colorize = true;
330  dealii::ConvergenceTable convergence_table;
331  const unsigned int igrid_start = 0;
332  const unsigned int n_grids = 1;
333  // setup time
334  // time_t tstart=0, tend=0, tstart_weight=0, tend_weight=0;
335  clock_t time_normal, time_weighted;
336 
337  for(unsigned int poly_degree = 6; poly_degree<7; poly_degree++){
338  unsigned int grid_degree = poly_degree;
339  for(unsigned int igrid=igrid_start; igrid<n_grids; ++igrid){
340  pcout<<" Grid Index"<<igrid<<std::endl;
341 
342  //Generate a standard grid
343  using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
344  std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
345  MPI_COMM_WORLD,
346  typename dealii::Triangulation<dim>::MeshSmoothing(
347  dealii::Triangulation<dim>::smoothing_on_refinement |
348  dealii::Triangulation<dim>::smoothing_on_coarsening));
349  dealii::GridGenerator::hyper_cube (*grid, left, right, colorize);
350  grid->refine_global(igrid);
351  pcout<<" made grid for Index"<<igrid<<std::endl;
352 
353  //Warp the grid
354  //IF WANT NON-WARPED GRID COMMENT UNTIL SAYS "NOT COMMENT"
355  dealii::GridTools::transform (&warp<dim>, *grid);
356 
357  // Assign a manifold to have curved geometry
358  const CurvManifold<dim> curv_manifold;
359  unsigned int manifold_id=0; // top face, see GridGenerator::hyper_rectangle, colorize=true
360  grid->reset_all_manifolds();
361  grid->set_all_manifold_ids(manifold_id);
362  grid->set_manifold ( manifold_id, curv_manifold );
363  //"END COMMENT" TO NOT WARP GRID
364 
365  // setup operator
366  // OPERATOR::OperatorsBase<dim,real> operators(&all_parameters_new, nstate, poly_degree, poly_degree, grid_degree);
367  // OPERATOR::OperatorsBaseState<dim,real,nstate,2*dim> operators(&all_parameters_new, poly_degree, poly_degree);
368  // setup DG
369  // std::shared_ptr < PHiLiP::DGBase<dim, nspecies, double> > dg = PHiLiP::DGFactory<dim,nspecies,double>::create_discontinuous_galerkin(&all_parameters_new, poly_degree, grid);
370  std::shared_ptr < PHiLiP::DGBase<dim, nspecies, double> > dg = PHiLiP::DGFactory<dim,nspecies,double>::create_discontinuous_galerkin(&all_parameters_new, poly_degree, poly_degree, grid_degree, grid);
371  dg->allocate_system ();
372 
373  dealii::IndexSet locally_owned_dofs;
374  dealii::IndexSet ghost_dofs;
375  dealii::IndexSet locally_relevant_dofs;
376  locally_owned_dofs = dg->dof_handler.locally_owned_dofs();
377  dealii::DoFTools::extract_locally_relevant_dofs(dg->dof_handler, ghost_dofs);
378  locally_relevant_dofs = ghost_dofs;
379  ghost_dofs.subtract_set(locally_owned_dofs);
380 
381  // setup metric and solve
382  const unsigned int max_dofs_per_cell = dg->dof_handler.get_fe_collection().max_dofs_per_cell();
383  std::vector<dealii::types::global_dof_index> current_dofs_indices(max_dofs_per_cell);
384  const unsigned int n_dofs_cell = dg->operators->fe_collection_basis[poly_degree].dofs_per_cell;
385  const unsigned int n_quad_pts = dg->operators->volume_quadrature_collection[poly_degree].size();
386 
387  const dealii::FESystem<dim> &fe_metric = (dg->high_order_grid->fe_system);
388  const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
389  auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
390 
391  //loop over cells and do normal inv
392  pcout<<"time to do normal"<<std::endl;
393  // tstart = time(0);
394  time_normal = clock();
395  for (auto current_cell = dg->dof_handler.begin_active(); current_cell!=dg->dof_handler.end(); ++current_cell, ++metric_cell) {
396  if (!current_cell->is_locally_owned()) continue;
397 
398  // pcout<<"grid degree "<<grid_degree<<" metric dofs "<<n_metric_dofs<<std::endl;
399  std::vector<dealii::types::global_dof_index> current_metric_dofs_indices(n_metric_dofs);
400  metric_cell->get_dof_indices (current_metric_dofs_indices);
401  std::array<std::vector<real>,dim> mapping_support_points;
402  for(int idim=0; idim<dim; idim++){
403  mapping_support_points[idim].resize(n_metric_dofs/dim);
404  }
405  dealii::QGaussLobatto<dim> vol_GLL(grid_degree +1);
406  for (unsigned int igrid_node = 0; igrid_node< n_metric_dofs/dim; ++igrid_node) {
407  for (unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
408  const real val = (dg->high_order_grid->volume_nodes[current_metric_dofs_indices[idof]]);
409  const unsigned int istate = fe_metric.system_to_component_index(idof).first;
410  mapping_support_points[istate][igrid_node] += val * fe_metric.shape_value_component(idof,vol_GLL.point(igrid_node),istate);
411  }
412  }
413  const std::vector<real> &quad_weights = dg->operators->volume_quadrature_collection[poly_degree].get_weights();
414 
415  //build ESFR mass matrix and invert regularly
416  dealii::FullMatrix<real> mass_inv(n_dofs_cell);
417  time_normal = clock();
418  compute_inverse_mass_matrix(dg->operators, mapping_support_points, n_metric_dofs/dim, n_quad_pts, n_dofs_cell, poly_degree, grid_degree, quad_weights, mass_inv);
419  time_normal = clock()-time_normal;
420 
421  }//end of cell loop
422 
423  // tend = time(0);
424  // time_normal = clock()-time_normal;
425 
426  pcout<<"time to do weighted"<<std::endl;
427  metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
428  //loop over cells and do weight inv
429  // tstart_weight = time(0);
430  time_weighted = clock();
431  for (auto current_cell = dg->dof_handler.begin_active(); current_cell!=dg->dof_handler.end(); ++current_cell, ++metric_cell) {
432  if (!current_cell->is_locally_owned()) continue;
433 
434  // pcout<<"grid degree "<<grid_degree<<" metric dofs "<<n_metric_dofs<<std::endl;
435  std::vector<dealii::types::global_dof_index> current_metric_dofs_indices(n_metric_dofs);
436  metric_cell->get_dof_indices (current_metric_dofs_indices);
437  std::array<std::vector<real>,dim> mapping_support_points;
438  for(int idim=0; idim<dim; idim++){
439  mapping_support_points[idim].resize(n_metric_dofs/dim);
440  }
441  dealii::QGaussLobatto<dim> vol_GLL(grid_degree +1);
442  for (unsigned int igrid_node = 0; igrid_node< n_metric_dofs/dim; ++igrid_node) {
443  for (unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
444  const real val = (dg->high_order_grid->volume_nodes[current_metric_dofs_indices[idof]]);
445  const unsigned int istate = fe_metric.system_to_component_index(idof).first;
446  mapping_support_points[istate][igrid_node] += val * fe_metric.shape_value_component(idof,vol_GLL.point(igrid_node),istate);
447  }
448  }
449  const std::vector<real> &quad_weights = dg->operators->volume_quadrature_collection[poly_degree].get_weights();
450 
451  //do weight-adjusted inverse ESFR mass matrix
452  dealii::FullMatrix<real> mass_inv(n_dofs_cell);
453  time_weighted = clock();
454  compute_weighted_inverse_mass_matrix(dg->operators, mapping_support_points, n_metric_dofs/dim, n_quad_pts, n_dofs_cell, poly_degree, grid_degree, quad_weights, mass_inv);
455  time_weighted = clock() - time_weighted;
456 
457  }//end of cell loop
458 
459  // tend_weight = time(0);
460  // time_weighted = clock() - time_weighted;
461  }//end grid refinement loop
462  }//end poly degree loop
463 
464  // pcout<<"Normal Mass inv took "<<difftime(tend, tstart)<<" seconds (s)."<<std::endl;
465  // pcout<<"Weighted Mass inv took "<<difftime(tend_weight, tstart_weight)<<" seconds (s)."<<std::endl;
466  // pcout<<"Normal Mass inv took "<<time_normal ((float)time_normal)/CLOCKS_PER_SEC<<" seconds (s)."<<std::endl;
467  printf(" it took %g seconds normal\n",((float)time_normal)/CLOCKS_PER_SEC);
468  printf(" it took %g seconds weighted\n",((float)time_weighted)/CLOCKS_PER_SEC);
469  // pcout<<"Weighted Mass inv took "<<time_weighted<<" seconds (s)."<<std::endl;
470 
471  // if(difftime(tend, tstart) < difftime(tend_weight, tstart_weight)){
472  if(time_normal < time_weighted){
473  pcout<<"Weighted inv not faster!"<<std::endl;
474  return 1;
475  }
476  else {
477  return 0;
478  }
479 }//end of main
virtual dealii::Point< dim > pull_back(const dealii::Point< dim > &space_point) const override
See dealii::Manifold.
Files for the baseline physics.
Definition: ADTypes.hpp:10
Main parameter class that contains the various other sub-parameter classes.
Flux_Reconstruction flux_reconstruction_type
Store flux reconstruction type.
virtual std::unique_ptr< dealii::Manifold< dim, dim > > clone() const override
See dealii::Manifold.
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
virtual dealii::DerivativeForm< 1, dim, dim > push_forward_gradient(const dealii::Point< dim > &chart_point) const override
See dealii::Manifold.
void parse_parameters(dealii::ParameterHandler &prm)
Retrieve parameters from dealii::ParameterHandler.
virtual dealii::Point< dim > push_forward(const dealii::Point< dim > &chart_point) const override
See dealii::Manifold.
static void declare_parameters(dealii::ParameterHandler &prm)
Declare parameters that can be set as inputs and set up the default options.
Operator base class.
Definition: operators.h:53
bool use_curvilinear_split_form
Flag to use curvilinear metric split form.