mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-10 15:36:09 -06:00
#3686 Completion Export : Use map based on size_t instead of RigCompletionDataGridCell
Using RigCompletionDataGridCell as key in a map causes cells with identical local IJK to be treated as same global cell. Use reservoir grid cell index (size_t) as key to be able to handle cells correctly.
This commit is contained in:
parent
1121abbfac
commit
4117e266ed
@ -206,10 +206,10 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
|
||||
|
||||
for (auto wellPath : usedWellPaths)
|
||||
{
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellAllCompletionTypes;
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellFishbones;
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellFracture;
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellPerforations;
|
||||
std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellAllCompletionTypes;
|
||||
std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellFishbones;
|
||||
std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellFracture;
|
||||
std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellPerforations;
|
||||
|
||||
// Generate completion data
|
||||
|
||||
@ -284,7 +284,7 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
|
||||
|
||||
for (auto simWell : simWells)
|
||||
{
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCell;
|
||||
std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCell;
|
||||
|
||||
std::vector<RigCompletionData> fractureCompletionData =
|
||||
RicExportFractureCompletionsImpl::generateCompdatValuesForSimWell(
|
||||
@ -2248,20 +2248,20 @@ void RicWellPathExportCompletionDataFeatureImpl::assignBranchAndSegmentNumbers(c
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicWellPathExportCompletionDataFeatureImpl::appendCompletionData(
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>* completionData,
|
||||
const std::vector<RigCompletionData>& data)
|
||||
std::map<size_t, std::vector<RigCompletionData>>* completionData,
|
||||
const std::vector<RigCompletionData>& completionsToAppend)
|
||||
{
|
||||
for (auto& completion : data)
|
||||
for (const auto& completion : completionsToAppend)
|
||||
{
|
||||
auto it = completionData->find(completion.completionDataGridCell());
|
||||
auto it = completionData->find(completion.completionDataGridCell().globalCellIndex());
|
||||
if (it != completionData->end())
|
||||
{
|
||||
it->second.push_back(completion);
|
||||
}
|
||||
else
|
||||
{
|
||||
completionData->insert(std::pair<RigCompletionDataGridCell, std::vector<RigCompletionData>>(
|
||||
completion.completionDataGridCell(), std::vector<RigCompletionData>{completion}));
|
||||
completionData->insert(std::pair<size_t, std::vector<RigCompletionData>>(
|
||||
completion.completionDataGridCell().globalCellIndex(), std::vector<RigCompletionData>{completion}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ private:
|
||||
static void assignBranchAndSegmentNumbers(const RimEclipseCase* caseToApply,
|
||||
RicMswExportInfo* exportInfo);
|
||||
|
||||
static void appendCompletionData(std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>* completionData,
|
||||
static void appendCompletionData(std::map<size_t, std::vector<RigCompletionData>>* completionData,
|
||||
const std::vector<RigCompletionData>& data);
|
||||
|
||||
static cvf::Vec2i wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase, const RimWellPath* wellPath, const QString& gridName = "");
|
||||
|
@ -650,15 +650,18 @@ RicExportLgrFeature::cellsIntersectingCompletions(RimEclipseCase* eclipseCase,
|
||||
{
|
||||
std::vector<RigCompletionDataGridCell> cells;
|
||||
|
||||
const RigMainGrid* mainGrid = eclipseCase->mainGrid();
|
||||
|
||||
*isIntersectingOtherLgrs = false;
|
||||
auto completions = eclipseCase->computeAndGetVirtualPerforationTransmissibilities();
|
||||
auto completions = eclipseCase->computeAndGetVirtualPerforationTransmissibilities();
|
||||
if (completions)
|
||||
{
|
||||
auto intCells = completions->multipleCompletionsPerEclipseCell(wellPath, timeStep);
|
||||
|
||||
for (auto intCell : intCells)
|
||||
{
|
||||
if (!intCell.first.isMainGridCell())
|
||||
const RigGridBase* grid = hostGrid(mainGrid, intCell.first);
|
||||
if (grid != mainGrid)
|
||||
{
|
||||
*isIntersectingOtherLgrs = true;
|
||||
continue;
|
||||
@ -668,9 +671,10 @@ RicExportLgrFeature::cellsIntersectingCompletions(RimEclipseCase* eclipseCase,
|
||||
|
||||
if (filteredCompletions.empty()) continue;
|
||||
|
||||
cells.push_back(intCell.first);
|
||||
cells.push_back(RigCompletionDataGridCell(intCell.first, mainGrid));
|
||||
}
|
||||
}
|
||||
|
||||
return cells;
|
||||
}
|
||||
|
||||
@ -867,6 +871,8 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
|
||||
const std::set<RigCompletionData::CompletionType>& completionTypes,
|
||||
QStringList* wellsIntersectingOtherLgrs)
|
||||
{
|
||||
const RigMainGrid* mainGrid = eclipseCase->mainGrid();
|
||||
|
||||
std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> completionToCells;
|
||||
|
||||
wellsIntersectingOtherLgrs->clear();
|
||||
@ -881,7 +887,8 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
|
||||
|
||||
for (const auto& intCell : intCells)
|
||||
{
|
||||
if (!intCell.first.isMainGridCell())
|
||||
const RigGridBase* grid = hostGrid(mainGrid, intCell.first);
|
||||
if (grid != mainGrid)
|
||||
{
|
||||
isIntersectingOtherLgrs = true;
|
||||
continue;
|
||||
@ -893,7 +900,7 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
|
||||
CompletionInfo ci(completion.completionType(), complName, completion.wellName());
|
||||
|
||||
auto& item = completionToCells[ci];
|
||||
item.push_back(intCell.first);
|
||||
item.push_back(RigCompletionDataGridCell(intCell.first, mainGrid));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1062,6 +1069,16 @@ int RicExportLgrFeature::firstAvailableLgrId(const RigMainGrid* mainGrid)
|
||||
return lastUsedId + 1;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
const RigGridBase* RicExportLgrFeature::hostGrid(const RigMainGrid* mainGrid, size_t reservoirCellIndex)
|
||||
{
|
||||
size_t dummy = 0;
|
||||
|
||||
return mainGrid->gridAndGridLocalIdxFromGlobalCellIdx(reservoirCellIndex, &dummy);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
class LgrNameFactory;
|
||||
class RigMainGrid;
|
||||
class RigGridBase;
|
||||
class RimEclipseCase;
|
||||
class RimSimWellInView;
|
||||
class RimWellPath;
|
||||
@ -228,4 +229,5 @@ private:
|
||||
QStringList* wellsIntersectingOtherLgrs);
|
||||
|
||||
static int firstAvailableLgrId(const RigMainGrid* mainGrid);
|
||||
static const RigGridBase* hostGrid(const RigMainGrid* mainGrid, size_t reservoirCellIndex);
|
||||
};
|
||||
|
@ -85,9 +85,9 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
|
||||
// Remove connection factors for parent grid, they are not supposed to be visualized, but are relevant for export
|
||||
for (auto it = completionsForWellPath.begin(); it != completionsForWellPath.end();)
|
||||
{
|
||||
size_t gridIndex = it->first.globalCellIndex();
|
||||
size_t reservoirCellIndex = it->first;
|
||||
|
||||
const RigCell& rigCell = mainGrid->cell(gridIndex);
|
||||
const RigCell& rigCell = mainGrid->cell(reservoirCellIndex);
|
||||
if (rigCell.subGrid())
|
||||
{
|
||||
it = completionsForWellPath.erase(it);
|
||||
@ -121,9 +121,9 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
|
||||
}
|
||||
}
|
||||
|
||||
size_t gridIndex = completionsForCell.first.globalCellIndex();
|
||||
size_t reservoirCellIndex = completionsForCell.first;
|
||||
|
||||
const RigCell& rigCell = mainGrid->cell(gridIndex);
|
||||
const RigCell& rigCell = mainGrid->cell(reservoirCellIndex);
|
||||
|
||||
cvf::Vec3d locationInDomainCoord = rigCell.center();
|
||||
cvf::Vec3d direction = cvf::Vec3d::X_AXIS;
|
||||
@ -135,7 +135,7 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
|
||||
{
|
||||
const WellPathCellIntersectionInfo& intersectionInfo = wellPathCellIntersections[i];
|
||||
|
||||
if (intersectionInfo.globCellIndex == completionsForCell.first.globalCellIndex())
|
||||
if (intersectionInfo.globCellIndex == completionsForCell.first)
|
||||
{
|
||||
double startMD = intersectionInfo.startMD;
|
||||
double endMD = intersectionInfo.endMD;
|
||||
@ -166,7 +166,7 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
|
||||
double transmissibility = completionData.transmissibility();
|
||||
|
||||
completionVizDataItems.push_back(
|
||||
CompletionVizData(displayCoord, direction, transmissibility, completionsForCell.first.globalCellIndex()));
|
||||
CompletionVizData(displayCoord, direction, transmissibility, completionsForCell.first));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ void RimCompletionCellIntersectionCalc::calculateCompletionTypeResult(RimEclipse
|
||||
appCompletionType = RiaDefines::PERFORATION_INTERVAL;
|
||||
}
|
||||
|
||||
completionTypeCellResult[completionsForWell.first.globalCellIndex()] = appCompletionType;
|
||||
completionTypeCellResult[completionsForWell.first] = appCompletionType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -32,15 +32,15 @@ void CompletionDataFrame::setCompletionData(const std::vector<RigCompletionData>
|
||||
{
|
||||
for (auto& completion : completions)
|
||||
{
|
||||
auto it = m_multipleCompletionsPerEclipseCell.find(completion.completionDataGridCell());
|
||||
auto it = m_multipleCompletionsPerEclipseCell.find(completion.completionDataGridCell().globalCellIndex());
|
||||
if (it != m_multipleCompletionsPerEclipseCell.end())
|
||||
{
|
||||
it->second.push_back(completion);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_multipleCompletionsPerEclipseCell.insert(std::pair<RigCompletionDataGridCell, std::vector<RigCompletionData>>(
|
||||
completion.completionDataGridCell(), std::vector<RigCompletionData>{completion}));
|
||||
m_multipleCompletionsPerEclipseCell.insert(std::pair<size_t, std::vector<RigCompletionData>>(
|
||||
completion.completionDataGridCell().globalCellIndex(), std::vector<RigCompletionData>{completion}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -48,8 +48,7 @@ void CompletionDataFrame::setCompletionData(const std::vector<RigCompletionData>
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
const std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>&
|
||||
CompletionDataFrame::multipleCompletionsPerEclipseCell() const
|
||||
const std::map<size_t, std::vector<RigCompletionData>>& CompletionDataFrame::multipleCompletionsPerEclipseCell() const
|
||||
{
|
||||
return m_multipleCompletionsPerEclipseCell;
|
||||
}
|
||||
@ -94,11 +93,11 @@ void RigVirtualPerforationTransmissibilities::setCompletionDataForWellPath(
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
const std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>&
|
||||
const std::map<size_t, std::vector<RigCompletionData>>&
|
||||
RigVirtualPerforationTransmissibilities::multipleCompletionsPerEclipseCell(const RimWellPath* wellPath,
|
||||
size_t timeStepIndex) const
|
||||
{
|
||||
static std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> dummy;
|
||||
static std::map<size_t, std::vector<RigCompletionData>> dummy;
|
||||
|
||||
auto item = m_mapFromWellToCompletionData.find(wellPath);
|
||||
if (item != m_mapFromWellToCompletionData.end())
|
||||
|
@ -41,10 +41,10 @@ public:
|
||||
|
||||
void setCompletionData(const std::vector<RigCompletionData>& completions);
|
||||
|
||||
const std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>& multipleCompletionsPerEclipseCell() const;
|
||||
const std::map<size_t, std::vector<RigCompletionData>>& multipleCompletionsPerEclipseCell() const;
|
||||
|
||||
private:
|
||||
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> m_multipleCompletionsPerEclipseCell;
|
||||
std::map<size_t, std::vector<RigCompletionData>> m_multipleCompletionsPerEclipseCell;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -56,18 +56,20 @@ public:
|
||||
RigVirtualPerforationTransmissibilities();
|
||||
~RigVirtualPerforationTransmissibilities() override;
|
||||
|
||||
void setCompletionDataForWellPath(const RimWellPath* wellPath, const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep);
|
||||
void setCompletionDataForWellPath(const RimWellPath* wellPath,
|
||||
const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep);
|
||||
|
||||
const std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>&
|
||||
multipleCompletionsPerEclipseCell(const RimWellPath* wellPath, size_t timeStepIndex) const;
|
||||
const std::map<size_t, std::vector<RigCompletionData>>& multipleCompletionsPerEclipseCell(const RimWellPath* wellPath,
|
||||
size_t timeStepIndex) const;
|
||||
|
||||
void setCompletionDataForSimWell(const RigSimWellData* simWellData, const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep);
|
||||
|
||||
const std::vector<RigCompletionData>&
|
||||
completionsForSimWell(const RigSimWellData* simWellData, size_t timeStepIndex) const;
|
||||
void setCompletionDataForSimWell(const RigSimWellData* simWellData,
|
||||
const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep);
|
||||
|
||||
const std::vector<RigCompletionData>& completionsForSimWell(const RigSimWellData* simWellData, size_t timeStepIndex) const;
|
||||
|
||||
void computeMinMax(double* minValue, double* maxValue, double* posClosestToZero, double* negClosestToZero) const;
|
||||
|
||||
private:
|
||||
std::map<const RimWellPath*, std::vector<CompletionDataFrame>> m_mapFromWellToCompletionData;
|
||||
std::map<const RimWellPath*, std::vector<CompletionDataFrame>> m_mapFromWellToCompletionData;
|
||||
std::map<const RigSimWellData*, std::vector<std::vector<RigCompletionData>>> m_mapFromSimWellToCompletionData;
|
||||
};
|
||||
|
@ -729,8 +729,7 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
|
||||
|
||||
const auto& multipleCompletions = connectionFactors->multipleCompletionsPerEclipseCell(wellConnectionSourceInfo->wellPath(), timeStep);
|
||||
|
||||
RigCompletionDataGridCell completionGridCell(globalCellIndex, eclipseCase->eclipseCaseData()->mainGrid());
|
||||
auto completionDataIt = multipleCompletions.find(completionGridCell);
|
||||
auto completionDataIt = multipleCompletions.find(globalCellIndex);
|
||||
if (completionDataIt != multipleCompletions.end())
|
||||
{
|
||||
completionsForOneCell = completionDataIt->second;
|
||||
|
Loading…
Reference in New Issue
Block a user