Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Fullwave 2.5: Ultrasound wave propagation simulation with heterogeneous power law attenuation modelling capabilities

DOI PyPI Downloads

Open In Colab

Fullwave 2.5 is a Python package for high-fidelity ultrasound wave propagation simulation with the following features:

  • State-of-the-art attenuation modelling capabilities for ultrasound wave propagation in complex biological tissues
    • Heterogeneous power law attenuation ($\alpha=\alpha_0 f^\gamma$) modeling, where both the attenuation coefficient $\alpha_0$ and exponent $\gamma$ can vary spatially.
  • High-performance simulation engine
    • High accuracy staggered-grid finite-difference time-domain (FDTD) scheme (8th-order in space and 4th-order in time).
    • 2D and 3D ultrasound wave propagation simulation.
    • Multiple GPU execution support.
  • Easy-to-use Python interface with CUDA/C backend
    • Python wrapper for easy usability and extensibility, with the core simulation engine implemented in CUDA/C for high performance on NVIDIA GPUs.
    • It offers a user experience similar to k-Wave and k-wave-python, while providing advanced attenuation modeling capabilities and multi-GPU support in FDTD simulations.
Computational medium Wave propagation

Building upon the original Fullwave 2 simulator, Fullwave 2.5 enhances its capabilities to model ultrasound wave propagation in media where both the attenuation coefficient and exponent can vary spatially. This enables more accurate simulations of biological tissues, which often exhibit complex attenuation behaviours that cannot be captured by uniform exponent models.

The library is designed with a Python wrapper for ease of use and extensibility, while the core simulation engine is implemented in CUDA/C to leverage high-performance computing on NVIDIA GPUs. Fullwave 2.5 supports 2D and 3D simulations, including multi-GPU execution for enhanced performance.

Special Thanks

This repository design was inspired by k-wave-python. We appreciate the great work of the k-wave-python development team. This repository would not have been possible without them.

Please check their repository for additional ultrasound simulation tools and resources. Their comprehensive tools have significantly contributed to the ultrasound research community.

Theoretical Background

Fullwave 2.5 models multiple relaxation processes to approximate frequency-dependent power-law attenuation in heterogeneous media. It solves the stretched-coordinate pressure-velocity formulation using a staggered-grid finite-difference schemes with 8th-order accuracy in space and 4th-order accuracy in time. The formulation is expressed as follows:

$$\nabla_1 p + \rho \cfrac{\partial {\bf{v}}}{\partial t} = 0$$ $$\nabla_2 \cdot {\bf{v}} + \kappa \cfrac{\partial p}{\partial t} = 0$$

The stretched-coordinate derivatives, denoted by $\nabla_1$ and $\nabla_2$, control frequency-dependent power-law attenuation and dispersion by selecting the optimal relaxation parameters.

The following figure illustrates the performance of the attenuation modeling in Fullwave 2.5. The graph shows a comparison of the target power-law attenuation $\alpha=\alpha_0 f^\gamma$ (red line) and the simulated attenuation (black dots) for various spatially varying attenuation coefficients ($\alpha_0 =$ 0.25, 0.5, and 0.75) and exponents ($\gamma =$ 0.4, 0.7, 1.0, 1.3, and 1.6).

attenuation modeling performance

Citation

Fullwave 2.5 is developed and maintained by Pinton Lab at the University of North Carolina at Chapel Hill.

If you use Fullwave 2.5 in your research, please cite this repository as:

@software{Sode2025-fullwave25,
  author = {Sode, Masashi and Pinton, Gianmarco},
  title = {{Fullwave 2.5: Ultrasound wave propagation simulation with heterogeneous power law attenuation modelling capabilities}},
  year = {2025},
  month = oct,
  doi = {10.5281/zenodo.17497689},
  url = {https://github.com/pinton-lab/fullwave25},
}

@ARTICLE{Pinton2021-fullwave2,
  title = "A fullwave model of the nonlinear wave equation with multiple relaxations and relaxing perfectly matched layers for high-order numerical finite-difference solutions",
  author = "Pinton, Gianmarco",
  month = jun,
  year = 2021,
  copyright = "http://creativecommons.org/licenses/by/4.0/",
  archivePrefix = "arXiv",
  primaryClass = "physics.med-ph",
  eprint = "2106.11476"
}

Hardware prerequisites

  • This system operates in a Linux environment.
    • If you need a Windows environment, please consider using WSL2 (Windows Subsystem for Linux 2).
  • This simulation requires an NVIDIA GPU to execute.
  • You may need multiple GPUs for 3D simulation.

Technical recommendations

  • We recommend setting up an SSH key for GitHub, if you haven't done already. The repository changes over time to fix bugs and add new features. You can keep your local repository up to date by pulling the latest changes from GitHub. Cloning through SSH is more convenient than HTTPS in the long run.

  • after that, you can clone the repository through

    git clone git@github.com:pinton-lab/fullwave-python.git
    

Technical references


installation for users

pip install fullwave25

Troubleshooting

If ffmpeg is not installed on your system, please install it using the package manager of your Linux distribution. ffmpeg is used for video writing in plotting functions.

please see the installation guide below. reference: FFmpeg Installation Guide

# for Ubuntu/Debian
sudo apt install ffmpeg

Additionally, if you encounter any issues related to cv2 (OpenCV) during the installation, please install it separately using linux package manager or pip.

please see the installation guide below. cv2 is used fro video writing in plotting functions.

reference: Installing OpenCV on Linux: A Comprehensive Guide

# using apt for Ubuntu/Debian
sudo apt install python3-opencv

# using pip
pip install opencv-python

installation for development

We use uv for package project and virtual environment management.

If uv is not installed, run below.

curl -LsSf https://astral.sh/uv/install.sh | sh

Run below to install the development environment.

git clone git@github.com:pinton-lab/fullwave25.git
cd fullwave25
make install-all-extras # for running examples
# or
make install # for the core library installation

To test the installation, run

make test

Tutorial: Basic Usage

Please start from example_simple_plane_wave.ipynb.

or try the Google Colab tutorial. You don't need to install or set up a GPU environment on your local machine in order to run the simulation.

Open In Colab

Here are the main steps to run the Fullwave simulation

  1. Define the computational grid.
  2. Define the properties of the acoustic medium.
  3. Define the acoustic source.
  4. Define the sensor.
  5. Execute the simulation.

Tutorial: transducers and transmits

A named array places itself on the grid, and one call states the transmit.

grid = fullwave.Grid(domain_size=(4.5e-2, 4.5e-2), f0=5.208e6, duration=6.7e-5, c0=1540)

transducer = fullwave.Transducer.l7_4(grid)
transducer.plane_wave(angle_deg=2.5)

solver = fullwave.Solver(work_dir="./outputs/my_run", grid=grid, medium=medium, transducer=transducer)
recorded = solver.run()

The arrays are l7_4 (linear, 128 elements, 5.208 MHz), c5_2v (curved, 49.57 mm radius, 3.7 MHz) and p4_1c (phased, 64 elements). fullwave.TransducerGeometry builds any other.

The transmits are plane_wave(angle_deg=...), focus(focus_m=...), diverging(virtual_source_m=...) and synthetic_aperture(element). Each takes apodization and pulse. Set transducer.active_source_elements first to use part of the aperture.

Every transducer is additive by default, which is what the calibrated setups use. Pass source_type="clamped" for a hard source.

transducer.apply_transducer_stack(...) paints a probe's backing, matching layer, lens and standoff onto the medium maps before the Medium is built. fullwave.TransducerStack holds the values.

Which example to read

I want to example
send one plane wave simple_plane_wave.py
do the same in 3D simple_plane_wave_3d.py
compound plane waves into a B-mode plane_wave_compounding.py
focus and watch the beam linear_transducer_focused_animation.py
run a full synthetic aperture full_synthetic_aperture.py
do the same on a curved array convex_transducer_fsa.py
image through an abdominal wall linear_transducer_abdominal_wall.py
build a layered phantom medium_builder_example.py

New simulation development instruction

Tutorial: Advanced Usages

Please see the following examples for more advanced usage.


Attention

  • The simulation grid is defined as follows:
    • (x, y, z) = (depth, lateral, elevational).
      • This order is due to the efficiency of the multiple-GPU execution.
      • Multi-GPU domain decomposition is processed in the depth dimension.
    • The index of the input coordinates (i.e. the acoustic source location) is defined in C-array order (i.e. row-major) within the simulation, regardless of your setup. This is to improve the efficiency of multi-GPU development.
    • This might be confusing, so please be careful when you define the source and source signal definition.
  • GPU memory requirement
    • A 3D simulation requires a lot of GPU memory.
      • Please reduce the grid size or use multiple GPUs if you run out of memory.
      • You can check GPU memory usage with the 'nvidia-smi' or 'nvtop' commands.
  • Multi-GPU execution
    • The current implementation supports multiple GPU execution in 2D and 3D simulations.
    • Our implementation demonstrates linear performance scaling with the number of GPUs.
  • Before 3D simulation:
    • If you want to run a 3D simulation, it is recommended that you start with a 2D simulation first to understand the basic usage.
    • The 3D simulation code is similar to the 2D code, but some plot functions are unavailable in 3D.
    • The 3D simulation takes longer to run, so starting with 2D will help you debug your code faster.

Note for developers

  • Contributions are welcome!
  • When developing something new, please create a new branch such as TYPE/BRANCH_NAME.
    • TYPE can be feature, bugfix, hotfix, docs, refactor, release, test, or experiment.
    • BRANCH_NAME should be descriptive of the feature or fix you are working on.
    • see also: GitHub Branching Name Best Practices
  • Please write clear and concise commit messages.
  • please see CONTRIBUTING.md for more details.

Authors

Maintainers

Release files for fullwave25 1.3.2.dev5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fullwave25 1.3.2.dev5
File Size Uploaded
fullwave25-1.3.2.dev5.tar.gz 6.8 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for fullwave25 1.3.2.dev5
File Interpreter ABI Platform
fullwave25-1.3.2.dev5-py3-none-any.whl Python 3 none any Details

Total release size: 10.6 MB

Release files / fullwave25-1.3.2.dev5.tar.gz

Download URL fullwave25-1.3.2.dev5.tar.gz
Size 6.8 MB
Tags Source
SHA-256 checksum
How to use checksums
bfba4b3dac20cd919c7fe81349c7780e7bb1c8796bb8c8d957743aa2086bc7cf
BLAKE2b-256 checksum
How to use checksums
1e3e0c9ba841b98c95f985957223542b704355d81a6e0e4a0781552d070d437c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / fullwave25-1.3.2.dev5-py3-none-any.whl

Download URL fullwave25-1.3.2.dev5-py3-none-any.whl
Size 3.8 MB
Tags Python 3
SHA-256 checksum
How to use checksums
186f5c16f38653938e39b2b5fd1dc1bfcbe9154f7a3cc47ca0b2ba81aadf7308
BLAKE2b-256 checksum
How to use checksums
c2a931fe850e381cbcbf4bd3cf9dd8af6322082a5cfd89a9a7993fbd81efde15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

1.3.2.dev5 This release

2 release files

1.3.0

2 release files

1.2.3

2 release files

1.2.1

2 release files

1.1.3

2 release files

1.1.0

2 release files

1.0.20

2 release files

1.0.18

2 release files

1.0.16

2 release files

1.0.15

2 release files

1.0.14

2 release files

1.0.12

2 release files

1.0.9

2 release files

1.0.8

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page