ansys-fluent-core 0.34.dev0__py3-none-any.whl → 0.34.1__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.

Files changed (79) hide show
  1. ansys/fluent/core/__init__.py +3 -3
  2. ansys/fluent/core/codegen/builtin_settingsgen.py +25 -19
  3. ansys/fluent/core/codegen/settingsgen.py +17 -5
  4. ansys/fluent/core/codegen/tuigen.py +2 -1
  5. ansys/fluent/core/docker/docker_compose.py +4 -1
  6. ansys/fluent/core/docker/utils.py +35 -0
  7. ansys/fluent/core/exceptions.py +13 -1
  8. ansys/fluent/core/field_data_interfaces.py +239 -38
  9. ansys/fluent/core/file_session.py +167 -61
  10. ansys/fluent/core/fluent_connection.py +23 -16
  11. ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
  12. ansys/fluent/core/generated/datamodel_231/flicing.py +45 -45
  13. ansys/fluent/core/generated/datamodel_231/meshing.py +256 -256
  14. ansys/fluent/core/generated/datamodel_232/flicing.py +15 -15
  15. ansys/fluent/core/generated/datamodel_232/meshing.py +205 -205
  16. ansys/fluent/core/generated/datamodel_241/flicing.py +50 -50
  17. ansys/fluent/core/generated/datamodel_241/meshing.py +279 -279
  18. ansys/fluent/core/generated/datamodel_242/flicing.py +45 -45
  19. ansys/fluent/core/generated/datamodel_242/meshing.py +315 -315
  20. ansys/fluent/core/generated/datamodel_242/part_management.py +9 -9
  21. ansys/fluent/core/generated/datamodel_251/flicing.py +35 -35
  22. ansys/fluent/core/generated/datamodel_251/meshing.py +311 -311
  23. ansys/fluent/core/generated/datamodel_252/flicing.py +60 -60
  24. ansys/fluent/core/generated/datamodel_252/meshing.py +391 -391
  25. ansys/fluent/core/generated/datamodel_252/part_management.py +10 -10
  26. ansys/fluent/core/generated/datamodel_261/flicing.py +35 -35
  27. ansys/fluent/core/generated/datamodel_261/meshing.py +494 -475
  28. ansys/fluent/core/generated/datamodel_261/meshing_utilities.py +296 -616
  29. ansys/fluent/core/generated/datamodel_261/part_management.py +5 -5
  30. ansys/fluent/core/generated/datamodel_261/preferences.py +7 -0
  31. ansys/fluent/core/generated/fluent_version_261.py +3 -3
  32. ansys/fluent/core/generated/meshing/tui_261.py +1186 -1180
  33. ansys/fluent/core/generated/solver/settings_231.py +1 -0
  34. ansys/fluent/core/generated/solver/settings_231.pyi +3025 -1
  35. ansys/fluent/core/generated/solver/settings_232.py +1 -0
  36. ansys/fluent/core/generated/solver/settings_232.pyi +3425 -1
  37. ansys/fluent/core/generated/solver/settings_241.py +1 -0
  38. ansys/fluent/core/generated/solver/settings_241.pyi +4423 -1
  39. ansys/fluent/core/generated/solver/settings_242.py +1 -0
  40. ansys/fluent/core/generated/solver/settings_242.pyi +5474 -1
  41. ansys/fluent/core/generated/solver/settings_251.py +11 -0
  42. ansys/fluent/core/generated/solver/settings_251.pyi +6006 -1
  43. ansys/fluent/core/generated/solver/settings_252.py +11 -1
  44. ansys/fluent/core/generated/solver/settings_252.pyi +6782 -2
  45. ansys/fluent/core/generated/solver/settings_261.py +7438 -3941
  46. ansys/fluent/core/generated/solver/settings_261.pyi +10916 -2656
  47. ansys/fluent/core/generated/solver/settings_builtin.py +56 -22
  48. ansys/fluent/core/generated/solver/settings_builtin.pyi +22 -0
  49. ansys/fluent/core/generated/solver/tui_261.py +3877 -2876
  50. ansys/fluent/core/launcher/container_launcher.py +6 -2
  51. ansys/fluent/core/launcher/error_handler.py +1 -1
  52. ansys/fluent/core/launcher/fluent_container.py +53 -10
  53. ansys/fluent/core/launcher/launcher.py +3 -0
  54. ansys/fluent/core/launcher/watchdog.py +6 -6
  55. ansys/fluent/core/launcher/watchdog_exec +1 -1
  56. ansys/fluent/core/pyfluent_warnings.py +7 -1
  57. ansys/fluent/core/report.py +2 -0
  58. ansys/fluent/core/search.py +11 -3
  59. ansys/fluent/core/services/__init__.py +2 -2
  60. ansys/fluent/core/services/app_utilities.py +39 -0
  61. ansys/fluent/core/services/deprecated_field_data.py +4 -4
  62. ansys/fluent/core/services/field_data.py +185 -49
  63. ansys/fluent/core/services/reduction.py +16 -5
  64. ansys/fluent/core/services/settings.py +1 -0
  65. ansys/fluent/core/session.py +16 -1
  66. ansys/fluent/core/session_pure_meshing.py +5 -5
  67. ansys/fluent/core/session_pure_meshing.pyi +1 -0
  68. ansys/fluent/core/session_solver.py +33 -8
  69. ansys/fluent/core/session_solver.pyi +1 -0
  70. ansys/fluent/core/solver/error_message.py +2 -2
  71. ansys/fluent/core/solver/flobject.py +187 -120
  72. ansys/fluent/core/solver/function/reduction.py +37 -9
  73. ansys/fluent/core/solver/settings_builtin_data.py +5 -3
  74. ansys/fluent/core/utils/fluent_version.py +1 -3
  75. ansys/fluent/core/utils/networking.py +18 -8
  76. {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.34.1.dist-info}/METADATA +10 -11
  77. {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.34.1.dist-info}/RECORD +79 -78
  78. {ansys_fluent_core-0.34.dev0.dist-info → ansys_fluent_core-0.34.1.dist-info}/WHEEL +1 -1
  79. {ansys_fluent_core-0.34.dev0.dist-info/licenses → ansys_fluent_core-0.34.1.dist-info}/LICENSE +0 -0
@@ -21,6 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  """Wrappers over FieldData gRPC service of Fluent."""
24
+ from collections.abc import Iterable
24
25
  from dataclasses import dataclass, field
25
26
  from enum import Enum
26
27
  from functools import reduce
@@ -30,6 +31,7 @@ from typing import Callable, Dict, List, Tuple
30
31
  import warnings
31
32
  import weakref
32
33
 
34
+ from deprecated.sphinx import deprecated
33
35
  import grpc
34
36
  import numpy as np
35
37
 
@@ -39,8 +41,8 @@ from ansys.fluent.core.exceptions import DisallowedValuesError
39
41
  from ansys.fluent.core.field_data_interfaces import (
40
42
  BaseFieldDataSource,
41
43
  BaseFieldInfo,
44
+ FieldBatch,
42
45
  FieldDataSource,
43
- FieldTransaction,
44
46
  PathlinesFieldDataRequest,
45
47
  ScalarFieldDataRequest,
46
48
  SurfaceDataType,
@@ -51,7 +53,12 @@ from ansys.fluent.core.field_data_interfaces import (
51
53
  _AllowedSurfaceNames,
52
54
  _AllowedVectorFieldNames,
53
55
  _ReturnFieldData,
56
+ _ScalarFields,
57
+ _SurfaceIds,
58
+ _SurfaceNames,
54
59
  _to_field_name_str,
60
+ _VectorFields,
61
+ get_surfaces_from_objects,
55
62
  )
56
63
  from ansys.fluent.core.pyfluent_warnings import PyFluentDeprecationWarning
57
64
  from ansys.fluent.core.services.interceptors import (
@@ -156,25 +163,7 @@ class FieldDataService(StreamingService):
156
163
  return elementss
157
164
 
158
165
 
159
- class FieldInfo(BaseFieldInfo):
160
- """Provides access to Fluent field information.
161
-
162
- Methods
163
- -------
164
- get_scalar_field_range(field: str, node_value: bool, surface_ids: List[int])
165
- -> List[float]
166
- Get the range (minimum and maximum values) of the field.
167
-
168
- get_scalar_fields_info(self) -> dict
169
- Get fields information (field name, domain, and section).
170
-
171
- get_vector_fields_info(self) -> dict
172
- Get vector fields information.
173
-
174
- get_surfaces_info(self) -> dict
175
- Get surfaces information (surface name, ID, and type).
176
- """
177
-
166
+ class _FieldInfo(BaseFieldInfo):
178
167
  def __init__(
179
168
  self,
180
169
  service: FieldDataService,
@@ -201,6 +190,16 @@ class FieldInfo(BaseFieldInfo):
201
190
  -------
202
191
  List[float]
203
192
  """
193
+ warnings.warn(
194
+ "This usage is deprecated and will be removed in a future release. "
195
+ f"Please use 'field_data.scalar_fields.range({field}, {node_value}, {surface_ids})' instead",
196
+ PyFluentDeprecationWarning,
197
+ )
198
+ return self._get_scalar_field_range(field, node_value, surface_ids)
199
+
200
+ def _get_scalar_field_range(
201
+ self, field: str, node_value: bool = False, surface_ids: List[int] = None
202
+ ) -> List[float]:
204
203
  if not surface_ids:
205
204
  surface_ids = []
206
205
  request = FieldDataProtoModule.GetRangeRequest()
@@ -219,6 +218,14 @@ class FieldInfo(BaseFieldInfo):
219
218
  -------
220
219
  Dict
221
220
  """
221
+ warnings.warn(
222
+ "This usage is deprecated and will be removed in a future release. "
223
+ "Please use 'field_data.scalar_fields()' instead",
224
+ PyFluentDeprecationWarning,
225
+ )
226
+ return self._get_scalar_fields_info()
227
+
228
+ def _get_scalar_fields_info(self) -> Dict[str, Dict]:
222
229
  request = FieldDataProtoModule.GetFieldsInfoRequest()
223
230
  response = self._service.get_scalar_fields_info(request)
224
231
  return {
@@ -238,6 +245,14 @@ class FieldInfo(BaseFieldInfo):
238
245
  -------
239
246
  Dict
240
247
  """
248
+ warnings.warn(
249
+ "This usage is deprecated and will be removed in a future release. "
250
+ "Please use 'field_data.vector_fields()' instead",
251
+ PyFluentDeprecationWarning,
252
+ )
253
+ return self._get_vector_fields_info()
254
+
255
+ def _get_vector_fields_info(self) -> Dict[str, Dict]:
241
256
  request = FieldDataProtoModule.GetVectorFieldsInfoRequest()
242
257
  response = self._service.get_vector_fields_info(request)
243
258
  return {
@@ -256,6 +271,14 @@ class FieldInfo(BaseFieldInfo):
256
271
  -------
257
272
  Dict
258
273
  """
274
+ warnings.warn(
275
+ "This usage is deprecated and will be removed in a future release. "
276
+ "Please use 'field_data.surfaces()' instead",
277
+ PyFluentDeprecationWarning,
278
+ )
279
+ return self._get_surfaces_info()
280
+
281
+ def _get_surfaces_info(self) -> Dict[str, Dict]:
259
282
  request = FieldDataProtoModule.GetSurfacesInfoResponse()
260
283
  response = self._service.get_surfaces_info(request)
261
284
  info = {
@@ -271,20 +294,64 @@ class FieldInfo(BaseFieldInfo):
271
294
 
272
295
  def validate_scalar_fields(self, field_name: str):
273
296
  """Validate scalar fields."""
297
+ warnings.warn(
298
+ "This usage is deprecated and will be removed in a future release. "
299
+ f"Please use 'field_data.scalar_fields.is_active(field_name={field_name})' instead",
300
+ PyFluentDeprecationWarning,
301
+ )
274
302
  _AllowedScalarFieldNames(
275
- self._is_data_valid, info=self.get_scalar_fields_info()
303
+ self._is_data_valid, info=self._get_scalar_fields_info()
276
304
  ).valid_name(field_name)
277
305
 
278
306
  def validate_vector_fields(self, field_name: str):
279
307
  """Validate vector fields."""
308
+ warnings.warn(
309
+ "This usage is deprecated and will be removed in a future release. "
310
+ f"Please use 'field_data.vector_fields.is_active(field_name={field_name})' instead",
311
+ PyFluentDeprecationWarning,
312
+ )
280
313
  _AllowedVectorFieldNames(
281
- self._is_data_valid, info=self.get_vector_fields_info()
314
+ self._is_data_valid, info=self._get_vector_fields_info()
282
315
  ).valid_name(field_name)
283
316
 
284
317
  def validate_surfaces(self, surfaces: List[str]):
285
318
  """Validate surfaces."""
319
+ warnings.warn(
320
+ "This usage is deprecated and will be removed in a future release. "
321
+ f"Please use 'field_data.surfaces.validate(surfaces={surfaces})' instead",
322
+ PyFluentDeprecationWarning,
323
+ )
286
324
  for surface in surfaces:
287
- _AllowedSurfaceNames(info=self.get_surfaces_info()).valid_name(surface)
325
+ _AllowedSurfaceNames(info=self._get_surfaces_info()).valid_name(surface)
326
+
327
+
328
+ class FieldInfo(_FieldInfo):
329
+ """Provides access to Fluent field information.
330
+
331
+ Methods
332
+ -------
333
+ get_scalar_field_range(field: str, node_value: bool, surface_ids: List[int])
334
+ -> List[float]
335
+ Get the range (minimum and maximum values) of the field.
336
+
337
+ get_scalar_fields_info(self) -> dict
338
+ Get fields information (field name, domain, and section).
339
+
340
+ get_vector_fields_info(self) -> dict
341
+ Get vector fields information.
342
+
343
+ get_surfaces_info(self) -> dict
344
+ Get surfaces information (surface name, ID, and type).
345
+ """
346
+
347
+ def __init__(self, service: FieldDataService, is_data_valid: Callable[[], bool]):
348
+ """__init__ method of FieldInfo class."""
349
+ warnings.warn(
350
+ "'FieldInfo' is deprecated and will be removed in a future release. "
351
+ "Please use relevant methods from 'FieldData' instead",
352
+ PyFluentDeprecationWarning,
353
+ )
354
+ super().__init__(service, is_data_valid)
288
355
 
289
356
 
290
357
  class _FieldMethod:
@@ -294,6 +361,30 @@ class _FieldMethod:
294
361
 
295
362
  def allowed_values(self):
296
363
  """Returns set of allowed values."""
364
+ if self._accessor.__class__.__name__ == "_AllowedScalarFieldNames":
365
+ warnings.warn(
366
+ "This usage is deprecated and will be removed in a future release. "
367
+ "Please use 'scalar_fields.allowed_values()' instead",
368
+ PyFluentDeprecationWarning,
369
+ )
370
+ elif self._accessor.__class__.__name__ == "_AllowedVectorFieldNames":
371
+ warnings.warn(
372
+ "This usage is deprecated and will be removed in a future release. "
373
+ "Please use 'vector_fields.allowed_values()' instead",
374
+ PyFluentDeprecationWarning,
375
+ )
376
+ elif self._accessor.__class__.__name__ == "_AllowedSurfaceNames":
377
+ warnings.warn(
378
+ "This usage is deprecated and will be removed in a future release. "
379
+ "Please use 'field_data.surfaces.allowed_values()' instead",
380
+ PyFluentDeprecationWarning,
381
+ )
382
+ elif self._accessor.__class__.__name__ == "_AllowedSurfaceIDs":
383
+ warnings.warn(
384
+ "This usage is deprecated and will be removed in a future release. "
385
+ "Please use 'field_data.surface_ids.allowed_values()' instead",
386
+ PyFluentDeprecationWarning,
387
+ )
297
388
  return sorted(self._accessor())
298
389
 
299
390
  def __init__(self, field_data_accessor, args_allowed_values_accessors):
@@ -445,6 +536,7 @@ class BaseFieldData:
445
536
  kwargs.get("surfaces"),
446
537
  self.get_surface_ids(kwargs.get("surfaces")),
447
538
  surface_data,
539
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
448
540
  )
449
541
 
450
542
  def _get_vector_field_data(
@@ -473,6 +565,7 @@ class BaseFieldData:
473
565
  kwargs.get("surfaces"),
474
566
  self.get_surface_ids(kwargs.get("surfaces")),
475
567
  pathlines_data,
568
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
476
569
  )
477
570
 
478
571
  def get_field_data(
@@ -484,7 +577,20 @@ class BaseFieldData:
484
577
  | PathlinesFieldDataRequest
485
578
  ),
486
579
  ) -> Dict[int | str, Dict | np.array]:
487
- """Get the surface, scalar, vector or path-lines field data on a surface."""
580
+ """Get the surface, scalar, vector or path-lines field data on a surface.
581
+
582
+ Returns
583
+ -------
584
+ Dict[int | str, Dict | np.array]
585
+ Field data for the requested surface. If field data is unavailable for the surface,
586
+ an empty array is returned and a warning is issued. Users should always check
587
+ the array size before using the data.
588
+
589
+ Example:
590
+ data = get_field_data(field_data_request)[surface_id]
591
+ if data.size == 0:
592
+ # Handle missing data
593
+ """
488
594
  if isinstance(obj, SurfaceFieldDataRequest):
489
595
  return self._get_surface_data(**obj._asdict())
490
596
  elif isinstance(obj, ScalarFieldDataRequest):
@@ -495,8 +601,8 @@ class BaseFieldData:
495
601
  return self._get_pathlines_field_data(**obj._asdict())
496
602
 
497
603
 
498
- class TransactionFieldData(BaseFieldData, BaseFieldDataSource):
499
- """Provides access to Fluent field data on surfaces collected via transactions."""
604
+ class BatchFieldData(BaseFieldData, BaseFieldDataSource):
605
+ """Provides access to Fluent field data on surfaces collected via batches."""
500
606
 
501
607
  def __init__(
502
608
  self,
@@ -505,7 +611,7 @@ class TransactionFieldData(BaseFieldData, BaseFieldDataSource):
505
611
  allowed_surface_names,
506
612
  allowed_scalar_field_names,
507
613
  ):
508
- """__init__ method of TransactionFieldData class."""
614
+ """__init__ method of BatchFieldData class."""
509
615
  super().__init__(
510
616
  data, field_info, allowed_surface_names, allowed_scalar_field_names
511
617
  )
@@ -517,19 +623,19 @@ class TransactionFieldData(BaseFieldData, BaseFieldDataSource):
517
623
  return self.data
518
624
 
519
625
 
520
- class Transaction(FieldTransaction):
626
+ class Batch(FieldBatch):
521
627
  """Populates Fluent field data on surfaces."""
522
628
 
523
629
  def __init__(
524
630
  self,
525
631
  service: FieldDataService,
526
- field_info: FieldInfo,
632
+ field_info: _FieldInfo,
527
633
  allowed_surface_ids,
528
634
  allowed_surface_names,
529
635
  allowed_scalar_field_names,
530
636
  allowed_vector_field_names,
531
637
  ):
532
- """__init__ method of Transaction class."""
638
+ """__init__ method of Batch class."""
533
639
  self._service = service
534
640
  self._field_info = field_info
535
641
  self._fields_request = get_fields_request()
@@ -873,7 +979,7 @@ class Transaction(FieldTransaction):
873
979
  self._cache_requests.append(req)
874
980
  return self
875
981
 
876
- def get_fields(self) -> TransactionFieldData:
982
+ def get_fields(self) -> BatchFieldData:
877
983
  """Get data for previously added requests."""
878
984
  warnings.warn(
879
985
  "'get_fields' is deprecated, use 'get_response' instead",
@@ -881,7 +987,7 @@ class Transaction(FieldTransaction):
881
987
  )
882
988
  return self.get_response()
883
989
 
884
- def get_response(self) -> TransactionFieldData:
990
+ def get_response(self) -> BatchFieldData:
885
991
  """Get data for previously added requests.
886
992
 
887
993
  Returns
@@ -892,7 +998,7 @@ class Transaction(FieldTransaction):
892
998
 
893
999
  The tag is a tuple for Fluent 2023 R1 or later.
894
1000
  """
895
- return TransactionFieldData(
1001
+ return BatchFieldData(
896
1002
  ChunkParser().extract_fields(
897
1003
  self._service.get_fields(self._fields_request)
898
1004
  ),
@@ -932,9 +1038,9 @@ class _FieldDataConstants:
932
1038
 
933
1039
 
934
1040
  def _get_surface_ids(
935
- field_info: FieldInfo,
1041
+ field_info: _FieldInfo,
936
1042
  allowed_surface_names,
937
- surfaces: List[int | str],
1043
+ surfaces: List[int | str | object],
938
1044
  ) -> List[int]:
939
1045
  """Get surface IDs based on surface names or IDs.
940
1046
 
@@ -948,10 +1054,11 @@ def _get_surface_ids(
948
1054
  List[int]
949
1055
  """
950
1056
  surface_ids = []
951
- for surf in surfaces:
1057
+ updated_surfaces = get_surfaces_from_objects(surfaces)
1058
+ for surf in updated_surfaces:
952
1059
  if isinstance(surf, str):
953
1060
  surface_ids.extend(
954
- field_info.get_surfaces_info()[allowed_surface_names.valid_name(surf)][
1061
+ field_info._get_surfaces_info()[allowed_surface_names.valid_name(surf)][
955
1062
  "surface_id"
956
1063
  ]
957
1064
  )
@@ -959,6 +1066,8 @@ def _get_surface_ids(
959
1066
  allowed_surf_ids = _AllowedSurfaceIDs(field_info)()
960
1067
  if surf in allowed_surf_ids:
961
1068
  surface_ids.append(surf)
1069
+ elif isinstance(surf, Iterable) and not isinstance(surf, (str, bytes)):
1070
+ raise DisallowedValuesError("surface", surf, list(surf))
962
1071
  else:
963
1072
  raise DisallowedValuesError("surface", surf, allowed_surf_ids)
964
1073
  return surface_ids
@@ -1089,13 +1198,19 @@ class ChunkParser:
1089
1198
  payload_tag_id = None
1090
1199
  field = None
1091
1200
  if payload_tag_id is not None:
1092
- field = _extract_field(
1093
- _FieldDataConstants.proto_field_type_to_np_data_type[
1094
- payload_info.fieldType
1095
- ],
1096
- payload_info.fieldSize,
1097
- chunk_iterator,
1098
- )
1201
+ if payload_info.fieldSize > 0:
1202
+ field = _extract_field(
1203
+ _FieldDataConstants.proto_field_type_to_np_data_type[
1204
+ payload_info.fieldType
1205
+ ],
1206
+ payload_info.fieldSize,
1207
+ chunk_iterator,
1208
+ )
1209
+ else:
1210
+ warnings.warn(
1211
+ f"Field data is not available for surface: {surface_id}"
1212
+ )
1213
+ field = np.array([])
1099
1214
 
1100
1215
  if self._callbacks_provider is not None:
1101
1216
  for callback_data in self._callbacks_provider.callbacks():
@@ -1257,7 +1372,7 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1257
1372
  def __init__(
1258
1373
  self,
1259
1374
  service: FieldDataService,
1260
- field_info: FieldInfo,
1375
+ field_info: _FieldInfo,
1261
1376
  is_data_valid: Callable[[], bool],
1262
1377
  scheme_eval=None,
1263
1378
  get_zones_info: weakref.WeakMethod[Callable[[], list[ZoneInfo]]] | None = None,
@@ -1327,12 +1442,21 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1327
1442
  ),
1328
1443
  self.get_pathlines_field_data,
1329
1444
  )
1445
+ self.surfaces = _SurfaceNames(allowed_surface_names=self._allowed_surface_names)
1446
+ self.surface_ids = _SurfaceIds(allowed_surface_ids=self._allowed_surface_ids)
1447
+ self.scalar_fields = _ScalarFields(
1448
+ available_field_names=self._allowed_scalar_field_names,
1449
+ field_info=self._field_info,
1450
+ )
1451
+ self.vector_fields = _VectorFields(
1452
+ available_field_names=self._allowed_vector_field_names
1453
+ )
1330
1454
  self._returned_data = _ReturnFieldData()
1331
1455
  self._fetched_data = _FetchFieldData()
1332
1456
 
1333
- def new_transaction(self):
1334
- """Create a new field transaction."""
1335
- return Transaction(
1457
+ def new_batch(self):
1458
+ """Create a new field batch."""
1459
+ return Batch(
1336
1460
  self._service,
1337
1461
  self._field_info,
1338
1462
  self._allowed_surface_ids,
@@ -1341,6 +1465,11 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1341
1465
  self._allowed_vector_field_names,
1342
1466
  )
1343
1467
 
1468
+ @deprecated(version="0.34", reason="Use `new_batch` instead.")
1469
+ def new_transaction(self):
1470
+ """Create a new field transaction."""
1471
+ return self.new_batch()
1472
+
1344
1473
  def _get_scalar_field_data(self, **kwargs):
1345
1474
  surfaces = kwargs.get("surfaces")
1346
1475
  surface_ids = self.get_surface_ids(surfaces)
@@ -1385,10 +1514,15 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1385
1514
  surface_ids,
1386
1515
  surface_data,
1387
1516
  deprecated_flag=True,
1517
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
1388
1518
  )
1389
1519
 
1390
1520
  return self._returned_data._surface_data(
1391
- kwargs.get("data_types"), kwargs.get("surfaces"), surface_ids, surface_data
1521
+ kwargs.get("data_types"),
1522
+ kwargs.get("surfaces"),
1523
+ surface_ids,
1524
+ surface_data,
1525
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
1392
1526
  )
1393
1527
 
1394
1528
  def _get_vector_field_data(
@@ -1467,6 +1601,7 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1467
1601
  surface_ids,
1468
1602
  pathlines_data,
1469
1603
  deprecated_flag=True,
1604
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
1470
1605
  )
1471
1606
 
1472
1607
  return self._returned_data._pathlines_data(
@@ -1474,6 +1609,7 @@ class LiveFieldData(BaseFieldData, FieldDataSource):
1474
1609
  kwargs.get("surfaces"),
1475
1610
  surface_ids,
1476
1611
  pathlines_data,
1612
+ flatten_connectivity=kwargs.get("flatten_connectivity"),
1477
1613
  )
1478
1614
 
1479
1615
  def get_scalar_field_data(
@@ -21,7 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  """Wrappers over Reduction gRPC service of Fluent."""
24
-
24
+ from collections.abc import Iterable
25
25
  from typing import Any, List, Tuple
26
26
  import weakref
27
27
 
@@ -29,6 +29,7 @@ import grpc
29
29
 
30
30
  from ansys.api.fluent.v0 import reduction_pb2 as ReductionProtoModule
31
31
  from ansys.api.fluent.v0 import reduction_pb2_grpc as ReductionGrpcModule
32
+ from ansys.fluent.core.exceptions import DisallowedValuesError
32
33
  from ansys.fluent.core.services.datamodel_se import _convert_variant_to_value
33
34
  from ansys.fluent.core.services.interceptors import (
34
35
  BatchInterceptor,
@@ -36,6 +37,7 @@ from ansys.fluent.core.services.interceptors import (
36
37
  GrpcErrorInterceptor,
37
38
  TracingInterceptor,
38
39
  )
40
+ from ansys.fluent.core.solver.function.reduction import Weight
39
41
  from ansys.fluent.core.variable_strategies import (
40
42
  FluentExprNamingStrategy as naming_strategy,
41
43
  )
@@ -282,7 +284,7 @@ class Reduction:
282
284
  if all(
283
285
  loc not in names()
284
286
  for names in (
285
- self.ctxt.fields.field_info.get_surfaces_info,
287
+ self.ctxt.fields.field_data.surfaces,
286
288
  self.ctxt.settings.setup.cell_zone_conditions,
287
289
  )
288
290
  ):
@@ -292,6 +294,8 @@ class Reduction:
292
294
  if locations == []:
293
295
  return []
294
296
  for loc in locations:
297
+ if isinstance(loc, Iterable) and not isinstance(loc, (str, bytes)):
298
+ raise DisallowedValuesError("location", loc, list(loc))
295
299
  if isinstance(loc, str):
296
300
  self._validate_str_location(loc)
297
301
  try:
@@ -312,12 +316,17 @@ class Reduction:
312
316
  if expression is not None:
313
317
  request.expression = self._to_str(expression)
314
318
  if weight is not None:
315
- request.weight = weight
319
+ request.weight = Weight(weight).value
316
320
  if condition is not None:
317
321
  request.condition = condition
318
322
  request.locations.extend(self._get_location_string(locations, ctxt))
319
323
  return request
320
324
 
325
+ @property
326
+ def weight(self):
327
+ """Weight for calculating sum."""
328
+ return Weight
329
+
321
330
  def area(self, locations, ctxt=None) -> Any:
322
331
  """Get area."""
323
332
  request = self._make_request("AreaRequest", locations, ctxt)
@@ -442,13 +451,15 @@ class Reduction:
442
451
  response = self.service.moment(request)
443
452
  return (response.value.x, response.value.y, response.value.z)
444
453
 
445
- def sum(self, expression, locations, weight, ctxt=None) -> Any:
454
+ def sum(self, expression, locations, weight: str | Weight, ctxt=None) -> Any:
446
455
  """Get sum."""
447
456
  request = self._make_request("SumRequest", locations, ctxt, expression, weight)
448
457
  response = self.service.sum(request)
449
458
  return _convert_variant_to_value(response.value)
450
459
 
451
- def sum_if(self, expression, condition, locations, weight, ctxt=None) -> Any:
460
+ def sum_if(
461
+ self, expression, condition, locations, weight: str | Weight, ctxt=None
462
+ ) -> Any:
452
463
  """Compute the weighted sum of the expression at locations where the given condition is satisfied."""
453
464
  request = self._make_request(
454
465
  "SumIfRequest", locations, ctxt, expression, weight, condition
@@ -335,6 +335,7 @@ class SettingsService:
335
335
  """
336
336
  request = SettingsModule.GetStaticInfoRequest()
337
337
  request.root = "fluent"
338
+ request.optional_attrs.append("allowed-values")
338
339
  response = self._service_impl.get_static_info(request)
339
340
  # The RPC calls no longer raise an exception. Force an exception if
340
341
  # type is empty
@@ -452,9 +452,18 @@ class BaseSession:
452
452
  "field_data_streaming",
453
453
  "start_journal",
454
454
  "stop_journal",
455
+ "scheme_eval",
455
456
  }
456
457
  return sorted(dir_list)
457
458
 
459
+ def enable_beta_features(self):
460
+ """Enable access to Fluent beta-features"""
461
+ self._app_utilities.enable_beta()
462
+
463
+ @property
464
+ def _is_beta_enabled(self):
465
+ return self._app_utilities.is_beta_enabled()
466
+
458
467
 
459
468
  class Fields:
460
469
  """Container for field and solution variables."""
@@ -468,7 +477,7 @@ class Fields:
468
477
  self._is_solution_data_valid = (
469
478
  _session._app_utilities.is_solution_data_available
470
479
  )
471
- self.field_info = service_creator("field_info").create(
480
+ self._field_info = service_creator("field_info").create(
472
481
  _session._field_data_service,
473
482
  self._is_solution_data_valid,
474
483
  )
@@ -488,3 +497,9 @@ class Fields:
488
497
  self._is_solution_data_valid,
489
498
  _session.scheme,
490
499
  )
500
+
501
+ @property
502
+ @deprecated(version="0.34.0", reason="Use relevant ``field_data`` methods..")
503
+ def field_info(self):
504
+ """Field Information."""
505
+ return self._field_info
@@ -27,6 +27,7 @@ from typing import Any, Dict
27
27
 
28
28
  import ansys.fluent.core as pyfluent
29
29
  from ansys.fluent.core.data_model_cache import DataModelCache, NameKey
30
+ from ansys.fluent.core.exceptions import BetaFeaturesNotEnabled
30
31
  from ansys.fluent.core.fluent_connection import FluentConnection
31
32
  from ansys.fluent.core.services import SchemeEval
32
33
  from ansys.fluent.core.session import BaseSession
@@ -175,13 +176,12 @@ class PureMeshing(BaseSession):
175
176
 
176
177
  Raises
177
178
  ------
178
- RuntimeError
179
+ AttributeError
179
180
  If beta features are not enabled in Fluent.
180
181
  """
181
- if not self._app_utilities.is_beta_enabled():
182
- raise RuntimeError("Topology-based Meshing is a beta feature in Fluent.")
183
- self._base_meshing.topology_based_meshing_workflow.initialize()
184
- return self._base_meshing.topology_based_meshing_workflow
182
+ if not self._is_beta_enabled:
183
+ raise BetaFeaturesNotEnabled("Topology-based meshing")
184
+ return self._base_meshing.topology_based_meshing_workflow()
185
185
 
186
186
  @property
187
187
  def PartManagement(self):
@@ -66,3 +66,4 @@ class PureMeshing:
66
66
  clean_up_mesh_file: bool = ...,
67
67
  overwrite_previous: bool = ...,
68
68
  ): ...
69
+ def enable_beta_features(self): ...
@@ -30,6 +30,7 @@ import weakref
30
30
 
31
31
  from ansys.api.fluent.v0 import svar_pb2 as SvarProtoModule
32
32
  import ansys.fluent.core as pyfluent
33
+ from ansys.fluent.core.exceptions import BetaFeaturesNotEnabled
33
34
  from ansys.fluent.core.pyfluent_warnings import PyFluentDeprecationWarning
34
35
  from ansys.fluent.core.services import SchemeEval, service_creator
35
36
  from ansys.fluent.core.services.field_data import ZoneInfo, ZoneType
@@ -353,16 +354,40 @@ class Solver(BaseSession):
353
354
  raise ex
354
355
 
355
356
  def __dir__(self):
356
- if self._fluent_connection is None:
357
- return ["is_active"]
358
- dir_list = set(list(self.__dict__.keys()) + dir(type(self))) - {
357
+ dir_list = set(super().__dir__()) - {
359
358
  "svar_data",
360
359
  "svar_info",
361
360
  "reduction",
362
- "field_data",
363
- "field_info",
364
- "field_data_streaming",
365
- "start_journal",
366
- "stop_journal",
367
361
  }
368
362
  return sorted(dir_list)
363
+
364
+ def switch_to_meshing(self):
365
+ """Switch to meshing mode and return a meshing session object. Deactivate this
366
+ object's public interface and streaming services.
367
+
368
+ Raises
369
+ ------
370
+ AttributeError
371
+ If beta features are not enabled in Fluent.
372
+
373
+ Returns
374
+ -------
375
+ Meshing
376
+ """
377
+ if not self._is_beta_enabled:
378
+ raise BetaFeaturesNotEnabled("switch_to_meshing")
379
+ from ansys.fluent.core.session_meshing import Meshing
380
+
381
+ self.settings.switch_to_meshing_mode()
382
+ for cb in self._fluent_connection.finalizer_cbs:
383
+ cb()
384
+ meshing_session = Meshing(
385
+ fluent_connection=self._fluent_connection,
386
+ scheme_eval=self.scheme,
387
+ file_transfer_service=self._file_transfer_service,
388
+ )
389
+ self._fluent_connection = None
390
+ self.__doc__ = (
391
+ "The solver session is no longer usable after switching to meshing mode."
392
+ )
393
+ return meshing_session
@@ -44,3 +44,4 @@ class Solver:
44
44
  def write_case(self, file_name: str): ...
45
45
  @property
46
46
  def settings(self) -> settings_root.root: ...
47
+ def enable_beta_features(self): ...