£8014 : Fix MSW valve export

This commit is contained in:
Magne Sjaastad 2021-10-29 14:43:56 +02:00 committed by GitHub
parent ea496072b8
commit 299217e219
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 73 additions and 40 deletions

View File

@ -278,6 +278,14 @@ std::unique_ptr<RicMswCompletion> RicMswSegment::removeCompletion( RicMswComplet
return removedCompletion; return removedCompletion;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicMswSegment::deleteAllCompletions()
{
m_completions.clear();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -76,6 +76,7 @@ public:
void addCompletion( std::unique_ptr<RicMswCompletion> completion ); void addCompletion( std::unique_ptr<RicMswCompletion> completion );
std::unique_ptr<RicMswCompletion> removeCompletion( RicMswCompletion* completion ); std::unique_ptr<RicMswCompletion> removeCompletion( RicMswCompletion* completion );
void deleteAllCompletions();
void addIntersection( std::shared_ptr<RicMswSegmentCellIntersection> intersection ); void addIntersection( std::shared_ptr<RicMswSegmentCellIntersection> intersection );

View File

@ -550,36 +550,29 @@ void RicMswTableFormatterTools::generateWsegvalvTableRecursively( gsl::not_null<
{ {
if ( RigCompletionData::isWsegValveTypes( completion->completionType() ) ) if ( RigCompletionData::isWsegValveTypes( completion->completionType() ) )
{ {
auto wsegValve = static_cast<RicMswWsegValve*>( completion ); // Related function RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs
if ( !wsegValve->segments().empty() )
auto wsegValve = static_cast<RicMswWsegValve*>( completion );
int segmentNumber = -1;
for ( auto seg : wsegValve->segments() )
{ {
CVF_ASSERT( wsegValve->segments().size() == 1u ); if ( seg->segmentNumber() > -1 ) segmentNumber = seg->segmentNumber();
if ( seg->intersections().empty() ) continue;
auto firstSubSegment = wsegValve->segments().front(); size_t cellIndex = seg->intersections().front()->globalCellIndex();
// TODO: The following line was blocking export of valves for fishbones QString comment;
// Unclear why this line was included. Remove when MSW export has ben verified correctly if ( wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD ||
// if ( !firstSubSegment->intersections().empty() ) wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICV )
{ {
QString comment; comment = wsegValve->label();
if ( wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD ||
wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICV )
{
comment = wsegValve->label();
}
size_t cellIndex = std::numeric_limits<size_t>::max();
if ( !firstSubSegment->intersections().empty() )
{
cellIndex = firstSubSegment->intersections().front()->globalCellIndex();
}
wsegvalveData[cellIndex].push_back( WsegvalveData( wellNameForExport,
comment,
firstSubSegment->segmentNumber(),
wsegValve->flowCoefficient(),
wsegValve->area() ) );
} }
wsegvalveData[cellIndex].push_back( WsegvalveData( wellNameForExport,
comment,
segmentNumber,
wsegValve->flowCoefficient(),
wsegValve->area() ) );
} }
} }
} }
@ -739,22 +732,19 @@ void RicMswTableFormatterTools::generateWsegAicdTableRecursively( RicMswExportIn
auto aicd = static_cast<const RicMswPerforationAICD*>( completion ); auto aicd = static_cast<const RicMswPerforationAICD*>( completion );
if ( aicd->isValid() ) if ( aicd->isValid() )
{ {
if ( !aicd->segments().empty() ) int segmentNumber = -1;
for ( auto seg : aicd->segments() )
{ {
CVF_ASSERT( aicd->segments().size() == 1u ); if ( seg->segmentNumber() > -1 ) segmentNumber = seg->segmentNumber();
auto firstSegment = aicd->segments().front(); if ( seg->intersections().empty() ) continue;
size_t cellIndex = std::numeric_limits<size_t>::max(); size_t cellIndex = seg->intersections().front()->globalCellIndex();
if ( !firstSegment->intersections().empty() )
{
cellIndex = firstSegment->intersections().front()->globalCellIndex();
}
auto wellName = exportInfo.mainBoreBranch()->wellPath()->completionSettings()->wellNameForExport(); auto wellName = exportInfo.mainBoreBranch()->wellPath()->completionSettings()->wellNameForExport();
auto comment = aicd->label(); auto comment = aicd->label();
aicdValveData[cellIndex].push_back( AicdWsegvalveData( wellName, aicdValveData[cellIndex].push_back( AicdWsegvalveData( wellName,
comment, comment,
firstSegment->segmentNumber(), segmentNumber,
aicd->flowScalingFactor(), aicd->flowScalingFactor(),
aicd->isOpen(), aicd->isOpen(),
aicd->values() ) ); aicd->values() ) );

View File

@ -1622,13 +1622,13 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs( g
std::vector<RicMswCompletion*> perforations; std::vector<RicMswCompletion*> perforations;
for ( auto completion : segment->completions() ) for ( auto completion : segment->completions() )
{ {
if ( RigCompletionData::isPerforationValve( completion->completionType() ) ) if ( completion->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD ||
completion->completionType() == RigCompletionData::CompletionType::PERFORATION_AICD )
{ {
superValve = completion; superValve = completion;
} }
else else if ( completion->completionType() == RigCompletionData::CompletionType::PERFORATION )
{ {
CVF_ASSERT( completion->completionType() == RigCompletionData::CompletionType::PERFORATION );
perforations.push_back( completion ); perforations.push_back( completion );
} }
} }
@ -1636,21 +1636,55 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs( g
if ( superValve == nullptr ) continue; if ( superValve == nullptr ) continue;
CVF_ASSERT( superValve->segments().size() == 1u ); CVF_ASSERT( superValve->segments().size() == 1u );
double aggregatedMinStartMD = std::numeric_limits<double>::max();
// Remove and take over ownership of the superValve completion // Remove and take over ownership of the superValve completion
auto completionPtr = segment->removeCompletion( superValve ); auto completionPtr = segment->removeCompletion( superValve );
for ( auto perforation : perforations ) for ( auto perforation : perforations )
{ {
for ( auto subSegment : perforation->segments() ) for ( auto subSegment : perforation->segments() )
{ {
aggregatedMinStartMD = std::min( aggregatedMinStartMD, subSegment->startMD() );
// The valve completions on the main branch will be deleted. Create a segment with startMD and
// endMD representing the perforation along main well path to be connected to the valve. When COMPSEGS
// data is exported, the startMD and endMD of the segment is used to define the Start Length and End
// Length of the COMPSEGS keyword
//
// Example output
//
// COMPSEGS
// --Name
// Well - 1 /
// --I J K Branch no Start Length End Length
// 17 17 9 2 3030.71791 3034.01331 /
// 17 18 9 3 3034.01331 3125.47617 /
auto valveInflowSegment =
std::make_unique<RicMswSegment>( QString( "%1 real valve segment " ).arg( branch->label() ),
subSegment->startMD(),
subSegment->endMD(),
subSegment->startTVD(),
subSegment->endTVD() );
for ( auto intersectionPtr : subSegment->intersections() ) for ( auto intersectionPtr : subSegment->intersections() )
{ {
completionPtr->segments()[0]->addIntersection( intersectionPtr ); valveInflowSegment->addIntersection( intersectionPtr );
} }
completionPtr->addSegment( std::move( valveInflowSegment ) );
} }
} }
// Remove all completions and re-add the super valve // Remove all completions and re-add the super valve
segment->completions().clear(); segment->deleteAllCompletions();
segment->addCompletion( std::move( completionPtr ) );
auto segmentWithLowerMD = branch->findClosestSegmentWithLowerMD( aggregatedMinStartMD );
if ( segmentWithLowerMD )
{
segmentWithLowerMD->addCompletion( std::move( completionPtr ) );
}
} }
} }