Coverage for fiqus/mains/MainMultipole.py: 83%
107 statements
« prev ^ index » next coverage.py v6.4.4, created at 2024-05-20 03:24 +0200
« prev ^ index » next coverage.py v6.4.4, created at 2024-05-20 03:24 +0200
1import os
2import gmsh
3import time
5from fiqus.utils.Utils import GmshUtils
6from fiqus.utils.Utils import FilesAndFolders as Util
7from fiqus.data import DataFiQuS as dF
8from fiqus.geom_generators.GeometryMultipole import Geometry
9from fiqus.mesh_generators.MeshMultipole import Mesh
10from fiqus.getdp_runners.RunGetdpMultipole import RunGetdpMultipole
11from fiqus.getdp_runners.RunGetdpMultipole import AssignNaming
12from fiqus.post_processors.PostProcessMultipole import PostProcess
13from fiqus.plotters.PlotPythonMultipole import PlotPythonMultipole
16class MainMultipole:
17 def __init__(self, fdm: dF.FDM = None, sdm: dF.FiQuSSettings = None, rgd_path: str = None,
18 verbose: bool = None):
19 """
20 Main class for working with simulations for multipole type magnets
21 :param fdm: FiQuS data model
22 :param rgd_path: ROXIE geometry data path
23 :param sdm: settings data model
24 :param verbose: if True, more info is printed in the console
25 """
26 self.fdm = fdm
27 self.sett = sdm
28 self.rgd = rgd_path
29 self.verbose = verbose
31 self.settings = None
32 self.geom_folder = None
33 self.mesh_folder = None
34 self.solution_folder = None
35 self.model_file = None
37 def generate_geometry(self, gui: bool = False):
38 geom = Util.read_data_from_yaml(self.rgd, dF.FiQuSGeometry)
39 gg = Geometry(data=self.fdm, geom=geom, sett=self.sett, geom_folder=self.geom_folder, verbose=self.verbose)
40 self.model_file = gg.model_file
41 gg.saveStrandPositions()
42 if self.fdm.magnet.geometry.with_iron_yoke:
43 gg.constructIronGeometry()
44 gg.constructWedgeGeometry()
45 gg.constructCoilGeometry()
46 gg.buildDomains()
47 gg.saveBoundaryRepresentationFile()
48 gg.loadBoundaryRepresentationFile()
49 gg.updateTags()
50 gg.saveAuxiliaryFile()
51 gg.ending_step(gui)
53 def load_geometry(self, gui: bool = False):
54 gu = GmshUtils(self.geom_folder, self.verbose)
55 gu.initialize()
56 self.model_file = f"{os.path.join(self.geom_folder, self.fdm.general.magnet_name)}.brep"
57 gmsh.option.setString('Geometry.OCCTargetUnit', 'M') # set units to meters
58 gmsh.open(self.model_file)
59 if gui:
60 gu.launch_interactive_GUI()
62 def pre_process(self, gui: bool = False):
63 pass
65 def mesh(self, gui: bool = False):
66 mm = Mesh(data=self.fdm, sett=self.sett, mesh_folder=self.mesh_folder, verbose=self.verbose)
67 self.model_file = mm.model_file
68 mm.loadAuxiliaryFile()
69 mm.getIronCurvesTags()
70 mm.defineMesh()
71 mm.fragment()
72 mm.createPhysicalGroups()
73 mm.updateAuxiliaryFile()
74 mm.assignRegionsTags()
75 mm.saveRegionFile()
76 mm.setMeshOptions()
77 mm.generateMesh()
78 mm.checkMeshQuality()
79 mm.saveMeshFile()
80 mm.ending_step(gui)
81 return mm.mesh_parameters
83 def load_mesh(self, gui: bool = False):
84 gu = GmshUtils(self.geom_folder, self.verbose)
85 gu.initialize()
86 self.model_file = f"{os.path.join(self.mesh_folder, self.fdm.general.magnet_name)}.msh"
87 gmsh.open(self.model_file)
88 if gui:
89 gu.launch_interactive_GUI()
91 def solve_and_postprocess_getdp(self, gui: bool = False):
92 an = AssignNaming(data=self.fdm)
93 rg = RunGetdpMultipole(data=an, sett=self.sett, solution_folder=self.solution_folder, settings=self.settings,
94 verbose=self.verbose)
95 self.model_file = rg.model_file
96 rg.loadRegionFile()
97 rg.assemblePro()
98 start_time = time.time()
99 rg.solve_and_postprocess()
100 rg.ending_step(gui)
101 return time.time() - start_time
103 def post_process_getdp(self, gui: bool = False):
104 an = AssignNaming(data=self.fdm)
105 rg = RunGetdpMultipole(data=an, sett=self.sett, solution_folder=self.solution_folder, settings=self.settings,
106 verbose=self.verbose)
107 self.model_file = rg.model_file
108 rg.loadRegionFile()
109 rg.assemblePro()
110 rg.postprocess()
111 rg.ending_step(gui)
113 def post_process_python(self, gui: bool = False):
114 if self.fdm.run.type == 'post_process_python_only':
115 an = AssignNaming(data=self.fdm)
116 data = an.data
117 else:
118 data = self.fdm
119 pp = PostProcess(data=data, sett=self.sett, solution_folder=self.solution_folder, verbose=self.verbose)
120 self.model_file = pp.model_file
121 pp.loadStrandPositions()
122 if self.fdm.magnet.postproc.plot_all:
123 pp.loadHalfTurnCornerPositions()
124 pp.postProcess()
125 pp.ending_step(gui)
126 return pp.postprocess_parameters
128 def plot_python(self):
129 os.chdir(self.solution_folder)
130 p = PlotPythonMultipole(self.fdm)
131 p.dummy_plot_func()