Results comparison to SLAMMER

PySLAMMER’s rigid, decoupled, and coupled analysis methods are intended to produce sliding block analysis results that match the legacy SLAMMER results. This is an important feature for sliding block displacements, which are used as a performance index (as opposed to providing a direct prediction of actual slope displacement) in practice. Equivalence with legacy results allows new results to be interpreted with reference to historical analyses and experience.

Approach

To demonstrate pySLAMMER’s equivalence to SLAMMER, we performed several sliding block analyses across a broad parametric space. The three main categories of parameters studied were ground motion, analysis method, and analysis options.

Ground motion

We used the motions from pySLAMMER’s built-in sample ground motion suite at several scales to capture a reasonable breadth of the familiar key engineering ground motion characteristics (frequency, amplitude, and duration). The acceleration response spectra for the input motion suite are shown in Figure 1. Additional details on the ground motions are provided on the ground motion suite page.

Code
# Navigate to ground motion suite response spectra files
current_dir = os.getcwd()
folder_path = Path(current_dir).resolve().parents[1] / "tests" / "pySLAMMER_suite_resp"
csv_files = list(folder_path.glob("*.csv"))

# Read each CSV file into a DataFrame and store them in a list
freq_index = 0
resp_index = 1
spectra = {}
for csv_file in csv_files:
    data = np.loadtxt(csv_file, delimiter=",", skiprows=2)
    # convert response from cm/s^2 to g's
    data[:, resp_index] = data[:, resp_index] / 981
    spectra[csv_file.name.strip(".csv")] = data

# Initialize the plot
fig, ax = plt.subplots()
ax.set_prop_cycle(cycler(color=plt.cm.tab20.colors))
for motion in spectra:
    ax.plot(
        1/spectra[motion][:, freq_index],
        spectra[motion][:, resp_index],
        label=motion,
        linewidth=0.5,
    )

ax.text(0.012, 2.75, "5% damping")
# Add labels, legend, and grid
ax.set_xlabel("Period (s)")
ax.set_ylabel("Spectral Acceleration (g)")
ax.set_title("Response Spectra")
ax.set_xscale("log")
ax.set_ylim(0,3)
ax.set_xlim(0.01,100)

ax.legend(
    loc="center left", 
    bbox_to_anchor=(0.6, 0.6), 
    fontsize="x-small", 
    title="Ground Motion", 
    title_fontsize="medium",
    frameon=False
)

plt.show()
Figure 1: Acceleration response spectra for input ground motions

Analysis methods

The three rigorous analysis methods that SLAMMER performs are the Rigid, Decoupled, and Coupled methods. Each of these methods, which are briefly described below, are implemented in pySLAMMER and included in this comparison.

Rigid Block Analysis

Conceptualized by Whitman in 1963 and further developed by Newmark in 1965 (Marcuson (1994), Newmark (1965)), rigid block analysis models a potential landslide mass as a rigid mass on an inclined plane base with a perfectly plastic frictional interface. The rigid block motion matches the base motion exactly until the acceleration of the base exceeds some critical value (the yield acceleration, \(k_y\)). Once this critical \(k_y\) value is reached, the block’s acceleration remains constant \(k_y\), resulting in relative velocity and displacement between block and base. The relative velocity is calculated by integrating the difference between the block and base accelerations. The displacement accumulated by the block moving down the ramp is calculated by integrating the relative velocity. Sliding stops (i.e., block motion again matches base motion exactly) when the relative velocity reaches zero.

Decoupled Analysis

Landslide materials are, of course, not rigid. Except for very shallow, stiff slide masses, the rigid block model does a poor job of approximating the dynamics of a co-seismic landslide system. The decoupled method was developed to provide some way of accounting for the deformation of the slope mass due to shaking (Seed and Martin (1966), Makdisi and Seed (1978)) . It consists of two distinct (or decoupled, if you will) calculations: dynamic response and rigid sliding. During the dynamic response phase, the possibility of sliding is ignored while the slope response to strong ground motion is calculated. The average internal acceleration of the slope mass during this first phase is then used as the base input acceleration for the second phase (rigid sliding) which is simply a rigid block analysis.

Coupled Analysis

As indicated by the name, coupled analysis takes the two separate calculations from the decoupled analysis and performs them simultaneously. Chopra and Zhang (1991) introduced a model for earthquake-induced sliding of concrete gravity dams that considered the dynamic response of the dam during sliding. Rathje and Bray (1999) modified the procedure and applied it to earth structures. With coupled sliding, the sliding mass’s dynamic response is calculated for both sliding and non-sliding conditions. Sliding stops when the relative velocity of the sliding mass reaches zero. The stop of sliding can introduce an abrupt change in acceleration applied to the sliding mass. Because the dynamic response is being calculated continually through the analysis, the approach to identifying the timing of these abrupt changes will affect potential subsequent sliding events.

Dynamic Response

The Decoupled and Coupled methods both require the calculation of the slope’s dynamic response. The two methods for dynamic response in SLAMMER, which have been carried over to pySLAMMER are linear elastic and equivalent linear.

Analysis options

SLAMMER allows users to include a constant \(k_y\) value or a variable \(k_y\) that changes with accumulated sliding displacement. The \(k_y\) – displacement relationship is stepwise with a table of paired values. This feature provides a rough means of approximating post-peak residual strength. 1

The dynamic response of the system (applicable to decoupled and coupled analyses) is calculated using either linear elastic or equivalent linear assumptions. The minimum input parameters needed for the linear elastic analyses are a damping ration, the slope height, and the shear wave velocity of the material above and below the slip surface. For equivalent linear analysis, a reference strain parameter is also needed. Although not explicitly documented, inspection of the SLAMMER source code uses Darendeli (2001) modulus reduction and damping curves with a curvature coefficient of 1.

Separate entries for the shear wave velocity of the material above and below the slip surface (\(V_s\) and \(V_b\), respectively) are used to introduce an equivalent foundation radiation damping into the viscous material damping as described by Lee (2004). This happens behind the scenes in SLAMMER by default and cannot be turned off. 2

Table 1 shows the analysis options and ranges of input values used in the group of simulations used to compare pySLAMMER to

Code
kykmax = [0.05, 1.0]
tmts = [0.1, 10.0]
height = [0.1, 100]
vs =  [200, 1200]
vsvb =  [0.1, 100]
damp =  [5, 25]
ref_str =  [1, 10]

params = {
    "param": [
        "Methods",
        "Dynamic Resp.",
        "ky/kmax",
        "Tm/Tx *",
        "Slope height (m) *",
        "Slope shear wave vel., Vs (m/s) *",
        "Vs/Vb *",
        "Damping (%) *",
        "Reference strain (%) **"
    ],
    "val": [
        "Rigid, Decoupled, Coupled",
        "Linear elastic, Equivalent linear",
        f"{kykmax[0]} to {kykmax[1]}",
        f"{tmts[0]} to {tmts[1]}",
        f"{height[0]} to {height[1]}",
        f"{vs[0]} to {vs[1]}",
        f"{vsvb[0]} to {vsvb[1]}",
        f"{damp[0]} to {damp[1]}",
        f"{ref_str[0]} to {ref_str[1]}"
    ]
}

# * only applicable to Decoupled and Coupled methods
# ** only applicable to equivalent linear dynamic response

tbl = (
    GT(pd.DataFrame(params))
    .cols_label(
    param=html("Parameter"),
    val=html("Range / Options used")
    )
    .cols_align(align="center", columns=1)
    .tab_source_note("* Only applies to Decouled and Coupled analyses") 
    .tab_source_note("** Only applies to equivalent linear analyses")
)
tbl
Table 1: Sliding block parameters used for pySLAMMER to SLAMMER comparison analyses.
Parameter Range / Options used
Methods Rigid, Decoupled, Coupled
Dynamic Resp. Linear elastic, Equivalent linear
ky/kmax 0.05 to 1.0
Tm/Tx * 0.1 to 10.0
Slope height (m) * 0.1 to 100
Slope shear wave vel., Vs (m/s) * 200 to 1200
Vs/Vb * 0.1 to 100
Damping (%) * 5 to 25
Reference strain (%) ** 1 to 10
* Only applies to Decouled and Coupled analyses
** Only applies to equivalent linear analyses

Results

The results of the simulations across the parametric space described in Table 1 show excellent agreement between pySLAMMER and SLAMMER. When viewed at a linear scale, the results seem to show complete agreement (see Figure 2). However, due to minor numerical differences and orders of operations between the two codes, some non-zero numerical differences should be expected.

Code
# Navigate to ground motion suite response spectra files
current_dir = os.getcwd()
data_path = Path(current_dir).resolve().parents[1] / "tests" / "SLAMMER_results.xlsx"

df = import_verification_data(data_path)
df["kykmax"] = df["ky (g)"] / df["kmax (g)"]

dfp = df[df["kykmax"] < 1.0]

############
# pySLAMMER v. SLAMMER
############
fig, ax = plt.subplots()
cmap = plt.cm.viridis  

# Match color values to kykmax values
color_values = dfp["kykmax"] 

# Scatter plot with color mapping
scatter = ax.scatter(
    dfp["SLAMMER"],  # x-axis values
    dfp["pySLAMMER"],  # y-axis values
    c=color_values,  # Numeric values for coloring
    cmap=cmap,  # Colormap
    alpha=0.5,  # Transparency
    marker=".",
)

# Add colorbar
cbar = plt.colorbar(scatter, ax=ax, alpha=1)
cbar.set_label("Yield Ratio ($k_y/k_{max}$)")  # Label for the colorbar


ax.set_xlim(0, 1000)
ax.set_ylim(0, 1000)

plt.grid()

ax.set_xlabel("SLAMMER displacement (cm)")
ax.set_ylabel("pySLAMMER displacement (cm)")
plt.show()
Figure 2: Linear scale comparison of pySLAMMER and SLAMMER analysis results. At this scale, the differences are too small to be distinguished visually.

Viewed on a log-log scale, the numerical differences become become visible for analyses with sub-centimeter sliding displacements (Figure 3). In practice, sub-centimeter sliding block displacements are not typically considered significant and the error magnitudes present at this scale are beyond the level of precision that sliding block results are interpreted at.

Code
ax.set_xscale("log")
ax.set_yscale("log")
ax.set_xlim(1e-3, 1e3)
ax.set_ylim(1e-3, 1e3)

fig
Figure 3: Log-log scale comparison of pySLAMMER and SLAMMER analysis results. At this scale, the small differences become visible. Nevertheless, the match between the two is excellent in the range of engineering interest.

The numerical error magnitudes that are visibile in Figure 3 are quantified in Table 2, which summarizes the fit of pySLAMMER to SLAMMER sliding block displacement results over different ranges of predicted displacement. The linear regression parameters in Table 2 show how well a straigt line fit would match the data set over discrete ranges of predicted displacements. Within each displacment range, the 95th percentile error 3 is also reported.

Code
scales = [0.001, 0.01, 0.1, 1, 10, 100 ,1000]
interest = ["no", "no", "yes", "yes", "yes", "yes"]
match_quality = ["moderate", "very good", "excellent", "excellent", "excellent", "excellent"]
comp = {
    "Range": [],
    "Engineering\nInterest": [],
    "Computation\nMatch": [],
    "error_95": [],
    "Slope": [],
    "Intercept": [],
    "R_sq": []
}

for i in range(len(scales)-1):
    segment = dfp[
        (dfp["SLAMMER"] > scales[i])
        & (dfp["SLAMMER"] < scales[i+1])
    ]
    slope, intercept, r, p, se = ssmstat.linregress(
        segment["SLAMMER"],
        segment["pySLAMMER"],
    )
    comp["Range"].append(f"{scales[i]} to {scales[i+1]}")
    comp["Engineering\nInterest"].append(interest[i])
    comp["error_95"].append(f"{np.percentile(
        abs(segment["pySLAMMER"] - segment["SLAMMER"]),
        95):.2f}")
    comp["Slope"].append(f"{slope:.2f}")
    comp["Intercept"].append(f"{intercept:.2f}")
    comp["R_sq"].append(f"{r**2:.2f}")
    comp["Computation\nMatch"].append(match_quality[i])
    

tbl = (
    GT(pd.DataFrame(comp))
    .tab_spanner(
    label="Linear Regression Parameters",
    columns=["Slope","Intercept","R_sq"]
    )
    .cols_label(
    Range=html("Displacement Range<br>(cm)"),
    Intercept=html("Intercept<br>(cm)"),
    R_sq=html("R<sup>2</sup>"),
    error_95=html("95<sup>th</sup> percentile error<br>(cm)")

    )
)
tbl
Table 2: Comparison of pySLAMMER-SLAMMER results agreement by order of displacement magnitude.
Displacement Range
(cm)
Engineering Interest Computation Match 95th percentile error
(cm)
Linear Regression Parameters
Slope Intercept
(cm)
R2
0.001 to 0.01 no moderate 0.01 1.06 0.00 0.54
0.01 to 0.1 no very good 0.01 1.00 0.00 0.99
0.1 to 1 yes excellent 0.02 1.00 0.00 1.00
1 to 10 yes excellent 0.07 1.00 0.00 1.00
10 to 100 yes excellent 0.27 1.00 0.00 1.00
100 to 1000 yes excellent 0.67 1.00 0.18 1.00

Conclusions

The results show that pySLAMMER is performing the same rigorous analysis methods as SLAMMER. Across a broad array of input parameters, the results are identical or nearly identical. Minor numerical differences between the output of the two programs is to be expected. However, the differences are so small as to be insignificant for engineering purposes, both in research and practice.

References

Chopra, Anil K., and Liping Zhang. 1991. “Earthquake-Induced Base Sliding of Concrete Gravity Dams.” Journal of Structural Engineering 117 (12): 3698–3719. https://doi.org/10.1061/(ASCE)0733-9445(1991)117:12(3698).
Lee, Yong Woo. 2004. “Equivalent-Linear Dynamic Sliding Response Analysis of Geotechnical Earth Structures.” PhD thesis.
Makdisi, Faiz I., and H. Bolton Seed. 1978. “Simplified Procedure for Estimating Dam and Embankment Earthquake-Induced Deformations.” Journal of the Geotechnical Engineering Division 104 (7): 849–67. https://doi.org/10.1061/AJGEB6.0000668.
Marcuson, W. 1994. “A Symposium in Honor of Robert v. Whitman.” In.
Newmark, N. M. 1965. “Effects of Earthquakes on Dams and Embankments.” Geotechnique 15 (2): 139–60.
Rathje, E. M., and J. D. Bray. 1999. “An Examination of Simplified Earthquake-Induced Displacement Procedures for Earth Structures.” Canadian Geotechnical Journal 36 (1): 72–87. https://doi.org/10.1139/cgj-36-1-72.
Seed, H. Bolton, and Geoffrey R. Martin. 1966. “The Seismic Coefficient in Earth Dam Design.” Journal of the Soil Mechanics and Foundations Division 92 (3): 25–58. https://doi.org/10.1061/JSFEAQ.0000871.

Footnotes

  1. pySLAMMER includes additional options for variable yield acceleration, but only stepwise variation is applicable to comparison with SLAMMER↩︎

  2. If lower total damping than the equivalent foundation radiation damping is needed for some reason (e.g., for comparison with published analyses that did not include this damping mechanism) both SLAMMER and pySLAMMER accept negative values for damping ratio, which can be used to offset the damping applied by the foundation radiation damping.↩︎

  3. 95 percent of all simulations in the range had errors less than this.↩︎