From 10709c3816b6d0ef444f3092043a97786f73de27 Mon Sep 17 00:00:00 2001
From: podlesny <podlesny@zedat.fu-berlin.de>
Date: Fri, 12 Jun 2020 14:25:12 +0200
Subject: [PATCH] .

---
 .../faultfactories/rockfaultfactory.hh        | 79 +++++++++++++------
 1 file changed, 56 insertions(+), 23 deletions(-)

diff --git a/dune/faultnetworks/faultfactories/rockfaultfactory.hh b/dune/faultnetworks/faultfactories/rockfaultfactory.hh
index e48d563..81404e8 100644
--- a/dune/faultnetworks/faultfactories/rockfaultfactory.hh
+++ b/dune/faultnetworks/faultfactories/rockfaultfactory.hh
@@ -121,7 +121,7 @@ private:
 
             // check if intersection has separating dofs or other fault dofs
             std::set<size_t> intersectionDofs;
-            computeIntersectionDofs(indexSet_, intersection, intersectionDofs);
+            computeIntersectionDofs(intersection, intersectionDofs);
             intersectionDofs.erase(vertexID);
 
             const size_t otherDim = (dim + 1) % 2;
@@ -151,21 +151,6 @@ private:
             return (int) (vertex[dim]*resolution_);
         }
 
-        void computeIntersectionDofs(const Intersection& intersection, std::set<size_t>& intersectionDofs) const {
-            intersectionDofs.clear();
-
-            // loop over all vertices of the intersection
-            const auto& insideElement = intersection.inside();
-            const auto& refElement = Dune::ReferenceElements<double,dimElement>::general(insideElement.type());
-
-            for (int i=0; i<refElement.size(intersection.indexInInside(), 1, dimElement); i++) {
-                size_t idxInElement = refElement.subEntity(intersection.indexInInside(), 1, i, dimElement);
-                size_t globalIdx = indexSet_.subIndex(insideElement, idxInElement, dimElement);
-
-                intersectionDofs.insert(globalIdx);
-            }
-        }
-
         bool isTargetBoundaryVertex(size_t vertexIdx, const std::array<size_t, 2>& targetIDs) const {
             const auto& vertex = vertexPositions_[vertexIdx];
             const std::array<size_t, 2> vertexIDs = {computeID(vertex, 0), computeID(vertex, 1)};
@@ -338,7 +323,7 @@ private:
                     suitableFaces.erase(suitableFaces.begin()+randSelector);
 
                     std::set<size_t> nextFaceDofs;
-                    computeIntersectionDofs(indexSet_, faces_[nextFaceID], nextFaceDofs);
+                    computeIntersectionDofs(faces_[nextFaceID], nextFaceDofs);
                     nextFaceDofs.erase(vertexID);
 
                     faultDofs.push_back(*nextFaceDofs.begin());
@@ -504,13 +489,18 @@ private:
     }
 
     public:
-        LevelRockFaultFactory(const std::shared_ptr<GridType> grid, const int level, const ctype resolution) :
+        LevelRockFaultFactory(const std::shared_ptr<GridType> grid, const int level, const ctype resolution,
+                              const LevelRockFaultFactory& coarseLevelFactory,
+                              const double splittingThreshold = 0.0, const double maxAngle = 2) :
             grid_(grid),
             level_(level),
             resolution_(resolution),
             gridView_(grid_->levelGridView(level_)),
+            splittingThreshold_(splittingThreshold),
+            maxAngle_(maxAngle),
             indexSet_(gridView_.indexSet()),
-            faceMapper_(gridView_)
+            faceMapper_(gridView_),
+            coarseLevelFactory_(coarseLevelFactory)
             {
                 // init faces_, vertexPositions_, vertexToFaces_
                 faces_.resize(faceMapper_.size());
@@ -574,6 +564,25 @@ private:
             }
         }
 
+        void computeIntersectionDofs(const Intersection& intersection, std::set<size_t>& intersectionDofs) const {
+            intersectionDofs.clear();
+
+            // loop over all vertices of the intersection
+            const auto& insideElement = intersection.inside();
+            const auto& refElement = Dune::ReferenceElements<double,dimElement>::general(insideElement.type());
+
+            for (int i=0; i<refElement.size(intersection.indexInInside(), 1, dimElement); i++) {
+                size_t idxInElement = refElement.subEntity(intersection.indexInInside(), 1, i, dimElement);
+                size_t globalIdx = indexSet_.subIndex(insideElement, idxInElement, dimElement);
+
+                intersectionDofs.insert(globalIdx);
+            }
+        }
+
+        const auto& gridView() const {
+            return gridView_;
+        }
+
         const auto& indexSet() const {
             return indexSet_;
         }
@@ -585,6 +594,10 @@ private:
         auto level() const {
             return level_;
         }
+
+        const auto& faults() const {
+            return faults_;
+        }
 };
 
 template <class GridType>
@@ -650,15 +663,35 @@ public:
             // init interface network
             interfaceNetwork_ = std::make_shared<InterfaceNetwork<GridType>>(*grid_);
 
-            for (size_t i=0; i<=maxLevel_; i++) {
-                std::vector<std::shared_ptr<FaultInterface<GV>>> faults;
+            // init level 0 rockFaultFactory
+            levelResolutions_[0] = std::pow(2, coarseResolution_);
+            levelRockFaultFactories_[0] = std::make_shared<LevelRockFaultFactory<GridType>>(grid_, 0, levelResolutions_[0], levelRockFaultFactories_[i-1], 1.0);
+
+            std::set<size_t> boundaryDofs;
+            BoundaryIterator<GV> bIt(levelRockFaultFactories_[0].gridView(), BoundaryIterator<GV>::begin);
+            BoundaryIterator<GV> bEnd(levelRockFaultFactories_[0].gridView(), BoundaryIterator<GV>::end);
+            for(; bIt!=bEnd; ++bIt) {
+                std::set<size_t> intersectionDofs;
+                levelRockFaultFactories_[0].computeIntersectionDofs(*bIt, intersectionDofs);
+                boundaryDofs.insert(intersectionDofs.begin(), intersectionDofs.end());
+            }
+
+            levelRockFaultFactories_[0]->build(boundaryDofs);
+
+            const auto& faults = levelRockFaultFactories_[0]->faults();
+            for (size_t j=0; j<faults.size(); j++) {
+                interfaceNetwork_->addInterface(faults[j]);
+            }
+            interfaceNetwork_->prolongLevel(0, 1);
 
+            for (size_t i=1; i<=maxLevel_; i++) {
                 levelResolutions_[i] = std::pow(2, coarseResolution_+i);
 
                 //generate faults on level
-                levelRockFaultFactories_[i] = std::make_shared<LevelRockFaultFactory<GridType>>(grid_, i, levelResolutions_[i]);
-                levelRockFaultFactories_[i]->build(faults, maxAngle);
+                levelRockFaultFactories_[i] = std::make_shared<LevelRockFaultFactory<GridType>>(grid_, i, levelResolutions_[i], levelRockFaultFactories_[i-1], (i==1)*0.5);
+                levelRockFaultFactories_[i]->build(interfaceNetwork_->getInterfaceNetworkDofs(i));
 
+                faults = levelRockFaultFactories_[i]->faults();
                 for (size_t j=0; j<faults.size(); j++) {
                     interfaceNetwork_->addInterface(faults[j]);
                 }
-- 
GitLab