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.
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.
Add shared face vertex, opposite face vertex and reservoir simulator corner index mapping tables to StructGridInterface and use them instead of local copies.
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.
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.
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.
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.
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
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.
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.
Add the 'remove-duplicate-grid-nodes' experimental feature and only call RigMainGrid::removeDuplicateNodes() during case loading and grid registration when it is enabled.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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'.
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
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
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)
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
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
* 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
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.
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
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.
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.
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.