Field data#
You can use field data objects to access Fluent surface, scalar, vector, and pathlines data.
Accessing field data objects#
In order to access field data, launch the fluent solver, and make field data available (for example, either by reading a case file and then initializing as in the following code, or by reading case and data files).
>>> import ansys.fluent.core as pyfluent
>>> from ansys.fluent.core import examples
>>> import_file_name = examples.download_file("mixing_elbow.msh.h5", "pyfluent/mixing_elbow")
>>> solver = pyfluent.launch_fluent(mode=pyfluent.FluentMode.SOLVER)
>>> solver.settings.file.read(file_type="case", file_name=import_file_name)
>>> solver.settings.solution.initialization.hybrid_initialize()
The field data object is an attribute of the Solver
object:
>>> field_data = solver.fields.field_data
Simple requests#
Here are the methods for requesting each type of field:
get_surface_data
for surface data.get_scalar_field_data
for scalar field data.get_vector_field_data
for vector field dataget_pathlines_field_data
for vector field data
Get surface data#
You can request surface vertices for a given surface_name
by calling
the get_surface_data
method and specifying Vertices
for data_type
.
>>> from ansys.fluent.core.services.field_data import SurfaceDataType
>>> vertices_data = field_data.get_surface_data(surface_name="cold-inlet", data_type=SurfaceDataType.Vertices)
>>> vertices_data.size
241
>>> vertices_data.surface_id
3
>>> vertices_data[5].x
-0.2
>>> vertices_data[5].y
-0.10167995
>>> vertices_data[5].z
0.0036200774
You can call the same method to get the corresponding surface face normals and centroids.
For data_type
, specifying FacesNormal
and FacesCentroid
respectively.
>>> faces_normal_data = field_data.get_surface_data(
>>> data_type=SurfaceDataType.FacesNormal, surface_name="cold-inlet"
>>> )
>>> faces_centroid_data = field_data.get_surface_data(
>>> data_type=SurfaceDataType.FacesCentroid, surface_name="cold-inlet"
>>> )
You can request face connectivity data for a given surface_name
by calling
the get_surface_data
method and specifying FacesConnectivity
for data_type
.
>>> faces_connectivity_data = field_data.get_surface_data(
>>> data_type=SurfaceDataType.FacesConnectivity, surface_name="cold-inlet"
>>> )
>>> faces_connectivity_data[5].node_count
4
>>> faces_connectivity_data[5].node_indices
[12, 13, 17, 16]
If a surface name is provided as input, the response contains face vertices, connectivity data, and normal or centroid data. If surface IDs are provided as input, the response is a dictionary containing a map of surface IDs to face vertices, connectivity data, and normal or centroid data.
Get scalar field data#
You can call the get_scalar_field_data
method to get scalar field data, such as absolute pressure:
>>> abs_press_data = field_data.get_scalar_field_data(field_name="absolute-pressure", surface_name="cold-inlet")
>>> abs_press_data.size
241
>>> abs_press_data[120].scalar_data
101325.0
If a surface name is provided as input, scalar field data is returned. If surface IDs are provided as input, a dictionary containing a map of surface IDs to scalar field data is returned.
Get vector field data#
You can call the get_vector_field_data
method to get vector field data.
>>> velocity_vector_data = field_data.get_vector_field_data(field_name="velocity", surface_name="cold-inlet")
>>> velocity_vector_data.size
152
>>> velocity_vector_data.scale
1.0
If a surface name is provided as input, vector field data is returned. If surface IDs are provided as input, a dictionary containing a map of surface IDs to vector field data is returned.
Get pathlines field data#
You can call the get_pathlines_field_data
method to get pathlines field data.
>>> path_lines_data = field_data.get_pathlines_field_data(field_name="velocity", surface_name="cold-inlet")
>>> path_lines_data["vertices"].size
76152
>>> path_lines_data["lines"].size
76000
>>> path_lines_data["velocity"].size
76152
>>> path_lines_data["lines"][100].node_count
2
>>> path_lines_data["lines"][100].node_indices
array([100, 101])
Dictionary containing a map of surface IDs to the path-line data is returned. or example, pathlines connectivity, vertices, and field.
Note
In Fluent, a surface name can be associated with multiple surface IDs. Thus, a response contains a surface ID as a key of the returned dictionary.
Making multiple requests in a single transaction#
You can get data for multiple fields in a single transaction.
First create transaction object for field data.
>>> transaction = solver.fields.field_data.new_transaction()
Then combine requests for multiple fields using add_<items>_request
methods in a single transaction:
add_surfaces_request
adds a surfaces request.add_scalar_fields_request
adds a scalar fields request.add_vector_fields_request
adds a vector fields request.add_pathlines_fields_request
adds a pathlines fields request.
Following code demonstrate adding multiple requests to a single transaction.
>>> transaction.add_surfaces_request(
>>> surface_ids=[1], provide_vertices=True, provide_faces=False, provide_faces_centroid=True
>>> )
>>> transaction.add_surfaces_request(
>>> surface_ids=[2], provide_vertices=True, provide_faces=True
>>> )
>>> transaction.add_scalar_fields_request(
>>> surface_ids=[1,2], field_name="temperature", node_value=True, boundary_value=True
>>> )
>>> transaction.add_vector_fields_request(surface_ids=[1,2], field_name="velocity")
>>> transaction.add_pathlines_fields_request(surface_ids=[1,2], field_name="temperature")
You can call the get_fields
method to get the data for all these requests. This call also
clears all requests, so that subsequent calls to the get_fields
method yield nothing until
more requests are added.
>>> payload_data = transaction.get_fields()
payload_data
is a dictionary containing the requested fields as a numpy array in the following order:
tag -> surface_id [int] -> field_name [str] -> field_data[np.array]
Tag#
Fluent versions earlier than 2023 R1#
A tag is int, generated by applying bitwise or
on all tags for a request. Here is a list
of supported tags and their values:
OVERSET_MESH: 1,
ELEMENT_LOCATION: 2,
NODE_LOCATION: 4,
BOUNDARY_VALUES: 8,
For example, if you request the scalar field data for element location[2], in the
dictionary, tag
is 2
. Similarly, if you request the boundary values[8] for
node location[4], tag
is (4|8)
or 12.
Fluent versions 2023 R1 and later#
A tag is tuple of input, value pairs for which field data is generated.
For example, if you request the scalar field data for element location, in the
dictionary, tag
is (('type','scalar-field'), ('dataLocation', 1), ('boundaryValues',False))
.
Similarly, if you request the boundary values for node location, tag
is
(('type','scalar-field'), ('dataLocation', 0), ('boundaryValues',True)
.
Surface ID#
The surface ID is the same one that is passed in the request.
Field name#
A request returns multiple fields. The number of fields depends on the request type.
Surface request#
The response to a surface request contains any of the following fields, depending on the request arguments:
faces
, which contain face connectivityvertices
, which contain node coordinatescentroid
, which contains face centroidsface-normal
, which contains face normals
Scalar field request#
The response to a scalar field request contains a single field with the same name as the scalar field name passed in the request.
Vector field request#
The response to a vector field request contains two fields:
vector field
, with the same name as the vector field name that is passed
in the request
vector-scale
, a float value indicating the vector scale.
Pathlines field request#
The response to a pathlines field request contains the following fields:
pathlines-count
, which contains pathlines count.lines
, which contain pathlines connectivity.vertices
, which contain node coordinates.field name
, which contains pathlines field. field name is the same name as the scalar field name passed in the request.particle-time
, which contains particle time, if requested.additional field name
, which contains additional field, if requested. additional field name is the same name as the additional field name passed in the request.
Allowed values#
Additionally there is an allowed_values
method provided on all of
field_name
, surface_name
and surface_ids
which tells you what object
names are accessible.
Some sample use cases are demonstrated below:
>>> field_data.get_scalar_field_data.field_name.allowed_values()
['abs-angular-coordinate', 'absolute-pressure', 'angular-coordinate',
'anisotropic-adaption-cells', 'axial-coordinate', 'axial-velocity',
'boundary-cell-dist', 'boundary-layer-cells', 'boundary-normal-dist', ...]
>>> transaction = field_data.new_transaction()
>>> transaction.add_scalar_fields_request.field_name.allowed_values()
['abs-angular-coordinate', 'absolute-pressure', 'angular-coordinate',
'anisotropic-adaption-cells', 'axial-coordinate', 'axial-velocity',
'boundary-cell-dist', 'boundary-layer-cells', 'boundary-normal-dist', ...]
>>> field_data.get_scalar_field_data.surface_name.allowed_values()
['cold-inlet', 'hot-inlet', 'outlet', 'symmetry-xyplane', 'wall-elbow', 'wall-inlet']
>>> field_data.get_surface_data.surface_ids.allowed_values()
[0, 1, 2, 3, 4, 5]