This is the flagship university course and the most technically advanced offering in the portfolio. It takes PhD students and postdocs from OpenSees user to OpenSees contributor — capable of implementing novel constitutive models and elements in C++, integrating them into the OpenSees framework, and deploying them at scale using OpenSeesMP on HPC infrastructure. There is no comparable course available in Europe: OpenSees documentation for developers is notoriously sparse, and the knowledge required to navigate and extend the codebase is typically acquired only through years of trial and error. This course compresses that learning into two structured weeks.
The pedagogical structure is deliberately layered: Week 1 uses Python to build intuition for constitutive model mathematics without the distraction of C++ syntax and compilation errors. Students implement return mapping algorithms, consistent tangent operators, and IMPL-EX integration from scratch in Python, verify them against analytical solutions, and develop a complete understanding of what the code must do before they write a single line of C++. Week 2 then translates this understanding into OpenSees C++ — students port their Python models into the NDMaterial interface, implement elements, and culminate in compiling OpenSeesMP, partitioning models with METIS, and running distributed jobs on Google Cloud Platform.
Python proficiency (required), continuum mechanics fundamentals (required), OpenSees user experience (required), C++ basics (helpful but not required — Week 1 provides the bridge).
Software: Python (NumPy, SciPy, Matplotlib), OpenSees source code, CMake, GCC/Clang, VS Code or CLion, OpenSeesMP, METIS, Google Cloud Platform
Each day: theory session in the morning (2.5–3 hours), hands-on Python coding session in the afternoon (3–3.5 hours). All Python implementations use NumPy and SciPy only — no FEM libraries — so students see every algorithmic detail.
| Day | Focus | Morning — Theory | Afternoon — Coding |
|---|---|---|---|
| Day 1 | Continuum mechanics | Stress and strain tensors, objectivity, corotational framework, Voigt notation, spectral decomposition | Python: tensor operations class, stress-strain curve generator, material state data structure |
| Day 2 | Elastoplasticity | Yield surface geometry, associated and non-associated flow rules, isotropic and kinematic hardening, loading/unloading conditions, consistency condition | Python: von Mises model with isotropic hardening, return mapping algorithm (radial return), stress update verification |
| Day 3 | Consistent tangent | Algorithmic vs continuum tangent, derivation of consistent tangent for von Mises model, quadratic convergence with Newton-Raphson | Python: tangent derivation, finite-difference verification, patch test at material point level |
| Day 4 | Cyclic models | Kinematic hardening (Armstrong-Frederick), combined hardening, Masing rules, soil-specific cyclic behaviour, pore pressure generation coupling | Python: cyclic constitutive model, hysteresis loop generation, comparison with experimental data |
| Day 5 | IMPL-EX | Motivation: stability vs accuracy, IMPL-EX algorithm derivation, error estimation, adaptive switching strategy, comparison with implicit integration | Python: IMPL-EX implementation of Day 2 model, side-by-side comparison with implicit, accuracy and stability parameter study |
Each day: conceptual/architectural session in the morning, C++ coding session in the afternoon. By Day 7, students are porting their own Week 1 Python model into C++. By Day 10, they are running it in parallel on Google Cloud.
| Day | Focus | Morning — Theory | Afternoon — Coding |
|---|---|---|---|
| Day 6 | OpenSees architecture | Codebase structure, class hierarchy (Domain, Element, Material, Node, Integrator, Algorithm), build system with CMake, how to add a new class, UniaxialMaterial vs NDMaterial interfaces | Navigate OpenSees source, compile from scratch, run a reference model via command line, locate relevant source files for NDMaterial |
| Day 7 | NDMaterial in C++ | NDMaterial interface: setTrialStrain, getStress, getTangent, commitState, revertToLastCommit, revertToStart. State variable management, serialisation (sendSelf/receiveSelf) | Port the Week 1 von Mises Python model into a C++ NDMaterial. Compile, link, test against Python reference |
| Day 8 | Element formulation | 8-node brick element: shape functions, numerical integration (Gauss quadrature), residual vector, stiffness matrix assembly, material point loop, geometric nonlinearity basics | Implement a simplified brick element in C++ connected to the custom NDMaterial. Run a single-element patch test |
| Day 9 | Debugging and validation | Convergence testing strategy, patch test requirements, debugging tools (GDB, Valgrind basics), numerical stability checks, common failure modes in constitutive implementations | Full debugging session: identify and fix bugs in Day 7–8 implementations, run patch test suite, verify quadratic convergence |
| Day 10 | OpenSeesMP and GCP | OpenSeesMP architecture, domain decomposition strategy, METIS graph partitioning algorithm, MPI communication patterns, GCP VM setup, SSH, storage, cost monitoring | Compile OpenSeesMP with MPI, partition a 3D model with METIS, deploy and run on GCP VM, retrieve and post-process distributed results |