#6735 Fix compsegs end length and make valve branch segments use mid points

This commit is contained in:
Gaute Lindkvist 2020-10-12 13:38:45 +02:00
parent bb3dfd538c
commit dcc88a4703
4 changed files with 110 additions and 84 deletions

View File

@ -38,6 +38,8 @@ RicMswSegment::RicMswSegment( const QString& label,
, m_endMD( endMD ) , m_endMD( endMD )
, m_startTVD( startTVD ) , m_startTVD( startTVD )
, m_endTVD( endTVD ) , m_endTVD( endTVD )
, m_outputMD( 0.0 )
, m_outputTVD( 0.0 )
, m_effectiveDiameter( 0.15 ) , m_effectiveDiameter( 0.15 )
, m_holeDiameter( RicMswExportInfo::defaultDoubleValue() ) , m_holeDiameter( RicMswExportInfo::defaultDoubleValue() )
, m_openHoleRoughnessFactor( 5.0e-5 ) , m_openHoleRoughnessFactor( 5.0e-5 )
@ -71,6 +73,22 @@ double RicMswSegment::endMD() const
return m_endMD; 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; return m_endTVD;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicMswSegment::setOutputTVD( double outputTVD )
{
m_outputTVD = outputTVD;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RicMswSegment::outputTVD() const
{
return m_outputTVD;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -41,11 +41,15 @@ public:
double startMD() const; double startMD() const;
double endMD() const; double endMD() const;
void setOutputMD( double outputMD );
double outputMD() const;
double length() const; double length() const;
double deltaMD() const; double deltaMD() const;
double startTVD() const; double startTVD() const;
double endTVD() const; double endTVD() const;
void setOutputTVD( double outputTVD );
double outputTVD() const;
double deltaTVD() const; double deltaTVD() const;
double effectiveDiameter() const; double effectiveDiameter() const;
@ -79,6 +83,8 @@ private:
double m_endMD; double m_endMD;
double m_startTVD; double m_startTVD;
double m_endTVD; double m_endTVD;
double m_outputMD;
double m_outputTVD;
double m_effectiveDiameter; double m_effectiveDiameter;
double m_holeDiameter; double m_holeDiameter;
double m_openHoleRoughnessFactor; double m_openHoleRoughnessFactor;

View File

@ -308,9 +308,8 @@ void RicWellPathExportMswCompletionsImpl::generateWelsegsTable( RifTextDataTable
int segmentNumber = 2; // There's an implicit segment number 1. int segmentNumber = 2; // There's an implicit segment number 1.
{ {
double prevMD = exportInfo.initialMD();
double prevTVD = exportInfo.initialTVD();
formatter.comment( "Main Stem Segments" ); formatter.comment( "Main Stem Segments" );
std::shared_ptr<RicMswSegment> previousSegment;
for ( std::shared_ptr<RicMswSegment> segment : exportInfo.segments() ) for ( std::shared_ptr<RicMswSegment> segment : exportInfo.segments() )
{ {
segment->setSegmentNumber( segmentNumber ); segment->setSegmentNumber( segmentNumber );
@ -321,7 +320,8 @@ void RicWellPathExportMswCompletionsImpl::generateWelsegsTable( RifTextDataTable
formatter.comment( comment ); 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() ) ) if ( RigCompletionData::isValve( completion->completionType() ) )
{ {
writeValveWelsegsSegment( std::dynamic_pointer_cast<RicMswValve>( completion ), writeValveWelsegsSegment( segment,
std::dynamic_pointer_cast<RicMswValve>( completion ),
formatter, formatter,
exportInfo, exportInfo,
maxSegmentLength, maxSegmentLength,
mainSegmentNumber,
segmentNumber ); segmentNumber );
} }
else else
{ {
writeCompletionWelsegsSegment( segment, writeCompletionWelsegsSegment( segment, completion, formatter, exportInfo, maxSegmentLength, segmentNumber );
completion,
formatter,
exportInfo,
maxSegmentLength,
mainSegmentNumber,
segmentNumber );
} }
} }
} }
@ -479,7 +473,8 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
for ( std::shared_ptr<RicMswSegment> segment : exportInfo.segments() ) 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() ) for ( std::shared_ptr<RicMswCompletion> completion : segment->completions() )
{ {
@ -493,9 +488,17 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
for ( const std::shared_ptr<RicMswSubSegment>& subSegment : completion->subSegments() ) for ( const std::shared_ptr<RicMswSubSegment>& subSegment : completion->subSegments() )
{ {
double subSegmentStartMD = segmentStartMD;
double subSegmentEndMD = segmentEndMD;
if ( completion->completionType() == RigCompletionData::FISHBONES_ICD ) 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 : for ( const std::shared_ptr<RicMswSubSegmentCellIntersection>& intersection :
@ -513,13 +516,8 @@ void RicWellPathExportMswCompletionsImpl::generateCompsegTable(
ijk.z() ); ijk.z() );
formatter.add( completion->branchNumber() ); formatter.add( completion->branchNumber() );
double startLength = subSegment->startMD(); formatter.add( subSegmentStartMD );
if ( exportInfo.lengthAndDepthText() == QString( "INC" ) && completion->branchNumber() != 1 ) formatter.add( subSegmentEndMD );
{
startLength -= startMD;
}
formatter.add( startLength );
formatter.add( startLength + subSegment->deltaMD() );
formatter.rowCompleted(); formatter.rowCompleted();
} }
@ -1347,26 +1345,30 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
for ( size_t nSubValve = 0u; nSubValve < valve->valveLocations().size(); ++nSubValve ) for ( size_t nSubValve = 0u; nSubValve < valve->valveLocations().size(); ++nSubValve )
{ {
double valveMD = valve->valveLocations()[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]; std::pair<double, double> valveSegment = valve->valveSegments()[nSubValve];
double overlapStart = std::max( valveSegment.first, segment->startMD() ); double overlapStart = std::max( valveSegment.first, segment->startMD() );
double overlapEnd = std::min( valveSegment.second, segment->endMD() ); double overlapEnd = std::min( valveSegment.second, segment->endMD() );
double overlap = std::max( 0.0, overlapEnd - overlapStart ); 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 ( segment->startMD() <= valveMD && valveMD < segment->endMD() )
{ {
if ( valve->componentType() == RiaDefines::WellPathComponentType::AICD ) if ( valve->componentType() == RiaDefines::WellPathComponentType::AICD )
{ {
QString valveLabel = QString valveLabel =
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 ); QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
std::shared_ptr<RicMswSubSegment> subSegment( auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve ); superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve );
superAICD->addSubSegment( subSegment ); superAICD->addSubSegment( subSegment );
@ -1375,8 +1377,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
{ {
QString valveLabel = QString valveLabel =
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 ); QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
std::shared_ptr<RicMswSubSegment> subSegment( auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve ); superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve );
superICD->addSubSegment( subSegment ); superICD->addSubSegment( subSegment );
@ -1385,8 +1386,7 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
{ {
QString valveLabel = QString valveLabel =
QString( "ICV %1 at segment #%2" ).arg( valve->name() ).arg( nMainSegment + 2 ); QString( "ICV %1 at segment #%2" ).arg( valve->name() ).arg( nMainSegment + 2 );
std::shared_ptr<RicMswSubSegment> subSegment( auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
new RicMswSubSegment( valveMD, valveMD + valveLengthMD, valveStartTVD, valveEndTVD ) );
ICV = std::make_shared<RicMswPerforationICV>( valveLabel, valve ); ICV = std::make_shared<RicMswPerforationICV>( valveLabel, valve );
ICV->addSubSegment( subSegment ); ICV->addSubSegment( subSegment );
@ -1401,17 +1401,8 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
QString valveLabel = QString valveLabel =
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 ); QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
double overlapValveStartTVD = auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapStart ); superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve );
double overlapEndTVD =
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath,
overlapStart + valveLengthMD );
std::shared_ptr<RicMswSubSegment> subSegment( new RicMswSubSegment( overlapStart,
overlapStart + valveLengthMD,
overlapValveStartTVD,
overlapEndTVD ) );
superICD = std::make_shared<RicMswPerforationICD>( valveLabel, valve );
superICD->addSubSegment( subSegment ); superICD->addSubSegment( subSegment );
} }
else if ( overlap > 0.0 && else if ( overlap > 0.0 &&
@ -1420,17 +1411,8 @@ void RicWellPathExportMswCompletionsImpl::createValveCompletions(
QString valveLabel = QString valveLabel =
QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 ); QString( "%1 #%2" ).arg( "Combined Valve for segment" ).arg( nMainSegment + 2 );
double overlapValveStartTVD = auto subSegment = std::make_shared<RicMswSubSegment>( exportStartMD, exportEndMD, 0.0, 0.0 );
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath, overlapStart ); superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve );
double overlapEndTVD =
RicWellPathExportMswCompletionsImpl::tvdFromMeasuredDepth( wellPath,
overlapStart + valveLengthMD );
std::shared_ptr<RicMswSubSegment> subSegment( new RicMswSubSegment( overlapStart,
overlapStart + valveLengthMD,
overlapValveStartTVD,
overlapEndTVD ) );
superAICD = std::make_shared<RicMswPerforationAICD>( valveLabel, valve );
superAICD->addSubSegment( subSegment ); superAICD->addSubSegment( subSegment );
} }
@ -1648,20 +1630,27 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToICVs(
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment, void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
std::shared_ptr<RicMswSegment> previousSegment,
RifTextDataTableFormatter& formatter, RifTextDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo, const RicMswExportInfo& exportInfo,
double maxSegmentLength, double maxSegmentLength,
int* segmentNumber, int* segmentNumber )
double* prevMD,
double* prevTVD )
{ {
CVF_ASSERT( segment && segmentNumber && prevMD && prevTVD ); CVF_ASSERT( segment && segmentNumber );
double startMD = segment->startMD(); double startMD = segment->startMD();
double endMD = segment->endMD(); double endMD = segment->endMD();
std::vector<std::pair<double, double>> subSegments = createSubSegmentMDPairs( startMD, endMD, maxSegmentLength ); 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 ) for ( auto mdPair : subSegments )
{ {
double subStartMD = mdPair.first; double subStartMD = mdPair.first;
@ -1681,14 +1670,16 @@ void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shar
if ( exportInfo.lengthAndDepthText() == QString( "INC" ) ) if ( exportInfo.lengthAndDepthText() == QString( "INC" ) )
{ {
depth = midPointTVD - *prevTVD; depth = midPointTVD - prevOutTVD;
length = midPointMD - *prevMD; length = midPointMD - prevOutMD;
} }
else else
{ {
depth = midPointTVD; depth = midPointTVD;
length = midPointMD; length = midPointMD;
} }
segment->setOutputMD( length );
segment->setOutputTVD( depth );
formatter.add( *segmentNumber ).add( *segmentNumber ); formatter.add( *segmentNumber ).add( *segmentNumber );
formatter.add( 1 ); // All segments on main stem are branch 1 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.linerDiameter() );
formatter.add( exportInfo.roughnessFactor() ); formatter.add( exportInfo.roughnessFactor() );
formatter.rowCompleted(); formatter.rowCompleted();
*prevMD = midPointMD;
*prevTVD = midPointTVD;
( *segmentNumber )++; ( *segmentNumber )++;
} }
} }
@ -1708,12 +1697,12 @@ void RicWellPathExportMswCompletionsImpl::writeMainBoreWelsegsSegment( std::shar
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_ptr<RicMswValve> valve, void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
RifTextDataTableFormatter& formatter, std::shared_ptr<RicMswValve> valve,
const RicMswExportInfo& exportInfo, RifTextDataTableFormatter& formatter,
double maxSegmentLength, const RicMswExportInfo& exportInfo,
int mainSegmentNumber, double maxSegmentLength,
int* segmentNumber ) int* segmentNumber )
{ {
CVF_ASSERT( valve ); CVF_ASSERT( valve );
@ -1722,8 +1711,8 @@ void RicWellPathExportMswCompletionsImpl::writeValveWelsegsSegment( std::shared_
auto subSegment = valve->subSegments().front(); auto subSegment = valve->subSegments().front();
subSegment->setSegmentNumber( *segmentNumber ); subSegment->setSegmentNumber( *segmentNumber );
double startMD = subSegment->startMD(); double startMD = segment->outputMD() + subSegment->startMD();
double endMD = subSegment->endMD(); double endMD = segment->outputMD() + subSegment->endMD();
std::vector<std::pair<double, double>> splitSegments = createSubSegmentMDPairs( startMD, endMD, maxSegmentLength ); 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( subSegmentNumber ); formatter.add( subSegmentNumber );
formatter.add( valve->branchNumber() ); formatter.add( valve->branchNumber() );
formatter.add( mainSegmentNumber ); formatter.add( segment->segmentNumber() );
formatter.add( length ); formatter.add( length );
formatter.add( depth ); formatter.add( depth );
@ -1774,7 +1763,6 @@ void RicWellPathExportMswCompletionsImpl::writeCompletionWelsegsSegment( std::sh
RifTextDataTableFormatter& formatter, RifTextDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo, const RicMswExportInfo& exportInfo,
double maxSegmentLength, double maxSegmentLength,
int mainSegmentNumber,
int* segmentNumber ) int* segmentNumber )
{ {
if ( completion->completionType() == RigCompletionData::FISHBONES ) if ( completion->completionType() == RigCompletionData::FISHBONES )
@ -1824,7 +1812,7 @@ void RicWellPathExportMswCompletionsImpl::writeCompletionWelsegsSegment( std::sh
formatter.add( subSegmentNumber ); formatter.add( subSegmentNumber );
formatter.add( subSegmentNumber ); formatter.add( subSegmentNumber );
formatter.add( completion->branchNumber() ); formatter.add( completion->branchNumber() );
formatter.add( mainSegmentNumber ); formatter.add( segment->segmentNumber() );
formatter.add( length ); formatter.add( length );
formatter.add( depth ); formatter.add( depth );
formatter.add( diameter ); formatter.add( diameter );

View File

@ -91,24 +91,22 @@ private:
double maxSegmentLength ); double maxSegmentLength );
static void writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment, static void writeMainBoreWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
std::shared_ptr<RicMswSegment> previousSegment,
RifTextDataTableFormatter& formatter, RifTextDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo, const RicMswExportInfo& exportInfo,
double maxSegmentLength, double maxSegmentLength,
int* segmentNumber, int* segmentNumber );
double* prevMD, static void writeValveWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
double* prevTVD ); std::shared_ptr<RicMswValve> valve,
static void writeValveWelsegsSegment( std::shared_ptr<RicMswValve> valve, RifTextDataTableFormatter& formatter,
RifTextDataTableFormatter& formatter, const RicMswExportInfo& exportInfo,
const RicMswExportInfo& exportInfo, double maxSegmentLength,
double maxSegmentLength, int* segmentNumber );
int mainSegmentNumber,
int* segmentNumber );
static void writeCompletionWelsegsSegment( std::shared_ptr<RicMswSegment> segment, static void writeCompletionWelsegsSegment( std::shared_ptr<RicMswSegment> segment,
std::shared_ptr<RicMswCompletion> completion, std::shared_ptr<RicMswCompletion> completion,
RifTextDataTableFormatter& formatter, RifTextDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo, const RicMswExportInfo& exportInfo,
double maxSegmentLength, double maxSegmentLength,
int mainSegmentNumber,
int* segmentNumber ); int* segmentNumber );
static void generateWelsegsSegments( RifTextDataTableFormatter& formatter, static void generateWelsegsSegments( RifTextDataTableFormatter& formatter,