Green's Function

The interactions among fault patches, asthenosphere elements as well as between fault and asthenosphere are computed via convolution of Green's Function. Currently supported Green's Function:

  • 1D elastic line dislocation
  • 2D elastic rectangular dislocation
  • 2D elastic triangular dislocation
  • 3D inelastic strain in Hex8 or Tet4 elements

Other types, such as 2D inelastic (plane stress or antiplane stress), polygon dislocation, are WIP (PR are welcome!).

All functions translated here are ensured to be type stable and have minimum allocation. Broadcasting isn't supported here (why?) so you can easily embed them into multiprocessors parallel computation, which is implemented here.

Also be aware of the coordinate system difference among all the Green's function provided here. Users are encouraged to view the original sources for further details. This package preserves the original coordinate systems as well as function arguments for all, whose outcomes are also tested against original ones.

Public Interface

Quaycle.compose_stress_greens_funcMethod
compose_stress_greens_func(ee::AbstractArray, ev::NTuple, ve::NTuple, vv::NTuple{N, <:Tuple},
    ϵcomp::NTuple, σcomp::NTuple) where N

Concatenate tuple of matrix or tuple of tuple of matrix which arrange them in a way to update traction/stress rate using only one BLAS call. It does nothing to the elastic Green's function and specifically used for the outputs from stress_greens_func and stress_greens_func.

Arguments

  • ee::AbstractArray: traction Green's function within the elastic fault
  • ev::NTuple: stress Green's function from elastic fault to inelastic asthenosphere
  • ve::NTuple: traction Green's function inelastic asthenosphere to elastic fault
  • vv::NTuple: stress Green's function within inelastic asthenosphere
  • ϵcomp: strain component to be considered, must be a subset of σcomp
  • σcomp: stress component to be considered
source
Quaycle.compose_stress_greens_funcMethod
compose_stress_greens_func(mf::OkadaMesh, me::SBarbotMeshEntity,
    λ::T, μ::T, ft::PlaneFault, comp::NTuple{N, <:Symbol}) where {T, N}

Shortcut function for computing all 4 Green's function for viscoelastic relaxation. Arguments stays the same as stress_greens_func.

source
Quaycle.stress_greens_funcMethod
stress_greens_func(mf::AbstractMesh{2}, ma::SBarbotMeshEntity,
    λ::T, μ::T, ft::FlatPlaneFault,
    σcomp::NTuple{N, Symbol}; kwargs...) where {T<:Real, I<:Integer, N}

Compute stress Green's function from fault mesh to asthenosphere mesh.

Arguments

  • mf::AbstractMesh{2}: mesh of fault
  • ma::SBarbotMeshEntity{3}: mesh of asthenosphere
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ft::FlatPlaneFault: fault type, either DIPPING() or STRIKING()
  • σcomp::NTuple{N, Symbol}: stress components to consider

KWARGS Arguments

The same as previously mentioned:

  • nrept::Integer
  • buffer_ratio::Real

Output

The output is a tuple of length(σcomp) matrix, each corresponds $σ_{ij}$ in the same order as given by σcomp.

source
Quaycle.stress_greens_funcMethod
stress_greens_func(mesh::LineOkadaMesh, λ::T, μ::T, ft::FlatPlaneFault; kwargs...) where T

Compute traction Green function in 1-D elastic fault in LineOkadaMesh.

Arguments

  • mesh::LineOkadaMesh: the line mesh coupled with dc3d
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ft::FlatPlaneFault: fault type, either DIPPING() or STRIKING()

KWARGS Arguments

  • ax_ratio::Real: ratio of along-strike to along-downdip, default is 12.5
source
Quaycle.stress_greens_funcMethod
stress_greens_func(mesh::RectOkadaMesh, λ::T, μ::T, ft::FlatPlaneFault;
    fourier_domain=true, kwargs...) where T

Compute traction Green's function in 2-D elastic fault in RectOkadaMesh. Translational symmetry is considered.

Arguments

  • mesh::RectOkadaMesh: the rectangular mesh coupled with dc3d
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ft::FlatPlaneFault: fault type, either DIPPING() or STRIKING()

KWARGS Arguments

  • fourier_domain::Bool: whether or not transform the tensor to fourier domain
  • nrept::Integer: number of periodic summation is performed
  • buffer_ratio::Real: ratio of length of buffer zone (along-strike) to that of fault (along-strike) It is recommended to set at least 1 for strike-slip fault for mimicing zero-dislocation at ridge on both sides.
source
Quaycle.stress_greens_funcMethod
stress_greens_func(mesh::TDTri3MeshEntity, λ::T, μ::T, ft::FlatPlaneFault; kwargs...) where T

Compute traction Green's function in 2-D elastic fault in TDTri3MeshEntity.

Arguments

  • mesh::TDTri3MeshEntity: the triangular mesh coupled with td_stress_hs
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ft::FlatPlaneFault: fault type, either DIPPING() or STRIKING()

KWARGS Arguments

  • nrept::Integer: number of periodic summation is performed
  • buffer_ratio::Real: ratio of length of buffer zone (along-strike) to that of fault (along-strike). Notice the direction of strike is the average value of mesh.ss and the length is the strike projected maximum horizontal expansion.
source
Quaycle.stress_greens_funcMethod
stress_greens_func(ma::SBarbotMeshEntity{3}, λ::T, μ::T,
    ϵcomp::NTuple{N1, Symbol}, σcomp::NTuple{N2, Symbol}; kwargs...) where {T, N1, N2}

Compute stress Green's function within SBarbotTet4MeshEntity or SBarbotHex8MeshEntity

Arguments

  • ma::SBarbotMeshEntity{3}: asthenosphere mesh
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ϵcomp: the strain ϵcomponent(s) to be considered
  • σcomp::NTuple{N, Symbol}: stress components to consider

Output

A tuple of $n$ tuple of matrix, each tuple represents interaction from one strain component, w.r.t. ϵcomp to the stress ϵcomponents, whose order is $σ_{ij}$ whose order is the same as σcomp, each of which is a matrix.

source
Quaycle.stress_greens_funcMethod
stress_greens_func(ma::SBarbotMeshEntity{3}, mf::AbstractMesh{2}, λ::T, μ::T, ft::PlaneFault,
    ϵcomp::NTuple{N, Symbol}; kwargs...) where {T, N}

Compute traction Green's function from SBarbotTet4MeshEntity or SBarbotHex8MeshEntity to RectOkadaMesh

Arguments

  • ma::SBarbotMeshEntity{3}: asthenosphere mesh
  • mf::AbstractMesh{2}: fault mesh
  • λ::T: Lamé's first parameter
  • μ::T: shear modulus
  • ft::FlatPlaneFault: fault type, either DIPPING() or STRIKING()
  • ϵcomp: the strain ϵcomponent(s) to be considered

Output

A tuple of $n$ matrix, each represents interaction from one strain to the traction on fault.

source
Quaycle.dc3dMethod
dc3d(x::T, y::T, z::T, α::T, dep::T, dip::T,
    al::Union{A, SubArray}, aw::Union{A, SubArray}, disl::A
    ) where {T <: Number, A <: AbstractVecOrMat{T}}

Calculate displacements and gradient of displacements due to a rectangular dislocation in an elastic isotropic halfspace.

Please see dc3d for details. Also this fault coordinate system is widely used in this package.

Arguments

  • x, y, z: observational position, where $z ≤ 0$
  • α: elastic constant
  • dep: depth of fault origin
  • dip: dip angle in degree
  • al: a vector of 2 numbers, indicating along strike (x-axis) spanning
  • aw: a vector of 2 numbers, indicating along downdip (y-z plane) spanning
  • disl: a vector of 3 numbers, indicating dislocation in along-strike, along-downdip and tensile respectively.

Output

A vector of 12 numbers, each is $u_{x}$, $u_{y}$, $u_{z}$, $u_{x,x}$, $u_{y,x}$, $u_{z,x}$, $u_{x,y}$, $u_{y,y}$, $u_{z,y}$, $u_{x,z}$ $u_{y,z}$, $u_{z,z}$.

source
Quaycle.sbarbot_disp_hex8Method
sbarbot_disp_hex8(
    x1::R, x2::R, x3::R, q1::R, q2::R, q3::R,
    L::R, T::R, W::R, theta::R,
    epsv11p::R, epsv12p::R, epsv13p::R, epsv22p::R, epsv23p::R, epsv33p::R,
    G::R, nu::R,
    ) where R

Compute displacement arisen from inelastic strain in Hex8 elements. Please see original version for complete details, especially the coordinate system used here.

Arguments

  • x1, x2, x3: observational position, where $x_{3} ≥ 0$
  • q1, q2, q3: Hex8 element position, where $q_{3} ≥ 0$
  • L, T, W: Hex8 element length, thickness and width
  • theta: strike angle
  • epsv**: strain components, each is $ϵ_{11}$, $ϵ_{12}$, $ϵ_{13}$, $ϵ_{22}$, $ϵ_{23}$, $ϵ_{33}$
  • G: shear modulus
  • nu: poisson ratio

Output

A vector of 3 numbers, each represents $u_{1}$, $u_{2}$, $u_{3}$

Notice

  • Inplace version: sbarbot_disp_hex8!(u, args...) where u is a vector of 3 numbers.
source
Quaycle.sbarbot_stress_hex8Method
sbarbot_stress_hex8(
    x1::R, x2::R, x3::R, q1::R, q2::R, q3::R,
    L::R, T::R, W::R, theta::R,
    epsv11p::R, epsv12p::R, epsv13p::R, epsv22p::R, epsv23p::R, epsv33p::R,
    G::R, nu::R,
    ) where R

Compute stress arisen from inelastic strain in Hex8 elements. Please see original version for complete details, especially the coordinate system used here.

Arguments

The same as sbarbot_disp_hex8

Output

A vector of 6 numbers, each represents $σ_{11}$, $σ_{12}$, $σ_{13}$, $σ_{22}$, $σ_{23}$, $σ_{33}$

Notice

  • Inplace version: sbarbot_stress_hex8!(u, args...) where u is a vector of 6 numbers.
source
Quaycle.sbarbot_disp_tet4Method
sbarbot_disp_tet4(quadrature::Q,
    x1::R, x2::R, x3::R, A::U, B::U, C::U, D::U,
    e11::R, e12::R, e13::R, e22::R, e23::R, e33::R, nu::R
    ) where {R, U, Q}

Compute displacement arisen from inelastic strain in Tet4 elements. Please see original version for complete details, especially the coordinate system used here.

Arguments

  • quadrature: quadrature rule for integration, see FastGaussQuadrature.jl
  • x1, x2, x3: observational position, where $x_{3} ≥ 0$
  • A, B, C, D: a list of 3 numbers for each, each of which represents coordinates of the vertex. All depth coordinates must be greater or equal to 0 (no checking is performed here)
  • e**: strain components, each is $ϵ_{11}$, $ϵ_{12}$, $ϵ_{13}$, $ϵ_{22}$, $ϵ_{23}$, $ϵ_{33}$
  • nu: poisson ratio

Output

A vector of 3 numbers, each represents $u_{1}$, $u_{2}$, $u_{3}$

Notice

  • Inplace version: sbarbot_disp_tet4!(u, args...) where u is a vector of 3 numbers.
source
Quaycle.sbarbot_stress_tet4Method
sbarbot_stress_tet4(quadrature::Q,
    x1::R, x2::R, x3::R, A::U, B::U, C::U, D::U,
    e11::R, e12::R, e13::R, e22::R, e23::R, e33::R, G::R, nu::R
    ) where {R, U, Q}

Compute stress arisen from inelastic strain in Tet4 elements. Please see original version for complete details, especially the coordinate system used here.

Arguments

  • quadrature: quadrature rule for integration, see FastGaussQuadrature.jl
  • x1, x2, x3: observational position
  • A, B, C, D: a list of 3 numbers for each, each of which represents coordinates of the vertex
  • e**: strain components, each is $ϵ_{11}$, $ϵ_{12}$, $ϵ_{13}$, $ϵ_{22}$, $ϵ_{23}$, $ϵ_{33}$
  • G: shear modulus
  • nu: poisson ratio

Output

A vector of 6 numbers, each represents $σ_{11}$, $σ_{12}$, $σ_{13}$, $σ_{22}$, $σ_{23}$, $σ_{33}$

Notice

  • Inplace version: sbarbot_stress_tet4!(u, args...) where u is a vector of 6 numbers.
source
Quaycle.td_disp_hsMethod
td_disp_hs(X::T, Y::T, Z::T, P1::V, P2::V, P3::V, Ss::T, Ds::T, Ts::T, nu::T) where {T, V}

Compute displacement risen from triangular dislocation in elastic halfspace. Please see original version (in supporting information) for details, especially the coordinate system used here.

Arguments

  • X, Y, Z: observational coordinates
  • P1, P2, P3: three triangular vertices coordinates respectively
  • Ss, Ds, Ts: triangular dislocation vector, Strike-slip, Dip-slip, Tensile-slip respectively
  • nu: poisson ratio

Output

By order: $u_x$, $u_y$, $u_z$

source
Quaycle.td_stress_hsMethod
td_stress_hs(X::T, Y::T, Z::T, P1::V, P2::V, P3::V, Ss::T, Ds::T, Ts::T, λ::T, μ::T) where {T, V}

Compute stress risen from triangular dislocation in elastic halfspace. Please see original version (in supporting information) for details, especially the coordinate system used here.

Arguments

  • X, Y, Z: observational coordinates
  • P1, P2, P3: three triangular vertices coordinates respectively
  • Ss, Ds, Ts: triangular dislocation vector, Strike-slip, Dip-slip, Tensile-slip respectively
  • λ: Lamé's first parameter
  • μ: shear modulus

Output

By order: $σ_{xx}$, $σ_{yy}$, $σ_{zz}$, $σ_{xy}$, $σ_{xz}$, $σ_{yz}$. Please be aware of its different order, where principle components come first, against sbarbot_stress_hex8 and sbarbot_stress_tet4 aside from coordinate system difference.

source

References

Okada, Y. (1992). Internal deformation due to shear and tensile faults in a half-space. Bulletin of the Seismological Society of America, 82(2), 1018–1040.

Pan, E., Yuan, J. H., Chen, W. Q., & Griffith, W. A. (2014). Elastic Deformation due to Polygonal Dislocations in a Transversely Isotropic Half‐SpaceElastic Deformation due to Polygonal Dislocations in a Transversely Isotropic Half‐Space. Bulletin of the Seismological Society of America, 104(6), 2698–2716. https://doi.org/10.1785/0120140161

Nikkhoo, M., & Walter, T. R. (2015). Triangular dislocation: an analytical, artefact-free solution. Geophysical Journal International, 201(2), 1119–1141. https://doi.org/10.1093/gji/ggv035

Barbot, S., Moore, J. D. P., & Lambert, V. (2017). Displacement and Stress Associated with Distributed Anelastic Deformation in a Half‐Space. Bulletin of the Seismological Society of America, 107(2), 821–855. https://doi.org/10.1785/0120160237

Barbot, S. (2018). Deformation of a Half‐Space from Anelastic Strain Confined in a Tetrahedral Volume. Bulletin of the Seismological Society of America, 108(5A), 2687–2712. https://doi.org/10.1785/0120180058