ansys-fluent-core 0.30.dev2__py3-none-any.whl → 0.30.dev4__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 +14 -3
- ansys/fluent/core/codegen/datamodelgen.py +17 -3
- ansys/fluent/core/codegen/settingsgen.py +26 -4
- ansys/fluent/core/codegen/walk_api.py +11 -1
- ansys/fluent/core/exceptions.py +7 -4
- ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
- ansys/fluent/core/generated/datamodel_242/meshing_utilities.pyi +990 -0
- ansys/fluent/core/generated/datamodel_251/meshing_utilities.pyi +1002 -0
- ansys/fluent/core/generated/datamodel_252/meshing.py +7 -0
- ansys/fluent/core/generated/datamodel_252/meshing_utilities.pyi +1007 -0
- ansys/fluent/core/generated/datamodel_252/preferences.py +132 -3
- ansys/fluent/core/generated/fluent_version_252.py +3 -3
- ansys/fluent/core/generated/meshing/tui_252.py +111 -12
- ansys/fluent/core/generated/solver/settings_222.py +166 -170
- ansys/fluent/core/generated/solver/settings_222.pyi +10 -8
- ansys/fluent/core/generated/solver/settings_231.py +551 -598
- ansys/fluent/core/generated/solver/settings_231.pyi +40 -38
- ansys/fluent/core/generated/solver/settings_232.py +689 -736
- ansys/fluent/core/generated/solver/settings_232.pyi +39 -37
- ansys/fluent/core/generated/solver/settings_241.py +1365 -1439
- ansys/fluent/core/generated/solver/settings_241.pyi +1071 -1074
- ansys/fluent/core/generated/solver/settings_242.py +2852 -3098
- ansys/fluent/core/generated/solver/settings_242.pyi +2059 -2151
- ansys/fluent/core/generated/solver/settings_251.py +3656 -3914
- ansys/fluent/core/generated/solver/settings_251.pyi +2915 -3008
- ansys/fluent/core/generated/solver/settings_252.py +5894 -5707
- ansys/fluent/core/generated/solver/settings_252.pyi +4411 -4297
- ansys/fluent/core/generated/solver/tui_252.py +205 -25
- ansys/fluent/core/get_build_details.py +2 -2
- ansys/fluent/core/launcher/container_launcher.py +7 -1
- ansys/fluent/core/launcher/fluent_container.py +3 -2
- ansys/fluent/core/launcher/pim_launcher.py +7 -1
- ansys/fluent/core/launcher/slurm_launcher.py +7 -1
- ansys/fluent/core/launcher/standalone_launcher.py +7 -1
- ansys/fluent/core/services/datamodel_se.py +28 -23
- ansys/fluent/core/services/datamodel_tui.py +1 -1
- ansys/fluent/core/services/field_data.py +17 -5
- ansys/fluent/core/session_base_meshing.py +3 -3
- ansys/fluent/core/session_meshing.py +4 -4
- ansys/fluent/core/session_meshing.pyi +9 -9
- ansys/fluent/core/session_pure_meshing.pyi +9 -9
- ansys/fluent/core/session_solver.py +1 -1
- ansys/fluent/core/session_solver.pyi +5 -5
- ansys/fluent/core/solver/_docstrings.py +244 -0
- ansys/fluent/core/solver/error_message.py +7 -12
- ansys/fluent/core/solver/flobject.py +86 -27
- ansys/fluent/core/utils/fluent_version.py +2 -3
- ansys/fluent/core/utils/test_grpc_connection.py +139 -0
- ansys/fluent/core/workflow.py +1 -0
- {ansys_fluent_core-0.30.dev2.dist-info → ansys_fluent_core-0.30.dev4.dist-info}/METADATA +12 -12
- {ansys_fluent_core-0.30.dev2.dist-info → ansys_fluent_core-0.30.dev4.dist-info}/RECORD +77 -73
- ansys/fluent/core/_version.py +0 -40
- /ansys/fluent/core/generated/datamodel_222/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_222/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_231/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_231/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_231/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/generated/datamodel_232/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_232/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_232/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/generated/datamodel_241/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_241/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_241/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/generated/datamodel_242/{MeshingUtilities.py → meshing_utilities.py} +0 -0
- /ansys/fluent/core/generated/datamodel_242/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_242/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_242/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/generated/datamodel_251/{MeshingUtilities.py → meshing_utilities.py} +0 -0
- /ansys/fluent/core/generated/datamodel_251/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_251/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_251/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/generated/datamodel_252/{MeshingUtilities.py → meshing_utilities.py} +0 -0
- /ansys/fluent/core/generated/datamodel_252/{PartManagement.py → part_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_252/{PMFileManagement.py → pm_file_management.py} +0 -0
- /ansys/fluent/core/generated/datamodel_252/{solverworkflow.py → solver_workflow.py} +0 -0
- /ansys/fluent/core/{systemcoupling.py → system_coupling.py} +0 -0
- {ansys_fluent_core-0.30.dev2.dist-info → ansys_fluent_core-0.30.dev4.dist-info}/LICENSE +0 -0
- {ansys_fluent_core-0.30.dev2.dist-info → ansys_fluent_core-0.30.dev4.dist-info}/WHEEL +0 -0
|
@@ -69,13 +69,13 @@ from typing import (
|
|
|
69
69
|
import warnings
|
|
70
70
|
import weakref
|
|
71
71
|
|
|
72
|
-
import ansys.fluent.core as pyfluent
|
|
73
72
|
from ansys.fluent.core.pyfluent_warnings import (
|
|
74
73
|
PyFluentDeprecationWarning,
|
|
75
74
|
PyFluentUserWarning,
|
|
76
75
|
)
|
|
77
76
|
from ansys.fluent.core.utils.fluent_version import FluentVersion
|
|
78
77
|
|
|
78
|
+
from . import _docstrings
|
|
79
79
|
from .error_message import allowed_name_error_message, allowed_values_error
|
|
80
80
|
from .flunits import UnhandledQuantity, get_si_unit_for_fluent_quantity
|
|
81
81
|
from .settings_external import expand_api_file_argument
|
|
@@ -200,10 +200,10 @@ def _get_python_path_comps(obj):
|
|
|
200
200
|
"""Get python path components for traversing class hierarchy."""
|
|
201
201
|
comps = []
|
|
202
202
|
while obj:
|
|
203
|
-
python_name = obj.
|
|
203
|
+
python_name = obj.python_name
|
|
204
204
|
obj = obj._parent
|
|
205
205
|
if isinstance(obj, (NamedObject, ListObject)):
|
|
206
|
-
comps.append(obj.
|
|
206
|
+
comps.append(obj.python_name)
|
|
207
207
|
obj = obj._parent
|
|
208
208
|
else:
|
|
209
209
|
comps.append(python_name)
|
|
@@ -407,9 +407,19 @@ class Base:
|
|
|
407
407
|
return None
|
|
408
408
|
return val
|
|
409
409
|
|
|
410
|
+
def _is_deprecated(self) -> bool:
|
|
411
|
+
"""Whether the object is deprecated in a specific Fluent version.'"""
|
|
412
|
+
deprecated_version = self.get_attrs(["deprecated-version"])
|
|
413
|
+
deprecated_version = (
|
|
414
|
+
deprecated_version.get("deprecated-version") if deprecated_version else None
|
|
415
|
+
)
|
|
416
|
+
return deprecated_version and FluentVersion(self.version) >= FluentVersion(
|
|
417
|
+
deprecated_version
|
|
418
|
+
)
|
|
419
|
+
|
|
410
420
|
def is_active(self) -> bool:
|
|
411
421
|
"""Whether the object is active."""
|
|
412
|
-
attr = self.get_attr(_InlineConstants.is_active)
|
|
422
|
+
attr = self.get_attr(_InlineConstants.is_active) and not self._is_deprecated()
|
|
413
423
|
return False if attr is False else True
|
|
414
424
|
|
|
415
425
|
def _check_stable(self) -> None:
|
|
@@ -695,9 +705,14 @@ class _Alias:
|
|
|
695
705
|
|
|
696
706
|
def _create_child(cls, name, parent: weakref.CallableProxyType, alias_path=None):
|
|
697
707
|
if alias_path or isinstance(parent, _Alias):
|
|
708
|
+
bases = (cls,)
|
|
709
|
+
# True child of parent alias is already derived from _Alias.
|
|
710
|
+
# Avoiding duplicate derivation and mro resolution issue.
|
|
711
|
+
if _Alias not in cls.__mro__:
|
|
712
|
+
bases = (_Alias, cls)
|
|
698
713
|
alias_cls = type(
|
|
699
714
|
f"{cls.__name__}_alias",
|
|
700
|
-
|
|
715
|
+
bases,
|
|
701
716
|
dict(cls.__dict__) | {"alias_path": alias_path},
|
|
702
717
|
)
|
|
703
718
|
return alias_cls(name, parent.__repr__.__self__)
|
|
@@ -945,6 +960,23 @@ def _command_query_name_filter(
|
|
|
945
960
|
return ret
|
|
946
961
|
|
|
947
962
|
|
|
963
|
+
def _get_type_for_completer_info(cls) -> str:
|
|
964
|
+
if issubclass(cls, (FileName, _InputFile)):
|
|
965
|
+
return "InputFilename"
|
|
966
|
+
elif issubclass(cls, (FileName, _OutputFile)):
|
|
967
|
+
return "OutputFilename"
|
|
968
|
+
elif issubclass(cls, (FileName, _InOutFile)):
|
|
969
|
+
return "InOutFilename"
|
|
970
|
+
elif issubclass(cls, (FilenameList, _InputFile)):
|
|
971
|
+
return "InputFilenameList"
|
|
972
|
+
elif issubclass(cls, (FilenameList, _OutputFile)):
|
|
973
|
+
return "OutputFilenameList"
|
|
974
|
+
elif issubclass(cls, (FilenameList, _InOutFile)):
|
|
975
|
+
return "InOutFilenameList"
|
|
976
|
+
else:
|
|
977
|
+
return cls.__bases__[0].__name__
|
|
978
|
+
|
|
979
|
+
|
|
948
980
|
class Group(SettingsBase[DictStateType]):
|
|
949
981
|
"""A ``Group`` container object.
|
|
950
982
|
|
|
@@ -1056,6 +1088,16 @@ class Group(SettingsBase[DictStateType]):
|
|
|
1056
1088
|
ret.append(query)
|
|
1057
1089
|
return ret
|
|
1058
1090
|
|
|
1091
|
+
def __dir__(self):
|
|
1092
|
+
dir_list = set(list(self.__dict__.keys()) + dir(type(self)))
|
|
1093
|
+
return dir_list - set(
|
|
1094
|
+
[
|
|
1095
|
+
child
|
|
1096
|
+
for child in self.child_names + self.command_names + self.query_names
|
|
1097
|
+
if getattr(self, child)._is_deprecated()
|
|
1098
|
+
]
|
|
1099
|
+
)
|
|
1100
|
+
|
|
1059
1101
|
def get_completer_info(self, prefix="", excluded=None) -> List[List[str]]:
|
|
1060
1102
|
"""Get completer info of all children.
|
|
1061
1103
|
|
|
@@ -1073,7 +1115,7 @@ class Group(SettingsBase[DictStateType]):
|
|
|
1073
1115
|
ret.append(
|
|
1074
1116
|
[
|
|
1075
1117
|
child_name,
|
|
1076
|
-
child.__class__
|
|
1118
|
+
_get_type_for_completer_info(child.__class__),
|
|
1077
1119
|
child.__doc__,
|
|
1078
1120
|
]
|
|
1079
1121
|
)
|
|
@@ -1105,18 +1147,12 @@ class Group(SettingsBase[DictStateType]):
|
|
|
1105
1147
|
attr._check_stable()
|
|
1106
1148
|
return attr
|
|
1107
1149
|
except AttributeError as ex:
|
|
1108
|
-
pyfluent.PRINT_SEARCH_RESULTS = False
|
|
1109
|
-
search_results = pyfluent.utils.search(
|
|
1110
|
-
search_string=name,
|
|
1111
|
-
match_case=False,
|
|
1112
|
-
match_whole_word=False,
|
|
1113
|
-
)
|
|
1114
|
-
pyfluent.PRINT_SEARCH_RESULTS = True
|
|
1115
|
-
results = search_results if search_results else []
|
|
1116
1150
|
error_msg = allowed_name_error_message(
|
|
1117
1151
|
trial_name=name,
|
|
1118
1152
|
message=ex.args[0],
|
|
1119
|
-
|
|
1153
|
+
allowed_values=sorted(
|
|
1154
|
+
set(self.get_active_child_names() + self.command_names)
|
|
1155
|
+
),
|
|
1120
1156
|
)
|
|
1121
1157
|
ex.args = (error_msg,)
|
|
1122
1158
|
raise
|
|
@@ -1391,7 +1427,7 @@ class NamedObject(SettingsBase[DictStateType], Generic[ChildTypeT]):
|
|
|
1391
1427
|
)
|
|
1392
1428
|
raise KeyError(
|
|
1393
1429
|
allowed_name_error_message(
|
|
1394
|
-
context=self.
|
|
1430
|
+
context=self.python_name,
|
|
1395
1431
|
trial_name=name,
|
|
1396
1432
|
allowed_values=self.get_object_names(),
|
|
1397
1433
|
)
|
|
@@ -1608,6 +1644,16 @@ class Action(Base):
|
|
|
1608
1644
|
cls = self.__class__._child_classes[argument]
|
|
1609
1645
|
self._setattr(argument, _create_child(cls, None, self))
|
|
1610
1646
|
|
|
1647
|
+
def __dir__(self):
|
|
1648
|
+
dir_list = set(list(self.__dict__.keys()) + dir(type(self)))
|
|
1649
|
+
return dir_list - set(
|
|
1650
|
+
[
|
|
1651
|
+
child
|
|
1652
|
+
for child in self.argument_names
|
|
1653
|
+
if getattr(self, child)._is_deprecated()
|
|
1654
|
+
]
|
|
1655
|
+
)
|
|
1656
|
+
|
|
1611
1657
|
def get_completer_info(self, prefix="", excluded=None) -> List[List[str]]:
|
|
1612
1658
|
"""Get completer info of all arguments.
|
|
1613
1659
|
|
|
@@ -1625,7 +1671,7 @@ class Action(Base):
|
|
|
1625
1671
|
ret.append(
|
|
1626
1672
|
[
|
|
1627
1673
|
argument_name,
|
|
1628
|
-
argument.__class__
|
|
1674
|
+
_get_type_for_completer_info(argument.__class__),
|
|
1629
1675
|
argument.__doc__,
|
|
1630
1676
|
]
|
|
1631
1677
|
)
|
|
@@ -1809,13 +1855,22 @@ _baseTypes = {
|
|
|
1809
1855
|
|
|
1810
1856
|
|
|
1811
1857
|
def _clean_helpinfo(helpinfo):
|
|
1812
|
-
helpinfo = helpinfo.strip("\n")
|
|
1858
|
+
helpinfo = helpinfo.strip("\n").lstrip(" ")
|
|
1813
1859
|
if not helpinfo.endswith("."):
|
|
1814
1860
|
helpinfo += "."
|
|
1815
1861
|
helpinfo = helpinfo[0].upper() + helpinfo[1:]
|
|
1816
1862
|
return helpinfo
|
|
1817
1863
|
|
|
1818
1864
|
|
|
1865
|
+
def _fix_help_info(obj_type, helpinfo):
|
|
1866
|
+
# The else clause is just picking "object" due to our current
|
|
1867
|
+
# knowledge that the implementation only distinguishes between
|
|
1868
|
+
# "method" and everything else. This is fragile.
|
|
1869
|
+
api_item_type = "method" if obj_type in ("command", "query") else "object"
|
|
1870
|
+
fix = _docstrings._fixed_doc_string(api_item_type, helpinfo)
|
|
1871
|
+
return fix or helpinfo
|
|
1872
|
+
|
|
1873
|
+
|
|
1819
1874
|
class _ChildNamedObjectAccessorMixin(collections.abc.MutableMapping):
|
|
1820
1875
|
"""A mixin class to provide a dictionary interface at a Group class level if the
|
|
1821
1876
|
Group has multiple named objects of a similar type. For example, boundary conditions
|
|
@@ -1935,7 +1990,7 @@ class _NonCreatableNamedObjectMixin(
|
|
|
1935
1990
|
else:
|
|
1936
1991
|
raise KeyError(
|
|
1937
1992
|
allowed_name_error_message(
|
|
1938
|
-
context=self.
|
|
1993
|
+
context=self.python_name,
|
|
1939
1994
|
trial_name=name,
|
|
1940
1995
|
allowed_values=self.get_object_names(),
|
|
1941
1996
|
)
|
|
@@ -1983,7 +2038,7 @@ def get_cls(name, info, parent=None, version=None, parent_taboo=None):
|
|
|
1983
2038
|
dct = {"fluent_name": name, "version": version}
|
|
1984
2039
|
helpinfo = info.get("help")
|
|
1985
2040
|
if helpinfo:
|
|
1986
|
-
dct["__doc__"] = _clean_helpinfo(helpinfo)
|
|
2041
|
+
dct["__doc__"] = _fix_help_info(obj_type, _clean_helpinfo(helpinfo))
|
|
1987
2042
|
else:
|
|
1988
2043
|
if parent is None:
|
|
1989
2044
|
dct["__doc__"] = "'root' object."
|
|
@@ -2189,15 +2244,19 @@ def get_root(
|
|
|
2189
2244
|
"""
|
|
2190
2245
|
from ansys.fluent.core import CODEGEN_OUTDIR, utils
|
|
2191
2246
|
|
|
2192
|
-
|
|
2193
|
-
settings = utils.load_module(
|
|
2194
|
-
f"settings_{version}",
|
|
2195
|
-
CODEGEN_OUTDIR / "solver" / f"settings_{version}.py",
|
|
2196
|
-
)
|
|
2197
|
-
root_cls = settings.root
|
|
2198
|
-
except FileNotFoundError:
|
|
2247
|
+
if os.getenv("PYFLUENT_USE_RUNTIME_PYTHON_CLASSES") == "1":
|
|
2199
2248
|
obj_info = flproxy.get_static_info()
|
|
2200
2249
|
root_cls, _ = get_cls("", obj_info, version=version)
|
|
2250
|
+
else:
|
|
2251
|
+
try:
|
|
2252
|
+
settings = utils.load_module(
|
|
2253
|
+
f"settings_{version}",
|
|
2254
|
+
CODEGEN_OUTDIR / "solver" / f"settings_{version}.py",
|
|
2255
|
+
)
|
|
2256
|
+
root_cls = settings.root
|
|
2257
|
+
except FileNotFoundError:
|
|
2258
|
+
obj_info = flproxy.get_static_info()
|
|
2259
|
+
root_cls, _ = get_cls("", obj_info, version=version)
|
|
2201
2260
|
root = root_cls()
|
|
2202
2261
|
root.set_flproxy(flproxy)
|
|
2203
2262
|
root._set_on_interrupt(interrupt)
|
|
@@ -27,7 +27,6 @@ from functools import total_ordering
|
|
|
27
27
|
import os
|
|
28
28
|
|
|
29
29
|
import ansys.fluent.core as pyfluent
|
|
30
|
-
from ansys.fluent.core._version import fluent_dev_version, fluent_release_version
|
|
31
30
|
|
|
32
31
|
|
|
33
32
|
class AnsysVersionNotFound(RuntimeError):
|
|
@@ -131,7 +130,7 @@ class FluentVersion(Enum):
|
|
|
131
130
|
FluentVersion
|
|
132
131
|
FluentVersion member corresponding to the latest release.
|
|
133
132
|
"""
|
|
134
|
-
return cls(
|
|
133
|
+
return cls(pyfluent.FLUENT_RELEASE_VERSION)
|
|
135
134
|
|
|
136
135
|
@classmethod
|
|
137
136
|
def current_dev(cls):
|
|
@@ -142,7 +141,7 @@ class FluentVersion(Enum):
|
|
|
142
141
|
FluentVersion
|
|
143
142
|
FluentVersion member corresponding to the latest development version.
|
|
144
143
|
"""
|
|
145
|
-
return cls(
|
|
144
|
+
return cls(pyfluent.FLUENT_DEV_VERSION)
|
|
146
145
|
|
|
147
146
|
@property
|
|
148
147
|
def awp_var(self):
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Copyright (C) 2021 - 2025 ANSYS, Inc. and/or its affiliates.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
#
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
# furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
# copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
# SOFTWARE.
|
|
22
|
+
|
|
23
|
+
"""Script to test viability of gRPC connection in the current machine."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
from argparse import ArgumentParser
|
|
27
|
+
import socket
|
|
28
|
+
|
|
29
|
+
import grpc
|
|
30
|
+
from grpc_health.v1 import health_pb2, health_pb2_grpc
|
|
31
|
+
|
|
32
|
+
from ansys.fluent.core.utils.networking import _GrpcServer, get_free_port
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _test_connection_using_specified_ip(ip: str, port: int | None = None) -> bool:
|
|
36
|
+
if not port:
|
|
37
|
+
port = get_free_port()
|
|
38
|
+
address = f"{ip}:{port}"
|
|
39
|
+
try:
|
|
40
|
+
with _GrpcServer(address):
|
|
41
|
+
with grpc.insecure_channel(address) as channel:
|
|
42
|
+
stub = health_pb2_grpc.HealthStub(channel)
|
|
43
|
+
return (
|
|
44
|
+
stub.Check(
|
|
45
|
+
health_pb2.HealthCheckRequest(),
|
|
46
|
+
timeout=1,
|
|
47
|
+
).status
|
|
48
|
+
== health_pb2.HealthCheckResponse.ServingStatus.SERVING
|
|
49
|
+
)
|
|
50
|
+
except Exception:
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _test_connection_using_all_available_ips(port: int | None = None) -> list[str]:
|
|
55
|
+
successful_ips = []
|
|
56
|
+
for addrinfo in socket.getaddrinfo(
|
|
57
|
+
"localhost",
|
|
58
|
+
0,
|
|
59
|
+
family=socket.AF_INET,
|
|
60
|
+
type=socket.SOCK_STREAM,
|
|
61
|
+
flags=socket.AI_PASSIVE,
|
|
62
|
+
):
|
|
63
|
+
ip = addrinfo[-1][0]
|
|
64
|
+
if _test_connection_using_specified_ip(ip, port):
|
|
65
|
+
successful_ips.append(ip)
|
|
66
|
+
return successful_ips
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_connection(ip: str | None = None, port: int | None = None):
|
|
70
|
+
"""
|
|
71
|
+
Test viability of gRPC connection in the current machine.
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
ip : str, optional
|
|
75
|
+
IP address to test connection with. If not provided, will test using all available ips.
|
|
76
|
+
port : int, optional
|
|
77
|
+
Port to test connection with. If not provided, will test using random port.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
if ip is not None and port is not None:
|
|
81
|
+
print(f"Testing gRPC connection using ip={ip} and port={port}.")
|
|
82
|
+
if _test_connection_using_specified_ip(ip, port):
|
|
83
|
+
print(f"gRPC connection can be established using ip={ip} and port={port}.")
|
|
84
|
+
else:
|
|
85
|
+
print(
|
|
86
|
+
f"gRPC connection cannot be established using ip={ip} and port={port}. "
|
|
87
|
+
"Try with a different ip and/or port. You can run the script again without "
|
|
88
|
+
"providing any ip to print all viable ips where gRPC connection can be established."
|
|
89
|
+
)
|
|
90
|
+
elif ip is not None and port is None:
|
|
91
|
+
print(f"Testing gRPC connection using ip={ip} and random port.")
|
|
92
|
+
if _test_connection_using_specified_ip(ip):
|
|
93
|
+
print(f"gRPC connection can be established using ip={ip}.")
|
|
94
|
+
else:
|
|
95
|
+
print(
|
|
96
|
+
f"gRPC connection cannot be established using ip={ip}. "
|
|
97
|
+
"Try with a different ip. You can run the script again without "
|
|
98
|
+
"providing any ip to print all viable ips where gRPC connection can be established."
|
|
99
|
+
)
|
|
100
|
+
elif ip is None and port is not None:
|
|
101
|
+
print(f"Testing gRPC connection using all available ips and port={port}.")
|
|
102
|
+
successful_ips = _test_connection_using_all_available_ips(port)
|
|
103
|
+
if successful_ips:
|
|
104
|
+
for ip in successful_ips:
|
|
105
|
+
print(
|
|
106
|
+
f"gRPC connection can be established using ip={ip} and port={port}."
|
|
107
|
+
)
|
|
108
|
+
else:
|
|
109
|
+
print(
|
|
110
|
+
f"gRPC connection cannot be established using any ip and port={port}. "
|
|
111
|
+
"Try with a different port. You can run the script again without "
|
|
112
|
+
"providing any port to test using random port."
|
|
113
|
+
)
|
|
114
|
+
else:
|
|
115
|
+
print("Testing gRPC connection using all available ips and random port.")
|
|
116
|
+
successful_ips = _test_connection_using_all_available_ips()
|
|
117
|
+
if successful_ips:
|
|
118
|
+
for ip in successful_ips:
|
|
119
|
+
print(f"gRPC connection can be established using ip={ip}.")
|
|
120
|
+
else:
|
|
121
|
+
print("gRPC connection cannot be established using any ip.")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if __name__ == "__main__":
|
|
125
|
+
parser = ArgumentParser(
|
|
126
|
+
description="Script to test viability of gRPC connection in the current machine."
|
|
127
|
+
)
|
|
128
|
+
parser.add_argument(
|
|
129
|
+
"-i",
|
|
130
|
+
"--ip",
|
|
131
|
+
help="IP address to test connection with. If not provided, will test using all available ips.",
|
|
132
|
+
)
|
|
133
|
+
parser.add_argument(
|
|
134
|
+
"-p",
|
|
135
|
+
"--port",
|
|
136
|
+
help="Port to test connection with. If not provided, will test using random port.",
|
|
137
|
+
)
|
|
138
|
+
args = parser.parse_args()
|
|
139
|
+
test_connection(args.ip, args.port)
|
ansys/fluent/core/workflow.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ansys-fluent-core
|
|
3
|
-
Version: 0.30.
|
|
3
|
+
Version: 0.30.dev4
|
|
4
4
|
Summary: PyFluent provides Pythonic access to Ansys Fluent.
|
|
5
5
|
Author-email: "ANSYS, Inc." <pyansys.core@ansys.com>
|
|
6
6
|
Maintainer-email: "ANSYS, Inc." <pyansys.core@ansys.com>
|
|
@@ -17,34 +17,34 @@ Requires-Dist: ansys-units>=0.3.3,<0.5
|
|
|
17
17
|
Requires-Dist: docker>=7.1.0
|
|
18
18
|
Requires-Dist: grpcio>=1.30.0
|
|
19
19
|
Requires-Dist: grpcio-health-checking>=1.30.0
|
|
20
|
-
Requires-Dist: grpcio-status>=1.
|
|
20
|
+
Requires-Dist: grpcio-status>=1.26.0
|
|
21
21
|
Requires-Dist: lxml>=4.9.2
|
|
22
22
|
Requires-Dist: nltk>=3.9.1
|
|
23
23
|
Requires-Dist: numpy>=1.14.0,<3.0.0
|
|
24
24
|
Requires-Dist: pandas>=1.1.0,<2.3
|
|
25
25
|
Requires-Dist: pyansys-tools-report>=0.8.1
|
|
26
26
|
Requires-Dist: pyyaml>=6.0
|
|
27
|
-
Requires-Dist: Sphinx==
|
|
27
|
+
Requires-Dist: Sphinx==8.1.3 ; extra == "docs"
|
|
28
28
|
Requires-Dist: jupyter_sphinx==0.5.3 ; extra == "docs"
|
|
29
29
|
Requires-Dist: numpydoc==1.8.0 ; extra == "docs"
|
|
30
|
-
Requires-Dist: matplotlib==3.10.
|
|
31
|
-
Requires-Dist: ansys-sphinx-theme==1.2
|
|
30
|
+
Requires-Dist: matplotlib==3.10.1 ; extra == "docs"
|
|
31
|
+
Requires-Dist: ansys-sphinx-theme==1.3.2 ; extra == "docs"
|
|
32
32
|
Requires-Dist: pypandoc==1.15 ; extra == "docs"
|
|
33
33
|
Requires-Dist: pytest-sphinx==0.6.3 ; extra == "docs"
|
|
34
34
|
Requires-Dist: sphinx-autobuild==2024.10.3 ; extra == "docs"
|
|
35
|
-
Requires-Dist: sphinx-autodoc-typehints==
|
|
35
|
+
Requires-Dist: sphinx-autodoc-typehints==3.0.1 ; extra == "docs"
|
|
36
36
|
Requires-Dist: sphinx-copybutton==0.5.2 ; extra == "docs"
|
|
37
|
-
Requires-Dist: sphinx-gallery==0.
|
|
37
|
+
Requires-Dist: sphinx-gallery==0.19.0 ; extra == "docs"
|
|
38
38
|
Requires-Dist: sphinx-notfound-page==1.1.0 ; extra == "docs"
|
|
39
39
|
Requires-Dist: sphinxcontrib-websupport==2.0.0 ; extra == "docs"
|
|
40
40
|
Requires-Dist: sphinxemoji==0.3.1 ; extra == "docs"
|
|
41
|
-
Requires-Dist: sphinx-toggleprompt==0.
|
|
41
|
+
Requires-Dist: sphinx-toggleprompt==0.6.0 ; extra == "docs"
|
|
42
42
|
Requires-Dist: autodocsumm==0.2.14 ; extra == "docs"
|
|
43
|
-
Requires-Dist: beautifulsoup4==4.13.
|
|
43
|
+
Requires-Dist: beautifulsoup4==4.13.3 ; extra == "docs"
|
|
44
44
|
Requires-Dist: openpyxl>=3.1.5 ; extra == "docs"
|
|
45
45
|
Requires-Dist: plotly>=5.22.0 ; extra == "docs"
|
|
46
46
|
Requires-Dist: python-pptx>=0.6.23 ; extra == "docs"
|
|
47
|
-
Requires-Dist: quarto-cli==1.6.
|
|
47
|
+
Requires-Dist: quarto-cli==1.6.42 ; extra == "docs"
|
|
48
48
|
Requires-Dist: pdf2image==1.17.0 ; extra == "docs"
|
|
49
49
|
Requires-Dist: seaborn>=0.13.2 ; extra == "docs"
|
|
50
50
|
Requires-Dist: tensorflow>=2.17.0 ; extra == "docs"
|
|
@@ -114,8 +114,8 @@ In the upper right corner of the documentation's title bar, there is an option f
|
|
|
114
114
|
viewing the documentation for the latest stable release to viewing the documentation for the
|
|
115
115
|
development version or previously released versions.
|
|
116
116
|
|
|
117
|
-
You can also `view <https://
|
|
118
|
-
`download <https://
|
|
117
|
+
You can also `view <https://fluent.docs.pyansys.com/version/stable/_static/cheat_sheet.pdf>`_ or
|
|
118
|
+
`download <https://fluent.docs.pyansys.com/version/stable/_static/cheat_sheet.pdf>`_ the
|
|
119
119
|
PyFluent cheat sheet. This one-page reference provides syntax rules and commands
|
|
120
120
|
for using PyFluent.
|
|
121
121
|
|