OpenSees Cloud

OpenSees AMI

OpenSees Command Line Arguments

Original Post - 24 Mar 2024 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


While graphical user interfaces are good for general purpose use, the command line remains the most versatile way to run OpenSees and other computer programs.

Passing command line arguments to an OpenSees Tcl or Python script is useful when creating standalone applications for building and analyzing specialized models. Both Tcl and Python have constructs similar to argc and argv, the command line argument count and the command line argument values, respectively, passed into a C/C++ main() function.

Tcl Command Line

When you run OpenSees Tcl from the command line, you can access the following variables within your Tcl script:

You can see the definition of these variables in SRC/tcl/tclMain.cpp.

Suppose we have a simple script for analysis of an SDF oscillator and we want to take command line arguments for the natural period and the ground motion record.

puts "Running $argv0 script"
if {$argc < 2} {
    puts stderr "Must specify period and ground motion"
}

set Tn [lindex $argv 0]
set gmFile [lindex $argv 1]
puts "Natural period $Tn, ground motion $gmFile"

#
# Define SDF model with natural period Tn
#
# Define time series with ground motion gmFile
#
# Perform analysis, do stuff
#

To call the script with natural period 0.8 and the elCentro.txt ground motion:

$ OpenSees sdf.tcl 0.8 elCentro.txt

Python Command Line

When you run a Python script from the command line, Python defines only one argv list, which you can access using the sys library:

All sys.argv entries are strings, so you will have to cast numeric input as either float or int in your script.

The Python version of our simple SDF analysis script is below.

import openseespy.opensees as ops
import sys

print(f"Running {sys.argv[0]} script")
argc = len(sys.argv[1:])
if argc < 2:
    print("Must specify period and ground motion",file=sys.stderr)

Tn = float(sys.argv[1]) # Cast as float
gmFile = sys.argv[2]
print(f"Natural period {Tn}, ground motion {gmFile}"

#
# Define SDF model with natural period Tn
#
# Define time series with ground motion gmFile
#
# Perform analysis, do stuff
#

To call the script with natural period 0.8 and the elCentro.txt ground motion:

$ python3 sdf.py 0.8 elCentro.txt

Error Checking

The above snippets have minimal error checking, only on the command line argument count. When taking user input–from the command line or anywhere else–you should check for consistent types. For example, you can use a try/except block to check that the user entered a floating point value for the natural period.

def isfloat(value):
    try:
        float(value)
        return True
    except ValueError:
        return False

if isfloat(sys.argv[1]):
    Tn = float(sys.argv[1])
else:
    print(f'Input period {sys.argv[1]} is not a floating point value',file=sys.stderr)

The above code should flag an error for the following command line arguments:

$ python3 sdf.py abc elCentro.txt

Also, you should check that the ground motion file exists before you pass the filename to the timeSeries command in OpenSees.

import os

if not os.path.isfile(sys.argv[2]):
    print(f'Input ground motion file {sys.argv[2]} does not exist',file=sys.stderr)

More error checking is necessary, even for this simple example. In many programs, the lines for error checking can exceed the lines for core code execution.