OpenSees Cloud

OpenSees AMI

An Update of the IMK Models

Original Post - 08 Dec 2019 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


Hysteretic models include several parameters that can be fit to a variety of physical phenomena known to occur in steel and reinforced concrete members under cyclic loading. I did my Ph.D. in the Bay Area, but not at The Farm. Accordingly, I’m more of a fiber section aficionado–but I get the appeal of hysteretic models. Although some physics is lost, hysteretic models scale much better to large frame models than fiber sections. There’s always a tradeoff.

A particular family of hysteretic models, Ibarra-Medina-Krawinkler (IMK), has a significant following in the OpenSees community. The IMK models have been in OpenSees from very early on, but the latest chapter in the IMK story arrived with little fanfare via PR #118. To convey that this pull request should be a big deal requires a brief background of the IMK models in OpenSees.

The degrading bilinear, pinching, and peak-oriented models that would become IMK were first developed by Rahmana and Krawinkler for NLDYNA. The models were also implemented in DRAIN-2DX. There is a little known UniaxialMaterial class called DrainMaterial that wraps FORTRAN subroutines that fit the DRAIN-2DX call signatures. If you look in the SRC/material/uniaxial/drain directory now, you’ll see only one proof-of-concept implementation for a bilinear hardening material. For whatever reason, those DRAIN-2DX hysteretic models never made their way into OpenSees.

The same degrading bilinear, pinching, and peak-oriented models were also implemented by Ibarra and Krawinkler (2005) in a structural analysis code known as SNAP (see Chapter 3 of the report). In the early 2000s, the SNAP models were recoded in C++ for OpenSees and still reside in the SRC/material/uniaxial/snap directory. You can use these models, collectively known as the IMK models, via the uniaxialMaterial commands Bilinear, Pinching, and Clough.

Then in the mid-to-late 2000s came the “ModIMK” models: Bilin, ModIMKPinching, and ModIMKPeakOriented. I don’t know all the particulars of what the “Mod” part of ModIMK signifies. That’s not important. What’s important is that the ModIMK models became widely used. With all the users, a few bugs were discovered. No shade intended–you’ll find a much higher density of bugs in the obscure material models that lie fallow in OpenSees.

Some of the ModIMK bugs were fixed, but not all the fixes made their way into the main OpenSees source code repository. One of my colleagues in Eastchester checked in some bug fixes, but several other versions of ModIMK with varying levels of functionality continued to float around. Some of those versions were object-code only. We even ended up with Bilin02, ModIMKPinching02, and ModIMKPeakOriented02. I don’t know the differences between the originals and the 02 versions. But I do know all the different versions became a headache to maintain and users wondered if they had the right version of ModIMK.

Then, earlier this year, PR #118 added three new UniaxialMaterial classes: IMKBilin, IMKPinching, and IMKPeakOriented. These implementations should have the previous bugs resolved. The uniaxialMaterial command has been modified to accept these models for both the Tcl and Python interpreters of OpenSees.

The online documentation has not been updated to include these new models, but here’s the input format I gleaned from the source code. If you’ve used the ModIMK models, I assume the abbreviated input arguments shown below make sense.

uniaxialMaterial IMKBilin tag? Ke? Theta_p_pos? Theta_pc_pos? Theta_u_pos? Mpe_pos? MmaxMpe_pos? ResM_pos? Theta_p_neg? Theta_pc_neg? Theta_u_neg? Mpe_neg? MmaxMpe_neg? ResM_neg? LamdaS? LamdaC? LamdaK? Cs? Cc? Ck? D_pos? D_neg?

uniaxialMaterial IMKPinching tag? Ke? Up_pos? Upc_pos? Uu_pos? Fy_pos? FmaxFy_pos? ResF_pos? Up_neg? Upc_neg? Uu_neg? Fy_neg? FmaxFy_neg? ResF_neg? LamdaS? LamdaC? LamdaA? LamdaK? Cs? Cc? Ca? Ck? D_pos? D_neg? KappaF? KappaD?

uniaxialMaterial IMKPeakOriented tag? Ke? Up_pos? Upc_pos? Uu_pos? Fy_pos? FmaxFy_pos? ResF_pos? Up_neg? Upc_neg? Uu_neg? Fy_neg? FmaxFy_neg? ResF_neg? LamdaS? LamdaC? LamdaA? LamdaK? Cs? Cc? Ca? Ck? D_pos? D_neg?

Give these new IMK models a try. If you find a bug, fix it then submit a pull request. It’s nice to have the official source code for these popular models back on the main branch of OpenSees.