#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)
{
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}));
}
}
}

View File

@ -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 = "");

View File

@ -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);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -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);
};

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
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));
}
}

View File

@ -113,7 +113,7 @@ void RimCompletionCellIntersectionCalc::calculateCompletionTypeResult(RimEclipse
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)
{
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())

View File

@ -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;
};

View File

@ -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;