From 8a62780d9e836ed46a6c5c9192c38e4e7ad32ba7 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Sat, 27 Feb 2021 17:43:01 +0100
Subject: [PATCH] Modernize LocalIntegralEnergy

---
 .../materials/localintegralenergy.hh           | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/dune/elasticity/materials/localintegralenergy.hh b/dune/elasticity/materials/localintegralenergy.hh
index e19d9c8..6ef3815 100644
--- a/dune/elasticity/materials/localintegralenergy.hh
+++ b/dune/elasticity/materials/localintegralenergy.hh
@@ -2,6 +2,7 @@
 #define DUNE_ELASTICITY_MATERIALS_LOCALINTEGRALENERGY_HH
 
 #include <dune/common/fmatrix.hh>
+#include <dune/common/transpose.hh>
 
 #include <dune/geometry/quadraturerules.hh>
 
@@ -53,8 +54,9 @@ energy(const LocalView& localView,
   field_type energy = 0;
 
   // store gradients of shape functions and base functions
-  std::vector<FieldMatrix<DT,1,gridDim> > referenceGradients(localFiniteElement.size());
-  std::vector<FieldVector<DT,gridDim> > gradients(localFiniteElement.size());
+  using FiniteElement = typename LocalView::Tree::ChildType::FiniteElement;
+  using Jacobian = typename FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
+  std::vector<Jacobian> jacobians(localFiniteElement.size());
 
   int quadOrder = (element.type().isSimplex()) ? localFiniteElement.localBasis().order()
                                                : localFiniteElement.localBasis().order() * gridDim;
@@ -65,23 +67,23 @@ energy(const LocalView& localView,
   {
     const DT integrationElement = element.geometry().integrationElement(qp.position());
 
-    const auto jacobianInverseTransposed = element.geometry().jacobianInverseTransposed(qp.position());
+    const auto geometryJacobianIT = element.geometry().jacobianInverseTransposed(qp.position());
 
     // Global position
     auto x = element.geometry().global(qp.position());
 
     // Get gradients of shape functions
-    localFiniteElement.localBasis().evaluateJacobian(qp.position(), referenceGradients);
+    localFiniteElement.localBasis().evaluateJacobian(qp.position(), jacobians);
 
     // compute gradients of base functions
-    for (size_t i=0; i<gradients.size(); ++i)
-      jacobianInverseTransposed.mv(referenceGradients[i][0], gradients[i]);
+    for (size_t i=0; i<jacobians.size(); ++i)
+      jacobians[i] = jacobians[i] * transpose(geometryJacobianIT);
 
     // Deformation gradient
     FieldMatrix<field_type,gridDim,gridDim> deformationGradient(0);
-    for (size_t i=0; i<gradients.size(); i++)
+    for (size_t i=0; i<jacobians.size(); i++)
       for (int j=0; j<gridDim; j++)
-        deformationGradient[j].axpy(localConfiguration[ localView.tree().child(j).localIndex(i) ], gradients[i]);
+        deformationGradient[j].axpy(localConfiguration[ localView.tree().child(j).localIndex(i) ], jacobians[i][0]);
     // Integrate the energy density
     energy += qp.weight() * integrationElement * (*localDensity_)(x, deformationGradient);
   }
-- 
GitLab