#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:
Magne Sjaastad
2018-11-14 11:40:23 +01:00
parent 1121abbfac
commit 4117e266ed
9 changed files with 62 additions and 43 deletions

View File

@@ -206,10 +206,10 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
for (auto wellPath : usedWellPaths) for (auto wellPath : usedWellPaths)
{ {
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellAllCompletionTypes; std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellAllCompletionTypes;
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellFishbones; std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellFishbones;
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellFracture; std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellFracture;
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCellPerforations; std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCellPerforations;
// Generate completion data // Generate completion data
@@ -284,7 +284,7 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
for (auto simWell : simWells) for (auto simWell : simWells)
{ {
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>> completionsPerEclipseCell; std::map<size_t, std::vector<RigCompletionData>> completionsPerEclipseCell;
std::vector<RigCompletionData> fractureCompletionData = std::vector<RigCompletionData> fractureCompletionData =
RicExportFractureCompletionsImpl::generateCompdatValuesForSimWell( RicExportFractureCompletionsImpl::generateCompdatValuesForSimWell(
@@ -2248,20 +2248,20 @@ void RicWellPathExportCompletionDataFeatureImpl::assignBranchAndSegmentNumbers(c
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::appendCompletionData( void RicWellPathExportCompletionDataFeatureImpl::appendCompletionData(
std::map<RigCompletionDataGridCell, std::vector<RigCompletionData>>* completionData, std::map<size_t, std::vector<RigCompletionData>>* completionData,
const std::vector<RigCompletionData>& data) 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()) if (it != completionData->end())
{ {
it->second.push_back(completion); it->second.push_back(completion);
} }
else else
{ {
completionData->insert(std::pair<RigCompletionDataGridCell, std::vector<RigCompletionData>>( completionData->insert(std::pair<size_t, std::vector<RigCompletionData>>(
completion.completionDataGridCell(), std::vector<RigCompletionData>{completion})); completion.completionDataGridCell().globalCellIndex(), std::vector<RigCompletionData>{completion}));
} }
} }
} }

View File

@@ -212,7 +212,7 @@ private:
static void assignBranchAndSegmentNumbers(const RimEclipseCase* caseToApply, static void assignBranchAndSegmentNumbers(const RimEclipseCase* caseToApply,
RicMswExportInfo* exportInfo); 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); const std::vector<RigCompletionData>& data);
static cvf::Vec2i wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase, const RimWellPath* wellPath, const QString& gridName = ""); static cvf::Vec2i wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase, const RimWellPath* wellPath, const QString& gridName = "");

View File

@@ -650,15 +650,18 @@ RicExportLgrFeature::cellsIntersectingCompletions(RimEclipseCase* eclipseCase,
{ {
std::vector<RigCompletionDataGridCell> cells; std::vector<RigCompletionDataGridCell> cells;
const RigMainGrid* mainGrid = eclipseCase->mainGrid();
*isIntersectingOtherLgrs = false; *isIntersectingOtherLgrs = false;
auto completions = eclipseCase->computeAndGetVirtualPerforationTransmissibilities(); auto completions = eclipseCase->computeAndGetVirtualPerforationTransmissibilities();
if (completions) if (completions)
{ {
auto intCells = completions->multipleCompletionsPerEclipseCell(wellPath, timeStep); auto intCells = completions->multipleCompletionsPerEclipseCell(wellPath, timeStep);
for (auto intCell : intCells) for (auto intCell : intCells)
{ {
if (!intCell.first.isMainGridCell()) const RigGridBase* grid = hostGrid(mainGrid, intCell.first);
if (grid != mainGrid)
{ {
*isIntersectingOtherLgrs = true; *isIntersectingOtherLgrs = true;
continue; continue;
@@ -668,9 +671,10 @@ RicExportLgrFeature::cellsIntersectingCompletions(RimEclipseCase* eclipseCase,
if (filteredCompletions.empty()) continue; if (filteredCompletions.empty()) continue;
cells.push_back(intCell.first); cells.push_back(RigCompletionDataGridCell(intCell.first, mainGrid));
} }
} }
return cells; return cells;
} }
@@ -867,6 +871,8 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
const std::set<RigCompletionData::CompletionType>& completionTypes, const std::set<RigCompletionData::CompletionType>& completionTypes,
QStringList* wellsIntersectingOtherLgrs) QStringList* wellsIntersectingOtherLgrs)
{ {
const RigMainGrid* mainGrid = eclipseCase->mainGrid();
std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> completionToCells; std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> completionToCells;
wellsIntersectingOtherLgrs->clear(); wellsIntersectingOtherLgrs->clear();
@@ -881,7 +887,8 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
for (const auto& intCell : intCells) for (const auto& intCell : intCells)
{ {
if (!intCell.first.isMainGridCell()) const RigGridBase* grid = hostGrid(mainGrid, intCell.first);
if (grid != mainGrid)
{ {
isIntersectingOtherLgrs = true; isIntersectingOtherLgrs = true;
continue; continue;
@@ -893,7 +900,7 @@ std::map<CompletionInfo, std::vector<RigCompletionDataGridCell>> RicExportLgrFea
CompletionInfo ci(completion.completionType(), complName, completion.wellName()); CompletionInfo ci(completion.completionType(), complName, completion.wellName());
auto& item = completionToCells[ci]; 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; return lastUsedId + 1;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const RigGridBase* RicExportLgrFeature::hostGrid(const RigMainGrid* mainGrid, size_t reservoirCellIndex)
{
size_t dummy = 0;
return mainGrid->gridAndGridLocalIdxFromGlobalCellIdx(reservoirCellIndex, &dummy);
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -31,6 +31,7 @@
class LgrNameFactory; class LgrNameFactory;
class RigMainGrid; class RigMainGrid;
class RigGridBase;
class RimEclipseCase; class RimEclipseCase;
class RimSimWellInView; class RimSimWellInView;
class RimWellPath; class RimWellPath;
@@ -228,4 +229,5 @@ private:
QStringList* wellsIntersectingOtherLgrs); QStringList* wellsIntersectingOtherLgrs);
static int firstAvailableLgrId(const RigMainGrid* mainGrid); static int firstAvailableLgrId(const RigMainGrid* mainGrid);
static const RigGridBase* hostGrid(const RigMainGrid* mainGrid, size_t reservoirCellIndex);
}; };

View File

@@ -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 // 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();) 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()) if (rigCell.subGrid())
{ {
it = completionsForWellPath.erase(it); 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 locationInDomainCoord = rigCell.center();
cvf::Vec3d direction = cvf::Vec3d::X_AXIS; cvf::Vec3d direction = cvf::Vec3d::X_AXIS;
@@ -135,7 +135,7 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
{ {
const WellPathCellIntersectionInfo& intersectionInfo = wellPathCellIntersections[i]; const WellPathCellIntersectionInfo& intersectionInfo = wellPathCellIntersections[i];
if (intersectionInfo.globCellIndex == completionsForCell.first.globalCellIndex()) if (intersectionInfo.globCellIndex == completionsForCell.first)
{ {
double startMD = intersectionInfo.startMD; double startMD = intersectionInfo.startMD;
double endMD = intersectionInfo.endMD; double endMD = intersectionInfo.endMD;
@@ -166,7 +166,7 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
double transmissibility = completionData.transmissibility(); double transmissibility = completionData.transmissibility();
completionVizDataItems.push_back( completionVizDataItems.push_back(
CompletionVizData(displayCoord, direction, transmissibility, completionsForCell.first.globalCellIndex())); CompletionVizData(displayCoord, direction, transmissibility, completionsForCell.first));
} }
} }

View File

@@ -113,7 +113,7 @@ void RimCompletionCellIntersectionCalc::calculateCompletionTypeResult(RimEclipse
appCompletionType = RiaDefines::PERFORATION_INTERVAL; appCompletionType = RiaDefines::PERFORATION_INTERVAL;
} }
completionTypeCellResult[completionsForWell.first.globalCellIndex()] = appCompletionType; completionTypeCellResult[completionsForWell.first] = appCompletionType;
} }
} }
} }

View File

@@ -32,15 +32,15 @@ void CompletionDataFrame::setCompletionData(const std::vector<RigCompletionData>
{ {
for (auto& completion : completions) for (auto& completion : completions)
{ {
auto it = m_multipleCompletionsPerEclipseCell.find(completion.completionDataGridCell()); auto it = m_multipleCompletionsPerEclipseCell.find(completion.completionDataGridCell().globalCellIndex());
if (it != m_multipleCompletionsPerEclipseCell.end()) if (it != m_multipleCompletionsPerEclipseCell.end())
{ {
it->second.push_back(completion); it->second.push_back(completion);
} }
else else
{ {
m_multipleCompletionsPerEclipseCell.insert(std::pair<RigCompletionDataGridCell, std::vector<RigCompletionData>>( m_multipleCompletionsPerEclipseCell.insert(std::pair<size_t, std::vector<RigCompletionData>>(
completion.completionDataGridCell(), std::vector<RigCompletionData>{completion})); 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>>& const std::map<size_t, std::vector<RigCompletionData>>& CompletionDataFrame::multipleCompletionsPerEclipseCell() const
CompletionDataFrame::multipleCompletionsPerEclipseCell() const
{ {
return m_multipleCompletionsPerEclipseCell; 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, RigVirtualPerforationTransmissibilities::multipleCompletionsPerEclipseCell(const RimWellPath* wellPath,
size_t timeStepIndex) const 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); auto item = m_mapFromWellToCompletionData.find(wellPath);
if (item != m_mapFromWellToCompletionData.end()) if (item != m_mapFromWellToCompletionData.end())

View File

@@ -41,10 +41,10 @@ public:
void setCompletionData(const std::vector<RigCompletionData>& completions); 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: 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();
~RigVirtualPerforationTransmissibilities() override; ~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>>& const std::map<size_t, std::vector<RigCompletionData>>& multipleCompletionsPerEclipseCell(const RimWellPath* wellPath,
multipleCompletionsPerEclipseCell(const RimWellPath* wellPath, size_t timeStepIndex) const; size_t timeStepIndex) const;
void setCompletionDataForSimWell(const RigSimWellData* simWellData, const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep); void setCompletionDataForSimWell(const RigSimWellData* simWellData,
const std::vector<std::vector<RigCompletionData>>& completionsPerTimeStep);
const std::vector<RigCompletionData>&
completionsForSimWell(const RigSimWellData* simWellData, size_t timeStepIndex) const; const std::vector<RigCompletionData>& completionsForSimWell(const RigSimWellData* simWellData, size_t timeStepIndex) const;
void computeMinMax(double* minValue, double* maxValue, double* posClosestToZero, double* negClosestToZero) const; void computeMinMax(double* minValue, double* maxValue, double* posClosestToZero, double* negClosestToZero) const;
private: 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; std::map<const RigSimWellData*, std::vector<std::vector<RigCompletionData>>> m_mapFromSimWellToCompletionData;
}; };

View File

@@ -729,8 +729,7 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
const auto& multipleCompletions = connectionFactors->multipleCompletionsPerEclipseCell(wellConnectionSourceInfo->wellPath(), timeStep); const auto& multipleCompletions = connectionFactors->multipleCompletionsPerEclipseCell(wellConnectionSourceInfo->wellPath(), timeStep);
RigCompletionDataGridCell completionGridCell(globalCellIndex, eclipseCase->eclipseCaseData()->mainGrid()); auto completionDataIt = multipleCompletions.find(globalCellIndex);
auto completionDataIt = multipleCompletions.find(completionGridCell);
if (completionDataIt != multipleCompletions.end()) if (completionDataIt != multipleCompletions.end())
{ {
completionsForOneCell = completionDataIt->second; completionsForOneCell = completionDataIt->second;