You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The slant stack is implemented in one of two modes (time or depth). In depth mode, the implemenation is the wave-number domain with a change of variables from the vertical wave-number``k_z`` and the horizontal offset wave-number ``k_h`` to the ray parameter ``p_h``. In the time mode, the implementation is in the frequency/wave-number domain with a change of variables from frequency ``\omega`` and ``k_h`` to ``p_h``. The change of variables is defined via a mapping from ``k_z`` and ``p`` to ``k_h`` that is derived from dispersion relations for the downward propagating wave
3
+
The slant stack is implemented in one of two modes (time or depth). In depth mode, the implementation is the wave-number domain with a change of variables from the vertical wavenumber``k_z`` and the horizontal subsurface half-offset wavenumber ``k_h`` to the angle of incidence (half of opening angle) ``\theta`` measured with respect to the normal to a planar reflector. An application of this mode would be the conversion of subsurface offset gathers (SSOG) into angle gathers (SSAG). In time mode, the implementation is in the frequency/wavenumber domain with a change of variables from frequency ``\omega`` and surface offset wavenumber ``k_h`` to the ray parameter ``p``. An application of this mode would be the tau-p transform of shot gathers. The change of variables is defined via a mapping from ``k_z`` and ``\theta`` (or ``p``) to ``k_h``.
4
4
5
-
```math
6
-
\frac{\omega^2}{c^2} = k_{gx}^2 + k_{gz}^2
7
-
```
8
-
9
-
and the reflected wave
5
+
We start by noting the definition of the ray parameter ``p`` with takeoff angle ``\gamma`` (with respect to the vertical)
10
6
11
7
```math
12
-
\frac{\omega^2}{c^2} = k_{sx}^2 + k_{sz}^2.
8
+
p = \frac{\sin\gamma}{c}.
13
9
```
14
10
15
-
Next we note the definition of the ray parameter ``p`` with incidence angle ``\theta_s`` and reflected angle ``\theta_g``, and assume that ``\theta=\theta_s=\theta_g``:
11
+
Note that the ray parameter is preserved in the system for each wave. The relation between the takoff angle and the plane wave can be derived from the dispersion relation and is given by
16
12
17
13
```math
18
-
p = \frac{1}{c}(\sin\theta_g + \sin\theta_s) = \frac{2}{c}(\sin\theta)
14
+
\sin(\gamma) = \frac{k_x}{\omega/c},
19
15
```
20
16
21
-
The relation between the incidence angle and the plane wave is given by:
17
+
so that the mapping between ``k_h=k_x``and ``p`` is
22
18
23
19
```math
24
-
\sin(\theta) = \frac{k_x}{\omega/c}
20
+
p = \frac{k_x}{\omega}.
25
21
```
26
22
27
-
So that the mapping between `k_h=2k_x` and `p` is,
28
-
23
+
In time mode, this provides the mapping between ``k_h`` and ``p`` via the relation
29
24
```math
30
-
p = 2\frac{k_x}{\omega}
25
+
d(\omega,p) = \delta(k_h - p\omega)d(\omega,k_h).
31
26
```
32
27
33
-
In time mode, this provides the mapping between ``k_h`` and ``p`` via the relation:
34
-
```math
35
-
d(\omega,p) = \delta(k_h - p\omega)d(\omega,k_h)
36
-
```s
37
-
38
-
The offset wave-number is ``k_h=k_{sx}+k_{gx}`` and we make the assumption that ``k_{sx}=k_{gx}`` so that ``k_{sx}=k_{gx}=k_x``, ``k_h=2k_x`` and ``k_{gz}=k_{sz}=k_z``. Now, we can find the mapping from ``p_h`` and ``k_z`` to ``k_h`` starting from the above dispersion relation we find:
28
+
In depth mode, we start from the extended imaging condition between source and receiver plane waves
The image vertical wavenumber and subsurface half-offset wavenumber at a reflection point are given by ``(k_z,k_h) = (k_{sz}-k_{rz}, k_{sx}+k_{rx})``. Assuming a horizontal reflector, we have ``k_{sx} = k_{rx}``, ``k_{sz} = -k_{rz}``, and ``\gamma_s = 2\pi - \gamma_r = \theta - \pi``. Given that ``\frac{k_{sx}}{k_{sz}} = -\tan(\gamma_s)`` we deduce
Copy file name to clipboardExpand all lines: src/jop_slantstack.jl
+41-57Lines changed: 41 additions & 57 deletions
Original file line number
Diff line number
Diff line change
@@ -1,32 +1,33 @@
1
1
"""
2
-
A = JopSlantStack(dom[; dz=10.0, dh=10.0, h0=-1000.0, ...])
2
+
A = JopSlantStack(dom[; dz=1.0, dh=1.0, h0=0.0, ...])
3
3
4
-
where `A` is the 2D slant-stack operator mapping for `z-h` to `tau-θ` (depth mode) or `t-h` to `tau-p` (time mode).
4
+
where `A` is the 2D slant-stack operator mapping for `z-h` to `z-θ` (depth mode) or `t-h` to `tau-p` (time mode).
5
5
The domain of the operator is `nz` x `nh` with precision T, `dz` is the depth spacing (or time interval),
6
-
`dh` is the half-offset spacing, and `h0` is the origin of the half-offset axis. The additional named optional arguments
6
+
`dh` is the offset spacing, and `h0` is the origin of the offset axis. The additional named optional arguments
7
7
along with their default values are,
8
8
9
9
* `mode="depth` - choose between "depth" and "time" to specify if the input domain is `z-h` or `t-h`.
10
-
* `theta=-60:1.0:60` - range of opening angles used when `mode="depth"`. The ray parameter is: p=sin(theta/2)/c
11
-
* `p=range(-dt/dx,dt/dx,128)` - ray parameter sampling used when `mode="time"`
10
+
* `theta=-60:1.0:60` - range of incidence angles used when `mode="depth"`.
11
+
* `p=range(-dz/dh,dz/dh,128)` - ray parameter sampling used when `mode="time"`
12
12
* `padz=0.0,padh=0.0` - fractional padding in depth and offset to apply before applying the Fourier transform
13
-
* `taperz=(0,0)` - beginning and end taper in the z-direction (or t-direction) before transforming from `z-h` to `kz-kh`
14
-
* `taperh=(0,0)` - beginning and end taper in the h-direction before transforming from `z-h` to `kz-kh`
15
-
* `taperkz=(0,0)` - beginning and end taper in the kz-direction (or frequency) before transforming from `kz-kh` to `z-h` or `f-kh` to `t-h`
16
-
* `taperkh=(0,0)` - beginning and end taper in the kh-direction before transforming from `kz-kh` to `z-h` or `f-kh` to `t-h`
13
+
* `taperz=(0,0)` - beginning and end taper (fractional) in the z-direction (or t-direction) before transforming from `z-h` to `kz-kh`
14
+
* `taperh=(0,0)` - beginning and end taper (fractional) in the h-direction before transforming from `z-h` to `kz-kh`
15
+
* `taperkz=(0,0)` - beginning and end taper (fractional) in the kz-direction (or frequency) before transforming from `kz-kh` to `z-h` or `f-kh` to `t-h`
16
+
* `taperkh=(0,0)` - beginning and end taper (fractional) in the kh-direction before transforming from `kz-kh` to `z-h` or `f-kh` to `t-h`
17
17
18
18
# Notes
19
19
20
20
* It should be possible to extend this operator to 3D
21
21
* If the mode is "time", then `padz` is the padding for the time dimension, `dz` is the time sampling interval, `taperz` is the taper for the time dimension and `tapkerkz` is the taper for frequency.
22
+
* For mode="depth", typically theta needs to cover both positive and negative angles and must be < 90 degrees.
22
23
"""
23
24
function JopSlantStack(
24
25
dom::JetAbstractSpace{T};
25
26
theta = collect(-60.0:1.0:60.0),
26
27
p =nothing,
27
-
dz =-1.0,
28
-
dh =-1.0,
29
-
h0 =NaN,
28
+
dz =1.0,
29
+
dh =1.0,
30
+
h0 =0.0,
30
31
padz =0.0,
31
32
padh =0.0,
32
33
taperz = (0,0),
@@ -37,7 +38,7 @@ function JopSlantStack(
37
38
mode ∈ ("depth", "time") || error("expected mode to be either 'depth' or 'time', got mode=$(mode)")
0 commit comments