Reference documentation for deal.II version 9.2.0
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
smoothness_estimator.cc
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2018 - 2020 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
18 
19 #include <deal.II/fe/fe_series.h>
20 
21 #include <deal.II/hp/dof_handler.h>
23 
27 #include <deal.II/lac/la_vector.h>
33 #include <deal.II/lac/vector.h>
34 
36 
37 #include <algorithm>
38 #include <cmath>
39 #include <limits>
40 #include <utility>
41 
42 
44 
45 
46 namespace SmoothnessEstimator
47 {
48  namespace
49  {
53  template <int dim, typename CoefficientType>
54  void
55  resize(Table<dim, CoefficientType> &coeff, const unsigned int N)
56  {
57  TableIndices<dim> size;
58  for (unsigned int d = 0; d < dim; d++)
59  size[d] = N;
60  coeff.reinit(size);
61  }
62  } // namespace
63 
64 
65 
66  namespace Legendre
67  {
68  namespace
69  {
84  template <int dim>
85  std::pair<bool, unsigned int>
86  index_sum_less_than_N(const TableIndices<dim> &ind, const unsigned int N)
87  {
88  unsigned int v = 0;
89  for (unsigned int i = 0; i < dim; ++i)
90  v += ind[i];
91 
92  return std::make_pair((v < N), v);
93  }
94  } // namespace
95 
96 
97 
98  template <int dim, int spacedim, typename VectorType>
99  void
101  const hp::DoFHandler<dim, spacedim> &dof_handler,
102  const VectorType & solution,
103  Vector<float> & smoothness_indicators,
104  const VectorTools::NormType regression_strategy,
105  const double smallest_abs_coefficient,
106  const bool only_flagged_cells)
107  {
108  using number = typename VectorType::value_type;
109  using number_coeff =
111 
112  smoothness_indicators.reinit(
113  dof_handler.get_triangulation().n_active_cells());
114 
115  unsigned int n_modes;
116  Table<dim, number_coeff> expansion_coefficients;
117 
118  Vector<number> local_dof_values;
119  std::vector<double> converted_indices;
120  std::pair<std::vector<unsigned int>, std::vector<double>> res;
121  for (const auto &cell : dof_handler.active_cell_iterators())
122  if (cell->is_locally_owned())
123  {
124  if (!only_flagged_cells || cell->refine_flag_set() ||
125  cell->coarsen_flag_set())
126  {
127  n_modes = fe_legendre.get_n_coefficients_per_direction(
128  cell->active_fe_index());
129  resize(expansion_coefficients, n_modes);
130 
131  local_dof_values.reinit(cell->get_fe().dofs_per_cell);
132  cell->get_dof_values(solution, local_dof_values);
133 
134  fe_legendre.calculate(local_dof_values,
135  cell->active_fe_index(),
136  expansion_coefficients);
137 
138  // We fit our exponential decay of expansion coefficients to the
139  // provided regression_strategy on each possible value of |k|.
140  // To this end, we use FESeries::process_coefficients() to
141  // rework coefficients into the desired format.
142  res = FESeries::process_coefficients<dim>(
143  expansion_coefficients,
144  [n_modes](const TableIndices<dim> &indices) {
145  return index_sum_less_than_N(indices, n_modes);
146  },
147  regression_strategy,
148  smallest_abs_coefficient);
149 
150  Assert(res.first.size() == res.second.size(),
151  ExcInternalError());
152 
153  // Last, do the linear regression.
154  float regularity = std::numeric_limits<float>::infinity();
155  if (res.first.size() > 1)
156  {
157  // Prepare linear equation for the logarithmic least squares
158  // fit.
159  converted_indices.assign(res.first.begin(),
160  res.first.end());
161 
162  for (auto &residual_element : res.second)
163  residual_element = std::log(residual_element);
164 
165  const std::pair<double, double> fit =
166  FESeries::linear_regression(converted_indices,
167  res.second);
168  regularity = static_cast<float>(-fit.first);
169  }
170 
171  smoothness_indicators(cell->active_cell_index()) = regularity;
172  }
173  else
174  smoothness_indicators(cell->active_cell_index()) =
175  numbers::signaling_nan<float>();
176  }
177  }
178 
179 
180 
181  template <int dim, int spacedim, typename VectorType>
182  void
184  FESeries::Legendre<dim, spacedim> & fe_legendre,
185  const hp::DoFHandler<dim, spacedim> &dof_handler,
186  const VectorType & solution,
187  Vector<float> & smoothness_indicators,
188  const ComponentMask & coefficients_predicate,
189  const double smallest_abs_coefficient,
190  const bool only_flagged_cells)
191  {
192  Assert(smallest_abs_coefficient >= 0.,
193  ExcMessage("smallest_abs_coefficient should be non-negative."));
194 
195  using number = typename VectorType::value_type;
196  using number_coeff =
198 
199  smoothness_indicators.reinit(
200  dof_handler.get_triangulation().n_active_cells());
201 
202  unsigned int n_modes;
203  Table<dim, number_coeff> expansion_coefficients;
204  Vector<number> local_dof_values;
205 
206  // auxiliary vector to do linear regression
207  const unsigned int max_degree =
208  dof_handler.get_fe_collection().max_degree();
209 
210  std::vector<double> x, y;
211  x.reserve(max_degree);
212  y.reserve(max_degree);
213 
214  for (const auto &cell : dof_handler.active_cell_iterators())
215  if (cell->is_locally_owned())
216  {
217  if (!only_flagged_cells || cell->refine_flag_set() ||
218  cell->coarsen_flag_set())
219  {
220  n_modes = fe_legendre.get_n_coefficients_per_direction(
221  cell->active_fe_index());
222  resize(expansion_coefficients, n_modes);
223 
224  const unsigned int pe = cell->get_fe().degree;
225  Assert(pe > 0, ExcInternalError());
226 
227  // since we use coefficients with indices [1,pe] in each
228  // direction, the number of coefficients we need to calculate is
229  // at least N=pe+1
230  AssertIndexRange(pe, n_modes);
231 
232  local_dof_values.reinit(cell->get_fe().dofs_per_cell);
233  cell->get_dof_values(solution, local_dof_values);
234 
235  fe_legendre.calculate(local_dof_values,
236  cell->active_fe_index(),
237  expansion_coefficients);
238 
239  // choose the smallest decay of coefficients in each direction,
240  // i.e. the maximum decay slope k_v as in exp(-k_v)
241  double k_v = std::numeric_limits<double>::infinity();
242  for (unsigned int d = 0; d < dim; ++d)
243  {
244  x.resize(0);
245  y.resize(0);
246 
247  // will use all non-zero coefficients allowed by the
248  // predicate function
249  for (unsigned int i = 0; i <= pe; ++i)
250  if (coefficients_predicate[i])
251  {
252  TableIndices<dim> ind;
253  ind[d] = i;
254  const double coeff_abs =
255  std::abs(expansion_coefficients(ind));
256 
257  if (coeff_abs > smallest_abs_coefficient)
258  {
259  x.push_back(i);
260  y.push_back(std::log(coeff_abs));
261  }
262  }
263 
264  // in case we don't have enough non-zero coefficient to fit,
265  // skip this direction
266  if (x.size() < 2)
267  continue;
268 
269  const std::pair<double, double> fit =
271 
272  // decay corresponds to negative slope
273  // take the lesser negative slope along each direction
274  k_v = std::min(k_v, -fit.first);
275  }
276 
277  smoothness_indicators(cell->active_cell_index()) =
278  static_cast<float>(k_v);
279  }
280  else
281  smoothness_indicators(cell->active_cell_index()) =
282  numbers::signaling_nan<float>();
283  }
284  }
285 
286 
287 
288  template <int dim, int spacedim>
291  {
292  // Default number of coefficients per direction.
293  std::vector<unsigned int> n_coefficients_per_direction;
294  for (unsigned int i = 0; i < fe_collection.size(); ++i)
295  n_coefficients_per_direction.push_back(fe_collection[i].degree + 1);
296 
297  // Default quadrature collection.
298  //
299  // We initialize a FESeries::Legendre expansion object object which will
300  // be used to calculate the expansion coefficients. In addition to the
301  // hp::FECollection, we need to provide quadrature rules hp::QCollection
302  // for integration on the reference cell.
303  // We will need to assemble the expansion matrices for each of the finite
304  // elements we deal with, i.e. the matrices F_k,j. We have to do that for
305  // each of the finite elements in use. To that end we need a quadrature
306  // rule. As a default, we use the same quadrature formula for each finite
307  // element, namely a Gauss formula that yields exact results for the
308  // highest order Legendre polynomial used.
309  //
310  // We start with the zeroth Legendre polynomial which is just a constant,
311  // so the highest Legendre polynomial will be of order (n_modes - 1).
312  hp::QCollection<dim> q_collection;
313  for (unsigned int i = 0; i < fe_collection.size(); ++i)
314  {
315  const QGauss<dim> quadrature(n_coefficients_per_direction[i]);
316  const QSorted<dim> quadrature_sorted(quadrature);
317  q_collection.push_back(quadrature_sorted);
318  }
319 
320  return FESeries::Legendre<dim, spacedim>(n_coefficients_per_direction,
321  fe_collection,
322  q_collection);
323  }
324  } // namespace Legendre
325 
326 
327 
328  namespace Fourier
329  {
330  namespace
331  {
346  template <int dim>
347  std::pair<bool, unsigned int>
348  index_norm_greater_than_zero_and_less_than_N_squared(
349  const TableIndices<dim> &ind,
350  const unsigned int N)
351  {
352  unsigned int v = 0;
353  for (unsigned int i = 0; i < dim; ++i)
354  v += ind[i] * ind[i];
355 
356  return std::make_pair((v > 0 && v < N * N), v);
357  }
358  } // namespace
359 
360 
361 
362  template <int dim, int spacedim, typename VectorType>
363  void
365  const hp::DoFHandler<dim, spacedim> &dof_handler,
366  const VectorType & solution,
367  Vector<float> & smoothness_indicators,
368  const VectorTools::NormType regression_strategy,
369  const double smallest_abs_coefficient,
370  const bool only_flagged_cells)
371  {
372  using number = typename VectorType::value_type;
373  using number_coeff =
375 
376  smoothness_indicators.reinit(
377  dof_handler.get_triangulation().n_active_cells());
378 
379  unsigned int n_modes;
380  Table<dim, number_coeff> expansion_coefficients;
381 
382  Vector<number> local_dof_values;
383  std::vector<double> ln_k;
384  std::pair<std::vector<unsigned int>, std::vector<double>> res;
385  for (const auto &cell : dof_handler.active_cell_iterators())
386  if (cell->is_locally_owned())
387  {
388  if (!only_flagged_cells || cell->refine_flag_set() ||
389  cell->coarsen_flag_set())
390  {
391  n_modes = fe_fourier.get_n_coefficients_per_direction(
392  cell->active_fe_index());
393  resize(expansion_coefficients, n_modes);
394 
395  // Inside the loop, we first need to get the values of the local
396  // degrees of freedom and then need to compute the series
397  // expansion by multiplying this vector with the matrix @f${\cal
398  // F}@f$ corresponding to this finite element.
399  local_dof_values.reinit(cell->get_fe().dofs_per_cell);
400  cell->get_dof_values(solution, local_dof_values);
401 
402  fe_fourier.calculate(local_dof_values,
403  cell->active_fe_index(),
404  expansion_coefficients);
405 
406  // We fit our exponential decay of expansion coefficients to the
407  // provided regression_strategy on each possible value of |k|.
408  // To this end, we use FESeries::process_coefficients() to
409  // rework coefficients into the desired format.
410  res = FESeries::process_coefficients<dim>(
411  expansion_coefficients,
412  [n_modes](const TableIndices<dim> &indices) {
413  return index_norm_greater_than_zero_and_less_than_N_squared(
414  indices, n_modes);
415  },
416  regression_strategy,
417  smallest_abs_coefficient);
418 
419  Assert(res.first.size() == res.second.size(),
420  ExcInternalError());
421 
422  // Last, do the linear regression.
423  float regularity = std::numeric_limits<float>::infinity();
424  if (res.first.size() > 1)
425  {
426  // Prepare linear equation for the logarithmic least squares
427  // fit.
428  //
429  // First, calculate ln(|k|).
430  //
431  // For Fourier expansion, this translates to
432  // ln(2*pi*sqrt(predicate)) = ln(2*pi) + 0.5*ln(predicate).
433  // Since we are just interested in the slope of a linear
434  // regression later, we omit the ln(2*pi) factor.
435  ln_k.resize(res.first.size());
436  for (unsigned int f = 0; f < res.first.size(); ++f)
437  ln_k[f] =
438  0.5 * std::log(static_cast<double>(res.first[f]));
439 
440  // Second, calculate ln(U_k).
441  for (auto &residual_element : res.second)
442  residual_element = std::log(residual_element);
443 
444  const std::pair<double, double> fit =
445  FESeries::linear_regression(ln_k, res.second);
446  // Compute regularity s = mu - dim/2
447  regularity = static_cast<float>(-fit.first) -
448  ((dim > 1) ? (.5 * dim) : 0);
449  }
450 
451  // Store result in the vector of estimated values for each cell.
452  smoothness_indicators(cell->active_cell_index()) = regularity;
453  }
454  else
455  smoothness_indicators(cell->active_cell_index()) =
456  numbers::signaling_nan<float>();
457  }
458  }
459 
460 
461 
462  template <int dim, int spacedim, typename VectorType>
463  void
466  const hp::DoFHandler<dim, spacedim> &dof_handler,
467  const VectorType & solution,
468  Vector<float> & smoothness_indicators,
469  const ComponentMask & coefficients_predicate,
470  const double smallest_abs_coefficient,
471  const bool only_flagged_cells)
472  {
473  Assert(smallest_abs_coefficient >= 0.,
474  ExcMessage("smallest_abs_coefficient should be non-negative."));
475 
476  using number = typename VectorType::value_type;
477  using number_coeff =
479 
480  smoothness_indicators.reinit(
481  dof_handler.get_triangulation().n_active_cells());
482 
483  unsigned int n_modes;
484  Table<dim, number_coeff> expansion_coefficients;
485  Vector<number> local_dof_values;
486 
487  // auxiliary vector to do linear regression
488  const unsigned int max_degree =
489  dof_handler.get_fe_collection().max_degree();
490 
491  std::vector<double> x, y;
492  x.reserve(max_degree);
493  y.reserve(max_degree);
494 
495  for (const auto &cell : dof_handler.active_cell_iterators())
496  if (cell->is_locally_owned())
497  {
498  if (!only_flagged_cells || cell->refine_flag_set() ||
499  cell->coarsen_flag_set())
500  {
501  n_modes = fe_fourier.get_n_coefficients_per_direction(
502  cell->active_fe_index());
503  resize(expansion_coefficients, n_modes);
504 
505  const unsigned int pe = cell->get_fe().degree;
506  Assert(pe > 0, ExcInternalError());
507 
508  // since we use coefficients with indices [1,pe] in each
509  // direction, the number of coefficients we need to calculate is
510  // at least N=pe+1
511  AssertIndexRange(pe, n_modes);
512 
513  local_dof_values.reinit(cell->get_fe().dofs_per_cell);
514  cell->get_dof_values(solution, local_dof_values);
515 
516  fe_fourier.calculate(local_dof_values,
517  cell->active_fe_index(),
518  expansion_coefficients);
519 
520  // choose the smallest decay of coefficients in each direction,
521  // i.e. the maximum decay slope k_v as in exp(-k_v)
522  double k_v = std::numeric_limits<double>::infinity();
523  for (unsigned int d = 0; d < dim; ++d)
524  {
525  x.resize(0);
526  y.resize(0);
527 
528  // will use all non-zero coefficients allowed by the
529  // predicate function
530  //
531  // skip i=0 because of logarithm
532  for (unsigned int i = 1; i <= pe; ++i)
533  if (coefficients_predicate[i])
534  {
535  TableIndices<dim> ind;
536  ind[d] = i;
537  const double coeff_abs =
538  std::abs(expansion_coefficients(ind));
539 
540  if (coeff_abs > smallest_abs_coefficient)
541  {
542  x.push_back(std::log(i));
543  y.push_back(std::log(coeff_abs));
544  }
545  }
546 
547  // in case we don't have enough non-zero coefficient to fit,
548  // skip this direction
549  if (x.size() < 2)
550  continue;
551 
552  const std::pair<double, double> fit =
554 
555  // decay corresponds to negative slope
556  // take the lesser negative slope along each direction
557  k_v = std::min(k_v, -fit.first);
558  }
559 
560  smoothness_indicators(cell->active_cell_index()) =
561  static_cast<float>(k_v);
562  }
563  else
564  smoothness_indicators(cell->active_cell_index()) =
565  numbers::signaling_nan<float>();
566  }
567  }
568 
569 
570 
571  template <int dim, int spacedim>
574  {
575  // Default number of coefficients per direction.
576  std::vector<unsigned int> n_coefficients_per_direction;
577  for (unsigned int i = 0; i < fe_collection.size(); ++i)
578  n_coefficients_per_direction.push_back(
579  std::max<unsigned int>(3, fe_collection[i].degree + 1));
580 
581  // Default quadrature collection.
582  //
583  // We initialize a series expansion object object which will be used to
584  // calculate the expansion coefficients. In addition to the
585  // hp::FECollection, we need to provide quadrature rules hp::QCollection
586  // for integration on the reference cell.
587  // We will need to assemble the expansion matrices for each of the finite
588  // elements we deal with, i.e. the matrices F_k,j. We have to do that for
589  // each of the finite elements in use. To that end we need a quadrature
590  // rule. As a default, we use the same quadrature formula for each finite
591  // element, namely one that is obtained by iterating a 4-point Gauss
592  // formula as many times as the maximal exponent we use for the term
593  // exp(ikx). Since the first mode corresponds to k = 0, the maximal wave
594  // number is k = n_modes - 1.
595  const QGauss<1> base_quadrature(4);
596  hp::QCollection<dim> q_collection;
597  for (unsigned int i = 0; i < fe_collection.size(); ++i)
598  {
599  const QIterated<dim> quadrature(base_quadrature,
600  n_coefficients_per_direction[i] - 1);
601  const QSorted<dim> quadrature_sorted(quadrature);
602  q_collection.push_back(quadrature_sorted);
603  }
604 
605  return FESeries::Fourier<dim, spacedim>(n_coefficients_per_direction,
606  fe_collection,
607  q_collection);
608  }
609  } // namespace Fourier
610 } // namespace SmoothnessEstimator
611 
612 
613 // explicit instantiations
614 #include "smoothness_estimator.inst"
615 
la_vector.h
FESeries::Fourier::CoefficientType
typename std::complex< double > CoefficientType
Definition: fe_series.h:94
FESeries::Legendre::get_n_coefficients_per_direction
unsigned int get_n_coefficients_per_direction(const unsigned int index) const
Definition: fe_series_legendre.cc:270
TableIndices
Definition: table_indices.h:45
hp::FECollection::size
unsigned int size() const
Definition: fe_collection.h:853
SmoothnessEstimator::Fourier::default_fe_series
FESeries::Fourier< dim, spacedim > default_fe_series(const hp::FECollection< dim, spacedim > &fe_collection)
Definition: smoothness_estimator.cc:573
QSorted
Definition: quadrature_lib.h:391
hp::DoFHandler::get_fe_collection
const hp::FECollection< dim, spacedim > & get_fe_collection() const
VectorType
AssertIndexRange
#define AssertIndexRange(index, range)
Definition: exceptions.h:1649
hp::DoFHandler::get_triangulation
const Triangulation< dim, spacedim > & get_triangulation() const
hp::QCollection
Definition: q_collection.h:48
TableBase::reinit
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
VectorTools::NormType
NormType
Definition: vector_tools_common.h:53
ComponentMask
Definition: component_mask.h:83
hp::DoFHandler
Definition: dof_handler.h:203
Physics::Elasticity::Kinematics::d
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
la_parallel_vector.h
SmoothnessEstimator::Legendre::coefficient_decay_per_direction
void coefficient_decay_per_direction(FESeries::Legendre< dim, spacedim > &fe_legendre, const hp::DoFHandler< dim, spacedim > &dof_handler, const VectorType &solution, Vector< float > &smoothness_indicators, const ComponentMask &coefficients_predicate=ComponentMask(), const double smallest_abs_coefficient=1e-10, const bool only_flagged_cells=false)
Definition: smoothness_estimator.cc:183
FESeries::Fourier
Definition: fe_series.h:91
QIterated
Definition: quadrature.h:369
Table
Definition: table.h:699
FESeries::Fourier::get_n_coefficients_per_direction
unsigned int get_n_coefficients_per_direction(const unsigned int index) const
Definition: fe_series_fourier.cc:251
hp::DoFHandler::active_cell_iterators
IteratorRange< active_cell_iterator > active_cell_iterators() const
Definition: dof_handler.cc:1379
FESeries::Fourier::calculate
void calculate(const ::Vector< Number > &local_dof_values, const unsigned int cell_active_fe_index, Table< dim, CoefficientType > &fourier_coefficients)
StandardExceptions::ExcMessage
static ::ExceptionBase & ExcMessage(std::string arg1)
SmoothnessEstimator::Fourier::coefficient_decay
void coefficient_decay(FESeries::Fourier< dim, spacedim > &fe_fourier, const hp::DoFHandler< dim, spacedim > &dof_handler, const VectorType &solution, Vector< float > &smoothness_indicators, const VectorTools::NormType regression_strategy=VectorTools::Linfty_norm, const double smallest_abs_coefficient=1e-10, const bool only_flagged_cells=false)
Definition: smoothness_estimator.cc:364
double
block_vector.h
FESeries::Legendre
Definition: fe_series.h:259
la_parallel_block_vector.h
SmoothnessEstimator::Legendre::coefficient_decay
void coefficient_decay(FESeries::Legendre< dim, spacedim > &fe_legendre, const hp::DoFHandler< dim, spacedim > &dof_handler, const VectorType &solution, Vector< float > &smoothness_indicators, const VectorTools::NormType regression_strategy=VectorTools::Linfty_norm, const double smallest_abs_coefficient=1e-10, const bool only_flagged_cells=false)
Definition: smoothness_estimator.cc:100
DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:358
SmoothnessEstimator::Legendre::default_fe_series
FESeries::Legendre< dim, spacedim > default_fe_series(const hp::FECollection< dim, spacedim > &fe_collection)
Definition: smoothness_estimator.cc:290
petsc_block_vector.h
Vector::reinit
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
QGauss
Definition: quadrature_lib.h:40
SmoothnessEstimator
Definition: smoothness_estimator.h:67
StandardExceptions::ExcInternalError
static ::ExceptionBase & ExcInternalError()
FESeries::Legendre::calculate
void calculate(const ::Vector< Number > &local_dof_values, const unsigned int cell_active_fe_index, Table< dim, CoefficientType > &legendre_coefficients)
Definition: fe_series_legendre.cc:281
Assert
#define Assert(cond, exc)
Definition: exceptions.h:1419
FESeries::linear_regression
std::pair< double, double > linear_regression(const std::vector< double > &x, const std::vector< double > &y)
Definition: fe_series.cc:30
vector.h
fe_series.h
Utilities::MPI::min
T min(const T &t, const MPI_Comm &mpi_communicator)
smoothness_estimator.h
petsc_vector.h
signaling_nan.h
quadrature.h
q_collection.h
LAPACKSupport::N
static const char N
Definition: lapack_support.h:159
SmoothnessEstimator::Fourier::coefficient_decay_per_direction
void coefficient_decay_per_direction(FESeries::Fourier< dim, spacedim > &fe_fourier, const hp::DoFHandler< dim, spacedim > &dof_handler, const VectorType &solution, Vector< float > &smoothness_indicators, const ComponentMask &coefficients_predicate=ComponentMask(), const double smallest_abs_coefficient=1e-10, const bool only_flagged_cells=false)
Definition: smoothness_estimator.cc:464
DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:359
trilinos_vector.h
Vector< number >
trilinos_epetra_vector.h
hp::FECollection
Definition: fe_collection.h:54
trilinos_parallel_block_vector.h
hp::QCollection::push_back
void push_back(const Quadrature< dim > &new_quadrature)
Definition: q_collection.h:245
dof_handler.h