# Maps

A map allows to map vectors from $$\mathbb{R}^m$$ to $$\mathbb{R}^n$$.

## ConstantMap

Assigns a constant value, independent of position.

!ConstantMap
map:
<dimension>: <double>
<dimension>: <double>
...

Domain

inherited

Codomain

keys in map

Example

0_constant

## IdentityMap

Does nothing in particular (same as !Any).

!IdentityMap

Domain

inherited

Codomain

domain

## AffineMap

Implements the affine mapping $$y=Ax+t$$.

!AffineMap
matrix:
<dimension>: [<double>, <double>, ...]
<dimension>: [<double>, <double>, ...]
...
translation:
<dimension>: <double>
<dimension>: <double>
...

Domain

inherited

Codomain

keys of matrix / translation

Example

Say we have a row in matrix which reads “p: [a,b,c]”, and a corresponding row in translation “p: d”. Furthermore, assume rho, mu, and lambda are the input dimensions. Then $$p = a\cdot\lambda + b\cdot\mu + c\cdot\rho + d.$$

3_layered_linear

By convention, the input dimensions are ordered lexicographically (according to the ASCII code, i.e. first 0-9, then A-Z, and then a-z), hence the first entry in a matrix row corresponds to the the first input dimension in lexicographical order.

## PolynomialMap

Assigns a value using a polynomial for every parameter.

!PolynomialMap
map:
#             x^n,      ...,        x,        1
<dimension>: [<double>, ..., <double>, <double>]
<dimension>: [<double>, ..., <double>, <double>]
...

Domain

inherited but may only be a one dimension

Codomain

keys in map

Example

62_landers

## FunctionMap

Implements a mapping described by an ImpalaJIT function.

!FunctionMap
map:
<dimension>: <function_body>
<dimension>: |
<long_function_body>
...

Domain

inherited

Codomain

keys in map

Example

Input dimensions are x,y,z. Then “p: return x * y * z;” yields $$p = x \cdot y \cdot z$$. (Note: Don’t forget the return statement.)

5_function

The <function_body> must an be ImpalaJIT function (without surrounding curly braces). The function gets passed all input dimensions automatically.

Known limitations:

• No comments (// or /* */)

• No exponential notation (use pow(10.,3.) instead of 1e3)

• No ‘else if’ (use else { if () {}}).

## ASAGI

Looks up values using ASAGI (with trilinear interpolation).

!ASAGI
file: <string>
parameters: [<parameter>,<parameter>,...]
var: <string>
interpolation: (nearest|linear)

Domain

inherited

Codomain

keys in parameters

Example

101_asagi

file

Path to a NetCDF file that is compatible with ASAGI

parameters

Parameters supplied by ASAGI in order of appearance in the NetCDF file

var

The NetCDF variable which holds the data (default: data)

interpolation

Choose between nearest neighbour and linear interpolation (default: linear)

## SCECFile

!SCECFile
file: <string>
interpolation: (nearest|linear)

Domain

inherited, must be 2D

Codomain

cohesion, d_c, forced_rupture_time, mu_d, mu_s, s_dip, s_normal, s_strike

Example

example

file

Path to a SCEC stress file

interpolation

Choose between nearest neighbour and linear interpolation (default: linear)

## EvalModel

Provides values by evaluating another easi tree.

!EvalModel
parameters: [<parameter>,<parameter>,...]
model: <component>
... # specify easi tree
components: <component>
... # components receive output of model as input

Domain

inherited

Codomain

keys of parameters

Example

120_initial_stress: [b_xx, b_yy, b_zz, b_xy, b_yz, b_xz] are defined through the component “!STRESS_STR_DIP_SLIP_AM”, which depends itself on several parameters (mu_d, mu_s, etc). One of these parameter “strike” is set to vary spatially through an “!AffineMap”. “!EvalModel” allows to evaluate this intermediate variable before executing the “!STRESS_STR_DIP_SLIP_AM” component.

## OptimalStress

This function allows computing the stress which would result in faulting in the rake direction on the optimally oriented plane defined by strike and dip angles (this can be only a virtual plane if such optimal orientation does not correspond to any segment of the fault system). The principal stress magnitudes are prescribed by the relative prestress ratio R (where $$R=1/(1+S)$$), the effective confining stress (effectiveConfiningStress $$= Tr(sii)/3$$) and the stress shape ratio $$s2ratio = (s_2-s_3)/(s_1-s_3)$$, where $$s_1>s_2>s_3$$ are the principal stress magnitudes, following the procedure described in Ulrich et al. (2019), methods section ‘Initial Stress’. To prescribe R, static and dynamic friction (mu_s and mu_d) as well as cohesion are required.

components: !OptimalStress
constants:
mu_d:      <double>
mu_s:      <double>
strike:    <double>
dip:       <double>
rake:      <double>
cohesion:  <double>
s2ratio:   <double>
R:         <double>
effectiveConfiningStress: <double>

Domain

inherited

Codomain

stress components (s_xx, s_yy, s_zz, s_xy, s_yz, and s_xz)

## AndersonianStress

This function allows computing Andersonian stresses (for which one principal axis of the stress tensor is vertical).

The principal stress orientations are defined by SH_max (measured from North, positive eastwards), the direction of maximum horizontal compressive stress.

S_v defines which of the principal stresses $$s_i$$ is vertical where $$s_1>s_2>s_3$$. S_v = 1, 2 or 3 should be used if the vertical principal stress is the maximum, intermediate or minimum compressive stress. Assuming mu_d=0.6, S_v = 1 favours normal faulting on a 60° dipping fault plane striking SH_max, S_v = 2 favours strike-slip faulting on a vertical fault plane making an angle of 30° with SH_max and S_v = 3 favours reverse faulting on a 30° dipping fault plane striking SH_max.

The principal stress magnitudes are prescribed by the relative fault strength S (related to the relative prestress ratio R by $$R=1/(1+S)$$), the vertical stress sig_zz and the stress shape ratio $$s2ratio = (s_2-s_3)/(s_1-s_3)$$, where $$s_1>s_2>s_3$$ are the principal stress magnitudes, following the procedure described in Ulrich et al. (2019), methods section ‘Initial Stress’. To prescribe S, static and dynamic friction (mu_s and mu_d) as well as cohesion are required.

components: !AndersonianStress
constants:
mu_d:      <double>
mu_s:      <double>
SH_max:    <double>
S_v:       <int (1,2 or 3)>
cohesion:  <double>
s2ratio:   <double>
S:         <double>
sig_zz:    <double>

Domain

inherited

Codomain

stress components (s_xx, s_yy, s_zz, s_xy, s_yz, and s_xz)

## STRESS_STR_DIP_SLIP_AM (deprecated)

This routine is now replaced by the more complete and exact ‘OptimalStress’ routine. It is nevertheless preserved in the code for being able to run the exact setup we use for the Sumatra SC paper (Uphoff et al., 2017). It is mostly similar with the ‘OptimalStress’ routine, but instead of a rake parameter, the direction of slip can only be pure strike-slip and pure dip-slip faulting (depending on the parameter DipSlipFaulting). In this routine the s_zz component of the stress tensor is prescribed (and not the confining stress tr(sii)/3) as in ‘OptimalStress’.

components: !STRESS_STR_DIP_SLIP_AM
constants:
mu_d:      <double>
mu_s:      <double>
strike:    <double>
dip:       <double>
DipSlipFaulting: <double> (0 or 1)
cohesion:  <double>
s2ratio:   <double>

Domain

inherited

Codomain

stress components (s_xx, s_yy, s_zz, s_xy, s_yz, and s_xz)

Example

120_initial_stress

## SpecialMap

Evaluates application-defined functions.

!<registered-name>
constants:
<parameter>: <double>
<parameter>: <double>
...

Domain

inherited without constant parameters

Codomain

user-defined

Example

We want to create a function which takes three input parameters and supplies two output parameters:

#include "easi/util/MagicStruct.h"

struct Special {
struct in {
double i1, i2, i3;
};
in i;

struct out {
double o1, o2;
};
out o;

inline void evaluate() {
o.o1 = exp(i.i1) + i.i2;
o.o2 = i.i3 * o.o1;
}
};

SELF_AWARE_STRUCT(Special::in, i1, i2, i3)
SELF_AWARE_STRUCT(Special::out, o1, o2)


Register this file with the parser:

easi::YAMLParser parser(3);
parser.registerSpecial<Special>("!Special");


And use it in the following way, e.g.:

!Special
constants:
i2: 3.0


The domain of !Special is now i1, i3 and the codomain is o1, o2. i2 is constant and has the value 3.