Merge pull request #8376 from OPM/fault_visibilityupdates

Faults: Add Visibiliy mode for overlapping area
This commit is contained in:
jonjenssen
2021-12-17 15:39:22 +01:00
committed by GitHub
parent b495284b18
commit 43f298fa97
11 changed files with 240 additions and 25 deletions

View File

@@ -29,16 +29,20 @@
#include "cvfScalarMapper.h"
#include "RigFault.h"
#include "RigNNCData.h"
#include "RigNncConnection.h"
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RivFaultGeometryGenerator::RivFaultGeometryGenerator( const cvf::StructGridInterface* grid,
const RigFault* fault,
RigNNCData* nncData,
bool computeNativeFaultFaces )
: m_grid( grid )
, m_fault( fault )
, m_computeNativeFaultFaces( computeNativeFaultFaces )
, m_nncData( nncData )
{
m_quadMapper = new cvf::StructGridQuadToCellFaceMapper;
m_triangleMapper = new cvf::StuctGridTriangleToCellFaceMapper( m_quadMapper.p() );
@@ -54,9 +58,9 @@ RivFaultGeometryGenerator::~RivFaultGeometryGenerator()
//--------------------------------------------------------------------------------------------------
/// Generate surface drawable geo from the specified region
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::generateSurface()
cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::generateSurface( bool onlyShowFacesWithDefinedNeighbors )
{
computeArrays();
computeArrays( onlyShowFacesWithDefinedNeighbors );
CVF_ASSERT( m_vertices.notNull() );
@@ -119,7 +123,28 @@ cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::createOutlineMeshDrawable(
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivFaultGeometryGenerator::computeArrays()
bool RivFaultGeometryGenerator::hasConnection( size_t cellIdx,
cvf::StructGridInterface::FaceType face,
RigConnectionContainer& conns )
{
cvf::StructGridInterface::FaceType oppositeFace = cvf::StructGridInterface::oppositeFace( face );
for ( size_t i = 0; i < conns.size(); i++ )
{
auto& r = conns[i];
if ( ( r.c1GlobIdx() == cellIdx ) && ( r.face() == face ) && r.hasCommonArea() ) return true;
if ( ( r.c2GlobIdx() == cellIdx ) && ( r.face() == oppositeFace ) && r.hasCommonArea() ) return true;
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivFaultGeometryGenerator::computeArrays( bool onlyShowFacesWithDefinedNeighbors )
{
std::vector<cvf::Vec3f> vertices;
m_quadMapper->quadToCellIndexMap().clear();
@@ -127,6 +152,8 @@ void RivFaultGeometryGenerator::computeArrays()
cvf::Vec3d offset = m_grid->displayModelOffset();
auto& connections = m_nncData->connections();
const std::vector<RigFault::FaultFace>& faultFaces = m_fault->faultFaces();
#pragma omp parallel for
@@ -135,23 +162,25 @@ void RivFaultGeometryGenerator::computeArrays()
size_t cellIndex = faultFaces[fIdx].m_nativeReservoirCellIndex;
cvf::StructGridInterface::FaceType face = faultFaces[fIdx].m_nativeFace;
if ( cellIndex >= m_cellVisibility->size() ) continue;
if ( !m_computeNativeFaultFaces )
{
cellIndex = faultFaces[fIdx].m_oppositeReservoirCellIndex;
face = cvf::StructGridInterface::oppositeFace( faultFaces[fIdx].m_nativeFace );
face = cvf::StructGridInterface::oppositeFace( face );
}
if ( cellIndex >= m_cellVisibility->size() ) continue;
if ( !( *m_cellVisibility )[cellIndex] ) continue;
if ( onlyShowFacesWithDefinedNeighbors && !hasConnection( cellIndex, face, connections ) ) continue;
cvf::Vec3d cornerVerts[8];
m_grid->cellCornerVertices( cellIndex, cornerVerts );
cvf::ubyte faceConn[4];
m_grid->cellFaceVertexIndices( face, faceConn );
// Critical section to avoid two threads accessing the arrays at the same time.
// Critical section to avoid two threads accessing the arrays at the same time.
#pragma omp critical( critical_section_RivFaultGeometryGenerator_computeArrays )
{
int n;

View File

@@ -32,6 +32,8 @@ class Transform;
class Part;
} // namespace cvf
class RigNNCData;
class RigConnectionContainer;
class RigFault;
//==================================================================================================
@@ -42,7 +44,10 @@ class RigFault;
class RivFaultGeometryGenerator : public cvf::Object
{
public:
RivFaultGeometryGenerator( const cvf::StructGridInterface* grid, const RigFault* fault, bool computeNativeFaultFaces );
RivFaultGeometryGenerator( const cvf::StructGridInterface* grid,
const RigFault* fault,
RigNNCData* nncData,
bool computeNativeFaultFaces );
~RivFaultGeometryGenerator() override;
void setCellVisibility( const cvf::UByteArray* cellVisibilities );
@@ -53,18 +58,21 @@ public:
const cvf::StuctGridTriangleToCellFaceMapper* triangleToCellFaceMapper() { return m_triangleMapper.p(); }
// Generated geometry
cvf::ref<cvf::DrawableGeo> generateSurface();
cvf::ref<cvf::DrawableGeo> generateSurface( bool onlyShowFacesWithDefinedNeighbors );
cvf::ref<cvf::DrawableGeo> createMeshDrawable();
cvf::ref<cvf::DrawableGeo> createOutlineMeshDrawable( double creaseAngle );
private:
void computeArrays();
void computeArrays( bool onlyShowFacesWithDefinedNeighbors );
bool hasConnection( size_t cellIdx, cvf::StructGridInterface::FaceType face, RigConnectionContainer& conns );
private:
// Input
cvf::cref<cvf::StructGridInterface> m_grid;
cvf::cref<RigFault> m_fault;
cvf::cref<cvf::UByteArray> m_cellVisibility;
cvf::ref<RigNNCData> m_nncData;
bool m_computeNativeFaultFaces;

View File

@@ -24,6 +24,7 @@
#include "RigCaseCellResultsData.h"
#include "RigMainGrid.h"
#include "RigNNCData.h"
#include "RigResultAccessor.h"
#include "RimEclipseCase.h"
@@ -74,8 +75,11 @@ RivFaultPartMgr::RivFaultPartMgr( const RigGridBase* grid,
cvf::ref<cvf::Array<size_t>> connIdxes = new cvf::Array<size_t>;
connIdxes->assign( rimFault->faultGeometry()->connectionIndices() );
m_nativeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), true );
m_oppositeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), false );
m_nativeFaultGenerator =
new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), true );
m_oppositeFaultGenerator =
new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), false );
m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray;
m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray;
@@ -280,7 +284,8 @@ void RivFaultPartMgr::generatePartGeometry()
bool useBufferObjects = true;
// Surface geometry
{
cvf::ref<cvf::DrawableGeo> geo = m_nativeFaultGenerator->generateSurface();
cvf::ref<cvf::DrawableGeo> geo =
m_nativeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() );
if ( geo.notNull() )
{
geo->computeNormals();
@@ -333,7 +338,8 @@ void RivFaultPartMgr::generatePartGeometry()
// Surface geometry
{
cvf::ref<cvf::DrawableGeo> geo = m_oppositeFaultGenerator->generateSurface();
cvf::ref<cvf::DrawableGeo> geo =
m_oppositeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() );
if ( geo.notNull() )
{
geo->computeNormals();

View File

@@ -37,6 +37,7 @@ class RimEclipseCellColors;
class RimCellEdgeColors;
class RimFaultInViewCollection;
class RigGridBase;
class RimFaultInViewCollection;
class RimFaultInView;
class RivFaultGeometryGenerator;

View File

@@ -118,8 +118,6 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model )
forceDisplayOfFault = true;
}
// qDebug() << forceDisplayOfFault;
cvf::ModelBasicList parts;
for ( size_t i = 0; i < faultCollection->faults.size(); i++ )