2D SWE: hyper-reduced Galerkin (example 1)#
ROM technique: Hyper-reduced Galerkin with gappy POD
problem: 2D shallow water equations (SWE)
Prerequisites#
A valid build of the tutorials, see here
The following env variables MUST be set:
export REPOSRC=<full-path-to-the-pressio-tutorials-source-repo>/end-to-end-roms export BUILDDIR=<full-path-to-where-you-built-the-tutorials>
To run the demo scripts below, you MUST be inside the correct directory:
cd $BUILDDIR/end-to-end-roms/2d_swe_galerkin_hypred_1
Workflow File#
The workflow file for this demo is shown below for exposition purposes, but it is automatically copied to the build directory, so you don’t need to do anything:
1problem: 2d_swe
2
3parameterSpace:
4 names: ['coriolis', 'pulsemag', 'gravity']
5 trainPoints:
6 0: [-1.0, 0.125, 9.8]
7 1: [ 0.0, 0.125, 9.8]
8 testPoints:
9 0: [-0.5, 0.125, 9.8]
10
11fom:
12 meshSize: [65, 65]
13 inviscidFluxReconstruction: "Weno3"
14 odeScheme: "RK4"
15 timeStepSize: 0.005
16 train:
17 finalTime: 5.0
18 stateSamplingFreq: 10
19 rhsSamplingFreq: 10
20 test:
21 finalTime: 5.0
22 stateSamplingFreq: 10
23 rhsSamplingFreq: 100
24
25offlineRom:
26 pod:
27 stateData:
28 useTrainingRuns: all
29 rhsData:
30 useTrainingRuns: all
31 sampleMesh:
32 random: 0.1
33
34onlineRom:
35 algorithm: hyperreducedGalerkin
36 podTruncation:
37 energyBased: [99.999, 99.99999]
Step 1: run FOMs#
python3 $REPOSRC/wf_foms.py --wf wf.yaml
The FOM stage is the same as here.
Step 2: offline rom#
python3 $REPOSRC/wf_offline_rom.py --wf wf.yaml
The offline rom takes care of using the FOM training data to compute the POD modes, computing samples meshes, and puts everything into an “offline_rom” subdirectory:
offline_rom/
├── pod_input.yaml
├── rhs_left_singular_vectors.bin
├── rhs_singular_values.txt
├── rhs_snapshots.bin
├── sample_mesh_random_0.100
├── state_left_singular_vectors.bin
├── state_singular_values.txt
└── state_snapshots.bin
Sample mesh#
In this demo, we use the sample mesh which is generated by keeping
randomly 10% of the mesh cells. The whole sample mesh is done by presssio-demoapps.
Note the generated sample mesh directory sample_mesh_random_0.100
.
We can visualize the sample mesh as follows (note that given its random nature,
your plot might look slightly different):
python3 $REPOSRC/../tpls/pressio-demoapps/meshing_scripts/plot_mesh.py \
--wdir ./offline_rom/sample_mesh_random_0.100/ -p show
which shows a plot like the following (yellow cells denote the “sample mesh”, white cells denote the “stencil mesh”):
Step 3: galerkin rom#
python3 $REPOSRC/wf_galerkin.py --wf wf.yaml
At the end, you should have the following directory structure:
.
├── CMakeFiles
├── Makefile
├── cmake_install.cmake
├── fom_mesh
├── fom_test_runid_0
├── fom_train_runid_0
├── fom_train_runid_1
├── hyperreduced_galerkin_truncation_energybased_99.99999_sample_mesh_random_0.100_runid_0
├── hyperreduced_galerkin_truncation_energybased_99.999_sample_mesh_random_0.100_runid_0
├── hyperreducer_99.99999_sample_mesh_random_0.100
├── hyperreducer_99.999_sample_mesh_random_0.100
├── offline_rom
├── plot.py
└── wf.yaml
Step 4: process results#
Accuracy#
# from within $BUILDDIR/end-to-end-roms/2d_swe_default_galerkin
python3 $REPOSRC/wf_reconstruct_on_full_mesh.py
python3 plot.py
Runtime comparison#
The results above show the accuracy, but we also want to assess the computational gain. Thanks to the sample mesh, the runtime of the ROMs are just a fraction of the FOM runtime. You can check this by doing
If you do tail -n 2 fom_*/out.log
, you see something as follows:
==> fom_test_runid_0/out.log <==
elapsed 6.71033
[info] [1806179] Finalizing pressio logger
==> fom_train_runid_0/out.log <==
elapsed 6.86063
[info] [1805967] Finalizing pressio logger
==> fom_train_runid_1/out.log <==
elapsed 6.75992
[info] [1806103] Finalizing pressio logger
Then do tail -n 2 hyperreduced_*/out.log
, you will see:
==> hyperreduced_galerkin_truncation_energybased_99.999_sample_mesh_random_0.100_runid_0/out.log <==
elapsed 0.854369
[info] [1812457] Finalizing pressio logger
==> hyperreduced_galerkin_truncation_energybased_99.99999_sample_mesh_random_0.100_runid_0/out.log <==
elapsed 1.01332
[info] [1812527] Finalizing pressio logger