From 6aa13fba80e2ca2c85f3af42e11356d2562584a8 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Thu, 1 Aug 2024 20:22:47 +0200
Subject: [PATCH 01/24] [disc][pq1bubble] Generalize grid geometry to allow for
 hybrid scheme

Co-authored-by: Timo Koch <timokoch@uio.no>
---
 .../pq1bubble/fvgridgeometry.hh               |  52 +++-
 .../pq1bubble/geometryhelper.hh               | 222 +++++++++++++++++-
 2 files changed, 267 insertions(+), 7 deletions(-)

diff --git a/dumux/discretization/pq1bubble/fvgridgeometry.hh b/dumux/discretization/pq1bubble/fvgridgeometry.hh
index f3d60a7fc9..0f8d94c232 100644
--- a/dumux/discretization/pq1bubble/fvgridgeometry.hh
+++ b/dumux/discretization/pq1bubble/fvgridgeometry.hh
@@ -16,6 +16,7 @@
 
 #include <utility>
 #include <unordered_map>
+#include <type_traits>
 
 #include <dune/grid/common/mcmgmapper.hh>
 
@@ -38,9 +39,20 @@
 namespace Dumux {
 
 namespace Detail {
+template<class T>
+using EnableHybridCVFE
+    = typename T::EnableHybridCVFE;
+
+template<class T>
+static constexpr bool enablesHybridCVFE
+    = Dune::Std::detected_or_t<std::false_type, EnableHybridCVFE, T>{};
+
 template<class GV, class T>
 using PQ1BubbleGeometryHelper_t = Dune::Std::detected_or_t<
-    Dumux::PQ1BubbleGeometryHelper<GV, typename T::SubControlVolume, typename T::SubControlVolumeFace>,
+    std::conditional_t<enablesHybridCVFE<T>,
+        Dumux::HybridPQ1BubbleGeometryHelper<GV, typename T::SubControlVolume, typename T::SubControlVolumeFace>,
+        Dumux::PQ1BubbleGeometryHelper<GV, typename T::SubControlVolume, typename T::SubControlVolumeFace>
+    >,
     SpecifiesGeometryHelper,
     T
 >;
@@ -80,6 +92,17 @@ struct PQ1BubbleDefaultGridGeometryTraits
     using LocalView = PQ1BubbleFVElementGeometry<GridGeometry, enableCache>;
 };
 
+/*!
+ * \ingroup PQ1BubbleDiscretization
+ * \brief The default traits for the hybrid pq1bubble finite volume grid geometry
+ *        Defines the scv and scvf types and the mapper types
+ * \tparam the grid view type
+ */
+template<class BaseTraits>
+struct HybridPQ1BubbleCVFEGridGeometryTraits
+: public BaseTraits
+{ using EnableHybridCVFE = std::true_type; };
+
 /*!
  * \ingroup PQ1BubbleDiscretization
  * \brief Base class for the finite volume geometry vector for pq1bubble schemes
@@ -105,6 +128,8 @@ class PQ1BubbleFVGridGeometry
 
     static_assert(dim > 1, "Only implemented for dim > 1");
 
+    static constexpr bool enableHybridCVFE = Detail::enablesHybridCVFE<Traits>;
+
 public:
     //! export the discretization method this geometry belongs to
     using DiscretizationMethod = DiscretizationMethods::PQ1Bubble;
@@ -198,7 +223,6 @@ public:
     { return { gg.cache_ }; }
 
 private:
-
     class PQ1BubbleGridGeometryCache
     {
         friend class PQ1BubbleFVGridGeometry;
@@ -282,9 +306,12 @@ private:
             // instantiate the geometry helper
             GeometryHelper geometryHelper(elementGeometry);
 
-            numScv_ += geometryHelper.numScv();
+            // ToDo: Currently we still create scvs also for Fe dofs
+            numScv_ += geometryHelper.numElementDofs();
             // construct the sub control volumes
-            cache_.scvs_[eIdx].resize(geometryHelper.numScv());
+            cache_.scvs_[eIdx].resize(geometryHelper.numElementDofs());
+
+            // Scvs related to control volumes
             for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < geometryHelper.numScv(); ++scvLocalIdx)
             {
                 auto corners = geometryHelper.getScvCorners(scvLocalIdx);
@@ -299,6 +326,23 @@ private:
                 );
             }
 
+            // Hybrid scvs, i.e. Fem dofs
+            if constexpr (enableHybridCVFE)
+            {
+                // We add the additional Fe dof
+                // ToDo: get rid of building scvs for Fe dofs
+                LocalIndexType scvLocalIdx = geometryHelper.numScv();
+                cache_.scvs_[eIdx][scvLocalIdx] = SubControlVolume(
+                    elementGeometry.volume(),
+                    elementGeometry.center(),
+                    elementGeometry.center(),
+                    scvLocalIdx,
+                    eIdx,
+                    geometryHelper.dofIndex(this->dofMapper(), element, scvLocalIdx),
+                    true
+                );
+            }
+
             // construct the sub control volume faces
             numScvf_ += geometryHelper.numInteriorScvf();
             cache_.scvfs_[eIdx].resize(geometryHelper.numInteriorScvf());
diff --git a/dumux/discretization/pq1bubble/geometryhelper.hh b/dumux/discretization/pq1bubble/geometryhelper.hh
index 47a4e36e0b..3745becc83 100644
--- a/dumux/discretization/pq1bubble/geometryhelper.hh
+++ b/dumux/discretization/pq1bubble/geometryhelper.hh
@@ -364,10 +364,22 @@ public:
         );
     }
 
+    //! number of element dofs
+    std::size_t numElementDofs() const
+    {
+        return numScv();
+    }
+
+    //! number of hybrid dofs
+    static std::size_t numHybridDofs(Dune::GeometryType type)
+    {
+        return 0;
+    }
+
     template<class DofMapper>
     auto dofIndex(const DofMapper& dofMapper, const Element& element, unsigned int localScvIdx) const
     {
-        if (localScvIdx < numScv()-1)
+        if (localScvIdx < numElementDofs()-1)
             return dofMapper.subIndex(element, localScvIdx, dim);
         else
             return dofMapper.index(element);
@@ -375,7 +387,7 @@ public:
 
     GlobalPosition dofPosition(unsigned int localScvIdx) const
     {
-        if (localScvIdx < numScv()-1)
+        if (localScvIdx < numElementDofs()-1)
             return geo_.corner(localScvIdx);
         else
             return geo_.center();
@@ -391,7 +403,7 @@ public:
             };
         else
             return {
-                static_cast<LocalIndexType>(numScv()-1),
+                static_cast<LocalIndexType>(numElementDofs()-1),
                 static_cast<LocalIndexType>(localScvfIndex-numEdges)
             };
     }
@@ -438,6 +450,210 @@ private:
     Dumux::BoxGeometryHelper<GridView, dim, ScvType, ScvfType> boxHelper_;
 };
 
+template <class GridView, class ScvType, class ScvfType>
+class HybridPQ1BubbleGeometryHelper
+{
+    using Scalar = typename GridView::ctype;
+    using GlobalPosition = typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
+    using ScvCornerStorage = typename ScvType::Traits::CornerStorage;
+    using ScvfCornerStorage = typename ScvfType::Traits::CornerStorage;
+    using LocalIndexType = typename ScvType::Traits::LocalIndexType;
+
+    using Element = typename GridView::template Codim<0>::Entity;
+    using Intersection = typename GridView::Intersection;
+
+    static constexpr auto dim = GridView::dimension;
+    static constexpr auto dimWorld = GridView::dimensionworld;
+public:
+
+    HybridPQ1BubbleGeometryHelper(const typename Element::Geometry& geometry)
+    : geo_(geometry)
+    , boxHelper_(geometry)
+    {}
+
+    //! Create a vector with the scv corners
+    ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
+    {
+        // proceed according to number of corners of the element
+        const auto numBoxScv = boxHelper_.numScv();
+        // reuse box geometry helper for the corner scvs
+        if (localScvIdx < numBoxScv)
+            return boxHelper_.getScvCorners(localScvIdx);
+
+        DUNE_THROW(Dune::NotImplemented, "PQ1Bubble scv corners call for hybrid dofs");
+    }
+
+    Dune::GeometryType getScvGeometryType(unsigned int localScvIdx) const
+    {
+        // proceed according to number of corners of the element
+        const auto numBoxScv = boxHelper_.numScv();
+
+        if (localScvIdx < numBoxScv)
+            return Dune::GeometryTypes::cube(dim);
+
+        DUNE_THROW(Dune::NotImplemented, "PQ1Bubble scv geometry call for hybrid dofs");
+    }
+
+    //! Create a vector with the corners of sub control volume faces
+    ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
+    {
+        // proceed according to number of corners
+        const auto numBoxScvf = boxHelper_.numInteriorScvf();
+        // reuse box geometry helper for the corner scvs
+        if (localScvfIdx < numBoxScvf)
+            return boxHelper_.getScvfCorners(localScvfIdx);
+
+        DUNE_THROW(Dune::NotImplemented, "PQ1Bubble scvf corners call for hybrid dofs");
+    }
+
+    Dune::GeometryType getInteriorScvfGeometryType(unsigned int localScvfIdx) const
+    {
+        const auto numBoxScvf = boxHelper_.numInteriorScvf();
+        if (localScvfIdx < numBoxScvf)
+            return Dune::GeometryTypes::cube(dim-1);
+
+        DUNE_THROW(Dune::NotImplemented, "PQ1Bubble interior scvf geometry type call for hybrid dofs");
+    }
+
+    //! Create the sub control volume face geometries on the boundary
+    ScvfCornerStorage getBoundaryScvfCorners(unsigned int localFacetIndex,
+                                             unsigned int indexInFacet) const
+    {
+        return boxHelper_.getBoundaryScvfCorners(localFacetIndex, indexInFacet);
+    }
+
+    Dune::GeometryType getBoundaryScvfGeometryType(unsigned int localScvfIdx) const
+    {
+        return Dune::GeometryTypes::cube(dim-1);
+    }
+
+    template<int d = dimWorld, std::enable_if_t<(d==3), int> = 0>
+    GlobalPosition normal(const ScvfCornerStorage& p, const std::array<LocalIndexType, 2>& scvPair)
+    {
+        auto normal = Dumux::crossProduct(p[1]-p[0], p[2]-p[0]);
+        normal /= normal.two_norm();
+
+        GlobalPosition v = dofPosition(scvPair[1]) - dofPosition(scvPair[0]);
+
+        const auto s = v*normal;
+        if (std::signbit(s))
+            normal *= -1;
+
+        return normal;
+    }
+
+    template<int d = dimWorld, std::enable_if_t<(d==2), int> = 0>
+    GlobalPosition normal(const ScvfCornerStorage& p, const std::array<LocalIndexType, 2>& scvPair)
+    {
+        //! obtain normal vector by 90° counter-clockwise rotation of t
+        const auto t = p[1] - p[0];
+        GlobalPosition normal({-t[1], t[0]});
+        normal /= normal.two_norm();
+
+        GlobalPosition v = dofPosition(scvPair[1]) - dofPosition(scvPair[0]);
+
+        const auto s = v*normal;
+        if (std::signbit(s))
+            normal *= -1;
+
+        return normal;
+    }
+
+    //! the wrapped element geometry
+    const typename Element::Geometry& elementGeometry() const
+    { return geo_; }
+
+    //! number of interior sub control volume faces
+    std::size_t numInteriorScvf() const
+    {
+        return boxHelper_.numInteriorScvf();
+    }
+
+    //! number of boundary sub control volume faces for face localFacetIndex
+    std::size_t numBoundaryScvf(unsigned int localFacetIndex) const
+    {
+        return referenceElement(geo_).size(localFacetIndex, 1, dim);
+    }
+
+    //! number of sub control volumes (number of codim-1 entities)
+    std::size_t numScv() const
+    {
+        return boxHelper_.numScv();
+    }
+
+    //! get scv volume
+    Scalar scvVolume(unsigned int localScvIdx, const ScvCornerStorage& p) const
+    {
+        const auto scvType = getScvGeometryType(localScvIdx);
+
+        return Dumux::convexPolytopeVolume<dim>(
+            scvType,
+            [&](unsigned int i){ return p[i]; }
+        );
+    }
+
+    //! number of element dofs
+    std::size_t numElementDofs() const
+    {
+        return boxHelper_.numScv() + 1;
+    }
+
+    //! number of hybrid dofs
+    static std::size_t numHybridDofs(Dune::GeometryType type)
+    {
+        return 1;
+    }
+
+    template<class DofMapper>
+    auto dofIndex(const DofMapper& dofMapper, const Element& element, unsigned int localScvIdx) const
+    {
+        if (localScvIdx < numElementDofs()-1)
+            return dofMapper.subIndex(element, localScvIdx, dim);
+        else
+            return dofMapper.index(element);
+    }
+
+    GlobalPosition dofPosition(unsigned int localScvIdx) const
+    {
+        if (localScvIdx < numElementDofs()-1)
+            return geo_.corner(localScvIdx);
+        else
+            return geo_.center();
+    }
+
+    std::array<LocalIndexType, 2> getScvPairForScvf(unsigned int localScvfIndex) const
+    {
+        const auto numEdges = referenceElement(geo_).size(dim-1);
+        if (localScvfIndex < numEdges)
+            return {
+                static_cast<LocalIndexType>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 0, dim)),
+                static_cast<LocalIndexType>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 1, dim))
+            };
+
+        DUNE_THROW(Dune::NotImplemented, "PQ1Bubble scv pair call for hybrid dofs");
+    }
+
+    std::array<LocalIndexType, 2> getScvPairForBoundaryScvf(unsigned int localFacetIndex, unsigned int localIsScvfIndex) const
+    {
+        const LocalIndexType insideScvIdx
+            = static_cast<LocalIndexType>(referenceElement(geo_).subEntity(localFacetIndex, 1, localIsScvfIndex, dim));
+        return { insideScvIdx, insideScvIdx };
+    }
+
+    bool isOverlappingScvf(unsigned int localScvfIndex) const
+    { return false; }
+
+    bool isOverlappingBoundaryScvf(unsigned int localFacetIndex) const
+    { return false; }
+
+    bool isOverlappingScv(unsigned int localScvIndex) const
+    { return false; }
+
+private:
+    const typename Element::Geometry& geo_; //!< Reference to the element geometry
+    Dumux::BoxGeometryHelper<GridView, dim, ScvType, ScvfType> boxHelper_;
+};
+
 } // end namespace Dumux
 
 #endif
-- 
GitLab


From 1255156d7595afbdefc04c95645a59539791ac0b Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Thu, 1 Aug 2024 20:24:26 +0200
Subject: [PATCH 02/24] [disc][pq1bubble] Allow to iterate over dof subsets

Co-authored-by: Timo Koch <timokoch@uio.no>
---
 .../pq1bubble/fvelementgeometry.hh            | 49 +++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/dumux/discretization/pq1bubble/fvelementgeometry.hh b/dumux/discretization/pq1bubble/fvelementgeometry.hh
index e72802dc51..326fdfaa8c 100644
--- a/dumux/discretization/pq1bubble/fvelementgeometry.hh
+++ b/dumux/discretization/pq1bubble/fvelementgeometry.hh
@@ -16,8 +16,10 @@
 
 #include <optional>
 #include <utility>
+#include <ranges>
 
 #include <dune/common/exceptions.hh>
+#include <dune/common/rangeutilities.hh>
 #include <dune/geometry/type.hh>
 #include <dune/localfunctions/lagrange/pqkfactory.hh>
 
@@ -43,6 +45,7 @@ class PQ1BubbleFVElementGeometry;
 template<class GG>
 class PQ1BubbleFVElementGeometry<GG, true>
 {
+    using ThisType = PQ1BubbleFVElementGeometry<GG, true>;
     using GridView = typename GG::GridView;
     static constexpr int dim = GridView::dimension;
     static constexpr int dimWorld = GridView::dimensionworld;
@@ -52,6 +55,25 @@ class PQ1BubbleFVElementGeometry<GG, true>
     using FeLocalBasis = typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
     using GGCache = typename GG::Cache;
     using GeometryHelper = typename GGCache::GeometryHelper;
+
+    class LocalDof
+    {
+    public:
+        LocalDof(std::size_t dofIndex) : dofIndex_(dofIndex) {}
+        std::size_t index() const { return dofIndex_; }
+    private:
+        std::size_t dofIndex_;
+    };
+
+    class FVLocalDof : public LocalDof
+    {
+    public:
+        FVLocalDof(std::size_t dofIndex, const ThisType& fvGeometry)
+        : LocalDof(dofIndex), fvGeometry_(fvGeometry) {}
+        const typename GG::SubControlVolume& scv() const { return fvGeometry_.scv(this->index()); }
+    private:
+        const ThisType& fvGeometry_;
+    };
 public:
     //! export the element type
     using Element = typename GridView::template Codim<0>::Entity;
@@ -95,6 +117,33 @@ public:
         return Dune::IteratorRange<Iter>(s.begin(), s.end());
     }
 
+    //! iterate over dof indices that belong to dofs associated with control volumes
+    friend inline auto fvLocalDofs(const PQ1BubbleFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(std::size_t(0), fvGeometry.numScv()-GeometryHelper::numHybridDofs(fvGeometry.element().type())),
+            [&](const auto i) { return FVLocalDof{ i, fvGeometry }; }
+        );
+    }
+
+    //! iterate over dof indices that are treated as hybrid dofs using the finite element method
+    friend inline auto hybridLocalDofs(const PQ1BubbleFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()-GeometryHelper::numHybridDofs(fvGeometry.element().type()), fvGeometry.numScv()),
+            [](const auto i) { return LocalDof{ i }; }
+        );
+    }
+
+    //! an iterator over all local dofs
+    friend inline auto localDofs(const PQ1BubbleFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(std::size_t(0), fvGeometry.numScv()),
+            [](const auto i) { return LocalDof{ i }; }
+        );
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
-- 
GitLab


From 3fcce179532e871e2da81de0f97602e1996b99fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dennis=20Gl=C3=A4ser?= <dennis.glaeser@iws.uni-stuttgart.de>
Date: Wed, 24 Jul 2019 17:33:08 +0200
Subject: [PATCH 03/24] [fe] add integration point data class

---
 .../fem/integrationpointdata.hh               | 92 +++++++++++++++++++
 1 file changed, 92 insertions(+)
 create mode 100644 dumux/discretization/fem/integrationpointdata.hh

diff --git a/dumux/discretization/fem/integrationpointdata.hh b/dumux/discretization/fem/integrationpointdata.hh
new file mode 100644
index 0000000000..6014cee000
--- /dev/null
+++ b/dumux/discretization/fem/integrationpointdata.hh
@@ -0,0 +1,92 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+//
+// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+/*!
+ * \file
+ * \ingroup FEMDiscretization
+ * \brief Shape functions and gradients at an integration point
+ */
+#ifndef DUMUX_DISCRETIZATION_FE_INTEGRATION_POINT_DATA_HH
+#define DUMUX_DISCRETIZATION_FE_INTEGRATION_POINT_DATA_HH
+
+#include <vector>
+
+namespace Dumux {
+
+template<class GlobalPosition, class LocalBasis>
+class FEIntegrationPointData
+{
+    using LocalPosition = typename LocalBasis::Traits::DomainType;
+    using RangeType = typename LocalBasis::Traits::RangeType;
+    using JacobianType = typename LocalBasis::Traits::JacobianType;
+
+    using ShapeValues = std::vector<RangeType>;
+    using ShapeGradients = std::vector<GlobalPosition>;
+
+public:
+    // The default constructor
+    FEIntegrationPointData() = delete;
+
+    // The constructor
+    template<class Geometry>
+    FEIntegrationPointData(const Geometry& geometry,
+                           const LocalPosition& ipLocal,
+                           const LocalBasis& localBasis)
+    : ipLocal_(ipLocal),
+      ipGlobal_(geometry.global(ipLocal))
+    {
+        auto numLocalDofs = localBasis.size();
+
+        // set the shape values
+        shapeValues_.resize(numLocalDofs);
+        localBasis.evaluateFunction(ipLocal, shapeValues_);
+
+        // the local shape function gradients
+        std::vector<JacobianType> shapeGrads(numLocalDofs);
+        localBasis.evaluateJacobian(ipLocal, shapeGrads);
+
+        // the global shape function gradients
+        const auto jacInvT = geometry.jacobianInverseTransposed(ipLocal);
+        shapeGradients_.resize(numLocalDofs, GlobalPosition(0.0));
+        for (unsigned int i = 0; i < numLocalDofs; ++i)
+            jacInvT.umv(shapeGrads[i][0], shapeGradients_[i]);
+    }
+
+    //! The shape values at the quadrature point
+    const ShapeValues& shapeValues() const
+    { return shapeValues_; }
+
+    //! The shape value of a local dof at the quadrature point
+    const RangeType& shapeValue(int i) const
+    { return shapeValues_[i]; }
+
+    //! The shape value gradients at the quadrature point
+    const ShapeGradients& shapeGradients() const
+    { return shapeGradients_; }
+
+    //! The shape value gradient of a local dof at the quadrature point
+    const GlobalPosition& gradN(int i) const
+    { return shapeGradients_[i]; }
+
+    //! The local position of the quadrature point
+    const LocalPosition& ipLocal() const
+    { return ipLocal_; }
+
+    //! The global position of the quadrature point
+    const GlobalPosition& ipGlobal() const
+    { return ipGlobal_; }
+
+private:
+    LocalPosition ipLocal_;
+    GlobalPosition ipGlobal_;
+
+    ShapeValues shapeValues_;
+    ShapeGradients shapeGradients_;
+};
+
+} // end namespace Dumux
+
+#endif
-- 
GitLab


From 155aa94c1481444b91c4bf98b7959c554998125c Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 2 Aug 2024 12:49:38 +0200
Subject: [PATCH 04/24] [ff][momentum] Add interface to evaluate quantaties at
 given pos

---
 .../freeflow/navierstokes/momentum/problem.hh |  45 +++++
 .../freeflow/couplingmanager_cvfe.hh          | 167 +++++++-----------
 2 files changed, 112 insertions(+), 100 deletions(-)

diff --git a/dumux/freeflow/navierstokes/momentum/problem.hh b/dumux/freeflow/navierstokes/momentum/problem.hh
index 914b31eaec..a078f3183d 100644
--- a/dumux/freeflow/navierstokes/momentum/problem.hh
+++ b/dumux/freeflow/navierstokes/momentum/problem.hh
@@ -558,6 +558,7 @@ class NavierStokesMomentumProblemImpl<TypeTag, DiscretizationMethods::CVFE<DM>>
     static constexpr int dimWorld = GridView::dimensionworld;
 
     using GlobalPosition = typename SubControlVolumeFace::GlobalPosition;
+    using LocalPosition = typename Element::Geometry::LocalCoordinate;
     using VelocityVector = Dune::FieldVector<Scalar, dimWorld>;
     using GravityVector = Dune::FieldVector<Scalar, dimWorld>;
     using CouplingManager = GetPropType<TypeTag, Properties::CouplingManager>;
@@ -779,6 +780,21 @@ public:
             return couplingManager_->pressure(element, fvGeometry, scv, isPreviousTimeStep);
     }
 
+    /*!
+     * \brief Returns the pressure at a given position.
+     * \note  Overload this if a fixed pressure shall be prescribed (e.g., given by an analytical solution).
+     */
+    Scalar pressure(const Element& element,
+                    const FVElementGeometry& fvGeometry,
+                    const LocalPosition& pos,
+                    const bool isPreviousTimeStep = false) const
+    {
+        if constexpr (std::is_empty_v<CouplingManager>)
+            return asImp_().pressureAtPos(element.geometry().global(pos));
+        else
+            return couplingManager_->pressure(element, fvGeometry, pos, isPreviousTimeStep);
+    }
+
     /*!
      * \brief Returns the pressure at a given position.
      */
@@ -816,6 +832,20 @@ public:
             return couplingManager_->density(element, fvGeometry, scv, isPreviousTimeStep);
     }
 
+    /*!
+     * \brief Returns the density at a given position.
+     * \note  Overload this if a fixed density shall be prescribed.
+     */
+    Scalar density(const Element& element,
+                   const FVElementGeometry& fvGeometry,
+                   const LocalPosition& pos,
+                   const bool isPreviousTimeStep = false) const
+    {
+        if constexpr (std::is_empty_v<CouplingManager>)
+            return asImp_().densityAtPos(element.geometry().global(pos));
+        else
+            return couplingManager_->density(element, fvGeometry, pos, isPreviousTimeStep);
+    }
 
     /*!
      * \brief Returns the density at a given position.
@@ -854,6 +884,21 @@ public:
             return couplingManager_->effectiveViscosity(element, fvGeometry, scv, isPreviousTimeStep);
     }
 
+    /*!
+     * \brief Returns the effective dynamic viscosity at a given position.
+     * \note  Overload this if a fixed viscosity shall be prescribed.
+     */
+    Scalar effectiveViscosity(const Element& element,
+                              const FVElementGeometry& fvGeometry,
+                              const LocalPosition& pos,
+                              const bool isPreviousTimeStep = false) const
+    {
+        if constexpr (std::is_empty_v<CouplingManager>)
+            return asImp_().effectiveViscosityAtPos(element.geometry().global(pos));
+        else
+            return couplingManager_->effectiveViscosity(element, fvGeometry, pos, isPreviousTimeStep);
+    }
+
     /*!
      * \brief Returns the effective dynamic viscosity at a given position.
      */
diff --git a/dumux/multidomain/freeflow/couplingmanager_cvfe.hh b/dumux/multidomain/freeflow/couplingmanager_cvfe.hh
index 59c6516ca9..82e9fd0261 100644
--- a/dumux/multidomain/freeflow/couplingmanager_cvfe.hh
+++ b/dumux/multidomain/freeflow/couplingmanager_cvfe.hh
@@ -81,7 +81,9 @@ private:
 
     using FluidSystem = typename VolumeVariables<freeFlowMassIndex>::FluidSystem;
 
-    using VelocityVector = typename SubControlVolumeFace<freeFlowMassIndex>::GlobalPosition;
+    using LocalPosition = typename Element<freeFlowMassIndex>::Geometry::LocalCoordinate;
+    using GlobalPosition = typename SubControlVolumeFace<freeFlowMassIndex>::GlobalPosition;
+    using VelocityVector = GlobalPosition;
     using ShapeValue = typename Dune::FieldVector<Scalar, 1>;
 
     static_assert(std::is_same_v<VelocityVector, typename SubControlVolumeFace<freeFlowMomentumIndex>::GlobalPosition>);
@@ -194,6 +196,22 @@ public:
         return evalSolution(element, element.geometry(), gg, elemSol, scv.dofPosition())[pressureIdx];
     }
 
+    /*!
+     * \brief Returns the pressure at a given position
+     */
+    Scalar pressure(const Element<freeFlowMomentumIndex>& element,
+                    const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
+                    const LocalPosition& pos,
+                    const bool considerPreviousTimeStep = false) const
+    {
+        assert(!(considerPreviousTimeStep && !this->isTransient_));
+        const auto& gg = this->problem(freeFlowMassIndex).gridGeometry();
+        const auto& sol = considerPreviousTimeStep ? (*prevSol_)[freeFlowMassIndex]
+                                                   :  this->curSol(freeFlowMassIndex);
+        const auto elemSol = elementSolution(element, sol, gg);
+        return evalSolution(element, element.geometry(), gg, elemSol, element.geometry().global(pos))[pressureIdx];
+    }
+
     /*!
      * \brief Returns the density at a given sub control volume face.
      */
@@ -201,6 +219,28 @@ public:
                    const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
                    const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
                    const bool considerPreviousTimeStep = false) const
+    {
+        return this->density(element, fvGeometry, element.geometry().local(scvf.ipGlobal()), considerPreviousTimeStep);
+    }
+
+    /*!
+     * \brief Returns the density at a given sub control volume.
+     */
+    Scalar density(const Element<freeFlowMomentumIndex>& element,
+                   const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
+                   const SubControlVolume<freeFlowMomentumIndex>& scv,
+                   const bool considerPreviousTimeStep = false) const
+    {
+        return this->density(element, fvGeometry, element.geometry().local(scv.dofPosition()), considerPreviousTimeStep);
+    }
+
+    /*!
+     * \brief Returns the density at a given position.
+     */
+    Scalar density(const Element<freeFlowMomentumIndex>& element,
+                   const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
+                   const LocalPosition& pos,
+                   const bool considerPreviousTimeStep = false) const
     {
         assert(!(considerPreviousTimeStep && !this->isTransient_));
         bindCouplingContext_(Dune::index_constant<freeFlowMomentumIndex>(), element, fvGeometry.elementIndex());
@@ -223,8 +263,7 @@ public:
             using ShapeValue = typename Dune::FieldVector<Scalar, 1>;
             const auto& localBasis = this->momentumCouplingContext_()[0].fvGeometry.feLocalBasis();
             std::vector<ShapeValue> shapeValues;
-            const auto ipLocal = element.geometry().local(scvf.ipGlobal());
-            localBasis.evaluateFunction(ipLocal, shapeValues);
+            localBasis.evaluateFunction(pos, shapeValues);
 
             Scalar rho = 0.0;
             for (const auto& scv : scvs(this->momentumCouplingContext_()[0].fvGeometry))
@@ -244,106 +283,33 @@ public:
     }
 
     /*!
-     * \brief Returns the density at a given sub control volume.
+     * \brief Returns the effective viscosity at a given sub control volume face.
      */
-    Scalar density(const Element<freeFlowMomentumIndex>& element,
-                   const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
-                   const SubControlVolume<freeFlowMomentumIndex>& scv,
-                   const bool considerPreviousTimeStep = false) const
+    Scalar effectiveViscosity(const Element<freeFlowMomentumIndex>& element,
+                              const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
+                              const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
+                              const bool considerPreviousTimeStep = false) const
     {
-        assert(!(considerPreviousTimeStep && !this->isTransient_));
-        bindCouplingContext_(Dune::index_constant<freeFlowMomentumIndex>(), element, scv.elementIndex());
-
-        if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::cctpfa)
-        {
-            const auto eIdx = scv.elementIndex();
-            const auto& scvI = this->momentumCouplingContext_()[0].fvGeometry.scv(eIdx);
-
-            const auto& volVars = considerPreviousTimeStep ?
-                this->momentumCouplingContext_()[0].prevElemVolVars[scvI]
-                : this->momentumCouplingContext_()[0].curElemVolVars[scvI];
-
-            return volVars.density();
-        }
-        else if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::box
-                           || MassDiscretizationMethod{} == DiscretizationMethods::fcdiamond)
-        {
-            // TODO: cache the shape values when Box method is used
-            using ShapeValue = typename Dune::FieldVector<Scalar, 1>;
-            const auto& localBasis = this->momentumCouplingContext_()[0].fvGeometry.feLocalBasis();
-            std::vector<ShapeValue> shapeValues;
-            const auto ipLocal = element.geometry().local(scv.dofPosition());
-            localBasis.evaluateFunction(ipLocal, shapeValues);
-
-            Scalar rho = 0.0;
-            for (const auto& scvI : scvs(this->momentumCouplingContext_()[0].fvGeometry))
-            {
-                const auto& volVars = considerPreviousTimeStep ?
-                    this->momentumCouplingContext_()[0].prevElemVolVars[scvI]
-                    : this->momentumCouplingContext_()[0].curElemVolVars[scvI];
-                rho += volVars.density()*shapeValues[scvI.indexInElement()][0];
-            }
-            return rho;
-        }
-        else
-            DUNE_THROW(Dune::NotImplemented,
-                "Density interpolation for discretization scheme " << MassDiscretizationMethod{}
-            );
+        return this->effectiveViscosity(element, fvGeometry, element.geometry().local(scvf.ipGlobal()), considerPreviousTimeStep);
     }
 
     /*!
-     * \brief Returns the effective viscosity at a given sub control volume face.
+     * \brief Returns the effective viscosity at a given sub control volume.
      */
     Scalar effectiveViscosity(const Element<freeFlowMomentumIndex>& element,
                               const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
-                              const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
+                              const SubControlVolume<freeFlowMomentumIndex>& scv,
                               const bool considerPreviousTimeStep = false) const
     {
-        assert(!(considerPreviousTimeStep && !this->isTransient_));
-        bindCouplingContext_(Dune::index_constant<freeFlowMomentumIndex>(), element, fvGeometry.elementIndex());
-
-        if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::cctpfa)
-        {
-            const auto eIdx = fvGeometry.elementIndex();
-            const auto& scv = this->momentumCouplingContext_()[0].fvGeometry.scv(eIdx);
-            const auto& volVars = considerPreviousTimeStep ?
-                this->momentumCouplingContext_()[0].prevElemVolVars[scv]
-                : this->momentumCouplingContext_()[0].curElemVolVars[scv];
-            return volVars.viscosity();
-        }
-        else if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::box
-                           || MassDiscretizationMethod{} == DiscretizationMethods::fcdiamond)
-        {
-            // TODO: cache the shape values when Box method is used
-            using ShapeValue = typename Dune::FieldVector<Scalar, 1>;
-            const auto& localBasis = this->momentumCouplingContext_()[0].fvGeometry.feLocalBasis();
-            std::vector<ShapeValue> shapeValues;
-            const auto ipLocal = element.geometry().local(scvf.ipGlobal());
-            localBasis.evaluateFunction(ipLocal, shapeValues);
-
-            Scalar mu = 0.0;
-            for (const auto& scv : scvs(this->momentumCouplingContext_()[0].fvGeometry))
-            {
-                const auto& volVars = considerPreviousTimeStep ?
-                    this->momentumCouplingContext_()[0].prevElemVolVars[scv]
-                    : this->momentumCouplingContext_()[0].curElemVolVars[scv];
-                mu += volVars.viscosity()*shapeValues[scv.indexInElement()][0];
-            }
-
-            return mu;
-        }
-        else
-            DUNE_THROW(Dune::NotImplemented,
-                "Viscosity interpolation for discretization scheme " << MassDiscretizationMethod{}
-            );
+        return this->effectiveViscosity(element, fvGeometry, element.geometry().local(scv.dofPosition()), considerPreviousTimeStep);
     }
 
     /*!
-     * \brief Returns the effective viscosity at a given sub control volume.
+     * \brief Returns the effective viscosity at a given position.
      */
     Scalar effectiveViscosity(const Element<freeFlowMomentumIndex>& element,
                               const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
-                              const SubControlVolume<freeFlowMomentumIndex>& scv,
+                              const LocalPosition& pos,
                               const bool considerPreviousTimeStep = false) const
     {
         assert(!(considerPreviousTimeStep && !this->isTransient_));
@@ -352,11 +318,13 @@ public:
         if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::cctpfa)
         {
             const auto eIdx = fvGeometry.elementIndex();
-            const auto& scvI = this->momentumCouplingContext_()[0].fvGeometry.scv(eIdx);
+            const auto& scv = this->momentumCouplingContext_()[0].fvGeometry.scv(eIdx);
+
             const auto& volVars = considerPreviousTimeStep ?
-                this->momentumCouplingContext_()[0].prevElemVolVars[scvI]
-                : this->momentumCouplingContext_()[0].curElemVolVars[scvI];
-            return volVars.viscosity();
+                this->momentumCouplingContext_()[0].prevElemVolVars[scv]
+                : this->momentumCouplingContext_()[0].curElemVolVars[scv];
+
+            return volVars.density();
         }
         else if constexpr (MassDiscretizationMethod{} == DiscretizationMethods::box
                            || MassDiscretizationMethod{} == DiscretizationMethods::fcdiamond)
@@ -365,23 +333,22 @@ public:
             using ShapeValue = typename Dune::FieldVector<Scalar, 1>;
             const auto& localBasis = this->momentumCouplingContext_()[0].fvGeometry.feLocalBasis();
             std::vector<ShapeValue> shapeValues;
-            const auto ipLocal = element.geometry().local(scv.dofPosition());
-            localBasis.evaluateFunction(ipLocal, shapeValues);
+            localBasis.evaluateFunction(pos, shapeValues);
 
-            Scalar mu = 0.0;
-            for (const auto& scvI : scvs(this->momentumCouplingContext_()[0].fvGeometry))
+            Scalar rho = 0.0;
+            for (const auto& scv : scvs(this->momentumCouplingContext_()[0].fvGeometry))
             {
                 const auto& volVars = considerPreviousTimeStep ?
-                    this->momentumCouplingContext_()[0].prevElemVolVars[scvI]
-                    : this->momentumCouplingContext_()[0].curElemVolVars[scvI];
-                mu += volVars.viscosity()*shapeValues[scvI.indexInElement()][0];
+                    this->momentumCouplingContext_()[0].prevElemVolVars[scv]
+                    : this->momentumCouplingContext_()[0].curElemVolVars[scv];
+                rho += volVars.density()*shapeValues[scv.indexInElement()][0];
             }
 
-            return mu;
+            return rho;
         }
         else
             DUNE_THROW(Dune::NotImplemented,
-                "Viscosity interpolation for discretization scheme " << MassDiscretizationMethod{}
+                "Density interpolation for discretization scheme " << MassDiscretizationMethod{}
             );
     }
 
-- 
GitLab


From 29124fd411f9881bf57518ad7aa24ed2988df1ce Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 2 Aug 2024 12:54:16 +0200
Subject: [PATCH 05/24] [assembly][hybridcvfe] Implementation of hybrid cvfe
 local residual

---
 dumux/assembly/hybridcvfelocalresidual.hh     | 153 ++++++++++++++++
 .../momentum/cvfe/localresidual.hh            | 163 +++++++++++++++++-
 2 files changed, 314 insertions(+), 2 deletions(-)
 create mode 100644 dumux/assembly/hybridcvfelocalresidual.hh

diff --git a/dumux/assembly/hybridcvfelocalresidual.hh b/dumux/assembly/hybridcvfelocalresidual.hh
new file mode 100644
index 0000000000..a8d0727d80
--- /dev/null
+++ b/dumux/assembly/hybridcvfelocalresidual.hh
@@ -0,0 +1,153 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+//
+// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+/*!
+ * \file
+ * \ingroup Assembly
+ * \ingroup CVFEDiscretization
+ * \brief Calculates the element-wise residual for hybrid control-volume finite element schemes
+ */
+#ifndef DUMUX_HYBRID_CVFE_LOCAL_RESIDUAL_HH
+#define DUMUX_HYBRID_CVFE_LOCAL_RESIDUAL_HH
+
+#include <dumux/common/properties.hh>
+
+#include "cvfelocalresidual.hh"
+
+namespace Dumux {
+
+/*!
+ * \ingroup Assembly
+ * \ingroup CVFEDiscretization
+ * \brief The element-wise residual for control-volume finite element schemes
+ * \tparam TypeTag the TypeTag
+ */
+template<class TypeTag>
+class HybridCVFELocalResidual : public CVFELocalResidual<TypeTag>
+{
+    using ParentType = CVFELocalResidual<TypeTag>;
+    using Problem = GetPropType<TypeTag, Properties::Problem>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridView = typename GridGeometry::GridView;
+    using Element = typename GridView::template Codim<0>::Entity;
+    using ElementBoundaryTypes = GetPropType<TypeTag, Properties::ElementBoundaryTypes>;
+    using FVElementGeometry = typename GridGeometry::LocalView;
+    using GridVolumeVariables = GetPropType<TypeTag, Properties::GridVolumeVariables>;
+    using ElementVolumeVariables = typename GridVolumeVariables::LocalView;
+    using ElementFluxVariablesCache = typename GetPropType<TypeTag, Properties::GridFluxVariablesCache>::LocalView;
+
+public:
+    using ElementResidualVector = typename ParentType::ElementResidualVector;
+    using ParentType::ParentType;
+
+    /*!
+     * \name Main interface
+     * \note Methods used by the assembler to compute derivatives and residual
+     */
+    // \{
+
+    /*!
+     * \brief Compute the storage local residual, i.e. the deviation of the
+     *        storage term from zero for instationary problems.
+     *
+     * \param element The DUNE Codim<0> entity for which the residual
+     *                ought to be calculated
+     * \param fvGeometry The finite-volume geometry of the element
+     * \param prevElemVolVars The volume averaged variables for all
+     *                        sub-control volumes of the element at the previous time level
+     * \param curElemVolVars The volume averaged variables for all
+     *                       sub-control volumes of the element at the current  time level
+     */
+    using ParentType::evalStorage;
+    ElementResidualVector evalStorage(const Element& element,
+                                      const FVElementGeometry& fvGeometry,
+                                      const ElementVolumeVariables& prevElemVolVars,
+                                      const ElementVolumeVariables& curElemVolVars) const
+    {
+        assert(!this->isStationary() && "no time loop set for storage term evaluation");
+
+        // initialize the residual vector for all scvs in this element
+        ElementResidualVector residual(fvGeometry.numScv());
+
+        // evaluate the volume terms (storage + source terms)
+        // forward to the local residual specialized for the discretization methods
+        for (const auto& localDof : fvLocalDofs(fvGeometry))
+            this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, localDof.scv());
+
+        this->asImp().evalElementStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars);
+
+        return residual;
+    }
+
+    /*!
+     * \brief Compute the flux and source
+     *
+     * \param element The DUNE Codim<0> entity for which the residual
+     *                ought to be calculated
+     * \param fvGeometry The finite-volume geometry of the element
+     * \param curElemVolVars The volume averaged variables for all
+     *                       sub-control volumes of the element at the current  time level
+     * \param elemFluxVarsCache The element flux variables cache
+     * \param bcTypes The element boundary types
+     */
+    ElementResidualVector evalFluxAndSource(const Element& element,
+                                            const FVElementGeometry& fvGeometry,
+                                            const ElementVolumeVariables& elemVolVars,
+                                            const ElementFluxVariablesCache& elemFluxVarsCache,
+                                            const ElementBoundaryTypes &bcTypes) const
+    {
+        // initialize the residual vector for all scvs in this element
+        ElementResidualVector residual(fvGeometry.numScv());
+
+        // evaluate the volume terms (storage + source terms)
+        // forward to the local residual specialized for the discretization methods
+        for (const auto& localDof : fvLocalDofs(fvGeometry))
+            this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, localDof.scv());
+
+        // forward to the local residual specialized for the discretization methods
+        for (auto&& scvf : scvfs(fvGeometry))
+            this->asImp().evalFlux(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes, elemFluxVarsCache, scvf);
+
+        // ToDo: Better name? E.g. evalElementRhsTerms
+        this->asImp().evalElementFluxAndSource(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes);
+
+        return residual;
+    }
+
+    // \}
+
+    /*!
+     * \name Model specific interface to account for hybrid dofs
+     * \note The following methods are hybrid model specific implementations of the local residual
+     */
+    // \{
+
+    void evalElementStorage(ElementResidualVector& residual,
+                            const Problem& problem,
+                            const Element& element,
+                            const FVElementGeometry& fvGeometry,
+                            const ElementVolumeVariables& prevElemVolVars,
+                            const ElementVolumeVariables& curElemVolVars) const
+    {
+        DUNE_THROW(Dune::NotImplemented, "This hybrid model does not implement an evalElementStorage method!");
+    }
+
+    void evalElementFluxAndSource(ElementResidualVector& residual,
+                                  const Problem& problem,
+                                  const Element& element,
+                                  const FVElementGeometry& fvGeometry,
+                                  const ElementVolumeVariables& curElemVolVars,
+                                  const ElementBoundaryTypes &bcTypes) const
+    {
+        DUNE_THROW(Dune::NotImplemented, "This hybrid model does not implement an evalElementFluxAndSource method!");
+    }
+
+    // \}
+};
+
+} // end namespace Dumux
+
+#endif
diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index b86b91ae74..df23543419 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -7,18 +7,20 @@
 /*!
  * \file
  * \ingroup NavierStokesModel
- * \copydoc Dumux::NavierStokesResidualImpl
+ * \copydoc Dumux::NavierStokesMomentumCVFELocalResidual
  */
 #ifndef DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_LOCAL_RESIDUAL_HH
 #define DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_LOCAL_RESIDUAL_HH
 
 #include <dune/common/hybridutilities.hh>
+#include <dune/geometry/quadraturerules.hh>
 
 #include <dumux/common/properties.hh>
 #include <dumux/common/numeqvector.hh>
 
 #include <dumux/discretization/extrusion.hh>
 #include <dumux/discretization/method.hh>
+#include <dumux/discretization/fem/integrationpointdata.hh>
 #include <dumux/assembly/cvfelocalresidual.hh>
 
 #include <dumux/freeflow/navierstokes/momentum/cvfe/flux.hh>
@@ -64,11 +66,16 @@ class NavierStokesMomentumCVFELocalResidual
 
     static constexpr auto dim = GridView::dimension;
 
+    using LocalBasis = typename GridGeometry::FeCache::FiniteElementType::Traits::LocalBasisType;
+    using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
+    using IpData = FEIntegrationPointData<GlobalPosition, LocalBasis>;
     using FluxContext = NavierStokesMomentumFluxContext<Problem, FVElementGeometry, ElementVolumeVariables, ElementFluxVariablesCache>;
+    using FluxFunctionContext = NavierStokesMomentumFluxFunctionContext<Problem, FVElementGeometry, ElementVolumeVariables, IpData>;
     using FluxHelper = NavierStokesMomentumFluxCVFE<GridGeometry, NumEqVector>;
 
 public:
     //! Use the parent type's constructor
+    using ElementResidualVector = typename ParentType::ElementResidualVector;
     using ParentType::ParentType;
 
     /*!
@@ -135,7 +142,7 @@ public:
         return source;
     }
 
-        /*!
+    /*!
      * \brief Evaluates the mass flux over a face of a sub control volume.
      *
      * \param problem The problem
@@ -161,6 +168,158 @@ public:
         flux += fluxHelper.pressureContribution(context);
         return flux;
     }
+
+    void evalElementStorage(ElementResidualVector& residual,
+                            const Problem& problem,
+                            const Element& element,
+                            const FVElementGeometry& fvGeometry,
+                            const ElementVolumeVariables& prevElemVolVars,
+                            const ElementVolumeVariables& curElemVolVars) const
+    {
+        static const auto intOrder
+            = getParamFromGroup<int>(problem.paramGroup(), "Assembly.FEIntegrationOrderStorage", 4);
+
+        const auto &localBasis = fvGeometry.feLocalBasis();
+        using RangeType = typename LocalBasis::Traits::RangeType;
+        std::vector<RangeType> integralShapeFunctions(localBasis.size(), RangeType(0.0));
+
+        // We apply mass lumping such that we only need to calculate the integral of basis functions
+        // such that we don't evaluate the solution but only integrate the basis functions
+        const auto& geometry = element.geometry();
+        const auto& quadRule = Dune::QuadratureRules<Scalar, dim>::rule(geometry.type(), intOrder);
+        for (const auto& quadPoint : quadRule)
+        {
+            const Scalar qWeight = quadPoint.weight()*Extrusion::integrationElement(geometry, quadPoint.position());
+            // Obtain and store shape function values and gradients at the current quad point
+            IpData ipData(geometry, quadPoint.position(), localBasis);
+
+            // get density from the problem
+            for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+                integralShapeFunctions[localDofIdx] += ipData.shapeValue(localDofIdx)*qWeight;
+        }
+
+        for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+        {
+            const auto curDensity = problem.density(element, fvGeometry, geometry.local(fvGeometry.scv(localDofIdx).dofPosition()), false);
+            const auto prevDensity = problem.density(element, fvGeometry,  geometry.local(fvGeometry.scv(localDofIdx).dofPosition()), true);
+            const auto curVelocity = curElemVolVars[localDofIdx].velocity();
+            const auto prevVelocity = prevElemVolVars[localDofIdx].velocity();
+            auto timeDeriv = (curDensity*curVelocity - prevDensity*prevVelocity);
+            timeDeriv /= this->timeLoop().timeStepSize();
+
+            // add storage to residual
+            for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
+                residual[localDofIdx][eqIdx] += integralShapeFunctions[localDofIdx]*timeDeriv[eqIdx];
+        }
+    }
+
+    void evalElementFluxAndSource(ElementResidualVector& residual,
+                                  const Problem& problem,
+                                  const Element& element,
+                                  const FVElementGeometry& fvGeometry,
+                                  const ElementVolumeVariables& elemVolVars,
+                                  const ElementBoundaryTypes &elemBcTypes) const
+    {
+        static const bool enableUnsymmetrizedVelocityGradient
+            = getParamFromGroup<bool>(problem.paramGroup(), "FreeFlow.EnableUnsymmetrizedVelocityGradient", false);
+        static const auto intOrder
+            = getParamFromGroup<int>(problem.paramGroup(), "Assembly.FEIntegrationOrderFluxAndSource", 4);
+
+        const auto &localBasis = fvGeometry.feLocalBasis();
+
+        const auto& geometry = element.geometry();
+        const auto& quadRule = Dune::QuadratureRules<Scalar, dim>::rule(geometry.type(), intOrder);
+        for (const auto& quadPoint : quadRule)
+        {
+            const Scalar qWeight = quadPoint.weight()*Extrusion::integrationElement(geometry, quadPoint.position());
+
+            // Obtain and store shape function values and gradients at the current quad point
+            IpData ipData(geometry, quadPoint.position(), localBasis);
+            FluxFunctionContext context(problem, fvGeometry, elemVolVars, ipData);
+            const auto& v = context.velocity();
+            const auto& gradV = context.gradVelocity();
+
+            // get viscosity from the problem
+            const Scalar mu = problem.effectiveViscosity(element, fvGeometry, ipData.ipLocal());
+            // get density from the problem
+            const Scalar density = problem.density(element, fvGeometry, ipData.ipLocal());
+
+            for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+            {
+                NumEqVector fluxAndSourceTerm(0.0);
+                // add advection term
+                if (problem.enableInertiaTerms())
+                    fluxAndSourceTerm += density*(v*ipData.gradN(localDofIdx))*v;
+
+                // add diffusion term
+                fluxAndSourceTerm -= enableUnsymmetrizedVelocityGradient ?
+                                        mu*mv(gradV, ipData.gradN(localDofIdx))
+                                        : mu*mv(gradV + getTransposed(gradV), ipData.gradN(localDofIdx));
+
+                // add pressure term
+                fluxAndSourceTerm += problem.pressure(element, fvGeometry, ipData.ipLocal()) * ipData.gradN(localDofIdx);
+
+                // finally add source and Neumann term and add everything to residual
+                // ToDo: generalize by not assuming that a sourceAtPos function must exist
+                const auto sourceAtPos = problem.sourceAtPos(ipData.ipGlobal());
+
+                for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
+                {
+                    fluxAndSourceTerm[eqIdx] += ipData.shapeValue(localDofIdx) * sourceAtPos[eqIdx];
+                    residual[localDofIdx][eqIdx] += qWeight*fluxAndSourceTerm[eqIdx];
+                }
+            }
+        }
+
+        if(elemBcTypes.hasNeumann())
+            residual += evalNeumannSegments_(problem, element, fvGeometry, elemVolVars, elemBcTypes);
+    }
+
+private:
+    ElementResidualVector evalNeumannSegments_(const Problem& problem,
+                                               const Element& element,
+                                               const FVElementGeometry& fvGeometry,
+                                               const ElementVolumeVariables& elemVolVars,
+                                               const ElementBoundaryTypes &elemBcTypes) const
+    {
+        ElementResidualVector flux(0.0);
+
+        static const auto intOrder
+            = getParamFromGroup<int>(problem.paramGroup(), "Assembly.FEIntegrationOrderBoundary", 4);
+
+        const auto &localBasis = fvGeometry.feLocalBasis();
+
+        const auto& geometry = element.geometry();
+        for (const auto& intersection : intersections(fvGeometry.gridGeometry().gridView(), element))
+        {
+            const auto bcTypes = problem.boundaryTypesAtPos(intersection.geometry().center());
+            if(!bcTypes.hasNeumann())
+                continue;
+
+            // select quadrature rule for intersection faces (dim-1)
+            auto isGeometry = intersection.geometry();
+            const auto& faceRule = Dune::QuadratureRules<Scalar, dim-1>::rule(isGeometry.type(), intOrder);
+            for (const auto& quadPoint : faceRule)
+            {
+                // position of quadrature point in local coordinates of inside element
+                auto local = geometry.local(isGeometry.global(quadPoint.position()));
+
+                // get quadrature rule weight for intersection
+                Scalar qWeight = quadPoint.weight() * Extrusion::integrationElement(isGeometry, quadPoint.position());
+                IpData ipData(geometry, local, localBasis);
+
+                const auto& neumannFlux = qWeight*problem.neumannAtPos(ipData.ipGlobal());
+
+                for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+                    for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
+                        flux[localDofIdx] += ipData.shapeValue(localDofIdx) * neumannFlux[eqIdx];
+
+            }
+
+        }
+
+        return flux;
+    }
 };
 
 } // end namespace Dumux
-- 
GitLab


From ee33c5217887c00bca2031c52e211574ba4acfcc Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 2 Aug 2024 12:57:13 +0200
Subject: [PATCH 06/24] [cvfe][pq1bubble] Implement hybrid model

---
 dumux/discretization/pq1bubble.hh | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/dumux/discretization/pq1bubble.hh b/dumux/discretization/pq1bubble.hh
index dff52eecf4..6283a6383e 100644
--- a/dumux/discretization/pq1bubble.hh
+++ b/dumux/discretization/pq1bubble.hh
@@ -23,6 +23,7 @@
 #include <dumux/common/typetraits/problem.hh>
 
 #include <dumux/assembly/cvfelocalresidual.hh>
+#include <dumux/assembly/hybridcvfelocalresidual.hh>
 
 #include <dumux/discretization/method.hh>
 #include <dumux/discretization/fvproperties.hh>
@@ -42,7 +43,9 @@ namespace Dumux::Properties {
 //! Type tag for the pq1bubble scheme.
 // Create new type tags
 namespace TTag {
-struct PQ1BubbleModel { using InheritsFrom = std::tuple<FiniteVolumeModel>; };
+struct PQ1BubbleBase { using InheritsFrom = std::tuple<FiniteVolumeModel>; };
+struct PQ1BubbleModel { using InheritsFrom = std::tuple<PQ1BubbleBase>; };
+struct PQ1BubbleHybridModel { using InheritsFrom = std::tuple<PQ1BubbleBase>; };
 } // end namespace TTag
 
 //! Set the default for the grid geometry
@@ -57,9 +60,22 @@ public:
     using type = PQ1BubbleFVGridGeometry<Scalar, GridView, enableCache>;
 };
 
+//! Set the default for the grid geometry for hybrid model
+template<class TypeTag>
+struct GridGeometry<TypeTag, TTag::PQ1BubbleHybridModel>
+{
+private:
+    static constexpr bool enableCache = getPropValue<TypeTag, Properties::EnableGridGeometryCache>();
+    using GridView = typename GetPropType<TypeTag, Properties::Grid>::LeafGridView;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+    using Traits = HybridPQ1BubbleCVFEGridGeometryTraits<PQ1BubbleDefaultGridGeometryTraits<GridView>>;
+public:
+    using type = PQ1BubbleFVGridGeometry<Scalar, GridView, enableCache, Traits>;
+};
+
 //! The grid volume variables vector class
 template<class TypeTag>
-struct GridVolumeVariables<TypeTag, TTag::PQ1BubbleModel>
+struct GridVolumeVariables<TypeTag, TTag::PQ1BubbleBase>
 {
 private:
     static constexpr bool enableCache = getPropValue<TypeTag, Properties::EnableGridVolumeVariablesCache>();
@@ -72,7 +88,7 @@ public:
 
 //! The flux variables cache class
 template<class TypeTag>
-struct FluxVariablesCache<TypeTag, TTag::PQ1BubbleModel>
+struct FluxVariablesCache<TypeTag, TTag::PQ1BubbleBase>
 {
 private:
     using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
@@ -83,7 +99,7 @@ public:
 
 //! The grid flux variables cache vector class
 template<class TypeTag>
-struct GridFluxVariablesCache<TypeTag, TTag::PQ1BubbleModel>
+struct GridFluxVariablesCache<TypeTag, TTag::PQ1BubbleBase>
 {
 private:
     static constexpr bool enableCache = getPropValue<TypeTag, Properties::EnableGridFluxVariablesCache>();
@@ -99,7 +115,7 @@ public:
 
 //! Set the default for the ElementBoundaryTypes
 template<class TypeTag>
-struct ElementBoundaryTypes<TypeTag, TTag::PQ1BubbleModel>
+struct ElementBoundaryTypes<TypeTag, TTag::PQ1BubbleBase>
 {
 private:
     using Problem = GetPropType<TypeTag, Properties::Problem>;
@@ -113,6 +129,11 @@ template<class TypeTag>
 struct BaseLocalResidual<TypeTag, TTag::PQ1BubbleModel>
 { using type = CVFELocalResidual<TypeTag>; };
 
+//! Set the BaseLocalResidual for hybrid scheme to HybridLocalResidual
+template<class TypeTag>
+struct BaseLocalResidual<TypeTag, TTag::PQ1BubbleHybridModel>
+{ using type = HybridCVFELocalResidual<TypeTag>; };
+
 } // namespace Dumux::Properties
 
 namespace Dumux::Detail {
-- 
GitLab


From f8aac16638d8826fe954cf2808e945923b944d3e Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 2 Aug 2024 16:13:21 +0200
Subject: [PATCH 07/24] [ffmomentum][cvfe] Implement fe residual

---
 .../navierstokes/momentum/cvfe/flux.hh        | 83 +++++++++++++++++++
 .../momentum/cvfe/localresidual.hh            | 14 ++--
 2 files changed, 91 insertions(+), 6 deletions(-)

diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/flux.hh b/dumux/freeflow/navierstokes/momentum/cvfe/flux.hh
index 2b1f2f5bc5..22671af61f 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/flux.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/flux.hh
@@ -82,6 +82,89 @@ private:
     const SubControlVolumeFace& scvf_;
 };
 
+/*!
+ * \ingroup NavierStokesModel
+ * \brief Context for interpolating data on integration points
+ *
+ * \tparam Problem the problem type to solve
+ * \tparam FVElementGeometry the element geometry type
+ * \tparam ElementVolumeVariables the element volume variables type
+ * \tparam IpData the integration point data type
+ */
+template<class Problem,
+         class FVElementGeometry,
+         class ElementVolumeVariables,
+         class IpData>
+class NavierStokesMomentumFluxFunctionContext
+{
+    using Element = typename FVElementGeometry::Element;
+    using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
+    using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
+
+    static constexpr int dim = FVElementGeometry::GridGeometry::GridView::dimension;
+    static constexpr int dimWorld = FVElementGeometry::GridGeometry::GridView::dimensionworld;
+
+    using Tensor = Dune::FieldMatrix<typename GlobalPosition::value_type, dim, dimWorld>;
+
+public:
+
+    //! Initialize the flux variables storing some temporary pointers
+    NavierStokesMomentumFluxFunctionContext(
+        const Problem& problem,
+        const FVElementGeometry& fvGeometry,
+        const ElementVolumeVariables& elemVolVars,
+        const IpData& ipData
+    )
+    : problem_(problem)
+    , fvGeometry_(fvGeometry)
+    , elemVolVars_(elemVolVars)
+    , ipData_(ipData)
+    {}
+
+    const Problem& problem() const
+    { return problem_; }
+
+    const Element& element() const
+    { return fvGeometry_.element(); }
+
+    const FVElementGeometry& fvGeometry() const
+    { return fvGeometry_; }
+
+    const ElementVolumeVariables& elemVolVars() const
+    { return elemVolVars_; }
+
+    const IpData& ipData() const
+    { return ipData_; }
+
+    GlobalPosition velocity() const
+    {
+        GlobalPosition v(0.0);
+        const auto& shapeValues = ipData_.shapeValues();
+        for (const auto& localDof : localDofs(fvGeometry_))
+            v.axpy(shapeValues[localDof.index()][0], elemVolVars_[localDof.index()].velocity());
+
+        return v;
+    }
+
+    Tensor gradVelocity() const
+    {
+        Tensor gradV(0.0);
+        for (const auto& localDof : localDofs(fvGeometry_))
+        {
+            const auto& volVars = elemVolVars_[localDof.index()];
+            for (int dir = 0; dir < dim; ++dir)
+                gradV[dir].axpy(volVars.velocity(dir), ipData_.gradN(localDof.index()));
+        }
+        return gradV;
+    }
+
+private:
+    const Problem& problem_;
+    const FVElementGeometry& fvGeometry_;
+    const ElementVolumeVariables& elemVolVars_;
+    const IpData& ipData_;
+};
+
 /*!
  * \ingroup NavierStokesModel
  * \brief The flux variables class for the Navier-Stokes model using control-volume finite element schemes
diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index df23543419..ee8788d407 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -194,12 +194,13 @@ public:
             IpData ipData(geometry, quadPoint.position(), localBasis);
 
             // get density from the problem
-            for (auto localDofIdx : hybridLocalDofs(fvGeometry))
-                integralShapeFunctions[localDofIdx] += ipData.shapeValue(localDofIdx)*qWeight;
+            for (const auto& localDof : hybridLocalDofs(fvGeometry))
+                integralShapeFunctions[localDof.index()] += ipData.shapeValue(localDof.index())*qWeight;
         }
 
-        for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+        for (const auto& localDof : hybridLocalDofs(fvGeometry))
         {
+            const auto localDofIdx = localDof.index();
             const auto curDensity = problem.density(element, fvGeometry, geometry.local(fvGeometry.scv(localDofIdx).dofPosition()), false);
             const auto prevDensity = problem.density(element, fvGeometry,  geometry.local(fvGeometry.scv(localDofIdx).dofPosition()), true);
             const auto curVelocity = curElemVolVars[localDofIdx].velocity();
@@ -244,8 +245,9 @@ public:
             // get density from the problem
             const Scalar density = problem.density(element, fvGeometry, ipData.ipLocal());
 
-            for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+            for (const auto& localDof : hybridLocalDofs(fvGeometry))
             {
+                const auto localDofIdx = localDof.index();
                 NumEqVector fluxAndSourceTerm(0.0);
                 // add advection term
                 if (problem.enableInertiaTerms())
@@ -310,9 +312,9 @@ private:
 
                 const auto& neumannFlux = qWeight*problem.neumannAtPos(ipData.ipGlobal());
 
-                for (auto localDofIdx : hybridLocalDofs(fvGeometry))
+                for (const auto& localDof : hybridLocalDofs(fvGeometry))
                     for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
-                        flux[localDofIdx] += ipData.shapeValue(localDofIdx) * neumannFlux[eqIdx];
+                        flux[localDof.index()] += ipData.shapeValue(localDof.index()) * neumannFlux[eqIdx];
 
             }
 
-- 
GitLab


From d0e0e83f463a4b47005d83b02599ff7a0571459b Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 2 Aug 2024 16:19:18 +0200
Subject: [PATCH 08/24] [tests][donea] Add hybrid pq1bubble momentum test

---
 .../navierstokes/donea/CMakeLists.txt         |   14 +
 ...tum_hybrid_pq1bubble_simplex-reference.vtu | 2847 +++++++++++++++++
 2 files changed, 2861 insertions(+)
 create mode 100644 test/references/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex-reference.vtu

diff --git a/test/freeflow/navierstokes/donea/CMakeLists.txt b/test/freeflow/navierstokes/donea/CMakeLists.txt
index d164ff53a9..76675d9774 100644
--- a/test/freeflow/navierstokes/donea/CMakeLists.txt
+++ b/test/freeflow/navierstokes/donea/CMakeLists.txt
@@ -194,3 +194,17 @@ dumux_add_test(NAME test_ff_stokes_donea_momentum_pq1bubble_simplex
                                      ${CMAKE_CURRENT_BINARY_DIR}/donea_momentum_simplex_pq1bubble_1.vtu
                              --command "${CMAKE_CURRENT_BINARY_DIR}/test_ff_stokes_donea_momentum_pq1bubble_simplex params.input
                              -Problem.Name donea_momentum_simplex -Problem.UseNeumann false -FreeFlow.EnableUnsymmetrizedVelocityGradient false")
+
+dumux_add_test(NAME test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex
+               SOURCES main_momentum.cc
+               LABELS freeflow navierstokes donea
+               CMAKE_GUARD "( HAVE_UMFPACK AND dune-alugrid_FOUND )"
+               COMPILE_DEFINITIONS GRIDTYPE=Dune::ALUGrid<2,2,Dune::simplex,Dune::nonconforming>
+               COMPILE_DEFINITIONS DISCRETIZATION_MODEL=PQ1BubbleHybridModel
+               COMPILE_DEFINITIONS NAVIER_STOKES_MODEL=NavierStokesMomentumCVFE
+               COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py
+               CMD_ARGS      --script fuzzy
+                           --files ${CMAKE_SOURCE_DIR}/test/references/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex-reference.vtu
+                                   ${CMAKE_CURRENT_BINARY_DIR}/donea_momentum_simplex_hybrid_pq1bubble_1.vtu
+                           --command "${CMAKE_CURRENT_BINARY_DIR}/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex params.input
+                           -Problem.Name donea_momentum_simplex_hybrid -Problem.UseNeumann false -FreeFlow.EnableUnsymmetrizedVelocityGradient false")
diff --git a/test/references/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex-reference.vtu b/test/references/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex-reference.vtu
new file mode 100644
index 0000000000..e437e40759
--- /dev/null
+++ b/test/references/test_ff_stokes_donea_momentum_hybrid_pq1bubble_simplex-reference.vtu
@@ -0,0 +1,2847 @@
+<?xml version="1.0"?>
+<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">
+  <UnstructuredGrid>
+    <Piece NumberOfCells="3200" NumberOfPoints="1681">
+      <CellData Scalars="rank" Vectors="velocity">
+        <DataArray type="Float32" Name="velocity" NumberOfComponents="3" format="ascii">
+          9.64829e-06 -9.18595e-06 0 9.18595e-06 -9.64829e-06 0 4.54986e-05 -2.65498e-05 0 2.65498e-05 -4.54986e-05 0
+          3.61246e-05 -1.62578e-05 0 0.000111783 -4.02591e-05 0 7.63231e-05 -2.19246e-05 0 0.000110968 -9.2482e-05 0
+          0.000250564 -0.000130832 0 1.62578e-05 -3.61246e-05 0 4.02591e-05 -0.000111783 0 9.2482e-05 -0.000110968 0
+          2.19246e-05 -7.63231e-05 0 0.000130832 -0.000250564 0 0.000240376 -0.000172763 0 0.000172763 -0.000240376 0
+          0.00039554 -0.000346413 0 0.000346413 -0.00039554 0 0.000127736 -2.63365e-05 0 0.000202902 -5.11693e-05 0
+          0.00018799 -2.96085e-05 0 0.000313999 -5.95506e-05 0 0.00043558 -0.000161359 0 0.000656799 -0.000184695 0
+          0.000254852 -3.18388e-05 0 0.000440486 -6.56213e-05 0 0.000578055 -6.95735e-05 0 0.000905535 -0.000201395 0
+          0.000447783 -0.000222687 0 0.000692668 -0.000431596 0 0.000703214 -0.000261671 0 0.00104911 -0.000497404 0
+          0.000650614 -0.000513391 0 0.00102637 -0.000606001 0 0.00099584 -0.000290527 0 0.00145073 -0.000545204 0
+          0.00131548 -0.000310005 0 0.00145759 -0.000675106 0 0.0019292 -0.000722357 0 2.63365e-05 -0.000127736 0
+          5.11693e-05 -0.000202902 0 0.000161359 -0.00043558 0 5.95506e-05 -0.000313999 0 2.96085e-05 -0.00018799 0
+          0.000184695 -0.000656799 0 0.000222687 -0.000447783 0 0.000431596 -0.000692668 0 0.000513391 -0.000650614 0
+          0.000261671 -0.000703214 0 0.000497404 -0.00104911 0 0.000606001 -0.00102637 0 6.56213e-05 -0.000440486 0
+          3.18388e-05 -0.000254852 0 0.000201395 -0.000905535 0 6.95735e-05 -0.000578055 0 0.000290527 -0.00099584 0
+          0.000545204 -0.00145073 0 0.000675106 -0.00145759 0 0.000310005 -0.00131548 0 0.000722357 -0.0019292 0
+          0.000902294 -0.000814198 0 0.000814198 -0.000902294 0 0.00128755 -0.00106753 0 0.00136957 -0.000941129 0
+          0.00106753 -0.00128755 0 0.000941129 -0.00136957 0 0.00162263 -0.0014907 0 0.0014907 -0.00162263 0
+          0.00183131 -0.0011913 0 0.00189658 -0.00103388 0 0.00242635 -0.00127644 0 0.00224907 -0.00163961 0
+          0.00212241 -0.00181261 0 0.00281401 -0.00194375 0 0.0011913 -0.00183131 0 0.00103388 -0.00189658 0
+          0.00181261 -0.00212241 0 0.00163961 -0.00224907 0 0.00127644 -0.00242635 0 0.00194375 -0.00281401 0
+          0.00251409 -0.00233622 0 0.00233622 -0.00251409 0 0.00309912 -0.00269745 0 0.00269745 -0.00309912 0
+          0.000326228 -3.31157e-05 0 0.000722675 -7.15834e-05 0 0.000400163 -3.35214e-05 0 0.00117364 -0.000211966 0
+          0.0014535 -0.000216894 0 0.000474847 -3.31344e-05 0 0.000870599 -7.18175e-05 0 0.000548611 -3.203e-05 0
+          0.00101836 -7.04357e-05 0 0.00173806 -0.000216643 0 0.00202079 -0.000211671 0 0.00165264 -0.000320819 0
+          0.00188425 -0.00057629 0 0.0023373 -0.000591919 0 0.00242708 -0.000749351 0 0.00199845 -0.000323658 0
+          0.00279839 -0.000593317 0 0.00234473 -0.000319196 0 0.00325691 -0.000581696 0 0.00293811 -0.000757653 0
+          0.00345018 -0.000748803 0 0.000619934 -3.02815e-05 0 0.00116279 -6.75931e-05 0 0.00130099 -6.34414e-05 0
+          0.00229574 -0.000202423 0 0.000687434 -2.79608e-05 0 0.00143036 -5.81297e-05 0 0.000749877 -2.51383e-05 0
+          0.00255748 -0.000189342 0 0.00280116 -0.000172864 0 0.00268399 -0.000308095 0 0.00370317 -0.000558251 0
+          0.00300938 -0.000291013 0 0.00395215 -0.000724327 0 0.00443388 -0.000685736 0 0.00331472 -0.000268596 0
+          0.00412834 -0.00052417 0 0.00452452 -0.000480632 0 0.00488624 -0.000634536 0 0.00246583 -0.00109483 0
+          0.00305484 -0.00132572 0 0.00306103 -0.00112631 0 0.00292602 -0.00173801 0 0.0035447 -0.00202021 0
+          0.00363405 -0.00178954 0 0.00366704 -0.00113064 0 0.00370018 -0.00134186 0 0.00434703 -0.00132757 0
+          0.0042699 -0.00111007 0 0.00435512 -0.00179784 0 0.00429518 -0.00204612 0 0.00507262 -0.0017665 0
+          0.00504756 -0.00202555 0 0.00327238 -0.00247797 0 0.00390534 -0.00280486 0 0.00406566 -0.00255284 0
+          0.00351238 -0.00328858 0 0.00436509 -0.0033892 0 0.00487372 -0.00256596 0 0.00473355 -0.00284202 0
+          0.0056779 -0.00252244 0 0.005564 -0.00281458 0 0.00523383 -0.00340779 0 0.00609851 -0.00335109 0
+          0.00498131 -0.00128551 0 0.00485683 -0.00106687 0 0.0055902 -0.00121836 0 0.0057713 -0.00169908 0
+          0.00578547 -0.00196258 0 0.00649398 -0.00186124 0 0.00541623 -0.00100329 0 0.00616213 -0.00112876 0
+          0.00593768 -0.000921566 0 0.00643736 -0.00159915 0 0.00715962 -0.00172558 0 0.00705836 -0.00147025 0
+          0.00646112 -0.00242735 0 0.00637859 -0.00272816 0 0.00716084 -0.00258838 0 0.00694077 -0.00322584 0
+          0.00720787 -0.00228576 0 0.00789586 -0.00240082 0 0.00790423 -0.00210273 0 0.00774391 -0.00303875 0
+          0.00849296 -0.00279653 0 3.31157e-05 -0.000326228 0 7.15834e-05 -0.000722675 0 0.000211966 -0.00117364 0
+          3.35214e-05 -0.000400163 0 0.000216894 -0.0014535 0 0.00057629 -0.00188425 0 0.000320819 -0.00165264 0
+          0.000749351 -0.00242708 0 0.000591919 -0.0023373 0 3.31344e-05 -0.000474847 0 7.18175e-05 -0.000870599 0
+          0.000216643 -0.00173806 0 7.04357e-05 -0.00101836 0 3.203e-05 -0.000548611 0 0.000211671 -0.00202079 0
+          0.000323658 -0.00199845 0 0.000593317 -0.00279839 0 0.000757653 -0.00293811 0 0.000319196 -0.00234473 0
+          0.000581696 -0.00325691 0 0.000748803 -0.00345018 0 0.00109483 -0.00246583 0 0.00132572 -0.00305484 0
+          0.00173801 -0.00292602 0 0.00202021 -0.0035447 0 0.00112631 -0.00306103 0 0.00178954 -0.00363405 0
+          0.00247797 -0.00327238 0 0.00280486 -0.00390534 0 0.00328858 -0.00351238 0 0.00255284 -0.00406566 0
+          0.0033892 -0.00436509 0 0.00134186 -0.00370018 0 0.00113064 -0.00366704 0 0.00179784 -0.00435512 0
+          0.00204612 -0.00429518 0 0.00132757 -0.00434703 0 0.00111007 -0.0042699 0 0.00202555 -0.00504756 0
+          0.0017665 -0.00507262 0 0.00256596 -0.00487372 0 0.00284202 -0.00473355 0 0.00340779 -0.00523383 0
+          0.00281458 -0.005564 0 0.00252244 -0.0056779 0 0.00335109 -0.00609851 0 6.75931e-05 -0.00116279 0
+          3.02815e-05 -0.000619934 0 0.000202423 -0.00229574 0 6.34414e-05 -0.00130099 0 0.000308095 -0.00268399 0
+          0.000558251 -0.00370317 0 0.000724327 -0.00395215 0 0.000291013 -0.00300938 0 0.000685736 -0.00443388 0
+          2.79608e-05 -0.000687434 0 5.81297e-05 -0.00143036 0 0.000189342 -0.00255748 0 2.51383e-05 -0.000749877 0
+          0.000172864 -0.00280116 0 0.00052417 -0.00412834 0 0.000268596 -0.00331472 0 0.000634536 -0.00488624 0
+          0.000480632 -0.00452452 0 0.00128551 -0.00498131 0 0.00106687 -0.00485683 0 0.00196258 -0.00578547 0
+          0.00169908 -0.0057713 0 0.00121836 -0.0055902 0 0.00186124 -0.00649398 0 0.00272816 -0.00637859 0
+          0.00242735 -0.00646112 0 0.00322584 -0.00694077 0 0.00258838 -0.00716084 0 0.00100329 -0.00541623 0
+          0.00112876 -0.00616213 0 0.00159915 -0.00643736 0 0.00172558 -0.00715962 0 0.000921566 -0.00593768 0
+          0.00147025 -0.00705836 0 0.00228576 -0.00720787 0 0.00240082 -0.00789586 0 0.00303875 -0.00774391 0
+          0.00210273 -0.00790423 0 0.00279653 -0.00849296 0 0.00414538 -0.00365345 0 0.00365345 -0.00414538 0
+          0.00454153 -0.0042734 0 0.0042734 -0.00454153 0 0.00502569 -0.00370296 0 0.00544642 -0.00429791 0
+          0.00590852 -0.00366825 0 0.00634721 -0.00422742 0 0.00518197 -0.0046041 0 0.00609325 -0.00456192 0
+          0.00370296 -0.00502569 0 0.00429791 -0.00544642 0 0.0046041 -0.00518197 0 0.00366825 -0.00590852 0
+          0.00422742 -0.00634721 0 0.00456192 -0.00609325 0 0.00552243 -0.0052127 0 0.0052127 -0.00552243 0
+          0.00613032 -0.00547274 0 0.00643669 -0.00512816 0 0.00547274 -0.00613032 0 0.00512816 -0.00643669 0
+          0.00637963 -0.00603179 0 0.00603179 -0.00637963 0 0.00677459 -0.00355663 0 0.00722473 -0.00407041 0
+          0.00760637 -0.0033754 0 0.00698734 -0.00442405 0 0.00784613 -0.00419956 0 0.00838804 -0.00313184 0
+          0.00806159 -0.00383534 0 0.00884217 -0.00353063 0 0.00865327 -0.00389748 0 0.00703072 -0.00530823 0
+          0.00732742 -0.00493862 0 0.00789566 -0.00503975 0 0.00726328 -0.00580972 0 0.00691855 -0.00618869 0
+          0.00777048 -0.0058765 0 0.00817698 -0.00465433 0 0.00870867 -0.00467813 0 0.0089695 -0.00428551 0
+          0.00810616 -0.00547615 0 0.00857135 -0.00545569 0 0.00889254 -0.0050431 0 0.00355663 -0.00677459 0
+          0.00407041 -0.00722473 0 0.00442405 -0.00698734 0 0.0033754 -0.00760637 0 0.00419956 -0.00784613 0
+          0.00530823 -0.00703072 0 0.00493862 -0.00732742 0 0.00618869 -0.00691855 0 0.00580972 -0.00726328 0
+          0.00503975 -0.00789566 0 0.0058765 -0.00777048 0 0.00383534 -0.00806159 0 0.00313184 -0.00838804 0
+          0.00389748 -0.00865327 0 0.00353063 -0.00884217 0 0.00465433 -0.00817698 0 0.00467813 -0.00870867 0
+          0.00547615 -0.00810616 0 0.00545569 -0.00857135 0 0.00428551 -0.0089695 0 0.0050431 -0.00889254 0
+          0.00704668 -0.00666465 0 0.00666465 -0.00704668 0 0.00748609 -0.00669199 0 0.00669199 -0.00748609 0
+          0.00786517 -0.00628282 0 0.00825838 -0.00621359 0 0.00862888 -0.00578683 0 0.00747004 -0.00705797 0
+          0.00819609 -0.00650159 0 0.00628282 -0.00786517 0 0.00621359 -0.00825838 0 0.00705797 -0.00747004 0
+          0.00578683 -0.00862888 0 0.00650159 -0.00819609 0 0.00778683 -0.00693678 0 0.00693678 -0.00778683 0
+          0.00761173 -0.00717376 0 0.00717376 -0.00761173 0 0.000806175 -2.18838e-05 0 0.00154858 -5.18053e-05 0
+          0.000855381 -1.82658e-05 0 0.00165364 -4.46137e-05 0 0.00302245 -0.000153423 0 0.00321762 -0.000131449 0
+          0.000896697 -1.43525e-05 0 0.00174378 -3.6699e-05 0 0.00181757 -2.82047e-05 0 0.00338346 -0.000107372 0
+          0.00359455 -0.000241491 0 0.00488468 -0.000428813 0 0.00384403 -0.000210337 0 0.0052027 -0.000369883 0
+          0.00530108 -0.000572223 0 0.00567125 -0.000500291 0 0.00405904 -0.000175775 0 0.00547337 -0.000305008 0
+          0.00423611 -0.000138439 0 0.00599062 -0.000420228 0 0.00625404 -0.00033352 0 0.00092947 -1.02113e-05 0
+          0.00187385 -1.9273e-05 0 0.00095319 -5.9093e-06 0 0.00351731 -8.16182e-05 0 0.00361711 -5.46132e-05 0
+          0.000967495 -1.51286e-06 0 0.00191175 -1.00455e-05 0 0.000972169 2.91192e-06 0 0.0019307 -6.63222e-07 0
+          0.0036813 -2.67814e-05 0 0.00370892 1.45379e-06 0 0.00437246 -9.89653e-05 0 0.00569237 -0.000235354 0
+          0.00585627 -0.000162082 0 0.00645738 -0.000241649 0 0.00446599 -5.79855e-05 0 0.00596256 -8.63522e-05 0
+          0.00451527 -1.61319e-05 0 0.00600963 -9.32444e-06 0 0.00659749 -0.000146096 0 0.00667224 -4.83408e-05 0
+          0.00641193 -0.000823918 0 0.00668682 -0.00101936 0 0.0071552 -0.000892792 0 0.00683092 -0.000712575 0
+          0.0076233 -0.00131591 0 0.00777039 -0.00155961 0 0.00812257 -0.00113968 0 0.00831579 -0.00136736 0
+          0.00755952 -0.000751695 0 0.00718777 -0.000589756 0 0.00789327 -0.000598693 0 0.00854798 -0.000945061 0
+          0.00878675 -0.00115282 0 0.00917568 -0.00092002 0 0.00853784 -0.00188329 0 0.00857043 -0.00217108 0
+          0.00909793 -0.00163247 0 0.0091729 -0.00190471 0 0.00917461 -0.00250585 0 0.00977728 -0.00217341 0
+          0.0095753 -0.00135532 0 0.00969328 -0.00160729 0 0.0101232 -0.00128438 0 0.0102911 -0.00180588 0
+          0.00747679 -0.000457677 0 0.00815119 -0.000436413 0 0.00769346 -0.000318551 0 0.00889272 -0.000735591 0
+          0.00947649 -0.000672945 0 0.00915143 -0.000514783 0 0.00783445 -0.000174589 0 0.00832931 -0.000267476 0
+          0.00842491 -9.45033e-05 0 0.00789763 -2.79992e-05 0 0.00932013 -0.000286154 0 0.00968452 -0.000415599 0
+          0.00939625 -5.32145e-05 0 0.0097966 -0.000151978 0 0.00996233 -0.00105684 0 0.0104559 -0.000941536 0
+          0.010253 -0.000742067 0 0.0107078 -0.00140993 0 0.0110209 -0.000992219 0 0.0104428 -0.000416009 0
+          0.0106862 -0.000584316 0 0.0105288 -8.36833e-05 0 0.0108106 -0.00021827 0 0.0112256 -0.00055942 0
+          0.0113188 -0.000118189 0 0.000967139 7.29936e-06 0 0.00193039 8.73361e-06 0 0.00191085 1.80052e-05 0
+          0.00369955 2.967e-05 0 0.00095248 1.15842e-05 0 0.00187235 2.70123e-05 0 0.000928412 1.57015e-05 0
+          0.00365331 5.74457e-05 0 0.00357091 8.43601e-05 0 0.00451955 2.59652e-05 0 0.00599675 6.78442e-05 0
+          0.00447876 6.76762e-05 0 0.00668049 5.01401e-05 0 0.00662213 0.00014787 0 0.00439351 0.000108372 0
+          0.00592413 0.000143998 0 0.00579284 0.000217981 0 0.00649801 0.000243376 0 0.000895302 1.95867e-05 0
+          0.00181549 3.56163e-05 0 0.000853661 2.31758e-05 0 0.00174113 4.36789e-05 0 0.0034536 0.000109993 0
+          0.00330319 0.000133927 0 0.000804147 2.64048e-05 0 0.00165043 5.10626e-05 0 0.00154487 5.76303e-05 0
+          0.00312203 0.000155741 0 0.0042651 0.000147427 0 0.00560488 0.00028864 0 0.00409548 0.000184212 0
+          0.00536314 0.000354823 0 0.00631002 0.000335182 0 0.00606104 0.000421818 0 0.00388732 0.000218102 0
+          0.00507143 0.000415378 0 0.00364393 0.000248474 0 0.00575496 0.000501814 0 0.00539666 0.000573699 0
+          0.00843656 7.98878e-05 0 0.00788203 0.000119011 0 0.00836406 0.00025308 0 0.00937865 0.000180523 0
+          0.00981106 0.000113925 0 0.00972765 0.000378117 0 0.00778789 0.000264236 0 0.0082085 0.00042246 0
+          0.00761662 0.000405472 0 0.00926758 0.000411551 0 0.00954764 0.000636608 0 0.00906472 0.000636361 0
+          0.0105099 0.000249899 0 0.0108273 0.000151053 0 0.010736 0.000518107 0 0.0112991 0.000324817 0
+          0.0103862 0.000579727 0 0.0105381 0.000877347 0 0.0101596 0.000900794 0 0.0111667 0.000762941 0
+          0.0109238 0.00118953 0 0.00737082 0.000540517 0 0.00797224 0.000585413 0 0.0076589 0.000739328 0
+          0.00705427 0.000667171 0 0.00877314 0.000851449 0 0.00927374 0.000885411 0 0.00839734 0.00105331 0
+          0.00891017 0.00112054 0 0.00727337 0.000881595 0 0.00667196 0.000783234 0 0.0068218 0.00100961 0
+          0.00794323 0.00123845 0 0.00846258 0.00133801 0 0.00793813 0.00153384 0 0.00983359 0.00120809 0
+          0.0102365 0.00122323 0 0.00941315 0.00149662 0 0.00983598 0.00155022 0 0.0105739 0.00159794 0
+          0.0101225 0.00198151 0 0.0089049 0.00176138 0 0.00934265 0.00185277 0 0.00876443 0.00212535 0
+          0.00957663 0.00233361 0 0.00910551 -0.00283321 0 0.00955262 -0.00316474 0 0.00974641 -0.00248677 0
+          0.0101809 -0.00274607 0 0.00939421 -0.00352685 0 0.0100562 -0.00309668 0 0.0103001 -0.00209977 0
+          0.0107165 -0.00228305 0 0.0107577 -0.00167946 0 0.0106282 -0.00261599 0 0.011101 -0.00209378 0
+          0.0096909 -0.00384239 0 0.00945509 -0.00423421 0 0.010122 -0.00371879 0 0.0103289 -0.00333519 0
+          0.00960844 -0.0045226 0 0.00930671 -0.00493887 0 0.0102417 -0.00392664 0 0.00996387 -0.00433864 0
+          0.0106985 -0.00314268 0 0.010873 -0.00277409 0 0.011175 -0.00251668 0 0.0107818 -0.00326723 0
+          0.0105319 -0.0036676 0 0.0110017 -0.00293832 0 0.0111119 -0.00123308 0 0.0111511 -0.00178409 0
+          0.0114779 -0.00125759 0 0.0114672 -0.00153906 0 0.0113574 -0.000767855 0 0.0116917 -0.000711953 0
+          0.0114903 -0.000291033 0 0.0117894 -0.000155586 0 0.0117211 -0.000960827 0 0.011859 -0.000368071 0
+          0.0113146 -0.00216932 0 0.0115443 -0.0018516 0 0.0116467 -0.00153105 0 0.0112203 -0.00255636 0
+          0.0113659 -0.0021634 0 0.0115503 -0.00180601 0 0.0118643 -0.00086948 0 0.0118006 -0.00115822 0
+          0.0119399 -0.000447337 0 0.011964 -0.000194802 0 0.0117666 -0.00102818 0 0.0116187 -0.00135541 0
+          0.0118661 -0.000234838 0 0.0117565 -0.000526937 0 0.00932423 -0.00519046 0 0.00896758 -0.00562582 0
+          0.00993938 -0.00450748 0 0.00960147 -0.00494303 0 0.00885724 -0.00583241 0 0.00944224 -0.0050659 0
+          0.0104642 -0.00375165 0 0.0101495 -0.00417954 0 0.0106028 -0.00334968 0 0.00994147 -0.00421749 0
+          0.00845624 -0.00628141 0 0.00822645 -0.00643621 0 0.00905466 -0.00551992 0 0.00877046 -0.00559124 0
+          0.0077912 -0.00689336 0 0.00834325 -0.00605853 0 0.00957213 -0.00466831 0 0.00923482 -0.00465587 0
+          0.0100003 -0.00374256 0 0.00882074 -0.00512477 0 0.00921597 -0.00410961 0 0.0108904 -0.00293671 0
+          0.0109544 -0.00246778 0 0.0112112 -0.00207643 0 0.010347 -0.00330264 0 0.0106524 -0.00233677 0
+          0.0114218 -0.00118453 0 0.0111987 -0.00154816 0 0.0115189 -0.00027477 0 0.0113321 -0.00060513 0
+          0.010853 -0.00133533 0 0.0109459 -0.00031375 0 0.0103325 -0.00275867 0 0.00961212 -0.00364713 0
+          0.00989645 -0.00258206 0 0.00952273 -0.0030306 0 0.0105635 -0.00173259 0 0.0100835 -0.00147768 0
+          0.0106899 -0.000680327 0 0.0101703 -0.000351005 0 0.00973628 -0.00190525 0 0.00985338 -0.000751095 0
+          0.0115087 0.00019016 0 0.0117695 0.000403117 0 0.0114123 0.000668495 0 0.0118786 0.000230215 0
+          0.0117797 0.000825039 0 0.0112026 0.00113675 0 0.0116322 0.000955761 0 0.0113798 0.00149395 0
+          0.0115638 0.00140742 0 0.0119602 0.000270269 0 0.0119444 0.000482801 0 0.0118613 0.000983811 0
+          0.0118472 0.000562029 0 0.0117771 0.000309456 0 0.0116802 0.0011412 0 0.0118057 0.00115315 0
+          0.0116444 0.00168251 0 0.01155 0.00180605 0 0.0117101 0.00135045 0 0.0114672 0.00195571 0
+          0.0114571 0.00211844 0 0.0108827 0.00158769 0 0.0110159 0.00200931 0 0.0104575 0.0020141 0
+          0.0105462 0.00249343 0 0.0112342 0.00196836 0 0.0107959 0.00249889 0 0.00993365 0.00240876 0
+          0.00997811 0.00293794 0 0.00931954 0.00276446 0 0.0102557 0.00299003 0 0.00962229 0.00343279 0
+          0.0111813 0.00243135 0 0.0113131 0.00235558 0 0.0108723 0.00299225 0 0.0107051 0.00301885 0
+          0.0110919 0.00285404 0 0.0111415 0.00274045 0 0.0106201 0.00354528 0 0.0107079 0.00348283 0
+          0.0103288 0.00358176 0 0.010129 0.00355839 0 0.00969152 0.00411331 0 0.0100492 0.00418019 0
+          0.0101733 0.00417031 0 0.00954611 0.00479032 0 0.0115011 0.000639118 0 0.0113525 0.00034699 0
+          0.0112596 0.00129389 0 0.0109295 0.000712545 0 0.0113686 0.0015434 0 0.0110549 0.00222127 0
+          0.0111235 0.00242433 0 0.0108042 0.00172813 0 0.0105718 0.00271757 0 0.0107097 0.000382164 0
+          0.0101557 0.000780942 0 0.0106227 0.00143891 0 0.00987226 0.00041435 0 0.00979263 0.00157356 0
+          0.0104301 0.00247393 0 0.0100399 0.00190115 0 0.0098245 0.0029926 0 0.0096157 0.00270903 0
+          0.0107695 0.0032682 0 0.0107414 0.00311481 0 0.010312 0.00406126 0 0.0103239 0.00396022 0
+          0.0102359 0.00366545 0 0.0098016 0.00455636 0 0.00975815 0.00478979 0 0.00980905 0.00474319 0
+          0.00920492 0.00544943 0 0.00927578 0.00537487 0 0.0101349 0.00347128 0 0.00951291 0.00403828 0
+          0.00974162 0.00441498 0 0.0091099 0.00502118 0 0.00934415 0.00380323 0 0.00898214 0.00483865 0
+          0.00925635 0.00528908 0 0.00862179 0.00592431 0 0.00868686 0.00607761 0 0.00853531 0.00579779 0
+          0.0080108 0.00666315 0 2.18838e-05 -0.000806175 0 5.18053e-05 -0.00154858 0 0.000153423 -0.00302245 0
+          4.46137e-05 -0.00165364 0 1.82658e-05 -0.000855381 0 0.000131449 -0.00321762 0 0.000241491 -0.00359455 0
+          0.000428813 -0.00488468 0 0.000572223 -0.00530108 0 0.000210337 -0.00384403 0 0.000369883 -0.0052027 0
+          0.000500291 -0.00567125 0 3.6699e-05 -0.00174378 0 1.43525e-05 -0.000896697 0 0.000107372 -0.00338346 0
+          2.82047e-05 -0.00181757 0 0.000175775 -0.00405904 0 0.000305008 -0.00547337 0 0.000420228 -0.00599062 0
+          0.000138439 -0.00423611 0 0.00033352 -0.00625404 0 0.00101936 -0.00668682 0 0.000823918 -0.00641193 0
+          0.00131591 -0.0076233 0 0.00155961 -0.00777039 0 0.000892792 -0.0071552 0 0.000712575 -0.00683092 0
+          0.00136736 -0.00831579 0 0.00113968 -0.00812257 0 0.00188329 -0.00853784 0 0.00217108 -0.00857043 0
+          0.00250585 -0.00917461 0 0.00190471 -0.0091729 0 0.00163247 -0.00909793 0 0.00217341 -0.00977728 0
+          0.000751695 -0.00755952 0 0.000589756 -0.00718777 0 0.00115282 -0.00878675 0 0.000945061 -0.00854798 0
+          0.000598693 -0.00789327 0 0.00092002 -0.00917568 0 0.00160729 -0.00969328 0 0.00135532 -0.0095753 0
+          0.00180588 -0.0102911 0 0.00128438 -0.0101232 0 1.02113e-05 -0.00092947 0 1.9273e-05 -0.00187385 0
+          8.16182e-05 -0.00351731 0 5.9093e-06 -0.00095319 0 5.46132e-05 -0.00361711 0 0.000235354 -0.00569237 0
+          9.89653e-05 -0.00437246 0 0.000241649 -0.00645738 0 0.000162082 -0.00585627 0 1.51286e-06 -0.000967495 0
+          1.00455e-05 -0.00191175 0 2.67814e-05 -0.0036813 0 6.63222e-07 -0.0019307 0 -2.91192e-06 -0.000972169 0
+          -1.45379e-06 -0.00370892 0 5.79855e-05 -0.00446599 0 8.63522e-05 -0.00596256 0 0.000146096 -0.00659749 0
+          1.61319e-05 -0.00451527 0 9.32444e-06 -0.00600963 0 4.83408e-05 -0.00667224 0 0.000457677 -0.00747679 0
+          0.000436413 -0.00815119 0 0.000735591 -0.00889272 0 0.000672945 -0.00947649 0 0.000318551 -0.00769346 0
+          0.000514783 -0.00915143 0 0.00105684 -0.00996233 0 0.000941536 -0.0104559 0 0.00140993 -0.0107078 0
+          0.000742067 -0.010253 0 0.000992219 -0.0110209 0 0.000267476 -0.00832931 0 0.000174589 -0.00783445 0
+          0.000286154 -0.00932013 0 0.000415599 -0.00968452 0 9.45033e-05 -0.00842491 0 2.79992e-05 -0.00789763 0
+          0.000151978 -0.0097966 0 5.32145e-05 -0.00939625 0 0.000416009 -0.0104428 0 0.000584316 -0.0106862 0
+          0.00055942 -0.0112256 0 0.00021827 -0.0108106 0 8.36833e-05 -0.0105288 0 0.000118189 -0.0113188 0
+          0.00283321 -0.00910551 0 0.00316474 -0.00955262 0 0.00352685 -0.00939421 0 0.00248677 -0.00974641 0
+          0.00274607 -0.0101809 0 0.00309668 -0.0100562 0 0.00423421 -0.00945509 0 0.00384239 -0.0096909 0
+          0.0045226 -0.00960844 0 0.00493887 -0.00930671 0 0.00371879 -0.010122 0 0.00333519 -0.0103289 0
+          0.00433864 -0.00996387 0 0.00392664 -0.0102417 0 0.00209977 -0.0103001 0 0.00228305 -0.0107165 0
+          0.00261599 -0.0106282 0 0.00167946 -0.0107577 0 0.00209378 -0.011101 0 0.00314268 -0.0106985 0
+          0.00277409 -0.010873 0 0.0036676 -0.0105319 0 0.00326723 -0.0107818 0 0.00251668 -0.011175 0
+          0.00293832 -0.0110017 0 0.00519046 -0.00932423 0 0.00562582 -0.00896758 0 0.00583241 -0.00885724 0
+          0.00494303 -0.00960147 0 0.00450748 -0.00993938 0 0.0050659 -0.00944224 0 0.00628141 -0.00845624 0
+          0.00643621 -0.00822645 0 0.00689336 -0.0077912 0 0.00551992 -0.00905466 0 0.00559124 -0.00877046 0
+          0.00605853 -0.00834325 0 0.00417954 -0.0101495 0 0.00375165 -0.0104642 0 0.00421749 -0.00994147 0
+          0.00334968 -0.0106028 0 0.00466831 -0.00957213 0 0.00465587 -0.00923482 0 0.00512477 -0.00882074 0
+          0.00374256 -0.0100003 0 0.00410961 -0.00921597 0 0.00178409 -0.0111511 0 0.00123308 -0.0111119 0
+          0.00153906 -0.0114672 0 0.00125759 -0.0114779 0 0.00216932 -0.0113146 0 0.0018516 -0.0115443 0
+          0.00255636 -0.0112203 0 0.0021634 -0.0113659 0 0.00153105 -0.0116467 0 0.00180601 -0.0115503 0
+          0.000767855 -0.0113574 0 0.000711953 -0.0116917 0 0.000960827 -0.0117211 0 0.000291033 -0.0114903 0
+          0.000155586 -0.0117894 0 0.000368071 -0.011859 0 0.00115822 -0.0118006 0 0.00086948 -0.0118643 0
+          0.00102818 -0.0117666 0 0.00135541 -0.0116187 0 0.000447337 -0.0119399 0 0.000194802 -0.011964 0
+          0.000526937 -0.0117565 0 0.000234838 -0.0118661 0 0.00293671 -0.0108904 0 0.00246778 -0.0109544 0
+          0.00330264 -0.010347 0 0.00207643 -0.0112112 0 0.00233677 -0.0106524 0 0.00364713 -0.00961212 0
+          0.00275867 -0.0103325 0 0.0030306 -0.00952273 0 0.00258206 -0.00989645 0 0.00118453 -0.0114218 0
+          0.00154816 -0.0111987 0 0.00133533 -0.010853 0 0.00060513 -0.0113321 0 0.00027477 -0.0115189 0
+          0.00031375 -0.0109459 0 0.00173259 -0.0105635 0 0.00147768 -0.0100835 0 0.00190525 -0.00973628 0
+          0.000680327 -0.0106899 0 0.000351005 -0.0101703 0 0.000751095 -0.00985338 0 -8.73361e-06 -0.00193039 0
+          -7.29936e-06 -0.000967139 0 -2.967e-05 -0.00369955 0 -1.80052e-05 -0.00191085 0 -2.59652e-05 -0.00451955 0
+          -6.78442e-05 -0.00599675 0 -5.01401e-05 -0.00668049 0 -6.76762e-05 -0.00447876 0 -0.00014787 -0.00662213 0
+          -1.15842e-05 -0.00095248 0 -2.70123e-05 -0.00187235 0 -5.74457e-05 -0.00365331 0 -1.57015e-05 -0.000928412 0
+          -8.43601e-05 -0.00357091 0 -0.000143998 -0.00592413 0 -0.000108372 -0.00439351 0 -0.000243376 -0.00649801 0
+          -0.000217981 -0.00579284 0 -7.98878e-05 -0.00843656 0 -0.000119011 -0.00788203 0 -0.000113925 -0.00981106 0
+          -0.000180523 -0.00937865 0 -0.00025308 -0.00836406 0 -0.000378117 -0.00972765 0 -0.000151053 -0.0108273 0
+          -0.000249899 -0.0105099 0 -0.000324817 -0.0112991 0 -0.000518107 -0.010736 0 -0.000264236 -0.00778789 0
+          -0.00042246 -0.0082085 0 -0.000411551 -0.00926758 0 -0.000636608 -0.00954764 0 -0.000405472 -0.00761662 0
+          -0.000636361 -0.00906472 0 -0.000579727 -0.0103862 0 -0.000877347 -0.0105381 0 -0.000762941 -0.0111667 0
+          -0.000900794 -0.0101596 0 -0.00118953 -0.0109238 0 -1.95867e-05 -0.000895302 0 -3.56163e-05 -0.00181549 0
+          -0.000109993 -0.0034536 0 -4.36789e-05 -0.00174113 0 -2.31758e-05 -0.000853661 0 -0.000133927 -0.00330319 0
+          -0.000147427 -0.0042651 0 -0.00028864 -0.00560488 0 -0.000335182 -0.00631002 0 -0.000184212 -0.00409548 0
+          -0.000354823 -0.00536314 0 -0.000421818 -0.00606104 0 -5.10626e-05 -0.00165043 0 -2.64048e-05 -0.000804147 0
+          -0.000155741 -0.00312203 0 -5.76303e-05 -0.00154487 0 -0.000218102 -0.00388732 0 -0.000415378 -0.00507143 0
+          -0.000501814 -0.00575496 0 -0.000248474 -0.00364393 0 -0.000573699 -0.00539666 0 -0.000585413 -0.00797224 0
+          -0.000540517 -0.00737082 0 -0.000851449 -0.00877314 0 -0.000885411 -0.00927374 0 -0.000739328 -0.0076589 0
+          -0.000667171 -0.00705427 0 -0.00112054 -0.00891017 0 -0.00105331 -0.00839734 0 -0.00120809 -0.00983359 0
+          -0.00122323 -0.0102365 0 -0.00159794 -0.0105739 0 -0.00155022 -0.00983598 0 -0.00149662 -0.00941315 0
+          -0.00198151 -0.0101225 0 -0.000881595 -0.00727337 0 -0.000783234 -0.00667196 0 -0.00133801 -0.00846258 0
+          -0.00123845 -0.00794323 0 -0.00100961 -0.0068218 0 -0.00153384 -0.00793813 0 -0.00185277 -0.00934265 0
+          -0.00176138 -0.0089049 0 -0.00233361 -0.00957663 0 -0.00212535 -0.00876443 0 -0.00019016 -0.0115087 0
+          -0.000403117 -0.0117695 0 -0.000230215 -0.0118786 0 -0.000668495 -0.0114123 0 -0.000825039 -0.0117797 0
+          -0.000270269 -0.0119602 0 -0.000482801 -0.0119444 0 -0.000309456 -0.0117771 0 -0.000562029 -0.0118472 0
+          -0.000983811 -0.0118613 0 -0.0011412 -0.0116802 0 -0.000955761 -0.0116322 0 -0.00113675 -0.0112026 0
+          -0.00140742 -0.0115638 0 -0.00149395 -0.0113798 0 -0.00115315 -0.0118057 0 -0.00168251 -0.0116444 0
+          -0.00135045 -0.0117101 0 -0.00195571 -0.0114672 0 -0.00180605 -0.01155 0 -0.00211844 -0.0114571 0
+          -0.00034699 -0.0113525 0 -0.000639118 -0.0115011 0 -0.000712545 -0.0109295 0 -0.00129389 -0.0112596 0
+          -0.000382164 -0.0107097 0 -0.000780942 -0.0101557 0 -0.00041435 -0.00987226 0 -0.00143891 -0.0106227 0
+          -0.00157356 -0.00979263 0 -0.0015434 -0.0113686 0 -0.00222127 -0.0110549 0 -0.00172813 -0.0108042 0
+          -0.00242433 -0.0111235 0 -0.00271757 -0.0105718 0 -0.00190115 -0.0100399 0 -0.00247393 -0.0104301 0
+          -0.00270903 -0.0096157 0 -0.0029926 -0.0098245 0 -0.00158769 -0.0108827 0 -0.00200931 -0.0110159 0
+          -0.00196836 -0.0112342 0 -0.0020141 -0.0104575 0 -0.00249343 -0.0105462 0 -0.00249889 -0.0107959 0
+          -0.00235558 -0.0113131 0 -0.00243135 -0.0111813 0 -0.00285404 -0.0110919 0 -0.00274045 -0.0111415 0
+          -0.00299225 -0.0108723 0 -0.00301885 -0.0107051 0 -0.00348283 -0.0107079 0 -0.00354528 -0.0106201 0
+          -0.00240876 -0.00993365 0 -0.00293794 -0.00997811 0 -0.00299003 -0.0102557 0 -0.00276446 -0.00931954 0
+          -0.00343279 -0.00962229 0 -0.00358176 -0.0103288 0 -0.00355839 -0.010129 0 -0.00417031 -0.0101733 0
+          -0.00418019 -0.0100492 0 -0.00411331 -0.00969152 0 -0.00479032 -0.00954611 0 -0.0032682 -0.0107695 0
+          -0.00311481 -0.0107414 0 -0.00366545 -0.0102359 0 -0.00396022 -0.0103239 0 -0.00406126 -0.010312 0
+          -0.00455636 -0.0098016 0 -0.00347128 -0.0101349 0 -0.00403828 -0.00951291 0 -0.00380323 -0.00934415 0
+          -0.00441498 -0.00974162 0 -0.00502118 -0.0091099 0 -0.00483865 -0.00898214 0 -0.00474319 -0.00980905 0
+          -0.00478979 -0.00975815 0 -0.00537487 -0.00927578 0 -0.00544943 -0.00920492 0 -0.00528908 -0.00925635 0
+          -0.00592431 -0.00862179 0 -0.00579779 -0.00853531 0 -0.00607761 -0.00868686 0 -0.00666315 -0.0080108 0
+          0.00745081 -0.00699095 0 0.00699095 -0.00745081 0 0.00748705 -0.00654927 0 0.00794424 -0.006074 0
+          0.00654927 -0.00748705 0 0.006074 -0.00794424 0 0.00698378 -0.00650585 0 0.00650585 -0.00698378 0
+          0.00791626 -0.00554078 0 0.00836555 -0.00505884 0 0.00827166 -0.00444429 0 0.0073549 -0.00541946 0
+          0.00687961 -0.00590926 0 0.00718925 -0.00474088 0 0.00554078 -0.00791626 0 0.00505884 -0.00836555 0
+          0.00590926 -0.00687961 0 0.00541946 -0.0073549 0 0.00444429 -0.00827166 0 0.00474088 -0.00718925 0
+          0.00622414 -0.00573171 0 0.00573171 -0.00622414 0 0.00599056 -0.0049945 0 0.0049945 -0.00599056 0
+          0.008708 -0.00396396 0 0.00854767 -0.00327873 0 0.00896625 -0.00280785 0 0.00765672 -0.00424765 0
+          0.00742989 -0.00349882 0 0.0078845 -0.00301022 0 0.00913633 -0.00160898 0 0.00874002 -0.00206304 0
+          0.0088458 -0.000816154 0 0.00921566 -0.00038584 0 0.00803477 -0.00172696 0 0.00759783 -0.00220326 0
+          0.00810523 -0.000417636 0 0.0076905 -0.000874381 0 0.00648038 -0.00449347 0 0.00619194 -0.00368724 0
+          0.00667398 -0.00318581 0 0.00520109 -0.00469746 0 0.00535743 -0.00333177 0 0.00680197 -0.00182963 0
+          0.00633274 -0.00232359 0 0.00686241 -0.000445852 0 0.00641082 -0.000924805 0 0.00546111 -0.00191535 0
+          0.00551056 -0.000470024 0 0.00396396 -0.008708 0 0.00327873 -0.00854767 0 0.00424765 -0.00765672 0
+          0.00349882 -0.00742989 0 0.00280785 -0.00896625 0 0.00301022 -0.0078845 0 0.00449347 -0.00648038 0
+          0.00368724 -0.00619194 0 0.00469746 -0.00520109 0 0.00318581 -0.00667398 0 0.00333177 -0.00535743 0
+          0.00206304 -0.00874002 0 0.00160898 -0.00913633 0 0.00172696 -0.00803477 0 0.00220326 -0.00759783 0
+          0.000816154 -0.0088458 0 0.00038584 -0.00921566 0 0.000874381 -0.0076905 0 0.000417636 -0.00810523 0
+          0.00182963 -0.00680197 0 0.00232359 -0.00633274 0 0.00191535 -0.00546111 0 0.000924805 -0.00641082 0
+          0.000445852 -0.00686241 0 0.000470024 -0.00551056 0 0.0048564 -0.00384097 0 0.00384097 -0.0048564 0
+          0.00395761 -0.00344581 0 0.00344581 -0.00395761 0 0.00496784 -0.00242211 0 0.00403536 -0.00198275 0
+          0.00503008 -0.000966613 0 0.00407305 -0.000489767 0 0.00352617 -0.00249726 0 0.00357161 -0.000999148 0
+          0.00242211 -0.00496784 0 0.00198275 -0.00403536 0 0.00249726 -0.00352617 0 0.000966613 -0.00503008 0
+          0.000489767 -0.00407305 0 0.000999148 -0.00357161 0 0.0025479 -0.00203079 0 0.00203079 -0.0025479 0
+          0.00205875 -0.00102191 0 0.00257326 -0.000504773 0 0.00102191 -0.00205875 0 0.000504773 -0.00257326 0
+          0.00103454 -0.000514811 0 0.000514811 -0.00103454 0 0.0088634 0.000442999 0 0.00920305 0.000843099 0
+          0.00879255 0.00169549 0 0.00809483 0.000897962 0 0.00770652 0.000467641 0 0.00764564 0.00180263 0
+          0.00909868 0.00205936 0 0.00863434 0.00292239 0 0.00890414 0.00324447 0 0.00800372 0.00220006 0
+          0.00750878 0.00311041 0 0.00783327 0.00346887 0 0.00685438 0.000944631 0 0.006425 0.000487883 0
+          0.00637506 0.00189323 0 0.00550504 0.000982365 0 0.00677801 0.00232091 0 0.00626176 0.00327001 0
+          0.00663445 0.00366208 0 0.00544462 0.00241998 0 0.00533022 0.003821 0 0.00862237 0.00437996 0
+          0.00839115 0.00410478 0 0.00806671 0.00522373 0 0.00825772 0.00544737 0 0.00758608 0.00468464 0
+          0.00729801 0.00437081 0 0.00726596 0.00582758 0 0.00701656 0.00556367 0 0.00766608 0.00626033 0
+          0.00781592 0.00642822 0 0.00719565 0.00719565 0 0.00687792 0.00687792 0 0.00666881 0.00666881 0
+          0.00626033 0.00766608 0 0.00642588 0.00494725 0 0.00608681 0.00459698 0 0.0061555 0.0061555 0
+          0.0058529 0.0058529 0 0.00516357 0.00516357 0 0.00494725 0.00642588 0 0.00582758 0.00726596 0
+          0.00556367 0.00701656 0 0.00522373 0.00806671 0 0.00468464 0.00758608 0 0.00504219 0.00050341 0
+          0.00407011 0.00101058 0 0.00500398 0.00196586 0 0.00358146 0.000513987 0 0.00355557 0.00201939 0
+          0.00491603 0.00339865 0 0.00402659 0.00249573 0 0.00394312 0.00394312 0 0.00349432 0.00349432 0
+          0.00206619 0.000519454 0 0.00257295 0.00102883 0 0.002053 0.002053 0 0.00103686 0.00103686 0
+          0.00051973 0.00051973 0 0.000519454 0.00206619 0 0.00254697 0.00254697 0 0.00201939 0.00355557 0
+          0.00249573 0.00402659 0 0.00102883 0.00257295 0 0.000513987 0.00358146 0 0.00101058 0.00407011 0
+          0.00477966 0.00477966 0 0.003821 0.00533022 0 0.00459698 0.00608681 0 0.00366208 0.00663445 0
+          0.00339865 0.00491603 0 0.00327001 0.00626176 0 0.00437081 0.00729801 0 0.00346887 0.00783327 0
+          0.00410478 0.00839115 0 0.00311041 0.00750878 0 0.00292239 0.00863434 0 0.00241998 0.00544462 0
+          0.00196586 0.00500398 0 0.00189323 0.00637506 0 0.00232091 0.00677801 0 0.000982365 0.00550504 0
+          0.00050341 0.00504219 0 0.000944631 0.00685438 0 0.000487883 0.006425 0 0.00180263 0.00764564 0
+          0.00220006 0.00800372 0 0.00169549 0.00879255 0 0.000897962 0.00809483 0 0.000467641 0.00770652 0
+          0.000442999 0.0088634 0 -0.000442999 -0.0088634 0 -0.000843099 -0.00920305 0 -0.000467641 -0.00770652 0
+          -0.000897962 -0.00809483 0 -0.00169549 -0.00879255 0 -0.00180263 -0.00764564 0 -0.000487883 -0.006425 0
+          -0.000944631 -0.00685438 0 -0.000982365 -0.00550504 0 -0.00189323 -0.00637506 0 -0.00205936 -0.00909868 0
+          -0.00292239 -0.00863434 0 -0.00220006 -0.00800372 0 -0.00311041 -0.00750878 0 -0.00324447 -0.00890414 0
+          -0.00346887 -0.00783327 0 -0.00232091 -0.00677801 0 -0.00327001 -0.00626176 0 -0.00241998 -0.00544462 0
+          -0.00366208 -0.00663445 0 -0.003821 -0.00533022 0 -0.00050341 -0.00504219 0 -0.00101058 -0.00407011 0
+          -0.000513987 -0.00358146 0 -0.00196586 -0.00500398 0 -0.00201939 -0.00355557 0 -0.000519454 -0.00206619 0
+          -0.00102883 -0.00257295 0 -0.00051973 -0.00051973 0 -0.00103686 -0.00103686 0 -0.002053 -0.002053 0
+          -0.00206619 -0.000519454 0 -0.00249573 -0.00402659 0 -0.00339865 -0.00491603 0 -0.00349432 -0.00349432 0
+          -0.00394312 -0.00394312 0 -0.00254697 -0.00254697 0 -0.00355557 -0.00201939 0 -0.00257295 -0.00102883 0
+          -0.00358146 -0.000513987 0 -0.00402659 -0.00249573 0 -0.00407011 -0.00101058 0 -0.00410478 -0.00839115 0
+          -0.00437996 -0.00862237 0 -0.00468464 -0.00758608 0 -0.00437081 -0.00729801 0 -0.00522373 -0.00806671 0
+          -0.00544737 -0.00825772 0 -0.00556367 -0.00701656 0 -0.00582758 -0.00726596 0 -0.00494725 -0.00642588 0
+          -0.00459698 -0.00608681 0 -0.00516357 -0.00516357 0 -0.0058529 -0.0058529 0 -0.0061555 -0.0061555 0
+          -0.00642588 -0.00494725 0 -0.00626033 -0.00766608 0 -0.00642822 -0.00781592 0 -0.00666881 -0.00666881 0
+          -0.00687792 -0.00687792 0 -0.00719565 -0.00719565 0 -0.00766608 -0.00626033 0 -0.00701656 -0.00556367 0
+          -0.00726596 -0.00582758 0 -0.00758608 -0.00468464 0 -0.00806671 -0.00522373 0 -0.00477966 -0.00477966 0
+          -0.00533022 -0.003821 0 -0.00491603 -0.00339865 0 -0.00608681 -0.00459698 0 -0.00663445 -0.00366208 0
+          -0.00626176 -0.00327001 0 -0.00500398 -0.00196586 0 -0.00544462 -0.00241998 0 -0.00550504 -0.000982365 0
+          -0.00504219 -0.00050341 0 -0.00637506 -0.00189323 0 -0.00677801 -0.00232091 0 -0.006425 -0.000487883 0
+          -0.00685438 -0.000944631 0 -0.00729801 -0.00437081 0 -0.00783327 -0.00346887 0 -0.00750878 -0.00311041 0
+          -0.00839115 -0.00410478 0 -0.00863434 -0.00292239 0 -0.00764564 -0.00180263 0 -0.00800372 -0.00220006 0
+          -0.00770652 -0.000467641 0 -0.00809483 -0.000897962 0 -0.00879255 -0.00169549 0 -0.0088634 -0.000442999 0
+          -0.000514811 0.00103454 0 -0.00103454 0.000514811 0 -0.00102191 0.00205875 0 -0.00205875 0.00102191 0
+          -0.000504773 0.00257326 0 -0.000999148 0.00357161 0 -0.000489767 0.00407305 0 -0.00203079 0.0025479 0
+          -0.00198275 0.00403536 0 -0.00257326 0.000504773 0 -0.00357161 0.000999148 0 -0.0025479 0.00203079 0
+          -0.00407305 0.000489767 0 -0.00403536 0.00198275 0 -0.00249726 0.00352617 0 -0.00352617 0.00249726 0
+          -0.00344581 0.00395761 0 -0.00395761 0.00344581 0 -0.000470024 0.00551056 0 -0.000966613 0.00503008 0
+          -0.000445852 0.00686241 0 -0.000924805 0.00641082 0 -0.00191535 0.00546111 0 -0.00182963 0.00680197 0
+          -0.000417636 0.00810523 0 -0.000874381 0.0076905 0 -0.000816154 0.0088458 0 -0.00172696 0.00803477 0
+          -0.00242211 0.00496784 0 -0.00333177 0.00535743 0 -0.00232359 0.00633274 0 -0.00318581 0.00667398 0
+          -0.00384097 0.0048564 0 -0.00368724 0.00619194 0 -0.00220326 0.00759783 0 -0.00301022 0.0078845 0
+          -0.00206304 0.00874002 0 -0.00349882 0.00742989 0 -0.00327873 0.00854767 0 -0.00551056 0.000470024 0
+          -0.00503008 0.000966613 0 -0.00546111 0.00191535 0 -0.00641082 0.000924805 0 -0.00686241 0.000445852 0
+          -0.00680197 0.00182963 0 -0.00496784 0.00242211 0 -0.00535743 0.00333177 0 -0.0048564 0.00384097 0
+          -0.00633274 0.00232359 0 -0.00667398 0.00318581 0 -0.00619194 0.00368724 0 -0.0076905 0.000874381 0
+          -0.00810523 0.000417636 0 -0.00803477 0.00172696 0 -0.0088458 0.000816154 0 -0.00759783 0.00220326 0
+          -0.0078845 0.00301022 0 -0.00742989 0.00349882 0 -0.00874002 0.00206304 0 -0.00854767 0.00327873 0
+          -0.00469746 0.00520109 0 -0.00520109 0.00469746 0 -0.0049945 0.00599056 0 -0.00449347 0.00648038 0
+          -0.00599056 0.0049945 0 -0.00648038 0.00449347 0 -0.00573171 0.00622414 0 -0.00622414 0.00573171 0
+          -0.00474088 0.00718925 0 -0.00424765 0.00765672 0 -0.00444429 0.00827166 0 -0.00541946 0.0073549 0
+          -0.00590926 0.00687961 0 -0.00554078 0.00791626 0 -0.00718925 0.00474088 0 -0.00765672 0.00424765 0
+          -0.00687961 0.00590926 0 -0.0073549 0.00541946 0 -0.00827166 0.00444429 0 -0.00791626 0.00554078 0
+          -0.00650585 0.00698378 0 -0.00698378 0.00650585 0 -0.00654927 0.00748705 0 -0.00748705 0.00654927 0
+          0.000747564 2.92106e-05 0 0.00142616 6.32457e-05 0 0.000684861 3.15302e-05 0 0.00291306 0.000175021 0
+          0.00267974 0.000191348 0 0.000617134 3.33012e-05 0 0.00129636 6.77731e-05 0 0.000545623 3.44617e-05 0
+          0.00115779 7.10776e-05 0 0.00242612 0.000204309 0 0.00215679 0.00021349 0 0.00336933 0.000274704 0
+          0.00473445 0.000469156 0 0.0043578 0.000515009 0 0.00499204 0.000636008 0 0.0030682 0.000296169 0
+          0.00394799 0.00055179 0 0.0027459 0.00031225 0 0.00351242 0.000578358 0 0.004548 0.000687275 0
+          0.00407243 0.000726038 0 0.000471716 3.49506e-05 0 0.00101306 7.30253e-05 0 0.000865072 7.34836e-05 0
+          0.00187691 0.00021848 0 0.000396945 3.47073e-05 0 0.00071703 7.23211e-05 0 0.00032299 3.36723e-05 0
+          0.00159217 0.000218869 0 0.00130884 0.00021425 0 0.00240848 0.00032233 0 0.00305941 0.00059357 0
+          0.00206267 0.000325791 0 0.00357424 0.000750838 0 0.00306335 0.00076022 0 0.00171586 0.000322022 0
+          0.00259817 0.00059629 0 0.00213882 0.000585386 0 0.00255065 0.000752732 0 0.00623003 0.000886509 0
+          0.00631163 0.00112076 0 0.00573585 0.000974803 0 0.00741811 0.00140336 0 0.00734543 0.00170405 0
+          0.00683072 0.00154455 0 0.00519793 0.00104592 0 0.00575153 0.00121245 0 0.00515148 0.00128208 0
+          0.00462599 0.00109768 0 0.00619118 0.00165853 0 0.00669459 0.00184467 0 0.00551106 0.0017418 0
+          0.00599716 0.00195172 0 0.00831701 0.00199737 0 0.00811084 0.00236244 0 0.00765927 0.0021996 0
+          0.0089451 0.00264759 0 0.0082384 0.00291682 0 0.00694302 0.00236307 0 0.00739299 0.0025585 0
+          0.00618119 0.0024828 0 0.00662364 0.00270801 0 0.00746873 0.00313465 0 0.00664997 0.00329447 0
+          0.00452269 0.00132705 0 0.00403095 0.00112789 0 0.00387766 0.00134478 0 0.00480331 0.0017909 0
+          0.0052662 0.00202125 0 0.0045162 0.00204928 0 0.00342489 0.00113438 0 0.00323015 0.00133268 0
+          0.00282108 0.00111497 0 0.00408229 0.00180233 0 0.00376317 0.00203188 0 0.00336379 0.00177264 0
+          0.00538828 0.00255381 0 0.00581717 0.00280545 0 0.00498959 0.00284532 0 0.00579771 0.00338965 0
+          0.0045804 0.00257114 0 0.00415852 0.00282211 0 0.0037752 0.00252981 0 0.00492924 0.00341358 0
+          0.00406354 0.00335966 0 0.000251673 3.1787e-05 0 0.000572416 6.9408e-05 0 0.000184966 2.89941e-05 0
+          0.000435007 6.46169e-05 0 0.00103375 0.00020422 0 0.000774257 0.000188381 0 0.00012498 2.52383e-05 0
+          0.000308865 5.78232e-05 0 0.000198345 4.8906e-05 0 0.000538304 0.000166339 0 0.00137613 0.000310414 0
+          0.00169238 0.000559731 0 0.00105226 0.000290364 0 0.00127075 0.000518206 0 0.00204806 0.000726931 0
+          0.00156849 0.00068138 0 0.000753656 0.000261275 0 0.000886762 0.000459703 0 0.000490443 0.000222558 0
+          0.00112586 0.000614653 0 0.000735078 0.000525337 0 7.39772e-05 2.04662e-05 0 0.000108084 3.77501e-05 0
+          3.43583e-05 1.46282e-05 0 0.000334367 0.000137709 0 0.000171479 0.000102119 0 8.66746e-06 7.67993e-06 0
+          4.30053e-05 2.42487e-05 0 -4.14191e-07 -4.14191e-07 0 8.30914e-06 8.30914e-06 0 5.92134e-05 5.92134e-05 0
+          7.67993e-06 8.66746e-06 0 0.000273397 0.00017364 0 0.00055411 0.000383127 0 0.000287401 0.000287401 0
+          0.00041204 0.00041204 0 0.000113964 0.000113964 0 0.000102119 0.000171479 0 2.42487e-05 4.30053e-05 0
+          1.46282e-05 3.43583e-05 0 0.00017364 0.000273397 0 3.77501e-05 0.000108084 0 0.00223398 0.00106749 0
+          0.00259518 0.00128818 0 0.00198904 0.00120871 0 0.00167923 0.000989797 0 0.002665 0.00169836 0
+          0.00302454 0.0019651 0 0.00200449 0.00157605 0 0.00231925 0.00184501 0 0.00142927 0.00109172 0
+          0.00117364 0.000879747 0 0.000934678 0.000934678 0 0.00140227 0.00140227 0 0.00166769 0.00166769 0
+          0.00109172 0.00142927 0 0.00299193 0.00242488 0 0.00334321 0.00273035 0 0.00225141 0.00225141 0
+          0.00256454 0.00256454 0 0.0032213 0.0032213 0 0.00242488 0.00299193 0 0.00157605 0.00200449 0
+          0.00184501 0.00231925 0 0.00120871 0.00198904 0 0.00169836 0.002665 0 0.000735216 0.000735216 0
+          0.000525337 0.000735078 0 0.000383127 0.00055411 0 0.000879747 0.00117364 0 0.000614653 0.00112586 0
+          0.000459703 0.000886762 0 0.000137709 0.000334367 0 0.000222558 0.000490443 0 4.8906e-05 0.000198345 0
+          2.04662e-05 7.39772e-05 0 0.000166339 0.000538304 0 0.000261275 0.000753656 0 2.52383e-05 0.00012498 0
+          5.78232e-05 0.000308865 0 0.000989797 0.00167923 0 0.00068138 0.00156849 0 0.000518206 0.00127075 0
+          0.00106749 0.00223398 0 0.000559731 0.00169238 0 0.000188381 0.000774257 0 0.000290364 0.00105226 0
+          2.89941e-05 0.000184966 0 6.46169e-05 0.000435007 0 0.00020422 0.00103375 0 3.1787e-05 0.000251673 0
+          0.00862524 0.00307399 0 0.00932074 0.00333446 0 0.00858501 0.00367462 0 0.00890607 0.00381822 0
+          0.00786258 0.00333013 0 0.00778362 0.00395003 0 0.00704509 0.00352568 0 0.00693103 0.00415234 0
+          0.00811922 0.00413735 0 0.00727571 0.00438121 0 0.00946233 0.0040398 0 0.00897075 0.00457617 0
+          0.00871603 0.00445292 0 0.00938827 0.00474681 0 0.00883673 0.00533032 0 0.0086484 0.00523319 0
+          0.00790304 0.00478759 0 0.0081788 0.00495956 0 0.00732973 0.00525273 0 0.007038 0.00503366 0
+          0.00784232 0.00562738 0 0.00805721 0.00577776 0 0.00698454 0.00591742 0 0.00722137 0.00612011 0
+          0.00618805 0.00365346 0 0.00604345 0.00427318 0 0.00530847 0.00370627 0 0.0063913 0.00454085 0
+          0.00548353 0.00460732 0 0.00442507 0.00367694 0 0.00513889 0.00430422 0 0.00423712 0.00423712 0
+          0.00457171 0.00457171 0 0.00643939 0.00544494 0 0.00613738 0.00518099 0 0.00552544 0.00552544 0
+          0.0060914 0.0060914 0 0.00634482 0.00634482 0 0.00544494 0.00643939 0 0.00521944 0.00521944 0
+          0.00460732 0.00548353 0 0.00430422 0.00513889 0 0.00518099 0.00613738 0 0.00454085 0.0063913 0
+          0.00427318 0.00604345 0 0.00911698 0.00544008 0 0.00852149 0.00606465 0 0.00839908 0.0059984 0
+          0.00866689 0.00610557 0 0.00798503 0.00673307 0 0.00761683 0.00645106 0 0.00777037 0.00657457 0
+          0.00678433 0.00678433 0 0.0069649 0.0069649 0 0.00724195 0.00724195 0 0.00645106 0.00761683 0
+          0.00804249 0.00676464 0 0.00805644 0.00673066 0 0.00742323 0.00742323 0 0.00741721 0.00741721 0
+          0.0073342 0.0073342 0 0.00673307 0.00798503 0 0.00657457 0.00777037 0 0.0059984 0.00839908 0
+          0.00676464 0.00804249 0 0.00606465 0.00852149 0 0.00591742 0.00698454 0 0.00612011 0.00722137 0
+          0.00525273 0.00732973 0 0.00562738 0.00784232 0 0.00503366 0.007038 0 0.00438121 0.00727571 0
+          0.00415234 0.00693103 0 0.00478759 0.00790304 0 0.00395003 0.00778362 0 0.00577776 0.00805721 0
+          0.00523319 0.0086484 0 0.00495956 0.0081788 0 0.00533032 0.00883673 0 0.00457617 0.00897075 0
+          0.00413735 0.00811922 0 0.00445292 0.00871603 0 0.00367462 0.00858501 0 0.00381822 0.00890607 0
+          0.0035583 0.0035583 0 0.00335966 0.00406354 0 0.00273035 0.00334321 0 0.00252981 0.0037752 0
+          0.00367694 0.00442507 0 0.00282211 0.00415852 0 0.0019651 0.00302454 0 0.00177264 0.00336379 0
+          0.00128818 0.00259518 0 0.00203188 0.00376317 0 0.00133268 0.00323015 0 0.00341358 0.00492924 0
+          0.00370627 0.00530847 0 0.00284532 0.00498959 0 0.00257114 0.0045804 0 0.00338965 0.00579771 0
+          0.00365346 0.00618805 0 0.00255381 0.00538828 0 0.00280545 0.00581717 0 0.00204928 0.0045162 0
+          0.00180233 0.00408229 0 0.00134478 0.00387766 0 0.0017909 0.00480331 0 0.00202125 0.0052662 0
+          0.00132705 0.00452269 0 0.000726931 0.00204806 0 0.00111497 0.00282108 0 0.000585386 0.00213882 0
+          0.000752732 0.00255065 0 0.000310414 0.00137613 0 0.00021425 0.00130884 0 6.9408e-05 0.000572416 0
+          3.36723e-05 0.00032299 0 0.000322022 0.00171586 0 7.23211e-05 0.00071703 0 0.00113438 0.00342489 0
+          0.00076022 0.00306335 0 0.00059629 0.00259817 0 0.00112789 0.00403095 0 0.000750838 0.00357424 0
+          0.00059357 0.00305941 0 0.000218869 0.00159217 0 0.000325791 0.00206267 0 7.34836e-05 0.000865072 0
+          3.47073e-05 0.000396945 0 0.00021848 0.00187691 0 0.00032233 0.00240848 0 3.49506e-05 0.000471716 0
+          7.30253e-05 0.00101306 0 0.00329447 0.00664997 0 0.00352568 0.00704509 0 0.0024828 0.00618119 0
+          0.00270801 0.00662364 0 0.00313465 0.00746873 0 0.00236307 0.00694302 0 0.0017418 0.00551106 0
+          0.00195172 0.00599716 0 0.00128208 0.00515148 0 0.00165853 0.00619118 0 0.00333013 0.00786258 0
+          0.00291682 0.0082384 0 0.0025585 0.00739299 0 0.0021996 0.00765927 0 0.00307399 0.00862524 0
+          0.00236244 0.00811084 0 0.00184467 0.00669459 0 0.00154455 0.00683072 0 0.00121245 0.00575153 0
+          0.00170405 0.00734543 0 0.00112076 0.00631163 0 0.00109768 0.00462599 0 0.000726038 0.00407243 0
+          0.000578358 0.00351242 0 0.00104592 0.00519793 0 0.00055179 0.00394799 0 0.00021349 0.00215679 0
+          0.00031225 0.0027459 0 3.44617e-05 0.000545623 0 7.10776e-05 0.00115779 0 0.000204309 0.00242612 0
+          3.33012e-05 0.000617134 0 0.000687275 0.004548 0 0.000974803 0.00573585 0 0.000515009 0.0043578 0
+          0.000636008 0.00499204 0 0.000296169 0.0030682 0 0.000191348 0.00267974 0 6.77731e-05 0.00129636 0
+          3.15302e-05 0.000684861 0 0.000274704 0.00336933 0 6.32457e-05 0.00142616 0 0.00730406 0.00730406 0
+          0.00666315 0.0080108 0 0.00673066 0.00805644 0 0.00642822 0.00781592 0 0.00579779 0.00853531 0
+          0.00592431 0.00862179 0 0.00610557 0.00866689 0 0.00607761 0.00868686 0 0.00544943 0.00920492 0
+          0.00544008 0.00911698 0 0.00537487 0.00927578 0 0.00528908 0.00925635 0 0.00478979 0.00975815 0
+          0.00474319 0.00980905 0 0.00544737 0.00825772 0 0.00483865 0.00898214 0 0.00502118 0.0091099 0
+          0.00437996 0.00862237 0 0.00403828 0.00951291 0 0.00455636 0.0098016 0 0.00441498 0.00974162 0
+          0.00406126 0.010312 0 0.00396022 0.0103239 0 0.00366545 0.0102359 0 0.0032682 0.0107695 0
+          0.00479032 0.00954611 0 0.00474681 0.00938827 0 0.00411331 0.00969152 0 0.00418019 0.0100492 0
+          0.00417031 0.0101733 0 0.00358176 0.0103288 0 0.0040398 0.00946233 0 0.00343279 0.00962229 0
+          0.00333446 0.00932074 0 0.00355839 0.010129 0 0.00299003 0.0102557 0 0.00293794 0.00997811 0
+          0.00354528 0.0106201 0 0.00348283 0.0107079 0 0.00299225 0.0108723 0 0.00285404 0.0110919 0
+          0.00301885 0.0107051 0 0.00249889 0.0107959 0 0.00249343 0.0105462 0 0.00243135 0.0111813 0
+          0.00200931 0.0110159 0 0.00380323 0.00934415 0 0.00324447 0.00890414 0 0.0029926 0.0098245 0
+          0.00270903 0.0096157 0 0.00347128 0.0101349 0 0.00271757 0.0105718 0 0.00311481 0.0107414 0
+          0.00242433 0.0111235 0 0.00247393 0.0104301 0 0.00222127 0.0110549 0 0.00205936 0.00909868 0
+          0.00157356 0.00979263 0 0.00190115 0.0100399 0 0.000843099 0.00920305 0 0.00041435 0.00987226 0
+          0.000780942 0.0101557 0 0.00172813 0.0108042 0 0.00143891 0.0106227 0 0.00129389 0.0112596 0
+          0.0015434 0.0113686 0 0.000712545 0.0109295 0 0.000382164 0.0107097 0 0.000639118 0.0115011 0
+          0.00034699 0.0113525 0 0.00274045 0.0111415 0 0.00211844 0.0114571 0 0.00235558 0.0113131 0
+          0.00195571 0.0114672 0 0.00168251 0.0116444 0 0.00196836 0.0112342 0 0.00180605 0.01155 0
+          0.00149395 0.0113798 0 0.00140742 0.0115638 0 0.0011412 0.0116802 0 0.00135045 0.0117101 0
+          0.000983811 0.0118613 0 0.000562029 0.0118472 0 0.000309456 0.0117771 0 0.000270269 0.0119602 0
+          0.00115315 0.0118057 0 0.000825039 0.0117797 0 0.000955761 0.0116322 0 0.000482801 0.0119444 0
+          0.000230215 0.0118786 0 0.000403117 0.0117695 0 0.00264759 0.0089451 0 0.00276446 0.00931954 0
+          0.00212535 0.00876443 0 0.00199737 0.00831701 0 0.00233361 0.00957663 0 0.00240876 0.00993365 0
+          0.00176138 0.0089049 0 0.00185277 0.00934265 0 0.00153384 0.00793813 0 0.00140336 0.00741811 0
+          0.00100961 0.0068218 0 0.00123845 0.00794323 0 0.00133801 0.00846258 0 0.000881595 0.00727337 0
+          0.00198151 0.0101225 0 0.0020141 0.0104575 0 0.00149662 0.00941315 0 0.00155022 0.00983598 0
+          0.00159794 0.0105739 0 0.00120809 0.00983359 0 0.00105331 0.00839734 0 0.00112054 0.00891017 0
+          0.000739328 0.0076589 0 0.000851449 0.00877314 0 0.000886509 0.00623003 0 0.000573699 0.00539666 0
+          0.000469156 0.00473445 0 0.000783234 0.00667196 0 0.000501814 0.00575496 0 0.000415378 0.00507143 0
+          0.000175021 0.00291306 0 0.000248474 0.00364393 0 5.76303e-05 0.00154487 0 2.92106e-05 0.000747564 0
+          0.000155741 0.00312203 0 0.000218102 0.00388732 0 2.64048e-05 0.000804147 0 5.10626e-05 0.00165043 0
+          0.000667171 0.00705427 0 0.000421818 0.00606104 0 0.000354823 0.00536314 0 0.000540517 0.00737082 0
+          0.00028864 0.00560488 0 0.000133927 0.00330319 0 0.000184212 0.00409548 0 2.31758e-05 0.000853661 0
+          4.36789e-05 0.00174113 0 0.000109993 0.0034536 0 1.95867e-05 0.000895302 0 0.00158769 0.0108827 0
+          0.00118953 0.0109238 0 0.00122323 0.0102365 0 0.000900794 0.0101596 0 0.00113675 0.0112026 0
+          0.000877347 0.0105381 0 0.000885411 0.00927374 0 0.000636361 0.00906472 0 0.000585413 0.00797224 0
+          0.000636608 0.00954764 0 0.00042246 0.0082085 0 0.000762941 0.0111667 0 0.000668495 0.0114123 0
+          0.000518107 0.010736 0 0.000579727 0.0103862 0 0.000324817 0.0112991 0 0.00019016 0.0115087 0
+          0.000249899 0.0105099 0 0.000151053 0.0108273 0 0.000378117 0.00972765 0 0.000411551 0.00926758 0
+          0.00025308 0.00836406 0 0.000180523 0.00937865 0 0.000113925 0.00981106 0 7.98878e-05 0.00843656 0
+          0.000335182 0.00631002 0 0.000405472 0.00761662 0 0.000217981 0.00579284 0 0.000243376 0.00649801 0
+          0.000147427 0.0042651 0 8.43601e-05 0.00357091 0 3.56163e-05 0.00181549 0 1.57015e-05 0.000928412 0
+          0.000108372 0.00439351 0 2.70123e-05 0.00187235 0 0.000264236 0.00778789 0 0.00014787 0.00662213 0
+          0.000143998 0.00592413 0 0.000119011 0.00788203 0 5.01401e-05 0.00668049 0 6.78442e-05 0.00599675 0
+          5.74457e-05 0.00365331 0 6.76762e-05 0.00447876 0 1.80052e-05 0.00191085 0 1.15842e-05 0.00095248 0
+          2.967e-05 0.00369955 0 2.59652e-05 0.00451955 0 7.29936e-06 0.000967139 0 8.73361e-06 0.00193039 0
+          -0.00038584 0.00921566 0 -0.000751095 0.00985338 0 -0.000351005 0.0101703 0 -0.00160898 0.00913633 0
+          -0.00147768 0.0100835 0 -0.00031375 0.0109459 0 -0.000680327 0.0106899 0 -0.00027477 0.0115189 0
+          -0.00060513 0.0113321 0 -0.00133533 0.010853 0 -0.00118453 0.0114218 0 -0.00190525 0.00973628 0
+          -0.00280785 0.00896625 0 -0.00258206 0.00989645 0 -0.0030306 0.00952273 0 -0.00173259 0.0105635 0
+          -0.00233677 0.0106524 0 -0.00154816 0.0111987 0 -0.00207643 0.0112112 0 -0.00275867 0.0103325 0
+          -0.00246778 0.0109544 0 -0.000234838 0.0118661 0 -0.000526937 0.0117565 0 -0.000447337 0.0119399 0
+          -0.00102818 0.0117666 0 -0.000194802 0.011964 0 -0.000368071 0.011859 0 -0.000155586 0.0117894 0
+          -0.00086948 0.0118643 0 -0.000711953 0.0116917 0 -0.00135541 0.0116187 0 -0.00180601 0.0115503 0
+          -0.00115822 0.0118006 0 -0.0021634 0.0113659 0 -0.0018516 0.0115443 0 -0.000960827 0.0117211 0
+          -0.00153105 0.0116467 0 -0.00125759 0.0114779 0 -0.00153906 0.0114672 0 -0.00396396 0.008708 0
+          -0.00410961 0.00921597 0 -0.00364713 0.00961212 0 -0.00505884 0.00836555 0 -0.00512477 0.00882074 0
+          -0.00465587 0.00923482 0 -0.00330264 0.010347 0 -0.00374256 0.0100003 0 -0.00334968 0.0106028 0
+          -0.00293671 0.0108904 0 -0.00421749 0.00994147 0 -0.00466831 0.00957213 0 -0.00375165 0.0104642 0
+          -0.00417954 0.0101495 0 -0.006074 0.00794424 0 -0.00605853 0.00834325 0 -0.00559124 0.00877046 0
+          -0.00699095 0.00745081 0 -0.00643621 0.00822645 0 -0.0050659 0.00944224 0 -0.00551992 0.00905466 0
+          -0.00450748 0.00993938 0 -0.00494303 0.00960147 0 -0.00583241 0.00885724 0 -0.00519046 0.00932423 0
+          -0.00293832 0.0110017 0 -0.00255636 0.0112203 0 -0.00251668 0.011175 0 -0.00326723 0.0107818 0
+          -0.0036676 0.0105319 0 -0.00314268 0.0106985 0 -0.00216932 0.0113146 0 -0.00209378 0.011101 0
+          -0.00178409 0.0111511 0 -0.00277409 0.010873 0 -0.00261599 0.0106282 0 -0.00228305 0.0107165 0
+          -0.00392664 0.0102417 0 -0.00433864 0.00996387 0 -0.00371879 0.010122 0 -0.0045226 0.00960844 0
+          -0.00333519 0.0103289 0 -0.00309668 0.0100562 0 -0.00274607 0.0101809 0 -0.00384239 0.0096909 0
+          -0.00316474 0.00955262 0 -0.000118189 0.0113188 0 -0.000291033 0.0114903 0 -8.36833e-05 0.0105288 0
+          -0.00021827 0.0108106 0 -0.00055942 0.0112256 0 -0.000416009 0.0104428 0 -5.32145e-05 0.00939625 0
+          -0.000151978 0.0097966 0 -9.45033e-05 0.00842491 0 -0.000286154 0.00932013 0 -0.000767855 0.0113574 0
+          -0.000992219 0.0110209 0 -0.000584316 0.0106862 0 -0.000742067 0.010253 0 -0.00123308 0.0111119 0
+          -0.000941536 0.0104559 0 -0.000415599 0.00968452 0 -0.000514783 0.00915143 0 -0.000267476 0.00832931 0
+          -0.000672945 0.00947649 0 -0.000436413 0.00815119 0 -2.79992e-05 0.00789763 0 -4.83408e-05 0.00667224 0
+          -9.32444e-06 0.00600963 0 -0.000174589 0.00783445 0 -8.63522e-05 0.00596256 0 1.45379e-06 0.00370892 0
+          -1.61319e-05 0.00451527 0 2.91192e-06 0.000972169 0 -6.63222e-07 0.0019307 0 -2.67814e-05 0.0036813 0
+          -1.51286e-06 0.000967495 0 -0.000146096 0.00659749 0 -0.000318551 0.00769346 0 -0.000162082 0.00585627 0
+          -0.000241649 0.00645738 0 -5.79855e-05 0.00446599 0 -5.46132e-05 0.00361711 0 -1.00455e-05 0.00191175 0
+          -5.9093e-06 0.00095319 0 -9.89653e-05 0.00437246 0 -1.9273e-05 0.00187385 0 -0.00140993 0.0107078 0
+          -0.00167946 0.0107577 0 -0.00128438 0.0101232 0 -0.00105684 0.00996233 0 -0.00180588 0.0102911 0
+          -0.00209977 0.0103001 0 -0.00135532 0.0095753 0 -0.00160729 0.00969328 0 -0.00092002 0.00917568 0
+          -0.000735591 0.00889272 0 -0.000598693 0.00789327 0 -0.000945061 0.00854798 0 -0.00115282 0.00878675 0
+          -0.000751695 0.00755952 0 -0.00217341 0.00977728 0 -0.00248677 0.00974641 0 -0.00163247 0.00909793 0
+          -0.00190471 0.0091729 0 -0.00250585 0.00917461 0 -0.00188329 0.00853784 0 -0.00113968 0.00812257 0
+          -0.00136736 0.00831579 0 -0.000892792 0.0071552 0 -0.00131591 0.0076233 0 -0.000457677 0.00747679 0
+          -0.00033352 0.00625404 0 -0.000235354 0.00569237 0 -0.000589756 0.00718777 0 -0.000420228 0.00599062 0
+          -0.000305008 0.00547337 0 -8.16182e-05 0.00351731 0 -0.000138439 0.00423611 0 -2.82047e-05 0.00181757 0
+          -1.02113e-05 0.00092947 0 -0.000107372 0.00338346 0 -0.000175775 0.00405904 0 -1.43525e-05 0.000896697 0
+          -3.6699e-05 0.00174378 0 -0.000712575 0.00683092 0 -0.000500291 0.00567125 0 -0.000369883 0.0052027 0
+          -0.000823918 0.00641193 0 -0.000428813 0.00488468 0 -0.000131449 0.00321762 0 -0.000210337 0.00384403 0
+          -1.82658e-05 0.000855381 0 -4.46137e-05 0.00165364 0 -0.000153423 0.00302245 0 -2.18838e-05 0.000806175 0
+          -2.92106e-05 -0.000747564 0 -6.32457e-05 -0.00142616 0 -0.000175021 -0.00291306 0 -3.15302e-05 -0.000684861 0
+          -0.000191348 -0.00267974 0 -0.000469156 -0.00473445 0 -0.000274704 -0.00336933 0 -0.000636008 -0.00499204 0
+          -0.000515009 -0.0043578 0 -3.33012e-05 -0.000617134 0 -6.77731e-05 -0.00129636 0 -0.000204309 -0.00242612 0
+          -7.10776e-05 -0.00115779 0 -3.44617e-05 -0.000545623 0 -0.00021349 -0.00215679 0 -0.000296169 -0.0030682 0
+          -0.00055179 -0.00394799 0 -0.000687275 -0.004548 0 -0.00031225 -0.0027459 0 -0.000578358 -0.00351242 0
+          -0.000726038 -0.00407243 0 -0.000886509 -0.00623003 0 -0.00112076 -0.00631163 0 -0.00140336 -0.00741811 0
+          -0.00170405 -0.00734543 0 -0.000974803 -0.00573585 0 -0.00154455 -0.00683072 0 -0.00199737 -0.00831701 0
+          -0.00236244 -0.00811084 0 -0.00264759 -0.0089451 0 -0.0021996 -0.00765927 0 -0.00291682 -0.0082384 0
+          -0.00121245 -0.00575153 0 -0.00104592 -0.00519793 0 -0.00165853 -0.00619118 0 -0.00184467 -0.00669459 0
+          -0.00128208 -0.00515148 0 -0.00109768 -0.00462599 0 -0.00195172 -0.00599716 0 -0.0017418 -0.00551106 0
+          -0.00236307 -0.00694302 0 -0.0025585 -0.00739299 0 -0.00313465 -0.00746873 0 -0.00270801 -0.00662364 0
+          -0.0024828 -0.00618119 0 -0.00329447 -0.00664997 0 -7.30253e-05 -0.00101306 0 -3.49506e-05 -0.000471716 0
+          -0.00021848 -0.00187691 0 -7.34836e-05 -0.000865072 0 -0.00032233 -0.00240848 0 -0.00059357 -0.00305941 0
+          -0.000750838 -0.00357424 0 -0.000325791 -0.00206267 0 -0.00076022 -0.00306335 0 -3.47073e-05 -0.000396945 0
+          -7.23211e-05 -0.00071703 0 -0.000218869 -0.00159217 0 -3.36723e-05 -0.00032299 0 -0.00021425 -0.00130884 0
+          -0.00059629 -0.00259817 0 -0.000322022 -0.00171586 0 -0.000752732 -0.00255065 0 -0.000585386 -0.00213882 0
+          -0.00132705 -0.00452269 0 -0.00112789 -0.00403095 0 -0.00202125 -0.0052662 0 -0.0017909 -0.00480331 0
+          -0.00134478 -0.00387766 0 -0.00204928 -0.0045162 0 -0.00280545 -0.00581717 0 -0.00255381 -0.00538828 0
+          -0.00338965 -0.00579771 0 -0.00284532 -0.00498959 0 -0.00113438 -0.00342489 0 -0.00133268 -0.00323015 0
+          -0.00180233 -0.00408229 0 -0.00203188 -0.00376317 0 -0.00111497 -0.00282108 0 -0.00177264 -0.00336379 0
+          -0.00257114 -0.0045804 0 -0.00282211 -0.00415852 0 -0.00341358 -0.00492924 0 -0.00252981 -0.0037752 0
+          -0.00335966 -0.00406354 0 -0.00333446 -0.00932074 0 -0.00307399 -0.00862524 0 -0.00381822 -0.00890607 0
+          -0.00367462 -0.00858501 0 -0.0040398 -0.00946233 0 -0.00457617 -0.00897075 0 -0.00474681 -0.00938827 0
+          -0.00533032 -0.00883673 0 -0.00445292 -0.00871603 0 -0.00523319 -0.0086484 0 -0.00333013 -0.00786258 0
+          -0.00395003 -0.00778362 0 -0.00413735 -0.00811922 0 -0.00352568 -0.00704509 0 -0.00415234 -0.00693103 0
+          -0.00438121 -0.00727571 0 -0.00495956 -0.0081788 0 -0.00478759 -0.00790304 0 -0.00562738 -0.00784232 0
+          -0.00577776 -0.00805721 0 -0.00525273 -0.00732973 0 -0.00503366 -0.007038 0 -0.00612011 -0.00722137 0
+          -0.00591742 -0.00698454 0 -0.00544008 -0.00911698 0 -0.00606465 -0.00852149 0 -0.00610557 -0.00866689 0
+          -0.0059984 -0.00839908 0 -0.00673307 -0.00798503 0 -0.00673066 -0.00805644 0 -0.00676464 -0.00804249 0
+          -0.00741721 -0.00741721 0 -0.00742323 -0.00742323 0 -0.00645106 -0.00761683 0 -0.00657457 -0.00777037 0
+          -0.00724195 -0.00724195 0 -0.0069649 -0.0069649 0 -0.00678433 -0.00678433 0 -0.00761683 -0.00645106 0
+          -0.0073342 -0.0073342 0 -0.00798503 -0.00673307 0 -0.00804249 -0.00676464 0 -0.00777037 -0.00657457 0
+          -0.00839908 -0.0059984 0 -0.00852149 -0.00606465 0 -0.00365346 -0.00618805 0 -0.00427318 -0.00604345 0
+          -0.00454085 -0.0063913 0 -0.00370627 -0.00530847 0 -0.00460732 -0.00548353 0 -0.00544494 -0.00643939 0
+          -0.00518099 -0.00613738 0 -0.00634482 -0.00634482 0 -0.0060914 -0.0060914 0 -0.00552544 -0.00552544 0
+          -0.00643939 -0.00544494 0 -0.00430422 -0.00513889 0 -0.00367694 -0.00442507 0 -0.00457171 -0.00457171 0
+          -0.00423712 -0.00423712 0 -0.00521944 -0.00521944 0 -0.00548353 -0.00460732 0 -0.00613738 -0.00518099 0
+          -0.0063913 -0.00454085 0 -0.00513889 -0.00430422 0 -0.00604345 -0.00427318 0 -0.00722137 -0.00612011 0
+          -0.00698454 -0.00591742 0 -0.00784232 -0.00562738 0 -0.00732973 -0.00525273 0 -0.00805721 -0.00577776 0
+          -0.0086484 -0.00523319 0 -0.00883673 -0.00533032 0 -0.0081788 -0.00495956 0 -0.00897075 -0.00457617 0
+          -0.007038 -0.00503366 0 -0.00727571 -0.00438121 0 -0.00790304 -0.00478759 0 -0.00693103 -0.00415234 0
+          -0.00778362 -0.00395003 0 -0.00871603 -0.00445292 0 -0.00811922 -0.00413735 0 -0.00890607 -0.00381822 0
+          -0.00858501 -0.00367462 0 -3.1787e-05 -0.000251673 0 -6.9408e-05 -0.000572416 0 -0.00020422 -0.00103375 0
+          -6.46169e-05 -0.000435007 0 -2.89941e-05 -0.000184966 0 -0.000188381 -0.000774257 0 -0.000310414 -0.00137613 0
+          -0.000559731 -0.00169238 0 -0.000726931 -0.00204806 0 -0.000290364 -0.00105226 0 -0.000518206 -0.00127075 0
+          -0.00068138 -0.00156849 0 -5.78232e-05 -0.000308865 0 -2.52383e-05 -0.00012498 0 -0.000166339 -0.000538304 0
+          -4.8906e-05 -0.000198345 0 -0.000261275 -0.000753656 0 -0.000459703 -0.000886762 0 -0.000614653 -0.00112586 0
+          -0.000222558 -0.000490443 0 -0.000525337 -0.000735078 0 -0.00128818 -0.00259518 0 -0.00106749 -0.00223398 0
+          -0.00169836 -0.002665 0 -0.0019651 -0.00302454 0 -0.00120871 -0.00198904 0 -0.000989797 -0.00167923 0
+          -0.00184501 -0.00231925 0 -0.00157605 -0.00200449 0 -0.00242488 -0.00299193 0 -0.00273035 -0.00334321 0
+          -0.0032213 -0.0032213 0 -0.00256454 -0.00256454 0 -0.00225141 -0.00225141 0 -0.00299193 -0.00242488 0
+          -0.00109172 -0.00142927 0 -0.000879747 -0.00117364 0 -0.00166769 -0.00166769 0 -0.00140227 -0.00140227 0
+          -0.000934678 -0.000934678 0 -0.00142927 -0.00109172 0 -0.00231925 -0.00184501 0 -0.00200449 -0.00157605 0
+          -0.002665 -0.00169836 0 -0.00198904 -0.00120871 0 -2.04662e-05 -7.39772e-05 0 -3.77501e-05 -0.000108084 0
+          -0.000137709 -0.000334367 0 -1.46282e-05 -3.43583e-05 0 -0.000102119 -0.000171479 0 -0.000383127 -0.00055411 0
+          -0.00017364 -0.000273397 0 -0.00041204 -0.00041204 0 -0.000287401 -0.000287401 0 -7.67993e-06 -8.66746e-06 0
+          -2.42487e-05 -4.30053e-05 0 -5.92134e-05 -5.92134e-05 0 -8.30914e-06 -8.30914e-06 0 4.14191e-07 4.14191e-07 0
+          -8.66746e-06 -7.67993e-06 0 -0.000113964 -0.000113964 0 -0.000171479 -0.000102119 0 -0.000273397 -0.00017364 0
+          -4.30053e-05 -2.42487e-05 0 -3.43583e-05 -1.46282e-05 0 -0.000108084 -3.77501e-05 0 -0.000735216 -0.000735216 0
+          -0.000735078 -0.000525337 0 -0.00117364 -0.000879747 0 -0.00112586 -0.000614653 0 -0.00055411 -0.000383127 0
+          -0.000886762 -0.000459703 0 -0.00167923 -0.000989797 0 -0.00156849 -0.00068138 0 -0.00223398 -0.00106749 0
+          -0.00127075 -0.000518206 0 -0.00169238 -0.000559731 0 -0.000490443 -0.000222558 0 -0.000334367 -0.000137709 0
+          -0.000538304 -0.000166339 0 -0.000753656 -0.000261275 0 -0.000198345 -4.8906e-05 0 -7.39772e-05 -2.04662e-05 0
+          -0.000308865 -5.78232e-05 0 -0.00012498 -2.52383e-05 0 -0.000774257 -0.000188381 0 -0.00105226 -0.000290364 0
+          -0.00103375 -0.00020422 0 -0.000435007 -6.46169e-05 0 -0.000184966 -2.89941e-05 0 -0.000251673 -3.1787e-05 0
+          -0.0035583 -0.0035583 0 -0.00406354 -0.00335966 0 -0.00442507 -0.00367694 0 -0.00334321 -0.00273035 0
+          -0.0037752 -0.00252981 0 -0.00415852 -0.00282211 0 -0.00530847 -0.00370627 0 -0.00492924 -0.00341358 0
+          -0.00579771 -0.00338965 0 -0.00618805 -0.00365346 0 -0.00498959 -0.00284532 0 -0.0045804 -0.00257114 0
+          -0.00581717 -0.00280545 0 -0.00538828 -0.00255381 0 -0.00302454 -0.0019651 0 -0.00336379 -0.00177264 0
+          -0.00376317 -0.00203188 0 -0.00259518 -0.00128818 0 -0.00323015 -0.00133268 0 -0.0045162 -0.00204928 0
+          -0.00408229 -0.00180233 0 -0.0052662 -0.00202125 0 -0.00480331 -0.0017909 0 -0.00387766 -0.00134478 0
+          -0.00452269 -0.00132705 0 -0.00664997 -0.00329447 0 -0.00704509 -0.00352568 0 -0.00746873 -0.00313465 0
+          -0.00662364 -0.00270801 0 -0.00618119 -0.0024828 0 -0.00694302 -0.00236307 0 -0.00786258 -0.00333013 0
+          -0.0082384 -0.00291682 0 -0.00862524 -0.00307399 0 -0.00739299 -0.0025585 0 -0.00765927 -0.0021996 0
+          -0.00811084 -0.00236244 0 -0.00599716 -0.00195172 0 -0.00551106 -0.0017418 0 -0.00619118 -0.00165853 0
+          -0.00515148 -0.00128208 0 -0.00669459 -0.00184467 0 -0.00683072 -0.00154455 0 -0.00734543 -0.00170405 0
+          -0.00575153 -0.00121245 0 -0.00631163 -0.00112076 0 -0.00282108 -0.00111497 0 -0.00204806 -0.000726931 0
+          -0.00255065 -0.000752732 0 -0.00213882 -0.000585386 0 -0.00342489 -0.00113438 0 -0.00306335 -0.00076022 0
+          -0.00403095 -0.00112789 0 -0.00357424 -0.000750838 0 -0.00259817 -0.00059629 0 -0.00305941 -0.00059357 0
+          -0.00137613 -0.000310414 0 -0.00130884 -0.00021425 0 -0.00171586 -0.000322022 0 -0.000572416 -6.9408e-05 0
+          -0.00032299 -3.36723e-05 0 -0.00071703 -7.23211e-05 0 -0.00206267 -0.000325791 0 -0.00159217 -0.000218869 0
+          -0.00187691 -0.00021848 0 -0.00240848 -0.00032233 0 -0.000865072 -7.34836e-05 0 -0.000396945 -3.47073e-05 0
+          -0.00101306 -7.30253e-05 0 -0.000471716 -3.49506e-05 0 -0.00462599 -0.00109768 0 -0.00407243 -0.000726038 0
+          -0.00519793 -0.00104592 0 -0.00351242 -0.000578358 0 -0.00394799 -0.00055179 0 -0.00573585 -0.000974803 0
+          -0.004548 -0.000687275 0 -0.00499204 -0.000636008 0 -0.0043578 -0.000515009 0 -0.00215679 -0.00021349 0
+          -0.0027459 -0.00031225 0 -0.00242612 -0.000204309 0 -0.00115779 -7.10776e-05 0 -0.000545623 -3.44617e-05 0
+          -0.000617134 -3.33012e-05 0 -0.0030682 -0.000296169 0 -0.00267974 -0.000191348 0 -0.00336933 -0.000274704 0
+          -0.00129636 -6.77731e-05 0 -0.000684861 -3.15302e-05 0 -0.00142616 -6.32457e-05 0 -0.00730406 -0.00730406 0
+          -0.0080108 -0.00666315 0 -0.00781592 -0.00642822 0 -0.00853531 -0.00579779 0 -0.00805644 -0.00673066 0
+          -0.00862179 -0.00592431 0 -0.00825772 -0.00544737 0 -0.00898214 -0.00483865 0 -0.00862237 -0.00437996 0
+          -0.0091099 -0.00502118 0 -0.00951291 -0.00403828 0 -0.00868686 -0.00607761 0 -0.00866689 -0.00610557 0
+          -0.00927578 -0.00537487 0 -0.00925635 -0.00528908 0 -0.00920492 -0.00544943 0 -0.00911698 -0.00544008 0
+          -0.00980905 -0.00474319 0 -0.00975815 -0.00478979 0 -0.0098016 -0.00455636 0 -0.00974162 -0.00441498 0
+          -0.0102359 -0.00366545 0 -0.0103239 -0.00396022 0 -0.010312 -0.00406126 0 -0.0107695 -0.0032682 0
+          -0.00890414 -0.00324447 0 -0.00934415 -0.00380323 0 -0.0096157 -0.00270903 0 -0.0098245 -0.0029926 0
+          -0.00909868 -0.00205936 0 -0.00979263 -0.00157356 0 -0.00920305 -0.000843099 0 -0.00987226 -0.00041435 0
+          -0.0100399 -0.00190115 0 -0.0101557 -0.000780942 0 -0.0101349 -0.00347128 0 -0.0105718 -0.00271757 0
+          -0.0104301 -0.00247393 0 -0.0107414 -0.00311481 0 -0.0111235 -0.00242433 0 -0.0110549 -0.00222127 0
+          -0.0106227 -0.00143891 0 -0.0108042 -0.00172813 0 -0.0109295 -0.000712545 0 -0.0107097 -0.000382164 0
+          -0.0112596 -0.00129389 0 -0.0113686 -0.0015434 0 -0.0113525 -0.00034699 0 -0.0115011 -0.000639118 0
+          -0.00954611 -0.00479032 0 -0.00938827 -0.00474681 0 -0.0101733 -0.00417031 0 -0.0100492 -0.00418019 0
+          -0.00969152 -0.00411331 0 -0.0103288 -0.00358176 0 -0.0107079 -0.00348283 0 -0.0106201 -0.00354528 0
+          -0.0110919 -0.00285404 0 -0.0108723 -0.00299225 0 -0.00946233 -0.0040398 0 -0.00962229 -0.00343279 0
+          -0.010129 -0.00355839 0 -0.0102557 -0.00299003 0 -0.00932074 -0.00333446 0 -0.00997811 -0.00293794 0
+          -0.0107051 -0.00301885 0 -0.0107959 -0.00249889 0 -0.0111813 -0.00243135 0 -0.0105462 -0.00249343 0
+          -0.0110159 -0.00200931 0 -0.0111415 -0.00274045 0 -0.0114571 -0.00211844 0 -0.0114672 -0.00195571 0
+          -0.0113131 -0.00235558 0 -0.0116444 -0.00168251 0 -0.0116802 -0.0011412 0 -0.0117101 -0.00135045 0
+          -0.0117771 -0.000309456 0 -0.0118472 -0.000562029 0 -0.0118613 -0.000983811 0 -0.0119602 -0.000270269 0
+          -0.01155 -0.00180605 0 -0.0112342 -0.00196836 0 -0.0115638 -0.00140742 0 -0.0113798 -0.00149395 0
+          -0.0118057 -0.00115315 0 -0.0117797 -0.000825039 0 -0.0119444 -0.000482801 0 -0.0118786 -0.000230215 0
+          -0.0116322 -0.000955761 0 -0.0117695 -0.000403117 0 -0.00921566 0.00038584 0 -0.00985338 0.000751095 0
+          -0.00913633 0.00160898 0 -0.0101703 0.000351005 0 -0.0100835 0.00147768 0 -0.00896625 0.00280785 0
+          -0.00973628 0.00190525 0 -0.00952273 0.0030306 0 -0.00989645 0.00258206 0 -0.0109459 0.00031375 0
+          -0.0106899 0.000680327 0 -0.010853 0.00133533 0 -0.0113321 0.00060513 0 -0.0115189 0.00027477 0
+          -0.0114218 0.00118453 0 -0.0105635 0.00173259 0 -0.0106524 0.00233677 0 -0.0103325 0.00275867 0
+          -0.0111987 0.00154816 0 -0.0112112 0.00207643 0 -0.0109544 0.00246778 0 -0.008708 0.00396396 0
+          -0.00921597 0.00410961 0 -0.00836555 0.00505884 0 -0.00882074 0.00512477 0 -0.00961212 0.00364713 0
+          -0.00923482 0.00465587 0 -0.00794424 0.006074 0 -0.00834325 0.00605853 0 -0.00745081 0.00699095 0
+          -0.00877046 0.00559124 0 -0.00822645 0.00643621 0 -0.0100003 0.00374256 0 -0.010347 0.00330264 0
+          -0.00994147 0.00421749 0 -0.00957213 0.00466831 0 -0.0106028 0.00334968 0 -0.0108904 0.00293671 0
+          -0.0101495 0.00417954 0 -0.0104642 0.00375165 0 -0.00944224 0.0050659 0 -0.00905466 0.00551992 0
+          -0.00885724 0.00583241 0 -0.00960147 0.00494303 0 -0.00993938 0.00450748 0 -0.00932423 0.00519046 0
+          -0.0117565 0.000526937 0 -0.0118661 0.000234838 0 -0.0117666 0.00102818 0 -0.0119399 0.000447337 0
+          -0.0116187 0.00135541 0 -0.0115503 0.00180601 0 -0.0113659 0.0021634 0 -0.0118006 0.00115822 0
+          -0.0115443 0.0018516 0 -0.011964 0.000194802 0 -0.011859 0.000368071 0 -0.0118643 0.00086948 0
+          -0.0117894 0.000155586 0 -0.0116917 0.000711953 0 -0.0116467 0.00153105 0 -0.0117211 0.000960827 0
+          -0.0114672 0.00153906 0 -0.0114779 0.00125759 0 -0.0110017 0.00293832 0 -0.0112203 0.00255636 0
+          -0.0105319 0.0036676 0 -0.0107818 0.00326723 0 -0.011175 0.00251668 0 -0.0106985 0.00314268 0
+          -0.00996387 0.00433864 0 -0.0102417 0.00392664 0 -0.00960844 0.0045226 0 -0.010122 0.00371879 0
+          -0.0113146 0.00216932 0 -0.011101 0.00209378 0 -0.010873 0.00277409 0 -0.0106282 0.00261599 0
+          -0.0111511 0.00178409 0 -0.0107165 0.00228305 0 -0.0103289 0.00333519 0 -0.0100562 0.00309668 0
+          -0.0096909 0.00384239 0 -0.0101809 0.00274607 0 -0.00955262 0.00316474 0 -0.00931954 -0.00276446 0
+          -0.0089451 -0.00264759 0 -0.00957663 -0.00233361 0 -0.00993365 -0.00240876 0 -0.00876443 -0.00212535 0
+          -0.00831701 -0.00199737 0 -0.00934265 -0.00185277 0 -0.0089049 -0.00176138 0 -0.0101225 -0.00198151 0
+          -0.0104575 -0.0020141 0 -0.0105739 -0.00159794 0 -0.00983598 -0.00155022 0 -0.00941315 -0.00149662 0
+          -0.00983359 -0.00120809 0 -0.00793813 -0.00153384 0 -0.00741811 -0.00140336 0 -0.00846258 -0.00133801 0
+          -0.00794323 -0.00123845 0 -0.0068218 -0.00100961 0 -0.00727337 -0.000881595 0 -0.00891017 -0.00112054 0
+          -0.00839734 -0.00105331 0 -0.00877314 -0.000851449 0 -0.0076589 -0.000739328 0 -0.0108827 -0.00158769 0
+          -0.0109238 -0.00118953 0 -0.0112026 -0.00113675 0 -0.0102365 -0.00122323 0 -0.0101596 -0.000900794 0
+          -0.0105381 -0.000877347 0 -0.0114123 -0.000668495 0 -0.0111667 -0.000762941 0 -0.0112991 -0.000324817 0
+          -0.0115087 -0.00019016 0 -0.010736 -0.000518107 0 -0.0103862 -0.000579727 0 -0.0108273 -0.000151053 0
+          -0.0105099 -0.000249899 0 -0.00927374 -0.000885411 0 -0.00906472 -0.000636361 0 -0.00954764 -0.000636608 0
+          -0.00797224 -0.000585413 0 -0.0082085 -0.00042246 0 -0.00972765 -0.000378117 0 -0.00926758 -0.000411551 0
+          -0.00981106 -0.000113925 0 -0.00937865 -0.000180523 0 -0.00836406 -0.00025308 0 -0.00843656 -7.98878e-05 0
+          -0.00623003 -0.000886509 0 -0.00539666 -0.000573699 0 -0.00667196 -0.000783234 0 -0.00575496 -0.000501814 0
+          -0.00473445 -0.000469156 0 -0.00507143 -0.000415378 0 -0.00705427 -0.000667171 0 -0.00606104 -0.000421818 0
+          -0.00737082 -0.000540517 0 -0.00536314 -0.000354823 0 -0.00560488 -0.00028864 0 -0.00364393 -0.000248474 0
+          -0.00291306 -0.000175021 0 -0.00312203 -0.000155741 0 -0.00388732 -0.000218102 0 -0.00154487 -5.76303e-05 0
+          -0.000747564 -2.92106e-05 0 -0.00165043 -5.10626e-05 0 -0.000804147 -2.64048e-05 0 -0.00330319 -0.000133927 0
+          -0.00409548 -0.000184212 0 -0.0034536 -0.000109993 0 -0.00174113 -4.36789e-05 0 -0.000853661 -2.31758e-05 0
+          -0.000895302 -1.95867e-05 0 -0.00761662 -0.000405472 0 -0.00631002 -0.000335182 0 -0.00649801 -0.000243376 0
+          -0.00579284 -0.000217981 0 -0.00778789 -0.000264236 0 -0.00662213 -0.00014787 0 -0.00788203 -0.000119011 0
+          -0.00668049 -5.01401e-05 0 -0.00592413 -0.000143998 0 -0.00599675 -6.78442e-05 0 -0.0042651 -0.000147427 0
+          -0.00357091 -8.43601e-05 0 -0.00439351 -0.000108372 0 -0.00181549 -3.56163e-05 0 -0.000928412 -1.57015e-05 0
+          -0.00187235 -2.70123e-05 0 -0.00447876 -6.76762e-05 0 -0.00365331 -5.74457e-05 0 -0.00369955 -2.967e-05 0
+          -0.00451955 -2.59652e-05 0 -0.00191085 -1.80052e-05 0 -0.00095248 -1.15842e-05 0 -0.00193039 -8.73361e-06 0
+          -0.000967139 -7.29936e-06 0 -0.0113188 0.000118189 0 -0.0114903 0.000291033 0 -0.0112256 0.00055942 0
+          -0.0108106 0.00021827 0 -0.0105288 8.36833e-05 0 -0.0104428 0.000416009 0 -0.0113574 0.000767855 0
+          -0.0110209 0.000992219 0 -0.0111119 0.00123308 0 -0.0106862 0.000584316 0 -0.010253 0.000742067 0
+          -0.0104559 0.000941536 0 -0.0097966 0.000151978 0 -0.00939625 5.32145e-05 0 -0.00932013 0.000286154 0
+          -0.00842491 9.45033e-05 0 -0.00968452 0.000415599 0 -0.00915143 0.000514783 0 -0.00947649 0.000672945 0
+          -0.00832931 0.000267476 0 -0.00815119 0.000436413 0 -0.0107577 0.00167946 0 -0.0107078 0.00140993 0
+          -0.0102911 0.00180588 0 -0.0103001 0.00209977 0 -0.0101232 0.00128438 0 -0.00996233 0.00105684 0
+          -0.00969328 0.00160729 0 -0.0095753 0.00135532 0 -0.00977728 0.00217341 0 -0.00974641 0.00248677 0
+          -0.00917461 0.00250585 0 -0.0091729 0.00190471 0 -0.00909793 0.00163247 0 -0.00853784 0.00188329 0
+          -0.00917568 0.00092002 0 -0.00889272 0.000735591 0 -0.00878675 0.00115282 0 -0.00854798 0.000945061 0
+          -0.00789327 0.000598693 0 -0.00755952 0.000751695 0 -0.00831579 0.00136736 0 -0.00812257 0.00113968 0
+          -0.0076233 0.00131591 0 -0.0071552 0.000892792 0 -0.00789763 2.79992e-05 0 -0.00667224 4.83408e-05 0
+          -0.00783445 0.000174589 0 -0.00600963 9.32444e-06 0 -0.00596256 8.63522e-05 0 -0.00769346 0.000318551 0
+          -0.00659749 0.000146096 0 -0.00645738 0.000241649 0 -0.00585627 0.000162082 0 -0.00370892 -1.45379e-06 0
+          -0.00451527 1.61319e-05 0 -0.0036813 2.67814e-05 0 -0.0019307 6.63222e-07 0 -0.000972169 -2.91192e-06 0
+          -0.000967495 1.51286e-06 0 -0.00446599 5.79855e-05 0 -0.00361711 5.46132e-05 0 -0.00437246 9.89653e-05 0
+          -0.00191175 1.00455e-05 0 -0.00095319 5.9093e-06 0 -0.00187385 1.9273e-05 0 -0.00747679 0.000457677 0
+          -0.00625404 0.00033352 0 -0.00718777 0.000589756 0 -0.00599062 0.000420228 0 -0.00569237 0.000235354 0
+          -0.00547337 0.000305008 0 -0.00683092 0.000712575 0 -0.00567125 0.000500291 0 -0.00641193 0.000823918 0
+          -0.0052027 0.000369883 0 -0.00488468 0.000428813 0 -0.00423611 0.000138439 0 -0.00351731 8.16182e-05 0
+          -0.00338346 0.000107372 0 -0.00405904 0.000175775 0 -0.00181757 2.82047e-05 0 -0.00092947 1.02113e-05 0
+          -0.00174378 3.6699e-05 0 -0.000896697 1.43525e-05 0 -0.00321762 0.000131449 0 -0.00384403 0.000210337 0
+          -0.00302245 0.000153423 0 -0.00165364 4.46137e-05 0 -0.000855381 1.82658e-05 0 -0.000806175 2.18838e-05 0
+          -0.00689336 0.0077912 0 -0.0077912 0.00689336 0 -0.00717376 0.00761173 0 -0.00761173 0.00717376 0
+          -0.00628141 0.00845624 0 -0.00650159 0.00819609 0 -0.00562582 0.00896758 0 -0.00578683 0.00862888 0
+          -0.00693678 0.00778683 0 -0.00621359 0.00825838 0 -0.00845624 0.00628141 0 -0.00819609 0.00650159 0
+          -0.00778683 0.00693678 0 -0.00896758 0.00562582 0 -0.00862888 0.00578683 0 -0.00825838 0.00621359 0
+          -0.00705797 0.00747004 0 -0.00747004 0.00705797 0 -0.00669199 0.00748609 0 -0.00628282 0.00786517 0
+          -0.00748609 0.00669199 0 -0.00786517 0.00628282 0 -0.00666465 0.00704668 0 -0.00704668 0.00666465 0
+          -0.00493887 0.00930671 0 -0.0050431 0.00889254 0 -0.00423421 0.00945509 0 -0.00545569 0.00857135 0
+          -0.00467813 0.00870867 0 -0.00352685 0.00939421 0 -0.00428551 0.0089695 0 -0.00353063 0.00884217 0
+          -0.00389748 0.00865327 0 -0.0058765 0.00777048 0 -0.00547615 0.00810616 0 -0.00503975 0.00789566 0
+          -0.00580972 0.00726328 0 -0.00618869 0.00691855 0 -0.00530823 0.00703072 0 -0.00465433 0.00817698 0
+          -0.00419956 0.00784613 0 -0.00383534 0.00806159 0 -0.00493862 0.00732742 0 -0.00442405 0.00698734 0
+          -0.00407041 0.00722473 0 -0.00930671 0.00493887 0 -0.00889254 0.0050431 0 -0.00857135 0.00545569 0
+          -0.00945509 0.00423421 0 -0.00870867 0.00467813 0 -0.00777048 0.0058765 0 -0.00810616 0.00547615 0
+          -0.00691855 0.00618869 0 -0.00726328 0.00580972 0 -0.00789566 0.00503975 0 -0.00703072 0.00530823 0
+          -0.0089695 0.00428551 0 -0.00939421 0.00352685 0 -0.00865327 0.00389748 0 -0.00884217 0.00353063 0
+          -0.00817698 0.00465433 0 -0.00784613 0.00419956 0 -0.00732742 0.00493862 0 -0.00698734 0.00442405 0
+          -0.00806159 0.00383534 0 -0.00722473 0.00407041 0 -0.00603179 0.00637963 0 -0.00637963 0.00603179 0
+          -0.00547274 0.00613032 0 -0.00613032 0.00547274 0 -0.00512816 0.00643669 0 -0.00456192 0.00609325 0
+          -0.00422742 0.00634721 0 -0.0052127 0.00552243 0 -0.00429791 0.00544642 0 -0.00643669 0.00512816 0
+          -0.00609325 0.00456192 0 -0.00552243 0.0052127 0 -0.00634721 0.00422742 0 -0.00544642 0.00429791 0
+          -0.0046041 0.00518197 0 -0.00518197 0.0046041 0 -0.0042734 0.00454153 0 -0.00454153 0.0042734 0
+          -0.00283321 0.00910551 0 -0.00279653 0.00849296 0 -0.00217108 0.00857043 0 -0.00210273 0.00790423 0
+          -0.00313184 0.00838804 0 -0.00240082 0.00789586 0 -0.00155961 0.00777039 0 -0.00147025 0.00705836 0
+          -0.00101936 0.00668682 0 -0.00172558 0.00715962 0 -0.00112876 0.00616213 0 -0.00303875 0.00774391 0
+          -0.0033754 0.00760637 0 -0.00258838 0.00716084 0 -0.00228576 0.00720787 0 -0.00322584 0.00694077 0
+          -0.00355663 0.00677459 0 -0.00242735 0.00646112 0 -0.00272816 0.00637859 0 -0.00186124 0.00649398 0
+          -0.00159915 0.00643736 0 -0.00121836 0.0055902 0 -0.00169908 0.0057713 0 -0.00196258 0.00578547 0
+          -0.00128551 0.00498131 0 -0.000572223 0.00530108 0 -0.000921566 0.00593768 0 -0.000480632 0.00452452 0
+          -0.000634536 0.00488624 0 -0.000241491 0.00359455 0 -0.000172864 0.00280116 0 -5.18053e-05 0.00154858 0
+          -2.51383e-05 0.000749877 0 -0.000268596 0.00331472 0 -5.81297e-05 0.00143036 0 -0.00100329 0.00541623 0
+          -0.000685736 0.00443388 0 -0.00052417 0.00412834 0 -0.00106687 0.00485683 0 -0.000724327 0.00395215 0
+          -0.000558251 0.00370317 0 -0.000189342 0.00255748 0 -0.000291013 0.00300938 0 -6.34414e-05 0.00130099 0
+          -2.79608e-05 0.000687434 0 -0.000202423 0.00229574 0 -0.000308095 0.00268399 0 -3.02815e-05 0.000619934 0
+          -6.75931e-05 0.00116279 0 -0.00335109 0.00609851 0 -0.00366825 0.00590852 0 -0.00252244 0.0056779 0
+          -0.00281458 0.005564 0 -0.00340779 0.00523383 0 -0.00256596 0.00487372 0 -0.0017665 0.00507262 0
+          -0.00202555 0.00504756 0 -0.00132757 0.00434703 0 -0.00179784 0.00435512 0 -0.00370296 0.00502569 0
+          -0.0033892 0.00436509 0 -0.00284202 0.00473355 0 -0.00255284 0.00406566 0 -0.00365345 0.00414538 0
+          -0.00280486 0.00390534 0 -0.00204612 0.00429518 0 -0.00178954 0.00363405 0 -0.00134186 0.00370018 0
+          -0.00202021 0.0035447 0 -0.00132572 0.00305484 0 -0.00111007 0.0042699 0 -0.000748803 0.00345018 0
+          -0.000581696 0.00325691 0 -0.00113064 0.00366704 0 -0.000593317 0.00279839 0 -0.000211671 0.00202079 0
+          -0.000319196 0.00234473 0 -3.203e-05 0.000548611 0 -7.04357e-05 0.00101836 0 -0.000216643 0.00173806 0
+          -3.31344e-05 0.000474847 0 -0.000757653 0.00293811 0 -0.00112631 0.00306103 0 -0.000591919 0.0023373 0
+          -0.000749351 0.00242708 0 -0.000323658 0.00199845 0 -0.000216894 0.0014535 0 -7.18175e-05 0.000870599 0
+          -3.35214e-05 0.000400163 0 -0.000320819 0.00165264 0 -7.15834e-05 0.000722675 0 -0.00910551 0.00283321 0
+          -0.00849296 0.00279653 0 -0.00838804 0.00313184 0 -0.00857043 0.00217108 0 -0.00790423 0.00210273 0
+          -0.00789586 0.00240082 0 -0.00760637 0.0033754 0 -0.00774391 0.00303875 0 -0.00694077 0.00322584 0
+          -0.00677459 0.00355663 0 -0.00716084 0.00258838 0 -0.00720787 0.00228576 0 -0.00637859 0.00272816 0
+          -0.00646112 0.00242735 0 -0.00777039 0.00155961 0 -0.00705836 0.00147025 0 -0.00715962 0.00172558 0
+          -0.00668682 0.00101936 0 -0.00616213 0.00112876 0 -0.00649398 0.00186124 0 -0.00643736 0.00159915 0
+          -0.00578547 0.00196258 0 -0.0057713 0.00169908 0 -0.0055902 0.00121836 0 -0.00498131 0.00128551 0
+          -0.00609851 0.00335109 0 -0.00590852 0.00366825 0 -0.00523383 0.00340779 0 -0.005564 0.00281458 0
+          -0.0056779 0.00252244 0 -0.00487372 0.00256596 0 -0.00502569 0.00370296 0 -0.00436509 0.0033892 0
+          -0.00414538 0.00365345 0 -0.00473355 0.00284202 0 -0.00406566 0.00255284 0 -0.00390534 0.00280486 0
+          -0.00504756 0.00202555 0 -0.00507262 0.0017665 0 -0.00435512 0.00179784 0 -0.00434703 0.00132757 0
+          -0.00429518 0.00204612 0 -0.00363405 0.00178954 0 -0.0035447 0.00202021 0 -0.00370018 0.00134186 0
+          -0.00305484 0.00132572 0 -0.00593768 0.000921566 0 -0.00530108 0.000572223 0 -0.00488624 0.000634536 0
+          -0.00452452 0.000480632 0 -0.00541623 0.00100329 0 -0.00443388 0.000685736 0 -0.00485683 0.00106687 0
+          -0.00395215 0.000724327 0 -0.00412834 0.00052417 0 -0.00370317 0.000558251 0 -0.00359455 0.000241491 0
+          -0.00280116 0.000172864 0 -0.00331472 0.000268596 0 -0.00154858 5.18053e-05 0 -0.000749877 2.51383e-05 0
+          -0.00143036 5.81297e-05 0 -0.00300938 0.000291013 0 -0.00255748 0.000189342 0 -0.00229574 0.000202423 0
+          -0.00268399 0.000308095 0 -0.00130099 6.34414e-05 0 -0.000687434 2.79608e-05 0 -0.00116279 6.75931e-05 0
+          -0.000619934 3.02815e-05 0 -0.0042699 0.00111007 0 -0.00345018 0.000748803 0 -0.00366704 0.00113064 0
+          -0.00325691 0.000581696 0 -0.00279839 0.000593317 0 -0.00306103 0.00112631 0 -0.00293811 0.000757653 0
+          -0.00242708 0.000749351 0 -0.0023373 0.000591919 0 -0.00202079 0.000211671 0 -0.00234473 0.000319196 0
+          -0.00173806 0.000216643 0 -0.00101836 7.04357e-05 0 -0.000548611 3.203e-05 0 -0.000474847 3.31344e-05 0
+          -0.00199845 0.000323658 0 -0.0014535 0.000216894 0 -0.00165264 0.000320819 0 -0.000870599 7.18175e-05 0
+          -0.000400163 3.35214e-05 0 -0.000722675 7.15834e-05 0 -0.00328858 0.00351238 0 -0.00351238 0.00328858 0
+          -0.00269745 0.00309912 0 -0.00247797 0.00327238 0 -0.00309912 0.00269745 0 -0.00327238 0.00247797 0
+          -0.00233622 0.00251409 0 -0.00251409 0.00233622 0 -0.00194375 0.00281401 0 -0.00173801 0.00292602 0
+          -0.00127644 0.00242635 0 -0.00163961 0.00224907 0 -0.00181261 0.00212241 0 -0.0011913 0.00183131 0
+          -0.00281401 0.00194375 0 -0.00292602 0.00173801 0 -0.00212241 0.00181261 0 -0.00224907 0.00163961 0
+          -0.00242635 0.00127644 0 -0.00183131 0.0011913 0 -0.0014907 0.00162263 0 -0.00162263 0.0014907 0
+          -0.00106753 0.00128755 0 -0.00128755 0.00106753 0 -0.00109483 0.00246583 0 -0.000722357 0.0019292 0
+          -0.00057629 0.00188425 0 -0.00103388 0.00189658 0 -0.000675106 0.00145759 0 -0.000545204 0.00145073 0
+          -0.000211966 0.00117364 0 -0.000310005 0.00131548 0 -6.95735e-05 0.000578055 0 -3.31157e-05 0.000326228 0
+          -0.000201395 0.000905535 0 -0.000290527 0.00099584 0 -3.18388e-05 0.000254852 0 -6.56213e-05 0.000440486 0
+          -0.000941129 0.00136957 0 -0.000606001 0.00102637 0 -0.000497404 0.00104911 0 -0.000814198 0.000902294 0
+          -0.000431596 0.000692668 0 -0.000184695 0.000656799 0 -0.000261671 0.000703214 0 -2.96085e-05 0.00018799 0
+          -5.95506e-05 0.000313999 0 -0.000161359 0.00043558 0 -2.63365e-05 0.000127736 0 -0.00246583 0.00109483 0
+          -0.0019292 0.000722357 0 -0.00189658 0.00103388 0 -0.00145759 0.000675106 0 -0.00188425 0.00057629 0
+          -0.00145073 0.000545204 0 -0.00136957 0.000941129 0 -0.00102637 0.000606001 0 -0.000902294 0.000814198 0
+          -0.00104911 0.000497404 0 -0.000692668 0.000431596 0 -0.00131548 0.000310005 0 -0.00117364 0.000211966 0
+          -0.000905535 0.000201395 0 -0.00099584 0.000290527 0 -0.000578055 6.95735e-05 0 -0.000326228 3.31157e-05 0
+          -0.000440486 6.56213e-05 0 -0.000254852 3.18388e-05 0 -0.000656799 0.000184695 0 -0.000703214 0.000261671 0
+          -0.00043558 0.000161359 0 -0.000313999 5.95506e-05 0 -0.00018799 2.96085e-05 0 -0.000127736 2.63365e-05 0
+          -0.000513391 0.000650614 0 -0.000650614 0.000513391 0 -0.000346413 0.00039554 0 -0.00039554 0.000346413 0
+          -0.000222687 0.000447783 0 -0.000130832 0.000250564 0 -5.11693e-05 0.000202902 0 -2.19246e-05 7.63231e-05 0
+          -0.000172763 0.000240376 0 -4.02591e-05 0.000111783 0 -0.000447783 0.000222687 0 -0.000250564 0.000130832 0
+          -0.000240376 0.000172763 0 -0.000202902 5.11693e-05 0 -7.63231e-05 2.19246e-05 0 -0.000111783 4.02591e-05 0
+          -9.2482e-05 0.000110968 0 -0.000110968 9.2482e-05 0 -2.65498e-05 4.54986e-05 0 -1.62578e-05 3.61246e-05 0
+          -4.54986e-05 2.65498e-05 0 -3.61246e-05 1.62578e-05 0 -9.18595e-06 9.64829e-06 0 -9.64829e-06 9.18595e-06 0
+        </DataArray>
+        <DataArray type="Float32" Name="rank" NumberOfComponents="1" format="ascii">
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0 0 0 0 0
+          0 0 0 0 0 0 0 0
+        </DataArray>
+      </CellData>
+      <Points>
+        <DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii">
+          0.025 0.025 0 0.025 0 0 0 0 0 0 0.025 0
+          0.05 0.025 0 0.025 0.05 0 0.05 0 0 0.075 0.025 0
+          0.075 0 0 0.05 0.05 0 0.075 0.05 0 0 0.05 0
+          0.025 0.075 0 0 0.075 0 0.05 0.075 0 0.075 0.075 0
+          0.1 0.025 0 0.1 0 0 0.125 0.025 0 0.125 0 0
+          0.1 0.05 0 0.125 0.05 0 0.15 0.025 0 0.15 0 0
+          0.175 0.025 0 0.15 0.05 0 0.1 0.075 0 0.125 0.075 0
+          0.15 0.075 0 0.175 0.05 0 0.175 0.075 0 0 0.1 0
+          0.025 0.1 0 0.05 0.1 0 0.025 0.125 0 0 0.125 0
+          0.05 0.125 0 0.075 0.1 0 0.075 0.125 0 0.025 0.15 0
+          0 0.15 0 0.05 0.15 0 0.025 0.175 0 0.075 0.15 0
+          0.05 0.175 0 0.075 0.175 0 0.1 0.1 0 0.125 0.1 0
+          0.1 0.125 0 0.125 0.125 0 0.15 0.1 0 0.175 0.1 0
+          0.15 0.125 0 0.175 0.125 0 0.1 0.15 0 0.125 0.15 0
+          0.1 0.175 0 0.125 0.175 0 0.15 0.15 0 0.175 0.15 0
+          0.15 0.175 0 0.175 0 0 0.2 0.025 0 0.2 0 0
+          0.2 0.05 0 0.225 0.025 0 0.225 0 0 0.25 0.025 0
+          0.25 0 0 0.225 0.05 0 0.25 0.05 0 0.2 0.075 0
+          0.225 0.075 0 0.25 0.075 0 0.275 0.025 0 0.275 0 0
+          0.3 0.025 0 0.275 0.05 0 0.3 0 0 0.325 0.025 0
+          0.325 0 0 0.3 0.05 0 0.325 0.05 0 0.275 0.075 0
+          0.3 0.075 0 0.325 0.075 0 0.2 0.1 0 0.2 0.125 0
+          0.225 0.1 0 0.25 0.1 0 0.225 0.125 0 0.25 0.125 0
+          0.2 0.15 0 0.175 0.175 0 0.2 0.175 0 0.225 0.15 0
+          0.25 0.15 0 0.225 0.175 0 0.25 0.175 0 0.275 0.1 0
+          0.3 0.1 0 0.275 0.125 0 0.3 0.125 0 0.325 0.1 0
+          0.325 0.125 0 0.275 0.15 0 0.3 0.15 0 0.275 0.175 0
+          0.325 0.15 0 0.3 0.175 0 0.325 0.175 0 0 0.175 0
+          0.025 0.2 0 0 0.2 0 0.05 0.2 0 0.075 0.2 0
+          0 0.225 0 0.025 0.225 0 0.05 0.225 0 0.025 0.25 0
+          0 0.25 0 0.05 0.25 0 0.075 0.225 0 0.075 0.25 0
+          0.1 0.2 0 0.125 0.2 0 0.15 0.2 0 0.175 0.2 0
+          0.1 0.225 0 0.125 0.225 0 0.1 0.25 0 0.125 0.25 0
+          0.15 0.225 0 0.175 0.225 0 0.15 0.25 0 0.175 0.25 0
+          0.025 0.275 0 0 0.275 0 0.05 0.275 0 0.025 0.3 0
+          0.075 0.275 0 0.05 0.3 0 0.075 0.3 0 0 0.3 0
+          0.025 0.325 0 0 0.325 0 0.05 0.325 0 0.075 0.325 0
+          0.1 0.275 0 0.125 0.275 0 0.1 0.3 0 0.125 0.3 0
+          0.15 0.275 0 0.175 0.275 0 0.15 0.3 0 0.1 0.325 0
+          0.125 0.325 0 0.15 0.325 0 0.175 0.3 0 0.175 0.325 0
+          0.2 0.2 0 0.225 0.2 0 0.25 0.2 0 0.2 0.225 0
+          0.2 0.25 0 0.225 0.225 0 0.25 0.225 0 0.225 0.25 0
+          0.25 0.25 0 0.275 0.2 0 0.3 0.2 0 0.325 0.2 0
+          0.275 0.225 0 0.3 0.225 0 0.275 0.25 0 0.3 0.25 0
+          0.325 0.225 0 0.325 0.25 0 0.2 0.275 0 0.2 0.3 0
+          0.225 0.275 0 0.25 0.275 0 0.225 0.3 0 0.25 0.3 0
+          0.2 0.325 0 0.225 0.325 0 0.25 0.325 0 0.275 0.275 0
+          0.3 0.275 0 0.275 0.3 0 0.325 0.275 0 0.3 0.3 0
+          0.325 0.3 0 0.275 0.325 0 0.3 0.325 0 0.325 0.325 0
+          0.35 0.025 0 0.35 0 0 0.375 0.025 0 0.375 0 0
+          0.35 0.05 0 0.375 0.05 0 0.4 0.025 0 0.4 0 0
+          0.425 0.025 0 0.4 0.05 0 0.35 0.075 0 0.375 0.075 0
+          0.4 0.075 0 0.425 0.05 0 0.425 0.075 0 0.425 0 0
+          0.45 0.025 0 0.45 0 0 0.45 0.05 0 0.475 0.025 0
+          0.475 0 0 0.5 0.025 0 0.5 0 0 0.475 0.05 0
+          0.5 0.05 0 0.45 0.075 0 0.475 0.075 0 0.5 0.075 0
+          0.35 0.1 0 0.375 0.1 0 0.35 0.125 0 0.375 0.125 0
+          0.4 0.1 0 0.425 0.1 0 0.4 0.125 0 0.425 0.125 0
+          0.35 0.15 0 0.375 0.15 0 0.35 0.175 0 0.375 0.175 0
+          0.4 0.15 0 0.425 0.15 0 0.4 0.175 0 0.45 0.1 0
+          0.45 0.125 0 0.475 0.1 0 0.5 0.1 0 0.475 0.125 0
+          0.5 0.125 0 0.45 0.15 0 0.425 0.175 0 0.45 0.175 0
+          0.475 0.15 0 0.5 0.15 0 0.475 0.175 0 0.5 0.175 0
+          0.525 0.025 0 0.525 0 0 0.55 0.025 0 0.525 0.05 0
+          0.55 0 0 0.575 0.025 0 0.575 0 0 0.55 0.05 0
+          0.575 0.05 0 0.525 0.075 0 0.55 0.075 0 0.575 0.075 0
+          0.6 0.025 0 0.6 0 0 0.625 0.025 0 0.625 0 0
+          0.6 0.05 0 0.625 0.05 0 0.65 0.025 0 0.65 0 0
+          0.675 0.025 0 0.65 0.05 0 0.6 0.075 0 0.625 0.075 0
+          0.65 0.075 0 0.675 0.05 0 0.675 0.075 0 0.525 0.1 0
+          0.55 0.1 0 0.525 0.125 0 0.55 0.125 0 0.575 0.1 0
+          0.575 0.125 0 0.525 0.15 0 0.55 0.15 0 0.525 0.175 0
+          0.575 0.15 0 0.55 0.175 0 0.575 0.175 0 0.6 0.1 0
+          0.625 0.1 0 0.6 0.125 0 0.625 0.125 0 0.65 0.1 0
+          0.675 0.1 0 0.65 0.125 0 0.675 0.125 0 0.6 0.15 0
+          0.625 0.15 0 0.6 0.175 0 0.625 0.175 0 0.65 0.15 0
+          0.675 0.15 0 0.65 0.175 0 0.35 0.2 0 0.375 0.2 0
+          0.4 0.2 0 0.425 0.2 0 0.35 0.225 0 0.375 0.225 0
+          0.35 0.25 0 0.375 0.25 0 0.4 0.225 0 0.425 0.225 0
+          0.4 0.25 0 0.425 0.25 0 0.45 0.2 0 0.475 0.2 0
+          0.5 0.2 0 0.45 0.225 0 0.45 0.25 0 0.475 0.225 0
+          0.5 0.225 0 0.475 0.25 0 0.5 0.25 0 0.35 0.275 0
+          0.375 0.275 0 0.35 0.3 0 0.375 0.3 0 0.4 0.275 0
+          0.425 0.275 0 0.4 0.3 0 0.35 0.325 0 0.375 0.325 0
+          0.4 0.325 0 0.425 0.3 0 0.425 0.325 0 0.45 0.275 0
+          0.45 0.3 0 0.475 0.275 0 0.5 0.275 0 0.475 0.3 0
+          0.5 0.3 0 0.45 0.325 0 0.475 0.325 0 0.5 0.325 0
+          0.525 0.2 0 0.55 0.2 0 0.575 0.2 0 0.525 0.225 0
+          0.55 0.225 0 0.525 0.25 0 0.55 0.25 0 0.575 0.225 0
+          0.575 0.25 0 0.6 0.2 0 0.625 0.2 0 0.65 0.2 0
+          0.675 0.175 0 0.675 0.2 0 0.6 0.225 0 0.625 0.225 0
+          0.6 0.25 0 0.625 0.25 0 0.65 0.225 0 0.675 0.225 0
+          0.65 0.25 0 0.675 0.25 0 0.525 0.275 0 0.55 0.275 0
+          0.525 0.3 0 0.575 0.275 0 0.55 0.3 0 0.575 0.3 0
+          0.525 0.325 0 0.55 0.325 0 0.575 0.325 0 0.6 0.275 0
+          0.625 0.275 0 0.6 0.3 0 0.625 0.3 0 0.65 0.275 0
+          0.675 0.275 0 0.65 0.3 0 0.6 0.325 0 0.625 0.325 0
+          0.65 0.325 0 0.675 0.3 0 0.675 0.325 0 0 0.35 0
+          0.025 0.35 0 0.05 0.35 0 0.025 0.375 0 0 0.375 0
+          0.05 0.375 0 0.075 0.35 0 0.075 0.375 0 0.025 0.4 0
+          0 0.4 0 0.05 0.4 0 0.025 0.425 0 0.075 0.4 0
+          0.05 0.425 0 0.075 0.425 0 0.1 0.35 0 0.125 0.35 0
+          0.1 0.375 0 0.125 0.375 0 0.15 0.35 0 0.175 0.35 0
+          0.15 0.375 0 0.175 0.375 0 0.1 0.4 0 0.125 0.4 0
+          0.1 0.425 0 0.125 0.425 0 0.15 0.4 0 0.175 0.4 0
+          0.15 0.425 0 0 0.425 0 0.025 0.45 0 0 0.45 0
+          0.05 0.45 0 0.075 0.45 0 0 0.475 0 0.025 0.475 0
+          0.05 0.475 0 0.025 0.5 0 0 0.5 0 0.05 0.5 0
+          0.075 0.475 0 0.075 0.5 0 0.1 0.45 0 0.125 0.45 0
+          0.15 0.45 0 0.175 0.425 0 0.175 0.45 0 0.1 0.475 0
+          0.125 0.475 0 0.1 0.5 0 0.125 0.5 0 0.15 0.475 0
+          0.175 0.475 0 0.15 0.5 0 0.175 0.5 0 0.2 0.35 0
+          0.2 0.375 0 0.225 0.35 0 0.25 0.35 0 0.225 0.375 0
+          0.25 0.375 0 0.2 0.4 0 0.2 0.425 0 0.225 0.4 0
+          0.25 0.4 0 0.225 0.425 0 0.25 0.425 0 0.275 0.35 0
+          0.3 0.35 0 0.275 0.375 0 0.3 0.375 0 0.325 0.35 0
+          0.325 0.375 0 0.275 0.4 0 0.3 0.4 0 0.275 0.425 0
+          0.325 0.4 0 0.3 0.425 0 0.325 0.425 0 0.2 0.45 0
+          0.225 0.45 0 0.25 0.45 0 0.2 0.475 0 0.2 0.5 0
+          0.225 0.475 0 0.25 0.475 0 0.225 0.5 0 0.25 0.5 0
+          0.275 0.45 0 0.3 0.45 0 0.325 0.45 0 0.275 0.475 0
+          0.3 0.475 0 0.275 0.5 0 0.3 0.5 0 0.325 0.475 0
+          0.325 0.5 0 0.025 0.525 0 0 0.525 0 0.05 0.525 0
+          0.025 0.55 0 0.075 0.525 0 0.05 0.55 0 0.075 0.55 0
+          0 0.55 0 0.025 0.575 0 0 0.575 0 0.05 0.575 0
+          0.075 0.575 0 0.1 0.525 0 0.125 0.525 0 0.1 0.55 0
+          0.125 0.55 0 0.15 0.525 0 0.175 0.525 0 0.15 0.55 0
+          0.1 0.575 0 0.125 0.575 0 0.15 0.575 0 0.175 0.55 0
+          0.175 0.575 0 0 0.6 0 0.025 0.6 0 0.05 0.6 0
+          0.025 0.625 0 0 0.625 0 0.05 0.625 0 0.075 0.6 0
+          0.075 0.625 0 0.025 0.65 0 0 0.65 0 0.05 0.65 0
+          0.025 0.675 0 0.075 0.65 0 0.05 0.675 0 0.075 0.675 0
+          0.1 0.6 0 0.125 0.6 0 0.1 0.625 0 0.125 0.625 0
+          0.15 0.6 0 0.175 0.6 0 0.15 0.625 0 0.175 0.625 0
+          0.1 0.65 0 0.125 0.65 0 0.1 0.675 0 0.125 0.675 0
+          0.15 0.65 0 0.175 0.65 0 0.15 0.675 0 0.2 0.525 0
+          0.2 0.55 0 0.225 0.525 0 0.25 0.525 0 0.225 0.55 0
+          0.25 0.55 0 0.2 0.575 0 0.225 0.575 0 0.25 0.575 0
+          0.275 0.525 0 0.3 0.525 0 0.275 0.55 0 0.325 0.525 0
+          0.3 0.55 0 0.325 0.55 0 0.275 0.575 0 0.3 0.575 0
+          0.325 0.575 0 0.2 0.6 0 0.2 0.625 0 0.225 0.6 0
+          0.25 0.6 0 0.225 0.625 0 0.25 0.625 0 0.2 0.65 0
+          0.175 0.675 0 0.2 0.675 0 0.225 0.65 0 0.25 0.65 0
+          0.225 0.675 0 0.25 0.675 0 0.275 0.6 0 0.3 0.6 0
+          0.275 0.625 0 0.3 0.625 0 0.325 0.6 0 0.325 0.625 0
+          0.275 0.65 0 0.3 0.65 0 0.275 0.675 0 0.325 0.65 0
+          0.3 0.675 0 0.325 0.675 0 0.35 0.35 0 0.375 0.35 0
+          0.35 0.375 0 0.375 0.375 0 0.4 0.35 0 0.425 0.35 0
+          0.4 0.375 0 0.425 0.375 0 0.35 0.4 0 0.375 0.4 0
+          0.35 0.425 0 0.375 0.425 0 0.4 0.4 0 0.425 0.4 0
+          0.4 0.425 0 0.45 0.35 0 0.45 0.375 0 0.475 0.35 0
+          0.5 0.35 0 0.475 0.375 0 0.5 0.375 0 0.45 0.4 0
+          0.425 0.425 0 0.45 0.425 0 0.475 0.4 0 0.5 0.4 0
+          0.475 0.425 0 0.5 0.425 0 0.35 0.45 0 0.375 0.45 0
+          0.4 0.45 0 0.425 0.45 0 0.35 0.475 0 0.375 0.475 0
+          0.35 0.5 0 0.375 0.5 0 0.4 0.475 0 0.425 0.475 0
+          0.4 0.5 0 0.425 0.5 0 0.45 0.45 0 0.475 0.45 0
+          0.5 0.45 0 0.45 0.475 0 0.45 0.5 0 0.475 0.475 0
+          0.5 0.475 0 0.475 0.5 0 0.5 0.5 0 0.525 0.35 0
+          0.55 0.35 0 0.525 0.375 0 0.55 0.375 0 0.575 0.35 0
+          0.575 0.375 0 0.525 0.4 0 0.55 0.4 0 0.525 0.425 0
+          0.575 0.4 0 0.55 0.425 0 0.575 0.425 0 0.6 0.35 0
+          0.625 0.35 0 0.6 0.375 0 0.625 0.375 0 0.65 0.35 0
+          0.675 0.35 0 0.65 0.375 0 0.675 0.375 0 0.6 0.4 0
+          0.625 0.4 0 0.6 0.425 0 0.625 0.425 0 0.65 0.4 0
+          0.675 0.4 0 0.65 0.425 0 0.525 0.45 0 0.55 0.45 0
+          0.575 0.45 0 0.525 0.475 0 0.55 0.475 0 0.525 0.5 0
+          0.55 0.5 0 0.575 0.475 0 0.575 0.5 0 0.6 0.45 0
+          0.625 0.45 0 0.65 0.45 0 0.675 0.425 0 0.675 0.45 0
+          0.6 0.475 0 0.625 0.475 0 0.6 0.5 0 0.625 0.5 0
+          0.65 0.475 0 0.675 0.475 0 0.65 0.5 0 0.675 0.5 0
+          0.35 0.525 0 0.375 0.525 0 0.35 0.55 0 0.375 0.55 0
+          0.4 0.525 0 0.425 0.525 0 0.4 0.55 0 0.35 0.575 0
+          0.375 0.575 0 0.4 0.575 0 0.425 0.55 0 0.425 0.575 0
+          0.45 0.525 0 0.45 0.55 0 0.475 0.525 0 0.5 0.525 0
+          0.475 0.55 0 0.5 0.55 0 0.45 0.575 0 0.475 0.575 0
+          0.5 0.575 0 0.35 0.6 0 0.375 0.6 0 0.35 0.625 0
+          0.375 0.625 0 0.4 0.6 0 0.425 0.6 0 0.4 0.625 0
+          0.425 0.625 0 0.35 0.65 0 0.375 0.65 0 0.35 0.675 0
+          0.375 0.675 0 0.4 0.65 0 0.425 0.65 0 0.4 0.675 0
+          0.45 0.6 0 0.45 0.625 0 0.475 0.6 0 0.5 0.6 0
+          0.475 0.625 0 0.5 0.625 0 0.45 0.65 0 0.425 0.675 0
+          0.45 0.675 0 0.475 0.65 0 0.5 0.65 0 0.475 0.675 0
+          0.5 0.675 0 0.525 0.525 0 0.55 0.525 0 0.525 0.55 0
+          0.575 0.525 0 0.55 0.55 0 0.575 0.55 0 0.525 0.575 0
+          0.55 0.575 0 0.575 0.575 0 0.6 0.525 0 0.625 0.525 0
+          0.6 0.55 0 0.625 0.55 0 0.65 0.525 0 0.675 0.525 0
+          0.65 0.55 0 0.6 0.575 0 0.625 0.575 0 0.65 0.575 0
+          0.675 0.55 0 0.675 0.575 0 0.525 0.6 0 0.55 0.6 0
+          0.525 0.625 0 0.55 0.625 0 0.575 0.6 0 0.575 0.625 0
+          0.525 0.65 0 0.55 0.65 0 0.525 0.675 0 0.575 0.65 0
+          0.55 0.675 0 0.575 0.675 0 0.6 0.6 0 0.625 0.6 0
+          0.6 0.625 0 0.625 0.625 0 0.65 0.6 0 0.675 0.6 0
+          0.65 0.625 0 0.675 0.625 0 0.6 0.65 0 0.625 0.65 0
+          0.6 0.675 0 0.625 0.675 0 0.65 0.65 0 0.675 0.65 0
+          0.65 0.675 0 0.675 0 0 0.7 0.025 0 0.7 0 0
+          0.7 0.05 0 0.725 0.025 0 0.725 0 0 0.75 0.025 0
+          0.75 0 0 0.725 0.05 0 0.75 0.05 0 0.7 0.075 0
+          0.725 0.075 0 0.75 0.075 0 0.775 0.025 0 0.775 0 0
+          0.8 0.025 0 0.775 0.05 0 0.8 0 0 0.825 0.025 0
+          0.825 0 0 0.8 0.05 0 0.825 0.05 0 0.775 0.075 0
+          0.8 0.075 0 0.825 0.075 0 0.7 0.1 0 0.7 0.125 0
+          0.725 0.1 0 0.75 0.1 0 0.725 0.125 0 0.75 0.125 0
+          0.7 0.15 0 0.7 0.175 0 0.725 0.15 0 0.75 0.15 0
+          0.725 0.175 0 0.75 0.175 0 0.775 0.1 0 0.8 0.1 0
+          0.775 0.125 0 0.8 0.125 0 0.825 0.1 0 0.825 0.125 0
+          0.775 0.15 0 0.8 0.15 0 0.775 0.175 0 0.825 0.15 0
+          0.8 0.175 0 0.825 0.175 0 0.85 0.025 0 0.85 0 0
+          0.875 0.025 0 0.875 0 0 0.85 0.05 0 0.875 0.05 0
+          0.9 0.025 0 0.9 0 0 0.925 0.025 0 0.9 0.05 0
+          0.85 0.075 0 0.875 0.075 0 0.9 0.075 0 0.925 0.05 0
+          0.925 0.075 0 0.925 0 0 0.95 0.025 0 0.95 0 0
+          0.95 0.05 0 0.975 0.025 0 0.975 0 0 1 0.025 0
+          1 0 0 0.975 0.05 0 1 0.05 0 0.95 0.075 0
+          0.975 0.075 0 1 0.075 0 0.85 0.1 0 0.875 0.1 0
+          0.85 0.125 0 0.875 0.125 0 0.9 0.1 0 0.925 0.1 0
+          0.9 0.125 0 0.925 0.125 0 0.85 0.15 0 0.875 0.15 0
+          0.85 0.175 0 0.875 0.175 0 0.9 0.15 0 0.925 0.15 0
+          0.9 0.175 0 0.95 0.1 0 0.95 0.125 0 0.975 0.1 0
+          1 0.1 0 0.975 0.125 0 1 0.125 0 0.95 0.15 0
+          0.925 0.175 0 0.95 0.175 0 0.975 0.15 0 1 0.15 0
+          0.975 0.175 0 1 0.175 0 0.7 0.2 0 0.725 0.2 0
+          0.75 0.2 0 0.7 0.225 0 0.7 0.25 0 0.725 0.225 0
+          0.75 0.225 0 0.725 0.25 0 0.75 0.25 0 0.775 0.2 0
+          0.8 0.2 0 0.825 0.2 0 0.775 0.225 0 0.8 0.225 0
+          0.775 0.25 0 0.8 0.25 0 0.825 0.225 0 0.825 0.25 0
+          0.7 0.275 0 0.7 0.3 0 0.725 0.275 0 0.75 0.275 0
+          0.725 0.3 0 0.75 0.3 0 0.7 0.325 0 0.725 0.325 0
+          0.75 0.325 0 0.775 0.275 0 0.8 0.275 0 0.775 0.3 0
+          0.825 0.275 0 0.8 0.3 0 0.825 0.3 0 0.775 0.325 0
+          0.8 0.325 0 0.825 0.325 0 0.85 0.2 0 0.875 0.2 0
+          0.9 0.2 0 0.925 0.2 0 0.85 0.225 0 0.875 0.225 0
+          0.85 0.25 0 0.875 0.25 0 0.9 0.225 0 0.925 0.225 0
+          0.9 0.25 0 0.925 0.25 0 0.95 0.2 0 0.975 0.2 0
+          1 0.2 0 0.95 0.225 0 0.95 0.25 0 0.975 0.225 0
+          1 0.225 0 0.975 0.25 0 1 0.25 0 0.85 0.275 0
+          0.875 0.275 0 0.85 0.3 0 0.875 0.3 0 0.9 0.275 0
+          0.925 0.275 0 0.9 0.3 0 0.85 0.325 0 0.875 0.325 0
+          0.9 0.325 0 0.925 0.3 0 0.925 0.325 0 0.95 0.275 0
+          0.95 0.3 0 0.975 0.275 0 1 0.275 0 0.975 0.3 0
+          1 0.3 0 0.95 0.325 0 0.975 0.325 0 1 0.325 0
+          0.7 0.35 0 0.7 0.375 0 0.725 0.35 0 0.75 0.35 0
+          0.725 0.375 0 0.75 0.375 0 0.7 0.4 0 0.7 0.425 0
+          0.725 0.4 0 0.75 0.4 0 0.725 0.425 0 0.75 0.425 0
+          0.775 0.35 0 0.8 0.35 0 0.775 0.375 0 0.8 0.375 0
+          0.825 0.35 0 0.825 0.375 0 0.775 0.4 0 0.8 0.4 0
+          0.775 0.425 0 0.825 0.4 0 0.8 0.425 0 0.825 0.425 0
+          0.7 0.45 0 0.725 0.45 0 0.75 0.45 0 0.7 0.475 0
+          0.7 0.5 0 0.725 0.475 0 0.75 0.475 0 0.725 0.5 0
+          0.75 0.5 0 0.775 0.45 0 0.8 0.45 0 0.825 0.45 0
+          0.775 0.475 0 0.8 0.475 0 0.775 0.5 0 0.8 0.5 0
+          0.825 0.475 0 0.825 0.5 0 0.85 0.35 0 0.875 0.35 0
+          0.85 0.375 0 0.875 0.375 0 0.9 0.35 0 0.925 0.35 0
+          0.9 0.375 0 0.925 0.375 0 0.85 0.4 0 0.875 0.4 0
+          0.85 0.425 0 0.875 0.425 0 0.9 0.4 0 0.925 0.4 0
+          0.9 0.425 0 0.95 0.35 0 0.95 0.375 0 0.975 0.35 0
+          1 0.35 0 0.975 0.375 0 1 0.375 0 0.95 0.4 0
+          0.925 0.425 0 0.95 0.425 0 0.975 0.4 0 1 0.4 0
+          0.975 0.425 0 1 0.425 0 0.85 0.45 0 0.875 0.45 0
+          0.9 0.45 0 0.925 0.45 0 0.85 0.475 0 0.875 0.475 0
+          0.85 0.5 0 0.875 0.5 0 0.9 0.475 0 0.925 0.475 0
+          0.9 0.5 0 0.925 0.5 0 0.95 0.45 0 0.975 0.45 0
+          1 0.45 0 0.95 0.475 0 0.95 0.5 0 0.975 0.475 0
+          1 0.475 0 0.975 0.5 0 1 0.5 0 0.7 0.525 0
+          0.7 0.55 0 0.725 0.525 0 0.75 0.525 0 0.725 0.55 0
+          0.75 0.55 0 0.7 0.575 0 0.725 0.575 0 0.75 0.575 0
+          0.775 0.525 0 0.8 0.525 0 0.775 0.55 0 0.825 0.525 0
+          0.8 0.55 0 0.825 0.55 0 0.775 0.575 0 0.8 0.575 0
+          0.825 0.575 0 0.7 0.6 0 0.7 0.625 0 0.725 0.6 0
+          0.75 0.6 0 0.725 0.625 0 0.75 0.625 0 0.7 0.65 0
+          0.675 0.675 0 0.7 0.675 0 0.725 0.65 0 0.75 0.65 0
+          0.725 0.675 0 0.75 0.675 0 0.775 0.6 0 0.8 0.6 0
+          0.775 0.625 0 0.8 0.625 0 0.825 0.6 0 0.825 0.625 0
+          0.775 0.65 0 0.8 0.65 0 0.775 0.675 0 0.825 0.65 0
+          0.8 0.675 0 0.825 0.675 0 0.85 0.525 0 0.875 0.525 0
+          0.85 0.55 0 0.875 0.55 0 0.9 0.525 0 0.925 0.525 0
+          0.9 0.55 0 0.85 0.575 0 0.875 0.575 0 0.9 0.575 0
+          0.925 0.55 0 0.925 0.575 0 0.95 0.525 0 0.95 0.55 0
+          0.975 0.525 0 1 0.525 0 0.975 0.55 0 1 0.55 0
+          0.95 0.575 0 0.975 0.575 0 1 0.575 0 0.85 0.6 0
+          0.875 0.6 0 0.85 0.625 0 0.875 0.625 0 0.9 0.6 0
+          0.925 0.6 0 0.9 0.625 0 0.925 0.625 0 0.85 0.65 0
+          0.875 0.65 0 0.85 0.675 0 0.875 0.675 0 0.9 0.65 0
+          0.925 0.65 0 0.9 0.675 0 0.95 0.6 0 0.95 0.625 0
+          0.975 0.6 0 1 0.6 0 0.975 0.625 0 1 0.625 0
+          0.95 0.65 0 0.925 0.675 0 0.95 0.675 0 0.975 0.65 0
+          1 0.65 0 0.975 0.675 0 1 0.675 0 0 0.675 0
+          0.025 0.7 0 0 0.7 0 0.05 0.7 0 0.075 0.7 0
+          0 0.725 0 0.025 0.725 0 0.05 0.725 0 0.025 0.75 0
+          0 0.75 0 0.05 0.75 0 0.075 0.725 0 0.075 0.75 0
+          0.1 0.7 0 0.125 0.7 0 0.15 0.7 0 0.175 0.7 0
+          0.1 0.725 0 0.125 0.725 0 0.1 0.75 0 0.125 0.75 0
+          0.15 0.725 0 0.175 0.725 0 0.15 0.75 0 0.175 0.75 0
+          0.025 0.775 0 0 0.775 0 0.05 0.775 0 0.025 0.8 0
+          0.075 0.775 0 0.05 0.8 0 0.075 0.8 0 0 0.8 0
+          0.025 0.825 0 0 0.825 0 0.05 0.825 0 0.075 0.825 0
+          0.1 0.775 0 0.125 0.775 0 0.1 0.8 0 0.125 0.8 0
+          0.15 0.775 0 0.175 0.775 0 0.15 0.8 0 0.1 0.825 0
+          0.125 0.825 0 0.15 0.825 0 0.175 0.8 0 0.175 0.825 0
+          0.2 0.7 0 0.225 0.7 0 0.25 0.7 0 0.2 0.725 0
+          0.2 0.75 0 0.225 0.725 0 0.25 0.725 0 0.225 0.75 0
+          0.25 0.75 0 0.275 0.7 0 0.3 0.7 0 0.325 0.7 0
+          0.275 0.725 0 0.3 0.725 0 0.275 0.75 0 0.3 0.75 0
+          0.325 0.725 0 0.325 0.75 0 0.2 0.775 0 0.2 0.8 0
+          0.225 0.775 0 0.25 0.775 0 0.225 0.8 0 0.25 0.8 0
+          0.2 0.825 0 0.225 0.825 0 0.25 0.825 0 0.275 0.775 0
+          0.3 0.775 0 0.275 0.8 0 0.325 0.775 0 0.3 0.8 0
+          0.325 0.8 0 0.275 0.825 0 0.3 0.825 0 0.325 0.825 0
+          0 0.85 0 0.025 0.85 0 0.05 0.85 0 0.025 0.875 0
+          0 0.875 0 0.05 0.875 0 0.075 0.85 0 0.075 0.875 0
+          0.025 0.9 0 0 0.9 0 0.05 0.9 0 0.025 0.925 0
+          0.075 0.9 0 0.05 0.925 0 0.075 0.925 0 0.1 0.85 0
+          0.125 0.85 0 0.1 0.875 0 0.125 0.875 0 0.15 0.85 0
+          0.175 0.85 0 0.15 0.875 0 0.175 0.875 0 0.1 0.9 0
+          0.125 0.9 0 0.1 0.925 0 0.125 0.925 0 0.15 0.9 0
+          0.175 0.9 0 0.15 0.925 0 0 0.925 0 0.025 0.95 0
+          0 0.95 0 0.05 0.95 0 0.075 0.95 0 0 0.975 0
+          0.025 0.975 0 0.05 0.975 0 0.025 1 0 0 1 0
+          0.05 1 0 0.075 0.975 0 0.075 1 0 0.1 0.95 0
+          0.125 0.95 0 0.15 0.95 0 0.175 0.925 0 0.175 0.95 0
+          0.1 0.975 0 0.125 0.975 0 0.1 1 0 0.125 1 0
+          0.15 0.975 0 0.175 0.975 0 0.15 1 0 0.175 1 0
+          0.2 0.85 0 0.2 0.875 0 0.225 0.85 0 0.25 0.85 0
+          0.225 0.875 0 0.25 0.875 0 0.2 0.9 0 0.2 0.925 0
+          0.225 0.9 0 0.25 0.9 0 0.225 0.925 0 0.25 0.925 0
+          0.275 0.85 0 0.3 0.85 0 0.275 0.875 0 0.3 0.875 0
+          0.325 0.85 0 0.325 0.875 0 0.275 0.9 0 0.3 0.9 0
+          0.275 0.925 0 0.325 0.9 0 0.3 0.925 0 0.325 0.925 0
+          0.2 0.95 0 0.225 0.95 0 0.25 0.95 0 0.2 0.975 0
+          0.2 1 0 0.225 0.975 0 0.25 0.975 0 0.225 1 0
+          0.25 1 0 0.275 0.95 0 0.3 0.95 0 0.325 0.95 0
+          0.275 0.975 0 0.3 0.975 0 0.275 1 0 0.3 1 0
+          0.325 0.975 0 0.325 1 0 0.35 0.7 0 0.375 0.7 0
+          0.4 0.7 0 0.425 0.7 0 0.35 0.725 0 0.375 0.725 0
+          0.35 0.75 0 0.375 0.75 0 0.4 0.725 0 0.425 0.725 0
+          0.4 0.75 0 0.425 0.75 0 0.45 0.7 0 0.475 0.7 0
+          0.5 0.7 0 0.45 0.725 0 0.45 0.75 0 0.475 0.725 0
+          0.5 0.725 0 0.475 0.75 0 0.5 0.75 0 0.35 0.775 0
+          0.375 0.775 0 0.35 0.8 0 0.375 0.8 0 0.4 0.775 0
+          0.425 0.775 0 0.4 0.8 0 0.35 0.825 0 0.375 0.825 0
+          0.4 0.825 0 0.425 0.8 0 0.425 0.825 0 0.45 0.775 0
+          0.45 0.8 0 0.475 0.775 0 0.5 0.775 0 0.475 0.8 0
+          0.5 0.8 0 0.45 0.825 0 0.475 0.825 0 0.5 0.825 0
+          0.525 0.7 0 0.55 0.7 0 0.575 0.7 0 0.525 0.725 0
+          0.55 0.725 0 0.525 0.75 0 0.55 0.75 0 0.575 0.725 0
+          0.575 0.75 0 0.6 0.7 0 0.625 0.7 0 0.65 0.7 0
+          0.675 0.7 0 0.6 0.725 0 0.625 0.725 0 0.6 0.75 0
+          0.625 0.75 0 0.65 0.725 0 0.675 0.725 0 0.65 0.75 0
+          0.675 0.75 0 0.525 0.775 0 0.55 0.775 0 0.525 0.8 0
+          0.575 0.775 0 0.55 0.8 0 0.575 0.8 0 0.525 0.825 0
+          0.55 0.825 0 0.575 0.825 0 0.6 0.775 0 0.625 0.775 0
+          0.6 0.8 0 0.625 0.8 0 0.65 0.775 0 0.675 0.775 0
+          0.65 0.8 0 0.6 0.825 0 0.625 0.825 0 0.65 0.825 0
+          0.675 0.8 0 0.675 0.825 0 0.35 0.85 0 0.375 0.85 0
+          0.35 0.875 0 0.375 0.875 0 0.4 0.85 0 0.425 0.85 0
+          0.4 0.875 0 0.425 0.875 0 0.35 0.9 0 0.375 0.9 0
+          0.35 0.925 0 0.375 0.925 0 0.4 0.9 0 0.425 0.9 0
+          0.4 0.925 0 0.45 0.85 0 0.45 0.875 0 0.475 0.85 0
+          0.5 0.85 0 0.475 0.875 0 0.5 0.875 0 0.45 0.9 0
+          0.425 0.925 0 0.45 0.925 0 0.475 0.9 0 0.5 0.9 0
+          0.475 0.925 0 0.5 0.925 0 0.35 0.95 0 0.375 0.95 0
+          0.4 0.95 0 0.425 0.95 0 0.35 0.975 0 0.375 0.975 0
+          0.35 1 0 0.375 1 0 0.4 0.975 0 0.425 0.975 0
+          0.4 1 0 0.425 1 0 0.45 0.95 0 0.475 0.95 0
+          0.5 0.95 0 0.45 0.975 0 0.45 1 0 0.475 0.975 0
+          0.5 0.975 0 0.475 1 0 0.5 1 0 0.525 0.85 0
+          0.55 0.85 0 0.525 0.875 0 0.55 0.875 0 0.575 0.85 0
+          0.575 0.875 0 0.525 0.9 0 0.55 0.9 0 0.525 0.925 0
+          0.575 0.9 0 0.55 0.925 0 0.575 0.925 0 0.6 0.85 0
+          0.625 0.85 0 0.6 0.875 0 0.625 0.875 0 0.65 0.85 0
+          0.675 0.85 0 0.65 0.875 0 0.675 0.875 0 0.6 0.9 0
+          0.625 0.9 0 0.6 0.925 0 0.625 0.925 0 0.65 0.9 0
+          0.675 0.9 0 0.65 0.925 0 0.525 0.95 0 0.55 0.95 0
+          0.575 0.95 0 0.525 0.975 0 0.55 0.975 0 0.525 1 0
+          0.55 1 0 0.575 0.975 0 0.575 1 0 0.6 0.95 0
+          0.625 0.95 0 0.65 0.95 0 0.675 0.925 0 0.675 0.95 0
+          0.6 0.975 0 0.625 0.975 0 0.6 1 0 0.625 1 0
+          0.65 0.975 0 0.675 0.975 0 0.65 1 0 0.675 1 0
+          0.7 0.7 0 0.725 0.7 0 0.75 0.7 0 0.7 0.725 0
+          0.7 0.75 0 0.725 0.725 0 0.75 0.725 0 0.725 0.75 0
+          0.75 0.75 0 0.775 0.7 0 0.8 0.7 0 0.825 0.7 0
+          0.775 0.725 0 0.8 0.725 0 0.775 0.75 0 0.8 0.75 0
+          0.825 0.725 0 0.825 0.75 0 0.7 0.775 0 0.7 0.8 0
+          0.725 0.775 0 0.75 0.775 0 0.725 0.8 0 0.75 0.8 0
+          0.7 0.825 0 0.725 0.825 0 0.75 0.825 0 0.775 0.775 0
+          0.8 0.775 0 0.775 0.8 0 0.825 0.775 0 0.8 0.8 0
+          0.825 0.8 0 0.775 0.825 0 0.8 0.825 0 0.825 0.825 0
+          0.85 0.7 0 0.875 0.7 0 0.9 0.7 0 0.925 0.7 0
+          0.85 0.725 0 0.875 0.725 0 0.85 0.75 0 0.875 0.75 0
+          0.9 0.725 0 0.925 0.725 0 0.9 0.75 0 0.925 0.75 0
+          0.95 0.7 0 0.975 0.7 0 1 0.7 0 0.95 0.725 0
+          0.95 0.75 0 0.975 0.725 0 1 0.725 0 0.975 0.75 0
+          1 0.75 0 0.85 0.775 0 0.875 0.775 0 0.85 0.8 0
+          0.875 0.8 0 0.9 0.775 0 0.925 0.775 0 0.9 0.8 0
+          0.85 0.825 0 0.875 0.825 0 0.9 0.825 0 0.925 0.8 0
+          0.925 0.825 0 0.95 0.775 0 0.95 0.8 0 0.975 0.775 0
+          1 0.775 0 0.975 0.8 0 1 0.8 0 0.95 0.825 0
+          0.975 0.825 0 1 0.825 0 0.7 0.85 0 0.7 0.875 0
+          0.725 0.85 0 0.75 0.85 0 0.725 0.875 0 0.75 0.875 0
+          0.7 0.9 0 0.7 0.925 0 0.725 0.9 0 0.75 0.9 0
+          0.725 0.925 0 0.75 0.925 0 0.775 0.85 0 0.8 0.85 0
+          0.775 0.875 0 0.8 0.875 0 0.825 0.85 0 0.825 0.875 0
+          0.775 0.9 0 0.8 0.9 0 0.775 0.925 0 0.825 0.9 0
+          0.8 0.925 0 0.825 0.925 0 0.7 0.95 0 0.725 0.95 0
+          0.75 0.95 0 0.7 0.975 0 0.7 1 0 0.725 0.975 0
+          0.75 0.975 0 0.725 1 0 0.75 1 0 0.775 0.95 0
+          0.8 0.95 0 0.825 0.95 0 0.775 0.975 0 0.8 0.975 0
+          0.775 1 0 0.8 1 0 0.825 0.975 0 0.825 1 0
+          0.85 0.85 0 0.875 0.85 0 0.85 0.875 0 0.875 0.875 0
+          0.9 0.85 0 0.925 0.85 0 0.9 0.875 0 0.925 0.875 0
+          0.85 0.9 0 0.875 0.9 0 0.85 0.925 0 0.875 0.925 0
+          0.9 0.9 0 0.925 0.9 0 0.9 0.925 0 0.95 0.85 0
+          0.95 0.875 0 0.975 0.85 0 1 0.85 0 0.975 0.875 0
+          1 0.875 0 0.95 0.9 0 0.925 0.925 0 0.95 0.925 0
+          0.975 0.9 0 1 0.9 0 0.975 0.925 0 1 0.925 0
+          0.85 0.95 0 0.875 0.95 0 0.9 0.95 0 0.925 0.95 0
+          0.85 0.975 0 0.875 0.975 0 0.85 1 0 0.875 1 0
+          0.9 0.975 0 0.925 0.975 0 0.9 1 0 0.925 1 0
+          0.95 0.95 0 0.975 0.95 0 1 0.95 0 0.95 0.975 0
+          0.95 1 0 0.975 0.975 0 1 0.975 0 0.975 1 0
+          1 1 0
+        </DataArray>
+      </Points>
+      <Cells>
+        <DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii">
+          0 1 2 2 3 0 1 0 4 5 0 3
+          4 6 1 6 4 7 7 8 6 9 4 0
+          10 7 4 3 11 5 12 5 11 0 5 9
+          11 13 12 5 12 14 4 9 10 14 9 5
+          15 10 9 9 14 15 16 17 8 8 7 16
+          18 19 17 17 16 18 20 16 7 21 18 16
+          22 23 19 19 18 22 23 22 24 25 22 18
+          7 10 20 26 20 10 16 20 21 27 21 20
+          10 15 26 20 26 27 18 21 25 28 25 21
+          22 25 29 21 27 28 25 28 30 13 31 32
+          32 12 13 12 32 33 34 32 31 31 35 34
+          32 34 36 33 14 12 14 33 37 37 15 14
+          36 33 32 33 36 38 38 37 33 39 34 35
+          35 40 39 34 39 41 42 39 40 41 36 34
+          36 41 43 43 38 36 44 41 39 45 43 41
+          46 26 15 15 37 46 26 46 47 47 27 26
+          48 46 37 37 38 48 49 47 46 46 48 49
+          27 47 50 50 28 27 28 50 51 52 50 47
+          47 49 52 50 52 53 54 48 38 38 43 54
+          55 49 48 48 54 55 56 54 43 57 55 54
+          58 52 49 49 55 58 52 58 59 60 58 55
+          24 61 23 61 24 62 62 63 61 29 24 22
+          64 62 24 65 66 63 63 62 65 67 68 66
+          66 65 67 69 65 62 70 67 65 24 29 64
+          30 29 25 71 64 29 29 30 71 62 64 69
+          72 69 64 65 69 70 73 70 69 64 71 72
+          69 72 73 74 75 68 68 67 74 75 74 76
+          77 74 67 76 78 75 78 76 79 79 80 78
+          81 76 74 82 79 76 67 70 77 83 77 70
+          74 77 81 70 73 83 77 83 84 76 81 82
+          84 81 77 85 82 81 81 84 85 51 30 28
+          30 51 86 86 71 30 53 51 50 51 53 87
+          87 86 51 88 72 71 71 86 88 72 88 89
+          89 73 72 90 88 86 86 87 90 91 89 88
+          88 90 91 59 53 52 53 59 92 92 87 53
+          93 59 58 94 92 59 95 90 87 87 92 95
+          96 91 90 90 95 96 97 95 92 98 96 95
+          73 89 99 99 83 73 83 99 100 101 99 89
+          89 91 101 99 101 102 100 84 83 84 100 103
+          103 85 84 102 100 99 100 102 104 104 103 100
+          105 101 91 91 96 105 101 105 106 107 105 96
+          106 102 101 102 106 108 108 104 102 109 106 105
+          110 108 106 40 111 42 112 42 111 39 42 44
+          111 113 112 42 112 114 41 44 45 114 44 42
+          115 45 44 44 114 115 113 116 117 117 112 113
+          112 117 118 119 117 116 116 120 119 117 119 121
+          118 114 112 114 118 122 122 115 114 121 118 117
+          118 121 123 123 122 118 43 45 56 124 56 45
+          54 56 57 125 57 56 45 115 124 56 124 125
+          55 57 60 126 60 57 58 60 93 57 125 126
+          60 126 127 128 124 115 115 122 128 124 128 129
+          129 125 124 130 128 122 122 123 130 131 129 128
+          128 130 131 125 129 132 132 126 125 126 132 133
+          134 132 129 129 131 134 132 134 135 136 119 120
+          120 137 136 119 136 138 139 136 137 138 121 119
+          121 138 140 140 123 121 141 138 136 142 140 138
+          137 143 139 144 139 143 136 139 141 143 145 144
+          139 144 146 138 141 142 146 141 139 147 142 141
+          141 146 147 148 130 123 123 140 148 149 131 130
+          130 148 149 150 148 140 151 149 148 152 134 131
+          131 149 152 134 152 153 154 152 149 140 142 150
+          155 150 142 148 150 151 156 151 150 142 147 155
+          150 155 156 149 151 154 157 154 151 152 154 158
+          151 156 157 154 157 159 59 93 94 127 93 60
+          160 94 93 93 127 160 92 94 97 161 97 94
+          95 97 98 162 98 97 94 160 161 97 161 162
+          133 127 126 127 133 163 163 160 127 135 133 132
+          133 135 164 164 163 133 165 161 160 160 163 165
+          161 165 166 166 162 161 167 165 163 163 164 167
+          168 166 165 165 167 168 96 98 107 169 107 98
+          105 107 109 98 162 169 107 169 170 106 109 110
+          170 109 107 171 110 109 109 170 171 162 166 172
+          172 169 162 169 172 173 174 172 166 166 168 174
+          172 174 175 173 170 169 170 173 176 176 171 170
+          175 173 172 173 175 177 177 176 173 153 135 134
+          135 153 178 178 164 135 158 153 152 179 178 153
+          180 167 164 164 178 180 181 168 167 167 180 181
+          182 180 178 183 181 180 153 158 179 159 158 154
+          184 179 158 158 159 184 178 179 182 185 182 179
+          180 182 183 186 183 182 179 184 185 182 185 186
+          187 174 168 168 181 187 174 187 188 189 187 181
+          188 175 174 175 188 190 190 177 175 191 188 187
+          192 190 188 181 183 189 193 189 183 187 189 191
+          183 186 193 189 193 194 188 191 192 194 191 189
+          195 192 191 191 194 195 196 197 80 80 79 196
+          198 199 197 197 196 198 200 196 79 201 198 196
+          202 203 199 199 198 202 203 202 204 205 202 198
+          79 82 200 206 200 82 196 200 201 207 201 200
+          82 85 206 200 206 207 198 201 205 208 205 201
+          202 205 209 201 207 208 205 208 210 204 211 203
+          211 204 212 212 213 211 209 204 202 214 212 204
+          215 216 213 213 212 215 217 218 216 216 215 217
+          219 215 212 220 217 215 204 209 214 210 209 205
+          221 214 209 209 210 221 212 214 219 222 219 214
+          215 219 220 223 220 219 214 221 222 219 222 223
+          224 206 85 85 103 224 206 224 225 225 207 206
+          226 224 103 103 104 226 227 225 224 224 226 227
+          207 225 228 228 208 207 208 228 229 230 228 225
+          225 227 230 228 230 231 232 226 104 104 108 232
+          233 227 226 226 232 233 234 232 108 235 233 232
+          236 230 227 227 233 236 230 236 237 238 236 233
+          229 210 208 210 229 239 239 221 210 231 229 228
+          229 231 240 240 239 229 241 222 221 221 239 241
+          222 241 242 242 223 222 243 241 239 239 240 243
+          244 242 241 241 243 244 237 231 230 231 237 245
+          245 240 231 246 237 236 247 245 237 248 243 240
+          240 245 248 249 244 243 243 248 249 250 248 245
+          251 249 248 252 253 218 218 217 252 253 252 254
+          255 252 217 254 256 253 256 254 257 257 258 256
+          259 254 252 260 257 254 217 220 255 261 255 220
+          252 255 259 220 223 261 255 261 262 254 259 260
+          262 259 255 263 260 259 259 262 263 264 265 258
+          258 257 264 266 267 265 265 264 266 268 264 257
+          269 266 264 270 271 267 267 266 270 271 270 272
+          273 270 266 257 260 268 274 268 260 264 268 269
+          275 269 268 260 263 274 268 274 275 266 269 273
+          276 273 269 270 273 277 269 275 276 273 276 278
+          223 242 279 279 261 223 261 279 280 281 279 242
+          242 244 281 279 281 282 280 262 261 262 280 283
+          283 263 262 282 280 279 280 282 284 284 283 280
+          285 281 244 244 249 285 281 285 286 287 285 249
+          286 282 281 282 286 288 288 284 282 289 286 285
+          290 288 286 291 274 263 263 283 291 274 291 292
+          292 275 274 293 291 283 283 284 293 294 292 291
+          291 293 294 275 292 295 295 276 275 276 295 296
+          297 295 292 292 294 297 295 297 298 299 293 284
+          284 288 299 300 294 293 293 299 300 301 299 288
+          302 300 299 303 297 294 294 300 303 297 303 304
+          305 303 300 108 110 234 306 234 110 232 234 235
+          307 235 234 110 171 306 234 306 307 233 235 238
+          308 238 235 236 238 246 235 307 308 238 308 309
+          310 306 171 171 176 310 306 310 311 311 307 306
+          312 310 176 176 177 312 313 311 310 310 312 313
+          307 311 314 314 308 307 308 314 315 316 314 311
+          311 313 316 314 316 317 237 246 247 309 246 238
+          318 247 246 246 309 318 245 247 250 319 250 247
+          248 250 251 320 251 250 247 318 319 250 319 320
+          315 309 308 309 315 321 321 318 309 317 315 314
+          315 317 322 322 321 315 323 319 318 318 321 323
+          319 323 324 324 320 319 325 323 321 321 322 325
+          326 324 323 323 325 326 327 312 177 177 190 327
+          328 313 312 312 327 328 329 327 190 330 328 327
+          331 316 313 313 328 331 316 331 332 333 331 328
+          190 192 329 334 329 192 327 329 330 335 330 329
+          192 195 334 329 334 335 328 330 333 336 333 330
+          331 333 337 330 335 336 333 336 338 332 317 316
+          317 332 339 339 322 317 337 332 331 340 339 332
+          341 325 322 322 339 341 342 326 325 325 341 342
+          343 341 339 344 342 341 332 337 340 338 337 333
+          345 340 337 337 338 345 339 340 343 346 343 340
+          341 343 344 347 344 343 340 345 346 343 346 347
+          249 251 287 348 287 251 285 287 289 251 320 348
+          287 348 349 286 289 290 349 289 287 350 290 289
+          289 349 350 320 324 351 351 348 320 348 351 352
+          353 351 324 324 326 353 351 353 354 352 349 348
+          349 352 355 355 350 349 354 352 351 352 354 356
+          356 355 352 288 290 301 357 301 290 299 301 302
+          358 302 301 290 350 357 301 357 358 300 302 305
+          359 305 302 303 305 360 302 358 359 305 359 361
+          362 357 350 350 355 362 357 362 363 363 358 357
+          364 362 355 355 356 364 365 363 362 362 364 365
+          358 363 366 366 359 358 359 366 367 368 366 363
+          363 365 368 366 368 369 370 353 326 326 342 370
+          353 370 371 372 370 342 371 354 353 354 371 373
+          373 356 354 374 371 370 375 373 371 342 344 372
+          376 372 344 370 372 374 344 347 376 372 376 377
+          371 374 375 377 374 372 378 375 374 374 377 378
+          379 364 356 356 373 379 380 365 364 364 379 380
+          381 379 373 382 380 379 383 368 365 365 380 383
+          368 383 384 385 383 380 373 375 381 386 381 375
+          379 381 382 387 382 381 375 378 386 381 386 387
+          380 382 385 388 385 382 383 385 389 382 387 388
+          385 388 390 145 391 392 392 144 145 144 392 393
+          394 392 391 391 395 394 392 394 396 393 146 144
+          146 393 397 397 147 146 396 393 392 393 396 398
+          398 397 393 399 394 395 395 400 399 394 399 401
+          402 399 400 401 396 394 396 401 403 403 398 396
+          404 401 399 405 403 401 406 155 147 147 397 406
+          155 406 407 407 156 155 408 406 397 397 398 408
+          409 407 406 406 408 409 156 407 410 410 157 156
+          157 410 411 412 410 407 407 409 412 410 412 413
+          414 408 398 398 403 414 415 409 408 408 414 415
+          416 414 403 417 415 414 418 412 409 409 415 418
+          412 418 419 420 418 415 400 421 402 422 402 421
+          399 402 404 421 423 422 402 422 424 401 404 405
+          424 404 402 425 405 404 404 424 425 423 426 427
+          427 422 423 422 427 428 429 427 426 426 430 429
+          427 429 431 428 424 422 424 428 432 432 425 424
+          431 428 427 428 431 433 433 432 428 403 405 416
+          434 416 405 414 416 417 435 417 416 405 425 434
+          416 434 435 415 417 420 436 420 417 418 420 437
+          417 435 436 420 436 438 439 434 425 425 432 439
+          434 439 440 440 435 434 441 439 432 432 433 441
+          442 440 439 439 441 442 435 440 443 443 436 435
+          436 443 444 445 443 440 440 442 445 443 445 446
+          411 159 157 159 411 447 447 184 159 413 411 410
+          411 413 448 448 447 411 449 185 184 184 447 449
+          185 449 450 450 186 185 451 449 447 447 448 451
+          452 450 449 449 451 452 419 413 412 413 419 453
+          453 448 413 437 419 418 454 453 419 455 451 448
+          448 453 455 456 452 451 451 455 456 457 455 453
+          458 456 455 186 450 459 459 193 186 193 459 460
+          461 459 450 450 452 461 459 461 462 460 194 193
+          194 460 463 463 195 194 462 460 459 460 462 464
+          464 463 460 465 461 452 452 456 465 461 465 466
+          467 465 456 466 462 461 462 466 468 468 464 462
+          469 466 465 470 468 466 419 437 454 438 437 420
+          471 454 437 437 438 471 453 454 457 472 457 454
+          455 457 458 473 458 457 454 471 472 457 472 473
+          444 438 436 438 444 474 474 471 438 446 444 443
+          444 446 475 475 474 444 476 472 471 471 474 476
+          472 476 477 477 473 472 478 476 474 474 475 478
+          479 477 476 476 478 479 456 458 467 480 467 458
+          465 467 469 458 473 480 467 480 481 466 469 470
+          481 469 467 482 470 469 469 481 482 473 477 483
+          483 480 473 480 483 484 485 483 477 477 479 485
+          483 485 486 484 481 480 481 484 487 487 482 481
+          486 484 483 484 486 488 488 487 484 489 429 430
+          430 490 489 429 489 491 492 489 490 491 431 429
+          431 491 493 493 433 431 494 491 489 495 493 491
+          490 496 492 497 492 496 489 492 494 496 498 497
+          492 497 499 491 494 495 499 494 492 500 495 494
+          494 499 500 501 441 433 433 493 501 502 442 441
+          441 501 502 503 501 493 504 502 501 505 445 442
+          442 502 505 445 505 506 507 505 502 493 495 503
+          508 503 495 501 503 504 509 504 503 495 500 508
+          503 508 509 502 504 507 510 507 504 505 507 511
+          504 509 510 507 510 512 498 513 514 514 497 498
+          497 514 515 516 514 513 513 517 516 514 516 518
+          515 499 497 499 515 519 519 500 499 518 515 514
+          515 518 520 520 519 515 521 516 517 517 522 521
+          516 521 523 524 521 522 523 518 516 518 523 525
+          525 520 518 526 523 521 527 525 523 528 508 500
+          500 519 528 508 528 529 529 509 508 530 528 519
+          519 520 530 531 529 528 528 530 531 509 529 532
+          532 510 509 510 532 533 534 532 529 529 531 534
+          532 534 535 536 530 520 520 525 536 537 531 530
+          530 536 537 538 536 525 539 537 536 540 534 531
+          531 537 540 534 540 541 542 540 537 506 446 445
+          446 506 543 543 475 446 511 506 505 544 543 506
+          545 478 475 475 543 545 546 479 478 478 545 546
+          547 545 543 548 546 545 506 511 544 512 511 507
+          549 544 511 511 512 549 543 544 547 550 547 544
+          545 547 548 551 548 547 544 549 550 547 550 551
+          552 485 479 479 546 552 485 552 553 554 552 546
+          553 486 485 486 553 555 555 488 486 556 553 552
+          557 555 553 546 548 554 558 554 548 552 554 556
+          548 551 558 554 558 559 553 556 557 559 556 554
+          560 557 556 556 559 560 533 512 510 512 533 561
+          561 549 512 535 533 532 533 535 562 562 561 533
+          563 550 549 549 561 563 550 563 564 564 551 550
+          565 563 561 561 562 565 566 564 563 563 565 566
+          541 535 534 535 541 567 567 562 535 568 541 540
+          569 567 541 570 565 562 562 567 570 571 566 565
+          565 570 571 572 570 567 573 571 570 551 564 574
+          574 558 551 558 574 575 576 574 564 564 566 576
+          574 576 577 575 559 558 559 575 578 578 560 559
+          577 575 574 575 577 579 579 578 575 580 576 566
+          566 571 580 576 580 581 582 580 571 581 577 576
+          577 581 583 583 579 577 584 581 580 585 583 581
+          586 334 195 195 463 586 334 586 587 587 335 334
+          588 586 463 463 464 588 589 587 586 586 588 589
+          335 587 590 590 336 335 336 590 591 592 590 587
+          587 589 592 590 592 593 594 588 464 464 468 594
+          595 589 588 588 594 595 596 594 468 597 595 594
+          598 592 589 589 595 598 592 598 599 600 598 595
+          591 338 336 338 591 601 601 345 338 593 591 590
+          591 593 602 602 601 591 603 346 345 345 601 603
+          346 603 604 604 347 346 605 603 601 601 602 605
+          606 604 603 603 605 606 599 593 592 593 599 607
+          607 602 593 608 599 598 609 607 599 610 605 602
+          602 607 610 611 606 605 605 610 611 612 610 607
+          613 611 610 468 470 596 614 596 470 594 596 597
+          615 597 596 470 482 614 596 614 615 595 597 600
+          616 600 597 598 600 608 597 615 616 600 616 617
+          618 614 482 482 487 618 614 618 619 619 615 614
+          620 618 487 487 488 620 621 619 618 618 620 621
+          615 619 622 622 616 615 616 622 623 624 622 619
+          619 621 624 622 624 625 599 608 609 617 608 600
+          626 609 608 608 617 626 607 609 612 627 612 609
+          610 612 613 628 613 612 609 626 627 612 627 628
+          623 617 616 617 623 629 629 626 617 625 623 622
+          623 625 630 630 629 623 631 627 626 626 629 631
+          627 631 632 632 628 627 633 631 629 629 630 633
+          634 632 631 631 633 634 347 604 635 635 376 347
+          376 635 636 637 635 604 604 606 637 635 637 638
+          636 377 376 377 636 639 639 378 377 638 636 635
+          636 638 640 640 639 636 641 637 606 606 611 641
+          637 641 642 643 641 611 642 638 637 638 642 644
+          644 640 638 645 642 641 646 644 642 647 386 378
+          378 639 647 386 647 648 648 387 386 649 647 639
+          639 640 649 650 648 647 647 649 650 387 648 651
+          651 388 387 388 651 652 653 651 648 648 650 653
+          651 653 654 655 649 640 640 644 655 656 650 649
+          649 655 656 657 655 644 658 656 655 659 653 650
+          650 656 659 653 659 660 661 659 656 611 613 643
+          662 643 613 641 643 645 613 628 662 643 662 663
+          642 645 646 663 645 643 664 646 645 645 663 664
+          628 632 665 665 662 628 662 665 666 667 665 632
+          632 634 667 665 667 668 666 663 662 663 666 669
+          669 664 663 668 666 665 666 668 670 670 669 666
+          644 646 657 671 657 646 655 657 658 672 658 657
+          646 664 671 657 671 672 656 658 661 673 661 658
+          659 661 674 658 672 673 661 673 675 676 671 664
+          664 669 676 671 676 677 677 672 671 678 676 669
+          669 670 678 679 677 676 676 678 679 672 677 680
+          680 673 672 673 680 681 682 680 677 677 679 682
+          680 682 683 684 620 488 488 555 684 685 621 620
+          620 684 685 686 684 555 687 685 684 688 624 621
+          621 685 688 624 688 689 690 688 685 555 557 686
+          691 686 557 684 686 687 692 687 686 557 560 691
+          686 691 692 685 687 690 693 690 687 688 690 694
+          687 692 693 690 693 695 689 625 624 625 689 696
+          696 630 625 694 689 688 697 696 689 698 633 630
+          630 696 698 699 634 633 633 698 699 700 698 696
+          701 699 698 689 694 697 695 694 690 702 697 694
+          694 695 702 696 697 700 703 700 697 698 700 701
+          704 701 700 697 702 703 700 703 704 705 691 560
+          560 578 705 691 705 706 706 692 691 707 705 578
+          578 579 707 708 706 705 705 707 708 692 706 709
+          709 693 692 693 709 710 711 709 706 706 708 711
+          709 711 712 713 707 579 579 583 713 714 708 707
+          707 713 714 715 713 583 716 714 713 717 711 708
+          708 714 717 711 717 718 719 717 714 710 695 693
+          695 710 720 720 702 695 712 710 709 710 712 721
+          721 720 710 722 703 702 702 720 722 703 722 723
+          723 704 703 724 722 720 720 721 724 725 723 722
+          722 724 725 718 712 711 712 718 726 726 721 712
+          727 718 717 728 726 718 729 724 721 721 726 729
+          730 725 724 724 729 730 731 729 726 732 730 729
+          733 667 634 634 699 733 667 733 734 735 733 699
+          734 668 667 668 734 736 736 670 668 737 734 733
+          738 736 734 699 701 735 739 735 701 733 735 737
+          701 704 739 735 739 740 734 737 738 740 737 735
+          741 738 737 737 740 741 742 678 670 670 736 742
+          743 679 678 678 742 743 744 742 736 745 743 742
+          746 682 679 679 743 746 682 746 747 748 746 743
+          736 738 744 749 744 738 742 744 745 750 745 744
+          738 741 749 744 749 750 743 745 748 751 748 745
+          746 748 752 745 750 751 748 751 753 704 723 754
+          754 739 704 739 754 755 756 754 723 723 725 756
+          754 756 757 755 740 739 740 755 758 758 741 740
+          757 755 754 755 757 759 759 758 755 760 756 725
+          725 730 760 756 760 761 762 760 730 761 757 756
+          757 761 763 763 759 757 764 761 760 765 763 761
+          766 749 741 741 758 766 749 766 767 767 750 749
+          768 766 758 758 759 768 769 767 766 766 768 769
+          750 767 770 770 751 750 751 770 771 772 770 767
+          767 769 772 770 772 773 774 768 759 759 763 774
+          775 769 768 768 774 775 776 774 763 777 775 774
+          778 772 769 769 775 778 772 778 779 780 778 775
+          272 781 271 781 272 782 782 783 781 277 272 270
+          784 782 272 785 786 783 783 782 785 787 788 786
+          786 785 787 789 785 782 790 787 785 272 277 784
+          278 277 273 791 784 277 277 278 791 782 784 789
+          792 789 784 785 789 790 793 790 789 784 791 792
+          789 792 793 794 795 788 788 787 794 795 794 796
+          797 794 787 796 798 795 798 796 799 799 800 798
+          801 796 794 802 799 796 787 790 797 803 797 790
+          794 797 801 790 793 803 797 803 804 796 801 802
+          804 801 797 805 802 801 801 804 805 296 278 276
+          278 296 806 806 791 278 298 296 295 296 298 807
+          807 806 296 808 792 791 791 806 808 792 808 809
+          809 793 792 810 808 806 806 807 810 811 809 808
+          808 810 811 304 298 297 298 304 812 812 807 298
+          360 304 303 813 812 304 814 810 807 807 812 814
+          815 811 810 810 814 815 816 814 812 817 815 814
+          793 809 818 818 803 793 803 818 819 820 818 809
+          809 811 820 818 820 821 819 804 803 804 819 822
+          822 805 804 821 819 818 819 821 823 823 822 819
+          824 820 811 811 815 824 820 824 825 826 824 815
+          825 821 820 821 825 827 827 823 821 828 825 824
+          829 827 825 830 831 800 800 799 830 832 833 831
+          831 830 832 834 830 799 835 832 830 836 837 833
+          833 832 836 837 836 838 839 836 832 799 802 834
+          840 834 802 830 834 835 841 835 834 802 805 840
+          834 840 841 832 835 839 842 839 835 836 839 843
+          835 841 842 839 842 844 838 845 837 845 838 846
+          846 847 845 843 838 836 848 846 838 849 850 847
+          847 846 849 851 852 850 850 849 851 853 849 846
+          854 851 849 838 843 848 844 843 839 855 848 843
+          843 844 855 846 848 853 856 853 848 849 853 854
+          857 854 853 848 855 856 853 856 857 858 840 805
+          805 822 858 840 858 859 859 841 840 860 858 822
+          822 823 860 861 859 858 858 860 861 841 859 862
+          862 842 841 842 862 863 864 862 859 859 861 864
+          862 864 865 866 860 823 823 827 866 867 861 860
+          860 866 867 868 866 827 869 867 866 870 864 861
+          861 867 870 864 870 871 872 870 867 863 844 842
+          844 863 873 873 855 844 865 863 862 863 865 874
+          874 873 863 875 856 855 855 873 875 856 875 876
+          876 857 856 877 875 873 873 874 877 878 876 875
+          875 877 878 871 865 864 865 871 879 879 874 865
+          880 871 870 881 879 871 882 877 874 874 879 882
+          883 878 877 877 882 883 884 882 879 885 883 882
+          304 360 813 361 360 305 886 813 360 360 361 886
+          812 813 816 887 816 813 814 816 817 888 817 816
+          813 886 887 816 887 888 367 361 359 361 367 889
+          889 886 361 369 367 366 367 369 890 890 889 367
+          891 887 886 886 889 891 887 891 892 892 888 887
+          893 891 889 889 890 893 894 892 891 891 893 894
+          815 817 826 895 826 817 824 826 828 817 888 895
+          826 895 896 825 828 829 896 828 826 897 829 828
+          828 896 897 888 892 898 898 895 888 895 898 899
+          900 898 892 892 894 900 898 900 901 899 896 895
+          896 899 902 902 897 896 901 899 898 899 901 903
+          903 902 899 384 369 368 369 384 904 904 890 369
+          389 384 383 905 904 384 906 893 890 890 904 906
+          907 894 893 893 906 907 908 906 904 909 907 906
+          384 389 905 390 389 385 910 905 389 389 390 910
+          904 905 908 911 908 905 906 908 909 912 909 908
+          905 910 911 908 911 912 913 900 894 894 907 913
+          900 913 914 915 913 907 914 901 900 901 914 916
+          916 903 901 917 914 913 918 916 914 907 909 915
+          919 915 909 913 915 917 909 912 919 915 919 920
+          914 917 918 920 917 915 921 918 917 917 920 921
+          827 829 868 922 868 829 866 868 869 923 869 868
+          829 897 922 868 922 923 867 869 872 924 872 869
+          870 872 880 869 923 924 872 924 925 926 922 897
+          897 902 926 922 926 927 927 923 922 928 926 902
+          902 903 928 929 927 926 926 928 929 923 927 930
+          930 924 923 924 930 931 932 930 927 927 929 932
+          930 932 933 871 880 881 925 880 872 934 881 880
+          880 925 934 879 881 884 935 884 881 882 884 885
+          936 885 884 881 934 935 884 935 936 931 925 924
+          925 931 937 937 934 925 933 931 930 931 933 938
+          938 937 931 939 935 934 934 937 939 935 939 940
+          940 936 935 941 939 937 937 938 941 942 940 939
+          939 941 942 943 928 903 903 916 943 944 929 928
+          928 943 944 945 943 916 946 944 943 947 932 929
+          929 944 947 932 947 948 949 947 944 916 918 945
+          950 945 918 943 945 946 951 946 945 918 921 950
+          945 950 951 944 946 949 952 949 946 947 949 953
+          946 951 952 949 952 954 948 933 932 933 948 955
+          955 938 933 953 948 947 956 955 948 957 941 938
+          938 955 957 958 942 941 941 957 958 959 957 955
+          960 958 957 948 953 956 954 953 949 961 956 953
+          953 954 961 955 956 959 962 959 956 957 959 960
+          963 960 959 956 961 962 959 962 963 652 390 388
+          390 652 964 964 910 390 654 652 651 652 654 965
+          965 964 652 966 911 910 910 964 966 911 966 967
+          967 912 911 968 966 964 964 965 968 969 967 966
+          966 968 969 660 654 653 654 660 970 970 965 654
+          674 660 659 971 970 660 972 968 965 965 970 972
+          973 969 968 968 972 973 974 972 970 975 973 972
+          912 967 976 976 919 912 919 976 977 978 976 967
+          967 969 978 976 978 979 977 920 919 920 977 980
+          980 921 920 979 977 976 977 979 981 981 980 977
+          982 978 969 969 973 982 978 982 983 984 982 973
+          983 979 978 979 983 985 985 981 979 986 983 982
+          987 985 983 660 674 971 675 674 661 988 971 674
+          674 675 988 970 971 974 989 974 971 972 974 975
+          990 975 974 971 988 989 974 989 990 681 675 673
+          675 681 991 991 988 675 683 681 680 681 683 992
+          992 991 681 993 989 988 988 991 993 989 993 994
+          994 990 989 995 993 991 991 992 995 996 994 993
+          993 995 996 973 975 984 997 984 975 982 984 986
+          975 990 997 984 997 998 983 986 987 998 986 984
+          999 987 986 986 998 999 990 994 1000 1000 997 990
+          997 1000 1001 1002 1000 994 994 996 1002 1000 1002 1003
+          1001 998 997 998 1001 1004 1004 999 998 1003 1001 1000
+          1001 1003 1005 1005 1004 1001 1006 950 921 921 980 1006
+          950 1006 1007 1007 951 950 1008 1006 980 980 981 1008
+          1009 1007 1006 1006 1008 1009 951 1007 1010 1010 952 951
+          952 1010 1011 1012 1010 1007 1007 1009 1012 1010 1012 1013
+          1014 1008 981 981 985 1014 1015 1009 1008 1008 1014 1015
+          1016 1014 985 1017 1015 1014 1018 1012 1009 1009 1015 1018
+          1012 1018 1019 1020 1018 1015 1011 954 952 954 1011 1021
+          1021 961 954 1013 1011 1010 1011 1013 1022 1022 1021 1011
+          1023 962 961 961 1021 1023 962 1023 1024 1024 963 962
+          1025 1023 1021 1021 1022 1025 1026 1024 1023 1023 1025 1026
+          1019 1013 1012 1013 1019 1027 1027 1022 1013 1028 1019 1018
+          1029 1027 1019 1030 1025 1022 1022 1027 1030 1031 1026 1025
+          1025 1030 1031 1032 1030 1027 1033 1031 1030 985 987 1016
+          1034 1016 987 1014 1016 1017 1035 1017 1016 987 999 1034
+          1016 1034 1035 1015 1017 1020 1036 1020 1017 1018 1020 1028
+          1017 1035 1036 1020 1036 1037 1038 1034 999 999 1004 1038
+          1034 1038 1039 1039 1035 1034 1040 1038 1004 1004 1005 1040
+          1041 1039 1038 1038 1040 1041 1035 1039 1042 1042 1036 1035
+          1036 1042 1043 1044 1042 1039 1039 1041 1044 1042 1044 1045
+          1019 1028 1029 1037 1028 1020 1046 1029 1028 1028 1037 1046
+          1027 1029 1032 1047 1032 1029 1030 1032 1033 1048 1033 1032
+          1029 1046 1047 1032 1047 1048 1043 1037 1036 1037 1043 1049
+          1049 1046 1037 1045 1043 1042 1043 1045 1050 1050 1049 1043
+          1051 1047 1046 1046 1049 1051 1047 1051 1052 1052 1048 1047
+          1053 1051 1049 1049 1050 1053 1054 1052 1051 1051 1053 1054
+          747 683 682 683 747 1055 1055 992 683 752 747 746
+          1056 1055 747 1057 995 992 992 1055 1057 1058 996 995
+          995 1057 1058 1059 1057 1055 1060 1058 1057 747 752 1056
+          753 752 748 1061 1056 752 752 753 1061 1055 1056 1059
+          1062 1059 1056 1057 1059 1060 1063 1060 1059 1056 1061 1062
+          1059 1062 1063 1064 1002 996 996 1058 1064 1002 1064 1065
+          1066 1064 1058 1065 1003 1002 1003 1065 1067 1067 1005 1003
+          1068 1065 1064 1069 1067 1065 1058 1060 1066 1070 1066 1060
+          1064 1066 1068 1060 1063 1070 1066 1070 1071 1065 1068 1069
+          1071 1068 1066 1072 1069 1068 1068 1071 1072 771 753 751
+          753 771 1073 1073 1061 753 773 771 770 771 773 1074
+          1074 1073 771 1075 1062 1061 1061 1073 1075 1062 1075 1076
+          1076 1063 1062 1077 1075 1073 1073 1074 1077 1078 1076 1075
+          1075 1077 1078 779 773 772 773 779 1079 1079 1074 773
+          1080 779 778 1081 1079 779 1082 1077 1074 1074 1079 1082
+          1083 1078 1077 1077 1082 1083 1084 1082 1079 1085 1083 1082
+          1063 1076 1086 1086 1070 1063 1070 1086 1087 1088 1086 1076
+          1076 1078 1088 1086 1088 1089 1087 1071 1070 1071 1087 1090
+          1090 1072 1071 1089 1087 1086 1087 1089 1091 1091 1090 1087
+          1092 1088 1078 1078 1083 1092 1088 1092 1093 1094 1092 1083
+          1093 1089 1088 1089 1093 1095 1095 1091 1089 1096 1093 1092
+          1097 1095 1093 1098 1040 1005 1005 1067 1098 1099 1041 1040
+          1040 1098 1099 1100 1098 1067 1101 1099 1098 1102 1044 1041
+          1041 1099 1102 1044 1102 1103 1104 1102 1099 1067 1069 1100
+          1105 1100 1069 1098 1100 1101 1106 1101 1100 1069 1072 1105
+          1100 1105 1106 1099 1101 1104 1107 1104 1101 1102 1104 1108
+          1101 1106 1107 1104 1107 1109 1103 1045 1044 1045 1103 1110
+          1110 1050 1045 1108 1103 1102 1111 1110 1103 1112 1053 1050
+          1050 1110 1112 1113 1054 1053 1053 1112 1113 1114 1112 1110
+          1115 1113 1112 1103 1108 1111 1109 1108 1104 1116 1111 1108
+          1108 1109 1116 1110 1111 1114 1117 1114 1111 1112 1114 1115
+          1118 1115 1114 1111 1116 1117 1114 1117 1118 1119 1105 1072
+          1072 1090 1119 1105 1119 1120 1120 1106 1105 1121 1119 1090
+          1090 1091 1121 1122 1120 1119 1119 1121 1122 1106 1120 1123
+          1123 1107 1106 1107 1123 1124 1125 1123 1120 1120 1122 1125
+          1123 1125 1126 1127 1121 1091 1091 1095 1127 1128 1122 1121
+          1121 1127 1128 1129 1127 1095 1130 1128 1127 1131 1125 1122
+          1122 1128 1131 1125 1131 1132 1133 1131 1128 1124 1109 1107
+          1109 1124 1134 1134 1116 1109 1126 1124 1123 1124 1126 1135
+          1135 1134 1124 1136 1117 1116 1116 1134 1136 1117 1136 1137
+          1137 1118 1117 1138 1136 1134 1134 1135 1138 1139 1137 1136
+          1136 1138 1139 1132 1126 1125 1126 1132 1140 1140 1135 1126
+          1141 1132 1131 1142 1140 1132 1143 1138 1135 1135 1140 1143
+          1144 1139 1138 1138 1143 1144 1145 1143 1140 1146 1144 1143
+          522 1147 524 1148 524 1147 521 524 526 1147 1149 1148
+          524 1148 1150 523 526 527 1150 526 524 1151 527 526
+          526 1150 1151 1149 1152 1153 1153 1148 1149 1148 1153 1154
+          1155 1153 1152 1152 1156 1155 1153 1155 1157 1154 1150 1148
+          1150 1154 1158 1158 1151 1150 1157 1154 1153 1154 1157 1159
+          1159 1158 1154 525 527 538 1160 538 527 536 538 539
+          1161 539 538 527 1151 1160 538 1160 1161 537 539 542
+          1162 542 539 540 542 568 539 1161 1162 542 1162 1163
+          1164 1160 1151 1151 1158 1164 1160 1164 1165 1165 1161 1160
+          1166 1164 1158 1158 1159 1166 1167 1165 1164 1164 1166 1167
+          1161 1165 1168 1168 1162 1161 1162 1168 1169 1170 1168 1165
+          1165 1167 1170 1168 1170 1171 1172 1155 1156 1156 1173 1172
+          1155 1172 1174 1175 1172 1173 1174 1157 1155 1157 1174 1176
+          1176 1159 1157 1177 1174 1172 1178 1176 1174 1173 1179 1175
+          1180 1175 1179 1172 1175 1177 1179 1181 1180 1175 1180 1182
+          1174 1177 1178 1182 1177 1175 1183 1178 1177 1177 1182 1183
+          1184 1166 1159 1159 1176 1184 1185 1167 1166 1166 1184 1185
+          1186 1184 1176 1187 1185 1184 1188 1170 1167 1167 1185 1188
+          1170 1188 1189 1190 1188 1185 1176 1178 1186 1191 1186 1178
+          1184 1186 1187 1192 1187 1186 1178 1183 1191 1186 1191 1192
+          1185 1187 1190 1193 1190 1187 1188 1190 1194 1187 1192 1193
+          1190 1193 1195 541 568 569 1163 568 542 1196 569 568
+          568 1163 1196 567 569 572 1197 572 569 570 572 573
+          1198 573 572 569 1196 1197 572 1197 1198 1169 1163 1162
+          1163 1169 1199 1199 1196 1163 1171 1169 1168 1169 1171 1200
+          1200 1199 1169 1201 1197 1196 1196 1199 1201 1197 1201 1202
+          1202 1198 1197 1203 1201 1199 1199 1200 1203 1204 1202 1201
+          1201 1203 1204 571 573 582 1205 582 573 580 582 584
+          573 1198 1205 582 1205 1206 581 584 585 1206 584 582
+          1207 585 584 584 1206 1207 1198 1202 1208 1208 1205 1198
+          1205 1208 1209 1210 1208 1202 1202 1204 1210 1208 1210 1211
+          1209 1206 1205 1206 1209 1212 1212 1207 1206 1211 1209 1208
+          1209 1211 1213 1213 1212 1209 1189 1171 1170 1171 1189 1214
+          1214 1200 1171 1194 1189 1188 1215 1214 1189 1216 1203 1200
+          1200 1214 1216 1217 1204 1203 1203 1216 1217 1218 1216 1214
+          1219 1217 1216 1189 1194 1215 1195 1194 1190 1220 1215 1194
+          1194 1195 1220 1214 1215 1218 1221 1218 1215 1216 1218 1219
+          1222 1219 1218 1215 1220 1221 1218 1221 1222 1223 1210 1204
+          1204 1217 1223 1210 1223 1224 1225 1223 1217 1224 1211 1210
+          1211 1224 1226 1226 1213 1211 1227 1224 1223 1228 1226 1224
+          1217 1219 1225 1229 1225 1219 1223 1225 1227 1219 1222 1229
+          1225 1229 1230 1224 1227 1228 1230 1227 1225 1231 1228 1227
+          1227 1230 1231 1181 1232 1233 1233 1180 1181 1180 1233 1234
+          1235 1233 1232 1232 1236 1235 1233 1235 1237 1234 1182 1180
+          1182 1234 1238 1238 1183 1182 1237 1234 1233 1234 1237 1239
+          1239 1238 1234 1240 1235 1236 1236 1241 1240 1235 1240 1242
+          1243 1240 1241 1242 1237 1235 1237 1242 1244 1244 1239 1237
+          1245 1242 1240 1246 1244 1242 1247 1191 1183 1183 1238 1247
+          1191 1247 1248 1248 1192 1191 1249 1247 1238 1238 1239 1249
+          1250 1248 1247 1247 1249 1250 1192 1248 1251 1251 1193 1192
+          1193 1251 1252 1253 1251 1248 1248 1250 1253 1251 1253 1254
+          1255 1249 1239 1239 1244 1255 1256 1250 1249 1249 1255 1256
+          1257 1255 1244 1258 1256 1255 1259 1253 1250 1250 1256 1259
+          1253 1259 1260 1261 1259 1256 1241 1262 1243 1263 1243 1262
+          1240 1243 1245 1262 1264 1263 1243 1263 1265 1242 1245 1246
+          1265 1245 1243 1266 1246 1245 1245 1265 1266 1264 1267 1268
+          1268 1263 1264 1263 1268 1269 1270 1268 1267 1267 1271 1270
+          1268 1270 1272 1269 1265 1263 1265 1269 1273 1273 1266 1265
+          1272 1269 1268 1269 1272 1274 1274 1273 1269 1244 1246 1257
+          1275 1257 1246 1255 1257 1258 1276 1258 1257 1246 1266 1275
+          1257 1275 1276 1256 1258 1261 1277 1261 1258 1259 1261 1278
+          1258 1276 1277 1261 1277 1279 1280 1275 1266 1266 1273 1280
+          1275 1280 1281 1281 1276 1275 1282 1280 1273 1273 1274 1282
+          1283 1281 1280 1280 1282 1283 1276 1281 1284 1284 1277 1276
+          1277 1284 1285 1286 1284 1281 1281 1283 1286 1284 1286 1287
+          1252 1195 1193 1195 1252 1288 1288 1220 1195 1254 1252 1251
+          1252 1254 1289 1289 1288 1252 1290 1221 1220 1220 1288 1290
+          1221 1290 1291 1291 1222 1221 1292 1290 1288 1288 1289 1292
+          1293 1291 1290 1290 1292 1293 1260 1254 1253 1254 1260 1294
+          1294 1289 1254 1278 1260 1259 1295 1294 1260 1296 1292 1289
+          1289 1294 1296 1297 1293 1292 1292 1296 1297 1298 1296 1294
+          1299 1297 1296 1222 1291 1300 1300 1229 1222 1229 1300 1301
+          1302 1300 1291 1291 1293 1302 1300 1302 1303 1301 1230 1229
+          1230 1301 1304 1304 1231 1230 1303 1301 1300 1301 1303 1305
+          1305 1304 1301 1306 1302 1293 1293 1297 1306 1302 1306 1307
+          1308 1306 1297 1307 1303 1302 1303 1307 1309 1309 1305 1303
+          1310 1307 1306 1311 1309 1307 1260 1278 1295 1279 1278 1261
+          1312 1295 1278 1278 1279 1312 1294 1295 1298 1313 1298 1295
+          1296 1298 1299 1314 1299 1298 1295 1312 1313 1298 1313 1314
+          1285 1279 1277 1279 1285 1315 1315 1312 1279 1287 1285 1284
+          1285 1287 1316 1316 1315 1285 1317 1313 1312 1312 1315 1317
+          1313 1317 1318 1318 1314 1313 1319 1317 1315 1315 1316 1319
+          1320 1318 1317 1317 1319 1320 1297 1299 1308 1321 1308 1299
+          1306 1308 1310 1299 1314 1321 1308 1321 1322 1307 1310 1311
+          1322 1310 1308 1323 1311 1310 1310 1322 1323 1314 1318 1324
+          1324 1321 1314 1321 1324 1325 1326 1324 1318 1318 1320 1326
+          1324 1326 1327 1325 1322 1321 1322 1325 1328 1328 1323 1322
+          1327 1325 1324 1325 1327 1329 1329 1328 1325 583 585 715
+          1330 715 585 713 715 716 1331 716 715 585 1207 1330
+          715 1330 1331 714 716 719 1332 719 716 717 719 727
+          716 1331 1332 719 1332 1333 1334 1330 1207 1207 1212 1334
+          1330 1334 1335 1335 1331 1330 1336 1334 1212 1212 1213 1336
+          1337 1335 1334 1334 1336 1337 1331 1335 1338 1338 1332 1331
+          1332 1338 1339 1340 1338 1335 1335 1337 1340 1338 1340 1341
+          718 727 728 1333 727 719 1342 728 727 727 1333 1342
+          726 728 731 1343 731 728 729 731 732 1344 732 731
+          728 1342 1343 731 1343 1344 1339 1333 1332 1333 1339 1345
+          1345 1342 1333 1341 1339 1338 1339 1341 1346 1346 1345 1339
+          1347 1343 1342 1342 1345 1347 1343 1347 1348 1348 1344 1343
+          1349 1347 1345 1345 1346 1349 1350 1348 1347 1347 1349 1350
+          1351 1336 1213 1213 1226 1351 1352 1337 1336 1336 1351 1352
+          1353 1351 1226 1354 1352 1351 1355 1340 1337 1337 1352 1355
+          1340 1355 1356 1357 1355 1352 1226 1228 1353 1358 1353 1228
+          1351 1353 1354 1359 1354 1353 1228 1231 1358 1353 1358 1359
+          1352 1354 1357 1360 1357 1354 1355 1357 1361 1354 1359 1360
+          1357 1360 1362 1356 1341 1340 1341 1356 1363 1363 1346 1341
+          1361 1356 1355 1364 1363 1356 1365 1349 1346 1346 1363 1365
+          1366 1350 1349 1349 1365 1366 1367 1365 1363 1368 1366 1365
+          1356 1361 1364 1362 1361 1357 1369 1364 1361 1361 1362 1369
+          1363 1364 1367 1370 1367 1364 1365 1367 1368 1371 1368 1367
+          1364 1369 1370 1367 1370 1371 730 732 762 1372 762 732
+          760 762 764 732 1344 1372 762 1372 1373 761 764 765
+          1373 764 762 1374 765 764 764 1373 1374 1344 1348 1375
+          1375 1372 1344 1372 1375 1376 1377 1375 1348 1348 1350 1377
+          1375 1377 1378 1376 1373 1372 1373 1376 1379 1379 1374 1373
+          1378 1376 1375 1376 1378 1380 1380 1379 1376 763 765 776
+          1381 776 765 774 776 777 1382 777 776 765 1374 1381
+          776 1381 1382 775 777 780 1383 780 777 778 780 1080
+          777 1382 1383 780 1383 1384 1385 1381 1374 1374 1379 1385
+          1381 1385 1386 1386 1382 1381 1387 1385 1379 1379 1380 1387
+          1388 1386 1385 1385 1387 1388 1382 1386 1389 1389 1383 1382
+          1383 1389 1390 1391 1389 1386 1386 1388 1391 1389 1391 1392
+          1393 1377 1350 1350 1366 1393 1377 1393 1394 1395 1393 1366
+          1394 1378 1377 1378 1394 1396 1396 1380 1378 1397 1394 1393
+          1398 1396 1394 1366 1368 1395 1399 1395 1368 1393 1395 1397
+          1368 1371 1399 1395 1399 1400 1394 1397 1398 1400 1397 1395
+          1401 1398 1397 1397 1400 1401 1402 1387 1380 1380 1396 1402
+          1403 1388 1387 1387 1402 1403 1404 1402 1396 1405 1403 1402
+          1406 1391 1388 1388 1403 1406 1391 1406 1407 1408 1406 1403
+          1396 1398 1404 1409 1404 1398 1402 1404 1405 1410 1405 1404
+          1398 1401 1409 1404 1409 1410 1403 1405 1408 1411 1408 1405
+          1406 1408 1412 1405 1410 1411 1408 1411 1413 1414 1358 1231
+          1231 1304 1414 1358 1414 1415 1415 1359 1358 1416 1414 1304
+          1304 1305 1416 1417 1415 1414 1414 1416 1417 1359 1415 1418
+          1418 1360 1359 1360 1418 1419 1420 1418 1415 1415 1417 1420
+          1418 1420 1421 1422 1416 1305 1305 1309 1422 1423 1417 1416
+          1416 1422 1423 1424 1422 1309 1425 1423 1422 1426 1420 1417
+          1417 1423 1426 1420 1426 1427 1428 1426 1423 1419 1362 1360
+          1362 1419 1429 1429 1369 1362 1421 1419 1418 1419 1421 1430
+          1430 1429 1419 1431 1370 1369 1369 1429 1431 1370 1431 1432
+          1432 1371 1370 1433 1431 1429 1429 1430 1433 1434 1432 1431
+          1431 1433 1434 1427 1421 1420 1421 1427 1435 1435 1430 1421
+          1436 1427 1426 1437 1435 1427 1438 1433 1430 1430 1435 1438
+          1439 1434 1433 1433 1438 1439 1440 1438 1435 1441 1439 1438
+          1309 1311 1424 1442 1424 1311 1422 1424 1425 1443 1425 1424
+          1311 1323 1442 1424 1442 1443 1423 1425 1428 1444 1428 1425
+          1426 1428 1436 1425 1443 1444 1428 1444 1445 1446 1442 1323
+          1323 1328 1446 1442 1446 1447 1447 1443 1442 1448 1446 1328
+          1328 1329 1448 1449 1447 1446 1446 1448 1449 1443 1447 1450
+          1450 1444 1443 1444 1450 1451 1452 1450 1447 1447 1449 1452
+          1450 1452 1453 1427 1436 1437 1445 1436 1428 1454 1437 1436
+          1436 1445 1454 1435 1437 1440 1455 1440 1437 1438 1440 1441
+          1456 1441 1440 1437 1454 1455 1440 1455 1456 1451 1445 1444
+          1445 1451 1457 1457 1454 1445 1453 1451 1450 1451 1453 1458
+          1458 1457 1451 1459 1455 1454 1454 1457 1459 1455 1459 1460
+          1460 1456 1455 1461 1459 1457 1457 1458 1461 1462 1460 1459
+          1459 1461 1462 1371 1432 1463 1463 1399 1371 1399 1463 1464
+          1465 1463 1432 1432 1434 1465 1463 1465 1466 1464 1400 1399
+          1400 1464 1467 1467 1401 1400 1466 1464 1463 1464 1466 1468
+          1468 1467 1464 1469 1465 1434 1434 1439 1469 1465 1469 1470
+          1471 1469 1439 1470 1466 1465 1466 1470 1472 1472 1468 1466
+          1473 1470 1469 1474 1472 1470 1475 1409 1401 1401 1467 1475
+          1409 1475 1476 1476 1410 1409 1477 1475 1467 1467 1468 1477
+          1478 1476 1475 1475 1477 1478 1410 1476 1479 1479 1411 1410
+          1411 1479 1480 1481 1479 1476 1476 1478 1481 1479 1481 1482
+          1483 1477 1468 1468 1472 1483 1484 1478 1477 1477 1483 1484
+          1485 1483 1472 1486 1484 1483 1487 1481 1478 1478 1484 1487
+          1481 1487 1488 1489 1487 1484 1439 1441 1471 1490 1471 1441
+          1469 1471 1473 1441 1456 1490 1471 1490 1491 1470 1473 1474
+          1491 1473 1471 1492 1474 1473 1473 1491 1492 1456 1460 1493
+          1493 1490 1456 1490 1493 1494 1495 1493 1460 1460 1462 1495
+          1493 1495 1496 1494 1491 1490 1491 1494 1497 1497 1492 1491
+          1496 1494 1493 1494 1496 1498 1498 1497 1494 1472 1474 1485
+          1499 1485 1474 1483 1485 1486 1500 1486 1485 1474 1492 1499
+          1485 1499 1500 1484 1486 1489 1501 1489 1486 1487 1489 1502
+          1486 1500 1501 1489 1501 1503 1504 1499 1492 1492 1497 1504
+          1499 1504 1505 1505 1500 1499 1506 1504 1497 1497 1498 1506
+          1507 1505 1504 1504 1506 1507 1500 1505 1508 1508 1501 1500
+          1501 1508 1509 1510 1508 1505 1505 1507 1510 1508 1510 1511
+          779 1080 1081 1384 1080 780 1512 1081 1080 1080 1384 1512
+          1079 1081 1084 1513 1084 1081 1082 1084 1085 1514 1085 1084
+          1081 1512 1513 1084 1513 1514 1390 1384 1383 1384 1390 1515
+          1515 1512 1384 1392 1390 1389 1390 1392 1516 1516 1515 1390
+          1517 1513 1512 1512 1515 1517 1513 1517 1518 1518 1514 1513
+          1519 1517 1515 1515 1516 1519 1520 1518 1517 1517 1519 1520
+          1083 1085 1094 1521 1094 1085 1092 1094 1096 1085 1514 1521
+          1094 1521 1522 1093 1096 1097 1522 1096 1094 1523 1097 1096
+          1096 1522 1523 1514 1518 1524 1524 1521 1514 1521 1524 1525
+          1526 1524 1518 1518 1520 1526 1524 1526 1527 1525 1522 1521
+          1522 1525 1528 1528 1523 1522 1527 1525 1524 1525 1527 1529
+          1529 1528 1525 1407 1392 1391 1392 1407 1530 1530 1516 1392
+          1412 1407 1406 1531 1530 1407 1532 1519 1516 1516 1530 1532
+          1533 1520 1519 1519 1532 1533 1534 1532 1530 1535 1533 1532
+          1407 1412 1531 1413 1412 1408 1536 1531 1412 1412 1413 1536
+          1530 1531 1534 1537 1534 1531 1532 1534 1535 1538 1535 1534
+          1531 1536 1537 1534 1537 1538 1539 1526 1520 1520 1533 1539
+          1526 1539 1540 1541 1539 1533 1540 1527 1526 1527 1540 1542
+          1542 1529 1527 1543 1540 1539 1544 1542 1540 1533 1535 1541
+          1545 1541 1535 1539 1541 1543 1535 1538 1545 1541 1545 1546
+          1540 1543 1544 1546 1543 1541 1547 1544 1543 1543 1546 1547
+          1095 1097 1129 1548 1129 1097 1127 1129 1130 1549 1130 1129
+          1097 1523 1548 1129 1548 1549 1128 1130 1133 1550 1133 1130
+          1131 1133 1141 1130 1549 1550 1133 1550 1551 1552 1548 1523
+          1523 1528 1552 1548 1552 1553 1553 1549 1548 1554 1552 1528
+          1528 1529 1554 1555 1553 1552 1552 1554 1555 1549 1553 1556
+          1556 1550 1549 1550 1556 1557 1558 1556 1553 1553 1555 1558
+          1556 1558 1559 1132 1141 1142 1551 1141 1133 1560 1142 1141
+          1141 1551 1560 1140 1142 1145 1561 1145 1142 1143 1145 1146
+          1562 1146 1145 1142 1560 1561 1145 1561 1562 1557 1551 1550
+          1551 1557 1563 1563 1560 1551 1559 1557 1556 1557 1559 1564
+          1564 1563 1557 1565 1561 1560 1560 1563 1565 1561 1565 1566
+          1566 1562 1561 1567 1565 1563 1563 1564 1567 1568 1566 1565
+          1565 1567 1568 1569 1554 1529 1529 1542 1569 1570 1555 1554
+          1554 1569 1570 1571 1569 1542 1572 1570 1569 1573 1558 1555
+          1555 1570 1573 1558 1573 1574 1575 1573 1570 1542 1544 1571
+          1576 1571 1544 1569 1571 1572 1577 1572 1571 1544 1547 1576
+          1571 1576 1577 1570 1572 1575 1578 1575 1572 1573 1575 1579
+          1572 1577 1578 1575 1578 1580 1574 1559 1558 1559 1574 1581
+          1581 1564 1559 1579 1574 1573 1582 1581 1574 1583 1567 1564
+          1564 1581 1583 1584 1568 1567 1567 1583 1584 1585 1583 1581
+          1586 1584 1583 1574 1579 1582 1580 1579 1575 1587 1582 1579
+          1579 1580 1587 1581 1582 1585 1588 1585 1582 1583 1585 1586
+          1589 1586 1585 1582 1587 1588 1585 1588 1589 1480 1413 1411
+          1413 1480 1590 1590 1536 1413 1482 1480 1479 1480 1482 1591
+          1591 1590 1480 1592 1537 1536 1536 1590 1592 1537 1592 1593
+          1593 1538 1537 1594 1592 1590 1590 1591 1594 1595 1593 1592
+          1592 1594 1595 1488 1482 1481 1482 1488 1596 1596 1591 1482
+          1502 1488 1487 1597 1596 1488 1598 1594 1591 1591 1596 1598
+          1599 1595 1594 1594 1598 1599 1600 1598 1596 1601 1599 1598
+          1538 1593 1602 1602 1545 1538 1545 1602 1603 1604 1602 1593
+          1593 1595 1604 1602 1604 1605 1603 1546 1545 1546 1603 1606
+          1606 1547 1546 1605 1603 1602 1603 1605 1607 1607 1606 1603
+          1608 1604 1595 1595 1599 1608 1604 1608 1609 1610 1608 1599
+          1609 1605 1604 1605 1609 1611 1611 1607 1605 1612 1609 1608
+          1613 1611 1609 1488 1502 1597 1503 1502 1489 1614 1597 1502
+          1502 1503 1614 1596 1597 1600 1615 1600 1597 1598 1600 1601
+          1616 1601 1600 1597 1614 1615 1600 1615 1616 1509 1503 1501
+          1503 1509 1617 1617 1614 1503 1511 1509 1508 1509 1511 1618
+          1618 1617 1509 1619 1615 1614 1614 1617 1619 1615 1619 1620
+          1620 1616 1615 1621 1619 1617 1617 1618 1621 1622 1620 1619
+          1619 1621 1622 1599 1601 1610 1623 1610 1601 1608 1610 1612
+          1601 1616 1623 1610 1623 1624 1609 1612 1613 1624 1612 1610
+          1625 1613 1612 1612 1624 1625 1616 1620 1626 1626 1623 1616
+          1623 1626 1627 1628 1626 1620 1620 1622 1628 1626 1628 1629
+          1627 1624 1623 1624 1627 1630 1630 1625 1624 1629 1627 1626
+          1627 1629 1631 1631 1630 1627 1632 1576 1547 1547 1606 1632
+          1576 1632 1633 1633 1577 1576 1634 1632 1606 1606 1607 1634
+          1635 1633 1632 1632 1634 1635 1577 1633 1636 1636 1578 1577
+          1578 1636 1637 1638 1636 1633 1633 1635 1638 1636 1638 1639
+          1640 1634 1607 1607 1611 1640 1641 1635 1634 1634 1640 1641
+          1642 1640 1611 1643 1641 1640 1644 1638 1635 1635 1641 1644
+          1638 1644 1645 1646 1644 1641 1637 1580 1578 1580 1637 1647
+          1647 1587 1580 1639 1637 1636 1637 1639 1648 1648 1647 1637
+          1649 1588 1587 1587 1647 1649 1588 1649 1650 1650 1589 1588
+          1651 1649 1647 1647 1648 1651 1652 1650 1649 1649 1651 1652
+          1645 1639 1638 1639 1645 1653 1653 1648 1639 1654 1645 1644
+          1655 1653 1645 1656 1651 1648 1648 1653 1656 1657 1652 1651
+          1651 1656 1657 1658 1656 1653 1659 1657 1656 1611 1613 1642
+          1660 1642 1613 1640 1642 1643 1661 1643 1642 1613 1625 1660
+          1642 1660 1661 1641 1643 1646 1662 1646 1643 1644 1646 1654
+          1643 1661 1662 1646 1662 1663 1664 1660 1625 1625 1630 1664
+          1660 1664 1665 1665 1661 1660 1666 1664 1630 1630 1631 1666
+          1667 1665 1664 1664 1666 1667 1661 1665 1668 1668 1662 1661
+          1662 1668 1669 1670 1668 1665 1665 1667 1670 1668 1670 1671
+          1645 1654 1655 1663 1654 1646 1672 1655 1654 1654 1663 1672
+          1653 1655 1658 1673 1658 1655 1656 1658 1659 1674 1659 1658
+          1655 1672 1673 1658 1673 1674 1669 1663 1662 1663 1669 1675
+          1675 1672 1663 1671 1669 1668 1669 1671 1676 1676 1675 1669
+          1677 1673 1672 1672 1675 1677 1673 1677 1678 1678 1674 1673
+          1679 1677 1675 1675 1676 1679 1680 1678 1677 1677 1679 1680
+        </DataArray>
+        <DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii">
+          3 6 9 12 15 18 21 24 27 30 33 36
+          39 42 45 48 51 54 57 60 63 66 69 72
+          75 78 81 84 87 90 93 96 99 102 105 108
+          111 114 117 120 123 126 129 132 135 138 141 144
+          147 150 153 156 159 162 165 168 171 174 177 180
+          183 186 189 192 195 198 201 204 207 210 213 216
+          219 222 225 228 231 234 237 240 243 246 249 252
+          255 258 261 264 267 270 273 276 279 282 285 288
+          291 294 297 300 303 306 309 312 315 318 321 324
+          327 330 333 336 339 342 345 348 351 354 357 360
+          363 366 369 372 375 378 381 384 387 390 393 396
+          399 402 405 408 411 414 417 420 423 426 429 432
+          435 438 441 444 447 450 453 456 459 462 465 468
+          471 474 477 480 483 486 489 492 495 498 501 504
+          507 510 513 516 519 522 525 528 531 534 537 540
+          543 546 549 552 555 558 561 564 567 570 573 576
+          579 582 585 588 591 594 597 600 603 606 609 612
+          615 618 621 624 627 630 633 636 639 642 645 648
+          651 654 657 660 663 666 669 672 675 678 681 684
+          687 690 693 696 699 702 705 708 711 714 717 720
+          723 726 729 732 735 738 741 744 747 750 753 756
+          759 762 765 768 771 774 777 780 783 786 789 792
+          795 798 801 804 807 810 813 816 819 822 825 828
+          831 834 837 840 843 846 849 852 855 858 861 864
+          867 870 873 876 879 882 885 888 891 894 897 900
+          903 906 909 912 915 918 921 924 927 930 933 936
+          939 942 945 948 951 954 957 960 963 966 969 972
+          975 978 981 984 987 990 993 996 999 1002 1005 1008
+          1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044
+          1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080
+          1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116
+          1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152
+          1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188
+          1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224
+          1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260
+          1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296
+          1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332
+          1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368
+          1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404
+          1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440
+          1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476
+          1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512
+          1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548
+          1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584
+          1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620
+          1623 1626 1629 1632 1635 1638 1641 1644 1647 1650 1653 1656
+          1659 1662 1665 1668 1671 1674 1677 1680 1683 1686 1689 1692
+          1695 1698 1701 1704 1707 1710 1713 1716 1719 1722 1725 1728
+          1731 1734 1737 1740 1743 1746 1749 1752 1755 1758 1761 1764
+          1767 1770 1773 1776 1779 1782 1785 1788 1791 1794 1797 1800
+          1803 1806 1809 1812 1815 1818 1821 1824 1827 1830 1833 1836
+          1839 1842 1845 1848 1851 1854 1857 1860 1863 1866 1869 1872
+          1875 1878 1881 1884 1887 1890 1893 1896 1899 1902 1905 1908
+          1911 1914 1917 1920 1923 1926 1929 1932 1935 1938 1941 1944
+          1947 1950 1953 1956 1959 1962 1965 1968 1971 1974 1977 1980
+          1983 1986 1989 1992 1995 1998 2001 2004 2007 2010 2013 2016
+          2019 2022 2025 2028 2031 2034 2037 2040 2043 2046 2049 2052
+          2055 2058 2061 2064 2067 2070 2073 2076 2079 2082 2085 2088
+          2091 2094 2097 2100 2103 2106 2109 2112 2115 2118 2121 2124
+          2127 2130 2133 2136 2139 2142 2145 2148 2151 2154 2157 2160
+          2163 2166 2169 2172 2175 2178 2181 2184 2187 2190 2193 2196
+          2199 2202 2205 2208 2211 2214 2217 2220 2223 2226 2229 2232
+          2235 2238 2241 2244 2247 2250 2253 2256 2259 2262 2265 2268
+          2271 2274 2277 2280 2283 2286 2289 2292 2295 2298 2301 2304
+          2307 2310 2313 2316 2319 2322 2325 2328 2331 2334 2337 2340
+          2343 2346 2349 2352 2355 2358 2361 2364 2367 2370 2373 2376
+          2379 2382 2385 2388 2391 2394 2397 2400 2403 2406 2409 2412
+          2415 2418 2421 2424 2427 2430 2433 2436 2439 2442 2445 2448
+          2451 2454 2457 2460 2463 2466 2469 2472 2475 2478 2481 2484
+          2487 2490 2493 2496 2499 2502 2505 2508 2511 2514 2517 2520
+          2523 2526 2529 2532 2535 2538 2541 2544 2547 2550 2553 2556
+          2559 2562 2565 2568 2571 2574 2577 2580 2583 2586 2589 2592
+          2595 2598 2601 2604 2607 2610 2613 2616 2619 2622 2625 2628
+          2631 2634 2637 2640 2643 2646 2649 2652 2655 2658 2661 2664
+          2667 2670 2673 2676 2679 2682 2685 2688 2691 2694 2697 2700
+          2703 2706 2709 2712 2715 2718 2721 2724 2727 2730 2733 2736
+          2739 2742 2745 2748 2751 2754 2757 2760 2763 2766 2769 2772
+          2775 2778 2781 2784 2787 2790 2793 2796 2799 2802 2805 2808
+          2811 2814 2817 2820 2823 2826 2829 2832 2835 2838 2841 2844
+          2847 2850 2853 2856 2859 2862 2865 2868 2871 2874 2877 2880
+          2883 2886 2889 2892 2895 2898 2901 2904 2907 2910 2913 2916
+          2919 2922 2925 2928 2931 2934 2937 2940 2943 2946 2949 2952
+          2955 2958 2961 2964 2967 2970 2973 2976 2979 2982 2985 2988
+          2991 2994 2997 3000 3003 3006 3009 3012 3015 3018 3021 3024
+          3027 3030 3033 3036 3039 3042 3045 3048 3051 3054 3057 3060
+          3063 3066 3069 3072 3075 3078 3081 3084 3087 3090 3093 3096
+          3099 3102 3105 3108 3111 3114 3117 3120 3123 3126 3129 3132
+          3135 3138 3141 3144 3147 3150 3153 3156 3159 3162 3165 3168
+          3171 3174 3177 3180 3183 3186 3189 3192 3195 3198 3201 3204
+          3207 3210 3213 3216 3219 3222 3225 3228 3231 3234 3237 3240
+          3243 3246 3249 3252 3255 3258 3261 3264 3267 3270 3273 3276
+          3279 3282 3285 3288 3291 3294 3297 3300 3303 3306 3309 3312
+          3315 3318 3321 3324 3327 3330 3333 3336 3339 3342 3345 3348
+          3351 3354 3357 3360 3363 3366 3369 3372 3375 3378 3381 3384
+          3387 3390 3393 3396 3399 3402 3405 3408 3411 3414 3417 3420
+          3423 3426 3429 3432 3435 3438 3441 3444 3447 3450 3453 3456
+          3459 3462 3465 3468 3471 3474 3477 3480 3483 3486 3489 3492
+          3495 3498 3501 3504 3507 3510 3513 3516 3519 3522 3525 3528
+          3531 3534 3537 3540 3543 3546 3549 3552 3555 3558 3561 3564
+          3567 3570 3573 3576 3579 3582 3585 3588 3591 3594 3597 3600
+          3603 3606 3609 3612 3615 3618 3621 3624 3627 3630 3633 3636
+          3639 3642 3645 3648 3651 3654 3657 3660 3663 3666 3669 3672
+          3675 3678 3681 3684 3687 3690 3693 3696 3699 3702 3705 3708
+          3711 3714 3717 3720 3723 3726 3729 3732 3735 3738 3741 3744
+          3747 3750 3753 3756 3759 3762 3765 3768 3771 3774 3777 3780
+          3783 3786 3789 3792 3795 3798 3801 3804 3807 3810 3813 3816
+          3819 3822 3825 3828 3831 3834 3837 3840 3843 3846 3849 3852
+          3855 3858 3861 3864 3867 3870 3873 3876 3879 3882 3885 3888
+          3891 3894 3897 3900 3903 3906 3909 3912 3915 3918 3921 3924
+          3927 3930 3933 3936 3939 3942 3945 3948 3951 3954 3957 3960
+          3963 3966 3969 3972 3975 3978 3981 3984 3987 3990 3993 3996
+          3999 4002 4005 4008 4011 4014 4017 4020 4023 4026 4029 4032
+          4035 4038 4041 4044 4047 4050 4053 4056 4059 4062 4065 4068
+          4071 4074 4077 4080 4083 4086 4089 4092 4095 4098 4101 4104
+          4107 4110 4113 4116 4119 4122 4125 4128 4131 4134 4137 4140
+          4143 4146 4149 4152 4155 4158 4161 4164 4167 4170 4173 4176
+          4179 4182 4185 4188 4191 4194 4197 4200 4203 4206 4209 4212
+          4215 4218 4221 4224 4227 4230 4233 4236 4239 4242 4245 4248
+          4251 4254 4257 4260 4263 4266 4269 4272 4275 4278 4281 4284
+          4287 4290 4293 4296 4299 4302 4305 4308 4311 4314 4317 4320
+          4323 4326 4329 4332 4335 4338 4341 4344 4347 4350 4353 4356
+          4359 4362 4365 4368 4371 4374 4377 4380 4383 4386 4389 4392
+          4395 4398 4401 4404 4407 4410 4413 4416 4419 4422 4425 4428
+          4431 4434 4437 4440 4443 4446 4449 4452 4455 4458 4461 4464
+          4467 4470 4473 4476 4479 4482 4485 4488 4491 4494 4497 4500
+          4503 4506 4509 4512 4515 4518 4521 4524 4527 4530 4533 4536
+          4539 4542 4545 4548 4551 4554 4557 4560 4563 4566 4569 4572
+          4575 4578 4581 4584 4587 4590 4593 4596 4599 4602 4605 4608
+          4611 4614 4617 4620 4623 4626 4629 4632 4635 4638 4641 4644
+          4647 4650 4653 4656 4659 4662 4665 4668 4671 4674 4677 4680
+          4683 4686 4689 4692 4695 4698 4701 4704 4707 4710 4713 4716
+          4719 4722 4725 4728 4731 4734 4737 4740 4743 4746 4749 4752
+          4755 4758 4761 4764 4767 4770 4773 4776 4779 4782 4785 4788
+          4791 4794 4797 4800 4803 4806 4809 4812 4815 4818 4821 4824
+          4827 4830 4833 4836 4839 4842 4845 4848 4851 4854 4857 4860
+          4863 4866 4869 4872 4875 4878 4881 4884 4887 4890 4893 4896
+          4899 4902 4905 4908 4911 4914 4917 4920 4923 4926 4929 4932
+          4935 4938 4941 4944 4947 4950 4953 4956 4959 4962 4965 4968
+          4971 4974 4977 4980 4983 4986 4989 4992 4995 4998 5001 5004
+          5007 5010 5013 5016 5019 5022 5025 5028 5031 5034 5037 5040
+          5043 5046 5049 5052 5055 5058 5061 5064 5067 5070 5073 5076
+          5079 5082 5085 5088 5091 5094 5097 5100 5103 5106 5109 5112
+          5115 5118 5121 5124 5127 5130 5133 5136 5139 5142 5145 5148
+          5151 5154 5157 5160 5163 5166 5169 5172 5175 5178 5181 5184
+          5187 5190 5193 5196 5199 5202 5205 5208 5211 5214 5217 5220
+          5223 5226 5229 5232 5235 5238 5241 5244 5247 5250 5253 5256
+          5259 5262 5265 5268 5271 5274 5277 5280 5283 5286 5289 5292
+          5295 5298 5301 5304 5307 5310 5313 5316 5319 5322 5325 5328
+          5331 5334 5337 5340 5343 5346 5349 5352 5355 5358 5361 5364
+          5367 5370 5373 5376 5379 5382 5385 5388 5391 5394 5397 5400
+          5403 5406 5409 5412 5415 5418 5421 5424 5427 5430 5433 5436
+          5439 5442 5445 5448 5451 5454 5457 5460 5463 5466 5469 5472
+          5475 5478 5481 5484 5487 5490 5493 5496 5499 5502 5505 5508
+          5511 5514 5517 5520 5523 5526 5529 5532 5535 5538 5541 5544
+          5547 5550 5553 5556 5559 5562 5565 5568 5571 5574 5577 5580
+          5583 5586 5589 5592 5595 5598 5601 5604 5607 5610 5613 5616
+          5619 5622 5625 5628 5631 5634 5637 5640 5643 5646 5649 5652
+          5655 5658 5661 5664 5667 5670 5673 5676 5679 5682 5685 5688
+          5691 5694 5697 5700 5703 5706 5709 5712 5715 5718 5721 5724
+          5727 5730 5733 5736 5739 5742 5745 5748 5751 5754 5757 5760
+          5763 5766 5769 5772 5775 5778 5781 5784 5787 5790 5793 5796
+          5799 5802 5805 5808 5811 5814 5817 5820 5823 5826 5829 5832
+          5835 5838 5841 5844 5847 5850 5853 5856 5859 5862 5865 5868
+          5871 5874 5877 5880 5883 5886 5889 5892 5895 5898 5901 5904
+          5907 5910 5913 5916 5919 5922 5925 5928 5931 5934 5937 5940
+          5943 5946 5949 5952 5955 5958 5961 5964 5967 5970 5973 5976
+          5979 5982 5985 5988 5991 5994 5997 6000 6003 6006 6009 6012
+          6015 6018 6021 6024 6027 6030 6033 6036 6039 6042 6045 6048
+          6051 6054 6057 6060 6063 6066 6069 6072 6075 6078 6081 6084
+          6087 6090 6093 6096 6099 6102 6105 6108 6111 6114 6117 6120
+          6123 6126 6129 6132 6135 6138 6141 6144 6147 6150 6153 6156
+          6159 6162 6165 6168 6171 6174 6177 6180 6183 6186 6189 6192
+          6195 6198 6201 6204 6207 6210 6213 6216 6219 6222 6225 6228
+          6231 6234 6237 6240 6243 6246 6249 6252 6255 6258 6261 6264
+          6267 6270 6273 6276 6279 6282 6285 6288 6291 6294 6297 6300
+          6303 6306 6309 6312 6315 6318 6321 6324 6327 6330 6333 6336
+          6339 6342 6345 6348 6351 6354 6357 6360 6363 6366 6369 6372
+          6375 6378 6381 6384 6387 6390 6393 6396 6399 6402 6405 6408
+          6411 6414 6417 6420 6423 6426 6429 6432 6435 6438 6441 6444
+          6447 6450 6453 6456 6459 6462 6465 6468 6471 6474 6477 6480
+          6483 6486 6489 6492 6495 6498 6501 6504 6507 6510 6513 6516
+          6519 6522 6525 6528 6531 6534 6537 6540 6543 6546 6549 6552
+          6555 6558 6561 6564 6567 6570 6573 6576 6579 6582 6585 6588
+          6591 6594 6597 6600 6603 6606 6609 6612 6615 6618 6621 6624
+          6627 6630 6633 6636 6639 6642 6645 6648 6651 6654 6657 6660
+          6663 6666 6669 6672 6675 6678 6681 6684 6687 6690 6693 6696
+          6699 6702 6705 6708 6711 6714 6717 6720 6723 6726 6729 6732
+          6735 6738 6741 6744 6747 6750 6753 6756 6759 6762 6765 6768
+          6771 6774 6777 6780 6783 6786 6789 6792 6795 6798 6801 6804
+          6807 6810 6813 6816 6819 6822 6825 6828 6831 6834 6837 6840
+          6843 6846 6849 6852 6855 6858 6861 6864 6867 6870 6873 6876
+          6879 6882 6885 6888 6891 6894 6897 6900 6903 6906 6909 6912
+          6915 6918 6921 6924 6927 6930 6933 6936 6939 6942 6945 6948
+          6951 6954 6957 6960 6963 6966 6969 6972 6975 6978 6981 6984
+          6987 6990 6993 6996 6999 7002 7005 7008 7011 7014 7017 7020
+          7023 7026 7029 7032 7035 7038 7041 7044 7047 7050 7053 7056
+          7059 7062 7065 7068 7071 7074 7077 7080 7083 7086 7089 7092
+          7095 7098 7101 7104 7107 7110 7113 7116 7119 7122 7125 7128
+          7131 7134 7137 7140 7143 7146 7149 7152 7155 7158 7161 7164
+          7167 7170 7173 7176 7179 7182 7185 7188 7191 7194 7197 7200
+          7203 7206 7209 7212 7215 7218 7221 7224 7227 7230 7233 7236
+          7239 7242 7245 7248 7251 7254 7257 7260 7263 7266 7269 7272
+          7275 7278 7281 7284 7287 7290 7293 7296 7299 7302 7305 7308
+          7311 7314 7317 7320 7323 7326 7329 7332 7335 7338 7341 7344
+          7347 7350 7353 7356 7359 7362 7365 7368 7371 7374 7377 7380
+          7383 7386 7389 7392 7395 7398 7401 7404 7407 7410 7413 7416
+          7419 7422 7425 7428 7431 7434 7437 7440 7443 7446 7449 7452
+          7455 7458 7461 7464 7467 7470 7473 7476 7479 7482 7485 7488
+          7491 7494 7497 7500 7503 7506 7509 7512 7515 7518 7521 7524
+          7527 7530 7533 7536 7539 7542 7545 7548 7551 7554 7557 7560
+          7563 7566 7569 7572 7575 7578 7581 7584 7587 7590 7593 7596
+          7599 7602 7605 7608 7611 7614 7617 7620 7623 7626 7629 7632
+          7635 7638 7641 7644 7647 7650 7653 7656 7659 7662 7665 7668
+          7671 7674 7677 7680 7683 7686 7689 7692 7695 7698 7701 7704
+          7707 7710 7713 7716 7719 7722 7725 7728 7731 7734 7737 7740
+          7743 7746 7749 7752 7755 7758 7761 7764 7767 7770 7773 7776
+          7779 7782 7785 7788 7791 7794 7797 7800 7803 7806 7809 7812
+          7815 7818 7821 7824 7827 7830 7833 7836 7839 7842 7845 7848
+          7851 7854 7857 7860 7863 7866 7869 7872 7875 7878 7881 7884
+          7887 7890 7893 7896 7899 7902 7905 7908 7911 7914 7917 7920
+          7923 7926 7929 7932 7935 7938 7941 7944 7947 7950 7953 7956
+          7959 7962 7965 7968 7971 7974 7977 7980 7983 7986 7989 7992
+          7995 7998 8001 8004 8007 8010 8013 8016 8019 8022 8025 8028
+          8031 8034 8037 8040 8043 8046 8049 8052 8055 8058 8061 8064
+          8067 8070 8073 8076 8079 8082 8085 8088 8091 8094 8097 8100
+          8103 8106 8109 8112 8115 8118 8121 8124 8127 8130 8133 8136
+          8139 8142 8145 8148 8151 8154 8157 8160 8163 8166 8169 8172
+          8175 8178 8181 8184 8187 8190 8193 8196 8199 8202 8205 8208
+          8211 8214 8217 8220 8223 8226 8229 8232 8235 8238 8241 8244
+          8247 8250 8253 8256 8259 8262 8265 8268 8271 8274 8277 8280
+          8283 8286 8289 8292 8295 8298 8301 8304 8307 8310 8313 8316
+          8319 8322 8325 8328 8331 8334 8337 8340 8343 8346 8349 8352
+          8355 8358 8361 8364 8367 8370 8373 8376 8379 8382 8385 8388
+          8391 8394 8397 8400 8403 8406 8409 8412 8415 8418 8421 8424
+          8427 8430 8433 8436 8439 8442 8445 8448 8451 8454 8457 8460
+          8463 8466 8469 8472 8475 8478 8481 8484 8487 8490 8493 8496
+          8499 8502 8505 8508 8511 8514 8517 8520 8523 8526 8529 8532
+          8535 8538 8541 8544 8547 8550 8553 8556 8559 8562 8565 8568
+          8571 8574 8577 8580 8583 8586 8589 8592 8595 8598 8601 8604
+          8607 8610 8613 8616 8619 8622 8625 8628 8631 8634 8637 8640
+          8643 8646 8649 8652 8655 8658 8661 8664 8667 8670 8673 8676
+          8679 8682 8685 8688 8691 8694 8697 8700 8703 8706 8709 8712
+          8715 8718 8721 8724 8727 8730 8733 8736 8739 8742 8745 8748
+          8751 8754 8757 8760 8763 8766 8769 8772 8775 8778 8781 8784
+          8787 8790 8793 8796 8799 8802 8805 8808 8811 8814 8817 8820
+          8823 8826 8829 8832 8835 8838 8841 8844 8847 8850 8853 8856
+          8859 8862 8865 8868 8871 8874 8877 8880 8883 8886 8889 8892
+          8895 8898 8901 8904 8907 8910 8913 8916 8919 8922 8925 8928
+          8931 8934 8937 8940 8943 8946 8949 8952 8955 8958 8961 8964
+          8967 8970 8973 8976 8979 8982 8985 8988 8991 8994 8997 9000
+          9003 9006 9009 9012 9015 9018 9021 9024 9027 9030 9033 9036
+          9039 9042 9045 9048 9051 9054 9057 9060 9063 9066 9069 9072
+          9075 9078 9081 9084 9087 9090 9093 9096 9099 9102 9105 9108
+          9111 9114 9117 9120 9123 9126 9129 9132 9135 9138 9141 9144
+          9147 9150 9153 9156 9159 9162 9165 9168 9171 9174 9177 9180
+          9183 9186 9189 9192 9195 9198 9201 9204 9207 9210 9213 9216
+          9219 9222 9225 9228 9231 9234 9237 9240 9243 9246 9249 9252
+          9255 9258 9261 9264 9267 9270 9273 9276 9279 9282 9285 9288
+          9291 9294 9297 9300 9303 9306 9309 9312 9315 9318 9321 9324
+          9327 9330 9333 9336 9339 9342 9345 9348 9351 9354 9357 9360
+          9363 9366 9369 9372 9375 9378 9381 9384 9387 9390 9393 9396
+          9399 9402 9405 9408 9411 9414 9417 9420 9423 9426 9429 9432
+          9435 9438 9441 9444 9447 9450 9453 9456 9459 9462 9465 9468
+          9471 9474 9477 9480 9483 9486 9489 9492 9495 9498 9501 9504
+          9507 9510 9513 9516 9519 9522 9525 9528 9531 9534 9537 9540
+          9543 9546 9549 9552 9555 9558 9561 9564 9567 9570 9573 9576
+          9579 9582 9585 9588 9591 9594 9597 9600
+        </DataArray>
+        <DataArray type="UInt8" Name="types" NumberOfComponents="1" format="ascii">
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5 5 5 5 5
+          5 5 5 5 5 5 5 5
+        </DataArray>
+      </Cells>
+    </Piece>
+  </UnstructuredGrid>
+</VTKFile>
-- 
GitLab


From 905ce1d9658211e3e054215bd5093d614679544a Mon Sep 17 00:00:00 2001
From: Timo Koch <timokoch@uio.no>
Date: Sat, 3 Aug 2024 00:41:31 +0200
Subject: [PATCH 09/24] [cvfe] Add a separate header for LocalDof

---
 dumux/discretization/cvfe/localdof.hh         | 54 +++++++++++++++++++
 .../pq1bubble/fvelementgeometry.hh            | 25 ++-------
 2 files changed, 58 insertions(+), 21 deletions(-)
 create mode 100644 dumux/discretization/cvfe/localdof.hh

diff --git a/dumux/discretization/cvfe/localdof.hh b/dumux/discretization/cvfe/localdof.hh
new file mode 100644
index 0000000000..1d2302cf7e
--- /dev/null
+++ b/dumux/discretization/cvfe/localdof.hh
@@ -0,0 +1,54 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+//
+// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+/*!
+ * \file
+ * \ingroup CVFEDiscretization
+ * \brief Classes representing dofs on elements for control-volume finite element schemes
+ */
+#ifndef DUMUX_CVFE_LOCAL_DOF_HH
+#define DUMUX_CVFE_LOCAL_DOF_HH
+
+#include <dumux/common/indextraits.hh>
+
+namespace Dumux::CVFE {
+
+/*!
+ * \ingroup CVFEDiscretization
+ * \brief A local degree of freedom from an element perspective
+ */
+template<class LocalIndex>
+class LocalDof
+{
+public:
+    LocalDof(LocalIndex index) : index_(index) {}
+    LocalIndex index() const { return index_; }
+private:
+    LocalIndex index_;
+};
+
+/*!
+ * \ingroup CVFEDiscretization
+ * \brief A local degree of freedom associated with a (sub-)control volume from an element perspective
+ */
+template<class FVElementGeometry>
+class FVLocalDof : public LocalDof<typename IndexTraits<typename FVElementGeometry::GridGeometry::GridView>::LocalIndex>
+{
+    using LocalIndex = typename IndexTraits<typename FVElementGeometry::GridGeometry::GridView>::LocalIndex;
+    using ParentType = LocalDof<LocalIndex>;
+public:
+    FVLocalDof(LocalIndex dofIndex, const FVElementGeometry& fvGeometry)
+    : ParentType(dofIndex), fvGeometry_(fvGeometry) {}
+
+    const typename FVElementGeometry::SubControlVolume& scv() const
+    { return fvGeometry_.scv(this->index()); }
+private:
+    const FVElementGeometry& fvGeometry_;
+};
+
+} // end namespace Dumux::CVFE
+
+#endif
diff --git a/dumux/discretization/pq1bubble/fvelementgeometry.hh b/dumux/discretization/pq1bubble/fvelementgeometry.hh
index 326fdfaa8c..3cbf4f5155 100644
--- a/dumux/discretization/pq1bubble/fvelementgeometry.hh
+++ b/dumux/discretization/pq1bubble/fvelementgeometry.hh
@@ -26,6 +26,7 @@
 #include <dumux/common/indextraits.hh>
 #include <dumux/discretization/scvandscvfiterators.hh>
 
+#include <dumux/discretization/cvfe/localdof.hh>
 #include <dumux/discretization/pq1bubble/geometryhelper.hh>
 
 namespace Dumux {
@@ -56,24 +57,6 @@ class PQ1BubbleFVElementGeometry<GG, true>
     using GGCache = typename GG::Cache;
     using GeometryHelper = typename GGCache::GeometryHelper;
 
-    class LocalDof
-    {
-    public:
-        LocalDof(std::size_t dofIndex) : dofIndex_(dofIndex) {}
-        std::size_t index() const { return dofIndex_; }
-    private:
-        std::size_t dofIndex_;
-    };
-
-    class FVLocalDof : public LocalDof
-    {
-    public:
-        FVLocalDof(std::size_t dofIndex, const ThisType& fvGeometry)
-        : LocalDof(dofIndex), fvGeometry_(fvGeometry) {}
-        const typename GG::SubControlVolume& scv() const { return fvGeometry_.scv(this->index()); }
-    private:
-        const ThisType& fvGeometry_;
-    };
 public:
     //! export the element type
     using Element = typename GridView::template Codim<0>::Entity;
@@ -122,7 +105,7 @@ public:
     {
         return Dune::transformedRangeView(
             Dune::range(std::size_t(0), fvGeometry.numScv()-GeometryHelper::numHybridDofs(fvGeometry.element().type())),
-            [&](const auto i) { return FVLocalDof{ i, fvGeometry }; }
+            [&](const auto i) { return CVFE::FVLocalDof{ static_cast<LocalIndexType>(i), fvGeometry }; }
         );
     }
 
@@ -131,7 +114,7 @@ public:
     {
         return Dune::transformedRangeView(
             Dune::range(fvGeometry.numScv()-GeometryHelper::numHybridDofs(fvGeometry.element().type()), fvGeometry.numScv()),
-            [](const auto i) { return LocalDof{ i }; }
+            [](const auto i) { return CVFE::LocalDof{ static_cast<LocalIndexType>(i) }; }
         );
     }
 
@@ -140,7 +123,7 @@ public:
     {
         return Dune::transformedRangeView(
             Dune::range(std::size_t(0), fvGeometry.numScv()),
-            [](const auto i) { return LocalDof{ i }; }
+            [](const auto i) { return CVFE::LocalDof{ static_cast<LocalIndexType>(i) }; }
         );
     }
 
-- 
GitLab


From f98261c68f1b2d1d060e0deff759bd433b5a07cd Mon Sep 17 00:00:00 2001
From: Timo Koch <timokoch@uio.no>
Date: Sat, 3 Aug 2024 00:47:09 +0200
Subject: [PATCH 10/24] [cvfe] Add iterators over localDofs for box and
 fcdiamond

---
 dumux/discretization/box/fvelementgeometry.hh | 38 +++++++++++++++++++
 .../facecentered/diamond/fvelementgeometry.hh | 20 ++++++++++
 2 files changed, 58 insertions(+)

diff --git a/dumux/discretization/box/fvelementgeometry.hh b/dumux/discretization/box/fvelementgeometry.hh
index 24318626de..82df6786ed 100644
--- a/dumux/discretization/box/fvelementgeometry.hh
+++ b/dumux/discretization/box/fvelementgeometry.hh
@@ -20,11 +20,13 @@
 #include <array>
 #include <vector>
 
+#include <dune/common/rangeutilities.hh>
 #include <dune/geometry/type.hh>
 #include <dune/localfunctions/lagrange/pqkfactory.hh>
 
 #include <dumux/common/indextraits.hh>
 #include <dumux/discretization/scvandscvfiterators.hh>
+#include <dumux/discretization/cvfe/localdof.hh>
 #include <dumux/discretization/box/boxgeometryhelper.hh>
 
 namespace Dumux {
@@ -97,6 +99,24 @@ public:
         return Dune::IteratorRange<Iter>(s.begin(), s.end());
     }
 
+    //! iterate over dof indices that belong to dofs associated with control volumes
+    friend inline auto fvLocalDofs(const BoxFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [&](const auto i) { return CVFE::FVLocalDof{ static_cast<LocalIndexType>(i), fvGeometry }; }
+        );
+    }
+
+    //! an iterator over all local dofs
+    friend inline auto localDofs(const BoxFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [](const auto i) { return CVFE::LocalDof{ static_cast<LocalIndexType>(i) }; }
+        );
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
@@ -273,6 +293,24 @@ public:
         return Dune::IteratorRange<Iter>(fvGeometry.scvs_.begin(), fvGeometry.scvs_.end());
     }
 
+    //! iterate over dof indices that belong to dofs associated with control volumes
+    friend inline auto fvLocalDofs(const BoxFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [&](const auto i) { return CVFE::FVLocalDof{ static_cast<LocalIndexType>(i), fvGeometry }; }
+        );
+    }
+
+    //! an iterator over all local dofs
+    friend inline auto localDofs(const BoxFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [](const auto i) { return CVFE::LocalDof{ static_cast<LocalIndexType>(i) }; }
+        );
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
diff --git a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
index ed90779ac8..6e986bc87e 100644
--- a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
+++ b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
@@ -17,9 +17,11 @@
 
 #include <dune/common/reservedvector.hh>
 #include <dune/common/iteratorrange.hh>
+#include <dune/common/rangeutilities.hh>
 
 #include <dumux/common/indextraits.hh>
 #include <dumux/discretization/scvandscvfiterators.hh>
+#include <dumux/discretization/cvfe/localdof.hh>
 #include <dumux/discretization/facecentered/diamond/geometryhelper.hh>
 
 namespace Dumux {
@@ -81,6 +83,24 @@ public:
         return Dune::IteratorRange<Iter>(s.begin(), s.end());
     }
 
+    //! iterate over dof indices that belong to dofs associated with control volumes
+    friend inline auto fvLocalDofs(const FaceCenteredDiamondFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [&](const auto i) { return CVFE::FVLocalDof{ static_cast<LocalIndexType>(i), fvGeometry }; }
+        );
+    }
+
+    //! an iterator over all local dofs
+    friend inline auto localDofs(const FaceCenteredDiamondFVElementGeometry& fvGeometry)
+    {
+        return Dune::transformedRangeView(
+            Dune::range(fvGeometry.numScv()),
+            [](const auto i) { return CVFE::LocalDof{ static_cast<LocalIndexType>(i) }; }
+        );
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
-- 
GitLab


From c6342a0fe474416fccb1651146e4feb54e18a8dc Mon Sep 17 00:00:00 2001
From: Timo Koch <timokoch@uio.no>
Date: Sat, 3 Aug 2024 00:56:05 +0200
Subject: [PATCH 11/24] [cvfe] Iterate over fvDofs instead of scvs directly

---
 dumux/assembly/cvfelocalresidual.hh | 88 ++++++++++++++++++++++++++++-
 1 file changed, 87 insertions(+), 1 deletion(-)

diff --git a/dumux/assembly/cvfelocalresidual.hh b/dumux/assembly/cvfelocalresidual.hh
index 1993e62e52..300ffe19d5 100644
--- a/dumux/assembly/cvfelocalresidual.hh
+++ b/dumux/assembly/cvfelocalresidual.hh
@@ -81,6 +81,93 @@ public:
     using ElementResidualVector = typename ParentType::ElementResidualVector;
     using ParentType::ParentType;
 
+    /*!
+     * \brief Compute the storage local residual, i.e. the deviation of the
+     *        storage term from zero for instationary problems.
+     *
+     * \param element The DUNE Codim<0> entity for which the residual
+     *                ought to be calculated
+     * \param fvGeometry The finite-volume geometry of the element
+     * \param prevElemVolVars The volume averaged variables for all
+     *                        sub-control volumes of the element at the previous time level
+     * \param curElemVolVars The volume averaged variables for all
+     *                       sub-control volumes of the element at the current  time level
+     */
+    using ParentType::evalStorage;
+    ElementResidualVector evalStorage(const Element& element,
+                                      const FVElementGeometry& fvGeometry,
+                                      const ElementVolumeVariables& prevElemVolVars,
+                                      const ElementVolumeVariables& curElemVolVars) const
+    {
+        assert(!this->isStationary() && "no time loop set for storage term evaluation");
+
+        // initialize the residual vector for all scvs in this element
+        ElementResidualVector residual(fvGeometry.numScv());
+
+        // evaluate the volume terms (storage + source terms)
+        // forward to the local residual specialized for the discretization methods
+        for (const auto& localDof : fvLocalDofs(fvGeometry))
+            this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, localDof.scv());
+
+        // allow for additional contributions (e.g. hybrid CVFE schemes)
+        this->asImp().addToElementStorageResidual(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars);
+
+        return residual;
+    }
+
+    /*!
+     * \brief Compute the flux and source
+     *
+     * \param element The DUNE Codim<0> entity for which the residual
+     *                ought to be calculated
+     * \param fvGeometry The finite-volume geometry of the element
+     * \param curElemVolVars The volume averaged variables for all
+     *                       sub-control volumes of the element at the current  time level
+     * \param elemFluxVarsCache The element flux variables cache
+     * \param bcTypes The element boundary types
+     */
+    ElementResidualVector evalFluxAndSource(const Element& element,
+                                            const FVElementGeometry& fvGeometry,
+                                            const ElementVolumeVariables& elemVolVars,
+                                            const ElementFluxVariablesCache& elemFluxVarsCache,
+                                            const ElementBoundaryTypes &bcTypes) const
+    {
+        // initialize the residual vector for all scvs in this element
+        ElementResidualVector residual(fvGeometry.numScv());
+
+        // evaluate the volume terms (storage + source terms)
+        // forward to the local residual specialized for the discretization methods
+        for (const auto& localDof : fvLocalDofs(fvGeometry))
+            this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, localDof.scv());
+
+        // forward to the local residual specialized for the discretization methods
+        for (auto&& scvf : scvfs(fvGeometry))
+            this->asImp().evalFlux(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes, elemFluxVarsCache, scvf);
+
+        // allow for additional contributions (e.g. hybrid CVFE schemes)
+        this->asImp().addToElementFluxAndSourceResidual(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes);
+
+        return residual;
+    }
+
+    //! add additional storage contributions (e.g. hybrid CVFE schemes)
+    void addToElementStorageResidual(ElementResidualVector& residual,
+                                     const Problem& problem,
+                                     const Element& element,
+                                     const FVElementGeometry& fvGeometry,
+                                     const ElementVolumeVariables& prevElemVolVars,
+                                     const ElementVolumeVariables& curElemVolVars) const
+    {}
+
+    //! add additional flux and source contributions (e.g. hybrid CVFE schemes)
+    void addToElementFluxAndSourceResidual(ElementResidualVector& residual,
+                                           const Problem& problem,
+                                           const Element& element,
+                                           const FVElementGeometry& fvGeometry,
+                                           const ElementVolumeVariables& curElemVolVars,
+                                           const ElementBoundaryTypes &bcTypes) const
+    {}
+
     //! evaluate flux residuals for one sub control volume face and add to residual
     void evalFlux(ElementResidualVector& residual,
                   const Problem& problem,
@@ -155,7 +242,6 @@ public:
         return flux;
     }
 
-    using ParentType::evalStorage;
     /*!
      * \brief Compute the storage local residual, i.e. the deviation of the
      *        storage term from zero for instationary problems.
-- 
GitLab


From bee5056cd4cc7dd6767a8ee82e7837c7429ffdc6 Mon Sep 17 00:00:00 2001
From: Timo Koch <timokoch@uio.no>
Date: Sat, 3 Aug 2024 00:57:30 +0200
Subject: [PATCH 12/24] [cvfe][pq1bubble] Remove obsolete hybrid base residual

---
 dumux/assembly/hybridcvfelocalresidual.hh     | 153 ------------------
 dumux/discretization/pq1bubble.hh             |   8 +-
 .../momentum/cvfe/localresidual.hh            |  24 +--
 3 files changed, 13 insertions(+), 172 deletions(-)
 delete mode 100644 dumux/assembly/hybridcvfelocalresidual.hh

diff --git a/dumux/assembly/hybridcvfelocalresidual.hh b/dumux/assembly/hybridcvfelocalresidual.hh
deleted file mode 100644
index a8d0727d80..0000000000
--- a/dumux/assembly/hybridcvfelocalresidual.hh
+++ /dev/null
@@ -1,153 +0,0 @@
-// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-// vi: set et ts=4 sw=4 sts=4:
-//
-// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-/*!
- * \file
- * \ingroup Assembly
- * \ingroup CVFEDiscretization
- * \brief Calculates the element-wise residual for hybrid control-volume finite element schemes
- */
-#ifndef DUMUX_HYBRID_CVFE_LOCAL_RESIDUAL_HH
-#define DUMUX_HYBRID_CVFE_LOCAL_RESIDUAL_HH
-
-#include <dumux/common/properties.hh>
-
-#include "cvfelocalresidual.hh"
-
-namespace Dumux {
-
-/*!
- * \ingroup Assembly
- * \ingroup CVFEDiscretization
- * \brief The element-wise residual for control-volume finite element schemes
- * \tparam TypeTag the TypeTag
- */
-template<class TypeTag>
-class HybridCVFELocalResidual : public CVFELocalResidual<TypeTag>
-{
-    using ParentType = CVFELocalResidual<TypeTag>;
-    using Problem = GetPropType<TypeTag, Properties::Problem>;
-    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    using GridView = typename GridGeometry::GridView;
-    using Element = typename GridView::template Codim<0>::Entity;
-    using ElementBoundaryTypes = GetPropType<TypeTag, Properties::ElementBoundaryTypes>;
-    using FVElementGeometry = typename GridGeometry::LocalView;
-    using GridVolumeVariables = GetPropType<TypeTag, Properties::GridVolumeVariables>;
-    using ElementVolumeVariables = typename GridVolumeVariables::LocalView;
-    using ElementFluxVariablesCache = typename GetPropType<TypeTag, Properties::GridFluxVariablesCache>::LocalView;
-
-public:
-    using ElementResidualVector = typename ParentType::ElementResidualVector;
-    using ParentType::ParentType;
-
-    /*!
-     * \name Main interface
-     * \note Methods used by the assembler to compute derivatives and residual
-     */
-    // \{
-
-    /*!
-     * \brief Compute the storage local residual, i.e. the deviation of the
-     *        storage term from zero for instationary problems.
-     *
-     * \param element The DUNE Codim<0> entity for which the residual
-     *                ought to be calculated
-     * \param fvGeometry The finite-volume geometry of the element
-     * \param prevElemVolVars The volume averaged variables for all
-     *                        sub-control volumes of the element at the previous time level
-     * \param curElemVolVars The volume averaged variables for all
-     *                       sub-control volumes of the element at the current  time level
-     */
-    using ParentType::evalStorage;
-    ElementResidualVector evalStorage(const Element& element,
-                                      const FVElementGeometry& fvGeometry,
-                                      const ElementVolumeVariables& prevElemVolVars,
-                                      const ElementVolumeVariables& curElemVolVars) const
-    {
-        assert(!this->isStationary() && "no time loop set for storage term evaluation");
-
-        // initialize the residual vector for all scvs in this element
-        ElementResidualVector residual(fvGeometry.numScv());
-
-        // evaluate the volume terms (storage + source terms)
-        // forward to the local residual specialized for the discretization methods
-        for (const auto& localDof : fvLocalDofs(fvGeometry))
-            this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, localDof.scv());
-
-        this->asImp().evalElementStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars);
-
-        return residual;
-    }
-
-    /*!
-     * \brief Compute the flux and source
-     *
-     * \param element The DUNE Codim<0> entity for which the residual
-     *                ought to be calculated
-     * \param fvGeometry The finite-volume geometry of the element
-     * \param curElemVolVars The volume averaged variables for all
-     *                       sub-control volumes of the element at the current  time level
-     * \param elemFluxVarsCache The element flux variables cache
-     * \param bcTypes The element boundary types
-     */
-    ElementResidualVector evalFluxAndSource(const Element& element,
-                                            const FVElementGeometry& fvGeometry,
-                                            const ElementVolumeVariables& elemVolVars,
-                                            const ElementFluxVariablesCache& elemFluxVarsCache,
-                                            const ElementBoundaryTypes &bcTypes) const
-    {
-        // initialize the residual vector for all scvs in this element
-        ElementResidualVector residual(fvGeometry.numScv());
-
-        // evaluate the volume terms (storage + source terms)
-        // forward to the local residual specialized for the discretization methods
-        for (const auto& localDof : fvLocalDofs(fvGeometry))
-            this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, localDof.scv());
-
-        // forward to the local residual specialized for the discretization methods
-        for (auto&& scvf : scvfs(fvGeometry))
-            this->asImp().evalFlux(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes, elemFluxVarsCache, scvf);
-
-        // ToDo: Better name? E.g. evalElementRhsTerms
-        this->asImp().evalElementFluxAndSource(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes);
-
-        return residual;
-    }
-
-    // \}
-
-    /*!
-     * \name Model specific interface to account for hybrid dofs
-     * \note The following methods are hybrid model specific implementations of the local residual
-     */
-    // \{
-
-    void evalElementStorage(ElementResidualVector& residual,
-                            const Problem& problem,
-                            const Element& element,
-                            const FVElementGeometry& fvGeometry,
-                            const ElementVolumeVariables& prevElemVolVars,
-                            const ElementVolumeVariables& curElemVolVars) const
-    {
-        DUNE_THROW(Dune::NotImplemented, "This hybrid model does not implement an evalElementStorage method!");
-    }
-
-    void evalElementFluxAndSource(ElementResidualVector& residual,
-                                  const Problem& problem,
-                                  const Element& element,
-                                  const FVElementGeometry& fvGeometry,
-                                  const ElementVolumeVariables& curElemVolVars,
-                                  const ElementBoundaryTypes &bcTypes) const
-    {
-        DUNE_THROW(Dune::NotImplemented, "This hybrid model does not implement an evalElementFluxAndSource method!");
-    }
-
-    // \}
-};
-
-} // end namespace Dumux
-
-#endif
diff --git a/dumux/discretization/pq1bubble.hh b/dumux/discretization/pq1bubble.hh
index 6283a6383e..9cffaaf3d9 100644
--- a/dumux/discretization/pq1bubble.hh
+++ b/dumux/discretization/pq1bubble.hh
@@ -23,7 +23,6 @@
 #include <dumux/common/typetraits/problem.hh>
 
 #include <dumux/assembly/cvfelocalresidual.hh>
-#include <dumux/assembly/hybridcvfelocalresidual.hh>
 
 #include <dumux/discretization/method.hh>
 #include <dumux/discretization/fvproperties.hh>
@@ -126,14 +125,9 @@ public:
 
 //! Set the BaseLocalResidual to CVFELocalResidual
 template<class TypeTag>
-struct BaseLocalResidual<TypeTag, TTag::PQ1BubbleModel>
+struct BaseLocalResidual<TypeTag, TTag::PQ1BubbleBase>
 { using type = CVFELocalResidual<TypeTag>; };
 
-//! Set the BaseLocalResidual for hybrid scheme to HybridLocalResidual
-template<class TypeTag>
-struct BaseLocalResidual<TypeTag, TTag::PQ1BubbleHybridModel>
-{ using type = HybridCVFELocalResidual<TypeTag>; };
-
 } // namespace Dumux::Properties
 
 namespace Dumux::Detail {
diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index ee8788d407..6b8a6f9f62 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -169,12 +169,12 @@ public:
         return flux;
     }
 
-    void evalElementStorage(ElementResidualVector& residual,
-                            const Problem& problem,
-                            const Element& element,
-                            const FVElementGeometry& fvGeometry,
-                            const ElementVolumeVariables& prevElemVolVars,
-                            const ElementVolumeVariables& curElemVolVars) const
+    void addToElementStorageResidual(ElementResidualVector& residual,
+                                     const Problem& problem,
+                                     const Element& element,
+                                     const FVElementGeometry& fvGeometry,
+                                     const ElementVolumeVariables& prevElemVolVars,
+                                     const ElementVolumeVariables& curElemVolVars) const
     {
         static const auto intOrder
             = getParamFromGroup<int>(problem.paramGroup(), "Assembly.FEIntegrationOrderStorage", 4);
@@ -214,12 +214,12 @@ public:
         }
     }
 
-    void evalElementFluxAndSource(ElementResidualVector& residual,
-                                  const Problem& problem,
-                                  const Element& element,
-                                  const FVElementGeometry& fvGeometry,
-                                  const ElementVolumeVariables& elemVolVars,
-                                  const ElementBoundaryTypes &elemBcTypes) const
+    void addToElementFluxAndSourceResidual(ElementResidualVector& residual,
+                                           const Problem& problem,
+                                           const Element& element,
+                                           const FVElementGeometry& fvGeometry,
+                                           const ElementVolumeVariables& elemVolVars,
+                                           const ElementBoundaryTypes &elemBcTypes) const
     {
         static const bool enableUnsymmetrizedVelocityGradient
             = getParamFromGroup<bool>(problem.paramGroup(), "FreeFlow.EnableUnsymmetrizedVelocityGradient", false);
-- 
GitLab


From 7503b8b9c27881b81faee098dffbe8c00d559cfe Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Thu, 19 Dec 2024 19:37:20 +0100
Subject: [PATCH 13/24] [disc][cvfe] Add header for integration point data

---
 .../cvfe/integrationpointdata.hh              | 80 +++++++++++++++++++
 1 file changed, 80 insertions(+)
 create mode 100644 dumux/discretization/cvfe/integrationpointdata.hh

diff --git a/dumux/discretization/cvfe/integrationpointdata.hh b/dumux/discretization/cvfe/integrationpointdata.hh
new file mode 100644
index 0000000000..4e891ba678
--- /dev/null
+++ b/dumux/discretization/cvfe/integrationpointdata.hh
@@ -0,0 +1,80 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+//
+// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+/*!
+ * \file
+ * \ingroup CVFEDiscretization
+ * \brief Classes representing integration point data for control-volume finite element schemes
+ */
+#ifndef DUMUX_CVFE_IP_DATA_HH
+#define DUMUX_CVFE_IP_DATA_HH
+
+namespace Dumux::CVFE {
+
+/*!
+ * \ingroup CVFEDiscretization
+ * \brief An integration point related to an element
+ */
+template<class GlobalPosition>
+class IntegrationPointData
+{
+public:
+    IntegrationPointData(GlobalPosition&& pos) : ipGlobal_(std::move(pos)) {}
+    IntegrationPointData(const GlobalPosition& pos) : ipGlobal_(pos) {}
+
+    //! The global position of the quadrature point
+    const GlobalPosition& ipGlobal() const
+    { return ipGlobal_; }
+
+private:
+    GlobalPosition ipGlobal_;
+};
+
+/*!
+ * \ingroup CVFEDiscretization
+ * \brief An integration point related to a face of an element
+ */
+template<class GlobalPosition>
+class FaceIntegrationPointData : public IntegrationPointData<GlobalPosition>
+{
+    using ParentType = IntegrationPointData<GlobalPosition>;
+public:
+    FaceIntegrationPointData(GlobalPosition&& pos, GlobalPosition&& n) : ParentType(pos), normal_(std::move(n)) {}
+    FaceIntegrationPointData(const GlobalPosition& pos, const GlobalPosition& n) : ParentType(pos), normal_(n) {}
+
+    //! The unit outer normal vector at the quadrature point
+    const GlobalPosition& unitOuterNormal() const
+    { return normal_; }
+
+private:
+    GlobalPosition normal_;
+};
+
+/*!
+ * \ingroup CVFEDiscretization
+ * \brief An integration point related to a face of an element, specific to finite volume schemes
+ */
+template<class SubControlVolumeFace>
+class FVFaceIntegrationPointData : public FaceIntegrationPointData<typename SubControlVolumeFace::GlobalPosition>
+{
+    using GlobalPosition = typename SubControlVolumeFace::GlobalPosition;
+    using ParentType = FaceIntegrationPointData<GlobalPosition>;
+public:
+    FVFaceIntegrationPointData(const auto& scvf)
+    : ParentType(scvf.ipGlobal(), scvf.unitOuterNormal()), scvf_(scvf)
+    {}
+
+    //! The sub-control volume face
+    const SubControlVolumeFace& scvf() const
+    { return scvf_; }
+
+private:
+    const SubControlVolumeFace& scvf_;
+};
+
+} // end namespace Dumux::CVFE
+
+#endif
-- 
GitLab


From 3eb493593d4973fbf9d8f8e6feb42bff1b5edc4a Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 11:41:48 +0100
Subject: [PATCH 14/24] [fem] Add face integration data point that has normal
 vector

---
 .../fem/integrationpointdata.hh               | 31 +++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/dumux/discretization/fem/integrationpointdata.hh b/dumux/discretization/fem/integrationpointdata.hh
index 6014cee000..4a9f75fa7d 100644
--- a/dumux/discretization/fem/integrationpointdata.hh
+++ b/dumux/discretization/fem/integrationpointdata.hh
@@ -87,6 +87,37 @@ private:
     ShapeGradients shapeGradients_;
 };
 
+/*!
+ * \ingroup FEMDiscretization
+ * \brief Integration point data related to a face of an element
+ */
+template<class GlobalPosition, class LocalBasis>
+class FEFaceIntegrationPointData : public FEIntegrationPointData<GlobalPosition, LocalBasis>
+{
+    using ParentType = FEIntegrationPointData<GlobalPosition, LocalBasis>;
+    using LocalPosition = typename LocalBasis::Traits::DomainType;
+public:
+    // The default constructor
+    FEFaceIntegrationPointData() = delete;
+
+    // The constructor
+    template<class Geometry>
+    FEFaceIntegrationPointData(const Geometry& geometry,
+                               const LocalPosition& ipLocal,
+                               const LocalBasis& localBasis,
+                               const GlobalPosition& n)
+    : ParentType(geometry, ipLocal, localBasis), normal_(n)
+    {}
+
+    //! The unit outer normal vector at the quadrature point
+    const GlobalPosition& unitOuterNormal() const
+    { return normal_; }
+
+private:
+    const GlobalPosition& normal_;
+};
+
+
 } // end namespace Dumux
 
 #endif
-- 
GitLab


From c837249cb0547d9dc1c83e548f533708a4cb591a Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 11:43:47 +0100
Subject: [PATCH 15/24] [disc][cvfe] Add localDof function

---
 dumux/discretization/box/fvelementgeometry.hh               | 6 ++++++
 .../facecentered/diamond/fvelementgeometry.hh               | 6 ++++++
 dumux/discretization/pq1bubble/fvelementgeometry.hh         | 6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/dumux/discretization/box/fvelementgeometry.hh b/dumux/discretization/box/fvelementgeometry.hh
index 82df6786ed..d6a2389aa0 100644
--- a/dumux/discretization/box/fvelementgeometry.hh
+++ b/dumux/discretization/box/fvelementgeometry.hh
@@ -117,6 +117,12 @@ public:
         );
     }
 
+    //! get local dof
+    auto localDof(LocalIndexType localDofIdx) const
+    {
+        return std::move(CVFE::LocalDof{ static_cast<LocalIndexType>(localDofIdx) });
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
diff --git a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
index 6e986bc87e..8bf776de51 100644
--- a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
+++ b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh
@@ -101,6 +101,12 @@ public:
         );
     }
 
+    //! get local dof
+    auto localDof(LocalIndexType localDofIdx) const
+    {
+        return std::move(CVFE::LocalDof{ static_cast<LocalIndexType>(localDofIdx) });
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
diff --git a/dumux/discretization/pq1bubble/fvelementgeometry.hh b/dumux/discretization/pq1bubble/fvelementgeometry.hh
index 3cbf4f5155..f33b899bb2 100644
--- a/dumux/discretization/pq1bubble/fvelementgeometry.hh
+++ b/dumux/discretization/pq1bubble/fvelementgeometry.hh
@@ -127,6 +127,12 @@ public:
         );
     }
 
+    //! get local dof
+    auto localDof(LocalIndexType localDofIdx) const
+    {
+        return std::move(CVFE::LocalDof{ static_cast<LocalIndexType>(localDofIdx) });
+    }
+
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
     //! This is a free function found by means of ADL
-- 
GitLab


From ee5de87da7bb58e887815e1a3c95bdc6a0164aa6 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 11:51:35 +0100
Subject: [PATCH 16/24] [cvfe] Add elementFluxVarsCache to function call

---
 dumux/assembly/cvfelocalresidual.hh                        | 3 ++-
 dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh | 4 +++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/dumux/assembly/cvfelocalresidual.hh b/dumux/assembly/cvfelocalresidual.hh
index 300ffe19d5..f1fba8f7c6 100644
--- a/dumux/assembly/cvfelocalresidual.hh
+++ b/dumux/assembly/cvfelocalresidual.hh
@@ -145,7 +145,7 @@ public:
             this->asImp().evalFlux(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes, elemFluxVarsCache, scvf);
 
         // allow for additional contributions (e.g. hybrid CVFE schemes)
-        this->asImp().addToElementFluxAndSourceResidual(residual, this->problem(), element, fvGeometry, elemVolVars, bcTypes);
+        this->asImp().addToElementFluxAndSourceResidual(residual, this->problem(), element, fvGeometry, elemVolVars, elemFluxVarsCache, bcTypes);
 
         return residual;
     }
@@ -165,6 +165,7 @@ public:
                                            const Element& element,
                                            const FVElementGeometry& fvGeometry,
                                            const ElementVolumeVariables& curElemVolVars,
+                                           const ElementFluxVariablesCache& elemFluxVarsCache,
                                            const ElementBoundaryTypes &bcTypes) const
     {}
 
diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index 6b8a6f9f62..101f45ea51 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -219,6 +219,7 @@ public:
                                            const Element& element,
                                            const FVElementGeometry& fvGeometry,
                                            const ElementVolumeVariables& elemVolVars,
+                                           const ElementFluxVariablesCache& elemFluxVarsCache,
                                            const ElementBoundaryTypes &elemBcTypes) const
     {
         static const bool enableUnsymmetrizedVelocityGradient
@@ -274,7 +275,7 @@ public:
         }
 
         if(elemBcTypes.hasNeumann())
-            residual += evalNeumannSegments_(problem, element, fvGeometry, elemVolVars, elemBcTypes);
+            residual += evalNeumannSegments_(problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, elemBcTypes);
     }
 
 private:
@@ -282,6 +283,7 @@ private:
                                                const Element& element,
                                                const FVElementGeometry& fvGeometry,
                                                const ElementVolumeVariables& elemVolVars,
+                                               const ElementFluxVariablesCache& elemFluxVarsCache,
                                                const ElementBoundaryTypes &elemBcTypes) const
     {
         ElementResidualVector flux(0.0);
-- 
GitLab


From 8dd95bf6312bca50cfb0c68fca613cbf70436555 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 12:02:21 +0100
Subject: [PATCH 17/24] [cvfe][ffmomentum] Use new source and boundaryFlux
 interfaces

---
 .../momentum/cvfe/localresidual.hh            | 15 +--
 .../freeflow/navierstokes/momentum/problem.hh | 92 ++++++++++++++++++-
 2 files changed, 98 insertions(+), 9 deletions(-)

diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index 101f45ea51..db3a97dd99 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -69,6 +69,7 @@ class NavierStokesMomentumCVFELocalResidual
     using LocalBasis = typename GridGeometry::FeCache::FiniteElementType::Traits::LocalBasisType;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using IpData = FEIntegrationPointData<GlobalPosition, LocalBasis>;
+    using FaceIpData = FEFaceIntegrationPointData<GlobalPosition, LocalBasis>;
     using FluxContext = NavierStokesMomentumFluxContext<Problem, FVElementGeometry, ElementVolumeVariables, ElementFluxVariablesCache>;
     using FluxFunctionContext = NavierStokesMomentumFluxFunctionContext<Problem, FVElementGeometry, ElementVolumeVariables, IpData>;
     using FluxHelper = NavierStokesMomentumFluxCVFE<GridGeometry, NumEqVector>;
@@ -263,12 +264,11 @@ public:
                 fluxAndSourceTerm += problem.pressure(element, fvGeometry, ipData.ipLocal()) * ipData.gradN(localDofIdx);
 
                 // finally add source and Neumann term and add everything to residual
-                // ToDo: generalize by not assuming that a sourceAtPos function must exist
-                const auto sourceAtPos = problem.sourceAtPos(ipData.ipGlobal());
+                const auto sourceAtIp = problem.source(element, fvGeometry, elemVolVars, localDof, ipData);
 
                 for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
                 {
-                    fluxAndSourceTerm[eqIdx] += ipData.shapeValue(localDofIdx) * sourceAtPos[eqIdx];
+                    fluxAndSourceTerm[eqIdx] += ipData.shapeValue(localDofIdx) * sourceAtIp[eqIdx];
                     residual[localDofIdx][eqIdx] += qWeight*fluxAndSourceTerm[eqIdx];
                 }
             }
@@ -310,13 +310,14 @@ private:
 
                 // get quadrature rule weight for intersection
                 Scalar qWeight = quadPoint.weight() * Extrusion::integrationElement(isGeometry, quadPoint.position());
-                IpData ipData(geometry, local, localBasis);
-
-                const auto& neumannFlux = qWeight*problem.neumannAtPos(ipData.ipGlobal());
+                FaceIpData faceIpData(geometry, local, localBasis, intersection.centerUnitOuterNormal());
 
                 for (const auto& localDof : hybridLocalDofs(fvGeometry))
+                {
+                    const auto& boundaryFlux = qWeight*problem.boundaryFlux(element, fvGeometry, elemVolVars, elemFluxVarsCache, localDof, faceIpData);
                     for (int eqIdx = 0; eqIdx < NumEqVector::dimension; ++eqIdx)
-                        flux[localDof.index()] += ipData.shapeValue(localDof.index()) * neumannFlux[eqIdx];
+                        flux[localDof.index()] += faceIpData.shapeValue(localDof.index()) * boundaryFlux[eqIdx];
+                }
 
             }
 
diff --git a/dumux/freeflow/navierstokes/momentum/problem.hh b/dumux/freeflow/navierstokes/momentum/problem.hh
index a078f3183d..8aaa3805b1 100644
--- a/dumux/freeflow/navierstokes/momentum/problem.hh
+++ b/dumux/freeflow/navierstokes/momentum/problem.hh
@@ -18,6 +18,7 @@
 #include <dumux/common/properties.hh>
 #include <dumux/common/fvproblemwithspatialparams.hh>
 #include <dumux/discretization/method.hh>
+#include <dumux/discretization/cvfe/integrationpointdata.hh>
 #include <dumux/freeflow/navierstokes/momentum/boundarytypes.hh>
 
 namespace Dumux {
@@ -612,6 +613,33 @@ public:
     : NavierStokesMomentumProblemImpl(gridGeometry, {}, paramGroup)
     {}
 
+    /*!
+     * \brief Evaluate the source term at a given integration point, related to the residual of a local dof
+     *
+     * This is the method for the case where the source term is
+     * potentially solution dependent and requires some quantities that
+     * are specific to the fully-implicit method.
+     *
+     * \param element The element for which the Neumann boundary condition is set
+     * \param fvGeometry The finite-volume geometry
+     * \param elemVolVars All volume variables for the element
+     * \param localDof The local dof
+     * \param ipData Integration point data
+     *
+     * For this method, the return parameter stores the conserved quantity rate
+     * generated or annihilate per volume unit. Positive values mean
+     * that the conserved quantity is created, negative ones mean that it vanishes.
+     */
+    template<class LocalDof, class IpData>
+    Sources source(const Element &element,
+                   const FVElementGeometry& fvGeometry,
+                   const ElementVolumeVariables& elemVolVars,
+                   const LocalDof& localDof,
+                   const IpData& ipData) const
+    {
+        return asImp_().sourceAtPos(ipData.ipGlobal());
+    }
+
     /*!
      * \brief Evaluate the source term for all phases within a given
      *        sub-control-volume.
@@ -630,14 +658,17 @@ public:
      * that the conserved quantity is created, negative ones mean that it vanishes.
      * E.g. for the mass balance that would be a mass rate in \f$ [ kg / (m^3 \cdot s)] \f$.
      */
-    template<class ElementVolumeVariables>
     Sources source(const Element &element,
                    const FVElementGeometry& fvGeometry,
                    const ElementVolumeVariables& elemVolVars,
                    const SubControlVolume &scv) const
     {
         // forward to solution independent, fully-implicit specific interface
-        return asImp_().sourceAtPos(scv.center());
+        return asImp_().source(element,
+                               fvGeometry,
+                               elemVolVars,
+                               fvGeometry.localDof(scv.localDofIndex()),
+                               Dumux::CVFE::IntegrationPointData<GlobalPosition>(scv.center()));
     }
 
     /*!
@@ -727,6 +758,63 @@ public:
             return asImp_().dirichletAtPos(scvf.ipGlobal());
     }
 
+    /*!
+     * \brief Evaluates the boundary flux related to a localDof at a given integration point.
+     *
+     * \param element The element for which the Neumann boundary condition is set
+     * \param fvGeometry The finite-volume geometry
+     * \param elemVolVars All volume variables for the element
+     * \param elemFluxVarsCache The element flux variables cache
+     * \param localDof The local dof
+     * \param faceIpData Face integration point data
+     */
+    template<class ElementFluxVariablesCache, class LocalDof, class FaceIpData>
+    BoundaryFluxes boundaryFlux(const Element& element,
+                                const FVElementGeometry& fvGeometry,
+                                const ElementVolumeVariables& elemVolVars,
+                                const ElementFluxVariablesCache& elemFluxVarsCache,
+                                const LocalDof& localDof,
+                                const FaceIpData& faceIpData) const
+    {
+        return asImp_().boundaryFluxAtPos(faceIpData.ipGlobal());
+    }
+
+    /*!
+     * \brief Evaluates the boundary conditions for a Neumann control volume.
+     *
+     * \param element The element for which the Neumann boundary condition is set
+     * \param fvGeometry The fvGeometry
+     * \param elemVolVars The element volume variables
+     * \param elemFluxVarsCache The element flux variables cache
+     * \param scvf The boundary sub control volume face
+     */
+    template<class ElementFluxVariablesCache>
+    BoundaryFluxes neumann(const Element& element,
+                           const FVElementGeometry& fvGeometry,
+                           const ElementVolumeVariables& elemVolVars,
+                           const ElementFluxVariablesCache& elemFluxVarsCache,
+                           const SubControlVolumeFace& scvf) const
+    {
+        return asImp_().boundaryFlux(element,
+                                     fvGeometry,
+                                     elemVolVars,
+                                     elemFluxVarsCache,
+                                     fvGeometry.localDof(fvGeometry.scv(scvf.insideScvIdx()).localDofIndex()),
+                                     Dumux::CVFE::FVFaceIntegrationPointData<SubControlVolumeFace>(scvf));
+    }
+
+    /*!
+     * \brief Returns the neumann flux at a given position.
+     */
+    BoundaryFluxes neumannAtPos(const GlobalPosition& globalPos) const
+    { return asImp_().boundaryFluxAtPos(globalPos); } //! A default, i.e. if the user's does not overload any neumann method
+
+    /*!
+     * \brief Returns the boundary flux at a given position.
+     */
+    BoundaryFluxes boundaryFluxAtPos(const GlobalPosition& globalPos) const
+    { return BoundaryFluxes(0.0); } //! A default, i.e. if the user's does not overload any boundaryFlux method
+
     /*!
      * \brief Returns the acceleration due to gravity.
      *
-- 
GitLab


From 20b9a8a1b69392a687594965b89acf61bede54b3 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 14:07:02 +0100
Subject: [PATCH 18/24] [cvfe] Add function for localDofs to
 elementboundarytypes

---
 .../cvfe/elementboundarytypes.hh              | 23 ++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/dumux/discretization/cvfe/elementboundarytypes.hh b/dumux/discretization/cvfe/elementboundarytypes.hh
index ebfc820c59..80e66db090 100644
--- a/dumux/discretization/cvfe/elementboundarytypes.hh
+++ b/dumux/discretization/cvfe/elementboundarytypes.hh
@@ -92,16 +92,33 @@ public:
     /*
      * \brief Access operator
      * \return BoundaryTypes
-     * \note yields undefined behaviour of the scv is not on the boundary
+     * \note yields undefined behaviour if the scv is not on the boundary
      */
-    template<class FVElementGeometry>
-    const BoundaryTypes& get(const FVElementGeometry&, const typename FVElementGeometry::SubControlVolume& scv) const
+    template<class FVElementGeometry,
+             class SubControlVolume,
+             typename std::enable_if_t<std::is_same<SubControlVolume, typename FVElementGeometry::SubControlVolume>::value, int> = 0 >
+    const BoundaryTypes& get(const FVElementGeometry&, const SubControlVolume& scv) const
     {
         const auto localDofIdx = scv.localDofIndex();
         assert(localDofIdx < bcTypes_.size());
         return bcTypes_[localDofIdx];
     }
 
+    /*
+     * \brief Access operator
+     * \return BoundaryTypes
+     * \note yields undefined behaviour if the dof is not on the boundary
+     */
+    template<class FVElementGeometry,
+             class LocalDof,
+             typename std::enable_if_t<!std::is_same<LocalDof, typename FVElementGeometry::SubControlVolume>::value, int> = 0 >
+    const BoundaryTypes& get(const FVElementGeometry&, const LocalDof& localDof) const
+    {
+        const auto localDofIdx = localDof.index();
+        assert(localDofIdx < bcTypes_.size());
+        return bcTypes_[localDofIdx];
+    }
+
 private:
     std::vector<BoundaryTypes> bcTypes_;
     bool hasDirichlet_ = false;
-- 
GitLab


From c2411aabe9a63140ab00f7d6e1a7cebbcc62e9b6 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 15:17:34 +0100
Subject: [PATCH 19/24] [cvfe] Add range to iterate over intersection dofs

---
 dumux/discretization/pq1bubble/fvelementgeometry.hh | 11 +++++++++++
 dumux/discretization/pq1bubble/geometryhelper.hh    | 12 ++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/dumux/discretization/pq1bubble/fvelementgeometry.hh b/dumux/discretization/pq1bubble/fvelementgeometry.hh
index f33b899bb2..e6b2f6c398 100644
--- a/dumux/discretization/pq1bubble/fvelementgeometry.hh
+++ b/dumux/discretization/pq1bubble/fvelementgeometry.hh
@@ -127,6 +127,17 @@ public:
         );
     }
 
+    //! an iterator over all local dofs related to an intersection
+    template<class Intersection>
+    friend inline auto localDofs(const PQ1BubbleFVElementGeometry& fvGeometry, const Intersection& intersection)
+    {
+        const auto subEntities = GeometryHelper::localDofsIntersection(fvGeometry.element().type(), intersection.indexInInside());
+        return Dune::transformedRangeView(
+            subEntities,
+            [](const auto subEntity) { return CVFE::LocalDof{ static_cast<LocalIndexType>(subEntity) }; }
+        );
+    }
+
     //! get local dof
     auto localDof(LocalIndexType localDofIdx) const
     {
diff --git a/dumux/discretization/pq1bubble/geometryhelper.hh b/dumux/discretization/pq1bubble/geometryhelper.hh
index 3745becc83..322f4aa31a 100644
--- a/dumux/discretization/pq1bubble/geometryhelper.hh
+++ b/dumux/discretization/pq1bubble/geometryhelper.hh
@@ -376,6 +376,12 @@ public:
         return 0;
     }
 
+    //! Local dofs related to an intersection with index iIdx
+    static auto localDofsIntersection(Dune::GeometryType type, unsigned int iIdx)
+    {
+        return  Dune::referenceElement<Scalar, dim>(type).subEntities(iIdx, 1, dim);
+    }
+
     template<class DofMapper>
     auto dofIndex(const DofMapper& dofMapper, const Element& element, unsigned int localScvIdx) const
     {
@@ -604,6 +610,12 @@ public:
         return 1;
     }
 
+    //! Local dofs related to an intersection with index iIdx
+    static auto localDofsIntersection(Dune::GeometryType type, unsigned int iIdx)
+    {
+        return  Dune::referenceElement<Scalar, dim>(type).subEntities(iIdx, 1, dim);
+    }
+
     template<class DofMapper>
     auto dofIndex(const DofMapper& dofMapper, const Element& element, unsigned int localScvIdx) const
     {
-- 
GitLab


From 3bff5c8cb3165f813925ec3b43816662f5249fa4 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 15:19:03 +0100
Subject: [PATCH 20/24] [cvfe][ffmomentum] Iterate over intersection dofs to
 check for neumann

---
 .../freeflow/navierstokes/momentum/cvfe/localresidual.hh  | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index db3a97dd99..82d4e9b7b2 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -296,8 +296,12 @@ private:
         const auto& geometry = element.geometry();
         for (const auto& intersection : intersections(fvGeometry.gridGeometry().gridView(), element))
         {
-            const auto bcTypes = problem.boundaryTypesAtPos(intersection.geometry().center());
-            if(!bcTypes.hasNeumann())
+            bool intersectionHasNeumannDof = false;
+            for (const auto& localDof : localDofs(fvGeometry, intersection))
+                if(elemBcTypes.get(fvGeometry, localDof).hasNeumann())
+                    intersectionHasNeumannDof = true;
+
+            if(!intersectionHasNeumannDof)
                 continue;
 
             // select quadrature rule for intersection faces (dim-1)
-- 
GitLab


From 4858c70d564bb8682542329153c9b1c3c4a6c603 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 16:13:59 +0100
Subject: [PATCH 21/24] [tests][ff][donea] Use new boundaryFlux interface

---
 test/freeflow/navierstokes/donea/problem.hh | 31 +++++++++++----------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/test/freeflow/navierstokes/donea/problem.hh b/test/freeflow/navierstokes/donea/problem.hh
index 4f2a7f7a01..6aa0409ae5 100644
--- a/test/freeflow/navierstokes/donea/problem.hh
+++ b/test/freeflow/navierstokes/donea/problem.hh
@@ -151,27 +151,29 @@ public:
     { return analyticalSolution(globalPos); }
 
     /*!
-     * \brief Evaluates the boundary conditions for a Neumann control volume.
+     * \brief Evaluates the boundary flux related to a localDof at a given integration point.
      *
      * \param element The element for which the Neumann boundary condition is set
-     * \param fvGeometry The fvGeometry
-     * \param elemVolVars The element volume variables
-     * \param elemFaceVars The element face variables
-     * \param scvf The boundary sub control volume face
+     * \param fvGeometry The finite-volume geometry
+     * \param elemVolVars All volume variables for the element
+     * \param elemFluxVarsCache The element flux variables cache
+     * \param localDof The local dof
+     * \param faceIpData Integration point data
      */
-    template<class ElementVolumeVariables, class ElementFluxVariablesCache>
-    BoundaryFluxes neumann(const Element& element,
-                           const FVElementGeometry& fvGeometry,
-                           const ElementVolumeVariables& elemVolVars,
-                           const ElementFluxVariablesCache& elemFluxVarsCache,
-                           const SubControlVolumeFace& scvf) const
+    template<class ElementVolumeVariables, class ElementFluxVariablesCache, class LocalDof, class FaceIpData>
+    BoundaryFluxes boundaryFlux(const Element& element,
+                                const FVElementGeometry& fvGeometry,
+                                const ElementVolumeVariables& elemVolVars,
+                                const ElementFluxVariablesCache& elemFluxVarsCache,
+                                const LocalDof& localDof,
+                                const FaceIpData& faceIpData) const
     {
         BoundaryFluxes values(0.0);
 
         if constexpr (ParentType::isMomentumProblem())
         {
-            const auto x = scvf.ipGlobal()[0];
-            const auto y = scvf.ipGlobal()[1];
+            const auto x = faceIpData.ipGlobal()[0];
+            const auto y = faceIpData.ipGlobal()[1];
 
             Dune::FieldMatrix<Scalar, dimWorld, dimWorld> momentumFlux(0.0);
             momentumFlux[0][0] = -2.0*mu_*dxU_(x,y) + p_(x);
@@ -179,11 +181,12 @@ public:
             momentumFlux[1][0] = momentumFlux[0][1];
             momentumFlux[1][1] = -2.0*mu_*dyV_(x,y) + p_(x);
 
-            const auto normal = scvf.unitOuterNormal();
+            const auto normal = faceIpData.unitOuterNormal();
             momentumFlux.mv(normal, values);
         }
         else
         {
+            const auto& scvf = faceIpData.scvf();
             const auto insideDensity = elemVolVars[scvf.insideScvIdx()].density();
             values[Indices::conti0EqIdx] = this->faceVelocity(element, fvGeometry, scvf) * insideDensity * scvf.unitOuterNormal();
             if (addBoxStabilization_)
-- 
GitLab


From ea1d85e8c213473e3e6cdad3b2b7f7a9fb147d16 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 20 Dec 2024 16:41:35 +0100
Subject: [PATCH 22/24] [cvfe] Add boundary flag to faceIpData

---
 dumux/discretization/cvfe/integrationpointdata.hh    |  4 ++++
 dumux/discretization/fem/integrationpointdata.hh     | 12 +++++++++---
 .../navierstokes/momentum/cvfe/localresidual.hh      |  5 +++--
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/dumux/discretization/cvfe/integrationpointdata.hh b/dumux/discretization/cvfe/integrationpointdata.hh
index 4e891ba678..9a9315314f 100644
--- a/dumux/discretization/cvfe/integrationpointdata.hh
+++ b/dumux/discretization/cvfe/integrationpointdata.hh
@@ -71,6 +71,10 @@ public:
     const SubControlVolumeFace& scvf() const
     { return scvf_; }
 
+    //! Return the boundary flag
+    auto boundaryFlag() const
+    { return scvf_.boundaryFlag(); }
+
 private:
     const SubControlVolumeFace& scvf_;
 };
diff --git a/dumux/discretization/fem/integrationpointdata.hh b/dumux/discretization/fem/integrationpointdata.hh
index 4a9f75fa7d..cdf0d891b3 100644
--- a/dumux/discretization/fem/integrationpointdata.hh
+++ b/dumux/discretization/fem/integrationpointdata.hh
@@ -91,7 +91,7 @@ private:
  * \ingroup FEMDiscretization
  * \brief Integration point data related to a face of an element
  */
-template<class GlobalPosition, class LocalBasis>
+template<class GlobalPosition, class LocalBasis, class BoundaryFlag>
 class FEFaceIntegrationPointData : public FEIntegrationPointData<GlobalPosition, LocalBasis>
 {
     using ParentType = FEIntegrationPointData<GlobalPosition, LocalBasis>;
@@ -105,16 +105,22 @@ public:
     FEFaceIntegrationPointData(const Geometry& geometry,
                                const LocalPosition& ipLocal,
                                const LocalBasis& localBasis,
-                               const GlobalPosition& n)
-    : ParentType(geometry, ipLocal, localBasis), normal_(n)
+                               const GlobalPosition& n,
+                               const BoundaryFlag& bFlag)
+    : ParentType(geometry, ipLocal, localBasis), normal_(n), boundaryFlag_(bFlag)
     {}
 
     //! The unit outer normal vector at the quadrature point
     const GlobalPosition& unitOuterNormal() const
     { return normal_; }
 
+    //! Return the boundary flag
+    typename BoundaryFlag::value_type boundaryFlag() const
+    { return boundaryFlag_.get(); }
+
 private:
     const GlobalPosition& normal_;
+    BoundaryFlag boundaryFlag_;
 };
 
 
diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index 82d4e9b7b2..95af78feb0 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -69,7 +69,7 @@ class NavierStokesMomentumCVFELocalResidual
     using LocalBasis = typename GridGeometry::FeCache::FiniteElementType::Traits::LocalBasisType;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using IpData = FEIntegrationPointData<GlobalPosition, LocalBasis>;
-    using FaceIpData = FEFaceIntegrationPointData<GlobalPosition, LocalBasis>;
+    using FaceIpData = FEFaceIntegrationPointData<GlobalPosition, LocalBasis, typename SubControlVolumeFace::Traits::BoundaryFlag>;
     using FluxContext = NavierStokesMomentumFluxContext<Problem, FVElementGeometry, ElementVolumeVariables, ElementFluxVariablesCache>;
     using FluxFunctionContext = NavierStokesMomentumFluxFunctionContext<Problem, FVElementGeometry, ElementVolumeVariables, IpData>;
     using FluxHelper = NavierStokesMomentumFluxCVFE<GridGeometry, NumEqVector>;
@@ -314,7 +314,8 @@ private:
 
                 // get quadrature rule weight for intersection
                 Scalar qWeight = quadPoint.weight() * Extrusion::integrationElement(isGeometry, quadPoint.position());
-                FaceIpData faceIpData(geometry, local, localBasis, intersection.centerUnitOuterNormal());
+                FaceIpData faceIpData(geometry, local, localBasis, intersection.centerUnitOuterNormal(),
+                                      typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection });
 
                 for (const auto& localDof : hybridLocalDofs(fvGeometry))
                 {
-- 
GitLab


From 30bb1d971b869ea3cc33670eb57522fffc99a580 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Thu, 2 Jan 2025 15:39:19 +0100
Subject: [PATCH 23/24] [cvfe] Check if fvLocalDofs are supported

---
 dumux/assembly/cvfelocalresidual.hh | 33 +++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/dumux/assembly/cvfelocalresidual.hh b/dumux/assembly/cvfelocalresidual.hh
index f1fba8f7c6..699a8e0373 100644
--- a/dumux/assembly/cvfelocalresidual.hh
+++ b/dumux/assembly/cvfelocalresidual.hh
@@ -44,6 +44,15 @@ template<class Imp>
 constexpr inline bool hasScvfIsOverlapping()
 { return Dune::Std::is_detected<SCVFIsOverlappingDetector, Imp>::value; }
 
+template<class Imp>
+using FVLocalDofsDetector = decltype(
+    fvLocalDofs(std::declval<Imp>())
+);
+
+template<class Imp>
+constexpr inline bool hasFVLocalDofsInterface()
+{ return Dune::Std::is_detected<FVLocalDofsDetector, Imp>::value; }
+
 } // end namespace Dumux::Detail
 
 
@@ -106,8 +115,16 @@ public:
 
         // evaluate the volume terms (storage + source terms)
         // forward to the local residual specialized for the discretization methods
-        for (const auto& localDof : fvLocalDofs(fvGeometry))
-            this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, localDof.scv());
+        if constexpr (Detail::hasFVLocalDofsInterface<FVElementGeometry>())
+        {
+            for (const auto& localDof : fvLocalDofs(fvGeometry))
+                this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, localDof.scv());
+        }
+        else
+        {
+            for (const auto& scv : scvs(fvGeometry))
+                this->asImp().evalStorage(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars, scv);
+        }
 
         // allow for additional contributions (e.g. hybrid CVFE schemes)
         this->asImp().addToElementStorageResidual(residual, this->problem(), element, fvGeometry, prevElemVolVars, curElemVolVars);
@@ -137,8 +154,16 @@ public:
 
         // evaluate the volume terms (storage + source terms)
         // forward to the local residual specialized for the discretization methods
-        for (const auto& localDof : fvLocalDofs(fvGeometry))
-            this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, localDof.scv());
+        if constexpr (Detail::hasFVLocalDofsInterface<FVElementGeometry>())
+        {
+            for (const auto& localDof : fvLocalDofs(fvGeometry))
+                this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, localDof.scv());
+        }
+        else
+        {
+            for (const auto& scv : scvs(fvGeometry))
+                this->asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, scv);
+        }
 
         // forward to the local residual specialized for the discretization methods
         for (auto&& scvf : scvfs(fvGeometry))
-- 
GitLab


From 5f203096762d28a08281995393d1d731d8be99e3 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Fri, 3 Jan 2025 09:43:00 +0100
Subject: [PATCH 24/24] [cvfe][ffmomentum] Check if there are any hybrid dofs

---
 .../freeflow/navierstokes/momentum/cvfe/localresidual.hh  | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
index 95af78feb0..1b94ccb6c7 100644
--- a/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
+++ b/dumux/freeflow/navierstokes/momentum/cvfe/localresidual.hh
@@ -177,6 +177,10 @@ public:
                                      const ElementVolumeVariables& prevElemVolVars,
                                      const ElementVolumeVariables& curElemVolVars) const
     {
+        // Make sure we don't iterate over quadrature points if there are no hybrid dofs
+        if( hybridLocalDofs(fvGeometry).empty() )
+            return;
+
         static const auto intOrder
             = getParamFromGroup<int>(problem.paramGroup(), "Assembly.FEIntegrationOrderStorage", 4);
 
@@ -223,6 +227,10 @@ public:
                                            const ElementFluxVariablesCache& elemFluxVarsCache,
                                            const ElementBoundaryTypes &elemBcTypes) const
     {
+        // Make sure we don't iterate over quadrature points if there are no hybrid dofs
+        if( hybridLocalDofs(fvGeometry).empty() )
+            return;
+
         static const bool enableUnsymmetrizedVelocityGradient
             = getParamFromGroup<bool>(problem.paramGroup(), "FreeFlow.EnableUnsymmetrizedVelocityGradient", false);
         static const auto intOrder
-- 
GitLab