diff --git a/NumLib/Fem/FiniteElement/TemplateIsoparametric.h b/NumLib/Fem/FiniteElement/TemplateIsoparametric.h
index 8484ea1ddf26b2aa3fe4af5997cd96514d71e1d5..c54a99aec4226b4f51f340ce779bfe80d45194f7 100644
--- a/NumLib/Fem/FiniteElement/TemplateIsoparametric.h
+++ b/NumLib/Fem/FiniteElement/TemplateIsoparametric.h
@@ -12,25 +12,21 @@
 
 #pragma once
 
-#include <cassert>
 #include <boost/math/constants/constants.hpp>
+#include <cassert>
 
-#include "NumLib/Fem/CoordinatesMapping/ShapeMatrices.h"
 #include "NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.h"
+#include "NumLib/Fem/CoordinatesMapping/ShapeMatrices.h"
 
 namespace NumLib
 {
-
 /**
  * \brief Template class for isoparametric elements
  *
  * \tparam ShapeFunctionType_   The shape function type.
  * \tparam ShapeMatrixTypes_    An aggregate of shape matrix types.
  */
-template <
-    class ShapeFunctionType_,
-    class ShapeMatrixTypes_
-    >
+template <class ShapeFunctionType_, class ShapeMatrixTypes_>
 class TemplateIsoparametric
 {
 public:
@@ -44,36 +40,29 @@ public:
 
     /// Natural coordinates mapping tools specialization for specific
     /// MeshElement and ShapeFunction types.
-    using NaturalCoordsMappingType = NaturalCoordinatesMapping<
-            MeshElementType, ShapeFunctionType, ShapeMatrices>;
+    using NaturalCoordsMappingType =
+        NaturalCoordinatesMapping<MeshElementType, ShapeFunctionType,
+                                  ShapeMatrices>;
 
     /**
-     * Constructor without specifying a mesh element. setMeshElement() must be called afterwards.
+     * Constructor without specifying a mesh element. setMeshElement() must be
+     * called afterwards.
      */
-    TemplateIsoparametric()
-    : _ele(nullptr)
-    {
-    }
+    TemplateIsoparametric() : _ele(nullptr) {}
 
     /**
      * Construct this object for the given mesh element.
      *
      * @param e                      Mesh element object
      */
-    TemplateIsoparametric(const MeshElementType &e)
-    : _ele(&e)
-    {
-    }
+    TemplateIsoparametric(const MeshElementType& e) : _ele(&e) {}
     ~TemplateIsoparametric() = default;
 
     /// return current mesh element
-    const MeshElementType* getMeshElement() const {return _ele;}
+    const MeshElementType* getMeshElement() const { return _ele; }
 
     /// Sets the mesh element
-    void setMeshElement(const MeshElementType &e)
-    {
-        this->_ele = &e;
-    }
+    void setMeshElement(const MeshElementType& e) { this->_ele = &e; }
     /**
      * compute shape functions
      *
@@ -112,23 +101,45 @@ public:
         computeIntegralMeasure(is_axially_symmetric, shape);
     }
 
+    /// Interpolates the x coordinate of the element with the given shape
+    /// matrix.
     double interpolateZerothCoordinate(
         typename ShapeMatrices::ShapeType const& N) const
     {
         auto* nodes = _ele->getNodes();
         typename ShapeMatrices::ShapeType rs(N.size());
-        for (int i=0; i<rs.size(); ++i) {
+        for (int i = 0; i < rs.size(); ++i)
+        {
             rs[i] = (*nodes[i])[0];
         }
         auto const r = N.dot(rs);
         return r;
     }
 
+    /// Interpolates the coordinates of the element with the given shape matrix.
+    std::array<double, 3> interpolateCoordinates(
+        typename ShapeMatrices::ShapeType const& N) const
+    {
+        auto* nodes = _ele->getNodes();
+        typename ShapeMatrices::ShapeType rs(N.size());
+        std::array<double, 3> interpolated_coords;
+        for (int d = 0; d < 3; ++d)
+        {
+            for (int i = 0; i < rs.size(); ++i)
+            {
+                rs[i] = (*nodes[i])[d];
+            }
+            interpolated_coords[d] = N.dot(rs);
+        }
+        return interpolated_coords;
+    }
+
 private:
     void computeIntegralMeasure(bool is_axially_symmetric,
                                 ShapeMatrices& shape) const
     {
-        if (!is_axially_symmetric) {
+        if (!is_axially_symmetric)
+        {
             shape.integralMeasure = 1.0;
             return;
         }
@@ -140,11 +151,10 @@ private:
         // located at edge of the unit triangle, it is possible that
         // r becomes zero.
         auto const r = interpolateZerothCoordinate(shape.N);
-        shape.integralMeasure =
-            boost::math::constants::two_pi<double>() * r;
+        shape.integralMeasure = boost::math::constants::two_pi<double>() * r;
     }
 
     const MeshElementType* _ele;
 };
 
-} // NumLib
+}  // namespace NumLib