Skip to main content

OOWL

PyPI Python Ruff ty docs license

Onshore and Offshore Wind Layouts (OOWL, pronounced /aʊl/ like owl) generates diverse, exact-count wind-farm layouts from composable geometry and placement methods. It provides boundaries, turbine layouts, wind resources, turbine models, and curated reference farms, and writes them as windIO.

OOWL is not a wake model or a wind-farm layout optimizer, and it does not try to reconstruct a particular real wind farm. Those are downstream applications that consume OOWL's output.

Installation

OOWL requires Python 3.12 or newer and is imported as oowl.

pip install oowl

To work from a checkout, or to develop OOWL.

git clone https://gitlab.windenergy.dtu.dk/sys/OOWL.git
cd OOWL
pip install -e .

# or the locked development environment
pixi install --locked --environment dev

See Installation for the optional extras and the supported dependency bounds.

Draw a farm

Describe the scenario you want as a sampler, then draw from it.

import oowl
from oowl import boundaries as B
from oowl import layouts as L

spec = oowl.Sampler(
    B.OffshorePolygon(area=45_000_000, seed=3),
    L.Grid(n_turbines=92, lattice_angle=60, seed=4),
)

farm = spec.sample()[0]
farm.plot()
farm.save("farm.yaml")

The sampler is validated when built and can be drawn from repeatedly with the same result. sample(n) returns a tuple of scenarios. Boundaries, strings, layouts, surfaces, wind resources and turbines are six composable layers. See Concepts.

Draw a dataset

Give any value a (low, high) range, an f(rng) -> value callable or an SP.Choice, and the same description becomes a population.

import oowl
from oowl import boundaries as B, layouts as L, sampling as SP

spec = oowl.Sampler(
    boundary=B.OffshorePolygon,
    layout=SP.Choice(
        [L.Grid, L.PoissonDisc, L.Delaunay],
        probabilities=[0.5, 0.3, 0.2],
    ),
    n_turbines=(40, 90),
    density={"minimum_spacing": 800.0},
    seed=7,
)

farms = spec.sample(200)
for index, farm in enumerate(farms):
    farm.save(f"dataset/farm_{index:04d}.yaml")

density names how tightly turbines are packed, here a minimum turbine distance in meters. Count, area and density constrain one geometry, so a sampler takes any two of them. A count and a spacing scale each boundary to fit, which keeps every farm buildable. n_farms= makes each scenario a Cluster of farms placed together, and domain= a region of development sites.

Seeds are derived per scenario, so spec.sample(3) repeats the first three scenarios of spec.sample(200), spec.sample(50, start=150) shards the population, and spec.stream() yields scenarios one at a time. [farm.summary() for farm in farms] gives one row of metrics per farm.

windIO

farm.save(path) and oowl.load(path) write and read one farm as a windIO wind_energy_system, with its wind resource and turbine types. Cluster.save and Cluster.load use a directory. OOWL writes windIO directly and does not depend on the windIO package. Substations and cable arrays are out of scope.

Documentation

The documentation is at https://oowl-4781ed.pages.windenergy.dtu.dk, with a Quickstart, Concepts, the API reference and executable notebooks, including integrations with PyWake, TOPFARM and OptiWindNet.

Citation

If you use OOWL, please cite it.

@software{OOWL_0_1_0_2026,
  author = {Rasmussen, Frederik Peder Weilmann and Schøler, Jens Peter and de Alencar, Mauricio Souza},
  title = {{OOWL: Onshore and Offshore Wind Layouts}},
  year = {2026},
  version = {0.1.0},
  url = {https://gitlab.windenergy.dtu.dk/sys/OOWL},
  license = {MIT},
}

Citation metadata and the author list are kept in CITATION.cff.

Contributing

Contributions are welcome. See the contribution guide. Run pixi run --environment dev lint, format-check, typecheck, test and docs before submitting, and record user-visible changes in the changelog.

License

MIT. See LICENSE. Copyright (c) 2026 DTU Wind and Energy Systems.

Metadata

Release files for oowl 0.1.0

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

Source distribution (sdist)

Source distribution for oowl 0.1.0
File Size Uploaded
oowl-0.1.0.tar.gz 1.3 MB Details

Built distribution (wheel)

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

Total release size: 2.5 MB

Release files / oowl-0.1.0.tar.gz

Download URL oowl-0.1.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
4189b32ea63099fad01bc1c9d370406190e051edd4d4515448882a6309e3828f
BLAKE2b-256 checksum
How to use checksums
62b429f9f5ce422616774b7c70b6d3032eb0ffdcf79c3a9594833d663e6f5c3a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / oowl-0.1.0-py3-none-any.whl

Download URL oowl-0.1.0-py3-none-any.whl
Size 1.2 MB
Tags Python 3
SHA-256 checksum
How to use checksums
a7e2697b265924f4836d46155e6ead2ef3f67c7cd9063b2f67b792e30e153a99
BLAKE2b-256 checksum
How to use checksums
d7ac21c75366c640462022ceb3d979a7672acc33e4beec9aa8c91b2953e95637
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

0.0.1

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