SNaC is CaNS spelled backwards, and is a multi-block code for massively parallel direct numerical simulations (DNS) of fluid flows. SNaC aims at combining the versatility of a multi-block DNS solver, with the FFT-based acceleration used in CaNS.
The solver is able to simulate the flow in any three-dimensional multi-block structured Cartesian grid. However, if the geometry has one homogeneous, 'extruded' direction with constant grid spacing, SNaC can use a very fast solver that exploits FFTs in this direction. This is SNaC's warp drive 🚀, as it yields a huge speedup in wall-clock time per time step.
Reference
P. Costa. A FFT-accelerated multi-block finite-difference solver for massively parallel simulations of incompressible flows. Comput. Phys. Commun. 271 : 108194 (2022) [DOI:10.1016/j.cpc.2021.108194] [arXiv:2106.03583].
Some features are:
- Multi-block, three-dimensional parallelization
- Hybrid MPI/OpenMP parallelization
- FFT-based synthesis of the Poissonn equation along one direction
- HYPRE library used to solve Poisson/Helmholtz equations
- Parallel I/O using MPI I/O
- A different canonical flow can be simulated just by changing the input files
SNaC is meant to serve as a multi-block DNS code for fast, massively-parallel simulations of single-phase flows, and as a solid base solver on top of which more complex phenomena can be implemented, such as numerical methods for multiphase flows.
The fluid flow is solved with a standard second-order finite-difference/-volume pressure correction scheme. Time is advanced with a three-step low storage Runge-Kutta scheme. Optionally, for increased stability at low Reynolds numbers, at the price of higher computational demand, the diffusion term can be treated implicitly.
The input files dns.in
sets the physical and computational parameters, while the block files geo/block.???
setup block-specific parameters. In the examples/
folder are examples of input files for several canonical flows. See src/INFO_INPUT.md
for a detailed description of the input files.
Files out1d.h90
, out2d.h90
and out3d.h90
in src/
set which data are written in 1-, 2-, and 3-dimensional output files, respectively. The code should be recompiled after editing out?d.h90 files.
The code should be compiled in src/
. The prerequisites are the following:
- MPI
- HYPRE
- OpenMP (optional)
- FFTW (optional, in case FFT acceleration is used)
The Makefile in src/
should be modified in agreement to the installation paths of each library. Also, the following preprocessor options are available:
-D_TIMING
: wall-clock time per time step is computed-D_IMPDIFF
: diffusion term of the N-S equations is integrated in time with an implicit discretization (thereby improving the stability of the numerical algorithm for viscous-dominated flows)-D_SINGLE_PRECISION
: calculation will be carried out in single precision (the default precision is double)-D_FFT_?
, with?
beingX
,Y
orZ
: will use FFTs to solve the Poisson equation in the direction in question.
Typing make run
will compile the code and copy the executable snac
and input file dns.in
to a run/
folder.
Run the executable with mpirun
with a number of tasks and shared threads complying to what has been set in the input file dns.in
(or in the geo/block.???
files in case of multi-block). Data will be written by default in a folder named data/
, which must be located where the executable is run.
See src/INFO_VISU.md
.
I appreciate any feedback that can improve the code. Also, feel free to send case files pertaining to flows not listed in the examples folder.
Please read the LICENSE
file.
Pedro Costa ([email protected])