OpenSees Cloud

OpenSees AMI

Critical Buckling Loads via CBDI

Original Post - 16 Nov 2024 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


Curvature-based displacement interpolation (CBDI) is a method of approximating the transverse deflection at each integration point, or section, of a force-based frame element in order to account for geometric nonlinearity within the basic system, i.e., “P-little-delta” effects.

Neuenhofer and Filippou (1998) describe the complete CBDI formulation for force-based elements. But one piece of the formulation, the so-called “CBDI influence matrix”, caught my attention a few years ago.

If you take the eigenvalues of the matrix \(-L^2 {\bf l}^* {\bf F}\), you will get the buckling loads for a frame member. In this matrix, L is the member length, \({\bf l}^*\) is the CBDI influence matrix, comprised of simple polynomials based on the section locations, and \({\bf F}\) is a diagonal matrix of flexural rigidities (1/EI) at each section along the member.

Full details on the CBDI buckling approach can be found in Scott and Denavit (2023), where we pressed a sheet of OSB out of scraps of the timber that was the complete CBDI force-based element formulation. The computation comes down to a simple Python function and does not require finite element analysis to compute buckling loads–you do not need to define an OpenSees model.

import numpy as np

def cbdi_critical_load(L,xi,EI):

    Np = len(xi)

    # Form h matrix
    h = np.zeros((Np,Np))
    for j in range(Np):
        for i in range(Np):
            h[i,j] = (xi[i]**(j+2)-xi[i])/((j+1)*(j+2))
            
    # Form g matrix
    g = np.zeros((Np,Np))
    for j in range(Np):
        for i in range(Np):
            g[i,j] = xi[i]**j
            
    # Form flexibility matrix
    F = np.zeros((Np,Np))
    for i in range(Np):
        F[i,i] = 1/EI[i]
    
    # Eigenvalues of -L^2*lstar*F where lstar = h*inv(g)
    [v,d] = np.linalg.eig(np.dot(-L*L*h,np.linalg.solve(g,F)))

    Pcr = 1/max(v)
    return Pcr

The CBDI eigenvalue approach is a straightforward means to computing buckling loads for simple columns with variations in flexural stiffness, e.g., due to tapers, steps, weakened sections (fire, damage, corrosion), changes in material, and even rigid end zones, like the example from this post.

Using six sections along the entire column (two in each rigid zone and two in the flexible segment), computing the critical buckling load is a breeze for a column with rigid end zones.

EI = 20000
EIrigid = 1e8

Lc = 100
Lr = 50 # Or whatever
L = 2*Lr+Lc

xi = [Lr/4,3*Lr/4, Lr+Lc/4,Lr+3*Lc/4, Lr+Lc/4,Lr+3*Lc/4]
xi = np.divide(xi,L)
F = [1/EIrigid,1/EIrigid, 1/EI,1/EI, 1/EIrigid,1/EIrigid]

Pcr = cbdi_critical_load(L,xi,F)

The buckling loads for the case where the length of the rigid zones, Lr, increases while the flexible length, Lc, stays fixed are shown below for the corotational mesh approach of the previous post and the current CBDI approach.

Flexible column length is constant

The results are good for this case, save for the short rigid end zones, i.e., Lr/Lc < 0.2.

The case where the total column length stays constant while the lengths of the rigid end zones increase relative to the flexible length is shown below.

Total column length is constant

The CBDI approach struggles a bit at the extremes Lr/Lc < 0.2 and Lr/Lc > 1.25, but otherwise does a good job.

You can play with the section locations to get better results out of the CBDI eigenvalue computation. Those details and other applications of the CBDI approach to critical buckling loads are shown in Scott and Denavit (2023).