Fourier-Accelerated Nodal Solver (FANS) is an FFT-based homogenization solver for microscale multiphysics problems. FANS is written in C++, built using CMake, and it has MPI parallelization.
Want to get started immediately?
FANS is available as a precompiled binary on conda-forge. Package managers such as conda, mamba, micromamba, and Pixi can be used to install FANS from the conda-forge channel.
Use Pixi (recommended):
# Install Pixi (if not already installed)
curl -fsSL https://pixi.sh/install.sh | sh
# Install FANS via Pixi
pixi global install fans
# Verify installation
FANS --versionThat's it! No dependencies to install, no compilation needed 🚀
To get started immediately, we include ready to use example input files and microstructures you can use as templates to create your own.
Recommended for: Developers, contributors, HPC users, or those needing custom builds.
FANS requires the following dependencies:
| Dependency | Purpose | |
|---|---|---|
| C++ Compiler | (GCC, Clang, etc.) | C++17 or newer |
| CMake | Build system | ≥ 3.21 |
| MPI | Parallel computing | (OpenMPI, MPICH, Intel MPI) |
| HDF5 | Data I/O | with MPI support |
| FFTW3 | FFT computations | with MPI support |
| Eigen3 | Linear algebra | ≥ 3.4 |
| nlohmann-json | JSON parsing | ≥ 3.11 |
Using Pixi (Cross-platform - Easiest for source builds)
This uses the repository's pixi.toml to define the dev environment.
# Clone the repository
git clone https://github.com/DataAnalyticsEngineering/FANS.git
cd FANS
# Enter development environment (all dependencies pre-installed!)
pixi shell -e devLinux (Debian/Ubuntu)
We recommend installing the dependencies using apt:
apt-get install -y \
build-essential \
cmake \
git \
file \
libhdf5-dev \
libhdf5-openmpi-dev \
libopenmpi-dev \
libeigen3-dev \
libfftw3-dev \
libfftw3-mpi-dev \
nlohmann-json3-devmacOS
We recommend installing the dependencies using brew:
brew install gnu-time cmake gcc@15
brew install open-mpi --build-from-source --cc=gcc-15
brew install hdf5-mpi --build-from-source --cc=gcc-15
brew install fftw eigen nlohmann-json
# Set environment variables
export CC=gcc-15 CXX=g++-15 MPICC=mpicc MPICXX=mpicxxUsing Spack (HPC environments)
Spack is a flexible package manager for building and managing software stacks in high-performance computing environments. Install Spack by following these installation instructions. Once Spack is set up, install the required dependencies:
spack install cmake
spack install mpi
spack install hdf5+cxx+mpi
spack install eigen
spack install fftw+mpi
spack install nlohmann-json
# Load dependencies
spack load cmake mpi hdf5 eigen fftw nlohmann-jsonAdditionally, optimized FFTW implementations can be used depending on your system's architecture:
- AMD systems:
spack install amdfftw+mpi - Cray systems:
spack install cray-fftw+mpi - Fujitsu systems:
spack install fujitsu-fftw+mpi
Docker images
Pre-configured Docker images are available for containerized deployments. See docker/README.md for further details.
# Clone the repository
git clone https://github.com/DataAnalyticsEngineering/FANS.git
cd FANS
# Create build directory
mkdir build && cd build
# Configure (basic)
cmake ..
# Build
cmake --build . -j
# Run tests with 8 mpi processes
cd ../test
./run_tests.sh -n 8Build options:
| CMake Option | Description | Default |
|---|---|---|
CMAKE_BUILD_TYPE |
Build type: Debug, Release, RelWithDebInfo |
NONE |
CMAKE_INTERPROCEDURAL_OPTIMIZATION |
Enable link-time optimization (LTO) | ON (if supported) |
FANS_BUILD_STATIC |
Build static library | OFF |
CMAKE_INSTALL_PREFIX |
Installation directory | System default |
FANS_LIBRARY_FOR_MICRO_MANAGER |
Build Python bindings using Pybind11 (needed) | OFF |
FANS_ENABLE_SANITIZERS |
Enable runtime sanitizers (AddressSanitizer and LeakSanitizer) for memory debugging | OFF |
FANS includes FANS_Dashboard.ipynb, a comprehensive pipeline for post-processing, visualization, and analysis of simulation results. We recommend setting up a Python virtual environment via Pixi with all required Python dependencies in an isolated environment:
# Install and activate the dashboard environment
pixi shell -e dashboardThe dashboard environment includes:
- Python
- Jupyter notebook (
ipykernel) - MSUtils for FANS-specific utilities
- Testing tools (
pytest) - Code quality tools (
pre-commit)
See FANS_Dashboard for further details.
FANS requires a JSON input file specifying the problem parameters. Example input files can be found in the test/input_files directory. It is recommended to use these files as a reference to create your input file.
"microstructure": {
"filepath": "microstructures/sphere32.h5",
"datasetname": "/sphere/32x32x32/ms",
"L": [1.0, 1.0, 1.0]
}-
filepath: This specifies the path to the HDF5 file that contains the microstructure data. -
datasetname: This is the path within the HDF5 file to the specific dataset that represents the microstructure. -
L: Microstructure length defines the physical dimensions of the microstructure in the$x$ ,$y$ , and$z$ directions.
"problem_type": "mechanical",
"matmodel": "LinearElasticIsotropic",
"strain_type": "small",
"material_properties": {
"bulk_modulus": [62.5000, 222.222],
"shear_modulus": [28.8462, 166.6667]
}-
problem_type: This defines the type of physical problem you are solving. Common options includethermalproblems andmechanicalproblems. -
matmodel: This specifies the material model to be used in the simulation. Examples include-
LinearThermalIsotropicfor linear isotropic conductive material model. -
LinearThermalTriclinicfor linear triclinic conductive material model. -
GBDiffusionfor diffusion model with transversely isotropic grain boundary and isotropic bulk for polycrystalline materials. -
LinearElasticIsotropicfor linear isotropic elastic material model. -
LinearElasticTriclinicfor linear triclinic elastic material model. -
PseudoPlasticLinearHardening/PseudoPlasticNonLinearHardeningfor plasticity mimicking model with linear/nonlinear hardening. -
J2ViscoPlastic_LinearIsotropicHardening/J2ViscoPlastic_NonLinearIsotropicHardeningfor rate-independent / dependent J2 plasticity model with kinematic and linear/nonlinear isotropic hardening. -
SaintVenantKirchhofffor the hyperelastic Saint Venant-Kirchhoff material model. -
CompressibleNeoHookeanfor the compressible Neo-Hookean material model.
-
-
strain_type: This indicates whether the problem is formulated using infinitesimal (small) strain or finite (large) strain theory. -
material_properties: This provides the necessary material parameters for the chosen material model. For thermal problems, you might specifyconductivity, while mechanical problems might requirebulk_modulus,shear_modulus, and more properties for advanced material models. These properties can be defined as arrays to represent multiple phases within the microstructure.
"FE_type": "HEX8",
"method": "cg",
"error_parameters":{
"measure": "Linfinity",
"type": "absolute",
"tolerance": 1e-10
},
"n_it": 100,-
FE_type: This specifies the type of finite element to be used. Common options include:-
HEX8: Standard trilinear hexahedral elements with full integration (8 Gauss points). Suitable for most problems but may exhibit volumetric locking for nearly incompressible materials (Poisson's ratio ~ 0.5). -
BBAR: B-bar elements with selective reduced integration to mitigate volumetric locking. Recommended for materials with high Poisson's ratios (0.4 to 0.5). -
HEX8R: Reduced integration elements with a single Gauss point at the element center. Use with caution—these may produce less accurate field results and can cause local material issues such as negative Jacobian ($J < 0$ ), leading to nonphysical solutions (hourglassing).
-
-
method: This indicates the numerical method to be used for solving the system of equations.cgstands for the Conjugate Gradient method, andfpstands for the Fixed Point method. -
error_parameters: This section defines the error parameters for the solver. Error control is applied to the finite element nodal residual of the problem.-
measure: Specifies the norm used to measure the error. Options includeLinfinity,L1, orL2. -
type: Defines the type of error measurement. Options areabsoluteorrelative. -
tolerance: Sets the tolerance level for the solver, defining the convergence criterion based on the chosen error measure. The solver iterates until the solution meets this tolerance.
-
-
n_it: Specifies the maximum number of iterations allowed for the FANS solver.
"macroscale_loading": [
[
[0.004, -0.002, -0.002, 0, 0, 0],
[0.008, -0.004, -0.004, 0, 0, 0],
[0.012, -0.006, -0.006, 0, 0, 0],
[0.016, -0.008, -0.008, 0, 0, 0],
],
[
[0, 0, 0, 0.002, 0, 0],
[0, 0, 0, 0.004, 0, 0],
[0, 0, 0, 0.006, 0, 0],
[0, 0, 0, 0.008, 0, 0],
]
],-
macroscale_loading: This defines the external loading applied to the microstructure. It is an array of arrays, where each sub-array represents a load path applied to the system. The format of the load path depends on the problem type:- For
thermalproblems, the array typically has 3 components, representing the macroscale temperature gradients in the$x$ ,$y$ , and$z$ directions. - For
smallstrainmechanicalproblems, the array must have 6 components, corresponding to the macroscale strain tensor in Mandel notation:$[\varepsilon_{11},\ \varepsilon_{22},\ \varepsilon_{33},\ \sqrt{2},\varepsilon_{12},\ \sqrt{2},\varepsilon_{13},\ \sqrt{2},\varepsilon_{23}]$ . - For
largestrainmechanicalproblems, the array must have 9 components, corresponding to the macroscale deformation gradient tensor:$[F_{11},\ F_{12},\ F_{13},\ F_{21},\ F_{22},\ F_{23},\ F_{31},\ F_{32},\ F_{33}]$ .
- For
In the case of path/time-dependent loading, as shown, for example, in plasticity problems, the macroscale_loading array can include multiple steps with corresponding loading conditions.
FANS also supports mixed boundary conditions, where some components can be strain-controlled while others are stress-controlled:
"macroscale_loading": [{
"strain_indices" : [2,3,4,5],
"stress_indices" : [0,1],
"strain" : [[0.005 , 0.0, 0.0, 0.0],
[0.010 , 0.0, 0.0, 0.0]],
"stress" : [[0.0, 0.0],
[0.0, 0.0]]
}]"results": ["stress_average", "strain_average", "absolute_error", "phase_stress_average", "phase_strain_average",
"microstructure", "displacement", "displacement_fluctuation", "stress", "strain"]-
results: This array lists the quantities that should be stored in the results HDF5 file during the simulation. Each string in the array corresponds to a specific result:stress_averageandstrain_average: Volume averaged- homogenized stress and strain over the entire microstructure.absolute_error: The L-infinity error of the finite element nodal residual at each iteration.phase_stress_averageandphase_strain_average: Volume averaged- homogenized stress and strain for each phase within the microstructure.microstructure: The original microstructure data.displacement: The displacement field (for mechanical problems) and temperature field (for thermal problems) at each voxel in the microstructure.displacement_fluctuation: The periodic displacement fluctuation field (for mechanical problems) and periodic temperature fluctuation field (for thermal problems at each voxel in the microstructure).stressandstrain: The stress and strain fields at each voxel in the microstructure.
-
Additional material model-specific results can be included depending on the problem type and material model.
Funded by Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany’s Excellence Strategy - EXC 2075 – 390740016. Contributions by Felix Fritzen are funded by Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) within the Heisenberg program - DFG-FR2702/8 - 406068690; DFG-FR2702/10 - 517847245 and through NFDI-MatWerk - NFDI 38/1 - 460247524. We acknowledge the support of the Stuttgart Center for Simulation Science (SimTech).
