P-M Interaction by the Book

Find any indeterminate beam, frame, or truss problem from a structural analysis textbook, and you can make OpenSees solve it. But sometimes, replicating the basics is not so easy. Take, for instance, an axial-moment (P-M) interaction diagram of reinforced concrete (RC) sections.

The typical approach advocated with OpenSees is to use repeated moment-curvature analyses over a range of axial loads. For each axial load applied on a zero length section, use displacement control with a reference moment–or proportional reference moments for biaxial bending–until reaching a target fiber strain, section curvature, or some other limit state.

However, this approach doesn’t match the textbook strain compatibility method for finding the strength of RC sections:

  1. Assume the extreme concrete compression fiber is at 0.003 strain
  2. Obtain a linear strain profile by assuming a neutral axis depth or a reinforcing steel strain
  3. Compute stresses in the Whitney stress block (WSB) and the steel bars
  4. Compute stress resultants from the WSB and steel bars
  5. Determine the equivalent force-couple system acting at the section centroid

Repeat these steps over a range of neutral axis depths (or reinforcing steel strains) and you will generate a P-M interaction diagram. These steps are easily coded in MATLAB, Python, and even Excel.

The first point of this post is that we can make OpenSees do exactly this textbook WSB procedure. As usual, define your concrete and steel materials, put them in a fiber section, and then put that section in a zero length section element. Here we use Concrete01 which reaches its peak compressive strength, f'_c, at 0.002 strain and spalls at 0.006 strain. The steel is EPP.

ops.node(1,0.0,0.0)
ops.node(2,0.0,0.0)

ops.fix(1,1,1,1)
ops.fix(2,0,1,0)

fc = 4.0 # ksi
fy = 60.0 # ksi
E = 29000.0 # ksi

ops.uniaxialMaterial('Concrete01',concreteTag,fc,0.002,0,0.006)
ops.uniaxialMaterial('Steel01',steelTag,fy,E,0.0)

#
# Define your section (secTag)
#

ops.element('zeroLengthSection',1,1,2,secTag)

Then, for any strain in the “bottom” reinforcing steel, compute the strain profile. For reference, a rectangular RC section is shown below along with a strain profile.

Using the strain profile, we can use sp (single point) constraints to impose the axial deformation and curvature at the section centroid.

# e.g., at the balance point
epss = fy/E # Tension steel yield strain
kappa = (epss+epsc)/d
c = epsc/kappa # Depth to NA

ops.timeSeries('Constant',2)
ops.pattern('Plain',2,2)
ops.sp(2,1,-epsc + kappa*h/2) # Strain at the centroid
ops.sp(2,3,kappa) # Curvature

The axial load and bending moment are then the “reactions” on the node with the imposed sp constraints. Be sure to use 'Transformation' constraint handler and also use the 'UmfPack' solver as it’s the only solver that won’t rain on your parade for having all DOFs constrained.

ops.constraints('Transformation')
ops.system('UmfPack')

ops.analysis('Static')
ops.analyze(1)

ops.reactions()

P = -ops.nodeReaction(2,1)
M = ops.nodeReaction(2,3)

Put all of this in a loop over the steel strain, epss, from -0.003 (pure compression) to something large (say five times the steel yield strain) and you’ll get the P-M interaction curve shown below along with a straight-up Python implementation of the textbook WSB procedure.

P-M interaction curve developed from OpenSees using Concrete01.

I’m not too worried about the OpenSees interaction curve taking a circuitous route to pure compression. The top of the interaction curve will get chopped off at 85% anyway due to “accidental moments”, the rumored sequel to a 2007 Judd Apatow movie. If you’re curious, the roundabout path is due to the descending branch of Concrete01 from 0.002 to 0.003 compressive strain. Use Concrete23 and you’ll see a different detour to pure compression.

However, there’s still a difference between the WSB approach and OpenSees for axial loads below 85% of the pure compression load.

So, the second point of this post is that we can make OpenSees match the textbook WSB approach. To this end, we need a concrete stress-strain model that has compressive stress equal to 0.85f'_c for compressive strains exceeding (1-\beta)0.003. This strain is based on similar triangles with the depth, a=\beta_1 c, of the WSB, where \beta_1 is the WSB parameter which depends on f'_c.

Nothing fits the bill, at least not directly. I can think of a couple kludgy workarounds, the least complicated of which is the ElasticMultiLinear material where we can define points that characterize the stress block.

fc = 4.0 # ksi
epsc = 0.003
beta1 = 0.85 # for 4 ksi concrete, smaller for higher strength concrete

strain = [-epsc,-epsc*(1-beta1),-epsc*(1-beta1),0]
stress = [-0.85*fc,-0.85*fc,0,0]
ops.uniaxialMaterial('ElasticMultiLinear',concreteTag,'-strain',*strain,'-stress',*stress)

Sure, with these inputs, the tangent of this material model is either zero of infinity, so I don’t recommend you use this model for general FEA. But this model is OK for our zero length section analysis because we’re not solving any nodal equilibrium equations–just imposing displacements and calculating forces.

As shown below, faking the WSB with ElasticMultiLinear instead of using Concrete01 gives a P-M interaction curve that agrees much better with the straight-up Python implementation of the WSB.

P-M interaction curve developed from OpenSees using ElasticMultiLinear to represent constant concrete stress in WSB.

Due to the concrete fiber discretization, the OpenSees solution wiggles around the balance point (I used 20 fibers). These wiggles go away as you use more concrete fibers. Try it out yourself!


You read this far, so let’s see if you paid attention. How many unique factors of 0.85 does this post contain? Explain your response and the different 0.85 factors in the comments section below.

9 thoughts on “P-M Interaction by the Book

  1. I would say three unique 0.85 factors used.

    1. 85% of pure axial load to account for accidental moments.
    2. 85% of compressive strength to estimate the equivalent stress block parameters
    3. 85% of neutral axis depth, again to estimate the equivalent stress block parameters

    Liked by 3 people

  2. This is a bit of a tangential question to the main topic on P-M Interaction analyses (which I’ve found very useful).

    Where I live, the assessment of the shear capacity of a reinforced concrete section is performed using the MCFT approach, which considers the combined effect of axial, bending and shear force acting on the section simultaneously.

    I’m wondering, does Opensees have the capability to assess the capacity of a reinforced concrete section subject to combined axial, bending and shear (similar to say how Response(2000) works). Is there a combination of fibre-section and nd-materials that would fit the bill?

    Like

  3. Dear Professor Michael,

    Thank you in advance for your time and for sharing such a helpful blog—it has been very useful in guiding my work.

    I’ve been attempting to replicate your results and noticed that when using Concrete01, I obtained significantly different values. Using the WSB methodology, the results are somewhat close but still not exactly the same as yours. I also tried using Concrete02, which led to even greater discrepancies.

    I’ve shared my Google Colab notebook here for your review and would greatly appreciate any insights you might have.

    Best regards,
    Juan Pantoja

    https://colab.research.google.com/drive/1LSyFnnL_JUG38ABTq6sFFK2IHG9fq8s8?usp=sharing

    Like

Leave a reply to gopal adhikari Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.