Sector export: Correct connection factors for refinement perpendicular to wells

Lateral refinement reduces the Peaceman pressure equivalent radius r0 of the
completed center sub-cell. Explicit CF is scaled by
(ln(r0_old/rw)+S)/(ln(r0_new/rw)+S), and an explicit PR item is updated to r0_new.
r0_old is taken from PR, or computed from the original cell size and permeability.
This commit is contained in:
Kristian Bendiksen committed 2026-10-21 14:42:53 +02:00
1 parent 9a01e09ecd
commit b84eea5cb1
4 files changed
+326 -20

No files matched your search

@@ -22,12 +22,14 @@
#include "cafVecIjk.h"
#include "cvfArray.h"
#include "cvfVector3.h"
#include <QString>
#include <expected>
#include <functional>
#include <map>
#include <optional>
#include <set>
#include <string>
#include <tuple>
@@ -108,10 +110,24 @@ public:
static ConnectionDirectionMap connectionDirections( const std::vector<Opm::DeckKeyword>& compdatKeywords );
// Size and permeability of an original grid cell, ordered I/X, J/Y, K/Z
struct ConnectionCellProperties
{
cvf::Vec3d cellSize;
cvf::Vec3d permeability;
};
using ConnectionCellPropertiesProvider = std::function<std::optional<ConnectionCellProperties>( const caf::VecIjk0& originalIjk )>;
static ConnectionCellPropertiesProvider connectionCellPropertiesProvider( RimEclipseCase* eclipseCase );
// Refined connections along the penetration direction are split into one record per sub-cell with
// explicit CF and KH scaled by the sub-cell length fraction. Perpendicular directions use the center sub-cell.
// explicit CF and KH scaled by the sub-cell length fraction. Perpendicular directions use the center sub-cell,
// and explicit CF is corrected for the smaller Peaceman pressure equivalent radius of the refined cell.
static std::expected<std::vector<Opm::DeckRecord>, QString>
processCompdatRecord( const Opm::DeckRecord& record, const std::string& wellName, const RigSimulationInputSettings& settings );
processCompdatRecord( const Opm::DeckRecord& record,
const std::string& wellName,
const RigSimulationInputSettings& settings,
const ConnectionCellPropertiesProvider& cellProperties = {} );
// Segment records are split into one record per sub-cell along the connection penetration direction,
// with the MD interval divided by the sub-cell length fractions
@@ -183,7 +199,8 @@ private:
static std::expected<void, QString>
addFaultsToDeckFile( RimEclipseCase* eclipseCase, const RigSimulationInputSettings& settings, RifOpmFlowDeckFile& deckFile );
static std::expected<void, QString> filterAndUpdateWellKeywords( std::set<std::string>& validWellNames,
static std::expected<void, QString> filterAndUpdateWellKeywords( RimEclipseCase* eclipseCase,
std::set<std::string>& validWellNames,
const RigSimulationInputSettings& settings,
RifOpmFlowDeckFile& deckFile );