Commit Graph
19291 Commits
Author SHA1 Message Date
Kristian Bendiksen 5e880ffc26 Refactor: migrate fourteen more collections to caf::PdmObjectCollection<T>
Migrated to the templated base, preserving each collection's existing XML
field keyword for project-file backward compatibility:

- RimEnsembleFractureStatisticsCollection
- RimEclipseInputPropertyCollection
- RimPlotDataFilterCollection
- RimGeoMechContourMapViewCollection
- RimIntersectionResultsDefinitionCollection
- RimCustomObjectiveFunctionCollection
- RimStimPlanModelTemplateCollection
- RimEnsembleWellLogsCollection
- RimEclipseContourMapViewCollection
- RimSeismicViewCollection
- RimGridInfoCollection
- RimEclipseStatisticsCaseCollection
- RimWellIASettingsCollection
- RimVfpDataCollection

External callers that accessed the old public/named array fields directly
(RimEclipseInputPropertyCollection::inputProperties,
RimEclipseStatisticsCaseCollection::cases) now use addItem/items() from
the base. RimCustomObjectiveFunction.h replaced its include of the
collection header with a forward declaration to break the new include
cycle introduced by the migration.
2026-05-11 13:42:13 +02:00
Kristian Bendiksen ddd413cb0b Refactor: migrate five collections to caf::PdmObjectCollection<T>
RimEnsembleFileSetCollection, RimJobCollection, RimQuickAccessCollection,
RimRefinementRegionCollection and RimFractureTemplateCollection now inherit
from the templated caf::PdmObjectCollection<T> base, reusing the shared
add/insert/delete/items plumbing introduced for RimValveTemplateCollection.

XML field keywords are preserved on every collection so existing project
files continue to load.
2026-05-11 13:42:13 +02:00
Kristian Bendiksen 8f4008db0f #12106 Polygon: Show coordinates with positive depth in property panel
Bind a PdmProxyValueField that inverts the Z sign to the Points group in
RimPolygon's property panel, mirroring the pattern already used by
RimExtrudedCurveIntersection. The raw m_pointsInDomainCoords field keeps
its XYZ semantics, scriptable keyword, and serialization unchanged.

Fixes #12106.
2026-05-11 13:35:51 +02:00
Kristian Bendiksen 8e6c6e88ba #7142 Janitor: Remove redundant // Overrides comments in command feature headers
The bare "// Overrides" comment is now redundant since the override keyword on
each method already conveys the same information. Qualified comments like
"// Overrides from BaseClass" carry additional information and are kept.
2026-05-11 12:45:21 +02:00
Kristian Bendiksen 9832fabde7 #5840 RiaEclipseUnitTools: Use barToPascal helper in RimWellIASettings
Replace inline bar-to-Pascal magic constants with RiaEclipseUnitTools::barToPascal
for initial stress and pore pressure parameters passed to the Well Impact Analysis
exporter. Behavior is unchanged; both sites previously multiplied by 100000.0.

Fixes #5840.
2026-05-11 12:44:49 +02:00
copilot-swe-agent[bot]andmagnesj be55d3f4a7 CI: add workflow to test latest rips against latest ResInsight artifact
Agent-Logs-Url: https://github.com/magnesj/ResInsight/sessions/5f1f1cff-d8ff-4f91-9315-fc85786f9fcf

Co-authored-by: magnesj <1793152+magnesj@users.noreply.github.com>
2026-05-09 14:32:47 +02:00
Magne Sjaastad 6041eb1b3a Set version to 2026.02.3-dev.01 2026-05-08 11:34:14 +02:00
Magne Sjaastad 9e60bf1ce4 #13967 RigMainGrid: Invalidate face-normal direction cache on setFlipAxis
isFaceNormalsOutwards lazily computes whether cell face normals point outward
and caches the answer in m_isFaceNormalsOutwardsComputed. setFlipAxis was
mirroring the node coordinates without resetting that cache, so any consumer
that had triggered the lazy computation before the user toggled Flip X/Y kept
the pre-flip answer. The well-path/cell intersection in
RigEclipseWellLogExtractor::calculateIntersection then inverted the
entering/leaving flag the wrong way, causing the proper-pair filter in
populateReturnArrays to discard every intermediate cell along a perforation
interval - only the start and end cells survived through the
well-starts/ends-inside-a-cell fallback.

Reset m_isFaceNormalsOutwardsComputed when the flip state actually changes.

Add unit tests covering all four combinations of Flip X / Flip Y for both the
data-level node mirroring and the well-path/cell intersection (freshly-built
grid and interactive-toggle scenarios).
2026-05-08 10:28:31 +02:00
Magne Sjaastad b18f676884 #13967 Apply persisted Flip X/Y axis when loading an Eclipse result case
When a project file persisted FlipXAxis or FlipYAxis as true, the flag was
restored to the PdmField but never propagated to the grid nodes during
RimEclipseResultCase::importGridAndResultMetaData. Only the UI change handler
applied the flip, so on reload the grid stayed un-flipped while the checkbox
appeared active.

Mirror the call already present in RimEclipseInputCase and RimRoffCase by
invoking setFlipAxis before computeCachedData.
2026-05-08 10:28:31 +02:00
Magne Sjaastad 8005dc772f #13977 Viewer: Fix perspective clipping of very small models
Remove the hard floor against m_defaultPerspectiveNearPlaneDistance
(0.05) when computing the perspective near plane from the closest
bounding-box corner. For very small models the closest corner can sit
within that distance, and clamping pushed the near plane past the
model so it was clipped entirely; parallel projection was unaffected
because its near plane scales directly with the bbox.

The zero/negative guard at the end of the block is the actual safety
net, and the maxFarNearRatio constraint still protects depth-buffer
precision when geometry spans both very close and very distant
corners.
2026-05-08 10:28:00 +02:00
Magne Sjaastad 7f51676da2 Custom Mock Model: Add extent and offset fields to dialog
Expose XYZ extent and XY UTM offset as user-editable fields in the
Customize Mock Model dialog instead of hard-coding them in
RimEclipseResultCase. Defaults match the previous hard-coded values
(6000/12000/500 extent, 400000/6000000 offset).
2026-05-08 10:28:00 +02:00
Kristian Bendiksen 5ffcb69acc #13126 RiaLogging: Use std::string_view instead of QString for logging 2026-05-08 10:11:09 +02:00
Kristian Bendiksen 4957bf5a8b #13126 RiaLogging: Take std::string_view for logElapsedTime message
Switch the message parameter from const QString& to std::string_view so
callers with std::string in hand no longer need a QString::fromStdString
wrapper. The internal duration formatting still uses QString::arg, fed
from a single QString::fromUtf8 conversion.

Callers passing QString locals are updated with .toStdString() at the
call site.
2026-05-08 10:11:09 +02:00
Kristian Bendiksen bb0afbf962 #13126 RiaLogging: Extract errorInMessageBox to RiuMessageDialog
Move the QMessageBox-displaying helper out of the logging utility into a
dedicated UI class. RiaLogging.h no longer pulls QMessageBox/QWidget into
the ~270 files that include it. Behavior is preserved: showError displays
the dialog when running interactively (and not under regression tests),
then forwards the text to RiaLogging::error.
2026-05-08 10:11:09 +02:00
Magne Sjaastad 0e27709fe3 #13963 Well path: Migrate legacy SSIHUB cache file path to m_filePath
Restore m_filePathInCache_OBSOLETE as a read-only field (write disabled)
so existing projects that stored the well path in WellPathFilePathInCache
can still be loaded. In initAfterRead, look up the cache file in the
current project's cache directory and copy the path into m_filePath.
2026-05-07 12:57:05 +02:00
Kristian Bendiksen 8638e5a14c #13959 RigSimulationInputTool-Test: Check transformKeywordsInDeckFile return value
Wrap the discarded calls to the [[nodiscard]] std::expected-returning
transformKeywordsInDeckFile in EXPECT_TRUE(...has_value()) to silence
C4834 and assert that the transformation succeeded.
2026-05-06 12:34:22 +02:00
Magne Sjaastad 498c6be663 Pipe geometry: Skip non-finite coords and degenerate cylinder segments
Robustness fixes in RivPipeGeometryGenerator:

- updateFilteredPipeCenterCoords: drop NaN/Inf input coords. The main loop
  now skips iterations where any of the three sampled coords is undefined,
  and the trailing endpoint walks back to the last finite coord so the
  segment-to-result bookkeeping invariant holds.

- computeExtrudedCoordsAndNormals: stop asserting on parallel plane/ray
  intersections (these can occur at very sharp bends due to numerical
  issues) and return early when the extruded node count does not match the
  expected cross-section node count.
2026-05-05 21:55:10 +02:00
Magne Sjaastad bac0249e6a #13962 GeoMech: Show empty unit string for dimensionless FAULTMOB property 2026-05-05 21:54:58 +02:00
Magne Sjaastad 7fcd192b71 AppEnum: Type-erase the mapping machinery into a non-template base
Move the loops, lookups, and QString machinery out of
AppEnum<T>::EnumMapper into a new non-template AppEnumMapperBase defined
in cafAppEnum.cpp. Each member is now compiled once for the whole
program rather than once per enum type, cutting build time and binary
size for a class template instantiated across hundreds of enums.

AppEnum<T> becomes a thin static_cast shim around the base methods.
Enum values are stored as int in the mapping; a static_assert rejects
enum types whose underlying type is wider than int. The widest
underlying type currently in use in ResInsight is short, so all current
instantiations are unaffected.

Use std::optional<int> for the mapper default value, and assert against
an empty mapping in defaultValue() (the prior code returned m_mapping[0]
unconditionally, which is undefined behavior on empty).

Document why mapper() uses an explicit init flag rather than
std::call_once or a magic-static lambda: setUp() re-enters mapper() via
addItem, so anything that locks on first init would deadlock.
First-access must therefore be single-threaded, as already exercised by
BaseTest.CreateObjectInMultipleThreads.

Add AppEnumTest.MappingRoundTrip covering text <-> enum, index <-> enum,
isValid, and the failure paths of setFromText / setFromIndex (resets to
default, returns false).
2026-05-05 14:27:12 +02:00
Magne Sjaastad e8db66a377 #13964 Show/Hide Geometry: Do not manipulate well path visibility control
Stop changing RimWellPathCollection::wellPathVisibility from the Hide Grid
Geometry and Show All Geometry features. Hide still activates the well path
collection so well paths are drawn when grid cells are hidden.
2026-05-05 12:42:06 +02:00
Magne Sjaastad bdb46d9df4 #13963 Well path: Fix empty file path after reopening JSON-imported well paths
Remove the SSIHUB cache mechanism (m_filePathInCache, isStoredInCache,
setupBeforeSave, updateFilePathsFromProjectPath) from RimFileWellPath. The
cache path was triggered whenever the well path's id field was non-empty,
which JSON imports populate, causing m_filePath to be cleared on save.
2026-05-05 12:04:56 +02:00
Kristian Bendiksen 96dc4df316 #9336 Python: Tolerate transient heartbeat failures
The heartbeat introduced in db871296c closed the gRPC channel after a
single missed ping (2s deadline). On Windows CI under load this fired
during normal operations, leaving every subsequent test stuck on a
dead channel.

Track consecutive failures inside the heartbeat loop and only declare
the connection lost after failure_threshold (default 3) consecutive
failures. A successful ping resets the counter. Per-ping deadline
raised from 2s to 5s, and below-threshold failures log a warning so
transient slowness is still visible.
2026-05-04 20:03:39 +02:00
Kristian Bendiksen 85fc0220c7 #9336 Python: Translate closed-channel errors and stop downgrading RipsError
After the heartbeat closes a dead-server channel, gRPC raises
ValueError("Cannot invoke RPC on closed channel!") rather than a
grpc.RpcError, which slipped past the existing pdmobject wrappers and
surfaced to the user as a bare ValueError nested in a traceback.

- pdmobject add_method decorator and _call_pdm_method_void /
  _return_value / _return_optional_value now also catch the
  closed-channel ValueError and translate it to RipsError.
- well_path.add_well_log no longer rewraps every exception as
  RuntimeError. Cleanup of temporary key-value entries still runs, but
  the original typed exception (e.g. RipsError with code/details) is
  re-raised so callers can inspect it.
2026-05-04 20:03:39 +02:00
Kristian Bendiksen f8d180f48d #9336 Python: Improve error reporting from gRPC to client
Surface gRPC failure context to Python script authors instead of
silently returning sentinel values or raising bare gRPC errors.

- RipsError now carries code/details/location and a from_rpc_error()
  helper. Existing single-arg construction stays valid.
- Stop swallowing grpc.RpcError in case.__grid_count for non-NOT_FOUND
  failures and in instance._check_connection_and_version, so the
  underlying status is propagated.
- pdmobject add_method decorator and _call_pdm_method_* attach
  code/details to the raised RipsError; existing message text is
  preserved so pytest match=... assertions keep working.
- Instance.start_heartbeat / stop_heartbeat / check_alive provide an
  opt-in background ping that flips a sticky lost-connection flag and
  raises a readable RipsError from check_alive() if the server dies.
- Server side: GetPdmObject in RiaGrpcAppService, RiaGrpcCaseService
  and RiaGrpcProjectService no longer return Status::OK with an empty
  reply when the underlying object is missing; they return NOT_FOUND
  / INTERNAL with a descriptive message. Other RiaGrpc*Service files
  audited and already return non-OK with text on error paths.
2026-05-04 20:03:39 +02:00
jonjenssen 1564df8115 Soil calculation: Keep trying next time steps. 2026-05-04 18:14:33 +02:00
Kristian Bendiksen eb39583a7c Apply clang-format to .pvd loading changes 2026-05-04 16:03:23 +02:00
Kristian Bendiksen 5fcca6bf09 #13940 Fracture export: Guard transmissibility condenser against internal-only neighbor sets
Replace the fatal CAF_ASSERT in calculateCondensedTransmissibilities() with an
early return when no external cells are present. The fracture export pipeline
now yields no completions for such fractures instead of aborting the process.

Fixes #13940.
2026-05-04 15:29:07 +02:00
Magne Sjaastad d14144848a #13944 Build: Make find_package imported targets globally visible
Set CMAKE_FIND_PACKAGE_TARGETS_GLOBAL so Qt:: targets pulled in by subdirectory find_package() calls (qwt, cafPdmXml, cafUserInterface, etc.) are visible at consumer scope. Silences Qt 6.10 __qt_internal_walk_libs warnings about OpenGLWidgets, Xml and Svg targets being mentioned but not declared.
2026-05-04 15:28:33 +02:00
Magne Sjaastad aac21b071b #13942 SummaryQwtPlot: Guard remaining QPointer dereferences 2026-05-04 15:28:08 +02:00
Magne Sjaastad 4f941c3ef2 #13938 SummaryMultiPlot: Guard against null curve point tracker 2026-05-04 15:27:50 +02:00
jonjenssen 09bbaa58bf Add additional result size checks 2026-05-04 15:22:10 +02:00
Vegard Kippe 4fdb301695 Ensure .pvd files are loaded when cases are opened from history or command line 2026-05-04 15:18:02 +02:00
Vegard Kippe e3be3dd9cc Do not import .pvd files associated with other simulation runs. 2026-05-04 15:18:02 +02:00
Jon Jenssen 0726f20694 Protect flattening code against polylines with a single point 2026-05-02 13:51:40 +02:00
Magne Sjaastad 86500efbdc #13926 GeoMech well log: Guard against OOB indices when interpolating results
Bounds-check every gridResultValues access in interpolateGridResultValue
to prevent segfaults observed in interpolateInterfaceValues' OMP loop
when a result vector was empty or sized for a different result position
type. OOB now returns the infinity sentinel that matches the existing
undefined-value path and the initializeResultValues pre-fill, so
downstream invalid-value checks correctly skip these slots.

interpolateInterfaceValues additionally short-circuits and logs a
warning with the field/component name when the input result vector is
empty, instead of failing silently.
2026-04-30 21:50:45 +02:00
Magne Sjaastad 5239a4d378 #13930 Viewer: Guard against empty frustum in per-model culling
Camera::computeViewFrustum() returns an empty Frustum if the projection
matrix is degenerate (e.g., on the first paint after project open, before
a valid near/far has been set). The per-model culling introduced by
82c7172c1 calls Frustum::isOutside() unconditionally, which asserts when
the frustum has fewer than 6 planes. Skip culling when the frustum is
not fully populated; all valid models then contribute to the near/far
calculation, matching the pre-82c7172c1 behaviour.
2026-04-30 21:50:31 +02:00
Kristian Bendiksen 605662062c #13924 ContourMap: Use early returns in append-to-model guards
Address review feedback: replace the long conjunction guards added in the
previous commit with early-return statements for readability. Hoist the
legendConfig pointer into a local so the body reuses it instead of calling
legendConfig() repeatedly.
2026-04-29 14:20:38 +02:00
Kristian Bendiksen 32374b1cb6 #13924 ContourMap: Guard against null mapGrid/legendConfig in append-to-model
Mirror the nullptr guards added to RimContourMapProjection::generateGeometryIfNecessary
(commit fdc8608a29) in the three sibling RimEclipseContourMapView and
RimGeoMechContourMapView "append ... to model" methods, which were still
unconditionally dereferencing mapGrid() and legendConfig()->scalarMapper().
2026-04-29 14:20:38 +02:00
Kristian Bendiksen 08b998ac4c #13922 PolygonFilter: Guard K index against per-grid cellCountK
The K layer returned by findEclipseKLayer is computed against one grid
(usually the main grid), but updateCellsForEclipse then forwards it to
every grid including LGRs whose cellCountK can be smaller. Inside
updateCellsKIndexEclipse the unguarded cellIndexFromIJKUnguarded call
combined with the bounds-unchecked cell() accessor produced an
out-of-range cell whose corner indices crashed RigCell::center() and
cellCornerVertices.

Fixes #13922.
2026-04-29 14:11:46 +02:00
Kristian Bendiksen 88355751a5 Sector export: Hide empty Refinement Regions folder in project tree
Add shouldBeVisibleInTree() to RimRefinementRegionCollection (true only
when at least one region exists) and consult it from
RimEclipseView::defineUiTreeOrdering. Refresh the parent view's
connected editors from addNewRegion, removeRegion, and onChildDeleted so
the folder appears and disappears as regions are added or removed via
the generic delete-item action.

The "New Refinement Region" action remains reachable from the Eclipse
view's context menu while the folder is hidden.
2026-04-29 13:14:49 +02:00
Kristian Bendiksen 663142be71 Sector export: Exclude refinement region wireframe from mouse picking
Skip pick items with no cvf source info in both pick paths
(displayContextMenu and findFirstItems). Without this, the refinement
region wireframe — which has no source info — became the topmost hit,
causing the picking handler to bail out and leaving Result Info empty
instead of falling through to the underlying cell.
2026-04-29 13:14:49 +02:00
Kristian Bendiksen 2b52193e90 Sector export: Default refinement region to small centered box
Initialize new refinement regions with a small box (~1/4 of grid I/J
extent) centered in I/J and spanning the full K range, so the wireframe
is clearly visible against the parent grid edges instead of coinciding
with the grid bounds.
2026-04-29 13:14:49 +02:00
Kristian Bendiksen 87e9ab7b5b Sector Export: scale MINPV with refinement
This avoids marking small cells as inactive.
2026-04-29 13:14:49 +02:00
Kristian Bendiksen 9d04f0b122 Sector export: Add refinement regions
Promote sector-export refinement from inline wizard fields to first-class
PDM objects so users can create, edit, and preview refinement regions in
the 3D view before opening the export dialog.
2026-04-29 13:14:49 +02:00
Kristian Bendiksen e936ce24a6 CellFilters: Extract RicCellFilterFeatureTools to deduplicate features
The four single-add cell-filter features (CellIndex, UserDefined,
UserDefinedIndex, RangeSlice) repeated the same combined-filter
dispatch: detect a selected RimCombinedFilter, resolve its case, add
the new filter, select it, and bail out. Move that boilerplate into a
templated helper so each feature shrinks to a single call.

Addresses PR #13911 review feedback.
2026-04-29 11:40:18 +02:00
Kristian Bendiksen 5989785daf CellFilters: Invert dependency in RimCombinedFilter
Replace the six typed addNewXxxFilter factories with a single generic
addNewFilter<T>(init) template. The combined filter no longer references
any concrete RimCellFilter subclass; callers supply the type and an init
lambda for type-specific configuration, while the combined filter handles
cycle checks, parent-case propagation, signal wiring, and host notification.

Addresses PR #13911 review feedback.
2026-04-29 11:40:18 +02:00
Kristian Bendiksen 9d5a8c28f4 CellFilters: Add combined filter for mixing cell and property filters
Add RimCombinedFilter, a node placed under the Eclipse property-filter
collection that holds child filters (cell or property) and combines their
results with a user-chosen AND or OR mode. Supports nesting and is exposed
to Python via the generated rips CombinedFilter class.

To let the same evaluation machinery handle any filter type, introduce a
unified applyToCellVisibility(cellVis, grid, timeStep) virtual on
RimCellFilter with a default implementation that bridges the existing
range/index dispatch. RimEclipsePropertyFilter overrides it with the body
extracted from RivReservoirViewPartMgr::computePropertyVisibility, which
collapses to a generic per-child call and preserves the prior behavior
for ordinary property filters.

Loosen RimEclipsePropertyFilterCollection::m_propertyFilters to
PdmChildArrayField<RimCellFilter*>, keeping the XML tag "PropertyFilters"
and the typed propertyFilters() accessor. Add recursive helpers
(hasActiveEvaluatableDescendant, hasActiveDynamicPropertyDescendant,
hasActiveFormationNamesPropertyDescendant) so hasActiveFilters,
hasActiveDynamicFilters and isUsingFormationNames see property filters
nested inside a combined filter. Bridge filter changes inside a combined
filter to updateDisplayModelNotifyManagedViews, since the property-filter
collection doesn't subscribe to filterChanged signals.

The existing RicNew* cell-filter creation features now route the new child
into a selected combined filter when one is selected, otherwise into the
top-level cell-filter collection as before. The combined filter's context
menu offers the full mixed set: property, polygon, range, index,
user-defined, and nested combined filter.
2026-04-29 11:40:18 +02:00
Magne Sjaastad b27199f4ba RimRftCorrelationReportPlot: Rename correlation plot field and accessor to tornado plot 2026-04-29 10:16:24 +02:00
Magne Sjaastad 42a11da26b Correlation: Sync depth range to tornado and use RFT curve depth values for filtering 2026-04-29 10:16:24 +02:00
Magne Sjaastad 97ed7121ed #13863 Roff: Load grid zonation (subgrids) as SUBGRIDS input property
Read the ROFF "subgrids.nLayers" array and expand it into a 1-based per-cell integer property (SUBGRIDS) so ROFF zonation becomes a regular grid property. If a companion "subgrids.names" array is present, zone names are surfaced as category code-names via the existing color-legend flow.
2026-04-28 19:18:12 +02:00