Skip to content

Commit 7ddf2c1

Browse files
Kyeong Sun Kimclaude
andcommitted
fix: critical audit fixes (C1-C4, H1-H5, M1)
C1: Fix 3 SyntaxError files (<REDACTED_SKIRT_L> -> float('nan')) C2: Add NaN fail-fast guards in 6 files (raises RuntimeError) C3: Remove phantom tutorial toctree (tutorials don't exist yet) C4: Update all V&V counts: 39 benchmarks, 35/38 verified (92%) H1: Fix config filename site_a_site.yaml -> site_a.yaml (16 refs) H2: Clarify Zaaijer #10 note (different foundation types) H4: Correct test counts: 140 tests across 15 modules (was 121/14) H5: Add 10 missing modules to api.rst (fatigue, viz_*, encoder) M1: np.trapz -> np.trapezoid (25 calls across 9 files) Docs updated: README badge, VV_REPORT, cross_validation.rst, verification.rst, environment.rst, CHANGELOG, api.rst, index.rst Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 161e791 commit 7ddf2c1

36 files changed

Lines changed: 292 additions & 104 deletions

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ development plan.
9292

9393
### Test totals
9494

95-
- 121 active V&V tests (all PASS)
95+
- 140 active V&V tests (all PASS)
9696
- 33 example smoke tests across 11 turbines
9797
- 4 calibration regression tests against published references
9898
- 35/36 DNV-ST-0126 conformance checks

README.md

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)
66
[![OpenFAST](https://img.shields.io/badge/OpenFAST-v5.0.0-orange.svg)](https://github.com/OpenFAST/openfast/releases/tag/v5.0.0)
77
[![OpenSeesPy](https://img.shields.io/badge/OpenSeesPy-3.7+-green.svg)](https://github.com/zhuminjie/OpenSeesPy)
8-
[![V&V](https://img.shields.io/badge/V%26V-27%2F28_benchmarks_(96%25)-brightgreen.svg)](validation/cross_validations/VV_REPORT.md)
8+
[![V&V](https://img.shields.io/badge/V%26V-35%2F38_benchmarks_(92%25)-brightgreen.svg)](validation/cross_validations/VV_REPORT.md)
99
[![Tests](https://img.shields.io/badge/tests-45%20passing-brightgreen.svg)](op3_viz/tests/)
1010
[![Coverage](https://img.shields.io/badge/coverage-83.3%25-brightgreen.svg)](op3_viz/tests/)
1111
[![Version](https://img.shields.io/badge/version-1.0.0--rc1-blue.svg)](CHANGELOG.md)
@@ -87,18 +87,19 @@ python scripts/release_validation_report.py # 18/19 PASS in ~42 s
8787
| Monte Carlo soil propagation ||| manual | manual ||
8888
| Hermite polynomial chaos expansion |||| manual ||
8989
| Grid Bayesian calibration |||| manual ||
90-
| V&V test suite | **121** | proprietary | proprietary | user-built | ~200 r-test |
90+
| V&V test suite | **140** | proprietary | proprietary | user-built | ~200 r-test |
9191
| License | Apache-2.0 | commercial | commercial | BSD-3 | Apache-2.0 |
9292
| Python-native |||| wrapper | wrapper |
9393

9494
## v1.0.0-rc1 release highlights
9595

96-
- **27 / 28 cross-validation benchmarks verified (96%)** against 20+
96+
- **35 / 38 cross-validation benchmarks verified (92%)** against 20+
9797
published sources (Fu & Bienen 2017, Vulpe 2015, Doherty 2005,
9898
Houlsby 2005, Jalbi 2018, Gazetas 2018, and 14 more)
99-
- **115+ unit tests pass** across 14 modules (code verification,
99+
- **140 unit tests pass** across 15 modules (code verification,
100100
consistency, sensitivity, extended invariants, PISA, cyclic
101-
degradation, HSsmall, Mode D, UQ, reproducibility snapshot, ...)
101+
degradation, HSsmall, Mode D, UQ, reproducibility snapshot,
102+
framework integration, ...)
102103
- **4 / 4 calibration regression** against published references
103104
with all four examples within 4% of the most stringent
104105
(NREL 5 MW OC3 at **-0.4%** vs Jonkman & Musial 2010)
@@ -121,8 +122,8 @@ python scripts/release_validation_report.py # 18/19 PASS in ~42 s
121122

122123
## Cross-Validation Against Published Benchmarks
123124

124-
Op3 has been cross-validated against **31 independent benchmarks** from
125-
20+ published sources. **27 of 28 in-scope benchmarks verified (96%).**
125+
Op3 has been cross-validated against **39 independent benchmarks** from
126+
20+ published sources. **35 of 38 in-scope benchmarks verified (92%).**
126127

127128
| Category | Benchmarks | Error range | Sources |
128129
|---|---|---|---|
@@ -135,6 +136,13 @@ Op3 has been cross-validated against **31 independent benchmarks** from
135136
| PISA clay stiffness | #6 | 16--32% | Burd et al. 2020 |
136137
| VH envelope | #8 | -7.7% | Houlsby & Byrne / Vulpe 2015 |
137138
| p_ult(z) profile | #21 | consistent | OptumGX plate extraction |
139+
| Centrifuge yield moment | #22 | **-0.7%** | DJ Kim et al. 2014 |
140+
| Full-scale tripod f1 | #24 | -0.2% | Seo et al. 2020 |
141+
| Walney 1 monopile f1 | #25 | -2.1% | Arany et al. 2015 |
142+
| Suction bucket scour sensitivity | #26 | within range | Cheng et al. 2024 |
143+
| f_meas/f_design ratio | #27 | +0.3% | Kallehave et al. 2015 |
144+
| Cyclic rotation (N=100, N=1M) | #28 | 3.7--4.3% | Jeong et al. 2021 |
145+
| OC4 jacket f1 (fixed-base) | #29 | +1.9% | Popko et al. 2012 |
138146

139147
Key results:
140148
- **NcV = 6.006** (ref 5.94, +1.1%) -- textbook bearing capacity match
@@ -218,7 +226,7 @@ op3/ the Python package
218226
uq/ Propagation / PCE / Bayesian
219227
sacs_interface/ SACS jacket deck parser
220228
221-
tests/ 121 active V&V tests
229+
tests/ 140 active V&V tests
222230
scripts/ Runners, audits, regressions, release tooling
223231
examples/ 11 turbine TowerModel build.py files
224232
docs/ Sphinx + tutorials + Mode D notes + developer notes
@@ -355,7 +363,7 @@ modes — only the foundation boundary condition changes.
355363
| D | **Dissipation-weighted generalized BNWF** | High | Slow | Full energy-consistent coupling with OptumGX plastic dissipation field |
356364

357365
All four modes share the same tower, rotor, and nacelle inertia
358-
properties from [`op3/config/site_a_site.yaml`](op3/config/site_a_site.yaml).
366+
properties from [`op3/config/site_a.yaml`](op3/config/site_a.yaml).
359367
Only the foundation representation changes, which makes it trivial to
360368
compare the effect of foundation modeling choice on the predicted
361369
natural frequency, mode shape, or transient response.
@@ -476,7 +484,7 @@ The extraction is handled by
476484
The SubDyn input file is generated by
477485
[`op3/openfast_coupling/build_site_a_subdyn.py`](op3/openfast_coupling/build_site_a_subdyn.py).
478486
Both scripts are driven by the single-source-of-truth YAML at
479-
[`op3/config/site_a_site.yaml`](op3/config/site_a_site.yaml).
487+
[`op3/config/site_a.yaml`](op3/config/site_a.yaml).
480488

481489
## NREL reference library bundled in this repository
482490

@@ -560,7 +568,7 @@ numerical_model/
560568
│ ├── openfast_coupling/ OpenSees ↔ SubDyn bridge
561569
│ ├── integration/ OptumGX outputs → OpenSees springs
562570
│ └── config/ single source of truth
563-
│ └── site_a_site.yaml
571+
│ └── site_a.yaml
564572
565573
├── data/ OptumGX persisted outputs
566574
│ ├── integrated_database_1794.csv master Monte Carlo database

docs/FRAMEWORK.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ profile, material properties, environmental conditions — lives in
311311
exactly one file:
312312

313313
```
314-
op3/config/site_a_site.yaml
314+
op3/config/site_a.yaml
315315
```
316316

317317
This is a strict convention. No constants are hardcoded in any
@@ -320,7 +320,7 @@ SSOT YAML via:
320320

321321
```python
322322
from op3.config import load_site_config
323-
cfg = load_site_config('op3/config/site_a_site.yaml')
323+
cfg = load_site_config('op3/config/site_a.yaml')
324324
D = cfg['foundation']['bucket_diameter_m']
325325
L = cfg['foundation']['skirt_length_m']
326326
```
@@ -369,7 +369,7 @@ The framework is designed so that porting to a new turbine touches
369369
only the SSOT configuration and the OptumGX upstream step. Specific
370370
steps:
371371

372-
1. Create a new YAML file modeled on `op3/config/site_a_site.yaml`
372+
1. Create a new YAML file modeled on `op3/config/site_a.yaml`
373373
with the new turbine's geometry, soil profile, rotor mass, tower
374374
properties, and water depth.
375375
2. Run OptumGX over the new parameter envelope (requires a license)

docs/OPTUMGX_BOUNDARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ If you have an OptumGX academic license and the `optumgx` Python API:
199199
profile. A license holder can swap in a different constitutive
200200
model (Mohr-Coulomb, Hoek-Brown, user-defined) and regenerate
201201
the capacity envelope.
202-
3. **Apply to a different site.** Replace `config/site_a_site.yaml`
202+
3. **Apply to a different site.** Replace `config/site_a.yaml`
203203
with a different site's geometry and soil, rerun OptumGX, and
204204
the downstream OpenSeesPy and OpenFAST pipelines pick up the new
205205
CSVs automatically.

docs/sphinx/api.rst

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,33 @@ OpenFAST coupling
6767
.. automodule:: op3.openfast_coupling.soildyn_export
6868
:members:
6969

70+
Fatigue
71+
-------
72+
73+
.. automodule:: op3.fatigue
74+
:members:
75+
76+
Visualization
77+
-------------
78+
79+
.. automodule:: op3.visualization
80+
:members:
81+
82+
.. automodule:: op3.viz_optumgx
83+
:members:
84+
85+
.. automodule:: op3.viz_openfast
86+
:members:
87+
88+
.. automodule:: op3.viz_tier1
89+
:members:
90+
91+
.. automodule:: op3.viz_tier2
92+
:members:
93+
94+
.. automodule:: op3.viz_tier3
95+
:members:
96+
7097
Uncertainty quantification (Phase 5)
7198
------------------------------------
7299

@@ -78,3 +105,15 @@ Uncertainty quantification (Phase 5)
78105

79106
.. automodule:: op3.uq.bayesian
80107
:members:
108+
109+
Advanced UQ
110+
-----------
111+
112+
.. automodule:: op3.uq.sequential_bayesian
113+
:members:
114+
115+
.. automodule:: op3.uq.encoder_bridge
116+
:members:
117+
118+
.. automodule:: op3.uq.encoder_training
119+
:members:

docs/sphinx/cross_validation.rst

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
Cross-Validation Against Published Benchmarks
22
==============================================
33

4-
Op\ :sup:`3` v1.0 has been cross-validated against 31 independent
4+
Op\ :sup:`3` v1.0 has been cross-validated against 39 independent
55
benchmarks drawn from 20+ published sources spanning centrifuge
66
experiments, field trials, 3D finite-element analyses, closed-form
77
analytical solutions, and design code requirements.
88

9-
**Overall score: 27 of 28 in-scope benchmarks verified (96%).**
9+
**Overall score: 35 of 38 in-scope benchmarks verified (92%).**
1010

1111
.. contents:: On this page
1212
:local:
@@ -135,6 +135,48 @@ Summary table
135135
- depth profile
136136
- consistent
137137
- verified
138+
* - 22
139+
- DJ Kim tripod M\ :sub:`y` at yield
140+
- DJ Kim et al. (2014)
141+
- M\ :sub:`y` (MNm)
142+
- -0.7%
143+
- verified
144+
* - 24
145+
- Seo 2020 full-scale tripod f\ :sub:`1`
146+
- Seo et al. (2020)
147+
- f\ :sub:`1` (Hz)
148+
- -0.2%
149+
- verified
150+
* - 25
151+
- Arany Walney 1 f\ :sub:`1`
152+
- Arany et al. (2015)
153+
- f\ :sub:`1` (Hz)
154+
- -2.1%
155+
- verified
156+
* - 26
157+
- Cheng 2024 scour df/f\ :sub:`0`
158+
- Cheng et al. (2024)
159+
- df/f\ :sub:`0` (%)
160+
- -40% (both <1%)
161+
- verified
162+
* - 27
163+
- Kallehave f\ :sub:`meas`/f\ :sub:`design`
164+
- Kallehave et al. (2015)
165+
- ratio
166+
- +0.3%
167+
- verified
168+
* - 28
169+
- Jeong 2021 cyclic rotation
170+
- Jeong et al. (2021)
171+
- rotation (deg)
172+
- 3.7--4.3%
173+
- verified
174+
* - 29
175+
- OC4 jacket f\ :sub:`1` (fixed-base)
176+
- Popko et al. (2012)
177+
- f\ :sub:`1` (Hz)
178+
- +1.9%
179+
- verified
138180
* - 7
139181
- PISA Dunkirk sand
140182
- Byrne et al. (2020)
@@ -402,8 +444,8 @@ Reference data
402444

403445
All reference data is stored in machine-readable format:
404446

405-
* ``validation/cross_validations/extended_reference_data.py`` -- 19
406-
Python dictionaries covering 19 published sources
447+
* ``validation/cross_validations/extended_reference_data.py`` -- 20+
448+
Python dictionaries covering 20+ published sources
407449
* ``validation/cross_validations/extracted_benchmark_data.json`` -- 36
408450
individual benchmark entries
409451
* ``validation/cross_validations/all_results.json`` -- consolidated

docs/sphinx/environment.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Environment setup guide
33

44
This page is the complete setup guide for running Op\ :sup:`3` on a
55
fresh machine. Follow it top-to-bottom and you will have a working
6-
installation with all 121 V&V tests passing in under 30 minutes.
6+
installation with all 140 V&V tests passing in under 30 minutes.
77

88
Supported platforms
99
-------------------

docs/sphinx/index.rst

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,12 @@ Foundations"* (Seoul National University, June 2026).
4242
verification
4343
cross_validation
4444

45-
.. toctree::
46-
:maxdepth: 2
47-
:caption: Tutorials
45+
.. note::
4846

49-
tutorials/01_quickstart
50-
tutorials/02_foundation_modes
51-
tutorials/03_uncertainty_quantification
52-
tutorials/04_calibration
53-
tutorials/05_soildyn_export
54-
tutorials/06_dlc_sweep
47+
**Tutorials** are planned for the v1.1 release. In the meantime,
48+
see the demo scripts in ``scripts/`` (e.g., ``visualize_op3.py``,
49+
``visualize_optumgx_openfast.py``, ``test_three_analyses.py``)
50+
and the sample projects in ``sample_projects/``.
5551

5652
.. toctree::
5753
:maxdepth: 2
@@ -90,11 +86,11 @@ Run the bundled examples
9086
Verification & validation
9187
-------------------------
9288

93-
The full V&V suite consists of 115 active tests across 14 modules
94-
plus 31 cross-validation benchmarks against 20+ published sources.
89+
The full V&V suite consists of 140 active tests across 15 modules
90+
plus 39 cross-validation benchmarks against 20+ published sources.
9591
See :doc:`verification` for the unit-test falsification gates and
9692
:doc:`cross_validation` for the published-benchmark comparison
97-
(27/28 in-scope benchmarks verified, 96%).
93+
(35/38 in-scope benchmarks verified, 92%).
9894

9995
Indices and tables
10096
==================

docs/sphinx/verification.rst

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
Verification & Validation
22
=========================
33

4-
The Op\ :sup:`3` V&V suite contains 115+ active falsification gates
5-
across 14 test modules. All tests must pass before any commit reaches
4+
The Op\ :sup:`3` V&V suite contains 140 active falsification gates
5+
across 15 test modules. All tests must pass before any commit reaches
66
``main``.
77

88
Test summary
@@ -24,7 +24,7 @@ Test summary
2424
- 5
2525
- Physical sensitivity invariants
2626
* - ``tests/test_extended_vv.py``
27-
- 8
27+
- 12
2828
- Damping, energy, reciprocity, units, coordinates, orthogonality
2929
* - ``tests/test_pisa.py``
3030
- 9
@@ -47,6 +47,9 @@ Test summary
4747
* - ``tests/test_uq.py``
4848
- 13
4949
- MC propagation, PCE, Bayesian
50+
* - ``tests/test_op3_framework.py``
51+
- 15
52+
- Framework integration, project I/O, visualization wiring
5053
* - ``tests/test_reproducibility.py``
5154
- 6
5255
- Snapshot byte-identical reproduction
@@ -104,8 +107,8 @@ Cross-validation against published benchmarks
104107
----------------------------------------------
105108

106109
In addition to the internal V&V tests above, Op\ :sup:`3` has been
107-
cross-validated against **31 independent benchmarks** from 20+ published
108-
sources, achieving a **96% verification rate** (27/28 in-scope).
110+
cross-validated against **39 independent benchmarks** from 20+ published
111+
sources, achieving a **92% verification rate** (35/38 in-scope).
109112

110113
See :doc:`cross_validation` for the complete cross-validation report
111114
including OptumGX bearing capacity factors (0.8--7.8% error vs Vulpe

op3/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
Usage:
99
1010
from op3 import load_site_config
11-
cfg = load_site_config('op3/config/site_a_site.yaml')
11+
cfg = load_site_config('op3/config/site_a.yaml')
1212
D = cfg['foundation']['bucket_diameter_m']
1313
"""
1414
from __future__ import annotations

0 commit comments

Comments
 (0)