Merge pull request #1177 from nairr/aquifer_obj

Carter-Tracy aquifer object
This commit is contained in:
Joakim Hove 2018-02-15 17:47:17 +01:00 committed by GitHub
commit da650aa7ff
3 changed files with 255 additions and 0 deletions

View File

@ -0,0 +1,98 @@
/*
Copyright (C) 2017 TNO
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 <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_AQUIFERCT_HPP
#define OPM_AQUIFERCT_HPP
/*
The AquiferCT which stands for AquiferCarterTracy is a data container object meant to hold the data for the aquifer carter tracy model.
This includes the logic for parsing as well as the associated tables. It is meant to be used by opm-grid and opm-simulators in order to
implement the Carter Tracy analytical aquifer model in OPM Flow.
*/
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/A.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <opm/parser/eclipse/Deck/DeckItem.hpp>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Aqudims.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/TableContainer.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/AqutabTable.hpp>
#include <boost/concept_check.hpp>
namespace Opm {
class AquiferCT {
public:
struct AQUCT_data{
// Aquifer ID
int aquiferID;
// Table IDs
int inftableID, pvttableID;
std::vector<int> cell_id;
// Variables constants
double phi_aq , //aquifer porosity
d0, //aquifer datum depth
C_t , //total compressibility
r_o , //aquifer inner radius
k_a , //aquifer permeability
c1, // 0.008527 (METRIC, PVT-M); 0.006328 (FIELD); 3.6 (LAB)
h , //aquifer thickness
theta , //angle subtended by the aquifer boundary
c2 ; //6.283 (METRIC, PVT-M); 1.1191 (FIELD); 6.283 (LAB).
std::vector<double> td, pi;
};
AquiferCT(const EclipseState& eclState, const Deck& deck);
const std::vector<AquiferCT::AQUCT_data>& getAquifers() const;
const int getAqInflTabID(size_t aquiferIndex);
const int getAqPvtTabID(size_t aquiferIndex);
private:
std::vector<AquiferCT::AQUCT_data> m_aquct;
//Set the default Pd v/s Td tables (constant terminal rate case for an infinite aquifer) as described in
//Van Everdingen, A. & Hurst, W., December, 1949.The Application of the Laplace Transformation to Flow Problems in Reservoirs.
//Petroleum Transactions, AIME.
inline void set_default_tables(std::vector<double>& td, std::vector<double>& pi)
{
std::vector<double> default_pressure_ = { 0.112, 0.229, 0.315, 0.376, 0.424, 0.469, 0.503, 0.564, 0.616, 0.659, 0.702, 0.735,
0.772, 0.802, 0.927, 1.02, 1.101, 1.169, 1.275, 1.362, 1.436, 1.5, 1.556, 1.604,
1.651, 1.829, 1.96, 2.067, 2.147, 2.282, 2.388, 2.476, 2.55, 2.615, 2.672, 2.723,
2.921, 3.064, 3.173, 3.263, 3.406, 3.516, 3.608, 3.684, 3.75, 3.809, 3.86 };
std::vector<double> default_time_ = { 0.01, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1,
1.5, 2, 2.5, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60, 70,
80, 90, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000 };
td = default_time_;
pi = default_pressure_;
}
};
}
#endif

View File

@ -0,0 +1,79 @@
/*
Copyright (C) 2017 TNO
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 <http://www.gnu.org/licenses/>.
*/
#include <opm/parser/eclipse/EclipseState/AquiferCT.hpp>
namespace Opm {
AquiferCT::AquiferCT(const EclipseState& eclState, const Deck& deck)
{
if (!deck.hasKeyword("AQUCT"))
return;
const auto& aquctKeyword = deck.getKeyword("AQUCT");
for (auto& aquctRecord : aquctKeyword){
AquiferCT::AQUCT_data data;
data.aquiferID = aquctRecord.getItem("AQUIFER_ID").template get<int>(0);
data.h = aquctRecord.getItem("THICKNESS_AQ").getSIDouble(0);
data.phi_aq = aquctRecord.getItem("PORO_AQ").getSIDouble(0);
data.d0 = aquctRecord.getItem("DAT_DEPTH").getSIDouble(0);
data.C_t = aquctRecord.getItem("C_T").getSIDouble(0);
data.r_o = aquctRecord.getItem("RAD").getSIDouble(0);
data.k_a = aquctRecord.getItem("PERM_AQ").getSIDouble(0);
data.theta = aquctRecord.getItem("INFLUENCE_ANGLE").getSIDouble(0);
data.c1 = 0.008527; // We are using SI
data.c2 = 6.283;
data.inftableID = aquctRecord.getItem("TABLE_NUM_INFLUENCE_FN").template get<int>(0);
data.pvttableID = aquctRecord.getItem("TABLE_NUM_WATER_PRESS").template get<int>(0);
// Get the correct influence table values
if (data.inftableID > 1){
const auto& aqutabTable = eclState.getTableManager().getAqutabTables().getTable(data.inftableID - 2);
const auto& aqutab_tdColumn = aqutabTable.getColumn(0);
const auto& aqutab_piColumn = aqutabTable.getColumn(1);
data.td = aqutab_tdColumn.vectorCopy();
data.pi = aqutab_piColumn.vectorCopy();
}
else
{
set_default_tables(data.td,data.pi);
}
m_aquct.push_back( std::move(data) );
}
}
const std::vector<AquiferCT::AQUCT_data>& AquiferCT::getAquifers() const
{
return m_aquct;
}
const int AquiferCT::getAqInflTabID(size_t aquiferIndex)
{
return m_aquct.at(aquiferIndex).inftableID;
}
const int AquiferCT::getAqPvtTabID(size_t aquiferIndex)
{
return m_aquct.at(aquiferIndex).pvttableID;
}
}

78
tests/parser/AquiferCTTests.cpp Executable file
View File

@ -0,0 +1,78 @@
/*
Copyright 2017 TNO.
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 <http://www.gnu.org/licenses/>.
*/
#define BOOST_TEST_MODULE AquiferCTTest
#include <boost/test/unit_test.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/EclipseState/AquiferCT.hpp>
using namespace Opm;
inline Deck createAquiferCTDeck() {
const char *deckData =
"DIMENS\n"
"3 3 3 /\n"
"\n"
"AQUDIMS\n"
"1* 1* 2 100 1 1000 /\n"
"GRID\n"
"\n"
"ACTNUM\n"
" 0 8*1 0 8*1 0 8*1 /\n"
"DXV\n"
"1 1 1 /\n"
"\n"
"DYV\n"
"1 1 1 /\n"
"\n"
"DZV\n"
"1 1 1 /\n"
"\n"
"TOPS\n"
"9*100 /\n"
"\n"
"PROPS\n"
"AQUTAB\n"
" 0.01 0.112 \n"
" 0.05 0.229 /\n"
"SOLUTION\n"
"\n"
"AQUCT\n"
" 1 2000.0 1000 100 .3 3.0e-5 330 10 360.0 1 2 /\n"
"/ \n";
Parser parser;
return parser.parseString(deckData, ParseContext());
}
inline std::vector<AquiferCT::AQUCT_data> init_aquiferct(){
auto deck = createAquiferCTDeck();
EclipseState eclState( deck );
AquiferCT aquct( eclState, deck);
std::vector<AquiferCT::AQUCT_data> aquiferct = aquct.getAquifers();
return aquiferct;
}
BOOST_AUTO_TEST_CASE(AquiferCTTest){
std::vector< AquiferCT::AQUCT_data > aquiferct = init_aquiferct();
for (const auto& it : aquiferct){
BOOST_CHECK_EQUAL(it.aquiferID , 1);
BOOST_CHECK_EQUAL(it.phi_aq , 0.3);
BOOST_CHECK_EQUAL(it.inftableID , 2);
}
}