kh2d-solver: Python-based incompressible Kelvin-Helmholtz 2D Instability Solver
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
- basic_shear - Classical Kelvin-Helmholtz instability
- double_shear - Double shear layer configuration
- rotating - KH instability with system rotation
- 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
- Create PyPI Account: Register at pypi.org
- Get API Token: Account Settings → API tokens → Create token
- 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)
| File | Size | Uploaded | |
|---|---|---|---|
| kh2d_solver-0.1.6.tar.gz | 17.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|