]> https://gitweb.dealii.org/ - dealii.git/commitdiff
MappingP1: only compute the covariant once. 18633/head
authorDavid Wells <drwells@email.unc.edu>
Mon, 7 Jul 2025 01:16:46 +0000 (21:16 -0400)
committerDavid Wells <drwells@email.unc.edu>
Mon, 7 Jul 2025 01:19:02 +0000 (21:19 -0400)
I did some more profiling and saw that, in the same load vector
benchmark, I was computing the covariant about 10 places per cell - its
easy enough to just compute it once and store it with the rest of the
transformation.

I elected to unconditionally compute the covariant (and determinant of
the contravariant in the last PR) since they are constant on each cell
and needed most of the time.

include/deal.II/fe/mapping_p1.h
source/fe/mapping_p1.cc

index a5659090e99b061813d9a6ed0208f64b212dd7d6..ad8d1de2a516551ad8a8ac190e10d8aa79a200ba 100644 (file)
@@ -221,10 +221,15 @@ public:
     mutable Tensor<1, spacedim> affine_component;
 
     /**
-     * Linear component of the transformation.
+     * Linear component of the transformation (the contravariant).
      */
     mutable DerivativeForm<1, dim, spacedim> linear_component;
 
+    /**
+     * Covariant form of the linear transformation.
+     */
+    mutable DerivativeForm<1, dim, spacedim> covariant;
+
     /**
      * Determinant of linear_component.
      */
index ab973074543e4458fa46a044fd89fc333672a39f..f224a58b95ba3dc9a1e36b4b6bad720e8a10334e 100644 (file)
@@ -84,6 +84,7 @@ MappingP1<dim, spacedim>::InternalData::memory_consumption() const
   return (Mapping<dim, spacedim>::InternalDataBase::memory_consumption() +
           MemoryConsumption::memory_consumption(affine_component) +
           MemoryConsumption::memory_consumption(linear_component) +
+          MemoryConsumption::memory_consumption(covariant) +
           MemoryConsumption::memory_consumption(determinant) +
           MemoryConsumption::memory_consumption(quadrature));
 }
@@ -202,6 +203,7 @@ MappingP1<dim, spacedim>::update_transformation(
 {
   data.affine_component = cell->vertex(0);
   data.linear_component = compute_linear_transformation<dim, spacedim>(cell);
+  data.covariant        = data.linear_component.covariant_form();
   data.determinant      = data.linear_component.determinant();
 }
 
@@ -236,8 +238,7 @@ MappingP1<dim, spacedim>::maybe_update_normal_vectors(
     ReferenceCells::get_simplex<dim>().template unit_normal_vectors<dim>(
       face_no);
   Tensor<1, spacedim> normal_vector =
-    apply_transformation(data.linear_component.covariant_form(),
-                         ref_normal_vector);
+    apply_transformation(data.covariant, ref_normal_vector);
   normal_vector /= normal_vector.norm();
 
   std::fill(normal_vectors.begin(), normal_vectors.end(), normal_vector);
@@ -320,7 +321,7 @@ MappingP1<dim, spacedim>::maybe_update_inverse_jacobians(
   if (data.update_each & update_inverse_jacobians)
     if (cell_similarity != CellSimilarity::translation)
       {
-        const auto inverse = data.linear_component.covariant_form().transpose();
+        const auto inverse = data.covariant.transpose();
         std::fill(output_data.inverse_jacobians.begin(),
                   output_data.inverse_jacobians.end(),
                   inverse);
@@ -561,9 +562,8 @@ MappingP1<dim, spacedim>::transform(
     {
       case mapping_covariant:
         {
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = apply_transformation(covariant, input[i]);
+            output[i] = apply_transformation(data.covariant, input[i]);
           return;
         }
 
@@ -607,9 +607,8 @@ MappingP1<dim, spacedim>::transform(
     {
       case mapping_covariant:
         {
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = apply_transformation(covariant, input[i]);
+            output[i] = apply_transformation(data.covariant, input[i]);
 
           return;
         }
@@ -641,9 +640,8 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_covariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = apply_transformation(covariant, input[i]);
+            output[i] = apply_transformation(data.covariant, input[i]);
           return;
         }
 
@@ -664,12 +662,11 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_covariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
             {
               const DerivativeForm<1, spacedim, dim> A =
-                apply_transformation(covariant, transpose(input[i]));
-              output[i] = apply_transformation(covariant, A.transpose());
+                apply_transformation(data.covariant, transpose(input[i]));
+              output[i] = apply_transformation(data.covariant, A.transpose());
             }
           return;
         }
@@ -680,13 +677,12 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_covariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
             {
               const DerivativeForm<1, spacedim, dim> A =
                 apply_transformation(data.linear_component,
                                      transpose(input[i]));
-              output[i] = apply_transformation(covariant, A.transpose());
+              output[i] = apply_transformation(data.covariant, A.transpose());
             }
 
           return;
@@ -698,14 +694,13 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_contravariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
-          auto       scaled_contravariant = data.linear_component;
+          auto scaled_contravariant = data.linear_component;
           for (unsigned int d = 0; d < spacedim; ++d)
             scaled_contravariant[d] /= data.determinant;
           for (unsigned int i = 0; i < output.size(); ++i)
             {
               const DerivativeForm<1, spacedim, dim> A =
-                apply_transformation(covariant, input[i]);
+                apply_transformation(data.covariant, input[i]);
               const Tensor<2, spacedim> T =
                 apply_transformation(scaled_contravariant, A.transpose());
 
@@ -743,9 +738,9 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_covariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = internal::apply_covariant_gradient(covariant, input[i]);
+            output[i] =
+              internal::apply_covariant_gradient(data.covariant, input[i]);
 
           return;
         }
@@ -780,10 +775,9 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_contravariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
             output[i] =
-              internal::apply_contravariant_hessian(covariant,
+              internal::apply_contravariant_hessian(data.covariant,
                                                     data.linear_component,
                                                     input[i]);
 
@@ -796,9 +790,9 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_covariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = internal::apply_covariant_hessian(covariant, input[i]);
+            output[i] =
+              internal::apply_covariant_hessian(data.covariant, input[i]);
 
           return;
         }
@@ -812,9 +806,8 @@ MappingP1<dim, spacedim>::transform(
                  typename FEValuesBase<dim>::ExcAccessToUninitializedField(
                    "update_contravariant_transformation"));
 
-          const auto covariant = data.linear_component.covariant_form();
           for (unsigned int i = 0; i < output.size(); ++i)
-            output[i] = internal::apply_piola_hessian(covariant,
+            output[i] = internal::apply_piola_hessian(data.covariant,
                                                       data.linear_component,
                                                       data.determinant,
                                                       input[i]);

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.