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