#3854 Add MSW reference depth to Perforations

This commit is contained in:
Gaute Lindkvist 2018-12-18 13:43:21 +01:00
parent 7296c11bc2
commit 394c84efef
8 changed files with 179 additions and 96 deletions

View File

@ -923,9 +923,9 @@ RicMswExportInfo
SubSegmentIntersectionInfo::spiltIntersectionSegmentsToMaxLength(wellPathGeometry, intersections, maxSegmentLength);
double initialMD = 0.0;
if (wellPath->fractureCollection()->referenceMDType() == RimWellPathFractureCollection::MANUAL_REFERENCE_MD)
if (wellPath->fractureCollection()->mswParameters()->referenceMDType() == RimMswCompletionParameters::MANUAL_REFERENCE_MD)
{
initialMD = wellPath->fractureCollection()->manualReferenceMD();
initialMD = wellPath->fractureCollection()->mswParameters()->manualReferenceMD();
}
else
{
@ -1030,12 +1030,19 @@ RicMswExportInfo RicWellPathExportMswCompletionsImpl::generatePerforationsMswExp
SubSegmentIntersectionInfo::spiltIntersectionSegmentsToMaxLength(wellPathGeometry, intersections, maxSegmentLength);
double initialMD = 0.0;
for (WellPathCellIntersectionInfo intersection : intersections)
if (wellPath->perforationIntervalCollection()->mswParameters()->referenceMDType() == RimMswCompletionParameters::MANUAL_REFERENCE_MD)
{
if (activeCellInfo->isActive(intersection.globCellIndex))
initialMD = wellPath->perforationIntervalCollection()->mswParameters()->manualReferenceMD();
}
else
{
for (WellPathCellIntersectionInfo intersection : intersections)
{
initialMD = intersection.startMD;
break;
if (activeCellInfo->isActive(intersection.globCellIndex))
{
initialMD = intersection.startMD;
break;
}
}
}

View File

@ -56,7 +56,7 @@ RimFishbonesCollection::RimFishbonesCollection()
CAF_PDM_InitField(&m_mainBoreDiameter, "MainBoreDiameter", 0.216, "Main Bore Diameter", "", "", "");
CAF_PDM_InitField(&m_skinFactor, "MainBoreSkinFactor", 0., "Main Bore Skin Factor [0..1]", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_mswParameters, "MswParameters", "Multi Segment Well Parameters", "", "", "");
m_mswParameters = new RimMswCompletionParameters;
m_mswParameters = new RimMswCompletionParameters(false);
m_mswParameters.uiCapability()->setUiTreeHidden(true);
m_mswParameters.uiCapability()->setUiTreeChildrenHidden(true);
manuallyModifiedStartMD = false;

View File

@ -24,6 +24,14 @@
#include <limits>
namespace caf {
template<>
void RimMswCompletionParameters::ReferenceMDEnum::setUp()
{
addItem(RimMswCompletionParameters::AUTO_REFERENCE_MD, "GridIntersectionRefMD", "Grid Entry Point");
addItem(RimMswCompletionParameters::MANUAL_REFERENCE_MD, "ManualRefMD", "User Defined");
setDefault(RimMswCompletionParameters::AUTO_REFERENCE_MD);
}
template<>
void RimMswCompletionParameters::PressureDropEnum::setUp()
{
@ -47,9 +55,20 @@ CAF_PDM_SOURCE_INIT(RimMswCompletionParameters, "RimMswCompletionParameters");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMswCompletionParameters::RimMswCompletionParameters()
RimMswCompletionParameters::RimMswCompletionParameters(bool enableReferenceDepth /* = true */)
: m_enableReferenceDepth(enableReferenceDepth)
{
CAF_PDM_InitObject("MSW Completion Parameters", ":/CompletionsSymbol16x16.png", "", "");
CAF_PDM_InitFieldNoDefault(&m_refMDType, "RefMDType", "Reference MD", "", "", "");
CAF_PDM_InitField(&m_refMD, "RefMD", 0.0, "", "", "", "");
if (!m_enableReferenceDepth)
{
m_refMDType.xmlCapability()->disableIO();
m_refMD.xmlCapability()->disableIO();
}
CAF_PDM_InitField(&m_linerDiameter, "LinerDiameter", std::numeric_limits<double>::infinity(), "Liner Inner Diameter", "", "", "");
CAF_PDM_InitField(&m_roughnessFactor, "RoughnessFactor", std::numeric_limits<double>::infinity(), "Roughness Factor", "", "", "");
@ -69,6 +88,26 @@ RimMswCompletionParameters::~RimMswCompletionParameters()
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMswCompletionParameters::ReferenceMDType RimMswCompletionParameters::referenceMDType() const
{
return m_refMDType();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimMswCompletionParameters::manualReferenceMD() const
{
if (m_refMDType == AUTO_REFERENCE_MD)
{
return std::numeric_limits<double>::infinity();
}
return m_refMD;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -159,6 +198,22 @@ double RimMswCompletionParameters::maxSegmentLength() const
return m_enforceMaxSegmentLength ? m_maxSegmentLength : std::numeric_limits<double>::infinity();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMswCompletionParameters::setReferenceMDType(ReferenceMDType refType)
{
m_refMDType = refType;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMswCompletionParameters::setManualReferenceMD(double manualRefMD)
{
m_refMD = manualRefMD;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -196,6 +251,12 @@ void RimMswCompletionParameters::setLengthAndDepth(LengthAndDepthType lengthAndD
//--------------------------------------------------------------------------------------------------
void RimMswCompletionParameters::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{
if (changedField == &m_refMDType)
{
m_refMD.uiCapability()->setUiHidden(m_refMDType == AUTO_REFERENCE_MD);
this->updateAllRequiredEditors();
}
if (changedField == &m_enforceMaxSegmentLength)
{
m_maxSegmentLength.uiCapability()->setUiHidden(!m_enforceMaxSegmentLength());
@ -226,6 +287,13 @@ void RimMswCompletionParameters::defineUiOrdering(QString uiConfigName, caf::Pdm
}
}
if (m_enableReferenceDepth)
{
uiOrdering.add(&m_refMDType);
uiOrdering.add(&m_refMD);
m_refMD.uiCapability()->setUiHidden(m_refMDType == AUTO_REFERENCE_MD);
}
uiOrdering.add(&m_linerDiameter);
uiOrdering.add(&m_roughnessFactor);
uiOrdering.add(&m_pressureDrop);

View File

@ -27,24 +27,32 @@ class RimMswCompletionParameters : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
enum ReferenceMDType
{
AUTO_REFERENCE_MD = 0,
MANUAL_REFERENCE_MD
};
enum PressureDropType {
HYDROSTATIC,
HYDROSTATIC_FRICTION,
HYDROSTATIC_FRICTION_ACCELERATION
};
typedef caf::AppEnum<PressureDropType> PressureDropEnum;
enum LengthAndDepthType {
ABS,
INC
};
typedef caf::AppEnum<ReferenceMDType> ReferenceMDEnum;
typedef caf::AppEnum<PressureDropType> PressureDropEnum;
typedef caf::AppEnum<LengthAndDepthType> LengthAndDepthEnum;
RimMswCompletionParameters();
RimMswCompletionParameters(bool enableReferenceDepth = true);
~RimMswCompletionParameters() override;
ReferenceMDType referenceMDType() const;
double manualReferenceMD() const;
double linerDiameter(RiaEclipseUnitTools::UnitSystem unitSystem) const;
static double defaultLinerDiameter(RiaEclipseUnitTools::UnitSystem unitSystem);
double roughnessFactor(RiaEclipseUnitTools::UnitSystem unitSystem) const;
@ -52,22 +60,27 @@ public:
PressureDropEnum pressureDrop() const;
LengthAndDepthEnum lengthAndDepth() const;
double maxSegmentLength() const;
void setReferenceMDType(ReferenceMDType refType);
void setManualReferenceMD(double manualRefMD);
void setLinerDiameter(double diameter);
void setRoughnessFactor(double roughnessFactor);
void setPressureDrop(PressureDropType pressureDropType);
void setLengthAndDepth(LengthAndDepthType lengthAndDepthType);
void setUnitSystemSpecificDefaults();
protected:
void fieldChangedByUi(const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue) override;
void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
const QVariant& oldValue,
const QVariant& newValue) override;
void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
void initAfterRead() override;
private:
caf::PdmField<ReferenceMDEnum> m_refMDType;
caf::PdmField<double> m_refMD;
caf::PdmField<double> m_linerDiameter;
caf::PdmField<double> m_roughnessFactor;
@ -76,4 +89,6 @@ private:
caf::PdmField<bool> m_enforceMaxSegmentLength;
caf::PdmField<double> m_maxSegmentLength;
bool m_enableReferenceDepth;
};

View File

@ -35,6 +35,18 @@
#include "Riu3DMainWindowTools.h"
namespace caf
{
template<>
void RimPerforationCollection::ReferenceMDEnum::setUp()
{
addItem(RimPerforationCollection::AUTO_REFERENCE_MD, "GridIntersectionRefMD", "Grid Entry Point");
addItem(RimPerforationCollection::MANUAL_REFERENCE_MD, "ManualRefMD", "User Defined");
setDefault(RimPerforationCollection::AUTO_REFERENCE_MD);
}
} // namespace caf
CAF_PDM_SOURCE_INIT(RimPerforationCollection, "PerforationCollection");
//--------------------------------------------------------------------------------------------------
@ -93,35 +105,6 @@ void RimPerforationCollection::setUnitSystemSpecificDefaults()
m_mswParameters->setUnitSystemSpecificDefaults();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPerforationCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
{
caf::PdmUiGroup* mswGroup = uiOrdering.addNewGroup("Multi Segment Well Options");
m_mswParameters->uiOrdering(uiConfigName, *mswGroup);
m_nonDarcyParameters->uiOrdering(uiConfigName, uiOrdering);
uiOrdering.skipRemainingFields(true);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPerforationCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{
RimProject* proj;
this->firstAncestorOrThisOfTypeAsserted(proj);
if (changedField == &m_isChecked)
{
proj->reloadCompletionTypeResultsInAllViews();
}
else
{
proj->scheduleCreateDisplayModelAndRedrawAllViews();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -203,3 +186,32 @@ std::vector<const RimPerforationInterval*> RimPerforationCollection::activePerfo
return myActivePerforations;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPerforationCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
{
caf::PdmUiGroup* mswGroup = uiOrdering.addNewGroup("Multi Segment Well Options");
m_mswParameters->uiOrdering(uiConfigName, *mswGroup);
m_nonDarcyParameters->uiOrdering(uiConfigName, uiOrdering);
uiOrdering.skipRemainingFields(true);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPerforationCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue)
{
RimProject* proj;
this->firstAncestorOrThisOfTypeAsserted(proj);
if (changedField == &m_isChecked)
{
proj->reloadCompletionTypeResultsInAllViews();
}
else
{
proj->scheduleCreateDisplayModelAndRedrawAllViews();
}
}

View File

@ -40,6 +40,13 @@ class RimPerforationCollection : public RimCheckableNamedObject
CAF_PDM_HEADER_INIT;
public:
enum ReferenceMDType
{
AUTO_REFERENCE_MD = 0,
MANUAL_REFERENCE_MD
};
typedef caf::AppEnum<ReferenceMDType> ReferenceMDEnum;
RimPerforationCollection();
~RimPerforationCollection() override;
@ -48,7 +55,7 @@ public:
void setUnitSystemSpecificDefaults();
void appendPerforation(RimPerforationInterval* perforation);
std::vector<const RimPerforationInterval*> perforations() const;
std::vector<const RimPerforationInterval*> activePerforations() const;
std::vector<const RimPerforationInterval*> activePerforations() const;
private:
void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;

View File

@ -23,18 +23,6 @@
#include "cafPdmObject.h"
namespace caf {
template<>
void RimWellPathFractureCollection::ReferenceMDEnum::setUp()
{
addItem(RimWellPathFractureCollection::AUTO_REFERENCE_MD, "GridIntersectionRefMD", "Grid Entry Point");
addItem(RimWellPathFractureCollection::MANUAL_REFERENCE_MD, "ManualRefMD", "User Defined");
setDefault(RimWellPathFractureCollection::AUTO_REFERENCE_MD);
}
}
CAF_PDM_SOURCE_INIT(RimWellPathFractureCollection, "WellPathFractureCollection");
//--------------------------------------------------------------------------------------------------
@ -50,12 +38,13 @@ RimWellPathFractureCollection::RimWellPathFractureCollection(void)
setName("Fractures");
nameField()->uiCapability()->setUiHidden(true);
CAF_PDM_InitFieldNoDefault(&m_refMDType, "RefMDType", "Reference MD", "", "", "");
CAF_PDM_InitField(&m_refMD, "RefMD", 0.0, "", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_mswParameters, "MswParameters", "Multi Segment Well Parameters", "", "", "");
m_mswParameters = new RimMswCompletionParameters;
m_mswParameters.uiCapability()->setUiTreeHidden(true);
m_mswParameters.uiCapability()->setUiTreeChildrenHidden(true);
CAF_PDM_InitField(&m_refMDType_OBSOLETE, "RefMDType", std::numeric_limits<int>::max(), "Reference MD", "", "", "");
CAF_PDM_InitField(&m_refMD_OBSOLETE, "RefMD", std::numeric_limits<double>::infinity(), "", "", "", "");
}
//--------------------------------------------------------------------------------------------------
@ -97,26 +86,6 @@ void RimWellPathFractureCollection::setUnitSystemSpecificDefaults()
m_mswParameters->setUnitSystemSpecificDefaults();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellPathFractureCollection::ReferenceMDType RimWellPathFractureCollection::referenceMDType() const
{
return m_refMDType();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimWellPathFractureCollection::manualReferenceMD() const
{
if (m_refMDType == AUTO_REFERENCE_MD)
{
return std::numeric_limits<double>::infinity();
}
return m_refMD;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -152,12 +121,8 @@ std::vector<RimWellPathFracture*> RimWellPathFractureCollection::activeFractures
void RimWellPathFractureCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
{
caf::PdmUiGroup* mswGroup = uiOrdering.addNewGroup("Multi Segment Well Options");
mswGroup->add(&m_refMDType);
mswGroup->add(&m_refMD);
m_refMD.uiCapability()->setUiHidden(m_refMDType == AUTO_REFERENCE_MD);
m_mswParameters->uiOrdering(uiConfigName, *mswGroup);
uiOrdering.skipRemainingFields(true);
}
//--------------------------------------------------------------------------------------------------
@ -176,3 +141,19 @@ void RimWellPathFractureCollection::fieldChangedByUi(const caf::PdmFieldHandle*
proj->scheduleCreateDisplayModelAndRedrawAllViews();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathFractureCollection::initAfterRead()
{
if (m_refMDType_OBSOLETE() != std::numeric_limits<int>::max())
{
m_mswParameters->setReferenceMDType((RimMswCompletionParameters::ReferenceMDType) m_refMDType_OBSOLETE());
}
if (m_refMD_OBSOLETE() != std::numeric_limits<double>::infinity())
{
m_mswParameters->setManualReferenceMD(m_refMD_OBSOLETE());
}
}

View File

@ -38,14 +38,6 @@ class RimWellPathFractureCollection : public RimCheckableNamedObject
{
CAF_PDM_HEADER_INIT;
public:
enum ReferenceMDType
{
AUTO_REFERENCE_MD = 0,
MANUAL_REFERENCE_MD
};
typedef caf::AppEnum<ReferenceMDType> ReferenceMDEnum;
RimWellPathFractureCollection(void);
~RimWellPathFractureCollection(void) override;
@ -53,8 +45,6 @@ public:
void addFracture(RimWellPathFracture* fracture);
void deleteFractures();
void setUnitSystemSpecificDefaults();
ReferenceMDType referenceMDType() const;
double manualReferenceMD() const;
std::vector<RimWellPathFracture*> allFractures() const;
std::vector<RimWellPathFracture*> activeFractures() const;
@ -62,10 +52,13 @@ public:
private:
void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
void initAfterRead() override;
private:
caf::PdmChildArrayField<RimWellPathFracture*> m_fractures;
caf::PdmField<ReferenceMDEnum> m_refMDType;
caf::PdmField<double> m_refMD;
caf::PdmChildField<RimMswCompletionParameters*> m_mswParameters;
caf::PdmField<int> m_refMDType_OBSOLETE;
caf::PdmField<double> m_refMD_OBSOLETE;
};