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.

Files changed (80) hide show
  1. ansys/fluent/core/__init__.py +12 -12
  2. ansys/fluent/core/_version.py +1 -1
  3. ansys/fluent/core/docs/README.rst +26 -26
  4. ansys/fluent/core/examples/downloads.py +28 -16
  5. ansys/fluent/core/filereader/case_file.py +20 -11
  6. ansys/fluent/core/fluent_connection.py +21 -1
  7. ansys/fluent/core/launcher/fluent_container.py +1 -1
  8. ansys/fluent/core/launcher/fluent_launcher_options.json +10 -0
  9. ansys/fluent/core/launcher/launcher.py +29 -15
  10. ansys/fluent/core/meshing/tui_231.py +7642 -7642
  11. ansys/fluent/core/services/datamodel_se.py +142 -110
  12. ansys/fluent/core/services/field_data.py +278 -29
  13. ansys/fluent/core/services/meshing_queries.py +1795 -0
  14. ansys/fluent/core/services/settings.py +1 -1
  15. ansys/fluent/core/services/svar.py +606 -0
  16. ansys/fluent/core/session_pure_meshing.py +4 -5
  17. ansys/fluent/core/solver/flobject.py +59 -2
  18. ansys/fluent/core/solver/settings_222/change_type.py +1 -1
  19. ansys/fluent/core/solver/settings_222/clear_generated_data.py +1 -1
  20. ansys/fluent/core/solver/settings_222/compute_2.py +1 -1
  21. ansys/fluent/core/solver/settings_222/delete_design_points.py +1 -1
  22. ansys/fluent/core/solver/settings_222/position_1.py +1 -1
  23. ansys/fluent/core/solver/settings_222/setup_unsteady_statistics.py +1 -1
  24. ansys/fluent/core/solver/settings_222/target.py +1 -1
  25. ansys/fluent/core/solver/settings_222/up_vector.py +1 -1
  26. ansys/fluent/core/solver/settings_222/update_selected.py +1 -1
  27. ansys/fluent/core/solver/settings_222/write_1.py +1 -1
  28. ansys/fluent/core/solver/settings_222/write_views.py +1 -1
  29. ansys/fluent/core/solver/settings_231/abaqus.py +2 -2
  30. ansys/fluent/core/solver/settings_231/activate_cell_zone.py +1 -1
  31. ansys/fluent/core/solver/settings_231/calculate_patch.py +2 -2
  32. ansys/fluent/core/solver/settings_231/change_type.py +1 -1
  33. ansys/fluent/core/solver/settings_231/clear_generated_data.py +1 -1
  34. ansys/fluent/core/solver/settings_231/compute_1.py +1 -1
  35. ansys/fluent/core/solver/settings_231/convert_skewed_cells_1.py +1 -1
  36. ansys/fluent/core/solver/settings_231/custom_heat_flux.py +1 -1
  37. ansys/fluent/core/solver/settings_231/customize_fmg_initialization.py +2 -2
  38. ansys/fluent/core/solver/settings_231/delete_design_points.py +1 -1
  39. ansys/fluent/core/solver/settings_231/export_1.py +1 -1
  40. ansys/fluent/core/solver/settings_231/export_modifications.py +1 -1
  41. ansys/fluent/core/solver/settings_231/film_heat_transfer.py +1 -1
  42. ansys/fluent/core/solver/settings_231/film_mass_flow.py +1 -1
  43. ansys/fluent/core/solver/settings_231/forces.py +4 -4
  44. ansys/fluent/core/solver/settings_231/heat_transfer_1.py +1 -1
  45. ansys/fluent/core/solver/settings_231/heat_transfer_sensible.py +1 -1
  46. ansys/fluent/core/solver/settings_231/mass_flow_1.py +1 -1
  47. ansys/fluent/core/solver/settings_231/mechanical_apdl.py +1 -1
  48. ansys/fluent/core/solver/settings_231/mechanical_apdl_input.py +2 -2
  49. ansys/fluent/core/solver/settings_231/modified_setting.py +1 -1
  50. ansys/fluent/core/solver/settings_231/moments.py +2 -2
  51. ansys/fluent/core/solver/settings_231/number_density.py +2 -2
  52. ansys/fluent/core/solver/settings_231/particle_summary.py +1 -1
  53. ansys/fluent/core/solver/settings_231/position_1.py +1 -1
  54. ansys/fluent/core/solver/settings_231/pressure_work_1.py +1 -1
  55. ansys/fluent/core/solver/settings_231/print_histogram.py +1 -1
  56. ansys/fluent/core/solver/settings_231/projected_surface_area.py +2 -2
  57. ansys/fluent/core/solver/settings_231/rad_heat_trans.py +1 -1
  58. ansys/fluent/core/solver/settings_231/read_journal.py +1 -1
  59. ansys/fluent/core/solver/settings_231/rotate.py +2 -2
  60. ansys/fluent/core/solver/settings_231/sample_1.py +4 -4
  61. ansys/fluent/core/solver/settings_231/set_ambient_color.py +1 -1
  62. ansys/fluent/core/solver/settings_231/set_light.py +2 -2
  63. ansys/fluent/core/solver/settings_231/setup_unsteady_statistics.py +1 -1
  64. ansys/fluent/core/solver/settings_231/surface_integrals.py +1 -1
  65. ansys/fluent/core/solver/settings_231/taitherm.py +1 -1
  66. ansys/fluent/core/solver/settings_231/target.py +1 -1
  67. ansys/fluent/core/solver/settings_231/translate.py +1 -1
  68. ansys/fluent/core/solver/settings_231/up_vector.py +1 -1
  69. ansys/fluent/core/solver/settings_231/update_selected.py +1 -1
  70. ansys/fluent/core/solver/settings_231/viscous_work.py +1 -1
  71. ansys/fluent/core/solver/settings_231/volume_integrals.py +1 -1
  72. ansys/fluent/core/solver/settings_231/write_1.py +1 -1
  73. ansys/fluent/core/solver/settings_231/write_histogram.py +1 -1
  74. ansys/fluent/core/solver/settings_231/write_views.py +1 -1
  75. ansys/fluent/core/solver/tui_231.py +36423 -36423
  76. {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/METADATA +30 -30
  77. {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/RECORD +80 -78
  78. {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/LICENSE +0 -0
  79. {ansys_fluent_core-0.14.dev0.dist-info → ansys_fluent_core-0.14.dev2.dist-info}/WHEEL +0 -0
  80. {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 self.use_cache:
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
- request.diffstate = (
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,