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
|
Per-frequency anisotropy metrics for a set of CSAMT sites. |
|
Per-station summary of anisotropy metrics. |
|
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
Sitescontainer.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 = 0andswift_skew = 0indicate 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:
- 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_flagis True when|mean_ratio_log10| > ratio_thresholdORmean_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:
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: