PhD Aljoscha Sander - Code Basis
  • Jupyter Notebook 99.1%
  • Python 0.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-26 22:37:46 +01:00
.opencode/plans completed restructuring and updated documentation 2026-02-18 23:15:22 +01:00
docs Updated LIDAR data ingestion 2026-10-23 14:00:03 +02:00
notebooks Updated drop tower notebooks 2026-10-26 22:37:46 +01:00
scripts Updated LIDAR data ingestion 2026-10-23 14:00:03 +02:00
sql Updated LIDAR data ingestion 2026-10-23 14:00:03 +02:00
src Orbit geometry: configurable plane, rotation direction per half period, fast tests 2026-10-19 11:30:28 +02:00
tests Updated LIDAR data ingestion 2026-10-23 14:00:03 +02:00
.cookiecutter.json initial commit 2025-12-08 21:11:31 -05:00
.editorconfig initial commit 2025-12-08 21:11:31 -05:00
.gitattributes initial commit 2025-12-08 21:11:31 -05:00
.gitignore Phase 5a: notebooks use the single twbii.duckdb; example notebooks match the code 2026-10-17 21:10:03 +02:00
.pre-commit-config.yaml removed old .md files and upadte ruff pre-commit 2026-01-29 14:00:24 -05:00
AGENTS.md Docs: structd review in CHANGELOG; test instructions without the ngsolve marker 2026-10-18 23:20:30 +02:00
ARCHIVE.md Orbit geometry: configurable plane, rotation direction per half period, fast tests 2026-10-19 11:30:28 +02:00
CHANGELOG.md Updated LIDAR data ingestion 2026-10-23 14:00:03 +02:00
CODE_OF_CONDUCT.md initial commit 2025-12-08 21:11:31 -05:00
LICENSE initial commit 2025-12-08 21:11:31 -05:00
Makefile fix/gps-installation-times (#6) 2026-01-28 02:52:08 +00:00
mkdocs.yml structd: archive 3D solid, 6-DOF rigid body, beam examples and 22-case NGSolve comparison 2026-10-18 22:51:48 +02:00
pyproject.toml structd: archive 3D solid, 6-DOF rigid body, beam examples and 22-case NGSolve comparison 2026-10-18 22:51:48 +02:00
README.md Docs: structd review in CHANGELOG; test instructions without the ngsolve marker 2026-10-18 23:20:30 +02:00
test.toml fixed wmb-sued ingestion issue 2026-02-07 17:07:22 +01:00
uv.lock Phase 5c: README, AGENTS.md, CHANGELOG (0.4.0), ARCHIVE.md; version 0.4.0 2026-10-17 21:18:43 +02:00

phdsan — Weird Structural Responses of Offshore Wind Turbines under Installation Conditions

Python 3.13+ Code style: ruff

phdsan is the code for my (Aljoscha Sander) PhD research on the structural dynamics and fluid-structure interaction of offshore wind turbines during installation: measurements of the TWB II installation campaign, a drop-tower measurement campaign, and structural models.

raw files ──sql/*.sql──▶ DuckDB ──▶ Python analysis ──▶ notebooks / thesis

Quick start

make install                      # uv sync + pre-commit hooks
uv run pytest                     # default test run (slow tests: -m slow)

# build the databases from raw data (needs the duckdb CLI and fish)
scripts/build_twbii.fish /path/to/trianel-II twbii.duckdb
scripts/build_droptower.fish /path/to/zarm droptower.duckdb

uv run jupyter lab                # notebooks/
from core.db.connection import DatabaseConnection
from twbii.db import get_acc_data

with DatabaseConnection("twbii.duckdb", read_only=True) as conn:
    acc = get_acc_data(conn, turbine_id="08_BW57", location="helihoist-1")
    conn.sql("SELECT * FROM data_inventory").show()

Layout

sql/twbii/, sql/droptower/   schema + one ingestion SQL file per data source
scripts/                     build_*.fish, convert_to_parquet.py, gps_detect_periods.py,
                             process_acceleration.py, structd/
src/core/                    DuckDB connection, config base, shared types, exceptions
src/analysis/                filters, integration, stochastic methods, wavelets,
                             orbit geometry, GPS lift detection, lag correlation
src/twbii/                   database read helpers, processing pipeline, workflows, plotting
src/structd/                 beam FEM solver and oscillator models
notebooks/                   thesis notebooks (ch*) and self-contained examples
tests/                       mirrors src/; SQL ingestion tested on synthetic raw files
docs/                        MkDocs documentation (`make docs` / `uv run mkdocs serve`)

DuckDB is the only data interface: raw data is loaded by plain SQL (docs/user-guide/data-ingestion.md), and the databases are rebuildable artefacts without migrations (docs/architecture/database.md).

Code that is no longer used lives on the archive branch; ARCHIVE.md lists what was moved there and how to restore it.

Development

uv run ruff check --fix && uv run ruff format
uv run ty check src scripts
uv run pytest -n 4
uv run mkdocs build

License

MIT License — see LICENSE for details.

Citation

@software{phdsan2026,
  title = {phdsan: Structural Health Monitoring of Offshore Wind Turbine Installations},
  author = {Sander, Aljoscha},
  year = {2026},
  url = {https://git.flucto.tech/aljoscha/phdsan}
}