#1139 - pre-proto - Adjustments in reading of XML file to handle files with multiple time-steps and several parameters.

This commit is contained in:
astridkbjorke 2017-02-15 10:32:34 +01:00
parent 3fac46b1a9
commit ff59429ad8
4 changed files with 185 additions and 43 deletions

View File

@ -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<std::vector<std::vector<double>>> condValues(numberOfTimeSteps);
m_stimPlanFractureDefinitionData->conductivities = condValues;
std::vector<std::vector<std::vector<double>>> widthValues(numberOfTimeSteps);
m_stimPlanFractureDefinitionData->widths = widthValues;
std::vector<std::vector<std::vector<double>>> 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<std::vector<double>> propertyValuesAtTimestep = getAllDepthDataAtTimeStep(xmlStream);
double timeStepValue = getAttributeValueDouble(xmlStream2, "value");
std::vector<std::vector<double>> 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<std::vector<double>> 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<std::vector<double>> RimStimPlanFractureTemplate::getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream)
{
std::vector<std::vector<double>> 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<double> propertyValuesAtDepth;
xmlStream.readNext(); //read end depth token
@ -242,7 +314,10 @@ std::vector<std::vector<double>> 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<std::vector<double>> RimStimPlanFractureTemplate::getAllDepthDataAtT
return propertyValuesAtTimestep;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimStimPlanFractureTemplate::numberOfParameterValuesOK(std::vector<std::vector<double>> propertyValuesAtTimestep)
{
size_t depths = m_stimPlanFractureDefinitionData->depths.size();
size_t gridXvalues = m_stimPlanFractureDefinitionData->gridXs.size();
if (propertyValuesAtTimestep.size() != depths) return false;
for (std::vector<double> valuesAtDepthVector : propertyValuesAtTimestep)
{
if (valuesAtDepthVector.size() != gridXvalues) return false;
}
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -317,7 +409,6 @@ void RimStimPlanFractureTemplate::fractureGeometry(std::vector<cvf::Vec3f>* node
std::vector<double> adjustedDepths = adjustedDepthCoordsAroundWellPathPosition();
for (cvf::uint k = 0; k < adjustedDepths.size(); k++)
{
for (cvf::uint i = 0; i < lenXcoords; i++)

View File

@ -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<double> getGriddingValues(QXmlStreamReader &xmlStream);
@ -76,4 +80,5 @@ private:
cvf::ref<RigStimPlanFractureDefinition> m_stimPlanFractureDefinitionData;
bool numberOfParameterValuesOK(std::vector<std::vector<double>> propertyValuesAtTimestep);
};

View File

@ -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<double> 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
}

View File

@ -43,7 +43,11 @@ public:
std::vector<std::vector<std::vector<double>>> 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);
};