|
| 1 | +from pathlib import Path |
1 | 2 | import pytest
|
2 | 3 | import numpy as np
|
3 | 4 | import matplotlib.pyplot as plt
|
4 | 5 | import mikeio
|
5 | 6 | from mikecore.DfsuFile import DfsuFileType
|
6 | 7 |
|
7 |
| -from mikeio import DfsuSpectral |
| 8 | +from mikeio import DfsuSpectral, EUMType, EUMUnit |
8 | 9 | from mikeio.spatial import GeometryFMPointSpectrum, GeometryFMAreaSpectrum
|
9 | 10 | import mikeio._spectral as _spectral
|
| 11 | +from mikeio.spatial._FM_geometry_spectral import GeometryFMLineSpectrum |
10 | 12 |
|
11 | 13 |
|
12 | 14 | @pytest.fixture
|
@@ -439,3 +441,67 @@ def test_plot_da_spectrum(dfsu_pt: DfsuSpectral) -> None:
|
439 | 441 | # dfs.plot_spectrum(spec, title="pt", plot_type="shaded")
|
440 | 442 | # dfs.plot_spectrum(spec, r_as_periods=False, plot_type="contour")
|
441 | 443 | plt.close("all")
|
| 444 | + |
| 445 | + |
| 446 | +def test_write_line_spectra(dfsu_line: DfsuSpectral, tmp_path: Path) -> None: |
| 447 | + ds = dfsu_line.read() |
| 448 | + |
| 449 | + fp = tmp_path / "line.dfsu" |
| 450 | + |
| 451 | + ds.to_dfs(fp) |
| 452 | + |
| 453 | + ds2 = mikeio.read(fp) |
| 454 | + |
| 455 | + |
| 456 | +def test_write_line_spectra_energy(tmp_path: Path) -> None: |
| 457 | + ds = mikeio.read("tests/testdata/spectra/North_BC_2024_subset.dfsu") |
| 458 | + assert ds["Energy density"].type == EUMType.Wave_energy_density |
| 459 | + assert ds["Energy density"].unit == EUMUnit.meter_pow_2_sec_per_deg |
| 460 | + assert ds.geometry.directions[-1] == pytest.approx(350) |
| 461 | + assert ds.geometry.frequencies[0] == pytest.approx(0.035) |
| 462 | + assert ds.geometry.frequencies[-1] == pytest.approx(0.983586) |
| 463 | + assert ds["Energy density"].isel(time=-1).isel(node=0).isel(frequency=35).isel( |
| 464 | + direction=28 |
| 465 | + ).to_numpy() == pytest.approx(2.6239042e-05) |
| 466 | + |
| 467 | + fp = tmp_path / "line_energy.dfsu" |
| 468 | + ds.to_dfs(fp) |
| 469 | + |
| 470 | + ds2 = mikeio.read(fp) |
| 471 | + assert ds2["Energy density"].type == EUMType.Wave_energy_density |
| 472 | + assert ds2["Energy density"].unit == EUMUnit.meter_pow_2_sec_per_deg |
| 473 | + assert ds2.geometry.directions[-1] == pytest.approx(350) |
| 474 | + assert ds2.geometry.frequencies[0] == pytest.approx(0.035) |
| 475 | + assert ds2.geometry.frequencies[-1] == pytest.approx(0.983586) |
| 476 | + assert ds2["Energy density"].isel(time=-1).isel(node=0).isel(frequency=35).isel( |
| 477 | + direction=28 |
| 478 | + ).to_numpy() == pytest.approx(2.6239042e-05) |
| 479 | + assert np.all(ds2.to_numpy() == ds.to_numpy()) |
| 480 | + |
| 481 | + |
| 482 | +def test_write_area_spectra(dfsu_area: DfsuSpectral, tmp_path: Path) -> None: |
| 483 | + ds = dfsu_area.read() |
| 484 | + fp = tmp_path / "area.dfsu" |
| 485 | + ds.to_dfs(fp) |
| 486 | + |
| 487 | + dfs = mikeio.DfsuSpectral(fp) |
| 488 | + assert dfs.geometry.is_spectral |
| 489 | + assert dfs._type == DfsuFileType.DfsuSpectral2D |
| 490 | + assert dfs.geometry.n_frequencies == 25 |
| 491 | + assert dfs.frequencies is not None |
| 492 | + assert len(dfs.frequencies) == 25 |
| 493 | + assert dfs.geometry.n_directions == 16 |
| 494 | + assert dfs.directions is not None |
| 495 | + assert len(dfs.directions) == 16 |
| 496 | + |
| 497 | + ds2 = dfs.read() |
| 498 | + assert np.all(ds2.to_numpy() == ds.to_numpy()) |
| 499 | + |
| 500 | + |
| 501 | +def test_create_line_spectrum_dummy_coordinates() -> None: |
| 502 | + freq = np.array([0.035, 0.983586]) |
| 503 | + dirs = np.arange(5.0, 360.0, step=10.0) |
| 504 | + geometry = GeometryFMLineSpectrum.create_dummy_coordinates( |
| 505 | + n_nodes=10, frequencies=freq, directions=dirs |
| 506 | + ) |
| 507 | + assert geometry.n_nodes == 10 |
0 commit comments