%matplotlib inline
# This notebook will use this variable to determine which
# remote site to run on.
import os
import numpy as np
import salvus.namespace as sn
SALVUS_FLOW_SITE_NAME = os.environ.get("SITE_NAME", "local")
p = sn.Project(path="project")
6.5 cm
as the target region.mesh = p.simulations.get_mesh(simulation_configuration="initial_model")
# define the region of interest
roi = np.zeros_like(mesh.connectivity)
mask = np.linalg.norm(mesh.points[mesh.connectivity], axis=2) < 0.065
roi[mask] = 1.0
mesh.attach_field("region_of_interest", roi)
p.add_to_project(
sn.InverseProblemConfiguration(
name="my_second_inversion",
prior_model="initial_model",
events=p.events.list(),
mapping=sn.Mapping(
scaling="absolute",
inversion_parameters=["VP", "RHO"],
region_of_interest=mesh,
),
preconditioner=sn.ConstantSmoothing({"VP": 0.01, "RHO": 0.01}),
method=sn.TrustRegion(initial_trust_region_linf=10.0),
misfit_configuration="L2",
wavefield_compression=sn.WavefieldCompression(
forward_wavefield_sampling_interval=10
),
job_submission=sn.SiteConfig(
site_name=SALVUS_FLOW_SITE_NAME, ranks_per_job=4
),
)
)
p.inversions.iterate(
inverse_problem_configuration="my_second_inversion",
timeout_in_seconds=360,
ping_interval_in_seconds=10,
delete_disposable_files="all",
)
[2025-10-03 22:20:13,474] INFO: Adding new iteration #0. [2025-10-03 22:20:13,506] INFO: Resuming iteration #0. [2025-10-03 22:20:13,508] INFO: 1 new tasks have been issued. [2025-10-03 22:20:13,509] INFO: Processing task `misfit_and_gradient` [2025-10-03 22:20:14,230] INFO: Iteration 0: Number of events: 5 chi = 0.016385616624463036 ||g|| = 0.015225054673727976 pred = --- ared = --- norm_update = --- tr_radius = --- [2025-10-03 22:20:14,231] INFO: 1 new tasks have been issued. [2025-10-03 22:20:14,232] INFO: Processing task `preconditioner` [2025-10-03 22:20:14,601] INFO: Some tasks of iteration #0 are still running. Please check again later. [2025-10-03 22:20:24,653] INFO: Processing task `preconditioner` [2025-10-03 22:20:24,933] INFO: 1 new tasks have been issued. [2025-10-03 22:20:24,936] INFO: Processing task `misfit` [2025-10-03 22:20:25,016] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:20:25,820] INFO: Launched simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:20:25,822] INFO: Some tasks of iteration #0 are still running. Please check again later. [2025-10-03 22:20:35,867] INFO: Processing task `misfit` [2025-10-03 22:20:36,972] INFO: old misfit control group: 0.016385616624463036 new misfit control group: 0.0068495715397390525 predicted reduction control group: -0.005146099961393702 actual reduction control group: -0.009536045084723983 5 out of 5 event(s) improved the misfit. [2025-10-03 22:20:36,973] INFO: Model update accepted. [2025-10-03 22:20:36,973] INFO: 1 new tasks have been issued. [2025-10-03 22:20:36,974] INFO: Processing task `finalize_iteration` [2025-10-03 22:20:37,028] INFO: ... searching for obsolete files in project/INVERSIONS/my_second_inversion/00000 [2025-10-03 22:20:37,042] INFO: Freed up 613.0 KB of space. [2025-10-03 22:20:37,045] INFO: Successfully completed iteration #0. [2025-10-03 22:20:37,048] INFO: Adding new iteration #1.
p.viz.nb.inversion(inverse_problem_configuration="my_second_inversion")
for i in range(2):
p.inversions.iterate(
inverse_problem_configuration="my_second_inversion",
timeout_in_seconds=360,
ping_interval_in_seconds=10,
delete_disposable_files="all",
)
p.viz.nb.inversion(inverse_problem_configuration="my_second_inversion")
[2025-10-03 22:20:39,303] INFO: Resuming iteration #1. [2025-10-03 22:20:39,304] INFO: 1 new tasks have been issued. [2025-10-03 22:20:39,305] INFO: Processing task `gradient` [2025-10-03 22:20:39,710] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:20:39,883] INFO: Launched adjoint simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:20:39,886] INFO: Some tasks of iteration #1 are still running. Please check again later. [2025-10-03 22:20:49,890] INFO: Processing task `gradient` [2025-10-03 22:20:51,030] INFO: Iteration 1: Number of events: 5 chi = 0.0068495715397390525 ||g|| = 0.007636973282506061 pred = -0.005146099961393702 ared = -0.009536045084723983 norm_update = 0.6986523494085921 tr_radius = 0.6986522209328783 [2025-10-03 22:20:51,050] INFO: 1 new tasks have been issued. [2025-10-03 22:20:51,052] INFO: Processing task `preconditioner` [2025-10-03 22:20:51,269] INFO: Some tasks of iteration #1 are still running. Please check again later. [2025-10-03 22:21:01,344] INFO: Processing task `preconditioner` [2025-10-03 22:21:01,632] INFO: 1 new tasks have been issued. [2025-10-03 22:21:01,635] INFO: Processing task `misfit` [2025-10-03 22:21:01,716] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:21:01,997] INFO: Launched simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:21:02,009] INFO: Some tasks of iteration #1 are still running. Please check again later. [2025-10-03 22:21:12,116] INFO: Processing task `misfit` [2025-10-03 22:21:13,279] INFO: old misfit control group: 0.0068495715397390525 new misfit control group: 0.0036732410562075645 predicted reduction control group: -0.0023949299470586993 actual reduction control group: -0.003176330483531488 5 out of 5 event(s) improved the misfit. [2025-10-03 22:21:13,281] INFO: Model update accepted. [2025-10-03 22:21:13,283] INFO: 1 new tasks have been issued. [2025-10-03 22:21:13,283] INFO: Processing task `finalize_iteration` [2025-10-03 22:21:13,367] INFO: ... searching for obsolete files in project/INVERSIONS/my_second_inversion/00001 [2025-10-03 22:21:13,611] INFO: Freed up 3.7 MB of space. [2025-10-03 22:21:13,612] INFO: Successfully completed iteration #1. [2025-10-03 22:21:13,614] INFO: Adding new iteration #2. [2025-10-03 22:21:13,623] INFO: Resuming iteration #2. [2025-10-03 22:21:13,624] INFO: 1 new tasks have been issued. [2025-10-03 22:21:13,625] INFO: Processing task `gradient` [2025-10-03 22:21:14,064] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:21:14,171] INFO: Launched adjoint simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:21:14,174] INFO: Some tasks of iteration #2 are still running. Please check again later. [2025-10-03 22:21:24,177] INFO: Processing task `gradient` [2025-10-03 22:21:25,452] INFO: Iteration 2: Number of events: 5 chi = 0.0036732410562075645 ||g|| = 0.003914571177171008 pred = -0.0023949299470586993 ared = -0.003176330483531488 norm_update = 0.6666855264629865 tr_radius = 1.3973044418657565 [2025-10-03 22:21:25,485] INFO: 1 new tasks have been issued. [2025-10-03 22:21:25,489] INFO: Processing task `preconditioner` [2025-10-03 22:21:25,748] INFO: Some tasks of iteration #2 are still running. Please check again later. [2025-10-03 22:21:35,846] INFO: Processing task `preconditioner` [2025-10-03 22:21:36,117] INFO: 1 new tasks have been issued. [2025-10-03 22:21:36,117] INFO: Processing task `misfit` [2025-10-03 22:21:36,185] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:21:36,503] INFO: Launched simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:21:36,505] INFO: Some tasks of iteration #2 are still running. Please check again later. [2025-10-03 22:21:46,638] INFO: Processing task `misfit` [2025-10-03 22:21:46,927] INFO: Some tasks of iteration #2 are still running. Please check again later. [2025-10-03 22:21:57,050] INFO: Processing task `misfit` [2025-10-03 22:21:58,272] INFO: old misfit control group: 0.0036732410562075645 new misfit control group: 0.0030209278134020927 predicted reduction control group: -0.0003006637195994699 actual reduction control group: -0.0006523132428054718 5 out of 5 event(s) improved the misfit. [2025-10-03 22:21:58,276] INFO: Model update accepted. [2025-10-03 22:21:58,276] INFO: 1 new tasks have been issued. [2025-10-03 22:21:58,280] INFO: Processing task `finalize_iteration` [2025-10-03 22:21:58,405] INFO: ... searching for obsolete files in project/INVERSIONS/my_second_inversion/00002 [2025-10-03 22:21:58,662] INFO: Freed up 4.3 MB of space. [2025-10-03 22:21:58,663] INFO: Successfully completed iteration #2. [2025-10-03 22:21:58,666] INFO: Adding new iteration #3.
VP
and RHO
, except for the
previously selected region of interest, where we restrict VP
updates to +/- 1 m/s.p.add_to_project(
sn.InverseProblemConfiguration(
name="my_third_inversion",
prior_model="initial_model",
events=p.events.list(),
mapping=sn.Mapping(
scaling="absolute",
inversion_parameters=["VP", "RHO"],
),
preconditioner=sn.ConstantSmoothing({"VP": 0.01, "RHO": 0.01}),
method=sn.TrustRegion(initial_trust_region_linf=10.0),
misfit_configuration="L2",
wavefield_compression=sn.WavefieldCompression(
forward_wavefield_sampling_interval=10
),
job_submission=sn.SiteConfig(
site_name=SALVUS_FLOW_SITE_NAME, ranks_per_job=4
),
)
)
mesh = p.simulations.get_mesh("initial_model")
lb = mesh.copy()
ones = np.ones_like(lb.elemental_fields["VP"])
lb.elemental_fields["VP"] *= 0.8
lb.elemental_fields["RHO"] *= 0.8
lb.elemental_fields["VP"][roi < 0.5] = 1501.0
ub = mesh.copy()
ub.elemental_fields["VP"] *= 1.2
ub.elemental_fields["RHO"] *= 1.2
ub.elemental_fields["VP"][roi < 0.5] = 1502.0
p.inversions.set_constraints(
inverse_problem_configuration="my_third_inversion",
constraints={
"lower_bounds": lb,
"upper_bounds": ub,
},
)
p.inversions.iterate(
"my_third_inversion", timeout_in_seconds=360, delete_disposable_files="all"
)
p.viz.nb.inversion(inverse_problem_configuration="my_third_inversion")
[2025-10-03 22:22:00,204] INFO: Adding new iteration #0. [2025-10-03 22:22:00,222] INFO: Resuming iteration #0. [2025-10-03 22:22:00,224] INFO: 1 new tasks have been issued. [2025-10-03 22:22:00,224] INFO: Processing task `misfit_and_gradient` [2025-10-03 22:22:00,795] INFO: Iteration 0: Number of events: 5 chi = 0.016385616624463036 ||g|| = 0.020187599407258453 pred = --- ared = --- norm_update = --- tr_radius = --- [2025-10-03 22:22:00,796] INFO: 1 new tasks have been issued. [2025-10-03 22:22:00,797] INFO: Processing task `preconditioner` [2025-10-03 22:22:00,948] INFO: Some tasks of iteration #0 are still running. Please check again later. [2025-10-03 22:22:00,985] INFO: Processing task `preconditioner` [2025-10-03 22:22:01,058] INFO: Some tasks of iteration #0 are still running. Please check again later. [2025-10-03 22:22:03,898] INFO: 1 new tasks have been issued. [2025-10-03 22:22:04,386] INFO: Submitting job array with 5 jobs ... [2025-10-03 22:22:04,653] INFO: Launched simulations for 5 events. Please check again to see if they are finished. [2025-10-03 22:22:04,734] INFO: Processing task `misfit` [2025-10-03 22:22:05,010] INFO: Some tasks of iteration #0 are still running. Please check again later. [2025-10-03 22:22:16,491] INFO: old misfit control group: 0.016385616624463036 new misfit control group: 0.00781096178545235 predicted reduction control group: -0.0048543526499997824 actual reduction control group: -0.008574654839010685 5 out of 5 event(s) improved the misfit. [2025-10-03 22:22:16,496] INFO: Model update accepted. [2025-10-03 22:22:16,496] INFO: 1 new tasks have been issued. [2025-10-03 22:22:16,580] INFO: ... searching for obsolete files in project/INVERSIONS/my_third_inversion/00000 [2025-10-03 22:22:16,603] INFO: Freed up 613.0 KB of space. [2025-10-03 22:22:16,603] INFO: Successfully completed iteration #0. [2025-10-03 22:22:16,606] INFO: Adding new iteration #1.
VP
, but use the following scaling relation for soft tissues to update RHO
:def scaling_relation_density(
prior_model: sn.UnstructuredMesh,
proposed_model: sn.UnstructuredMesh,
) -> sn.UnstructuredMesh:
# Here we directly apply a scaling relation to the density model.
# We don't need the prior model in this case.
new_model = proposed_model.copy()
new_model.elemental_fields["RHO"] = (
0.893 * new_model.elemental_fields["VP"] - 349.0
)
return new_model
p.add_to_project(
sn.InverseProblemConfiguration(
name="my_fourth_inversion",
prior_model="initial_model",
events=p.events.list(),
mapping=sn.Mapping(
scaling="absolute",
inversion_parameters=[
"VP",
],
postprocess_model_update=scaling_relation_density,
),
preconditioner=sn.ConstantSmoothing({"VP": 0.01}),
method=sn.TrustRegion(initial_trust_region_linf=10.0),
misfit_configuration="L2",
wavefield_compression=sn.WavefieldCompression(
forward_wavefield_sampling_interval=10
),
job_submission=sn.SiteConfig(
site_name=SALVUS_FLOW_SITE_NAME, ranks_per_job=4
),
)
)