Skip to main content

A high-performance solver for 2D Kelvin-Helmholtz instability with Numba acceleration

Project description

kh2d-solver: Python-based incompressible Kelvin-Helmholtz 2D Instability Solver

Python License: WTFPL Code style: black Numba PyPI version DOI

A high-performance solver for 2D Kelvin-Helmholtz instability for incompressible flows using finite difference methods with Numba acceleration.

Features

  • Numba JIT compilation for 10-50x speedup
  • Multi-core parallelization support
  • High-order finite difference schemes
  • FFT-based Poisson solver
  • Multiple predefined scenarios (shear layers, rotating flows, forced turbulence)
  • NetCDF output format
  • Animated GIF generation
  • Conservation monitoring (mass, momentum, energy)

Installation

Install from PyPI (Recommended)

pip install kh2d-solver

Install from Source

git clone https://github.com/sandyherho/kelvin-helmholtz-2d-solver.git
cd kelvin-helmholtz-2d-solver
pip install .

Development Installation

For development with editable installation:

git clone https://github.com/sandyherho/kelvin-helmholtz-2d-solver.git
cd kelvin-helmholtz-2d-solver
pip install -e .

Quick Start

Run simulations directly after installation:

# Run a basic shear layer simulation
kh2d-simulate basic_shear

# Run with multiple cores (e.g., 8 cores)
kh2d-simulate basic_shear --cores 8

# Run all predefined scenarios
kh2d-simulate --all

# Use a custom configuration
kh2d-simulate --config my_config.txt

Python API Usage

import numpy as np
from kh2d_solver import KH2DSolver, ShearLayer

# Create solver
solver = KH2DSolver(nx=256, nz=128, lx=2.0, lz=1.0)

# Set initial conditions
ic = ShearLayer(shear_thickness=0.05, u_top=1.0, u_bot=-1.0)
u0, w0, rho0 = ic(solver.x, solver.z)

# Run simulation
result = solver.solve(
    u0=u0, w0=w0, rho0=rho0,
    t_final=10.0,
    reynolds=1000,
    richardson=0.25
)

# Access results
vorticity = result['vorticity']
density = result['rho']

Performance Options

The solver automatically uses Numba JIT compilation for critical loops. You can control parallelization:

# Use all available cores (default)
kh2d-simulate basic_shear

# Specify number of cores
kh2d-simulate basic_shear --cores 4

# Disable parallelization (single core)
kh2d-simulate basic_shear --cores 1

Configuration

Configuration files are simple text files with key-value pairs:

# Example configuration
scenario_name = My Simulation
nx = 256
nz = 128
t_final = 10.0
reynolds = 1000
richardson = 0.25
n_cores = 8  # Optional: specify cores (default: all available)

Predefined Scenarios

  1. basic_shear - Classical Kelvin-Helmholtz instability
  2. double_shear - Double shear layer configuration
  3. rotating - KH instability with system rotation
  4. forced - Forced turbulence with energy injection

All scenarios use a unified 2.0 × 1.0 domain for direct comparison.

Output

The solver generates:

  • NetCDF files with complete flow field data
  • Animated GIFs showing vorticity (ω_z) and density evolution
  • Log files with simulation parameters and performance metrics

Physics

The solver solves the 2D incompressible Navier-Stokes equations with density stratification:

  • Continuity: ∇·u = 0
  • Momentum: ∂u/∂t + (u·∇)u = -(1/ρ₀)∇p + ν∇²u - (ρ/ρ₀)gk
  • Density: ∂ρ/∂t + u·∇ρ = κ∇²ρ

The vorticity shown is the z-component: ω_z = ∂w/∂x - ∂u/∂z

Publishing to PyPI (For Maintainers)

First-time Setup

  1. Create PyPI Account: Register at pypi.org
  2. Get API Token: Account Settings → API tokens → Create token
  3. Configure Poetry:
poetry config pypi-token.pypi pypi-XXXXXXXX

Publishing Process

# Update version in pyproject.toml
poetry version patch  # or minor/major

# Build the package
poetry build

# Publish to PyPI
poetry publish

Version Management

Follow semantic versioning (MAJOR.MINOR.PATCH):

  • MAJOR: Breaking changes
  • MINOR: New features (backwards compatible)
  • PATCH: Bug fixes

Requirements

  • Python 3.8+
  • NumPy
  • SciPy
  • Matplotlib
  • netCDF4
  • tqdm
  • Numba

Authors

  • Sandy H. S. Herho (sandy.herho@email.ucr.edu)
  • Nurjanna J. Trilaksono
  • Faiz R. Fajary
  • Gandhi Napitupulu
  • Iwan P. Anwar
  • Faruq Khadami
  • Dasapta E. Irawan

License

This project is licensed under the WTFPL - Do What The F*ck You Want To Public License. See the LICENSE file for details.

Citation

If you use this software in your research, please cite:

@software{kh2d_solver_2025,
  title = {{K}elvin-{H}elmholtz {2D} {I}nstability {S}olver},
  author = {Herho, Sandy H. S. and Trilaksono, Nurjanna J. and Fajary, 
  	   Faiz R. and Napitupulu, Gandhi and Anwar, Iwan P. and Khadami, Faruq and Irawan, Dasapta E.},
  year = {2025},
  version = {0.1.5},
  url = {https://github.com/sandyherho/kelvin-helmholtz-2d-solver}
}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Support

For issues, questions, or suggestions, please open an issue on GitHub.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kh2d_solver-0.1.5.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kh2d_solver-0.1.5-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file kh2d_solver-0.1.5.tar.gz.

File metadata

  • Download URL: kh2d_solver-0.1.5.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.12.2 Linux/6.11.9-100.fc39.x86_64

File hashes

Hashes for kh2d_solver-0.1.5.tar.gz
Algorithm Hash digest
SHA256 08e564607f26143682526905d5d7adec477c8f290f9764fbe97d4a275296be7a
MD5 3e7fb29cb0ce451a454e3d7ee77f88f1
BLAKE2b-256 f2b4b9c6b655272f5e9a595eb47d890653dd68089c01c701b51824b21ccdc6bf

See more details on using hashes here.

File details

Details for the file kh2d_solver-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: kh2d_solver-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 18.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.12.2 Linux/6.11.9-100.fc39.x86_64

File hashes

Hashes for kh2d_solver-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7fbbd8d19494ed12e5ca5cdeb1fb32523ebd2c07a0da7d7a6f1636936f3fbf32
MD5 7828a53ae98045bf4ca1bce459fac77a
BLAKE2b-256 1470bc3965dbdd9f9ee11e05c42a9e6f865547afb490e284b4b1074a6f7140d7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page