Mondaic

Salvus 2024.1.3

Released: 2025-01-15

Minor bugfix release with changes as listed below.

Changes

SalvusFlow

Improved perforrmance reporting for task chain based workflows.

SalvusFlow

Replace distutils by packaging when comparing version numbers and checking for Salvus updates.

SalvusOpt

Fix a bug that prevented the use of event dependent mesh masking in inversions outside of task chains.

SalvusProject

Fix a bug where explicitly setting time axis in the simulation by means of (auto) start time, time step, and end time does work in the simulation, but not the data retrieval, leading to an assertion error when accessing simulated data.

Changes to Experimental Features

SalvusCompute

Reduces the threshold above which an inverse coordinate transform is allowed to be unstable, from 1.05 to 1.0001 (in element reference coordinates). This change is driven by some instabilities encountered in a typical use case involving high-order topography and a deformed interface.

SalvusFlow

Salvus now supports the as of now latest version 3.5.1 of Paramiko.

SalvusFlow

The LD_LIBRARY_PATH can now be overwritten for local exectutors. This is useful when the Salvus binary is not in the default path or when one wants to use a non-standard MPI.

SalvusFlow

Add support in SalvusProject for combining side-set and point receivers in the same event.

SalvusMesh

Isotropic acoustic materials can now be parameterized in terms of bulk modulus and density.

import salvus.namespace as sn

sn.material.acoustic.isotropic.BulkModulus.from_params(rho=1500, kappa=6e9)
SalvusMesh

Adds a new force_monotonic_top_down function in layered_meshing.layered_model.filters. This is useful when the partitioning field is known a-priori to be primarily monotonically increasing in the negative vertical direction, especially when slight variations in the model lead to local deviations from monotonicity. Without applying this filter a naive partitioning may behave unexpectedly as variations in monotonicity can cause holes in simple predicates (i.e., those based on threshold velocity values) which will in turn prevent the partitioning algorithms from forming a clean partition.

It’s usage for a simple acoustic model parametrized via velocites might look something like the following:


...

partition(
  d=domain,
  lm=layered_model,
  model_predicate=filters.force_monotonic_top_down(lambda x: x.ds.VP),
  mode="discontinuous"
)

...

where the goal is to partition across a “blurred” sea bottom.

SalvusProject

Added a new attachment component to Salvus project to allow for attaching arbitrary files.

Can be used for notes, images, or other files that are relevant to the project.

# Attach something. By default most things must be passed as bytes.
p.attachments.add(
    name="document.pdf",
    content=b"...",
    description="An optional description"
)

# For some file types strings, ...
p.attachments.add(
    name="my_note.txt",
    content="This project is super interesting."
)

# ... and dictionaries are also supported.
p.attachments.add(
    name="info.json",
    content={"some": "content"}
)

# Retrieve the attached files again.
p.attachments.get_content("document.pdf")
p.attachments.get_content_str("my_note.txt")
p.attachments.get_content_dict("info.json")

# Delete them.
p.attachments.delete("my_note.txt")

# Get a list of all available attachements.
p.attachments.list()

# Retrieve some meta data for an attached file.
p.attachments.get_details("document.pdf")