mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-11 07:56:08 -06:00
#6735 Fix compsegs end length and make valve branch segments use mid points
This commit is contained in:
parent
bb3dfd538c
commit
dcc88a4703
@ -38,6 +38,8 @@ RicMswSegment::RicMswSegment( const QString& label,
|
||||
, m_endMD( endMD )
|
||||
, m_startTVD( startTVD )
|
||||
, m_endTVD( endTVD )
|
||||
, m_outputMD( 0.0 )
|
||||
, m_outputTVD( 0.0 )
|
||||
, m_effectiveDiameter( 0.15 )
|
||||
, m_holeDiameter( RicMswExportInfo::defaultDoubleValue() )
|
||||
, m_openHoleRoughnessFactor( 5.0e-5 )
|
||||
@ -71,6 +73,22 @@ double RicMswSegment::endMD() const
|
||||
return m_endMD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicMswSegment::setOutputMD( double outputMD )
|
||||
{
|
||||
m_outputMD = outputMD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RicMswSegment::outputMD() const
|
||||
{
|
||||
return m_outputMD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -103,6 +121,22 @@ double RicMswSegment::endTVD() const
|
||||
return m_endTVD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicMswSegment::setOutputTVD( double outputTVD )
|
||||
{
|
||||
m_outputTVD = outputTVD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RicMswSegment::outputTVD() const
|
||||
{
|
||||
return m_outputTVD;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -41,11 +41,15 @@ public:
|
||||
|
||||
double startMD() const;
|
||||
double endMD() const;
|
||||
void setOutputMD( double outputMD );
|
||||
double outputMD() const;
|
||||
double length() const;
|
||||
|
||||
double deltaMD() const;
|
||||
double startTVD() const;
|
||||
double endTVD() const;
|
||||
void setOutputTVD( double outputTVD );
|
||||
double outputTVD() const;
|
||||
double deltaTVD() const;
|
||||
|
||||
double effectiveDiameter() const;
|
||||
@ -79,6 +83,8 @@ private:
|
||||
double m_endMD;
|
||||
double m_startTVD;
|
||||
double m_endTVD;
|
||||
double m_outputMD;
|
||||
double m_outputTVD;
|
||||
double m_effectiveDiameter;
|
||||
double m_holeDiameter;
|
||||
double m_openHoleRoughnessFactor;
|
||||
|
@ -308,9 +308,8 @@ void RicWellPathExportMswCompletionsImpl::generateWelsegsTable( RifTextDataTable
|
||||
|
||||
int segmentNumber = 2; // There's an implicit segment number 1.
|
||||
{
|
||||
double prevMD = exportInfo.initialMD();
|
||||
double prevTVD = exportInfo.initialTVD();
|
||||
formatter.comment( "Main Stem Segments" );
|
||||
std::shared_ptr<RicMswSegment> previousSegment;
|
||||
for ( std::shared_ptr<RicMswSegment> segment : exportInfo.segments() )
|
||||
{
|
||||
segment->setSegmentNumber( segmentNumber );
|
||||
@ -321,7 +320,8 @@ void RicWellPathExportMswCompletionsImpl::generateWelsegsTable( RifTextDataTable
|
||||
formatter.comment( comment );
|
||||
}
|
||||
|
||||
writeMainBoreWelsegsSegment( segment, formatter, exportInfo, maxSegmentLength, &segmentNumber, &prevMD, &prevTVD );
|
||||
writeMainBoreWelsegsSegment( segment, previousSegment, formatter, exportInfo, maxSegmentLength, &segmentNumber );
|
||||
previousSegment = segment;
|
||||
}
|
||||
}
|
||||
|
||||
@ -371,22 +371,16 @@ void RicWellPathExportMswCompletionsImpl::generateWelsegsSegments(
|
||||
|
||||
if ( RigCompletionData::isValve( completion->completionType() ) )
|
||||
{
|
||||
writeValveWelsegsSegment( std::dynamic_pointer_cast<RicMswValve>( completion ),
|
||||
writeValveWelsegsSegment( segment,
|
||||
std::dynamic_pointer_cast<RicMswValve>( completion ),
|
||||
formatter,
|
||||
exportInfo,
|
||||
maxSegmentLength,
|
||||
mainSegmentNumber,
|
||||
segmentNumber );
|
||||
}
|
||||
else
|
||||
{
|
||||
writeCompletionWelsegsSegment( segment,
|
||||
completion,
|
||||
formatter,
|
||||
exportInfo,
|
||||
maxSegmentLength,
|
||||
mainSegmentNumber,
|
||||
segmentNumber );
|
||||
writeCompletionWelsegsSegment( segment, completion, formatter, exportInfo, maxSegmentLength, segmentNumber );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -479,7 +473,8 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
|
||||
|
||||
for ( std::shared_ptr<RicMswSegment> segment : exportInfo.segments() )
|
||||
{
|
||||
double startMD = segment->startMD();
|
||||
double segmentStartMD = segment->startMD();
|
||||
double segmentEndMD = segment->endMD();
|
||||
|
||||
for ( std::shared_ptr<RicMswCompletion> completion : segment->completions() )
|
||||
{
|
||||
@ -493,9 +488,17 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
|
||||
|
||||
for ( const std::shared_ptr<RicMswSubSegment>& subSegment : completion->subSegments() )
|
||||
{
|
||||
double subSegmentStartMD = segmentStartMD;
|
||||
double subSegmentEndMD = segmentEndMD;
|
||||
if ( completion->completionType() == RigCompletionData::FISHBONES_ICD )
|
||||
{
|
||||
startMD = subSegment->startMD();
|
||||
subSegmentStartMD = subSegment->startMD();
|
||||
subSegmentEndMD = subSegment->endMD();
|
||||
}
|
||||
|
||||
if ( exportInfo.lengthAndDepthText() == QString( "INC" ) && completion->branchNumber() != 1 )
|
||||
{
|
||||
subSegmentStartMD -= segmentStartMD;
|
||||
}
|
||||
|
||||
for ( const std::shared_ptr<RicMswSubSegmentCellIntersection>& intersection :
|
||||
@ -513,13 +516,8 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
|
||||
ijk.z() );
|
||||
formatter.add( completion->branchNumber() );
|
||||
|
||||
double startLength = subSegment->startMD();
|
||||
if ( exportInfo.lengthAndDepthText() == QString( "INC" ) && completion->branchNumber() != 1 )
|
||||
{
|
||||
startLength -= startMD;
|
||||
}
|
||||
formatter.add( startLength );
|
||||
formatter.add( startLength + subSegment->deltaMD() );
|
||||
formatter.add( subSegmentStartMD );
|
||||
formatter.add( subSegmentEndMD );
|
||||
|
||||
formatter.rowCompleted();
|
||||
}
|
||||
@ -1348,25 +1346,29 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
|
||||
for ( size_t nSubValve = 0u; nSubValve < valve->valveLocations().size(); ++nSubValve )
|
||||
{
|
||||
double valveMD = valve->valveLocations()[nSubValve];
|
||||
double valveStartTVD = RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, valveMD );
|
||||
|
||||
double valveLengthMD = 0.1;
|
||||
double valveEndTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, valveMD + valveLengthMD );
|
||||
|
||||
std::pair<double, double> valveSegment = valve->valveSegments()[nSubValve];
|
||||
double overlapStart = std::max( valveSegment.first, segment->startMD() );
|
||||
double overlapEnd = std::min( valveSegment.second, segment->endMD() );
|
||||
double overlap = std::max( 0.0, overlapEnd - overlapStart );
|
||||
|
||||
// "Dummy" values for the new branch created for the valve.
|
||||
// Will be added to the main segments start MD,
|
||||
double exportStartMD = 0.0;
|
||||
double exportEndMD = 0.1;
|
||||
|
||||
double overlapStartTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapStart );
|
||||
double overlapEndTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapEnd );
|
||||
|
||||
if ( segment->startMD() <= valveMD && valveMD < segment->endMD() )
|
||||
{
|
||||
if ( valve->componentType() == RiaDefines::WellPathComponentType::AICD )
|
||||
{
|
||||
QString valveLabel =
|
||||
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
|
||||
std::shared_ptr<RicMswSubSegment> subSegment(
|
||||
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
|
||||
auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
|
||||
|
||||
superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve );
|
||||
superAICD->addSubSegment( subSegment );
|
||||
@ -1375,8 +1377,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
|
||||
{
|
||||
QString valveLabel =
|
||||
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
|
||||
std::shared_ptr<RicMswSubSegment> subSegment(
|
||||
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
|
||||
auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
|
||||
|
||||
superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve );
|
||||
superICD->addSubSegment( subSegment );
|
||||
@ -1385,8 +1386,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
|
||||
{
|
||||
QString valveLabel =
|
||||
QString( "ICV %1 at segment #%2" ).arg( valve->name() ).arg( nMainSegment + 2 );
|
||||
std::shared_ptr<RicMswSubSegment> subSegment(
|
||||
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
|
||||
auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
|
||||
|
||||
ICV = std::make_shared<RicMswPerforationICV>( valveLabel, valve );
|
||||
ICV->addSubSegment( subSegment );
|
||||
@ -1401,16 +1401,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
|
||||
QString valveLabel =
|
||||
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
|
||||
|
||||
double overlapValveStartTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapStart );
|
||||
double overlapEndTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath,
|
||||
overlapStart + valveLengthMD );
|
||||
|
||||
std::shared_ptr<RicMswSubSegment> subSegment( new RicMswSubSegment( overlapStart,
|
||||
overlapStart + valveLengthMD,
|
||||
overlapValveStartTVD,
|
||||
overlapEndTVD ) );
|
||||
auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
|
||||
superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve );
|
||||
superICD->addSubSegment( subSegment );
|
||||
}
|
||||
@ -1420,16 +1411,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
|
||||
QString valveLabel =
|
||||
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
|
||||
|
||||
double overlapValveStartTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapStart );
|
||||
double overlapEndTVD =
|
||||
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath,
|
||||
overlapStart + valveLengthMD );
|
||||
|
||||
std::shared_ptr<RicMswSubSegment> subSegment( new RicMswSubSegment( overlapStart,
|
||||
overlapStart + valveLengthMD,
|
||||
overlapValveStartTVD,
|
||||
overlapEndTVD ) );
|
||||
auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
|
||||
superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve );
|
||||
superAICD->addSubSegment( subSegment );
|
||||
}
|
||||
@ -1648,20 +1630,27 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToICVs(
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
|
||||
std::shared_ptr<RicMswSegment> previousSegment,
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int* segmentNumber,
|
||||
double* prevMD,
|
||||
double* prevTVD )
|
||||
int* segmentNumber )
|
||||
{
|
||||
CVF_ASSERT( segment && segmentNumber && prevMD && prevTVD );
|
||||
CVF_ASSERT( segment && segmentNumber );
|
||||
|
||||
double startMD = segment->startMD();
|
||||
double endMD = segment->endMD();
|
||||
|
||||
std::vector<std::pair<double, double>> subSegments = createSubSegmentMDPairs( startMD, endMD, maxSegmentLength );
|
||||
|
||||
double prevOutMD = exportInfo.initialMD();
|
||||
double prevOutTVD = exportInfo.initialTVD();
|
||||
if ( previousSegment )
|
||||
{
|
||||
prevOutMD = previousSegment->outputMD();
|
||||
prevOutTVD = previousSegment->outputTVD();
|
||||
}
|
||||
|
||||
for ( auto mdPair : subSegments )
|
||||
{
|
||||
double subStartMD = mdPair.first;
|
||||
@ -1681,14 +1670,16 @@ void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shar
|
||||
|
||||
if ( exportInfo.lengthAndDepthText() == QString( "INC" ) )
|
||||
{
|
||||
depth = midPointTVD - *prevTVD;
|
||||
length = midPointMD - *prevMD;
|
||||
depth = midPointTVD - prevOutTVD;
|
||||
length = midPointMD - prevOutMD;
|
||||
}
|
||||
else
|
||||
{
|
||||
depth = midPointTVD;
|
||||
length = midPointMD;
|
||||
}
|
||||
segment->setOutputMD( length );
|
||||
segment->setOutputTVD( depth );
|
||||
|
||||
formatter.add( *segmentNumber ).add( *segmentNumber );
|
||||
formatter.add( 1 ); // All segments on main stem are branch 1
|
||||
@ -1699,8 +1690,6 @@ void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shar
|
||||
formatter.add( exportInfo.linerDiameter() );
|
||||
formatter.add( exportInfo.roughnessFactor() );
|
||||
formatter.rowCompleted();
|
||||
*prevMD = midPointMD;
|
||||
*prevTVD = midPointTVD;
|
||||
( *segmentNumber )++;
|
||||
}
|
||||
}
|
||||
@ -1708,11 +1697,11 @@ void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shar
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_ptr<RicMswValve> valve,
|
||||
void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
|
||||
std::shared_ptr<RicMswValve> valve,
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int mainSegmentNumber,
|
||||
int* segmentNumber )
|
||||
{
|
||||
CVF_ASSERT( valve );
|
||||
@ -1722,8 +1711,8 @@ void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_
|
||||
auto subSegment = valve->subSegments().front();
|
||||
subSegment->setSegmentNumber( *segmentNumber );
|
||||
|
||||
double startMD = subSegment->startMD();
|
||||
double endMD = subSegment->endMD();
|
||||
double startMD = segment->outputMD() + subSegment->startMD();
|
||||
double endMD = segment->outputMD() + subSegment->endMD();
|
||||
|
||||
std::vector<std::pair<double, double>> splitSegments = createSubSegmentMDPairs( startMD, endMD, maxSegmentLength );
|
||||
|
||||
@ -1756,7 +1745,7 @@ void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_
|
||||
formatter.add( subSegmentNumber );
|
||||
formatter.add( subSegmentNumber );
|
||||
formatter.add( valve->branchNumber() );
|
||||
formatter.add( mainSegmentNumber );
|
||||
formatter.add( segment->segmentNumber() );
|
||||
|
||||
formatter.add( length );
|
||||
formatter.add( depth );
|
||||
@ -1774,7 +1763,6 @@ void RicWellPathExportMswCompletionsImpl::writeCompletionWelsegsSegment( std::sh
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int mainSegmentNumber,
|
||||
int* segmentNumber )
|
||||
{
|
||||
if ( completion->completionType() == RigCompletionData::FISHBONES )
|
||||
@ -1824,7 +1812,7 @@ void RicWellPathExportMswCompletionsImpl::writeCompletionWelsegsSegment( std::sh
|
||||
formatter.add( subSegmentNumber );
|
||||
formatter.add( subSegmentNumber );
|
||||
formatter.add( completion->branchNumber() );
|
||||
formatter.add( mainSegmentNumber );
|
||||
formatter.add( segment->segmentNumber() );
|
||||
formatter.add( length );
|
||||
formatter.add( depth );
|
||||
formatter.add( diameter );
|
||||
|
@ -91,24 +91,22 @@ private:
|
||||
double maxSegmentLength );
|
||||
|
||||
static void writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
|
||||
std::shared_ptr<RicMswSegment> previousSegment,
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int* segmentNumber,
|
||||
double* prevMD,
|
||||
double* prevTVD );
|
||||
static void writeValveWelsegsSegment( std::shared_ptr<RicMswValve> valve,
|
||||
int* segmentNumber );
|
||||
static void writeValveWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
|
||||
std::shared_ptr<RicMswValve> valve,
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int mainSegmentNumber,
|
||||
int* segmentNumber );
|
||||
static void writeCompletionWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
|
||||
std::shared_ptr<RicMswCompletion> completion,
|
||||
RifTextDataTableFormatter& formatter,
|
||||
const RicMswExportInfo& exportInfo,
|
||||
double maxSegmentLength,
|
||||
int mainSegmentNumber,
|
||||
int* segmentNumber );
|
||||
|
||||
static void generateWelsegsSegments( RifTextDataTableFormatter& formatter,
|
||||
|
Loading…
Reference in New Issue
Block a user