#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);
if (!objHandle) return;
RimEllipseFractureTemplate* ellipseFractureTemplate = nullptr;
objHandle->firstAncestorOrThisOfType(ellipseFractureTemplate);
RimFractureTemplate* fractureTemplate = nullptr;
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);
if (!objHandle) return;
RimEllipseFractureTemplate* ellipseFractureTemplate = nullptr;
objHandle->firstAncestorOrThisOfType(ellipseFractureTemplate);
if (!ellipseFractureTemplate) return;
RimFractureTemplate* fractureTemplate = nullptr;
objHandle->firstAncestorOrThisOfType(fractureTemplate);
if (!fractureTemplate) return;
QString text = "Convert Values to ";
if (ellipseFractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC)
if (fractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_METRIC)
{
text += "Field";
}
else if (ellipseFractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD)
else if (fractureTemplate->fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD)
{
text += "Metric";
}

View File

@ -40,6 +40,7 @@ bool hasNegativeValues(std::vector<double> xs);
cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFile(const QString& stimPlanFileName,
double conductivityScalingFactor,
MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit,
QString * errorMessage)
{
RiaLogging::info(QString("Starting to open StimPlan XML file: '%1'").arg(stimPlanFileName));
@ -56,7 +57,7 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
QXmlStreamReader xmlStream;
xmlStream.setDevice(&dataFile);
xmlStream.readNext();
readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p(), mirrorMode);
readStimplanGridAndTimesteps(xmlStream, stimPlanFileData.p(), mirrorMode, requiredUnit);
RiaEclipseUnitTools::UnitSystemType unitSystem = stimPlanFileData->unitSet();
@ -167,8 +168,9 @@ cvf::ref<RigStimPlanFractureDefinition> RifStimPlanXmlReader::readStimPlanXMLFil
///
//--------------------------------------------------------------------------------------------------
void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream,
RigStimPlanFractureDefinition* stimPlanFileData,
MirrorMode mirrorMode)
RigStimPlanFractureDefinition* stimPlanFileData,
MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit)
{
size_t startNegValuesYs = 0;
QString gridunit = "unknown";
@ -199,22 +201,33 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps(QXmlStreamReader &xmlStr
if (xmlStream.name() == "xs")
{
size_t dummy;
std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, dummy);
stimPlanFileData->m_fileXs = gridValues;
std::vector<double> gridValuesXs;
{
size_t dummy;
std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, dummy);
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")
{
std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, startNegValuesYs);
std::vector<double> gridValuesYs;
{
std::vector<double> gridValues;
getGriddingValues(xmlStream, gridValues, startNegValuesYs);
gridValuesYs = RifStimPlanXmlReader::valuesInRequiredUnitSystem(stimPlanFileData->m_unitSet, requiredUnit, gridValues);
}
// Reorder and change sign
std::vector<double> ys;
for (double y : gridValues)
for (double y : gridValuesYs)
{
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,
double conductivityScalingFactor,
MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit,
QString * errorMessage);
private:
static void readStimplanGridAndTimesteps(QXmlStreamReader &xmlStream,
RigStimPlanFractureDefinition* stimPlanFileData,
MirrorMode mirrorMode);
MirrorMode mirrorMode,
RiaEclipseUnitTools::UnitSystem requiredUnit);
static double getAttributeValueDouble(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<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)
{
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);
convertToUnitSystem(RiaEclipseUnitTools::UNITS_FIELD);
}
else if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_FIELD)
{
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);
convertToUnitSystem(RiaEclipseUnitTools::UNITS_METRIC);
}
this->updateConnectedEditors();
@ -357,6 +345,38 @@ std::vector<std::pair<QString, QString>> RimEllipseFractureTemplate::uiResultNam
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 void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) override;
protected:
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering);
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 kh() const;
virtual void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) = 0;
protected:
virtual caf::PdmFieldHandle* userDescriptionField() 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_conductivityScalingFactor(),
RifStimPlanXmlReader::MIRROR_AUTO,
fractureTemplateUnit(),
&errorMessage);
if (errorMessage.size() > 0) RiaLogging::error(errorMessage);
if (m_stimPlanFractureDefinitionData.notNull())
{
setFractureTemplateUnit(m_stimPlanFractureDefinitionData->unitSet());
if (fractureTemplateUnit() == RiaEclipseUnitTools::UNITS_UNKNOWN)
{
setFractureTemplateUnit(m_stimPlanFractureDefinitionData->unitSet());
}
m_readError = false;
}
else
@ -491,6 +496,18 @@ bool RimStimPlanFractureTemplate::showStimPlanMesh() const
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;
virtual void convertToUnitSystem(RiaEclipseUnitTools::UnitSystem neededUnit) override;
protected:
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;

View File

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

View File

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