ansys-fluent-core 0.27.dev1__py3-none-any.whl → 0.28.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.

Files changed (188) hide show
  1. ansys/fluent/core/__init__.py +22 -9
  2. ansys/fluent/core/_version.py +5 -2
  3. ansys/fluent/core/codegen/__init__.py +0 -3
  4. ansys/fluent/core/codegen/allapigen.py +1 -5
  5. ansys/fluent/core/codegen/builtin_settingsgen.py +44 -10
  6. ansys/fluent/core/codegen/datamodelgen.py +53 -12
  7. ansys/fluent/core/codegen/settingsgen.py +21 -12
  8. ansys/fluent/core/codegen/settingsgen_old.py +2 -2
  9. ansys/fluent/core/codegen/tuigen.py +1 -1
  10. ansys/fluent/core/codegen/write_settings_yaml.py +3 -4
  11. ansys/fluent/core/data_model_cache.py +132 -70
  12. ansys/fluent/core/docs/README.rst +2 -2
  13. ansys/fluent/core/examples/downloads.py +3 -5
  14. ansys/fluent/core/exceptions.py +1 -0
  15. ansys/fluent/core/file_session.py +59 -131
  16. ansys/fluent/core/filereader/case_file.py +17 -17
  17. ansys/fluent/core/filereader/casereader.py +2 -1
  18. ansys/fluent/core/filereader/data_file.py +7 -7
  19. ansys/fluent/core/filereader/lispy.py +6 -1
  20. ansys/fluent/core/fluent_connection.py +35 -7
  21. ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
  22. ansys/fluent/core/generated/datamodel_222/PMFileManagement.py +2 -2
  23. ansys/fluent/core/generated/datamodel_222/PartManagement.py +28 -28
  24. ansys/fluent/core/generated/datamodel_222/meshing.py +301 -301
  25. ansys/fluent/core/generated/datamodel_222/workflow.py +9 -9
  26. ansys/fluent/core/generated/datamodel_231/PMFileManagement.py +2 -2
  27. ansys/fluent/core/generated/datamodel_231/PartManagement.py +55 -55
  28. ansys/fluent/core/generated/datamodel_231/flicing.py +51 -51
  29. ansys/fluent/core/generated/datamodel_231/meshing.py +317 -317
  30. ansys/fluent/core/generated/datamodel_231/solverworkflow.py +51 -51
  31. ansys/fluent/core/generated/datamodel_231/workflow.py +9 -9
  32. ansys/fluent/core/generated/datamodel_232/PMFileManagement.py +2 -2
  33. ansys/fluent/core/generated/datamodel_232/PartManagement.py +55 -55
  34. ansys/fluent/core/generated/datamodel_232/flicing.py +51 -51
  35. ansys/fluent/core/generated/datamodel_232/meshing.py +335 -335
  36. ansys/fluent/core/generated/datamodel_232/solverworkflow.py +58 -58
  37. ansys/fluent/core/generated/datamodel_232/workflow.py +9 -9
  38. ansys/fluent/core/generated/datamodel_241/PMFileManagement.py +2 -2
  39. ansys/fluent/core/generated/datamodel_241/PartManagement.py +57 -57
  40. ansys/fluent/core/generated/datamodel_241/flicing.py +51 -51
  41. ansys/fluent/core/generated/datamodel_241/meshing.py +361 -361
  42. ansys/fluent/core/generated/datamodel_241/solverworkflow.py +58 -58
  43. ansys/fluent/core/generated/datamodel_241/workflow.py +9 -9
  44. ansys/fluent/core/generated/datamodel_242/MeshingUtilities.py +240 -240
  45. ansys/fluent/core/generated/datamodel_242/PMFileManagement.py +2 -2
  46. ansys/fluent/core/generated/datamodel_242/PartManagement.py +60 -60
  47. ansys/fluent/core/generated/datamodel_242/flicing.py +51 -51
  48. ansys/fluent/core/generated/datamodel_242/meshing.py +371 -371
  49. ansys/fluent/core/generated/datamodel_242/solverworkflow.py +58 -58
  50. ansys/fluent/core/generated/datamodel_242/workflow.py +9 -9
  51. ansys/fluent/core/generated/datamodel_251/MeshingUtilities.py +244 -244
  52. ansys/fluent/core/generated/datamodel_251/PMFileManagement.py +2 -2
  53. ansys/fluent/core/generated/datamodel_251/PartManagement.py +60 -60
  54. ansys/fluent/core/generated/datamodel_251/flicing.py +51 -51
  55. ansys/fluent/core/generated/datamodel_251/meshing.py +384 -382
  56. ansys/fluent/core/generated/datamodel_251/preferences.py +7 -0
  57. ansys/fluent/core/generated/datamodel_251/solverworkflow.py +58 -58
  58. ansys/fluent/core/generated/datamodel_251/workflow.py +10 -10
  59. ansys/fluent/core/generated/datamodel_252/MeshingUtilities.py +3664 -0
  60. ansys/fluent/core/generated/datamodel_252/PMFileManagement.py +288 -0
  61. ansys/fluent/core/generated/datamodel_252/PartManagement.py +2588 -0
  62. ansys/fluent/core/generated/datamodel_252/flicing.py +7972 -0
  63. ansys/fluent/core/generated/datamodel_252/meshing.py +2644 -0
  64. ansys/fluent/core/generated/datamodel_252/preferences.py +2760 -0
  65. ansys/fluent/core/generated/datamodel_252/solverworkflow.py +479 -0
  66. ansys/fluent/core/generated/datamodel_252/workflow.py +466 -0
  67. ansys/fluent/core/generated/fluent_version_251.py +4 -4
  68. ansys/fluent/core/generated/fluent_version_252.py +5 -0
  69. ansys/fluent/core/generated/meshing/tui_251.py +1139 -1179
  70. ansys/fluent/core/generated/meshing/tui_252.py +10181 -0
  71. ansys/fluent/core/generated/solver/settings_222.py +3 -3
  72. ansys/fluent/core/generated/solver/settings_231.py +4 -4
  73. ansys/fluent/core/generated/solver/settings_232.py +5 -5
  74. ansys/fluent/core/generated/solver/settings_241.py +5 -5
  75. ansys/fluent/core/generated/solver/settings_242.py +1185 -1185
  76. ansys/fluent/core/generated/solver/settings_251.py +1847 -1652
  77. ansys/fluent/core/generated/solver/settings_251.pyi +237 -211
  78. ansys/fluent/core/generated/solver/settings_252.py +90369 -0
  79. ansys/fluent/core/generated/solver/settings_252.pyi +63778 -0
  80. ansys/fluent/core/generated/solver/settings_builtin.py +612 -1
  81. ansys/fluent/core/generated/solver/settings_builtin.pyi +235 -0
  82. ansys/fluent/core/generated/solver/tui_251.py +2283 -2103
  83. ansys/fluent/core/generated/solver/tui_252.py +37720 -0
  84. ansys/fluent/core/journaling.py +1 -1
  85. ansys/fluent/core/launcher/error_handler.py +3 -0
  86. ansys/fluent/core/launcher/fluent_container.py +5 -0
  87. ansys/fluent/core/launcher/launcher.py +1 -2
  88. ansys/fluent/core/launcher/launcher_utils.py +17 -6
  89. ansys/fluent/core/launcher/process_launch_string.py +3 -3
  90. ansys/fluent/core/launcher/pyfluent_enums.py +1 -1
  91. ansys/fluent/core/launcher/slurm_launcher.py +2 -1
  92. ansys/fluent/core/launcher/standalone_launcher.py +11 -5
  93. ansys/fluent/core/launcher/watchdog.py +1 -1
  94. ansys/fluent/core/launcher/watchdog_exec +6 -3
  95. ansys/fluent/core/logging.py +1 -5
  96. ansys/fluent/core/parametric.py +6 -3
  97. ansys/fluent/core/post_objects/meta.py +1 -39
  98. ansys/fluent/core/post_objects/post_helper.py +4 -3
  99. ansys/fluent/core/post_objects/post_object_definitions.py +12 -7
  100. ansys/fluent/core/post_objects/post_objects_container.py +39 -2
  101. ansys/fluent/core/rpvars.py +2 -1
  102. ansys/fluent/core/scheduler/machine_list.py +3 -1
  103. ansys/fluent/core/search.py +109 -262
  104. ansys/fluent/core/services/__init__.py +3 -0
  105. ansys/fluent/core/services/api_upgrade.py +1 -0
  106. ansys/fluent/core/services/batch_ops.py +3 -1
  107. ansys/fluent/core/services/datamodel_se.py +37 -30
  108. ansys/fluent/core/services/datamodel_tui.py +8 -3
  109. ansys/fluent/core/services/deprecated_field_data.py +691 -0
  110. ansys/fluent/core/services/field_data.py +67 -357
  111. ansys/fluent/core/services/interceptors.py +6 -4
  112. ansys/fluent/core/services/reduction.py +1 -2
  113. ansys/fluent/core/services/scheme_eval.py +2 -3
  114. ansys/fluent/core/services/solution_variables.py +46 -48
  115. ansys/fluent/core/session.py +6 -4
  116. ansys/fluent/core/session_meshing.pyi +5 -0
  117. ansys/fluent/core/session_pure_meshing.pyi +4 -1
  118. ansys/fluent/core/session_solver_lite.py +2 -1
  119. ansys/fluent/core/solver/flobject.py +179 -207
  120. ansys/fluent/core/solver/flunits.py +65 -56
  121. ansys/fluent/core/solver/function/reduction.py +9 -29
  122. ansys/fluent/core/solver/settings_builtin_bases.py +28 -22
  123. ansys/fluent/core/solver/settings_builtin_data.py +105 -1
  124. ansys/fluent/core/solver/settings_external.py +0 -28
  125. ansys/fluent/core/streaming_services/field_data_streaming.py +1 -0
  126. ansys/fluent/core/streaming_services/monitor_streaming.py +0 -1
  127. ansys/fluent/core/systemcoupling.py +145 -14
  128. ansys/fluent/core/utils/__init__.py +18 -2
  129. ansys/fluent/core/utils/dump_session_data.py +7 -4
  130. ansys/fluent/core/utils/execution.py +2 -2
  131. ansys/fluent/core/utils/file_transfer_service.py +37 -42
  132. ansys/fluent/core/utils/fluent_version.py +20 -2
  133. ansys/fluent/core/utils/networking.py +39 -1
  134. ansys/fluent/core/workflow.py +3 -15
  135. ansys/fluent/tests/conftest.py +89 -7
  136. ansys/fluent/tests/fluent/test_version/test.py +2 -0
  137. ansys/fluent/tests/fluent_fixtures.py +195 -0
  138. ansys/fluent/tests/integration/test_optislang/test_optislang_integration.py +7 -7
  139. ansys/fluent/tests/parametric/test_parametric_workflow.py +14 -4
  140. ansys/fluent/tests/test_builtin_settings.py +28 -0
  141. ansys/fluent/tests/test_cad_to_post_ftm.py +1 -3
  142. ansys/fluent/tests/test_cad_to_post_wtm.py +1 -1
  143. ansys/fluent/tests/test_casereader.py +1 -1
  144. ansys/fluent/tests/test_codegen.py +116 -6
  145. ansys/fluent/tests/test_data_model_cache.py +1 -1
  146. ansys/fluent/tests/test_datamodel_service.py +14 -19
  147. ansys/fluent/tests/test_field_data.py +93 -45
  148. ansys/fluent/tests/test_file_session.py +32 -29
  149. ansys/fluent/tests/test_flobject.py +16 -58
  150. ansys/fluent/tests/test_fluent_fixes.py +5 -5
  151. ansys/fluent/tests/test_fluent_session.py +11 -8
  152. ansys/fluent/tests/test_fluent_version.py +1 -1
  153. ansys/fluent/tests/test_launcher.py +22 -5
  154. ansys/fluent/tests/test_launcher_remote.py +80 -4
  155. ansys/fluent/tests/test_meshing_utilities.py +93 -44
  156. ansys/fluent/tests/test_meshing_workflow.py +6 -6
  157. ansys/fluent/tests/test_meshingmode/test_meshing_launch.py +1 -1
  158. ansys/fluent/tests/test_new_meshing_workflow.py +42 -3
  159. ansys/fluent/tests/test_preferences.py +6 -6
  160. ansys/fluent/tests/test_reduction.py +61 -30
  161. ansys/fluent/tests/test_rp_vars.py +1 -1
  162. ansys/fluent/tests/test_search.py +53 -200
  163. ansys/fluent/tests/test_session.py +18 -13
  164. ansys/fluent/tests/test_settings_api.py +93 -29
  165. ansys/fluent/tests/test_settings_reader.py +1 -1
  166. ansys/fluent/tests/test_solver_monitors.py +1 -1
  167. ansys/fluent/tests/test_solvermode/test_calculationactivities.py +4 -4
  168. ansys/fluent/tests/test_solvermode/test_controls.py +3 -3
  169. ansys/fluent/tests/test_solvermode/test_methods.py +1 -1
  170. ansys/fluent/tests/test_solvermode/test_models.py +3 -3
  171. ansys/fluent/tests/test_systemcoupling.py +33 -5
  172. ansys/fluent/tests/test_topy.py +2 -2
  173. ansys/fluent/tests/test_tui_api.py +5 -5
  174. ansys/fluent/tests/test_utils.py +1 -1
  175. {ansys_fluent_core-0.27.dev1.dist-info → ansys_fluent_core-0.28.dev0.dist-info}/METADATA +6 -17
  176. ansys_fluent_core-0.28.dev0.dist-info/RECORD +291 -0
  177. ansys/fluent/core/generated/api_tree_222.pickle +0 -0
  178. ansys/fluent/core/generated/api_tree_231.pickle +0 -0
  179. ansys/fluent/core/generated/api_tree_232.pickle +0 -0
  180. ansys/fluent/core/generated/api_tree_241.pickle +0 -0
  181. ansys/fluent/core/generated/api_tree_242.pickle +0 -0
  182. ansys/fluent/core/generated/api_tree_251.pickle +0 -0
  183. ansys/fluent/tests/test_tests_util.py +0 -47
  184. ansys/fluent/tests/util/__init__.py +0 -38
  185. ansys_fluent_core-0.27.dev1.dist-info/RECORD +0 -283
  186. {ansys_fluent_core-0.27.dev1.dist-info → ansys_fluent_core-0.28.dev0.dist-info}/AUTHORS +0 -0
  187. {ansys_fluent_core-0.27.dev1.dist-info → ansys_fluent_core-0.28.dev0.dist-info}/LICENSE +0 -0
  188. {ansys_fluent_core-0.27.dev1.dist-info → ansys_fluent_core-0.28.dev0.dist-info}/WHEEL +0 -0
@@ -1,20 +1,21 @@
1
1
  from contextlib import nullcontext
2
2
  import functools
3
+ import inspect
3
4
  import operator
4
5
  import os
6
+ from pathlib import Path
7
+ import shutil
8
+ import sys
5
9
 
6
10
  from packaging.specifiers import SpecifierSet
7
11
  from packaging.version import Version
8
12
  import pytest
9
13
 
10
14
  import ansys.fluent.core as pyfluent
11
- from ansys.fluent.core import codegen
12
15
  from ansys.fluent.core.examples.downloads import download_file
13
16
  from ansys.fluent.core.utils.file_transfer_service import RemoteFileTransferStrategy
14
17
  from ansys.fluent.core.utils.fluent_version import FluentVersion
15
18
 
16
- _fluent_release_version = FluentVersion.current_release().value
17
-
18
19
 
19
20
  def pytest_addoption(parser):
20
21
  parser.addoption(
@@ -29,6 +30,12 @@ def pytest_addoption(parser):
29
30
  parser.addoption(
30
31
  "--solvermode", action="store_true", default=False, help="run solvermode tests"
31
32
  )
33
+ parser.addoption(
34
+ "--write-fluent-journals",
35
+ action="store_true",
36
+ default=False,
37
+ help="Write Fluent journals for unittests",
38
+ )
32
39
 
33
40
 
34
41
  def pytest_runtest_setup(item):
@@ -48,6 +55,7 @@ def pytest_runtest_setup(item):
48
55
  pytest.skip()
49
56
 
50
57
  version_specs = []
58
+ fluent_release_version = FluentVersion.current_release().value
51
59
  for mark in item.iter_markers(name="fluent_version"):
52
60
  spec = mark.args[0]
53
61
  # if a test is marked as fluent_version("latest")
@@ -55,9 +63,9 @@ def pytest_runtest_setup(item):
55
63
  # run with release Fluent versions in PRs
56
64
  if spec == "latest":
57
65
  spec = (
58
- f">={_fluent_release_version}"
66
+ f">={fluent_release_version}"
59
67
  if is_nightly or is_solvermode_option
60
- else f"=={_fluent_release_version}"
68
+ else f"=={fluent_release_version}"
61
69
  )
62
70
  version_specs.append(SpecifierSet(spec))
63
71
  if version_specs:
@@ -67,14 +75,83 @@ def pytest_runtest_setup(item):
67
75
  pytest.skip()
68
76
 
69
77
 
78
+ def pytest_collection_finish(session):
79
+ if session.config.getoption("--write-fluent-journals"):
80
+ import_path = Path(__file__).parent
81
+ sys.path.append(str(import_path))
82
+ import fluent_fixtures
83
+
84
+ launcher_args_by_fixture = {}
85
+ for k, v in fluent_fixtures.__dict__.items():
86
+ if hasattr(v, "fluent_launcher_args"):
87
+ launcher_args_by_fixture[k] = v.fluent_launcher_args
88
+ fluent_test_root = import_path / "fluent"
89
+ shutil.rmtree(fluent_test_root, ignore_errors=True)
90
+ for item in session.items:
91
+ skip = False
92
+ for mark in item.iter_markers(name="skip"):
93
+ skip = True
94
+ for mark in item.iter_markers(name="fluent_version"):
95
+ spec = mark.args[0]
96
+ # TODO: Support older versions
97
+ if not (
98
+ spec == "latest"
99
+ or Version(FluentVersion.current_dev().value) in SpecifierSet(spec)
100
+ ):
101
+ skip = True
102
+ if skip:
103
+ continue
104
+ fluent_test_dir = fluent_test_root / item.module.__name__ / item.name
105
+ fluent_test_config = fluent_test_dir / "test.yaml"
106
+ fluent_test_file = fluent_test_dir / "test.py"
107
+ launcher_args = ""
108
+ parameters = inspect.signature(item.function).parameters
109
+ parameter_set = {p for p in parameters}
110
+ if not (parameter_set & set(launcher_args_by_fixture.keys())):
111
+ # Skipping as unittest doesn't use fluent fixture
112
+ continue
113
+ for param in parameters:
114
+ if param not in dir(fluent_fixtures):
115
+ print(f"Skipping {item.nodeid} because of missing fixture {param}")
116
+ skip = True
117
+ break
118
+ if skip:
119
+ continue
120
+ for param in parameters:
121
+ if param in launcher_args_by_fixture:
122
+ launcher_args = launcher_args_by_fixture[param]
123
+ break
124
+ fluent_test_dir.mkdir(parents=True, exist_ok=True)
125
+ with open(fluent_test_config, "w") as f:
126
+ f.write(f"launcher_args: {launcher_args}\n")
127
+ with open(fluent_test_file, "w") as f:
128
+ f.write("import sys\n")
129
+ f.write('sys.path.append("/testing")\n')
130
+ f.write(
131
+ f"from {item.module.__name__} import {item.name} # noqa: E402\n"
132
+ )
133
+ f.write("from fluent_fixtures import ( # noqa: E402\n")
134
+ for param in parameters:
135
+ f.write(f" {param},\n")
136
+ f.write(")\n")
137
+ f.write("\n")
138
+ f.write(f"{item.name}(")
139
+ f.write(", ".join([f"{p}(globals())" for p in parameters]))
140
+ f.write(")\n")
141
+ f.write("exit()\n")
142
+ print(f"Written {fluent_test_file}")
143
+ session.items = []
144
+ session.testscollected = 0
145
+
146
+
70
147
  @pytest.fixture(autouse=True)
71
148
  def run_before_each_test(
72
149
  monkeypatch: pytest.MonkeyPatch, request: pytest.FixtureRequest
73
150
  ) -> None:
74
151
  monkeypatch.setenv("PYFLUENT_TEST_NAME", request.node.name)
152
+ monkeypatch.setenv("PYFLUENT_CODEGEN_SKIP_BUILTIN_SETTINGS", "1")
75
153
  pyfluent.CONTAINER_MOUNT_SOURCE = pyfluent.EXAMPLES_PATH
76
154
  pyfluent.CONTAINER_MOUNT_TARGET = pyfluent.EXAMPLES_PATH
77
- codegen.CODEGEN_GENERATE_BUILTIN_SETTINGS = False
78
155
 
79
156
 
80
157
  class Helpers:
@@ -145,8 +222,8 @@ def exhaust_system_geometry_filename():
145
222
 
146
223
  def create_session(**kwargs):
147
224
  if pyfluent.USE_FILE_TRANSFER_SERVICE:
148
- container_dict = {"mount_source": file_transfer_service.MOUNT_SOURCE}
149
225
  file_transfer_service = RemoteFileTransferStrategy()
226
+ container_dict = {"mount_source": file_transfer_service.MOUNT_SOURCE}
150
227
  return pyfluent.launch_fluent(
151
228
  container_dict=container_dict,
152
229
  file_transfer_service=file_transfer_service,
@@ -301,3 +378,8 @@ def periodic_rot_settings_session(new_solver_session):
301
378
  lightweight_setup=True,
302
379
  )
303
380
  return solver
381
+
382
+
383
+ @pytest.fixture
384
+ def disable_datamodel_cache(monkeypatch: pytest.MonkeyPatch):
385
+ monkeypatch.setattr(pyfluent, "DATAMODEL_USE_STATE_CACHE", False)
@@ -0,0 +1,2 @@
1
+ assert ansys.fluent.core.__version__ == "0.28.dev0" # noqa: F821
2
+ exit()
@@ -0,0 +1,195 @@
1
+ from typing import Callable
2
+
3
+ import pytest
4
+
5
+ import ansys.fluent.core as pyfluent
6
+ from ansys.fluent.core.data_model_cache import DataModelCache
7
+ from ansys.fluent.core.examples import download_file
8
+
9
+
10
+ def fluent_launcher_args(args: str):
11
+ def fluent_launcher_args_inner(f: Callable):
12
+ def wrapper(*args, **kwargs):
13
+ return f(*args, **kwargs)
14
+
15
+ wrapper.fluent_launcher_args = args
16
+ return wrapper
17
+
18
+ return fluent_launcher_args_inner
19
+
20
+
21
+ def mixing_elbow_geometry_filename(globals):
22
+ return download_file(
23
+ file_name="mixing_elbow.pmdb", directory="pyfluent/mixing_elbow"
24
+ )
25
+
26
+
27
+ def exhaust_system_geometry_filename(globals):
28
+ return download_file(
29
+ file_name="exhaust_system.fmd", directory="pyfluent/exhaust_system"
30
+ )
31
+
32
+
33
+ @fluent_launcher_args("3ddp -meshing")
34
+ def new_meshing_session(globals):
35
+ meshing = globals["meshing"]
36
+ return meshing
37
+
38
+
39
+ @fluent_launcher_args("3ddp -meshing")
40
+ def new_pure_meshing_session(globals):
41
+ return new_meshing_session(globals)
42
+
43
+
44
+ @fluent_launcher_args("3ddp -meshing")
45
+ def watertight_workflow_session(globals):
46
+ meshing = new_meshing_session(globals)
47
+ meshing.workflow.InitializeWorkflow(WorkflowType="Watertight Geometry")
48
+ return meshing
49
+
50
+
51
+ @fluent_launcher_args("3ddp -meshing")
52
+ def fault_tolerant_workflow_session(globals):
53
+ meshing = new_meshing_session(globals)
54
+ meshing.workflow.InitializeWorkflow(WorkflowType="Fault-tolerant Meshing")
55
+ return meshing
56
+
57
+
58
+ @fluent_launcher_args("3ddp -meshing")
59
+ def mixing_elbow_watertight_pure_meshing_session(globals):
60
+ meshing = new_pure_meshing_session(globals)
61
+ geometry_filename = mixing_elbow_geometry_filename(globals)
62
+ meshing.workflow.InitializeWorkflow(WorkflowType="Watertight Geometry")
63
+ meshing.workflow.TaskObject["Import Geometry"].Arguments = dict(
64
+ FileName=geometry_filename, LengthUnit="in"
65
+ )
66
+ return meshing
67
+
68
+
69
+ @fluent_launcher_args("3ddp")
70
+ def new_solver_session(globals):
71
+ solver = globals["solver"]
72
+ return solver
73
+
74
+
75
+ @fluent_launcher_args("3d")
76
+ def new_solver_session_sp(globals):
77
+ return new_solver_session(globals)
78
+
79
+
80
+ @fluent_launcher_args("2ddp")
81
+ def new_solver_session_2d(globals):
82
+ return new_solver_session(globals)
83
+
84
+
85
+ @fluent_launcher_args("3ddp")
86
+ def static_mixer_settings_session(globals):
87
+ solver = new_solver_session(globals)
88
+ case_name = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer")
89
+ solver.file.read(
90
+ file_type="case",
91
+ file_name=case_name,
92
+ lightweight_setup=True,
93
+ )
94
+ return solver
95
+
96
+
97
+ @fluent_launcher_args("3ddp")
98
+ def static_mixer_case_session(globals):
99
+ solver = new_solver_session(globals)
100
+ case_name = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer")
101
+ solver.file.read(file_type="case", file_name=case_name)
102
+ return solver
103
+
104
+
105
+ @fluent_launcher_args("3ddp")
106
+ def mixing_elbow_settings_session(globals):
107
+ solver = new_solver_session(globals)
108
+ case_name = download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow")
109
+ solver.settings.file.read(
110
+ file_type="case",
111
+ file_name=case_name,
112
+ lightweight_setup=True,
113
+ )
114
+ return solver
115
+
116
+
117
+ @fluent_launcher_args("3ddp")
118
+ def mixing_elbow_case_data_session(globals):
119
+ solver = new_solver_session(globals)
120
+ case_name = download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow")
121
+ download_file("mixing_elbow.dat.h5", "pyfluent/mixing_elbow")
122
+ solver.settings.file.read(file_type="case-data", file_name=case_name)
123
+ return solver
124
+
125
+
126
+ @fluent_launcher_args("3ddp")
127
+ def mixing_elbow_param_case_data_session(globals):
128
+ solver = new_solver_session(globals)
129
+ case_name = download_file("elbow_param.cas.h5", "pyfluent/mixing_elbow")
130
+ download_file("elbow_param.dat.h5", "pyfluent/mixing_elbow")
131
+ solver.settings.file.read(file_type="case-data", file_name=case_name)
132
+ return solver
133
+
134
+
135
+ @fluent_launcher_args("2ddp")
136
+ def disk_settings_session(globals):
137
+ solver = new_solver_session_2d(globals)
138
+ case_name = download_file("disk.cas.h5", "pyfluent/rotating_disk")
139
+ solver.file.read(
140
+ file_type="case",
141
+ file_name=case_name,
142
+ lightweight_setup=True,
143
+ )
144
+ return solver
145
+
146
+
147
+ @fluent_launcher_args("2ddp")
148
+ def disk_case_session(globals):
149
+ solver = new_solver_session_2d(globals)
150
+ case_name = download_file("disk.cas.h5", "pyfluent/rotating_disk")
151
+ solver.file.read(file_type="case", file_name=case_name)
152
+ return solver
153
+
154
+
155
+ @fluent_launcher_args("3ddp")
156
+ def periodic_rot_settings_session(globals):
157
+ solver = new_solver_session(globals)
158
+ case_name = download_file(
159
+ "periodic_rot.cas.h5",
160
+ "pyfluent/periodic_rot",
161
+ )
162
+ solver.file.read(
163
+ file_type="case",
164
+ file_name=case_name,
165
+ lightweight_setup=True,
166
+ )
167
+ return solver
168
+
169
+
170
+ monkeypatch = pytest.MonkeyPatch()
171
+
172
+
173
+ def disable_datamodel_cache(globals):
174
+ monkeypatch.setattr(pyfluent, "DATAMODEL_USE_STATE_CACHE", False)
175
+
176
+
177
+ def display_names_as_keys_in_cache(globals):
178
+ DataModelCache.use_display_name = True
179
+
180
+
181
+ def new_meshing_session2(globals):
182
+ session = pyfluent.launch_fluent(mode=pyfluent.LaunchMode.MESHING)
183
+ return session
184
+
185
+
186
+ def new_solver_session2(globals):
187
+ session = pyfluent.launch_fluent()
188
+ return session
189
+
190
+
191
+ def static_mixer_case_session2(globals):
192
+ session = new_solver_session2(globals)
193
+ case_name = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer")
194
+ session.file.read(file_type="case", file_name=case_name)
195
+ return session
@@ -84,7 +84,7 @@ def test_simple_solve(mixing_elbow_param_case_data_session):
84
84
  else:
85
85
  print("Solution is converged")
86
86
 
87
- assert convergence == True, "Solution failed to converge"
87
+ assert convergence, "Solution failed to converge"
88
88
 
89
89
  # Step 5: Read the data again from the case and data file
90
90
  solver_session.settings.file.read_case_data(file_name=case_path)
@@ -148,8 +148,8 @@ def test_generate_read_mesh(mixing_elbow_geometry_filename):
148
148
  h5_path = str(Path(temporary_resource_path) / "default_mesh.msh.h5")
149
149
  meshing.tui.file.write_mesh(gz_path)
150
150
  meshing.tui.file.write_mesh(h5_path)
151
- assert (Path(temporary_resource_path) / "default_mesh.msh.gz").exists() == True
152
- assert (Path(temporary_resource_path) / "default_mesh.msh.h5").exists() == True
151
+ assert (Path(temporary_resource_path) / "default_mesh.msh.gz").exists()
152
+ assert (Path(temporary_resource_path) / "default_mesh.msh.h5").exists()
153
153
 
154
154
  # Step 3: use created mesh file - .msh.gz/.msh.h5
155
155
  meshing.tui.file.read_mesh(gz_path, "ok")
@@ -163,8 +163,8 @@ def test_generate_read_mesh(mixing_elbow_geometry_filename):
163
163
  write_case = solver.settings.file.write_case
164
164
  write_case(file_name=gz_path)
165
165
  write_case(file_name=h5_path)
166
- assert (Path(temporary_resource_path) / "default_case.cas.gz").exists() == True
167
- assert (Path(temporary_resource_path) / "default_case.cas.h5").exists() == True
166
+ assert (Path(temporary_resource_path) / "default_case.cas.gz").exists()
167
+ assert (Path(temporary_resource_path) / "default_case.cas.h5").exists()
168
168
  solver.exit()
169
169
  shutil.rmtree(temporary_resource_path, ignore_errors=True)
170
170
 
@@ -254,9 +254,9 @@ def test_parametric_project(mixing_elbow_param_case_data_session, new_solver_ses
254
254
  assert base_outputs == {"outlet_temp-op": pytest_approx(322.336008)}
255
255
  if session2.get_fluent_version() < FluentVersion.v251:
256
256
  pstudy.design_points.create_1()
257
+ dp = pstudy.design_points["DP1"]
257
258
  else:
258
- pstudy.design_points.create()
259
- dp = pstudy.design_points["DP1"]
259
+ dp = pstudy.design_points.create()
260
260
  dp.input_parameters["inlet2_temp"] = 600.0
261
261
  pstudy.design_points.update_selected(design_points=["DP1"])
262
262
  fluent_output_table = dp.output_parameters()
@@ -105,10 +105,10 @@ def test_parametric_workflow():
105
105
  dp_names = set([*study1.design_points.keys()])
106
106
  if solver_session.get_fluent_version() < FluentVersion.v251:
107
107
  study1.design_points.create_1()
108
+ dp1_name = set([*study1.design_points.keys()]).difference(dp_names).pop()
109
+ dp1 = study1.design_points[dp1_name]
108
110
  else:
109
- study1.design_points.create()
110
- dp1_name = set([*study1.design_points.keys()]).difference(dp_names).pop()
111
- dp1 = study1.design_points[dp1_name]
111
+ dp1 = study1.design_points.create()
112
112
  dp1.input_parameters["inlet1_temp"] = 500
113
113
  dp1.input_parameters["inlet1_vel"] = 1
114
114
  dp1.input_parameters["inlet2_vel"] = 1
@@ -145,7 +145,7 @@ def test_parametric_workflow():
145
145
  solver_session.parametric_studies.export_design_table(filepath=write_design_table)
146
146
  assert design_point_table.exists()
147
147
 
148
- study1.design_points.delete_design_points(design_points=[dp1_name])
148
+ study1.design_points.delete_design_points(design_points=[dp1.obj_name])
149
149
  assert len(study1.design_points) == 2
150
150
  study_names = set([*solver_session.parametric_studies.keys()])
151
151
  solver_session.parametric_studies.duplicate()
@@ -255,6 +255,15 @@ def test_parameters_list_function(static_mixer_settings_session):
255
255
  create_output_param("report-definition", "outlet-temp-avg")
256
256
  create_output_param("report-definition", "outlet-vel-avg")
257
257
 
258
+ # Create a unitless output parameter
259
+ unitless_quantity = solver.settings.solution.report_definitions.surface.create(
260
+ "temp-outlet-uniformity"
261
+ )
262
+ unitless_quantity.report_type = "surface-masswtui"
263
+ unitless_quantity.field = "temperature"
264
+ unitless_quantity.surface_names = ["outlet"]
265
+ unitless_quantity.output_parameter = True
266
+
258
267
  input_parameters_list = solver.parameters.input_parameters.list()
259
268
  output_parameters_list = solver.parameters.output_parameters.list()
260
269
  assert input_parameters_list == {
@@ -266,4 +275,5 @@ def test_parameters_list_function(static_mixer_settings_session):
266
275
  assert output_parameters_list == {
267
276
  "outlet-temp-avg-op": [0.0, "K"],
268
277
  "outlet-vel-avg-op": [0.0, "m/s"],
278
+ "temp-outlet-uniformity-op": [0.0, ""],
269
279
  }
@@ -1,3 +1,6 @@
1
+ from pathlib import Path
2
+ import tempfile
3
+
1
4
  import pytest
2
5
 
3
6
  try:
@@ -19,6 +22,8 @@ try:
19
22
  CumulativePlots,
20
23
  CustomFieldFunctions,
21
24
  CustomVectors,
25
+ DesignPoint,
26
+ DesignPoints,
22
27
  DiscretePhase,
23
28
  DiscretePhaseHistogram,
24
29
  DynamicMesh,
@@ -56,6 +61,8 @@ try:
56
61
  NamedExpressions,
57
62
  Optics,
58
63
  OutputParameters,
64
+ ParametricStudies,
65
+ ParametricStudy,
59
66
  ParticleTracks,
60
67
  PartitionSurfaces,
61
68
  Pathlines,
@@ -112,6 +119,7 @@ try:
112
119
  )
113
120
  except ImportError:
114
121
  pass # for no-codegen testing workflow
122
+ import ansys.fluent.core as pyfluent
115
123
  from ansys.fluent.core.examples import download_file
116
124
  from ansys.fluent.core.utils.fluent_version import FluentVersion
117
125
 
@@ -630,6 +638,26 @@ def test_builtin_settings(mixing_elbow_case_data_session):
630
638
  else:
631
639
  with pytest.raises(RuntimeError):
632
640
  CustomVectors(settings_source=solver)
641
+ tmp_save_path = tempfile.mkdtemp(dir=pyfluent.EXAMPLES_PATH)
642
+ project_file = Path(tmp_save_path) / "mixing_elbow_param.flprj"
643
+ solver.settings.parametric_studies.initialize(project_filename=str(project_file))
644
+ assert ParametricStudies(settings_source=solver) == solver.parametric_studies
645
+ assert (
646
+ ParametricStudy(settings_source=solver, name="mixing_elbow-Solve")
647
+ == solver.parametric_studies["mixing_elbow-Solve"]
648
+ )
649
+ assert (
650
+ DesignPoints(settings_source=solver, parametric_studies="mixing_elbow-Solve")
651
+ == solver.parametric_studies["mixing_elbow-Solve"].design_points
652
+ )
653
+ assert (
654
+ DesignPoint(
655
+ settings_source=solver,
656
+ parametric_studies="mixing_elbow-Solve",
657
+ name="Base DP",
658
+ )
659
+ == solver.parametric_studies["mixing_elbow-Solve"].design_points["Base DP"]
660
+ )
633
661
 
634
662
 
635
663
  @pytest.mark.codegen_required
@@ -32,9 +32,7 @@ def test_exhaust_system(
32
32
  meshing_session = fault_tolerant_workflow_session
33
33
  workflow = meshing_session.workflow
34
34
 
35
- assign_task_args = partial(
36
- assign_task_arguments, workflow=workflow, check_state=True
37
- )
35
+ _ = partial(assign_task_arguments, workflow=workflow, check_state=True)
38
36
 
39
37
  execute_task_with_pre_and_postconditions = partial(
40
38
  execute_task_with_pre_and_postcondition_checks, workflow=workflow
@@ -17,7 +17,7 @@ This test queries the following using PyTest:
17
17
  from functools import partial
18
18
 
19
19
  import pytest
20
- from util.meshing_workflow import ( # noqa: F401
20
+ from util.meshing_workflow import (
21
21
  assign_task_arguments,
22
22
  execute_task_with_pre_and_postcondition_checks,
23
23
  )
@@ -286,7 +286,7 @@ def test_lispy_for_multiline_string():
286
286
 
287
287
 
288
288
  def test_lispy_for_quotes():
289
- lispy.parse(
289
+ assert lispy.parse(
290
290
  '(define x "\n(format \\"\n-------------------------\nRunning Original Settings\n------------------------\n\\")")'
291
291
  ) == [
292
292
  "define",
@@ -1,3 +1,4 @@
1
+ import ast
1
2
  import importlib
2
3
  from pathlib import Path
3
4
  import pickle
@@ -330,8 +331,8 @@ def test_codegen_with_datamodel_static_info(monkeypatch, rules):
330
331
  f"datamodel_{version}",
331
332
  }
332
333
  datamodel_paths = list((codegen_outdir / f"datamodel_{version}").iterdir())
333
- assert len(datamodel_paths) == 1
334
- assert set(p.name for p in datamodel_paths) == {f"{rules}.py"}
334
+ assert len(datamodel_paths) == 1 or 2
335
+ assert set(p.name for p in datamodel_paths) == {f"{rules}.py"} or {f"{rules}.pyi"}
335
336
  with open(codegen_outdir / f"datamodel_{version}" / f"{rules}.py", "r") as f:
336
337
  assert f.read().strip() == _expected_datamodel_api_output
337
338
  api_tree_file = get_api_tree_file_name(version)
@@ -812,8 +813,8 @@ def test_codegen_old_with_settings_static_info(monkeypatch):
812
813
  "Q1": "Query",
813
814
  }
814
815
  api_tree_expected = {}
815
- api_tree_expected[f"<meshing_session>"] = {}
816
- api_tree_expected[f"<solver_session>"] = settings_tree
816
+ api_tree_expected["<meshing_session>"] = {}
817
+ api_tree_expected["<solver_session>"] = settings_tree
817
818
  assert api_tree == api_tree_expected
818
819
  shutil.rmtree(str(codegen_outdir))
819
820
 
@@ -1077,7 +1078,116 @@ def test_codegen_with_settings_static_info(monkeypatch):
1077
1078
  "Q1": "Query",
1078
1079
  }
1079
1080
  api_tree_expected = {}
1080
- api_tree_expected[f"<meshing_session>"] = {}
1081
- api_tree_expected[f"<solver_session>"] = settings_tree
1081
+ api_tree_expected["<meshing_session>"] = {}
1082
+ api_tree_expected["<solver_session>"] = settings_tree
1082
1083
  assert api_tree == api_tree_expected
1083
1084
  shutil.rmtree(str(codegen_outdir))
1085
+
1086
+
1087
+ _settings_static_info_duplicate_parameters = {
1088
+ "children": (
1089
+ _get_group_settings_static_info(
1090
+ "G1",
1091
+ (
1092
+ (
1093
+ _get_group_settings_static_info(
1094
+ "G2",
1095
+ _get_parameter_settings_static_info("P1", "string"),
1096
+ {},
1097
+ {},
1098
+ )
1099
+ )
1100
+ | _get_parameter_settings_static_info("P1", "string")
1101
+ ),
1102
+ {},
1103
+ {},
1104
+ )
1105
+ ),
1106
+ "commands": {},
1107
+ "queries": {},
1108
+ "type": "group",
1109
+ }
1110
+
1111
+ _settings_static_info_different_parameters_with_same_name = {
1112
+ "children": (
1113
+ _get_group_settings_static_info(
1114
+ "G1",
1115
+ (
1116
+ (
1117
+ _get_group_settings_static_info(
1118
+ "G2",
1119
+ _get_parameter_settings_static_info("P1", "real"),
1120
+ {},
1121
+ {},
1122
+ )
1123
+ )
1124
+ | _get_parameter_settings_static_info("P1", "string")
1125
+ ),
1126
+ {},
1127
+ {},
1128
+ )
1129
+ ),
1130
+ "commands": {},
1131
+ "queries": {},
1132
+ "type": "group",
1133
+ }
1134
+
1135
+
1136
+ _settings_static_info_combined_case = {
1137
+ "children": (
1138
+ _get_group_settings_static_info(
1139
+ "G1",
1140
+ (
1141
+ (
1142
+ _get_group_settings_static_info(
1143
+ "G2",
1144
+ (
1145
+ _get_parameter_settings_static_info("P1", "real")
1146
+ | _get_parameter_settings_static_info("P2", "string")
1147
+ ),
1148
+ {},
1149
+ {},
1150
+ )
1151
+ )
1152
+ | _get_parameter_settings_static_info("P1", "string")
1153
+ | _get_parameter_settings_static_info("P2", "string")
1154
+ ),
1155
+ {},
1156
+ {},
1157
+ )
1158
+ ),
1159
+ "commands": {},
1160
+ "queries": {},
1161
+ "type": "group",
1162
+ }
1163
+
1164
+
1165
+ @pytest.mark.parametrize(
1166
+ "settings_static_info,class_names",
1167
+ [
1168
+ (_settings_static_info_duplicate_parameters, ["P1", "G2", "G1", "root"]),
1169
+ (
1170
+ _settings_static_info_different_parameters_with_same_name,
1171
+ ["P1_1", "G2", "P1", "G1", "root"],
1172
+ ),
1173
+ (_settings_static_info_combined_case, ["P1_1", "P2", "G2", "P1", "G1", "root"]),
1174
+ ],
1175
+ )
1176
+ def test_codegen_with_settings_static_info_edge_cases(
1177
+ monkeypatch, settings_static_info, class_names
1178
+ ):
1179
+
1180
+ codegen_outdir = Path(tempfile.mkdtemp())
1181
+ monkeypatch.setattr(pyfluent, "CODEGEN_OUTDIR", codegen_outdir)
1182
+ version = "251"
1183
+ static_infos = {}
1184
+ static_infos[StaticInfoType.SETTINGS] = settings_static_info
1185
+ allapigen.generate(version, static_infos)
1186
+ with open(codegen_outdir / "solver" / f"settings_{version}.py", "r") as f:
1187
+ module_def = ast.parse(f.read())
1188
+ class_names_from_file = [
1189
+ x.name for x in module_def.body if isinstance(x, ast.ClassDef)
1190
+ ]
1191
+ # The order of classes is important.
1192
+ assert class_names_from_file == class_names
1193
+ shutil.rmtree(str(codegen_outdir))
@@ -429,6 +429,6 @@ def test_cache_per_session():
429
429
  ):
430
430
  assert m1.meshing.GlobalSettings.EnableComplexMeshing()
431
431
  assert m2.meshing.GlobalSettings.EnableComplexMeshing()
432
- w1 = m1.watertight()
432
+ _ = m1.watertight()
433
433
  assert not m1.meshing.GlobalSettings.EnableComplexMeshing()
434
434
  assert m2.meshing.GlobalSettings.EnableComplexMeshing()