def test_sdof(): """ Create a plot of an elastic analysis, nonlinear analysis and closed form elastic :return: """ record_filename = 'short_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) period = 1.0 xi = 0.05 mass = 1.0 f_yield = 1.5 # Reduce this to make it nonlinear r_post = 0.0 periods = np.array([period]) resp_u, resp_v, resp_a = sdof.response_series(motion=asig.values, dt=asig.dt, periods=periods, xi=xi) k_spring = 4 * np.pi ** 2 * mass / period ** 2 outputs = get_elastic_response(mass, k_spring, asig.values, asig.dt, xi=xi, r_post=r_post) acc_opensees_elastic = np.interp(asig.time, outputs["time"], outputs["rel_accel"]) - asig.values time = asig.time run = 1 if run: import matplotlib.pyplot as plt bf, sps = plt.subplots(nrows=3) sps[0].plot(time, resp_u[0], lw=0.7, c='r') sps[0].plot(outputs["time"], outputs["rel_disp"], ls='--') sps[1].plot(outputs['rel_disp'], outputs['force'][:, 2]) sps[2].plot(time, resp_a[0], lw=0.7, c='r') sps[2].plot(outputs["time"], outputs["rel_accel"], ls='--') sps[2].plot(time, acc_opensees_elastic, ls='--', c='g') plt.show()
def skip_plot2(): import matplotlib.pyplot as plt asig = eqsig.load_asig(conftest.TEST_DATA_DIR + 'test_motion_dt0p01.txt') travel_times = np.array([0.2, 0.5]) cases = eqsig.surface.calc_cum_abs_surface_energy(asig, travel_times, nodal=True, up_red=1, down_red=1, stt=1.0, trim=False, start=True) # plt.plot(tshifts, cases[:, -1]) # plt.plot(tshifts, expected_cases[:, -1]) plt.plot(cases[0]) plt.plot(cases[1]) cases = eqsig.surface.calc_cum_abs_surface_energy(asig, travel_times, nodal=True, up_red=1, down_red=1, stt=1.0, trim=False, start=False) plt.plot(cases[0]) plt.plot(cases[1]) # plt.plot(asig.time - 2 * travel_times[0], cases[0]) # plt.plot(asig.time - 2 * travel_times[1], cases[1]) # plt.plot(asig.time - 2 * travel_times[2], cases[2]) plt.show()
def run(show=0): record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) period = 1.0 from eqsig import sdof import matplotlib.pyplot as plt import engformat as ef bf, ax = plt.subplots(nrows=2) xi = 0.05 outputs = gen_response(period, xi, asig, etype='implicit') ax[0].plot(outputs['time'], outputs['rel_disp'], label='implicit', ls='--') outputs = gen_response(period, xi, asig, etype='central_difference', fos_for_dt=5) ax[0].plot(outputs['time'], outputs['rel_disp'], label='central_difference', ls='--') ef.text_at_rel_pos(ax[0], 0.05, 0.95, f'$\\xi$ = {xi*100:.0f}%') periods = np.array([period]) # Compare closed form elastic solution resp_u, resp_v, resp_a = sdof.response_series(motion=asig.values, dt=asig.dt, periods=periods, xi=xi) ax[0].plot(asig.time, resp_u[0], ls='-', label='Elastic', zorder=0) xi = 0.0 outputs = gen_response(period, xi, asig, etype='implicit') ax[1].plot(outputs['time'], outputs['rel_disp'], label='implicit', ls='--') outputs = gen_response(period, xi, asig, etype='central_difference', fos_for_dt=5) ax[1].plot(outputs['time'], outputs['rel_disp'], label='central_difference', ls='--') ef.text_at_rel_pos(ax[1], 0.05, 0.95, f'$\\xi$ = {xi*100:.0f}%') periods = np.array([period]) # Compare closed form elastic solution resp_u, resp_v, resp_a = sdof.response_series(motion=asig.values, dt=asig.dt, periods=periods, xi=xi) ax[1].plot(asig.time, resp_u[0], ls='-', label='Elastic', zorder=0) plt.legend() plt.show()
def create(): asig = eqsig.load_asig(conftest.TEST_DATA_DIR + 'test_motion_dt0p01.txt') asig_small = eqsig.interp_to_approx_dt(asig, 0.001) bf, sps = plt.subplots(nrows=2) sps[0].plot(asig.time, asig.values) sps[0].plot(asig_small.time, asig_small.values, ls='--') sps[1].plot(asig.fa_frequencies, abs(asig.fa_spectrum)) sps[1].loglog(asig_small.fa_frequencies, abs(asig_small.fa_spectrum), ls='--') plt.show()
def create(): """ Run an SDOF using three different damping options """ dtypes = ['rot_dashpot', 'horz_dashpot', 'rayleigh'] # dtypes = ['rayleigh'] lss = ['-', '--', ':'] bd = sm.SDOFBuilding() bd.mass_eff = 120.0e3 bd.h_eff = 10.0 bd.t_fixed = 0.7 bd.xi = 0.2 # use high damping to evaluate performance of diff damping options bd.inputs += ['xi'] l_ph = 0.2 record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) bf, sps = plt.subplots(nrows=3, figsize=(5, 8)) for c, dtype in enumerate(dtypes): outputs = get_response(bd, asig, dtype=dtype, l_ph=l_ph) # Time series plots sps[0].plot(outputs['time'], outputs['deck_accel'] / 9.8, c=cbox(c), lw=0.7, label=dtype, ls=lss[c]) sps[1].plot(outputs['hinge_rotation'] * 1e3, outputs['col_moment'] / 1e3, c=cbox(c), label=dtype, ls=lss[c]) sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['col_shear'] / 1e3, c=cbox(c), label=dtype, ls=lss[c]) if dtype == 'rot_dashpot': sps[1].plot(outputs['hinge_rotation'] * 1e3, (outputs['col_moment'] - outputs['dashpot_force'][:, 2] / 2) / 1e3, c='r', label=dtype) sps[2].plot(outputs['rel_deck_disp'] * 1e3, (outputs['col_shear'] - 3. / 2. * outputs['dashpot_force'][:, 2] / bd.h_eff) / 1e3, c='r', label=dtype) sps[0].set_ylabel('Deck accel. [g]', fontsize=7) sps[0].set_xlabel('Time [s]') ef.text_at_rel_pos(sps[1], 0.1, 0.9, 'Column hinge') sps[1].set_xlabel('Rotation [mrad]') sps[1].set_ylabel('Moment [kNm]') sps[1].set_ylabel('Shear [kN]') sps[1].set_xlabel('Disp. [mm]') ef.revamp_legend(sps[0]) ef.xy(sps[0], x_origin=True) ef.xy(sps[0], x_axis=True, y_axis=True) bf.tight_layout() name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.savefig(f'figures/{name}.png', dpi=90) plt.show()
def skip_plot(): import matplotlib.pyplot as plt accsig = eqsig.load_asig(conftest.TEST_DATA_DIR + 'test_motion_dt0p01.txt') accsig = eqsig.AccSignal(accsig.values[100:], accsig.dt) travel_times = np.linspace(0, 2, 44) travel_times = np.array([0.2, 0.5]) stt = 0.0 cases_w_s = eqsig.surface.calc_cum_abs_surface_energy(accsig, travel_times, nodal=True, up_red=1, down_red=1, stt=stt, trim=True, start=True) # plt.plot(tshifts, cases[:, -1]) # plt.plot(tshifts, expected_cases[:, -1]) from bwplot import cbox plt.plot(accsig.time, cases_w_s[0], c=cbox(0)) plt.plot(accsig.time, cases_w_s[1], c='r') cases = eqsig.surface.calc_cum_abs_surface_energy(accsig, travel_times, nodal=True, up_red=1, down_red=1, stt=stt, trim=True, start=False) plt.plot(accsig.time, cases[0], c=cbox(1), ls='--') plt.plot(accsig.time, cases[1], c=cbox(1), ls='--') plt.plot(accsig.time + (stt - travel_times[0]), cases[0], c='k', ls=':') plt.plot(accsig.time + (stt - travel_times[1]), cases[1], c='k', ls=':') case_interp_0 = np.interp(accsig.time + (stt - travel_times[0]), accsig.time, cases_w_s[0]) diff0 = np.sum(abs(case_interp_0 - cases[0])) / cases[0][-1] assert np.isclose(diff0, 0., atol=5.0e-3), diff0 case_interp_1 = np.interp(accsig.time + (stt - travel_times[1]), accsig.time, cases_w_s[1]) diff1 = np.sum(abs(case_interp_1 - cases[1])) / cases[1][-1] assert np.isclose(diff1, 0., atol=5.0e-3), diff1 case_interp_2 = np.interp(accsig.time, accsig.time + (stt - travel_times[2]), cases_w_s[2]) diff2 = np.sum(abs(case_interp_2 - cases[2])) / cases[2][-1] assert np.isclose(diff2, 0., atol=5.0e-3), diff2 plt.show()
def create(): asig = eqsig.load_asig(conftest.TEST_DATA_DIR + 'test_motion_dt0p01.txt') bf, sps = plt.subplots(nrows=2) sps[0].plot(asig.time, asig.values, c='k', lw=1) asig.gen_fa_spectrum(p2_plus=0) sps[1].loglog(asig.fa_freqs, abs(asig.fa_spectrum), c='b', label='FAS') sps[1].loglog(asig.smooth_fa_freqs, asig.smooth_fa_spectrum, c='r', label='band=40 (default)') asig.gen_smooth_fa_spectrum(band=100) sps[1].loglog(asig.smooth_fa_freqs, asig.smooth_fa_spectrum, c='orange', label='band=100') asig.gen_smooth_fa_spectrum(band=40, smooth_fa_freqs=asig.fa_freqs[1:]) sps[1].loglog(asig.smooth_fa_freqs, asig.smooth_fa_spectrum, c='y', label='band=40 - full width') # Using functions instead of inbuilt methods smatrix = eqsig.calc_smoothing_matrix_konno_1998(asig.fa_freqs, band=40) sps[1].loglog(asig.fa_freqs[1:], eqsig.calc_smooth_fa_spectrum_w_custom_matrix(asig, smatrix), c='g', label='band=40 (full w fns)', ls='--') narrow_freqs = np.logspace(-1, 1, 100, base=10) smatrix = eqsig.calc_smoothing_matrix_konno_1998(asig.fa_freqs, smooth_fa_frequencies=narrow_freqs, band=40) sps[1].loglog(narrow_freqs, eqsig.calc_smooth_fa_spectrum_w_custom_matrix(asig, smatrix), c='m', label='band=40 (narrow w fns)', ls=':') plt.legend(prop={'size': 7}) plt.show()
def run(show): period = 0.5 xi = 0.05 f_yield = 5.5 # Reduce this to make it nonlinear f_yield = 1.5 # Reduce this to make it nonlinear record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) etypes = [ 'implicit', 'newmark_explicit', 'explicit_difference', 'central_difference' ] cs = ['k', 'b', 'g', 'orange', 'm'] ls = ['-', '--', '-.', ':', '--'] for i in range(len(etypes)): etype = etypes[i] od = run_analysis(asig, period, xi, f_yield, etype=etype) if show: import matplotlib.pyplot as plt plt.plot(od['time'], od['rel_disp'], label=etype, c=cs[i], ls=ls[i]) periods = np.array([period]) if show: # Compare closed form elastic solution from eqsig import sdof resp_u, resp_v, resp_a = sdof.response_series(motion=asig.values, dt=asig.dt, periods=periods, xi=xi) plt.plot(asig.time, resp_u[0], ls='--', label='Elastic', c='r', lw=1) plt.legend() plt.show()
sps[0].legend() # Validation against time-history analysis # Load time history analysis solution test_filename = 'test_motion_true_spectra_acc.csv' data = np.loadtxt(TEST_DATA_DIR + test_filename, skiprows=1, delimiter=",") periods = data[:, 0] ss_s_a = data[:, 1] # ## Load ground motion and compute response spectrum for same periods record_filename = 'test_motion_dt0p01.txt' # loaded as an eqsig.AccSignal object asig = eqsig.load_asig(record_filename) # fast load of file for eqsig format bf, sps = plt.subplots(nrows=2, figsize=(6, 6)) # plot THA sps[0].plot(periods, ss_s_a, label="THA", c='k') sps[1].plot(periods[:40], ss_s_a[:40], label="THA", c='k') # plot response spectrum using default ratio on dt asig.generate_response_spectrum(response_times=periods, xi=0.05, min_dt_ratio=2) sps[0].plot(periods, asig.s_a / 9.81, label="eqsig - min dt ratio=2") sps[1].plot(periods[:40], asig.s_a[:40] / 9.81, label="eqsig - min dt ratio=2") # Plot response spectrum using lower ratio on dt (slower computation) asig.generate_response_spectrum(response_times=periods,
def run(): sl = sm.Soil() sl.o3_type = 'pimy' vs = 250. unit_mass = 1700.0 sl.cohesion = 120.0e3 sl.phi = 0.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.xi = 0.03 # for linear analysis sl.sra_type = 'linear' assert np.isclose(vs, sl.get_shear_vel(saturated=False)) soil_profile = sm.SoilProfile() soil_profile.add_layer(0, sl) soil_profile.height = 30.0 sl_base = sm.Soil() sl_base.o3_type = 'pimy' vs = 450. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.3 sl_base.cohesion = 120.0e3 sl_base.phi = 0.0 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.specific_gravity = 2.65 sl_base.xi = 0.03 # for linear analysis sl_base.sra_type = 'linear' soil_profile.add_layer(10.1, sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0, 2.0])) pysra_surf_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) outputs = site_response(soil_profile, in_sig) resp_dt = outputs['time'][2] - outputs['time'][1] o3_surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) o3_surf_vals = np.interp(pysra_surf_sig.time, o3_surf_sig.time, o3_surf_sig.values) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] o3_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_surf_sig.time, o3_surf_vals, c=cbox(0), label='o3') sps[0].plot(pysra_surf_sig.time, pysra_surf_sig.values, c=cbox(1), label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(o3_surf_sig.fa_frequencies, abs(o3_surf_sig.fa_spectrum), c=cbox(0)) sps[1].plot(pysra_surf_sig.fa_frequencies, abs(pysra_surf_sig.fa_spectrum), c=cbox(1)) sps[1].set_xlim([0, 20]) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies pysra_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies o3_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies h = o3_surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(o3_surf_sig.smooth_fa_frequencies, h, c=cbox(0)) pysra_h = pysra_surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_surf_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) sps[2].axhline(1, c='k', ls='--') sps[0].legend() name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.savefig(f'figs/{name}.png', dpi=90) plt.show() assert np.isclose(o3_surf_vals, pysra_surf_sig.values, atol=0.01, rtol=100).all()
def run(show=0): # Load a ground motion record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) # Define inelastic SDOF period = 1.0 xi = 0.05 mass = 1.0 f_yield = 1.5 # Reduce this to make it nonlinear r_post = 0.0 # Initialise OpenSees instance osi = o3.OpenSeesInstance(ndm=2, state=0) # Establish nodes bot_node = o3.node.Node(osi, 0, 0) top_node = o3.node.Node(osi, 0, 0) # Fix bottom node o3.Fix3DOF(osi, top_node, o3.cc.FREE, o3.cc.FIXED, o3.cc.FIXED) o3.Fix3DOF(osi, bot_node, o3.cc.FIXED, o3.cc.FIXED, o3.cc.FIXED) # Set out-of-plane DOFs to be slaved o3.EqualDOF(osi, top_node, bot_node, [o3.cc.Y, o3.cc.ROTZ]) # nodal mass (weight / g): o3.Mass(osi, top_node, mass, 0., 0.) # Define material k_spring = 4 * np.pi**2 * mass / period**2 bilinear_mat = o3.uniaxial_material.Steel01(osi, fy=f_yield, e0=k_spring, b=r_post) # Assign zero length element, # Note: pass actual node and material objects into element o3.element.ZeroLength(osi, [bot_node, top_node], mats=[bilinear_mat], dirs=[o3.cc.DOF2D_X], r_flag=1) # Define the dynamic analysis # Define the dynamic analysis acc_series = o3.time_series.Path(osi, dt=asig.dt, values=-1 * asig.values) # should be negative o3.pattern.UniformExcitation(osi, dir=o3.cc.X, accel_series=acc_series) # set damping based on first eigen mode angular_freq = o3.get_eigen(osi, solver='fullGenLapack', n=1)[0]**0.5 beta_k = 2 * xi / angular_freq o3.rayleigh.Rayleigh(osi, alpha_m=0.0, beta_k=beta_k, beta_k_init=0.0, beta_k_comm=0.0) # Run the dynamic analysis o3.wipe_analysis(osi) # Run the dynamic analysis o3.algorithm.Newton(osi) o3.system.SparseGeneral(osi) o3.numberer.RCM(osi) o3.constraints.Transformation(osi) o3.integrator.Newmark(osi, gamma=0.5, beta=0.25) o3.analysis.Transient(osi) o3.test_check.EnergyIncr(osi, tol=1.0e-10, max_iter=10) analysis_time = asig.time[-1] analysis_dt = 0.001 outputs = { "time": [], "rel_disp": [], "rel_accel": [], "rel_vel": [], "force": [] } while o3.get_time(osi) < analysis_time: o3.analyze(osi, 1, analysis_dt) curr_time = o3.get_time(osi) outputs["time"].append(curr_time) outputs["rel_disp"].append(o3.get_node_disp(osi, top_node, o3.cc.X)) outputs["rel_vel"].append(o3.get_node_vel(osi, top_node, o3.cc.X)) outputs["rel_accel"].append(o3.get_node_accel(osi, top_node, o3.cc.X)) o3.gen_reactions(osi) outputs["force"].append(-o3.get_node_reaction( osi, bot_node, o3.cc.X)) # Negative since diff node o3.wipe(osi) for item in outputs: outputs[item] = np.array(outputs[item]) if show: import matplotlib.pyplot as plt plt.plot(outputs['time'], outputs['rel_disp'], label='o3seespy') periods = np.array([period]) # Compare closed form elastic solution from eqsig import sdof resp_u, resp_v, resp_a = sdof.response_series(motion=asig.values, dt=asig.dt, periods=periods, xi=xi) plt.plot(asig.time, resp_u[0], ls='--', label='Elastic') plt.legend() plt.show()
def run(): forder = 1.0e3 sl = sm.Soil() sl.o3_type = 'pimy' vs = 100. xi = 0.03 unit_mass = 1700.0 sl.cohesion = 120.0e3 sl.phi = 0.0 sl.g_mod = vs ** 2 * unit_mass sl.poissons_ratio = 0.0 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.xi = 0.03 # for linear analysis sl.xi_min = 0.03 # for eqlin analysis sl.peak_strain = 0.1 sl.o3_mat = o3.nd_material.PressureIndependMultiYield(None, 2, unit_mass / forder, sl.g_mod / forder, sl.bulk_mod / forder, sl.cohesion / forder, 0.1, 0.0, 101.0e3 / forder, 0.0, 25) assert np.isclose(vs, sl.get_shear_vel(saturated=False)) soil_profile = sm.SoilProfile() soil_profile.add_layer(0, sl) sl_base = sm.Soil() sl_base.o3_type = 'pimy' vs = 150. unit_mass = 1700.0 sl_base.g_mod = vs ** 2 * unit_mass sl_base.poissons_ratio = 0.0 sl_base.cohesion = 120.0e3 sl_base.phi = 0.0 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.specific_gravity = 2.65 sl_base.xi = xi # for linear analysis sl_base.xi_min = 0.03 # for eqlin analysis sl_base.peak_strain = 0.1 e_mod = 2 * sl_base.g_mod * (1 + sl_base.poissons_ratio) sl_base.o3_mat = o3.nd_material.PressureIndependMultiYield(None, 2, unit_mass / forder, sl_base.g_mod / forder, sl_base.bulk_mod / forder, sl_base.cohesion / forder, 0.1, 0.0, 101.0e3 / forder, 0.0, 25) soil_profile.add_layer(5.1, sl_base) soil_profile.height = 10.0 gm_scale_factor = 0.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra sl.sra_type = 'hyperbolic' sl_base.sra_type = 'hyperbolic' od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='within') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) import matplotlib.pyplot as plt from bwplot import cbox bf, sps = plt.subplots(nrows=3, figsize=(6, 8)) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c='r', label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].semilogx(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c='r') pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].semilogx(pysra_sig.smooth_fa_frequencies, pysra_h, c='r') # analysis with O3 etypes = ['implicit', 'explicit_difference', 'central_difference', 'newmark_explicit'] # etypes = ['central_difference'] # etypes = ['implicit', 'explicit_difference'] ls = ['-', '--', ':', '-.'] for i, etype in enumerate(etypes): outputs_exp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, etype=etype, forder=forder, rec_dt=in_sig.dt, analysis_time=in_sig.time[-1] + 3) resp_dt = (outputs_exp['time'][-1] - outputs_exp['time'][0]) / (len(outputs_exp['time']) - 1) abs_surf_sig = outputs_exp['ACCX'][0] + np.interp(np.arange(len(outputs_exp['ACCX'][0])) * resp_dt, in_sig.time, in_sig.values) surf_sig = eqsig.AccSignal(abs_surf_sig, resp_dt) surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(i), label=etype, ls=ls[i]) sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(i), ls=ls[i]) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(i), ls=ls[i]) sps[2].axhline(1, c='k', ls='--') sps[0].legend(prop={'size': 6}) name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.suptitle(name) bf.savefig(f'figs/{name}.png', dpi=90) plt.show()
def run(): sl = sm.Soil() sl.type = 'pimy' vs = 160. unit_mass = 1700.0 sl.cohesion = 58.0e3 sl.phi = 0.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.0 sl.phi = 0.0 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.strain_peak = 0.1 # set additional parameter required for PIMY model sl.xi = 0.03 # for linear analysis sl.sra_type = 'hyperbolic' assert np.isclose(vs, sl.get_shear_vel(saturated=False)) soil_profile = sm.SoilProfile() soil_profile.add_layer(0, sl) sl = sm.Soil() sl.type = 'pimy' vs = 400. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.0 sl.cohesion = 395.0e3 sl.phi = 0.0 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.strain_peak = 0.1 # set additional parameter required for PIMY model sl.xi = 0.03 # for linear analysis sl.sra_type = 'hyperbolic' soil_profile.add_layer(9.5, sl) soil_profile.height = 20.0 ecp_out = sm.Output() ecp_out.add_to_dict(soil_profile) ofile = open('ecp.json', 'w') ofile.write(json.dumps(ecp_out.to_dict(), indent=4)) ofile.close() record_path = TEST_DATA_DIR record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(record_filename) # linear analysis with pysra od = run_pysra(soil_profile, in_sig, odepths=np.array([0.0, 2.0])) pysra_sig = eqsig.AccSignal(od['ACCX_d0'], in_sig.dt) outputs = o3soil.sra.site_response(soil_profile, in_sig) resp_dt = outputs['time'][2] - outputs['time'][1] surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) o3_surf_vals = np.interp(pysra_sig.time, surf_sig.time, surf_sig.values) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, o3_surf_vals, c=cbox(0), label='o3') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox(1), label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(0)) sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox(1)) sps[1].set_xlim([0, 20]) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(0)) pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) sps[2].axhline(1, c='k', ls='--') sps[0].plot(pysra_sig.time, (o3_surf_vals - pysra_sig.values) * 10, c='r', label='Error x10') sps[0].legend() plt.show() assert np.isclose(o3_surf_vals, pysra_sig.values, atol=0.01, rtol=100).all()
def create(): """ Run an SDOF using three different damping options """ dtypes = ['rot_link', 'horz_link'] #, 'rayleigh'] dtypes = ['rot_link'] # , 'rayleigh'] lss = ['-', '--', ':'] bd = sm.SDOFBuilding() bd.mass_eff = 120.0e3 bd.h_eff = 10.0 bd.t_fixed = 0.7 bd.xi = 0.2 # use high damping to evaluate performance of diff damping options bd.inputs += ['xi'] record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) bf, sps = plt.subplots(nrows=3, figsize=(5, 8)) c = 0 dtype = 'rot_link' outputs = get_response(bd, dtype=dtype) # Time series plots sps[0].plot(outputs['time'], outputs['deck_force'] / 1e3, c=cbox(c), lw=0.7, label=dtype, ls=lss[c]) sps[1].plot(outputs['hinge_rotation'] * 1e3, outputs['col_moment'] / 1e3, c=cbox(c), label='Column', ls=lss[c]) sps[1].plot(outputs['hinge_rotation'] * 1e3, outputs['col_moment_end'] / 1e3, c='purple', label='Column', ls=lss[c]) # sps[1].plot(outputs['hinge_rotation'] * 1e3, (outputs['col_moment'] - outputs['link_force'][:, 2] / 2) / 1e3, c='r', label=dtype) sps[1].plot(outputs['hinge_rotation'] * 1e3, (outputs['col_moment'] + outputs['link_force'][:, 2]) / 1e3, c='b', label=dtype) sps[1].plot(outputs['hinge_rotation'] * 1e3, (outputs['link_force'][:, 2]) / 1e3, c='g', label='Link', ls='--') sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['col_shear'] / 1e3, c=cbox(c), label=dtype, ls=lss[c]) sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['link_force'][:, 2] / bd.h_eff / 1e3, c='g', label='Link equiv. shear', ls='--') sps[2].plot( outputs['rel_deck_disp'] * 1e3, (outputs['col_shear'] + outputs['link_force'][:, 2] / bd.h_eff) / 1e3, c='orange', label='Column and Link') sps[1].plot(outputs['hinge_rotation'] * 1e3, outputs['deck_force'] * bd.h_eff / 1e3, c=cbox('mid grey'), alpha=0.8, lw=1.5, label=dtype, ls='-.') sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['deck_force'] / 1e3, c=cbox('mid grey'), alpha=0.8, lw=1.5, label=dtype, ls='-.') sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['rel_deck_disp'] * bd.k_eff / 1e3, c='k', alpha=0.8, lw=1.5, label=dtype, ls='-.') sps[0].set_ylabel('Deck accel. [g]', fontsize=7) sps[0].set_xlabel('Time [s]') ef.text_at_rel_pos(sps[1], 0.1, 0.9, 'Column Element') sps[1].set_xlabel('Rotation [mrad]') sps[1].set_ylabel('Moment [kNm]') ef.revamp_legend(sps[0]) ef.xy(sps[0], x_origin=True) ef.xy(sps[0], x_axis=True, y_axis=True) bf.tight_layout() name = __file__.replace('.py', '') name = name.split("fig_")[-1] # bf.savefig(f'figures/{name}.png', dpi=90) plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 30.0 sl = sm.Soil() vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = 0.01 # for linear analysis soil_profile.add_layer(0, sl) sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.3 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = 0.01 # for linear analysis soil_profile.add_layer(19., sl_base) soil_profile.height = 20.0 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='outcrop') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox('mid grey'), label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox('mid grey')) sps[1].set_xlim([0, 20]) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox('mid grey')) # Normal 1d analysis with tied boundaries outputs = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=0.02, analysis_dt=0.005, x_eles=1, ff_bc=False) resp_dt = outputs['time'][2] - outputs['time'][1] surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(0), label='o3 - 1D') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(0)) surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(0)) # 2d analysis with tied boundaries outputs = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=0.02, analysis_dt=0.005, x_eles=20, ff_bc=False) resp_dt = outputs['time'][2] - outputs['time'][1] surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(1), label='o3 - 2D tied', ls='--') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(1), ls='--') surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(1), ls='--') # 2d analysis with free-field columns outputs = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=0.02, analysis_dt=0.005, x_eles=20, ff_bc=True) resp_dt = outputs['time'][2] - outputs['time'][1] surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(2), label='o3 - 2D FF columns', ls=':') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(2), ls=':') surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(2), ls=':') sps[0].set_ylabel('Acc [m/s2]') sps[1].set_ylabel('FA') sps[2].set_ylabel('H') sps[2].set_xlabel('Freq [Hz]') sps[2].axhline(1, c='k', ls='--') sps[0].legend() plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 30.0 xi = 0.03 sl = sm.Soil() sl.o3_type = 'lin' # Use linear soil model vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = xi # for linear analysis soil_profile.add_layer(0, sl) sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.3 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis soil_profile.add_layer(10., sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='outcrop') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) freqs = (0.5, 10) # outputs_imp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, analysis_dt=0.001) # resp_dt = outputs_imp['time'][2] - outputs_imp['time'][1] # surf_sig_imp = eqsig.AccSignal(outputs_imp['ACCX'][0], resp_dt) outputs_exp = site_response(soil_profile, in_sig, freqs=freqs, xi=xi, analysis_dt=0.0001, use_explicit=1) resp_dt = outputs_exp['time'][2] - outputs_exp['time'][1] surf_sig = eqsig.AccSignal(outputs_exp['ACCX'][0], resp_dt) surf_sig_imp = surf_sig show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig_imp.smooth_fa_frequencies = in_sig.fa_frequencies[1:] bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox(1), label='pysra') sps[0].plot(surf_sig_imp.time, surf_sig_imp.values, c=cbox(0), label='o3-imp') sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(2), label='o3-exp', ls='--') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox(1)) sps[1].plot(surf_sig_imp.fa_frequencies, abs(surf_sig_imp.fa_spectrum), c=cbox(0)) sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(2), ls='--') sps[1].set_xlim([0, 20]) pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) h = surf_sig_imp.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(in_sig.smooth_fa_frequencies, h, c=cbox(0)) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(2), ls='--') omega_1 = 2 * np.pi * freqs[0] omega_2 = 2 * np.pi * freqs[1] a0 = 2 * xi * omega_1 * omega_2 / (omega_1 + omega_2) a1 = 2 * xi / (omega_1 + omega_2) xi_min, fmin = lq.num.flac.calc_rayleigh_damping_params(f1=freqs[0], f2=freqs[1], d=xi) omega_min = 2 * np.pi * fmin alpha = xi_min * 2 * np.pi * fmin # mass proportional term beta = xi_min / omega_min # stiffness proportional term fs = np.logspace(-1, 1.3, 30) omgs = 2 * np.pi * fs xi_vals = 0.5 * (alpha / omgs + beta * omgs) sps[2].plot(fs, xi_vals * 100, c='k') sps[2].axhline(1, c='k', ls='--') sps[2].set_ylim([0, 2]) sps[0].legend() plt.show()
def run(): xi = 0.03 sl = sm.Soil() vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = xi # for linear analysis sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.3 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis soil_profile = sm.SoilProfile() soil_profile.add_layer(0, sl) soil_profile.add_layer(10., sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.0 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # in_sig = eqsig.AccSignal(np.pad(in_sig.values, (500, 500), mode='constant', constant_values=0), in_sig.dt) # in_sig.butter_pass([0.1, None]) # analysis with pysra sl.sra_type = 'linear' sl_base.sra_type = 'linear' od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='within') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) import matplotlib.pyplot as plt from bwplot import cbox bf, sps = plt.subplots(nrows=3, figsize=(6, 8)) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c='r', label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].semilogx(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c='r') pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].semilogx(pysra_sig.smooth_fa_frequencies, pysra_h, c='r') # analysis with O3 etypes = [ 'implicit', 'explicit_difference', 'central_difference', 'newmark_explicit' ] # etypes = ['implicit'] ls = ['-', '--', ':', '-.'] for i, etype in enumerate(etypes): outputs_exp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, etype=etype, rec_dt=0.01) resp_dt = (outputs_exp['TIME'][-1] - outputs_exp['TIME'][0]) / (len(outputs_exp['TIME']) - 1) abs_surf_sig = outputs_exp['ACCX'][0] + np.interp( np.arange(len(outputs_exp['ACCX'][0])) * resp_dt, in_sig.time, in_sig.values) surf_sig = eqsig.AccSignal(abs_surf_sig, resp_dt) surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(i), label=etype, ls=ls[i]) sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(i), ls=ls[i]) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(i), ls=ls[i]) sps[2].axhline(1, c='k', ls='--') sps[0].legend(prop={'size': 6}) name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.suptitle(name) bf.savefig(f'figs/{name}.png', dpi=90) plt.show()
def run(): vs = 250. sp = sm.SoilProfile() sp.height = 30. sl = sm.Soil() sl.type = 'elastic' sl.poissons_ratio = 0. sl.unit_dry_weight = 2.202e3 * 9.8 sl.g_mod = vs ** 2 * sl.unit_dry_mass sl.xi = 0.01 # for linear analysis sp.add_layer(0, sl) rock = sm.Soil() vs = 450. unit_mass = 1700.0 rock.g_mod = vs ** 2 * unit_mass rock.unit_dry_weight = unit_mass * 9.8 rock.poissons_ratio = 0. rock.xi = 0.01 sp.add_layer(sp.height, rock) sp.height = sp.height + 1 in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/short_motion_dt0p01.txt', m=0.05) opfile = __file__[:-3] + 'op.py' fixed_base = 0 if fixed_base: base_imp = -1 wave_field = 'within' else: base_imp = 0 wave_field = 'outcrop' outputs = o3soil.sra.site_response(sp, in_sig, outs={'ACCX': 'all'}, dy=0.5, opfile=opfile, base_imp=base_imp, freqs=(0.5, 20), xi=0.02, analysis_dt=0.005) resp_dt = outputs['time'][2] - outputs['time'][1] o3_surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) pysra_outs_full = lq.sra.run_pysra(sp, in_sig, [0], wave_field=wave_field) pysra_surf_sig = eqsig.AccSignal(pysra_outs_full['ACCX'][0], in_sig.dt) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input', lw=1) sps[0].plot(o3_surf_sig.time, o3_surf_sig.values, c=cbox(0), label='o3-surf-direct', lw=1) sps[0].plot(pysra_surf_sig.time, pysra_surf_sig.values, c=cbox(4), label='pysra-surf-direct', lw=1, ls='--') sps[1].loglog(o3_surf_sig.fa_frequencies, abs(o3_surf_sig.fa_spectrum), c=cbox(0), lw=1) sps[1].loglog(pysra_surf_sig.fa_frequencies, abs(pysra_surf_sig.fa_spectrum), c=cbox(4), lw=1) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies pysra_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies o3_surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies in_sig.generate_smooth_fa_spectrum(band=80) pysra_surf_sig.generate_smooth_fa_spectrum(band=80) o3_surf_sig.generate_smooth_fa_spectrum(band=80) sps[2].plot(in_sig.smooth_fa_frequencies, o3_surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum, c=cbox(0), label='O3 - smoothed') sps[2].plot(in_sig.smooth_fa_frequencies, pysra_surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum, c=cbox(4), label='Pysra - smoothed') pysra_sp = lq.sra.sm_profile_to_pysra(sp) freqs, tfs = lq.sra.calc_pysra_tf(pysra_sp, in_sig.fa_frequencies, absolute=True) sps[2].plot(freqs, tfs, c='k', label='Pysra - exact') sps[0].legend(loc='lower right') vs_damped = lq.sra.theory.calc_damped_vs_dormieux_1990(sl.get_shear_vel(saturated=False), sl.xi) vs_br_damped = lq.sra.theory.calc_damped_vs_dormieux_1990(rock.get_shear_vel(saturated=False), rock.xi) h = sp.height omega = in_sig.fa_frequencies * np.pi * 2 imp = lq.sra.theory.calc_impedance(sl.unit_dry_mass, vs_damped, rock.unit_dry_mass, vs_br_damped) tfs = lq.sra.theory.calc_tf_elastic_br(h, vs_damped, omega, imp, absolute=True) sps[2].semilogx(in_sig.fa_frequencies, tfs, label='Theoretical Elastic BR', c='r', ls='--') sps[2].set_xlim([0.1, 30]) sps[0].set_ylabel('Acc [m/s2]') sps[1].set_ylabel('FAS') sps[2].set_ylabel('H') sps[0].set_xlabel('Time [s]') sps[1].set_xlabel('Freq [Hz]') sps[2].set_xlabel('Freq [Hz]') sps[2].legend() plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 30.0 xi = 0.03 sl = sm.Soil() vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = xi # for linear analysis sl.sra_type = 'linear' soil_profile.add_layer(0, sl) sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.0 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis sl_base.sra_type = 'linear' soil_profile.add_layer(10., sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.5 record_filename = 'test_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='within') ind = in_sig.npts pysra_sig = eqsig.AccSignal(od['ACCX'][0][:ind], in_sig.dt) dtype = 'rayleigh' dtype = 'modal' outputs = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, analysis_dt=0.005, dtype=dtype) resp_dt = outputs['time'][2] - outputs['time'][1] surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) o3_surf_vals = np.interp(pysra_sig.time, surf_sig.time, surf_sig.values) + in_sig.values surf_sig = eqsig.AccSignal( surf_sig.values + np.interp(surf_sig.time, in_sig.time, in_sig.values), surf_sig.dt) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(0), label='o3') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox(1), label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(0)) sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox(1)) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(0)) pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) sps[2].axhline(1, c='k', ls='--') sps[1].set_xlim([0, 20]) sps[2].set_xlim([0, 20]) sps[0].legend() name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.suptitle(name) bf.savefig(f'figs/{name}.png', dpi=90) plt.show() assert np.isclose(o3_surf_vals, pysra_sig.values, atol=0.01, rtol=100).all()
def create(): """ Run an SDOF using three different damping options """ lss = ['-', '--', ':'] bd = sm.SDOFBuilding() bd.mass_eff = 120.0e3 bd.h_eff = 10.0 bd.t_fixed = 0.7 bd.xi = 0.2 # use high damping to evaluate performance of diff damping options bd.inputs += ['xi'] l_ph = 0.2 record_filename = 'test_motion_dt0p01.txt' asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=0.5) bf, sps = plt.subplots(nrows=3, figsize=(5, 8)) dtype = 'Column' c = 0 outputs = get_response(bd, asig, l_ph=l_ph) # Time series plots sps[0].plot(outputs['time'], outputs['deck_accel'] / 9.8, c=cbox(c), lw=0.7, label=dtype, ls=lss[c]) sps[1].plot(outputs['hinge_rotation'] * 1e3, outputs['col_moment'] / 1e3, c=cbox(c), label=dtype, ls=lss[c]) sps[1].plot(outputs['hinge_rotation1'] * 1e3, outputs['col_moment'] / 1e3, c='m', label=dtype, ls=lss[c]) sps[1].plot(outputs['rel_deck_disp'] / bd.h_eff * 1e3, outputs['col_moment'] / 1e3, c='g', label=dtype) sps[2].plot(outputs['rel_deck_disp'] * 1e3, outputs['col_shear'] / 1e3, c=cbox(c), label=dtype, ls=lss[c]) ei = bd.k_eff * bd.h_eff**3 / 3 moms = np.array([-1000e3, 1000e3]) k_offset = ei / (bd.h_eff * 1. / 3) # deflection / length sps[1].plot(moms / k_offset * 1e3, moms / 1e3, c='k', label='Predicted') k_offset = ei / (bd.h_eff * 1. / 3) * 2 # end_slope * length - (deflection / length) sps[1].plot(moms / k_offset * 1e3, moms / 1e3, c='r', label='Predicted - end2') sps[0].set_ylabel('Deck accel. [g]', fontsize=7) sps[0].set_xlabel('Time [s]') sps[1].set_xlabel('Rotation [mrad]') sps[1].set_ylabel('Moment [kNm]') sps[1].set_ylabel('Shear [kN]') sps[1].set_xlabel('Disp. [mm]') ef.revamp_legend(sps[1]) ef.xy(sps[0], x_origin=True) ef.xy(sps[0], x_axis=True, y_axis=True) bf.tight_layout() name = __file__.replace('.py', '') name = name.split("fig_")[-1] bf.savefig(f'figures/{name}.png', dpi=90) plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 30.0 xi = 0.03 sl = sm.Soil() vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = xi # for linear analysis soil_profile.add_layer(0, sl) sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.3 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis soil_profile.add_layer(19., sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='within') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) # Implicit analysis with O3 outputs_imp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, analysis_dt=0.001) resp_dt = outputs_imp['time'][2] - outputs_imp['time'][1] surf_sig_imp = eqsig.AccSignal(outputs_imp['ACCX'][0], resp_dt) # Explicit analysis with O3 outputs_exp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, analysis_dt=0.0001, use_explicit=1) resp_dt = outputs_exp['time'][2] - outputs_exp['time'][1] surf_sig = eqsig.AccSignal(outputs_exp['ACCX'][0], resp_dt) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig_imp.smooth_fa_frequencies = in_sig.fa_frequencies[1:] bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox(1), label='pysra') sps[0].plot(surf_sig_imp.time, surf_sig_imp.values, c=cbox(0), label='o3-imp') sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(2), label='o3-exp', ls='--') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox(1)) sps[1].plot(surf_sig_imp.fa_frequencies, abs(surf_sig_imp.fa_spectrum), c=cbox(0)) sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(2), ls='--') sps[1].set_xlim([0, 20]) pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) h = surf_sig_imp.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(in_sig.smooth_fa_frequencies, h, c=cbox(0)) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(2), ls='--') sps[2].axhline(1, c='k', ls='--') sps[0].legend() plt.show()
def run(out_folder, dytime=None): xi = 0.05 sl = sm.Soil() sl.type = 'pimy' vs = 160. unit_mass = 1700.0 sl.cohesion = 58.0e3 sl.phi = 0.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.0 sl.phi = 0.0 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.peak_strain = 0.01 # set additional parameter required for PIMY model ref_press = 100.e3 sl.xi = 0.03 # for linear analysis sl.sra_type = 'hyperbolic' o3soil.backbone.set_params_from_op_pimy_model(sl, ref_press) sl.inputs += [ 'strain_curvature', 'xi_min', 'sra_type', 'strain_ref', 'peak_strain' ] assert np.isclose(vs, sl.get_shear_vel(saturated=False)) sp = sm.SoilProfile() sp.add_layer(0, sl) sl = sm.Soil() sl.type = 'pimy' vs = 350. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.0 sl.cohesion = 395.0e3 sl.phi = 0.0 sl.unit_dry_weight = unit_mass * 9.8 sl.specific_gravity = 2.65 sl.peak_strain = 0.1 # set additional parameter required for PIMY model sl.xi = 0.03 # for linear analysis sl.sra_type = 'hyperbolic' o3soil.backbone.set_params_from_op_pimy_model(sl, ref_press) sl.inputs += [ 'strain_curvature', 'xi_min', 'sra_type', 'strain_ref', 'peak_strain' ] sp.add_layer(8.5, sl) sp.height = 14.0 ecp_out = sm.Output() ecp_out.add_to_dict(sp) ecp_out.to_file(out_folder + 'ecp.json') asig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/short_motion_dt0p01.txt', m=2.5) if dytime is None: ind = None else: ind = int(dytime / asig.dt) asig = eqsig.AccSignal(asig.values[:ind], asig.dt) outs = {'ACCX': 'all', 'TAU': 'all', 'STRS': 'all'} # cache = 0 # if not cache: # outputs = site_response(soil_profile, asig, xi=xi, out_folder=out_folder, outs=outs, rec_dt=asig.dt, analysis_time=dytime, fixed_base=1) # else: # o3sra_outs = o3ptools.O3SRAOutputs() # outputs = o3sra_outs.load_results_from_files() show = 1 if show: import matplotlib.pyplot as plt bf, sps = plt.subplots(nrows=3) # TODO: Show loads on playback # TODO: add material to playback, and show legend with material type, set material.__str__ as basetype, params[2:] sra1d = o3soil.sra.run_sra(sp, asig, xi=xi, cache_path=out_folder, outs=outs, analysis_time=dytime, base_imp=-1, playback=True) outputs = sra1d.out_dict import pandas as pd df = pd.DataFrame.from_dict(outputs['TAU']) df.to_csv('tau.csv', index=False) ind_3m = sra1d.get_nearest_ele_layer_at_depth(3) ind_6m = sra1d.get_nearest_ele_layer_at_depth(6) ind_12m = sra1d.get_nearest_ele_layer_at_depth(12) sps[0].plot(outputs["time"], outputs["TAU"][ind_3m], ls='--') sps[0].plot(outputs["time"], outputs["TAU"][ind_6m], ls='--', c='r') sps[0].plot(outputs["time"], outputs["TAU"][ind_12m], ls='--') sps[2].plot(outputs["time"], outputs["STRS"][ind_6m], ls='--', c='r') sps[1].plot(outputs['STRS'][ind_6m], outputs['TAU'][ind_6m], c='r') # sps[1].plot(outputs['STRS'][3], sl.g_mod / 1e3 * outputs['STRS'][3], ls='--') # sps[2].plot(outputs["time"], outputs["ACCX"][5], ls='--') plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 30.0 xi = 0.03 sl = sm.Soil() vs = 250. unit_mass = 1700.0 sl.g_mod = vs**2 * unit_mass sl.poissons_ratio = 0.3 sl.unit_dry_weight = unit_mass * 9.8 sl.xi = xi # for linear analysis soil_profile.add_layer(0, sl) sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.0 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis soil_profile.add_layer(19., sl_base) soil_profile.height = 20.0 gm_scale_factor = 1.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra sl.sra_type = 'linear' sl_base.sra_type = 'linear' od = run_pysra(soil_profile, in_sig, odepths=np.array([0.0, 2.0]), wave_field='outcrop') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) dtype = 'rayleigh' dtype = 'modal' outputs = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, analysis_dt=0.001, dtype=dtype) resp_dt = (outputs['TIME'][-1] - outputs['TIME'][0]) / (len(outputs['TIME']) - 1) surf_sig = eqsig.AccSignal(outputs['ACCX'][0], resp_dt) o3_surf_vals = np.interp(pysra_sig.time, surf_sig.time, surf_sig.values) show = 1 if show: import matplotlib.pyplot as plt from bwplot import cbox in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] bf, sps = plt.subplots(nrows=3) sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(0), label='o3') sps[0].plot(pysra_sig.time, pysra_sig.values, c=cbox(1), label='pysra') sps[0].plot(pysra_sig.time, (o3_surf_vals - pysra_sig.values) * 10, c='r', label='Error x10') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(0)) sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c=cbox(1)) sps[1].set_xlim([0, 20]) h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(0)) pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c=cbox(1)) sps[2].axhline(1, c='k', ls='--') sps[0].legend() plt.show() assert np.isclose(o3_surf_vals, pysra_sig.values, atol=0.01, rtol=100).all()
import all_paths as ap import eqsig import matplotlib.pyplot as plt record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=1.0) bf, ax = plt.subplots(nrows=3) ax[0].plot(in_sig.time, in_sig.values) ax[1].plot(in_sig.time, in_sig.velocity) ax[2].plot(in_sig.time, in_sig.displacement) print(in_sig.velocity[-1]) plt.show()
def run(): soil_profile = sm.SoilProfile() soil_profile.height = 10.0 xi = 0.03 sl = gen_mz_toyoura_sand_dafalias_and_manzari_2004() sl.relative_density = 0.6 sl.sra_type = 'linear' # set hyperbolic soil_profile.add_layer(0.0, sl) sl.xi = xi # Define o3 soil object nu_init = 0.05 f_order = 1.0 soil_mat = o3.nd_material.ManzariDafalias(None, g0=sl.g0, nu=nu_init, e_init=sl.e_curr, m_c=sl.m_c, c_c=sl.c_c, lambda_c=sl.lambda_c, e_0=sl.e_0, ksi=sl.ksi, p_atm=sl.p_atm / f_order, m_yield=sl.m_yield, h_0=sl.h_0, c_h=sl.c_h, n_b=sl.n_b, a_0=sl.a_0, n_d=sl.n_d, z_max=sl.z_max, c_z=sl.c_z, den=sl.unit_dry_mass / f_order) sl.o3_mat = soil_mat sl_base = sm.Soil() vs = 350. unit_mass = 1700.0 sl_base.g_mod = vs**2 * unit_mass sl_base.poissons_ratio = 0.0 sl_base.unit_dry_weight = unit_mass * 9.8 sl_base.xi = xi # for linear analysis e_mod = 2 * sl_base.g_mod * (1 + sl_base.poissons_ratio) sl_base.sra_type = 'linear' sl_base.o3_mat = o3.nd_material.ElasticIsotropic(None, e_mod=e_mod, nu=sl_base.poissons_ratio, rho=sl_base.unit_dry_mass) soil_profile.add_layer(8., sl_base) gm_scale_factor = 0.5 record_filename = 'short_motion_dt0p01.txt' in_sig = eqsig.load_asig(ap.MODULE_DATA_PATH + 'gms/' + record_filename, m=gm_scale_factor) # analysis with pysra od = lq.sra.run_pysra(soil_profile, in_sig, odepths=np.array([0.0]), wave_field='within') pysra_sig = eqsig.AccSignal(od['ACCX'][0], in_sig.dt) import matplotlib.pyplot as plt from bwplot import cbox bf, sps = plt.subplots(nrows=3, figsize=(6, 8)) in_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] pysra_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(in_sig.time, in_sig.values, c='k', label='Input') sps[0].plot(pysra_sig.time, pysra_sig.values, c='r', label='pysra') sps[1].plot(in_sig.fa_frequencies, abs(in_sig.fa_spectrum), c='k') sps[1].plot(pysra_sig.fa_frequencies, abs(pysra_sig.fa_spectrum), c='r') # pysra_h = pysra_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum # sps[2].plot(pysra_sig.smooth_fa_frequencies, pysra_h, c='r') # analysis with O3 etypes = [ 'implicit', 'explicit_difference', 'central_difference', 'newmark_explicit' ] # etypes = ['central_difference'] etypes = ['implicit'] # etypes = ['explicit_difference'] ls = ['-', '--', ':', '-.'] outs = {'ACCX': [0], 'TAUXY': 'all', 'STRS': 'all'} for i, etype in enumerate(etypes): outputs_exp = site_response(soil_profile, in_sig, freqs=(0.5, 10), xi=xi, etype=etype, outs=outs) resp_dt = outputs_exp['time'][2] - outputs_exp['time'][1] surf_sig = eqsig.AccSignal(outputs_exp['ACCX'][0], resp_dt) surf_sig.smooth_fa_frequencies = in_sig.fa_frequencies[1:] sps[0].plot(surf_sig.time, surf_sig.values, c=cbox(i), label=etype, ls=ls[i]) sps[1].plot(surf_sig.fa_frequencies, abs(surf_sig.fa_spectrum), c=cbox(i), ls=ls[i]) # h = surf_sig.smooth_fa_spectrum / in_sig.smooth_fa_spectrum # sps[2].plot(surf_sig.smooth_fa_frequencies, h, c=cbox(i), ls=ls[i]) sps[2].plot(outputs_exp['STRS'][6], outputs_exp['TAUXY'][6]) # sps[2].axhline(1, c='k', ls='--') sps[1].set_xlim([0, 20]) sps[0].legend(prop={'size': 6}) plt.show()