Commit Graph
4319 Commits
Author SHA1 Message Date
Magne Sjaastad 3de9b3c1aa Update toggle icon automatically on UI change and after read 2026-10-17 13:23:22 +02:00
Magne Sjaastad 95bee61f91 Replace tree item tags attribute with virtual PdmUiObjectHandle::treeItemTags() 2026-10-17 13:23:22 +02:00
Magne Sjaastad b4e2cd4126 Address review comments: use slider setRange for polygon depth, restore seismic clip min 2026-10-17 13:23:22 +02:00
Magne Sjaastad 43a4378cee ResInsight: Migrate commands, UI and application code to attribute map 2026-10-17 13:23:22 +02:00
Magne Sjaastad 064ac45da0 ResInsight: Migrate project data model to attribute map 2026-10-17 13:23:22 +02:00
Magne Sjaastad c57200331e ResInsight: Migrate summary data model to attribute map 2026-10-17 13:23:22 +02:00
hnilandClaude Opus 5.5 c6090249ad Scripting: loadCase opens geomechanical cases and the grid's .pvd surfaces
loadCase only went through the grid case import, so .odb, .inp and .pvd
files could not be opened from Python or other gRPC clients. Open them
the way the GUI does and return the GeoMechCase.

The GUI import also imports "<CASE>*.pvd" surfaces next to the grid
file (e.g. fractures written by the simulator); loadCase now does the
same, so a scripted load gives the same project as the GUI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 14:14:57 +02:00
Magne Sjaastad 597a7775d9 #8370: Address review comments
Keep original additional summary files on Save As, reject cases combined with ensembles, keep unrestored additional file mappings, support growing file sets, update short names on ensemble import, simplify aggregator and example.
2026-10-16 09:57:12 +02:00
Magne Sjaastad 60876e0bdd #8370: Restore user-defined vectors for file set ensembles and keep project portable 2026-10-16 09:57:12 +02:00
Magne Sjaastad 62b040ac42 #8370: Add Project.summary_ensembles and summary_plot_collection 2026-10-16 09:57:12 +02:00
Magne Sjaastad fac5eb5f3b #8735: Add SummaryPlotCollection multi plot commands and subplots 2026-10-16 09:57:12 +02:00
Magne Sjaastad 1272ec7bd0 #14689: Expose EnsembleCurveSet and fix returned class names in Python generator 2026-10-16 09:57:12 +02:00
Magne Sjaastad 0d64a52115 #8370: Include Python-defined vectors in ensemble data sources and selection 2026-10-16 09:57:12 +02:00
Magne Sjaastad 038dabc77b #8370: Create summary addresses and handle unknown vectors when setting summary values 2026-10-16 09:57:12 +02:00
magnesj 36f649b8ad Fixes by clang-format 2026-10-15 18:05:59 +02:00
Magne Sjaastad 3fea49441d Use consistent formation colors in RFT plots based on formations file order
Palette colors for formations missing from the legend were assigned by position in the per-well zone list, so the same formation could get different colors for different wells. Assign them by order of first appearance in the formations file instead.
2026-10-15 18:01:46 +02:00
Magne Sjaastad c323846ec5 #13475: Unified LGR completion export tables and single WELSPECL entry per well
* Export LGR completions in single COMPDATL, WPIMULTL and COMPLMPL tables
* Export only first WELSPECL entry per well
* Move LGR test well path to subfolder and format test
2026-10-15 15:25:49 +02:00
Magne Sjaastad 1d7d0eb763 Show RFT correlation zone bars on both sides and make them wider
The selected-formation bars in the RFT track plots are now drawn on both edges and are 50% wider.
2026-10-15 15:24:47 +02:00
Magne Sjaastad 5d0c011779 Nested hybrid grid: reject active-cell-only grids and fix setCellResultIndex assert
Active-cell grids report a fixed total cell count, so appended LGR cells overflowed the active cell info array. Return an error instead, and assert on the reservoir cell index.
2026-10-15 13:21:55 +02:00
Kristian Bendiksen bcfa6e9fea Nested hybrid grid: Move well connections to reconstructed LGR cells
Well connections read from the restart file referenced the original refined
cells in the main grid. These cells are hidden after reconstruction, but the
well cell visualization does not check the invalid flag, so they were still
drawn. Re-point well connections and well heads to the corresponding LGR cells
and recompute the well cells per grid.
2026-10-15 13:21:55 +02:00
Kristian Bendiksen a789bdb4b4 Well target mapping: option to avoid growing across faults
Add AvoidFaults option that blocks cluster growth across fault faces and
fault NNCs, and generate a WELL_TARGET_FAULT_FACES result with the number
of fault faces per cell.
2026-10-15 12:56:18 +02:00
Kristian Bendiksen 19f94395a7 Well target mapping: separate start and grow data filters
Add a start data filter used when finding starting cells. If empty, the
grow filter is used. An empty grow filter allows growing anywhere.
2026-10-15 12:56:18 +02:00
jonjenssen da4e6e15cd Make sure we recreate all 3d views when main window is reopened. 2026-10-14 16:16:54 +02:00
Magne Sjaastad f8b4da83e8 #13306: Fix local grid connection summary vectors (LCGFRU) missing for ESMRY
Categorize LCGFRU/LCOFRU/LCWFRU as SUMMARY_WELL_CONNECTION_LGR and fix token count check when parsing LGR connection addresses.
2026-10-14 10:45:52 +02:00
Magne Sjaastad 71be2d0911 #14911: Use summary vector short name as axis title when description is missing 2026-10-14 10:45:36 +02:00
Kristian Bendiksen 04df5d0309 Fix MSW segmentation test initializers 2026-10-14 10:45:21 +02:00
Magne Sjaastad c6927648e8 #11172: Add auto Arps decline curve type
Add auto Arps decline curve fitting, document the algorithm and reference the AutoDCA repository.
2026-10-13 12:44:00 +02:00
Magne Sjaastad 393d32578e #11172: Create decline curves with distinct colors and tree-ordered legend 2026-10-13 12:44:00 +02:00
Magne Sjaastad 56944d8b1b #11172: Show decline curve equations in plot and select time by date 2026-10-13 12:44:00 +02:00
Magne Sjaastad a374d6f693 #11172: Support stacked overlay frames in all four plot corners 2026-10-13 12:44:00 +02:00
Magne Sjaastad 9f0b9d2840 #11172: Move decline curve math to RigDeclineCurveCalculator
Add least squares regression as an alternative to the start/end point fit.
2026-10-13 12:44:00 +02:00
Magne Sjaastad e217ffb5c6 Enable flow diagnostics for grids imported with opm-common
* Update flowdiag-app submodule with grid source abstraction
* Add opm-common grid source for flow diagnostics
* Enable flow diagnostics for grids imported with opm-common
* Test flow graph from opm-common matches resdata
* Test flow diagnostics results are equal for all grid readers
* Document EGrid constructor behavior in flow diagnostics grid source
2026-10-13 12:43:01 +02:00
Magne Sjaastad 96bb127446 #14804: Make segment length fields scriptable and check them in Python test 2026-10-12 19:12:08 +02:00
Magne Sjaastad 97d132685b #14804: Address review comments on segment placement, ISEG gRPC, min/max validation 2026-10-12 19:12:08 +02:00
Magne Sjaastad d8f346e9ab #14804 MSW export: Segmentation controls per interval and around perforations
Add fixed, min and max segment length per segment interval (fixed is exclusive with min/max, min and max can be combined), connect COMPSEGS rows to the nearest segment node, and add collection options for a single segment before the first and after the last perforation.
2026-10-12 19:12:08 +02:00
Magne Sjaastad 2f7de9469f #13568 MSW export: Optionally export ISEG in COMPSEGS
Fixes #13568.
2026-10-12 19:12:08 +02:00
Magne Sjaastad fcaf62dae5 #14906: Fix crash in ternary result coloring when eclipse case is missing
Crash signature 1a259402c999.

RivTernaryTextureCoordsCreator calls cellResultColors->eclipseCase()->eclipseCaseData() unchecked in both constructors, and then eclipseCase->gridCellToResultWellIndex(). eclipseCase() is a PdmPointer and is null once the case is gone.

Read the case data only when the case exists, and create the pipe-in-cell evaluator only when the case data and well collection exist.

Call stack:
[3] RimEclipseCase::eclipseCaseData() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:196
[4] RivTernaryTextureCoordsCreator::RivTernaryTextureCoordsCreator(RimEclipseResultDefinition const*, RimTernaryLegendConfig*, RimSimWellInViewCollection*, unsigned long, unsigned long, cvf::StructGridQuadToCellFaceMapper const*) at ResInsight/ApplicationLibCode/ModelVisualization/RivTernaryTextureCoordsCreator.cpp:55
[5] RivGridPartMgr::updateCellResultColor(unsigned long, RimEclipseCellColors*) at ResInsight/ApplicationLibCode/ModelVisualization/RivGridPartMgr.cpp:295
[6] RivReservoirPartMgr::updateCellResultColor(unsigned long, RimEclipseCellColors*) at ResInsight/ApplicationLibCode/ModelVisualization/RivReservoirPartMgr.cpp:129
[7] RimEclipseView::updateVisibleCellColors() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:1119
[8] RimEclipseView::onUpdateDisplayModelForCurrentTimeStep() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:951
[9] Rim3dView::updateDisplayModelForCurrentTimeStepAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp:673
[10] RiuViewer::setCurrentFrame(int) at ResInsight/ApplicationLibCode/UserInterface/RiuViewer.cpp:1042
[11] RimViewLinker::updateTimeStep(Rim3dView*, int) at ResInsight/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp:119
[12] RiuViewer::slotSetCurrentFrame(int) at ResInsight/ApplicationLibCode/UserInterface/RiuViewer.cpp:365
[14] caf::FrameAnimationControl::changeFrame(int) at ResInsight/cmakebuild/Fwk/AppFwk/cafAnimControl/cafAnimControl_autogen/EWIEGA46WW/moc_cafFrameAnimationControl.cpp:321
[24] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[30] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[41] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[42] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad c1cf37b792 #14906: PolygonFilter: Invalidate cached cells on case change and guard cell index
Crash signature 43cb673b7481.

RimPolygonFilter::updateCellIndexFilter writes visibility using cached m_cells indices without a bounds check. The cache is cleared only in onGridChanged(), so when the Eclipse case changes to a grid with fewer cells the stale indices write past the end of the array.

Override setCase() to clear the cached cells, and skip indices outside the visibility array.

Call stack:
[3] RimPolygonFilter::updateCellIndexFilter(cvf::Array<unsigned char>*, cvf::Array<unsigned char>*, int) at ResInsight/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp:399
[4] RimCellFilterCollection::updateCellVisibilityByIndex(cvf::Array<unsigned char>*, cvf::Array<unsigned char>*, unsigned long) const at ResInsight/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellFilterCollection.cpp:605
[5] RivReservoirViewPartMgr::computeFilterVisibility(RivCellSetEnum, cvf::Array<unsigned char>*, RigGridBase const*, cvf::Array<unsigned char> const*, RimCellFilterCollection const*) at ResInsight/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp:755
[6] RivReservoirViewPartMgr::computeVisibility(cvf::Array<unsigned char>*, RivCellSetEnum, RigGridBase*, unsigned long) at ResInsight/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp:352
[7] RivReservoirViewPartMgr::createGeometry(RivCellSetEnum) at ResInsight/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp:278
[8] RivReservoirViewPartMgr::appendStaticGeometryPartsToModel(cvf::ModelBasicList*, RivCellSetEnum, std::vector<unsigned long, std::allocator<unsigned long> > const&) at ResInsight/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp:205
[9] RimEclipseView::onCreateDisplayModel() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:737
[10] Rim3dView::createDisplayModelAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp:718
[11] RiaViewRedrawScheduler::updateAndRedrawScheduledViews() at ResInsight/ApplicationLibCode/Application/RiaViewRedrawScheduler.cpp:93
[16] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[26] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[27] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad 98c638418c #14906: Avoid abort in New Default Summary Plot with empty selection
Crash signature 77d8eac5b954.

RicNewDefaultSummaryPlotFeature::onActionTriggered ends with CAF_ASSERT( !selectedEnsembles.empty() ). If the selection no longer has a summary case or ensemble when the action fires, the assert aborts.

Only create ensemble curve sets when the ensemble selection is not empty.

Call stack:
[5] RicNewDefaultSummaryPlotFeature::onActionTriggered(bool) at ResInsight/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewDefaultSummaryPlotFeature.cpp:148
[6] caf::CmdFeature::actionTriggered(bool) at ResInsight/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp:176
[15] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[21] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[33] RiuMultiPlotPage::contextMenuEvent(QContextMenuEvent*) at ResInsight/ApplicationLibCode/UserInterface/RiuMultiPlotPage.cpp:449
[37] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[42] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[53] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[54] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad 8a0f2dc877 #14906: Fix crash drawing seismic surface intersection lines for empty sections
Crash signature 69f8ebe0f20e.

RivSeismicSectionPartMgr::appendSurfaceIntersectionLines reads texturePart.rect[0] and rect[1] without a size check. texturedSection() clears rect and returns early when the section has no geometry, so the read is out of range.

Skip parts with fewer than two corner points.

Call stack:
[3] cvf::Vector3<double>::operator=(cvf::Vector3<double> const&) at ResInsight/Fwk/VizFwk/LibCore/cvfVector3.inl:140
[4] RimSeismicSectionCollection::appendPartsToModel(Rim3dView*, cvf::ModelBasicList*, caf::DisplayCoordTransform*, cvf::BoundingBox const&) at ResInsight/ApplicationLibCode/ProjectDataModel/Seismic/RimSeismicSectionCollection.cpp:183
[5] RimGeoMechView::onCreateDisplayModel() at ResInsight/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp:322
[6] Rim3dView::createDisplayModelAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp:718
[7] RiaViewRedrawScheduler::updateAndRedrawScheduledViews() at ResInsight/ApplicationLibCode/Application/RiaViewRedrawScheduler.cpp:93
[12] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[22] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[23] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad 45bcb34634 #14906: Add test for restart file without INTEHEAD
Crash signature 482d5570b385.

RifEclipseOutputFileTools::timeSteps divided the INTEHEAD count by timeSteps->size(), which is zero for a restart file without INTEHEAD. The guard is already in dev (#14901); add the test TimeStepsFileWithoutIntehead, which writes an UNRST with only SEQNUM.

Call stack:
2026-10-12 19:00:45 +02:00
Magne Sjaastad 3a257effd2 #14906: Handle missing element property file when loading element results
Crash signature c0fae31c2301.

RifElementPropertyReader reads column metadata when the file is added and the data later, on cell pick. If the file has since been moved or deleted, readData returns no data and CAF_ASSERT( dataColumns.size() == table.data.size() ) aborts.

Return an empty result when the table has no data or the column count does not match. New test ReadAllElementPropertiesFromRemovedFile.

Call stack:
[5] cvf::AssertHandlerConsole::handleAssert(char const*, int, char const*, char const*) at ResInsight/Fwk/VizFwk/LibCore/cvfAssert.cpp:125
[6] RifElementPropertyReader::readAllElementPropertiesInFileContainingField(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) at ResInsight/ApplicationLibCode/FileInterface/RifElementPropertyReader.cpp:120
[7] RigFemPartResultsCollection::findOrLoadScalarResult(int, RigFemResultAddress const&) at ResInsight/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp:451
[8] RigFemPartResultsCollection::assertResultsLoaded(RigFemResultAddress const&) at ResInsight/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp:1014
[9] RimGeoMechResultDefinition::hasResult() at ResInsight/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.cpp:722
[10] RiuSelectionChangedHandler::addResultCurveFromSelectionItem(RiuGeoMechSelectionItem const*) const at ResInsight/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp:208
[11] RiuSelectionChangedHandler::handleItemAppended(RiuSelectionItem const*) const at ResInsight/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp:119
[12] RiuCellAndNncPickEventHandler::handle3dPickEvent(Ric3dPickEvent const&) at ResInsight/ApplicationLibCode/UserInterface/RiuCellAndNncPickEventHandler.cpp:459
[13] RiuViewerCommands::handlePickAction(int, int, QFlags<Qt::KeyboardModifier>) at ResInsight/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp:718
[17] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[23] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[34] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[35] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad db1510232d #14906: FlowRateCurve: Guard against null plot curve in onLoadDataAndUpdate
Crash signature 9f3186ce4814.

RimWellFlowRateCurve::onLoadDataAndUpdate calls m_plotCurve->setTitle() after updateCurvePresentation(). Turning Show Curve off makes that call detach( true ), which deletes m_plotCurve and sets it to null, so the next line dereferences null.

Only call setTitle() when m_plotCurve is not null.

Call stack:
[3] RimWellFlowRateCurve::onLoadDataAndUpdate(bool) at ResInsight/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp:166
[4] RimPlotCurve::loadDataAndUpdate(bool) at ResInsight/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp:587
[5] non-virtual thunk to RimWellFlowRateCurve::fieldChangedByUi(caf::PdmFieldHandle const*, QVariant const&, QVariant const&) at ResInsight/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.h:63
[6] caf::PdmUiFieldHandle::notifyFieldChanged(QVariant const&, QVariant const&) at ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldHandle.cpp:75
[7] caf::PdmFieldUiCap<caf::PdmField<bool> >::setValueFromUiEditor(QVariant const&, bool) at ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl:116
[8] caf::CmdFieldChangeExec::redo() at ResInsight/Fwk/AppFwk/cafCommand/cafCmdFieldChangeExec.cpp:139
[10] caf::CmdUiCommandSystemImpl::fieldChangedCommand(std::vector<caf::PdmFieldHandle*, std::allocator<caf::PdmFieldHandle*> > const&, QVariant const&) at ResInsight/Fwk/AppFwk/cafCommand/cafCmdUiCommandSystemImpl.cpp:146
[11] caf::PdmUiCommandSystemProxy::setUiValueToField(caf::PdmUiFieldHandle*, QVariant const&) at ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.cpp:113
[12] caf::PdmUiTreeViewQModel::setData(QModelIndex const&, QVariant const&, int) at ResInsight/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeViewQModel.cpp:761
[23] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[29] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1828
[40] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[41] __libc_start_main at :0
2026-10-12 19:00:45 +02:00
Magne Sjaastad 50e4b67100 Guard linked view result text against missing eclipse case
RiuResultTextBuilder::resultTextFromLinkedViews() calls isGridSizeEqualTo() on the picked view's case without a null check.

Return early when the view has no case.

Call stack:
[3] RimEclipseCase::eclipseCaseData() const at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:202
[4] RimEclipseCase::mainGrid() const at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:272
[5] RimEclipseCase::isGridSizeEqualTo(RimEclipseCase const*) const at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:285
[6] RiuResultTextBuilder::resultTextFromLinkedViews() const at ResInsight/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp:826
[7] RiuResultTextBuilder::gridResultDetails() at ResInsight/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp:377
[9] RiuSelectionChangedHandler::updateResultInfo(RiuSelectionItem const*) const at ResInsight/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp:389
[11] RiuCellAndNncPickEventHandler::handle3dPickEvent(Ric3dPickEvent const&) at ResInsight/ApplicationLibCode/UserInterface/RiuCellAndNncPickEventHandler.cpp:459
2026-10-12 19:00:45 +02:00
Magne Sjaastad f22e96b2f5 Guard contour map projection against missing eclipse case
RimEclipseContourMapProjection::updateGridInformation() dereferences eclipseCase() unchecked. It is null when the contour map view has no case, e.g. when a grid calculation triggers updateAll3dViews.

updateGridInformation() resets the grid and projection and returns when the case or its data is missing. generateResultsIfNecessary() returns when there is no projection, and computeMinMaxValuesAllTimeSteps() handles a missing case. New test RimEclipseContourMapProjection.GenerateResultsWithoutEclipseCase.

Call stack:
[3] RimEclipseCase::eclipseCaseData() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:196
[4] RimEclipseContourMapProjection::updateGridInformation() at ResInsight/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp:250
[5] RimContourMapProjection::generateResultsIfNecessary(int) at ResInsight/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp:138
[6] RimEclipseContourMapProjection::clearGridMappingAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp:167
[7] RimReloadCaseTools::updateAll3dViews(RimEclipseCase*) at ResInsight/ApplicationLibCode/ProjectDataModel/RimReloadCaseTools.cpp:157
[8] RimGridCalculation::updateDependentObjects() at ResInsight/ApplicationLibCode/ProjectDataModel/RimGridCalculation.cpp:762
[9] RicUserDefinedCalculatorUi::calculate() const at ResInsight/ApplicationLibCode/Commands/RicUserDefinedCalculatorUi.cpp:178
[10] RicCalculatorWidgetCreator::slotCalculate() at ResInsight/ApplicationLibCode/Commands/RicCalculatorWidgetCreator.cpp:205
2026-10-12 19:00:45 +02:00
Magne Sjaastad 067c9c8880 Catch exceptions when reading INIT file for flow diagnostics
RigOpmFlowDiagStaticData reads the INIT file in its member initializer, outside the existing try blocks. A malformed INIT file throws std::invalid_argument, which escapes to std::terminate.

Catch the exception in ensureStaticDataObjectInstanceCreated(), log a warning and return false. All callers already handle false.

Call stack:
[5] manageTerminate() at ResInsight/ApplicationExeCode/RiaMainTools.cpp:249
[11] Opm::ECLInitFileData::ECLInitFileData(boost::filesystem::path) at ResInsight/ThirdParty/custom-opm-flowdiag-app/opm-flowdiagnostics-applications/opm/utility/ECLResultData.cpp:1650
[12] RigOpmFlowDiagStaticData::RigOpmFlowDiagStaticData(...) at ResInsight/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp:51
[13] std::make_unique<RigOpmFlowDiagStaticData, ...>(...) at /opt/rh/gcc-toolset-13/root/usr/include/c++/13/bits/unique_ptr.h:1070
[14] RigFlowDiagSolverInterface::calculatePvtDynamicPropertiesFvf(int, double, double, double, double*, double*) at ResInsight/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp:859
[15] RiuPvtPlotUpdater::queryDataAndUpdatePlot(...) at ResInsight/ApplicationLibCode/UserInterface/RiuPvtPlotUpdater.cpp:137
[16] RiuPlotUpdater::doDelayedUpdate() at ResInsight/ApplicationLibCode/UserInterface/RiuPlotUpdater.cpp:86
[17] RiuPvtPlotPanel::showEvent(QShowEvent*) at ResInsight/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.cpp:341
2026-10-12 19:00:45 +02:00
Magne Sjaastad c27f25ae8a Guard flow diag derived results against missing eclipse case data
RigFlowDiagResults::activeCellInfo() dereferences the ancestor RimEclipseResultCase and its eclipseCaseData() unchecked. The derived results (TOF, Cell Fraction, Communication, Max Fraction Tracer) crash when the solution is detached or the case data is released.

activeCellInfo() now returns nullptr when the case or its data is missing, and the derived-result calculations return nullptr in that case. New test RigFlowDiagResults.DerivedResultWithoutEclipseCase.

Call stack:
[4] RigFlowDiagResults::calculateDerivedResult(RigFlowDiagResultAddress const&, unsigned long) at ResInsight/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp:211
[5] RigFlowDiagResults::findOrCalculateResult(RigFlowDiagResultAddress const&, unsigned long) at ResInsight/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp:95
[6] RigFlowDiagStatCalc::minMaxCellScalarValues(unsigned long, double&, double&) at ResInsight/ApplicationLibCode/ReservoirDataModel/RigFlowDiagStatCalc.cpp:49
[7] RigStatisticsDataCache::minMaxCellScalarValues(unsigned long, double&, double&) at ResInsight/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp:121
[8] RimEclipseResultDefinitionTools::updateLegendForFlowDiagnostics(...) at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinitionTools.cpp:422
[9] RimEclipseResultDefinition::updateRangesForExplicitLegends(...) at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp:1705
[10] RimEclipseView::updateLegendRangesTextAndVisibility(...) at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:1699
[11] RimEclipseView::onUpdateLegends() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:1568
[12] RimEclipseView::onCreateDisplayModel() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:854
2026-10-12 19:00:45 +02:00
Magne Sjaastad 6df07f04f6 Guard streamline update against missing eclipse case
RimStreamlineInViewCollection::findStartCells() dereferences eclipseCase() unchecked. The collection's case pointer can be null while the view's mainGrid() is valid, e.g. during project load before propagateEclipseCaseToChildObjects().

Return early from updateStreamlines() when the case or its data is missing.

Call stack:
[3] RimEclipseCase::eclipseCaseData() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp:197
[4] RimStreamlineInViewCollection::findStartCells(...) at ResInsight/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp:394
[5] RimStreamlineInViewCollection::updateStreamlines() at ResInsight/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp:454
[6] RimEclipseView::onUpdateDisplayModelForCurrentTimeStep() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:932
[7] Rim3dView::updateDisplayModelForCurrentTimeStepAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp:723
[8] RiuViewer::setCurrentFrame(int) at ResInsight/ApplicationLibCode/UserInterface/RiuViewer.cpp:1059
[9] RimEclipseView::onCreateDisplayModel() at ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp:849
[10] Rim3dView::createDisplayModelAndRedraw() at ResInsight/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp:768
[11] RiaViewRedrawScheduler::updateAndRedrawScheduledViews() at ResInsight/ApplicationLibCode/Application/RiaViewRedrawScheduler.cpp:93
[12] RiaApplication::loadProject(...) at ResInsight/ApplicationLibCode/Application/RiaApplication.cpp:953
2026-10-12 19:00:45 +02:00
Magne Sjaastad c57864df51 #14889: RFT Ensemble: Additional UI fixes
* #14889: Do not change main window when importing well picks
* #14889: Fix clipped bottom of plots in dock windows
* #14889: Add Create RFT Correlation Report to Ensemble Correlation Plots menu
* #14889: Show imported observed FMU RFT data as table
* #14889: Use time step from source RFT plot in RFT correlation report
* #14889: Show observed data in RFT cross plot when no RFT samples are available
* #14889: Keep RFT plot zoom when toggling formation in RFT correlation report
* #14889: Do not change main window when importing formations
* #14889: Use general delete for observed data and improve FMU RFT data name
2026-10-12 18:50:57 +02:00
Magne Sjaastad fb566f112c #14903: Guard other selection item users against deleted result definition 2026-10-12 18:49:08 +02:00