Issue with PDelta efects in 2D Special Truss Moment Frame

Forum for asking and answering questions related to use of the OpenSeesPy module

Moderators: silvia, selimgunay, Moderators

Post Reply
oscom
Posts: 13
Joined: Thu Dec 29, 2022 12:55 am

Issue with PDelta efects in 2D Special Truss Moment Frame

Post by oscom »

Hi everyone,

I've been carrying out some pushover analysis in a 2D Special Truss Moment Frame. To take into account the PDelta effects, vertical loads are applied in the nodes of the upper chord, but when I apply the PDelta geometric transformation, the capacity curve (Lateral displacement Vs Base shear), exhibits a bit more capacity that the one with Linear geometric transformation instead of less capacity. I don't know if there is something about PDelta effects that I'm missing, or maybe the way that gravity load have to be applied. For reference I'm including the code untill the part where the vertical load is aplyied below. Pleasle let me know if you need anything else

Thank you all.

########################################
# RunPushover.py
########################################

import openseespy.opensees as op

import os

from math import sqrt, pi

op.wipe()

op.model('basic','-ndm',2)

# Add PDelta ?
PDelta="Yes" #Yes or No

# Define final drift in node control
DerUlt=0.02
############### Define Sections and Materials #####################

E=210000000
mat7=7 #Steel elastic material
op.uniaxialMaterial('Elastic', mat7, E)

mat8=8 # Column hinge W36x652

p1 = [20247.63, 0.0059]
p2 = [22272.39, 0.06]
p3 = [22272.4, 0.061]

n1 = [-20247.63, -0.0059]
n2 = [-22272.39, -0.06]
n3 = [-22272.4, -0.061]

#Pinching
pinchX = 0.0 #0.0
pinchY = 0.52 #0.52

#Damage per cycle
damage1 = 0.0 #Ductilidad 0.03
damage2 = 0.0 #Energía 0.0

#Stiffness damage
beta = 0.0

op.uniaxialMaterial('Hysteretic', mat8, *p1, *p2, *p3, *n1, *n2, *n3, pinchX, pinchY, damage1, damage2, beta)

mat9=9 # Double Channel chord hinge 2C15x50

p1 = [950.37, 0.012]
p2 = [1330.52, 0.03]
p3 = [1330.53, 0.07]

n1 = [-950.37, -0.012]
n2 = [-1330.52, -0.03]
n3 = [-1330.53, -0.07]

#Pinching
pinchX = 0.0 #0.0
pinchY = 0.52 #0.52

#Damage per cycle
damage1 = 0.0 #Ductilidad 0.03
damage2 = 0.0 #Energía 0.0

#Stiffness damage
beta = 0.0

op.uniaxialMaterial('Hysteretic', mat9, *p1, *p2, *p3, *n1, *n2, *n3, pinchX, pinchY, damage1, damage2, beta)
#-----------------------------------------------------------------------------------------------------------
#Node Masses
m1=13.5 #Masa de 132.39 kN
m2=6.75

# Columns
A_W36x652=1238.7/(100**2)
I_W36x652=2106131/(100**4)

#Chords
A_2C15x50=188.9672/(100**2)
I_2C15x50=33510.9/(100**4)

#Vertical truss members
A_2C6x13=49.0837/(100**2)
I_2C6x13=1442.975/(100**4)

#Diagonals
A_2MC12x35=131.703/(100**2)
I_2MC12x35=17885.826/(100**4)

############### Define Geometry #####################

#General Data
L=3.048
H_2=3*L
H_1=2*L
d_col=0.0
d_vig=0.0

#Nodess

op.node(1,0,0)
op.node(2,9*L,0)

#Lower Chord
for x in range(3,12+1):
op.node(x,(x-3)*L,H_1)

#Upper chord
for x in range(13,22+1):
op.node(x,(x-13)*L,H_2)

#Chord hinges nodes
op.node(100,4*L,H_1)
op.node(101,5*L,H_1)

op.node(102,4*L,H_2)
op.node(103,5*L,H_2)

#Column hinges nodes
op.node(200,0,0)
op.node(201,9*L,0)

#Supports
# fix(nodeTag, *constrValues)
op.fix(1,1,1,1)
op.fix(2,1,1,1)

#Masses
#mass(nodeTag, *massValues)
op.mass(13,m2,0,0)
op.mass(14,m1,0,0)
op.mass(15,m1,0,0)
op.mass(16,m1,0,0)
op.mass(17,m1,0,0)
op.mass(18,m1,0,0)
op.mass(19,m1,0,0)
op.mass(20,m1,0,0)
op.mass(21,m1,0,0)
op.mass(22,m2,0,0)

####CONSTRAINTS
#Floor horizontal constraints
op.equalDOF(13,14,1) #
op.equalDOF(13,15,1)
op.equalDOF(13,16,1)
op.equalDOF(13,19,1)
op.equalDOF(13,20,1)
op.equalDOF(13,21,1)
op.equalDOF(13,22,1)

#Hinges constraints
op.equalDOF(7,100,1,2)
op.equalDOF(8,101,1,2)

op.equalDOF(17,102,1,2)
op.equalDOF(18,103,1,2)

op.equalDOF(1,200,1,2)
op.equalDOF(2,201,1,2)

#Geometric transformation
# geomTransf('Linear', transfTag, '-jntOffset', *dI, *dJ)

transfTag=1
if PDelta == 'Yes':
op.geomTransf('PDelta',transfTag)
print("Efectos P-Delta incuidos")
elif PDelta == 'No':
op.geomTransf('Linear',transfTag)
print("Analisis sin efecots P-Delta")

#ELEMENTS
# element('elasticBeamColumn', eleTag, *eleNodes, Area, E_mod, Iz, transfTag, <'-mass', mass>, <'-cMass'>, <'-release', releaseCode>)

#Columns
op.element('elasticBeamColumn',1,200,3,A_W36x652,E,I_W36x652,transfTag)
op.element('elasticBeamColumn',2,201,12,A_W36x652,E,I_W36x652,transfTag)
op.element('elasticBeamColumn',3,3,13,A_W36x652,E,I_W36x652,transfTag)
op.element('elasticBeamColumn',4,12,22,A_W36x652,E,I_W36x652,transfTag)

#Chords
op.element('elasticBeamColumn',5,3,4,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',6,4,5,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',7,5,6,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',8,6,7,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',9,100,101,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',10,8,9,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',11,9,10,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',12,10,11,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',13,11,12,A_2C15x50,E,I_2C15x50,transfTag)

op.element('elasticBeamColumn',14,13,14,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',15,14,15,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',16,15,16,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',17,16,17,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',18,102,103,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',19,18,19,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',20,19,20,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',21,20,21,A_2C15x50,E,I_2C15x50,transfTag)
op.element('elasticBeamColumn',22,21,22,A_2C15x50,E,I_2C15x50,transfTag)

#Diagonals
op.element('Truss',23,3,14,A_2MC12x35,mat7)
op.element('Truss',24,14,5,A_2MC12x35,mat7)
op.element('Truss',25,5,16,A_2MC12x35,mat7)
op.element('Truss',26,16,7,A_2MC12x35,mat7)

op.element('Truss',27,8,19,A_2MC12x35,mat7)
op.element('Truss',28,19,10,A_2MC12x35,mat7)
op.element('Truss',29,10,21,A_2MC12x35,mat7)
op.element('Truss',30,21,12,A_2MC12x35,mat7)

#Vertical truss members
op.element('Truss',31,4,14,A_2C6x13,mat7)
op.element('Truss',32,5,15,A_2C6x13,mat7)
op.element('Truss',33,6,16,A_2C6x13,mat7)
op.element('Truss',34,7,17,A_2C15x50,mat7)
op.element('Truss',35,8,18,A_2C15x50,mat7)
op.element('Truss',36,9,19,A_2C6x13,mat7)
op.element('Truss',37,10,20,A_2C6x13,mat7)
op.element('Truss',38,11,21,A_2C6x13,mat7)

# Plastic Hinges
# element('zeroLength', eleTag, *eleNodes, '-mat', *matTags, '-dir', *dirs, <'-doRayleigh', rFlag=0>, <'-orient', *vecx, *vecyp>)
#Chords
op.element('zeroLength',100,7,100,'-mat',mat9,'-dir',6)
op.element('zeroLength',101,101,8,'-mat',mat9,'-dir',6)

op.element('zeroLength',102,17,102,'-mat',mat9,'-dir',6)
op.element('zeroLength',103,103,18,'-mat',mat9,'-dir',6)

#Columns
op.element('zeroLength',200,1,200,'-mat',mat8,'-dir',6)
op.element('zeroLength',201,2,201,'-mat',mat8,'-dir',6)

if PDelta == "Yes":

#Vertical nodal load
q1=-132.39 #kN
q2=-66.2 #kN

#timeSeries(tsType, tsTag, *tsArgs)
tsTag=1
op.timeSeries('Linear',tsTag)

# Load Pattern

patternTag1=1
op.pattern('Plain',patternTag1,tsTag)

# Aplying loads
op.load(13,0,q2,0) # Ingresar mitad de la carga de una planta del edificio si hay porticos intermedios
op.load(14,0,q1,0)
op.load(15,0,q1,0)
op.load(16,0,q1,0)
op.load(17,0,q1,0)
op.load(18,0,q1,0)
op.load(19,0,q1,0)
op.load(20,0,q1,0)
op.load(21,0,q1,0)
op.load(22,0,q2,0)
Post Reply