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
@@ -7,61 +7,62 @@ Example
7
7
  The following code is employed to translate the source data
8
8
  into Python data structures:
9
9
 
10
- from ansys.fluent.core.filereader import lispy
11
- from ansys.units import Quantity, Unit
12
- from ansys.units.quantity import get_si_value
13
- import re
14
- from pprint import pprint
15
-
16
- fl_unit_re_subs = {
17
- 'deg': 'radian',
18
- 'rad': 'radian',
19
- 'Ohm': 'ohm'
20
- }
21
-
22
- fl_unit_subs = {'%': ''}
23
-
24
- def replace_units(match):
25
- return fl_unit_re_subs[match.group(0)]
26
-
27
- def substitute_fl_units_with_py_units(fl_units_dict):
28
- subs = {}
29
- for k, v in fl_units_dict.items():
30
- new_val = re.sub('|'.join(r'\b%s\b' % re.escape(s) for s in fl_unit_re_subs), replace_units, v)
31
- if new_val != v:
32
- subs[k] = new_val
33
- else:
34
- new_val = fl_unit_subs.get(v, None)
35
- if new_val is not None:
36
- subs[k] = new_val
37
- print("Substitutions:")
38
- for k, v in subs.items():
39
- print(f"'{fl_units_dict[k]}' -> '{v}' for '{k}'")
40
- fl_units_dict.update(subs)
41
- return fl_units_dict
42
-
43
- def remove_unhandled_units(fl_units_dict):
44
- not_si = {}
45
- unhandled = {}
46
- for k, v in fl_units_dict.items():
47
- try:
48
- Unit(v)
49
- q = Quantity(1.0, v)
50
- if get_si_value(q) != 1.0:
51
- not_si[k] = v
52
- except Exception:
53
- unhandled[k] = v
54
- print("Not SI:")
55
- pprint(not_si)
56
- print("Unhandled:")
57
- pprint(unhandled)
58
- [fl_units_dict.pop(key) for key in list(not_si) + list(unhandled)]
59
- return fl_units_dict
60
-
61
- def make_python_fl_unit_table(scheme_unit_table):
62
- as_list = lispy.parse(scheme_unit_table)[1][1]
63
- as_dict = { x[0]:x[1][3].split('"')[1] for x in as_list }
64
- return remove_unhandled_units(substitute_fl_units_with_py_units(as_dict))
10
+ >>> from ansys.fluent.core.filereader import lispy
11
+ >>> from ansys.units import Quantity, Unit
12
+ >>> from ansys.units.quantity import get_si_value
13
+ >>> import re
14
+ >>> from pprint import pprint
15
+ >>>
16
+ >>> fl_unit_re_subs = {
17
+ ... 'deg': 'radian',
18
+ ... 'rad': 'radian',
19
+ ... 'Ohm': 'ohm'
20
+ ... }
21
+ >>>
22
+ >>> fl_unit_subs = {'%': ''}
23
+ >>>
24
+ >>> def replace_units(match):
25
+ ... return fl_unit_re_subs[match.group(0)]
26
+ ...
27
+ >>> def substitute_fl_units_with_py_units(fl_units_dict):
28
+ ... subs = {}
29
+ ... for k, v in fl_units_dict.items():
30
+ ... new_val = re.sub('|'.join(r'\b%s\b' % re.escape(s) for s in fl_unit_re_subs), replace_units, v)
31
+ ... if new_val != v:
32
+ ... subs[k] = new_val
33
+ ... else:
34
+ ... new_val = fl_unit_subs.get(v, None)
35
+ ... if new_val is not None:
36
+ ... subs[k] = new_val
37
+ ... print("Substitutions:")
38
+ ... for k, v in subs.items():
39
+ ... print(f"'{fl_units_dict[k]}' -> '{v}' for '{k}'")
40
+ ... fl_units_dict.update(subs)
41
+ ... return fl_units_dict
42
+ ...
43
+ >>> def remove_unhandled_units(fl_units_dict):
44
+ ... not_si = {}
45
+ ... unhandled = {}
46
+ ... for k, v in fl_units_dict.items():
47
+ ... try:
48
+ ... Unit(v)
49
+ ... q = Quantity(1.0, v)
50
+ ... if get_si_value(q) != 1.0:
51
+ ... not_si[k] = v
52
+ ... except Exception:
53
+ ... unhandled[k] = v
54
+ ... print("Not SI:")
55
+ ... pprint(not_si)
56
+ ... print("Unhandled:")
57
+ ... pprint(unhandled)
58
+ ... [fl_units_dict.pop(key) for key in list(not_si) + list(unhandled)]
59
+ ... return fl_units_dict
60
+ ...
61
+ >>> def make_python_fl_unit_table(scheme_unit_table):
62
+ ... as_list = lispy.parse(scheme_unit_table)[1][1]
63
+ ... as_dict = { x[0]:x[1][3].split('"')[1] for x in as_list }
64
+ ... return remove_unhandled_units(substitute_fl_units_with_py_units(as_dict))
65
+ ...
65
66
 
66
67
  Output from most recent run to generate the table below:
67
68
 
@@ -103,6 +104,8 @@ Unhandled:
103
104
 
104
105
  from __future__ import annotations
105
106
 
107
+ from typing import TypeVar
108
+
106
109
  _fl_unit_table = {
107
110
  "acceleration": "m s^-2",
108
111
  "angle": "radian",
@@ -223,6 +226,7 @@ class InvalidQuantityType(TypeError):
223
226
  self,
224
227
  quantity,
225
228
  ) -> None:
229
+ """Initialize InvalidQuantityType."""
226
230
  super().__init__(
227
231
  f"The specified quantity, '{quantity}' is not a string ({type(quantity)})."
228
232
  )
@@ -235,19 +239,24 @@ class UnitsNotDefinedForQuantity(ValueError):
235
239
  self,
236
240
  quantity: str,
237
241
  ) -> None:
242
+ """Initialize UnitsNotDefinedForQuantity."""
238
243
  super().__init__(
239
244
  f"The units for the specified quantity, '{quantity}' are not defined in PyFluent."
240
245
  )
241
246
 
242
247
 
248
+ QuantityT = TypeVar("QuantityT")
249
+
250
+
243
251
  class UnhandledQuantity(RuntimeError):
244
252
  """Raised on an attempt to get an unhandled Quantity."""
245
253
 
246
254
  def __init__(
247
255
  self,
248
256
  path: str,
249
- quantity: Quantity,
257
+ quantity: QuantityT,
250
258
  ) -> None:
259
+ """Initialize UnhandledQuantity."""
251
260
  super().__init__(
252
261
  f"Could not handle the quantity, '{quantity}' for the path, {path}."
253
262
  )
@@ -6,7 +6,7 @@ expr parameter is not relevant to all reductions functions.
6
6
 
7
7
  Parameters
8
8
  ----------
9
- expr : Any
9
+ expression : Any
10
10
  Expression that can be either a string or an
11
11
  instance of a specific settings API named_expressions
12
12
  object. The expression can be a field variable or a
@@ -197,7 +197,7 @@ def _extent_expression(
197
197
  numerator += val * extent
198
198
  denominator += extent
199
199
  except TypeError:
200
- if type(val) == list:
200
+ if isinstance(val, list):
201
201
  numerator += np.multiply(val, extent)
202
202
  denominator += extent
203
203
  else:
@@ -217,7 +217,7 @@ def _extent_moment_vector(f_string, expr, locations, ctxt):
217
217
  total += array(extent)
218
218
  except TypeError:
219
219
  raise RuntimeError(extent)
220
- return _Vector(total)
220
+ return tuple(total)
221
221
 
222
222
 
223
223
  def _extent_average(extent_name, expr, locations, ctxt):
@@ -251,27 +251,7 @@ def _extent_vectors(extent_name, locations, ctxt):
251
251
  total += array(extent)
252
252
  except TypeError:
253
253
  raise RuntimeError(extent)
254
- return _Vector(total)
255
-
256
-
257
- class _Vector:
258
- def __init__(self, np_arr):
259
- self.array = np_arr
260
-
261
- @property
262
- def x(self):
263
- """Get X vector."""
264
- return self.array[0]
265
-
266
- @property
267
- def y(self):
268
- """Get Y vector."""
269
- return self.array[1]
270
-
271
- @property
272
- def z(self):
273
- """Get Z vector."""
274
- return self.array[2]
254
+ return tuple(total)
275
255
 
276
256
 
277
257
  def _limit(limit, expr, locations, ctxt):
@@ -401,7 +381,7 @@ def centroid(locations, ctxt=None):
401
381
  ctxt : Any, optional
402
382
  Returns
403
383
  -------
404
- float
384
+ tuple
405
385
  """
406
386
  return _extent_vectors("Centroid", locations, ctxt)
407
387
 
@@ -416,7 +396,7 @@ def force(locations, ctxt=None):
416
396
  ctxt : Any, optional
417
397
  Returns
418
398
  -------
419
- float
399
+ tuple
420
400
  """
421
401
  return _extent_vectors("Force", locations, ctxt)
422
402
 
@@ -431,7 +411,7 @@ def pressure_force(locations, ctxt=None):
431
411
  ctxt : Any, optional
432
412
  Returns
433
413
  -------
434
- float
414
+ tuple
435
415
  """
436
416
  return _extent_vectors("PressureForce", locations, ctxt)
437
417
 
@@ -446,7 +426,7 @@ def viscous_force(locations, ctxt=None):
446
426
  ctxt : Any, optional
447
427
  Returns
448
428
  -------
449
- float
429
+ tuple
450
430
  """
451
431
  return _extent_vectors("ViscousForce", locations, ctxt)
452
432
 
@@ -462,7 +442,7 @@ def moment(expression, locations, ctxt=None):
462
442
  ctxt : Any, optional
463
443
  Returns
464
444
  -------
465
- float
445
+ tuple
466
446
  """
467
447
  return _extent_moment_vector("Moment", expression, locations, ctxt)
468
448
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from typing import Protocol, runtime_checkable
4
4
 
5
- from ansys.fluent.core.solver.flobject import SettingsBase
5
+ from ansys.fluent.core.solver.flobject import NamedObject, SettingsBase
6
6
  from ansys.fluent.core.solver.settings_builtin_data import DATA
7
7
  from ansys.fluent.core.utils.fluent_version import FluentVersion
8
8
 
@@ -28,55 +28,60 @@ def _get_settings_root(settings_source: SettingsBase | Solver):
28
28
  )
29
29
 
30
30
 
31
- def _get_settings_obj(settings_source: SettingsBase | Solver, cls_name: str):
32
- obj = _get_settings_root(settings_source)
33
- path = DATA[cls_name][1]
31
+ def _get_settings_obj(settings_root, builtin_settings_obj):
32
+ builtin_cls_name = builtin_settings_obj.__class__.__name__
33
+ obj = settings_root
34
+ path = DATA[builtin_cls_name][1]
34
35
  if isinstance(path, dict):
35
36
  version = FluentVersion(obj.version)
36
37
  path = path.get(version)
37
38
  if path is None:
38
39
  raise RuntimeError(
39
- f"{cls_name} is not supported in Fluent version {version}."
40
+ f"{builtin_cls_name} is not supported in Fluent version {version}."
40
41
  )
41
- for comp in path.split("."):
42
+ comps = path.split(".")
43
+ for i, comp in enumerate(comps):
42
44
  obj = SettingsBase.__getattribute__(obj, comp) # bypass InactiveObjectError
45
+ if i < len(comps) - 1 and isinstance(obj, NamedObject):
46
+ obj_name = getattr(builtin_settings_obj, comp)
47
+ obj = obj[obj_name]
43
48
  return obj
44
49
 
45
50
 
46
51
  class _SingletonSetting:
47
52
  # Covers both groups and named-object containers
48
- def __init__(self, settings_source: SettingsBase | Solver | None = None):
49
- self.__dict__.update(dict(settings_source=None))
53
+ def __init__(self, settings_source: SettingsBase | Solver | None = None, **kwargs):
54
+ self.__dict__.update(dict(settings_source=None) | kwargs)
50
55
  if settings_source is not None:
51
56
  self.settings_source = settings_source
52
57
 
53
58
  def __setattr__(self, name, value):
54
59
  if name == "settings_source":
55
- obj = _get_settings_obj(value, self.__class__.__name__)
60
+ settings_root = _get_settings_root(value)
61
+ obj = _get_settings_obj(settings_root, self)
56
62
  self.__class__ = obj.__class__
57
63
  self.__dict__.clear()
58
- self.__dict__.update(
59
- obj.__dict__ | dict(settings_source=_get_settings_root(value))
60
- )
64
+ self.__dict__.update(obj.__dict__ | dict(settings_source=settings_root))
61
65
  else:
62
66
  super().__setattr__(name, value)
63
67
 
64
68
 
65
69
  class _NonCreatableNamedObjectSetting:
66
- def __init__(self, name: str, settings_source: SettingsBase | Solver | None = None):
67
- self.__dict__.update(dict(settings_source=None, name=name))
70
+ def __init__(
71
+ self, name: str, settings_source: SettingsBase | Solver | None = None, **kwargs
72
+ ):
73
+ self.__dict__.update(dict(settings_source=None, name=name) | kwargs)
68
74
  if settings_source is not None:
69
75
  self.settings_source = settings_source
70
76
 
71
77
  def __setattr__(self, name, value):
72
78
  if name == "settings_source":
73
- obj = _get_settings_obj(value, self.__class__.__name__)
79
+ settings_root = _get_settings_root(value)
80
+ obj = _get_settings_obj(settings_root, self)
74
81
  obj = obj[self.name]
75
82
  self.__class__ = obj.__class__
76
83
  self.__dict__.clear()
77
- self.__dict__.update(
78
- obj.__dict__ | dict(settings_source=_get_settings_root(value))
79
- )
84
+ self.__dict__.update(obj.__dict__ | dict(settings_source=settings_root))
80
85
  else:
81
86
  super().__setattr__(name, value)
82
87
 
@@ -87,18 +92,21 @@ class _CreatableNamedObjectSetting:
87
92
  settings_source: SettingsBase | Solver | None = None,
88
93
  name: str | None = None,
89
94
  new_instance_name: str | None = None,
95
+ **kwargs,
90
96
  ):
91
97
  if name and new_instance_name:
92
98
  raise ValueError("Cannot specify both name and new_instance_name.")
93
99
  self.__dict__.update(
94
100
  dict(settings_source=None, name=name, new_instance_name=new_instance_name)
101
+ | kwargs
95
102
  )
96
103
  if settings_source is not None:
97
104
  self.settings_source = settings_source
98
105
 
99
106
  def __setattr__(self, name, value):
100
107
  if name == "settings_source":
101
- obj = _get_settings_obj(value, self.__class__.__name__)
108
+ settings_root = _get_settings_root(value)
109
+ obj = _get_settings_obj(settings_root, self)
102
110
  if self.name:
103
111
  obj = obj[self.name]
104
112
  elif self.new_instance_name:
@@ -107,8 +115,6 @@ class _CreatableNamedObjectSetting:
107
115
  obj = obj.create()
108
116
  self.__class__ = obj.__class__
109
117
  self.__dict__.clear()
110
- self.__dict__.update(
111
- obj.__dict__ | dict(settings_source=_get_settings_root(value))
112
- )
118
+ self.__dict__.update(obj.__dict__ | dict(settings_source=settings_root))
113
119
  else:
114
120
  super().__setattr__(name, value)