# Outdoor noise propagation for the Isumi offshore wind farm

This folder contains the calculations that produce the 1/3-octave-band
receiver levels and weighted totals (`L_p(Z)`, `L_p(A)`, `L_p(C)`,
`L_p(G)`) tabulated in chapter 12 of `IsumiWindfarm.tex`:

- the **ISO 9613-2 baseline** for the nine (plan × receiver) cases of
  section 12.2 and appendices A/B (`iso_compute.py`);
- the **case 1–4 weather-amplified results** of section 12.3 / section 11.2
  for the same nine geometries, on top of the same ISO baseline
  (`compute_weather.py`);
- the **cylindrical-spreading upper bound** of section 11.3 / Table 12.4
  (`compute_cylindrical.py`).

The code uses only the Python standard library — no NumPy, no SciPy.

## Quick start

```bash
cd python
python3 iso_compute.py             # ISO 9613-2 summary, 9 cases
python3 iso_compute.py --per-band  # full 1/3-octave detail for every case
python3 compute_weather.py         # case 1-4 weather-amplified, 9 x 4 = 36 totals
python3 compute_weather.py --per-band   # 1/3-octave detail
python3 compute_cylindrical.py     # cylindrical upper bound, 9 cases
python3 iso_emit_tables.py         # emit LaTeX tables of standard reference data
```

ISO baseline summary:

```
=== ISO 9613-2 summary, all 9 cases at 10 degC / 70 % ===
plan       receiver    L_p(Z)   L_p(A)   L_p(C)   L_p(G)
   A      coastline     65.88    45.04    61.85    69.46
   A    inland 3 km     61.48    37.48    57.12    65.27
   ...
```

## Files

| File | Purpose |
|---|---|
| `iso9613_1.py`         | ISO 9613-1:1993 atmospheric absorption coefficient α(f, T, RH, p_a). Closed-form analytic formula. |
| `iso9613_2.py`         | ISO 9613-2 point-source outdoor propagation: A_div, A_atm, A_gr, with a sea/land two-segment ground term. |
| `iso_weightings.py`    | IEC 61672-1:2013 (A, C) and ISO 7196:1995 (G) 1/3-octave weighting curves at standard band centres. |
| `iso_layouts.py`       | Turbine coordinates and receiver positions for plans A, B, C. |
| `iso_vestas_spectrum.py` | Vestas V236-15MW 1/3-octave sound-power spectrum (Z and A) including the +2 dB safety margin (L_WA = 120 dB(A)). |
| `iso_compute.py`       | ISO 9613-2 main script: 9-case summary and (optionally) per-band detail. |
| `iso_emit_tables.py`   | Emits the LaTeX tables of standard reference data (α at 10/70 and 20/80; A/C/G/Z weightings) used in the paper's appendix. |
| `weather_corrections.py` | Case 1–4 band-grouped corrections: refraction focusing (Table 11.2.4), duct spreading via the effective spreading index n_i (Tables 11.2.3 and 11.2.6), and the sea-surface reflection correction (Table 11.2.5). |
| `compute_weather.py`   | Case 1–4 main script: 9 × 4 = 36 weather-amplified totals, full output. |
| `cylindrical_spreading.py` | Cylindrical-spreading upper bound of section 11.3: replaces ISO 9613-2's spherical 20·log10(r) with cylindrical 10·log10(2π r h) for a duct of height h = 150 m. Atmospheric absorption (ISO 9613-1) and the +3 dB sea-surface reflection are unchanged. |
| `compute_cylindrical.py` | Cylindrical main script: 9-case summary, for the physical-upper-bound reference row of Table 12.4. |

## Inputs and model — ISO 9613-2 baseline

Conditions:

- Temperature 10 °C, relative humidity 70 %, atmospheric pressure 101.325 kPa.
  This is the ISO 9613-2 reference condition adopted by the paper for all
  ISO-baseline calculations.

Source: Vestas V236-15MW manufacturer-published 1/3-octave sound power
levels with the +2 dB safety margin used in the Estonian Hiiumaa EIA
(Ramboll, 2022). L_WA = 120 dB(A), L_WZ = 134 dB. The same spectrum is
used for plans A, B and C; the 18 MW class of plan C is accounted for by
the optional +2 dB correction described in the paper.

Layouts (from IsumiWindfarm.tex §6.1 and §12.1.1):

- Plan A: 15 MW × 35 turbines, 4 rows of 11/9/8/7, within-row spacing
  1560 m, row spacing 960 m, hub height 150 m. Front row 3 km offshore.
- Plan B: 12 MW × 42 turbines, 4 rows of 11/11/10/10, dx = 1430 m,
  dy = 880 m, hub height 140 m. Front row 3 km offshore.
- Plan C: 18 MW × 25 turbines, 3 rows of 8/9/8 at offshore distances 3.0,
  4.5 and 6.0 km, dx = 1250 m, hub height 150 m.

Rows are centred horizontally; the receiver sits at the array centre, 1.5 m
above ground, either on the coastline (y = 0) or inland (y = −3000 or
−5000 m). Each turbine's source-to-receiver path is split into a sea
segment (from the turbine to the coastline) and a land segment (from the
coast to the receiver) by the slant fraction y_turbine / (y_turbine − y_receiver).

Per-band propagation, for each turbine k and each 1/3-octave band i:

    L_p,i,k = L_W,i − A_div(r_k) − A_atm,i(r_k) − A_gr,i(r_k)

with

- `A_div(r) = 20·log10(r) + 11` — geometric divergence (ISO 9613-2 §7.1, eq. 7).
- `A_atm,i(r) = α_i · r` — atmospheric absorption (ISO 9613-2 §7.2, eq. 8),
  with α_i from the ISO 9613-1 analytic formula (§6.2 eqs 3–5) at the
  chosen T, RH and pressure.
- `A_gr,i` — ground effect (ISO 9613-2 §7.3), split into two segments:
  * Sea segment (G = 0): `A_gr = −3 dB` uniformly across all bands. This
    is the strict §7.3.1 result for water/hard ground at short paths
    (where the source-region term A_s and receiver-region term A_r are
    each −1.5 dB and the middle-region term A_m vanishes). The paper
    keeps this uniform −3 dB on longer paths too, where strict §7.3.1
    would add a small additional A_m = −3q term.
  * Land segment: band-grouped values reflecting the qualitative
    behaviour described in §12.2.1 — long wavelengths (≤ 200 Hz) are
    insensitive to land cover and behave almost reflectively; mid
    frequencies (250 – 1000 Hz) start to be absorbed by soft ground;
    higher frequencies (> 1 kHz) are more strongly absorbed:

        f ≤ 200 Hz       A_gr,land = −2 dB     (almost reflective)
        200 < f ≤ 1000   A_gr,land =  0 dB
        f > 1000 Hz      A_gr,land = +1 dB

  The two segments are blended by their path-length fraction:

        A_gr,i = (r_sea / r_total) · A_gr,sea + (r_land / r_total) · A_gr,land,i

Contributions are summed energetically over all turbines, per band:

    L_p,i = 10·log10 Σ_k 10^(L_p,i,k / 10)

Weighted totals are then formed energetically over the bands:

    L_p(W) = 10·log10 Σ_i 10^((L_p,i + W_i) / 10)

with W_i taken from the standard 1/3-octave tabulations:

- A and C from IEC 61672-1:2013 Table 3 (rounded to 0.1 dB; same values
  the standard derives from its Annex E analytic transfer functions),
- G from ISO 7196:1995 Table 2 (passband peak +9.0 dB at 20 Hz; 12 dB/oct
  rise from 1 Hz; 24 dB/oct rolloff above 20 Hz),
- Z is zero for all bands (no weighting).

## Inputs and model — case 1–4 weather amplification

ISO 9613-2 explicitly excludes inversion conditions over water (§7.3.1
Note 10). The paper's chapter 11.2 addresses this by layering three
band-grouped corrections on top of the ISO 9613-2 baseline:

1. **Refraction focusing** `ΔL_refrac` (Table 11.2.4) — energy redirected
   downward by wind shear and thermal gradients. Distance-independent,
   band-grouped, function of case (1–4).
2. **Duct spreading change** `ΔL_duct` — once trapped in the surface duct,
   sound spreads as r^n with n < 2. Distance-dependent, parameterised by
   the effective spreading index `n_i` from Tables 11.2.3 (sea segment)
   and 11.2.6 (land segment). For a single turbine at sea-segment length
   `r_sea` and land-segment length `r_land`, with `r_0 = 1 km`:

        ΔL_duct = (2 − n_sea,i) · 10 log10(r_sea / r_0)
                + (2 − n_land,i) · 10 log10((r_sea + r_land) / max(r_sea, r_0))

   (the first term applies only when `r_sea > r_0`, and the result is
   clipped at zero).
3. **Sea-surface reflection correction** `ΔL_sea` (Table 11.2.5) — windy
   conditions (cases 1, 2) scatter mid/high frequencies, slightly reducing
   the +3 dB sea reflection; calm conditions (cases 3, 4) leave the sea
   nearly mirror-smooth.

The four cases combine two independent meteorological axes:

  case 1: mixed atmosphere (α ≈ 0.15) + weak inversion (~+1–2 °C)
  case 2: stable atmosphere (α ≈ 0.40) + weak inversion
  case 3: mixed atmosphere               + strong inversion (~+3–5 °C)
  case 4: stable atmosphere              + strong inversion (worst case)

All three corrections are applied per turbine inside the energy sum, so
the per-turbine path lengths feed the duct term correctly:

    L_p,i,k_corr = L_p,i,k_ISO + ΔL_refrac,i + ΔL_duct,i,k + ΔL_sea,i
    L_p,i_corr   = 10·log10 Σ_k 10^(L_p,i,k_corr / 10)

The published totals assume full source output. The annual-average
wind-speed condition is obtained by subtracting ~5 dB from each weighted
total (per IsumiWindfarm.tex §10.5).

## Validation

The `iso_compute.py` summary reproduces Table 12.2 of the paper to
±0.05 dB on every L_p column (Z, A, C, G) across all 9 cases.

Per-band L_p(Z) values match the ISO-baseline appendix tables
`tab:app_*_winter`, `tab:app_*_3km`, `tab:app_*_5km` and `tab:app_C_coast`
to 0.0–0.1 dB (the 0.1-dB band of the appendix's own rounding).

The `compute_weather.py` summary reproduces the corresponding entries of
Table 12.3 and the per-band tables of Appendix C to the same ±0.05 dB
tolerance across all 9 × 4 = 36 combinations.

The `compute_cylindrical.py` summary reproduces the cylindrical row of
Table 12.4 (plan C coastline: L_p(Z) = 83.0, L_p(A) = 62.2, L_p(C) = 79.0,
L_p(G) = 86.6) using ISO 9613-1 α at 10 °C / 70 % as specified in §11.3.
