mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#1291 The accumulated flow from branches with segment count <= 3 is now shown as direct inflow on the "master" branch. In pseudo length mode they are plotted as pure lines at the "top" of the cell/segement of the stem, to separate such contributions from real cell connections on the stem
This commit is contained in:
parent
1e1c5b0398
commit
38b4e3b729
@ -338,7 +338,7 @@ void RigAccWellFlowCalculator::calculateAccumulatedFlowPrConnection(size_t branc
|
|||||||
{
|
{
|
||||||
const std::vector<RigWellResultPoint>& branchCells = m_pipeBranchesCellIds[branchIdx];
|
const std::vector<RigWellResultPoint>& branchCells = m_pipeBranchesCellIds[branchIdx];
|
||||||
|
|
||||||
std::vector<size_t> resPointToConnectionIndexFromBottom = wrpToConnectionIndexFromBottom(branchCells);
|
std::vector<size_t> resPointUniqueIndexFromBottom = wrpToUniqueWrpIndexFromBottom(branchCells);
|
||||||
|
|
||||||
size_t prevConnIndx = -1;
|
size_t prevConnIndx = -1;
|
||||||
int clSegIdx = static_cast<int>(branchCells.size()) - 1;
|
int clSegIdx = static_cast<int>(branchCells.size()) - 1;
|
||||||
@ -349,13 +349,13 @@ void RigAccWellFlowCalculator::calculateAccumulatedFlowPrConnection(size_t branc
|
|||||||
{
|
{
|
||||||
// Skip point if referring to the same cell as the previous centerline segment did
|
// Skip point if referring to the same cell as the previous centerline segment did
|
||||||
{
|
{
|
||||||
if ( resPointToConnectionIndexFromBottom[clSegIdx] == prevConnIndx )
|
if ( resPointUniqueIndexFromBottom[clSegIdx] == prevConnIndx )
|
||||||
{
|
{
|
||||||
--clSegIdx;
|
--clSegIdx;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
prevConnIndx = resPointToConnectionIndexFromBottom[clSegIdx];
|
prevConnIndx = resPointUniqueIndexFromBottom[clSegIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accumulate the connection-cell's fraction flows
|
// Accumulate the connection-cell's fraction flows
|
||||||
@ -378,7 +378,7 @@ void RigAccWellFlowCalculator::calculateAccumulatedFlowPrConnection(size_t branc
|
|||||||
|
|
||||||
// Add the total accumulated (fraction) flows from any branches connected to this cell
|
// Add the total accumulated (fraction) flows from any branches connected to this cell
|
||||||
|
|
||||||
size_t connNumFromTop = connectionIndexFromTop(resPointToConnectionIndexFromBottom, clSegIdx) + startConnectionNumberFromTop;
|
size_t connNumFromTop = connectionIndexFromTop(resPointUniqueIndexFromBottom, clSegIdx) + startConnectionNumberFromTop;
|
||||||
|
|
||||||
std::vector<size_t> downStreamBranchIndices = findDownStreamBranchIdxs(branchCells[clSegIdx]);
|
std::vector<size_t> downStreamBranchIndices = findDownStreamBranchIdxs(branchCells[clSegIdx]);
|
||||||
for ( size_t dsBidx : downStreamBranchIndices )
|
for ( size_t dsBidx : downStreamBranchIndices )
|
||||||
@ -388,6 +388,11 @@ void RigAccWellFlowCalculator::calculateAccumulatedFlowPrConnection(size_t branc
|
|||||||
{
|
{
|
||||||
calculateAccumulatedFlowPrConnection(dsBidx, connNumFromTop);
|
calculateAccumulatedFlowPrConnection(dsBidx, connNumFromTop);
|
||||||
addDownStreamBranchFlow(&accFlowPrTracer, downStreamBranchFlow);
|
addDownStreamBranchFlow(&accFlowPrTracer, downStreamBranchFlow);
|
||||||
|
if (m_pipeBranchesCellIds[dsBidx].size() <= 3)
|
||||||
|
{
|
||||||
|
// Short branch. Will not be visible. Show branch flow as addition to this connections direct flow
|
||||||
|
addDownStreamBranchFlow(&flowPrTracer, downStreamBranchFlow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -483,6 +488,11 @@ void RigAccWellFlowCalculator::calculateFlowPrPseudoLength(size_t branchIdx, dou
|
|||||||
{
|
{
|
||||||
calculateFlowPrPseudoLength(dsBidx, pseudoLengthFromTop_upper);
|
calculateFlowPrPseudoLength(dsBidx, pseudoLengthFromTop_upper);
|
||||||
addDownStreamBranchFlow(&accFlowPrTracer, downStreamBranchFlow);
|
addDownStreamBranchFlow(&accFlowPrTracer, downStreamBranchFlow);
|
||||||
|
if (m_pipeBranchesCellIds[dsBidx].size() <= 3)
|
||||||
|
{
|
||||||
|
// Short branch. Will not be visible. Show branch flow as addition to this connections direct flow
|
||||||
|
addDownStreamBranchFlow(&flowPrTracer, downStreamBranchFlow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,48 +609,7 @@ std::vector<double> RigAccWellFlowCalculator::calculateFlowPrTracer(const RigWel
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<double> RigAccWellFlowCalculator::calculateFlowPrTracer(const RigWellResultPoint& wellCell ) const
|
std::vector<size_t> RigAccWellFlowCalculator::wrpToUniqueWrpIndexFromBottom(const std::vector<RigWellResultPoint> &branchCells) const
|
||||||
{
|
|
||||||
std::vector<double> flowPrTracer(m_tracerNames.size(), 0.0);
|
|
||||||
|
|
||||||
if ( m_tracerCellFractionValues )
|
|
||||||
{
|
|
||||||
if ( wellCell.isCell() && wellCell.m_isOpen )
|
|
||||||
{
|
|
||||||
size_t resCellIndex = m_cellIndexCalculator.resultCellIndex(wellCell.m_gridIndex,
|
|
||||||
wellCell.m_gridCellIndex);
|
|
||||||
size_t tracerIdx = 0;
|
|
||||||
double totalTracerFractionInCell = 0.0;
|
|
||||||
for ( const auto & tracerFractionIt: (*m_tracerCellFractionValues) )
|
|
||||||
{
|
|
||||||
double cellTracerFraction = (*tracerFractionIt.second)[resCellIndex];
|
|
||||||
if ( cellTracerFraction != HUGE_VAL && cellTracerFraction == cellTracerFraction )
|
|
||||||
{
|
|
||||||
double tracerFlow = cellTracerFraction * wellCell.flowRate();
|
|
||||||
flowPrTracer[tracerIdx] = tracerFlow;
|
|
||||||
|
|
||||||
totalTracerFractionInCell += cellTracerFraction;
|
|
||||||
}
|
|
||||||
tracerIdx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
double reservoirFraction = 1.0 - totalTracerFractionInCell;
|
|
||||||
double reservoirTracerFlow = reservoirFraction * wellCell.flowRate();
|
|
||||||
flowPrTracer[tracerIdx] = reservoirTracerFlow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
flowPrTracer[0] = wellCell.flowRate();
|
|
||||||
}
|
|
||||||
|
|
||||||
return flowPrTracer;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
std::vector<size_t> RigAccWellFlowCalculator::wrpToConnectionIndexFromBottom(const std::vector<RigWellResultPoint> &branchCells) const
|
|
||||||
{
|
{
|
||||||
std::vector<size_t> resPointToConnectionIndexFromBottom;
|
std::vector<size_t> resPointToConnectionIndexFromBottom;
|
||||||
resPointToConnectionIndexFromBottom.resize(branchCells.size(), -1);
|
resPointToConnectionIndexFromBottom.resize(branchCells.size(), -1);
|
||||||
|
@ -93,7 +93,6 @@ private:
|
|||||||
void calculateFlowPrPseudoLength(size_t branchIdx,
|
void calculateFlowPrPseudoLength(size_t branchIdx,
|
||||||
double startPseudoLengthFromTop);
|
double startPseudoLengthFromTop);
|
||||||
|
|
||||||
std::vector<double> calculateFlowPrTracer(const RigWellResultPoint& wellCell) const;
|
|
||||||
std::vector<double> calculateFlowPrTracer(const RigWellResultPoint& wellCell,
|
std::vector<double> calculateFlowPrTracer(const RigWellResultPoint& wellCell,
|
||||||
const std::vector<double>& currentAccumulatedFlowPrTracer ) const;
|
const std::vector<double>& currentAccumulatedFlowPrTracer ) const;
|
||||||
void sortTracers();
|
void sortTracers();
|
||||||
@ -103,7 +102,7 @@ private:
|
|||||||
const std::vector<QString>& tracersToGroup);
|
const std::vector<QString>& tracersToGroup);
|
||||||
|
|
||||||
bool isWellFlowConsistent(bool isProducer) const;
|
bool isWellFlowConsistent(bool isProducer) const;
|
||||||
std::vector<size_t> wrpToConnectionIndexFromBottom( const std::vector<RigWellResultPoint> &branchCells) const;
|
std::vector<size_t> wrpToUniqueWrpIndexFromBottom( const std::vector<RigWellResultPoint> &branchCells) const;
|
||||||
static size_t connectionIndexFromTop( const std::vector<size_t>& resPointToConnectionIndexFromBottom, size_t clSegIdx) ;
|
static size_t connectionIndexFromTop( const std::vector<size_t>& resPointToConnectionIndexFromBottom, size_t clSegIdx) ;
|
||||||
std::vector<size_t> findDownStreamBranchIdxs( const RigWellResultPoint& connectionPoint) const;
|
std::vector<size_t> findDownStreamBranchIdxs( const RigWellResultPoint& connectionPoint) const;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user