4.5. Near-Real Time Wave-Solver - Tsunami Vulnerability of a School in Loiza, Puerto Rico - Celeris + BRAILS
Problem files |
4.5.1. Overview

Study the tsunami vulnerability of a school in Loiza, Puerto Rico, driven by local bathymetry—a coastline and nearby river—amid sea level rise.
Warning
The school is a cross-shaped building, which influences both its structural response and the way hydrodynamic loads are distributed during tsunami inundation. This geometry should be considered when interpreting simulation results and configuring probe locations for load mapping, but we emphasize that we keep the structural representation as a simple frame for this example. Advanced users are urged to explore a more detailed structural modeling approach.
Note
The school is adjacent to a diamond shaped, open field and an ‘L’ shaped structure. The former is a baseball field used by the local, predominantly minority students, and the latter is the stadium seating. We emphasize that this open field poses a localized threat during a tsunami due to its bathymetric features. Further, it is a likely gathering point for students during an evacuation so it may become a hazard zone.
Two approaches will be taken:
Analysis on an existing bathymetry file with a limited building inventory for the town of Loiza, Puerto Rico. This represents a typical but unwieldy workflow.
Analysis on a bathymetry that is created at run-time by calling on a NOAA API for bathymetry-topography and merging in automated building inventory scraping results from BRAILS for Loiza, Puerto Rico. This represents a highly automated and convenient workflow.
Hydrodynamics are represented by a composed sine-wave tsunami-like far-field signal inflow. On-top of to-be-discussed structural uncertainty, this example is unique in that it also includes hydrodynamic uncertainty: a seaLevel offset (mean 0.0, stdev 0.25) to reflect sea-level rise scenarios which are anticipated to have a pronounced effect on the region.
Note
Keep GI, SIM, EVT, and FEM units consistent between CelerisAi outputs and OpenSees inputs, including any geographic/time scaling used for the Loiza domain.
4.5.2. Set-Up
4.5.2.1. Step 1: UQ
Configure Forward sampling to explore structural and hydrodynamic uncertainty.
Engine: Dakota
Forward Propagation: Sampling method (e.g., LHS) with
samples
(e.g.,40
) and an optional reproducibleseed
(e.g.,1
).

4.5.2.2. Step 2: GI
Set General Information and Units. Ensure units are consistent across the workflow.
Project name:
CelerisAi_Loiza_School
Location/metadata: optional
Units: pick a consistent set (e.g., N-m-s or kips-in-s)

4.5.2.3. Step 3: SIM
The structural model is as follows: a 2D, 3-DOF OpenSees portal frame in OpenSees, OpenSees.

Fig. 4.5.2.3.1 2D 3-DOF portal frame under stochastic wave loading (JONSWAP)
For the OpenSees generator the following model script, Frame.tcl , is used:
Click to expand the OpenSees input file used for this example
1# Create ModelBuilder (with two-dimensions and 3 DOF/node)
2
3model basic -ndm 2 -ndf 3
4
5set width 360
6set height 144
7
8node 1 0.0 0.0
9node 2 $width 0.0
10node 3 0.0 $height
11node 4 $width $height
12
13fix 1 1 1 1
14fix 2 1 1 1
15
16# Concrete ( Youngs Modulus, Yield Strength, and Compressive Strength)
17pset fc 6.0
18pset fy 60.0
19pset E 30000.0
20uniaxialMaterial Concrete01 1 -$fc -0.004 -5.0 -0.014
21uniaxialMaterial Concrete01 2 -5.0 -0.002 0.0 -0.006
22
23# STEEL
24uniaxialMaterial Steel01 3 $fy $E 0.01
25
26set colWidth 15
27set colDepth 24
28set cover 1.5
29set As 0.60; # area of no. 7 bars
30set y1 [expr $colDepth/2.0]
31set z1 [expr $colWidth/2.0]
32
33section Fiber 1 {
34
35 # Create the concrete core fibers
36 patch rect 1 10 1 [expr $cover-$y1] [expr $cover-$z1] [expr $y1-$cover] [expr $z1-$cover]
37
38 # Create the concrete cover fibers (top, bottom, left, right)
39 patch rect 2 10 1 [expr -$y1] [expr $z1-$cover] $y1 $z1
40 patch rect 2 10 1 [expr -$y1] [expr -$z1] $y1 [expr $cover-$z1]
41 patch rect 2 2 1 [expr -$y1] [expr $cover-$z1] [expr $cover-$y1] [expr $z1-$cover]
42 patch rect 2 2 1 [expr $y1-$cover] [expr $cover-$z1] $y1 [expr $z1-$cover]
43
44 # Create the reinforcing fibers (left, middle, right)
45 layer straight 3 3 $As [expr $y1-$cover] [expr $z1-$cover] [expr $y1-$cover] [expr $cover-$z1]
46 layer straight 3 2 $As 0.0 [expr $z1-$cover] 0.0 [expr $cover-$z1]
47 layer straight 3 3 $As [expr $cover-$y1] [expr $z1-$cover] [expr $cover-$y1] [expr $cover-$z1]
48
49}
50
51
52# Define column elements
53# ----------------------
54
55# Geometry of column elements
56# tag
57
58geomTransf Corotational 1
59
60# Number of integration points along length of element
61set np 5
62
63# Create the coulumns using Beam-column elements
64# e tag ndI ndJ nsecs secID transfTag
65set eleType dispBeamColumn
66element $eleType 1 1 3 $np 1 1
67element $eleType 2 2 4 $np 1 1
68
69# Define beam elment
70# -----------------------------
71
72# Geometry of column elements
73# tag
74geomTransf Linear 2
75
76# Create the beam element
77# tag ndI ndJ A E Iz transfTag
78element elasticBeamColumn 3 3 4 360 4030 8640 2
79
80# Define gravity loads
81# --------------------
82
83# Set a parameter for the axial load
84set P 180; # 10% of axial capacity of columns
85
86# Create a Plain load pattern with a Linear TimeSeries
87pattern Plain 1 "Linear" {
88
89 # Create nodal loads at nodes 3 & 4
90 # nd FX FY MZ
91 load 3 0.0 [expr -$P] 0.0
92 load 4 0.0 [expr -$P] 0.0
93}
94
95# ------------------------------
96# Start of analysis generation
97# ------------------------------
98
99# Create the system of equation, a sparse solver with partial pivoting
100system ProfileSPD
101
102# Create the constraint handler, the transformation method
103constraints Transformation
104
105# Create the DOF numberer, the reverse Cuthill-McKee algorithm
106numberer RCM
107
108# Create the convergence test, the norm of the residual with a tolerance of
109# 1e-12 and a max number of iterations of 10
110test NormDispIncr 1.0e-12 10 3
111
112# Create the solution algorithm, a Newton-Raphson algorithm
113algorithm Newton
114
115# Create the integration scheme, the LoadControl scheme using steps of 0.1
116integrator LoadControl 0.1
117
118# Create the analysis object
119analysis Static
120
121# ------------------------------
122# End of analysis generation
123# ------------------------------
124
125# perform the gravity load analysis, requires 10 steps to reach the load level
126analyze 10
127
128loadConst -time 0.0
129
130# ----------------------------------------------------
131# End of Model Generation & Initial Gravity Analysis
132# ----------------------------------------------------
133
134
135# ----------------------------------------------------
136# Start of additional modelling for dynamic loads
137# ----------------------------------------------------
138
139# Define nodal mass in terms of axial load on columns
140set g 386.4
141set m [expr $P/$g]; # expr command to evaluate an expression
142
143# tag MX MY RZ
144mass 3 $m $m 0
145mass 4 $m $m 0
Note
The first lines containing pset
in an OpenSees tcl file will be read by the application when the file is selected. The application will autopopulate the random variables in the RV panel with these same variable names.

These variable names (fc
, fy
, E
) are recognized in Frame.tcl
due to use of the pset command instead of set. This is so that RV picks them up automatically. You can try adding new RV parameters in the same way.
Uncertain properties (treated as RVs; see Step 7):
fc
: mean6
, stdev0.06
fy
: mean60
, stdev0.6
E
: mean30000
, stdev300
4.5.2.4. Step 4: EVT
Load Generator: CelerisAi Event - Near-Real-Time Boussinesq Solver (Loiza, PR coastal + riverine bathymetry).
Configuration outline:
Bathymetry/geometry: Loiza coastline, adjacent river channel, and local urban footprint for shielding/flow pathways.
Wavemaker: tsunami-like incoming signal (solitary/long-wave proxy).
Instrumentation: place wave-gauges (η), velocimeters (u, v), and load proxies at school façade and along the river corridor to study channeling.
Hydrodynamic RVs: promote seaLevel to a RV (see Step 7).
Export: time histories at probe and structure locations for load mapping into OpenSees.
To perform the standard, manual workflow, load-in the following files to the
Celeris
tab:

To perform the automated workflow using BRAILS for a fleshed-out building inventory and a NOAA API for high-quality bathymetry-topography, configure the following in the
BRAILS
tab and pressRun
. It may take between 20 to 120 seconds to finish:

Important
You will need to reconfigure wave-gauges and load-sensors to fit this new bathymetry, as the example’s provided values are valid for the manual workflow only.

For both workflows, double-check that the following parameters are set in the Solver
and Domain
tabs:


4.5.2.5. Step 5: FEM
Solver: OpenSees dynamic analysis. Check:
Integration step compatible with Celeris output interval.
Algorithm/convergence tolerances suitable for expected nonlinearity.
Damping model as needed (e.g., Rayleigh).

4.5.2.6. Step 6: EDP
Select Engineering Demand Parameters (EDPs) to summarize response:
Peak Floor Acceleration (PFA)
Root Mean Square Acceleration (RMSA)
Peak Floor Displacement (PFD)
Peak Interstory Drift (PID)

4.5.2.7. Step 7: RV
Define distributions for structural and hydrodynamic RVs:
Structural
fc
: Normal (mean6
, stdev0.06
)fy
: Normal (mean60
, stdev0.6
)E
: Normal (mean30000
, stdev300
)
Hydrodynamic (incoming signal + mean level)
seaLevel
: Normal (mean0.0
, stdev0.25
)

4.5.3. Simulation
This workflow is intended for either local execution or remote execution to leverage near-real-time Celeris computation. Click RUN for local if you have a decently strong computer, or RUN at DesignSafe if you have a DesignSafe account and wish to use the Stampede3 supercomputer. When complete, the RES panel opens. Locally, the workflow will take from 30 to 120 minutes depending on your PC.
Warning
Keep recorder counts, export frequency, and sample size reasonable. Excessive export rates or too many recorders can dominate runtime and disk usage.
4.5.4. Analysis
Visualize time-series from event probes (e.g., wave-gauges, velocimeters, and load-sensors) by navigating to EVT
/ Wave Solver (Celeris)
/ Results
. Then set the Run Type
to Local
for local workflows and choose the simulation you wish to inspect by setting Simulation Number
between 1 and the number of samples you set in the UQ tab.

Coastline proximity: not especially predictive of demand at the school due to shielding by adjacent buildings.
River proximity: a significant hazard driver—channelized flow and reduced shielding increase local velocities and loads.
Sea-level rise: higher
seaLevel
shifts inundation extents and amplifies local flow depths/velocities along the river corridor more than along the coast-fronted school site.
Returning to our primary HydroUQ workflow, which concerns uncertainty in structural response, we may now view the final results in the RES tab. Clicking Summary
on the top-bar, a statistical summary of results is shown below:

Clicking Data Values
on the top-bar shows detailed histograms, cumulative distribution functions, and scatter plots relating the dependent and independent variables:
Note
In the Data Values tab, left- and right-click column headers to change plot axes; selecting a single column with both clicks displays frequency and CDF plots.



Note
Use consistent Froude similitude scaling when comparing numerical simulations, experiments, and full-scale scenarios. For cross-method comparisons, adopt identical structure footprints, friction models, probe placement, and other pertinent parameters to reduce bias.
For more advanced analysis, export results as a CSV file by clicking Save Table
on the upper-right of the application window. This will save the independent and dependent variable data. I.e., the Random Variables you defined and the Engineering Demand Parameters determined from the structural response per each simulation.
To save your simulation configuration with results included, click File
/ Save As
and specify a location for the HydroUQ JSON input file to be recorded to. You may then reload the file at a later time by clicking File
/ Open
. You may also send it to others by email or place it in an online repository for research reproducibility. This example’s input file is viewable at Reproducibility.
To directly share your simulation job and results in HydroUQ with other DesignSafe users, click GET from DesignSafe
. Then, navigate to the row with your job and right-click it. Select Share Job
. You may then enter the DesignSafe username or usernames (comma-separated) to share with.
Important
Sharing a job requires that the job was initially ran with an Archive System ID
(listed in the GET from DesignSafe
table’s columns) that is not designsafe.storage.default
. Any other Archive System ID
allows for sharing with DesignSafe members on the associated project. See Jobs for more details.
4.5.5. Conclusions
This town and its school, which is minority serving demographically, features notable tsunami risk despite being in a region not well-known for this hazard. Notably, proximity to the coastline was seen to not be especially relevant as other buildings provided shielding effects for the school, however, proximity to a river was a significant source of danger due to the local bathymetry and lack of impeding structures. If we were to further refine our model (both hydrodynamic and structural), it may provide actionable insights for this community. This is due to the advanced UQ-equipped engineering hazard workflow present in HydroUQ.
4.5.6. Reproducibility
Random seed(s):
1
(set in UQ)Model file:
Frame.tcl
App version: HydroUQ v4.2.0 (or current)
Wave solver: CelerisAi (as provided in NHERI-SimCenter/SimCenterBackendApplications)
System: Local Mac, Linux, and Windows, as well as TACC HPC clusters such as Stampede3.
Input: The HydroUQ input file is as follows: input.json , is used:
Click to expand the HydroUQ input file used for this example
1{
2 "Applications": {
3 "EDP": {
4 "Application": "StandardEDP",
5 "ApplicationData": {
6 }
7 },
8 "Events": [
9 {
10 "Application": "Celeris",
11 "ApplicationData": {
12 },
13 "EventClassification": "Hydro"
14 }
15 ],
16 "Modeling": {
17 "Application": "OpenSeesInput",
18 "ApplicationData": {
19 "fileName": "Frame.tcl",
20 "filePath": "{Current_Dir}/."
21 }
22 },
23 "Simulation": {
24 "Application": "OpenSees-Simulation",
25 "ApplicationData": {
26 }
27 },
28 "UQ": {
29 "Application": "Dakota-UQ",
30 "ApplicationData": {
31 }
32 }
33 },
34 "DefaultValues": {
35 "driverFile": "driver",
36 "edpFiles": [
37 "EDP.json"
38 ],
39 "filenameAIM": "AIM.json",
40 "filenameDL": "BIM.json",
41 "filenameEDP": "EDP.json",
42 "filenameEVENT": "EVENT.json",
43 "filenameSAM": "SAM.json",
44 "filenameSIM": "SIM.json",
45 "rvFiles": [
46 "AIM.json",
47 "SAM.json",
48 "EVENT.json",
49 "SIM.json"
50 ],
51 "workflowInput": "scInput.json",
52 "workflowOutput": "EDP.json"
53 },
54 "EDP": {
55 "type": "StandardEDP"
56 },
57 "Events": [
58 {
59 "Application": "Celeris",
60 "EventClassification": "Hydro",
61 "bathymetryFile": "bathy.txt",
62 "bathymetryFilePath": "{Current_Dir}/.",
63 "config": {
64 "Bcoef": 0.0666667,
65 "BoundaryWidth": 20,
66 "Courant_num": 0.1,
67 "HEIGHT": 750,
68 "NLSW_or_Bous": 1,
69 "NumberOfTimeSeries": 6,
70 "T_star_coef": 5,
71 "Theta": 2,
72 "WIDTH": 750,
73 "WaveType": -1,
74 "base_depth": 3,
75 "boundary_shift": 4,
76 "delta_breaking": 2,
77 "dissipation_threshold": 0.3,
78 "duration": 1250,
79 "dx": 3,
80 "dy": 3,
81 "dzdt_F_coef": 0.15,
82 "dzdt_I_coef": 0.5,
83 "east_boundary_type": 0,
84 "east_seaLevel": 0,
85 "force_sensor_begin": [
86 1239,
87 1785
88 ],
89 "force_sensor_end": [
90 1281,
91 1806
92 ],
93 "friction": 0.001,
94 "g": 9.80665,
95 "infiltrationRate": 0.001,
96 "isManning": 0,
97 "address": "Loiza, Puerto Rico",
98 "lat_LL": 18.4323008,
99 "lon_LL": -65.8780065,
100 "lat_UR": 18.4423008,
101 "lon_UR": -65.8680065,
102 "lat": 18.4323008,
103 "locationOfTimeSeries": [
104 {
105 "xts": 0,
106 "yts": 0
107 },
108 {
109 "xts": 500,
110 "yts": 500
111 },
112 {
113 "xts": 1000,
114 "yts": 1000
115 },
116 {
117 "xts": 1500,
118 "yts": 1400
119 },
120 {
121 "xts": 1236,
122 "yts": 1677
123 },
124 {
125 "xts": 1281,
126 "yts": 1797
127 }
128 ],
129 "lon": -65.8780065,
130 "north_boundary_type": 1,
131 "north_seaLevel": 0,
132 "seaLevel": "RV.seaLevel",
133 "sedC1_criticalshields": 0.045,
134 "sedC1_d50": 0.2,
135 "sedC1_denrat": 2.65,
136 "sedC1_n": 0.4,
137 "sedC1_psi": 5e-05,
138 "showBreaking": 1,
139 "significant_wave_height": 4,
140 "south_boundary_type": 2,
141 "south_seaLevel": 0,
142 "timeScheme": 2,
143 "tridiag_solve": 2,
144 "useBreakingModel": 1,
145 "useSedTransModel": 0,
146 "west_boundary_type": 2,
147 "west_seaLevel": 0,
148 "whiteWaterDecayRate": 0.1,
149 "whiteWaterDispersion": 0.1
150 },
151 "configFile": "config.json",
152 "configFilePath": "{Current_Dir}/.",
153 "subtype": "Celeris",
154 "type": "Celeris",
155 "waveFile": "waves.txt",
156 "waveFilePath": "{Current_Dir}/."
157 }
158 ],
159 "GeneralInformation": {
160 "NumberOfStories": 1,
161 "PlanArea": 129600,
162 "StructureType": "RM1",
163 "YearBuilt": 1990,
164 "depth": 360,
165 "height": 576,
166 "location": {
167 "latitude": 37.8715,
168 "longitude": -122.273
169 },
170 "name": "",
171 "planArea": 129600,
172 "stories": 1,
173 "units": {
174 "force": "kips",
175 "length": "in",
176 "temperature": "C",
177 "time": "sec"
178 },
179 "width": 360
180 },
181 "Modeling": {
182 "centroidNodes": [
183 1,
184 3
185 ],
186 "dampingRatio": 0.02,
187 "ndf": 3,
188 "ndm": 2,
189 "randomVar": [
190 {
191 "name": "fc",
192 "value": "RV.fc"
193 },
194 {
195 "name": "fy",
196 "value": "RV.fy"
197 },
198 {
199 "name": "E",
200 "value": "RV.E"
201 }
202 ],
203 "responseNodes": [
204 1,
205 3
206 ],
207 "type": "OpenSeesInput"
208 },
209 "Simulation": {
210 "Application": "OpenSees-Simulation",
211 "algorithm": "Newton",
212 "analysis": "Transient -numSubLevels 2 -numSubSteps 10",
213 "convergenceTest": "NormUnbalance 1.0e-2 10",
214 "dampingModel": "Rayleigh Damping",
215 "firstMode": 1,
216 "integration": "Newmark 0.5 0.25",
217 "modalRayleighTangentRatio": 0,
218 "numModesModal": -1,
219 "rayleighTangent": "Initial",
220 "secondMode": -1,
221 "solver": "Umfpack"
222 },
223 "UQ": {
224 "parallelExecution": false,
225 "samplingMethodData": {
226 "method": "LHS",
227 "samples": 1,
228 "seed": 1
229 },
230 "saveWorkDir": true,
231 "uqType": "Forward Propagation"
232 },
233 "correlationMatrix": [
234 1,
235 0,
236 0,
237 0,
238 0,
239 1,
240 0,
241 0,
242 0,
243 0,
244 1,
245 0,
246 0,
247 0,
248 0,
249 1
250 ],
251 "localAppDir": "/home/justinbonus/SimCenter/HydroUQ/build",
252 "randomVariables": [
253 {
254 "distribution": "Normal",
255 "inputType": "Parameters",
256 "mean": 6,
257 "name": "fc",
258 "refCount": 1,
259 "stdDev": 0.06,
260 "value": "RV.fc",
261 "variableClass": "Uncertain"
262 },
263 {
264 "distribution": "Normal",
265 "inputType": "Parameters",
266 "mean": 60,
267 "name": "fy",
268 "refCount": 1,
269 "stdDev": 0.6,
270 "value": "RV.fy",
271 "variableClass": "Uncertain"
272 },
273 {
274 "distribution": "Normal",
275 "inputType": "Parameters",
276 "mean": 30000,
277 "name": "E",
278 "refCount": 1,
279 "stdDev": 300,
280 "value": "RV.E",
281 "variableClass": "Uncertain"
282 },
283 {
284 "distribution": "Normal",
285 "inputType": "Parameters",
286 "mean": 0,
287 "name": "seaLevel",
288 "refCount": 1,
289 "stdDev": 0.25,
290 "value": "RV.seaLevel",
291 "variableClass": "Uncertain"
292 }
293 ],
294 "remoteAppDir": "/home/justinbonus/SimCenter/HydroUQ/build",
295 "resultType": "SimCenterUQResultsSampling",
296 "runType": "runningLocal",
297 "spreadsheet": {
298 "data": [
299 1,
300 5.987428929,
301 61.66113893,
302 30175.14172,
303 0.3737779393,
304 13.9508,
305 6.53392,
306 0.409945,
307 0.0438376,
308 0.258779,
309 0.0188354,
310 0.00179707,
311 0
312 ],
313 "headings": [
314 "Run #",
315 "fc",
316 "fy",
317 "E",
318 "seaLevel",
319 "1-PFA-1-1",
320 "1-PFA-1-2",
321 "1-RMSA-1-1",
322 "1-RMSA-1-2",
323 "1-PFD-1-1",
324 "1-PFD-1-2",
325 "1-PID-1-1",
326 "1-PID-1-2",
327 ""
328 ],
329 "isSurrogate": false,
330 "nrv": 4,
331 "numCol": 13,
332 "numRow": 1
333 },
334 "summary": [
335 {
336 "kurtosis": null,
337 "mean": 13.9508,
338 "name": "1-PFA-1-1",
339 "skewness": null,
340 "stdDev": 0
341 },
342 {
343 "kurtosis": null,
344 "mean": 6.53392,
345 "name": "1-PFA-1-2",
346 "skewness": null,
347 "stdDev": 0
348 },
349 {
350 "kurtosis": null,
351 "mean": 0.409945,
352 "name": "1-RMSA-1-1",
353 "skewness": null,
354 "stdDev": 0
355 },
356 {
357 "kurtosis": null,
358 "mean": 0.0438376,
359 "name": "1-RMSA-1-2",
360 "skewness": null,
361 "stdDev": 0
362 },
363 {
364 "kurtosis": null,
365 "mean": 0.258779,
366 "name": "1-PFD-1-1",
367 "skewness": null,
368 "stdDev": 0
369 },
370 {
371 "kurtosis": null,
372 "mean": 0.0188354,
373 "name": "1-PFD-1-2",
374 "skewness": null,
375 "stdDev": 0
376 },
377 {
378 "kurtosis": null,
379 "mean": 0.00179707,
380 "name": "1-PID-1-1",
381 "skewness": null,
382 "stdDev": 0
383 },
384 {
385 "kurtosis": null,
386 "mean": 0,
387 "name": "1-PID-1-2",
388 "skewness": null,
389 "stdDev": 0
390 }
391 ],
392 "workingDir": "/home/justinbonus/Documents/HydroUQ/LocalWorkDir"
393}