Coverage for fiqus/getdp_runners/RunGetdpMultipole.py: 95%
55 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 pathlib
4import gmsh
6from fiqus.pro_assemblers.ProAssembler import ASS_PRO as aP
7from fiqus.utils.Utils import GmshUtils
8from fiqus.utils.Utils import FilesAndFolders as Util
9from fiqus.data import DataFiQuS as dF
10from fiqus.data.RegionsModelFiQuS import RegionsModel as rM
13class AssignNaming:
14 def __init__(self, data: dF.FDM() = None):
15 """
16 Class to assign naming convention
17 :param data: FiQuS data model
18 """
19 self.data: dF.FDM() = data
21 self.naming_conv = {'omega': 'Omega', 'boundary': 'Bd_', 'powered': '_p', 'induced': '_i', 'air': '_a',
22 'air_far_field': '_aff', 'iron': '_bh', 'conducting': '_c', 'terms': 'Terms'}
23 self.data.magnet.postproc.volumes = \
24 [self.naming_conv['omega'] + self.naming_conv[var] if not var == 'omega'
25 else self.naming_conv['omega'] for var in self.data.magnet.postproc.volumes]
28class RunGetdpMultipole:
29 def __init__(self, data: AssignNaming = None, sett: dF.FiQuSSettings() = None, solution_folder: str = None,
30 settings: dict = None, verbose: bool = False):
31 """
32 Class to solve pro file
33 :param data: FiQuS data model
34 :param sett: settings data model
35 :param verbose: If True more information is printed in python console.
36 """
37 self.data: dF.FDM() = data.data
38 self.naming_conv: dict = data.naming_conv
39 self.set: dF.FiQuSSettings() = sett
40 self.solution_folder = solution_folder
41 self.settings = settings
42 self.verbose: bool = verbose
44 self.rm = rM()
46 self.gu = GmshUtils(self.solution_folder, self.verbose)
47 self.gu.initialize()
48 self.occ = gmsh.model.occ
49 self.mesh = gmsh.model.mesh
51 self.brep_iron_curves = {1: set(), 2: set(), 3: set(), 4: set()}
52 self.mesh_folder = os.path.dirname(self.solution_folder)
53 self.model_file = os.path.join(self.solution_folder, 'Center_line.csv')
55 self.II = (self.set.Model_Data_GS.general_parameters.I_ref[0] if self.data.magnet.postproc.compare_to_ROXIE
56 else self.data.magnet.solve.I_initial[0])
58 def loadRegionFile(self):
59 self.rm = Util.read_data_from_yaml(f"{os.path.join(self.mesh_folder, self.data.general.magnet_name)}.reg", rM)
61 def assemblePro(self):
62 self.rm.powered.vol.currents = []
63 for name in self.rm.powered.vol.names:
64 if name[-3:] == 'pos':
65 self.rm.powered.vol.currents.append(self.II)
66 else:
67 self.rm.powered.vol.currents.append(-self.II)
69 ap = aP(file_base_path=os.path.join(self.solution_folder, self.data.general.magnet_name),
70 naming_conv=self.naming_conv)
71 BH_curves_path = os.path.join(pathlib.Path(os.path.dirname(__file__)).parent, 'pro_material_functions', 'ironBHcurves.pro')
72 ap.assemble_combined_pro(template=self.data.magnet.solve.pro_template, rm=self.rm, dm=self.data.magnet, BH_curves_path=BH_curves_path)
74 def solve_and_postprocess(self):
75 command = "-solve -v2 -pos"
76 self._run(command=command)
78 def postprocess(self):
79 command = "-v2 -pos"
80 self._run(command=command)
82 def _run(self, command):
83 gmsh.onelab.run(f"{self.data.general.magnet_name}",
84 f"{self.settings['GetDP_path']} "
85 f"{os.path.join(self.solution_folder, self.data.general.magnet_name)}.pro "
86 f"{command} -msh {os.path.join(self.mesh_folder, self.data.general.magnet_name)}.msh")
87 gmsh.onelab.setChanged("GetDP", 0)
88 # view_tag = gmsh.view.getTags() # this should be b
89 # # # v = "View[" + str(gmsh.view.getIndex('b')) + "]"
90 # gmsh.view.write(view_tag, f"{os.path.join(self.solution_folder, self.data.general.magnet_name)}-view.msh")
92 def ending_step(self, gui: bool = False):
93 if gui:
94 self.gu.launch_interactive_GUI()
95 else:
96 gmsh.clear()
97 gmsh.finalize()