# Problems¶

The problem is the optimisation task - the specific source model we invert. The search ranges and inversion conditions can be configured flexibly. So far defined problems in Grond are the optimisations of different source types, which are derived from Pyrocko Sources.

The optimisation problems which can be solved with Grond are:

- CMTProblem
A problem that solves for a centroid moment tensor point source (derived from Pyrocko’s

`CMTSource`

). This problem fits the very general earthquake source analysis based on far-field seismic waveforms.

- DoubleDCProblem
A problem that solves for two double-couple point sources (derived from

`DoubleDCSource`

). This problem can be used to solve for somewhat complex,*segmented earthquake sources*to better fit far-field seismic data.

- RectangularProblem
A problem that solves for a rectangular finite source (derived from Pyrocko’s

`RectangularSource`

). This problem fits well to large earthquakes and/or problems for which near-field surface displacement data (InSAR, GNSS, etc.) are available.

- VolumePointProblem
A problem that solves for a spherical volume point (infinite) to model magmatic or volcanic processes. Only static targets (GNSS or InSAR) are supported.

To define and configure a problem the part called `problem_config`

in the configuration is set up.

## General configuration¶

```
problem_config: !grond.ProblemConfig
# Name used to identify the output
name_template: '${event_name}'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# Define the ranges of the solution space.
ranges:
..
# Problem specific, see below ...
```

The following problem parameters are shared by all problems and are part of all problem configurations:

`name_template`

- can be any string and provides a stem for the result folders runs and report to identify different optimisations. Meaningful is to use short event and problem identifications in this string.
`norm_exponent`

- defines the norm of combining several normalization_family in the global misfit. This integer value is 1 or larger. Please find here more information on the global misfit calculation in Grond.
`ranges`

- defines the bounds of individual and specific source model parameters. See the details for the source ranges of different problems in the sections below.

An example for the configuration of a rectangular fault problem is given here:

`CMTProblem`

configuration¶

```
%YAML 1.1
# Problem: Centroid moment tensor (CMT).
problem_config: !grond.CMTProblemConfig
# Name used to identify the output
name_template: '${event_name}_cmt'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# Station distances to consider [m]
distance_min: 0
distance_max: 200e3
# Type of moment tensor to restrict to.
# Choose from 'full', 'devicatoric' or 'dc'.
mt_type: 'full'
# Define the ranges of the solution space
ranges:
# Time relative to hypocenter origin time [s]
time: '-10 .. 10 | add'
# Centroid location with respect to hypocenter origin [m]
north_shift: '-40e3 .. 40e3'
east_shift: '-40e3 .. 40e3'
depth: '4e3 .. 50e3'
magnitude: '4.0 .. 7.0'
duration: '0. .. 0.'
# Ranges for the moment tensor
rmnn: '-1.41421 .. 1.41421'
rmee: '-1.41421 .. 1.41421'
rmdd: '-1.41421 .. 1.41421'
rmne: '-1 .. 1'
rmnd: '-1 .. 1'
rmed: '-1 .. 1'
```

The Grond CMTProblem represents one of most popular problems in seismology.
Sought-after are moment tensor source models that well fit the observed seismic waveforms. The
waveforms are usually far-field observations such that this point-source approximation
is well suited. The `CMTProblem`

can be configured to a pure double-couple problem.
The source time function is fixed to half-sinusoid (see the documentation of
Pyrocko Sources for details on the source time function).

Configuration parameters that common for all problems are listed above and following are parameters
particularly for the `CMTProblem`

.

**Non-general problem parameters**:

`distance_min`

- is a minimum target distance to the source used to exclude targets closer than this. Tailored to the problem, too close targets will not be considered in the misfit evaluation. Finite-rupture effects on near targets may be excluded efficiently with a meaning setting for this parameter.
`distance_max`

- is a maximum target distance to the source used to exclude targets farther than this. Tailored to the problem, too far away targets will not be considered in the misfit evaluation. Like this certain phase interferences may be efficiently excluded.
`mt_type`

- configures the type of moment tensor. The source model can be set to be a full moment tensor (
`mt_type: full`

) or can be constrained to a deviatoric moment tensor (`mt_type: deviatoric`

) or even to a pure double couple source (`mt_type: dc`

).

**Source parameters**:

(Please check for more details the description of the Pyrocko Sources.)

`ranges`

:

`east_shift`

- is a relative position in east direction to the reference location given in
`event.txt`

. It is given in meters. `north_shift`

- is a relative position in north direction to the reference location given in ‘event.txt’. It is given in meters.
`depth`

- is the depth of the point source in meters.
`time`

- is the relative time to the origin time given in ‘event.txt’ in seconds.
`magnitude`

- is the earthquake moment magnitude.
`rmnn`

&`rmee`

&`rmdd`

&`rmne`

&`rmnd`

&`rmed`

- are the moment tensor components.
`duration`

- is the duration of the source time function in seconds.

`DoubleDCProblem`

configuration¶

```
%YAML 1.1
# Problem: Two Double Couple (Double DC).
problem_config: !grond.DoubleDCProblemConfig
# Name used to identify the output
name_template: '${event_name}_double_dc'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# Station distances to consider [m]
distance_min: 0
distance_max: 200e3
# Type of moment tensor to restrict to.
# Choose from 'full', 'devicatoric' or 'dc'.
mt_type: 'dc'
# Define the ranges of the solution space
ranges:
# Time relative to hypocenter origin time [s]
time: '-10 .. 10 | add'
# Centroid location with respect to hypocenter origin [m]
north_shift: '-40e3 .. 40e3'
east_shift: '-40e3 .. 40e3'
depth: '4e3 .. 50e3'
magnitude: '4.0 .. 7.0'
# Orientation for 1. DC
strike1: '30. .. 180.'
dip1: '30. .. 90.'
rake1: '20. .. 150.'
# Orientation for 2. DC
strike2: '30. .. 180.'
dip2: '30. .. 90.'
rake2: '20. .. 150.'
# Time and depth deltas between DCs, [s] and [m]
delta_time: '5. .. 10.'
delta_depth: '0. .. 10000.'
azimuth: '0. .. 360.'
distance: '10000. .. 40000.'
mix: '0.2 .. 0.8'
# Duration for each DC event
duration1: '5. .. 10.'
duration2: '5. .. 10.'
```

This problem has two double-couple point sources (derived from `DoubleDCSource`

). They are dependent in location and relative timing to avoid overlapping in either space or time. The mechanisms, the durations and the moments of the two sources are independent. Using this model more complex earthquakes with two prominent rupture phases or with a change of mechanism along the rupture plane can be studied. Or simply the potential of a major source
complexity of an earthquake can be tested.

Configuration parameters that common for all problems are listed above and following are parameters
particularly for the `DoubleDCProblem`

.

**Non-general problem parameters**:

`distance_min`

- is a minimum target distance to the source used to exclude targets closer than this. Tailored to the problem, too close targets will not be considered in the misfit evaluation. Finite-rupture effects on near targets may be excluded efficiently with a meaning setting for this parameter.

**Source parameters**:

(Please check for more details the description of the Pyrocko Sources.)

`ranges`

:

`east_shift`

- is a relative position in east direction to the reference location given in ‘event.txt’. It is given in meters.
`north_shift`

- is a relative position in north direction to the reference location given in ‘event.txt’. It is given in meters.
`depth`

- is the depth of the starting point source in meters.
`time`

- is the relative time to the origin time given in ‘event.txt’ in seconds.
`magnitude`

- is the total earthquake moment magnitude.
`strike1`

&`dip1`

&`rake1`

- constrain the mechanism of the first double-couple source.
`strike2`

&`dip2`

&`rake2`

- constrain the mechanism of the second double-couple source.
`delta_time`

- is the time difference between the two sources in seconds. Needs to be larger than zero to separate the sources in time and to make source 2 the later source.
`delta_depth`

- is the depth difference of the two sources in meters.
`azimuth`

- the azimuth of source 2 with respect to source 1 (clockwise from north) in degrees.
`distance`

- is the distance between the two sources in meters. Needs to be larger than zero to separate the sources in space.
`mix`

- is a value between
`0`

and`1`

that defines the relative moment contributions of the sources to the total moment. In the extreme, with`mix=0`

all the moment is in the first source and none in the second or else`mix=1`

put all moment in the second source which leaves none for the first source.`mix=0.25`

defines three quarters of the total moment on the first source and one quarter on the second, while obviously`mix=0.5`

gives two sources of the same strength. `duration1`

&`duration2`

- are the durations of the first and second source’s source time functions, respectively, in seconds.

`RectangularProblem`

configuration¶

```
%YAML 1.1
# Problem: Finite rectangular plane with uniform slip.
problem_config: !grond.RectangularProblemConfig
# Name used to identify the output
name_template: '${event_name}_joint'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# Station distances to consider [m]
distance_min: 0
distance_max: 200e3
# Decimation factor to control the number of sub-sources. Higher decimation
# speeds up the computation at the price of resolution.
# The number of subsources used in the modelling is dependent on the spatial
# spacing of the Green's function in the GF Store. The decimation_factor
# parameter allows to decrease the resolution of the discretised source model
# (use fewer sub-sources) for speedy computation with inaccurate results (for
# testing purposes). Higher value means faster computation and less accurate
# result. Default is 1.
decimation_factor: 4
# Definition of model parameter space to be searched in the optimisation
ranges:
# Time shift in [s], only important when using waveforms
time: '-10 .. 10 | add'
# Spatial shifts in [m]
north_shift: '-2000 .. 20000'
east_shift: '-2000 .. 20000'
depth: '5000 .. 30000'
# Dimensions and orientation of the fault plane, in [m] and [deg]
length: '12000 .. 18000'
width: '4000 .. 14000'
strike: '80 .. 330'
dip: '0 .. 60'
rake: '60 .. 90'
# Slip on the fault plance [m]
slip: '0.2 .. 2.'
# Dynamic constraints, not needed for static inversion
time: '-15. .. 10. | add'
nucleation_x: '-1. .. 1.'
nucleation_y: '-1. .. 1.'
```

The rectangular source is a simple finite source model with a rectangular shape and uniform moment or slip across the rupture plane. It resembles the source model defined by Haskell (1964), but has a nucleation point from which spreads a circular rupture. The position of the nucleation point on the rupture plane can be part of the problem. Uniform and bilateral ruptures are therefore possible. With the `RectangularProblem`

also directivity effects in the observations of large earthquake may be predicted.

The static rectangular source is very similar to the analytical rectangular dislocation source as described by Okada (1985), which is embedded in an isotropic elastic half-space. The `RectangularProblem`

is therefore well suited to predict near-field static surface displacements observed at GNSS stations or with InSAR. For a joint optimisation of seismic waveforms and near-field static surface displacements a `RectangularProblem`

is the appropriate choice.

Configuration parameters that common for all problems are listed above and following are parameters particularly for the `RectangularProblem`

.

**Non-general problem parameters**:

`decimation_factor`

- is only valid for finite sources. It defines a reduced number of sub-sources that build the finite source rectangle. A reduced number speeds up the forward modelling but may lead to artefacts in the source near-field. Default is no decimation (
`decimation_factor: 1`

)

**Source parameters**:

(Please check for more details the description of the Pyrocko Sources.)

For the source parameter configuration, please note that the last three parameters `nucleation_x`

, `nucleation_y`

and `time`

are needed to define the Rectangular Source for the forward modelling of seismic waveforms. If they are missing waveform targets are ignored in the optimisation. If only static targets are defined, the source parameters for the nucleation point and origin time, if given, are ignored.

`ranges`

:

`east_shift`

- is a relative position in east direction to the reference location given in
`event.txt`

. It is given in meters. `north_shift`

- is a relative position in north direction to the reference location given in ‘event.txt’. It is given in meters.
`depth`

- is the depth of upper fault edge (not centroid!) in meters.
`length`

- is the along-strike length of the fault in meters.
`width`

- is the along-dip width of the fault in meters.
`strike`

- is the strike angle of fault against north in degrees.
`dip`

- is the dip angle of fault against horizontal in degrees.
`rake`

- is the rake angle of slip in degrees.
`time`

- is the relative time to the origin time given in ‘event.txt’ in seconds.
`nucleation_x`

- relative horizontal position of the rupture nucleation point on the fault to the centre location. This parameter may range from -1 to 1. With 0 being in the centre, -1 being at the left-side fault edge, 1 at the right-side fault edge, and 0.5 is half-way between centroid and right-side fault edge.
`nucleation_y`

- relative along-dip position of the rupture nucleation point on the fault to the centre location. This parameter may range from -1 to 1. With 0 being in the centre, -1 being at the top fault edge, 1 at the bottom fault edge, and 0.5 is half-way between centroid and bottom fault edge.

`VolumePointProblem`

configuration¶

```
%YAML 1.1
# Problem: Volume point source.
problem_config: !grond.VolumePointProblemConfig
# Name used to identify the output
name_template: '${event_name}'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# Station distances to consider [m]
distance_min: 0
distance_max: 200e3
# Define the ranges of the solution space
ranges:
# Location with respect to origin [m]
north_shift: '-40e3 .. 40e3'
east_shift: '-40e3 .. 40e3'
depth: '4e3 .. 50e3'
# Volume change in [m^3]
# Negative values for deflation, positive for inflational
volume_change: '-1e9 .. 1e9'
```

The volume point problem is a simple dislocation source with a spherical shape, as a model for magmatic or volcanic processes.

This problem can be used for static targets only (InSAR or GNSS), and is similar to the Mogi model, with the difference that the `VolumePointProblem`

is using Pyrocko’s Green’s function databases and can act in layered media.

**Source parameters**:

`ranges:`

`volume_change`

- Allowed volume change of the point source, given in \(\mathrm{m}^3\). Positive for inflational volumes, negative values for deflation.