]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Mapping: refactor the covariant Hessian mappings.
authorDavid Wells <drwells@email.unc.edu>
Tue, 17 Jun 2025 14:55:57 +0000 (10:55 -0400)
committerDavid Wells <drwells@email.unc.edu>
Tue, 17 Jun 2025 15:39:59 +0000 (11:39 -0400)
include/deal.II/fe/mapping_internal.h [new file with mode: 0644]
include/deal.II/fe/mapping_q_internal.h
source/fe/mapping_fe.cc
source/fe/mapping_manifold.cc

diff --git a/include/deal.II/fe/mapping_internal.h b/include/deal.II/fe/mapping_internal.h
new file mode 100644 (file)
index 0000000..2b4bf35
--- /dev/null
@@ -0,0 +1,85 @@
+// ------------------------------------------------------------------------
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+// Copyright (C) 2025 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// Part of the source code is dual licensed under Apache-2.0 WITH
+// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
+// governing the source code and code contributions can be found in
+// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
+//
+// ------------------------------------------------------------------------
+
+#ifndef dealii_mapping_internal_h
+#define dealii_mapping_internal_h
+
+#include <deal.II/base/config.h>
+
+#include <deal.II/base/derivative_form.h>
+#include <deal.II/base/tensor.h>
+
+// Implementations of transformations used by several Mapping classes (such as
+// MappingFE, MappingQ, and MappingFEField, and MappingManifold)
+
+DEAL_II_NAMESPACE_OPEN
+
+namespace internal
+{
+  /**
+   * Map the Hessian of a covariant vector field. For more information see the
+   * overload of Mapping::transform() which maps 3-differential forms from the
+   * reference cell to the physical cell.
+   */
+  template <int dim, int spacedim, typename Number>
+  Tensor<3, spacedim, Number>
+  apply_covariant_hessian(
+    const DerivativeForm<1, dim, spacedim, Number> &covariant,
+    const Tensor<3, dim, Number>                   &input);
+} // namespace internal
+
+namespace internal
+{
+  template <int dim, int spacedim, typename Number>
+  inline Tensor<3, spacedim, Number>
+  apply_covariant_hessian(
+    const DerivativeForm<1, dim, spacedim, Number> &covariant,
+    const Tensor<3, dim, Number>                   &input)
+  {
+    Tensor<3, spacedim, Number> output;
+    for (unsigned int i = 0; i < spacedim; ++i)
+      {
+        Number tmp1[dim][dim];
+        for (unsigned int J = 0; J < dim; ++J)
+          for (unsigned int K = 0; K < dim; ++K)
+            {
+              tmp1[J][K] = covariant[i][0] * input[0][J][K];
+              for (unsigned int I = 1; I < dim; ++I)
+                tmp1[J][K] += covariant[i][I] * input[I][J][K];
+            }
+        for (unsigned int j = 0; j < spacedim; ++j)
+          {
+            Number tmp2[dim];
+            for (unsigned int K = 0; K < dim; ++K)
+              {
+                tmp2[K] = covariant[j][0] * tmp1[0][K];
+                for (unsigned int J = 1; J < dim; ++J)
+                  tmp2[K] += covariant[j][J] * tmp1[J][K];
+              }
+            for (unsigned int k = 0; k < spacedim; ++k)
+              {
+                output[i][j][k] = covariant[k][0] * tmp2[0];
+                for (unsigned int K = 1; K < dim; ++K)
+                  output[i][j][k] += covariant[k][K] * tmp2[K];
+              }
+          }
+      }
+
+    return output;
+  }
+} // namespace internal
+
+DEAL_II_NAMESPACE_CLOSE
+
+#endif
index db35dba3802d768fc83bef8d444c8604fb13ff36..518aad29e8185606d88f13fab31644534675c281 100644 (file)
@@ -28,6 +28,7 @@
 #include <deal.II/fe/fe_tools.h>
 #include <deal.II/fe/fe_update_flags.h>
 #include <deal.II/fe/fe_values.h>
+#include <deal.II/fe/mapping_internal.h>
 #include <deal.II/fe/mapping_q.h>
 
 #include <deal.II/grid/grid_tools_geometry.h>
@@ -2407,34 +2408,8 @@ namespace internal
                 {
                   const DerivativeForm<1, dim, spacedim> covariant =
                     data.output_data->inverse_jacobians[q].transpose();
-
-                  for (unsigned int i = 0; i < spacedim; ++i)
-                    {
-                      double tmp1[dim][dim];
-                      for (unsigned int J = 0; J < dim; ++J)
-                        for (unsigned int K = 0; K < dim; ++K)
-                          {
-                            tmp1[J][K] = covariant[i][0] * input[q][0][J][K];
-                            for (unsigned int I = 1; I < dim; ++I)
-                              tmp1[J][K] += covariant[i][I] * input[q][I][J][K];
-                          }
-                      for (unsigned int j = 0; j < spacedim; ++j)
-                        {
-                          double tmp2[dim];
-                          for (unsigned int K = 0; K < dim; ++K)
-                            {
-                              tmp2[K] = covariant[j][0] * tmp1[0][K];
-                              for (unsigned int J = 1; J < dim; ++J)
-                                tmp2[K] += covariant[j][J] * tmp1[J][K];
-                            }
-                          for (unsigned int k = 0; k < spacedim; ++k)
-                            {
-                              output[q][i][j][k] = covariant[k][0] * tmp2[0];
-                              for (unsigned int K = 1; K < dim; ++K)
-                                output[q][i][j][k] += covariant[k][K] * tmp2[K];
-                            }
-                        }
-                    }
+                  output[q] =
+                    internal::apply_covariant_hessian(covariant, input[q]);
                 }
 
               return;
index cbb2fa2b6512b01cf9b14c1276e5297e84bce29b..f33503485116ffb0e8027bf035dcd7becbc138d0 100644 (file)
@@ -25,6 +25,7 @@
 #include <deal.II/fe/fe_poly.h>
 #include <deal.II/fe/fe_values.h>
 #include <deal.II/fe/mapping_fe.h>
+#include <deal.II/fe/mapping_internal.h>
 
 #include <deal.II/grid/grid_generator.h>
 #include <deal.II/grid/manifold_lib.h>
@@ -1942,37 +1943,9 @@ namespace internal
                     "update_covariant_transformation"));
 
                 for (unsigned int q = 0; q < output.size(); ++q)
-                  for (unsigned int i = 0; i < spacedim; ++i)
-                    {
-                      double tmp1[dim][dim];
-                      for (unsigned int J = 0; J < dim; ++J)
-                        for (unsigned int K = 0; K < dim; ++K)
-                          {
-                            tmp1[J][K] =
-                              data.covariant[q][i][0] * input[q][0][J][K];
-                            for (unsigned int I = 1; I < dim; ++I)
-                              tmp1[J][K] +=
-                                data.covariant[q][i][I] * input[q][I][J][K];
-                          }
-                      for (unsigned int j = 0; j < spacedim; ++j)
-                        {
-                          double tmp2[dim];
-                          for (unsigned int K = 0; K < dim; ++K)
-                            {
-                              tmp2[K] = data.covariant[q][j][0] * tmp1[0][K];
-                              for (unsigned int J = 1; J < dim; ++J)
-                                tmp2[K] += data.covariant[q][j][J] * tmp1[J][K];
-                            }
-                          for (unsigned int k = 0; k < spacedim; ++k)
-                            {
-                              output[q][i][j][k] =
-                                data.covariant[q][k][0] * tmp2[0];
-                              for (unsigned int K = 1; K < dim; ++K)
-                                output[q][i][j][k] +=
-                                  data.covariant[q][k][K] * tmp2[K];
-                            }
-                        }
-                    }
+                  output[q] =
+                    internal::apply_covariant_hessian(data.covariant[q],
+                                                      input[q]);
 
                 return;
               }
index 42af2fbd59150b98fdd52961c256813bc1090e1a..92055faecf0f8642ed2257c038d65cf242719012 100644 (file)
@@ -26,6 +26,7 @@
 #include <deal.II/fe/fe.h>
 #include <deal.II/fe/fe_tools.h>
 #include <deal.II/fe/fe_values.h>
+#include <deal.II/fe/mapping_internal.h>
 #include <deal.II/fe/mapping_manifold.h>
 
 #include <deal.II/grid/manifold.h>
@@ -1101,37 +1102,9 @@ namespace internal
                     "update_covariant_transformation"));
 
                 for (unsigned int q = 0; q < output.size(); ++q)
-                  for (unsigned int i = 0; i < spacedim; ++i)
-                    {
-                      double tmp1[dim][dim];
-                      for (unsigned int J = 0; J < dim; ++J)
-                        for (unsigned int K = 0; K < dim; ++K)
-                          {
-                            tmp1[J][K] =
-                              data.covariant[q][i][0] * input[q][0][J][K];
-                            for (unsigned int I = 1; I < dim; ++I)
-                              tmp1[J][K] +=
-                                data.covariant[q][i][I] * input[q][I][J][K];
-                          }
-                      for (unsigned int j = 0; j < spacedim; ++j)
-                        {
-                          double tmp2[dim];
-                          for (unsigned int K = 0; K < dim; ++K)
-                            {
-                              tmp2[K] = data.covariant[q][j][0] * tmp1[0][K];
-                              for (unsigned int J = 1; J < dim; ++J)
-                                tmp2[K] += data.covariant[q][j][J] * tmp1[J][K];
-                            }
-                          for (unsigned int k = 0; k < spacedim; ++k)
-                            {
-                              output[q][i][j][k] =
-                                data.covariant[q][k][0] * tmp2[0];
-                              for (unsigned int K = 1; K < dim; ++K)
-                                output[q][i][j][k] +=
-                                  data.covariant[q][k][K] * tmp2[K];
-                            }
-                        }
-                    }
+                  output[q] =
+                    internal::apply_covariant_hessian(data.covariant[q],
+                                                      input[q]);
 
                 return;
               }

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.