2D SWE: hyper-reduced LSPG (example 1)#

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_lspg_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: "BDF1"
15  timeStepSize: 0.01
16  nonlinearSolverName: NewtonRaphson
17  nonlinearSolverTolerance: 1e-6
18  train:
19    finalTime: 5.0
20    stateSamplingFreq: 10
21  test:
22    finalTime: 5.0
23    stateSamplingFreq: 10
24
25offlineRom:
26  pod:
27    stateData:
28      useTrainingRuns: all
29  sampleMesh:
30    random: 0.1
31
32onlineRom:
33  algorithm: hyperreducedLspg
34  nonlinearSolverName: GaussNewton
35  nonlinearSolverTolerance: 1e-6
36  podTruncation:
37    energyBased: [99.999, 99.99999]

Step 1: execute FOMs#

The FOM stage is the same as here.

# from within $BUILDDIR/end-to-end-roms/2d_swe_lspg_hypred_1
python3 $REPOSRC/wf_foms.py --wf wf.yaml

Warning

This might take a few mins to run, be patient!

Step 2: offline rom#

# from within $BUILDDIR/end-to-end-roms/2d_swe_lspg_hypred_1
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
├── 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”):

Sample mesh

Step 3: lspg rom#

# from within $BUILDDIR/end-to-end-roms/2d_swe_lspg_hypred_1
python3 $REPOSRC/wf_lspg.py --wf wf.yaml

At the end, you should have the following directory structure:

.
├── CMakeFiles
├── Makefile
├── cmake_install.cmake
├── hyperreduced_lspg_truncation_energybased_99.99999_runid_0
├── hyperreduced_lspg_truncation_energybased_99.999_runid_0
├── fom_mesh
├── fom_test_runid_0
├── fom_train_runid_0
├── fom_train_runid_1
├── offline_rom
├── plot.py
└── wf.yaml

Step 4: process results#

Accuracy#

# from within $BUILDDIR/end-to-end-roms/2d_swe_lspg_hypred_1
python3 $REPOSRC/wf_reconstruct_on_full_mesh.py
python3 plot.py
FOM ROM, 22 modes ROM, 55 modes

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 102.308
[info] [1136219] Finalizing pressio logger

==> fom_train_runid_0/out.log <==
elapsed 99.1657
[info] [1133529] Finalizing pressio logger

==> fom_train_runid_1/out.log <==
elapsed 99.8976
[info] [1134515] Finalizing pressio logger

Then do tail -n 2 hyperreduced_*/out.log, you should see something as:

==> hyperreduced_lspg_truncation_energybased_99.999_sample_mesh_random_0.100_runid_0/out.log <==
elapsed 5.53887
[info] [1138950] Finalizing pressio logger

==> hyperreduced_lspg_truncation_energybased_99.99999_sample_mesh_random_0.100_runid_0/out.log <==
elapsed 6.52652
[info] [1139027] Finalizing pressio logger