ansys-fluent-core 0.28.2__py3-none-any.whl → 0.29.dev1__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 (103) hide show
  1. ansys/fluent/core/__init__.py +1 -1
  2. ansys/fluent/core/_version.py +2 -2
  3. ansys/fluent/core/codegen/tuigen.py +1 -1
  4. ansys/fluent/core/codegen/walk_api.py +45 -18
  5. ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
  6. ansys/fluent/core/generated/datamodel_252/meshing.py +1 -0
  7. ansys/fluent/core/generated/fluent_version_252.py +3 -3
  8. ansys/fluent/core/generated/solver/settings_252.py +251 -160
  9. ansys/fluent/core/generated/solver/settings_252.pyi +146 -54
  10. ansys/fluent/core/generated/solver/tui_252.py +48 -24
  11. ansys/fluent/core/launcher/container_launcher.py +4 -3
  12. ansys/fluent/core/launcher/fluent_container.py +22 -19
  13. ansys/fluent/core/launcher/launcher.py +2 -2
  14. ansys/fluent/core/launcher/pim_launcher.py +2 -2
  15. ansys/fluent/core/launcher/slurm_launcher.py +2 -2
  16. ansys/fluent/core/launcher/standalone_launcher.py +2 -2
  17. ansys/fluent/core/logging.py +2 -0
  18. ansys/fluent/core/logging_config.yaml +3 -0
  19. ansys/fluent/core/services/datamodel_se.py +4 -1
  20. ansys/fluent/core/services/field_data.py +252 -0
  21. ansys/fluent/core/services/interceptors.py +28 -2
  22. ansys/fluent/core/session.py +7 -2
  23. ansys/fluent/core/session_solver.py +21 -0
  24. {ansys_fluent_core-0.28.2.dist-info → ansys_fluent_core-0.29.dev1.dist-info}/LICENSE +1 -1
  25. {ansys_fluent_core-0.28.2.dist-info → ansys_fluent_core-0.29.dev1.dist-info}/METADATA +53 -32
  26. {ansys_fluent_core-0.28.2.dist-info → ansys_fluent_core-0.29.dev1.dist-info}/RECORD +61 -137
  27. {ansys_fluent_core-0.28.2.dist-info → ansys_fluent_core-0.29.dev1.dist-info}/WHEEL +1 -1
  28. ansys/fluent/core/docs/README.rst +0 -155
  29. ansys/fluent/tests/conftest.py +0 -415
  30. ansys/fluent/tests/fluent_fixtures.py +0 -195
  31. ansys/fluent/tests/integration/test_optislang/test_optislang_integration.py +0 -263
  32. ansys/fluent/tests/parametric/test_local_parametric_run.py +0 -36
  33. ansys/fluent/tests/parametric/test_local_parametric_setup.py +0 -34
  34. ansys/fluent/tests/parametric/test_parametric_workflow.py +0 -279
  35. ansys/fluent/tests/test_aero_session.py +0 -88
  36. ansys/fluent/tests/test_batch_ops.py +0 -39
  37. ansys/fluent/tests/test_builtin_settings.py +0 -761
  38. ansys/fluent/tests/test_cad_to_post_ftm.py +0 -525
  39. ansys/fluent/tests/test_cad_to_post_wtm.py +0 -250
  40. ansys/fluent/tests/test_casereader.py +0 -324
  41. ansys/fluent/tests/test_codegen.py +0 -783
  42. ansys/fluent/tests/test_creatable.py +0 -31
  43. ansys/fluent/tests/test_data_model_cache.py +0 -434
  44. ansys/fluent/tests/test_datamodel_api.py +0 -429
  45. ansys/fluent/tests/test_datamodel_service.py +0 -814
  46. ansys/fluent/tests/test_datareader.py +0 -103
  47. ansys/fluent/tests/test_error_handling.py +0 -24
  48. ansys/fluent/tests/test_events_manager.py +0 -214
  49. ansys/fluent/tests/test_field_data.py +0 -466
  50. ansys/fluent/tests/test_file_session.py +0 -355
  51. ansys/fluent/tests/test_file_transfer_service.py +0 -165
  52. ansys/fluent/tests/test_fix_doc.py +0 -29
  53. ansys/fluent/tests/test_flobject.py +0 -1235
  54. ansys/fluent/tests/test_fluent_fixes.py +0 -106
  55. ansys/fluent/tests/test_fluent_session.py +0 -270
  56. ansys/fluent/tests/test_fluent_version.py +0 -66
  57. ansys/fluent/tests/test_fluent_version_marker.py +0 -65
  58. ansys/fluent/tests/test_icing_session.py +0 -9
  59. ansys/fluent/tests/test_launcher.py +0 -529
  60. ansys/fluent/tests/test_launcher_remote.py +0 -272
  61. ansys/fluent/tests/test_lispy.py +0 -40
  62. ansys/fluent/tests/test_logging.py +0 -16
  63. ansys/fluent/tests/test_mapped_api.py +0 -766
  64. ansys/fluent/tests/test_meshing_utilities.py +0 -2436
  65. ansys/fluent/tests/test_meshing_workflow.py +0 -421
  66. ansys/fluent/tests/test_meshingmode/test_meshing_launch.py +0 -168
  67. ansys/fluent/tests/test_new_meshing_workflow.py +0 -1801
  68. ansys/fluent/tests/test_preferences.py +0 -89
  69. ansys/fluent/tests/test_pure_mesh_vs_mesh_workflow.py +0 -101
  70. ansys/fluent/tests/test_reduction.py +0 -484
  71. ansys/fluent/tests/test_rp_vars.py +0 -77
  72. ansys/fluent/tests/test_scheduler.py +0 -471
  73. ansys/fluent/tests/test_scheme_eval_222.py +0 -338
  74. ansys/fluent/tests/test_scheme_eval_231.py +0 -243
  75. ansys/fluent/tests/test_search.py +0 -344
  76. ansys/fluent/tests/test_session.py +0 -594
  77. ansys/fluent/tests/test_settings_api.py +0 -606
  78. ansys/fluent/tests/test_settings_reader.py +0 -85
  79. ansys/fluent/tests/test_slurm_future.py +0 -67
  80. ansys/fluent/tests/test_solution_variables.py +0 -241
  81. ansys/fluent/tests/test_solver_monitors.py +0 -83
  82. ansys/fluent/tests/test_solvermode/boundaries_periodic_expDict +0 -1712
  83. ansys/fluent/tests/test_solvermode/test_boundaries.py +0 -127
  84. ansys/fluent/tests/test_solvermode/test_calculationactivities.py +0 -20
  85. ansys/fluent/tests/test_solvermode/test_controls.py +0 -131
  86. ansys/fluent/tests/test_solvermode/test_general.py +0 -109
  87. ansys/fluent/tests/test_solvermode/test_initialization.py +0 -83
  88. ansys/fluent/tests/test_solvermode/test_materials.py +0 -40
  89. ansys/fluent/tests/test_solvermode/test_methods.py +0 -65
  90. ansys/fluent/tests/test_solvermode/test_models.py +0 -99
  91. ansys/fluent/tests/test_solvermode/test_named_expressions.py +0 -35
  92. ansys/fluent/tests/test_solvermode/test_post_vector.py +0 -22
  93. ansys/fluent/tests/test_solvermode/test_species_model.py +0 -67
  94. ansys/fluent/tests/test_streaming_services.py +0 -52
  95. ansys/fluent/tests/test_systemcoupling.py +0 -44
  96. ansys/fluent/tests/test_topy.py +0 -179
  97. ansys/fluent/tests/test_tui_api.py +0 -70
  98. ansys/fluent/tests/test_type_stub.py +0 -37
  99. ansys/fluent/tests/test_utils.py +0 -82
  100. ansys/fluent/tests/util/__init__.py +0 -36
  101. ansys/fluent/tests/util/meshing_workflow.py +0 -33
  102. ansys/fluent/tests/util/solver.py +0 -72
  103. ansys_fluent_core-0.28.2.dist-info/AUTHORS +0 -12
@@ -1,77 +0,0 @@
1
- import pytest
2
-
3
- from ansys.fluent.core.examples import download_file, path
4
- from ansys.fluent.core.filereader.casereader import CaseReader
5
-
6
-
7
- def test_get_and_set_rp_vars(new_solver_session) -> None:
8
- case_path = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer")
9
- solver = new_solver_session
10
- solver.tui.file.read_case(case_path)
11
- rp_vars = solver.rp_vars
12
-
13
- # simple integer
14
- iter_count = 54321
15
- rp_vars("number-of-iterations", iter_count)
16
- assert iter_count == rp_vars("number-of-iterations")
17
-
18
- # complex list structure
19
- before_init_mod = rp_vars("strategy/solution-strategy/before-init-modification")
20
- assert before_init_mod[1][1][1] == ("value", False)
21
- before_init_mod[1][1][1] = ("value", True)
22
- rp_vars("strategy/solution-strategy/before-init-modification", before_init_mod)
23
- before_init_mod_2 = rp_vars("strategy/solution-strategy/before-init-modification")
24
- assert before_init_mod_2[1][1][1] == ("value", True)
25
-
26
-
27
- @pytest.mark.fluent_version(">=23.1, !=24.1")
28
- def test_get_all_rp_vars(new_solver_session) -> None:
29
- case_path = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer")
30
- solver = new_solver_session
31
- solver.tui.file.read_case(case_path)
32
- rp_vars = solver.rp_vars
33
- # all vars
34
- all_vars = rp_vars()
35
- assert len(all_vars) == pytest.approx(9000, 10)
36
-
37
- # refresh
38
- solver.file.write(file_type="case", file_name=case_path)
39
- solver.tui.file.read_case(case_path)
40
-
41
- # all vars again
42
- all_vars = rp_vars()
43
- assert len(all_vars) == pytest.approx(9000, 20)
44
-
45
- # CaseFile comparison, note that the PyFluent work dir is not necessarily the same as the Fluent work dir
46
- case = CaseReader(case_file_name=path(case_path))
47
- case_vars = case.rp_vars()
48
- assert len(case_vars) == pytest.approx(9000, 450)
49
-
50
-
51
- @pytest.mark.fluent_version(">=23.2")
52
- def test_rp_vars_allowed_values(new_solver_session) -> None:
53
- solver = new_solver_session
54
- rp_vars = solver.rp_vars
55
-
56
- assert rp_vars("number-of-iterations") == 0
57
-
58
- with pytest.raises(RuntimeError):
59
- rp_vars("number-of-iterat")
60
-
61
- assert "number-of-iterations" in rp_vars.allowed_values()
62
-
63
-
64
- @pytest.mark.fluent_version(">=23.2")
65
- def test_rp_vars_boolean(new_solver_session) -> None:
66
- solver = new_solver_session
67
-
68
- var_name = "rp-lam?"
69
- rp_vars = solver.rp_vars
70
-
71
- var_val = rp_vars(var_name)
72
- assert isinstance(var_val, bool)
73
-
74
- for i in range(10):
75
- var_val = not var_val
76
- rp_vars(var_name, var_val)
77
- assert rp_vars(var_name) == var_val
@@ -1,471 +0,0 @@
1
- """Provide a module to test the algorithms which parse job scheduler environments for
2
- machines to run on."""
3
-
4
- from builtins import range
5
- import os
6
- import socket
7
- import tempfile
8
- import unittest
9
-
10
- from ansys.fluent.core.scheduler import build_parallel_options
11
- from ansys.fluent.core.scheduler.load_machines import (
12
- _construct_machine_list_slurm,
13
- _parse_host_info,
14
- _parse_machine_data,
15
- _restrict_machines_to_core_count,
16
- load_machines,
17
- )
18
- from ansys.fluent.core.scheduler.machine_list import Machine, MachineList
19
-
20
-
21
- class TestMachine(unittest.TestCase):
22
- """A basic test that checks Machine object behavior."""
23
-
24
- def setUp(self):
25
- pass
26
-
27
- def tearDown(self):
28
- pass
29
-
30
- def test_initialize_host(self):
31
- """Test that a Machine initializes as expected."""
32
- machine = Machine("machine", 20)
33
- self.assertEqual(machine.host_name, "machine")
34
- self.assertEqual(machine.number_of_cores, 20)
35
- self.assertEqual(machine.queue_name, None)
36
- self.assertEqual(machine.core_list, None)
37
-
38
- def test_modify_host(self):
39
- """Test that a Machine can be modified."""
40
- machine = Machine("machine", 20, "allq", "0:0")
41
- machine.number_of_cores = 12
42
- self.assertEqual(machine.number_of_cores, 12)
43
- machine.number_of_cores = machine.number_of_cores + 2
44
- machine.number_of_cores += 1
45
- self.assertEqual(machine.number_of_cores, 15)
46
- machine.number_of_cores -= 3
47
- self.assertEqual(machine.number_of_cores, 12)
48
-
49
-
50
- class TestMachineList(unittest.TestCase):
51
- """Provide a test suite that checks that the MachineList object behaves properly."""
52
-
53
- def setUp(self):
54
- self._machineList = MachineList()
55
-
56
- def tearDown(self):
57
- self._machineList.reset()
58
-
59
- def test_initialize_machinelist(self):
60
- """Tests that a host file object initializes properly."""
61
- newMachineFile = MachineList()
62
- self.assertIsInstance(newMachineFile, MachineList)
63
- self.assertEqual(newMachineFile.machines, [])
64
- self.assertEqual(newMachineFile.num_machines, 0)
65
-
66
- def test_copy_machinelist(self):
67
- """Tests that the internal copy function works properly."""
68
- import copy
69
-
70
- newMachineList = copy.deepcopy(self._machineList)
71
- for m1, m2 in zip(self._machineList.machines, newMachineList.machines):
72
- self.assertEqual(m1.host_name, m2.host_name)
73
- self.assertEqual(m1.number_of_cores, m2.number_of_cores)
74
-
75
- def test_add_to_machinelist(self):
76
- """Tests that a machines can be added to a machine list."""
77
- self._machineList.add(Machine("machine1", 20, "allq", "0:0"))
78
- self._machineList.add(Machine("machine2", 20, "allq", "0:0"))
79
- self.assertEqual(self._machineList.num_machines, 2)
80
-
81
- def test_number_of_cores_and_machines(self):
82
- """Test that the total and max number of cores and machines is working."""
83
- self._machineList.add(Machine("machine1", 20, "allq", "0:0"))
84
- self._machineList.add(Machine("machine2", 25, "allq", "0:0"))
85
- self._machineList.add(Machine("machine3", 15, "allq", "0:0"))
86
- self.assertEqual(self._machineList.num_machines, 3)
87
- self.assertEqual(self._machineList.number_of_cores, 60)
88
- self.assertEqual(self._machineList.max_cores, 25)
89
- self.assertEqual(self._machineList.min_cores, 15)
90
-
91
- def test_sort_machine_list(self):
92
- """Test that the machines are sorted in order of decreasing core count."""
93
- self._machineList.add(Machine("machine1", 15, "allq", "0:0"))
94
- self._machineList.add(Machine("machine2", 10, "allq", "0:0"))
95
- self._machineList.add(Machine("machine3", 5, "allq", "0:0"))
96
-
97
- # Sort in ascending order
98
- self._machineList.sort_by_core_count_ascending()
99
- numCores = self._machineList.machines[0].number_of_cores
100
- for h in range(1, len(self._machineList.machines)):
101
- self.assertLessEqual(
102
- numCores, self._machineList.machines[h].number_of_cores
103
- )
104
- numCores = self._machineList.machines[h].number_of_cores
105
-
106
- # Sort in descending order
107
- self._machineList.sort_by_core_count()
108
- numCores = self._machineList.machines[0].number_of_cores
109
- for h in range(1, len(self._machineList.machines)):
110
- self.assertLessEqual(
111
- self._machineList.machines[h].number_of_cores, numCores
112
- )
113
- numCores = self._machineList.machines[h].number_of_cores
114
-
115
- def test_remote_empty_machines(self):
116
- self._machineList.add(Machine("machine1", 5))
117
- self._machineList.add(Machine("machine2", 0))
118
- self._machineList.remove_empty_machines()
119
- self.assertEqual(self._machineList.num_machines, 1)
120
- self.assertEqual(self._machineList.machines[0].host_name, "machine1")
121
-
122
- def test_move_local_host_to_front(self):
123
- import socket
124
-
125
- localHostName = socket.gethostname()
126
-
127
- self._machineList.add(Machine("M0", 2))
128
- self._machineList.add(Machine(localHostName, 1))
129
- self._machineList.add(Machine("M1", 3))
130
- self._machineList.move_local_host_to_front()
131
- self.assertEqual(self._machineList.machines[0].host_name, localHostName)
132
- self.assertEqual(self._machineList.machines[0].number_of_cores, 1)
133
- self.assertEqual(self._machineList.machines[1].host_name, "M0")
134
- self.assertEqual(self._machineList.machines[1].number_of_cores, 2)
135
- self.assertEqual(self._machineList.machines[2].host_name, "M1")
136
- self.assertEqual(self._machineList.machines[2].number_of_cores, 3)
137
-
138
- def test_deep_copy_machinelist(self):
139
- self._machineList.add(Machine("wathpc-2-0.local", 23))
140
- self._machineList.add(Machine("wathpc-2-1.local", 23))
141
- self._machineList.add(Machine("wathpc-2-2.local", 23))
142
- self._machineList.add(Machine("wathpc-2-3.local", 23))
143
- import copy
144
-
145
- machineListCopy = copy.deepcopy(self._machineList)
146
- for m1, m2 in zip(self._machineList.machines, machineListCopy.machines):
147
- self.assertEqual(m1.host_name, m2.host_name)
148
- self.assertEqual(m1.number_of_cores, m2.number_of_cores)
149
-
150
-
151
- class TestLoadMachines(unittest.TestCase):
152
- """Provide a test suite that checks that loadMachines behaves properly."""
153
-
154
- def setUp(self):
155
- self._machineList = MachineList()
156
-
157
- def tearDown(self):
158
- self._machineList.reset()
159
-
160
- def test_machine_info(self):
161
- info = [
162
- {"machine-name": "M0", "core-count": 1},
163
- {"machine-name": "M1", "core-count": 6},
164
- ]
165
- machineList = load_machines(machine_info=info)
166
- self.assertEqual(machineList.number_of_cores, 7)
167
-
168
- def test_restrict_machines(self):
169
- info = [
170
- {"machine-name": "M0", "core-count": 1},
171
- {"machine-name": "M1", "core-count": 1},
172
- ]
173
- machineList = load_machines(machine_info=info)
174
- old_machine_list = _restrict_machines_to_core_count(
175
- machineList, ncores=machineList.number_of_cores
176
- )
177
- self.assertEqual(machineList, old_machine_list)
178
-
179
- def test_pe_hostfile(self):
180
- with tempfile.NamedTemporaryFile(delete=False) as fp:
181
- fp.write(b"m1\r\n\r\nm2 3 None None\r\nm3 4\r\nm4 2 queueName1")
182
- os.environ["PE_HOSTFILE"] = fp.name
183
- machineList = load_machines()
184
- os.unlink(fp.name)
185
- self.assertEqual(machineList.number_of_cores, 10)
186
- self.assertEqual(machineList.machines[1].host_name, "m2")
187
- self.assertEqual(machineList.machines[2].number_of_cores, 4)
188
- self.assertEqual(machineList.machines[3].queue_name, "queueName1")
189
- del os.environ["PE_HOSTFILE"]
190
-
191
- def test_lsb_mcpu(self):
192
- os.environ["LSB_MCPU_HOSTS"] = "m1 3 m2 3"
193
- machineList = load_machines()
194
- self.assertEqual(machineList.number_of_cores, 6)
195
- del os.environ["LSB_MCPU_HOSTS"]
196
-
197
- def test_pbs_nodefile(self):
198
- with tempfile.NamedTemporaryFile(delete=False) as fp:
199
- fp.write(b"m1\r\n\r\nm2\r\nm2\r\nm2")
200
- os.environ["PBS_NODEFILE"] = fp.name
201
- machineList = load_machines()
202
- os.unlink(fp.name)
203
- self.assertEqual(machineList[1].number_of_cores, 3)
204
- del os.environ["PBS_NODEFILE"]
205
-
206
- def test_no_environment(self):
207
- machineList = load_machines()
208
- self.assertEqual(machineList[0].host_name, socket.gethostname())
209
- self.assertEqual(machineList.number_of_cores, 1)
210
-
211
- def test_no_environment_cores(self):
212
- machineList = load_machines(ncores=4)
213
- self.assertEqual(machineList[0].host_name, socket.gethostname())
214
- self.assertEqual(machineList.number_of_cores, 4)
215
-
216
- def test_constrain_machines1(self):
217
- machineList = load_machines(host_info="M0:2,M1:3,M2:2", ncores=4)
218
- expectedValue = {"M0": 1, "M1": 2, "M2": 1}
219
- self.assertEqual(len(machineList.machines), 3)
220
- for machine in machineList.machines:
221
- self.assertEqual(machine.number_of_cores, expectedValue[machine.host_name])
222
- # Ensure that the order is preserved
223
- self.assertEqual(machineList.machines[0].host_name, "M0")
224
- fluentOpts = build_parallel_options(machineList)
225
- self.assertEqual(fluentOpts, "-t4 -cnf=M0:1,M1:2,M2:1")
226
-
227
- def test_constrain_machines2(self):
228
- with tempfile.NamedTemporaryFile(delete=False) as fp:
229
- fp.write(b"M0:2,M1:3,M2:2")
230
- machineList = load_machines(host_info=fp.name, ncores=3)
231
- expectedValue = {"M0": 1, "M1": 1, "M2": 1}
232
- os.unlink(fp.name)
233
- self.assertEqual(len(machineList.machines), 3)
234
- for machine in machineList.machines:
235
- self.assertEqual(machine.number_of_cores, expectedValue[machine.host_name])
236
- # Ensure that the order is preserved
237
- self.assertEqual(machineList.machines[0].host_name, "M0")
238
- fluentOpts = build_parallel_options(machineList)
239
- self.assertEqual(fluentOpts, "-t3 -cnf=M0:1,M1:1,M2:1")
240
-
241
- def test_overload_machines1(self):
242
- machineList = load_machines(host_info="M0:2,M1:1", ncores=10)
243
- expectedValue = {"M0": 2, "M1": 1}
244
- self.assertEqual(len(machineList.machines), 2)
245
- for machine in machineList.machines:
246
- self.assertEqual(machine.number_of_cores, expectedValue[machine.host_name])
247
- # Ensure that the order is preserved
248
- self.assertEqual(machineList.machines[0].host_name, "M0")
249
- fluentOpts = build_parallel_options(machineList)
250
- self.assertEqual(fluentOpts, "-t3 -cnf=M0:2,M1:1")
251
-
252
- def test_overload_machines2(self):
253
- machineList = load_machines(host_info="M0,M0,M1", ncores=10)
254
- expectedValue = {"M0": 2, "M1": 1}
255
- self.assertEqual(len(machineList.machines), 2)
256
- for machine in machineList.machines:
257
- self.assertEqual(machine.number_of_cores, expectedValue[machine.host_name])
258
- # Ensure that the order is preserved
259
- self.assertEqual(machineList.machines[0].host_name, "M0")
260
- fluentOpts = build_parallel_options(machineList)
261
- self.assertEqual(fluentOpts, "-t3 -cnf=M0:2,M1:1")
262
-
263
- def test_winhpc(self):
264
- os.environ["CCP_NODES"] = "3 M0 8 M1 8 M2 16"
265
- machineList = load_machines()
266
- self.assertEqual(machineList.num_machines, 3)
267
- self.assertEqual(machineList.number_of_cores, 32)
268
- self.assertEqual(machineList.machines[0].host_name, "M0")
269
- self.assertEqual(machineList.machines[1].host_name, "M1")
270
- self.assertEqual(machineList.machines[2].host_name, "M2")
271
- fluentOpts = build_parallel_options(machineList)
272
- self.assertEqual(fluentOpts, "-t32 -cnf=M0:8,M1:8,M2:16")
273
- del os.environ["CCP_NODES"]
274
-
275
- def test_slurm_single_num(self):
276
- os.environ["SLURM_JOB_NODELIST"] = "M[1-2],M[3]"
277
- os.environ["SLURM_TASKS_PER_NODE"] = "8,10(x2)"
278
- hostList = os.environ.get("SLURM_JOB_NODELIST")
279
- machineList = _construct_machine_list_slurm(hostList)
280
- self.assertEqual(machineList[1].number_of_cores, 10)
281
- self.assertEqual(machineList[2].number_of_cores, 10)
282
- self.assertEqual(machineList[2].host_name, "M3")
283
- del os.environ["SLURM_JOB_NODELIST"]
284
- del os.environ["SLURM_TASKS_PER_NODE"]
285
-
286
- def test_slurm_no_brackets(self):
287
- os.environ["SLURM_JOB_NODELIST"] = "M0,M1,M2"
288
- os.environ["SLURM_NTASKS_PER_NODE"] = "8"
289
- hostList = os.environ.get("SLURM_JOB_NODELIST")
290
- machineList = _construct_machine_list_slurm(hostList)
291
- self.assertEqual(machineList.num_machines, 3)
292
- self.assertEqual(machineList.number_of_cores, 24)
293
- self.assertEqual(machineList.machines[0].host_name, "M0")
294
- self.assertEqual(machineList.machines[1].host_name, "M1")
295
- self.assertEqual(machineList.machines[2].host_name, "M2")
296
- fluentOpts = build_parallel_options(machineList)
297
- self.assertEqual(fluentOpts, "-t24 -cnf=M0:8,M1:8,M2:8")
298
- del os.environ["SLURM_JOB_NODELIST"]
299
- del os.environ["SLURM_NTASKS_PER_NODE"]
300
-
301
- def test_slurm_no_padding(self):
302
- os.environ["SLURM_JOB_NODELIST"] = "M[0-2]"
303
- os.environ["SLURM_NTASKS_PER_NODE"] = "12"
304
- hostList = os.environ.get("SLURM_JOB_NODELIST")
305
- machineList = _construct_machine_list_slurm(hostList)
306
- self.assertEqual(machineList.num_machines, 3)
307
- self.assertEqual(machineList.number_of_cores, 36)
308
- self.assertEqual(machineList.machines[0].host_name, "M0")
309
- self.assertEqual(machineList.machines[1].host_name, "M1")
310
- self.assertEqual(machineList.machines[2].host_name, "M2")
311
- fluentOpts = build_parallel_options(machineList)
312
- self.assertEqual(fluentOpts, "-t36 -cnf=M0:12,M1:12,M2:12")
313
- del os.environ["SLURM_JOB_NODELIST"]
314
- del os.environ["SLURM_NTASKS_PER_NODE"]
315
-
316
- def test_slurm_hosts_with_dash(self):
317
- os.environ["SLURM_JOB_NODELIST"] = "M-n50-[0-1],M-p50-[9-11]"
318
- os.environ["SLURM_NTASKS_PER_NODE"] = "12"
319
- hostList = os.environ.get("SLURM_JOB_NODELIST")
320
- machineList = _construct_machine_list_slurm(hostList)
321
- self.assertEqual(machineList.num_machines, 5)
322
- self.assertEqual(machineList.number_of_cores, 60)
323
- self.assertEqual(machineList.machines[0].host_name, "M-n50-0")
324
- self.assertEqual(machineList.machines[1].host_name, "M-n50-1")
325
- self.assertEqual(machineList.machines[2].host_name, "M-p50-9")
326
- self.assertEqual(machineList.machines[3].host_name, "M-p50-10")
327
- self.assertEqual(machineList.machines[4].host_name, "M-p50-11")
328
- del os.environ["SLURM_JOB_NODELIST"]
329
- del os.environ["SLURM_NTASKS_PER_NODE"]
330
-
331
- def test_slurm_with_padding(self):
332
- os.environ["SLURM_JOB_NODELIST"] = "MC[008-009,010,011,012-014]"
333
- os.environ["SLURM_TASKS_PER_NODE"] = "8,10(x2),12(x3),10"
334
- hostList = os.environ.get("SLURM_JOB_NODELIST")
335
- machineList = _construct_machine_list_slurm(hostList)
336
- self.assertEqual(machineList.num_machines, 7)
337
- self.assertEqual(machineList.number_of_cores, 74)
338
- self.assertEqual(machineList.machines[0].host_name, "MC008")
339
- self.assertEqual(machineList.machines[0].number_of_cores, 8)
340
- self.assertEqual(machineList.machines[1].host_name, "MC009")
341
- self.assertEqual(machineList.machines[1].number_of_cores, 10)
342
- self.assertEqual(machineList.machines[2].host_name, "MC010")
343
- self.assertEqual(machineList.machines[2].number_of_cores, 10)
344
- self.assertEqual(machineList.machines[3].host_name, "MC011")
345
- self.assertEqual(machineList.machines[3].number_of_cores, 12)
346
- self.assertEqual(machineList.machines[4].host_name, "MC012")
347
- self.assertEqual(machineList.machines[4].number_of_cores, 12)
348
- self.assertEqual(machineList.machines[5].host_name, "MC013")
349
- self.assertEqual(machineList.machines[5].number_of_cores, 12)
350
- self.assertEqual(machineList.machines[6].host_name, "MC014")
351
- self.assertEqual(machineList.machines[6].number_of_cores, 10)
352
- del os.environ["SLURM_JOB_NODELIST"]
353
- del os.environ["SLURM_TASKS_PER_NODE"]
354
-
355
- def test_slurm_with_padding_one_hostlist(self):
356
- os.environ["SLURM_JOB_NODELIST"] = "MD[099-101]"
357
- os.environ["SLURM_NTASKS_PER_NODE"] = "12"
358
- hostList = os.environ.get("SLURM_JOB_NODELIST")
359
- machineList = _construct_machine_list_slurm(hostList)
360
- self.assertEqual(machineList.num_machines, 3)
361
- self.assertEqual(machineList.number_of_cores, 36)
362
- self.assertEqual(machineList.machines[0].host_name, "MD099")
363
- self.assertEqual(machineList.machines[1].host_name, "MD100")
364
- self.assertEqual(machineList.machines[2].host_name, "MD101")
365
- del os.environ["SLURM_JOB_NODELIST"]
366
- del os.environ["SLURM_NTASKS_PER_NODE"]
367
-
368
- def test_slurm_no_padding_commas(self):
369
- os.environ["SLURM_JOB_NODELIST"] = "M[2-3,4,5-7,8-11,12-14,15-16]"
370
- os.environ["SLURM_NTASKS_PER_NODE"] = "12"
371
- hostList = os.environ.get("SLURM_JOB_NODELIST")
372
- machineList = _construct_machine_list_slurm(hostList)
373
- self.assertEqual(machineList.num_machines, 15)
374
- self.assertEqual(machineList.number_of_cores, 180)
375
- self.assertEqual(machineList.machines[0].host_name, "M2")
376
- self.assertEqual(machineList.machines[1].host_name, "M3")
377
- self.assertEqual(machineList.machines[2].host_name, "M4")
378
- self.assertEqual(machineList.machines[3].host_name, "M5")
379
- self.assertEqual(machineList.machines[4].host_name, "M6")
380
- self.assertEqual(machineList.machines[5].host_name, "M7")
381
- self.assertEqual(machineList.machines[6].host_name, "M8")
382
- self.assertEqual(machineList.machines[7].host_name, "M9")
383
- self.assertEqual(machineList.machines[8].host_name, "M10")
384
- self.assertEqual(machineList.machines[9].host_name, "M11")
385
- self.assertEqual(machineList.machines[10].host_name, "M12")
386
- self.assertEqual(machineList.machines[11].host_name, "M13")
387
- self.assertEqual(machineList.machines[12].host_name, "M14")
388
- self.assertEqual(machineList.machines[13].host_name, "M15")
389
- self.assertEqual(machineList.machines[14].host_name, "M16")
390
- del os.environ["SLURM_JOB_NODELIST"]
391
- del os.environ["SLURM_NTASKS_PER_NODE"]
392
-
393
- def test_slurm_very_complex(self):
394
- os.environ["SLURM_JOB_NODELIST"] = (
395
- "M[2-3,4,5-7,8-11,12-14,15-16],MB,MC[008-009,010-011,012-014],MD[099-101]"
396
- )
397
- os.environ["SLURM_NTASKS_PER_NODE"] = "24"
398
- hostList = os.environ.get("SLURM_JOB_NODELIST")
399
- machineList = _construct_machine_list_slurm(hostList)
400
- self.assertEqual(machineList.num_machines, 26)
401
- self.assertEqual(machineList.number_of_cores, 624)
402
- self.assertEqual(machineList.machines[0].host_name, "M2")
403
- self.assertEqual(machineList.machines[0].number_of_cores, 24)
404
- self.assertEqual(machineList.machines[7].host_name, "M9")
405
- self.assertEqual(machineList.machines[14].host_name, "M16")
406
- self.assertEqual(machineList.machines[15].host_name, "MB")
407
- self.assertEqual(machineList.machines[16].host_name, "MC008")
408
- self.assertEqual(machineList.machines[19].host_name, "MC011")
409
- self.assertEqual(machineList.machines[22].host_name, "MC014")
410
- self.assertEqual(machineList.machines[24].host_name, "MD100")
411
- del os.environ["SLURM_JOB_NODELIST"]
412
- del os.environ["SLURM_NTASKS_PER_NODE"]
413
-
414
-
415
- class TestMachineListCmdLine(unittest.TestCase):
416
- """Provide a test suite that checks the machine list parser."""
417
-
418
- def setUp(self):
419
- self._expectedValues = {"M0": 2, "M1": 4}
420
-
421
- def tearDown(self):
422
- pass
423
-
424
- def test_parse_machine_data(self):
425
- machineDataList = [["M0:2", "M1:2", "M1:2"], ["M0", "M0", "M1", "M1:3"]]
426
-
427
- for machineData in machineDataList:
428
- machineList = _parse_machine_data(machineData)
429
- for machine in machineList.machines:
430
- self.assertEqual(
431
- machine.number_of_cores, self._expectedValues[machine.host_name]
432
- )
433
-
434
- def test_cmd_string(self):
435
- hostLists = ["M0:2,M1:2,M1:2", "M0,M0,M1,M1:3"]
436
-
437
- for hostList in hostLists:
438
- machineList = _parse_host_info(hostList)
439
- for machine in machineList.machines:
440
- self.assertEqual(
441
- machine.number_of_cores, self._expectedValues[machine.host_name]
442
- )
443
-
444
- def test_no_machine_name(self):
445
- hostList = "M0:2,M1:2,"
446
- with self.assertRaises(RuntimeError) as cm:
447
- _parse_host_info(hostList)
448
- self.assertEqual(str(cm.exception), "Problem with machine list format.")
449
-
450
- def test_host_file(self):
451
- import os.path
452
-
453
- hostfile = "hosts.txt"
454
- # This unit test only runs if the file exists
455
- if os.path.isfile(hostfile):
456
- machineList = _parse_host_info(hostfile)
457
- for machine in machineList.machines:
458
- self.assertEqual(
459
- machine.number_of_cores, self._expectedValues[machine.host_name]
460
- )
461
-
462
-
463
- suite1 = unittest.TestLoader().loadTestsFromTestCase(TestMachine)
464
- suite2 = unittest.TestLoader().loadTestsFromTestCase(TestMachineList)
465
- suite3 = unittest.TestLoader().loadTestsFromTestCase(TestLoadMachines)
466
- suite4 = unittest.TestLoader().loadTestsFromTestCase(TestMachineListCmdLine)
467
- alltests = unittest.TestSuite([suite1, suite2, suite3, suite4])
468
- unittest.TextTestRunner(verbosity=2).run(alltests)
469
-
470
- if __name__ == "__main__":
471
- unittest.main()