fdsreader 1.2.0rc2__tar.gz → 1.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/LICENSE +0 -0
  2. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/MANIFEST.in +0 -0
  3. {fdsreader-1.2.0rc2/fdsreader.egg-info → fdsreader-1.2.8}/PKG-INFO +1 -1
  4. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/README.md +0 -0
  5. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/__init__.py +0 -0
  6. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/_version.py +1 -1
  7. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/ObstructionCollection.py +0 -0
  8. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/__init__.py +0 -0
  9. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/obstruction.py +8 -7
  10. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/utils.py +0 -0
  11. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/EvacCollection.py +75 -46
  12. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/__init__.py +0 -0
  13. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/evacuation.py +32 -4
  14. {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/MeshCollection.py +1 -1
  15. fdsreader-1.2.8/fdsreader/fds_classes/__init__.py +7 -0
  16. {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/mesh.py +24 -3
  17. {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/surface.py +0 -0
  18. {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/ventilation.py +2 -1
  19. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/GeometryCollection.py +0 -0
  20. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/__init__.py +0 -0
  21. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/geometry.py +2 -1
  22. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/IsosurfaceCollection.py +0 -0
  23. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/__init__.py +0 -0
  24. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/isosurface.py +2 -1
  25. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/ParticleCollection.py +1 -1
  26. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/__init__.py +0 -0
  27. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/particle.py +2 -1
  28. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/Plot3DCollection.py +0 -0
  29. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/__init__.py +0 -0
  30. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/pl3d.py +2 -1
  31. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/settings.py +0 -0
  32. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/simulation.py +95 -15
  33. fdsreader-1.2.8/fdsreader/slcf/GeomSliceCollection.py +62 -0
  34. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/slcf/SliceCollection.py +0 -0
  35. fdsreader-1.2.8/fdsreader/slcf/__init__.py +7 -0
  36. fdsreader-1.2.8/fdsreader/slcf/geomslice.py +458 -0
  37. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/slcf/slice.py +71 -20
  38. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/Smoke3DCollection.py +0 -0
  39. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/__init__.py +0 -0
  40. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/smoke3d.py +55 -4
  41. fdsreader-1.2.8/fdsreader/utils/__init__.py +7 -0
  42. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/data.py +25 -0
  43. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/dimension.py +0 -0
  44. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/extent.py +12 -9
  45. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/fortran_data.py +0 -0
  46. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/misc.py +0 -0
  47. {fdsreader-1.2.0rc2 → fdsreader-1.2.8/fdsreader.egg-info}/PKG-INFO +1 -1
  48. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/SOURCES.txt +8 -6
  49. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/dependency_links.txt +0 -0
  50. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/requires.txt +0 -0
  51. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/top_level.txt +0 -0
  52. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/requirements.txt +0 -0
  53. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/setup.cfg +0 -0
  54. {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/setup.py +0 -0
  55. fdsreader-1.2.0rc2/fdsreader/slcf/__init__.py +0 -3
  56. fdsreader-1.2.0rc2/fdsreader/utils/__init__.py +0 -15
  57. fdsreader-1.2.0rc2/fdsreader/utils/fds_classes/__init__.py +0 -1
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdsreader
3
- Version: 1.2.0rc2
3
+ Version: 1.2.8
4
4
  Summary: Python reader for data generated by FDS.
5
5
  Home-page: https://github.com/JanVogelsang/fdsreader
6
6
  Author: FZJ IAS-7 (Prof. Dr. Lukas Arnold, Jan Vogelsang)
File without changes
@@ -7,5 +7,5 @@ Provides fdsreader version information.
7
7
 
8
8
  from incremental import Version
9
9
 
10
- __version__ = Version('fdsreader', 1, 2, 0, release_candidate=2)
10
+ __version__ = Version('fdsreader', 1, 2, 8)
11
11
  __all__ = ["__version__"]
@@ -3,7 +3,7 @@ from typing import List, Dict, Tuple, Union, Sequence
3
3
  from typing_extensions import Literal
4
4
  import numpy as np
5
5
 
6
- from fdsreader.utils import Surface, Extent, Quantity, Dimension
6
+ from fdsreader.utils import Extent, Quantity, Dimension
7
7
  import fdsreader.utils.fortran_data as fdtype
8
8
  from fdsreader import settings
9
9
 
@@ -149,12 +149,12 @@ class SubObstruction:
149
149
 
150
150
  :ivar extent: :class:`Extent` object containing 3-dimensional extent information.
151
151
  :ivar bound_indices: Indices used to define obstruction bounds in terms of mesh locations.
152
- :ivar side_surfaces: Tuple of six surfaces for each side of the cuboid.
152
+ :ivar side_surfaces: Tuple of six :class:`Surface`s for each side of the cuboid.
153
153
  :ivar hide_times: List with points in time from when on the SubObstruction will be hidden.
154
154
  :ivar show_times: List with points in time from when on the SubObstruction will be shown.
155
155
  """
156
156
 
157
- def __init__(self, side_surfaces: Tuple[Surface, ...], bound_indices: Tuple[int, int, int, int, int, int],
157
+ def __init__(self, side_surfaces: Tuple, bound_indices: Tuple[int, int, int, int, int, int],
158
158
  extent: Extent):
159
159
  self.extent = extent
160
160
  self.side_surfaces = side_surfaces
@@ -167,11 +167,12 @@ class SubObstruction:
167
167
  self.hide_times = list()
168
168
  self.show_times = list()
169
169
 
170
- def _add_patches(self, bid: int, cell_centered: bool, quantity: str, short_name: str, unit: str, patches: List[Patch],
171
- times: np.ndarray, n_t: int, lower_bounds: np.ndarray, upper_bounds: np.ndarray):
170
+ def _add_patches(self, bid: int, cell_centered: bool, quantity: str, short_name: str, unit: str,
171
+ patches: List[Patch], times: np.ndarray, n_t: int, lower_bounds: np.ndarray,
172
+ upper_bounds: np.ndarray):
172
173
  if bid not in self._boundary_data:
173
- self._boundary_data[bid] = Boundary(Quantity(quantity, short_name, unit), cell_centered, times, n_t, patches,
174
- lower_bounds, upper_bounds)
174
+ self._boundary_data[bid] = Boundary(Quantity(quantity, short_name, unit), cell_centered, times, n_t,
175
+ patches, lower_bounds, upper_bounds)
175
176
 
176
177
  if not settings.LAZY_LOAD:
177
178
  _ = self._boundary_data[bid].data
@@ -4,15 +4,15 @@ from typing import Iterable, Dict, List, Union
4
4
  import numpy as np
5
5
 
6
6
  from fdsreader.evac import Evacuation
7
- from fdsreader.utils import Mesh
7
+ from fdsreader.fds_classes import Mesh
8
8
  from fdsreader.utils.data import FDSDataCollection, Quantity
9
9
  import fdsreader.utils.fortran_data as fdtype
10
10
  from fdsreader import settings
11
11
 
12
12
 
13
13
  class EvacCollection(FDSDataCollection):
14
- """Collection of :class:`Plot3D` objects. Offers extensive functionality for filtering and
15
- using plot3Ds as well as its subclasses such as :class:`SubPlot3D`.
14
+ """Collection of :class:`Evacuation` objects. Next to agent-class specific data (such as trajectories) lots of
15
+ other data such as FED-data is provided via this class.
16
16
 
17
17
  :ivar times: List of all time steps of the simulation.
18
18
  :ivar z_offsets: The offset in z-direction for each mesh where the evac plane lays.
@@ -92,8 +92,8 @@ class EvacCollection(FDSDataCollection):
92
92
  units[i] == "TargetDoorCounter"}
93
93
 
94
94
  @property
95
- def xyz(self) -> np.ndarray:
96
- """
95
+ def xyz(self) -> List[np.ndarray]:
96
+ """List of xyz-data for each mesh.
97
97
  """
98
98
  if not hasattr(self, "_xyz"):
99
99
  self._load_xyz_data()
@@ -121,18 +121,26 @@ class EvacCollection(FDSDataCollection):
121
121
  n_corrs = meta[2]
122
122
  n_devc = fdtype.read(infile, fdtype.INT, 1)[0][0][0]
123
123
 
124
- n_i, n_j, n_k, n = fdtype.read(infile, dtype_grid_meta, 1)[0][0] # n_k will always be 1
124
+ n_i = list()
125
+ n_j = list()
126
+ for g in range(n_grids):
127
+ n_i_g, n_j_g, _, _ = fdtype.read(infile, dtype_grid_meta, 1)[0][0]
128
+ n_i.append(n_i_g)
129
+ n_j.append(n_j_g)
130
+ for i in range(n_i_g):
131
+ for j in range(n_j_g):
132
+ _ = fdtype.read(infile, dtype_grid_data, 1)
125
133
 
126
134
  # Reset pointer (after file header)
127
135
  infile.seek(fdtype.INT.itemsize * 2 + dtype_meta.itemsize)
128
136
 
129
- self._xyz = np.empty((n_grids, n_i, n_j, 3))
137
+ self._xyz = [np.empty((n_i[g], n_j[g], 3)) for g in range(n_grids)]
130
138
 
131
139
  for g in range(n_grids):
132
140
  infile.seek(dtype_grid_meta.itemsize, 1)
133
- for i in range(n_i):
134
- for j in range(n_j):
135
- self._xyz[g, i, j] = fdtype.read(infile, dtype_grid_data, 1)[0][0]
141
+ for i in range(n_i[g]):
142
+ for j in range(n_j[g]):
143
+ self._xyz[g][i, j] = fdtype.read(infile, dtype_grid_data, 1)[0][0]
136
144
 
137
145
  if os.path.exists(self._base_path + ".fed"):
138
146
  self._load_fed_data(n_corrs)
@@ -183,6 +191,9 @@ class EvacCollection(FDSDataCollection):
183
191
  dtype_meta = fdtype.new((('i', 6),))
184
192
  dtype_time = fdtype.new((('f', 2),))
185
193
  dtype_grid_meta = fdtype.new((('i', 4),))
194
+ dtype_corr = fdtype.new((('f', 8),))
195
+ dtype_devs_meta = fdtype.new((('i', 2),))
196
+ dtype_devs_data = fdtype.new((('i', 1), ('f', 1), ('i', 2), ('f', 1)))
186
197
 
187
198
  # File header
188
199
  file_format = fdtype.read(infile, fdtype.INT, 1)[0][0][0]
@@ -195,26 +206,35 @@ class EvacCollection(FDSDataCollection):
195
206
 
196
207
  # Read gridsize from first timestep header
197
208
  infile.seek(dtype_time.itemsize, 1)
198
- n_i, n_j, n_k, n = fdtype.read(infile, dtype_grid_meta, 1)[0][0] # n_k will always be 1
209
+
210
+ n_i = list()
211
+ n_j = list()
212
+ n = list()
213
+ dtype_grid_data = list()
214
+ for g in range(n_grids):
215
+ n_i_g, n_j_g, _, n_g = fdtype.read(infile, dtype_grid_meta, 1)[0][0]
216
+ n_i.append(n_i_g)
217
+ n_j.append(n_j_g)
218
+ n.append(n_g)
219
+ dtype_grid_data.append(fdtype.new((('f', n_g),)))
220
+ for i in range(n_i_g):
221
+ for j in range(n_j_g):
222
+ _ = fdtype.read(infile, dtype_grid_data[-1], 1)
199
223
 
200
224
  # Reset pointer (after file header)
201
225
  infile.seek(dtype_meta.itemsize + fdtype.INT.itemsize * 2)
202
226
 
203
- dtype_grid_data = fdtype.new((('f', n),))
204
- dtype_corr = fdtype.new((('f', 8),))
205
- dtype_devs_meta = fdtype.new((('i', 2),))
206
- dtype_devs_data = fdtype.new((('i', 1), ('f', 1), ('i', 2), ('f', 1)))
207
-
208
- n_t = (os.stat(file_path).st_size - (fdtype.INT.itemsize * 2 + dtype_meta.itemsize)) // \
209
- (dtype_time.itemsize + n_grids * (dtype_grid_meta.itemsize + n_i * n_j * dtype_grid_data.itemsize) +
210
- n_corrs * dtype_corr.itemsize + fdtype.FLOAT.itemsize + n_devc * (
211
- dtype_devs_meta.itemsize + dtype_devs_data.itemsize))
227
+ n_t = (os.stat(file_path).st_size - (fdtype.INT.itemsize * 2 + dtype_meta.itemsize)) // (
228
+ dtype_time.itemsize + sum(
229
+ (dtype_grid_meta.itemsize + n_i[g] * n_j[g] * dtype_grid_data[g].itemsize) for g in
230
+ range(n_grids)) + n_corrs * dtype_corr.itemsize + fdtype.FLOAT.itemsize + n_devc * (
231
+ dtype_devs_meta.itemsize + dtype_devs_data.itemsize))
212
232
 
213
233
  times = list()
214
- self._fed_grid = dict(co_co2_o2=[np.empty((n_t, n_i, n_j)) for _ in range(n_grids)],
215
- soot_dens=[np.empty((n_t, n_i, n_j)) for _ in range(n_grids)],
216
- tmp_g=[np.empty((n_t, n_i, n_j)) for _ in range(n_grids)],
217
- radflux=[np.empty((n_t, n_i, n_j)) for _ in range(n_grids)])
234
+ self._fed_grid = dict(co_co2_o2=[np.empty((n_t, n_i[g], n_j[g])) for g in range(n_grids)],
235
+ soot_dens=[np.empty((n_t, n_i[g], n_j[g])) for g in range(n_grids)],
236
+ tmp_g=[np.empty((n_t, n_i[g], n_j[g])) for g in range(n_grids)],
237
+ radflux=[np.empty((n_t, n_i[g], n_j[g])) for g in range(n_grids)])
218
238
  self._fed_corr = dict(co_co2_o2=[np.empty((n_t, 2)) for _ in range(n_corrs)],
219
239
  soot_dens=[np.empty((n_t, 2)) for _ in range(n_corrs)],
220
240
  tmp_g=[np.empty((n_t, 2)) for _ in range(n_corrs)],
@@ -229,9 +249,9 @@ class EvacCollection(FDSDataCollection):
229
249
 
230
250
  for g in range(n_grids):
231
251
  infile.seek(dtype_grid_meta.itemsize, 1)
232
- for i in range(n_i):
233
- for j in range(n_j):
234
- co_co2_o2, soot_dens, tmp_g, radflux = fdtype.read(infile, dtype_grid_data, 1)[0][0][:4]
252
+ for i in range(n_i[g]):
253
+ for j in range(n_j[g]):
254
+ co_co2_o2, soot_dens, tmp_g, radflux = fdtype.read(infile, dtype_grid_data[g], 1)[0][0][:4]
235
255
  self._fed_grid["co_co2_o2"][g][t, i, j] = co_co2_o2
236
256
  self._fed_grid["soot_dens"][g][t, i, j] = soot_dens
237
257
  self._fed_grid["tmp_g"][g][t, i, j] = tmp_g
@@ -271,25 +291,29 @@ class EvacCollection(FDSDataCollection):
271
291
 
272
292
  with open(file_path, 'rb') as infile:
273
293
  dtype_grid_meta = fdtype.new((('i', 3),))
274
- dtype_grid_data = fdtype.new((('f', 2),))
294
+ dtype_grid_data = fdtype.new((('f', 2),)) # u, v
275
295
 
276
296
  n_grids = fdtype.read(infile, fdtype.INT, 1)[0][0][0]
277
297
 
278
- n_i, n_j, n_k = fdtype.read(infile, dtype_grid_meta, 1)[0][0] # n_k will always be 1
279
-
280
- # Reset pointer (after file header)
281
- infile.seek(fdtype.INT.itemsize)
282
-
283
- n_fields = (os.stat(file_path).st_size - fdtype.INT.itemsize) // (
284
- n_grids * (dtype_grid_meta.itemsize + n_i * n_j * dtype_grid_data.itemsize))
285
-
286
- self._eff = np.empty((n_grids, n_fields, n_i, n_j, 2))
287
- for g in range(n_grids):
288
- for f in range(n_fields):
289
- infile.seek(dtype_grid_meta.itemsize, 1)
290
- for i in range(n_i):
291
- for j in range(n_j):
292
- self._eff[g, f, i, j] = fdtype.read(infile, dtype_grid_data, 1)[0][0]
298
+ # n_fields = (os.stat(file_path).st_size - fdtype.INT.itemsize) // (
299
+ # sum(dtype_grid_meta.itemsize + n_i[g] * n_j[g] * dtype_grid_data.itemsize for g in range(n_grids)))
300
+ #
301
+ # self._eff = np.empty((n_grids, n_fields, n_i, n_j, 2))
302
+ # for g in range(n_grids):
303
+ # for f in range(n_fields):
304
+ # infile.seek(dtype_grid_meta.itemsize, 1)
305
+ # for i in range(n_i[g]):
306
+ # for j in range(n_j[g]):
307
+ # self._eff[g, f, i, j] = fdtype.read(infile, dtype_grid_data, 1)[0][0]
308
+
309
+ self._eff = list()
310
+ meta = fdtype.read(infile, dtype_grid_meta, 1)
311
+ while len(meta) > 0:
312
+ n_i, n_j, _ = meta[0][0]
313
+ for i in range(n_i + 2):
314
+ for j in range(n_j + 2):
315
+ self._eff.append(fdtype.read(infile, dtype_grid_data, 1)[0][0])
316
+ meta = fdtype.read(infile, dtype_grid_meta, 1)
293
317
 
294
318
  def get_unfiltered_positions(self, quantity: Union[Quantity, str] = None):
295
319
  """Convenience function that combines all trajectories into a single array.
@@ -357,7 +381,10 @@ class EvacCollection(FDSDataCollection):
357
381
  for quantity in evac.quantities:
358
382
  evac._data[quantity.name].append(np.empty((size,), dtype=np.float32))
359
383
  evac._positions.append(np.empty((size, 3), dtype=np.float32))
360
- evac._ap.append(np.empty((size, 4), dtype=np.float32))
384
+ evac._body_angles.append(np.empty((size,), dtype=np.float32))
385
+ evac._semi_major_axis.append(np.empty((size,), dtype=np.float32))
386
+ evac._semi_minor_axis.append(np.empty((size,), dtype=np.float32))
387
+ evac._agent_heights.append(np.empty((size,), dtype=np.float32))
361
388
  evac._tags.append(np.empty((size,), dtype=int))
362
389
 
363
390
  for mesh, file_path in self._file_paths.items():
@@ -385,8 +412,10 @@ class EvacCollection(FDSDataCollection):
385
412
  pos = fdtype.read(infile, dtype_positions, 1)[0][0].reshape((n_humans, 7),
386
413
  order='F').astype(float)
387
414
  evac._positions[t][offset: offset + n_humans] = pos[:, :3]
388
- # Todo: What might this be for?
389
- evac._ap[t][offset: offset + n_humans] = pos[:, 3:]
415
+ evac._body_angles[t][offset: offset + n_humans] = pos[:, 3]
416
+ evac._semi_major_axis[t][offset: offset + n_humans] = pos[:, 4]
417
+ evac._semi_minor_axis[t][offset: offset + n_humans] = pos[:, 5]
418
+ evac._agent_heights[t][offset: offset + n_humans] = pos[:, 6]
390
419
  # Read tags
391
420
  dtype_tags = fdtype.new((('i', n_humans),))
392
421
  evac._tags[t][offset: offset + n_humans] = fdtype.read(infile, dtype_tags, 1)[0][0]
@@ -2,7 +2,8 @@ from typing import List, Tuple, Dict, Sequence, Union
2
2
 
3
3
  import numpy as np
4
4
 
5
- from fdsreader.utils import Quantity, Mesh, Extent
5
+ from fdsreader.fds_classes import Mesh
6
+ from fdsreader.utils import Quantity
6
7
 
7
8
 
8
9
  # class Entrance:
@@ -54,7 +55,10 @@ class Evacuation:
54
55
  self.n_humans: Dict[Mesh, List[int]] = dict()
55
56
 
56
57
  self._positions: List[np.ndarray] = list()
57
- self._ap: List[np.ndarray] = list()
58
+ self._body_angles: List[np.ndarray] = list()
59
+ self._semi_major_axis: List[np.ndarray] = list()
60
+ self._semi_minor_axis: List[np.ndarray] = list()
61
+ self._agent_heights: List[np.ndarray] = list()
58
62
  self._tags: List[np.ndarray] = list()
59
63
  self._data: Dict[str, List[np.ndarray]] = {q.name: [] for q in self.quantities}
60
64
  self.times: Sequence[float] = list()
@@ -146,12 +150,36 @@ class Evacuation:
146
150
  return self._positions
147
151
 
148
152
  @property
149
- def ap(self) -> List[np.ndarray]:
153
+ def body_angles(self) -> List[np.ndarray]:
150
154
  """
151
155
  """
152
156
  if len(self._positions) == 0 and len(self._tags) == 0:
153
157
  self._init_callback()
154
- return self._ap
158
+ return self._body_angles
159
+
160
+ @property
161
+ def semi_major_axis(self) -> List[np.ndarray]:
162
+ """
163
+ """
164
+ if len(self._positions) == 0 and len(self._tags) == 0:
165
+ self._init_callback()
166
+ return self._semi_major_axis
167
+
168
+ @property
169
+ def semi_minor_axis(self) -> List[np.ndarray]:
170
+ """
171
+ """
172
+ if len(self._positions) == 0 and len(self._tags) == 0:
173
+ self._init_callback()
174
+ return self._semi_minor_axis
175
+
176
+ @property
177
+ def agent_heights(self) -> List[np.ndarray]:
178
+ """
179
+ """
180
+ if len(self._positions) == 0 and len(self._tags) == 0:
181
+ self._init_callback()
182
+ return self._agent_heights
155
183
 
156
184
  def clear_cache(self):
157
185
  """Remove all data from the internal cache that has been loaded so far to free memory.
@@ -1,6 +1,6 @@
1
1
  from typing import Iterable
2
2
 
3
- from fdsreader.utils import Mesh
3
+ from fdsreader.fds_classes import Mesh
4
4
  from fdsreader.utils.data import FDSDataCollection
5
5
 
6
6
 
@@ -0,0 +1,7 @@
1
+ from .mesh import Mesh
2
+
3
+ from .MeshCollection import MeshCollection
4
+
5
+ from .surface import Surface
6
+
7
+ from .ventilation import Ventilation
@@ -1,8 +1,10 @@
1
- from typing import Dict, Tuple, Sequence
1
+ from typing import Dict, Tuple, Sequence, List, Union
2
2
  from typing_extensions import Literal
3
3
  import numpy as np
4
4
 
5
- from fdsreader.utils import Dimension, Extent
5
+ from fdsreader import settings
6
+ from fdsreader.utils import Dimension, Extent, Quantity
7
+ from fdsreader.bndf import Boundary, Patch
6
8
 
7
9
 
8
10
  class Mesh:
@@ -37,6 +39,8 @@ class Mesh:
37
39
 
38
40
  self.obstructions = list()
39
41
 
42
+ self._boundary_data: Dict[int, Boundary] = dict()
43
+
40
44
  def get_obstruction_mask(self, times: Sequence[float], cell_centered=False) -> np.ndarray:
41
45
  """Marks all cells which are blocked by an obstruction.
42
46
 
@@ -85,7 +89,7 @@ class Mesh:
85
89
  :param dimension: The dimensions in which to return the indices (1=x, 2=y, 3=z).
86
90
  """
87
91
  # Convert possible integer input to chars
88
- dimension = tuple(('x', 'y', 'z')[dim-1] if type(dim) == int else dim for dim in dimension)
92
+ dimension = tuple(('x', 'y', 'z')[dim - 1] if type(dim) == int else dim for dim in dimension)
89
93
 
90
94
  ret = list()
91
95
  for i, dim in enumerate(dimension):
@@ -101,6 +105,23 @@ class Mesh:
101
105
  ret.append(idx)
102
106
  return tuple(ret)
103
107
 
108
+ def _add_patches(self, bid: int, cell_centered: bool, quantity: str, short_name: str, unit: str,
109
+ patches: List[Patch], times: np.ndarray, n_t: int, lower_bounds: np.ndarray,
110
+ upper_bounds: np.ndarray):
111
+ if bid not in self._boundary_data:
112
+ self._boundary_data[bid] = Boundary(Quantity(quantity, short_name, unit), cell_centered, times, n_t,
113
+ patches, lower_bounds, upper_bounds)
114
+
115
+ if not settings.LAZY_LOAD:
116
+ _ = self._boundary_data[bid].data
117
+
118
+ def get_boundary_data(self, quantity: Union[str, Quantity]):
119
+ if type(quantity) == Quantity:
120
+ quantity = quantity.name
121
+ return next(b for b in self._boundary_data.values() if
122
+ b.quantity.name.lower() == quantity.lower() or b.quantity.short_name.lower() == quantity.lower())
123
+
124
+
104
125
  def __getitem__(self, dimension: Literal[0, 1, 2, 'x', 'y', 'z']) -> np.ndarray:
105
126
  """Get all values in given dimension.
106
127
 
@@ -1,6 +1,7 @@
1
1
  from typing import Union, Tuple, Dict
2
2
 
3
- from fdsreader.utils import Surface, Extent, Mesh
3
+ from fdsreader.fds_classes import Surface, Mesh
4
+ from fdsreader.utils import Extent
4
5
 
5
6
 
6
7
  class SubVentilation:
@@ -3,7 +3,8 @@ from typing import Tuple, Dict, Iterable
3
3
 
4
4
  import numpy as np
5
5
 
6
- from fdsreader.utils import Surface, Quantity
6
+ from fdsreader.fds_classes import Surface
7
+ from fdsreader.utils import Quantity
7
8
  import fdsreader.utils.fortran_data as fdtype
8
9
 
9
10
 
@@ -4,7 +4,8 @@ from typing import BinaryIO, Dict, Union, List, Tuple, Optional
4
4
 
5
5
  import numpy as np
6
6
 
7
- from fdsreader.utils import Quantity, Mesh
7
+ from fdsreader.fds_classes import Mesh
8
+ from fdsreader.utils import Quantity
8
9
  from fdsreader import settings
9
10
  import fdsreader.utils.fortran_data as fdtype
10
11
 
@@ -2,7 +2,7 @@ from typing import Iterable, Dict, List
2
2
  import numpy as np
3
3
 
4
4
  from fdsreader.part import Particle
5
- from fdsreader.utils import Mesh
5
+ from fdsreader.fds_classes import Mesh
6
6
  from fdsreader.utils.data import FDSDataCollection, Quantity
7
7
  import fdsreader.utils.fortran_data as fdtype
8
8
  from fdsreader import settings
@@ -2,7 +2,8 @@ from typing import List, Tuple, Dict, Sequence
2
2
 
3
3
  import numpy as np
4
4
 
5
- from fdsreader.utils import Quantity, Mesh
5
+ from fdsreader.fds_classes import Mesh
6
+ from fdsreader.utils import Quantity
6
7
 
7
8
 
8
9
  class Particle:
@@ -4,7 +4,8 @@ from copy import deepcopy
4
4
  from typing import Dict, Sequence
5
5
  import numpy as np
6
6
 
7
- from fdsreader.utils import Quantity, Mesh
7
+ from fdsreader.fds_classes import Mesh
8
+ from fdsreader.utils import Quantity
8
9
  from fdsreader import settings
9
10
  import fdsreader.utils.fortran_data as fdtype
10
11