Try on DesignSafe

4 PostProcess Ops-MP#

Take advantage of the interactive nature of the Jupyter environment to visualize output data quantitatively.

by Silvia Mazzoni, DesignSafe, 2025

In this training session we will visualize the job-output data before copying it over.

This is an important step because it helps you determine whether the job was run as intended. If not, you can resubmit a job without moving the data, yet.

Configure python#

import matplotlib.pyplot as plt
import numpy
Using local utilities library
# add the tilda at the beginning of the path to make it absolute
JobOutputFolder = '~/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory/'
print('JobOutputFolder',JobOutputFolder)
# list some files:
print('Folder Content:')
display(os.system(f'ls {JobOutputFolder}'))
JobOutputFolder ~/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory/
Folder Content:
DataTCLmp
Ex1a.Canti2D.Push.mp.tcl
Ex1a.Canti2D.Push.mpi.py
Ex1a.Canti2D.Push.mpi4py.py
Ex1a.Canti2D.Push.py
Ex1a.Canti2D.Push.tcl
Ex1a_many.Canti2D.Push.mp.tcl
0

4. Copy base path for output data from posted path:#

basePath = os.path.expanduser(JobOutputFolder)
print('basePath',basePath)
basePath /home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory/
os.path.isdir(basePath)
True
os.listdir(basePath)
['DataTCLmp',
 '.ipynb_checkpoints',
 'Ex1a_many.Canti2D.Push.mp.tcl',
 'Ex1a.Canti2D.Push.tcl',
 'Ex1a.Canti2D.Push.py',
 'Ex1a.Canti2D.Push.mp.tcl',
 'Ex1a.Canti2D.Push.mpi4py.py',
 'Ex1a.Canti2D.Push.mpi.py']

Visualize the Input File#

Ex1a.Canti2D.Push.mp.tcl
# /home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory/Ex1a.Canti2D.Push.mp.tcl
# mpiexec -np 3 OpenSeesMP Ex1a.tcl.Canti2D.Push.mp.tcl

############################################################
#  EXAMPLE: 
#       Ex1a.Canti2D.Push.tcl
#          for OpenSees.exe (tcl)
#  --------------------------------------------------------#
#  by: Silvia Mazzoni, 2020
#       silviamazzoni@yahoo.com
############################################################
# This file was obtained by updating the Tcl script in the original examples manual
# You can find the original Examples:
# https://opensees.berkeley.edu/wiki/index.php/Examples_Manual
# Original Examples by By Silvia Mazzoni & Frank McKenna, 2006, in Tcl
############################################################
# --------------------------------------------------------------------------------------------------
# Example 1. cantilever 2D
# static pushover analysis with gravity.
# all units are in kip, inch, second
# elasticBeamColumn ELEMENT
#			Silvia Mazzoni & Frank McKenna, 2006
#
#    ^Y
#    |
#    2       __ 
#    |         | 
#    |         | 
#    |         | 
#  (1)      36'
#    |         | 
#    |         | 
#    |         | 
#  =1=    ----  -------->X
#
#
    
set pid [getPID]
set np [getNP]
puts "pid $pid of np=$np  started"
        
set LcolList "100 120 200 240 300 360 400 480"

# ----------------------------------------------
set dataDir DataTCLmp;                # set up name of data directory
file mkdir $dataDir; # create data directory

set count 0;
foreach Lcol $LcolList {
    # check if count is a multiple of pid : "is it its turn?"
    if {[expr $count % $np] == $pid} {
       
        # SET UP ----------------------------------------------------------------------------
        wipe;						# clear opensees model
        model basic -ndm 2 -ndf 3;	# 2 dimensions, 3 dof per node
        
        # define GEOMETRY -------------------------------------------------------------
        # nodal coordinates:
        node 1 0 0;				# node#, X Y
        node 2 0 $Lcol
        
        # Single point constraints -- Boundary Conditions
        fix 1 1 1 1; 			# node DX DY RZ
        
        # nodal masses:
        mass 2 5.18 0. 0.;		# node#, Mx My Mz, Mass=Weight/g.
        
        # Define ELEMENTS -------------------------------------------------------------
        # define geometric transformation: performs a linear geometric transformation of beam stiffness 
        #	and resisting force from the basic system to the global-coordinate system
        geomTransf Linear 1;  		# associate a tag to transformation
        
        # connectivity: (make A very large, 10e6 times its actual value)
        # element elasticBeamColumn $eleTag $iNode $jNode $A $E $Iz $transfTag
        element elasticBeamColumn 1 1 2 3600000000 4227 1080000 1;	
        
        # Define RECORDERS -------------------------------------------------------------
        recorder Node -file ${dataDir}/DFree_Lcol${Lcol}.out -time -node 2 -dof 1 2 3 disp;			# displacements of free nodes
        recorder Node -file ${dataDir}/DBase_Lcol${Lcol}.out -time -node 1 -dof 1 2 3 disp;			# displacements of support nodes
        recorder Node -file ${dataDir}/RBase_Lcol${Lcol}.out -time -node 1 -dof 1 2 3 reaction;		# support reaction
        recorder Element -file ${dataDir}/FCol_Lcol${Lcol}.out -time -ele 1 globalForce;			# element forces -- column
        recorder Element -file ${dataDir}/DCol_Lcol${Lcol}.out -time -ele 1 deformation;			# element deformations -- column
        
        
        # define GRAVITY -------------------------------------------------------------
        timeSeries Linear 1;
        pattern Plain 1 1 {
           load 2 0. -2000. 0.;			# node#, FX FY MZ --  superstructure-weight
        }
        constraints Plain;     			# how it handles boundary conditions
        numberer Plain;					# renumber dof's to minimize band-width (optimization), if you want to
        system BandGeneral;				# how to store and solve the system of equations in the analysis
        test NormDispIncr 1.0e-8 6 ; 	# determine if convergence has been achieved at the end of an iteration step
        algorithm Newton;				# use Newton's solution algorithm: updates tangent stiffness at every iteration
        integrator LoadControl 0.1;		# determine the next time step for an analysis, # apply gravity in 10 steps
        analysis Static					# define type of analysis static or transient
        analyze 10;						# perform gravity analysis
        loadConst -time 0.0;			# hold gravity constant and restart time
        
        # define LATERAL load -------------------------------------------------------------
        timeSeries Linear 2;
        pattern Plain 2 2 {
           load 2 2000. 0.0 0.0;		# node#, FX FY MZ -- representative lateral load at top node
        }
        
        # pushover: diplacement controlled static analysis
        integrator DisplacementControl 2 1 0.1;		# switch to displacement control, for node 11, dof 1, 0.1 increment
        analyze 1000;								# apply 100 steps of pushover analysis to a displacement of 10
        
        puts "pid $pid of $np Analysis-${count} execution done"
        
        
    }
    incr count 1;
}

puts "pid $pid ALL DONE!!!"

5. Plot some analysis results#

for any of the above analyses

#pick any case
dataDir = f'{basePath}/DataTCLmp'
Lcol = 300
print('dataDir',dataDir)
# list some files:
os.system(f'ls {dataDir}/*Lcol{Lcol}.out')
dataDir /home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/DBase_Lcol300.out
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/DCol_Lcol300.out
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/DFree_Lcol300.out
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/FCol_Lcol300.out
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/RBase_Lcol300.out
0
plt.close('all')
fname3o = f'DFree_Lcol{Lcol}.out'
fname3 = f'{dataDir}/{fname3o}'
print(fname3)
dataDFree = numpy.loadtxt(fname3)
plt.subplot(211)
plt.title(f'Ex1a.Canti2D Lcol={Lcol}')
plt.grid(True)
plt.plot(dataDFree[:,1])
plt.xlabel('Step Number')
plt.ylabel('Free-Node Displacement')
plt.subplot(212)
plt.grid(True)
plt.plot(dataDFree[:,1],dataDFree[:,0])
plt.xlabel('Free-Node Disp.')
plt.ylabel('Pseudo-Time (~Force)')
plt.savefig(f'{dataDir}/Response.jpg')
plt.show()
print(f'plot saved to {dataDir}/Response_Lcol{Lcol}.jpg')
print('End of Run: Ex1a.Canti2D.Push.py.ipynb')
/home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/DFree_Lcol300.out
../_images/8fd630fcfd7c674c3dbc4378220b5e5f3e914d7fbc67b480718103e31bc752f5.png
plot saved to /home/jupyter/MyData/tapis-jobs-archive/2025-07-28Z/opensees-mp-s3-latest_2025-07-28T20:40:09-b8ccbb89-c8ad-439e-b1e5-8accee91ba6a-007/inputDirectory//DataTCLmp/Response_Lcol300.jpg
End of Run: Ex1a.Canti2D.Push.py.ipynb
print('Done!')
Done!