OpenSees Cloud

OpenSees AMI

Minimal Creep and Shrinkage Example

Original Post - 28 May 2023 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


In class, I tend to avoid talking about creep and shrinkage of concrete. I say “compression steel is good because long term deflections due to creep are bad”, then move on to seemingly more interesting topics like how to find the neutral axis, bypassing shrinkage altogether.

However, creep and shrinkage remain large mysteries to most of OpenSees world, seemingly better left to those who appreciate concrete for its chemical reactions, not its load carrying capacity. Last time I checked though, most earthquakes occur years after 28 days from casting.

Fortunately, Adam Knaack and Nikola Tošić implemented four UniaxialMaterial models that account for creep and shrinkage directly in the state determination.

Documentation for these concrete models is available as a Mendeley dataset from Tošić et al (2023). In addition to documentation, the dataset contains example Tcl scripts and an Excel spreadsheet that calculates creep and shrinkage model parameters from basic concrete properties and member dimensions.

To give the creep and shrinkage models a whirl, I found a simple example from the Gilbert and Ranzi (2019) book. The example is a concentrically loaded square cross-section (300 mm x 300 mm) with total steel area 1500 mm2–roughly a 12 inch x 12 inch section with 4 #7 bars. The concrete modulus is Ec=25 GPa while the steel modulus is Es=200 GPa. The sustained axial load is 1000 kN. The ultimate creep factor is 3.0 while the ultimate shrinkage strain is 600e-6.

RC section with sustained load

The material definitions in OpenSees follow–Elastic for steel and TDConcrete for concrete.

# Units: kN, mm
kN = 1
mm = 1
GPa = kN/mm**2
MPa = 0.001*GPa

Es = 200*GPa
ops.uniaxialMaterial('Elastic',1,Es)

Ec = 25*GPa
fc = 28*MPa
ft = 3*MPa
beta = 0.4 # Recommended value
tDry = 14 # days
epsshu = 600e-6 # Ultimate shrinkage strain
psish = 75.4218 # Based on section dimensions
Tcr = 28 # days
phiu = 3.0 # Ultimate creep factor
psicr1 = 1.0 # Recommended value
psicr2 = 75.4218 # Based on section dimensions
tcast = 0

ops.uniaxialMaterial('TDConcrete',2,-fc,ft,Ec,beta,tDry,-epsshu,psish,Tcr,phiu,psicr1,psicr2,tcast)

Most of the TDConcrete inputs are straightforward. Note that compressive strength, fc, is required, but the input value is ignored because the response is linear in compression.

The parameters psish and psicr2 are based on the section volume-to-surface area ratio. The Excel spreadsheet in the dataset helps with calculating these parameters, as well as the creep and shrinkage parameters required for the Model Code 2010 implementations.

This section creep and shrinkage example analysis can be performed using a zeroLengthSection element. Because the axial load is concentric, the section doesn’t have to develop flexural resistance. Accordingly, we only need two fibers–one concrete, one steel–but we have to fix the rotation of the free node.

b = 300*mm
h = 300*mm
As = 1500*mm**2
Ag = b*h
Ac = Ag-As

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

ops.section('Fiber',1)
ops.fiber(0,0,As,1)
ops.fiber(0,0,Ac,2)
ops.element('zeroLengthSection',1,1,2,1)

Of course for beam-columns, you will define more fibers in your section using the patch and layer commands.

Anyway, we apply the axial load then do a static analysis to find stresses due to mechanical strain for short term loading.

P = 1000*kN

ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)
ops.load(2,-P,0,0)

ops.setTime(Tcr)
ops.integrator('LoadControl',0)
ops.analysis('Static')
ops.analyze(1)

Note that I used the load control integrator with dt=0 so that the domain time doesn’t advance. Alternatively, you can ramp up the axial load in a linear time series then use ops.loadConst('-time',Tcr) to reset the domain time to 28 days.

Next, let the material models know they should creep and shrink by turning on the global creep flag. Then run the analysis time out in days with load control, also known as pseudo-time control.

ops.setCreep(1) # Turn creep on

dt = 10 # days
ops.integrator('LoadControl',dt)

t = 0
while t < 10000:
    ok = ops.analyze(1)
    t += dt

This analysis goes to 10,000 days (a few years short of three decades) in increments of 10 days, but you can run the analysis more quickly by marching through log time.

Either way, plotting the concrete and steel stress response, which you can record from the fibers, we see that as the concrete stress reduces due to creep, the steel compressive stress increases in order to maintain equilibrium with the sustained load. The concrete and steel compressive stresses at 10,000 days match the 5.8 MPa and 326 MPa values shown by Gilbert and Ranzi.

Response history of concrete and steel stress

This was an incredibly minimal creep and shrinkage example. Knaack and Kurama (2020) describe the use of TDConcrete to simulate long term deflections of frame models built in OpenSees.