RFT: Add connection data as segment results

This commit is contained in:
Magne Sjaastad 2022-08-22 10:56:33 +02:00
parent 418c4df7b3
commit b6973a3644
3 changed files with 56 additions and 12 deletions

View File

@ -124,12 +124,43 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto
auto key = std::make_pair( wellName, RftDate{ y, m, d } ); auto key = std::make_pair( wellName, RftDate{ y, m, d } );
auto segment = m_rftWellDateSegments[key]; auto segment = m_rftWellDateSegments[key];
auto indices = if ( resultName.find( "CON" ) == 0 )
segment.indicesForBranchIndex( rftAddress.segmentBranchIndex(), rftAddress.segmentBranchType() );
for ( const auto& i : indices )
{ {
CAF_ASSERT( i < data.size() ); // Connection results with size equal to length of result CONSEGNO. CONSEGNO defines the segment
values->push_back( data[i] ); // numbers the connection is connected to.
const std::string consegResultName = "CONSEGNO";
auto connnectionSegmentNumbers = m_opm_rft->getRft<int>( consegResultName, wellName, y, m, d );
if ( connnectionSegmentNumbers.empty() ) return;
auto segmentNumbers = segment.segmentNumbersForBranchIndex( rftAddress.segmentBranchIndex(),
rftAddress.segmentBranchType() );
size_t resultDataIndex = 0;
for ( int segmentNumber : segmentNumbers )
{
if ( std::find( connnectionSegmentNumbers.begin(), connnectionSegmentNumbers.end(), segmentNumber ) !=
connnectionSegmentNumbers.end() )
{
values->push_back( data[resultDataIndex++] );
}
else
{
// The number of values must be equal to the number of segments, use infinity for segments
// with no data
values->push_back( std::numeric_limits<double>::infinity() );
}
}
}
else
{
auto indices =
segment.indicesForBranchIndex( rftAddress.segmentBranchIndex(), rftAddress.segmentBranchType() );
for ( const auto& i : indices )
{
CAF_ASSERT( i < data.size() );
values->push_back( data[i] );
}
} }
} }
else else
@ -356,14 +387,8 @@ void RifReaderOpmRft::buildMetaData()
m_rftSegmentTimeSteps.insert( dt ); m_rftSegmentTimeSteps.insert( dt );
auto segmentCount = segmentData.topology().size();
for ( const auto& resultNameAndSize : resultNameAndSizes ) for ( const auto& resultNameAndSize : resultNameAndSizes )
{ {
auto resultValueCount = std::get<2>( resultNameAndSize );
if ( static_cast<size_t>( resultValueCount ) != segmentCount ) continue;
auto resultName = std::get<0>( resultNameAndSize ); auto resultName = std::get<0>( resultNameAndSize );
auto adr = RifEclipseRftAddress::createSegmentAddress( QString::fromStdString( wellName ), auto adr = RifEclipseRftAddress::createSegmentAddress( QString::fromStdString( wellName ),
dt, dt,
@ -441,7 +466,7 @@ void RifReaderOpmRft::buildSegmentData()
for ( const auto& rftResultMetaData : arraysAtWellDate ) for ( const auto& rftResultMetaData : arraysAtWellDate )
{ {
auto [name, arrayType, size] = rftResultMetaData; auto [name, arrayType, size] = rftResultMetaData;
if ( name.find( "SEG" ) == 0 ) if ( ( name.find( "SEG" ) == 0 ) || ( name.find( "CON" ) == 0 ) )
{ {
segment.addResultNameAndSize( rftResultMetaData ); segment.addResultNameAndSize( rftResultMetaData );
} }

View File

@ -285,3 +285,20 @@ std::vector<size_t> RifRftSegment::indicesForBranchIndex( int branchIndex, RiaDe
return v; return v;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<int> RifRftSegment::segmentNumbersForBranchIndex( int oneBasedBranchIndex,
RiaDefines::RftBranchType branchType ) const
{
std::vector<int> v;
auto indices = indicesForBranchIndex( oneBasedBranchIndex, branchType );
for ( auto index : indices )
{
v.push_back( m_topology[index].segNo() );
}
return v;
}

View File

@ -72,6 +72,8 @@ public:
std::vector<size_t> indicesForBranchNumber( int branchNumber ) const; std::vector<size_t> indicesForBranchNumber( int branchNumber ) const;
std::vector<size_t> indicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const; std::vector<size_t> indicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const;
std::vector<int> segmentNumbersForBranchIndex( int oneBasedBranchIndex, RiaDefines::RftBranchType branchType ) const;
private: private:
std::vector<RifRftSegmentData> m_topology; std::vector<RifRftSegmentData> m_topology;
std::vector<Opm::EclIO::EclFile::EclEntry> m_resultNameAndSize; std::vector<Opm::EclIO::EclFile::EclEntry> m_resultNameAndSize;