Skip to content

Commit f8ff1da

Browse files
refactor: Deprecate FieldInfo. (#4287)
Deprecate Field Info. 1. Delete from documentation. 2. Update other documentation like FileSession. 3. Updated tests as well Please refer the updated docs and tests for reference. ```python # Earlier: >>> field_info.get_scalar_fields_info >>> field_info.get_scalar_field_range >>> field_info.get_vector_fields_info >>> field_info.get_surfaces_info # Now: >>> field_data.scalars() >>> field_data.vectors() >>> field_data.surfaces() >>> field_data.surface_ids() ``` --------- Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent c4a4cce commit f8ff1da

File tree

16 files changed

+322
-247
lines changed

16 files changed

+322
-247
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Deprecate fieldinfo.

doc/deprecated_pyfluent_apis.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@
5353
"0.25.0",
5454
":py:meth:`ansys.fluent.core.file_session.FileFieldData.get_field_data <ansys.fluent.core.file_session.FileFieldData.get_field_data>`",
5555
),
56+
# class
57+
(
58+
":py:class:`ansys.fluent.core.services.field_data.FieldInfo <ansys.fluent.core.services.field_data.FieldInfo>`",
59+
"0.34.0",
60+
":py:class:`ansys.fluent.core.services.field_data.FieldData <ansys.fluent.core.services.field_data.FieldData>`",
61+
),
5662
# properties
5763
(
5864
":py:meth:`ansys.fluent.core.session.BaseSession.field_info <ansys.fluent.core.session.BaseSession.field_info>`",

doc/source/user_guide/fields/field_data.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ Some sample use cases are demonstrated below:
239239
False
240240
>>> field_data.scalar_fields.is_active(VariableCatalog.VELOCITY_MAGNITUDE)
241241
True
242+
>>> field_data.scalar_fields.range("cell-weight")
243+
[8.0, 24.0]
242244
243245
>>> field_data.surfaces.allowed_values()
244246
['in1', 'in2', 'in3', 'inlet', 'inlet1', 'inlet2', 'out1', 'outlet', 'solid_up:1', 'solid_up:1:830', 'solid_up:1:830-shadow']

doc/source/user_guide/fields/field_info.rst

Lines changed: 0 additions & 88 deletions
This file was deleted.

doc/source/user_guide/fields/fields_contents.rst

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ Fields
77

88
PyFluent provides several services that allow you to access field data in different ways.
99
Every PyFluent solution and meshing :ref:`Session <ref_session_guide>` object contains a ``fields`` object. In both
10-
solution and meshing modes, the ``fields`` object contains ``field_data``, ``field_data_streaming``
11-
and ``field_info`` children. In :obj:`solution <ansys.fluent.core.session_solver.Solver>` mode, the ``fields`` object also has ``reduction``,
10+
solution and meshing modes, the ``fields`` object contains ``field_data`` and ``field_data_streaming``
11+
children. In :obj:`solution <ansys.fluent.core.session_solver.Solver>` mode, the ``fields`` object also has ``reduction``,
1212
``solution_variable_data`` and ``solution_variable_info`` children.
1313

1414
.. toctree::
1515
:maxdepth: 1
1616
:hidden:
1717

1818
field_data
19-
field_info
2019
reduction
2120
solution_data

doc/source/user_guide/offline/file_session.rst

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ Single-phase
3636
>>> data_file_name = examples.download_file("elbow1.dat.h5", "pyfluent/file_session")
3737
>>> file_session = FileSession(case_file_name, data_file_name)
3838
39-
>>> file_session.fields.field_info.get_scalar_field_range("SV_T")
39+
>>> file_session.fields.field_data.scalar_fields.range("SV_T")
4040
[0.0, 313.1515948109515]
41-
>>> file_session.fields.field_info.get_surfaces_info()
41+
>>> file_session.fields.field_data.surfaces()
4242
{'wall': {'surface_id': [3],
4343
'zone_id': -1,
4444
'zone_type': 'wall',
@@ -52,7 +52,7 @@ Single-phase
5252
'zone_id': -1,
5353
'zone_type': 'wall',
5454
'type': 'plane'}}
55-
>>> file_session.fields.field_info.get_scalar_fields_info()
55+
>>> file_session.fields.field_data.scalar_fields()
5656
{'SV_ARTIFICIAL_WALL_FLAG': {'display_name': 'SV_ARTIFICIAL_WALL_FLAG',
5757
'section': 'field-data',
5858
'domain': 'phase-1'},
@@ -63,7 +63,7 @@ Single-phase
6363
'SV_WALL_YPLUS_UTAU': {'display_name': 'SV_WALL_YPLUS_UTAU',
6464
'section': 'field-data',
6565
'domain': 'phase-1'}}
66-
>>> file_session.fields.field_info.get_vector_fields_info()
66+
>>> file_session.fields.field_data.vector_fields()
6767
{'velocity': {'x-component': 'SV_U',
6868
'y-component': 'SV_V',
6969
'z-component': 'SV_W'}}
@@ -132,9 +132,9 @@ Multiphase
132132
>>> file_session.read_case(case_file_name)
133133
>>> file_session.read_data(data_file_name)
134134
135-
>>> file_session.fields.field_info.get_scalar_field_range("phase-2:SV_P")
135+
>>> file_session.fields.field_data.scalar_fields.range("phase-2:SV_P")
136136
[0.0, 1.5435200335871788e-11]
137-
>>> file_session.fields.field_info.get_scalar_fields_info()
137+
>>> file_session.fields.field_data.scalar_fields()
138138
{'phase-1:SV_ARTIFICIAL_WALL_FLAG': {'display_name': 'SV_ARTIFICIAL_WALL_FLAG',
139139
'section': 'field-data',
140140
'domain': 'phase-1'},
@@ -145,7 +145,7 @@ Multiphase
145145
'phase-4:': {'display_name': '',
146146
'section': 'field-data',
147147
'domain': 'phase-4'}}
148-
>>> file_session.fields.field_info.get_vector_fields_info()
148+
>>> file_session.fields.field_data.vector_fields()
149149
{'phase-1:velocity': {'x-component': 'phase-1: SV_U',
150150
'y-component': 'phase-1: SV_V',
151151
'z-component': 'phase-1: SV_W'},

src/ansys/fluent/core/field_data_interfaces.py

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,120 @@ def get_response(self) -> FieldDataSource:
290290
pass
291291

292292

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+
293407
class _AllowedNames:
294408
def __init__(
295409
self, field_info: BaseFieldInfo | None = None, info: dict | None = None
@@ -337,7 +451,7 @@ def valid_name(self, field_name):
337451

338452
class _AllowedSurfaceNames(_AllowedNames):
339453
def __call__(self, respect_data_valid: bool = True) -> List[str]:
340-
return self._info if self._info else self._field_info.get_surfaces_info()
454+
return self._info if self._info else self._field_info._get_surfaces_info()
341455

342456
def valid_name(self, surface_name: str) -> str:
343457
"""Returns valid names.
@@ -365,7 +479,7 @@ def __call__(self, respect_data_valid: bool = True) -> List[int]:
365479
try:
366480
return [
367481
info["surface_id"][0]
368-
for _, info in self._field_info.get_surfaces_info().items()
482+
for _, info in self._field_info._get_surfaces_info().items()
369483
]
370484
except (KeyError, IndexError):
371485
pass
@@ -383,7 +497,7 @@ class _AllowedScalarFieldNames(_AllowedFieldNames):
383497

384498
def __call__(self, respect_data_valid: bool = True) -> List[str]:
385499
field_dict = (
386-
self._info if self._info else self._field_info.get_scalar_fields_info()
500+
self._info if self._info else self._field_info._get_scalar_fields_info()
387501
)
388502
return (
389503
field_dict
@@ -405,7 +519,7 @@ def __call__(self, respect_data_valid: bool = True) -> List[str]:
405519
self._info
406520
if self._info
407521
else (
408-
self._field_info.get_vector_fields_info()
522+
self._field_info._get_vector_fields_info()
409523
if (not respect_data_valid or self._is_data_valid())
410524
else []
411525
)

0 commit comments

Comments
 (0)