From ff59429ad82c1320b34a4de914037e3e8b30be40 Mon Sep 17 00:00:00 2001 From: astridkbjorke Date: Wed, 15 Feb 2017 10:32:34 +0100 Subject: [PATCH] #1139 - pre-proto - Adjustments in reading of XML file to handle files with multiple time-steps and several parameters. --- .../RimStimPlanFractureTemplate.cpp | 175 +++++++++++++----- .../RimStimPlanFractureTemplate.h | 5 + .../RigStimPlanFractureDefinition.cpp | 42 +++++ .../RigStimPlanFractureDefinition.h | 6 +- 4 files changed, 185 insertions(+), 43 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp index 0b409ed20f..5edc5c7f37 100644 --- a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp @@ -141,6 +141,45 @@ QString RimStimPlanFractureTemplate::fileNameWithOutPath() //-------------------------------------------------------------------------------------------------- void RimStimPlanFractureTemplate::readStimPlanXMLFile(QString * errorMessage) { + + + m_stimPlanFractureDefinitionData = new RigStimPlanFractureDefinition; + { + QFile dataFile(m_stimPlanFileName()); + + if (!dataFile.open(QFile::ReadOnly)) + { + if (errorMessage) (*errorMessage) += "Could not open the File: " + (m_stimPlanFileName()) + "\n"; + return; + } + + QXmlStreamReader xmlStream; + xmlStream.setDevice(&dataFile); + xmlStream.readNext(); + readStimplanGridAndTimesteps(xmlStream); + if (xmlStream.hasError()) + { + qDebug() << "Error: Failed to parse file " << dataFile.fileName(); + qDebug() << xmlStream.errorString(); + } + + dataFile.close(); + + } + + size_t numberOfDepthValues; + numberOfDepthValues = m_stimPlanFractureDefinitionData->depths.size(); + size_t numberOfTimeSteps; + numberOfTimeSteps = m_stimPlanFractureDefinitionData->timeSteps.size(); + + std::vector>> condValues(numberOfTimeSteps); + m_stimPlanFractureDefinitionData->conductivities = condValues; + std::vector>> widthValues(numberOfTimeSteps); + m_stimPlanFractureDefinitionData->widths = widthValues; + std::vector>> permValues(numberOfTimeSteps); + m_stimPlanFractureDefinitionData->permeabilities = permValues; + + //Start reading from top: QFile dataFile(m_stimPlanFileName()); if (!dataFile.open(QFile::ReadOnly)) @@ -148,68 +187,60 @@ void RimStimPlanFractureTemplate::readStimPlanXMLFile(QString * errorMessage) if (errorMessage) (*errorMessage) += "Could not open the File: " + (m_stimPlanFileName()) + "\n"; return; } - - m_stimPlanFractureDefinitionData = new RigStimPlanFractureDefinition; - - QXmlStreamReader xmlStream; - xmlStream.setDevice(&dataFile); - xmlStream.readNext(); - + + QXmlStreamReader xmlStream2; + xmlStream2.setDevice(&dataFile); QString parameter; - while (!xmlStream.atEnd()) + while (!xmlStream2.atEnd()) { - xmlStream.readNext(); + xmlStream2.readNext(); - if (xmlStream.isStartElement()) + if (xmlStream2.isStartElement()) { - - if (xmlStream.name() == "xs") - { - m_stimPlanFractureDefinitionData->gridXs = getGriddingValues(xmlStream); - } - - else if (xmlStream.name() == "ys") + if (xmlStream2.name() == "property") { - m_stimPlanFractureDefinitionData->gridYs = getGriddingValues(xmlStream); - + parameter = getAttributeValueString(xmlStream2, "name"); } - - else if (xmlStream.name() == "property") + else if (xmlStream2.name() == "time") { - parameter = getAttributeValueString(xmlStream, "name"); - } - - else if (xmlStream.name() == "time") - { - double timeStepValue = getAttributeValueDouble(xmlStream, "value"); - m_stimPlanFractureDefinitionData->timeSteps.push_back(timeStepValue); - - std::vector> propertyValuesAtTimestep = getAllDepthDataAtTimeStep(xmlStream); + double timeStepValue = getAttributeValueDouble(xmlStream2, "value"); + std::vector> propertyValuesAtTimestep = getAllDepthDataAtTimeStep(xmlStream2); + bool valuesOK = numberOfParameterValuesOK(propertyValuesAtTimestep); + if (!valuesOK) + { + qDebug() << "Inconsistency detected in reading XML file!"; + return; + + } + + //TODO: Check that number of values in these vectors match number of cells in grid! + size_t timeStepIndex = m_stimPlanFractureDefinitionData->getTimeStepIndex(timeStepValue); + if (parameter == "CONDUCTIVITY") { - m_stimPlanFractureDefinitionData->conductivities.push_back(propertyValuesAtTimestep); + m_stimPlanFractureDefinitionData->conductivities[timeStepIndex]=propertyValuesAtTimestep; } - - if (parameter == "PERMEABILITY") + else if (parameter == "PERMEABILITY") { - m_stimPlanFractureDefinitionData->permeabilities.push_back(propertyValuesAtTimestep); + m_stimPlanFractureDefinitionData->permeabilities[timeStepIndex] = propertyValuesAtTimestep; } - if (parameter == "WIDTH") + else if (parameter == "WIDTH") { - m_stimPlanFractureDefinitionData->widths.push_back(propertyValuesAtTimestep); + m_stimPlanFractureDefinitionData->widths[timeStepIndex] = propertyValuesAtTimestep; } + } } } dataFile.close(); - if (xmlStream.hasError()) + if (xmlStream2.hasError()) { qDebug() << "Error: Failed to parse file " << dataFile.fileName(); - qDebug() << xmlStream.errorString(); + qDebug() << xmlStream2.errorString(); } else if (dataFile.error() != QFile::NoError) { @@ -222,17 +253,58 @@ void RimStimPlanFractureTemplate::readStimPlanXMLFile(QString * errorMessage) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> RimStimPlanFractureTemplate::getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream) +void RimStimPlanFractureTemplate::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream) +{ + + xmlStream.readNext(); + + //First, read time steps and grid to establish data structures for putting data into later. + while (!xmlStream.atEnd()) + { + xmlStream.readNext(); + + if (xmlStream.isStartElement()) + { + + if (xmlStream.name() == "xs") + { + m_stimPlanFractureDefinitionData->gridXs = getGriddingValues(xmlStream); + } + + else if (xmlStream.name() == "ys") + { + m_stimPlanFractureDefinitionData->gridYs = getGriddingValues(xmlStream); + m_stimPlanFractureDefinitionData->reorderYgridToDepths(); + } + + else if (xmlStream.name() == "time") + { + double timeStepValue = getAttributeValueDouble(xmlStream, "value"); + if (!m_stimPlanFractureDefinitionData->timeStepExisist(timeStepValue)) + { + m_stimPlanFractureDefinitionData->timeSteps.push_back(timeStepValue); + } + } + } + } + + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RimStimPlanFractureTemplate::getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream) { std::vector> propertyValuesAtTimestep; while (!(xmlStream.isEndElement() && xmlStream.name() == "time")) { xmlStream.readNext(); + if (xmlStream.name() == "depth") { double depth = xmlStream.readElementText().toDouble(); - m_stimPlanFractureDefinitionData->depths.push_back(depth); std::vector propertyValuesAtDepth; xmlStream.readNext(); //read end depth token @@ -242,7 +314,10 @@ std::vector> RimStimPlanFractureTemplate::getAllDepthDataAtT QString depthDataStr = xmlStream.text().toString(); for (QString value : depthDataStr.split(' ')) { - propertyValuesAtDepth.push_back(value.toDouble()); + if (value != "") + { + propertyValuesAtDepth.push_back(value.toDouble()); + } } } propertyValuesAtTimestep.push_back(propertyValuesAtDepth); @@ -251,6 +326,23 @@ std::vector> RimStimPlanFractureTemplate::getAllDepthDataAtT return propertyValuesAtTimestep; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimStimPlanFractureTemplate::numberOfParameterValuesOK(std::vector> propertyValuesAtTimestep) +{ + size_t depths = m_stimPlanFractureDefinitionData->depths.size(); + size_t gridXvalues = m_stimPlanFractureDefinitionData->gridXs.size(); + + if (propertyValuesAtTimestep.size() != depths) return false; + for (std::vector valuesAtDepthVector : propertyValuesAtTimestep) + { + if (valuesAtDepthVector.size() != gridXvalues) return false; + } + + return true; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -317,7 +409,6 @@ void RimStimPlanFractureTemplate::fractureGeometry(std::vector* node std::vector adjustedDepths = adjustedDepthCoordsAroundWellPathPosition(); - for (cvf::uint k = 0; k < adjustedDepths.size(); k++) { for (cvf::uint i = 0; i < lenXcoords; i++) diff --git a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h index f394f35301..66cf11c7a5 100644 --- a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h +++ b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h @@ -67,6 +67,10 @@ private: void updateUiTreeName(); void readStimPlanXMLFile(QString * errorMessage); + + void readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream); + + static double getAttributeValueDouble(QXmlStreamReader &xmlStream, QString parameterName); static QString getAttributeValueString(QXmlStreamReader &xmlStream, QString parameterName); static std::vector getGriddingValues(QXmlStreamReader &xmlStream); @@ -76,4 +80,5 @@ private: cvf::ref m_stimPlanFractureDefinitionData; + bool numberOfParameterValuesOK(std::vector> propertyValuesAtTimestep); }; diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp index be23c2b960..cbd4608665 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp @@ -33,3 +33,45 @@ RigStimPlanFractureDefinition::~RigStimPlanFractureDefinition() { } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigStimPlanFractureDefinition::timeStepExisist(double timeStepValueToCheck) +{ + for (double timeStep : timeSteps) + { + if (abs(timeStepValueToCheck - timeStep) < 1e-5) return true; + } + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStimPlanFractureDefinition::reorderYgridToDepths() +{ + std::vector depthsInIncreasingOrder; + for (double gridYvalue : gridYs) + { + depthsInIncreasingOrder.insert(depthsInIncreasingOrder.begin(), gridYvalue); + } + depths = depthsInIncreasingOrder; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RigStimPlanFractureDefinition::getTimeStepIndex(double timeStepValue) +{ + size_t index = 0; + while (index < timeSteps.size()) + { + if (abs(timeSteps[index] - timeStepValue) < 1e-4) + { + return index; + } + index++; + } + return -1; //returns -1 if not found +} diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h index 94262b2c9c..69719b6e33 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h @@ -43,7 +43,11 @@ public: std::vector>> permeabilities; //Vector for each time step, for each depth and for each x-value -private: + bool timeStepExisist(double timeStepValue); + void reorderYgridToDepths(); + size_t getTimeStepIndex(double timeStepValue); + + };