Example 5: Simulated nonlinear propertyΒΆ

Generate simulated nonlinear properties. This example just shows an example of generating the simulated profiles.

[1]:
import matplotlib.pyplot as plt
import numpy as np

import pystrata

%matplotlib inline
[2]:
# Increased figure sizes
plt.rcParams["figure.dpi"] = 120

Create a soil layer, which defines the median value.

[3]:
soil_type = pystrata.site.DarendeliSoilType(18.0, plas_index=0, ocr=1, stress_mean=50)

Create the simulated nonlinear curves

[4]:
n = 10
correlation = 0
simulated = []

for name, model in zip(
    ["Darendeli (2001)", "EPRI SPID (2014)"],
    [
        pystrata.variation.DarendeliVariation(correlation),
        pystrata.variation.SpidVariation(correlation),
    ],
):
    simulated.append((name, [model(soil_type) for _ in range(n)]))

Compare the uncertainty models.

[5]:
fig, axes = plt.subplots(2, 2, sharex=True, sharey="row", subplot_kw={"xscale": "log"})

for i, (name, sims) in enumerate(simulated):
    for j, prop in enumerate(["mod_reduc", "damping"]):
        axes[j, i].plot(
            getattr(soil_type, prop).strains,
            np.transpose([getattr(s, prop).values for s in sims]),
            linewidth=0.5,
            color="C0",
            alpha=0.8,
        )
        if j == 0:
            axes[j, i].set_title(name)

axes[0, 0].set_ylabel("$G/G_{max}$")
axes[1, 0].set_ylabel("$D$ (%)")
plt.setp(axes[1, :], xlabel=r"Strain, $\gamma$ (%)")

fig.tight_layout();
../_images/examples_example-05_8_0.png

Sample deterministic percentile curves (5th, 50th, and 95th) using the fixed-percentiles mode.

[6]:
percentiles = [0.05, 0.50, 0.95]
model = pystrata.variation.SpidVariation(
    correlation=0,
    sample_mode="fixed_percentiles",
    percentiles=percentiles,
)

samples = [model(soil_type, sample_index=i) for i in range(len(percentiles))]

fig, axes = plt.subplots(
    1, 2, sharex=True, subplot_kw={"xscale": "log"}, figsize=(9, 3.5)
)

for ax, prop, ylabel in zip(
    axes,
    ["mod_reduc", "damping"],
    ["$G/G_{max}$", "$D$ (%)"],
):
    strains = getattr(soil_type, prop).strains
    median = getattr(soil_type, prop).values
    ax.plot(strains, median, color="k", linewidth=2, label="Median")
    for p, sample in zip(percentiles, samples):
        ax.plot(
            strains,
            getattr(sample, prop).values,
            linewidth=1.6,
            label=f"{int(100 * p)}th percentile",
        )
    ax.set_ylabel(ylabel)
    ax.legend()

for ax in axes:
    ax.set_xlabel(r"Strain, $\gamma$ (%)")

fig.suptitle("SPID fixed-percentile samples")
fig.tight_layout();
../_images/examples_example-05_10_0.png