//-------------------------------------------------------------------------------------------------- /// Find the cell index to the maingrid cell containing this cell, and store it as /// m_mainGridCellIndex in each cell. //-------------------------------------------------------------------------------------------------- void RigGridBase::initSubCellsMainGridCellIndex() { RigGridBase* grid = this; if (grid->isMainGrid()) { size_t cellIdx; for (cellIdx = 0; cellIdx < grid->cellCount(); ++cellIdx) { RigCell& cell = grid->cell(cellIdx); cell.setMainGridCellIndex(cellIdx); } } else { size_t cellIdx; for (cellIdx = 0; cellIdx < grid->cellCount(); ++cellIdx) { RigLocalGrid* localGrid = NULL; RigGridBase* parentGrid = NULL; localGrid = static_cast<RigLocalGrid*>(grid); parentGrid = localGrid->parentGrid(); RigCell& cell = localGrid->cell(cellIdx); size_t parentCellIndex = cell.parentCellIndex(); while (!parentGrid->isMainGrid()) { const RigCell& parentCell = parentGrid->cell(parentCellIndex); parentCellIndex = parentCell.parentCellIndex(); localGrid = static_cast<RigLocalGrid*>(parentGrid); parentGrid = localGrid->parentGrid(); } cell.setMainGridCellIndex(parentCellIndex); } } }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigReservoirBuilderMock::populateReservoir(RigEclipseCaseData* eclipseCase) { std::vector<cvf::Vec3d>& mainGridNodes = eclipseCase->mainGrid()->nodes(); appendNodes(m_minWorldCoordinate, m_maxWorldCoordinate, cellDimension(), mainGridNodes); size_t mainGridNodeCount = mainGridNodes.size(); size_t mainGridCellCount = mainGridNodeCount / 8; // Must create cells in main grid here, as this information is used when creating LGRs appendCells(0, mainGridCellCount, eclipseCase->mainGrid(), eclipseCase->mainGrid()->globalCellArray()); size_t totalCellCount = mainGridCellCount; size_t lgrIdx; for (lgrIdx = 0; lgrIdx < m_localGridRefinements.size(); lgrIdx++) { LocalGridRefinement& lgr = m_localGridRefinements[lgrIdx]; // Compute all global cell indices to be replaced by local grid refinement std::vector<size_t> mainGridIndicesWithSubGrid; { size_t i; for (i = lgr.m_mainGridMinCellPosition.x(); i <= lgr.m_mainGridMaxCellPosition.x(); i++) { size_t j; for (j = lgr.m_mainGridMinCellPosition.y(); j <= lgr.m_mainGridMaxCellPosition.y(); j++) { size_t k; for (k = lgr.m_mainGridMinCellPosition.z(); k <= lgr.m_mainGridMaxCellPosition.z(); k++) { mainGridIndicesWithSubGrid.push_back(cellIndexFromIJK(i, j, k)); } } } } // Create local grid and set local grid dimensions RigLocalGrid* localGrid = new RigLocalGrid(eclipseCase->mainGrid()); localGrid->setGridId(1); eclipseCase->mainGrid()->addLocalGrid(localGrid); localGrid->setParentGrid(eclipseCase->mainGrid()); localGrid->setIndexToStartOfCells(mainGridNodes.size() / 8); cvf::Vec3st gridPointDimensions( lgr.m_singleCellRefinementFactors.x() * (lgr.m_mainGridMaxCellPosition.x() - lgr.m_mainGridMinCellPosition.x() + 1) + 1, lgr.m_singleCellRefinementFactors.y() * (lgr.m_mainGridMaxCellPosition.y() - lgr.m_mainGridMinCellPosition.y() + 1) + 1, lgr.m_singleCellRefinementFactors.z() * (lgr.m_mainGridMaxCellPosition.z() - lgr.m_mainGridMinCellPosition.z() + 1) + 1); localGrid->setGridPointDimensions(gridPointDimensions); cvf::BoundingBox bb; size_t cellIdx; for (cellIdx = 0; cellIdx < mainGridIndicesWithSubGrid.size(); cellIdx++) { RigCell& cell = eclipseCase->mainGrid()->globalCellArray()[mainGridIndicesWithSubGrid[cellIdx]]; caf::SizeTArray8& indices = cell.cornerIndices(); int nodeIdx; for (nodeIdx = 0; nodeIdx < 8; nodeIdx++) { bb.add(eclipseCase->mainGrid()->nodes()[indices[nodeIdx]]); } // Deactivate cell in main grid cell.setSubGrid(localGrid); } cvf::Vec3st lgrCellDimensions = gridPointDimensions - cvf::Vec3st(1, 1, 1); appendNodes(bb.min(), bb.max(), lgrCellDimensions, mainGridNodes); size_t subGridCellCount = (mainGridNodes.size() / 8) - totalCellCount; appendCells(totalCellCount*8, subGridCellCount, localGrid, eclipseCase->mainGrid()->globalCellArray()); totalCellCount += subGridCellCount; } eclipseCase->mainGrid()->setGridPointDimensions(m_gridPointDimensions); if (m_enableWellData) { addWellData(eclipseCase, eclipseCase->mainGrid()); } addFaults(eclipseCase); // Set all cells active RigActiveCellInfo* activeCellInfo = eclipseCase->activeCellInfo(RiaDefines::MATRIX_MODEL); activeCellInfo->setReservoirCellCount(eclipseCase->mainGrid()->globalCellArray().size()); for (size_t i = 0; i < eclipseCase->mainGrid()->globalCellArray().size(); i++) { activeCellInfo->setCellResultIndex(i, i); } activeCellInfo->setGridCount(1); activeCellInfo->setGridActiveCellCounts(0, eclipseCase->mainGrid()->globalCellArray().size()); activeCellInfo->computeDerivedData(); // Add grid coarsening for main grid if (cellDimension().x() > 4 && cellDimension().y() > 5 && cellDimension().z() > 6) { eclipseCase->mainGrid()->addCoarseningBox(1, 2, 1, 3, 1, 4); eclipseCase->mainGrid()->addCoarseningBox(3, 4, 4, 5, 5, 6); } }
//-------------------------------------------------------------------------------------------------- /// Read geometry from file given by name into given reservoir object //-------------------------------------------------------------------------------------------------- bool RifReaderEclipseOutput::transferGeometry(const ecl_grid_type* mainEclGrid, RigReservoir* reservoir) { CVF_ASSERT(reservoir); if (!mainEclGrid) { // Some error return false; } RigMainGrid* mainGrid = reservoir->mainGrid(); { cvf::Vec3st gridPointDim(0,0,0); gridPointDim.x() = ecl_grid_get_nx(mainEclGrid) + 1; gridPointDim.y() = ecl_grid_get_ny(mainEclGrid) + 1; gridPointDim.z() = ecl_grid_get_nz(mainEclGrid) + 1; mainGrid->setGridPointDimensions(gridPointDim); } // Get and set grid and lgr metadata size_t totalCellCount = static_cast<size_t>(ecl_grid_get_global_size(mainEclGrid)); int numLGRs = ecl_grid_get_num_lgr(mainEclGrid); int lgrIdx; for (lgrIdx = 0; lgrIdx < numLGRs; ++lgrIdx) { ecl_grid_type* localEclGrid = ecl_grid_iget_lgr(mainEclGrid, lgrIdx); std::string lgrName = ecl_grid_get_name(localEclGrid); cvf::Vec3st gridPointDim(0,0,0); gridPointDim.x() = ecl_grid_get_nx(localEclGrid) + 1; gridPointDim.y() = ecl_grid_get_ny(localEclGrid) + 1; gridPointDim.z() = ecl_grid_get_nz(localEclGrid) + 1; RigLocalGrid* localGrid = new RigLocalGrid(mainGrid); mainGrid->addLocalGrid(localGrid); localGrid->setIndexToStartOfCells(totalCellCount); localGrid->setGridName(lgrName); localGrid->setGridPointDimensions(gridPointDim); totalCellCount += ecl_grid_get_global_size(localEclGrid); } // Reserve room for the cells and nodes and fill them with data mainGrid->cells().reserve(totalCellCount); mainGrid->nodes().reserve(8*totalCellCount); caf::ProgressInfo progInfo(3 + numLGRs, ""); progInfo.setProgressDescription("Main Grid"); progInfo.setNextProgressIncrement(3); transferGridCellData(mainGrid, mainGrid, mainEclGrid, 0, 0); progInfo.setProgress(3); size_t globalMatrixActiveSize = ecl_grid_get_nactive(mainEclGrid); size_t globalFractureActiveSize = ecl_grid_get_nactive_fracture(mainEclGrid); mainGrid->setMatrixModelActiveCellCount(globalMatrixActiveSize); mainGrid->setFractureModelActiveCellCount(globalFractureActiveSize); for (lgrIdx = 0; lgrIdx < numLGRs; ++lgrIdx) { progInfo.setProgressDescription("LGR number " + QString::number(lgrIdx+1)); ecl_grid_type* localEclGrid = ecl_grid_iget_lgr(mainEclGrid, lgrIdx); RigLocalGrid* localGrid = static_cast<RigLocalGrid*>(mainGrid->gridByIndex(lgrIdx+1)); transferGridCellData(mainGrid, localGrid, localEclGrid, globalMatrixActiveSize, globalFractureActiveSize); int activeCellCount = ecl_grid_get_nactive(localEclGrid); localGrid->setMatrixModelActiveCellCount(activeCellCount); globalMatrixActiveSize += activeCellCount; activeCellCount = ecl_grid_get_nactive_fracture(localEclGrid); localGrid->setFractureModelActiveCellCount(activeCellCount); globalFractureActiveSize += activeCellCount; progInfo.setProgress(3 + lgrIdx); } mainGrid->setGlobalMatrixModelActiveCellCount(globalMatrixActiveSize); mainGrid->setGlobalFractureModelActiveCellCount(globalFractureActiveSize); return true; }