SalvusCompute API Documentation

Release: 0.10.6

SalvusCompute is steered by input files. These can be either TOML files or equivalent JSON files. Both are shown here. Navigate to the corresponding group on the right hand side. Note that we recommend using SalvusFlow to generate the input files but you can also do it manually, of course.

Example file with all the options. Please note that many of these might be mutally exclusive and/or optional. A detailed description of all parameters follows.

Copy
[adjoint]
    forward-meta-json-filename = "meta-json.json"
    [adjoint.point-source-block]
        filename = "sources.h5"
        groups = ["sources_1", "sources_2"]
    [[adjoint.point-source]]
        location = [0.0, 1.0]
        spatial-type = "scalar"
        spatial-weights = [1.0]
        [adjoint.point-source.rotation-on-input]
            matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
        [adjoint.point-source.source-time-function]
            wavelet = "custom"
            filename = "source.h5"
            dataset-name = "/stf"
    [adjoint.gradient]
        parameterization = "rho-lambda-mu"
        output-filename = "gradient.h5"
[domain]
    dimension = 3
    polynomial-order = 4
    [domain.mesh]
        filename = "mesh.h5"
        format = "hdf5"
    [domain.model]
        filename = "model.h5"
        format = "hdf5"
    [domain.geometry]
        filename = "geometry.h5"
        format = "hdf5"
[output]
    memory-per-rank-in-MB = 1000.0
    [output.meta-data]
        meta-json-filename = "meta.json"
        progress-json-filename = "salvus_progress.json"
    [output.point-data]
        filename = "receivers.h5"
        format = "asdf"
        sampling-interval-in-time-steps = 10
        [[output.point-data.receiver]]
            location = "XXX"
            network-code = "AB"
            station-code = "0000"
            location-code = ""
            fields = ["displacement", "gradient-of-displacement"]
            [output.point-data.receiver.rotation-on-output]
                matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
                components = ["Z", "N", "E"]
    [output.surface-data]
        filename = "boundary_output.h5"
        format = "hdf5"
        fields = ["displacement", "strain"]
        sampling-interval-in-time-steps = 10
        side-sets = ["x0", "y0", "z0"]
    [output.volume-data]
        filename = "volume_output.h5"
        format = "hdf5"
        fields = ["u", "grad_u"]
        sampling-interval-in-time-steps = "10"
[physics]
    [physics.wave-equation]
        time-stepping-scheme = "newmark"
        start-time-in-seconds = -0.12
        end-time-in-seconds = 1234.56
        time-step-in-seconds = 0.01
        attenuation = false
        [physics.wave-equation.point-source-block]
            filename = "sources.h5"
            groups = ["sources_1", "sources_2"]
        [[physics.wave-equation.point-source]]
            location = [0.0, 1.0]
            spatial-type = "scalar"
            spatial-weights = [1.0]
            [physics.wave-equation.point-source.rotation-on-input]
                matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
            [physics.wave-equation.point-source.source-time-function]
                wavelet = "ricker"
                center-frequency = 1.0
                time-shift-in-seconds = 1.0
        [[physics.wave-equation.boundaries]]
            type = "homogeneous-dirichlet"
            side-sets = ["y0", "x1"]
            components = "XXX"
        [[physics.wave-equation.boundaries]]
            type = "absorbing"
            side-sets = ["x0", "x1", "y1"]
            width-in-meters = 1.06
            taper-amplitude = 1.07
    [physics.diffusion-equation]
        time-stepping-scheme = "euler"
        start-time-in-seconds = -0.12
        end-time-in-seconds = 1234.56
        time-step-in-seconds = 0.01
        [physics.diffusion-equation.initial-values]
            filename = "model.h5"
            format = "hdf5"
            field = "VP"
        [physics.diffusion-equation.final-values]
            filename = "final.h5"
{
  "adjoint": {
    "forward-meta-json-filename": "meta-json.json",
    "point-source-block": {
      "filename": "sources.h5",
      "groups": [
        "sources_1",
        "sources_2"
      ]
    },
    "point-source": [
      {
        "location": [
          0.0,
          1.0
        ],
        "spatial-type": "scalar",
        "spatial-weights": [
          1.0
        ],
        "rotation-on-input": {
          "matrix": [
            [
              1,
              0,
              0
            ],
            [
              0,
              1,
              0
            ],
            [
              0,
              0,
              1
            ]
          ]
        },
        "source-time-function": {
          "wavelet": "custom",
          "filename": "source.h5",
          "dataset-name": "/stf"
        }
      }
    ],
    "gradient": {
      "parameterization": "rho-lambda-mu",
      "output-filename": "gradient.h5"
    }
  },
  "domain": {
    "dimension": 3,
    "polynomial-order": 4,
    "mesh": {
      "filename": "mesh.h5",
      "format": "hdf5"
    },
    "model": {
      "filename": "model.h5",
      "format": "hdf5"
    },
    "geometry": {
      "filename": "geometry.h5",
      "format": "hdf5"
    }
  },
  "output": {
    "memory-per-rank-in-MB": 1000.0,
    "meta-data": {
      "meta-json-filename": "meta.json",
      "progress-json-filename": "salvus_progress.json"
    },
    "point-data": {
      "filename": "receivers.h5",
      "format": "asdf",
      "sampling-interval-in-time-steps": 10,
      "receiver": [
        {
          "location": "XXX",
          "network-code": "AB",
          "station-code": "0000",
          "location-code": "",
          "fields": [
            "displacement",
            "gradient-of-displacement"
          ],
          "rotation-on-output": {
            "matrix": [
              [
                1,
                0,
                0
              ],
              [
                0,
                1,
                0
              ],
              [
                0,
                0,
                1
              ]
            ],
            "components": [
              "Z",
              "N",
              "E"
            ]
          }
        }
      ]
    },
    "surface-data": {
      "filename": "boundary_output.h5",
      "format": "hdf5",
      "fields": [
        "displacement",
        "strain"
      ],
      "sampling-interval-in-time-steps": 10,
      "side-sets": [
        "x0",
        "y0",
        "z0"
      ]
    },
    "volume-data": {
      "filename": "volume_output.h5",
      "format": "hdf5",
      "fields": [
        "u",
        "grad_u"
      ],
      "sampling-interval-in-time-steps": "10"
    }
  },
  "physics": {
    "wave-equation": {
      "time-stepping-scheme": "newmark",
      "start-time-in-seconds": -0.12,
      "end-time-in-seconds": 1234.56,
      "time-step-in-seconds": 0.01,
      "attenuation": false,
      "point-source-block": {
        "filename": "sources.h5",
        "groups": [
          "sources_1",
          "sources_2"
        ]
      },
      "point-source": [
        {
          "location": [
            0.0,
            1.0
          ],
          "spatial-type": "scalar",
          "spatial-weights": [
            1.0
          ],
          "rotation-on-input": {
            "matrix": [
              [
                1,
                0,
                0
              ],
              [
                0,
                1,
                0
              ],
              [
                0,
                0,
                1
              ]
            ]
          },
          "source-time-function": {
            "wavelet": "ricker",
            "center-frequency": 1.0,
            "time-shift-in-seconds": 1.0
          }
        }
      ],
      "boundaries": [
        [
          {
            "type": "homogeneous-dirichlet",
            "side-sets": [
              "y0",
              "x1"
            ],
            "components": "XXX"
          },
          {
            "type": "absorbing",
            "side-sets": [
              "x0",
              "x1",
              "y1"
            ],
            "width-in-meters": 1.06,
            "taper-amplitude": 1.07
          }
        ]
      ]
    },
    "diffusion-equation": {
      "time-stepping-scheme": "euler",
      "start-time-in-seconds": -0.12,
      "end-time-in-seconds": 1234.56,
      "time-step-in-seconds": 0.01,
      "initial-values": {
        "filename": "model.h5",
        "format": "hdf5",
        "field": "VP"
      },
      "final-values": {
        "filename": "final.h5"
      }
    }
  }
}

Adjoint group [adjoint]

If this group is present with its required members, Salvus will solve the adjoint-state problem for the specified physics and domain.

Required: False

Full example (Please note that some options might be mutally exclusive):

[adjoint]
    forward-meta-json-filename = "meta-json.json"
    [adjoint.point-source-block]
        filename = "sources.h5"
        groups = ["sources_1", "sources_2"]
    [[adjoint.point-source]]
        location = [0.0, 1.0]
        spatial-type = "scalar"
        spatial-weights = [1.0]
        [adjoint.point-source.rotation-on-input]
            matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
        [adjoint.point-source.source-time-function]
            wavelet = "custom"
            filename = "source.h5"
            dataset-name = "/stf"
    [adjoint.gradient]
        parameterization = "rho-lambda-mu"
        output-filename = "gradient.h5"
{
  "adjoint": {
    "forward-meta-json-filename": "meta-json.json",
    "point-source-block": {
      "filename": "sources.h5",
      "groups": [
        "sources_1",
        "sources_2"
      ]
    },
    "point-source": [
      {
        "location": [
          0.0,
          1.0
        ],
        "spatial-type": "scalar",
        "spatial-weights": [
          1.0
        ],
        "rotation-on-input": {
          "matrix": [
            [
              1,
              0,
              0
            ],
            [
              0,
              1,
              0
            ],
            [
              0,
              0,
              1
            ]
          ]
        },
        "source-time-function": {
          "wavelet": "custom",
          "filename": "source.h5",
          "dataset-name": "/stf"
        }
      }
    ],
    "gradient": {
      "parameterization": "rho-lambda-mu",
      "output-filename": "gradient.h5"
    }
  }
}

Detailed description of all parameters:

  • forward-meta-json-filename

    • Pretty name: Forward meta json

    • Description: The json file describing the forward run

    • Parameter type: string

    • Required: True

Block of point sources. subgroup [adjoint.point-source-block]

Reads all source characteristics from a group in an HDF5 file.

Required: False

Full example (Please note that some options might be mutally exclusive):

[adjoint.point-source-block]
    filename = "sources.h5"
    groups = ["sources_1", "sources_2"]
{
  "point-source-block": {
    "filename": "sources.h5",
    "groups": [
      "sources_1",
      "sources_2"
    ]
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: Filename containing sources

    • Parameter type: string

    • Required: True

  • groups

    • Pretty name: Groups

    • Description: Array of groups in the HDF5 file containing source information

    • Parameter type: array of strings

    • Required: True

Point source subgroup [adjoint.point-source]

Point sources for the wave equation.

Required: False

Full example (Please note that some options might be mutally exclusive):

[[adjoint.point-source]]
    location = [0.0, 1.0]
    spatial-type = "scalar"
    spatial-weights = [1.0]
    [adjoint.point-source.rotation-on-input]
        matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    [adjoint.point-source.source-time-function]
        wavelet = "custom"
        filename = "source.h5"
        dataset-name = "/stf"
{
  "point-source": {
    "location": [
      0.0,
      1.0
    ],
    "spatial-type": "scalar",
    "spatial-weights": [
      1.0
    ],
    "rotation-on-input": {
      "matrix": [
        [
          1,
          0,
          0
        ],
        [
          0,
          1,
          0
        ],
        [
          0,
          0,
          1
        ]
      ]
    },
    "source-time-function": {
      "wavelet": "custom",
      "filename": "source.h5",
      "dataset-name": "/stf"
    }
  }
}

Detailed description of all parameters:

  • location

    • Pretty name: Source location

    • Description: The source location in Cartesian coordinates.

    • Parameter type: array of numbers

    • Required: False

  • spatial-type

    • Pretty name: Spatial type of the source

    • Description: The spatial type of the point source.

    • Parameter type: string

    • Required: False

    • Possible values: "scalar", "vector", "moment_tensor", "scalar_gradient"

  • spatial-weights

    • Pretty name: Spatial weights of the source

    • Description: The spatial weights and scale of the point source.

    • Parameter type: array of numbers

    • Required: False

subgroup [adjoint.point-source.rotation-on-input]

Optionally rotate the output. The specified rotation matrix will be applied to the final output of the receiver. It should thus rotate from Cartesian X,Y,Z to the coordinate system of your choice.

Required: False

Full example (Please note that some options might be mutally exclusive):

[adjoint.point-source.rotation-on-input]
    matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
{
  "rotation-on-input": {
    "matrix": [
      [
        1,
        0,
        0
      ],
      [
        0,
        1,
        0
      ],
      [
        0,
        0,
        1
      ]
    ]
  }
}

Detailed description of all parameters:

  • matrix

    • Pretty name: Rotation Matrix

    • Description: A 2x2 or 3x3 rotation matrix.

    • Parameter type: array of arrays

    • Required: True

Source time function subgroup [adjoint.point-source.source-time-function]

The temporal evolution of the source.

Required: False

Full example (Please note that some options might be mutally exclusive):

[adjoint.point-source.source-time-function]
    wavelet = "custom"
    filename = "source.h5"
    dataset-name = "/stf"
{
  "source-time-function": {
    "wavelet": "custom",
    "filename": "source.h5",
    "dataset-name": "/stf"
  }
}

Detailed description of all parameters:

  • wavelet

    • Pretty name: Source time function

    • Description: The type of the source time function

    • Parameter type: string

    • Required: True

    • Possible values: "custom"

  • filename

    • Pretty name: Source filename

    • Description: The hdf5 filename of the source.

    • Parameter type: string

    • Required: True

  • dataset-name

    • Pretty name: Dataset name

    • Description: The hdf5 dataset name containing the source time function.

    • Parameter type: string

    • Required: True

Gradient subgroup [adjoint.gradient]

Model parameters and output filename for gradient computation.

Required: True

Full example (Please note that some options might be mutally exclusive):

[adjoint.gradient]
    parameterization = "rho-lambda-mu"
    output-filename = "gradient.h5"
{
  "gradient": {
    "parameterization": "rho-lambda-mu",
    "output-filename": "gradient.h5"
  }
}

Detailed description of all parameters:

  • parameterization

    • Pretty name: Parameterization

    • Description: Parameterization of this gradeint

    • Parameter type: string

    • Required: True

    • Possible values: "linear", "rho-vp", "rho-vp-vs", "impedance", "love-parameters", "tti"

  • output-filename

    • Pretty name: Output file name

    • Description: File within which to store the gradient

    • Parameter type: string

    • Required: True

Domain group [domain]

This groups describes the physical domain in which to run simulations.

Required: True

Full example (Please note that some options might be mutally exclusive):

[domain]
    dimension = 3
    polynomial-order = 4
    [domain.mesh]
        filename = "mesh.h5"
        format = "hdf5"
    [domain.model]
        filename = "model.h5"
        format = "hdf5"
    [domain.geometry]
        filename = "geometry.h5"
        format = "hdf5"
{
  "domain": {
    "dimension": 3,
    "polynomial-order": 4,
    "mesh": {
      "filename": "mesh.h5",
      "format": "hdf5"
    },
    "model": {
      "filename": "model.h5",
      "format": "hdf5"
    },
    "geometry": {
      "filename": "geometry.h5",
      "format": "hdf5"
    }
  }
}

Detailed description of all parameters:

  • dimension

    • Pretty name: Dimension

    • Description: The spatial dimension of the problem.

    • Parameter type: integer

    • Required: True

    • Possible values: 2, 3

  • polynomial-order

    • Pretty name: Polynomial order

    • Description: Polynomial order of the spectral elements.

    • Parameter type: integer

    • Required: True

    • Possible values: 1, 2, 4

Mesh subgroup [domain.mesh]

Specify the domain topology.

Required: True

Full example (Please note that some options might be mutally exclusive):

[domain.mesh]
    filename = "mesh.h5"
    format = "hdf5"
{
  "mesh": {
    "filename": "mesh.h5",
    "format": "hdf5"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Mesh filename

    • Description: The filename of the mesh.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: Mesh format

    • Description: The format of the mesh.

    • Parameter type: string

    • Required: True

    • Possible values: "hdf5"

Model subgroup [domain.model]

Specify the physical parameters of the domain.

Required: True

Full example (Please note that some options might be mutally exclusive):

[domain.model]
    filename = "model.h5"
    format = "hdf5"
{
  "model": {
    "filename": "model.h5",
    "format": "hdf5"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Model filename

    • Description: The filename of the model.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: Model format

    • Description: The format of the model.

    • Parameter type: string

    • Required: True

    • Possible values: "hdf5"

Geometry subgroup [domain.geometry]

Specify the geometry of the domain.

Required: True

Full example (Please note that some options might be mutally exclusive):

[domain.geometry]
    filename = "geometry.h5"
    format = "hdf5"
{
  "geometry": {
    "filename": "geometry.h5",
    "format": "hdf5"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: The filename containing the geometry information.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: Geometry format

    • Description: The format of the geometry.

    • Parameter type: string

    • Required: True

    • Possible values: "hdf5"

Output group [output]

Simulation without output only have limited use. Specify point, surface, and volumetric outputs here.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output]
    memory-per-rank-in-MB = 1000.0
    [output.meta-data]
        meta-json-filename = "meta.json"
        progress-json-filename = "salvus_progress.json"
    [output.point-data]
        filename = "receivers.h5"
        format = "asdf"
        sampling-interval-in-time-steps = 10
        [[output.point-data.receiver]]
            location = "XXX"
            network-code = "AB"
            station-code = "0000"
            location-code = ""
            fields = ["displacement", "gradient-of-displacement"]
            [output.point-data.receiver.rotation-on-output]
                matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
                components = ["Z", "N", "E"]
    [output.surface-data]
        filename = "boundary_output.h5"
        format = "hdf5"
        fields = ["displacement", "strain"]
        sampling-interval-in-time-steps = 10
        side-sets = ["x0", "y0", "z0"]
    [output.volume-data]
        filename = "volume_output.h5"
        format = "hdf5"
        fields = ["u", "grad_u"]
        sampling-interval-in-time-steps = "10"
{
  "output": {
    "memory-per-rank-in-MB": 1000.0,
    "meta-data": {
      "meta-json-filename": "meta.json",
      "progress-json-filename": "salvus_progress.json"
    },
    "point-data": {
      "filename": "receivers.h5",
      "format": "asdf",
      "sampling-interval-in-time-steps": 10,
      "receiver": [
        {
          "location": "XXX",
          "network-code": "AB",
          "station-code": "0000",
          "location-code": "",
          "fields": [
            "displacement",
            "gradient-of-displacement"
          ],
          "rotation-on-output": {
            "matrix": [
              [
                1,
                0,
                0
              ],
              [
                0,
                1,
                0
              ],
              [
                0,
                0,
                1
              ]
            ],
            "components": [
              "Z",
              "N",
              "E"
            ]
          }
        }
      ]
    },
    "surface-data": {
      "filename": "boundary_output.h5",
      "format": "hdf5",
      "fields": [
        "displacement",
        "strain"
      ],
      "sampling-interval-in-time-steps": 10,
      "side-sets": [
        "x0",
        "y0",
        "z0"
      ]
    },
    "volume-data": {
      "filename": "volume_output.h5",
      "format": "hdf5",
      "fields": [
        "u",
        "grad_u"
      ],
      "sampling-interval-in-time-steps": "10"
    }
  }
}

Detailed description of all parameters:

  • memory-per-rank-in-MB

    • Pretty name: Memory for output buffers per rank

    • Description: Memory for output buffers per rank

    • Parameter type: number

    • Required: False

Informational metadata output subgroup [output.meta-data]

Specify additional non-physical output like runtime information about the simulations.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output.meta-data]
    meta-json-filename = "meta.json"
    progress-json-filename = "salvus_progress.json"
{
  "meta-data": {
    "meta-json-filename": "meta.json",
    "progress-json-filename": "salvus_progress.json"
  }
}

Detailed description of all parameters:

  • meta-json-filename

    • Pretty name: Meta JSON filename

    • Description: Store machine-readable information about successful runs in this file.

    • Parameter type: string

    • Required: False

  • progress-json-filename

    • Pretty name: Progress JSON filename

    • Description: JSON file that output information about the current Salvus progress during the simulations.

    • Parameter type: string

    • Required: False

Point data output subgroup [output.point-data]

Store pointwise evaluations of various dynamic fields.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output.point-data]
    filename = "receivers.h5"
    format = "asdf"
    sampling-interval-in-time-steps = 10
    [[output.point-data.receiver]]
        location = "XXX"
        network-code = "AB"
        station-code = "0000"
        location-code = ""
        fields = ["displacement", "gradient-of-displacement"]
        [output.point-data.receiver.rotation-on-output]
            matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
            components = ["Z", "N", "E"]
{
  "point-data": {
    "filename": "receivers.h5",
    "format": "asdf",
    "sampling-interval-in-time-steps": 10,
    "receiver": [
      {
        "location": "XXX",
        "network-code": "AB",
        "station-code": "0000",
        "location-code": "",
        "fields": [
          "displacement",
          "gradient-of-displacement"
        ],
        "rotation-on-output": {
          "matrix": [
            [
              1,
              0,
              0
            ],
            [
              0,
              1,
              0
            ],
            [
              0,
              0,
              1
            ]
          ],
          "components": [
            "Z",
            "N",
            "E"
          ]
        }
      }
    ]
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: Output filename.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: File format

    • Description: The file format for the reciever data.

    • Parameter type: string

    • Required: True

    • Possible values: "asdf", "hdf5"

  • sampling-interval-in-time-steps

    • Pretty name: Sampling interval in time steps

    • Description: Only store every X time steps.

    • Parameter type: integer

    • Required: True

Receiver subgroup [output.point-data.receiver]

Receiver specification for point measurements

Required: False

Full example (Please note that some options might be mutally exclusive):

[[output.point-data.receiver]]
    location = "XXX"
    network-code = "AB"
    station-code = "0000"
    location-code = ""
    fields = ["displacement", "gradient-of-displacement"]
    [output.point-data.receiver.rotation-on-output]
        matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
        components = ["Z", "N", "E"]
{
  "receiver": {
    "location": "XXX",
    "network-code": "AB",
    "station-code": "0000",
    "location-code": "",
    "fields": [
      "displacement",
      "gradient-of-displacement"
    ],
    "rotation-on-output": {
      "matrix": [
        [
          1,
          0,
          0
        ],
        [
          0,
          1,
          0
        ],
        [
          0,
          0,
          1
        ]
      ],
      "components": [
        "Z",
        "N",
        "E"
      ]
    }
  }
}

Detailed description of all parameters:

  • location

    • Pretty name: Receiver location

    • Description: The receiver location in Cartesian coordinates.

    • Parameter type: array of numbers

    • Required: False

  • network-code

    • Pretty name: Network code

    • Description: Network code

    • Parameter type: string

    • Required: False

  • station-code

    • Pretty name: Station code

    • Description: Station code

    • Parameter type: string

    • Required: False

  • location-code

    • Pretty name: Location code

    • Description: Location code

    • Parameter type: string

    • Required: False

  • fields

    • Pretty name: Fields

    • Description: Choose which parameters to store.

    • Parameter type: array of strings

    • Required: False

    • Possible values: "displacement", "velocity", "acceleration", "gradient-of-displacement", "strain", "phi", "phi_t", "phi_tt", "gradient-of-phi"

subgroup [output.point-data.receiver.rotation-on-output]

Optionally rotate the output. The specified rotation matrix will be applied to the final output of the receiver. It should thus rotate from Cartesian X,Y,Z to the coordinate system of your choice.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output.point-data.receiver.rotation-on-output]
    matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    components = ["Z", "N", "E"]
{
  "rotation-on-output": {
    "matrix": [
      [
        1,
        0,
        0
      ],
      [
        0,
        1,
        0
      ],
      [
        0,
        0,
        1
      ]
    ],
    "components": [
      "Z",
      "N",
      "E"
    ]
  }
}

Detailed description of all parameters:

  • matrix

    • Pretty name: Rotation Matrix

    • Description: A 2x2 or 3x3 rotation matrix.

    • Parameter type: array of arrays

    • Required: True

  • components

    • Pretty name: Components

    • Description: The component names of the rotated output. Will be used in the output files.

    • Parameter type: array of strings

    • Required: True

Surface data output subgroup [output.surface-data]

Store various dynamic fields at surfaces.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output.surface-data]
    filename = "boundary_output.h5"
    format = "hdf5"
    fields = ["displacement", "strain"]
    sampling-interval-in-time-steps = 10
    side-sets = ["x0", "y0", "z0"]
{
  "surface-data": {
    "filename": "boundary_output.h5",
    "format": "hdf5",
    "fields": [
      "displacement",
      "strain"
    ],
    "sampling-interval-in-time-steps": 10,
    "side-sets": [
      "x0",
      "y0",
      "z0"
    ]
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: Output filename.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: File format

    • Description: The file format for the boundary data.

    • Parameter type: string

    • Required: True

    • Possible values: "hdf5"

  • fields

    • Pretty name: Fields

    • Description: Choose which parameters to store.

    • Parameter type: array of strings

    • Required: True

    • Possible values: "displacement", "velocity", "acceleration", "fem-ku-elastic", "mass-matrix-elastic", "gradient-of-displacement", "stress-tensor", "stress", "strain", "phi", "phi_t", "phi_tt", "fem-ku-acoustic", "mass-matrix-acoustic", "gradient-of-phi", "m1-times-gradient-of-phi"

  • sampling-interval-in-time-steps

    • Pretty name: Sampling interval in time steps

    • Description: Only store every X time steps.

    • Parameter type: integer

    • Required: True

  • side-sets

    • Pretty name: Side sets

    • Description: Specify side sets at which to store the boundary wavefield.

    • Parameter type: array of strings

    • Required: True

Volume data output subgroup [output.volume-data]

Output fully volumetric fields. Be aware that the output can be very large.

Required: False

Full example (Please note that some options might be mutally exclusive):

[output.volume-data]
    filename = "volume_output.h5"
    format = "hdf5"
    fields = ["u", "grad_u"]
    sampling-interval-in-time-steps = "10"
{
  "volume-data": {
    "filename": "volume_output.h5",
    "format": "hdf5",
    "fields": [
      "u",
      "grad_u"
    ],
    "sampling-interval-in-time-steps": "10"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: Output filename.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: File format

    • Description: The file format for the volume data.

    • Parameter type: string

    • Required: True

    • Possible values: "hdf5"

  • fields

    • Pretty name: Fields

    • Description: Choose which parameters to store.

    • Parameter type: array of strings

    • Required: True

    • Possible values: "displacement", "velocity", "acceleration", "fem-ku-acoustic", "mass-matrix-acoustic", "fem-ku-elastic", "mass-matrix-elastic", "gradient-of-displacement", "stress-tensor", "stress", "strain", "phi", "phi_t", "phi_tt", "gradient-of-phi", "m1-times-gradient-of-phi", "absorbing-gamma-elastic", "absorbing-gamma-acoustic", "adjoint-checkpoint", "ls-0", "ls-1", "ls-2", "ls-3", "ls-4"

  • sampling-interval-in-time-steps

    • Pretty name: Sampling interval in time steps

    • Description: If an integer N is passed, output volumetric wavefield data every N times steps. If 'auto-for-checkpointing' is passed, Salvus will use the 'memory-per-rank-in-MB' field to determine what the optimal checkpointing snapshot interval will be.

    • Parameter type: ['integer', 'string']

    • Required: True

Physics group [physics]

What problem do you need solved?

Required: True

Full example (Please note that some options might be mutally exclusive):

[physics]
    [physics.wave-equation]
        time-stepping-scheme = "newmark"
        start-time-in-seconds = -0.12
        end-time-in-seconds = 1234.56
        time-step-in-seconds = 0.01
        attenuation = false
        [physics.wave-equation.point-source-block]
            filename = "sources.h5"
            groups = ["sources_1", "sources_2"]
        [[physics.wave-equation.point-source]]
            location = [0.0, 1.0]
            spatial-type = "scalar"
            spatial-weights = [1.0]
            [physics.wave-equation.point-source.rotation-on-input]
                matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
            [physics.wave-equation.point-source.source-time-function]
                wavelet = "ricker"
                center-frequency = 1.0
                time-shift-in-seconds = 1.0
        [[physics.wave-equation.boundaries]]
            type = "homogeneous-dirichlet"
            side-sets = ["y0", "x1"]
            components = "XXX"
        [[physics.wave-equation.boundaries]]
            type = "absorbing"
            side-sets = ["x0", "x1", "y1"]
            width-in-meters = 1.06
            taper-amplitude = 1.07
    [physics.diffusion-equation]
        time-stepping-scheme = "euler"
        start-time-in-seconds = -0.12
        end-time-in-seconds = 1234.56
        time-step-in-seconds = 0.01
        [physics.diffusion-equation.initial-values]
            filename = "model.h5"
            format = "hdf5"
            field = "VP"
        [physics.diffusion-equation.final-values]
            filename = "final.h5"
{
  "physics": {
    "wave-equation": {
      "time-stepping-scheme": "newmark",
      "start-time-in-seconds": -0.12,
      "end-time-in-seconds": 1234.56,
      "time-step-in-seconds": 0.01,
      "attenuation": false,
      "point-source-block": {
        "filename": "sources.h5",
        "groups": [
          "sources_1",
          "sources_2"
        ]
      },
      "point-source": [
        {
          "location": [
            0.0,
            1.0
          ],
          "spatial-type": "scalar",
          "spatial-weights": [
            1.0
          ],
          "rotation-on-input": {
            "matrix": [
              [
                1,
                0,
                0
              ],
              [
                0,
                1,
                0
              ],
              [
                0,
                0,
                1
              ]
            ]
          },
          "source-time-function": {
            "wavelet": "ricker",
            "center-frequency": 1.0,
            "time-shift-in-seconds": 1.0
          }
        }
      ],
      "boundaries": [
        [
          {
            "type": "homogeneous-dirichlet",
            "side-sets": [
              "y0",
              "x1"
            ],
            "components": "XXX"
          },
          {
            "type": "absorbing",
            "side-sets": [
              "x0",
              "x1",
              "y1"
            ],
            "width-in-meters": 1.06,
            "taper-amplitude": 1.07
          }
        ]
      ]
    },
    "diffusion-equation": {
      "time-stepping-scheme": "euler",
      "start-time-in-seconds": -0.12,
      "end-time-in-seconds": 1234.56,
      "time-step-in-seconds": 0.01,
      "initial-values": {
        "filename": "model.h5",
        "format": "hdf5",
        "field": "VP"
      },
      "final-values": {
        "filename": "final.h5"
      }
    }
  }
}

Detailed description of all parameters:

Wave equation subgroup [physics.wave-equation]

Compute solutions for various wave equations: acoustic, elastic, viscoelastic, coupled, ... The specific equation will be chosen based on the passed model and mesh.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation]
    time-stepping-scheme = "newmark"
    start-time-in-seconds = -0.12
    end-time-in-seconds = 1234.56
    time-step-in-seconds = 0.01
    attenuation = false
    [physics.wave-equation.point-source-block]
        filename = "sources.h5"
        groups = ["sources_1", "sources_2"]
    [[physics.wave-equation.point-source]]
        location = [0.0, 1.0]
        spatial-type = "scalar"
        spatial-weights = [1.0]
        [physics.wave-equation.point-source.rotation-on-input]
            matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
        [physics.wave-equation.point-source.source-time-function]
            wavelet = "ricker"
            center-frequency = 1.0
            time-shift-in-seconds = 1.0
    [[physics.wave-equation.boundaries]]
        type = "homogeneous-dirichlet"
        side-sets = ["y0", "x1"]
        components = "XXX"
    [[physics.wave-equation.boundaries]]
        type = "absorbing"
        side-sets = ["x0", "x1", "y1"]
        width-in-meters = 1.06
        taper-amplitude = 1.07
{
  "wave-equation": {
    "time-stepping-scheme": "newmark",
    "start-time-in-seconds": -0.12,
    "end-time-in-seconds": 1234.56,
    "time-step-in-seconds": 0.01,
    "attenuation": false,
    "point-source-block": {
      "filename": "sources.h5",
      "groups": [
        "sources_1",
        "sources_2"
      ]
    },
    "point-source": [
      {
        "location": [
          0.0,
          1.0
        ],
        "spatial-type": "scalar",
        "spatial-weights": [
          1.0
        ],
        "rotation-on-input": {
          "matrix": [
            [
              1,
              0,
              0
            ],
            [
              0,
              1,
              0
            ],
            [
              0,
              0,
              1
            ]
          ]
        },
        "source-time-function": {
          "wavelet": "ricker",
          "center-frequency": 1.0,
          "time-shift-in-seconds": 1.0
        }
      }
    ],
    "boundaries": [
      [
        {
          "type": "homogeneous-dirichlet",
          "side-sets": [
            "y0",
            "x1"
          ],
          "components": "XXX"
        },
        {
          "type": "absorbing",
          "side-sets": [
            "x0",
            "x1",
            "y1"
          ],
          "width-in-meters": 1.06,
          "taper-amplitude": 1.07
        }
      ]
    ]
  }
}

Detailed description of all parameters:

  • time-stepping-scheme

    • Pretty name: Time stepping scheme

    • Description: The explicit time-stepping scheme.

    • Parameter type: string

    • Required: True

    • Possible values: "newmark"

  • start-time-in-seconds

    • Pretty name: Simulation start time

    • Description: The simulation start time in seconds. Can be negative. Will be determined automatically if not given. Make sure to set this to a time at which all source wavelets are still zero.

    • Parameter type: number

    • Required: False

  • end-time-in-seconds

    • Pretty name: Simulation end time

    • Description: The simulation end time in seconds.

    • Parameter type: number

    • Required: False

  • time-step-in-seconds

    • Pretty name: Simulation time step

    • Description: The time-step. Will be determined automatically if not given. A too small time-step might cause unstable or temporally dispersive simulations.

    • Parameter type: number

    • Required: False

  • attenuation

    • Pretty name: Attenuation flag

    • Description: Enable / disable attenuation in the simulation. If turned on, the model needs to contain Q and parameters to specify the linear solids.

    • Parameter type: boolean

    • Required: True

Block of point sources. subgroup [physics.wave-equation.point-source-block]

Reads all source characteristics from a group in an HDF5 file.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source-block]
    filename = "sources.h5"
    groups = ["sources_1", "sources_2"]
{
  "point-source-block": {
    "filename": "sources.h5",
    "groups": [
      "sources_1",
      "sources_2"
    ]
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Filename

    • Description: Filename containing sources

    • Parameter type: string

    • Required: True

  • groups

    • Pretty name: Groups

    • Description: Array of groups in the HDF5 file containing source information

    • Parameter type: array of strings

    • Required: True

Point source subgroup [physics.wave-equation.point-source]

Point sources for the wave equation.

Required: False

Full example (Please note that some options might be mutally exclusive):

[[physics.wave-equation.point-source]]
    location = [0.0, 1.0]
    spatial-type = "scalar"
    spatial-weights = [1.0]
    [physics.wave-equation.point-source.rotation-on-input]
        matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    [physics.wave-equation.point-source.source-time-function]
        wavelet = "ricker"
        center-frequency = 1.0
        time-shift-in-seconds = 1.0
{
  "point-source": {
    "location": [
      0.0,
      1.0
    ],
    "spatial-type": "scalar",
    "spatial-weights": [
      1.0
    ],
    "rotation-on-input": {
      "matrix": [
        [
          1,
          0,
          0
        ],
        [
          0,
          1,
          0
        ],
        [
          0,
          0,
          1
        ]
      ]
    },
    "source-time-function": {
      "wavelet": "ricker",
      "center-frequency": 1.0,
      "time-shift-in-seconds": 1.0
    }
  }
}

Detailed description of all parameters:

  • location

    • Pretty name: Source location

    • Description: The source location in Cartesian coordinates.

    • Parameter type: array of numbers

    • Required: False

  • spatial-type

    • Pretty name: Spatial type of the source

    • Description: The spatial type of the point source.

    • Parameter type: string

    • Required: False

    • Possible values: "scalar", "vector", "moment_tensor", "scalar_gradient"

  • spatial-weights

    • Pretty name: Spatial weights of the source

    • Description: The spatial weights and scale of the point source.

    • Parameter type: array of numbers

    • Required: False

subgroup [physics.wave-equation.point-source.rotation-on-input]

Optionally rotate the output. The specified rotation matrix will be applied to the final output of the receiver. It should thus rotate from Cartesian X,Y,Z to the coordinate system of your choice.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source.rotation-on-input]
    matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
{
  "rotation-on-input": {
    "matrix": [
      [
        1,
        0,
        0
      ],
      [
        0,
        1,
        0
      ],
      [
        0,
        0,
        1
      ]
    ]
  }
}

Detailed description of all parameters:

  • matrix

    • Pretty name: Rotation Matrix

    • Description: A 2x2 or 3x3 rotation matrix.

    • Parameter type: array of arrays

    • Required: True

Option 1: Source time function subgroup [physics.wave-equation.point-source.source-time-function]

The temporal evolution of the source.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source.source-time-function]
    wavelet = "ricker"
    center-frequency = 1.0
    time-shift-in-seconds = 1.0
{
  "source-time-function": {
    "wavelet": "ricker",
    "center-frequency": 1.0,
    "time-shift-in-seconds": 1.0
  }
}

Detailed description of all parameters:

  • wavelet

    • Pretty name: Source time function

    • Description: The type of the source time function

    • Parameter type: string

    • Required: True

    • Possible values: "ricker"

  • center-frequency

    • Pretty name: Center Frequency

    • Description: The center frequency of the ricker wavelet.

    • Parameter type: number

    • Required: True

  • time-shift-in-seconds

    • Pretty name: Time shift

    • Description: Optional time shift to center the ricker wavelet around a time different than zero.

    • Parameter type: number

    • Required: False

Option 2: Source time function subgroup [physics.wave-equation.point-source.source-time-function]

The temporal evolution of the source.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source.source-time-function]
    wavelet = "gaussian-rate"
    half-duration-in-seconds = 1.0
    decay-rate = 3.5
    time-shift-in-seconds = 1.0
{
  "source-time-function": {
    "wavelet": "gaussian-rate",
    "half-duration-in-seconds": 1.0,
    "decay-rate": 3.5,
    "time-shift-in-seconds": 1.0
  }
}

Detailed description of all parameters:

  • wavelet

    • Pretty name: Source time function

    • Description: The type of the source time function

    • Parameter type: string

    • Required: True

    • Possible values: "gaussian-rate"

  • half-duration-in-seconds

    • Pretty name: Half duration

    • Description: The half duration

    • Parameter type: number

    • Required: True

  • decay-rate

    • Pretty name: Decay rate

    • Description: The source decay rate. Default: 3.5

    • Parameter type: number

    • Required: False

  • time-shift-in-seconds

    • Pretty name: Time shift

    • Description: Optional time shift to center the ricker wavelet around a time different than zero.

    • Parameter type: number

    • Required: False

Option 3: Source time function subgroup [physics.wave-equation.point-source.source-time-function]

The temporal evolution of the source.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source.source-time-function]
    wavelet = "heaviside"
{
  "source-time-function": {
    "wavelet": "heaviside"
  }
}

Detailed description of all parameters:

  • wavelet

    • Pretty name: Source time function

    • Description: The type of the source time function

    • Parameter type: string

    • Required: True

    • Possible values: "heaviside", "delta"

Option 4: Source time function subgroup [physics.wave-equation.point-source.source-time-function]

The temporal evolution of the source.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.wave-equation.point-source.source-time-function]
    wavelet = "custom"
    filename = "source.h5"
    dataset-name = "/stf"
{
  "source-time-function": {
    "wavelet": "custom",
    "filename": "source.h5",
    "dataset-name": "/stf"
  }
}

Detailed description of all parameters:

  • wavelet

    • Pretty name: Source time function

    • Description: The type of the source time function

    • Parameter type: string

    • Required: True

    • Possible values: "custom"

  • filename

    • Pretty name: Source filename

    • Description: The hdf5 filename of the source.

    • Parameter type: string

    • Required: True

  • dataset-name

    • Pretty name: Dataset name

    • Description: The hdf5 dataset name containing the source time function.

    • Parameter type: string

    • Required: True

Boundary conditions subgroup [physics.wave-equation.boundaries]

Boundary conditions for wave equations.

Required: False

Full example (Please note that some options might be mutally exclusive):

[[physics.wave-equation.boundaries]]
    type = "homogeneous-dirichlet"
    side-sets = ["y0", "x1"]
    components = "XXX"
[[physics.wave-equation.boundaries]]
    type = "absorbing"
    side-sets = ["x0", "x1", "y1"]
    width-in-meters = 1.06
    taper-amplitude = 1.07
[
  {
    "type": "homogeneous-dirichlet",
    "side-sets": [
      "y0",
      "x1"
    ],
    "components": "XXX"
  },
  {
    "type": "absorbing",
    "side-sets": [
      "x0",
      "x1",
      "y1"
    ],
    "width-in-meters": 1.06,
    "taper-amplitude": 1.07
  }
]

Detailed description of all parameters:

Child array: [physics.wave-equation.boundaries]

Full example (Please note that some options might be mutally exclusive):

[[physics.wave-equation.boundaries]]
    type = "homogeneous-dirichlet"
    side-sets = ["y0", "x1"]
    components = "XXX"
{
  "type": "homogeneous-dirichlet",
  "side-sets": [
    "y0",
    "x1"
  ],
  "components": "XXX"
}

Detailed description of all parameters:

  • type

    • Pretty name: Homogeneous Dirichlet

    • Description: Homogeneous dirichlet boundary conditions

    • Parameter type: string

    • Required: True

    • Possible values: "homogeneous-dirichlet"

  • side-sets

    • Pretty name: Side sets

    • Description: Side sets at which to apply the boundary conditions.

    • Parameter type: array of strings

    • Required: True

  • components

    • Pretty name: XXX

    • Description: XXX

    • Parameter type: array of booleans

    • Required: False

Child array: [physics.wave-equation.boundaries]

Full example (Please note that some options might be mutally exclusive):

[[physics.wave-equation.boundaries]]
    type = "absorbing"
    side-sets = ["x0", "x1", "y1"]
    width-in-meters = 1.06
    taper-amplitude = 1.07
{
  "type": "absorbing",
  "side-sets": [
    "x0",
    "x1",
    "y1"
  ],
  "width-in-meters": 1.06,
  "taper-amplitude": 1.07
}

Detailed description of all parameters:

  • type

    • Pretty name: Absorbing boundaries

    • Description: Apply first order Clayton-Enquist boundary conditions, optionally also with damping sponge layers.

    • Parameter type: string

    • Required: True

    • Possible values: "absorbing"

  • side-sets

    • Pretty name: Side sets

    • Description: Side sets at which to apply the boundary conditions.

    • Parameter type: array of strings

    • Required: True

  • width-in-meters

    • Pretty name: Width of the absorbing layer

    • Description: Width of the absorbing layers in meters. The longer, the better. 3.5 - 5 wavelengths are typically sufficient.

    • Parameter type: number

    • Required: True

  • taper-amplitude

    • Pretty name: Taper amplitude

    • Description: Taper amplitude, u0. As a rule of thumb, a good choice is setting the taper amplitude to the central frequency in Hertz.

    • Parameter type: number

    • Required: True

Diffusion equation subgroup [physics.diffusion-equation]

Solve the diffusion equation. Mainly useful for the (anisotropic) smoothing of models. This feature requires a license for SalvusOpt.

Required: False

Full example (Please note that some options might be mutally exclusive):

[physics.diffusion-equation]
    time-stepping-scheme = "euler"
    start-time-in-seconds = -0.12
    end-time-in-seconds = 1234.56
    time-step-in-seconds = 0.01
    [physics.diffusion-equation.initial-values]
        filename = "model.h5"
        format = "hdf5"
        field = "VP"
    [physics.diffusion-equation.final-values]
        filename = "final.h5"
{
  "diffusion-equation": {
    "time-stepping-scheme": "euler",
    "start-time-in-seconds": -0.12,
    "end-time-in-seconds": 1234.56,
    "time-step-in-seconds": 0.01,
    "initial-values": {
      "filename": "model.h5",
      "format": "hdf5",
      "field": "VP"
    },
    "final-values": {
      "filename": "final.h5"
    }
  }
}

Detailed description of all parameters:

  • time-stepping-scheme

    • Pretty name: Time stepping scheme

    • Description: The time-stepping scheme.

    • Parameter type: string

    • Required: True

    • Possible values: "euler"

  • start-time-in-seconds

    • Pretty name: Simulation start time

    • Description: The simulation start time in seconds. Can be negative. Will be determined automatically if not given.

    • Parameter type: number

    • Required: True

  • end-time-in-seconds

    • Pretty name: Simulation end time

    • Description: The simulation end time in seconds.

    • Parameter type: number

    • Required: True

  • time-step-in-seconds

    • Pretty name: Simulation time step

    • Description: The time-step.

    • Parameter type: number

    • Required: True

Initial values subgroup [physics.diffusion-equation.initial-values]

Initial values of the diffusion equation

Required: True

Full example (Please note that some options might be mutally exclusive):

[physics.diffusion-equation.initial-values]
    filename = "model.h5"
    format = "hdf5"
    field = "VP"
{
  "initial-values": {
    "filename": "model.h5",
    "format": "hdf5",
    "field": "VP"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: filename

    • Description: The filename of the initial values.

    • Parameter type: string

    • Required: True

  • format

    • Pretty name: File format

    • Description: The file format for the volume data.

    • Parameter type: string

    • Required: False

    • Possible values: "hdf5"

  • field

    • Pretty name: field

    • Description: The name of the field to smooth.

    • Parameter type: string

    • Required: True

Final values subgroup [physics.diffusion-equation.final-values]

Output fields at the end of the simulation

Required: True

Full example (Please note that some options might be mutally exclusive):

[physics.diffusion-equation.final-values]
    filename = "final.h5"
{
  "final-values": {
    "filename": "final.h5"
  }
}

Detailed description of all parameters:

  • filename

    • Pretty name: Output file name

    • Description: File within which to store the final values

    • Parameter type: string

    • Required: True

PAGE CONTENTS