OpenSees Cloud

OpenSees AMI

OpenSees 12345

Original Post - 26 Jun 2022 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


In the early 2000s, when the Tcl interpreter was taking shape for OpenSees, Frank used a dummy tag 123456789 to determine if a load pattern had already been defined while parsing the load and sp commands. Here is the 2001 source code for TclModelBuilder.cpp–clearly written by Frank because he does not capitalize anything when he comments.

TclModelBuilder in 2001

I gave Frank a hard time about this dubious software engineering decision: “What if someone legitimately defined a load pattern with tag 123456789? It’ll totally break your parsing logic”. Frank relented and modified the code to use more reliable true/false logic.

Today, I did some recursive grepping for other occurrences of sequential numbers like 12345 or 54321. Discounting a class tag, which is truly harmless, the only thing that came up was some questionable logic in MPCORecorder.cpp and RemoveRecorder.cpp. I’ll spare you the screenshots, but the links will take you to the offending lines on GitHub. In summary though:

I know these rules sound crazy, but I’m just interpreting the code.

There could be other magic numbers embedded in OpenSees, e.g., a YYYYMMDD birth date of whoever wrote Concrete23, or their first born. But there’s no easy way to find those occurrences.

I admit though, on the C++ side of OpenSees, it is a little difficult to get unique tags out of the domain and model builder. So I can see the appeal of using a number “that no one will ever use”. But, eventually, someone will use it.

However, if you’re writing a Python or Tcl script for OpenSees, there’s no excuse for using magic numbers like 12345 in your script.

You need a burner node tag? Use getNodeTags, then add one to the maximum value. You need a throw away element tag? Use getEleTags and add one. You need a parameter tag for a hot minute? Well, you know what to do with getParamTags.

Here’s what you would do in OpenSeesPy.

uniqueNodeTag = max(ops.getNodeTags()) + 1
uniqueEleTag = max(ops.getEleTags()) + 1
uniqueParamTag = max(ops.getParamTags()) + 1

The syntax for a one liner in OpenSees Tcl is even messier than I expected.

set uniqueNodeTag  [expr [tcl::mathfunc::max {*}[getNodeTags]] + 1]
set uniqueEleTag   [expr [tcl::mathfunc::max {*}[getEleTags]] + 1]
set uniqueParamTag [expr [tcl::mathfunc::max {*}[getParamTags]] + 1]

Abracadabra, no more magic numbers in your scripts!



The magic numbers remind me of the scene from Spaceballs where Dark Helmet gets the combination to unlock Planet Druidia’s atmosphere.

Spaceballs