From 95047ae89e6418a5b55361ed9420f13291468be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 18 Sep 2015 17:02:44 +0200 Subject: [PATCH] (#401) Sync visible cells GeoMech to Eclipse grid now works But there are bugs regarding faults and cell result color. --- .../RigCaseToCaseCellMapper.cpp | 114 +++++++----------- .../RigCaseToCaseCellMapper.h | 2 +- 2 files changed, 43 insertions(+), 73 deletions(-) diff --git a/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.cpp b/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.cpp index 5b82d89b5d..e969c0cef6 100644 --- a/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.cpp +++ b/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.cpp @@ -46,6 +46,7 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigFemPart* masterFemPart, RigM m_dependentFemPart(NULL) { m_masterCellOrIntervalIndex.resize(dependentEclGrid->cells().size(), cvf::UNDEFINED_INT); + this->calculateEclToGeomCellMapping(dependentEclGrid, masterFemPart, false); } //-------------------------------------------------------------------------------------------------- @@ -114,10 +115,11 @@ void RigCaseToCaseCellMapper::addMapping(int depCaseCellIdx, int masterCaseMatch } else if (mcOrSeriesIdx >= 0) { - int newSeriesIdx = m_masterCellIndexSeries.size(); + int newSeriesIdx = static_cast(m_masterCellIndexSeries.size()); m_masterCellIndexSeries.push_back(std::vector()); m_masterCellIndexSeries.back().push_back(mcOrSeriesIdx); m_masterCellIndexSeries.back().push_back(masterCaseMatchingCell); + m_masterCellOrIntervalIndex[depCaseCellIdx] = -newSeriesIdx; } else if (mcOrSeriesIdx < 0) { @@ -509,31 +511,15 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigMainGrid* masterEclGrid, Rig m_dependentFemPart(NULL) { m_masterCellOrIntervalIndex.resize(dependentFemPart->elementCount(), cvf::UNDEFINED_INT); - - #if 0 - // First search K=1 diagonally for a seed cell; A cell without collapsings, and without faults + this->calculateEclToGeomCellMapping(masterEclGrid, dependentFemPart, true); +} - size_t minIJCount = masterEclGrid->cellCountI(); - if (minIJCount > masterEclGrid->cellCountJ()) - minIJCount = masterEclGrid->cellCountJ(); - - for (size_t ij = 0; ij < minIJCount; ++ij ) - { - size_t localCellIdx = masterEclGrid->cellIndexFromIJK(ij, ij, 0); - size_t reservoirCellIdx = masterEclGrid->reservoirCellIndex(localCellIdx); - - cvf::Vec3d vertices[8]; - masterEclGrid->cellCornerVertices(localCellIdx, vertices); - if (!isCellNormal(vertices)) - continue; - - const RigFault* fault = masterEclGrid->findFaultFromCellIndexAndCellFace(reservoirCellIdx, cvf::StructGridInterface::POS_I); - - } - #endif - - // Brute force: - const std::vector& nodeCoords = dependentFemPart->nodes().coordinates; +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigCaseToCaseCellMapper::calculateEclToGeomCellMapping(RigMainGrid* masterEclGrid, RigFemPart* dependentFemPart, bool eclipseIsMaster) +{ + // Find tolerance double cellSizeI, cellSizeJ, cellSizeK; masterEclGrid->characteristicCellSizes(&cellSizeI, &cellSizeJ, &cellSizeK); @@ -543,50 +529,11 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigMainGrid* masterEclGrid, Rig bool isEclFaceNormalsOutwards = masterEclGrid->isFaceNormalsOutwards(); - int elementCount = dependentFemPart->elementCount(); cvf::Vec3d elmCorners[8]; - #if 0 - for (int elmIdx = 0; elmIdx < elementCount; ++elmIdx) - { - #ifdef _DEBUG - { - // For debugging - size_t i, j, k; - dependentFemPart->structGrid()->ijkFromCellIndex(elmIdx, &i, &j, &k); - } - #endif - - if (!elementCorners(dependentFemPart, elmIdx, elmCorners)) continue; - cvf::BoundingBox elmBBox; - for (int i = 0; i < 8 ; ++i) elmBBox.add(elmCorners[i]); + size_t cellCount = masterEclGrid->cellCount(); - std::vector closeCells; - masterEclGrid->findIntersectingCells(elmBBox, &closeCells); - - std::vector matchingCells; - - for (size_t ccIdx = 0; ccIdx < closeCells.size(); ++ccIdx) - { - cvf::Vec3d geoMechConvertedEclCell[8]; - - estimatedFemCellFromEclCell(masterEclGrid, closeCells[ccIdx], geoMechConvertedEclCell); - - rotateCellTopologicallyToMatchBaseCell(geoMechConvertedEclCell, ccIdx ? 1:isEclFaceNormalsOutwards , elmCorners); - - bool isMatching = isEclFemCellsMatching(geoMechConvertedEclCell, elmCorners, - xyTolerance, zTolerance); - - if (isMatching) - { - matchingCells.push_back(static_cast(closeCells[ccIdx])); - } - } - - storeMapping(elmIdx, matchingCells); - } - #else - for (size_t cellIdx = 0; cellIdx < masterEclGrid->cellCount(); ++cellIdx) + for (size_t cellIdx = 0; cellIdx < cellCount; ++cellIdx) { #ifdef _DEBUG { @@ -595,6 +542,7 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigMainGrid* masterEclGrid, Rig masterEclGrid->ijkFromCellIndex(cellIdx, &i, &j, &k); // Will not work when LGR present } #endif + cvf::Vec3d geoMechConvertedEclCell[8]; estimatedFemCellFromEclCell(masterEclGrid, cellIdx, geoMechConvertedEclCell); @@ -608,8 +556,7 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigMainGrid* masterEclGrid, Rig for (size_t ccIdx = 0; ccIdx < closeElements.size(); ++ccIdx) { - int elmIdx = closeElements[ccIdx]; - cvf::Vec3d elmCorners[8]; + int elmIdx = static_cast(closeElements[ccIdx]); elementCorners(dependentFemPart, elmIdx, elmCorners); @@ -620,14 +567,15 @@ RigCaseToCaseCellMapper::RigCaseToCaseCellMapper(RigMainGrid* masterEclGrid, Rig if (isMatching) { - addMapping(elmIdx, static_cast(cellIdx)); + if (eclipseIsMaster) + addMapping(elmIdx, static_cast(cellIdx)); + else + addMapping(static_cast(cellIdx), elmIdx); } } } - #endif } - #if 0 // Inside Bounding box test cvf::BoundingBox cellBBox; for (int i = 0; i < 8 ; ++i) cellBBox.add(cellCorners[i]); @@ -673,4 +621,26 @@ if ( ( (es.x() + xyTolerance) >= cs.x() && (el.x() - xyTolerance) <= cl.x()) eclShallowQuad[2] = eclNodes[cornerIndices[localElmNodeIndicesForBotZFace[2]]]; eclShallowQuad[3] = eclNodes[cornerIndices[localElmNodeIndicesForBotZFace[3]]]; } -#endif \ No newline at end of file +#endif + +#if 0 +// First search K=1 diagonally for a seed cell; A cell without collapsings, and without faults + +size_t minIJCount = masterEclGrid->cellCountI(); +if (minIJCount > masterEclGrid->cellCountJ()) +minIJCount = masterEclGrid->cellCountJ(); + +for (size_t ij = 0; ij < minIJCount; ++ij ) +{ + size_t localCellIdx = masterEclGrid->cellIndexFromIJK(ij, ij, 0); + size_t reservoirCellIdx = masterEclGrid->reservoirCellIndex(localCellIdx); + + cvf::Vec3d vertices[8]; + masterEclGrid->cellCornerVertices(localCellIdx, vertices); + if (!isCellNormal(vertices)) + continue; + + const RigFault* fault = masterEclGrid->findFaultFromCellIndexAndCellFace(reservoirCellIdx, cvf::StructGridInterface::POS_I); + +} +#endif diff --git a/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.h b/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.h index 681d49be80..ab736d6df0 100644 --- a/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.h +++ b/ApplicationCode/ReservoirDataModel/RigCaseToCaseCellMapper.h @@ -52,7 +52,7 @@ private: void storeMapping(int depCaseCellIdx, const std::vector& masterCaseMatchingCells); void addMapping(int depCaseCellIdx, int masterCaseMatchingCell); - + void calculateEclToGeomCellMapping(RigMainGrid* masterEclGrid, RigFemPart* dependentFemPart, bool eclipseIsMaster); std::vector m_masterCellOrIntervalIndex; std::vector > m_masterCellIndexSeries;