diff --git a/dumux/porousmediumflow/2p/sequential/impes/problem.hh b/dumux/porousmediumflow/2p/sequential/impes/problem.hh index 5ae89c762e1ce2ab2153ff05c4afac539bcb8bd6..90b58c1b19231b350c64e7b2326b6756cf1e22b7 100644 --- a/dumux/porousmediumflow/2p/sequential/impes/problem.hh +++ b/dumux/porousmediumflow/2p/sequential/impes/problem.hh @@ -75,8 +75,11 @@ public: * \param gridView The grid view */ IMPESProblem2P(TimeManager& timeManager, Grid& grid) - : ParentType(timeManager, grid), - gravity_(0) + : IMPESProblem2P(timeManager, grid, grid.leafGridView()) + {} + + IMPESProblem2P(TimeManager& timeManager, Grid& grid, const GridView& gridView) + : ParentType(timeManager, grid, gridView), gravity_(0) { spatialParams_ = std::make_shared(asImp_()); diff --git a/dumux/porousmediumflow/sequential/impetproblem.hh b/dumux/porousmediumflow/sequential/impetproblem.hh index 9b2cf6dea9243e15866cdc42623e792edbfee497..58d94ec3c6a760329cddf610216eb7a5f7200636 100644 --- a/dumux/porousmediumflow/sequential/impetproblem.hh +++ b/dumux/porousmediumflow/sequential/impetproblem.hh @@ -96,22 +96,23 @@ public: * \param gridView gridview to the grid. */ IMPETProblem(TimeManager &timeManager, Grid& grid) - : gridView_(grid.leafGridView()), - grid_(nullptr), + : IMPETProblem(timeManager, grid, grid.leafGridView()) + {} + + IMPETProblem(TimeManager &timeManager, Grid& grid, const GridView& gridView) + : grid_(&grid), + gridView_(gridView), bBoxMin_(std::numeric_limits::max()), bBoxMax_(-std::numeric_limits::max()), timeManager_(&timeManager), - variables_(grid.leafGridView()), outputInterval_(1), outputTimeInterval_(0.0), vtkOutputLevel_(-1) { - setGrid(grid); - // calculate the bounding box of the grid view using std::min; using std::max; - for (const auto& vertex : vertices(grid.leafGridView())) { + for (const auto& vertex : vertices(this->gridView())) { for (int i=0; i 1) + if (this->gridView().comm().size() > 1) for (int i = 0; i < dim; ++i) { - bBoxMin_[i] = grid.leafGridView().comm().min(bBoxMin_[i]); - bBoxMax_[i] = grid.leafGridView().comm().max(bBoxMax_[i]); + bBoxMin_[i] = this->gridView().comm().min(bBoxMin_[i]); + bBoxMax_[i] = this->gridView().comm().max(bBoxMax_[i]); } + variables_ = std::make_shared(this->gridView()); pressModel_ = std::make_shared(asImp_()); transportModel_ = std::make_shared(asImp_()); @@ -322,7 +324,7 @@ public: void init() { // set the initial condition of the model - variables_.initialize(); + variables_->initialize(); model().initialize(); if (adaptiveGrid) gridAdapt().init(); @@ -380,12 +382,12 @@ public: if (Dune::FloatCmp::eq(t, 0.0, 1.0e-30) && Dune::FloatCmp::ne(timeManager().timeStepSize(), 0.0, 1.0e-30)) { - if (this->gridView().comm().size() > 1) - dt = this->gridView().comm().min(dt); + if (gridView().comm().size() > 1) + dt = gridView().comm().min(dt); // check if assigned initialDt is in accordance with dt from first transport step if (timeManager().timeStepSize() > dt - && this->gridView().comm().rank() == 0) + && gridView().comm().rank() == 0) Dune::dwarn << "Initial timestep of size " << timeManager().timeStepSize() << " is larger then dt=" << dt <<" from transport" << std::endl; // internally assign next timestep size @@ -393,8 +395,8 @@ public: } //make sure the right time-step is used by all processes in the parallel case - if (this->gridView().comm().size() > 1) - dt = this->gridView().comm().min(dt); + if (gridView().comm().size() > 1) + dt = gridView().comm().min(dt); // check maximum allowed time step size timeManager().setTimeStepSize(dt); @@ -568,8 +570,10 @@ public: /*! * \brief The GridView which used by the problem. */ - const GridView &gridView() const - { return gridView_; } + const GridView& gridView() const + { + return gridView_; + } /*! * \brief Returns the current grid which used by the problem. @@ -629,13 +633,13 @@ public: * \brief Returns the mapper for vertices to indices. */ const VertexMapper &vertexMapper() const - { return variables_.vertexMapper(); } + { return variables_->vertexMapper(); } /*! * \brief Returns the mapper for elements to indices. */ const ElementMapper &elementMapper() const - { return variables_.elementMapper(); } + { return variables_->elementMapper(); } /*! * \brief The coordinate of the corner of the GridView's bounding @@ -670,11 +674,11 @@ public: * simulation process, such as pressure, saturation etc. */ Variables& variables () - { return variables_; } + { return *variables_; } //! \copydoc IMPETProblem::variables () const Variables& variables () const - { return variables_; } + { return *variables_; } /*! * \brief Returns numerical model used for the problem. @@ -733,8 +737,8 @@ public: resultWriter().serialize(res); // do the actual serialization process: write primary variables - res.template serializeEntities<0> (*pressModel_, gridView_); - res.template serializeEntities<0> (*transportModel_, gridView_); + res.template serializeEntities<0> (*pressModel_, gridView()); + res.template serializeEntities<0> (*transportModel_, gridView()); res.serializeEnd(); @@ -771,8 +775,8 @@ public: resultWriter().deserialize(res); // do the actual serialization process: get primary variables - res.template deserializeEntities<0> (*pressModel_, gridView_); - res.template deserializeEntities<0> (*transportModel_, gridView_); + res.template deserializeEntities<0> (*pressModel_, gridView()); + res.template deserializeEntities<0> (*transportModel_, gridView()); pressureModel().updateMaterialLaws(); res.deserializeEnd(); @@ -798,7 +802,7 @@ public: std::cout << "Writing result file for current time step\n"; if (!resultWriter_) - resultWriter_ = std::make_shared(gridView_, asImp_().name()); + resultWriter_ = std::make_shared(gridView(), asImp_().name()); if (adaptiveGrid) resultWriter_->gridChanged(); resultWriter_->beginWrite(timeManager().time() + timeManager().timeStepSize()); @@ -814,14 +818,14 @@ protected: VtkMultiWriter& resultWriter() { if (!resultWriter_) - resultWriter_ = std::make_shared(gridView_, asImp_().name()); + resultWriter_ = std::make_shared(gridView(), asImp_().name()); return *resultWriter_; } //! \copydoc IMPETProblem::resultWriter() VtkMultiWriter& resultWriter() const { if (!resultWriter_) - resultWriter_ = std::make_shared(gridView_, asImp_().name()); + resultWriter_ = std::make_shared(gridView(), asImp_().name()); return *resultWriter_; } @@ -835,11 +839,11 @@ private: { return *static_cast(this); } std::string simname_; // a string for the name of the current simulation, - // which could be set by means of an program argument, - // for example. - const GridView gridView_; + // which could be set by means of a program argument, for example. + // pointer to a possibly adaptive grid. Grid *grid_; + GridView gridView_; GlobalPosition bBoxMin_; GlobalPosition bBoxMax_; @@ -847,7 +851,7 @@ private: TimeManager *timeManager_; Scalar maxTimeStepSize_; - Variables variables_; + std::shared_ptr variables_; std::shared_ptr pressModel_;//!< object including the pressure model std::shared_ptr transportModel_;//!< object including the saturation model