From b81750ad6ee153fa979b87b4985a3769228692b6 Mon Sep 17 00:00:00 2001 From: David Wells Date: Sun, 6 Jul 2025 21:16:46 -0400 Subject: [PATCH] MappingP1: only compute the covariant once. 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 | 7 +++++- source/fe/mapping_p1.cc | 43 ++++++++++++++------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/include/deal.II/fe/mapping_p1.h b/include/deal.II/fe/mapping_p1.h index a5659090e9..ad8d1de2a5 100644 --- a/include/deal.II/fe/mapping_p1.h +++ b/include/deal.II/fe/mapping_p1.h @@ -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. */ diff --git a/source/fe/mapping_p1.cc b/source/fe/mapping_p1.cc index ab97307454..f224a58b95 100644 --- a/source/fe/mapping_p1.cc +++ b/source/fe/mapping_p1.cc @@ -84,6 +84,7 @@ MappingP1::InternalData::memory_consumption() const return (Mapping::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::update_transformation( { data.affine_component = cell->vertex(0); data.linear_component = compute_linear_transformation(cell); + data.covariant = data.linear_component.covariant_form(); data.determinant = data.linear_component.determinant(); } @@ -236,8 +238,7 @@ MappingP1::maybe_update_normal_vectors( ReferenceCells::get_simplex().template unit_normal_vectors( 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::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::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::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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::transform( typename FEValuesBase::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]); -- 2.39.5