Commit Graph
2631 Commits
Author SHA1 Message Date
Magne Sjaastad 0d13f49a87 #15168: Simplify correlation report plot names in project tree
Name the summary correlation report 'Summary Correlation: ...' and give report sub-plots fixed names, harmonized with the RFT correlation report. Plot titles are unchanged. Also refresh the project tree and avoid duplicate history curve sets after reload in the summary report, and re-dock floating sub-plots when restoring the RFT report layout.
2026-11-13 11:11:49 +01:00
Magne Sjaastad a92604d52f #15168: Activate containing plot when a sub plot is selected
Add RimViewWindow::setContainingViewWindow/activationWindow, set explicitly by multi plots, depth track plots, and the correlation, RFT correlation, well allocation and well distribution plots. RiuPlotMainWindow resolves the selected window through activationWindow, and the duplicated multi plot activation code is merged.
2026-11-13 11:11:49 +01:00
Magne Sjaastad 55cf651791 #15168: RFT correlation report: lock sub-plot well and Eclipse case
The report plot sets the well name and ensemble curve set Eclipse case on its RFT sub-plot read-only.
2026-11-13 11:11:49 +01:00
Magne Sjaastad e3f95cab7f #15160: Consolidate duplicated hex cell node ordering definitions
Add shared face vertex, opposite face vertex and reservoir simulator corner index mapping tables to StructGridInterface and use them instead of local copies.
2026-11-12 14:15:46 +01:00
JJ 0c9dd08e7b Calculate quality control results (#15149)
* Register qc results and calculate automatically on demand
2026-11-10 20:42:45 +01:00
Magne Sjaastad 3319f30db6 Move annotation label position enum to separate header
Rim3dView.h only needs the enum, so including RivAnnotationTools.h there caused large rebuilds when the tools header changed.
2026-11-10 15:38:08 +01:00
Magne Sjaastad e418844c7c Production network: Zoom All fits visible nodes and is connected to toolbar 2026-11-10 09:41:24 +01:00
Magne Sjaastad deaf13b742 Collapse production network below first two levels when creating plot 2026-11-10 09:41:24 +01:00
Magne Sjaastad 512c22b46e #15084: Address review comments and add Above/Below/Between/Outside value filter types
Show the value range of all rows when a value filter is active.
2026-11-10 09:40:19 +01:00
Magne Sjaastad 4daaa159ff #15084: Use shared statistics type enum
Add RiaDefines::StatisticsType and use it in Summary Table, statistics contour map and ensemble surface statistics instead of three separate enums with the same values.
2026-11-10 09:40:19 +01:00
Magne Sjaastad bb5da52a2d #15084: Add ensemble statistics as data source and Show Plot Data to Summary Table 2026-11-10 09:40:19 +01:00
Magne Sjaastad 082ff3c04f #15084: Add value filter to Summary Table 2026-11-10 09:40:19 +01:00
Stefan Crooijmans 707cec5b7f #12460 Python: Fail the project save when a triangulated surface can not be written
Review follow-up for #15127: onProjectBeingSaved() returns false when the
surface has data that could not be written, and saveProjectAs() then fails
with a message naming the surface before the project file is written, so a
write error no longer reports a successful save with the surface data lost.
2026-11-09 19:48:06 +01:00
Stefan Crooijmans 467ef95d78 #12460 Python: Keep triangulated surface files apart and keep unsaved changes on reload
Review follow-up for #15127:

- Write the surface file to <project>_surfaces/<name>_<file id>.ts. The file
  id is created once per surface and renewed on copy, so names that sanitize
  to the same string, user files of the same name and a project saved under
  another name in the same folder no longer overwrite each other.
- Track changes since the last save, and keep the in-memory data on reload
  until it has been written.
- Reject property names that are empty or contain whitespace, as the GOCAD
  TSurf file separates names by spaces.
- set_property raises when there is no parent project, like the other calls.
- Null check before the assert in setProperty, fix the triangleIndices typo.
2026-11-09 19:48:06 +01:00
Stefan Crooijmans 31f79f426f #12460 Python: Add triangulated surface created from Python
Add TriangulatedSurface with set_geometry, set_property, get_property
and available_properties, created by
SurfaceCollection.new_triangulated_surface. When the project is saved,
the surface is written as a GOCAD TSurf file next to the project file
and read back from that file when the project is opened.
2026-11-09 19:48:06 +01:00
Magne Sjaastad 99d675b796 Fix crash when StimPlan file has no time steps
Time steps are not read when a file has more than one grid section. setDefaultsBasedOnFile() then indexed the empty time step list, and setDataAtTimeValue() wrote at index -1. Use index 0 and skip data for unknown time steps.

Call stack:
[0] performCrashLogging at ResInsight/ApplicationExeCode/RiaMainTools.cpp:178
[1] manageSegFailureSA(int, siginfo_t*, void*) at ResInsight/ApplicationExeCode/RiaMainTools.cpp:310
[3] RimStimPlanFractureTemplate::setDefaultsBasedOnFile() at ResInsight/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp:116
[4] RicMeshFractureTemplateHelper<RimStimPlanFractureTemplate>::createNewTemplatesFromFiles(std::vector<QString, std::allocator<QString> > const&, QString const&, bool) at ResInsight/ApplicationLibCode/Commands/FractureCommands/RicMeshFractureTemplateHelper.inl:150
[5] RicMeshFractureTemplateHelper<RimStimPlanFractureTemplate>::createNewTemplates(QString const&, QString const&, QString const&, QString const&) at ResInsight/ApplicationLibCode/Commands/FractureCommands/RicMeshFractureTemplateHelper.inl:89
[6] RicNewStimPlanFractureTemplateFeature::createNewTemplates() at ResInsight/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp:58
[7] RicNewStimPlanFractureTemplateFeature::onActionTriggered(bool) at ResInsight/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp:78
[8] caf::CmdFeature::actionTriggered(bool) at ResInsight/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp:176
[17] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1879
[23] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1879
[35] RiuMainWindow::customMenuRequested(QPoint const&) at ResInsight/ApplicationLibCode/UserInterface/RiuMainWindow.cpp:2094
[43] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1879
[48] RiaGuiApplication::notify(QObject*, QEvent*) at ResInsight/ApplicationLibCode/Application/RiaGuiApplication.cpp:1879
[59] main at ResInsight/ApplicationExeCode/RiaMain.cpp:267
[60] __libc_start_main at :0
2026-11-09 10:22:43 +01:00
Magne Sjaastad 42d066d1cd #15129: Use along-well-path D-factor for azimuth fractures with perforation length
Azimuth fractures with a user-defined perforation length now use the along-well-path D-factor calculation (well radius from perforation length and 1.2 correction factor), consistent with the transmissibility calculation.
2026-11-06 15:37:58 +01:00
Magne Sjaastad e881891ccb #15129: Add pytest comparing fracture completion export variants
Add a homogeneous 20x20x20 test grid, a uniform StimPlan fracture and a script exporting fracture completions for ellipse and StimPlan templates with along, transverse and azimuth orientations. The pytest compares the exported files with stored reference files. Make view mesh and surface mode scriptable, used by the script to hide grid lines and surfaces.
2026-11-06 15:37:58 +01:00
jonjenssen 4071b9c00d Do not crash when using replace case to go from dual porosity to single porosity, 2026-11-06 14:16:31 +01:00
Magne Sjaastad 6633ba5b36 #15110: Guard duplicate grid node removal behind experimental feature flag
Add the 'remove-duplicate-grid-nodes' experimental feature and only call RigMainGrid::removeDuplicateNodes() during case loading and grid registration when it is enabled.
2026-11-05 18:33:07 +01:00
Magne Sjaastad 1e071247d8 #15110: Remove duplicate nodes from RigMainGrid node table
Merge identical nodes when grid geometry is finalized and remap cell corner indices. Partial shared node indices in the quad overlap calculation are now resolved geometrically, keeping fault and NNC geometry unchanged. Log the node count reduction with thousand grouping and the removed share of nodes.
2026-11-05 18:33:07 +01:00
Magne Sjaastad 11d8b926bb #15110: Add node table API to RigMainGrid
Encapsulate the node table of RigMainGrid behind nodes() and modifiableNodes() returning spans, allocateNodes() and clearNodes(). Readers and LGR builders fill the node table in place through allocateNodes() instead of building a temporary vector, which reduces peak import memory by about 1.6 GiB for a 9.8M cell grid. The radial grid conversion and map axes transform update nodes in place.
2026-11-05 18:33:07 +01:00
Magne Sjaastad eb3dcaac53 #15122: Use grayscale text antialiasing for regression test plot snapshots 2026-11-05 14:52:28 +01:00
Magne Sjaastad cec81a9b59 #15120: Clamp comparison view time step before use
A comparison view could be updated with a stale time step index restored from the project file before it was clamped, causing out-of-range access in GeoMech result frames. Also guard RimGeoMechView::onClampCurrentTimestep against unloaded case data.
2026-11-05 13:34:20 +01:00
Stefan Crooijmans ece73a749c #15008 Python: Return the displayed folder name from collection_name()
collection_name() returned the stored m_collectionName, which is empty
for a RimPolygonFile or RimPolygonCloudAddress without a name. Both
classes fall back to the file name or a default ("Polygon File", "Sumo
Polygon Address") in name().

PdmNestedCollectionBase::displayName() is a virtual that defaults to
collectionName(); RimPolygonFile and RimPolygonCloudAddress override it
with name(), and CollectionNameInternal returns displayName().
collectionName() itself is unchanged, since findSubCollectionByName()
and the name conflict policy compare stored names.

ResInsight-tests: RimcNestedCollectionBase-Test covers a polygon
collection, a polygon file (default, base name, file name fallback) and
a cloud polygon address.
2026-11-05 08:50:36 +01:00
Stefan Crooijmans c0dcb78824 #15008 Python: Typed add_folder() and collection_name() for nested collections
The Python generator emits add_folder() again on a concrete collection
class when the folder type narrows: SurfaceCollection.add_folder()
returns SurfaceCollection and PolygonCollection.add_folder() returns
PolygonCollection, while PdmNestedCollectionBase keeps the declared type.
PdmObjectMethod::classKeywordReturnedTypeForSelf() reports the narrowed
type, and the super class method check in the generator accepts such an
override (same arguments, subclass return type).

PdmNestedCollectionBase: subCollectionClassKeyword() names the folder
type without creating one, addNewSubCollection() is a template method
over createSubCollection() and returns PdmNestedCollectionBase*, and the
base virtuals are pure. The leaf polygon containers only override
canAddSubCollection().

collection_name() in rips returns the folder name for every nested
collection; the class specific name attributes are kept.
2026-11-05 08:50:36 +01:00
Magne Sjaastad a8805f1b9f Use QTimeZone::utc() for compatibility with Qt < 6.5 2026-11-05 07:45:12 +01:00
Kristian Bendiksen ec59629930 #15094 Workflows: Add vertical graph layout option
Add a per-workflow Vertical Layout toggle to the workflow editor toolbar
and canvas context menu. In vertical mode ranks are stacked top to bottom,
task inputs sit on the top edge and outputs on the bottom edge, config
boxes are placed above their task and control edges run between the sides.
2026-11-04 17:26:39 +01:00
Magne Sjaastad e35279a716 #15104: Add commands and icons for production network 2026-11-04 16:50:57 +01:00
Magne Sjaastad 49ec4f1271 #15104: Add production network data source and plot 2026-11-04 16:50:57 +01:00
Magne Sjaastad 3e4c1e1e25 #15104: Add production network graph filtering and tree layout 2026-11-04 16:50:57 +01:00
Kristian Bendiksen add80526fa #14869 Workflow UI: Open nested workflows in tabs
Double-click a nested workflow task (or use Open Nested Workflow) to show
the inner workflow read-only in a tab of its own. The inner workflow is
described by the new taskmaestro_helper describe-nested command, for YAML
workflow entries and installed workflows. Workflows with workflow entries
now load.
2026-11-04 15:17:05 +01:00
Kristian Bendiksen 12bcd5b857 #15044 Workflows: Add option to collapse tasks to their title
Collapse a task with the chevron in its title, a double-click on the title, or
the context menus. A collapsed task shows its title, state and issue count, and
its connections meet in one dot on each side. Ports and config values are shown
in the tooltip. The collapsed set is stored per workflow.
2026-11-04 15:17:05 +01:00
Kristian Bendiksen b2b0e8e6f4 #14869 Workflows: Add option to hide tasks in the graph
Hidden tasks are removed from the canvas and the ports they feed are marked
with the hidden task name. Hidden tasks are shown again while they have failed
or have validation errors. The hidden set is stored per workflow.
2026-11-04 15:17:05 +01:00
Kristian Bendiksen d6143ccca3 #14869 Workflows: Add option to inline config values into task boxes
Adds a per-workflow 'Inline Config Values' toggle (canvas context menu,
on by default, stored in the project file). When enabled, the separate
config boxes are hidden and each config value is shown on the task's
input port as 'type = value'.
2026-11-04 15:17:05 +01:00
Magne Sjaastad 56074d1317 #15098: Export plot snapshots from hidden plot windows 2026-11-03 15:23:31 +01:00
Magne Sjaastad 471ecab511 #15098: Export 3D view snapshots from hidden viewers 2026-11-03 15:23:31 +01:00
Magne Sjaastad 82ade27714 Guard against missing geomech data in result definition
fieldChangedByUi dereferenced m_geomCase->geoMechData() when changing the
reference time step or enabling hydrostatic pressure normalization. The data
is null when the case is not loaded. Use the null check already used
elsewhere in the file.

Crash stack (signature 4182d58e2359):
[3] RigGeoMechCaseData::femPartResults() at RigGeoMechCaseData.cpp:87
[4] RimGeoMechResultDefinition::fieldChangedByUi(...) at RimGeoMechResultDefinition.cpp:354
2026-11-02 09:37:52 +01:00
Magne Sjaastad 2db31f237d Disconnect polygon signals when changing polygon in view
setPolygon() connected to the new polygon without disconnecting from the
previous one, so a RimPolygonInView could receive objectChanged from a polygon
it no longer references and dereference its own, possibly null, m_polygon.
Disconnect from the old polygon and only sync the name from the referenced
polygon.

Crash stack (signature 1111e3b3ceb1):
[3] RimPolygonInView::onObjectChanged(caf::SignalEmitter const*) at RimPolygonInView.cpp:441
[5] RimPolygonInView::updatePolygonFromTargets() at RimPolygonInView.cpp:259
[6] RicPolylineTargetsPickEventHandler::handle3dPickEvent(Ric3dPickEvent const&) at RicPolylineTargetsPickEventHandler.cpp:100
2026-11-02 09:37:52 +01:00
Magne Sjaastad c9cd10e836 Guard against zero or negative histogram bin count
The "Number of Bins" field accepts any integer. With 0 bins the histogram
vector is resized to zero and m_maxIndex wraps to SIZE_MAX, so addValue()
writes histogram[0] on an empty vector. Set a minimum value of 1 on the
bin count fields of the histogram data sources (also clamping values read
from project files), and treat 0 bins as a single bin in
RigHistogramCalculator.

Crash stack (signature 0a750847b697):
[3] RigHistogramCalculator::addValue(double) at RigStatisticsMath.cpp:546
[5] RimEnsembleSummaryVectorHistogramDataSource::compute(...) const at RimEnsembleSummaryVectorHistogramDataSource.cpp:255
[6] RimHistogramCurve::onLoadDataAndUpdate(bool) at RimHistogramCurve.cpp:365
[11] caf::PdmFieldUiCap<caf::PdmField<int> >::setValueFromUiEditor(QVariant const&, bool)
2026-11-02 09:37:52 +01:00
Magne Sjaastad 046a3f826b Fix out-of-range access in ensemble parameter correlation averaging
parameterCorrelations() only returns parameters with a finite case value at
the given time step, so the result vectors differ in length between time
steps. parameterCorrelationsAllTimeSteps indexed every vector with the size
of the first one and also read element [0] when no time step was evaluated.
Accumulate the correlations per parameter instead.

Crash stack (signature f2dd18176dfa):
[3] RimSummaryEnsemble::parameterCorrelationsAllTimeSteps(...) const at RimSummaryEnsemble.cpp:627
[4] RimSummaryEnsemble::correlationSortedEnsembleParameters(...) const at RimSummaryEnsemble.cpp:490
[5] RimEnsembleCurveSet::ensembleParameters(...) const at RimEnsembleCurveSet.cpp:2397
[6] RimEnsembleCurveSet::calculateValueOptions(...) at RimEnsembleCurveSet.cpp:1516
2026-11-02 09:37:52 +01:00
Magne Sjaastad a864bf0ebe Catch reader exceptions when loading summary cases in parallel
createSummaryReaderInterfaceThreadSafe runs inside an OpenMP parallel loop.
The opm-common and resdata readers can throw on corrupt or incomplete
summary files, and an exception escaping the parallel region calls
std::terminate. Catch the exception, log it and leave the case without a
reader, matching the existing path for files that fail to open.

Crash stack (signatures 7ba31ee67e6a, 678f72fb725b):
[5] manageTerminate() at RiaMainTools.cpp:249
[6] __cxxabiv1::__terminate(void (*)())
[10] _Unwind_Resume
[11] RimFileSummaryCase::createSummaryReaderInterfaceThreadSafe(RifEnsembleImportConfig, RiaThreadSafeLogger*) at RimFileSummaryCase.cpp:121
[12] RimSummaryCaseMainCollection::loadFileSummaryCaseData(...) [clone ._omp_fn.0] at RimSummaryCaseMainCollection.cpp:621
2026-11-02 09:37:52 +01:00
JJ 7579569578 Batch Scheduler support update (#15077)
* Add batch job monitoring service, to be shared between monitor view and running jobs to minimize cluster polling traffic
* Add support for monitoring job status using batch monitor service
2026-10-30 19:08:35 +01:00
Kristian Bendiksen 8baad6f878 Workflow UI: Support collect flattening
Allow list and dict outputs, including mapped task outputs, to be
collected into list inputs, and dicts to be merged into dict inputs,
matching taskmaestro's collect flattening. Label flattened members in
the graph and document the rules.
2026-10-30 16:17:03 +01:00
Kristian Bendiksen bb0acbed56 Workflow UI: Support conditional branches
Support taskmaestro conditional branches in the workflow editor:
- Read and write `when` guards and `first_of` alternatives in workflow definitions
- Validate guards, switch branch coverage and alternative types
- Draw switch tasks as diamonds, guards as control edges and skipped tasks greyed out
- Edit guards with Run When..., add alternatives when dropping on a connected input
- Report skipped tasks from the run helper
2026-10-30 16:17:03 +01:00
Magne Sjaastad 0e75179c48 #15078: Include cell I/J/K in well allocation plot data 2026-10-30 15:45:41 +01:00
Magne Sjaastad 93b85f9e52 #15078: Add I/J/K connection labels to well allocation plot
Add option to label connections by connection number, cell I/J/K, or both, and an option to show a tick label for every connection. Ticks on the connection number axis are placed at integer values only.
2026-10-30 15:45:41 +01:00
Magne Sjaastad ec9d022b50 Make summary table row ordering deterministic
Rows with equal first and last time step kept the incoming address order, which depends on string pool indices and varies between sessions. Break ties on category name.
2026-10-29 15:40:41 +01:00
Magne Sjaastad 1b2c8ca757 Guard missing view and case in box intersection cell bounding box
Avoid asserting when the box intersection has no owning 3D view or the view has no case.
2026-10-29 15:40:41 +01:00
Magne Sjaastad 67427bb559 Show flow diagnostics plots in plot window after project load
Flow plots derive from RimViewWindow, not RimPlotWindow, and were missing from RiuPlotMainWindow::viewWindows(). Applying the default dock layout on project open therefore did not re-add their dock widgets. 3D views docked in the plot window are now listed by the plot main window only, and are still activated as the active 3D view so the 3D main window toolbars (e.g. time step animation) are refreshed.
2026-10-29 15:40:26 +01:00