• No results found

An example of the applied OpenSees script is added to this document, starting at the next page.

Using the script, the OOP behavior of the URM walls on both BL1 and BL2 can be assessed for structure A, B or C. Besides, the third and fourth sensitivity study can be performed using the added script. The boundary condition type that applies to the analyzed wall can be overruled by BC0. Also, elastic properties can be assigned to the springs that represent the lateral behavior of the building layers, instead of the usual nonlinear hysteretic material model. The execution of the script yields results concerning the location Overschild and five PGA values: 0.05, 0.10, 0.15, 0.20 and 0.25 g.

OpenSees script page 138

In [12]: # =======================================================================================

# Assessment of URM walls in terms of their OOP behavior

# ======================================================================================= from scipy import linalg as la import openseespy.opensees as op

# damping damp_ratio = 0.05 damp_ratiow = 0.05

# shown GM record GMrecord = 1

# Overschild, v6, T4, 2475 years, horizontal (NPR webtool data) location_name = 'Overschild'

PGA_list = [0.05, 0.10, 0.15, 0.20, 0.25]

# analyzed situation

name_folder = 'Results_loop_structure' + str(structure) + '_1811' data_folder_comparison = name_folder + '\Comparison_UC_PGA'

data_folder = name_folder + '\Data_' + str(location_name) + '_PGA_' + str(round(PGA*1000)) else:

data_folder = name_folder + '\Data_' + str(location_name) + '_PGA_' + str(round(PGA*100)) data_folder_defw = data_folder + '\Defw'

if not os.path.exists(data_folder_defw):

os.makedirs(data_folder_defw)

for loop_wall in range(n_walls):

if structure == 'A':

elif loop_wall == 1:

print(colored('START OF NEW FOR-LOOP','grey',attrs=['bold']))

print(colored('========================================================================================

print('Typology: structure ' + str(typology_type_name[typology_type-1])) print('Wall located at: ' + str(level_wall_name[level_wall]))

print('')

T[i] = Tstep*i plt.title('Displacement Response Spectrum') plt.grid(True)

plt.title('Elastic Acceleration Displacement Response Spectrum') plt.grid(True)

hn = h1+h2

# option 2) eP = 0

f_BL1, d_BL1, f_BL2, d_BL2 = load_EUC1_combined_dataset(BBC_type = 3, cutoff_freq = 50.0)[8:]

### 1.3. Construction of hysteretic material models representing building layers

# =======================================================================================

# =======================================================================================

op.fix(fl1, 0, 1, 1)

op.uniaxialMaterial('Hysteretic', MatTag_BL1, *p1_BL1, *p2_BL1, *p3_BL1, *n1_BL1, *n2_BL1, *n3_BL1, elif L_NL_behavior_BLs == 1:

op.uniaxialMaterial('Hysteretic', MatTag_BL2, *p1_BL2, *p2_BL2, *p3_BL2, *n1_BL2, *n2_BL2, *n3_BL2, elif L_NL_behavior_BLs == 1:

Kinitial = p1_BL1[0]/p1_BL1[1]

op.uniaxialMaterial('Elastic', MatTag_BL2, Kinitial) # spring 1 + 2: two node link elements

op.element('twoNodeLink', EleTag_BL1, gr, fl1, '-mat', MatTag_BL1, '-dir', 1) op.element('twoNodeLink', EleTag_BL2, fl1, fl2, '-mat', MatTag_BL2, '-dir', 1)

# =======================================================================================

PushoverLoad1 = (PushoverLoad*m1*phi_fl1)/((m1*phi_fl1)+(m2*phi_fl2)) PushoverLoad2 = (PushoverLoad*m2*phi_fl2)/((m1*phi_fl1)+(m2*phi_fl2)) print('Pushover load = ' + str(round(PushoverLoad,4)) + ' N') print('Pushover load m1 = ' + str(round(PushoverLoad1,4)) + ' N') print('Pushover load m2 = ' + str(round(PushoverLoad2,4)) + ' N') # load

op.timeSeries('Linear', PushoverTimeSeries)

op.pattern('Plain', PushoverPatternTag, PushoverTimeSeries) op.load(fl1, PushoverLoad1, 0., 0.)

op.load(fl2, PushoverLoad2, 0., 0.)

# =======================================================================================

# RECORDERS # recorder

op.recorder('Node', '-file', AnalysisName + "_dispfl1.out", '-time', '-node', fl1, '-dof', 1, 'disp') op.recorder('Node', '-file', AnalysisName + "_dispfl2.out", '-time', '-node', fl2, '-dof', 1, 'disp') op.recorder('Node', '-file', AnalysisName + "_baseshear.out", '-time', '-node', gr, '-dof', 1, 'reactio op.recorder('Element', '-file', AnalysisName + "_BL1.out", '-time', '-ele', EleTag_BL1, '-dof', 1, 'for op.recorder('Element', '-file', AnalysisName + "_BL2.out", '-time', '-ele', EleTag_BL2, '-dof', 1, 'for

# =======================================================================================

# NLPO ANALYSIS du = ADRS_du

op.constraints("Transformation") op.numberer("Plain")

op.system("BandGen")

op.test('NormDispIncr', 1e-5, 1000) op.algorithm("Newton")

op.integrator("DisplacementControl", fl2, 1, du) op.analysis("Static")

BaseShearFileName = AnalysisName + '_baseshear.out' BaseShear = loadtxt(BaseShearFileName, delimiter = ' ')

print(colored('Results incorrect: max. force in spring BL1 exceeds maximum force','red',attrs=['bli if max(abs(F_BL2)) > max(p1_BL2[0], p2_BL2[0], p3_BL2[0]):

print('')

print(colored('Results incorrect: max. force in spring BL2 exceeds maximum force','red',attrs=['bli # deformations

if max(abs(def_BL1)) > p3_BL1[1]:

print('')

print(colored('Results incorrect: max. deformation of spring BL1 exceeds ultimate displacement','re if max(abs(def_BL2)) > p3_BL2[1]:

print('')

print(colored('Results incorrect: max. deformation of spring BL2 exceeds ultimate displacement','re

# ======================================================================================= plt.title('Force-deformation spring BL1') plt.grid(True) plt.title('Force-deformation spring BL2') 705

plt.grid(True) plt.show()

# NLPO curve (total building: base shear force) xmin = min(min(dispfl1),min(dispfl2),min(dispeq))*1.1 xmax = max(max(dispfl1),max(dispfl2),max(dispeq))*1.1 ymax = max(max(Fb),max(Fbeq))*1.1 plt.title('Nonlinear Pushover Analysis') plt.grid(True)

index_60Fmax = abs(eqSDOF_force-(0.6*max(eqSDOF_force))).argmin() eqSDOF_disp_60Fmax = eqSDOF_disp[index_60Fmax]

eqSDOF_K0 = (0.6*max(eqSDOF_force))/eqSDOF_disp_60Fmax # determination ucapsys

eqSDOF_ucapsys = max(eqSDOF_disp) # determination ucapbilin

index_Fmax = abs(eqSDOF_force-max(eqSDOF_force)).argmin()

index_80Fmax = abs(eqSDOF_force[index_Fmax:]-(0.8*max(eqSDOF_force))).argmin() eqSDOF_disp_80Fmax = eqSDOF_disp[index_Fmax+index_80Fmax]

if eqSDOF_disp_80Fmax < eqSDOF_ucapsys:

eqSDOF_ucapbilin = eqSDOF_disp_80Fmax

Em1 = integrate.quad(f_eqSDOF_force_incr, 0, eqSDOF_disp[index_Fmax-1], limit = 10000)[0]

if eqSDOF_force[-1] == max(eqSDOF_force):

Em2 = integrate.quad(f_eqSDOF_force_decr, eqSDOF_disp[index_Fmax], eqSDOF_ucapbilin, limit = 10000) Em = Em1+Em2

# capacity bilinear NLPO curve

eqSDOF_force_bilin = (eqSDOF_ucapbilin*eqSDOF_K0)-sqrt((eqSDOF_ucapbilin*eqSDOF_K0)**2-(2*Em*eqSDOF_K0) # determination uysys

eqSDOF_uysys = eqSDOF_force_bilin/eqSDOF_K0 # bilinear NLPO curve

plt.plot(eqSDOF_disp, eqSDOF_force, label = 'interpolated eq. SDOF system')

plt.plot([min(eqSDOF_disp), max(eqSDOF_disp)], [eqSDOF_force_bilin, eqSDOF_force_bilin], label = 'capac plt.plot([0, eqSDOF_uysys], [0, eqSDOF_force_bilin], label = 'initial stiffness bilinear curve') plt.plot(eqSDOF_disp_60Fmax, (0.6*max(eqSDOF_force)), 'bo', label = '60% Vmax')

plt.plot(eqSDOF_disp[index_Fmax], max(eqSDOF_force), 'ko', label = '100% Vmax') plt.plot([eqSDOF_uysys, eqSDOF_uysys], [0, max(eqSDOF_force)], '--', label = 'uysys') 793

plt.plot([eqSDOF_ucapbilin, eqSDOF_ucapbilin], [0, max(eqSDOF_force)], '--', label = 'ucapbilin') plt.plot([eqSDOF_ucapsys, eqSDOF_ucapsys], [0, max(eqSDOF_force)], '--', label = 'ucapsys') plt.xlim(left=0)

print(colored('Input','red',attrs=['blink'])) print('height = ' + str(round(h,3)) + ' [m]')

print(colored('Output','red',attrs=['blink']))

print('Mass participation factor = ' + str(round(y,3)) + ' -') print('Fundamental period wall = ' + str(round(Ta_NLKA,3)) + ' s')

print('Angle for which wall becomes unstable = ' + str(round(A,3)) + ' radians = ' + str(round(degrees(

print('Instability displacement mid-height wall = ' + str(round(instability_dispw,3)) + ' m = ' + str(r print('Maximum usable displacement mid-height wall = ' + str(round(dmax_NLKA,3)) + ' m')

881

print(colored('OOP acceleration capacity wall Rd = ' + str(round(Rd,3)) + ' g','blue',attrs=['blink']))

# spectral reduction factor mu due to damping and energy dissipation damp_ratio_inherent = damp_ratio

damp_ratio_hysteretic = min((0.42*(1-(0.9/sqrt(mu_sys))-0.1*sqrt(mu_sys))), 0.15) damp_ratio_ADRS = min((damp_ratio_inherent + damp_ratio_hysteretic), 0.4) mu = max(sqrt(7/(2+(damp_ratio_ADRS*100))), 0.55)

plt.plot(NL_ADRS_Sed, NL_ADRS_shear, label = 'Inelastic ADRS curve') plt.plot(dispfl1, Fb, label = 'Floor 1')

plt.plot(dispfl2, Fb, label = 'Floor 2')

plt.plot(dispeq, Fbeq, linestyle = 'None', marker = 'o', markevery = 50, label = 'Eq. SDOF system') plt.xlabel('Spectral displacement [m]')

plt.ylabel('Base shear force [N]')

plt.title('Inelastic Acceleration Displacement Response Spectrum') plt.legend()

index_shear_PP = ydifference.index(min_ydifference) shear_PP[PP] = yADRS[index_shear_PP]

disp_PP[0] = xADRS[index_shear_PP]

print('Fundamental period wall according to NLKA analysis (used in this analysis) = ' + str(round(Ta_NL print('Fundamental period wall according to standard NPR formula = ' + str(round(Ta_NPR,3)) + ' s') # elastic response spectrum incl. spectral reduction factor mu

NL_Sea = zeros(steps_T)

S_ead_wall_Tier1 = S_ead_Tier1[int(round(Ta_NLKA/dT))]

ylim = round(max(S_ead_Tier1),3)*1.1

plt.xlabel('Period [s]')

plt.ylabel('Spectral acceleration demand of wall [g]') plt.title('General spectrum: Tier 1')

print('Spectral acceleration demand of wall, SEad, is ' + str(round(S_ead_wall_Tier1,5)) + ' g (Tier 1) print("> Tier 1 analysis done!")

plt.plot(T, S_ead1, label = 'floor spectrum 1 (minimum: elastic ground spectrum)') ylim = round(max(max(S_ead1),max(S_ead1_nomin))*1.1,2)

plt.xlim((0,Tmax)) plt.ylim((0,ylim)) plt.xlabel('Period [s]')

plt.ylabel('Spectral acceleration demand of wall [g]') plt.title('Floor spectrum 1')

plt.grid(True)

plt.plot(T, S_ead2, label = 'floor spectrum 2 (minimum: elastic ground spectrum)') ylim = round(max(max(S_ead2),max(S_ead2_nomin))*1.1,2)

plt.xlim((0,Tmax)) plt.ylim((0,ylim)) plt.xlabel('Period [s]')

plt.ylabel('Spectral acceleration demand of wall [g]') plt.title('Floor spectrum 2') S_ead_wall_Tier2 = S_ead_Tier2[int(round(Ta_NLKA/dT))]

# building specific floor spectrum

plt.plot(T, NL_Sea, label = 'Spectrum ground floor') plt.plot(T, S_ead1, label = 'Spectrum floor 1') plt.plot(T, S_ead2, label = 'Spectrum floor 2')

plt.plot(T, S_ead_Tier2, label = 'Building specific floor spectrum') plt.plot(Ta_NLKA, S_ead_wall_Tier2, 'bo')

ylim = round(max(max(NL_Sea),max(S_ead1),max(S_ead2),max(S_ead_Tier2))*1.1,2) plt.xlim((0,Tmax))

plt.ylim((0,ylim)) plt.xlabel('Period [s]')

plt.ylabel('Spectral acceleration demand of wall [g]') plt.title('Building specific floor spectrum')

plt.legend() plt.grid(True) plt.show()

print('Spectral acceleration demand of wall, SEad, is ' + str(round(S_ead_wall_Tier2,5)) + ' g (Tier 2) print("> Tier 2 analysis done!")

#### 3.2.1. Elastic-bilinear material model representing wall # determination Fmaxw and umaxw: RB mechanism branch

# determination Fmax_elastic and umax_elastic: elastic branch EI = Emod*(1/12)*1*(teff**3)

if BC_top == 2 and BC_bottom == 5:

umax_elastic = Fmax_elastic/K_elastic # interpolate elastic branch

n_steps_u_elastic = 1000

stepsize_u_elastic = umax_elastic/n_steps_u_elastic u_elastic_array = zeros(n_steps_u_elastic)

for i in range(n_steps_u_elastic):

u_elastic_array[i] = stepsize_u_elastic*i

f_F_elastic = interpolate.interp1d([0, umax_elastic], [0, Fmax_elastic]) F_elastic = f_F_elastic(u_elastic_array)

# interpolate RB mechanism branch

n_steps_u_RB = int(umaxw/stepsize_u_elastic) u_RB_array = zeros(n_steps_u_RB)

index_Fydw_uydw = abs(F_RB[:n_steps_u_elastic]-F_elastic).argmin() Fydw = F_elastic[index_Fydw_uydw]

uydw = u_elastic_array[index_Fydw_uydw]

# divide by mass participation factor Fmaxw = Fmaxw/participation_factor_RB Fydw = Fydw/participation_factor_RB umaxw = umaxw/participation_factor_RB uydw = uydw/participation_factor_RB

# nodal coordinates

op.uniaxialMaterial('ElasticBilin', kWMatTag_3a_eig, kweq1, kweq2, uydw) # wall spring: two node link element

op.element('twoNodeLink', kWEleTag_3a_eig, flb_flt_3a_eig, w_3a_eig, '-mat', kWMatTag_3a_eig, '-dir', 1 wn2_SDOFw = op.eigen('-fullGenLapack', 1)

op.uniaxialMaterial('ElasticBilin', kWMatTag_3bc_eig, kw1, kw2, uydw) # wall spring 1 + 2: two node link elements

op.element('twoNodeLink', kWbEleTag_3b_eig, flb_3b_eig, w_3b_eig, '-mat', kWMatTag_3bc_eig, '-dir', 1, op.element('twoNodeLink', kWtEleTag_3b_eig, w_3b_eig, flt_3b_eig, '-mat', kWMatTag_3bc_eig, '-dir', 1, wn2_SDOFw = op.eigen('-fullGenLapack', 1)

ult_defw_limit = factor_ult_defw_limit*umaxw # effective stiffness Ta_calculated = 2*pi*sqrt(mw/keffeq_calc) 1409

Ta = Ta_calculated plt.plot([0,(uydw*1000)],[(Fmaxw/1000),(Fydw/1000)], 'b--')

plt.plot([0,(uydw*1000),(umaxw*1000)], [0,(0.5*Fydw/1000),0], 'r', label = 'P = ' + str(round((P/1000), plt.plot([0,(uydw*1000)],[(0.5*Fmaxw/1000),(0.5*Fydw/1000)], 'r--')

plt.plot(x_centroid*1000, y_centroid/1000, 'o', markersize = 10, label = 'Centroid of area underneath F plt.plot([0,(umaxw*1000)], [0,((keffeq_calc*umaxw)/1000)], label = 'Effective stiffness')

plt.xlim(left=0) plt.ylim(bottom=0)

plt.title('BBC of elastic-bilinear material model') plt.xlabel('Displacement [mm]')

n_NaN_Tier3a = 0

# ground motion data op.pattern('UniformExcitation', gmPatternTag, gmDirection, '-accel', gmTimeSeries)

# =======================================================================================

# =======================================================================================

AnalysisName = str(data_folder) + '/Tier3a_SDOFw_OpenSees'

Dispw_3aFileName = AnalysisName + '_dispw_3a.out'

UC_Tier3a_gm[level_wall][n][loop_PGA] = UC

# ======================================================================================= plt.plot(time_dispw_3a[plotmin:plotmax], defw_3a[plotmin:plotmax], 'tab:blue', label = 'Deforma plt.xlim((time_dispw_3a[plotmin], time_dispw_3a[plotmax]))

print(colored('Tier 3a: number of ground motions for which no convergence applies and/or the wall sprin print('')

op.fix(fl2, 0, 1, 1)

print('duration gm = ' + str(duration_gm)) op.pattern('UniformExcitation', gmPatternTag, gmDirection, '-accel', gmTimeSeries)

# =======================================================================================

AccgrFileName = AnalysisName + '_accgr.out'

power = 1

def_kW_3b = dispw_3b-disp_flb_flt_3b

plt.xlim((0,max(time))) plt.plot(time_dispw_3b[plotmin:plotmax], defw_3b[plotmin:plotmax], 'tab:orange', label = 'Defor 2641

plt.xlim((time_dispw_3b[plotmin], time_dispw_3b[plotmax]))

print(colored('Tier 3b: number of ground motions for which no convergence applies and/or the wall sprin print('')

# remove existing model

wn[i] = sqrt(wn2[i])

op.timeSeries('Path', gmTimeSeries, '-time', *gm_time, '-values', *gm_acc) op.pattern('UniformExcitation', gmPatternTag, gmDirection, '-accel', gmTimeSeries)

# =======================================================================================

kWbFileName = AnalysisName + '_kWb.out'

plt.plot([0, time[plotmax]],[umaxw, umaxw], 'k--', label = 'Instability displacement')

print('U.C. Tier 3c = ' + str(round(UC,3)) + ' [-]')

defw_3c = (dispw_3c+gm_disp[0:len(dispw_3c)])-disp_flb_flt_3c[0:len(dispw_3c)]

# plot relative deformation of wall over time plt.plot(time_dispw_3c[plotmin:plotmax], defw_3c[plotmin:plotmax], 'tab:green', label = 'Deform plt.xlim((time_dispw_3c[plotmin], time_dispw_3c[plotmax]))

print(colored('Tier 3c: number of ground motions for which no convergence applies and/or the wall sprin print('')

if isnan(UC_Tier3a_gm[level_wall][n][loop_PGA]) == True and isnan(UC_Tier3b_gm[level_wall][n][loop_

print('No data available for GM' + str(n+1) + '')

print('')

print(colored('END OF FOR-LOOPS','grey',attrs=['bold']))

print(colored('============================================================================================

print('')

# =======================================================================================

# INFLUENCE DIFFERENT PROCEDURES # average U.C. value Tier 3a-c UC_Tier3a = nanmean(UC_Tier3a_gm, 1) UC_Tier3b = nanmean(UC_Tier3b_gm, 1) UC_Tier3c = nanmean(UC_Tier3c_gm, 1) # plot unity check values

fig = plt.figure(figsize = (6,4))

figure_name = 'UC_basic_situ_' + str(situ_legend_abbr[situ]) procedures = [1,2,3,4,5]

ticks_procedures = [1,2,3,4,5]

labels_procedures = ['Tier 1', 'Tier 2', 'Tier 3a', 'Tier 3b', 'Tier 3c']

plt.xticks(ticks_procedures, labels_procedures) plt.xlim(1,5)

for i in range(n_walls):

plt.plot(procedures, [UC_Tier1[i][loop_PGA], UC_Tier2[i][loop_PGA], UC_Tier3a[i][loop_PGA], UC_Tier3b[i plt.ylim(bottom = 0)

plt.xlabel('Assessment method')

plt.ylabel('Unity check [-]\n $\it{Situation}$: $\it{' + str(situ_legend_abbr[situ]) + '}$') plt.grid(True)

plt.legend()

plt.legend(loc = 'upper left', bbox_to_anchor = (1.01, 1)) plt.show()

fig.savefig(str(data_folder) + '/' + str(figure_name) + '.png', bbox_inches='tight')

# =======================================================================================

# INFLUENCE DIFFERENT SITUATIONS # plot unity check values

plt.xticks(ticks_procedures, labels_procedures) plt.xlim(1,5)

plt.plot(procedures, [UC_Tier1[n][loop_PGA], UC_Tier2[n][loop_PGA], UC_Tier3a[n][loop_PGA], UC_Tier3b[n plt.ylim(bottom = 0)

plt.xlabel('Assessment method')

plt.ylabel('Unity check [-]\n $\it{Wall}$: $\it{' + str(wall_legend[n]) + '}$') plt.grid(True)

plt.show()

fig.savefig(str(data_folder) + '/' + str(figure_name) + '.png', bbox_inches='tight') print('')

print(colored('============================================================================================

print('') ## 5. Save data

for i in range(n_walls):

data_name_1 = 'UC_Tier1_wall_' + str(wall_legend_abbr[i]) data_name_2 = 'UC_Tier2_wall_' + str(wall_legend_abbr[i]) data_name_3a = 'UC_Tier3a_gm_wall_' + str(wall_legend_abbr[i]) data_name_3b = 'UC_Tier3b_gm_wall_' + str(wall_legend_abbr[i]) data_name_3c = 'UC_Tier3c_gm_wall_' + str(wall_legend_abbr[i]) savetxt(str(data_folder) + '/' + str(data_name_1), UC_Tier1[i]) savetxt(str(data_folder) + '/' + str(data_name_2), UC_Tier2[i]) savetxt(str(data_folder) + '/' + str(data_name_3a), UC_Tier3a_gm[i]) savetxt(str(data_folder) + '/' + str(data_name_3b), UC_Tier3b_gm[i]) savetxt(str(data_folder) + '/' + str(data_name_3c), UC_Tier3c_gm[i])

## 6. Additional graphs for i in range(n_walls):

plt.plot([0, (uydw_walls[i]*1000), (umaxw_walls[i]*1000)], [0, (Fmaxw_walls[i]/1000), 0], label = wall_lege plt.xlim(left = 0)

plt.ylim(bottom = 0)

plt.title('F-d-relationship URM walls') plt.xlabel('Mid-height displacement [mm]') plt.ylabel('Force [kN]')

plt.legend()

plt.legend(loc = 'upper left', bbox_to_anchor = (1.01, 1)) plt.grid(True)

# INFLUENCE PGA VALUE PER WALL for loop_wall in range(n_walls):

figure_name = 'UC_PGA_wall_' + str(BL) + '_' + str(structure) procedures = [1,2,3,4,5]

ticks_procedures = [1,2,3,4,5]

labels_procedures = ['Tier 1', 'Tier 2', 'Tier 3a', 'Tier 3b', 'Tier 3c']

plt.xticks(ticks_procedures, labels_procedures) plt.xlim(1,5)

for p in range(n_PGA):

plt.plot(procedures, [UC_Tier1[loop_wall][p], UC_Tier2[loop_wall][p], UC_Tier3a[loop_wall][p], UC_Tier3 plt.ylim(bottom = 0)

plt.xlabel('Assessment method')

plt.ylabel('Unity check [-]\n Wall ' + str(BL) + ', ' + str(structure) + ', situation ' + str(situ)) plt.grid(True)

plt.legend()

plt.legend(loc = 'upper left', bbox_to_anchor = (1.01, 1)) plt.show()

fig.savefig(str(data_folder_comparison) + '/' + str(figure_name) + '.png', bbox_inches='tight')

# =======================================================================================

# INFLUENCE WALL PER PGA VALUE for p in range(n_PGA):

# plot unity check values fig = plt.figure(figsize = (6,4))

figure_name = 'UC_PGA_' + str(PGA_list[p]) procedures = [1,2,3,4,5]

ticks_procedures = [1,2,3,4,5]

labels_procedures = ['Tier 1', 'Tier 2', 'Tier 3a', 'Tier 3b', 'Tier 3c']

plt.xticks(ticks_procedures, labels_procedures) plt.xlim(1,5)

for loop_wall in range(n_walls):

if loop_wall == 0:

BL = 'BL1' elif loop_wall == 1:

BL = 'BL2'

plt.plot(procedures, [UC_Tier1[loop_wall][p], UC_Tier2[loop_wall][p], UC_Tier3a[loop_wall][p], UC_Tier3 plt.ylim(bottom = 0)

plt.xlabel('Assessment method')

plt.ylabel('Unity check [-]\nPGA = ' + str(PGA_list[p]) + ' g') plt.grid(True)

plt.legend()

plt.legend(loc = 'upper left', bbox_to_anchor = (1.01, 1)) plt.show()

fig.savefig(str(data_folder_comparison) + '/' + str(figure_name) + '.png', bbox_inches='tight')

# =======================================================================================

# INFLUENCE WALL PER PGA VALUE, INCL. RANGE OF INCLUDED GM RECORDS n_Tier3_methods = 3

Tier3_procedures = [3, 4, 5]

for p in range(n_PGA):

for loop_wall in range(n_walls):

if loop_wall == 0:

elif loop_wall == 1:

plt.xticks(ticks_procedures, labels_procedures) plt.xlim(1,5)

UC_min_Tier3abc = zeros(n_Tier3_methods) UC_max_Tier3abc = zeros(n_Tier3_methods) number_errors_Tier3abc = zeros(n_Tier3_methods) n_incl_GM = zeros(n_Tier3_methods)

# minimum value

UC_min_Tier3abc[0] = nanmin(transpose(UC_Tier3a_gm[loop_wall])[p]) UC_min_Tier3abc[1] = nanmin(transpose(UC_Tier3b_gm[loop_wall])[p]) UC_min_Tier3abc[2] = nanmin(transpose(UC_Tier3c_gm[loop_wall])[p])

# minimum value

UC_max_Tier3abc[0] = nanmax(transpose(UC_Tier3a_gm[loop_wall])[p]) UC_max_Tier3abc[1] = nanmax(transpose(UC_Tier3b_gm[loop_wall])[p]) UC_max_Tier3abc[2] = nanmax(transpose(UC_Tier3c_gm[loop_wall])[p])

# number of included GM records

number_errors_Tier3abc[0] = (isnan(transpose(UC_Tier3a_gm[loop_wall])[p]).tolist()).count(True) number_errors_Tier3abc[1] = (isnan(transpose(UC_Tier3b_gm[loop_wall])[p]).tolist()).count(True) number_errors_Tier3abc[2] = (isnan(transpose(UC_Tier3c_gm[loop_wall])[p]).tolist()).count(True)

for i in range(n_Tier3_methods):

n_incl_GM[i] = int(n_GM-number_errors_Tier3abc[i]) if loop_wall == 0:

plt.text(Tier3_procedures[i], UC_max_Tier3abc[i], int(n_incl_GM[i]), dict(fontsize=12), color = elif loop_wall == 1:

plt.text(Tier3_procedures[i], UC_max_Tier3abc[i], int(n_incl_GM[i]), dict(fontsize=12), color =

if loop_wall == 0:

plt.plot(procedures, [UC_Tier1[loop_wall][p], UC_Tier2[loop_wall][p], UC_Tier3a[loop_wall][p], UC_T plt.plot([Tier3_procedures, Tier3_procedures], [UC_min_Tier3abc, UC_max_Tier3abc], 'tab:blue', mark elif loop_wall == 1:

plt.plot(procedures, [UC_Tier1[loop_wall][p], UC_Tier2[loop_wall][p], UC_Tier3a[loop_wall][p], UC_T plt.plot([Tier3_procedures, Tier3_procedures], [UC_min_Tier3abc, UC_max_Tier3abc], 'tab:orange', ma

ymax = max(max(UC_Tier1[0]),max(UC_Tier1[1]),max(UC_Tier2[0]),max(UC_Tier2[1]),max(UC_max_Tier3abc))*1.

plt.ylim((0,ymax))

plt.xlabel('Assessment method')

plt.ylabel('Unity check [-]\nWall ' + str(BL) + ' / ' + str(structure) + ', PGA = ' + str(PGA_list[p]) plt.grid(True)

plt.show()

fig.savefig(str(data_folder_comparison) + '/' + str(figure_name) + '.png', bbox_inches='tight') 3521