@simzero/rom
v1.1.0
Published
A JS module for the online stage of ROM
Downloads
14
Readme
rom.js
rom.js
is a JavaScript port for solving the online stage of reduced-order model (ROM) and visualizing the outputs on the web. The current version uses OpenFOAM and ITHACA-FV for generating the CFD snapshots and the ROM.
rom.js
is used in http://cfd.xyz, check the website and the code at cfd.xyz GitHub.
This is a beta version, please handle it with care. Further features, optimizations and fixes are expected.
Usage
This module can be directly installed with:
npm install --save @simzero/rom
The standalone-templates directory contains instructions and examples for using the module and generating CFD results with the available ROMs. Alternatively, the module and ROMs can be built and tested following the instructions described in Option 1 and Option 2.
A minimal example for steady-state cases can be found in standalone-templates/steady.mjs. The main parts of this code are shown below:
import rom from '@simzero/rom'
import Papa from 'papaparse'
import fs from 'fs'
import yargs from 'yargs'
// - Defining functions and configuration
...
(async () => {
await rom.ready
// - Loading ROM data (e.g. generated with the steady app)
...
// - Defining reducedSteady
const reduced = new rom.reducedSteady(nPhiU + nPhiP, nPhiU + nPhiP);
// - Setting up grid and ROM data
reduced.stabilization(argv.stabilization);
reduced.nPhiU(nPhiU);
reduced.nPhiP(nPhiP);
reduced.nPhiNut(nPhiNut);
reduced.nRuns(nRuns);
reduced.nBC(nBC);
reduced.readUnstructuredGrid(gridData);
reduced.initialize();
reduced.K().set(KData[0]);
reduced.B().set(BData[0]);
reduced.P().set(PData[0]);
reduced.modes().set(modesData[0]);
reduced.coeffL2().set(coeffL2Data[0]);
reduced.mu().set(muData[0]);
// - Loading turbulent related matrices and weights
for (var i = 0; i < nPhiU; i ++ ){
// - Loading data
...
reduced.C().set(CData[0]);
reduced.addCMatrix();
reduced.Ct1().set(Ct1Data[0]);
reduced.addCt1Matrix();
reduced.Ct2().set(Ct2Data[0]);
reduced.addCt2Matrix();
}
for (var i = 0; i < nPhiNut; i ++ ){
// - Loading data
...
reduced.weights().set(weightsData[0]);
reduced.addWeights();
}
reduced.setRBF();
// - Defining viscosity and solving for the given velocity
reduced.nu(argv.nu);
reduced.solveOnline(argv.Ux, argv.Uy);
// - Reconstructing data from Eigen to VTK and exporting the grid
reduced.reconstruct();
const dataString = reduced.exportUnstructuredGrid();
// - Saving the VTK file
const outputFile = 'U_' + U + '_nu_' + nu + '.vtu';
fs.writeFileSync(outputFile, dataString);
reduced.delete();
})();
Performance
The module has been tested in the following devices:
| Label | OS | CPU | RAM | | ------------------ | -------------------- | ----------------------------------------- | ------------------------ | | Raspberry Pi 3 | Raspberry Pi OS 10.0 | ARM Cortex-A53 @ 1.2 GHz (armv7l) | 1 GB LPDDR2 SRDRAM | | Low-end smartphone | Android 11 | ARM Cortex-A73 @ 1.8 GHz (armv8) | 2x2 GB LPDDR4 @ 1.86 GHZ | | Windows laptop | MS Windows 11 Home | Intel® Core™ i7-11370H @ 3.3 GHz (x86_64) | 2x8 GB DDR4 @ 3200 MHz | | Linux laptop | Ubuntu 22.04 | Intel® Core™ i7-1165G7 @ 2.8 GHz (x86_64) | 2x8 GB DDR4 @ 3200 MHz | | Workstation | Ubuntu 22.04 | AMD Ryzen 9 5950X @ 3.4 GHz (x86_64) | 2x32 GB DDR4 @ 3200 MHz |
The calculation for one set of parameters for the different models was tested on these devices obtaining the following results:
Accuracy
TODO: We will soon display accuracy of the surrogate models for the considered parametric space. In the meanwhile please check the results on the OFJ techcnical note forpitzDaily
.
Option 1 Building and testing with Docker as the only requirement
This is the preferred and easiest method for working with this repository.
The rom-js Docker image contains all the configuration and required third-party libraries for: 1) building the JavaScript module, 2) running OpenFOAM and 3) generating the ROM data using ITHACA-FV. The following versions are included in the image:
- Emscripten 3.1.1
- npm 8.5.3
- node v14.18.2
- Splinter v3.0 (compiled with emcc)
- Eigen v3.4.0 (compiled with emcc)
- VTK v9.1 (compiled with emcc)
- OpenFOAM v2106
- ITHACA-FV 3.0 (@carpemonf fork)
Requirements
- Docker 20.10.12
Building
The node version of the module can be executed outside a web browser with a back-end JavaScript runtime environment (Node.js). The following command builds both the node and browser version of the module:
make all
Generating the ROM data
The CFD snapshots are generated directly with OpenFOAM and later used in ITHACA-FV for generating the ROM. This results in hundreds of simulation executions and multiple GB of data. You can skip running this step by directly downloading the ROM data into the surrogates
folder with:
make data
Alternatively, You can also create the ROM data by yourself. Single core simulations are run in parallel in batches with the number of cores set by the CORES
variable:
CORES=8 make rom
The snasphots will be generated at ITHACAoutput/Offline
with ITHACAoutput/Parameters
showing the coressponding parameters for every folder in ITHACAoutput/Offline
. The ITHACAoutput/Reconstruction
contains folders for the online stage for the selected parameters. All the ROM data wil be collected in the surrogates
folder.
Using the ROM
Once that you have the surrogates you can cd into an example and test the rom.js
module. For example:
cd examples/OpenFOAM/incompressible/simpleFoam/pitzDaily
./run-online.sh
Option 2 Building and testing by natively building the third-party libraries
This option compiles Emscripten versions of Splinter, Eigen and VTK. OpenFOAM and ITHACA-FV are also compiled.
Requirements
- Docker 20.10.12
- npm 6.14.11
- node v14.15.5
Note: Docker is only used for compiling with Emscripten.
Building
Initialize the third-party submodules with:
git submodule update --init --recursive
A local installation of ITHACA-FV (@carpemonf fork) and OpenFOAM (v2106) is needed. You can use your local versions and skip this step and jump to Generating the ROM data.
Check system requirements for OpenFOAM and ITHACA-FV and run:
make native-thirdparty
Ported code need to be also compiled before building the final rom.js
module with:
make native-thirdparty-emcc
Install the package dependencies:
make native-install
For building the rom.js
module run:
make native-build
Generating the ROM data with native OpenFOAM and ITHACA-FV
The CFD snapshots are generated directly with OpenFOAM and later used in ITHACA-FV for generating the ROM. This results in hundreds of simulation executions and multiple GB of data. You can skip running this step by directly downloading the ROM data into the surrogates
folder with:
make native-data
Alternatively, You can also create the ROM data by yourself. Single core simulations are run in parallel in batches with the number of cores set by the CORES
variable:
CORES=8 make native-rom
If you have your own installation of ITHACA-FV (@carpemonf fork) and OpenFOAM (v2106), just set up the environment and run:
cd examples && ./Allrun 8
The snasphots will be generated at ITHACAoutput/Offline
with ITHACAoutput/Parameters
showing the coressponding parameters for every folder in ITHACAoutput/Offline
. The ITHACAoutput/Reconstruction
contains folders for the online stage for the selected parameters. All the ROM data wil be collected in the surrogates
folder.
Using the ROM
Once that you have the surrogates you can cd into an example and test the rom.js
module. For example:
cd examples/OpenFOAM/incompressible/simpleFoam/pitzDaily
./run-online.sh
Contributing
Everyone is welcome to contribute to this project. See CONTRIBUTING.md for further details.
Your donations encourage future developments and help with server costs for providing a better service. If you like the tool you can :heart: donate.
Citation
- Article published in the OpenFOAM® Journal:
@article{Pena-Monferrer_Diaz-Marin_2022,
author={Peña-Monferrer, Carlos and Diaz-Marin, Carmen},
title={rom.js/cfd.xyz: An open-source framework for generating and visualizing parametric {CFD} results},
journal={OpenFOAM® Journal},
volume={2},
month={Oct.},
pages={143–148}
DOI={10.51560/ofj.v2.83},
url={https://journal.openfoam.com/index.php/ofj/article/view/83},
year={2022},
}
- Repository:
@online{rom_js_repo_2022,
author={{SIMZERO}},
title={{rom.js}},
howpublished={\url{https://github.com/simzero-oss/rom-js}},
addendum="(accessed: 28.04.2022)",
}