-
Notifications
You must be signed in to change notification settings - Fork 244
/
co_simulation_test_factory.py
217 lines (175 loc) · 11.6 KB
/
co_simulation_test_factory.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
import KratosMultiphysics as KM
import KratosMultiphysics.KratosUnittest as KratosUnittest
import KratosMultiphysics.kratos_utilities as kratos_utils
data_comm = KM.Testing.GetDefaultDataCommunicator()
import co_simulation_test_case
import os
have_fsi_dependencies = kratos_utils.CheckIfApplicationsAvailable("FluidDynamicsApplication", "StructuralMechanicsApplication", "MappingApplication", "MeshMovingApplication", "LinearSolversApplication")
have_potential_fsi_dependencies = kratos_utils.CheckIfApplicationsAvailable("CompressiblePotentialFlowApplication", "StructuralMechanicsApplication", "MappingApplication", "MeshMovingApplication", "LinearSolversApplication")
have_mpm_fem_dependencies = kratos_utils.CheckIfApplicationsAvailable("MPMApplication", "StructuralMechanicsApplication", "MappingApplication", "LinearSolversApplication", "ConstitutiveLawsApplication")
have_dem_fem_dependencies = kratos_utils.CheckIfApplicationsAvailable("DEMApplication", "StructuralMechanicsApplication", "MappingApplication", "LinearSolversApplication")
have_mpm_dem_dependencies = kratos_utils.CheckIfApplicationsAvailable("DEMApplication", "MPMApplication", "MappingApplication", "LinearSolversApplication")
have_fem_fem_dependencies = kratos_utils.CheckIfApplicationsAvailable("StructuralMechanicsApplication", "MappingApplication")
have_pfem_fem_dependencies = kratos_utils.CheckIfApplicationsAvailable("PfemFluidDynamicsApplication", "StructuralMechanicsApplication", "MappingApplication", "LinearSolversApplication", "ConstitutiveLawsApplication")
def GetFilePath(fileName):
return os.path.join(os.path.dirname(os.path.realpath(__file__)), fileName)
class TestTinyFetiCoSimulationCases(co_simulation_test_case.CoSimulationTestCase):
'''This class contains "tiny" FETI CoSimulation-Cases, small enough to run in the CI
'''
def test_FEM_FEM_small_2d_plate_feti_explict_explicit(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_feti_explict_explicit"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate_feti/explicit_explicit", "cosim_fem_fem_small_2d_plate_feti_explicit_explicit")
self._runTest()
def test_FEM_FEM_small_2d_plate_feti_implict_explicit(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_feti_implict_explicit"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate_feti/implicit_explicit", "cosim_fem_fem_small_2d_plate_feti_implicit_explicit")
self._runTest()
def test_FEM_FEM_small_2d_plate_feti_implict_implicit(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_feti_implict_implicit"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate_feti/implicit_implicit", "cosim_fem_fem_small_2d_plate_feti_implicit_implicit")
self._runTest()
def test_FEM_FEM_small_2d_plate_feti_implict_explicit_mixed(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_feti_implict_explicit_mixed"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate_feti/implicit_explicit_mixed", "cosim_fem_fem_small_2d_plate_feti_implicit_explicit_mixed")
self._runTest()
def test_MPMDEMCoupling(self):
if not have_mpm_dem_dependencies:
self.skipTest("MPM DEM dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("mpm_dem","cosim_mpm_dem")
self._runTest()
# removing superfluous dem files after test
self.addCleanup(kratos_utils.DeleteFileIfExisting, GetFilePath("mpm_dem/dempart.post.lst"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("mpm_dem/dempart_Graphs"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("mpm_dem/dempart_MPI_results"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("mpm_dem/dempart_Post_Files"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("mpm_dem/dempart_Results_and_Data"))
class TestSmallCoSimulationCases(co_simulation_test_case.CoSimulationTestCase):
'''This class contains "small" CoSimulation-Cases, small enough to run in the nightly suite
'''
def test_FEM_FEM_small_2d_plate_dual_mortar(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_dual_mortar"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate", "cosim_fem_fem_small_2d_plate_dual_mortar")
self._runTest()
def test_FEM_FEM_small_2d_plate_full_mortar(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_small_2d_plate_full_mortar"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/small_2d_plate", "cosim_fem_fem_small_2d_plate_full_mortar")
self._runTest()
def test_FEM_FEM_Neumann_Neumann_Jacobi_Solver(self):
if not have_fem_fem_dependencies:
self.skipTest("FEM-FEM dependencies are not available!")
self.name = "test_FEM_FEM_neumann_neumann_jacobi_solver"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fem_fem/static_2d_cantilever", "cosim_fem_fem_neumann_neumann_jacobi_solver")
self._runTest()
#def test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit(self):
# if not have_fem_fem_dependencies:
# self.skipTest("FEM-FEM dependencies are not available!")
#
# self.name = "test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit"
# with KratosUnittest.WorkFolderScope(".", __file__):
# self._createTest("fem_fem/dynamic_2d_cantilever/implicit_implicit", "fem_fem_dynamic_2d_cantilever")
# self._runTest()
#
#def test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit_nonconforming(self):
# if not have_fem_fem_dependencies:
# self.skipTest("FEM-FEM dependencies are not available!")
#
# self.name = "test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit_nonconforming"
# with KratosUnittest.WorkFolderScope(".", __file__):
# self._createTest("fem_fem/dynamic_2d_cantilever/implicit_implicit", "fem_fem_dynamic_2d_cantilever_nonconforming")
# self._runTest()
#
#def test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit_mixed_timestep(self):
# if not have_fem_fem_dependencies:
# self.skipTest("FEM-FEM dependencies are not available!")
#
# self.name = "test_FEM_FEM_dynamic_2d_cantilever_implicit_implicit_mixed_timestep"
# with KratosUnittest.WorkFolderScope(".", __file__):
# self._createTest("fem_fem/dynamic_2d_cantilever/implicit_implicit", "fem_fem_dynamic_2d_cantilever_mixed_timestep")
# self._runTest()
#
#def test_FEM_FEM_dynamic_2d_cantilever_implicit_explicit_mixed_nonconforming(self):
# if not have_fem_fem_dependencies:
# self.skipTest("FEM-FEM dependencies are not available!")
#
# self.name = "test_FEM_FEM_dynamic_2d_cantilever_implicit_explicit_mixed_nonconforming"
# with KratosUnittest.WorkFolderScope(".", __file__):
# self._createTest("fem_fem/dynamic_2d_cantilever/implicit_explicit", "fem_fem_dynamic_2d_cantilever_mixed_nonconforming")
# self._runTest()
def test_sdof_static_fsi(self):
if not have_potential_fsi_dependencies:
self.skipTest("FSI dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fsi_sdof_static", "project_cosim_naca0012_small_fsi")
# self.__AddVtkOutputToCFD() # uncomment to get output
self._runTest()
class TestCoSimulationCases(co_simulation_test_case.CoSimulationTestCase):
'''This class contains "full" CoSimulation-Cases, too large for the nightly suite and therefore
have to be in the validation-suite
'''
def test_MPM_FEM_beam_penalty(self):
if not have_mpm_fem_dependencies:
self.skipTest("MPM-FEM dependencies are not available!")
self.name = "penalty_beam"
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("mpm_fem_beam", "cosim_mpm_fem_beam")
self._runTest()
def test_WallFSI(self):
if not have_fsi_dependencies:
self.skipTest("FSI dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fsi_wall", "cosim_wall_weak_coupling_fsi")
self._runTest()
def test_DEMFEMCableNet(self):
if not have_dem_fem_dependencies:
self.skipTest("DEM FEM dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("dem_fem_cable_net","cosim_dem_fem_cable_net")
self._runTest()
# removing superfluous dem files after test
self.addCleanup(kratos_utils.DeleteFileIfExisting, GetFilePath("dem_fem_cable_net/cableNet.post.lst"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("dem_fem_cable_net/cableNet_Graphs"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("dem_fem_cable_net/cableNet_MPI_results"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("dem_fem_cable_net/cableNet_Post_Files"))
self.addCleanup(kratos_utils.DeleteDirectoryIfExisting, GetFilePath("dem_fem_cable_net/cableNet_Results_and_Data"))
def test_sdof_fsi(self):
if not have_fsi_dependencies:
self.skipTest("FSI dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("fsi_sdof", "cosim_sdof_fsi")
if data_comm.IsDistributed():
allowed_num_processes = [3,4,5] # problem is small and needs a very specific number of processes, otherwise the linear solver gives slightly different results and the test fails
if data_comm.Size() not in allowed_num_processes:
self.skipTest("This test runs only with {} processes".format(allowed_num_processes))
self.cosim_parameters["problem_data"]["parallel_type"].SetString("MPI")
fluid_solver_settings = self.cosim_parameters["solver_settings"]["solvers"]["fluid"]["solver_wrapper_settings"]
fluid_solver_settings["input_file"].SetString("fsi_sdof/ProjectParametersCFD_mpi") # TODO refactor such that serial file can be reused. Requires to update and dump new CFD settings (similar to mok test)
self._runTest()
@KratosUnittest.skipUnless(False, "this test result is not evaluated")
def test_PFEM_FEM_water_slide_2d(self):
if not have_pfem_fem_dependencies:
self.skipTest("PFEM FEM dependencies are not available!")
with KratosUnittest.WorkFolderScope(".", __file__):
self._createTest("pfem_fem_waterslide2d","cosim_pfem_fem_waterslide2d")
self._runTest()
if __name__ == '__main__':
KratosUnittest.main()