pycsamt.emtools.anisotropy#

3-D axial anisotropy analysis for CSAMT impedance tensor data.

Implements the anisotropy metrics derived in:
wang2017Wang & Tan (2017), “Research on the forward modeling of

controlled-source audio-frequency magnetotellurics in three-dimensional axial anisotropic media”, J. Appl. Geophys. 146, 27–36.

For axial anisotropy the conductivity tensor is diagonal:

σ* = diag(σ_xx, σ_yy, σ_zz)

The CSAMT impedance tensor Z = [[Z_xx, Z_xy], [Z_yx, Z_yy]] yields two independent Cagniard apparent resistivities (eqs 17–18):

ρ_xy = (1/ωμ₀)|Z_xy|² (equatorial configuration, sensitive to σ_xx) ρ_yx = (1/ωμ₀)|Z_yx|² (axial configuration, sensitive to σ_yy, σ_zz)

Their ratio Λ = ρ_xy/ρ_yx, expressed in log₁₀ units, is the primary anisotropy indicator (Λ = 0 for isotropic media).

The Swift (1967) skew S = |Z_xx − Z_yy| / |Z_xy + Z_yx| and the corresponding rotation angle provide additional dimensionality and strike information (non-zero for anisotropic / 3-D structures).

Functions

analyze_anisotropy(sites, *[, ...])

Per-frequency anisotropy metrics for a set of CSAMT sites.

anisotropy_table(sites, *[, ...])

Per-station summary of anisotropy metrics.

plot_anisotropy(sites, *[, metric, ...])

Plot anisotropy metric pseudo-section (station × frequency).

pycsamt.emtools.anisotropy.analyze_anisotropy(sites, *, ratio_threshold=0.1, skew_threshold=0.2, recursive=True, on_dup='replace', strict=False, verbose=0)[source]#

Per-frequency anisotropy metrics for a set of CSAMT sites.

Computes the two Cagniard apparent resistivities ρ_xy and ρ_yx (wang2017 eqs 17–18), their log-ratio Λ = log₁₀(ρ_xy/ρ_yx), the phase difference, and the Swift skew from the full Z tensor.

Parameters:
  • sites (Sites | list) – EDI-like objects or a Sites container.

  • ratio_threshold (float) – |log₁₀(Λ)| above which the anisotropy flag is raised (default 0.1).

  • skew_threshold (float) – Swift skew above which 3-D / anisotropy is suspected (default 0.2).

  • recursive (bool) – Forwarded to ensure_sites().

  • on_dup (str) – Forwarded to ensure_sites().

  • strict (bool) – Forwarded to ensure_sites().

  • verbose (int) – Forwarded to ensure_sites().

Returns:

Columns: station, freq_hz, period_s, rho_xy_ohmm, rho_yx_ohmm, phi_xy_deg, phi_yx_deg, ratio_log10, phase_diff_deg, swift_skew, strike_deg.

Return type:

pd.DataFrame

Notes

ratio_log10 = 0 and swift_skew = 0 indicate a perfectly isotropic 1-D earth. Non-zero diagonal Z elements (contributing to swift_skew > 0) suggest 3-D structure or electrical anisotropy (wang2017 §5.3).

pycsamt.emtools.anisotropy.anisotropy_table(sites, *, ratio_threshold=0.1, skew_threshold=0.2, recursive=True, on_dup='replace', strict=False, verbose=0)[source]#

Per-station summary of anisotropy metrics.

Parameters:
  • sites (Sites | list)

  • ratio_threshold (float) – |log₁₀(Λ)| threshold for anisotropy flag (default 0.1).

  • skew_threshold (float) – Swift skew threshold for anisotropy flag (default 0.2).

  • recursive (bool)

  • on_dup (str)

  • strict (bool)

  • verbose (int)

Returns:

Columns: station, n_freq, mean_ratio_log10, max_abs_ratio_log10, mean_phase_diff_deg, mean_swift_skew, median_strike_deg, anisotropy_flag.

anisotropy_flag is True when |mean_ratio_log10| > ratio_threshold OR mean_swift_skew > skew_threshold.

Return type:

pd.DataFrame

pycsamt.emtools.anisotropy.plot_anisotropy(sites, *, metric='ratio_log10', ratio_threshold=0.1, skew_threshold=0.2, cmap='RdBu_r', figsize=(10, 5), period_axis=True, log_y=True, contour_zero=True, recursive=True, on_dup='replace', strict=False, verbose=0, ax=None)[source]#

Plot anisotropy metric pseudo-section (station × frequency).

Parameters:
  • sites (Sites | list)

  • metric (str) – Column from analyze_anisotropy() to map to colour: "ratio_log10" (default), "swift_skew", "phase_diff_deg", or "strike_deg".

  • ratio_threshold (float)

  • skew_threshold (float)

  • cmap (str) – Colormap (default "RdBu_r" — diverging, centred at 0).

  • period_axis (bool) – Show period on y-axis (default) rather than frequency.

  • log_y (bool) – Logarithmic y-axis.

  • contour_zero (bool) – Draw a white contour at value = 0 (relevant for ratio_log10).

  • ax (matplotlib.axes.Axes or None)

  • figsize (tuple)

  • recursive (bool)

  • on_dup (str)

  • strict (bool)

  • verbose (int)

Returns:

ax

Return type:

matplotlib.axes.Axes