Skip to content

Repository files navigation

Archimedes Screw Generator Design Explorer

A Python tool for exploring and validating Archimedes screw generator (micro-hydro screw turbine) designs. Given a screw's geometry and a range of site conditions, it predicts rotational speed, torque, and efficiency, then tells you which design changes would actually improve energy output.


1. Overview

Purpose

Archimedes screws are a low-head, fish-friendly micro-hydropower technology. Their performance depends on a handful of interacting geometric parameters (outer/inner diameter, blade count, pitch) and site conditions (inclination, head, river flow), and the trade-offs are not obvious by hand. This tool lets you:

  • predict how a candidate design performs across a grid of realistic site conditions,
  • rank which geometric parameter has the biggest effect on power output (a "tornado" sensitivity chart),
  • search a grid of alternative geometries to find better-performing designs for a given site, and
  • get a quick starting-point outer-diameter estimate from flow rate alone, cross-checked against 48 real installations, before running the full design search.

The goal is design screening and comparison, not a certified final efficiency number, see Limitations below.

Methodology

The core physics (archimedes_screw.py) numerically reproduces the bucket hydrostatics model from the literature:

  1. Bucket geometry & fill. For a screw with outer/inner diameter, blade count N, pitch P, and blade thickness t_b, the "flow pitch" P_f = P − N·t_b accounts for blade solidity. A dimensionless fill factor f (1.0 = buckets exactly full, no overflow) sets the water surface level in each bucket.
  2. Volume & torque. Bucket volume V(f) and torque T(f) are found by numerically integrating the hydrostatic pressure difference across each blade face over the bucket's (r, θ) domain (Erinofiardi et al. 2022, eqs. 1–14, itself built on Kozyn & Lubitz 2017, Shahverdi 2021, and Lubitz, Lyons & Simmons 2014).
  3. Leakage. Gap leakage between blade tip and housing uses Nagel's (1968) empirical model; overflow leakage (only active when f > 1) uses the V-notch model of Nuernbergk & Rorres (2013).
  4. Screw length is derived, not searched. For a given site, the length needed to span the head at a chosen inclination is fixed by geometry: L = head / sin(inclination). There is no free "optimal length" to search for, it falls directly out of the site.
  5. Solving for the operating point. Given a supplied river flow Q, rotational speed ω is solved directly from continuity (Q = bucket_flow(ω) + leakage), since torque and leakage don't depend on ω at fixed f, no iteration needed.
  6. Mechanical friction. None of the source papers publish a closed-form friction correlation usable without their original fitted coefficients (Kozyn & Lubitz 2017 is referenced, not reproduced, even in the newer Simmons & Lubitz 2024 paper). A transparent, explicitly approximate skin-friction drag model is used instead: P_friction = 0.5 · Cf · ρ · A_wetted · (ω·R_o)³, exposed as a tunable friction_coefficient. This is what makes efficiency genuinely peak and decline with speed (instead of asymptoting to ~100%), matching the qualitative shape of real Archimedes screw test curves.
  7. Outlet power loss. Real screws, especially short ones, and this includes most full-scale river installations, lose significant power at the outlet depending on how submerged it is relative to a geometry- dependent optimum. This is implemented in full from Simmons & Lubitz (2024) §3 (eqs. 3.2, 3.4, 3.7–3.13): a dynamic outlet-loss term (fit separately for N=3, 4, 5 blades) plus a hydrostatic "outlet head effect" term, each corrected for fill height and inclination. By default the outlet is assumed to sit at its own geometry-optimal submergence (the best case); pass tailwater_submergence explicitly to model an actual under- or over-submerged tailrace. One correction was needed to the paper's published constants: the inclination-correction normalisation constant (stated as −0.04887 in eq. 3.10) is inconsistent in sign with its own defining formula (eq. 3.9) and with the positive-loss range shown in the paper's own Fig. 10, likely an OCR/typesetting artifact in the source. This implementation computes the reference value directly from eq. 3.9 instead of trusting the printed literal, which is self-consistent by construction.
  8. Quick outer-diameter sizing & geometry checks. recommend_outer_diameter() implements Do = η·Q^(3/7) (YoosefDoost & Lubitz 2021, eq. 16), a flow-only sizing estimate validated against 48 real installations (their R=91.8%, MAPE=6.6%, independently recomputed from scratch in validate_sizing_equation.py, reproducing R exactly and MAPE to within 0.03 points). ScrewGeometry.geometry_report() also checks the pitch ratio S/Do against Nagel's (1968) inclination-dependent recommendation when an inclination is supplied, alongside the existing radius-ratio and blade-count checks.

On top of this physics core, validate_design.py adds the design exploration layer:

  • Site sweep, grid over inclination × head × flow, at a fixed fill factor, to map where a design is feasible and how efficient it is.
  • Tornado sensitivity, perturbs each geometric lever (outer diameter, radius ratio D_i/D_o, blade count, pitch, blade thickness) up/down at a representative site condition, ranked by impact on net power.
  • Design grid search, full combinatorial search over candidate geometries at a representative site, so you can see the whole performance landscape and pick the best combination for your constraints.

Results

Each run of validate_design.py creates a fresh, timestamped directory results_YYMMDD_HHMMSS/ containing:

File Contents
design_sweep_results.csv / efficiency_vs_flow.png Efficiency, torque, rpm, feasibility across the site condition grid
tornado_sensitivity.csv / tornado_sensitivity.png Ranked % change in power/efficiency for each design lever
design_grid_search.csv / design_grid_search.png Every candidate geometry evaluated at the representative site, with efficiency/power

The console output also prints the best-efficiency scenario, the ranked tornado table, plain-language recommendations, and the top 5 candidate geometries by efficiency and by power.


2. Installation

Requires Python 3.10+.

# clone the repo, then from its root:
python3 -m venv venv

# activate it
source venv/bin/activate        # macOS / Linux
venv\Scripts\activate           # Windows

pip install --upgrade pip
pip install -r requirements.txt

For running the test suite, install dev dependencies first:

pip install -r requirements-dev.txt
./run_tests.sh

run_tests.sh just wraps python -m pytest tests/ -v so you don't need to remember the syntax; run chmod +x run_tests.sh once if it's not already executable. It works from any directory and forwards extra arguments, e.g. ./run_tests.sh -k outlet to run only tests matching "outlet".

If you'd rather run pytest directly, use python -m pytest tests/ -v, not a bare pytest command. A bare pytest runs whatever pytest executable is first on your PATH, which on some setups (a system-wide pytest install, pyenv shims, certain IDE terminals) is not the one in your activated venv, and you'll get import errors from mismatched package versions. python -m pytest always uses the interpreter that the python command itself resolves to, which is unambiguous once the venv is activated. If you still see venv-mismatch errors, confirm with:

python -c "import sys; print(sys.executable)"   # should point inside venv/

requirements.txt:

numpy>=1.24
pandas>=2.0
matplotlib>=3.7

3. Usage

Quick start

Edit the configuration block at the top of validate_design.py:

SHOW_PLOTS = True  # pop up interactive windows in addition to saving PNGs

GEOMETRY = ScrewGeometry(
    outer_diameter_m=0.60,
    inner_diameter_m=0.25,
    n_blades=3,
    pitch_m=0.60,
    blade_thickness_m=0.006,
)
FRICTION_COEFFICIENT = 0.0025  # see Limitations, calibrate if you have real data

ENVIRONMENT = {
    "incline_deg": [15, 22, 30],
    "head_m": [1.0, 2.0, 3.0],
    "flow_lps": [30, 60, 100, 150, 200],
}

SITE_FOR_DESIGN_SEARCH = dict(incline_deg=22, head_m=2.0, flow_lps=100, fill_factor=1.0)

DESIGN_SEARCH_GRID = {
    "outer_diameter_m": [0.5, 0.6, 0.7, 0.8],
    "radius_ratio": [0.35, 0.42, 0.48, 0.54],
    "n_blades": [1, 2, 3, 4, 5],
    "pitch_to_diameter": [0.6, 0.8, 1.0, 1.2],
}

Then run:

python3 validate_design.py

Results land in a new results_YYMMDD_HHMMSS/ folder every run.

Using the physics engine directly

archimedes_screw.py has no dependency on the demo script and can be imported into your own analysis:

from archimedes_screw import ScrewGeometry, ArchimedesScrewModel, recommend_outer_diameter

# quick starting-point diameter for a target flow, before picking a geometry
recommend_outer_diameter(flow_lps=100)  # -> ~0.60 m

geom = ScrewGeometry(
    outer_diameter_m=0.60, inner_diameter_m=0.25,
    n_blades=3, pitch_m=0.60, blade_thickness_m=0.006,
)
model = ArchimedesScrewModel(geom, friction_coefficient=0.0025)

op = model.operating_point(flow_lps=100, head_m=2.0, incline_deg=22, fill_factor=1.0)
print(op.rpm, op.torque_net_Nm, op.efficiency)

# full environment grid -> pandas DataFrame
df = model.sweep({"incline_deg": [15, 22], "head_m": [1, 2], "flow_lps": [50, 100]})

# how sensitive is this design to running under/over-filled?
sens = model.fill_factor_sensitivity(flow_lps=100, head_m=2.0, incline_deg=22)

Design-exploration helpers (tornado_sensitivity, design_grid_search, recommend_design_changes) are module-level functions in the same file, see their docstrings for parameters.


4. Repository contents

archimedes_screw.py              # physics engine: geometry, hydrostatics, leakage, friction, outlet loss, solve
validate_design.py               # demo / CLI: site sweep, tornado chart, grid search, plots
validate_against_literature.py   # regression-tests the model against every real/lab screw in the source papers
validate_sizing_equation.py      # regression-tests recommend_outer_diameter() against 48 real installations
tests/test_archimedes_screw.py   # pytest suite: validation, physical invariants, regression tests for fixed bugs
run_tests.sh                     # ./run_tests.sh -- wraps `python -m pytest tests/ -v`
requirements.txt
requirements-dev.txt             # adds pytest
docs/                            # source PDFs -- see License section for per-file copyright status
README.md

5. Design levers vs. site conditions

It's worth being explicit about what you can and can't control:

Design levers (yours to change) Site conditions (given by nature)
Outer diameter D_o Inclination β
Radius ratio D_i/D_o Head H
Number of blades N River flow Q
Pitch P
Blade thickness t_b

Screw length is not a design lever in this tool, it's a consequence of head and inclination (L = H/sin β). The tornado chart and grid search only perturb the design-lever column.


6. Limitations & calibration

  • Outlet loss is now modelled (Simmons & Lubitz 2024), but it's an empirical fit and the dynamic-loss curve was only published for N=3, 4, 5 blades, other blade counts fall back to the nearest fitted curve with a note. It also assumes an optimally-submerged tailrace unless you pass tailwater_submergence explicitly; n_buckets < 3 scenarios are flagged since the underlying fit's own validation data skewed toward longer screws (length ratio ~4.2).

  • Friction is an uncalibrated placeholder. friction_coefficient (default 0.0025) gives physically-plausible shapes (efficiency rising then falling with speed, shallower inclines outperforming steep ones, both match trends reported in the literature) and is reasonable for relative comparison between designs. It is not validated against measured data. If you have even one real (flow, rotational speed, power) triple from a prototype or a paper at a similar scale, adjust friction_coefficient until the model matches it before trusting absolute efficiency numbers.

    Worked example: plugging in the Ruswarp powerplant's real geometry (Do=2.90 m, Di=1.20 m, N=3, S=3.07 m, β=22°, Q=3,754 L/s; see Simmons & Lubitz 2024 Table 2) and solving for the friction_coefficient that matches its measured 32.5 kW gives Cf≈0.015, about 6x the default, reflecting that Ruswarp is an unusually short screw (L/S≈1.67) operating well outside the length range the outlet-loss fit was validated on. Take this as an illustration of the calibration workflow, not a universal constant: the fitted head (L·sinβ) and blade thickness were assumed, not measured, so this single-point fit absorbs more than just friction.

  • Fill factor is prescribed, not solved for. The model assumes a design fill factor (default 1.0, the standard optimisation target in the literature). Real screws' fill level emerges from the interaction of inflow, downstream water level, and rotational speed; use fill_factor_sensitivity() to check robustness to off-design fill.

  • Gap leakage does not vary with fill factor. Nagel's (1968) model is applied at all fill factors for simplicity, even though it was derived and is strictly valid only at f=1 (Lubitz et al. 2014 note that leakage at other fill factors isn't predicted by this model). It is used unchanged across the fill_factor_sensitivity() sweep as a known approximation, not a fill-factor-dependent correction.


7. Validation against the source literature

validate_against_literature.py runs the model (default, uncalibrated friction_coefficient=0.0025, assumed-optimal tailwater submergence) against every screw in Simmons & Lubitz (2024) with a complete geometry + measured (flow, speed, power) record, 3 laboratory screws and 4 real field powerplants, spanning D_o = 0.15 m to 3.6 m:

Screw D_o (m) N L/S n_buckets rpm error power error
Lab Screw A 0.150 3 4.00 4.17 −18.4% −17.3%
Lab Screw 2 0.316 3 3.83 3.91 −5.3% +6.4%
Lab Screw 15 0.381 4 1.62 1.65 −3.3% −22.9%
Waterford 1.390 3 3.27 3.35 −15.2% −11.3%
Buckfast 2.500 4 4.23 4.33 −3.5% −11.7%
Ruswarp 2.900 3 1.67 1.69 +9.2% +75.5%
Ferrara 3.600 3 1.72 1.74 −13.3% −12.6%

(Blade thickness isn't published for any of these; a scale-appropriate guess, 2 mm for the lab screws, 12–18 mm for the field screws, was used and is flagged as an assumption in the script.)

Takeaway: for screws with a length ratio L/S ≳ 3.2, the uncalibrated model tracks measured power within roughly ±20%, reasonable for an uncalibrated first-principles model with two unknowns (real friction, real tailwater level) defaulted to placeholder assumptions. Below L/S ≈ 2, error becomes much less predictable (−23% to +76% across the three short screws above) and, critically, doesn't correlate cleanly with length alone, Ferrara and Ruswarp have almost identical length ratios (1.72 vs. 1.67) but wildly different errors (−13% vs. +76%).

Why Ruswarp specifically is an outlier, and what it teaches

Ruswarp is the one case in this set that Simmons & Lubitz (2024) themselves single out as hard to predict even with their full CFD-informed model (R²=0.529 with the older Kozyn model; their own improved model reaches only R²=0.928 there, worse than most other sites). Their field data shows Ruswarp's actual tailwater submergence sits well above the geometric optimum much of the time (their Fig. 13, ψ_L − ψ'_L ranging up to ~0.4), i.e. the outlet runs more flooded than ideal. This tool's default assumes optimal submergence (tailwater_submergence=None), which is the best case; Ruswarp doesn't operate near its best case.

Testing that directly: sweeping tailwater_submergence from optimal toward more-flooded conditions brings the Ruswarp prediction from +75.5% error down through 0% around ψ_L − ψ'_L ≈ 0.22, squarely inside the range Simmons & Lubitz report as Ruswarp's actual operating band. The remaining error for short, real screws is dominated by not knowing the real tailwater level, not by a fundamental breakdown of the underlying physics.

Practical guidance for short screws

  • L/S ≳ 3.5: default tailwater_submergence=None (optimal-outlet assumption) is a reasonable starting point; expect roughly ±20% accuracy before any friction calibration.
  • L/S ≲ 2 (the n_buckets < 3 warning): outlet condition dominates the error budget. If you know or can estimate your actual downstream water level, always pass tailwater_submergence explicitly rather than relying on the optimal-outlet default, this single input matters more for short screws than friction calibration does. If you don't know it, treat predictions as order-of-magnitude only and run fill_factor_sensitivity() / a tailwater_submergence sweep to see the spread of plausible outcomes rather than trusting one number.
  • Real installed river screws are frequently in this short-screw regime (Ruswarp, Ferrara here; likely a cost/civil-works trade-off against building a longer trough), so "short screw" is not a lab-only edge case, it's common in exactly the real deployments this tool is meant to help validate.

Sizing equation (recommend_outer_diameter)

validate_sizing_equation.py independently recomputes Pearson R and MAPE (from scratch, not trusting the source paper's own reported numbers) for recommend_outer_diameter() against the same 48 real Archimedes screw installations YoosefDoost & Lubitz (2021) used to validate it (Do 1.4–5.0 m, Q 0.5–14.5 m³/s, 7.3–400 kW):

Metric This recomputation Paper's reported value
Pearson R 91.80% 91.80%
MAPE 6.61% 6.58%

Exact match on R, essentially exact on MAPE, confirms the implementation matches the published equation, not just its stated accuracy. One honest discrepancy worth noting: this recomputation finds Hasselt as the single largest outlier (predicted 3.21 m vs. actual 5.0 m, −35.8%), while the source paper names Hannoversch-Münden as the worst case (which is still among the largest errors here, just not the single largest). Both identify the same general cluster of outliers; the paper attributes Hannoversch-Münden's deviation to its unusual adjustable-inclination design, which plausibly applies to some of these other outliers too, but that's not verified here.


8. Bibliography

Primary sources implemented in this tool:

  1. Erinofiardi, E.; Koirala, R.; Shiwakoti, N.; Date, A. Sustainable Power Generation Using Archimedean Screw Turbine: Influence of Blade Number on Flow and Performance. Sustainability 2022, 14, 15948. https://doi.org/10.3390/su142315948

  2. Rorres, C. The Turn of the Screw: Optimal Design of an Archimedes Screw. J. Hydraul. Eng. 2000, 126(1), 72–80. Source of the radius-ratio heuristic (ρ*≈0.54) checked in geometry_report(). Still the standard reference for this result 25 years on, both newer papers below cite it directly. Cited here, not redistributed: see License.

  3. Simmons, S.C.; Lubitz, W.D. Modelling outlet power loss in Archimedes screw generators. Flow 2024, 4, E32. https://doi.org/10.1017/flo.2024.29

  4. YoosefDoost, A.; Lubitz, W.D. Archimedes Screw Design: An Analytical Model for Rapid Estimation of Archimedes Screw Geometry. Energies 2021, 14, 7812. https://doi.org/10.3390/en14227812 (CC BY 4.0). Its maximum-rotation-speed formula (ωmax = 5π/(3·Do^(2/3)) rad/s) is algebraically identical to the max_recommended_rpm() check already in this tool, independent confirmation of that value. Its headline result, Do = η·Q^(3/7) (η≈1.61 for typical design ratios), is implemented as recommend_outer_diameter(), validated against the same 48 real industrial installations used in the source paper (§7 below). Its inclination-dependent pitch-ratio recommendation (Nagel 1968) is implemented in geometry_report().

  5. Sobel, J.B.; Buhia, J.; Tino, C.; Lambot, J.M.; Lastimado, A.E., Jr. Performance Optimization of an Archimedean Screw Turbine a Hydropower Generator for Sustainable Energy Generation. SSRG Int. J. Mech. Eng. 2025, 12(10), 79–99. https://doi.org/10.14445/23488360/IJME-V12I10P107 (CC BY-NC-ND 4.0, note this is more restrictive than the plain CC BY sources above: NonCommercial and NoDerivatives). Reviewed for context; not directly implemented (uses Response Surface Methodology on a field-tested single-blade PVC prototype, a different approach from this tool's closed-form hydrostatic model). Its finding that efficiency declines with steeper inclination matches this tool's own prediction and the Dellinger et al. (2016) result below. Note their reported efficiency is electrical output (generator V×I) versus this tool's mechanical shaft output, the two aren't directly comparable, illustrating the gearbox/generator-conversion gap already noted in §6.

  6. YoosefDoost, A. Archimedes Screw Turbines: Design Optimization for Sustainable Green Energy Generation. PhD Thesis, University of Guelph, 2022. Reviewed for context; not directly implemented, license not verified, see License section. Distinct from item 4 above (same lead author and research group, different publication, not a later version of it).

Secondary sources referenced within the above (not independently consulted here, cited as they appear in the primary sources' literature reviews):

  • Nagel, G. Archimedean Screw Pump Handbook. Ritz-Atro Pumpwerksbau, Nürnberg, 1968.
  • Nuernbergk, D.M.; Rorres, C. Analytical model for water inflow of an Archimedes screw used in hydropower generation. J. Hydraul. Eng. 2013, 139(2), 213–220.
  • Kozyn, A.; Lubitz, W.D. A power loss model for Archimedes screw generators. Renew. Energy 2017, 108, 260–273.
  • Lubitz, W.D.; Lyons, M.; Simmons, S.C. Performance model of Archimedes screw hydro turbines with variable fill level. J. Hydraul. Eng. 2014, 140(10), 04014050.
  • Dellinger, G.; Terfous, A.; Garambois, P.A.; Ghenaim, A. Experimental investigation and performance analysis of Archimedes screw generator. J. Hydraul. Res. 2016, 54, 197–209.
  • Shahverdi, K. Modeling for prediction of design parameters for micro-hydro Archimedean screw turbines. Sustain. Energy Technol. Assess. 2021, 47, 101554.

License

Python code and this README

MIT License. © 2026 Fabio Balzano

The PDFs in docs/

These are five separate journal articles plus a PhD thesis, each under its own copyright, the MIT license above covers only this repo's code and documentation, not the papers:

  • sustainability-14-15948-with-cover.pdf (Erinofiardi et al. 2022, Sustainability), © the authors, distributed under CC BY 4.0 (open access; redistribution with attribution is permitted).
  • modelling-outlet-power-loss-in-archimedes-screw-generators.pdf (Simmons & Lubitz 2024, Flow), © the authors, distributed under CC BY 4.0 (open access; redistribution with attribution is permitted).
  • energies-14-07812-with-cover.pdf (YoosefDoost & Lubitz 2021, Energies), © the authors, distributed under CC BY 4.0 (open access; redistribution with attribution is permitted).
  • IJME-V12I10P107.pdf (Sobel et al. 2025, SSRG Int. J. Mech. Eng.), © the authors, distributed under CC BY-NC-ND 4.0. Note this is more restrictive than the CC BY sources above: NonCommercial and NoDerivatives. Fine to keep in a repo used non-commercially with the file unmodified; do not use it commercially or distribute a modified version of the PDF itself.
  • Yoosefdoost_Arash_202205_PhD.pdf (University of Guelph, 2022), license not verified here; check the thesis's listing on the University of Guelph's Atrium repository for its actual reuse terms before redistributing it. Not the same document as the Energies 2021 paper above, same lead author, different publication.

About

Archimedes Screw Generator Design Explorer - A Python tool for exploring and validating Archimedes screw generator designs.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages