ansys-fluent-core 0.31.dev1__py3-none-any.whl → 0.32.dev0__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 +11 -3
- ansys/fluent/core/codegen/settingsgen.py +6 -0
- ansys/fluent/core/codegen/tuigen.py +1 -2
- ansys/fluent/core/docker/docker_compose.py +243 -0
- ansys/fluent/core/field_data_interfaces.py +6 -0
- ansys/fluent/core/file_session.py +158 -128
- ansys/fluent/core/filereader/data_file.py +11 -0
- ansys/fluent/core/filereader/pre_processor.py +22 -0
- ansys/fluent/core/fluent_connection.py +48 -20
- ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
- ansys/fluent/core/generated/datamodel_231/flicing.py +20 -20
- ansys/fluent/core/generated/datamodel_231/meshing.py +228 -228
- ansys/fluent/core/generated/datamodel_232/flicing.py +40 -40
- ansys/fluent/core/generated/datamodel_232/meshing.py +203 -203
- ansys/fluent/core/generated/datamodel_241/flicing.py +20 -20
- ansys/fluent/core/generated/datamodel_241/meshing.py +303 -303
- ansys/fluent/core/generated/datamodel_242/flicing.py +35 -35
- ansys/fluent/core/generated/datamodel_242/meshing.py +334 -334
- ansys/fluent/core/generated/datamodel_242/part_management.py +6 -6
- ansys/fluent/core/generated/datamodel_251/flicing.py +40 -40
- ansys/fluent/core/generated/datamodel_251/meshing.py +366 -366
- ansys/fluent/core/generated/datamodel_251/part_management.py +6 -6
- ansys/fluent/core/generated/datamodel_252/flicing.py +30 -30
- ansys/fluent/core/generated/datamodel_252/meshing.py +816 -454
- ansys/fluent/core/generated/datamodel_252/part_management.py +10 -10
- ansys/fluent/core/generated/datamodel_252/preferences.py +1 -1
- ansys/fluent/core/generated/fluent_version_252.py +4 -4
- ansys/fluent/core/generated/solver/settings_252.py +2241 -1649
- ansys/fluent/core/generated/solver/settings_252.pyi +1785 -1430
- ansys/fluent/core/generated/solver/settings_builtin.pyi +104 -0
- ansys/fluent/core/generated/solver/tui_252.py +126 -2
- ansys/fluent/core/launcher/container_launcher.py +39 -8
- ansys/fluent/core/launcher/fluent_container.py +60 -22
- ansys/fluent/core/launcher/launcher.py +24 -13
- ansys/fluent/core/launcher/launcher_utils.py +8 -0
- ansys/fluent/core/launcher/process_launch_string.py +2 -6
- ansys/fluent/core/report.py +2 -0
- ansys/fluent/core/services/deprecated_field_data.py +74 -46
- ansys/fluent/core/services/field_data.py +104 -69
- ansys/fluent/core/services/reduction.py +55 -66
- ansys/fluent/core/services/solution_variables.py +9 -1
- ansys/fluent/core/session.py +15 -12
- ansys/fluent/core/session_meshing.py +3 -0
- ansys/fluent/core/session_solver.py +20 -43
- ansys/fluent/core/session_utilities.py +429 -0
- ansys/fluent/core/solver/flobject.py +28 -0
- ansys/fluent/core/utils/deprecate.py +46 -0
- ansys/fluent/core/utils/file_transfer_service.py +19 -3
- ansys/fluent/core/utils/fluent_version.py +42 -11
- ansys/fluent/core/variable_strategies/__init__.py +29 -0
- ansys/fluent/core/variable_strategies/expr.py +186 -0
- ansys/fluent/core/variable_strategies/field.py +186 -0
- ansys/fluent/core/variable_strategies/svar.py +61 -0
- {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/METADATA +7 -5
- {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/RECORD +57 -51
- {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/LICENSE +0 -0
- {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/WHEEL +0 -0
|
@@ -36,6 +36,9 @@ from ansys.fluent.core.services.interceptors import (
|
|
|
36
36
|
GrpcErrorInterceptor,
|
|
37
37
|
TracingInterceptor,
|
|
38
38
|
)
|
|
39
|
+
from ansys.fluent.core.variable_strategies import (
|
|
40
|
+
FluentExprNamingStrategy as naming_strategy,
|
|
41
|
+
)
|
|
39
42
|
|
|
40
43
|
Path = List[Tuple[str, str]]
|
|
41
44
|
|
|
@@ -273,6 +276,7 @@ class Reduction:
|
|
|
273
276
|
"""__init__ method of Reduction class."""
|
|
274
277
|
self.service = service
|
|
275
278
|
self.ctxt = weakref.proxy(ctxt)
|
|
279
|
+
self._to_str = naming_strategy().to_string if naming_strategy else lambda s: s
|
|
276
280
|
|
|
277
281
|
def _validate_str_location(self, loc: str):
|
|
278
282
|
if all(
|
|
@@ -295,174 +299,159 @@ class Reduction:
|
|
|
295
299
|
except BadReductionRequest:
|
|
296
300
|
return locations
|
|
297
301
|
|
|
302
|
+
def _make_request(
|
|
303
|
+
self,
|
|
304
|
+
requestName,
|
|
305
|
+
locations,
|
|
306
|
+
ctxt=None,
|
|
307
|
+
expression=None,
|
|
308
|
+
weight=None,
|
|
309
|
+
condition=None,
|
|
310
|
+
) -> Any:
|
|
311
|
+
request = getattr(ReductionProtoModule, requestName)()
|
|
312
|
+
if expression is not None:
|
|
313
|
+
request.expression = self._to_str(expression)
|
|
314
|
+
if weight is not None:
|
|
315
|
+
request.weight = weight
|
|
316
|
+
if condition is not None:
|
|
317
|
+
request.condition = condition
|
|
318
|
+
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
319
|
+
return request
|
|
320
|
+
|
|
298
321
|
def area(self, locations, ctxt=None) -> Any:
|
|
299
322
|
"""Get area."""
|
|
300
|
-
request =
|
|
301
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
323
|
+
request = self._make_request("AreaRequest", locations, ctxt)
|
|
302
324
|
response = self.service.area(request)
|
|
303
325
|
return _convert_variant_to_value(response.value)
|
|
304
326
|
|
|
305
327
|
def area_average(self, expression, locations, ctxt=None) -> Any:
|
|
306
328
|
"""Get area average."""
|
|
307
|
-
request =
|
|
308
|
-
request.expression = expression
|
|
309
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
329
|
+
request = self._make_request("AreaAveRequest", locations, ctxt, expression)
|
|
310
330
|
response = self.service.area_average(request)
|
|
311
331
|
return _convert_variant_to_value(response.value)
|
|
312
332
|
|
|
313
333
|
def area_integral(self, expression, locations, ctxt=None) -> Any:
|
|
314
334
|
"""Get area integral."""
|
|
315
|
-
request =
|
|
316
|
-
request.expression = expression
|
|
317
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
335
|
+
request = self._make_request("AreaIntRequest", locations, ctxt, expression)
|
|
318
336
|
response = self.service.area_integral(request)
|
|
319
337
|
return _convert_variant_to_value(response.value)
|
|
320
338
|
|
|
321
339
|
def centroid(self, locations, ctxt=None) -> Any:
|
|
322
340
|
"""Get centroid."""
|
|
323
|
-
request =
|
|
324
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
341
|
+
request = self._make_request("CentroidRequest", locations, ctxt)
|
|
325
342
|
response = self.service.centroid(request)
|
|
326
343
|
return (response.value.x, response.value.y, response.value.z)
|
|
327
344
|
|
|
328
345
|
def count(self, locations, ctxt=None) -> Any:
|
|
329
|
-
"""
|
|
330
|
-
request =
|
|
331
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
346
|
+
"""Count the number of faces or cells within the locations."""
|
|
347
|
+
request = self._make_request("CountRequest", locations, ctxt)
|
|
332
348
|
response = self.service.count(request)
|
|
333
349
|
return _convert_variant_to_value(response.value)
|
|
334
350
|
|
|
335
351
|
def count_if(self, condition, locations, ctxt=None) -> Any:
|
|
336
|
-
"""
|
|
337
|
-
request =
|
|
338
|
-
|
|
339
|
-
|
|
352
|
+
"""Count the number of faces or cells where the specified condition is satisfied."""
|
|
353
|
+
request = self._make_request(
|
|
354
|
+
"CountIfRequest", locations, ctxt, condition=condition
|
|
355
|
+
)
|
|
340
356
|
response = self.service.count_if(request)
|
|
341
357
|
return _convert_variant_to_value(response.value)
|
|
342
358
|
|
|
343
359
|
def force(self, locations, ctxt=None) -> Any:
|
|
344
360
|
"""Get force."""
|
|
345
|
-
request =
|
|
346
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
361
|
+
request = self._make_request("ForceRequest", locations, ctxt)
|
|
347
362
|
response = self.service.force(request)
|
|
348
363
|
return (response.value.x, response.value.y, response.value.z)
|
|
349
364
|
|
|
350
365
|
def mass_average(self, expression, locations, ctxt=None) -> Any:
|
|
351
366
|
"""Get mass average."""
|
|
352
|
-
request =
|
|
353
|
-
request.expression = expression
|
|
354
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
367
|
+
request = self._make_request("MassAveRequest", locations, ctxt, expression)
|
|
355
368
|
response = self.service.mass_average(request)
|
|
356
369
|
return _convert_variant_to_value(response.value)
|
|
357
370
|
|
|
358
371
|
def mass_flow_average(self, expression, locations, ctxt=None) -> Any:
|
|
359
372
|
"""Get mass flow average."""
|
|
360
|
-
request =
|
|
361
|
-
request.expression = expression
|
|
362
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
373
|
+
request = self._make_request("MassFlowAveRequest", locations, ctxt, expression)
|
|
363
374
|
response = self.service.mass_flow_average(request)
|
|
364
375
|
return _convert_variant_to_value(response.value)
|
|
365
376
|
|
|
366
377
|
def mass_flow_average_absolute(self, expression, locations, ctxt=None) -> Any:
|
|
367
|
-
"""
|
|
368
|
-
request =
|
|
369
|
-
|
|
370
|
-
|
|
378
|
+
"""Compute the mass flow average of the absolute value of the given expression."""
|
|
379
|
+
request = self._make_request(
|
|
380
|
+
"MassFlowAveAbsRequest", locations, ctxt, expression
|
|
381
|
+
)
|
|
371
382
|
response = self.service.mass_flow_average_absolute(request)
|
|
372
383
|
return _convert_variant_to_value(response.value)
|
|
373
384
|
|
|
374
385
|
def mass_flow_integral(self, expression, locations, ctxt=None) -> Any:
|
|
375
386
|
"""Get mass flow integral."""
|
|
376
|
-
request =
|
|
377
|
-
request.expression = expression
|
|
378
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
387
|
+
request = self._make_request("MassFlowIntRequest", locations, ctxt, expression)
|
|
379
388
|
response = self.service.mass_flow_integral(request)
|
|
380
389
|
return _convert_variant_to_value(response.value)
|
|
381
390
|
|
|
382
391
|
def mass_integral(self, expression, locations, ctxt=None) -> Any:
|
|
383
392
|
"""Get mass integral."""
|
|
384
|
-
request =
|
|
385
|
-
request.expression = expression
|
|
386
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
393
|
+
request = self._make_request("MassIntRequest", locations, ctxt, expression)
|
|
387
394
|
response = self.service.mass_integral(request)
|
|
388
395
|
return _convert_variant_to_value(response.value)
|
|
389
396
|
|
|
390
397
|
def maximum(self, expression, locations, ctxt=None) -> Any:
|
|
391
398
|
"""Get maximum."""
|
|
392
|
-
request =
|
|
393
|
-
request.expression = expression
|
|
394
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
399
|
+
request = self._make_request("MaximumRequest", locations, ctxt, expression)
|
|
395
400
|
response = self.service.maximum(request)
|
|
396
401
|
return _convert_variant_to_value(response.value)
|
|
397
402
|
|
|
398
403
|
def minimum(self, expression, locations, ctxt=None) -> Any:
|
|
399
404
|
"""Get minimum."""
|
|
400
|
-
request =
|
|
401
|
-
request.expression = expression
|
|
402
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
405
|
+
request = self._make_request("MinimumRequest", locations, ctxt, expression)
|
|
403
406
|
response = self.service.minimum(request)
|
|
404
407
|
return _convert_variant_to_value(response.value)
|
|
405
408
|
|
|
406
409
|
def pressure_force(self, locations, ctxt=None) -> Any:
|
|
407
410
|
"""Get pressure force."""
|
|
408
|
-
request =
|
|
409
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
411
|
+
request = self._make_request("PressureForceRequest", locations, ctxt)
|
|
410
412
|
response = self.service.pressure_force(request)
|
|
411
413
|
return (response.value.x, response.value.y, response.value.z)
|
|
412
414
|
|
|
413
415
|
def viscous_force(self, locations, ctxt=None) -> Any:
|
|
414
416
|
"""Get viscous force."""
|
|
415
|
-
request =
|
|
416
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
417
|
+
request = self._make_request("ViscousForceRequest", locations, ctxt)
|
|
417
418
|
response = self.service.viscous_force(request)
|
|
418
419
|
return (response.value.x, response.value.y, response.value.z)
|
|
419
420
|
|
|
420
421
|
def volume(self, locations, ctxt=None) -> Any:
|
|
421
422
|
"""Get volume."""
|
|
422
|
-
request =
|
|
423
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
423
|
+
request = self._make_request("VolumeRequest", locations, ctxt)
|
|
424
424
|
response = self.service.volume(request)
|
|
425
425
|
return _convert_variant_to_value(response.value)
|
|
426
426
|
|
|
427
427
|
def volume_average(self, expression, locations, ctxt=None) -> Any:
|
|
428
428
|
"""Get volume average."""
|
|
429
|
-
request =
|
|
430
|
-
request.expression = expression
|
|
431
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
429
|
+
request = self._make_request("VolumeRequest", locations, ctxt, expression)
|
|
432
430
|
response = self.service.volume_average(request)
|
|
433
431
|
return _convert_variant_to_value(response.value)
|
|
434
432
|
|
|
435
433
|
def volume_integral(self, expression, locations, ctxt=None) -> Any:
|
|
436
434
|
"""Get volume integral."""
|
|
437
|
-
request =
|
|
438
|
-
request.expression = expression
|
|
439
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
435
|
+
request = self._make_request("VolumeIntRequest", locations, ctxt, expression)
|
|
440
436
|
response = self.service.volume_integral(request)
|
|
441
437
|
return _convert_variant_to_value(response.value)
|
|
442
438
|
|
|
443
439
|
def moment(self, expression, locations, ctxt=None) -> Any:
|
|
444
440
|
"""Get moment."""
|
|
445
|
-
request =
|
|
446
|
-
request.expression = expression
|
|
447
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
441
|
+
request = self._make_request("MomentRequest", locations, ctxt, expression)
|
|
448
442
|
response = self.service.moment(request)
|
|
449
443
|
return (response.value.x, response.value.y, response.value.z)
|
|
450
444
|
|
|
451
445
|
def sum(self, expression, locations, weight, ctxt=None) -> Any:
|
|
452
446
|
"""Get sum."""
|
|
453
|
-
request =
|
|
454
|
-
request.expression = expression
|
|
455
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
456
|
-
request.weight = weight
|
|
447
|
+
request = self._make_request("SumRequest", locations, ctxt, expression, weight)
|
|
457
448
|
response = self.service.sum(request)
|
|
458
449
|
return _convert_variant_to_value(response.value)
|
|
459
450
|
|
|
460
451
|
def sum_if(self, expression, condition, locations, weight, ctxt=None) -> Any:
|
|
461
|
-
"""
|
|
462
|
-
request =
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
request.locations.extend(self._get_location_string(locations, ctxt))
|
|
466
|
-
request.weight = weight
|
|
452
|
+
"""Compute the weighted sum of the expression at locations where the given condition is satisfied."""
|
|
453
|
+
request = self._make_request(
|
|
454
|
+
"SumIfRequest", locations, ctxt, expression, weight, condition
|
|
455
|
+
)
|
|
467
456
|
response = self.service.sum_if(request)
|
|
468
457
|
return _convert_variant_to_value(response.value)
|
|
@@ -42,6 +42,11 @@ from ansys.fluent.core.services.interceptors import (
|
|
|
42
42
|
TracingInterceptor,
|
|
43
43
|
)
|
|
44
44
|
from ansys.fluent.core.solver.error_message import allowed_name_error_message
|
|
45
|
+
from ansys.fluent.core.variable_strategies import (
|
|
46
|
+
FluentSVarNamingStrategy as naming_strategy,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
_to_field_name_str = naming_strategy().to_string if naming_strategy else lambda s: s
|
|
45
50
|
|
|
46
51
|
|
|
47
52
|
class SolutionVariableService:
|
|
@@ -354,6 +359,7 @@ class _AllowedSvarNames:
|
|
|
354
359
|
SvarError
|
|
355
360
|
If the given solution variable name is invalid.
|
|
356
361
|
"""
|
|
362
|
+
solution_variable_name = _to_field_name_str(solution_variable_name)
|
|
357
363
|
if not self.is_valid(
|
|
358
364
|
solution_variable_name, zone_names=zone_names, domain_name=domain_name
|
|
359
365
|
):
|
|
@@ -613,7 +619,9 @@ class SolutionVariableData:
|
|
|
613
619
|
)
|
|
614
620
|
svars_request.domainId = self._allowed_domain_names.valid_name(domain_name)
|
|
615
621
|
svars_request.name = self._allowed_solution_variable_names.valid_name(
|
|
616
|
-
solution_variable_name,
|
|
622
|
+
solution_variable_name,
|
|
623
|
+
zone_names,
|
|
624
|
+
domain_name,
|
|
617
625
|
)
|
|
618
626
|
zone_id_name_map = {}
|
|
619
627
|
for zone_name in zone_names:
|
ansys/fluent/core/session.py
CHANGED
|
@@ -29,8 +29,11 @@ from typing import Any, Callable, Dict
|
|
|
29
29
|
import warnings
|
|
30
30
|
import weakref
|
|
31
31
|
|
|
32
|
+
from deprecated.sphinx import deprecated
|
|
33
|
+
|
|
32
34
|
from ansys.fluent.core.fluent_connection import FluentConnection
|
|
33
35
|
from ansys.fluent.core.journaling import Journal
|
|
36
|
+
from ansys.fluent.core.launcher.launcher_utils import is_compose
|
|
34
37
|
from ansys.fluent.core.pyfluent_warnings import (
|
|
35
38
|
PyFluentDeprecationWarning,
|
|
36
39
|
PyFluentUserWarning,
|
|
@@ -149,6 +152,7 @@ class BaseSession:
|
|
|
149
152
|
event_type,
|
|
150
153
|
get_zones_info,
|
|
151
154
|
)
|
|
155
|
+
self.register_finalizer_callback = fluent_connection.register_finalizer_cb
|
|
152
156
|
|
|
153
157
|
def _build_from_fluent_connection(
|
|
154
158
|
self,
|
|
@@ -270,30 +274,23 @@ class BaseSession:
|
|
|
270
274
|
return True if self._fluent_connection else False
|
|
271
275
|
|
|
272
276
|
@property
|
|
277
|
+
@deprecated(version="0.20.dev9", reason="Use ``session.fields.field_info``.")
|
|
273
278
|
def field_info(self):
|
|
274
279
|
"""Provides access to Fluent field information."""
|
|
275
|
-
warnings.warn(
|
|
276
|
-
"field_info is deprecated. Use fields.field_info instead.",
|
|
277
|
-
PyFluentDeprecationWarning,
|
|
278
|
-
)
|
|
279
280
|
return self.fields.field_info
|
|
280
281
|
|
|
281
282
|
@property
|
|
283
|
+
@deprecated(version="0.20.dev9", reason="Use ``session.fields.field_data``.")
|
|
282
284
|
def field_data(self):
|
|
283
285
|
"""Fluent field data on surfaces."""
|
|
284
|
-
warnings.warn(
|
|
285
|
-
"field_data is deprecated. Use fields.field_data instead.",
|
|
286
|
-
PyFluentDeprecationWarning,
|
|
287
|
-
)
|
|
288
286
|
return self.fields.field_data
|
|
289
287
|
|
|
290
288
|
@property
|
|
289
|
+
@deprecated(
|
|
290
|
+
version="0.20.dev9", reason="Use ``session.fields.field_data_streaming``."
|
|
291
|
+
)
|
|
291
292
|
def field_data_streaming(self):
|
|
292
293
|
"""Field gRPC streaming service of Fluent."""
|
|
293
|
-
warnings.warn(
|
|
294
|
-
"field_data_streaming is deprecated. Use fields.field_data_streaming instead.",
|
|
295
|
-
PyFluentDeprecationWarning,
|
|
296
|
-
)
|
|
297
294
|
return self.fields.field_data_streaming
|
|
298
295
|
|
|
299
296
|
@property
|
|
@@ -369,15 +366,21 @@ class BaseSession:
|
|
|
369
366
|
"""Gets and returns the fluent version."""
|
|
370
367
|
return FluentVersion(self.scheme_eval.version)
|
|
371
368
|
|
|
369
|
+
def _exit_compose_service(self):
|
|
370
|
+
if self._fluent_connection._container and is_compose():
|
|
371
|
+
self._fluent_connection._container.stop()
|
|
372
|
+
|
|
372
373
|
def exit(self, **kwargs) -> None:
|
|
373
374
|
"""Exit session."""
|
|
374
375
|
logger.debug("session.exit() called")
|
|
375
376
|
if self._fluent_connection:
|
|
377
|
+
self._exit_compose_service()
|
|
376
378
|
self._fluent_connection.exit(**kwargs)
|
|
377
379
|
self._fluent_connection = None
|
|
378
380
|
|
|
379
381
|
def force_exit(self) -> None:
|
|
380
382
|
"""Forces the Fluent session to exit, losing unsaved progress and data."""
|
|
383
|
+
self._exit_compose_service()
|
|
381
384
|
self._fluent_connection.force_exit()
|
|
382
385
|
|
|
383
386
|
def file_exists_on_remote(self, file_name: str) -> bool:
|
|
@@ -89,6 +89,9 @@ class Meshing(PureMeshing):
|
|
|
89
89
|
file_transfer_service=self._file_transfer_service,
|
|
90
90
|
)
|
|
91
91
|
self._fluent_connection = None
|
|
92
|
+
self.__doc__ = (
|
|
93
|
+
"The meshing session is no longer usable after switching to solution mode."
|
|
94
|
+
)
|
|
92
95
|
return solver_session
|
|
93
96
|
|
|
94
97
|
def __getattribute__(self, item: str):
|
|
@@ -77,19 +77,6 @@ def _set_state_safe(obj: SettingsBase, state: StateType):
|
|
|
77
77
|
datamodel_logger.debug(f"set_state failed at {obj.path}")
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def _import_settings_root(root):
|
|
81
|
-
_class_dict = {}
|
|
82
|
-
api_keys = []
|
|
83
|
-
if hasattr(root, "child_names"):
|
|
84
|
-
api_keys = root.child_names
|
|
85
|
-
|
|
86
|
-
for root_item in api_keys:
|
|
87
|
-
_class_dict[root_item] = root.__dict__[root_item]
|
|
88
|
-
|
|
89
|
-
settings_api_root = type("SettingsRoot", (object,), _class_dict)
|
|
90
|
-
return settings_api_root()
|
|
91
|
-
|
|
92
|
-
|
|
93
80
|
class Solver(BaseSession):
|
|
94
81
|
"""Encapsulates a Fluent solver session.
|
|
95
82
|
|
|
@@ -143,9 +130,17 @@ class Solver(BaseSession):
|
|
|
143
130
|
self._tui = None
|
|
144
131
|
self._workflow = None
|
|
145
132
|
self._system_coupling = None
|
|
146
|
-
self._settings_root = None
|
|
147
133
|
self._fluent_version = None
|
|
148
134
|
self._bg_session_threads = []
|
|
135
|
+
|
|
136
|
+
#: Root settings object.
|
|
137
|
+
self.settings = flobject.get_root(
|
|
138
|
+
flproxy=self._settings_service,
|
|
139
|
+
version=self._version,
|
|
140
|
+
interrupt=Solver._interrupt,
|
|
141
|
+
file_transfer_service=self._file_transfer_service,
|
|
142
|
+
scheme_eval=self.scheme_eval.scheme_eval,
|
|
143
|
+
)
|
|
149
144
|
self._solution_variable_service = service_creator("svar").create(
|
|
150
145
|
fluent_connection._channel, fluent_connection._metadata
|
|
151
146
|
)
|
|
@@ -161,12 +156,12 @@ class Solver(BaseSession):
|
|
|
161
156
|
)
|
|
162
157
|
else:
|
|
163
158
|
self.fields.reduction = reduction_old
|
|
164
|
-
self._settings_api_root = None
|
|
165
159
|
self.fields.solution_variable_data = self._solution_variable_data()
|
|
166
160
|
|
|
167
161
|
monitors_service = service_creator("monitors").create(
|
|
168
162
|
fluent_connection._channel, fluent_connection._metadata, self._error_state
|
|
169
163
|
)
|
|
164
|
+
#: Manage Fluent's solution monitors.
|
|
170
165
|
self.monitors = MonitorsManager(fluent_connection._id, monitors_service)
|
|
171
166
|
self.events.register_callback(
|
|
172
167
|
(SolverEvent.SOLUTION_INITIALIZED, SolverEvent.DATA_LOADED),
|
|
@@ -269,19 +264,6 @@ class Solver(BaseSession):
|
|
|
269
264
|
if command.path in interruptible_commands:
|
|
270
265
|
command._root.solution.run_calculation.interrupt()
|
|
271
266
|
|
|
272
|
-
@property
|
|
273
|
-
def settings(self):
|
|
274
|
-
"""Root settings object."""
|
|
275
|
-
if self._settings_root is None:
|
|
276
|
-
self._settings_root = flobject.get_root(
|
|
277
|
-
flproxy=self._settings_service,
|
|
278
|
-
version=self._version,
|
|
279
|
-
interrupt=Solver._interrupt,
|
|
280
|
-
file_transfer_service=self._file_transfer_service,
|
|
281
|
-
scheme_eval=self.scheme_eval.scheme_eval,
|
|
282
|
-
)
|
|
283
|
-
return self._settings_root
|
|
284
|
-
|
|
285
267
|
@property
|
|
286
268
|
def system_coupling(self):
|
|
287
269
|
"""System coupling object."""
|
|
@@ -351,28 +333,23 @@ class Solver(BaseSession):
|
|
|
351
333
|
def __call__(self):
|
|
352
334
|
return self.get_state()
|
|
353
335
|
|
|
354
|
-
def
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
self._populate_settings_api_root()
|
|
360
|
-
if attr in [x for x in dir(self._settings_api_root) if not x.startswith("_")]:
|
|
361
|
-
if self.get_fluent_version() > FluentVersion.v242:
|
|
336
|
+
def __getattr__(self, name):
|
|
337
|
+
try:
|
|
338
|
+
return super().__getattribute__(name)
|
|
339
|
+
except AttributeError as ex:
|
|
340
|
+
if name in self.settings.child_names:
|
|
362
341
|
warnings.warn(
|
|
363
|
-
f"'{
|
|
342
|
+
f"'{name}' is deprecated. Use 'settings.{name}' instead.",
|
|
364
343
|
DeprecatedSettingWarning,
|
|
365
344
|
)
|
|
366
|
-
|
|
345
|
+
return getattr(self.settings, name)
|
|
346
|
+
else:
|
|
347
|
+
raise ex
|
|
367
348
|
|
|
368
349
|
def __dir__(self):
|
|
369
350
|
if self._fluent_connection is None:
|
|
370
351
|
return ["is_active"]
|
|
371
|
-
|
|
372
|
-
if self.get_fluent_version() <= FluentVersion.v242:
|
|
373
|
-
self._populate_settings_api_root()
|
|
374
|
-
settings_dir = dir(self._settings_api_root)
|
|
375
|
-
dir_list = set(list(self.__dict__.keys()) + dir(type(self)) + settings_dir) - {
|
|
352
|
+
dir_list = set(list(self.__dict__.keys()) + dir(type(self))) - {
|
|
376
353
|
"svar_data",
|
|
377
354
|
"svar_info",
|
|
378
355
|
"reduction",
|