mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Support filtering on element sets (#10570)
* Add support for filtering on element sets in geomech cases
This commit is contained in:
@@ -146,7 +146,7 @@ bool RigFemPart::fillElementCoordinates( size_t elementIdx, std::array<cvf::Vec3
|
||||
|
||||
// Fill coordinates for each node
|
||||
const auto& partNodes = nodes();
|
||||
for ( int i = 0; i < nodeIndices.size(); ++i )
|
||||
for ( int i = 0; i < (int)nodeIndices.size(); ++i )
|
||||
{
|
||||
coordinates[i].set( partNodes.coordinates[nodeIndices[i]] );
|
||||
}
|
||||
@@ -638,3 +638,45 @@ bool RigFemPart::enabled() const
|
||||
{
|
||||
return m_enabled;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigFemPart::addElementSet( std::string name, const std::vector<size_t>& elementIds )
|
||||
{
|
||||
m_elementSetNames.push_back( name );
|
||||
|
||||
std::map<size_t, size_t> idToIndex;
|
||||
|
||||
for ( size_t i = 0; i < m_elementId.size(); i++ )
|
||||
{
|
||||
idToIndex[m_elementId[i]] = i;
|
||||
}
|
||||
|
||||
std::vector<size_t> elementIndexes;
|
||||
elementIndexes.resize( elementIds.size() );
|
||||
|
||||
for ( size_t i = 0; i < elementIds.size(); i++ )
|
||||
{
|
||||
elementIndexes[i] = idToIndex[elementIds[i] + 1];
|
||||
}
|
||||
|
||||
m_elementIndexSets.push_back( elementIndexes );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<std::string> RigFemPart::elementSetNames() const
|
||||
{
|
||||
return m_elementSetNames;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<size_t> RigFemPart::elementSet( int setIndex ) const
|
||||
{
|
||||
if ( ( setIndex < 0 ) || ( setIndex >= (int)m_elementIndexSets.size() ) ) return {};
|
||||
return m_elementIndexSets[setIndex];
|
||||
}
|
||||
|
||||
@@ -102,6 +102,10 @@ public:
|
||||
void setEnabled( bool enable );
|
||||
bool enabled() const;
|
||||
|
||||
void addElementSet( std::string name, const std::vector<size_t>& elementIds );
|
||||
std::vector<std::string> elementSetNames() const;
|
||||
std::vector<size_t> elementSet( int setIndex ) const;
|
||||
|
||||
private:
|
||||
int m_elementPartId;
|
||||
std::string m_name;
|
||||
@@ -112,6 +116,9 @@ private:
|
||||
std::vector<size_t> m_elementConnectivityStartIndices;
|
||||
std::vector<int> m_allElementConnectivities;
|
||||
|
||||
std::vector<std::string> m_elementSetNames;
|
||||
std::vector<std::vector<size_t>> m_elementIndexSets;
|
||||
|
||||
RigFemPartNodes m_nodes;
|
||||
|
||||
mutable cvf::ref<RigFemPartGrid> m_structGrid;
|
||||
|
||||
@@ -47,8 +47,8 @@ public:
|
||||
virtual std::vector<double> frameTimes( int stepIndex ) const = 0;
|
||||
virtual int frameCount( int stepIndex ) const = 0;
|
||||
|
||||
virtual std::vector<std::string> elementSetNames( int partIndex ) = 0;
|
||||
virtual std::vector<size_t> elementSet( int partIndex, int setIndex ) = 0;
|
||||
virtual std::vector<std::string> elementSetNames( int partIndex, std::string partName ) = 0;
|
||||
virtual std::vector<size_t> elementSet( int partIndex, std::string partName, int setIndex ) = 0;
|
||||
|
||||
virtual std::map<std::string, std::vector<std::string>> scalarNodeFieldAndComponentNames() = 0;
|
||||
virtual std::map<std::string, std::vector<std::string>> scalarElementNodeFieldAndComponentNames() = 0;
|
||||
|
||||
@@ -322,8 +322,8 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts )
|
||||
|
||||
caf::ProgressInfo modelProgress( instanceRepository.size() * (size_t)( 2 + 4 ), "Reading Odb Parts" );
|
||||
|
||||
int instanceCount = 0;
|
||||
for ( iter.first(); !iter.isDone(); iter.next(), instanceCount++ )
|
||||
int partIdx = 0;
|
||||
for ( iter.first(); !iter.isDone(); iter.next(), partIdx++ )
|
||||
{
|
||||
modelProgress.setProgressDescription( QString( iter.currentKey().cStr() ) + ": Reading Nodes" );
|
||||
m_nodeIdToIdxMaps.push_back( std::map<int, int>() );
|
||||
@@ -404,7 +404,14 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts )
|
||||
}
|
||||
}
|
||||
|
||||
femPart->setElementPartId( femParts->partCount() );
|
||||
// read element sets
|
||||
auto setNames = elementSetNames( partIdx, femPart->name() );
|
||||
for ( int setIndex = 0; setIndex < (int)setNames.size(); setIndex++ )
|
||||
{
|
||||
femPart->addElementSet( setNames[setIndex], elementSet( partIdx, femPart->name(), setIndex ) );
|
||||
}
|
||||
|
||||
femPart->setElementPartId( partIdx );
|
||||
femParts->addFemPart( femPart );
|
||||
|
||||
modelProgress.incrementProgress();
|
||||
@@ -507,7 +514,7 @@ int RifOdbReader::frameCount( int stepIndex ) const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<std::string> RifOdbReader::elementSetNames( int partIndex )
|
||||
std::vector<std::string> RifOdbReader::elementSetNames( int partIndex, std::string partInstanceName )
|
||||
{
|
||||
CVF_ASSERT( m_odb != NULL );
|
||||
|
||||
@@ -533,7 +540,16 @@ std::vector<std::string> RifOdbReader::elementSetNames( int partIndex )
|
||||
for ( setIt.first(); !setIt.isDone(); setIt.next() )
|
||||
{
|
||||
const odb_Set& set = setIt.currentValue();
|
||||
setNames.push_back( set.name().CStr() );
|
||||
|
||||
auto names = set.instanceNames();
|
||||
for ( int i = 0; i < names.size(); i++ )
|
||||
{
|
||||
if ( names[i].CStr() == partInstanceName )
|
||||
{
|
||||
setNames.push_back( set.name().CStr() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -549,17 +565,14 @@ std::vector<std::string> RifOdbReader::elementSetNames( int partIndex )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<size_t> RifOdbReader::elementSet( int partIndex, int setIndex )
|
||||
std::vector<size_t> RifOdbReader::elementSet( int partIndex, std::string partName, int setIndex )
|
||||
{
|
||||
CVF_ASSERT( m_odb != NULL );
|
||||
|
||||
std::vector<std::string> setNames = elementSetNames( partIndex );
|
||||
const odb_Assembly& rootAssembly = m_odb->constRootAssembly();
|
||||
const odb_Assembly& rootAssembly = m_odb->constRootAssembly();
|
||||
const odb_Set& set = rootAssembly.elementSets()[odb_String( m_partElementSetNames[partIndex][setIndex].c_str() )];
|
||||
|
||||
const odb_Set& set = rootAssembly.elementSets()[odb_String( setNames[setIndex].c_str() )];
|
||||
odb_SequenceString instanceNames = set.instanceNames();
|
||||
|
||||
const odb_SequenceElement& setElements = set.elements( instanceNames[partIndex] );
|
||||
const odb_SequenceElement& setElements = set.elements( partName.c_str() );
|
||||
int elementCount = setElements.size();
|
||||
|
||||
std::vector<size_t> elementIndexes;
|
||||
|
||||
@@ -49,8 +49,8 @@ public:
|
||||
std::vector<double> frameTimes( int stepIndex ) const override;
|
||||
int frameCount( int stepIndex ) const override;
|
||||
|
||||
std::vector<std::string> elementSetNames( int partIndex ) override;
|
||||
std::vector<size_t> elementSet( int partIndex, int setIndex ) override;
|
||||
std::vector<std::string> elementSetNames( int partIndex, std::string partName ) override;
|
||||
std::vector<size_t> elementSet( int partIndex, std::string partName, int setIndex ) override;
|
||||
|
||||
std::map<std::string, std::vector<std::string>> scalarNodeFieldAndComponentNames() override;
|
||||
std::map<std::string, std::vector<std::string>> scalarElementNodeFieldAndComponentNames() override;
|
||||
|
||||
Reference in New Issue
Block a user