Skip to content

Commit 32fc25e

Browse files
authored
Merge pull request #415 from bsaakash/master
abs - more memory efficient calculation of response spectra, more diagnostics for design of experiments in surrogate-aided Bayesian calibration
2 parents 5c2422d + f161cd6 commit 32fc25e

File tree

3 files changed

+590
-50
lines changed

3 files changed

+590
-50
lines changed

modules/common/groundMotionIM/IntensityMeasureComputer.py

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -343,13 +343,12 @@ def compute_response_spectrum(self, periods=[], damping=0.05, im_units=dict()):
343343
return
344344
elif type(periods) == list: # noqa: RET505, E721
345345
periods = np.array(periods)
346-
num_periods = len(periods)
347346

348347
for cur_hist_name, cur_hist in self.time_hist_dict.items():
349348
dt = cur_hist[1]
350349
ground_acc = cur_hist[2]
351350
num_steps = len(ground_acc)
352-
# discritize
351+
# discretize
353352
dt_disc = 0.005
354353
num_steps_disc = int(np.floor(num_steps * dt / dt_disc))
355354
f = interp1d(
@@ -360,75 +359,73 @@ def compute_response_spectrum(self, periods=[], damping=0.05, im_units=dict()):
360359
)
361360
tmp_time = [dt_disc * x for x in range(num_steps_disc)]
362361
ground_acc = f(tmp_time)
362+
363363
# circular frequency, damping, and stiffness terms
364-
omega = (2 * np.pi) / periods
365-
cval = damping * 2 * omega
366-
kval = ((2 * np.pi) / periods) ** 2
364+
omega = (2.0 * np.pi) / periods
365+
cval = damping * 2.0 * omega
366+
kval = ((2.0 * np.pi) / periods) ** 2
367+
denom = 1.0 + 0.5 * dt_disc * cval + 0.25 * (dt_disc**2) * kval
368+
369+
# state vectors (length = num_periods)
370+
accel = np.zeros_like(omega)
371+
vel = np.zeros_like(omega)
372+
disp = np.zeros_like(omega)
373+
374+
# rolling maxima for spectra
375+
max_disp = np.zeros_like(omega)
376+
max_vel = np.zeros_like(omega)
377+
max_at = np.zeros_like(omega)
378+
367379
# Newmark-Beta
368-
accel = np.zeros([num_steps_disc, num_periods])
369-
vel = np.zeros([num_steps_disc, num_periods])
370-
disp = np.zeros([num_steps_disc, num_periods])
371-
a_t = np.zeros([num_steps_disc, num_periods])
372-
accel[0, :] = (-ground_acc[0] - (cval * vel[0, :])) - (kval * disp[0, :])
380+
accel[:] = -ground_acc[0] - (cval * vel) - (kval * disp)
373381
for j in range(1, num_steps_disc):
374382
delta_acc = ground_acc[j] - ground_acc[j - 1]
375383
delta_d2u = (
376384
-delta_acc
377-
- dt_disc * cval * accel[j - 1, :]
378-
- dt_disc
379-
* kval
380-
* (vel[j - 1, :] + 0.5 * dt_disc * accel[j - 1, :])
381-
) / (1.0 + 0.5 * dt_disc * cval + 0.25 * dt_disc**2 * kval)
382-
delta_du = dt_disc * accel[j - 1, :] + 0.5 * dt_disc * delta_d2u
385+
- dt_disc * cval * accel
386+
- dt_disc * kval * (vel + 0.5 * dt_disc * accel)
387+
) / denom
388+
delta_du = dt_disc * accel + 0.5 * dt_disc * delta_d2u
383389
delta_u = (
384-
dt_disc * vel[j - 1, :]
385-
+ 0.5 * dt_disc**2 * accel[j - 1, :]
390+
dt_disc * vel
391+
+ 0.5 * dt_disc**2 * accel
386392
+ 0.25 * dt_disc**2 * delta_d2u
387393
)
388-
accel[j, :] = delta_d2u + accel[j - 1, :]
389-
vel[j, :] = delta_du + vel[j - 1, :]
390-
disp[j, :] = delta_u + disp[j - 1, :]
391-
a_t[j, :] = ground_acc[j] + accel[j, :]
394+
accel += delta_d2u
395+
vel += delta_du
396+
disp += delta_u
397+
a_t = ground_acc[j] + accel
398+
399+
# update rolling maxima in-place
400+
np.maximum(np.fabs(disp), max_disp, out=max_disp)
401+
np.maximum(np.fabs(vel), max_vel, out=max_vel)
402+
np.maximum(np.fabs(a_t), max_at, out=max_at)
403+
392404
# collect data
393405
self.disp_spectrum.update(
394-
{
395-
cur_hist_name: np.ndarray.tolist(
396-
unit_factor_psd * np.max(np.fabs(disp), axis=0)
397-
)
398-
}
406+
{cur_hist_name: np.ndarray.tolist(unit_factor_psd * max_disp)}
399407
)
400408
self.vel_spectrum.update(
401-
{
402-
cur_hist_name: np.ndarray.tolist(
403-
unit_factor_vspec * np.max(np.fabs(vel), axis=0)
404-
)
405-
}
409+
{cur_hist_name: np.ndarray.tolist(unit_factor_vspec * max_vel)}
406410
)
407411
self.acc_spectrum.update(
408412
{
409413
cur_hist_name: np.ndarray.tolist(
410-
unit_factor_aspec
411-
* np.max(np.fabs(a_t), axis=0)
412-
/ 100.0
413-
/ self.g
414+
unit_factor_aspec * max_at / 100.0 / self.g
414415
)
415416
}
416417
)
417418
self.psv.update(
418419
{
419420
cur_hist_name: np.ndarray.tolist(
420-
unit_factor_psv * omega * np.max(np.fabs(disp), axis=0)
421+
unit_factor_psv * omega * max_disp
421422
)
422423
}
423424
)
424425
self.psa.update(
425426
{
426427
cur_hist_name: np.ndarray.tolist(
427-
unit_factor_psa
428-
* omega**2
429-
* np.max(np.fabs(disp), axis=0)
430-
/ 100.0
431-
/ self.g
428+
unit_factor_psa * omega**2 * max_disp / 100.0 / self.g
432429
)
433430
}
434431
)

0 commit comments

Comments
 (0)