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
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
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
* #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
Copies and plots created from templates kept the source DockWindowId. The dock
manager identifies dock widgets by name, so the earlier dock widget was deleted on
dock state restore, leaving a dangling pointer that crashed in setActiveViewer.
- Do not copy DockWindowId; copies get a new id
- Assign a new id if a dock widget with the same name exists
- Use QPointer for the dock widget
Wells sharing an export name now produce one WELSPECS/COMPORD record,
one set of MSW keywords, and no duplicate COMPDAT/COMPLUMP connections.
Events on any well in the group trigger the group's keywords.
Connections in cells shared by several well paths of a group are combined
into one record. MSW keywords are exported for the well tree of the first
group member selected for MSW export.
Fixes#14870
VALVE events no longer trigger WELSPECS, COMPORD, WELSEGS and COMPSEGS.
WELSEGS/COMPSEGS are only regenerated for tubing and perforation events.
Fixes#14873
WA_DeleteOnClose left RiuMainWindow::instance() and RiuPlotMainWindow::instance() null after the user closed a window, so any unguarded use crashed. Keep both windows alive for the application lifetime and rebuild their views when a closed window is shown again.
Fixes#14899.
- RifEclipseOutputFileTools::timeSteps: avoid integer division by zero when
the restart file has no INTEHEAD
- libecl ecl_grid: return NULL when the main EGRID grid cannot be created,
and skip NNCHEAD blocks that cannot be read
- libecl well_info: skip wells when the restart header cannot be read
- cvf::Frustum::isOutside: do not assert on an incomplete frustum, cull nothing
Fixes#14901.
Commits include a fix description and call stack, the PR lists all call stacks, and fixes also cover the same pattern in close surroundings. Doc shortened.
For nested hybrid grids, IJK range filters (I/J/K slices and IJK filters)
now refer exclusively to the original (coarse) grid IJK. Nested-grid local
IJK values are no longer offered, and every cell, including cells in all
refinement levels, is mapped to the original IJK of its top-most parent.
- Add RigNestedHybridGridLayout describing how original cells are embedded
in the flat grid, shared by the LGR reconstruction and the IJK mapping
- RigMainGrid: store the layout and compute the original IJK of any cell on
demand by following the parent cell chain, without per-cell storage
- Range filter UI: slider limits, clamping, defaults and active cell range
use the original grid dimensions; grid selection is hidden
- Evaluate range filters on all grids using the original IJK in the 3D view,
combined filters and data filters
- 3D view context menu slices use the original IJK of the picked cell
- Add unit tests for the layout, the IJK mapping against OLDIJK, and slice
filtering across refinement levels
RimWellRftPlot::updateFormationsOnPlot() runs during project load, before the track widgets are created. Skip the annotation update until the widget exists; onLoadDataAndUpdate() draws them later.
Fixes#14897.
A hidden label is never added to a layout, so it stayed parented to the
group box it was created in. When the field moved directly to another
group, the old group box was deleted together with the label, and the
next update hit a null label in PdmUiCheckBoxEditor.
Add GroupVisibilityByEnum to cafTestApplication to reproduce the crash.
T6 and T7 were both registered with mismatched serialization text ('T5' and
'T6' respectively), duplicating the text already used by T5 and T6. Use the
correct unique text for each enum value.
* Add Add Well Picks button to well log formation settings
* Expose formation zone colors and shading alpha from RFT track
* Average observed pressures per formation with full min/max range
* Show formation-colored observed pressure and depth filter in RFT correlation plots
* Default new RFT correlation plots to formation filter and ensemble parameter coloring
* Move Qwt code out of RFT correlation Rim classes
* Align RFT correlation depth filter bars and click zones with displayed track formations
Explicitly initialize the optional topXY member when constructing
RigWellPathFormation via aggregate initialization in the test helper,
avoiding a GCC -Wmissing-field-initializers warning.
Fixes#14882.
Let the RFT parameter cross plot reference a RimWellFormationsFile and use its
well-pick formations to filter/group data by zone, pushed down to the tornado
plot and RFT correlation sub plots.
New Zonation/Formation Names source WELL_PICKS_NO_TRAJECTORY resolves zone
depths directly from a well-picks file + well name, for tracks without a well
path (e.g. RFT plots without a trajectory). Kept strictly separate from the
existing WELL_PICK_FILTER (well-path-based) source so neither falls back into
the other's resolution path. RFT plots automatically select this source when
no well path exists but a matching well-picks file is found.
Also avoids including RiaWellLogTrackDefines.h from header files; the affected
headers now use opaque enum forward declarations, with the real definitions
included only in the .cpp files that need the enumerator values.
RimWellPath and RimWellPathCollection now reference a RimWellFormationsFile in the
project-level well formations collection instead of owning per-well-path formations
geometry directly. Reworked the well-pick import command (renamed
RifWellPathFormationsImporter to RicImportWellFormationsFeature) to create/find the
project-level file and link it to the matching (or newly created) well path.
Parse depth-based FMU well-pick formations.csv files in RifWellPathFormationReader
and expose them as a project-level RimWellFormationsCollection of RimWellFormationsFile
objects. RigWellPathFormations becomes a value type with top/base MD and TVD depths
per formation, independent from the existing K-layer-index .lyr formation names.
Return values instead of out-parameters, and move the error dialog
from the reader to the importer so the reader can be unit tested.
Fix crash in level detection when erasing while iterating.
The object is immutable after construction and small, so reference
counting via cvf::Object adds nothing. Store it by value and use
std::optional where it may be absent.
A well in a radial grid is on the grid axis or on a face between angular cells, so no cells are intersected. Fall back to the innermost cell column placed by depth. Fixes empty PLT and RFT grid curves.
Rename the python wheel/sdist to rips.whl/rips.tar.gz (dropping the version number) when publishing to the rolling dev-latest release, so the download link stays stable across builds.
Include the dist-python artifact (wheel/sdist built for PyPI) when packaging assets for the rolling dev-latest release, and rename the python-distribution artifact to dist-python for consistency with the dist-<name> naming convention used by other build artifacts.
Region-to-region addresses were reconstructed as "R1 - R2" (with spaces) when
looking up keywords for ensemble realizations without a pre-built address map,
but opm-common's on-disk keyword format has no spaces ("R1-R2"). This caused
silent data loss for region-to-region vectors (RGFT*, ROFT*, RWFT*, etc.) in
all but one ensemble realization.
Fix formatUiTextRegionToRegion() to use "R1-R2", and add a regression test.
Fixes#14853.
- Move depthTypeAbbreviation(), computePressureSamplesPerCase() and
computeMeanPressurePerCase() out of RimParameterRftCrossPlot into a new
standalone RimRftCrossPlotTools namespace, shared by RimParameterRftCrossPlot
and RimRftTornadoPlot (removing duplicated code in the latter).
- Extract pure, reader-independent helpers filterPressuresByDepthRange() and
computeMean() so the depth filtering and averaging logic can be unit tested
without RFT reader/ensemble mocks.
- Add RimRftCrossPlotTools-Test.cpp with gtest cases covering depth range
filtering (disabled, inclusive bounds, out-of-range, mismatched sizes) and
mean computation (empty/normal), plus depth type abbreviation.
Move RimWellLogRftCurve::rftCurveDepthValues into RimRftCrossPlotTools
This static helper's only caller was already RimRftCrossPlotTools::computePressureSamplesPerCase, so move it alongside the other RFT cross plot/tornado plot helpers for consistency.
Adds a 'Sampling' dropdown to RimParameterRftCrossPlot: 'Mean per Realization' (previous, default behavior) plots one point per case using the mean RFT pressure within the depth range, while 'All Samples' plots one point per individual RFT pressure sample within the depth range, grouped per case/color. Extracted the shared per-case depth filtering logic into computePressureSamplesPerCase(), with computeMeanPressurePerCase() now built on top of it. Axis labels and exported ASCII data adapt to the selected mode.
Propagates the Depth Unit selection from RimRftCorrelationReportPlot to the parameter cross plot and tornado plot depth-range filters, not just the RFT pressure profile sub-plot.
- RimWellLogRftCurve::rftCurveDepthValues now takes a RiaDefines::DepthType parameter and fetches the TVD channel directly when TVD is requested (falling back to MD if unavailable), instead of always preferring MD.
- RimParameterRftCrossPlot and RimRftTornadoPlot gain a depth type field (driven by the parent report plot, hidden in their own UI) and computeMeanPressurePerCase() takes the depth type so the depth-range filter operates on the selected unit.
- Axis labels, group titles, and auto-generated plot titles now show MD/TVD instead of being hardcoded to MD.
Stop silently substituting TVD for MD (or vice versa) in RFT correlation depth filter
rftCurveDepthValues() previously fell back to the other depth type when the requested one (MD or TVD) had no data, causing MD and TVD selections to silently produce identical results. Now it strictly returns only the requested depth type, returning an empty vector if unavailable. This naturally excludes such cases from the correlation cross plot and tornado plot, showing a blank plot instead of misleading data.
Adds a top-level Depth Unit dropdown to RimRftCorrelationReportPlot, restricted to measured depth and true vertical depth. The selection is pushed down to the owned RimWellRftPlot sub-plot on construction, project load, and whenever the dropdown changes.
RimWellRftPlot: add detachFromDockPermanently(), which removes the plot from its dock
and discards the window controller for good (unlike removeWindowFromDock(), which must
leave the controller intact so the window can be re-docked later). RimWellRftPlot no
longer docks itself in its constructor, since it can also be embedded as a non-dockable
child of another plot. RicCreateRftPlotsFeature now explicitly calls dockAsPlotWindow()
for its stand-alone RFT plot to preserve existing behavior.
RimRftCorrelationReportPlot: use detachFromDockPermanently() instead of
removeWindowFromDock() for its embedded RimWellRftPlot, and re-apply that detachment in
initAfterRead(), since the PDM factory bypasses the constructor when restoring child
plots from a project file.