Files
opm-common/opm/parser/eclipse/EclipseState/EclipseState.cpp
Andreas Lauser b449a783f9 property operators: add quite a few additional keywords
These are all keywords which are used by the Norne deck within some
property modifiers plus all variants of these. (sans the variants for
radial grids which are completely pointless IMO.) The chances that
keywords which have not been added yet can also be used are very close
to 100%, though.

Note that the default values for these keywords are currently
incorrect as the Eclipse RM states that the values must be looked up
in their corresponding table if the keyword is left unspecified (see
e.g. the documentation SWU). This probably means that we need to
implement "ghosty" keywords which magically appear if they have not
been explicitly specified or maybe we should only provide them in
EclipseState to be able to do the context dependent table look-up
"vodoo"...
2014-06-10 12:21:14 +02:00

554 lines
25 KiB
C++

/*
Copyright 2013 Statoil ASA.
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/Schedule/Schedule.hpp>
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
#include <opm/parser/eclipse/EclipseState/Grid/GridProperties.hpp>
#include <opm/parser/eclipse/EclipseState/Grid/Box.hpp>
#include <opm/parser/eclipse/EclipseState/Grid/BoxManager.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
#include <iostream>
#include <boost/algorithm/string/join.hpp>
namespace Opm {
EclipseState::EclipseState(DeckConstPtr deck)
{
m_unitSystem = deck->getActiveUnitSystem();
initPhases(deck);
initEclipseGrid(deck);
initSchedule(deck);
initTitle(deck);
initProperties(deck);
}
EclipseGridConstPtr EclipseState::getEclipseGrid() const {
return m_eclipseGrid;
}
ScheduleConstPtr EclipseState::getSchedule() const {
return schedule;
}
std::string EclipseState::getTitle() const {
return m_title;
}
void EclipseState::initSchedule(DeckConstPtr deck) {
schedule = ScheduleConstPtr( new Schedule(deck) );
}
void EclipseState::initEclipseGrid(DeckConstPtr deck) {
std::shared_ptr<Opm::GRIDSection> gridSection(new Opm::GRIDSection(deck) );
std::shared_ptr<Opm::RUNSPECSection> runspecSection(new Opm::RUNSPECSection(deck) );
m_eclipseGrid = EclipseGridConstPtr( new EclipseGrid( runspecSection , gridSection ));
}
void EclipseState::initPhases(DeckConstPtr deck) {
if (deck->hasKeyword("OIL"))
phases.insert(Phase::PhaseEnum::OIL);
if (deck->hasKeyword("GAS"))
phases.insert(Phase::PhaseEnum::GAS);
if (deck->hasKeyword("WATER"))
phases.insert(Phase::PhaseEnum::WATER);
}
bool EclipseState::hasPhase(enum Phase::PhaseEnum phase) const {
return (phases.count(phase) == 1);
}
void EclipseState::initTitle(DeckConstPtr deck){
if (deck->hasKeyword("TITLE")) {
DeckKeywordConstPtr titleKeyword = deck->getKeyword("TITLE");
DeckRecordConstPtr record = titleKeyword->getRecord(0);
DeckItemPtr item = record->getItem(0);
std::vector<std::string> itemValue = item->getStringData();
m_title = boost::algorithm::join(itemValue, " ");
}
}
bool EclipseState::supportsGridProperty(const std::string& keyword) const {
return (m_intGridProperties->supportsKeyword( keyword ) || m_doubleGridProperties->supportsKeyword( keyword ));
}
bool EclipseState::hasIntGridProperty(const std::string& keyword) const {
return m_intGridProperties->hasKeyword( keyword );
}
bool EclipseState::hasDoubleGridProperty(const std::string& keyword) const {
return m_doubleGridProperties->hasKeyword( keyword );
}
/*
Observe that this will autocreate a property if it has not been explicitly added.
*/
std::shared_ptr<GridProperty<int> > EclipseState::getIntGridProperty( const std::string& keyword ) const {
return m_intGridProperties->getKeyword( keyword );
}
std::shared_ptr<GridProperty<double> > EclipseState::getDoubleGridProperty( const std::string& keyword ) const {
return m_doubleGridProperties->getKeyword( keyword );
}
void EclipseState::loadGridPropertyFromDeckKeyword(std::shared_ptr<const Box> inputBox , DeckKeywordConstPtr deckKeyword) {
const std::string& keyword = deckKeyword->name();
if (m_intGridProperties->supportsKeyword( keyword )) {
auto gridProperty = m_intGridProperties->getKeyword( keyword );
gridProperty->loadFromDeckKeyword( inputBox , deckKeyword );
} else if (m_doubleGridProperties->supportsKeyword( keyword )) {
auto gridProperty = m_doubleGridProperties->getKeyword( keyword );
gridProperty->loadFromDeckKeyword( inputBox , deckKeyword );
} else {
throw std::invalid_argument("Tried to load from unsupported keyword: " + deckKeyword->name());
}
}
void EclipseState::initProperties(DeckConstPtr deck) {
BoxManager boxManager(m_eclipseGrid->getNX( ) , m_eclipseGrid->getNY() , m_eclipseGrid->getNZ());
typedef GridProperties<int>::SupportedKeywordInfo SupportedIntKeywordInfo;
static std::vector<SupportedIntKeywordInfo> supportedIntKeywords =
{SupportedIntKeywordInfo( "SATNUM" , 0 ),
SupportedIntKeywordInfo( "PVTNUM" , 0 ),
SupportedIntKeywordInfo( "EQLNUM" , 0 ),
SupportedIntKeywordInfo( "IMBNUM" , 0 ),
// TODO: implement regular expression matching for
// keyword names?
// SupportedIntKeywordInfo( "FIP???" , 0 ),
SupportedIntKeywordInfo( "FIPNUM" , 0 )};
// Note that the variants of grid keywords for radial grids
// are not supported. (and hopefully never will be)
typedef GridProperties<double>::SupportedKeywordInfo SupportedDoubleKeywordInfo;
static std::vector<SupportedDoubleKeywordInfo> supportedDoubleKeywords = {
// keywords to specify the scaled connate gas
// saturations.
SupportedDoubleKeywordInfo( "SGL" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGL" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGLZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGLZ-" , 0.0, "1" ),
// keywords to specify the connate water saturation.
SupportedDoubleKeywordInfo( "SWL" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWL" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWLZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWLZ-" , 0.0, "1" ),
// keywords to specify the maximum gas saturation.
SupportedDoubleKeywordInfo( "SGU" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGU" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGUZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGUZ-" , 0.0, "1" ),
// keywords to specify the maximum water saturation.
SupportedDoubleKeywordInfo( "SWU" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWU" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWUZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWUZ-" , 0.0, "1" ),
// keywords to specify the scaled critical gas
// saturation.
SupportedDoubleKeywordInfo( "SGCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SGCRZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISGCRZ-" , 0.0, "1" ),
// keywords to specify the scaled critical oil-in-water
// saturation.
SupportedDoubleKeywordInfo( "SOWCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOWCRZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOWCRZ-" , 0.0, "1" ),
// keywords to specify the scaled critical oil-in-gas
// saturation.
SupportedDoubleKeywordInfo( "SOGCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SOGCRZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISOGCRZ-" , 0.0, "1" ),
// keywords to specify the scaled critical water
// saturation.
SupportedDoubleKeywordInfo( "SWCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCR" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRX" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRX-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRY" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRY-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "SWCRZ-" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRZ" , 0.0, "1" ),
SupportedDoubleKeywordInfo( "ISWCRZ-" , 0.0, "1" ),
// porosity
SupportedDoubleKeywordInfo( "PORO" , 0.0, "1" ),
// transmissibility multipliers
SupportedDoubleKeywordInfo( "MULTX" , 1.0, "1" ),
SupportedDoubleKeywordInfo( "MULTY" , 1.0, "1" ),
SupportedDoubleKeywordInfo( "MULTZ" , 1.0, "1" ),
SupportedDoubleKeywordInfo( "MULTX-", 1.0, "1" ),
SupportedDoubleKeywordInfo( "MULTY-", 1.0, "1" ),
SupportedDoubleKeywordInfo( "MULTZ-", 1.0, "1" ),
// pore volume multipliers
SupportedDoubleKeywordInfo( "MULTPV", 1.0, "1" ),
// the permeability keywords
SupportedDoubleKeywordInfo( "PERMX" , 0.0, "Permeability" ),
SupportedDoubleKeywordInfo( "PERMY" , 0.0, "Permeability" ),
SupportedDoubleKeywordInfo( "PERMZ" , 0.0, "Permeability" ),
SupportedDoubleKeywordInfo( "PERMXY", 0.0, "Permeability" ), // E300 only
SupportedDoubleKeywordInfo( "PERMXZ", 0.0, "Permeability" ), // E300 only
SupportedDoubleKeywordInfo( "PERMYZ", 0.0, "Permeability" ), // E300 only
};
m_intGridProperties = std::make_shared<GridProperties<int> >(m_eclipseGrid->getNX() , m_eclipseGrid->getNY() , m_eclipseGrid->getNZ() , supportedIntKeywords);
m_doubleGridProperties.reset(new GridProperties<double>(m_eclipseGrid->getNX() , m_eclipseGrid->getNY() , m_eclipseGrid->getNZ() , supportedDoubleKeywords));
if (Section::hasGRID(deck)) {
std::shared_ptr<Opm::GRIDSection> gridSection(new Opm::GRIDSection(deck) );
scanSection( gridSection , boxManager );
}
if (Section::hasEDIT(deck)) {
std::shared_ptr<Opm::EDITSection> editSection(new Opm::EDITSection(deck) );
scanSection( editSection , boxManager );
}
if (Section::hasPROPS(deck)) {
std::shared_ptr<Opm::PROPSSection> propsSection(new Opm::PROPSSection(deck) );
scanSection( propsSection , boxManager );
}
if (Section::hasREGIONS(deck)) {
std::shared_ptr<Opm::REGIONSSection> regionsSection(new Opm::REGIONSSection(deck) );
scanSection( regionsSection , boxManager );
}
if (Section::hasSOLUTION(deck)) {
std::shared_ptr<Opm::SOLUTIONSection> solutionSection(new Opm::SOLUTIONSection(deck) );
scanSection( solutionSection , boxManager );
}
}
double EclipseState::getSIScaling(const std::string &dimensionString) const
{
return m_unitSystem->getDimension(dimensionString)->getSIScaling();
}
void EclipseState::scanSection(std::shared_ptr<Opm::Section> section , BoxManager& boxManager) {
for (auto iter = section->begin(); iter != section->end(); ++iter) {
DeckKeywordConstPtr deckKeyword = *iter;
if (supportsGridProperty( deckKeyword->name()) )
loadGridPropertyFromDeckKeyword( boxManager.getActiveBox() , deckKeyword );
if (deckKeyword->name() == "ADD")
handleADDKeyword(deckKeyword , boxManager);
if (deckKeyword->name() == "BOX")
handleBOXKeyword(deckKeyword , boxManager);
if (deckKeyword->name() == "COPY")
handleCOPYKeyword(deckKeyword , boxManager);
if (deckKeyword->name() == "EQUALS")
handleEQUALSKeyword(deckKeyword , boxManager);
if (deckKeyword->name() == "ENDBOX")
handleENDBOXKeyword(boxManager);
if (deckKeyword->name() == "MULTIPLY")
handleMULTIPLYKeyword(deckKeyword , boxManager);
boxManager.endKeyword();
}
boxManager.endSection();
}
void EclipseState::handleBOXKeyword(DeckKeywordConstPtr deckKeyword , BoxManager& boxManager) {
DeckRecordConstPtr record = deckKeyword->getRecord(0);
int I1 = record->getItem("I1")->getInt(0) - 1;
int I2 = record->getItem("I2")->getInt(0) - 1;
int J1 = record->getItem("J1")->getInt(0) - 1;
int J2 = record->getItem("J2")->getInt(0) - 1;
int K1 = record->getItem("K1")->getInt(0) - 1;
int K2 = record->getItem("K2")->getInt(0) - 1;
boxManager.setInputBox( I1 , I2 , J1 , J2 , K1 , K2 );
}
void EclipseState::handleENDBOXKeyword(BoxManager& boxManager) {
boxManager.endInputBox();
}
void EclipseState::handleMULTIPLYKeyword(DeckKeywordConstPtr deckKeyword , BoxManager& boxManager) {
for (auto iter = deckKeyword->begin(); iter != deckKeyword->end(); ++iter) {
DeckRecordConstPtr record = *iter;
const std::string& field = record->getItem("field")->getString(0);
double scaleFactor = record->getItem("factor")->getRawDouble(0);
setKeywordBox( record , boxManager );
if (m_intGridProperties->hasKeyword( field )) {
int intFactor = static_cast<int>(scaleFactor);
std::shared_ptr<GridProperty<int> > property = m_intGridProperties->getKeyword( field );
property->scale( intFactor , boxManager.getActiveBox() );
} else if (m_doubleGridProperties->hasKeyword( field )) {
std::shared_ptr<GridProperty<double> > property = m_doubleGridProperties->getKeyword( field );
property->scale( scaleFactor , boxManager.getActiveBox() );
} else
throw std::invalid_argument("Fatal error processing MULTIPLY keyword. Tried to multiply not defined keyword " + field);
}
}
/*
The fine print of the manual says the ADD keyword should support
some state dependent semantics regarding endpoint scaling arrays
in the PROPS section. That is not supported.
*/
void EclipseState::handleADDKeyword(DeckKeywordConstPtr deckKeyword , BoxManager& boxManager) {
for (auto iter = deckKeyword->begin(); iter != deckKeyword->end(); ++iter) {
DeckRecordConstPtr record = *iter;
const std::string& field = record->getItem("field")->getString(0);
double shiftValue = record->getItem("shift")->getRawDouble(0);
setKeywordBox( record , boxManager );
if (m_intGridProperties->hasKeyword( field )) {
int intShift = static_cast<int>(shiftValue);
std::shared_ptr<GridProperty<int> > property = m_intGridProperties->getKeyword( field );
property->add( intShift , boxManager.getActiveBox() );
} else if (m_doubleGridProperties->hasKeyword( field )) {
std::shared_ptr<GridProperty<double> > property = m_doubleGridProperties->getKeyword( field );
double siShiftValue = shiftValue * getSIScaling(property->getKeywordInfo().getDimensionString());
property->add(siShiftValue , boxManager.getActiveBox() );
} else
throw std::invalid_argument("Fatal error processing ADD keyword. Tried to shift not defined keyword " + field);
}
}
void EclipseState::handleEQUALSKeyword(DeckKeywordConstPtr deckKeyword , BoxManager& boxManager) {
for (auto iter = deckKeyword->begin(); iter != deckKeyword->end(); ++iter) {
DeckRecordConstPtr record = *iter;
const std::string& field = record->getItem("field")->getString(0);
double value = record->getItem("value")->getRawDouble(0);
setKeywordBox( record , boxManager );
if (m_intGridProperties->supportsKeyword( field )) {
int intValue = static_cast<int>(value);
std::shared_ptr<GridProperty<int> > property = m_intGridProperties->getKeyword( field );
property->setScalar( intValue , boxManager.getActiveBox() );
} else if (m_doubleGridProperties->supportsKeyword( field )) {
std::shared_ptr<GridProperty<double> > property = m_doubleGridProperties->getKeyword( field );
double siValue = value * getSIScaling(property->getKeywordInfo().getDimensionString());
property->setScalar( siValue , boxManager.getActiveBox() );
} else
throw std::invalid_argument("Fatal error processing EQUALS keyword. Tried to set not defined keyword " + field);
}
}
void EclipseState::handleCOPYKeyword(DeckKeywordConstPtr deckKeyword , BoxManager& boxManager) {
for (auto iter = deckKeyword->begin(); iter != deckKeyword->end(); ++iter) {
DeckRecordConstPtr record = *iter;
const std::string& srcField = record->getItem("src")->getString(0);
const std::string& targetField = record->getItem("target")->getString(0);
setKeywordBox( record , boxManager );
if (m_intGridProperties->hasKeyword( srcField ))
copyIntKeyword( srcField , targetField , boxManager.getActiveBox());
else if (m_doubleGridProperties->hasKeyword( srcField ))
copyDoubleKeyword( srcField , targetField , boxManager.getActiveBox());
else
throw std::invalid_argument("Fatal error processing COPY keyword. Tried to copy from not defined keyword " + srcField);
}
}
void EclipseState::copyIntKeyword(const std::string& srcField , const std::string& targetField , std::shared_ptr<const Box> inputBox) {
std::shared_ptr<const GridProperty<int> > src = m_intGridProperties->getKeyword( srcField );
std::shared_ptr<GridProperty<int> > target = m_intGridProperties->getKeyword( targetField );
target->copyFrom( *src , inputBox );
}
void EclipseState::copyDoubleKeyword(const std::string& srcField , const std::string& targetField , std::shared_ptr<const Box> inputBox) {
std::shared_ptr<const GridProperty<double> > src = m_doubleGridProperties->getKeyword( srcField );
std::shared_ptr<GridProperty<double> > target = m_doubleGridProperties->getKeyword( targetField );
target->copyFrom( *src , inputBox );
}
void EclipseState::setKeywordBox(DeckRecordConstPtr deckRecord , BoxManager& boxManager) {
DeckItemConstPtr I1Item = deckRecord->getItem("I1");
DeckItemConstPtr I2Item = deckRecord->getItem("I2");
DeckItemConstPtr J1Item = deckRecord->getItem("J1");
DeckItemConstPtr J2Item = deckRecord->getItem("J2");
DeckItemConstPtr K1Item = deckRecord->getItem("K1");
DeckItemConstPtr K2Item = deckRecord->getItem("K2");
size_t defaultCount = 0;
if (I1Item->defaultApplied())
defaultCount++;
if (I2Item->defaultApplied())
defaultCount++;
if (J1Item->defaultApplied())
defaultCount++;
if (J2Item->defaultApplied())
defaultCount++;
if (K1Item->defaultApplied())
defaultCount++;
if (K2Item->defaultApplied())
defaultCount++;
if (defaultCount == 0) {
boxManager.setKeywordBox( I1Item->getInt(0) - 1,
I2Item->getInt(0) - 1,
J1Item->getInt(0) - 1,
J2Item->getInt(0) - 1,
K1Item->getInt(0) - 1,
K2Item->getInt(0) - 1);
} else if (defaultCount != 6)
throw std::invalid_argument("When using BOX modifiers on keywords you must specify the BOX completely.");
}
}