ansys-fluent-core 0.34.dev0__py3-none-any.whl → 0.35.dev0__py3-none-any.whl
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.
Potentially problematic release.
This version of ansys-fluent-core might be problematic. Click here for more details.
- ansys/fluent/core/__init__.py +48 -84
- ansys/fluent/core/codegen/allapigen.py +2 -2
- ansys/fluent/core/codegen/builtin_settingsgen.py +41 -13
- ansys/fluent/core/codegen/datamodelgen.py +3 -1
- ansys/fluent/core/codegen/print_fluent_version.py +2 -2
- ansys/fluent/core/codegen/settingsgen.py +18 -6
- ansys/fluent/core/codegen/tuigen.py +6 -5
- ansys/fluent/core/data_model_cache.py +2 -2
- ansys/fluent/core/docker/docker_compose.py +11 -9
- ansys/fluent/core/docker/utils.py +35 -0
- ansys/fluent/core/examples/downloads.py +8 -11
- ansys/fluent/core/exceptions.py +13 -1
- ansys/fluent/core/field_data_interfaces.py +239 -38
- ansys/fluent/core/file_session.py +167 -61
- ansys/fluent/core/fluent_connection.py +41 -26
- ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
- ansys/fluent/core/generated/datamodel_231/flicing.py +40 -40
- ansys/fluent/core/generated/datamodel_231/meshing.py +231 -231
- ansys/fluent/core/generated/datamodel_232/flicing.py +50 -50
- ansys/fluent/core/generated/datamodel_232/meshing.py +189 -189
- ansys/fluent/core/generated/datamodel_241/flicing.py +30 -30
- ansys/fluent/core/generated/datamodel_241/meshing.py +290 -290
- ansys/fluent/core/generated/datamodel_242/flicing.py +50 -50
- ansys/fluent/core/generated/datamodel_242/meshing.py +331 -331
- ansys/fluent/core/generated/datamodel_242/part_management.py +6 -6
- ansys/fluent/core/generated/datamodel_251/flicing.py +65 -65
- ansys/fluent/core/generated/datamodel_251/meshing.py +300 -300
- ansys/fluent/core/generated/datamodel_251/part_management.py +6 -6
- ansys/fluent/core/generated/datamodel_252/flicing.py +25 -25
- ansys/fluent/core/generated/datamodel_252/meshing.py +382 -382
- ansys/fluent/core/generated/datamodel_252/part_management.py +10 -10
- ansys/fluent/core/generated/datamodel_261/flicing.py +45 -45
- ansys/fluent/core/generated/datamodel_261/meshing.py +454 -435
- ansys/fluent/core/generated/datamodel_261/part_management.py +5 -5
- ansys/fluent/core/generated/datamodel_261/preferences.py +7 -0
- ansys/fluent/core/generated/fluent_version_252.py +1 -1
- ansys/fluent/core/generated/fluent_version_261.py +3 -3
- ansys/fluent/core/generated/meshing/tui_261.py +54 -3
- ansys/fluent/core/generated/solver/settings_231.py +1 -0
- ansys/fluent/core/generated/solver/settings_231.pyi +3025 -1
- ansys/fluent/core/generated/solver/settings_232.py +1 -0
- ansys/fluent/core/generated/solver/settings_232.pyi +3425 -1
- ansys/fluent/core/generated/solver/settings_241.py +1 -0
- ansys/fluent/core/generated/solver/settings_241.pyi +4423 -1
- ansys/fluent/core/generated/solver/settings_242.py +1 -0
- ansys/fluent/core/generated/solver/settings_242.pyi +5474 -1
- ansys/fluent/core/generated/solver/settings_251.py +11 -0
- ansys/fluent/core/generated/solver/settings_251.pyi +6006 -1
- ansys/fluent/core/generated/solver/settings_252.py +11 -1
- ansys/fluent/core/generated/solver/settings_252.pyi +6782 -2
- ansys/fluent/core/generated/solver/settings_261.py +5592 -2740
- ansys/fluent/core/generated/solver/settings_261.pyi +10335 -1994
- ansys/fluent/core/generated/solver/settings_builtin.py +560 -38
- ansys/fluent/core/generated/solver/settings_builtin.pyi +24 -18
- ansys/fluent/core/generated/solver/tui_261.py +409 -285
- ansys/fluent/core/launcher/container_launcher.py +25 -6
- ansys/fluent/core/launcher/error_handler.py +1 -1
- ansys/fluent/core/launcher/fluent_container.py +97 -45
- ansys/fluent/core/launcher/launch_options.py +5 -4
- ansys/fluent/core/launcher/launcher.py +18 -2
- ansys/fluent/core/launcher/launcher_utils.py +63 -15
- ansys/fluent/core/launcher/pim_launcher.py +17 -3
- ansys/fluent/core/launcher/process_launch_string.py +3 -2
- ansys/fluent/core/launcher/server_info.py +7 -3
- ansys/fluent/core/launcher/slurm_launcher.py +4 -2
- ansys/fluent/core/launcher/standalone_launcher.py +6 -3
- ansys/fluent/core/launcher/watchdog.py +6 -6
- ansys/fluent/core/launcher/watchdog_exec +1 -1
- ansys/fluent/core/logger.py +3 -1
- ansys/fluent/core/module_config.py +358 -0
- ansys/fluent/core/pyfluent_warnings.py +9 -3
- ansys/fluent/core/report.py +2 -2
- ansys/fluent/core/search.py +34 -13
- ansys/fluent/core/services/__init__.py +2 -2
- ansys/fluent/core/services/api_upgrade.py +3 -2
- ansys/fluent/core/services/app_utilities.py +39 -0
- ansys/fluent/core/services/datamodel_se.py +4 -2
- ansys/fluent/core/services/deprecated_field_data.py +4 -4
- ansys/fluent/core/services/field_data.py +185 -49
- ansys/fluent/core/services/health_check.py +3 -1
- ansys/fluent/core/services/interceptors.py +8 -6
- ansys/fluent/core/services/reduction.py +16 -5
- ansys/fluent/core/services/settings.py +1 -0
- ansys/fluent/core/session.py +47 -4
- ansys/fluent/core/session_pure_meshing.py +6 -6
- ansys/fluent/core/session_pure_meshing.pyi +1 -0
- ansys/fluent/core/session_shared.py +4 -4
- ansys/fluent/core/session_solver.py +41 -10
- ansys/fluent/core/session_solver.pyi +1 -0
- ansys/fluent/core/session_utilities.py +7 -0
- ansys/fluent/core/solver/error_message.py +2 -2
- ansys/fluent/core/solver/flobject.py +192 -123
- ansys/fluent/core/solver/function/reduction.py +37 -9
- ansys/fluent/core/solver/settings_builtin_bases.py +3 -3
- ansys/fluent/core/solver/settings_builtin_data.py +7 -17
- ansys/fluent/core/streaming_services/datamodel_event_streaming.py +3 -2
- ansys/fluent/core/streaming_services/datamodel_streaming.py +3 -1
- ansys/fluent/core/streaming_services/events_streaming.py +2 -18
- ansys/fluent/core/system_coupling.py +3 -1
- ansys/fluent/core/utils/__init__.py +0 -7
- ansys/fluent/core/utils/data_transfer.py +3 -3
- ansys/fluent/core/utils/file_transfer_service.py +24 -15
- ansys/fluent/core/utils/fluent_version.py +4 -6
- ansys/fluent/core/utils/networking.py +21 -11
- {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.35.dev0.dist-info}/METADATA +10 -11
- {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.35.dev0.dist-info}/RECORD +108 -106
- {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.35.dev0.dist-info}/WHEEL +1 -1
- {ansys_fluent_core-0.34.dev0.dist-info/licenses → ansys_fluent_core-0.35.dev0.dist-info}/LICENSE +0 -0
|
@@ -21,15 +21,16 @@
|
|
|
21
21
|
# SOFTWARE.
|
|
22
22
|
|
|
23
23
|
"""Common interfaces for field data."""
|
|
24
|
-
|
|
25
24
|
from abc import ABC, abstractmethod
|
|
26
25
|
from enum import Enum
|
|
27
26
|
from typing import Callable, Dict, List, NamedTuple
|
|
27
|
+
import warnings
|
|
28
28
|
|
|
29
29
|
import numpy as np
|
|
30
30
|
import numpy.typing as npt
|
|
31
31
|
|
|
32
32
|
from ansys.fluent.core.exceptions import DisallowedValuesError
|
|
33
|
+
from ansys.fluent.core.pyfluent_warnings import PyFluentDeprecationWarning
|
|
33
34
|
from ansys.fluent.core.variable_strategies import (
|
|
34
35
|
FluentFieldDataNamingStrategy as naming_strategy,
|
|
35
36
|
)
|
|
@@ -50,15 +51,16 @@ class SurfaceFieldDataRequest(NamedTuple):
|
|
|
50
51
|
"""Container storing parameters for surface data request."""
|
|
51
52
|
|
|
52
53
|
data_types: List[SurfaceDataType] | List[str]
|
|
53
|
-
surfaces: List[int | str]
|
|
54
|
+
surfaces: List[int | str | object]
|
|
54
55
|
overset_mesh: bool | None = False
|
|
56
|
+
flatten_connectivity: bool = False
|
|
55
57
|
|
|
56
58
|
|
|
57
59
|
class ScalarFieldDataRequest(NamedTuple):
|
|
58
60
|
"""Container storing parameters for scalar field data request."""
|
|
59
61
|
|
|
60
62
|
field_name: str
|
|
61
|
-
surfaces: List[int | str]
|
|
63
|
+
surfaces: List[int | str | object]
|
|
62
64
|
node_value: bool | None = True
|
|
63
65
|
boundary_value: bool | None = True
|
|
64
66
|
|
|
@@ -67,14 +69,14 @@ class VectorFieldDataRequest(NamedTuple):
|
|
|
67
69
|
"""Container storing parameters for vector field data request."""
|
|
68
70
|
|
|
69
71
|
field_name: str
|
|
70
|
-
surfaces: List[int | str]
|
|
72
|
+
surfaces: List[int | str | object]
|
|
71
73
|
|
|
72
74
|
|
|
73
75
|
class PathlinesFieldDataRequest(NamedTuple):
|
|
74
76
|
"""Container storing parameters for path-lines field data request."""
|
|
75
77
|
|
|
76
78
|
field_name: str
|
|
77
|
-
surfaces: List[int | str]
|
|
79
|
+
surfaces: List[int | str | object]
|
|
78
80
|
additional_field_name: str = ""
|
|
79
81
|
provide_particle_time_field: bool | None = False
|
|
80
82
|
node_value: bool | None = True
|
|
@@ -87,6 +89,7 @@ class PathlinesFieldDataRequest(NamedTuple):
|
|
|
87
89
|
coarsen: int | None = 1
|
|
88
90
|
velocity_domain: str | None = "all-phases"
|
|
89
91
|
zones: list | None = None
|
|
92
|
+
flatten_connectivity: bool = False
|
|
90
93
|
|
|
91
94
|
|
|
92
95
|
class BaseFieldInfo(ABC):
|
|
@@ -215,25 +218,25 @@ class FieldDataSource(BaseFieldDataSource, ABC):
|
|
|
215
218
|
|
|
216
219
|
This class defines the interface for retrieving field data based on user requests.
|
|
217
220
|
In addition to the methods in `BaseFieldDataSource` it provides a method to create
|
|
218
|
-
new field
|
|
221
|
+
new field batch objects.
|
|
219
222
|
|
|
220
223
|
Implementing classes should define:
|
|
221
224
|
- A method to obtain surface IDs from user-provided surface names or numerical identifiers.
|
|
222
225
|
- A method to retrieve field data based on a given request.
|
|
223
|
-
- A method to create new field
|
|
226
|
+
- A method to create new field batch.
|
|
224
227
|
|
|
225
228
|
Subclasses must provide concrete implementations for all abstract methods.
|
|
226
229
|
"""
|
|
227
230
|
|
|
228
231
|
@abstractmethod
|
|
229
|
-
def
|
|
230
|
-
"""Create a new field
|
|
232
|
+
def new_batch(self):
|
|
233
|
+
"""Create a new field batch."""
|
|
231
234
|
pass
|
|
232
235
|
|
|
233
236
|
|
|
234
|
-
class
|
|
237
|
+
class FieldBatch(ABC):
|
|
235
238
|
"""
|
|
236
|
-
Abstract base class for handling field data
|
|
239
|
+
Abstract base class for handling field data batches.
|
|
237
240
|
|
|
238
241
|
This class defines the interface for requesting field data based on user inputs
|
|
239
242
|
and retrieving responses from the server. It provides abstract methods that allow
|
|
@@ -287,6 +290,120 @@ class FieldTransaction(ABC):
|
|
|
287
290
|
pass
|
|
288
291
|
|
|
289
292
|
|
|
293
|
+
class _SurfaceNames:
|
|
294
|
+
def __init__(self, allowed_surface_names):
|
|
295
|
+
self._allowed_surface_names = allowed_surface_names
|
|
296
|
+
|
|
297
|
+
def allowed_values(self):
|
|
298
|
+
"""Lists available surface names."""
|
|
299
|
+
return list(self._allowed_surface_names())
|
|
300
|
+
|
|
301
|
+
def validate(self, surfaces: List[str]) -> bool:
|
|
302
|
+
"""
|
|
303
|
+
Validate that the given surfaces are in the list of allowed surface names.
|
|
304
|
+
|
|
305
|
+
Parameters
|
|
306
|
+
----------
|
|
307
|
+
surfaces : List[int]
|
|
308
|
+
A list of surface name strings to validate.
|
|
309
|
+
|
|
310
|
+
Returns
|
|
311
|
+
-------
|
|
312
|
+
bool
|
|
313
|
+
True if all surfaces are valid, False otherwise.
|
|
314
|
+
If any name is invalid, a warning is issued and validation stops early.
|
|
315
|
+
"""
|
|
316
|
+
for surf in surfaces:
|
|
317
|
+
if surf not in self._allowed_surface_names():
|
|
318
|
+
warnings.warn(f"'{surf}' is not a valid surface name.")
|
|
319
|
+
return False
|
|
320
|
+
return True
|
|
321
|
+
|
|
322
|
+
def __call__(self):
|
|
323
|
+
return self._allowed_surface_names()
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
class _SurfaceIds:
|
|
327
|
+
def __init__(self, allowed_surface_ids):
|
|
328
|
+
self._allowed_surface_ids = allowed_surface_ids
|
|
329
|
+
|
|
330
|
+
def allowed_values(self):
|
|
331
|
+
"""Lists available surface ids."""
|
|
332
|
+
return self._allowed_surface_ids()
|
|
333
|
+
|
|
334
|
+
def validate(self, surface_ids: List[int]) -> bool:
|
|
335
|
+
"""
|
|
336
|
+
Validate that the given surface IDs are in the list of allowed surface IDs.
|
|
337
|
+
|
|
338
|
+
Parameters
|
|
339
|
+
----------
|
|
340
|
+
surface_ids : List[int]
|
|
341
|
+
A list of surface ID integers to validate.
|
|
342
|
+
|
|
343
|
+
Returns
|
|
344
|
+
-------
|
|
345
|
+
bool
|
|
346
|
+
True if all surface IDs are valid, False otherwise.
|
|
347
|
+
If any ID is invalid, a warning is issued and validation stops early.
|
|
348
|
+
"""
|
|
349
|
+
for surf in surface_ids:
|
|
350
|
+
if surf not in self._allowed_surface_ids():
|
|
351
|
+
warnings.warn(f"'{surf}' is not a valid surface id.")
|
|
352
|
+
return False
|
|
353
|
+
return True
|
|
354
|
+
|
|
355
|
+
def __call__(self):
|
|
356
|
+
return self._allowed_surface_ids()
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class _Fields:
|
|
360
|
+
def __init__(self, available_field_names):
|
|
361
|
+
self._available_field_names = available_field_names
|
|
362
|
+
|
|
363
|
+
def is_active(self, field_name):
|
|
364
|
+
"""Check whether a field is active in the given context."""
|
|
365
|
+
if _to_field_name_str(field_name) in self._available_field_names():
|
|
366
|
+
return True
|
|
367
|
+
return False
|
|
368
|
+
|
|
369
|
+
def allowed_values(self):
|
|
370
|
+
"""Lists available scalar or vector field names."""
|
|
371
|
+
return list(self._available_field_names())
|
|
372
|
+
|
|
373
|
+
def __call__(self):
|
|
374
|
+
return self._available_field_names()
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
class _ScalarFields(_Fields):
|
|
378
|
+
def __init__(self, available_field_names, field_info):
|
|
379
|
+
super().__init__(available_field_names)
|
|
380
|
+
self._field_info = field_info
|
|
381
|
+
|
|
382
|
+
def range(
|
|
383
|
+
self, field: str, node_value: bool = False, surface_ids: list[int] = None
|
|
384
|
+
) -> list[float]:
|
|
385
|
+
"""Get the range (minimum and maximum values) of the field.
|
|
386
|
+
|
|
387
|
+
Parameters
|
|
388
|
+
----------
|
|
389
|
+
field: str
|
|
390
|
+
Field name
|
|
391
|
+
node_value: bool
|
|
392
|
+
surface_ids : List[int], optional
|
|
393
|
+
List of surface IDS for the surface data.
|
|
394
|
+
|
|
395
|
+
Returns
|
|
396
|
+
-------
|
|
397
|
+
List[float]
|
|
398
|
+
"""
|
|
399
|
+
return self._field_info._get_scalar_field_range(field, node_value, surface_ids)
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
class _VectorFields(_Fields):
|
|
403
|
+
def __init__(self, available_field_names):
|
|
404
|
+
super().__init__(available_field_names)
|
|
405
|
+
|
|
406
|
+
|
|
290
407
|
class _AllowedNames:
|
|
291
408
|
def __init__(
|
|
292
409
|
self, field_info: BaseFieldInfo | None = None, info: dict | None = None
|
|
@@ -334,7 +451,7 @@ class _AllowedFieldNames(_AllowedNames):
|
|
|
334
451
|
|
|
335
452
|
class _AllowedSurfaceNames(_AllowedNames):
|
|
336
453
|
def __call__(self, respect_data_valid: bool = True) -> List[str]:
|
|
337
|
-
return self._info if self._info else self._field_info.
|
|
454
|
+
return self._info if self._info else self._field_info._get_surfaces_info()
|
|
338
455
|
|
|
339
456
|
def valid_name(self, surface_name: str) -> str:
|
|
340
457
|
"""Returns valid names.
|
|
@@ -362,7 +479,7 @@ class _AllowedSurfaceIDs(_AllowedNames):
|
|
|
362
479
|
try:
|
|
363
480
|
return [
|
|
364
481
|
info["surface_id"][0]
|
|
365
|
-
for _, info in self._field_info.
|
|
482
|
+
for _, info in self._field_info._get_surfaces_info().items()
|
|
366
483
|
]
|
|
367
484
|
except (KeyError, IndexError):
|
|
368
485
|
pass
|
|
@@ -380,7 +497,7 @@ class _AllowedScalarFieldNames(_AllowedFieldNames):
|
|
|
380
497
|
|
|
381
498
|
def __call__(self, respect_data_valid: bool = True) -> List[str]:
|
|
382
499
|
field_dict = (
|
|
383
|
-
self._info if self._info else self._field_info.
|
|
500
|
+
self._info if self._info else self._field_info._get_scalar_fields_info()
|
|
384
501
|
)
|
|
385
502
|
return (
|
|
386
503
|
field_dict
|
|
@@ -402,7 +519,7 @@ class _AllowedVectorFieldNames(_AllowedFieldNames):
|
|
|
402
519
|
self._info
|
|
403
520
|
if self._info
|
|
404
521
|
else (
|
|
405
|
-
self._field_info.
|
|
522
|
+
self._field_info._get_vector_fields_info()
|
|
406
523
|
if (not respect_data_valid or self._is_data_valid())
|
|
407
524
|
else []
|
|
408
525
|
)
|
|
@@ -482,23 +599,14 @@ class PathlinesData:
|
|
|
482
599
|
|
|
483
600
|
class _ReturnFieldData:
|
|
484
601
|
|
|
485
|
-
@staticmethod
|
|
486
|
-
def _get_faces_connectivity_data(data):
|
|
487
|
-
faces_data = []
|
|
488
|
-
i = 0
|
|
489
|
-
while i < len(data):
|
|
490
|
-
end = i + 1 + data[i]
|
|
491
|
-
faces_data.append(data[i + 1 : end])
|
|
492
|
-
i = end
|
|
493
|
-
return faces_data
|
|
494
|
-
|
|
495
602
|
@staticmethod
|
|
496
603
|
def _scalar_data(
|
|
497
604
|
field_name: str,
|
|
498
|
-
surfaces: List[int | str],
|
|
605
|
+
surfaces: List[int | str | object],
|
|
499
606
|
surface_ids: List[int],
|
|
500
607
|
scalar_field_data: np.array,
|
|
501
608
|
) -> Dict[int | str, np.array]:
|
|
609
|
+
surfaces = get_surfaces_from_objects(surfaces)
|
|
502
610
|
return {
|
|
503
611
|
surface: scalar_field_data[surface_ids[count]][field_name]
|
|
504
612
|
for count, surface in enumerate(surfaces)
|
|
@@ -507,23 +615,36 @@ class _ReturnFieldData:
|
|
|
507
615
|
@staticmethod
|
|
508
616
|
def _surface_data(
|
|
509
617
|
data_types: List[SurfaceDataType],
|
|
510
|
-
surfaces: List[int | str],
|
|
618
|
+
surfaces: List[int | str | object],
|
|
511
619
|
surface_ids: List[int],
|
|
512
620
|
surface_data: np.array | List[np.array],
|
|
513
621
|
deprecated_flag: bool | None = False,
|
|
622
|
+
flatten_connectivity: bool = False,
|
|
514
623
|
) -> Dict[int | str, Dict[SurfaceDataType, np.array | List[np.array]]]:
|
|
624
|
+
surfaces = get_surfaces_from_objects(surfaces)
|
|
515
625
|
ret_surf_data = {}
|
|
516
626
|
for count, surface in enumerate(surfaces):
|
|
517
627
|
ret_surf_data[surface] = {}
|
|
518
628
|
for data_type in data_types:
|
|
519
629
|
if data_type == SurfaceDataType.FacesConnectivity:
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
630
|
+
if flatten_connectivity:
|
|
631
|
+
ret_surf_data[surface][data_type] = surface_data[
|
|
632
|
+
surface_ids[count]
|
|
633
|
+
][SurfaceDataType.FacesConnectivity.value]
|
|
634
|
+
else:
|
|
635
|
+
warnings.warn(
|
|
636
|
+
"Structured face connectivity output is deprecated and will be replaced by the flat format "
|
|
637
|
+
"in a future release. In the current release, pass 'flatten_connectivity=True' argument while creating the "
|
|
638
|
+
"'SurfaceFieldDataRequest' to request data in the flat format.",
|
|
639
|
+
PyFluentDeprecationWarning,
|
|
640
|
+
)
|
|
641
|
+
ret_surf_data[surface][data_type] = (
|
|
642
|
+
_transform_faces_connectivity_data(
|
|
643
|
+
surface_data[surface_ids[count]][
|
|
644
|
+
SurfaceDataType.FacesConnectivity.value
|
|
645
|
+
]
|
|
646
|
+
)
|
|
525
647
|
)
|
|
526
|
-
)
|
|
527
648
|
else:
|
|
528
649
|
ret_surf_data[surface][data_type] = surface_data[
|
|
529
650
|
surface_ids[count]
|
|
@@ -535,10 +656,11 @@ class _ReturnFieldData:
|
|
|
535
656
|
@staticmethod
|
|
536
657
|
def _vector_data(
|
|
537
658
|
field_name: str,
|
|
538
|
-
surfaces: List[int | str],
|
|
659
|
+
surfaces: List[int | str | object],
|
|
539
660
|
surface_ids: List[int],
|
|
540
661
|
vector_field_data: np.array,
|
|
541
662
|
) -> Dict[int | str, np.array]:
|
|
663
|
+
surfaces = get_surfaces_from_objects(surfaces)
|
|
542
664
|
return {
|
|
543
665
|
surface: vector_field_data[surface_ids[count]][field_name].reshape(-1, 3)
|
|
544
666
|
for count, surface in enumerate(surfaces)
|
|
@@ -547,20 +669,32 @@ class _ReturnFieldData:
|
|
|
547
669
|
@staticmethod
|
|
548
670
|
def _pathlines_data(
|
|
549
671
|
field_name: str,
|
|
550
|
-
surfaces: List[int | str],
|
|
672
|
+
surfaces: List[int | str | object],
|
|
551
673
|
surface_ids: List[int],
|
|
552
674
|
pathlines_data: Dict,
|
|
553
675
|
deprecated_flag: bool | None = False,
|
|
676
|
+
flatten_connectivity: bool = False,
|
|
554
677
|
) -> Dict:
|
|
678
|
+
surfaces = get_surfaces_from_objects(surfaces)
|
|
555
679
|
path_lines_dict = {}
|
|
556
680
|
for count, surface in enumerate(surfaces):
|
|
681
|
+
if flatten_connectivity:
|
|
682
|
+
lines_data = pathlines_data[surface_ids[count]]["lines"]
|
|
683
|
+
else:
|
|
684
|
+
warnings.warn(
|
|
685
|
+
"Structured face connectivity output is deprecated and will be replaced by the flat format "
|
|
686
|
+
"in a future release. In the current release, pass 'flatten_connectivity=True' argument while creating the "
|
|
687
|
+
"'SurfaceFieldDataRequest' to request data in the flat format.",
|
|
688
|
+
PyFluentDeprecationWarning,
|
|
689
|
+
)
|
|
690
|
+
lines_data = _transform_faces_connectivity_data(
|
|
691
|
+
pathlines_data[surface_ids[count]]["lines"]
|
|
692
|
+
)
|
|
557
693
|
temp_dict = {
|
|
558
694
|
"vertices": pathlines_data[surface_ids[count]]["vertices"].reshape(
|
|
559
695
|
-1, 3
|
|
560
696
|
),
|
|
561
|
-
"lines":
|
|
562
|
-
pathlines_data[surface_ids[count]]["lines"]
|
|
563
|
-
),
|
|
697
|
+
"lines": lines_data,
|
|
564
698
|
field_name: pathlines_data[surface_ids[count]][field_name],
|
|
565
699
|
"pathlines-count": pathlines_data[surface_ids[count]][
|
|
566
700
|
"pathlines-count"
|
|
@@ -575,3 +709,70 @@ class _ReturnFieldData:
|
|
|
575
709
|
else:
|
|
576
710
|
path_lines_dict[surface] = temp_dict
|
|
577
711
|
return path_lines_dict
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
def get_surfaces_from_objects(surfaces: List[int | str | object]):
|
|
715
|
+
"""
|
|
716
|
+
Extract surface names or identifiers from a list of surfaces.
|
|
717
|
+
|
|
718
|
+
Parameters
|
|
719
|
+
----------
|
|
720
|
+
surfaces : List[int | str | object]
|
|
721
|
+
A list of surface identifiers, which may include:
|
|
722
|
+
- integers or strings representing surface names/IDs,
|
|
723
|
+
- objects with a callable `name()` method,
|
|
724
|
+
- or iterables (e.g., lists or tuples) containing such elements.
|
|
725
|
+
|
|
726
|
+
Returns
|
|
727
|
+
-------
|
|
728
|
+
List
|
|
729
|
+
A flattened list of surface names/identifiers:
|
|
730
|
+
- If an element has a `name()` method, the result of `surface.name()` is used.
|
|
731
|
+
- Otherwise, the element itself is returned as-is.
|
|
732
|
+
"""
|
|
733
|
+
updated_surfaces = []
|
|
734
|
+
for surface in surfaces:
|
|
735
|
+
if hasattr(surface, "name"):
|
|
736
|
+
updated_surfaces.append(surface.name())
|
|
737
|
+
else:
|
|
738
|
+
updated_surfaces.append(surface)
|
|
739
|
+
return updated_surfaces
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
def _transform_faces_connectivity_data(data):
|
|
743
|
+
"""
|
|
744
|
+
Transform flat face connectivity data into structured face-wise format.
|
|
745
|
+
|
|
746
|
+
Each face in the flat array is represented by:
|
|
747
|
+
[N, v0, v1, ..., vN], where:
|
|
748
|
+
- N is the number of vertices in the face
|
|
749
|
+
- v0...vN are the vertex indices
|
|
750
|
+
|
|
751
|
+
This function parses such a flat array and returns a list of vertex index arrays,
|
|
752
|
+
each representing a face.
|
|
753
|
+
|
|
754
|
+
Parameters
|
|
755
|
+
----------
|
|
756
|
+
data : array-like of int
|
|
757
|
+
Flat array containing face connectivity data, typically returned from
|
|
758
|
+
`faces_connectivity_data["inlet"].connectivity`.
|
|
759
|
+
|
|
760
|
+
Returns
|
|
761
|
+
-------
|
|
762
|
+
faces_data : list of ndarray
|
|
763
|
+
List of 1D NumPy arrays, where each array contains the vertex indices
|
|
764
|
+
of a face.
|
|
765
|
+
|
|
766
|
+
Examples
|
|
767
|
+
--------
|
|
768
|
+
>>> flat_data = np.array([4, 4, 5, 12, 11, 3, 1, 2, 3], dtype=np.int32)
|
|
769
|
+
>>> _transform_faces_connectivity_data(flat_data)
|
|
770
|
+
[array([ 4, 5, 12, 11]), array([1, 2, 3])]
|
|
771
|
+
"""
|
|
772
|
+
faces_data = []
|
|
773
|
+
i = 0
|
|
774
|
+
while i < len(data):
|
|
775
|
+
end = i + 1 + data[i]
|
|
776
|
+
faces_data.append(data[i + 1 : end])
|
|
777
|
+
i = end
|
|
778
|
+
return faces_data
|