From 065e37a437f9276a0f758b13bff890dbc2a60911 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 6 Nov 2023 14:34:53 +0100 Subject: [PATCH] Fault Reactivation: parse element sets from INP file. --- .../GeoMech/OdbReader/RifInpReader.cpp | 58 ++++++++++++++++--- .../GeoMech/OdbReader/RifInpReader.h | 10 ++-- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.cpp b/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.cpp index 38131318d0..1b7c35f907 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.cpp +++ b/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.cpp @@ -81,11 +81,12 @@ bool RifInpReader::readFemParts( RigFemPartCollection* femParts ) CVF_ASSERT( femParts ); // The key in the maps is the part ID - std::map parts; - std::map>> nodes; - std::map>>> elements; + std::map parts; + std::map>> nodes; + std::map>>> elements; + std::map>>> elementSets; - read( m_stream, parts, nodes, elements ); + read( m_stream, parts, nodes, elements, elementSets ); RiaLogging::debug( QString( "Read FEM parts: %1 nodes: %2 elements: %3" ).arg( parts.size() ).arg( nodes.size() ).arg( elements.size() ) ); @@ -147,6 +148,13 @@ bool RifInpReader::readFemParts( RigFemPartCollection* femParts ) femPart->appendElement( elmType, elmId, indexBasedConnectivities.data() ); } + // read element sets + auto elementSetsForPart = elementSets[partId]; + for ( auto [setName, elementSet] : elementSetsForPart ) + { + femPart->addElementSet( setName, elementSet ); + } + femPart->setElementPartId( femParts->partCount() ); femParts->addFemPart( femPart ); @@ -159,10 +167,11 @@ bool RifInpReader::readFemParts( RigFemPartCollection* femParts ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifInpReader::read( std::istream& stream, - std::map& parts, - std::map>>& nodes, - std::map>>>& elements ) +void RifInpReader::read( std::istream& stream, + std::map& parts, + std::map>>& nodes, + std::map>>>& elements, + std::map>>>& elementSets ) { std::string line; @@ -202,6 +211,13 @@ void RifInpReader::read( std::istream& skipComments( stream ); elements[partId] = readElements( stream ); } + else if ( uppercasedLine.starts_with( "*ELSET," ) ) + { + skipComments( stream ); + std::string setName = parseLabel( line, "elset" ); + auto elementSet = readElementSet( stream ); + elementSets[partId].push_back( { setName, elementSet } ); + } continue; } @@ -284,6 +300,32 @@ std::vector>> RifInpReader::readElements( std::i return partElements; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifInpReader::readElementSet( std::istream& stream ) +{ + std::vector elementSet; + + // Read until we find a new section (which should start with a '*'). + while ( stream.peek() != '*' && stream.peek() != EOF ) + { + // Read entire line of comma-separated values + std::string line; + std::getline( stream, line ); + + // Process the comma-separated values + auto parts = RiaStdStringTools::splitString( line, ',' ); + for ( auto part : parts ) + { + int elementId = RiaStdStringTools::toInt( part ) - 1; + elementSet.push_back( elementId ); + } + } + + return elementSet; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.h b/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.h index 36dc2fc1fc..5f43cc0977 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.h +++ b/ApplicationLibCode/GeoMech/OdbReader/RifInpReader.h @@ -77,11 +77,13 @@ private: static std::string parseLabel( const std::string& line, const std::string& labelName ); static std::vector> readNodes( std::istream& stream ); static std::vector>> readElements( std::istream& stream ); + static std::vector readElementSet( std::istream& stream ); - static void read( std::istream& stream, - std::map& parts, - std::map>>& nodes, - std::map>>>& elements ); + static void read( std::istream& stream, + std::map& parts, + std::map>>& nodes, + std::map>>>& elements, + std::map>>>& elementSets ); private: std::map> m_partElementSetNames;