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.
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/LICENSE +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/MANIFEST.in +0 -0
- {fdsreader-1.2.0rc2/fdsreader.egg-info → fdsreader-1.2.8}/PKG-INFO +1 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/README.md +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/_version.py +1 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/ObstructionCollection.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/obstruction.py +8 -7
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/bndf/utils.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/EvacCollection.py +75 -46
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/evac/evacuation.py +32 -4
- {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/MeshCollection.py +1 -1
- fdsreader-1.2.8/fdsreader/fds_classes/__init__.py +7 -0
- {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/mesh.py +24 -3
- {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/surface.py +0 -0
- {fdsreader-1.2.0rc2/fdsreader/utils → fdsreader-1.2.8/fdsreader}/fds_classes/ventilation.py +2 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/GeometryCollection.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/geom/geometry.py +2 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/IsosurfaceCollection.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/isof/isosurface.py +2 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/ParticleCollection.py +1 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/part/particle.py +2 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/Plot3DCollection.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/pl3d/pl3d.py +2 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/settings.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/simulation.py +95 -15
- fdsreader-1.2.8/fdsreader/slcf/GeomSliceCollection.py +62 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/slcf/SliceCollection.py +0 -0
- fdsreader-1.2.8/fdsreader/slcf/__init__.py +7 -0
- fdsreader-1.2.8/fdsreader/slcf/geomslice.py +458 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/slcf/slice.py +71 -20
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/Smoke3DCollection.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/__init__.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/smoke3d/smoke3d.py +55 -4
- fdsreader-1.2.8/fdsreader/utils/__init__.py +7 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/data.py +25 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/dimension.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/extent.py +12 -9
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/fortran_data.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader/utils/misc.py +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8/fdsreader.egg-info}/PKG-INFO +1 -1
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/SOURCES.txt +8 -6
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/dependency_links.txt +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/requires.txt +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/fdsreader.egg-info/top_level.txt +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/requirements.txt +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/setup.cfg +0 -0
- {fdsreader-1.2.0rc2 → fdsreader-1.2.8}/setup.py +0 -0
- fdsreader-1.2.0rc2/fdsreader/slcf/__init__.py +0 -3
- fdsreader-1.2.0rc2/fdsreader/utils/__init__.py +0 -15
- fdsreader-1.2.0rc2/fdsreader/utils/fds_classes/__init__.py +0 -1
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
|
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
|
|
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
|
|
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,
|
|
171
|
-
times: np.ndarray, n_t: int, lower_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,
|
|
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
|
|
File without changes
|
|
@@ -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.
|
|
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:`
|
|
15
|
-
|
|
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
|
|
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((
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
|
215
|
-
soot_dens=[np.empty((n_t, n_i, n_j)) for
|
|
216
|
-
tmp_g=[np.empty((n_t, n_i, n_j)) for
|
|
217
|
-
radflux=[np.empty((n_t, n_i, n_j)) for
|
|
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
|
-
|
|
279
|
-
|
|
280
|
-
#
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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.
|
|
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
|
-
|
|
389
|
-
evac.
|
|
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]
|
|
File without changes
|
|
@@ -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.
|
|
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.
|
|
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
|
|
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.
|
|
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,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
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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.
|
|
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
|
|
|
File without changes
|