OOWL
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)
| File | Size | Uploaded | |
|---|---|---|---|
| oowl-0.1.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|