2012-06-26 09:10:41 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// Copyright (C) 2011-2012 Statoil ASA, Ceetron AS
|
|
|
|
//
|
|
|
|
// ResInsight 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.
|
|
|
|
//
|
|
|
|
// ResInsight 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 at <http://www.gnu.org/licenses/gpl.html>
|
|
|
|
// for more details.
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#include "RIStdInclude.h"
|
|
|
|
|
|
|
|
#include "RimInputReservoir.h"
|
|
|
|
#include "RimInputProperty.h"
|
|
|
|
#include "RimReservoirView.h"
|
|
|
|
|
|
|
|
#include "RifReaderEclipseInput.h"
|
|
|
|
|
2013-02-13 06:33:35 -06:00
|
|
|
#include "RigEclipseCase.h"
|
2012-06-26 09:10:41 -05:00
|
|
|
#include "RigReservoirCellResults.h"
|
|
|
|
|
|
|
|
#include "cvfAssert.h"
|
|
|
|
|
|
|
|
#include <QString>
|
|
|
|
#include "RifReaderMockModel.h"
|
|
|
|
#include "RifEclipseInputFileTools.h"
|
|
|
|
#include "cafProgressInfo.h"
|
|
|
|
|
2012-10-24 03:52:44 -05:00
|
|
|
#include "RIApplication.h"
|
|
|
|
#include "RIPreferences.h"
|
|
|
|
|
|
|
|
|
2012-06-26 09:10:41 -05:00
|
|
|
CAF_PDM_SOURCE_INIT(RimInputReservoir, "RimInputReservoir");
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
RimInputReservoir::RimInputReservoir()
|
|
|
|
: RimReservoir()
|
|
|
|
{
|
|
|
|
CAF_PDM_InitObject("RimInputReservoir", ":/EclipseInput48x48.png", "", "");
|
|
|
|
CAF_PDM_InitField(&m_gridFileName, "GridFileName", QString(), "Case grid filename", "", "" ,"");
|
|
|
|
CAF_PDM_InitFieldNoDefault(&m_additionalFileNames, "AdditionalFileNames", "Additional files", "", "" ,"");
|
|
|
|
|
|
|
|
|
|
|
|
CAF_PDM_InitFieldNoDefault(&m_inputPropertyCollection, "InputPropertyCollection", "", "", "", "");
|
|
|
|
m_inputPropertyCollection = new RimInputPropertyCollection;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
RimInputReservoir::~RimInputReservoir()
|
|
|
|
{
|
|
|
|
delete m_inputPropertyCollection;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
/// Open the supplied file set. If no grid data has been read, it will first find the possible
|
|
|
|
/// grid data among the files then read all supported properties from the files matching the grid
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::openDataFileSet(const QStringList& filenames)
|
|
|
|
{
|
|
|
|
if (caseName().contains("Input Mock Debug Model"))
|
|
|
|
{
|
|
|
|
cvf::ref<RifReaderInterface> readerInterface = this->createMockModel(this->caseName());
|
2013-02-14 03:19:27 -06:00
|
|
|
m_rigEclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->setReaderInterface(readerInterface.p());
|
|
|
|
m_rigEclipseCase->results(RifReaderInterface::FRACTURE_RESULTS)->setReaderInterface(readerInterface.p());
|
2013-02-06 03:02:50 -06:00
|
|
|
|
2013-03-13 05:50:31 -05:00
|
|
|
m_rigEclipseCase->activeCellInfo(RifReaderInterface::MATRIX_RESULTS)->computeDerivedData();
|
|
|
|
m_rigEclipseCase->activeCellInfo(RifReaderInterface::FRACTURE_RESULTS)->computeDerivedData();
|
2013-02-06 03:02:50 -06:00
|
|
|
|
2012-06-26 09:10:41 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
if (m_rigEclipseCase.isNull())
|
2012-06-26 09:10:41 -05:00
|
|
|
{
|
2013-02-14 03:19:27 -06:00
|
|
|
m_rigEclipseCase = new RigEclipseCase;
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// First find and read the grid data
|
|
|
|
if (this->reservoirData()->mainGrid()->gridPointDimensions() == cvf::Vec3st(0,0,0))
|
|
|
|
{
|
|
|
|
for (int i = 0; i < filenames.size(); i++)
|
|
|
|
{
|
|
|
|
if (RifEclipseInputFileTools::openGridFile(filenames[i], this->reservoirData()))
|
|
|
|
{
|
|
|
|
m_gridFileName = filenames[i];
|
|
|
|
|
2013-02-22 03:12:06 -06:00
|
|
|
computeCachedData();
|
2012-06-26 09:10:41 -05:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this->reservoirData()->mainGrid()->gridPointDimensions() == cvf::Vec3st(0,0,0))
|
|
|
|
{
|
|
|
|
return ; // No grid present
|
|
|
|
}
|
|
|
|
|
|
|
|
// Then read the properties possibly in the grid file
|
|
|
|
QStringList filesToRead;
|
|
|
|
for (int i = 0; i < filenames.size(); i++)
|
|
|
|
{
|
|
|
|
size_t j;
|
|
|
|
bool exist = false;
|
|
|
|
for (j = 0; j < m_additionalFileNames().size(); j++)
|
|
|
|
{
|
|
|
|
if (m_additionalFileNames()[j] == filenames[i])
|
|
|
|
{
|
|
|
|
exist = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!exist)
|
|
|
|
{
|
|
|
|
filesToRead.push_back(filenames[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < filesToRead.size(); i++)
|
|
|
|
{
|
|
|
|
QString propertyFileName = filesToRead[i];
|
|
|
|
std::map<QString, QString> readProperties = RifEclipseInputFileTools::readProperties(propertyFileName, this->reservoirData());
|
|
|
|
|
|
|
|
std::map<QString, QString>::iterator it;
|
|
|
|
for (it = readProperties.begin(); it != readProperties.end(); ++it)
|
|
|
|
{
|
|
|
|
RimInputProperty* inputProperty = new RimInputProperty;
|
|
|
|
inputProperty->resultName = it->first;
|
|
|
|
inputProperty->eclipseKeyword = it->second;
|
|
|
|
inputProperty->fileName = propertyFileName;
|
|
|
|
inputProperty->resolvedState = RimInputProperty::RESOLVED;
|
|
|
|
m_inputPropertyCollection->inputProperties.push_back(inputProperty);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (propertyFileName != m_gridFileName)
|
|
|
|
{
|
|
|
|
m_additionalFileNames.v().push_back(propertyFileName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
bool RimInputReservoir::openEclipseGridFile()
|
|
|
|
{
|
|
|
|
// Early exit if reservoir data is created
|
2013-02-14 03:19:27 -06:00
|
|
|
if (m_rigEclipseCase.isNull())
|
2012-06-26 09:10:41 -05:00
|
|
|
{
|
2012-10-24 03:52:44 -05:00
|
|
|
cvf::ref<RifReaderInterface> readerInterface;
|
|
|
|
|
|
|
|
if (caseName().contains("Input Mock Debug Model"))
|
|
|
|
{
|
|
|
|
readerInterface = this->createMockModel(this->caseName());
|
|
|
|
}
|
|
|
|
else
|
2012-06-26 09:10:41 -05:00
|
|
|
{
|
2013-02-14 03:02:49 -06:00
|
|
|
cvf::ref<RigEclipseCase> eclipseCase = new RigEclipseCase;
|
2012-10-24 03:52:44 -05:00
|
|
|
readerInterface = new RifReaderEclipseInput;
|
2013-02-14 03:02:49 -06:00
|
|
|
if (!readerInterface->open(m_gridFileName, eclipseCase.p()))
|
2012-10-24 03:52:44 -05:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
m_rigEclipseCase = eclipseCase;
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
CVF_ASSERT(m_rigEclipseCase.notNull());
|
2012-10-24 03:52:44 -05:00
|
|
|
CVF_ASSERT(readerInterface.notNull());
|
2012-06-26 09:10:41 -05:00
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
m_rigEclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->setReaderInterface(readerInterface.p());
|
|
|
|
m_rigEclipseCase->results(RifReaderInterface::FRACTURE_RESULTS)->setReaderInterface(readerInterface.p());
|
2013-02-22 03:12:06 -06:00
|
|
|
|
|
|
|
computeCachedData();
|
|
|
|
loadAndSyncronizeInputProperties();
|
2012-10-24 03:52:44 -05:00
|
|
|
}
|
2012-06-26 09:10:41 -05:00
|
|
|
|
2013-02-01 07:39:32 -06:00
|
|
|
|
2012-10-24 03:52:44 -05:00
|
|
|
RIApplication* app = RIApplication::instance();
|
|
|
|
if (app->preferences()->autocomputeDepthRelatedProperties)
|
|
|
|
{
|
2013-02-14 03:19:27 -06:00
|
|
|
RigReservoirCellResults* matrixResults = m_rigEclipseCase->results(RifReaderInterface::MATRIX_RESULTS);
|
|
|
|
RigReservoirCellResults* fractureResults = m_rigEclipseCase->results(RifReaderInterface::FRACTURE_RESULTS);
|
2013-02-01 07:39:32 -06:00
|
|
|
|
|
|
|
matrixResults->computeDepthRelatedResults();
|
|
|
|
fractureResults->computeDepthRelatedResults();
|
2012-10-24 03:52:44 -05:00
|
|
|
}
|
2012-06-26 09:10:41 -05:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define for_all(stdVector, indexName) for (size_t indexName = 0; indexName < stdVector.size(); ++indexName)
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
/// Loads input property data from the gridFile and additional files
|
|
|
|
/// Creates new InputProperties if necessary, and flags the unused ones as obsolete
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::loadAndSyncronizeInputProperties()
|
|
|
|
{
|
|
|
|
// Make sure we actually have reservoir data
|
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
CVF_ASSERT(m_rigEclipseCase.notNull());
|
2012-06-26 09:10:41 -05:00
|
|
|
CVF_ASSERT(this->reservoirData()->mainGrid()->gridPointDimensions() != cvf::Vec3st(0,0,0));
|
|
|
|
|
|
|
|
// Then read the properties from all the files referenced by the InputReservoir
|
|
|
|
|
|
|
|
std::vector<QString> filenames = m_additionalFileNames;
|
|
|
|
filenames.push_back(m_gridFileName);
|
|
|
|
|
|
|
|
const std::vector<QString>& knownKeywords = RifEclipseInputFileTools::knownPropertyKeywords();
|
|
|
|
|
|
|
|
size_t inputPropCount = this->m_inputPropertyCollection()->inputProperties.size();
|
|
|
|
|
2013-01-22 04:34:47 -06:00
|
|
|
caf::ProgressInfo progInfo(static_cast<int>(filenames.size() *( inputPropCount + knownKeywords.size())), "Reading Input properties" );
|
2012-06-26 09:10:41 -05:00
|
|
|
int progress = 0;
|
|
|
|
|
|
|
|
for_all(filenames, i)
|
|
|
|
{
|
2013-01-22 04:34:47 -06:00
|
|
|
progress = static_cast<int>(i*( inputPropCount + knownKeywords.size()));
|
2012-06-26 09:10:41 -05:00
|
|
|
// Find all the keywords present on the file
|
|
|
|
|
|
|
|
progInfo.setProgressDescription(filenames[i]);
|
|
|
|
|
|
|
|
QFileInfo fileNameInfo(filenames[i]);
|
|
|
|
bool isExistingFile = fileNameInfo.exists();
|
|
|
|
|
|
|
|
std::set<QString> fileKeywordSet;
|
|
|
|
|
|
|
|
if (isExistingFile)
|
|
|
|
{
|
2012-10-08 12:44:10 -05:00
|
|
|
std::vector< RifKeywordAndFilePos > fileKeywords = RifEclipseInputFileTools::findKeywordsOnFile(filenames[i]);
|
|
|
|
for_all(fileKeywords, fkIt) fileKeywordSet.insert(fileKeywords[fkIt].keyword);
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Find the input property objects referring to the file
|
|
|
|
|
|
|
|
std::vector<RimInputProperty*> ipsUsingThisFile = this->m_inputPropertyCollection()->findInputProperties(filenames[i]);
|
|
|
|
|
|
|
|
// Read property data for each inputProperty
|
|
|
|
|
|
|
|
for_all(ipsUsingThisFile, ipIdx)
|
|
|
|
{
|
|
|
|
if (!isExistingFile)
|
|
|
|
{
|
|
|
|
ipsUsingThisFile[ipIdx]->resolvedState = RimInputProperty::FILE_MISSING;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
QString kw = ipsUsingThisFile[ipIdx]->eclipseKeyword();
|
|
|
|
ipsUsingThisFile[ipIdx]->resolvedState = RimInputProperty::KEYWORD_NOT_IN_FILE;
|
|
|
|
if (fileKeywordSet.count(kw))
|
|
|
|
{
|
|
|
|
if (RifEclipseInputFileTools::readProperty(filenames[i], this->reservoirData(), kw, ipsUsingThisFile[ipIdx]->resultName ))
|
|
|
|
{
|
|
|
|
ipsUsingThisFile[ipIdx]->resolvedState = RimInputProperty::RESOLVED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fileKeywordSet.erase(kw);
|
|
|
|
}
|
|
|
|
|
2013-01-22 04:34:47 -06:00
|
|
|
progInfo.setProgress(static_cast<int>(progress + ipIdx) );
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
2013-01-22 04:34:47 -06:00
|
|
|
progInfo.setProgress(static_cast<int>(progress + inputPropCount));
|
2012-06-26 09:10:41 -05:00
|
|
|
// Check if there are more known property keywords left on file. If it is, read them and create inputProperty objects
|
|
|
|
|
|
|
|
if (!fileKeywordSet.empty())
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<QString> knownKwsLeft;
|
|
|
|
for_all(knownKeywords, fkIt)
|
|
|
|
{
|
|
|
|
if (fileKeywordSet.count(knownKeywords[fkIt]))
|
|
|
|
{
|
2013-02-13 06:10:54 -06:00
|
|
|
QString resultName = this->reservoirData()->results(RifReaderInterface::MATRIX_RESULTS)->makeResultNameUnique(knownKeywords[fkIt]);
|
2012-06-26 09:10:41 -05:00
|
|
|
if (RifEclipseInputFileTools::readProperty(filenames[i], this->reservoirData(), knownKeywords[fkIt], resultName))
|
|
|
|
{
|
|
|
|
RimInputProperty* inputProperty = new RimInputProperty;
|
|
|
|
inputProperty->resultName = resultName;
|
|
|
|
inputProperty->eclipseKeyword = knownKeywords[fkIt];
|
|
|
|
inputProperty->fileName = filenames[i];
|
|
|
|
inputProperty->resolvedState = RimInputProperty::RESOLVED;
|
|
|
|
m_inputPropertyCollection->inputProperties.push_back(inputProperty);
|
|
|
|
}
|
|
|
|
}
|
2013-01-22 04:34:47 -06:00
|
|
|
progInfo.setProgress(static_cast<int>(progress + inputPropCount + fkIt));
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for_all(m_inputPropertyCollection->inputProperties, i)
|
|
|
|
{
|
|
|
|
if (m_inputPropertyCollection->inputProperties[i]->resolvedState() == RimInputProperty::UNKNOWN)
|
|
|
|
{
|
|
|
|
m_inputPropertyCollection->inputProperties[i]->resolvedState = RimInputProperty::FILE_MISSING;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::addFiles(const QStringList& newFileNames)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::removeFiles(const QStringList& obsoleteFileNames)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RimInputReservoir::removeProperty(RimInputProperty* inputProperty)
|
|
|
|
{
|
|
|
|
bool isPropertyFileReferencedByOthers = false;
|
|
|
|
|
|
|
|
m_inputPropertyCollection->removeInputProperty(inputProperty, isPropertyFileReferencedByOthers);
|
|
|
|
if (!isPropertyFileReferencedByOthers)
|
|
|
|
{
|
|
|
|
std::vector<QString> newList;
|
|
|
|
size_t i;
|
|
|
|
for (i = 0; i < m_additionalFileNames().size(); i++)
|
|
|
|
{
|
|
|
|
if (m_additionalFileNames()[i] != inputProperty->fileName)
|
|
|
|
{
|
|
|
|
newList.push_back(m_additionalFileNames()[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
m_additionalFileNames.v() = newList;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove the results pointed to by this input property
|
2013-02-14 03:19:27 -06:00
|
|
|
RigReservoirCellResults* results = m_rigEclipseCase->results(RifReaderInterface::MATRIX_RESULTS);
|
2012-06-26 09:10:41 -05:00
|
|
|
results->removeResult(inputProperty->resultName);
|
|
|
|
|
|
|
|
this->removeResult(inputProperty->resultName);
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
cvf::ref<RifReaderInterface> RimInputReservoir::createMockModel(QString modelName)
|
|
|
|
{
|
2013-02-13 06:24:39 -06:00
|
|
|
cvf::ref<RigEclipseCase> reservoir = new RigEclipseCase;
|
2012-06-26 09:10:41 -05:00
|
|
|
cvf::ref<RifReaderMockModel> mockFileInterface = new RifReaderMockModel;
|
|
|
|
|
|
|
|
if (modelName == "Input Mock Debug Model Simple")
|
|
|
|
{
|
|
|
|
// Create the mock file interface and and RigSerervoir and set them up.
|
|
|
|
mockFileInterface->setWorldCoordinates(cvf::Vec3d(10, 10, 10), cvf::Vec3d(20, 20, 20));
|
|
|
|
mockFileInterface->setGridPointDimensions(cvf::Vec3st(4, 5, 6));
|
|
|
|
mockFileInterface->addLocalGridRefinement(cvf::Vec3st(0, 2, 2), cvf::Vec3st(0, 2, 2), cvf::Vec3st(3, 3, 3));
|
|
|
|
mockFileInterface->setResultInfo(3, 10);
|
|
|
|
|
|
|
|
mockFileInterface->open("", reservoir.p());
|
|
|
|
{
|
|
|
|
size_t idx = reservoir->mainGrid()->cellIndexFromIJK(1, 3, 4);
|
2013-02-25 07:07:59 -06:00
|
|
|
|
|
|
|
//TODO: Rewrite active cell info in mock models
|
|
|
|
//reservoir->mainGrid()->cell(idx).setActiveIndexInMatrixModel(cvf::UNDEFINED_SIZE_T);
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
size_t idx = reservoir->mainGrid()->cellIndexFromIJK(2, 2, 3);
|
2013-02-25 07:07:59 -06:00
|
|
|
|
|
|
|
//TODO: Rewrite active cell info in mock models
|
|
|
|
//reservoir->mainGrid()->cell(idx).setActiveIndexInMatrixModel(cvf::UNDEFINED_SIZE_T);
|
2012-06-26 09:10:41 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add a property
|
|
|
|
RimInputProperty* inputProperty = new RimInputProperty;
|
|
|
|
inputProperty->resultName = "PORO";
|
|
|
|
inputProperty->eclipseKeyword = "PORO";
|
|
|
|
inputProperty->fileName = "PORO.prop";
|
|
|
|
m_inputPropertyCollection->inputProperties.push_back(inputProperty);
|
|
|
|
}
|
|
|
|
|
2013-02-14 03:19:27 -06:00
|
|
|
m_rigEclipseCase = reservoir;
|
2012-06-26 09:10:41 -05:00
|
|
|
|
|
|
|
return mockFileInterface.p();
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
QString RimInputReservoir::locationOnDisc() const
|
|
|
|
{
|
|
|
|
if (m_gridFileName().isEmpty()) return QString();
|
|
|
|
|
|
|
|
QFileInfo fi(m_gridFileName);
|
|
|
|
return fi.absolutePath();
|
|
|
|
}
|