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

1import os 

2import pathlib 

3 

4import gmsh 

5 

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 

11 

12 

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 

20 

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] 

26 

27 

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 

43 

44 self.rm = rM() 

45 

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 

50 

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') 

54 

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]) 

57 

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) 

60 

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) 

68 

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) 

73 

74 def solve_and_postprocess(self): 

75 command = "-solve -v2 -pos" 

76 self._run(command=command) 

77 

78 def postprocess(self): 

79 command = "-v2 -pos" 

80 self._run(command=command) 

81 

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") 

91 

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()