39 template <
int dim,
int spacedim>
51 if (
const auto *p_tria =
dynamic_cast<
64 const std::vector<Point<spacedim>> &vertices = tria.
get_vertices();
65 std::vector<bool> boundary_vertices(vertices.size(),
false);
71 for (; cell != endc; ++cell)
72 for (
const unsigned int face : cell->face_indices())
73 if (cell->face(face)->at_boundary())
74 for (
unsigned int i = 0; i < cell->face(face)->n_vertices(); ++i)
75 boundary_vertices[cell->face(face)->vertex_index(i)] =
true;
79 double max_distance_sqr = 0;
80 std::vector<bool>::const_iterator pi = boundary_vertices.begin();
81 const unsigned int N = boundary_vertices.size();
82 for (
unsigned int i = 0; i < N; ++i, ++pi)
84 std::vector<bool>::const_iterator pj = pi + 1;
85 for (
unsigned int j = i + 1; j < N; ++j, ++pj)
86 if ((*pi ==
true) && (*pj ==
true) &&
87 ((vertices[i] - vertices[j]).norm_square() > max_distance_sqr))
88 max_distance_sqr = (vertices[i] - vertices[j]).norm_square();
96 template <
int dim,
int spacedim>
105 reference_cell.template get_default_linear_mapping<spacedim>());
110 template <
int dim,
int spacedim>
116 unsigned int mapping_degree = 1;
118 mapping_degree = p->get_degree();
119 else if (
const auto *p =
121 mapping_degree = p->get_degree();
128 reference_cell.get_gauss_type_quadrature(mapping_degree + 1);
129 const unsigned int n_q_points = quadrature_formula.
size();
140 double local_volume = 0;
144 if (cell->is_locally_owned())
147 for (
unsigned int q = 0; q < n_q_points; ++q)
148 local_volume += fe_values.
JxW(q);
151 const double global_volume =
154 return global_volume;
159 template <
int dim,
int spacedim>
160 std::pair<unsigned int, double>
164 double max_ratio = 1;
165 unsigned int index = 0;
167 for (
unsigned int i = 0; i < dim; ++i)
168 for (
unsigned int j = i + 1; j < dim; ++j)
170 unsigned int ax = i % dim;
171 unsigned int next_ax = j % dim;
174 cell->extent_in_direction(ax) / cell->extent_in_direction(next_ax);
176 if (ratio > max_ratio)
181 else if (1.0 / ratio > max_ratio)
183 max_ratio = 1.0 / ratio;
187 return std::make_pair(index, max_ratio);
209 struct TransformR2UAffine
224 [1] = {{-1.000000}, {1.000000}};
228 {1.000000, 0.000000};
239 [2] = {{-0.500000, -0.500000},
240 {0.500000, -0.500000},
241 {-0.500000, 0.500000},
242 {0.500000, 0.500000}};
252 {0.750000, 0.250000, 0.250000, -0.250000};
258 {-0.250000, -0.250000, -0.250000},
259 {0.250000, -0.250000, -0.250000},
260 {-0.250000, 0.250000, -0.250000},
261 {0.250000, 0.250000, -0.250000},
262 {-0.250000, -0.250000, 0.250000},
263 {0.250000, -0.250000, 0.250000},
264 {-0.250000, 0.250000, 0.250000},
265 {0.250000, 0.250000, 0.250000}
284 template <
int dim,
int spacedim>
293 for (
unsigned int d = 0; d < spacedim; ++d)
294 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_cell; ++v)
295 for (
unsigned int e = 0; e < dim; ++e)
296 A[d][e] += vertices[v][d] * TransformR2UAffine<dim>::KA[v][e];
300 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_cell; ++v)
301 b += vertices[v] * TransformR2UAffine<dim>::Kb[v];
303 return std::make_pair(A, b);
322 if (cell->is_locally_owned())
324 double aspect_ratio_cell = 0.0;
329 for (
unsigned int q = 0; q < quadrature.
size(); ++q)
340 aspect_ratio_cell = std::numeric_limits<double>::infinity();
345 for (
unsigned int i = 0; i < dim; ++i)
346 for (
unsigned int j = 0; j < dim; ++j)
347 J(i, j) = jacobian[i][j];
351 const double max_sv = J.singular_value(0);
352 const double min_sv = J.singular_value(dim - 1);
353 const double ar = max_sv / min_sv;
360 aspect_ratio_cell =
std::max(aspect_ratio_cell, ar);
365 aspect_ratio_vector(cell->active_cell_index()) = aspect_ratio_cell;
369 return aspect_ratio_vector;
390 template <
int dim,
int spacedim>
396 const auto predicate = [](
const iterator &) {
return true; };
399 tria, std::function<
bool(
const iterator &)>(predicate));
404 template <
int dim,
int spacedim>
409 double min_diameter = std::numeric_limits<double>::max();
411 if (!cell->is_artificial())
412 min_diameter =
std::min(min_diameter, cell->diameter(mapping));
414 const double global_min_diameter =
416 return global_min_diameter;
421 template <
int dim,
int spacedim>
426 double max_diameter = 0.;
428 if (!cell->is_artificial())
429 max_diameter =
std::max(max_diameter, cell->diameter(mapping));
431 const double global_max_diameter =
433 return global_max_diameter;
439#include "grid/grid_tools_geometry.inst"
const DerivativeForm< 1, dim, spacedim > & jacobian(const unsigned int q_point) const
double JxW(const unsigned int q_point) const
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell)
Abstract base class for mapping classes.
unsigned int size() const
virtual MPI_Comm get_mpi_communicator() const
unsigned int n_active_cells() const
const std::vector< Point< spacedim > > & get_vertices() const
cell_iterator end() const
unsigned int n_cells() const
const std::vector< ReferenceCell< dim > > & get_reference_cells() const
active_cell_iterator begin_active(const unsigned int level=0) const
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
IteratorRange< active_cell_iterator > active_cell_iterators() const
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
@ update_JxW_values
Transformed quadrature weights.
@ update_jacobians
Volume element.
T sum(const T &t, const MPI_Comm mpi_communicator)
T max(const T &t, const MPI_Comm mpi_communicator)
T min(const T &t, const MPI_Comm mpi_communicator)
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)