diff --git a/dune/faultnetworks/faultfactories/rockfaultfactory.hh b/dune/faultnetworks/faultfactories/rockfaultfactory.hh index 81404e874f71946af4a085f808b363d757428ba8..7f5bdefbdf83d0c79f463bf54092ff0f9560c4b7 100644 --- a/dune/faultnetworks/faultfactories/rockfaultfactory.hh +++ b/dune/faultnetworks/faultfactories/rockfaultfactory.hh @@ -378,7 +378,7 @@ private: rock.level = level_; rock.center = center; - const ID centerIDs = {computeID(center(), 0), computeID(center(), 1)}; + const ID centerIDs = {computeID(center, 0), computeID(center, 1)}; size_t left, right, top, bottom = 0; @@ -600,6 +600,36 @@ private: } }; +template <class GridType> +class InitLevelRockFaultFactory : public LevelRockFaultFactory<GridType> { +private: + using Base = LevelRockFaultFactory<GridType>; +public: + InitLevelRockFaultFactory(const std::shared_ptr<GridType> grid, const int level, const typename Base::ctype resolution) : + Base(grid, level, resolution, nullptr) {} + + void build(const std::set<size_t>& boundaryDofs) { + typename Base::MyRock rock; + + rock.level = this->level_; + rock.center[0] = 0.5; + rock.center[1] = 0.5; + + const typename Base::ID centerIDs = {this->computeID(rock.center, 0), this->computeID(rock.center, 1)}; + + size_t top = this->searchDof(centerIDs, boundaryDofs, 1, 1); + size_t bottom = this->searchDof(centerIDs, boundaryDofs, 1, -1); + + size_t left = this->searchDof(centerIDs, boundaryDofs, 0, -1); + size_t right = this->searchDof(centerIDs, boundaryDofs, 0, 1); + + rock.set(left, right, top, bottom, rock.center); + + this->rocks_.push_back(rock); + } + +}; + template <class GridType> class RockFaultFactory { @@ -665,7 +695,6 @@ public: // 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); @@ -676,6 +705,10 @@ public: boundaryDofs.insert(intersectionDofs.begin(), intersectionDofs.end()); } + InitLevelRockFaultFactory initFactory(grid_, 0, levelResolutions_[0]); + initFactory.build(boundaryDofs); + + levelRockFaultFactories_[0] = std::make_shared<LevelRockFaultFactory<GridType>>(grid_, 0, levelResolutions_[0], initFactory, 1.0); levelRockFaultFactories_[0]->build(boundaryDofs); const auto& faults = levelRockFaultFactories_[0]->faults(); @@ -688,7 +721,7 @@ public: levelResolutions_[i] = std::pow(2, coarseResolution_+i); //generate faults on level - levelRockFaultFactories_[i] = std::make_shared<LevelRockFaultFactory<GridType>>(grid_, i, levelResolutions_[i], levelRockFaultFactories_[i-1], (i==1)*0.5); + 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();