ansys-fluent-core 0.29.dev3__py3-none-any.whl → 0.30.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 (144) hide show
  1. ansys/fluent/core/__init__.py +26 -1
  2. ansys/fluent/core/_stand_alone_datamodel_client/_datamodel_client.py +22 -0
  3. ansys/fluent/core/_version.py +23 -1
  4. ansys/fluent/core/codegen/__init__.py +22 -0
  5. ansys/fluent/core/codegen/allapigen.py +38 -5
  6. ansys/fluent/core/codegen/builtin_settingsgen.py +22 -0
  7. ansys/fluent/core/codegen/data/__init__.py +21 -0
  8. ansys/fluent/core/codegen/data/fluent_gui_help_patch.py +22 -0
  9. ansys/fluent/core/codegen/data/meshing_utilities_examples.py +22 -0
  10. ansys/fluent/core/codegen/datamodelgen.py +40 -4
  11. ansys/fluent/core/codegen/print_fluent_version.py +22 -0
  12. ansys/fluent/core/codegen/settingsgen.py +67 -4
  13. ansys/fluent/core/codegen/tuigen.py +43 -5
  14. ansys/fluent/core/codegen/walk_api.py +22 -0
  15. ansys/fluent/core/codegen/write_settings_yaml.py +22 -0
  16. ansys/fluent/core/data_model_cache.py +22 -0
  17. ansys/fluent/core/examples/__init__.py +22 -0
  18. ansys/fluent/core/examples/downloads.py +22 -0
  19. ansys/fluent/core/exceptions.py +22 -0
  20. ansys/fluent/core/file_session.py +22 -0
  21. ansys/fluent/core/filereader/__init__.py +21 -0
  22. ansys/fluent/core/filereader/case_file.py +22 -0
  23. ansys/fluent/core/filereader/casereader.py +22 -0
  24. ansys/fluent/core/filereader/data_file.py +22 -0
  25. ansys/fluent/core/filereader/lispy.py +22 -0
  26. ansys/fluent/core/fluent_connection.py +23 -1
  27. ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
  28. ansys/fluent/core/generated/datamodel_252/meshing.py +31 -0
  29. ansys/fluent/core/generated/fluent_version_252.py +3 -3
  30. ansys/fluent/core/generated/solver/settings_222.py +0 -72
  31. ansys/fluent/core/generated/solver/settings_222.pyi +0 -307
  32. ansys/fluent/core/generated/solver/settings_231.py +0 -574
  33. ansys/fluent/core/generated/solver/settings_231.pyi +0 -561
  34. ansys/fluent/core/generated/solver/settings_232.py +0 -527
  35. ansys/fluent/core/generated/solver/settings_232.pyi +0 -2803
  36. ansys/fluent/core/generated/solver/settings_241.py +0 -478
  37. ansys/fluent/core/generated/solver/settings_241.pyi +0 -522
  38. ansys/fluent/core/generated/solver/settings_242.py +0 -361
  39. ansys/fluent/core/generated/solver/settings_242.pyi +0 -591
  40. ansys/fluent/core/generated/solver/settings_251.py +0 -399
  41. ansys/fluent/core/generated/solver/settings_251.pyi +0 -629
  42. ansys/fluent/core/generated/solver/settings_252.py +7626 -4108
  43. ansys/fluent/core/generated/solver/settings_252.pyi +6779 -3098
  44. ansys/fluent/core/generated/solver/tui_252.py +489 -157
  45. ansys/fluent/core/get_build_details.py +22 -0
  46. ansys/fluent/core/journaling.py +38 -0
  47. ansys/fluent/core/launcher/__init__.py +22 -0
  48. ansys/fluent/core/launcher/container_launcher.py +63 -55
  49. ansys/fluent/core/launcher/error_handler.py +22 -0
  50. ansys/fluent/core/launcher/fluent_container.py +23 -1
  51. ansys/fluent/core/launcher/launcher.py +51 -3
  52. ansys/fluent/core/launcher/launcher_utils.py +22 -0
  53. ansys/fluent/core/launcher/pim_launcher.py +120 -86
  54. ansys/fluent/core/launcher/process_launch_string.py +22 -0
  55. ansys/fluent/core/launcher/pyfluent_enums.py +22 -0
  56. ansys/fluent/core/launcher/server_info.py +22 -0
  57. ansys/fluent/core/launcher/slurm_launcher.py +23 -1
  58. ansys/fluent/core/launcher/standalone_launcher.py +68 -63
  59. ansys/fluent/core/launcher/watchdog.py +22 -0
  60. ansys/fluent/core/logging.py +22 -0
  61. ansys/fluent/core/meshing/meshing_workflow.py +22 -0
  62. ansys/fluent/core/parametric.py +22 -0
  63. ansys/fluent/core/post_objects/__init__.py +21 -0
  64. ansys/fluent/core/post_objects/check_in_notebook.py +22 -0
  65. ansys/fluent/core/post_objects/meta.py +22 -0
  66. ansys/fluent/core/post_objects/post_helper.py +22 -0
  67. ansys/fluent/core/post_objects/post_object_definitions.py +22 -0
  68. ansys/fluent/core/post_objects/post_objects_container.py +22 -0
  69. ansys/fluent/core/post_objects/singleton_meta.py +22 -0
  70. ansys/fluent/core/post_objects/timing_decorator.py +22 -0
  71. ansys/fluent/core/report.py +77 -0
  72. ansys/fluent/core/rpvars.py +22 -0
  73. ansys/fluent/core/scheduler/__init__.py +22 -0
  74. ansys/fluent/core/scheduler/load_machines.py +22 -0
  75. ansys/fluent/core/scheduler/machine_list.py +22 -0
  76. ansys/fluent/core/search.py +22 -0
  77. ansys/fluent/core/services/__init__.py +22 -0
  78. ansys/fluent/core/services/api_upgrade.py +22 -0
  79. ansys/fluent/core/services/app_utilities.py +38 -0
  80. ansys/fluent/core/services/batch_ops.py +22 -0
  81. ansys/fluent/core/services/datamodel_se.py +22 -2
  82. ansys/fluent/core/services/datamodel_tui.py +22 -0
  83. ansys/fluent/core/services/deprecated_field_data.py +23 -1
  84. ansys/fluent/core/services/events.py +22 -0
  85. ansys/fluent/core/services/field_data.py +46 -15
  86. ansys/fluent/core/services/health_check.py +22 -0
  87. ansys/fluent/core/services/interceptors.py +22 -0
  88. ansys/fluent/core/services/monitor.py +22 -0
  89. ansys/fluent/core/services/reduction.py +22 -0
  90. ansys/fluent/core/services/scheme_eval.py +22 -0
  91. ansys/fluent/core/services/settings.py +22 -0
  92. ansys/fluent/core/services/solution_variables.py +22 -0
  93. ansys/fluent/core/services/streaming.py +22 -0
  94. ansys/fluent/core/services/transcript.py +22 -0
  95. ansys/fluent/core/session.py +32 -0
  96. ansys/fluent/core/session_base_meshing.py +22 -0
  97. ansys/fluent/core/session_meshing.py +22 -0
  98. ansys/fluent/core/session_meshing.pyi +22 -0
  99. ansys/fluent/core/session_pure_meshing.py +22 -0
  100. ansys/fluent/core/session_pure_meshing.pyi +22 -0
  101. ansys/fluent/core/session_shared.py +22 -0
  102. ansys/fluent/core/session_solver.py +22 -0
  103. ansys/fluent/core/session_solver.pyi +22 -0
  104. ansys/fluent/core/session_solver_aero.py +22 -0
  105. ansys/fluent/core/session_solver_icing.py +22 -0
  106. ansys/fluent/core/session_solver_lite.py +22 -0
  107. ansys/fluent/core/solver/__init__.py +22 -0
  108. ansys/fluent/core/solver/error_message.py +22 -0
  109. ansys/fluent/core/solver/flobject.py +22 -0
  110. ansys/fluent/core/solver/flunits.py +22 -0
  111. ansys/fluent/core/solver/function/__init__.py +22 -0
  112. ansys/fluent/core/solver/function/reduction.py +22 -0
  113. ansys/fluent/core/solver/settings_builtin_bases.py +22 -0
  114. ansys/fluent/core/solver/settings_builtin_data.py +22 -0
  115. ansys/fluent/core/solver/settings_external.py +22 -0
  116. ansys/fluent/core/streaming_services/__init__.py +21 -0
  117. ansys/fluent/core/streaming_services/datamodel_event_streaming.py +22 -0
  118. ansys/fluent/core/streaming_services/datamodel_streaming.py +22 -0
  119. ansys/fluent/core/streaming_services/events_streaming.py +22 -0
  120. ansys/fluent/core/streaming_services/field_data_streaming.py +22 -0
  121. ansys/fluent/core/streaming_services/monitor_streaming.py +23 -1
  122. ansys/fluent/core/streaming_services/streaming.py +22 -0
  123. ansys/fluent/core/streaming_services/transcript_streaming.py +22 -0
  124. ansys/fluent/core/systemcoupling.py +22 -0
  125. ansys/fluent/core/utils/__init__.py +22 -0
  126. ansys/fluent/core/utils/data_transfer.py +22 -0
  127. ansys/fluent/core/utils/deprecate.py +24 -1
  128. ansys/fluent/core/utils/dictionary_operations.py +22 -0
  129. ansys/fluent/core/utils/dump_session_data.py +22 -0
  130. ansys/fluent/core/utils/event_loop.py +22 -0
  131. ansys/fluent/core/utils/execution.py +22 -0
  132. ansys/fluent/core/utils/file_transfer_service.py +22 -0
  133. ansys/fluent/core/utils/fix_doc.py +22 -0
  134. ansys/fluent/core/utils/fldoc.py +22 -0
  135. ansys/fluent/core/utils/fluent_version.py +22 -0
  136. ansys/fluent/core/utils/networking.py +22 -0
  137. ansys/fluent/core/utils/setup_for_fluent.py +22 -0
  138. ansys/fluent/core/warnings.py +22 -0
  139. ansys/fluent/core/workflow.py +22 -0
  140. {ansys_fluent_core-0.29.dev3.dist-info → ansys_fluent_core-0.30.dev0.dist-info}/LICENSE +8 -8
  141. {ansys_fluent_core-0.29.dev3.dist-info → ansys_fluent_core-0.30.dev0.dist-info}/METADATA +9 -7
  142. ansys_fluent_core-0.30.dev0.dist-info/RECORD +219 -0
  143. ansys_fluent_core-0.29.dev3.dist-info/RECORD +0 -218
  144. {ansys_fluent_core-0.29.dev3.dist-info → ansys_fluent_core-0.30.dev0.dist-info}/WHEEL +0 -0
@@ -1,3 +1,25 @@
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
+
1
23
  """A package providing Fluent's Solver and Meshing capabilities in Python."""
2
24
 
3
25
  import os
@@ -41,7 +63,7 @@ from ansys.fluent.core.warnings import ( # noqa: F401
41
63
  warning,
42
64
  )
43
65
 
44
- _VERSION_INFO = "Build date: January 21, 2025 13:40 UTC ShaID: b9aa6e9"
66
+ _VERSION_INFO = "Build date: February 07, 2025 15:50 UTC ShaID: 9ee1aa4"
45
67
  """Global variable indicating the version of the PyFluent package - Empty by default"""
46
68
 
47
69
  _THIS_DIRNAME = os.path.dirname(__file__)
@@ -140,3 +162,6 @@ LAUNCH_FLUENT_PORT = None
140
162
 
141
163
  # Skip password check during rpc execution when Fluent is launched from PyFluent
142
164
  LAUNCH_FLUENT_SKIP_PASSWORD_CHECK = False
165
+
166
+ # Set Fluent precision mode
167
+ FLUENT_PRECISION_MODE = None
@@ -1,3 +1,25 @@
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
+
1
23
  """Client side implementation of the stand-alone datamodel server."""
2
24
 
3
25
  from pathlib import Path
@@ -1,3 +1,25 @@
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
+
1
23
  """Version of ansys-fluent-core module.
2
24
 
3
25
  On the ``main`` branch, use 'dev0' to denote a development version.
@@ -6,7 +28,7 @@ version_info = 0, 1, 'dev0'
6
28
  """
7
29
 
8
30
  # major, minor, patch
9
- version_info = 0, 29, "dev3"
31
+ version_info = 0, 30, "dev0"
10
32
 
11
33
  # Nice string for the version
12
34
  __version__ = ".".join(map(str, version_info))
@@ -1,3 +1,25 @@
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
+
1
23
  """This module contains the code generation logic for Fluent's Python API."""
2
24
 
3
25
  from enum import Enum, auto
@@ -1,5 +1,28 @@
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
+
1
23
  """Module to generate Fluent API classes."""
2
24
 
25
+ import argparse
3
26
  import os
4
27
  from pathlib import Path
5
28
  import pickle
@@ -18,12 +41,12 @@ def _update_first_level(d, u):
18
41
  d[k].update(u.get(k, {}))
19
42
 
20
43
 
21
- def generate(version: str, static_infos: dict):
44
+ def generate(version: str, static_infos: dict, verbose: bool = False):
22
45
  """Generate Fluent API classes."""
23
46
  api_tree = {"<meshing_session>": {}, "<solver_session>": {}}
24
- _update_first_level(api_tree, tuigen.generate(version, static_infos))
25
- _update_first_level(api_tree, datamodelgen.generate(version, static_infos))
26
- _update_first_level(api_tree, settingsgen.generate(version, static_infos))
47
+ _update_first_level(api_tree, tuigen.generate(version, static_infos, verbose))
48
+ _update_first_level(api_tree, datamodelgen.generate(version, static_infos, verbose))
49
+ _update_first_level(api_tree, settingsgen.generate(version, static_infos, verbose))
27
50
  api_tree_file = get_api_tree_file_name(version)
28
51
  Path(api_tree_file).parent.mkdir(parents=True, exist_ok=True)
29
52
  with open(api_tree_file, "wb") as f:
@@ -33,4 +56,14 @@ def generate(version: str, static_infos: dict):
33
56
 
34
57
 
35
58
  if __name__ == "__main__":
36
- generate()
59
+ parser = argparse.ArgumentParser(
60
+ description="A script to write Fluent API files with an optional verbose output."
61
+ )
62
+ parser.add_argument(
63
+ "-v",
64
+ "--verbose",
65
+ action="store_true",
66
+ help="Show paths of written Fluent API files.",
67
+ )
68
+ args = parser.parse_args()
69
+ generate(verbose=args.verbose)
@@ -1,3 +1,25 @@
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
+
1
23
  """Generate builtin setting classes."""
2
24
 
3
25
  from ansys.fluent.core import CODEGEN_OUTDIR, FluentVersion
@@ -0,0 +1,21 @@
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.
@@ -1,3 +1,25 @@
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
+
1
23
  """Module containing the corrected Fluent GUI help strings."""
2
24
 
3
25
  XML_HELP_PATCH = {
@@ -1,3 +1,25 @@
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
+
1
23
  """Module containing the meshing utility examples."""
2
24
 
3
25
  meshing_utility_examples = {
@@ -1,5 +1,28 @@
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
+
1
23
  """Module to generate Fluent datamodel API classes."""
2
24
 
25
+ import argparse
3
26
  from io import FileIO, StringIO
4
27
  import os
5
28
  from pathlib import Path
@@ -153,10 +176,11 @@ class DataModelStaticInfo:
153
176
  class DataModelGenerator:
154
177
  """Provides the datamodel API class generator."""
155
178
 
156
- def __init__(self, version, static_infos: dict):
179
+ def __init__(self, version, static_infos: dict, verbose: bool = False):
157
180
  self.version = version
158
181
  self._server_static_infos = static_infos
159
182
  self._static_info: Dict[str, DataModelStaticInfo] = {}
183
+ self._verbose = verbose
160
184
  if StaticInfoType.DATAMODEL_WORKFLOW in static_infos:
161
185
  self._static_info["workflow"] = DataModelStaticInfo(
162
186
  StaticInfoType.DATAMODEL_WORKFLOW,
@@ -402,6 +426,8 @@ class DataModelGenerator:
402
426
  """Write API classes to files."""
403
427
  api_tree = {"<meshing_session>": {}, "<solver_session>": {}}
404
428
  for name, info in self._static_info.items():
429
+ if self._verbose:
430
+ print(f"{str(info.file_name)}")
405
431
  if info.static_info is None:
406
432
  continue
407
433
  with open(info.file_name, "w", encoding="utf8") as f:
@@ -438,9 +464,9 @@ class DataModelGenerator:
438
464
  shutil.rmtree(Path(_SOLVER_DM_DOC_DIR))
439
465
 
440
466
 
441
- def generate(version, static_infos: dict):
467
+ def generate(version, static_infos: dict, verbose: bool = False):
442
468
  """Generate datamodel API classes."""
443
- return DataModelGenerator(version, static_infos).write_static_info()
469
+ return DataModelGenerator(version, static_infos, verbose).write_static_info()
444
470
 
445
471
 
446
472
  if __name__ == "__main__":
@@ -476,4 +502,14 @@ if __name__ == "__main__":
476
502
  static_infos[StaticInfoType.DATAMODEL_MESHING_UTILITIES] = (
477
503
  meshing._datamodel_service_se.get_static_info("MeshingUtilities")
478
504
  )
479
- generate(version, static_infos)
505
+ parser = argparse.ArgumentParser(
506
+ description="A script to write Fluent API files with an optional verbose output."
507
+ )
508
+ parser.add_argument(
509
+ "-v",
510
+ "--verbose",
511
+ action="store_true",
512
+ help="Show paths of written Fluent API files.",
513
+ )
514
+ args = parser.parse_args()
515
+ generate(version, static_infos, args.verbose)
@@ -1,3 +1,25 @@
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
+
1
23
  """Module to write Fluent version information."""
2
24
 
3
25
  from ansys.fluent.core import CODEGEN_OUTDIR, FluentVersion, launch_fluent
@@ -1,5 +1,28 @@
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
+
1
23
  """Module to generate the classes corresponding to the Fluent settings API."""
2
24
 
25
+ import argparse
3
26
  import hashlib
4
27
  from io import StringIO
5
28
  import keyword
@@ -58,12 +81,39 @@ def _construct_bases_stub(original_bases, child_object_name):
58
81
  return bases
59
82
 
60
83
 
84
+ def strip_parameters(docstring: str) -> str:
85
+ """
86
+ Strips everything from the 'Parameters' section onwards in the given docstring.
87
+
88
+ Parameters
89
+ ----------
90
+ docstring: str
91
+ The original docstring to process.
92
+
93
+ Returns
94
+ -------
95
+ The modified docstring with the 'Parameters' section removed.
96
+ """
97
+ lines = docstring.strip().splitlines()
98
+ filtered_lines = []
99
+
100
+ for line in lines:
101
+ if line.strip().startswith("Parameters"):
102
+ break
103
+ filtered_lines.append(line)
104
+
105
+ return "\n".join(filtered_lines).strip()
106
+
107
+
61
108
  def _populate_data(cls, api_tree: dict, version: str) -> dict:
62
109
  data = {}
63
110
  data["version"] = version
64
111
  data["name"] = cls.__name__
65
112
  data["bases"] = [base.__name__ for base in cls.__bases__]
66
- data["doc"] = fix_settings_doc(cls.__doc__)
113
+ if "command" in cls.__doc__:
114
+ data["doc"] = strip_parameters(cls.__doc__)
115
+ else:
116
+ data["doc"] = fix_settings_doc(cls.__doc__)
67
117
  data["fluent_name"] = getattr(cls, "fluent_name")
68
118
  data["child_names"] = getattr(cls, "child_names", [])
69
119
  command_names = getattr(cls, "command_names", [])
@@ -261,7 +311,7 @@ def _write_data(cls_name: str, python_name: str, data: dict, f: IO, f_stub: IO |
261
311
  f_stub.write(s_stub.getvalue())
262
312
 
263
313
 
264
- def generate(version: str, static_infos: dict) -> None:
314
+ def generate(version: str, static_infos: dict, verbose: bool = False) -> None:
265
315
  """Generate the classes corresponding to the Fluent settings API."""
266
316
  start_time = time.time()
267
317
  api_tree = {}
@@ -279,6 +329,9 @@ def generate(version: str, static_infos: dict) -> None:
279
329
  data = _populate_data(cls, api_tree, version)
280
330
  _NAME_BY_HASH.clear()
281
331
  _CLASS_WRITTEN.clear()
332
+ if verbose:
333
+ print(f"{str(output_file)}")
334
+ print(f"{str(output_stub_file)}")
282
335
  with open(output_file, "w") as f, open(output_stub_file, "w") as f_stub:
283
336
  header = StringIO()
284
337
  header.write("#\n")
@@ -302,7 +355,7 @@ def generate(version: str, static_infos: dict) -> None:
302
355
  file_size = output_file.stat().st_size / 1024 / 1024
303
356
  file_size_stub = output_stub_file.stat().st_size / 1024 / 1024
304
357
  print(
305
- f"Generated {output_file.name} and {output_stub_file.name} in {time.time() - start_time:.2f} seconds."
358
+ f"\nGenerated {output_file.name} and {output_stub_file.name} in {time.time() - start_time:.2f} seconds."
306
359
  )
307
360
  print(f"{output_file.name} size: {file_size:.2f} MB")
308
361
  print(f"{output_stub_file.name} size: {file_size_stub:.2f} MB")
@@ -316,4 +369,14 @@ if __name__ == "__main__":
316
369
  # version = "251"
317
370
  # static_info = pickle.load(open("static_info.pkl", "rb"))
318
371
  static_infos = {StaticInfoType.SETTINGS: static_info}
319
- generate(version, static_infos)
372
+ parser = argparse.ArgumentParser(
373
+ description="A script to write Fluent API files with an optional verbose output."
374
+ )
375
+ parser.add_argument(
376
+ "-v",
377
+ "--verbose",
378
+ action="store_true",
379
+ help="Show paths of written Fluent API files.",
380
+ )
381
+ args = parser.parse_args()
382
+ generate(version, static_infos, args.verbose)
@@ -1,3 +1,25 @@
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
+
1
23
  """Provide a module to generate explicit Fluent TUI menu classes.
2
24
 
3
25
  This module starts up Fluent and calls the underlying gRPC APIs to generate the
@@ -12,6 +34,7 @@ Usage
12
34
  `python codegen/tuigen.py`
13
35
  """
14
36
 
37
+ import argparse
15
38
  import logging
16
39
  import os
17
40
  from pathlib import Path
@@ -176,7 +199,9 @@ class _RenameModuleUnpickler(pickle.Unpickler):
176
199
  class TUIGenerator:
177
200
  """Generates explicit TUI menu classes."""
178
201
 
179
- def __init__(self, mode: str, version: str, static_infos: dict):
202
+ def __init__(
203
+ self, mode: str, version: str, static_infos: dict, verbose: bool = False
204
+ ):
180
205
  self._mode = mode
181
206
  self._version = version
182
207
  self._tui_file = _get_tui_filepath(mode, version)
@@ -189,6 +214,7 @@ class TUIGenerator:
189
214
  shutil.rmtree(Path(self._tui_doc_dir))
190
215
  self._main_menu = _TUIMenu([], "")
191
216
  self._static_infos = static_infos
217
+ self._verbose = verbose
192
218
 
193
219
  def _populate_menu(self, menu: _TUIMenu, info: Dict[str, Any]):
194
220
  for child_menu_name, child_menu_info in sorted(info["menus"].items()):
@@ -260,6 +286,8 @@ class TUIGenerator:
260
286
  """Generate TUI API classes."""
261
287
  api_tree = {}
262
288
  Path(self._tui_file).parent.mkdir(exist_ok=True)
289
+ if self._verbose:
290
+ print(f"{str(self._tui_file)}")
263
291
  with open(self._tui_file, "w", encoding="utf8") as self.__writer:
264
292
  if FluentVersion(self._version) == FluentVersion.v222:
265
293
  with open(
@@ -298,7 +326,7 @@ class TUIGenerator:
298
326
  return api_tree
299
327
 
300
328
 
301
- def generate(version, static_infos: dict):
329
+ def generate(version, static_infos: dict, verbose: bool = False):
302
330
  """Generate TUI API classes."""
303
331
  api_tree = {}
304
332
  gt_222 = FluentVersion(version) > FluentVersion.v222
@@ -312,11 +340,11 @@ def generate(version, static_infos: dict):
312
340
  _populate_xml_helpstrings()
313
341
  if not gt_222 or StaticInfoType.TUI_MESHING in static_infos:
314
342
  api_tree["<meshing_session>"] = TUIGenerator(
315
- "meshing", version, static_infos
343
+ "meshing", version, static_infos, verbose
316
344
  ).generate()
317
345
  if not gt_222 or StaticInfoType.TUI_SOLVER in static_infos:
318
346
  api_tree["<solver_session>"] = TUIGenerator(
319
- "solver", version, static_infos
347
+ "solver", version, static_infos, verbose
320
348
  ).generate()
321
349
  if os.getenv("PYFLUENT_HIDE_LOG_SECRETS") != "1":
322
350
  logger.info(
@@ -340,4 +368,14 @@ if __name__ == "__main__":
340
368
  static_infos[StaticInfoType.TUI_MESHING] = (
341
369
  meshing._datamodel_service_tui.get_static_info("")
342
370
  )
343
- generate(version, static_infos)
371
+ parser = argparse.ArgumentParser(
372
+ description="A script to write Fluent API files with an optional verbose output."
373
+ )
374
+ parser.add_argument(
375
+ "-v",
376
+ "--verbose",
377
+ action="store_true",
378
+ help="Show paths of written Fluent API files.",
379
+ )
380
+ args = parser.parse_args()
381
+ generate(version, static_infos, args.verbose)
@@ -1,3 +1,25 @@
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
+
1
23
  """Module containing tool for walking (generated) API class hierarchy.
2
24
 
3
25
  Example
@@ -1,3 +1,25 @@
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
+
1
23
  """Utility to write YAML file for the current settings hierarchy.
2
24
 
3
25
  Usage: