Project Components#
Submodule Map#
Module |
Purpose |
Language |
Stability |
|---|---|---|---|
|
Symbolic models, FVM numerics, mesh hierarchy, code generators |
Python |
Stable |
|
JAX-accelerated solvers, JIT compilation |
Python |
Evolving |
|
Web-based GUI (static site), cards, sessions, Pyodide execution |
JS/HTML/CSS/Python |
Active |
|
Command-line interface (mirrors GUI workflow) |
Node.js |
Active |
|
FastAPI backend, solver adapters, job management, card registry |
Python |
Active |
|
Mesh format converters (HDF5, Gmsh) |
Python |
Stable |
|
PETSc/DMPlex backend (C++ codegen, MPI) |
Python/C++ |
Stable |
|
AMReX backend (C++ codegen, AMR) |
Python/C++ |
Stable |
|
Firedrake/FEniCSx backends (UFL, DG) |
Python |
Stable |
|
Lightweight HTTP client for server API |
Python |
Minimal |
|
OpenFOAM code generation |
Python |
Stable |
|
JavaScript utilities (shared) |
JS |
Minimal |
|
Shared test infrastructure |
Python |
Stable |
Server Adapter Pattern#
Each solver backend implements the SolverAdapter interface:
class SolverAdapter:
tag = "numpy" # identifier for backend routing
def solve(self, case_dir, output_dir, on_progress):
"""Run simulation from case folder to output folder."""
# 1. Execute mesh.py (optional preprocessing)
# 2. Load model from model.py
# 3. Load mesh from case files
# 4. Create solver and run
# 5. Write results to output_dir/simulation.h5
# 6. Report progress via on_progress(iteration, time, dt)
Case folder format (what adapters receive):
case_dir/
model.py Python file defining `model` instance
numerics.py Optional: numerical scheme configuration
mesh.py Optional: preprocessing script (generates mesh)
settings.json Solver parameters (time_end, cfl, output_snapshots)
mesh.h5 / mesh.msh Mesh file (from mesh.py or pre-existing)
Job lifecycle:
Client POSTs to
/api/v1/jobswith case dataServer creates job ID, spawns worker in process pool
Worker calls
adapter.solve(case_dir, output_dir, on_progress)Client polls
GET /api/v1/jobs/{id}for statusOn completion, results available at
/api/v1/jobs/{id}/results/hdf5