Skip to main content

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:

@article{Herho2025,
  title     = {\texttt{kh2d-solver}: {A} {P}ython library for idealized two-dimensional incompressible {K}elvin-{H}elmholtz instability},
  author    = {Herho, S. H. S. and Trilaksono, N. J. and Fajary, F. R. and Napitupulu, G. and Anwar, I. P. and Khadami, F. and Irawan, D. E.},
  journal   = {Applied and Computational Mechanics},
  volume    = {19},
  pages     = {125--156},
  year      = {2025},
  doi       = {10.24132/acm.2025.1040}
}

Contributing

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

Support

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

Metadata

Release files for kh2d-solver 0.1.6

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

Source distribution (sdist)

Source distribution for kh2d-solver 0.1.6
File Size Uploaded
kh2d_solver-0.1.6.tar.gz 17.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kh2d-solver 0.1.6
File Interpreter ABI Platform
kh2d_solver-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 36.0 kB

Release files / kh2d_solver-0.1.6.tar.gz

Download URL kh2d_solver-0.1.6.tar.gz
Size 17.2 kB
Tags Source
SHA-256 checksum
How to use checksums
bdf9aa5fa525ecf3805dcc4f23926e8a5edebf74aaddb7b0ae93498663ce78d8
BLAKE2b-256 checksum
How to use checksums
c01f5e2205ed6ecd180dc344e51710751801731775cf99ed909277746be46b23
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.3 CPython/3.12.2 Linux/6.11.9-100.fc39.x86_64

Release files / kh2d_solver-0.1.6-py3-none-any.whl

Download URL kh2d_solver-0.1.6-py3-none-any.whl
Size 18.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4ad6186b3693285914334f903754e7cf263db3778273323a2ae42e70d6d37952
BLAKE2b-256 checksum
How to use checksums
2e42352a19d1ede3015ef9839c2bbf3c6c93495f4e6c5abbdb578c20063fdd35
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.3 CPython/3.12.2 Linux/6.11.9-100.fc39.x86_64

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

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