Site Response

This example demonstrates how to account for site effects in ground motion predictions.

Site Classification

Different models use various site parameters:

import pygmm
import numpy as np

# Define scenarios for different site classes
scenarios = {
    'Rock (NEHRP A)': pygmm.Scenario(
        mag=7.0, dist_rup=30, v_s30=1500, mechanism='strike_slip'
    ),
    'Firm Soil (NEHRP C)': pygmm.Scenario(
        mag=7.0, dist_rup=30, v_s30=760, mechanism='strike_slip'
    ),
    'Soft Soil (NEHRP D)': pygmm.Scenario(
        mag=7.0, dist_rup=30, v_s30=360, mechanism='strike_slip'
    ),
    'Very Soft Soil (NEHRP E)': pygmm.Scenario(
        mag=7.0, dist_rup=30, v_s30=180, mechanism='strike_slip'
    )
}

Site Amplification Effects

Calculate and compare site amplification:

import matplotlib.pyplot as plt

# Use Campbell & Bozorgnia (2014) model
model = pygmm.CampbellBozorgnia2014()

# Calculate for each site class
results = {}
for site_name, scenario in scenarios.items():
    ln_sa, ln_std = model(scenario)
    results[site_name] = {
        'sa': np.exp(ln_sa),
        'periods': model.periods
    }

# Plot comparison
plt.figure(figsize=(12, 8))

colors = ['brown', 'blue', 'orange', 'red']
for i, (site_name, data) in enumerate(results.items()):
    plt.loglog(data['periods'], data['sa'],
               color=colors[i], label=site_name, linewidth=2)

plt.xlabel('Period (s)')
plt.ylabel('Spectral Acceleration (g)')
plt.title('Site Effects on Response Spectra')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Site Amplification Factors

Calculate amplification relative to rock:

# Use rock as reference
rock_sa = results['Rock (NEHRP A)']['sa']
periods = results['Rock (NEHRP A)']['periods']

# Calculate amplification factors
print("Site Amplification Factors (relative to rock)")
print("=" * 50)

for site_name, data in results.items():
    if site_name == 'Rock (NEHRP A)':
        continue

    amplification = data['sa'] / rock_sa

    # Show amplification at key periods
    key_periods = [0.1, 0.2, 0.5, 1.0, 2.0]
    print(f"\n{site_name}:")
    for period in key_periods:
        idx = np.argmin(np.abs(periods - period))
        print(f"  T = {period}s: {amplification[idx]:.2f}")

Advanced Site Parameters

Some models support additional site parameters:

# Example with basin depth parameters
scenario_with_basin = pygmm.Scenario(
    mag=6.5,
    dist_rup=25,
    v_s30=360,
    depth_1_0=0.5,    # Depth to 1.0 km/s (km)
    depth_2_5=2.0,    # Depth to 2.5 km/s (km)
    mechanism='strike_slip'
)

# Models that support basin effects
ask14 = pygmm.AbrahamsonSilvaKamai2014()
ln_sa, ln_std = ask14(scenario_with_basin)

print(f"With basin effects included")
print(f"PGA: {np.exp(ln_sa[ask14.INDEX_PGA]):.3f} g")

Warning

Not all models support all site parameters. Check the model documentation for required and optional parameters.