In [1]:
import matplotlib.pyplot as plt
import numpy as np
import pysra
%matplotlib inline
In [2]:
# Increased figure sizes
plt.rcParams['figure.dpi'] = 120
In [3]:
fname = 'data/NIS090.AT2'
with open(fname) as fp:
next(fp)
description = next(fp).strip()
next(fp)
parts = next(fp).split()
time_step = float(parts[1])
accels = [float(p) for l in fp for p in l.split()]
ts = pysra.motion.TimeSeriesMotion(
fname, description, time_step, accels)
In [4]:
ts.accels
Out[4]:
There are a few supported file formats. AT2 files can be loaded as follows:
In [5]:
ts = pysra.motion.TimeSeriesMotion.load_at2_file(fname)
ts.accels
Out[5]:
In [6]:
fig, ax = plt.subplots()
ax.plot(ts.times, ts.accels)
ax.set(xlabel='Time (sec)', ylabel='Accel (g)')
fig.tight_layout();
In [7]:
profile = pysra.site.Profile([
pysra.site.Layer(
pysra.site.DarendeliSoilType(
18., plas_index=0, ocr=1, stress_mean=200),
30, 400
),
pysra.site.Layer(
pysra.site.SoilType(
'Rock', 24., None, 0.01
),
0, 1200
),
])
In [8]:
calcs = [
('EQL', pysra.propagation.EquivalentLinearCalculator()),
('FDM (KA)', pysra.propagation.FrequencyDependentEqlCalculator(use_smooth_spectrum=True)),
('FDM (ZR)', pysra.propagation.FrequencyDependentEqlCalculator(use_smooth_spectrum=False))
]
In [9]:
freqs = np.logspace(-1, np.log10(50.), num=500)
outputs = pysra.output.OutputCollection([
pysra.output.ResponseSpectrumOutput(
# Frequency
freqs,
# Location of the output
pysra.output.OutputLocation('outcrop', index=0),
# Damping
0.05),
pysra.output.ResponseSpectrumRatioOutput(
# Frequency
freqs,
# Location in (denominator),
pysra.output.OutputLocation('outcrop', index=-1),
# Location out (numerator)
pysra.output.OutputLocation('outcrop', index=0),
# Damping
0.05),
pysra.output.AccelTransferFunctionOutput(
# Frequency
freqs,
# Location in (denominator),
pysra.output.OutputLocation('outcrop', index=-1),
# Location out (numerator)
pysra.output.OutputLocation('outcrop', index=0),
),
pysra.output.AccelTransferFunctionOutput(
# Frequency
freqs,
# Location in (denominator),
pysra.output.OutputLocation('outcrop', index=-1),
# Location out (numerator)
pysra.output.OutputLocation('outcrop', index=0),
ko_bandwidth=30,
)
])
Compute the response of the site, and store the state within the calculation object, which is then used along with the output collection to compute the desired outputs. Also, extract the computed properties for comparison.
In [10]:
properties = {}
for name, calc in calcs:
calc(ts, profile, profile.location('outcrop', index=-1))
outputs(calc, name)
properties[name] = {
key: getattr(profile[0], key)
for key in ['shear_mod_reduc', 'damping']
}
In [11]:
for key in properties['EQL'].keys():
fig, ax = plt.subplots()
for i, (k, p) in enumerate(properties.items()):
if k == 'EQL':
ax.axhline(p[key], label=k, color=f'C{i}')
else:
ax.plot(ts.freqs, p[key], label=k, color=f'C{i}')
ax.set(
ylabel={'damping': 'Damping (dec)',
'shear_mod_reduc': r'$G/G_{max}$'}[key],
xlabel='Frequency (Hz)', xscale='log'
)
ax.legend()
In [12]:
for output in outputs:
fig, ax = plt.subplots()
for name, refs, values in output.iter_results():
ax.plot(refs, values, label=name)
ax.set(xlabel=output.xlabel, xscale='log', ylabel=output.ylabel)
ax.legend()
fig.tight_layout();
In [ ]: