Release notes (dev)#

Version 3.26 is the culmination of four months of work involving over 320 pull requests. It is the minimum version able to run the [2026 release of GEM’s Global Seismic Hazard and Risk Models] (https://www.globalquakemodel.org/GEMNews/gem-2026-unveil-new-global-earthquake-risk-products). Users who do not need the latest models may want to stay with the LTS release, currently at version 3.23.4.

The complete set of changes is listed in the changelog:

https://github.com/gem/oq-engine/blob/engine-3.26/debian/changelog

A summary is given below.

Hazard#

Rupture sampling#

The performance of the command generating the Global Stochastic Event Set has been drastically improved by changing the algorithm to use the multinomial distribution with weights proportional to the number of samples per source model. That makes over an order of difference in models with high source multiplicity like New Zealand.

Moreover, by splitting the multifault and multipoint sources in a smarter way, we were able to reduce the slow tasks and to save memory. Without these improvements, the Global SES with the latest models could not run because of out-of-memory errors.

We fixed a rupture sampling bug in the case of mutually exclusive ruptures, affecting Japan in the Nankai area and the USA model in the New Madrid area.

Moreover, it is now possible to pass the --cache=true parameter to the global_ses script to avoid recomputing models.

We now save year and ses_id in the events dataset, supporting risk calculations starting from SES hdf5 files.

We introduced a dictionary TRT -> maximum_rupture_depth to discard very deep ruptures.

We now provide a clear error message in the case of duplicated rupture IDs, which can only happen if there is a bug in the sampling implementation.

We now manage the CompositeSourceModel in the same way in both classical and event-based calculations. In particular, we optimized identical sources, reducing the memory consumption for models such as New Zealand by an order of magnitude while also doubling the speed.

We also optimized reading and sampling multifault sources by parallelizing build_secparams and splitting the sources before preclassical or sample_ruptures.

Finally, we optimized the method src.count_ruptures() for multifault sources.

Classical PSHA#

There was a severe memory bug (producing a list of contexts instead of an iterator) that caused some models to use several GB of RAM per core (up to 10 GB). Now all models can be run with less than 2 GB per core.

We fixed a SourceFiltering bug in the case of a small number of sites, causing very slow tasks. The improvement in speed can be dramatic (for example, we measured a 6× speedup in a calculation for MIE).

We fixed a prefiltering bug affecting point sources spanning over 180 degrees of longitude at the poles (i.e. oceanic sources were incorrectly discarded).

The mosaic geometries have been fixed. They are now read and validated using geopandas. The mosaic.gpkg file is also included in the internal checksum logic (i.e. if you change mosaic.gpkg, the cache is invalidated).

We extended the usability of use_rates = true to IMT-dependent weights. As a result, the Canada model can now be computed with full enumeration even if there are more than 7 million realizations.

We added a warning in the preclassical phase suggesting the use of use_rates = true if only mean curves are required.

In the case of IMT-dependent logic trees, it is now possible to list unsupported IMTs if their weight is zero. This makes it possible to run the JPN model with a single calculation, whereas previously we had to perform two separate calculations, one for PGA and one for SA(0.2).

We added epistemic uncertainty options for aspect ratios: setAspectRatioAbsolute and setAspectRatioRelative (see https://github.com/gem/oq-engine/pull/11410).

We added epistemic uncertainty settings for relative seismogenic depth: adjust_lower_seismogenic_depth and adjust_upper_seismogenic_depth (see https://github.com/gem/oq-engine/pull/11415).

hazardlib: new features and fixes#

Savash Ceylan contributed a set of GMPEs: EdwardsFah2013Foreland3Bars, BindiEtAl2011Rhypo, ECOS2009VariableDepth, and ECOS2009FixedDepth (see https://github.com/gem/oq-engine/pull/11543).

Thuany Costa de Lima contributed a fix to the coefficient table for BaylessSomerville2024 (see https://github.com/gem/oq-engine/pull/11553).

We added the ability to specify a distribution of hypocenters in simple fault sources (see https://github.com/gem/oq-engine/pull/11430).

We added the magnitude-scaling relationship BCHydroNVAMSR, required for the BC Hydro Northern Volcanic Arc (NVA) source zone (see https://github.com/gem/oq-engine/pull/11420).

We added additional magnitude-scaling relationships to WC1994 and Thingbaijam2017 (see https://github.com/gem/oq-engine/pull/11508 and https://github.com/gem/oq-engine/pull/11496).

We extended the ModifiableGMPE capabilities to apply a delta variance adjustment to tau (τ) or phi (φ). The deltas can also be IMT-dependent (see https://github.com/gem/oq-engine/pull/11297).

We implemented the Holmgren et al. (2024) GMM requested by Bruce Worden (see https://github.com/gem/oq-engine/issues/9910).

We added an AlternativeCharacteristicMFD class (see https://github.com/gem/oq-engine/pull/11360) and updated the source reader to understand it at the XML level.

We fixed SiMidorikawa1999 to correctly use Rhypo instead of Rrup for the NE correction term (see https://github.com/gem/oq-engine/pull/11307).

We refactored the BCHydro GSIM to improve the handling of ESHM20 FABA models.

We added an H3 grid lookup capability to the HDF5-based GSIM adjustment utility class (see https://github.com/gem/oq-engine/pull/11380).

We permitted sentinel values for the z_sed parameter used in the CEUS Coastal Plains adjustment factor (see https://github.com/gem/oq-engine/pull/11387).

We added the NIED 2025 NSHM sigma model to the Morikawa and Fujiwara 2013 GMM (see https://github.com/gem/oq-engine/pull/11418). We also fixed some unit conversion bugs, along with a bug where the xvf cap of 75 km was being applied incorrectly (see https://github.com/gem/oq-engine/pull/11361).

We added BC Hydro subclasses of the NGA-1 GMMs (see https://github.com/gem/oq-engine/pull/11427).

We added the ability to specify magnitude-dependent aspect ratios (see https://github.com/gem/oq-engine/pull/11423).

We added a ray-tracing utility to GridAdjustedGMPE (see https://github.com/gem/oq-engine/pull/11436).

We extended the SourceWriter to work with nonparametric sources using NegativeBinomialTOM.

Risk#

We added the capability to compute embodied carbon loss as a new risk metric in risk calculations, by supporting the new loss type, embodied_carbon, with its own vulnerability functions.

Scenario calculations have been optimized by considering only the sites/assets within the integration distance of the rupture and then distributing by GMFs. Depending on the calculation, the new approach can provide a substantial speedup, especially for conditioned scenarios (in a scenario_damage calculation for the PAPERS project, the measured speedup was 100×).

We added the parameters truncation_level_between and truncation_level_within for use in scenario calculations. We also added support for sampling the GMFs from the truncated multivariate normal distribution.

We improved the error triggered when all assets are filtered out to something like FilteredAway: No assets within <RuptureFilter mag=4 dist=50>.

In conditioned scenarios, sites farther away than the asset-site association distance now raise an error, but not if they are station sites. This makes it possible to run some OQImpact calculations that would otherwise fail.

We fixed a false duplicated-stations error by rounding longitudes and latitudes to five digits, as usual.

We added an exposure aggregation exporter called using export aggexp_by.

We store a filtered_ruptured dataset in ebrisk calculations, as well as a relevant_events dataset.

We addressed an issue where the ShakeMap was being downloaded twice unnecessarily.

We added support for risk calculations that depend on AvgSA and also added PGA to the AvgSA computation (see https://github.com/gem/oq-engine/pull/11263).

We implemented secondary perils for calculations starting from ShakeMaps by reading PGV information.

We added a CSV exporter for exposure grouped by region and liquefaction/landslide LSE.

Finally, it is now possible to run the 2026 Global Seismic Hazard and Risk Models without running out of memory, even on a relatively small machine (16 cores with 96 GB of RAM), whereas previously more than twice the resources were required. The runtime with only 16 cores will be measured in days for the GRM and weeks for the GHM, so we still recommend using an enterprise-class server.

Bug fixes#

Amir Shahmohammadian contributed a fix for a bug in the treatment of the PGV period in the Jayaram and Baker (2009) spatial correlation model, which resulted in an incorrect coefficient of b = 22.0 instead of b = 25.7.

We fixed a bug in check_aki_richards_convention where the bottom-left depth was used twice instead of using the bottom-left and upper-left depths.

We fixed the avg_gmf CSV exporter so that it only considers the filtered site collection (i.e. the non-discarded sites).

We fixed the aggexp_tags and aggrisk_tags exporters. In some cases they exported inconsistent results (i.e. tags present in aggexp_tags but missing in aggrisk_tags, or vice versa).

We fixed several bugs in the procedure that exports the job.zip file, particularly for ShakeMap calculations.

Storing a logic tree with more than sys.maxsize (~9E18) potential paths previously failed. We now store the number of paths as a string attribute in the HDF5 file, since it is used solely for debugging.

We now raise an early error when unsupported IMTs are used in ConditionalGMPEs.

We avoided wasting time computing realization quantiles in scenario_damage.

The land-cover coefficient in the Nowicki Jessee model was being incorrectly assigned its default value because it was not converted to an integer (i.e. 60.0 was considered different from 60), resulting in a missing key and the default value being returned.

Other#

We added a keep_trt parameter to discard all sources except those with the specified tectonic region type. This is useful for debugging.

We added the ability to define a reference z1pt4 parameter in the job configuration file for use with the latest Japan model.

As usual, there was work on the WebUI for the AELO and OQImpact projects, including restricting the visibility of the datastore and job.zip download buttons to advanced users and improving several plots.

We refactored the testing approach so that the AELO and IMPACT tests can now be run together in a single action.

We added run_scenario_from_ses_rupture, a feature used only in the context of the PAPERS project.

IT#

We upgraded the geospatial libraries, in particular GDAL to version 3.13.1.

In devel_server installations, oq --version now returns the Git hash if the repository is accessible to the openquake user (i.e. if git config --add safe.directory has been set). Otherwise, only the major version is returned. The same version is also stored as a global attribute of the datastore file calc_XXX.hdf5.

We made the engine more robust against out-of-memory errors. If the OOM killer terminates a worker, the master is notified and the entire calculation is terminated, instead of waiting for output that will never arrive.