From 624516ed3cd62c0f204ea89726c5cd25299313f6 Mon Sep 17 00:00:00 2001 From: Kai Bao Date: Wed, 6 Apr 2016 15:23:43 +0200 Subject: [PATCH] creating separate files for class StandardWells --- CMakeLists_files.cmake | 2 + opm/autodiff/StandardWells.cpp | 158 +++++++++++++++++++++++++++++++++ opm/autodiff/StandardWells.hpp | 84 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 opm/autodiff/StandardWells.cpp create mode 100644 opm/autodiff/StandardWells.hpp diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 862359eb5..04396a5cd 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -47,6 +47,7 @@ list (APPEND MAIN_SOURCE_FILES opm/autodiff/VFPProdProperties.cpp opm/autodiff/VFPInjProperties.cpp opm/autodiff/WellMultiSegment.cpp + opm/autodiff/StandardWells.cpp opm/autodiff/BlackoilSolventState.cpp opm/polymer/PolymerState.cpp opm/polymer/PolymerBlackoilState.cpp @@ -185,6 +186,7 @@ list (APPEND PUBLIC_HEADER_FILES opm/autodiff/VFPInjProperties.hpp opm/autodiff/WellStateMultiSegment.hpp opm/autodiff/WellMultiSegment.hpp + opm/autodiff/StandardWells.hpp opm/polymer/CompressibleTpfaPolymer.hpp opm/polymer/GravityColumnSolverPolymer.hpp opm/polymer/GravityColumnSolverPolymer_impl.hpp diff --git a/opm/autodiff/StandardWells.cpp b/opm/autodiff/StandardWells.cpp new file mode 100644 index 000000000..60ef126f6 --- /dev/null +++ b/opm/autodiff/StandardWells.cpp @@ -0,0 +1,158 @@ +/* + Copyright 2016 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + + +#include + + + +namespace Opm +{ + + + StandardWells:: + WellOps::WellOps(const Wells* wells) + : w2p(), + p2w(), + well_cells() + { + if( wells ) + { + w2p = Eigen::SparseMatrix(wells->well_connpos[ wells->number_of_wells ], wells->number_of_wells); + p2w = Eigen::SparseMatrix(wells->number_of_wells, wells->well_connpos[ wells->number_of_wells ]); + + const int nw = wells->number_of_wells; + const int* const wpos = wells->well_connpos; + + typedef Eigen::Triplet Tri; + + std::vector scatter, gather; + scatter.reserve(wpos[nw]); + gather .reserve(wpos[nw]); + + for (int w = 0, i = 0; w < nw; ++w) { + for (; i < wpos[ w + 1 ]; ++i) { + scatter.push_back(Tri(i, w, 1.0)); + gather .push_back(Tri(w, i, 1.0)); + } + } + + w2p.setFromTriplets(scatter.begin(), scatter.end()); + p2w.setFromTriplets(gather .begin(), gather .end()); + + well_cells.assign(wells->well_cells, wells->well_cells + wells->well_connpos[wells->number_of_wells]); + } + } + + + + + + StandardWells::StandardWells(const Wells* wells_arg) + : wells_(wells_arg) + , wops_(wells_arg) + , well_perforation_densities_(Vector()) + , well_perforation_pressure_diffs_(Vector()) + { + } + + + + + + const Wells& StandardWells::wells() const + { + assert(wells_ != 0); + return *(wells_); + } + + + + + + bool StandardWells::wellsActive() const + { + return wells_active_; + } + + + + + + void StandardWells::setWellsActive(const bool wells_active) + { + wells_active_ = wells_active; + } + + + + + + bool StandardWells::localWellsActive() const + { + return wells_ ? (wells_->number_of_wells > 0 ) : false; + } + + + + + + const StandardWells::WellOps& + StandardWells::wellOps() const + { + return wops_; + } + + + + + + Vector& StandardWells::wellPerforationDensities() + { + return well_perforation_densities_; + } + + + + + + const Vector& StandardWells::wellPerforationDensities() const + { + return well_perforation_densities_; + } + + + + + + Vector& StandardWells::wellPerforationPressureDiffs() + { + return well_perforation_pressure_diffs_; + } + + + + + + const Vector& StandardWells::wellPerforationPressureDiffs() const + { + return well_perforation_pressure_diffs_; + } + +} diff --git a/opm/autodiff/StandardWells.hpp b/opm/autodiff/StandardWells.hpp new file mode 100644 index 000000000..73280d692 --- /dev/null +++ b/opm/autodiff/StandardWells.hpp @@ -0,0 +1,84 @@ +/* + Copyright 2016 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + + +#ifndef OPM_STANDARDWELLS_HEADER_INCLUDED +#define OPM_STANDARDWELLS_HEADER_INCLUDED + +#include +#include +#include +#include + +#include + +#include +#include + + +namespace Opm { + + // --------- Types --------- + typedef AutoDiffBlock ADB; + typedef ADB::V Vector; + // typedef ADB::M Matrix; + + /// Class for handling the standard well model. + class StandardWells { + protected: + struct WellOps { + explicit WellOps(const Wells* wells); + Eigen::SparseMatrix w2p; // well -> perf (scatter) + Eigen::SparseMatrix p2w; // perf -> well (gather) + std::vector well_cells; // the set of perforated cells + }; + + public: + // --------- Public methods --------- + explicit StandardWells(const Wells* wells); + + const Wells& wells() const; + + /// return true if wells are available in the reservoir + bool wellsActive() const; + void setWellsActive(const bool wells_active); + /// return true if wells are available on this process + bool localWellsActive() const; + + const WellOps& wellOps() const; + + /// Density of each well perforation + Vector& wellPerforationDensities(); + const Vector& wellPerforationDensities() const; + + /// Diff to bhp for each well perforation. + Vector& wellPerforationPressureDiffs(); + const Vector& wellPerforationPressureDiffs() const; + + protected: + bool wells_active_; + const Wells* wells_; + const WellOps wops_; + Vector well_perforation_densities_; + Vector well_perforation_pressure_diffs_; + }; + + +} // namespace Opm +#endif