# flatironinstitute/finufft architecture

> Architecture diagram of the GitHub repository flatironinstitute/finufft, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/flatironinstitute/finufft
- Repository: https://github.com/flatironinstitute/finufft

## Overview

FINUFFT is a C++ library for CPU and CUDA nonuniform Fourier transforms in 1–3 dimensions, exposed through C, Python, Fortran, and MATLAB interfaces. The principal workflow is to create a transform plan, supply nonuniform points, then execute a type 1, 2, or 3 transform to produce output. The graph shows documented and sampled interface-to-runtime relationships; some internal dispatch details and unsampled language bindings are represented only at subsystem level.

Main entry points: [`src/c_interface.cpp`](https://github.com/flatironinstitute/finufft/blob/master/src/c_interface.cpp) (CPU C API), [`include/cufinufft/cufinufft_plan_t.hpp`](https://github.com/flatironinstitute/finufft/blob/master/include/cufinufft/cufinufft_plan_t.hpp) (CUDA plan), [`src/execute.cpp`](https://github.com/flatironinstitute/finufft/blob/master/src/execute.cpp) (Transform execution), [`src/makeplan.cpp`](https://github.com/flatironinstitute/finufft/blob/master/src/makeplan.cpp) (Plan creation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cpu["CPU runtime"]
  node_capi["CPU C API<br/>[c_interface.cpp]"]
  node_plan["Plan creation<br/>[makeplan.cpp]"]
  node_points["Point setup<br/>[setpts.cpp]"]
  node_execute["Transform execution<br/>[execute.cpp]"]
  node_spread["Spread and interpolate<br/>[spreadinterp.cpp]"]
  node_kernels["Kernel utilities<br/>[kernel.cpp]"]
  node_fft["FFT planning<br/>[fft.cpp]"]
end

subgraph group_gpu["CUDA runtime"]
  node_cudaapi["CUDA C API<br/>[c_interface.cpp]"]
  node_cudaplan["CUDA plan"]
  node_cudaspread["CUDA spread and interp<br/>[spreadinterp.cpp]"]
end

subgraph group_bindings["Language interfaces"]
  node_py["Python API<br/>[_interfaces.py]"]
  node_fortran["Fortran API<br/>[finufftfort.cpp]"]
  node_matlab["MATLAB API<br/>[finufft.cpp]"]
end

subgraph group_external["Compute dependencies"]
  node_cufft["cuFFT"]
end

node_user(("Transform caller"))
node_result["Transform output"]

node_user -->|"calls"| node_py
node_user -->|"calls"| node_fortran
node_user -->|"calls"| node_matlab
node_user -->|"calls"| node_capi
node_user -->|"calls"| node_cudaapi
node_py -->|"calls native API"| node_capi
node_fortran -->|"calls"| node_capi
node_matlab -->|"calls"| node_capi
node_capi -->|"creates plan"| node_plan
node_capi -->|"sets points"| node_points
node_capi -->|"executes plan"| node_execute
node_plan -->|"initializes FFT"| node_fft
node_execute -->|"runs spreading"| node_spread
node_spread -->|"uses kernels"| node_kernels
node_cudaapi -->|"creates and runs plan"| node_cudaplan
node_cudaplan -->|"dispatches spreading"| node_cudaspread
node_cudaplan -->|"uses FFT"| node_cufft
node_execute -->|"writes output"| node_result
node_cudaplan -->|"writes output"| node_result

click node_py "https://github.com/flatironinstitute/finufft/blob/master/python/finufft/finufft/_interfaces.py"
click node_fortran "https://github.com/flatironinstitute/finufft/blob/master/fortran/finufftfort.cpp"
click node_matlab "https://github.com/flatironinstitute/finufft/blob/master/matlab/finufft.cpp"
click node_capi "https://github.com/flatironinstitute/finufft/blob/master/src/c_interface.cpp"
click node_plan "https://github.com/flatironinstitute/finufft/blob/master/src/makeplan.cpp"
click node_points "https://github.com/flatironinstitute/finufft/blob/master/src/setpts.cpp"
click node_execute "https://github.com/flatironinstitute/finufft/blob/master/src/execute.cpp"
click node_spread "https://github.com/flatironinstitute/finufft/blob/master/src/spreadinterp.cpp"
click node_kernels "https://github.com/flatironinstitute/finufft/blob/master/src/common/kernel.cpp"
click node_fft "https://github.com/flatironinstitute/finufft/blob/master/src/fft.cpp"
click node_cudaapi "https://github.com/flatironinstitute/finufft/blob/master/src/cuda/c_interface.cpp"
click node_cudaplan "https://github.com/flatironinstitute/finufft/blob/master/include/cufinufft/cufinufft_plan_t.hpp"
click node_cudaspread "https://github.com/flatironinstitute/finufft/blob/master/src/cuda/spreadinterp.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_capi,node_plan,node_points,node_execute,node_spread,node_kernels,node_fft toneBlue
class node_cudaapi,node_cudaplan,node_cudaspread toneAmber
class node_py,node_fortran,node_matlab toneMint
class node_cufft toneRose
class node_user,node_result toneIndigo
```

## Components

### CPU runtime

- [CPU C API](https://github.com/flatironinstitute/finufft/blob/master/src/c_interface.cpp): `src/c_interface.cpp`
- [Plan creation](https://github.com/flatironinstitute/finufft/blob/master/src/makeplan.cpp): `src/makeplan.cpp`
- [Point setup](https://github.com/flatironinstitute/finufft/blob/master/src/setpts.cpp): `src/setpts.cpp`
- [Transform execution](https://github.com/flatironinstitute/finufft/blob/master/src/execute.cpp): `src/execute.cpp`
- [Spread and interpolate](https://github.com/flatironinstitute/finufft/blob/master/src/spreadinterp.cpp): `src/spreadinterp.cpp`
- [Kernel utilities](https://github.com/flatironinstitute/finufft/blob/master/src/common/kernel.cpp): `src/common/kernel.cpp`
- [FFT planning](https://github.com/flatironinstitute/finufft/blob/master/src/fft.cpp): `src/fft.cpp`

### CUDA runtime

- [CUDA C API](https://github.com/flatironinstitute/finufft/blob/master/src/cuda/c_interface.cpp): `src/cuda/c_interface.cpp`
- [CUDA plan](https://github.com/flatironinstitute/finufft/blob/master/include/cufinufft/cufinufft_plan_t.hpp): `include/cufinufft/cufinufft_plan_t.hpp`
- [CUDA spread and interp](https://github.com/flatironinstitute/finufft/blob/master/src/cuda/spreadinterp.cpp): `src/cuda/spreadinterp.cpp`

### Language interfaces

- [Python API](https://github.com/flatironinstitute/finufft/blob/master/python/finufft/finufft/_interfaces.py): `python/finufft/finufft/_interfaces.py`
- [Fortran API](https://github.com/flatironinstitute/finufft/blob/master/fortran/finufftfort.cpp): `fortran/finufftfort.cpp`
- [MATLAB API](https://github.com/flatironinstitute/finufft/blob/master/matlab/finufft.cpp): `matlab/finufft.cpp`

### Compute dependencies

- **cuFFT**

### Other components

- **Transform caller**
- **Transform output**

## Connections

- Transform caller → Python API: calls
- Transform caller → Fortran API: calls
- Transform caller → MATLAB API: calls
- Transform caller → CPU C API: calls
- Transform caller → CUDA C API: calls
- Python API → CPU C API: calls native API
- Fortran API → CPU C API: calls
- MATLAB API → CPU C API: calls
- CPU C API → Plan creation: creates plan
- CPU C API → Point setup: sets points
- CPU C API → Transform execution: executes plan
- Plan creation → FFT planning: initializes FFT
- Transform execution → Spread and interpolate: runs spreading
- Spread and interpolate → Kernel utilities: uses kernels
- CUDA C API → CUDA plan: creates and runs plan
- CUDA plan → CUDA spread and interp: dispatches spreading
- CUDA plan → cuFFT: uses FFT
- Transform execution → Transform output: writes output
- CUDA plan → Transform output: writes output
