#1351 - pre-proto - Adding well radius to fracture and fracture template. Well radius, perforation length and perforation efficiency for fracture is updated from fracture template if no local adjustments have been made. Units (meter -feet) is not yet handled.

This commit is contained in:
astridkbjorke committed 2017-04-19 11:00:52 +02:00
1 parent e82a8efc59
commit a7ac9f89ec
9 files changed
+73 -18

No files matched your search

@@ -45,7 +45,6 @@ RimEllipseFractureTemplate::RimEllipseFractureTemplate(void)
CAF_PDM_InitField(&halfLength, "HalfLength", 650.0f, "Halflength X<sub>f</sub>", "", "", ""); CAF_PDM_InitField(&halfLength, "HalfLength", 650.0f, "Halflength X<sub>f</sub>", "", "", "");
CAF_PDM_InitField(&height, "Height", 75.0f, "Height", "", "", ""); CAF_PDM_InitField(&height, "Height", 75.0f, "Height", "", "", "");
CAF_PDM_InitField(&width, "Width", 1.0f, "Width", "", "", ""); CAF_PDM_InitField(&width, "Width", 1.0f, "Width", "", "", "");
CAF_PDM_InitField(&perforationLength, "PerforationLength", 0.0f, "Perforation Length", "", "", ""); //Is this correct description?
CAF_PDM_InitField(&permeability,"Permeability", 22000.f, "Permeability [mD]", "", "", ""); CAF_PDM_InitField(&permeability,"Permeability", 22000.f, "Permeability [mD]", "", "", "");
} }
@@ -65,7 +64,7 @@ void RimEllipseFractureTemplate::fieldChangedByUi(const caf::PdmFieldHandle* cha
{ {
RimFractureTemplate::fieldChangedByUi(changedField, oldValue, newValue); RimFractureTemplate::fieldChangedByUi(changedField, oldValue, newValue);
if (changedField == &halfLength || changedField == &height || changedField == &perforationLength) if (changedField == &halfLength || changedField == &height)
{ {
//Changes to one of these parameters should change all fractures with this fracture template attached. //Changes to one of these parameters should change all fractures with this fracture template attached.
RimProject* proj; RimProject* proj;
@@ -79,18 +78,9 @@ void RimEllipseFractureTemplate::fieldChangedByUi(const caf::PdmFieldHandle* cha
for (RimFracture* fracture : fractures) for (RimFracture* fracture : fractures)
{ {
if (fracture->attachedFractureDefinition() == this) if (fracture->attachedFractureDefinition() == this)
{
if (changedField == &halfLength || changedField == &height)
{ {
fracture->setRecomputeGeometryFlag(); fracture->setRecomputeGeometryFlag();
} }
if (changedField == &perforationLength && (abs(oldValue.toDouble() - fracture->perforationLength()) < 1e-5))
{
fracture->perforationLength = perforationLength;
}
}
} }
proj->createDisplayModelAndRedrawAllViews(); proj->createDisplayModelAndRedrawAllViews();
@@ -167,7 +157,7 @@ void RimEllipseFractureTemplate::changeUnits()
halfLength = RimDefines::meterToFeet(halfLength); halfLength = RimDefines::meterToFeet(halfLength);
height = RimDefines::meterToFeet(height); height = RimDefines::meterToFeet(height);
width = RimDefines::meterToInch(width); width = RimDefines::meterToInch(width);
perforationLength = RimDefines::meterToFeet(perforationLength); //perforationLength = RimDefines::meterToFeet(perforationLength);
fractureTemplateUnit = RimDefines::UNITS_FIELD; fractureTemplateUnit = RimDefines::UNITS_FIELD;
//TODO: Darcy unit? //TODO: Darcy unit?
} }
@@ -176,7 +166,7 @@ void RimEllipseFractureTemplate::changeUnits()
halfLength = RimDefines::feetToMeter(halfLength); halfLength = RimDefines::feetToMeter(halfLength);
height = RimDefines::feetToMeter(height); height = RimDefines::feetToMeter(height);
width = RimDefines::inchToMeter(width); width = RimDefines::inchToMeter(width);
perforationLength = RimDefines::feetToMeter(perforationLength); //perforationLength = RimDefines::feetToMeter(perforationLength);
fractureTemplateUnit = RimDefines::UNITS_METRIC; fractureTemplateUnit = RimDefines::UNITS_METRIC;
} }
@@ -195,14 +185,14 @@ void RimEllipseFractureTemplate::defineUiOrdering(QString uiConfigName, caf::Pdm
halfLength.uiCapability()->setUiName("Halflenght X<sub>f</sub> [m]"); halfLength.uiCapability()->setUiName("Halflenght X<sub>f</sub> [m]");
height.uiCapability()->setUiName("Height [m]"); height.uiCapability()->setUiName("Height [m]");
width.uiCapability()->setUiName("Width [m]"); width.uiCapability()->setUiName("Width [m]");
perforationLength.uiCapability()->setUiName("Perforation Length [m]"); //perforationLength.uiCapability()->setUiName("Perforation Length [m]");
} }
else if (fractureTemplateUnit == RimDefines::UNITS_FIELD) else if (fractureTemplateUnit == RimDefines::UNITS_FIELD)
{ {
halfLength.uiCapability()->setUiName("Halflenght X<sub>f</sub> [Ft]"); halfLength.uiCapability()->setUiName("Halflenght X<sub>f</sub> [Ft]");
height.uiCapability()->setUiName("Height [Ft]"); height.uiCapability()->setUiName("Height [Ft]");
width.uiCapability()->setUiName("Width [inches]"); width.uiCapability()->setUiName("Width [inches]");
perforationLength.uiCapability()->setUiName("Perforation Length [Ft]"); //perforationLength.uiCapability()->setUiName("Perforation Length [Ft]");
} }
@@ -223,6 +213,8 @@ void RimEllipseFractureTemplate::defineUiOrdering(QString uiConfigName, caf::Pdm
} }
propertyGroup->add(&skinFactor); propertyGroup->add(&skinFactor);
propertyGroup->add(&perforationLength); propertyGroup->add(&perforationLength);
propertyGroup->add(&perforationEfficiency);
propertyGroup->add(&wellRadius);
uiOrdering.add(&fractureTemplateUnit); uiOrdering.add(&fractureTemplateUnit);
uiOrdering.skipRemainingFields(true); uiOrdering.skipRemainingFields(true);
@@ -46,7 +46,6 @@ public:
caf::PdmField<float> halfLength; caf::PdmField<float> halfLength;
caf::PdmField<float> height; caf::PdmField<float> height;
caf::PdmField<float> perforationLength;
caf::PdmField<float> width; caf::PdmField<float> width;
caf::PdmField<float> permeability; caf::PdmField<float> permeability;
@@ -86,6 +86,7 @@ RimFracture::RimFracture(void)
CAF_PDM_InitField(&perforationLength, "PerforationLength", 0.0, "Perforation Length", "", "", ""); CAF_PDM_InitField(&perforationLength, "PerforationLength", 0.0, "Perforation Length", "", "", "");
CAF_PDM_InitField(&perforationEfficiency, "perforationEfficiency", 1.0, "perforation Efficiency", "", "", ""); CAF_PDM_InitField(&perforationEfficiency, "perforationEfficiency", 1.0, "perforation Efficiency", "", "", "");
perforationEfficiency.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); perforationEfficiency.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName());
CAF_PDM_InitField(&wellRadius, "wellRadius", 0.0, "Well Radius at Fracture", "", "", "");
CAF_PDM_InitField(&dip, "Dip", 0.0, "Dip", "", "", ""); CAF_PDM_InitField(&dip, "Dip", 0.0, "Dip", "", "", "");
CAF_PDM_InitField(&tilt, "Tilt", 0.0, "Tilt", "", "", ""); CAF_PDM_InitField(&tilt, "Tilt", 0.0, "Tilt", "", "", "");
CAF_PDM_InitField(&showPolygonFractureOutline, "showPolygonFractureOutline", true, "Show Polygon Outline", "", "", ""); CAF_PDM_InitField(&showPolygonFractureOutline, "showPolygonFractureOutline", true, "Show Polygon Outline", "", "", "");
@@ -56,6 +56,7 @@ public:
caf::PdmField<double> azimuth; caf::PdmField<double> azimuth;
caf::PdmField<double> perforationLength; caf::PdmField<double> perforationLength;
caf::PdmField<double> perforationEfficiency; caf::PdmField<double> perforationEfficiency;
caf::PdmField<double> wellRadius;
caf::PdmField<double> dip; caf::PdmField<double> dip;
caf::PdmField<double> tilt; caf::PdmField<double> tilt;
@@ -24,6 +24,7 @@
#include "RimProject.h" #include "RimProject.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafPdmUiDoubleSliderEditor.h"
#include "cvfVector3.h" #include "cvfVector3.h"
@@ -67,11 +68,15 @@ RimFractureTemplate::RimFractureTemplate(void)
CAF_PDM_InitField(&fractureTemplateUnit, "fractureTemplateUnit", caf::AppEnum<RimDefines::UnitSystem>(RimDefines::UNITS_METRIC), "Units System", "", "", ""); CAF_PDM_InitField(&fractureTemplateUnit, "fractureTemplateUnit", caf::AppEnum<RimDefines::UnitSystem>(RimDefines::UNITS_METRIC), "Units System", "", "", "");
fractureTemplateUnit.uiCapability()->setUiReadOnly(true); fractureTemplateUnit.uiCapability()->setUiReadOnly(true);
CAF_PDM_InitField(&orientation, "Orientation", caf::AppEnum<FracOrientationEnum>(TRANSVERSE_WELL_PATH), "Fracture Orientation", "", "", ""); CAF_PDM_InitField(&orientation, "Orientation", caf::AppEnum<FracOrientationEnum>(TRANSVERSE_WELL_PATH), "Fracture Orientation", "", "", "");
CAF_PDM_InitField(&azimuthAngle, "AzimuthAngle", 0.0f, "Azimuth Angle", "", "", ""); //Is this correct description? CAF_PDM_InitField(&azimuthAngle, "AzimuthAngle", 0.0f, "Azimuth Angle", "", "", ""); //Is this correct description?
CAF_PDM_InitField(&skinFactor, "SkinFactor", 1.0f, "Skin Factor", "", "", ""); CAF_PDM_InitField(&skinFactor, "SkinFactor", 1.0f, "Skin Factor", "", "", "");
CAF_PDM_InitField(&perforationLength, "PerforationLength", 0.0, "Perforation Length", "", "", "");
CAF_PDM_InitField(&perforationEfficiency, "perforationEfficiency", 1.0, "perforation Efficiency", "", "", "");
perforationEfficiency.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName());
CAF_PDM_InitField(&wellRadius, "wellRadius", 0.0, "Well Radius at Fracture", "", "", "");
CAF_PDM_InitField(&fractureConductivity, "FractureCondictivity", caf::AppEnum<FracConductivityEnum>(INFINITE_CONDUCTIVITY), "Conductivity in Fracture", "", "", ""); CAF_PDM_InitField(&fractureConductivity, "FractureCondictivity", caf::AppEnum<FracConductivityEnum>(INFINITE_CONDUCTIVITY), "Conductivity in Fracture", "", "", "");
} }
@@ -130,8 +135,35 @@ void RimFractureTemplate::fieldChangedByUi(const caf::PdmFieldHandle* changedFie
proj->createDisplayModelAndRedrawAllViews(); proj->createDisplayModelAndRedrawAllViews();
} }
} }
}
if (changedField == &perforationLength || changedField == &perforationEfficiency || changedField == &wellRadius)
{
RimProject* proj;
this->firstAncestorOrThisOfType(proj);
if (!proj) return;
std::vector<RimFracture*> fractures;
proj->descendantsIncludingThisOfType(fractures);
for (RimFracture* fracture : fractures)
{
if (fracture->attachedFractureDefinition() == this)
{
if (changedField == &perforationLength && (abs(oldValue.toDouble() - fracture->perforationLength()) < 1e-5))
{
fracture->perforationLength = perforationLength;
}
if (changedField == &perforationEfficiency && (abs(oldValue.toDouble() - fracture->perforationEfficiency()) < 1e-5))
{
fracture->perforationEfficiency = perforationEfficiency;
}
if (changedField == &wellRadius && (abs(oldValue.toDouble() - fracture->wellRadius()) < 1e-5))
{
fracture->wellRadius = wellRadius;
}
}
}
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
@@ -149,3 +181,19 @@ void RimFractureTemplate::defineUiOrdering(QString uiConfigName, caf::PdmUiOrder
azimuthAngle.uiCapability()->setUiHidden(false); azimuthAngle.uiCapability()->setUiHidden(false);
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute)
{
if (field == &perforationEfficiency)
{
caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast<caf::PdmUiDoubleSliderEditorAttribute*>(attribute);
if (myAttr)
{
myAttr->m_minimum = 0;
myAttr->m_maximum = 1.0;
}
}
}
@@ -49,6 +49,10 @@ public:
caf::PdmField<float> azimuthAngle; caf::PdmField<float> azimuthAngle;
caf::PdmField<float> skinFactor; caf::PdmField<float> skinFactor;
caf::PdmField<double> perforationLength;
caf::PdmField<double> perforationEfficiency;
caf::PdmField<double> wellRadius;
enum FracOrientationEnum enum FracOrientationEnum
{ {
AZIMUTH, AZIMUTH,
@@ -73,4 +77,7 @@ public:
virtual std::vector<cvf::Vec3f> fracturePolygon(caf::AppEnum< RimDefines::UnitSystem > fractureTemplateUnit) = 0; virtual std::vector<cvf::Vec3f> fracturePolygon(caf::AppEnum< RimDefines::UnitSystem > fractureTemplateUnit) = 0;
protected: protected:
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering); virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering);
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override;
}; };
@@ -191,6 +191,7 @@ void RimSimWellFracture::defineUiOrdering(QString uiConfigName, caf::PdmUiOrderi
propertyGroup->add(&stimPlanTimeIndexToPlot); propertyGroup->add(&stimPlanTimeIndexToPlot);
propertyGroup->add(&perforationLength); propertyGroup->add(&perforationLength);
propertyGroup->add(&perforationEfficiency); propertyGroup->add(&perforationEfficiency);
propertyGroup->add(&wellRadius);
caf::PdmUiGroup* fractureCenterGroup = uiOrdering.addNewGroup("Fracture Center Info"); caf::PdmUiGroup* fractureCenterGroup = uiOrdering.addNewGroup("Fracture Center Info");
fractureCenterGroup->add(&m_uiAnchorPosition); fractureCenterGroup->add(&m_uiAnchorPosition);
@@ -1081,6 +1081,9 @@ void RimStimPlanFractureTemplate::defineUiOrdering(QString uiConfigName, caf::Pd
caf::PdmUiGroup* propertyGroup = uiOrdering.addNewGroup("Properties"); caf::PdmUiGroup* propertyGroup = uiOrdering.addNewGroup("Properties");
propertyGroup->add(&fractureConductivity); propertyGroup->add(&fractureConductivity);
propertyGroup->add(&skinFactor); propertyGroup->add(&skinFactor);
propertyGroup->add(&perforationLength);
propertyGroup->add(&perforationEfficiency);
propertyGroup->add(&wellRadius);
caf::PdmUiGroup* polygonGroup = uiOrdering.addNewGroup("Fracture Polygon Basis"); caf::PdmUiGroup* polygonGroup = uiOrdering.addNewGroup("Fracture Polygon Basis");
polygonGroup->add(&parameterForPolygon); polygonGroup->add(&parameterForPolygon);
@@ -1091,6 +1094,8 @@ void RimStimPlanFractureTemplate::defineUiOrdering(QString uiConfigName, caf::Pd
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimStimPlanFractureTemplate::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute * attribute) void RimStimPlanFractureTemplate::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute * attribute)
{ {
RimFractureTemplate::defineEditorAttribute(field, uiConfigName, attribute);
if (field == &m_stimPlanFileName) if (field == &m_stimPlanFileName)
{ {
caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast<caf::PdmUiFilePathEditorAttribute*>(attribute); caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast<caf::PdmUiFilePathEditorAttribute*>(attribute);
@@ -174,6 +174,7 @@ void RimWellPathFracture::defineUiOrdering(QString uiConfigName, caf::PdmUiOrder
propertyGroup->add(&stimPlanTimeIndexToPlot); propertyGroup->add(&stimPlanTimeIndexToPlot);
propertyGroup->add(&perforationLength); propertyGroup->add(&perforationLength);
propertyGroup->add(&perforationEfficiency); propertyGroup->add(&perforationEfficiency);
propertyGroup->add(&wellRadius);
caf::PdmUiGroup* fractureCenterGroup = uiOrdering.addNewGroup("Fracture Center Info"); caf::PdmUiGroup* fractureCenterGroup = uiOrdering.addNewGroup("Fracture Center Info");
fractureCenterGroup->add(&m_uiAnchorPosition); fractureCenterGroup->add(&m_uiAnchorPosition);