deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+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_internal.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2025 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_mapping_internal_h
14#define dealii_mapping_internal_h
15
16#include <deal.II/base/config.h>
17
19#include <deal.II/base/tensor.h>
20
21// Implementations of transformations used by several Mapping classes (such as
22// MappingFE, MappingQ, and MappingFEField, and MappingManifold)
23
25
26namespace internal
27{
33 template <int dim, int spacedim, typename Number>
38
44 template <int dim, int spacedim, typename Number>
49 const Number &volume_element,
50 const Tensor<2, dim, Number> &input);
51
57 template <int dim, int spacedim, typename Number>
62 const Tensor<3, dim, Number> &input);
63
69 template <int dim, int spacedim, typename Number>
73 const Tensor<3, dim, Number> &input);
74
80 template <int dim, int spacedim, typename Number>
85 const Number &volume_element,
86 const Tensor<3, dim, Number> &input);
87} // namespace internal
88
89namespace internal
90{
91 template <int dim, int spacedim, typename Number>
96 {
98 for (unsigned int i = 0; i < spacedim; ++i)
99 for (unsigned int j = 0; j < spacedim; ++j)
100 {
101 double tmp[dim];
102 for (unsigned int K = 0; K < dim; ++K)
103 {
104 tmp[K] = covariant[j][0] * input[i][0][K];
105 for (unsigned int J = 1; J < dim; ++J)
106 tmp[K] += covariant[j][J] * input[i][J][K];
107 }
108 for (unsigned int k = 0; k < spacedim; ++k)
109 {
110 output[i][j][k] = covariant[k][0] * tmp[0];
111 for (unsigned int K = 1; K < dim; ++K)
112 output[i][j][k] += covariant[k][K] * tmp[K];
113 }
114 }
115
116 return output;
117 }
118
119
120
121 template <int dim, int spacedim, typename Number>
125 const DerivativeForm<1, dim, spacedim, Number> &contravariant,
126 const Number &volume_element,
127 const Tensor<2, dim, Number> &input)
128 {
130 apply_transformation(covariant, input);
131 const Tensor<2, spacedim> T =
132 apply_transformation(contravariant, A.transpose());
133
135 output *= 1.0 / volume_element;
136 return output;
137 }
138
139
140
141 template <int dim, int spacedim, typename Number>
145 const DerivativeForm<1, dim, spacedim, Number> &contravariant,
146 const Tensor<3, dim, Number> &input)
147 {
149 for (unsigned int i = 0; i < spacedim; ++i)
150 {
151 Number tmp1[dim][dim];
152 for (unsigned int J = 0; J < dim; ++J)
153 for (unsigned int K = 0; K < dim; ++K)
154 {
155 tmp1[J][K] = contravariant[i][0] * input[0][J][K];
156 for (unsigned int I = 1; I < dim; ++I)
157 tmp1[J][K] += contravariant[i][I] * input[I][J][K];
158 }
159 for (unsigned int j = 0; j < spacedim; ++j)
160 {
161 Number tmp2[dim];
162 for (unsigned int K = 0; K < dim; ++K)
163 {
164 tmp2[K] = covariant[j][0] * tmp1[0][K];
165 for (unsigned int J = 1; J < dim; ++J)
166 tmp2[K] += covariant[j][J] * tmp1[J][K];
167 }
168 for (unsigned int k = 0; k < spacedim; ++k)
169 {
170 output[i][j][k] = covariant[k][0] * tmp2[0];
171 for (unsigned int K = 1; K < dim; ++K)
172 output[i][j][k] += covariant[k][K] * tmp2[K];
173 }
174 }
175 }
176
177 return output;
178 }
179
180
181
182 template <int dim, int spacedim, typename Number>
186 const Tensor<3, dim, Number> &input)
187 {
189 for (unsigned int i = 0; i < spacedim; ++i)
190 {
191 Number tmp1[dim][dim];
192 for (unsigned int J = 0; J < dim; ++J)
193 for (unsigned int K = 0; K < dim; ++K)
194 {
195 tmp1[J][K] = covariant[i][0] * input[0][J][K];
196 for (unsigned int I = 1; I < dim; ++I)
197 tmp1[J][K] += covariant[i][I] * input[I][J][K];
198 }
199 for (unsigned int j = 0; j < spacedim; ++j)
200 {
201 Number tmp2[dim];
202 for (unsigned int K = 0; K < dim; ++K)
203 {
204 tmp2[K] = covariant[j][0] * tmp1[0][K];
205 for (unsigned int J = 1; J < dim; ++J)
206 tmp2[K] += covariant[j][J] * tmp1[J][K];
207 }
208 for (unsigned int k = 0; k < spacedim; ++k)
209 {
210 output[i][j][k] = covariant[k][0] * tmp2[0];
211 for (unsigned int K = 1; K < dim; ++K)
212 output[i][j][k] += covariant[k][K] * tmp2[K];
213 }
214 }
215 }
216
217 return output;
218 }
219
220
221
222 template <int dim, int spacedim, typename Number>
226 const DerivativeForm<1, dim, spacedim, Number> &contravariant,
227 const Number &volume_element,
228 const Tensor<3, dim, Number> &input)
229 {
231 for (unsigned int i = 0; i < spacedim; ++i)
232 {
233 Number factor[dim];
234 for (unsigned int I = 0; I < dim; ++I)
235 factor[I] = contravariant[i][I] * (1. / volume_element);
236 Number tmp1[dim][dim];
237 for (unsigned int J = 0; J < dim; ++J)
238 for (unsigned int K = 0; K < dim; ++K)
239 {
240 tmp1[J][K] = factor[0] * input[0][J][K];
241 for (unsigned int I = 1; I < dim; ++I)
242 tmp1[J][K] += factor[I] * input[I][J][K];
243 }
244 for (unsigned int j = 0; j < spacedim; ++j)
245 {
246 Number tmp2[dim];
247 for (unsigned int K = 0; K < dim; ++K)
248 {
249 tmp2[K] = covariant[j][0] * tmp1[0][K];
250 for (unsigned int J = 1; J < dim; ++J)
251 tmp2[K] += covariant[j][J] * tmp1[J][K];
252 }
253 for (unsigned int k = 0; k < spacedim; ++k)
254 {
255 output[i][j][k] = covariant[k][0] * tmp2[0];
256 for (unsigned int K = 1; K < dim; ++K)
257 output[i][j][k] += covariant[k][K] * tmp2[K];
258 }
259 }
260 }
261
262 return output;
263 }
264} // namespace internal
265
267
268#endif
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
DerivativeForm< 1, spacedim, dim, Number > transpose(const DerivativeForm< 1, dim, spacedim, Number > &DF)
Tensor< 1, spacedim, typename ProductType< Number1, Number2 >::type > apply_transformation(const DerivativeForm< 1, dim, spacedim, Number1 > &grad_F, const Tensor< 1, dim, Number2 > &d_x)
Tensor< 3, spacedim, Number > apply_contravariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Tensor< 3, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_piola_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 3, dim, Number > &input)
Tensor< 2, spacedim, Number > apply_piola_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 2, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 2, dim, spacedim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const Tensor< 3, dim, Number > &input)