@@ -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