ansys-fluent-core 0.14.dev0__py3-none-any.whl → 0.14.dev2__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 +12 -12
- ansys/fluent/core/_version.py +1 -1
- ansys/fluent/core/docs/README.rst +26 -26
- ansys/fluent/core/examples/downloads.py +28 -16
- ansys/fluent/core/filereader/case_file.py +20 -11
- ansys/fluent/core/fluent_connection.py +21 -1
- ansys/fluent/core/launcher/fluent_container.py +1 -1
- ansys/fluent/core/launcher/fluent_launcher_options.json +10 -0
- ansys/fluent/core/launcher/launcher.py +29 -15
- ansys/fluent/core/meshing/tui_231.py +7642 -7642
- ansys/fluent/core/services/datamodel_se.py +142 -110
- ansys/fluent/core/services/field_data.py +278 -29
- ansys/fluent/core/services/meshing_queries.py +1795 -0
- ansys/fluent/core/services/settings.py +1 -1
- ansys/fluent/core/services/svar.py +606 -0
- ansys/fluent/core/session_pure_meshing.py +4 -5
- ansys/fluent/core/solver/flobject.py +59 -2
- ansys/fluent/core/solver/settings_222/change_type.py +1 -1
- ansys/fluent/core/solver/settings_222/clear_generated_data.py +1 -1
- ansys/fluent/core/solver/settings_222/compute_2.py +1 -1
- ansys/fluent/core/solver/settings_222/delete_design_points.py +1 -1
- ansys/fluent/core/solver/settings_222/position_1.py +1 -1
- ansys/fluent/core/solver/settings_222/setup_unsteady_statistics.py +1 -1
- ansys/fluent/core/solver/settings_222/target.py +1 -1
- ansys/fluent/core/solver/settings_222/up_vector.py +1 -1
- ansys/fluent/core/solver/settings_222/update_selected.py +1 -1
- ansys/fluent/core/solver/settings_222/write_1.py +1 -1
- ansys/fluent/core/solver/settings_222/write_views.py +1 -1
- ansys/fluent/core/solver/settings_231/abaqus.py +2 -2
- ansys/fluent/core/solver/settings_231/activate_cell_zone.py +1 -1
- ansys/fluent/core/solver/settings_231/calculate_patch.py +2 -2
- ansys/fluent/core/solver/settings_231/change_type.py +1 -1
- ansys/fluent/core/solver/settings_231/clear_generated_data.py +1 -1
- ansys/fluent/core/solver/settings_231/compute_1.py +1 -1
- ansys/fluent/core/solver/settings_231/convert_skewed_cells_1.py +1 -1
- ansys/fluent/core/solver/settings_231/custom_heat_flux.py +1 -1
- ansys/fluent/core/solver/settings_231/customize_fmg_initialization.py +2 -2
- ansys/fluent/core/solver/settings_231/delete_design_points.py +1 -1
- ansys/fluent/core/solver/settings_231/export_1.py +1 -1
- ansys/fluent/core/solver/settings_231/export_modifications.py +1 -1
- ansys/fluent/core/solver/settings_231/film_heat_transfer.py +1 -1
- ansys/fluent/core/solver/settings_231/film_mass_flow.py +1 -1
- ansys/fluent/core/solver/settings_231/forces.py +4 -4
- ansys/fluent/core/solver/settings_231/heat_transfer_1.py +1 -1
- ansys/fluent/core/solver/settings_231/heat_transfer_sensible.py +1 -1
- ansys/fluent/core/solver/settings_231/mass_flow_1.py +1 -1
- ansys/fluent/core/solver/settings_231/mechanical_apdl.py +1 -1
- ansys/fluent/core/solver/settings_231/mechanical_apdl_input.py +2 -2
- ansys/fluent/core/solver/settings_231/modified_setting.py +1 -1
- ansys/fluent/core/solver/settings_231/moments.py +2 -2
- ansys/fluent/core/solver/settings_231/number_density.py +2 -2
- ansys/fluent/core/solver/settings_231/particle_summary.py +1 -1
- ansys/fluent/core/solver/settings_231/position_1.py +1 -1
- ansys/fluent/core/solver/settings_231/pressure_work_1.py +1 -1
- ansys/fluent/core/solver/settings_231/print_histogram.py +1 -1
- ansys/fluent/core/solver/settings_231/projected_surface_area.py +2 -2
- ansys/fluent/core/solver/settings_231/rad_heat_trans.py +1 -1
- ansys/fluent/core/solver/settings_231/read_journal.py +1 -1
- ansys/fluent/core/solver/settings_231/rotate.py +2 -2
- ansys/fluent/core/solver/settings_231/sample_1.py +4 -4
- ansys/fluent/core/solver/settings_231/set_ambient_color.py +1 -1
- ansys/fluent/core/solver/settings_231/set_light.py +2 -2
- ansys/fluent/core/solver/settings_231/setup_unsteady_statistics.py +1 -1
- ansys/fluent/core/solver/settings_231/surface_integrals.py +1 -1
- ansys/fluent/core/solver/settings_231/taitherm.py +1 -1
- ansys/fluent/core/solver/settings_231/target.py +1 -1
- ansys/fluent/core/solver/settings_231/translate.py +1 -1
- ansys/fluent/core/solver/settings_231/up_vector.py +1 -1
- ansys/fluent/core/solver/settings_231/update_selected.py +1 -1
- ansys/fluent/core/solver/settings_231/viscous_work.py +1 -1
- ansys/fluent/core/solver/settings_231/volume_integrals.py +1 -1
- ansys/fluent/core/solver/settings_231/write_1.py +1 -1
- ansys/fluent/core/solver/settings_231/write_histogram.py +1 -1
- ansys/fluent/core/solver/settings_231/write_views.py +1 -1
- ansys/fluent/core/solver/tui_231.py +36423 -36423
- {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/METADATA +30 -30
- {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/RECORD +80 -78
- {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/LICENSE +0 -0
- {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/WHEEL +0 -0
- {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/top_level.txt +0 -0
|
@@ -351,7 +351,7 @@ class SettingsService:
|
|
|
351
351
|
@_trace
|
|
352
352
|
def has_wildcard(self, name: str) -> bool:
|
|
353
353
|
"""Checks whether a name has a wildcard pattern."""
|
|
354
|
-
return self._scheme_eval.scheme_eval(f'(has-wild-card? "{name}")')
|
|
354
|
+
return self._scheme_eval.scheme_eval(f'(has-fnmatch-wild-card? "{name}")')
|
|
355
355
|
|
|
356
356
|
@_trace
|
|
357
357
|
def is_interactive_mode(self) -> bool:
|
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
"""Wrappers over SVAR gRPC service of Fluent."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
from typing import Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
import grpc
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
from ansys.api.fluent.v0 import field_data_pb2 as FieldDataProtoModule
|
|
10
|
+
from ansys.api.fluent.v0 import svar_pb2 as SvarProtoModule
|
|
11
|
+
from ansys.api.fluent.v0 import svar_pb2_grpc as SvarGrpcModule
|
|
12
|
+
from ansys.fluent.core.services.error_handler import catch_grpc_error
|
|
13
|
+
from ansys.fluent.core.services.field_data import (
|
|
14
|
+
_FieldDataConstants,
|
|
15
|
+
override_help_text,
|
|
16
|
+
)
|
|
17
|
+
from ansys.fluent.core.services.interceptors import TracingInterceptor
|
|
18
|
+
from ansys.fluent.core.solver.error_message import allowed_name_error_message
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SVARService:
|
|
22
|
+
"""SVAR service of Fluent."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, channel: grpc.Channel, metadata):
|
|
25
|
+
"""__init__ method of SVAR service class."""
|
|
26
|
+
tracing_interceptor = TracingInterceptor()
|
|
27
|
+
intercept_channel = grpc.intercept_channel(channel, tracing_interceptor)
|
|
28
|
+
self.__stub = SvarGrpcModule.svarStub(intercept_channel)
|
|
29
|
+
self.__metadata = metadata
|
|
30
|
+
|
|
31
|
+
@catch_grpc_error
|
|
32
|
+
def get_svar_data(self, request):
|
|
33
|
+
"""GetSvarData rpc of SVAR service."""
|
|
34
|
+
return self.__stub.GetSvarData(request, metadata=self.__metadata)
|
|
35
|
+
|
|
36
|
+
@catch_grpc_error
|
|
37
|
+
def set_svar_data(self, request):
|
|
38
|
+
"""SetSvarData rpc of SVAR service."""
|
|
39
|
+
return self.__stub.SetSvarData(request, metadata=self.__metadata)
|
|
40
|
+
|
|
41
|
+
@catch_grpc_error
|
|
42
|
+
def get_svars_info(self, request):
|
|
43
|
+
"""GetSvarsInfo rpc of SVAR service."""
|
|
44
|
+
return self.__stub.GetSvarsInfo(request, metadata=self.__metadata)
|
|
45
|
+
|
|
46
|
+
@catch_grpc_error
|
|
47
|
+
def get_zones_info(self, request):
|
|
48
|
+
"""GetZonesInfo rpc of SVAR service."""
|
|
49
|
+
return self.__stub.GetZonesInfo(request, metadata=self.__metadata)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class SVARInfo:
|
|
53
|
+
"""Provide access to Fluent SVARs and Zones information.
|
|
54
|
+
|
|
55
|
+
Example
|
|
56
|
+
-------
|
|
57
|
+
|
|
58
|
+
.. code-block:: python
|
|
59
|
+
|
|
60
|
+
>>> svar_info = solver_session.svar_info
|
|
61
|
+
>>>
|
|
62
|
+
>>> svars_info_wall_fluid = svar_info.get_svars_info(zone_names=['wall' , "fluid"], domain_name="mixture")
|
|
63
|
+
>>> svars_info_wall_fluid.svars
|
|
64
|
+
>>> ['SV_CENTROID', 'SV_D', 'SV_H', 'SV_K', 'SV_P', 'SV_T', 'SV_U', 'SV_V', 'SV_W']
|
|
65
|
+
>>> svar_info_centroid = svars_info_wall_fluid['SV_CENTROID']
|
|
66
|
+
>>> svar_info_centroid
|
|
67
|
+
>>> name:SV_CENTROID dimension:3 field_type:<class 'numpy.float64'>
|
|
68
|
+
>>>
|
|
69
|
+
>>> zones_info = svar_info.get_zones_info()
|
|
70
|
+
>>> zones_info.zones
|
|
71
|
+
>>> ['fluid', 'wall', 'symmetry', 'pressure-outlet-7', 'velocity-inlet-6', 'velocity-inlet-5', 'default-interior']
|
|
72
|
+
>>> zone_info = zones_info['wall']
|
|
73
|
+
>>> zone_info
|
|
74
|
+
>>> name:wall count: 3630 zone_id:3 zone_type:wall thread_type:Face
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
class SVARS:
|
|
79
|
+
"""Class containing information for multiple SVARs."""
|
|
80
|
+
|
|
81
|
+
class SVAR:
|
|
82
|
+
"""Class containing information for single SVAR."""
|
|
83
|
+
|
|
84
|
+
def __init__(self, svar_info):
|
|
85
|
+
self.name = svar_info.name
|
|
86
|
+
self.dimension = svar_info.dimension
|
|
87
|
+
self.field_type = _FieldDataConstants.proto_field_type_to_np_data_type[
|
|
88
|
+
svar_info.fieldType
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
def __repr__(self):
|
|
92
|
+
return f"name:{self.name} dimension:{self.dimension} field_type:{self.field_type}"
|
|
93
|
+
|
|
94
|
+
def __init__(self, svars_info):
|
|
95
|
+
self._svars_info = {}
|
|
96
|
+
for svar_info in svars_info:
|
|
97
|
+
self._svars_info[svar_info.name] = SVARInfo.SVARS.SVAR(svar_info)
|
|
98
|
+
|
|
99
|
+
def _filter(self, svars_info):
|
|
100
|
+
self._svars_info = {
|
|
101
|
+
k: v
|
|
102
|
+
for k, v in self._svars_info.items()
|
|
103
|
+
if k in [svar_info.name for svar_info in svars_info]
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
def __getitem__(self, name):
|
|
107
|
+
return self._svars_info.get(name, None)
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def svars(self) -> List[str]:
|
|
111
|
+
return list(self._svars_info.keys())
|
|
112
|
+
|
|
113
|
+
class ZonesInfo:
|
|
114
|
+
"""Class containing information for multiple zones."""
|
|
115
|
+
|
|
116
|
+
class ZoneInfo:
|
|
117
|
+
"""Class containing information for single zone."""
|
|
118
|
+
|
|
119
|
+
class PartitionsInfo:
|
|
120
|
+
"""Class containing information for partitions."""
|
|
121
|
+
|
|
122
|
+
def __init__(self, partition_info):
|
|
123
|
+
self.count = partition_info.count
|
|
124
|
+
self.start_index = (
|
|
125
|
+
partition_info.startIndex if self.count > 0 else 0
|
|
126
|
+
)
|
|
127
|
+
self.end_index = partition_info.endIndex if self.count > 0 else 0
|
|
128
|
+
|
|
129
|
+
def __init__(self, zone_info):
|
|
130
|
+
self.name = zone_info.name
|
|
131
|
+
self.zone_id = zone_info.zoneId
|
|
132
|
+
self.zone_type = zone_info.zoneType
|
|
133
|
+
self.thread_type = zone_info.threadType
|
|
134
|
+
self.partitions_info = [
|
|
135
|
+
self.PartitionsInfo(partition_info)
|
|
136
|
+
for partition_info in zone_info.partitionsInfo
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def count(self) -> int:
|
|
141
|
+
return sum(
|
|
142
|
+
[partition_info.count for partition_info in self.partitions_info]
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def __repr__(self):
|
|
146
|
+
partition_str = ""
|
|
147
|
+
for i, partition_info in enumerate(self.partitions_info):
|
|
148
|
+
partition_str += f"\n\t{i}. {partition_info.count}[{partition_info.start_index}:{partition_info.end_index}]"
|
|
149
|
+
return f"name:{self.name} count: {self.count} zone_id:{self.zone_id} zone_type:{self.zone_type} threadType:{'Cell' if self.thread_type==SvarProtoModule.ThreadType.CELL_THREAD else 'Face'}{partition_str}"
|
|
150
|
+
|
|
151
|
+
def __init__(self, zones_info, domains_info):
|
|
152
|
+
self._zones_info = {}
|
|
153
|
+
self._domains_info = {}
|
|
154
|
+
for zone_info in zones_info:
|
|
155
|
+
self._zones_info[zone_info.name] = self.ZoneInfo(zone_info)
|
|
156
|
+
for domain_info in domains_info:
|
|
157
|
+
self._domains_info[domain_info.name] = domain_info.domainId
|
|
158
|
+
|
|
159
|
+
def __getitem__(self, name):
|
|
160
|
+
return self._zones_info.get(name, None)
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def zones(self) -> List[str]:
|
|
164
|
+
return list(self._zones_info.keys())
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def domains(self) -> List[str]:
|
|
168
|
+
return list(self._domains_info.keys())
|
|
169
|
+
|
|
170
|
+
def domain_id(self, domain_name) -> int:
|
|
171
|
+
return self._domains_info.get(domain_name, None)
|
|
172
|
+
|
|
173
|
+
def __init__(
|
|
174
|
+
self,
|
|
175
|
+
service: SVARService,
|
|
176
|
+
):
|
|
177
|
+
self._service = service
|
|
178
|
+
|
|
179
|
+
def get_svars_info(
|
|
180
|
+
self, zone_names: List[str], domain_name: str = "mixture"
|
|
181
|
+
) -> SVARS:
|
|
182
|
+
"""Get SVARs info for zones in the domain.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
zone_names : List[str]
|
|
187
|
+
List of zone names.
|
|
188
|
+
domain_name: str, optional
|
|
189
|
+
Domain name.The default is ``mixture``.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
SVARInfo.SVARS
|
|
194
|
+
Object containing information for SVARs which are common for list of zone names.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
allowed_zone_names = _AllowedZoneNames(self)
|
|
198
|
+
allowed_domain_names = _AllowedDomainNames(self)
|
|
199
|
+
svars_info = None
|
|
200
|
+
for zone_name in zone_names:
|
|
201
|
+
request = SvarProtoModule.GetSvarsInfoRequest(
|
|
202
|
+
domainId=allowed_domain_names.valid_name(domain_name),
|
|
203
|
+
zoneId=allowed_zone_names.valid_name(zone_name),
|
|
204
|
+
)
|
|
205
|
+
response = self._service.get_svars_info(request)
|
|
206
|
+
if svars_info is None:
|
|
207
|
+
svars_info = SVARInfo.SVARS(response.svarsInfo)
|
|
208
|
+
else:
|
|
209
|
+
svars_info._filter(response.svarsInfo)
|
|
210
|
+
return svars_info
|
|
211
|
+
|
|
212
|
+
def get_zones_info(self) -> ZonesInfo:
|
|
213
|
+
"""Get Zones info.
|
|
214
|
+
|
|
215
|
+
Parameters
|
|
216
|
+
----------
|
|
217
|
+
None
|
|
218
|
+
|
|
219
|
+
Returns
|
|
220
|
+
-------
|
|
221
|
+
SVARInfo.ZonesInfo
|
|
222
|
+
Object containing information for all zones.
|
|
223
|
+
"""
|
|
224
|
+
request = SvarProtoModule.GetZonesInfoRequest()
|
|
225
|
+
response = self._service.get_zones_info(request)
|
|
226
|
+
return SVARInfo.ZonesInfo(response.zonesInfo, response.domainsInfo)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class SvarError(ValueError):
|
|
230
|
+
"""Exception class for errors in SVAR name."""
|
|
231
|
+
|
|
232
|
+
def __init__(self, svar_name: str, allowed_values: List[str]):
|
|
233
|
+
self.svar_name = svar_name
|
|
234
|
+
super().__init__(allowed_name_error_message("svar", svar_name, allowed_values))
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class ZoneError(ValueError):
|
|
238
|
+
"""Exception class for errors in Zone name."""
|
|
239
|
+
|
|
240
|
+
def __init__(self, zone_name: str, allowed_values: List[str]):
|
|
241
|
+
self.zone_name = zone_name
|
|
242
|
+
super().__init__(allowed_name_error_message("zone", zone_name, allowed_values))
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class _AllowedNames:
|
|
246
|
+
def is_valid(self, name):
|
|
247
|
+
return name in self()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class _AllowedSvarNames:
|
|
251
|
+
def __init__(self, svar_info: SVARInfo):
|
|
252
|
+
self._svar_info = svar_info
|
|
253
|
+
|
|
254
|
+
def __call__(
|
|
255
|
+
self, zone_names: List[str], domain_name: str = "mixture"
|
|
256
|
+
) -> List[str]:
|
|
257
|
+
return self._svar_info.get_svars_info(
|
|
258
|
+
zone_names=zone_names, domain_name=domain_name
|
|
259
|
+
).svars
|
|
260
|
+
|
|
261
|
+
def is_valid(self, svar_name, zone_names: List[str], domain_name: str = "mixture"):
|
|
262
|
+
return svar_name in self(zone_names=zone_names, domain_name=domain_name)
|
|
263
|
+
|
|
264
|
+
def valid_name(
|
|
265
|
+
self, svar_name, zone_names: List[str], domain_name: str = "mixture"
|
|
266
|
+
):
|
|
267
|
+
if not self.is_valid(svar_name, zone_names=zone_names, domain_name=domain_name):
|
|
268
|
+
raise SvarError(
|
|
269
|
+
svar_name=svar_name,
|
|
270
|
+
allowed_values=self(zone_names=zone_names, domain_name=domain_name),
|
|
271
|
+
)
|
|
272
|
+
return svar_name
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class _AllowedZoneNames(_AllowedNames):
|
|
276
|
+
def __init__(self, svar_info: SVARInfo):
|
|
277
|
+
self._zones_info = svar_info.get_zones_info()
|
|
278
|
+
|
|
279
|
+
def __call__(self) -> List[str]:
|
|
280
|
+
return self._zones_info.zones
|
|
281
|
+
|
|
282
|
+
def valid_name(self, zone_name):
|
|
283
|
+
if not self.is_valid(zone_name):
|
|
284
|
+
raise ZoneError(
|
|
285
|
+
zone_name=zone_name,
|
|
286
|
+
allowed_values=self(),
|
|
287
|
+
)
|
|
288
|
+
return self._zones_info[zone_name].zone_id
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
class _AllowedDomainNames(_AllowedNames):
|
|
292
|
+
def __init__(self, svar_info: SVARInfo):
|
|
293
|
+
self._zones_info = svar_info.get_zones_info()
|
|
294
|
+
|
|
295
|
+
def __call__(self) -> List[str]:
|
|
296
|
+
return self._zones_info.domains
|
|
297
|
+
|
|
298
|
+
def valid_name(self, domain_name):
|
|
299
|
+
if not self.is_valid(domain_name):
|
|
300
|
+
raise ZoneError(
|
|
301
|
+
domain_name=domain_name,
|
|
302
|
+
allowed_values=self(),
|
|
303
|
+
)
|
|
304
|
+
return self._zones_info.domain_id(domain_name)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class _SvarMethod:
|
|
308
|
+
class _Arg:
|
|
309
|
+
def __init__(self, accessor):
|
|
310
|
+
self._accessor = accessor
|
|
311
|
+
|
|
312
|
+
def allowed_values(self):
|
|
313
|
+
return sorted(self._accessor())
|
|
314
|
+
|
|
315
|
+
def __init__(self, svar_accessor, args_allowed_values_accessors):
|
|
316
|
+
self._svar_accessor = svar_accessor
|
|
317
|
+
for arg_name, accessor in args_allowed_values_accessors.items():
|
|
318
|
+
setattr(self, arg_name, _SvarMethod._Arg(accessor))
|
|
319
|
+
|
|
320
|
+
def __call__(self, *args, **kwargs):
|
|
321
|
+
return self._svar_accessor(*args, **kwargs)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def extract_svars(svars_data):
|
|
325
|
+
"""Extracts SVAR data via a server call."""
|
|
326
|
+
|
|
327
|
+
def _extract_svar(field_datatype, field_size, svars_data):
|
|
328
|
+
field_arr = np.empty(field_size, dtype=field_datatype)
|
|
329
|
+
field_datatype_item_size = np.dtype(field_datatype).itemsize
|
|
330
|
+
index = 0
|
|
331
|
+
for svar_data in svars_data:
|
|
332
|
+
chunk = svar_data.payload
|
|
333
|
+
if chunk.bytePayload:
|
|
334
|
+
count = min(
|
|
335
|
+
len(chunk.bytePayload) // field_datatype_item_size,
|
|
336
|
+
field_size - index,
|
|
337
|
+
)
|
|
338
|
+
field_arr[index : index + count] = np.frombuffer(
|
|
339
|
+
chunk.bytePayload, field_datatype, count=count
|
|
340
|
+
)
|
|
341
|
+
index += count
|
|
342
|
+
if index == field_size:
|
|
343
|
+
return field_arr
|
|
344
|
+
else:
|
|
345
|
+
payload = (
|
|
346
|
+
chunk.floatPayload.payload
|
|
347
|
+
or chunk.intPayload.payload
|
|
348
|
+
or chunk.doublePayload.payload
|
|
349
|
+
or chunk.longPayload.payload
|
|
350
|
+
)
|
|
351
|
+
count = len(payload)
|
|
352
|
+
field_arr[index : index + count] = np.fromiter(
|
|
353
|
+
payload, dtype=field_datatype
|
|
354
|
+
)
|
|
355
|
+
index += count
|
|
356
|
+
if index == field_size:
|
|
357
|
+
return field_arr
|
|
358
|
+
|
|
359
|
+
zones_svar_data = {}
|
|
360
|
+
for array in svars_data:
|
|
361
|
+
if array.WhichOneof("array") == "payloadInfo":
|
|
362
|
+
zones_svar_data[array.payloadInfo.zone] = _extract_svar(
|
|
363
|
+
_FieldDataConstants.proto_field_type_to_np_data_type[
|
|
364
|
+
array.payloadInfo.fieldType
|
|
365
|
+
],
|
|
366
|
+
array.payloadInfo.fieldSize,
|
|
367
|
+
svars_data,
|
|
368
|
+
)
|
|
369
|
+
elif array.WhichOneof("array") == "header":
|
|
370
|
+
continue
|
|
371
|
+
|
|
372
|
+
return zones_svar_data
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class SVARData:
|
|
376
|
+
"""Provides access to Fluent SVAR data on zones.
|
|
377
|
+
|
|
378
|
+
Example
|
|
379
|
+
-------
|
|
380
|
+
.. code-block:: python
|
|
381
|
+
>>>
|
|
382
|
+
>>> svar_data = solver_session.svar_data
|
|
383
|
+
>>>
|
|
384
|
+
>>> sv_t_wall_fluid=solver_session.svar_data.get_svar_data(svar_name="SV_T", domain_name="mixture", zone_names=["fluid", "wall"])
|
|
385
|
+
>>>
|
|
386
|
+
>>> sv_t_wall_fluid.domain
|
|
387
|
+
>>> 'mixture'
|
|
388
|
+
>>>
|
|
389
|
+
>>> sv_t_wall_fluid.zones
|
|
390
|
+
>>> ['fluid', 'wall']
|
|
391
|
+
>>>
|
|
392
|
+
>>> fluid_temp = sv_t_wall_fluid['fluid']
|
|
393
|
+
>>> fluid_temp.size
|
|
394
|
+
>>> 13852
|
|
395
|
+
>>> fluid_temp.dtype
|
|
396
|
+
>>> float64
|
|
397
|
+
>>> fluid_temp
|
|
398
|
+
>>> array([600., 600., 600., ..., 600., 600., 600.])
|
|
399
|
+
>>>
|
|
400
|
+
>>> wall_temp_array = svar_data.get_array("SV_T", "wall")
|
|
401
|
+
>>> fluid_temp_array =svar_data.get_array("SV_T", "fluid")
|
|
402
|
+
>>> wall_temp_array[:]= 500
|
|
403
|
+
>>> fluid_temp_array[:]= 600
|
|
404
|
+
>>> zone_names_to_svar_data = {'wall':wall_temp_array, 'fluid':fluid_temp_array}
|
|
405
|
+
>>> svar_data.set_svar_data(svar_name="SV_T", domain_name="mixture", zone_names_to_svar_data=zone_names_to_svar_data)
|
|
406
|
+
"""
|
|
407
|
+
|
|
408
|
+
class Data:
|
|
409
|
+
def __init__(self, domain_name, zone_id_name_map, svar_data):
|
|
410
|
+
self._domain_name = domain_name
|
|
411
|
+
self._data = {
|
|
412
|
+
zone_id_name_map[zone_id]: zone_data
|
|
413
|
+
for zone_id, zone_data in svar_data.items()
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
@property
|
|
417
|
+
def domain(self):
|
|
418
|
+
return self._domain_name
|
|
419
|
+
|
|
420
|
+
@property
|
|
421
|
+
def zones(self):
|
|
422
|
+
return list(self._data.keys())
|
|
423
|
+
|
|
424
|
+
@property
|
|
425
|
+
def data(self):
|
|
426
|
+
return self._data
|
|
427
|
+
|
|
428
|
+
def __getitem__(self, name):
|
|
429
|
+
return self._data.get(name, None)
|
|
430
|
+
|
|
431
|
+
def __init__(
|
|
432
|
+
self,
|
|
433
|
+
service: SVARService,
|
|
434
|
+
svar_info: SVARInfo,
|
|
435
|
+
):
|
|
436
|
+
self._service = service
|
|
437
|
+
self._svar_info = svar_info
|
|
438
|
+
|
|
439
|
+
self._allowed_zone_names = _AllowedZoneNames(svar_info)
|
|
440
|
+
|
|
441
|
+
self._allowed_domain_names = _AllowedDomainNames(svar_info)
|
|
442
|
+
|
|
443
|
+
self._allowed_svar_names = _AllowedSvarNames(svar_info)
|
|
444
|
+
svar_args = dict(
|
|
445
|
+
zone_names=self._allowed_zone_names, svar_name=self._allowed_svar_names
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
self.get_svar_data = override_help_text(
|
|
449
|
+
_SvarMethod(
|
|
450
|
+
svar_accessor=self.get_svar_data,
|
|
451
|
+
args_allowed_values_accessors=svar_args,
|
|
452
|
+
),
|
|
453
|
+
self.get_svar_data,
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
def get_array(
|
|
457
|
+
self, svar_name: str, zone_name: str, domain_name: str = "mixture"
|
|
458
|
+
) -> np.zeros:
|
|
459
|
+
"""Get numpy zeros array for the SVAR on a zone.
|
|
460
|
+
|
|
461
|
+
This array can be populated with values to set SVAR data.
|
|
462
|
+
"""
|
|
463
|
+
|
|
464
|
+
zones_info = self._svar_info.get_zones_info()
|
|
465
|
+
if zone_name in zones_info.zones:
|
|
466
|
+
svars_info = self._svar_info.get_svars_info(
|
|
467
|
+
zone_names=[zone_name], domain_name=domain_name
|
|
468
|
+
)
|
|
469
|
+
if svar_name in svars_info.svars:
|
|
470
|
+
return np.zeros(
|
|
471
|
+
zones_info[zone_name].count * svars_info[svar_name].dimension,
|
|
472
|
+
dtype=svars_info[svar_name].field_type,
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
def get_svar_data(
|
|
476
|
+
self,
|
|
477
|
+
svar_name: str,
|
|
478
|
+
zone_names: List[str],
|
|
479
|
+
domain_name: Optional[str] = "mixture",
|
|
480
|
+
) -> Data:
|
|
481
|
+
"""Get SVAR data on zones.
|
|
482
|
+
|
|
483
|
+
Parameters
|
|
484
|
+
----------
|
|
485
|
+
svar_name : str
|
|
486
|
+
Name of the SVAR.
|
|
487
|
+
zone_names: List[str]
|
|
488
|
+
Zone names list for SVAR data.
|
|
489
|
+
domain_name : str, optional
|
|
490
|
+
Domain name. The default is ``mixture``.
|
|
491
|
+
|
|
492
|
+
Returns
|
|
493
|
+
-------
|
|
494
|
+
SVARData.Data
|
|
495
|
+
Object containing SVAR data.
|
|
496
|
+
"""
|
|
497
|
+
svars_request = SvarProtoModule.GetSvarDataRequest(
|
|
498
|
+
provideBytesStream=_FieldDataConstants.bytes_stream,
|
|
499
|
+
chunkSize=_FieldDataConstants.chunk_size,
|
|
500
|
+
)
|
|
501
|
+
svars_request.domainId = self._allowed_domain_names.valid_name(domain_name)
|
|
502
|
+
svars_request.name = self._allowed_svar_names.valid_name(
|
|
503
|
+
svar_name, zone_names, domain_name
|
|
504
|
+
)
|
|
505
|
+
zone_id_name_map = {}
|
|
506
|
+
for zone_name in zone_names:
|
|
507
|
+
zone_id = self._allowed_zone_names.valid_name(zone_name)
|
|
508
|
+
zone_id_name_map[zone_id] = zone_name
|
|
509
|
+
svars_request.zones.append(zone_id)
|
|
510
|
+
|
|
511
|
+
return SVARData.Data(
|
|
512
|
+
domain_name,
|
|
513
|
+
zone_id_name_map,
|
|
514
|
+
extract_svars(self._service.get_svar_data(svars_request)),
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
def set_svar_data(
|
|
518
|
+
self,
|
|
519
|
+
svar_name: str,
|
|
520
|
+
zone_names_to_svar_data: Dict[str, np.array],
|
|
521
|
+
domain_name: str = "mixture",
|
|
522
|
+
) -> None:
|
|
523
|
+
"""Set SVAR data on zones.
|
|
524
|
+
|
|
525
|
+
Parameters
|
|
526
|
+
----------
|
|
527
|
+
svar_name : str
|
|
528
|
+
Name of the SVAR.
|
|
529
|
+
zone_names_to_svar_data: Dict[str, np.array]
|
|
530
|
+
Dictionary containing zone names for SVAR data.
|
|
531
|
+
domain_name : str, optional
|
|
532
|
+
Domain name. The default is ``mixture``.
|
|
533
|
+
|
|
534
|
+
Returns
|
|
535
|
+
-------
|
|
536
|
+
None
|
|
537
|
+
"""
|
|
538
|
+
domain_id = self._allowed_domain_names.valid_name(domain_name)
|
|
539
|
+
zone_ids_to_svar_data = {
|
|
540
|
+
self._allowed_zone_names.valid_name(zone_name): svar_data
|
|
541
|
+
for zone_name, svar_data in zone_names_to_svar_data.items()
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
def generate_set_svar_data_requests():
|
|
545
|
+
set_svar_data_requests = []
|
|
546
|
+
|
|
547
|
+
set_svar_data_requests.append(
|
|
548
|
+
SvarProtoModule.SetSvarDataRequest(
|
|
549
|
+
header=SvarProtoModule.SvarHeader(
|
|
550
|
+
name=svar_name, domainId=domain_id
|
|
551
|
+
)
|
|
552
|
+
)
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
for zone_id, svar_data in zone_ids_to_svar_data.items():
|
|
556
|
+
max_array_size = (
|
|
557
|
+
_FieldDataConstants.chunk_size / np.dtype(svar_data.dtype).itemsize
|
|
558
|
+
)
|
|
559
|
+
svar_data_list = np.array_split(
|
|
560
|
+
svar_data, math.ceil(svar_data.size / max_array_size)
|
|
561
|
+
)
|
|
562
|
+
set_svar_data_requests.append(
|
|
563
|
+
SvarProtoModule.SetSvarDataRequest(
|
|
564
|
+
payloadInfo=SvarProtoModule.Info(
|
|
565
|
+
fieldType=_FieldDataConstants.np_data_type_to_proto_field_type[
|
|
566
|
+
svar_data.dtype.type
|
|
567
|
+
],
|
|
568
|
+
fieldSize=svar_data.size,
|
|
569
|
+
zone=zone_id,
|
|
570
|
+
)
|
|
571
|
+
)
|
|
572
|
+
)
|
|
573
|
+
set_svar_data_requests += [
|
|
574
|
+
SvarProtoModule.SetSvarDataRequest(
|
|
575
|
+
payload=SvarProtoModule.Payload(
|
|
576
|
+
floatPayload=FieldDataProtoModule.FloatPayload(
|
|
577
|
+
payload=svar_data
|
|
578
|
+
)
|
|
579
|
+
)
|
|
580
|
+
if svar_data.dtype.type == np.float32
|
|
581
|
+
else SvarProtoModule.Payload(
|
|
582
|
+
doublePayload=FieldDataProtoModule.DoublePayload(
|
|
583
|
+
payload=svar_data
|
|
584
|
+
)
|
|
585
|
+
)
|
|
586
|
+
if svar_data.dtype.type == np.float64
|
|
587
|
+
else SvarProtoModule.Payload(
|
|
588
|
+
intPayload=FieldDataProtoModule.IntPayload(
|
|
589
|
+
payload=svar_data
|
|
590
|
+
)
|
|
591
|
+
)
|
|
592
|
+
if svar_data.dtype.type == np.int32
|
|
593
|
+
else SvarProtoModule.Payload(
|
|
594
|
+
longPayload=FieldDataProtoModule.LongPayload(
|
|
595
|
+
payload=svar_data
|
|
596
|
+
)
|
|
597
|
+
)
|
|
598
|
+
)
|
|
599
|
+
for svar_data in svar_data_list
|
|
600
|
+
if svar_data.size > 0
|
|
601
|
+
]
|
|
602
|
+
|
|
603
|
+
for set_svar_data_request in set_svar_data_requests:
|
|
604
|
+
yield set_svar_data_request
|
|
605
|
+
|
|
606
|
+
self._service.set_svar_data(generate_set_svar_data_requests())
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import functools
|
|
6
6
|
|
|
7
7
|
from ansys.api.fluent.v0 import datamodel_se_pb2
|
|
8
|
+
import ansys.fluent.core as pyfluent
|
|
8
9
|
from ansys.fluent.core.data_model_cache import DataModelCache
|
|
9
10
|
from ansys.fluent.core.fluent_connection import FluentConnection
|
|
10
11
|
from ansys.fluent.core.services.streaming import StreamingService
|
|
@@ -21,7 +22,6 @@ class PureMeshing(BaseSession):
|
|
|
21
22
|
exposed here. No ``switch_to_solver`` method is available
|
|
22
23
|
in this mode."""
|
|
23
24
|
|
|
24
|
-
use_cache = True
|
|
25
25
|
rules = ["workflow", "meshing", "PartManagement", "PMFileManagement"]
|
|
26
26
|
for r in rules:
|
|
27
27
|
DataModelCache.set_config(r, "internal_names_as_keys", True)
|
|
@@ -36,13 +36,12 @@ class PureMeshing(BaseSession):
|
|
|
36
36
|
self._base_meshing = BaseMeshing(self.execute_tui, fluent_connection)
|
|
37
37
|
datamodel_service_se = fluent_connection.datamodel_service_se
|
|
38
38
|
self.datamodel_streams = {}
|
|
39
|
-
if
|
|
39
|
+
if pyfluent.DATAMODEL_USE_STATE_CACHE:
|
|
40
40
|
for rules in self.__class__.rules:
|
|
41
41
|
request = datamodel_se_pb2.DataModelRequest()
|
|
42
42
|
request.rules = rules
|
|
43
|
-
|
|
44
|
-
datamodel_se_pb2.DIFFSTATE_NOCOMMANDS
|
|
45
|
-
) # DIFFSTATE_FULL?
|
|
43
|
+
if pyfluent.DATAMODEL_USE_NOCOMMANDS_DIFF_STATE:
|
|
44
|
+
request.diffstate = datamodel_se_pb2.DIFFSTATE_NOCOMMANDS
|
|
46
45
|
streaming = StreamingService(
|
|
47
46
|
stub=datamodel_service_se._stub,
|
|
48
47
|
request=request,
|