Issue: p-y curve is linear, instead of multilinear
Hi,
I have created a simple spring model (one end fixed, other end free). A gradually increasing force was applied at the free end. Reaction and Displacements obtained were plotted. The material of the spring is defined as uniaxial Multi-Linear. Was expecting a multi-linear p-y plot. But the result is only a linear plot.
Please see the code snippet below, to recreate the model and analysis.
My question is -> Why am i getting a linear plot even though my material model is multilinear? And what can i do to get the multi-linear plot from this spring example. Thanks.
Code: Select all
import openseespy.opensees as op
p-y values used for defining u1, f1 for ElasticMultiLinear material model
p = [0, 10599.12, 18293.92, 22678.72, 24839.90, 25828.98, 26266.23, 26456.58, 26538.88, 26574.36] # units = N/m2
p_force = [item * 8 * 0.5 for item in p]
y = [0, 0.012, 0.025, 0.038, 0.050, 0.063, 0.075, 0.088, 0.10, 0.113]
# Defining u and f for ElasticMultiLinear material model
u = y
f = p
# cleaning existing stuff
op.wipe()
# spring nodes created with 1 dim, 1 dof
op.model('basic', '-ndm', 1, '-ndf', 1) # 1DOF because spring is in X-direction only.
op.node(1, 0.0) # spring node 1 # this will be connected to pile node
op.node(100 + 1, 0.0) # spring node 2 # this node will be fixed
# adding DOFs to these spring nodes (i.e. spring nodes created above)
op.fix(1, 0) # restraint for spring node 1
op.fix(100 + 1, 1) # restraint for spring node 2
# create spring material objects
op.uniaxialMaterial('ElasticMultiLinear', 2, 0.0, '-strain', *u, '-stress', *f)
# create zero length element for springs - adding spring '1001' between spring node '1' and '101'
op.element('zeroLength', 1000 + 1, 1, 100 + 1, '-mat', 2, '-dir', 1, 3)
# create pile nodes
op.model('basic', '-ndm', 1, '-ndf', 1)
op.node(200 + 1, 0.0)
# fixing DOF at pile node - cfixity at pile head (location of loading)
op.fix(200 + 1, 0) # this pile nodes is kept free to move along X-direction, as force is applied on this pile node
# define equal dof between pile and spring nodes
op.equalDOF(200 + 1, 1, 1)
# create recorders
timeStep = 1
# record displacements at pile nodes
op.recorder('Node', '-file', 'pileDisp.out', '-time', '-dT', timeStep, '-nodeRange', 201, 200 + 1, '-dof', 1, 'disp')
# record reaction force in the p-y springs
op.recorder('Node', '-file', 'reaction.out', '-time', '-dT', timeStep, '-nodeRange', 1, 1, '-dof', 1, 'reaction')
# record element forces in pile elements
op.recorder('Element', '-file', 'pileForce.out', '-time', '-dT', timeStep, '-eleRange', 201, 200 + 1,
'globalForce')
# create loading
op.setTime(0.0)
# apply point load at the pile node
values = [0.0, 0.01, 1.0, 1.0]
time = [0.0, 0.01, 100, 150] # when load = 300000
node_tag = 200 + 1
load_values = [100000]
op.timeSeries('Path', 1, '-values', *values, '-time', *time, '-factor', 1.0)
op.pattern('Plain', 10, 1)
op.load(node_tag, *load_values)
# create and run analysis
op.integrator('LoadControl', 0.05)
op.numberer('RCM')
op.system('SparseGeneral')
op.constraints('Transformation')
op.test('NormDispIncr', 1e-5, 20, 1)
op.algorithm('Newton')
op.analysis('Static')
print("Starting Load Application...")
op.analyze(15000)