#2509 Fracture : Add support for unit conversion of stimplan grid coords

This commit is contained in:
Magne Sjaastad
2018-02-20 15:15:06 +01:00
parent 82e706375a
commit 35febab8db
10 changed files with 143 additions and 37 deletions

View File

@@ -55,11 +55,20 @@ void RicConvertFractureTemplateUnitFeature::onActionTriggered(bool isChecked)
caf::PdmObjectHandle* objHandle = dynamic_cast<caf::PdmObjectHandle*>(pdmUiItem); caf::PdmObjectHandle* objHandle = dynamic_cast<caf::PdmObjectHandle*>(pdmUiItem);
if (!objHandle) return; if (!objHandle) return;
RimEllipseFractureTemplate* ellipseFractureTemplate = nullptr; RimFractureTemplate* fractureTemplate = nullptr;
objHandle->firstAncestorOrThisOfType(ellipseFractureTemplate); objHandle->firstAncestorOrThisOfType(fractureTemplate);
ellipseFractureTemplate->changeUnits(); auto currentUnit = fractureTemplate->fractureTemplateUnit();
if (currentUnit == RiaEclipseUnitTools::UNITS_METRIC)
{
fractureTemplate->convertToUnitSystem(RiaEclipseUnitTools::UNITS_FIELD);
}
else
{
fractureTemplate->convertToUnitSystem(RiaEclipseUnitTools::UNITS_METRIC);
}
fractureTemplate->updateConnectedEditors();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -73,16 +82,16 @@ void RicConvertFractureTemplateUnitFeature::setupActionLook(QAction* actionToSet
caf::PdmObjectHandle* objHandle = dynamic_cast<caf::PdmObjectHandle*>(pdmUiItem); caf::PdmObjectHandle* objHandle = dynamic_cast<caf::PdmObjectHandle*>(pdmUiItem);
if (!objHandle) return; if (!objHandle) return;
RimEllipseFractureTemplate* ellipseFractureTemplate = nullptr; RimFractureTemplate* fractureTemplate = nullptr;
objHandle->firstAncestorOrThisOfType(ellipseFractureTemplate); objHandle->firstAncestorOrThisOfType(fractureTemplate);
if (!ellipseFractureTemplate) return; if (!fractureTemplate) return;
QString text = "Convert Values to "; QString text = "Convert Values to ";
if (ellipseFractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC) if (fractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC)
{ {
text += "Field"; text += "Field";
} }
else if (ellipseFractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD) else if (fractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD)
{ {
text += "Metric"; text += "Metric";
} }

View File

@@ -40,6 +40,7 @@ bool hasNegativeValues(std::vector<double> xs);
cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFile(const QString& stimPlanFileName, cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFile(const QString& stimPlanFileName,
double conductivityScalingFactor, double conductivityScalingFactor,
MirrorMode mirrorMode, MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit,
QString * errorMessage) QString * errorMessage)
{ {
RiaLogging::info(QString("Starting to open StimPlan XML file: '%1'").arg(stimPlanFileName)); RiaLogging::info(QString("Starting to open StimPlan XML file: '%1'").arg(stimPlanFileName));
@@ -56,7 +57,7 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
QXmlStreamReader xmlStream; QXmlStreamReader xmlStream;
xmlStream.setDevice(&dataFile); xmlStream.setDevice(&dataFile);
xmlStream.readNext(); xmlStream.readNext();
readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p(), mirrorMode); readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p(), mirrorMode, requiredUnit);
RiaEclipseUnitTools::UnitSystemType unitSystem = stimPlanFileData->unitSet(); RiaEclipseUnitTools::UnitSystemType unitSystem = stimPlanFileData->unitSet();
@@ -168,7 +169,8 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream, void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream,
RigStimPlanFractureDefinition* stimPlanFileData, RigStimPlanFractureDefinition* stimPlanFileData,
MirrorMode mirrorMode) MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit)
{ {
size_t startNegValuesYs = 0; size_t startNegValuesYs = 0;
QString gridunit = "unknown"; QString gridunit = "unknown";
@@ -198,23 +200,34 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStr
} }
if (xmlStream.name() == "xs") if (xmlStream.name() == "xs")
{
std::vector<double> gridValuesXs;
{ {
size_t dummy; size_t dummy;
std::vector<double> gridValues; std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, dummy); getGriddingValues(xmlStream, gridValues, dummy);
stimPlanFileData->m_fileXs = gridValues;
stimPlanFileData->generateXsFromFileXs(mirrorMode == MIRROR_AUTO ? !hasNegativeValues(gridValues) : (bool)mirrorMode); gridValuesXs = RifStimPlanXmlReader::valuesInRequiredUnitSystem(stimPlanFileData->m_unitSet, requiredUnit, gridValues);
}
stimPlanFileData->m_fileXs = gridValuesXs;
stimPlanFileData->generateXsFromFileXs(mirrorMode == MIRROR_AUTO ? !hasNegativeValues(gridValuesXs) : (bool)mirrorMode);
} }
else if (xmlStream.name() == "ys") else if (xmlStream.name() == "ys")
{
std::vector<double> gridValuesYs;
{ {
std::vector<double> gridValues; std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, startNegValuesYs); getGriddingValues(xmlStream, gridValues, startNegValuesYs);
gridValuesYs = RifStimPlanXmlReader::valuesInRequiredUnitSystem(stimPlanFileData->m_unitSet, requiredUnit, gridValues);
}
// Reorder and change sign // Reorder and change sign
std::vector<double> ys; std::vector<double> ys;
for (double y : gridValues) for (double y : gridValuesYs)
{ {
ys.insert(ys.begin(), -y); ys.insert(ys.begin(), -y);
} }
@@ -273,6 +286,37 @@ std::vector<std::vector<double>> RifStimPlanXmlReader::getAllDepthDataAtTimeSte
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<double> RifStimPlanXmlReader::valuesInRequiredUnitSystem(RiaEclipseUnitTools::UnitSystem sourceUnit,
RiaEclipseUnitTools::UnitSystem requiredUnit,
const std::vector<double>& values)
{
if (sourceUnit == RiaEclipseUnitTools::UNITS_FIELD && requiredUnit == RiaEclipseUnitTools::UNITS_METRIC)
{
std::vector<double> convertedValues;
for (const auto &valueInFeet : values)
{
convertedValues.push_back(RiaEclipseUnitTools::feetToMeter(valueInFeet));
}
return convertedValues;
}
else if (sourceUnit == RiaEclipseUnitTools::UNITS_METRIC && requiredUnit == RiaEclipseUnitTools::UNITS_FIELD)
{
std::vector<double> convertedValues;
for (const auto &valueInMeter : values)
{
convertedValues.push_back(RiaEclipseUnitTools::meterToFeet(valueInMeter));
}
return convertedValues;
}
return values;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -38,12 +38,14 @@ public:
static cvf::ref<RigStimPlanFractureDefinition> readStimPlanXMLFile(const QString& stimPlanFileName, static cvf::ref<RigStimPlanFractureDefinition> readStimPlanXMLFile(const QString& stimPlanFileName,
double conductivityScalingFactor, double conductivityScalingFactor,
MirrorMode mirrorMode, MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit,
QString * errorMessage); QString * errorMessage);
private: private:
static void readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream, static void readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream,
RigStimPlanFractureDefinition* stimPlanFileData, RigStimPlanFractureDefinition* stimPlanFileData,
MirrorMode mirrorMode); MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit);
static double getAttributeValueDouble(QXmlStreamReader &xmlStream, QString parameterName); static double getAttributeValueDouble(QXmlStreamReader &xmlStream, QString parameterName);
static QString getAttributeValueString(QXmlStreamReader &xmlStream, QString parameterName); static QString getAttributeValueString(QXmlStreamReader &xmlStream, QString parameterName);
@@ -51,6 +53,9 @@ private:
static std::vector<std::vector<double>> getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream); static std::vector<std::vector<double>> getAllDepthDataAtTimeStep(QXmlStreamReader &xmlStream);
static std::vector<double> valuesInRequiredUnitSystem(RiaEclipseUnitTools::UnitSystem sourceUnit,
RiaEclipseUnitTools::UnitSystem requiredUnit,
const std::vector<double>& values);
}; };

View File

@@ -175,23 +175,11 @@ void RimEllipseFractureTemplate::changeUnits()
{ {
if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC) if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC)
{ {
m_halfLength = RiaEclipseUnitTools::meterToFeet(m_halfLength); convertToUnitSystem(RiaEclipseUnitTools::UNITS_FIELD);
m_height = RiaEclipseUnitTools::meterToFeet(m_height);
m_width = RiaEclipseUnitTools::meterToInch(m_width);
m_wellDiameter = RiaEclipseUnitTools::meterToInch(m_wellDiameter);
m_perforationLength = RiaEclipseUnitTools::meterToFeet(m_perforationLength);
setFractureTemplateUnit(RiaEclipseUnitTools::UNITS_FIELD);
} }
else if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD) else if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD)
{ {
m_halfLength = RiaEclipseUnitTools::feetToMeter(m_halfLength); convertToUnitSystem(RiaEclipseUnitTools::UNITS_METRIC);
m_height = RiaEclipseUnitTools::feetToMeter(m_height);
m_width = RiaEclipseUnitTools::inchToMeter(m_width);
m_wellDiameter = RiaEclipseUnitTools::inchToMeter(m_wellDiameter);
m_perforationLength = RiaEclipseUnitTools::feetToMeter(m_perforationLength);
setFractureTemplateUnit(RiaEclipseUnitTools::UNITS_METRIC);
} }
this->updateConnectedEditors(); this->updateConnectedEditors();
@@ -357,6 +345,38 @@ std::vector<std::pair<QString, QString>> RimEllipseFractureTemplate::uiResultNam
return propertyNamesAndUnits; return propertyNamesAndUnits;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEllipseFractureTemplate::convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit)
{
if (neededUnit == fractureTemplateUnit())
{
return;
}
if (neededUnit == RiaEclipseUnitTools::UNITS_FIELD)
{
m_halfLength = RiaEclipseUnitTools::meterToFeet(m_halfLength);
m_height = RiaEclipseUnitTools::meterToFeet(m_height);
m_width = RiaEclipseUnitTools::meterToInch(m_width);
m_wellDiameter = RiaEclipseUnitTools::meterToInch(m_wellDiameter);
m_perforationLength = RiaEclipseUnitTools::meterToFeet(m_perforationLength);
setFractureTemplateUnit(RiaEclipseUnitTools::UNITS_FIELD);
}
else if (neededUnit == RiaEclipseUnitTools::UNITS_METRIC)
{
m_halfLength = RiaEclipseUnitTools::feetToMeter(m_halfLength);
m_height = RiaEclipseUnitTools::feetToMeter(m_height);
m_width = RiaEclipseUnitTools::inchToMeter(m_width);
m_wellDiameter = RiaEclipseUnitTools::inchToMeter(m_wellDiameter);
m_perforationLength = RiaEclipseUnitTools::feetToMeter(m_perforationLength);
setFractureTemplateUnit(RiaEclipseUnitTools::UNITS_METRIC);
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -66,6 +66,9 @@ public:
virtual std::vector<std::pair<QString, QString>> uiResultNamesWithUnit() const override; virtual std::vector<std::pair<QString, QString>> uiResultNamesWithUnit() const override;
virtual void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) override;
protected: protected:
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering); virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering);
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;

View File

@@ -141,6 +141,9 @@ public:
double dFactor() const; double dFactor() const;
double kh() const; double kh() const;
virtual void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) = 0;
protected: protected:
virtual caf::PdmFieldHandle* userDescriptionField() override; virtual caf::PdmFieldHandle* userDescriptionField() override;
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;

View File

@@ -242,12 +242,17 @@ void RimStimPlanFractureTemplate::loadDataAndUpdate()
m_stimPlanFractureDefinitionData = RifStimPlanXmlReader::readStimPlanXMLFile( m_stimPlanFileName(), m_stimPlanFractureDefinitionData = RifStimPlanXmlReader::readStimPlanXMLFile( m_stimPlanFileName(),
m_conductivityScalingFactor(), m_conductivityScalingFactor(),
RifStimPlanXmlReader::MIRROR_AUTO, RifStimPlanXmlReader::MIRROR_AUTO,
fractureTemplateUnit(),
&errorMessage); &errorMessage);
if (errorMessage.size() > 0) RiaLogging::error(errorMessage); if (errorMessage.size() > 0) RiaLogging::error(errorMessage);
if (m_stimPlanFractureDefinitionData.notNull()) if (m_stimPlanFractureDefinitionData.notNull())
{
if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_UNKNOWN)
{ {
setFractureTemplateUnit(m_stimPlanFractureDefinitionData->unitSet()); setFractureTemplateUnit(m_stimPlanFractureDefinitionData->unitSet());
}
m_readError = false; m_readError = false;
} }
else else
@@ -491,6 +496,18 @@ bool RimStimPlanFractureTemplate::showStimPlanMesh() const
return m_showStimPlanMesh_OBSOLETE(); return m_showStimPlanMesh_OBSOLETE();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimStimPlanFractureTemplate::convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit)
{
setFractureTemplateUnit(neededUnit);
m_readError = false;
loadDataAndUpdate();
setDefaultsBasedOnXMLfile();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -90,6 +90,9 @@ public:
bool showStimPlanMesh() const; bool showStimPlanMesh() const;
virtual void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) override;
protected: protected:
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override; virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override;

View File

@@ -542,10 +542,12 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
} }
else if (dynamic_cast<RimStimPlanFractureTemplate*>(uiItem)) else if (dynamic_cast<RimStimPlanFractureTemplate*>(uiItem))
{ {
menuBuilder << "RicPasteEllipseFractureFeature"; //menuBuilder << "RicPasteEllipseFractureFeature";
menuBuilder.addSeparator(); menuBuilder.addSeparator();
menuBuilder << "RicNewEllipseFractureTemplateFeature"; menuBuilder << "RicNewEllipseFractureTemplateFeature";
menuBuilder << "RicNewStimPlanFractureTemplateFeature"; menuBuilder << "RicNewStimPlanFractureTemplateFeature";
menuBuilder << "Separator";
menuBuilder << "RicConvertFractureTemplateUnitFeature";
} }
else if (dynamic_cast<RimEllipseFractureTemplate*>(uiItem)) else if (dynamic_cast<RimEllipseFractureTemplate*>(uiItem))
{ {

View File

@@ -125,7 +125,7 @@ private:
double maxY() const; double maxY() const;
private: private:
RiaEclipseUnitTools::UnitSystem m_unitSet; RiaEclipseUnitTools::UnitSystem m_unitSet; // To be deleted
std::vector<double> m_fileXs; std::vector<double> m_fileXs;
std::vector<double> m_Ys; std::vector<double> m_Ys;
std::vector<double> m_timeSteps; std::vector<double> m_timeSteps;