8
8
from tqdm import trange
9
9
10
10
from ..dataset import DataArray , Dataset
11
+ from ..eum import ItemInfo
11
12
from ..dfs ._dfs import _get_item_info , _valid_item_numbers , _valid_timesteps
12
13
from .._spectral import calc_m0_from_spectrum
13
- from ._dfsu import _Dfsu , get_elements_from_source , get_nodes_from_source
14
+ from ._dfsu import (
15
+ _get_dfsu_info ,
16
+ get_elements_from_source ,
17
+ get_nodes_from_source ,
18
+ _validate_elements_and_geometry_sel ,
19
+ )
14
20
from ..spatial import (
15
21
GeometryFMAreaSpectrum ,
16
22
GeometryFMLineSpectrum ,
17
23
GeometryFMPointSpectrum ,
18
24
)
19
25
20
26
21
- class DfsuSpectral (_Dfsu ):
27
+ class DfsuSpectral :
28
+ show_progress = False
22
29
23
30
def __init__ (self , filename : str | Path ) -> None :
24
- super ().__init__ (filename )
31
+ info = _get_dfsu_info (filename )
32
+ self ._filename = info .filename
33
+ self ._type = info .type
34
+ self ._deletevalue = info .deletevalue
35
+ self ._time = info .time
36
+ self ._timestep = info .timestep
37
+ self ._items = info .items
25
38
self ._geometry = self ._read_geometry (self ._filename )
26
39
40
+ def __repr__ (self ):
41
+ out = [f"<mikeio.{ self .__class__ .__name__ } >" ]
42
+
43
+ if self ._type is not DfsuFileType .DfsuSpectral0D :
44
+ if self ._type is not DfsuFileType .DfsuSpectral1D :
45
+ out .append (f"number of elements: { self .geometry .n_elements } " )
46
+ out .append (f"number of nodes: { self .geometry .n_nodes } " )
47
+ if self .geometry .is_spectral :
48
+ if self .geometry .n_directions > 0 :
49
+ out .append (f"number of directions: { self .geometry .n_directions } " )
50
+ if self .geometry .n_frequencies > 0 :
51
+ out .append (f"number of frequencies: { self .geometry .n_frequencies } " )
52
+ if self .geometry .projection_string :
53
+ out .append (f"projection: { self .geometry .projection_string } " )
54
+ if self .n_items < 10 :
55
+ out .append ("items:" )
56
+ for i , item in enumerate (self .items ):
57
+ out .append (f" { i } : { item } " )
58
+ else :
59
+ out .append (f"number of items: { self .geometry .n_items } " )
60
+ if self .n_timesteps == 1 :
61
+ out .append (f"time: time-invariant file (1 step) at { self .time [0 ]} " )
62
+ else :
63
+ out .append (
64
+ f"time: { str (self .time [0 ])} - { str (self .time [- 1 ])} ({ self .n_timesteps } records)"
65
+ )
66
+ return str .join ("\n " , out )
67
+
68
+ @property
69
+ def geometry (
70
+ self ,
71
+ ) -> GeometryFMPointSpectrum | GeometryFMLineSpectrum | GeometryFMAreaSpectrum :
72
+ """Geometry"""
73
+ return self ._geometry
74
+
75
+ @property
76
+ def deletevalue (self ) -> float :
77
+ """File delete value"""
78
+ return self ._deletevalue
79
+
80
+ @property
81
+ def n_items (self ) -> int :
82
+ """Number of items"""
83
+ return len (self .items )
84
+
85
+ @property
86
+ def items (self ) -> list [ItemInfo ]:
87
+ """List of items"""
88
+ return self ._items
89
+
90
+ @property
91
+ def start_time (self ) -> pd .Timestamp :
92
+ """File start time"""
93
+ return self ._time [0 ]
94
+
95
+ @property
96
+ def n_timesteps (self ) -> int :
97
+ """Number of time steps"""
98
+ return len (self ._time )
99
+
100
+ @property
101
+ def timestep (self ) -> float :
102
+ """Time step size in seconds"""
103
+ return self ._timestep
104
+
105
+ @property
106
+ def end_time (self ) -> pd .Timestamp :
107
+ """File end time"""
108
+ return self ._time [- 1 ]
109
+
110
+ @property
111
+ def time (self ) -> pd .DatetimeIndex :
112
+ return self ._time
113
+
27
114
@staticmethod
28
115
def _read_geometry (
29
116
filename : str ,
@@ -98,8 +185,8 @@ def _get_spectral_data_shape(
98
185
self , n_steps : int , elements : Sized | None , dfsu_type : DfsuFileType
99
186
) -> Tuple [Tuple [int , ...], Tuple [int , ...], Tuple [str , ...]]:
100
187
dims = [] if n_steps == 1 else ["time" ]
101
- n_freq = self .n_frequencies
102
- n_dir = self .n_directions
188
+ n_freq = self .geometry . n_frequencies
189
+ n_dir = self .geometry . n_directions
103
190
shape : Tuple [int , ...] = (n_dir , n_freq )
104
191
if n_dir == 0 :
105
192
shape = (n_freq ,)
@@ -109,21 +196,21 @@ def _get_spectral_data_shape(
109
196
read_shape = (n_steps , * shape )
110
197
elif dfsu_type == DfsuFileType .DfsuSpectral1D :
111
198
# node-based, FE-style
112
- n_nodes = self .n_nodes if elements is None else len (elements )
199
+ n_nodes = self .geometry . n_nodes if elements is None else len (elements )
113
200
if n_nodes == 1 :
114
201
read_shape = (n_steps , * shape )
115
202
else :
116
203
dims .append ("node" )
117
204
read_shape = (n_steps , n_nodes , * shape )
118
- shape = (* shape , self .n_nodes )
205
+ shape = (* shape , self .geometry . n_nodes )
119
206
else :
120
- n_elems = self .n_elements if elements is None else len (elements )
207
+ n_elems = self .geometry . n_elements if elements is None else len (elements )
121
208
if n_elems == 1 :
122
209
read_shape = (n_steps , * shape )
123
210
else :
124
211
dims .append ("element" )
125
212
read_shape = (n_steps , n_elems , * shape )
126
- shape = (* shape , self .n_elements )
213
+ shape = (* shape , self .geometry . n_elements )
127
214
128
215
if n_dir > 1 :
129
216
dims .append ("direction" )
@@ -202,7 +289,7 @@ def read(
202
289
single_time_selected , time_steps = _valid_timesteps (dfs , time )
203
290
204
291
if self ._type == DfsuFileType .DfsuSpectral2D :
205
- self . _validate_elements_and_geometry_sel (elements , area = area , x = x , y = y )
292
+ _validate_elements_and_geometry_sel (elements , area = area , x = x , y = y )
206
293
if elements is None :
207
294
elements = self ._parse_geometry_sel (area = area , x = x , y = y )
208
295
else :
@@ -214,10 +301,8 @@ def read(
214
301
215
302
geometry , pts = self ._parse_elements_nodes (elements , nodes )
216
303
217
- item_numbers = _valid_item_numbers (
218
- dfs .ItemInfo , items , ignore_first = self .is_layered
219
- )
220
- items = _get_item_info (dfs .ItemInfo , item_numbers , ignore_first = self .is_layered )
304
+ item_numbers = _valid_item_numbers (dfs .ItemInfo , items )
305
+ items = _get_item_info (dfs .ItemInfo , item_numbers )
221
306
n_items = len (item_numbers )
222
307
223
308
deletevalue = self .deletevalue
0 commit comments