Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ConstantCompressibilityWaterPvt: encapsulate EclipseState w/ friends #3261

Merged
merged 3 commits into from
Dec 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists_files.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ if(ENABLE_ECL_INPUT)
src/opm/material/fluidsystems/blackoilpvt/Co2GasPvt.cpp
src/opm/material/fluidsystems/blackoilpvt/ConstantCompressibilityBrinePvt.cpp
src/opm/material/fluidsystems/blackoilpvt/ConstantCompressibilityOilPvt.cpp
src/opm/material/fluidsystems/blackoilpvt/ConstantCompressibilityWaterPvt.cpp
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,17 @@
#ifndef OPM_CONSTANT_COMPRESSIBILITY_WATER_PVT_HPP
#define OPM_CONSTANT_COMPRESSIBILITY_WATER_PVT_HPP

#if HAVE_ECL_INPUT
#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
#endif

#include <cstddef>
#include <stdexcept>
#include <vector>

namespace Opm {

#if HAVE_ECL_INPUT
class EclipseState;
class Schedule;
#endif

/*!
* \brief This class represents the Pressure-Volume-Temperature relations of the gas phase
* without vaporized oil.
Expand All @@ -42,47 +46,12 @@ template <class Scalar>
class ConstantCompressibilityWaterPvt
{
public:
ConstantCompressibilityWaterPvt() = default;
ConstantCompressibilityWaterPvt(const std::vector<Scalar>& waterReferenceDensity,
const std::vector<Scalar>& waterReferencePressure,
const std::vector<Scalar>& waterReferenceFormationVolumeFactor,
const std::vector<Scalar>& waterCompressibility,
const std::vector<Scalar>& waterViscosity,
const std::vector<Scalar>& waterViscosibility)
: waterReferenceDensity_(waterReferenceDensity)
, waterReferencePressure_(waterReferencePressure)
, waterReferenceFormationVolumeFactor_(waterReferenceFormationVolumeFactor)
, waterCompressibility_(waterCompressibility)
, waterViscosity_(waterViscosity)
, waterViscosibility_(waterViscosibility)
{ }
#if HAVE_ECL_INPUT
/*!
* \brief Sets the pressure-dependent water viscosity and density
* using a table stemming from the Eclipse PVTW keyword.
*/
void initFromState(const EclipseState& eclState, const Schedule&)
{
const auto& pvtwTable = eclState.getTableManager().getPvtwTable();
const auto& densityTable = eclState.getTableManager().getDensityTable();

assert(pvtwTable.size() == densityTable.size());

size_t numRegions = pvtwTable.size();
setNumRegions(numRegions);

for (unsigned regionIdx = 0; regionIdx < numRegions; ++ regionIdx) {
waterReferenceDensity_[regionIdx] = densityTable[regionIdx].water;

waterReferencePressure_[regionIdx] = pvtwTable[regionIdx].reference_pressure;
waterReferenceFormationVolumeFactor_[regionIdx] = pvtwTable[regionIdx].volume_factor;
waterCompressibility_[regionIdx] = pvtwTable[regionIdx].compressibility;
waterViscosity_[regionIdx] = pvtwTable[regionIdx].viscosity;
waterViscosibility_[regionIdx] = pvtwTable[regionIdx].viscosibility;
}

initEnd();
}
void initFromState(const EclipseState& eclState, const Schedule&);
#endif

void setNumRegions(size_t numRegions)
Expand Down Expand Up @@ -271,7 +240,7 @@ class ConstantCompressibilityWaterPvt
const Evaluation& /*saltconcentration*/) const
{ return 0.0; /* this is dead water! */ }

const Scalar waterReferenceDensity(unsigned regionIdx) const
Scalar waterReferenceDensity(unsigned regionIdx) const
{ return waterReferenceDensity_[regionIdx]; }

const std::vector<Scalar>& waterReferencePressure() const
Expand All @@ -289,16 +258,6 @@ class ConstantCompressibilityWaterPvt
const std::vector<Scalar>& waterViscosibility() const
{ return waterViscosibility_; }

bool operator==(const ConstantCompressibilityWaterPvt<Scalar>& data) const
{
return this->waterReferenceDensity_ == data.waterReferenceDensity_ &&
this->waterReferencePressure() == data.waterReferencePressure() &&
this->waterReferenceFormationVolumeFactor() == data.waterReferenceFormationVolumeFactor() &&
this->waterCompressibility() == data.waterCompressibility() &&
this->waterViscosity() == data.waterViscosity() &&
this->waterViscosibility() == data.waterViscosibility();
}

private:
std::vector<Scalar> waterReferenceDensity_;
std::vector<Scalar> waterReferencePressure_;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*
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 2 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 <http://www.gnu.org/licenses/>.

Consult the COPYING file in the top-level source directory of this
module for the precise wording of the license and the list of
copyright holders.
*/

#include <config.h>
#include <opm/material/fluidsystems/blackoilpvt/ConstantCompressibilityWaterPvt.hpp>

#include <opm/common/ErrorMacros.hpp>

#include <opm/input/eclipse/EclipseState/EclipseState.hpp>

#include <fmt/format.h>

namespace Opm {

template<class Scalar>
void ConstantCompressibilityWaterPvt<Scalar>::
initFromState(const EclipseState& eclState, const Schedule&)
{
const auto& pvtwTable = eclState.getTableManager().getPvtwTable();
const auto& densityTable = eclState.getTableManager().getDensityTable();

if (pvtwTable.size() != densityTable.size()) {
OPM_THROW(std::runtime_error,
fmt::format("Table sizes mismatch. PVTW: {}, DensityTable: {}\n",
pvtwTable.size(), densityTable.size()));
}

size_t numRegions = pvtwTable.size();
setNumRegions(numRegions);

for (unsigned regionIdx = 0; regionIdx < numRegions; ++regionIdx) {
waterReferenceDensity_[regionIdx] = densityTable[regionIdx].water;

waterReferencePressure_[regionIdx] = pvtwTable[regionIdx].reference_pressure;
waterReferenceFormationVolumeFactor_[regionIdx] = pvtwTable[regionIdx].volume_factor;
waterCompressibility_[regionIdx] = pvtwTable[regionIdx].compressibility;
waterViscosity_[regionIdx] = pvtwTable[regionIdx].viscosity;
waterViscosibility_[regionIdx] = pvtwTable[regionIdx].viscosibility;
}

initEnd();
}

template class ConstantCompressibilityWaterPvt<double>;
template class ConstantCompressibilityWaterPvt<float>;

} // namespace Opm