///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) Statoil ASA, Ceetron Solutions AS // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RigResultAccessObjectFactory.h" #include "RigResultAccessObject.h" #include "RigActiveCellsResultAccessObject.h" #include "RigAllGridCellsResultAccessObject.h" #include "cvfLibCore.h" #include "cvfBase.h" #include "cvfObject.h" #include "cvfAssert.h" #include "RigMainGrid.h" #include "RigCaseCellResultsData.h" #include "RigActiveCellInfo.h" #include "RigGridBase.h" #include "RigCaseData.h" #include #include "RigCombTransResultAccessObject.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref RigResultAccessObjectFactory::createNativeDataAccessObject(RigCaseData* eclipseCase, size_t gridIndex, RifReaderInterface::PorosityModelResultType porosityModel, size_t timeStepIndex, QString& uiResultName) { CVF_ASSERT(gridIndex < eclipseCase->gridCount()); CVF_ASSERT(eclipseCase); CVF_ASSERT(eclipseCase->results(porosityModel)); CVF_ASSERT(eclipseCase->activeCellInfo(porosityModel)); RigGridBase *grid = eclipseCase->grid(gridIndex); if (!eclipseCase || !eclipseCase->results(porosityModel) || !eclipseCase->activeCellInfo(porosityModel)) { return NULL; } size_t scalarSetIndex = eclipseCase->results(porosityModel)->findScalarResultIndex(uiResultName); if (scalarSetIndex == cvf::UNDEFINED_SIZE_T) { return NULL; } std::vector< std::vector >& scalarSetResults = eclipseCase->results(porosityModel)->cellScalarResults(scalarSetIndex); // A generated result with a generated results for a subset of time steps, will end up with a result container with less entries than time steps // See RiaSetGridProperty command in RiaPropertyDataCommands // // Some functions requires a valid data access object to be present, these might be rewritten to avoid this dummy object always returning HUGE_VAL if (timeStepIndex >= scalarSetResults.size()) { return NULL; } std::vector* resultValues = NULL; if (timeStepIndex < scalarSetResults.size()) { resultValues = &(scalarSetResults[timeStepIndex]); } bool useGlobalActiveIndex = eclipseCase->results(porosityModel)->isUsingGlobalActiveIndex(scalarSetIndex); if (useGlobalActiveIndex) { cvf::ref object = new RigActiveCellsResultAccessObject(grid, resultValues, eclipseCase->activeCellInfo(porosityModel), uiResultName); return object; } else { cvf::ref object = new RigAllGridCellsResultAccessObject(grid, resultValues, uiResultName); return object; } } //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- // Rest of this file is to be deleted //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- class RigGridAllCellsScalarDataAccess : public cvf::StructGridScalarDataAccess { public: RigGridAllCellsScalarDataAccess(const RigGridBase* grid, std::vector* reservoirResultValues); virtual double cellScalar(size_t gridLocalCellIndex) const; virtual void setCellScalar(size_t cellIndex, double value); private: const RigGridBase* m_grid; std::vector* m_reservoirResultValues; }; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigGridAllCellsScalarDataAccess::RigGridAllCellsScalarDataAccess(const RigGridBase* grid, std::vector* reservoirResultValues) : m_grid(grid), m_reservoirResultValues(reservoirResultValues) { CVF_ASSERT(reservoirResultValues != NULL); CVF_ASSERT(grid != NULL); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double RigGridAllCellsScalarDataAccess::cellScalar(size_t gridLocalCellIndex) const { if (m_reservoirResultValues->size() == 0 ) return HUGE_VAL; size_t globalGridCellIndex = m_grid->globalGridCellIndex(gridLocalCellIndex); CVF_TIGHT_ASSERT(globalGridCellIndex < m_reservoirResultValues->size()); return m_reservoirResultValues->at(globalGridCellIndex); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigGridAllCellsScalarDataAccess::setCellScalar(size_t gridLocalCellIndex, double scalarValue) { size_t globalGridCellIndex = m_grid->globalGridCellIndex(gridLocalCellIndex); CVF_TIGHT_ASSERT(globalGridCellIndex < m_reservoirResultValues->size()); (*m_reservoirResultValues)[globalGridCellIndex] = scalarValue; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- class RigGridActiveCellsScalarDataAccess : public cvf::StructGridScalarDataAccess { public: RigGridActiveCellsScalarDataAccess(const RigGridBase* grid, std::vector* reservoirResultValues, const RigActiveCellInfo* activeCellInfo) : m_grid(grid), m_reservoirResultValues(reservoirResultValues), m_activeCellInfo(activeCellInfo) { CVF_ASSERT(grid != NULL); } virtual double cellScalar(size_t gridLocalCellIndex) const { if (m_reservoirResultValues == NULL || m_reservoirResultValues->size() == 0 ) return HUGE_VAL; size_t globalGridCellIndex = m_grid->globalGridCellIndex(gridLocalCellIndex); size_t resultValueIndex = m_activeCellInfo->cellResultIndex(globalGridCellIndex); if (resultValueIndex == cvf::UNDEFINED_SIZE_T) return HUGE_VAL; CVF_TIGHT_ASSERT(resultValueIndex < m_reservoirResultValues->size()); return m_reservoirResultValues->at(resultValueIndex); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- virtual void setCellScalar(size_t gridLocalCellIndex, double scalarValue) { size_t globalGridCellIndex = m_grid->globalGridCellIndex(gridLocalCellIndex); size_t resultValueIndex = m_activeCellInfo->cellResultIndex(globalGridCellIndex); CVF_TIGHT_ASSERT(m_reservoirResultValues != NULL && resultValueIndex < m_reservoirResultValues->size()); (*m_reservoirResultValues)[resultValueIndex] = scalarValue; } private: const RigActiveCellInfo* m_activeCellInfo; const RigGridBase* m_grid; std::vector* m_reservoirResultValues; }; class StructGridScalarDataAccessHugeVal : public cvf::StructGridScalarDataAccess { public: virtual double cellScalar(size_t cellIndex) const { return HUGE_VAL; } virtual void setCellScalar(size_t cellIndex, double value) { } }; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref RigResultAccessObjectFactory::TO_BE_DELETED_createNativeDataAccessObject(RigCaseData* eclipseCase, size_t gridIndex, RifReaderInterface::PorosityModelResultType porosityModel, size_t timeStepIndex, size_t scalarSetIndex) { CVF_ASSERT(gridIndex < eclipseCase->gridCount()); CVF_ASSERT(eclipseCase); CVF_ASSERT(eclipseCase->results(porosityModel)); CVF_ASSERT(eclipseCase->activeCellInfo(porosityModel)); RigGridBase *grid = eclipseCase->grid(gridIndex); if (!eclipseCase || !eclipseCase->results(porosityModel) || !eclipseCase->activeCellInfo(porosityModel)) { return NULL; } std::vector< std::vector >& scalarSetResults = eclipseCase->results(porosityModel)->cellScalarResults(scalarSetIndex); // A generated result with a generated results for a subset of time steps, will end up with a result container with less entries than time steps // See RiaSetGridProperty command in RiaPropertyDataCommands // // Some functions requires a valid data access object to be present, these might be rewritten to avoid this dummy object always returning HUGE_VAL if (timeStepIndex >= scalarSetResults.size()) { cvf::ref object = new StructGridScalarDataAccessHugeVal; return object; } std::vector* resultValues = NULL; if (timeStepIndex < scalarSetResults.size()) { resultValues = &(scalarSetResults[timeStepIndex]); } bool useGlobalActiveIndex = eclipseCase->results(porosityModel)->isUsingGlobalActiveIndex(scalarSetIndex); if (useGlobalActiveIndex) { cvf::ref object = new RigGridActiveCellsScalarDataAccess(grid, resultValues, eclipseCase->activeCellInfo(porosityModel)); return object; } else { cvf::ref object = new RigGridAllCellsScalarDataAccess(grid, resultValues); return object; } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref RigResultAccessObjectFactory::createResultAccessObject(RigCaseData* eclipseCase, size_t gridIndex, RifReaderInterface::PorosityModelResultType porosityModel, size_t timeStepIndex, QString& uiResultName) { CVF_ASSERT(gridIndex < eclipseCase->gridCount()); CVF_ASSERT(eclipseCase); CVF_ASSERT(eclipseCase->results(porosityModel)); CVF_ASSERT(eclipseCase->activeCellInfo(porosityModel)); RigGridBase* grid = eclipseCase->grid(gridIndex); // Ternary if (uiResultName == RimDefines::ternarySaturationResultName()) { return NULL; } else if (uiResultName == RimDefines::combinedTransmissibilityResultName()) { // TODO // Taken from RivTransmissibilityColorMapper::updateCombinedTransmissibilityTextureCoordinates // cvf::ref cellFaceAccessObject = new RigCombTransResultAccessObject(grid, uiResultName); { cvf::ref nativeAccessObject = RigResultAccessObjectFactory::createNativeDataAccessObject(eclipseCase, gridIndex, porosityModel, timeStepIndex, QString("TRANX")); if (nativeAccessObject.notNull()) { cellFaceAccessObject->setDataAccessObjectForFace(cvf::StructGridInterface::POS_I, nativeAccessObject.p()); } } { cvf::ref nativeAccessObject = RigResultAccessObjectFactory::createNativeDataAccessObject(eclipseCase, gridIndex, porosityModel, timeStepIndex, QString("TRANY")); if (nativeAccessObject.notNull()) { cellFaceAccessObject->setDataAccessObjectForFace(cvf::StructGridInterface::POS_J, nativeAccessObject.p()); } } { cvf::ref nativeAccessObject = RigResultAccessObjectFactory::createNativeDataAccessObject(eclipseCase, gridIndex, porosityModel, timeStepIndex, QString("TRANZ")); if (nativeAccessObject.notNull()) { cellFaceAccessObject->setDataAccessObjectForFace(cvf::StructGridInterface::POS_K, nativeAccessObject.p()); } } return cellFaceAccessObject; } return NULL; }