//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector<RimSaturationPressurePlot*> RicCreateSaturationPressurePlotsFeature::createPlots(RimEclipseResultCase* eclipseResultCase) { std::vector<RimSaturationPressurePlot*> plots; if (!eclipseResultCase) { RiaLogging::error( "RicCreateSaturationPressurePlotsFeature:: No case specified for creation of saturation pressure plots"); return plots; } RimProject* project = RiaApplication::instance()->project(); RimSaturationPressurePlotCollection* collection = project->mainPlotCollection()->saturationPressurePlotCollection(); if (eclipseResultCase && eclipseResultCase->ensureReservoirCaseIsOpen()) { eclipseResultCase->ensureDeckIsParsedForEquilData(); RigEclipseCaseData* eclipseCaseData = eclipseResultCase->eclipseCaseData(); bool requiredInputDataPresent = false; if (!eclipseCaseData->equilData().empty()) { if (eclipseCaseData && eclipseCaseData->results(RiaDefines::MATRIX_MODEL)) { RigCaseCellResultsData* resultData = eclipseCaseData->results(RiaDefines::MATRIX_MODEL); if (resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PRESSURE")) && resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) && resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PBUB"))) { requiredInputDataPresent = true; } } } if (requiredInputDataPresent) { plots = collection->createSaturationPressurePlots(eclipseResultCase); for (auto plot : plots) { plot->loadDataAndUpdate(); plot->zoomAll(); plot->updateConnectedEditors(); } } } return plots; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RiuRelativePermeabilityPlotUpdater::queryDataAndUpdatePlot(const RimEclipseView& eclipseView, size_t gridIndex, size_t gridLocalCellIndex, RiuRelativePermeabilityPlotPanel* plotPanel) { CVF_ASSERT(plotPanel); RimEclipseResultCase* eclipseResultCase = dynamic_cast<RimEclipseResultCase*>(eclipseView.eclipseCase()); RigEclipseCaseData* eclipseCaseData = eclipseResultCase ? eclipseResultCase->eclipseCaseData() : nullptr; if (eclipseResultCase && eclipseCaseData && eclipseResultCase->flowDiagSolverInterface()) { size_t activeCellIndex = CellLookupHelper::mapToActiveCellIndex(eclipseCaseData, gridIndex, gridLocalCellIndex); if (activeCellIndex != cvf::UNDEFINED_SIZE_T) { //cvf::Trace::show("Updating RelPerm plot for active cell index: %d", static_cast<int>(activeCellIndex)); std::vector<RigFlowDiagSolverInterface::RelPermCurve> relPermCurveArr = eclipseResultCase->flowDiagSolverInterface()->calculateRelPermCurves(activeCellIndex); // Make sure we load the results that we'll query below RigCaseCellResultsData* cellResultsData = eclipseCaseData->results(RiaDefines::MATRIX_MODEL); cellResultsData->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SWAT"); cellResultsData->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SGAS"); cellResultsData->findOrLoadScalarResult(RiaDefines::STATIC_NATIVE, "SATNUM"); // Fetch SWAT and SGAS cell values for the selected cell const size_t timeStepIndex = static_cast<size_t>(eclipseView.currentTimeStep()); cvf::ref<RigResultAccessor> swatAccessor = RigResultAccessorFactory::createFromNameAndType(eclipseCaseData, gridIndex, RiaDefines::MATRIX_MODEL, timeStepIndex, "SWAT", RiaDefines::DYNAMIC_NATIVE); cvf::ref<RigResultAccessor> sgasAccessor = RigResultAccessorFactory::createFromNameAndType(eclipseCaseData, gridIndex, RiaDefines::MATRIX_MODEL, timeStepIndex, "SGAS", RiaDefines::DYNAMIC_NATIVE); cvf::ref<RigResultAccessor> satnumAccessor = RigResultAccessorFactory::createFromNameAndType(eclipseCaseData, gridIndex, RiaDefines::MATRIX_MODEL, timeStepIndex, "SATNUM", RiaDefines::STATIC_NATIVE); const double cellSWAT = swatAccessor.notNull() ? swatAccessor->cellScalar(gridLocalCellIndex) : HUGE_VAL; const double cellSGAS = sgasAccessor.notNull() ? sgasAccessor->cellScalar(gridLocalCellIndex) : HUGE_VAL; const double cellSATNUM = satnumAccessor.notNull() ? satnumAccessor->cellScalar(gridLocalCellIndex) : HUGE_VAL; //cvf::Trace::show("cellSWAT = %f cellSGAS = %f cellSATNUM = %f", cellSWAT, cellSGAS, cellSATNUM); QString cellRefText = constructCellReferenceText(eclipseCaseData, gridIndex, gridLocalCellIndex, cellSATNUM); QString caseName = eclipseResultCase->caseUserDescription; plotPanel->setPlotData(eclipseCaseData->unitsType(), relPermCurveArr, cellSWAT, cellSGAS, caseName, cellRefText); return true; } } return false; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEclipseCellColors::updateLegendData(RimEclipseCase* rimEclipseCase, int currentTimeStep, RimRegularLegendConfig* legendConfig, RimTernaryLegendConfig* ternaryLegendConfig) { if (!legendConfig) legendConfig = this->legendConfig(); if (!ternaryLegendConfig) ternaryLegendConfig = this->m_ternaryLegendConfig(); if ( this->hasResult() ) { if ( this->isFlowDiagOrInjectionFlooding() ) { CVF_ASSERT(currentTimeStep >= 0); double globalMin, globalMax; double globalPosClosestToZero, globalNegClosestToZero; RigFlowDiagResults* flowResultsData = this->flowDiagSolution()->flowDiagResults(); RigFlowDiagResultAddress resAddr = this->flowDiagResAddress(); flowResultsData->minMaxScalarValues(resAddr, currentTimeStep, &globalMin, &globalMax); flowResultsData->posNegClosestToZero(resAddr, currentTimeStep, &globalPosClosestToZero, &globalNegClosestToZero); double localMin, localMax; double localPosClosestToZero, localNegClosestToZero; if ( this->hasDynamicResult() ) { flowResultsData->minMaxScalarValues(resAddr, currentTimeStep, &localMin, &localMax); flowResultsData->posNegClosestToZero(resAddr, currentTimeStep, &localPosClosestToZero, &localNegClosestToZero); } else { localMin = globalMin; localMax = globalMax; localPosClosestToZero = globalPosClosestToZero; localNegClosestToZero = globalNegClosestToZero; } CVF_ASSERT(legendConfig); legendConfig->disableAllTimeStepsRange(true); legendConfig->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); legendConfig->setAutomaticRanges(globalMin, globalMax, localMin, localMax); if ( this->hasCategoryResult() && m_reservoirView) { std::set<std::tuple<QString, int, cvf::Color3ub>, TupleCompare > categories; //std::set<std::tuple<QString, int, cvf::Color3ub> > categories; std::vector<QString> tracerNames = this->flowDiagSolution()->tracerNames(); int tracerIndex = 0; for ( const auto& tracerName : tracerNames ) { RimSimWellInView* well = m_reservoirView->wellCollection()->findWell(RimFlowDiagSolution::removeCrossFlowEnding(tracerName)); cvf::Color3ub color(cvf::Color3::GRAY); if ( well ) color = cvf::Color3ub(well->wellPipeColor()); categories.insert(std::make_tuple(tracerName, tracerIndex, color)); ++tracerIndex; } std::vector<std::tuple<QString, int, cvf::Color3ub>> reverseCategories; for ( auto tupIt = categories.rbegin(); tupIt != categories.rend(); ++tupIt ) { reverseCategories.push_back(*tupIt); } legendConfig->setCategoryItems(reverseCategories); } } else { CVF_ASSERT(rimEclipseCase); if ( !rimEclipseCase ) return; RigEclipseCaseData* eclipseCase = rimEclipseCase->eclipseCaseData(); CVF_ASSERT(eclipseCase); if ( !eclipseCase ) return; RigCaseCellResultsData* cellResultsData = eclipseCase->results(this->porosityModel()); CVF_ASSERT(cellResultsData); double globalMin, globalMax; double globalPosClosestToZero, globalNegClosestToZero; cellResultsData->minMaxCellScalarValues(this->eclipseResultAddress(), globalMin, globalMax); cellResultsData->posNegClosestToZero(this->eclipseResultAddress(), globalPosClosestToZero, globalNegClosestToZero); double localMin, localMax; double localPosClosestToZero, localNegClosestToZero; if ( this->hasDynamicResult() && currentTimeStep >= 0) { cellResultsData->minMaxCellScalarValues(this->eclipseResultAddress(), currentTimeStep, localMin, localMax); cellResultsData->posNegClosestToZero(this->eclipseResultAddress(), currentTimeStep, localPosClosestToZero, localNegClosestToZero); } else { localMin = globalMin; localMax = globalMax; localPosClosestToZero = globalPosClosestToZero; localNegClosestToZero = globalNegClosestToZero; } CVF_ASSERT(legendConfig); legendConfig->disableAllTimeStepsRange(false); legendConfig->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); legendConfig->setAutomaticRanges(globalMin, globalMax, localMin, localMax); if ( this->hasCategoryResult() ) { if ( this->resultType() == RiaDefines::FORMATION_NAMES ) { const std::vector<QString>& fnVector = eclipseCase->activeFormationNames()->formationNames(); legendConfig->setNamedCategoriesInverse(fnVector); } else if ( this->resultType() == RiaDefines::DYNAMIC_NATIVE && this->resultVariable() == RiaDefines::completionTypeResultName() ) { const std::vector<int>& visibleCategories = cellResultsData->uniqueCellScalarValues(this->eclipseResultAddress()); std::vector<RiaDefines::WellPathComponentType> supportedCompletionTypes = { RiaDefines::WELL_PATH, RiaDefines::FISHBONES, RiaDefines::PERFORATION_INTERVAL, RiaDefines::FRACTURE }; RiaColorTables::WellPathComponentColors colors = RiaColorTables::wellPathComponentColors(); std::vector< std::tuple<QString, int, cvf::Color3ub> > categories; for (auto completionType : supportedCompletionTypes) { if (std::find(visibleCategories.begin(), visibleCategories.end(), completionType) != visibleCategories.end()) { QString categoryText = caf::AppEnum<RiaDefines::WellPathComponentType>::uiText(completionType); categories.push_back(std::make_tuple(categoryText, completionType, colors[completionType])); } } legendConfig->setCategoryItems(categories); } else { legendConfig->setIntegerCategories(cellResultsData->uniqueCellScalarValues(this->eclipseResultAddress())); } } } } // Ternary legend update { CVF_ASSERT(rimEclipseCase); if ( !rimEclipseCase ) return; RigEclipseCaseData* eclipseCase = rimEclipseCase->eclipseCaseData(); CVF_ASSERT(eclipseCase); if ( !eclipseCase ) return; RigCaseCellResultsData* cellResultsData = eclipseCase->results(this->porosityModel()); size_t maxTimeStepCount = cellResultsData->maxTimeStepCount(); if ( this->isTernarySaturationSelected() && maxTimeStepCount > 1 ) { RigCaseCellResultsData* gridCellResults = this->currentGridCellResults(); { RigEclipseResultAddress resAddr(RiaDefines::DYNAMIC_NATIVE, "SOIL"); if ( gridCellResults->ensureKnownResultLoaded(resAddr) ) { double globalMin = 0.0; double globalMax = 1.0; double localMin = 0.0; double localMax = 1.0; cellResultsData->minMaxCellScalarValues(resAddr, globalMin, globalMax); cellResultsData->minMaxCellScalarValues(resAddr, currentTimeStep, localMin, localMax); ternaryLegendConfig->setAutomaticRanges(RimTernaryLegendConfig::TERNARY_SOIL_IDX, globalMin, globalMax, localMin, localMax); } } { RigEclipseResultAddress resAddr(RiaDefines::DYNAMIC_NATIVE, "SGAS"); if ( gridCellResults->ensureKnownResultLoaded(resAddr) ) { double globalMin = 0.0; double globalMax = 1.0; double localMin = 0.0; double localMax = 1.0; cellResultsData->minMaxCellScalarValues(resAddr, globalMin, globalMax); cellResultsData->minMaxCellScalarValues(resAddr, currentTimeStep, localMin, localMax); ternaryLegendConfig->setAutomaticRanges(RimTernaryLegendConfig::TERNARY_SGAS_IDX, globalMin, globalMax, localMin, localMax); } } { RigEclipseResultAddress resAddr(RiaDefines::DYNAMIC_NATIVE, "SWAT"); if ( gridCellResults->ensureKnownResultLoaded(resAddr) ) { double globalMin = 0.0; double globalMax = 1.0; double localMin = 0.0; double localMax = 1.0; cellResultsData->minMaxCellScalarValues(resAddr, globalMin, globalMax); cellResultsData->minMaxCellScalarValues(resAddr, currentTimeStep, localMin, localMax); ternaryLegendConfig->setAutomaticRanges(RimTernaryLegendConfig::TERNARY_SWAT_IDX, globalMin, globalMax, localMin, localMax); } } } } }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString Rim3dWellLogExtractionCurve::createCurveAutoName() const { RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>(m_case.value()); RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(m_case.value()); QStringList generatedCurveName; if (m_nameConfig->addWellName()) { RimWellPath* wellPath; this->firstAncestorOrThisOfTypeAsserted(wellPath); if (!wellPath->name().isEmpty()) { generatedCurveName += wellPath->name(); } } if (m_nameConfig->addCaseName() && m_case()) { generatedCurveName.push_back(m_case->caseUserDescription()); } if (m_nameConfig->addProperty() && !resultPropertyString().isEmpty()) { generatedCurveName.push_back(resultPropertyString()); } if (m_nameConfig->addTimeStep() || m_nameConfig->addDate()) { size_t maxTimeStep = 0; if (eclipseCase) { RigEclipseCaseData* data = eclipseCase->eclipseCaseData(); if (data) { maxTimeStep = data->results(m_eclipseResultDefinition->porosityModel())->maxTimeStepCount(); } } else if (geomCase) { RigGeoMechCaseData* data = geomCase->geoMechData(); if (data) { maxTimeStep = data->femPartResults()->frameCount(); } } if (m_nameConfig->addDate()) { QString dateString = wellDate(); if (!dateString.isEmpty()) { generatedCurveName.push_back(dateString); } } if (m_nameConfig->addTimeStep()) { generatedCurveName.push_back(QString("[%1/%2]").arg(m_timeStep()).arg(maxTimeStep)); } } return generatedCurveName.join(", "); }