mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-26 07:00:17 -05:00
#12957 Sector Model Export: add non-uniform refinement support to faults code path
Add RigNonUniformRefinement overloads for extractFaults and faultsKeyword, following the existing dual-overload pattern. The Vec3st overloads now delegate via fromUniform() to preserve backward compatibility. Update addFaultsToDeckFile to call effectiveRefinement() instead of refinement().
This commit is contained in:
1 parent
5d6aba0f70
commit
4aa0910db3
5 files changed
+189
-14
No files matched your search
@@ -558,6 +558,143 @@ Opm::DeckKeyword faultsKeyword( const RigMainGrid* mainGrid, const cvf::Vec3st&
|
||||
return kw;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
Opm::DeckKeyword faultsKeyword( const RigMainGrid* mainGrid,
|
||||
const cvf::Vec3st& min,
|
||||
const cvf::Vec3st& max,
|
||||
const RigNonUniformRefinement& refinement )
|
||||
{
|
||||
if ( mainGrid == nullptr )
|
||||
{
|
||||
return Opm::DeckKeyword();
|
||||
}
|
||||
|
||||
// Helper lambda to convert FaceType to Eclipse face string
|
||||
auto faceTypeToString = []( cvf::StructGridInterface::FaceType faceType ) -> std::string
|
||||
{
|
||||
switch ( faceType )
|
||||
{
|
||||
case cvf::StructGridInterface::POS_I:
|
||||
return "I";
|
||||
case cvf::StructGridInterface::NEG_I:
|
||||
return "I-";
|
||||
case cvf::StructGridInterface::POS_J:
|
||||
return "J";
|
||||
case cvf::StructGridInterface::NEG_J:
|
||||
return "J-";
|
||||
case cvf::StructGridInterface::POS_K:
|
||||
return "K";
|
||||
case cvf::StructGridInterface::NEG_K:
|
||||
return "K-";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
using F = Opm::ParserKeywords::FAULTS;
|
||||
|
||||
Opm::DeckKeyword kw{ Opm::ParserKeywords::FAULTS() };
|
||||
|
||||
// Process all faults in the grid
|
||||
const cvf::Collection<RigFault>& faults = mainGrid->faults();
|
||||
for ( const auto& fault : faults )
|
||||
{
|
||||
// Skip undefined faults
|
||||
if ( fault->name() == RiaResultNames::undefinedGridFaultName() || fault->name() == RiaResultNames::undefinedGridFaultWithInactiveName() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Extract fault cell and face data for this fault
|
||||
std::vector<RigFault::CellAndFace> faultCellAndFaces =
|
||||
RifEclipseInputFileTools::extractFaults( mainGrid, fault->faultFaces(), min, max, refinement );
|
||||
|
||||
// Group consecutive cells in K direction and create fault records
|
||||
size_t lastI = std::numeric_limits<size_t>::max();
|
||||
size_t lastJ = std::numeric_limits<size_t>::max();
|
||||
size_t lastK = std::numeric_limits<size_t>::max();
|
||||
size_t startK = std::numeric_limits<size_t>::max();
|
||||
cvf::StructGridInterface::FaceType lastFaceType = cvf::StructGridInterface::FaceType::NO_FACE;
|
||||
|
||||
for ( const RigFault::CellAndFace& faultCellAndFace : faultCellAndFaces )
|
||||
{
|
||||
size_t i, j, k;
|
||||
cvf::StructGridInterface::FaceType faceType;
|
||||
std::tie( i, j, k, faceType ) = faultCellAndFace;
|
||||
|
||||
// Check if we need to write out the previous range
|
||||
if ( i != lastI || j != lastJ || lastFaceType != faceType || k != lastK + 1 )
|
||||
{
|
||||
// Write out previous fault line if valid
|
||||
if ( lastFaceType != cvf::StructGridInterface::FaceType::NO_FACE )
|
||||
{
|
||||
// Convert from 0-based to 1-based Eclipse indexing
|
||||
int i1 = static_cast<int>( lastI ) + 1;
|
||||
int j1 = static_cast<int>( lastJ ) + 1;
|
||||
int k1 = static_cast<int>( startK ) + 1;
|
||||
int k2 = static_cast<int>( lastK ) + 1;
|
||||
|
||||
std::string faceStr = faceTypeToString( lastFaceType );
|
||||
|
||||
// Create a record for this fault line
|
||||
std::vector<Opm::DeckItem> items;
|
||||
items.push_back( RifOpmDeckTools::item( F::NAME::itemName, fault->name().toStdString() ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IX1::itemName, i1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IX2::itemName, i1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IY1::itemName, j1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IY2::itemName, j1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IZ1::itemName, k1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IZ2::itemName, k2 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::FACE::itemName, faceStr ) );
|
||||
|
||||
kw.addRecord( Opm::DeckRecord{ std::move( items ) } );
|
||||
}
|
||||
|
||||
// Start new range
|
||||
lastI = i;
|
||||
lastJ = j;
|
||||
lastK = k;
|
||||
lastFaceType = faceType;
|
||||
startK = k;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Continue current range
|
||||
lastK = k;
|
||||
}
|
||||
}
|
||||
|
||||
// Write out final fault line for this fault if valid
|
||||
if ( lastFaceType != cvf::StructGridInterface::FaceType::NO_FACE )
|
||||
{
|
||||
// Convert from 0-based to 1-based Eclipse indexing
|
||||
int i1 = static_cast<int>( lastI ) + 1;
|
||||
int j1 = static_cast<int>( lastJ ) + 1;
|
||||
int k1 = static_cast<int>( startK ) + 1;
|
||||
int k2 = static_cast<int>( lastK ) + 1;
|
||||
|
||||
std::string faceStr = faceTypeToString( lastFaceType );
|
||||
|
||||
// Create a record for this fault line
|
||||
std::vector<Opm::DeckItem> items;
|
||||
items.push_back( RifOpmDeckTools::item( F::NAME::itemName, fault->name().toStdString() ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IX1::itemName, i1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IX2::itemName, i1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IY1::itemName, j1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IY2::itemName, j1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IZ1::itemName, k1 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::IZ2::itemName, k2 ) );
|
||||
items.push_back( RifOpmDeckTools::item( F::FACE::itemName, faceStr ) );
|
||||
|
||||
kw.addRecord( Opm::DeckRecord{ std::move( items ) } );
|
||||
}
|
||||
}
|
||||
|
||||
return kw;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include "cvfVector3.h"
|
||||
|
||||
#include "RigNonUniformRefinement.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QString>
|
||||
|
||||
@@ -68,6 +70,10 @@ Opm::DeckKeyword faultsKeyword( const RigMainGrid* mainGrid,
|
||||
const cvf::Vec3st& min = cvf::Vec3st::ZERO,
|
||||
const cvf::Vec3st& max = cvf::Vec3st::UNDEFINED,
|
||||
const cvf::Vec3st& refinement = cvf::Vec3st( 1, 1, 1 ) );
|
||||
Opm::DeckKeyword faultsKeyword( const RigMainGrid* mainGrid,
|
||||
const cvf::Vec3st& min,
|
||||
const cvf::Vec3st& max,
|
||||
const RigNonUniformRefinement& refinement );
|
||||
Opm::DeckKeyword bcconKeyword( const std::vector<RigEclipseResultTools::BorderCellFace>& borderCellFaces );
|
||||
Opm::DeckKeyword bcpropKeyword( const std::vector<RigEclipseResultTools::BorderCellFace>& boundaryConditions,
|
||||
const std::vector<Opm::DeckRecord>& boundaryConditionProperties );
|
||||
|
||||
Reference in new issue
Block a user