mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2388 fractures. Support for asymmetric stim plan
This commit is contained in:
@@ -28,17 +28,23 @@
|
||||
|
||||
#include <cmath> // Needed for HUGE_VAL on Linux
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Internal functions
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool hasNegativeValues(std::vector<double> xs);
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFile(const QString& stimPlanFileName,
|
||||
double conductivityScalingFactor,
|
||||
MirrorMode mirrorMode,
|
||||
QString * errorMessage)
|
||||
{
|
||||
RiaLogging::info(QString("Starting to open StimPlan XML file: '%1'").arg(stimPlanFileName));
|
||||
|
||||
cvf::ref<RigStimPlanFractureDefinition> stimPlanFileData = new RigStimPlanFractureDefinition;
|
||||
size_t startingNegXsValues = 0;
|
||||
{
|
||||
QFile dataFile(stimPlanFileName);
|
||||
if (!dataFile.open(QFile::ReadOnly))
|
||||
@@ -50,7 +56,7 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
|
||||
QXmlStreamReader xmlStream;
|
||||
xmlStream.setDevice(&dataFile);
|
||||
xmlStream.readNext();
|
||||
startingNegXsValues = readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p());
|
||||
readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p(), mirrorMode);
|
||||
|
||||
RiaEclipseUnitTools::UnitSystemType unitSystem = stimPlanFileData->unitSet();
|
||||
|
||||
@@ -69,9 +75,9 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
|
||||
}
|
||||
|
||||
|
||||
size_t numberOfDepthValues = stimPlanFileData->depthCount();
|
||||
RiaLogging::debug(QString("Grid size X: %1, Y: %2").arg(QString::number(stimPlanFileData->gridXCount()),
|
||||
QString::number(numberOfDepthValues)));
|
||||
size_t numberOfYValues = stimPlanFileData->yCount();
|
||||
RiaLogging::debug(QString("Grid size X: %1, Y: %2").arg(QString::number(stimPlanFileData->xCount()),
|
||||
QString::number(numberOfYValues)));
|
||||
|
||||
size_t numberOfTimeSteps = stimPlanFileData->timeSteps().size();
|
||||
RiaLogging::debug(QString("Number of time-steps: %1").arg(numberOfTimeSteps));
|
||||
@@ -109,8 +115,9 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
|
||||
{
|
||||
double timeStepValue = getAttributeValueDouble(xmlStream2, "value");
|
||||
|
||||
std::vector<std::vector<double>> propertyValuesAtTimestep = getAllDepthDataAtTimeStep(xmlStream2, startingNegXsValues);
|
||||
|
||||
std::vector<std::vector<double>> propertyValuesAtTimestep =
|
||||
stimPlanFileData->generateDataLayoutFromFileDataLayout(getAllDepthDataAtTimeStep(xmlStream2));
|
||||
|
||||
bool valuesOK = stimPlanFileData->numberOfParameterValuesOK(propertyValuesAtTimestep);
|
||||
if (!valuesOK)
|
||||
{
|
||||
@@ -153,17 +160,16 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
|
||||
RiaLogging::info(QString("Successfully read XML file: '%1'").arg(stimPlanFileName));
|
||||
}
|
||||
|
||||
|
||||
return stimPlanFileData;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream, RigStimPlanFractureDefinition* stimPlanFileData)
|
||||
void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream,
|
||||
RigStimPlanFractureDefinition* stimPlanFileData,
|
||||
MirrorMode mirrorMode)
|
||||
{
|
||||
|
||||
size_t startNegValuesXs = 0;
|
||||
size_t startNegValuesYs = 0;
|
||||
QString gridunit = "unknown";
|
||||
|
||||
@@ -180,9 +186,9 @@ size_t RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlS
|
||||
{
|
||||
gridunit = getAttributeValueString(xmlStream, "uom");
|
||||
|
||||
if (gridunit == "m") stimPlanFileData->setUnitSet(RiaEclipseUnitTools::UNITS_METRIC);
|
||||
else if (gridunit == "ft") stimPlanFileData->setUnitSet(RiaEclipseUnitTools::UNITS_FIELD);
|
||||
else stimPlanFileData->setUnitSet(RiaEclipseUnitTools::UNITS_UNKNOWN);
|
||||
if (gridunit == "m") stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UNITS_METRIC;
|
||||
else if (gridunit == "ft") stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UNITS_FIELD;
|
||||
else stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UNITS_UNKNOWN;
|
||||
|
||||
double tvdToTopPerfFt = getAttributeValueDouble(xmlStream, "TVDToTopPerfFt");
|
||||
double tvdToBottomPerfFt = getAttributeValueDouble(xmlStream, "TVDToBottomPerfFt");
|
||||
@@ -193,18 +199,26 @@ size_t RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlS
|
||||
|
||||
if (xmlStream.name() == "xs")
|
||||
{
|
||||
size_t dummy;
|
||||
std::vector<double> gridValues;
|
||||
getGriddingValues(xmlStream, gridValues, startNegValuesXs);
|
||||
stimPlanFileData->setGridXs(gridValues);
|
||||
getGriddingValues(xmlStream, gridValues, dummy);
|
||||
stimPlanFileData->m_fileXs = gridValues;
|
||||
|
||||
stimPlanFileData->generateXsFromFileXs(mirrorMode == MIRROR_AUTO ? !hasNegativeValues(gridValues) : (bool)mirrorMode);
|
||||
}
|
||||
|
||||
else if (xmlStream.name() == "ys")
|
||||
{
|
||||
std::vector<double> gridValues;
|
||||
getGriddingValues(xmlStream, gridValues, startNegValuesYs);
|
||||
stimPlanFileData->setGridYs(gridValues);
|
||||
|
||||
stimPlanFileData->reorderYgridToDepths();
|
||||
// Reorder and change sign
|
||||
std::vector<double> ys;
|
||||
for (double y : gridValues)
|
||||
{
|
||||
ys.insert(ys.begin(), -y);
|
||||
}
|
||||
stimPlanFileData->m_Ys = ys;
|
||||
}
|
||||
|
||||
else if (xmlStream.name() == "time")
|
||||
@@ -219,13 +233,12 @@ size_t RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlS
|
||||
{
|
||||
RiaLogging::error(QString("Negative depth values detected in XML file"));
|
||||
}
|
||||
return startNegValuesXs;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<std::vector<double>> RifStimPlanXmlReader::getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream, size_t startingNegValuesXs)
|
||||
std::vector<std::vector<double>> RifStimPlanXmlReader::getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream)
|
||||
{
|
||||
std::vector<std::vector<double>> propertyValuesAtTimestep;
|
||||
|
||||
@@ -245,14 +258,10 @@ std::vector<std::vector<double>> RifStimPlanXmlReader::getAllDepthDataAtTimeSte
|
||||
QString depthDataStr = xmlStream.text().toString();
|
||||
for (int i = 0; i < depthDataStr.split(' ').size(); i++)
|
||||
{
|
||||
if (i < static_cast<int>(startingNegValuesXs)) continue;
|
||||
else
|
||||
QString value = depthDataStr.split(' ')[i];
|
||||
if ( value != "")
|
||||
{
|
||||
QString value = depthDataStr.split(' ')[i];
|
||||
if ( value != "")
|
||||
{
|
||||
propertyValuesAtDepth.push_back(value.toDouble());
|
||||
}
|
||||
propertyValuesAtDepth.push_back(value.toDouble());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -274,11 +283,8 @@ void RifStimPlanXmlReader::getGriddingValues(QXmlStreamReader &xmlStream, std::v
|
||||
if (value.size() > 0)
|
||||
{
|
||||
double gridValue = value.toDouble();
|
||||
if (gridValue > -1e-5) //tolerance of 1e-5
|
||||
{
|
||||
gridValues.push_back(gridValue);
|
||||
}
|
||||
else startNegValues++;
|
||||
gridValues.push_back(gridValue);
|
||||
if(gridValue < -RigStimPlanFractureDefinition::THRESHOLD_VALUE) startNegValues++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -315,6 +321,10 @@ QString RifStimPlanXmlReader::getAttributeValueString(QXmlStreamReader &xmlStrea
|
||||
return parameterValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Internal function
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool hasNegativeValues(std::vector<double> xs)
|
||||
{
|
||||
return xs[0] < -RigStimPlanFractureDefinition::THRESHOLD_VALUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user