mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3546 Remove Pressure Depletion candidates that are definitely going away.
This commit is contained in:
@@ -188,251 +188,6 @@ std::map<size_t, double>
|
||||
return originalLumpedMatrixToFractureTrans;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::map<size_t, double>
|
||||
RigTransmissibilityCondenser::scaleMatrixToFracTransByMatrixFracInitialDP(const RigActiveCellInfo* actCellInfo,
|
||||
double initialWellPressure,
|
||||
double currentWellPressure,
|
||||
const std::vector<double>& initialMatrixPressures,
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
bool normalizeByMax)
|
||||
{
|
||||
// Solve for fracture pressures, current and initial
|
||||
std::map<size_t, double> initialFractureCellToPressureMap =
|
||||
solveForFracturePressures(actCellInfo, initialMatrixPressures, initialWellPressure);
|
||||
std::map<size_t, double> currentFractureCellToPressureMap =
|
||||
solveForFracturePressures(actCellInfo, currentMatrixPressures, currentWellPressure);
|
||||
|
||||
// Calculate maximum pressure drop
|
||||
double maxInitialPressureDrop = 0.0;
|
||||
if (normalizeByMax)
|
||||
{
|
||||
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
|
||||
{
|
||||
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
size_t globalFractureCellIdx = it->first.m_globalCellIdx;
|
||||
double initialFracturePressure = initialFractureCellToPressureMap[globalFractureCellIdx];
|
||||
|
||||
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
|
||||
{
|
||||
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
|
||||
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < initialMatrixPressures.size());
|
||||
|
||||
double initialMatrixPressure = initialMatrixPressures[eclipseResultIndex];
|
||||
double initialPressureDrop = std::abs(initialMatrixPressure - initialFracturePressure);
|
||||
maxInitialPressureDrop = std::max(maxInitialPressureDrop, initialPressureDrop);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::map<size_t, double> originalLumpedMatrixToFractureTrans; // Sum(T_mf)
|
||||
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
|
||||
{
|
||||
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
size_t globalFractureCellIdx = it->first.m_globalCellIdx;
|
||||
double currentFracturePressure = currentFractureCellToPressureMap[globalFractureCellIdx];
|
||||
double initialFracturePressure = initialFractureCellToPressureMap[globalFractureCellIdx];
|
||||
|
||||
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
|
||||
{
|
||||
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
|
||||
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
|
||||
|
||||
double currentMatrixPressure = currentMatrixPressures[eclipseResultIndex];
|
||||
double pressureDrop = std::abs(currentMatrixPressure - currentFracturePressure);
|
||||
|
||||
// Add to Sum(T_mf)
|
||||
originalLumpedMatrixToFractureTrans[globalMatrixCellIdx] += jt->second;
|
||||
|
||||
if (normalizeByMax)
|
||||
{
|
||||
double pressureScaling = pressureDrop / maxInitialPressureDrop;
|
||||
jt->second *= pressureScaling;
|
||||
}
|
||||
else
|
||||
{
|
||||
double initialMatrixPressure = initialMatrixPressures[eclipseResultIndex];
|
||||
double initialPressureDrop = std::abs(initialMatrixPressure - initialFracturePressure);
|
||||
double pressureScaling = pressureDrop / initialPressureDrop;
|
||||
jt->second *= pressureScaling;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return originalLumpedMatrixToFractureTrans;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::map<size_t, double>
|
||||
RigTransmissibilityCondenser::solveForFracturePressures(const RigActiveCellInfo* actCellInfo,
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
double currentWellPressure)
|
||||
{
|
||||
Eigen::VectorXd externalPressures(m_Tie.cols());
|
||||
{
|
||||
size_t rowIndex = 0u;
|
||||
for (const CellAddress& externalCell : m_externalCellAddrSet)
|
||||
{
|
||||
if (externalCell.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(externalCell.m_globalCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
|
||||
externalPressures[rowIndex++] = currentMatrixPressures[eclipseResultIndex];
|
||||
}
|
||||
else
|
||||
{
|
||||
CVF_ASSERT(externalCell.m_cellIndexSpace == CellAddress::WELL);
|
||||
externalPressures[rowIndex++] = currentWellPressure;
|
||||
}
|
||||
}
|
||||
}
|
||||
Eigen::VectorXd fracturePressures = m_TiiInv * (-m_Tie * externalPressures);
|
||||
|
||||
// Extract fracture pressures into a map
|
||||
std::map<size_t, double> fractureCellToPressureMap;
|
||||
{
|
||||
size_t rowIndex = 0u;
|
||||
for (const ConnectionTransmissibility& connectionTrans : m_neighborTransmissibilities)
|
||||
{
|
||||
if (connectionTrans.first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
fractureCellToPressureMap[connectionTrans.first.m_globalCellIdx] = fracturePressures[rowIndex++];
|
||||
}
|
||||
}
|
||||
}
|
||||
return fractureCellToPressureMap;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::map<size_t, double>
|
||||
RigTransmissibilityCondenser::scaleMatrixToFracTransByMatrixFracFlux(const RigActiveCellInfo* actCellInfo,
|
||||
double currentWellPressure,
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
bool divideByAverageFlux)
|
||||
{
|
||||
// Solve for fracture pressures
|
||||
Eigen::VectorXd matrixPressures(m_Tie.cols());
|
||||
{
|
||||
size_t rowIndex = 0u;
|
||||
for (const CellAddress& externalCell : m_externalCellAddrSet)
|
||||
{
|
||||
if (externalCell.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(externalCell.m_globalCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
|
||||
matrixPressures[rowIndex++] = currentMatrixPressures[eclipseResultIndex];
|
||||
}
|
||||
else
|
||||
{
|
||||
CVF_ASSERT(externalCell.m_cellIndexSpace == CellAddress::WELL);
|
||||
matrixPressures[rowIndex++] = currentWellPressure;
|
||||
}
|
||||
}
|
||||
}
|
||||
Eigen::VectorXd fracturePressures = m_TiiInv * (m_Tie * matrixPressures * -1.0);
|
||||
|
||||
// Extract fracture pressures into a map
|
||||
std::map<size_t, double> fractureCellToPressureMap;
|
||||
{
|
||||
size_t rowIndex = 0u;
|
||||
for (const ConnectionTransmissibility& connectionTrans : m_neighborTransmissibilities)
|
||||
{
|
||||
if (connectionTrans.first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
fractureCellToPressureMap[connectionTrans.first.m_globalCellIdx] = fracturePressures[rowIndex++];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate maximum and average pressure drop
|
||||
double maxFlux = 0.0;
|
||||
RiaWeightedMeanCalculator<double> meanCalculator;
|
||||
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
|
||||
{
|
||||
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
size_t globalFractureCellIdx = it->first.m_globalCellIdx;
|
||||
double fracturePressure = fractureCellToPressureMap[globalFractureCellIdx];
|
||||
|
||||
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
|
||||
{
|
||||
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
|
||||
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
|
||||
|
||||
double matrixPressure = currentMatrixPressures[eclipseResultIndex];
|
||||
double pressureDrop = std::abs(matrixPressure - fracturePressure);
|
||||
double flux = pressureDrop * jt->second;
|
||||
meanCalculator.addValueAndWeight(flux, 1.0);
|
||||
maxFlux = std::max(maxFlux, flux);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (divideByAverageFlux && !meanCalculator.validAggregatedWeight())
|
||||
{
|
||||
return std::map<size_t, double>();
|
||||
}
|
||||
else if (!divideByAverageFlux && maxFlux < 1.0e-9)
|
||||
{
|
||||
return std::map<size_t, double>();
|
||||
}
|
||||
double averageFlux = meanCalculator.weightedMean();
|
||||
|
||||
std::map<size_t, double> originalLumpedMatrixToFractureTrans; // Sum(T_mf)
|
||||
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
|
||||
{
|
||||
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
|
||||
{
|
||||
size_t globalFractureCellIdx = it->first.m_globalCellIdx;
|
||||
double fracturePressure = fractureCellToPressureMap[globalFractureCellIdx];
|
||||
|
||||
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
|
||||
{
|
||||
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
|
||||
{
|
||||
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
|
||||
|
||||
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
|
||||
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
|
||||
|
||||
double matrixPressure = currentMatrixPressures[eclipseResultIndex];
|
||||
double pressureDrop = std::abs(matrixPressure - fracturePressure);
|
||||
double flux = jt->second * pressureDrop;
|
||||
// Add to Sum(T_mf)
|
||||
originalLumpedMatrixToFractureTrans[globalMatrixCellIdx] += jt->second;
|
||||
|
||||
double pressureScaling = flux / (divideByAverageFlux ? averageFlux : maxFlux);
|
||||
jt->second *= pressureScaling;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return originalLumpedMatrixToFractureTrans;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -102,21 +102,6 @@ public:
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
bool normalizeByMax);
|
||||
|
||||
std::map<size_t, double> scaleMatrixToFracTransByMatrixFracInitialDP(const RigActiveCellInfo* actCellInfo,
|
||||
double initialWellPressure,
|
||||
double currentWellPressure,
|
||||
const std::vector<double>& initialMatrixPressures,
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
bool normalizeByMax);
|
||||
|
||||
std::map<size_t, double> solveForFracturePressures(const RigActiveCellInfo* actCellInfo, const std::vector<double> ¤tMatrixPressures, double currentWellPressure);
|
||||
|
||||
|
||||
std::map<size_t, double> scaleMatrixToFracTransByMatrixFracFlux(const RigActiveCellInfo* actCellInfo,
|
||||
double currentWellPressure,
|
||||
const std::vector<double>& currentMatrixPressures,
|
||||
bool divideByAverageFlux);
|
||||
|
||||
std::map<size_t, double> calculateFicticiousFractureToWellTransmissibilities();
|
||||
std::map<size_t, double>
|
||||
calculateEffectiveMatrixToWellTransmissibilities(const std::map<size_t, double>& originalLumpedMatrixToFractureTrans,
|
||||
|
||||
Reference in New Issue
Block a user