deal.II version GIT relicensing-2392-g6e04ac39aa 2025-01-21 16:50:00+00:00
\(\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\}}\)
Loading...
Searching...
No Matches
mapping_q_eulerian.cc
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 2008 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
17
20
21#include <deal.II/fe/fe.h>
22#include <deal.II/fe/fe_tools.h>
24
26
34#include <deal.II/lac/vector.h>
35
36#include <memory>
37
39
40
41
42// .... MAPPING Q EULERIAN CONSTRUCTOR
43
44
45template <int dim, typename VectorType, int spacedim>
47 const unsigned int degree,
48 const DoFHandler<dim, spacedim> &euler_dof_handler,
49 const VectorType &euler_vector,
50 const unsigned int level)
51 : MappingQ<dim, spacedim>(degree)
52 , euler_vector(&euler_vector)
53 , euler_dof_handler(&euler_dof_handler)
54 , level(level)
55 , support_quadrature(degree)
56 , fe_values(euler_dof_handler.get_fe(),
57 support_quadrature,
59{}
60
61
62
63template <int dim, typename VectorType, int spacedim>
64std::unique_ptr<Mapping<dim, spacedim>>
66{
67 return std::make_unique<MappingQEulerian<dim, VectorType, spacedim>>(
68 this->get_degree(), *euler_dof_handler, *euler_vector, this->level);
69}
70
71
72
73// .... SUPPORT QUADRATURE CONSTRUCTOR
74
75template <int dim, typename VectorType, int spacedim>
77 SupportQuadrature(const unsigned int map_degree)
78 : Quadrature<dim>(Utilities::fixed_power<dim>(map_degree + 1))
79{
80 // first we determine the support points on the unit cell in lexicographic
81 // order, which are (in accordance with MappingQ) the support points of
82 // QGaussLobatto.
83 const QGaussLobatto<dim> q_iterated(map_degree + 1);
84 const unsigned int n_q_points = q_iterated.size();
85
86 // we then need to define a renumbering vector that allows us to go from a
87 // lexicographic numbering scheme to a hierarchic one.
88 const std::vector<unsigned int> renumber =
89 FETools::lexicographic_to_hierarchic_numbering<dim>(map_degree);
90
91 // finally we assign the quadrature points in the required order.
92 for (unsigned int q = 0; q < n_q_points; ++q)
93 this->quadrature_points[renumber[q]] = q_iterated.point(q);
94}
95
96
97
98// .... COMPUTE MAPPING SUPPORT POINTS
99
100template <int dim, typename VectorType, int spacedim>
101boost::container::small_vector<Point<spacedim>,
102#ifndef _MSC_VER
103 ReferenceCells::max_n_vertices<dim>()
104#else
106#endif
107 >
109 const typename Triangulation<dim, spacedim>::cell_iterator &cell) const
110{
111 // get the vertices as the first 2^dim mapping support points
112 const std::vector<Point<spacedim>> a = compute_mapping_support_points(cell);
113
114 boost::container::small_vector<Point<spacedim>,
115#ifndef _MSC_VER
116 ReferenceCells::max_n_vertices<dim>()
117#else
119#endif
120 >
121 vertex_locations(a.begin(), a.begin() + cell->n_vertices());
122
123 return vertex_locations;
124}
125
126
127
128template <int dim, typename VectorType, int spacedim>
129std::vector<Point<spacedim>>
131 const typename Triangulation<dim, spacedim>::cell_iterator &cell) const
132{
133 const bool mg_vector = level != numbers::invalid_unsigned_int;
134
135 [[maybe_unused]] const types::global_dof_index n_dofs =
136 mg_vector ? euler_dof_handler->n_dofs(level) : euler_dof_handler->n_dofs();
137 [[maybe_unused]] const types::global_dof_index vector_size =
138 euler_vector->size();
139
140 AssertDimension(vector_size, n_dofs);
141
142 // we then transform our tria iterator into a dof iterator so we can access
143 // data not associated with triangulations
144 typename DoFHandler<dim, spacedim>::cell_iterator dof_cell(*cell,
146
147 Assert(mg_vector || dof_cell->is_active() == true, ExcInactiveCell());
148
149 // our quadrature rule is chosen so that each quadrature point corresponds
150 // to a support point in the undeformed configuration. We can then query
151 // the given displacement field at these points to determine the shift
152 // vector that maps the support points to the deformed configuration.
153
154 // We assume that the given field contains dim displacement components, but
155 // that there may be other solution components as well (e.g. pressures).
156 // this class therefore assumes that the first dim components represent the
157 // actual shift vector we need, and simply ignores any components after
158 // that. This implies that the user should order components appropriately,
159 // or create a separate dof handler for the displacements.
160 const unsigned int n_support_pts = support_quadrature.size();
161 const unsigned int n_components = euler_dof_handler->get_fe(0).n_components();
162
163 Assert(n_components >= spacedim,
164 ExcDimensionMismatch(n_components, spacedim));
165
166 std::vector<Vector<typename VectorType::value_type>> shift_vector(
167 n_support_pts, Vector<typename VectorType::value_type>(n_components));
168
169 std::vector<types::global_dof_index> dof_indices(
170 euler_dof_handler->get_fe(0).n_dofs_per_cell());
171 // fill shift vector for each support point using an fe_values object. make
172 // sure that the fe_values variable isn't used simultaneously from different
173 // threads
174 std::lock_guard<std::mutex> lock(fe_values_mutex);
175 fe_values.reinit(dof_cell);
176 if (mg_vector)
177 {
178 dof_cell->get_mg_dof_indices(dof_indices);
179 fe_values.get_function_values(*euler_vector, dof_indices, shift_vector);
180 }
181 else
182 fe_values.get_function_values(*euler_vector, shift_vector);
183
184 // and finally compute the positions of the support points in the deformed
185 // configuration.
186 std::vector<Point<spacedim>> a(n_support_pts);
187 for (unsigned int q = 0; q < n_support_pts; ++q)
188 {
189 a[q] = fe_values.quadrature_point(q);
190 for (unsigned int d = 0; d < spacedim; ++d)
191 a[q][d] += shift_vector[q][d];
192 }
193
194 return a;
195}
196
197
198
199template <int dim, typename VectorType, int spacedim>
204 const Quadrature<dim> &quadrature,
205 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
207 &output_data) const
208{
209 // call the function of the base class, but ignoring
210 // any potentially detected cell similarity between
211 // the current and the previous cell
214 quadrature,
215 internal_data,
216 output_data);
217 // also return the updated flag since any detected
218 // similarity wasn't based on the mapped field, but
219 // the original vertices which are meaningless
221}
222
223
224// explicit instantiations
225#include "mapping_q_eulerian.inst"
226
227
SupportQuadrature(const unsigned int map_degree)
FEValues< dim, spacedim > fe_values
virtual std::vector< Point< spacedim > > compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const override
virtual CellSimilarity::Similarity fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
MappingQEulerian(const unsigned int degree, const DoFHandler< dim, spacedim > &euler_dof_handler, const VectorType &euler_vector, const unsigned int level=numbers::invalid_unsigned_int)
ObserverPointer< const VectorType, MappingQEulerian< dim, VectorType, spacedim > > euler_vector
ObserverPointer< const DoFHandler< dim, spacedim >, MappingQEulerian< dim, VectorType, spacedim > > euler_dof_handler
Threads::Mutex fe_values_mutex
const SupportQuadrature support_quadrature
virtual boost::container::small_vector< Point< spacedim >, ReferenceCells::max_n_vertices< dim >() > get_vertices(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const override
const unsigned int level
virtual CellSimilarity::Similarity fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
Definition mapping_q.cc:833
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:498
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:499
unsigned int level
Definition grid_out.cc:4632
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInactiveCell()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
typename ActiveSelector::cell_iterator cell_iterator
@ update_values
Shape function values.
@ update_quadrature_points
Transformed quadrature points.
static const unsigned int invalid_unsigned_int
Definition types.h:232