Esempio n. 1
0
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()
Esempio n. 2
0
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()
Esempio n. 4
0
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()
Esempio n. 5
0
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()
Esempio n. 6
0
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()
Esempio n. 9
0
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()
Esempio n. 12
0
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()
Esempio n. 16
0
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()
Esempio n. 17
0
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()
Esempio n. 20
0
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()
Esempio n. 21
0
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()
Esempio n. 23
0
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()
Esempio n. 24
0
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()

Esempio n. 25
0
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()