Coverage for python/gsfit/database_writers/tokamak_energy_mdsplus_new/map_results_to_database.py: 0%

184 statements  

« prev     ^ index     » next       coverage.py v7.15.0, created at 2026-07-07 13:12 +0000

1from typing import TYPE_CHECKING 

2 

3import numpy as np 

4 

5# from st40_database import GetData 

6 

7if TYPE_CHECKING: 

8 from ...gsfit import Gsfit 

9 from . import DatabaseWriterTokamakEnergyMDSplusNew 

10 

11 

12def map_results_to_database( 

13 self: "DatabaseWriterTokamakEnergyMDSplusNew", 

14 gsfit_controller: "Gsfit", 

15) -> None: 

16 """Map the results to MDSplus structure. 

17 `gsfit_controller.results` is a `NestedDict` object, which is a 1:1 mapping to the MDSplus structure. 

18 This function will mutate the `gsfit_controller` object. 

19 """ 

20 

21 # Take class object out of the `gsfit_controller` object 

22 pulseNo = gsfit_controller.pulseNo 

23 settings = gsfit_controller.settings 

24 plasma = gsfit_controller.plasma 

25 bp_probes = gsfit_controller.bp_probes 

26 flux_loops = gsfit_controller.flux_loops 

27 dialoop = gsfit_controller.dialoop 

28 rogowski_coils = gsfit_controller.rogowski_coils 

29 passives = gsfit_controller.passives 

30 coils = gsfit_controller.coils 

31 pressure_sensors = gsfit_controller.pressure_sensors 

32 results = gsfit_controller.results 

33 

34 # Plasma boundary 

35 results["BOUNDARY"]["GEO_AXIS"]["R"] = plasma.get_array1(["global", "r_geo"]) 

36 results["BOUNDARY"]["GEO_AXIS"]["Z"] = plasma.get_array1(["global", "z_geo"]) 

37 results["BOUNDARY"]["MINOR_RADIUS"] = plasma.get_array1(["global", "r_minor"]) 

38 results["BOUNDARY"]["ELONGATION"] = plasma.get_array1(["global", "elongation"]) 

39 results["BOUNDARY"]["PSI"] = plasma.get_array1(["global", "psi_b"]) 

40 results["BOUNDARY"]["PSI_NORM"] = np.ones_like(results["BOUNDARY"]["PSI"]) # flux defining LCFS, SPIDER has `psi_norm = 0.9999` 

41 results["BOUNDARY"]["OUTLINE"]["N"] = np.array(plasma.get_vec_usize(["p_boundary", "nbnd"])) 

42 results["BOUNDARY"]["OUTLINE"]["R"] = plasma.get_array2(["p_boundary", "rbnd"]) 

43 results["BOUNDARY"]["OUTLINE"]["Z"] = plasma.get_array2(["p_boundary", "zbnd"]) 

44 results["BOUNDARY"]["BOUNDING"]["R"] = plasma.get_array1(["p_boundary", "bounding_r"]) 

45 results["BOUNDARY"]["BOUNDING"]["Z"] = plasma.get_array1(["p_boundary", "bounding_z"]) 

46 

47 # Convergence 

48 results["CONVERGENCE"]["GS_ERROR"] = plasma.get_array1(["global", "gs_error"]) 

49 results["CONVERGENCE"]["ITERATIONS_N"] = np.array(plasma.get_vec_usize(["global", "n_iter"])).astype(np.int32) 

50 

51 # Global 

52 results["GLOBAL"]["CURRENT_CENT"]["R"] = plasma.get_array1(["global", "r_cur"]) 

53 # results["GLOBAL"]["CURRENT_CENT"]["VELOCITY_Z"] = plasma.get_array1(["global", "current_cent", "velocity_z"]) 

54 results["GLOBAL"]["CURRENT_CENT"]["Z"] = plasma.get_array1(["global", "z_cur"]) 

55 # results["GLOBAL"]["MAG_AXIS"]["B_FIELD_PHI"] = plasma.get_array1(["global", "bt_at_r_mag"]) 

56 results["GLOBAL"]["MAG_AXIS"]["R"] = plasma.get_array1(["global", "r_mag"]) 

57 results["GLOBAL"]["MAG_AXIS"]["Z"] = plasma.get_array1(["global", "z_mag"]) 

58 results["GLOBAL"]["AREA"] = plasma.get_array1(["global", "area"]) 

59 results["GLOBAL"]["BETA_N"] = plasma.get_array1(["global", "beta_n"]) 

60 results["GLOBAL"]["BETA_P_1"] = plasma.get_array1(["global", "beta_p_1"]) 

61 results["GLOBAL"]["BETA_P_2"] = plasma.get_array1(["global", "beta_p_2"]) 

62 results["GLOBAL"]["BETA_P_3"] = plasma.get_array1(["global", "beta_p_3"]) 

63 results["GLOBAL"]["BETA_T"] = plasma.get_array1(["global", "beta_t"]) 

64 # results["GLOBAL"]["BP_OMP"] = plasma.get_array1(["global", "bp_omp"]) 

65 results["GLOBAL"]["BT_VAC_RGEO"] = plasma.get_array1(["global", "bt_vac_at_r_geo"]) 

66 # results["GLOBAL"]["CONN_LENGTH"] = plasma.get_array1(["global", "conn_length"]) 

67 # results["GLOBAL"]["DELTA_R_SEP"] = plasma.get_array1(["global", "delta_r_sep"]) 

68 results["GLOBAL"]["DELTA_Z"] = plasma.get_array1(["global", "delta_z"]) 

69 results["GLOBAL"]["ENERGY_MHD"] = plasma.get_array1(["global", "w_mhd"]) # TODO: something wrong with energy calculation 

70 # results["GLOBAL"]["FX"] = plasma.get_array1(["global", "fx"]) 

71 results["GLOBAL"]["IP"] = plasma.get_array1(["global", "ip"]) 

72 results["GLOBAL"]["I_ROD"] = plasma.get_array1(["global", "i_rod"]) 

73 results["GLOBAL"]["LI_1"] = plasma.get_array1(["global", "li_1"]) 

74 results["GLOBAL"]["LI_2"] = plasma.get_array1(["global", "li_2"]) 

75 results["GLOBAL"]["LI_3"] = plasma.get_array1(["global", "li_3"]) 

76 results["GLOBAL"]["PHI_DIA"] = plasma.get_array1(["global", "phi_dia"]) 

77 results["GLOBAL"]["PSI_MAG_AXIS"] = plasma.get_array1(["global", "psi_a"]) 

78 results["GLOBAL"]["Q_AXIS"] = plasma.get_array1(["global", "q0"]) 

79 results["GLOBAL"]["Q_95"] = plasma.get_array1(["global", "q95"]) 

80 results["GLOBAL"]["V_LOOP"] = plasma.get_array1(["global", "v_loop"]) 

81 results["GLOBAL"]["VOLUME"] = plasma.get_array1(["global", "plasma_volume"]) # TODO: something wrong with plasma volume 

82 results["GLOBAL"]["XPT_DIVERTED"] = np.array(plasma.get_vec_bool(["global", "xpt_diverted"])).astype(np.int32) 

83 

84 # Profiles_1d, psi_norm 

85 results["PROFILES_1D"]["PSI_NORM"]["AREA"] = plasma.get_array2(["profiles", "area"]) 

86 results["PROFILES_1D"]["PSI_NORM"]["AREA_PRIME"] = plasma.get_array2(["profiles", "area_prime"]) 

87 # results["PROFILES_1D"]["PSI_NORM"]["ELONGATION"] = plasma.get_array2(["profiles", "elongation"]) 

88 results["PROFILES_1D"]["PSI_NORM"]["F"] = plasma.get_array2(["profiles", "f"]) 

89 results["PROFILES_1D"]["PSI_NORM"]["FF_PRIME"] = plasma.get_array2(["profiles", "ff_prime"]) 

90 results["PROFILES_1D"]["PSI_NORM"]["FLUX_TOR"] = plasma.get_array2(["profiles", "flux_tor"]) 

91 results["PROFILES_1D"]["PSI_NORM"]["P_PRIME"] = plasma.get_array2(["profiles", "p_prime"]) 

92 results["PROFILES_1D"]["PSI_NORM"]["PRESSURE"] = plasma.get_array2(["profiles", "p"]) 

93 # results["PROFILES_1D"]["PSI_NORM"]["PSI"] = plasma.get_array2(["profiles", "psi"]) 

94 results["PROFILES_1D"]["PSI_NORM"]["Q"] = plasma.get_array2(["profiles", "q"]) 

95 results["PROFILES_1D"]["PSI_NORM"]["RHO_POL"] = plasma.get_array2(["profiles", "rho_pol"]) 

96 results["PROFILES_1D"]["PSI_NORM"]["RHO_TOR"] = plasma.get_array2(["profiles", "rho_tor"]) 

97 results["PROFILES_1D"]["PSI_NORM"]["PSI_NORM"] = plasma.get_array1(["profiles", "psi_n"]) 

98 results["PROFILES_1D"]["PSI_NORM"]["VOL"] = plasma.get_array2(["profiles", "vol"]) 

99 results["PROFILES_1D"]["PSI_NORM"]["VOL_PRIME"] = plasma.get_array2(["profiles", "vol_prime"]) 

100 

101 # Mid-plane profiles 

102 results["PROFILES_1D"]["R_MIDPLANE"]["PRESSURE"] = plasma.get_array2(["profiles", "mid_plane", "p"]) 

103 results["PROFILES_1D"]["R_MIDPLANE"]["R"] = plasma.get_array1(["profiles", "mid_plane", "r"]) 

104 

105 # Profiles_2d 

106 results["PROFILES_2D"]["B_FIELD_PHI"] = plasma.get_array3(["two_d", "bt"]) 

107 results["PROFILES_2D"]["B_FIELD_R"] = plasma.get_array3(["two_d", "br"]) 

108 results["PROFILES_2D"]["B_FIELD_Z"] = plasma.get_array3(["two_d", "bz"]) 

109 results["PROFILES_2D"]["MASK"] = plasma.get_array3(["two_d", "mask"]) 

110 results["PROFILES_2D"]["PRESSURE"] = plasma.get_array3(["two_d", "p"]) 

111 results["PROFILES_2D"]["PSI"] = plasma.get_array3(["two_d", "psi"]) 

112 results["PROFILES_2D"]["R"] = plasma.get_array1(["grid", "r"]) 

113 results["PROFILES_2D"]["Z"] = plasma.get_array1(["grid", "z"]) 

114 

115 # Constraints 

116 results["CONSTRAINTS"]["CHI_SQ_MAG"] = plasma.get_array1(["global", "chi_mag"]) 

117 

118 for sensor_name in bp_probes.keys(): 

119 # results["CONSTRAINTS"]["BP_PROBE"][pf_name]["EXACT"] 

120 results["CONSTRAINTS"]["BP_PROBE"][sensor_name]["INCLUDE"] = np.int32(bp_probes.get_bool([sensor_name, "fit_settings", "include"])) 

121 results["CONSTRAINTS"]["BP_PROBE"][sensor_name]["MEASURED"] = bp_probes.get_array1([sensor_name, "b", "measured", "value"]) 

122 results["CONSTRAINTS"]["BP_PROBE"][sensor_name]["RECONSTRUCT"] = bp_probes.get_array1([sensor_name, "b", "calculated", "value"]) 

123 results["CONSTRAINTS"]["BP_PROBE"][sensor_name]["WEIGHT"] = bp_probes.get_f64([sensor_name, "fit_settings", "weight"]) 

124 

125 for sensor_name in flux_loops.keys(): 

126 # results["CONSTRAINTS"]["FLUX_LOOP"][pf_name]["EXACT"] 

127 results["CONSTRAINTS"]["FLUX_LOOP"][sensor_name]["INCLUDE"] = np.int32(flux_loops.get_bool([sensor_name, "fit_settings", "include"])) 

128 results["CONSTRAINTS"]["FLUX_LOOP"][sensor_name]["MEASURED"] = flux_loops.get_array1([sensor_name, "psi", "measured", "value"]) 

129 results["CONSTRAINTS"]["FLUX_LOOP"][sensor_name]["RECONSTRUCT"] = flux_loops.get_array1([sensor_name, "psi", "calculated", "value"]) 

130 results["CONSTRAINTS"]["FLUX_LOOP"][sensor_name]["WEIGHT"] = flux_loops.get_f64([sensor_name, "fit_settings", "weight"]) 

131 

132 for sensor_name in rogowski_coils.keys(): 

133 # results["CONSTRAINTS"]["ROGOWSKI"][pf_name]["EXACT"] 

134 results["CONSTRAINTS"]["ROGOWSKI"][sensor_name]["INCLUDE"] = np.int32(rogowski_coils.get_bool([sensor_name, "fit_settings", "include"])) 

135 results["CONSTRAINTS"]["ROGOWSKI"][sensor_name]["MEASURED"] = rogowski_coils.get_array1([sensor_name, "i", "measured", "value"]) 

136 results["CONSTRAINTS"]["ROGOWSKI"][sensor_name]["RECONSTRUCT"] = rogowski_coils.get_array1([sensor_name, "i", "calculated", "value"]) 

137 results["CONSTRAINTS"]["ROGOWSKI"][sensor_name]["WEIGHT"] = rogowski_coils.get_f64([sensor_name, "fit_settings", "weight"]) 

138 

139 # Diamagnetic flux (single diamagnetic flux loop "DIALOOP") 

140 for sensor_name in dialoop.keys(): 

141 results["CONSTRAINTS"]["DIAMAG_FLUX"]["INCLUDE"] = np.int32(dialoop.get_bool([sensor_name, "fit_settings", "include"])) 

142 results["CONSTRAINTS"]["DIAMAG_FLUX"]["MEASURED"] = dialoop.get_array1([sensor_name, "b", "measured", "value"]) 

143 results["CONSTRAINTS"]["DIAMAG_FLUX"]["RECONSTRUCT"] = dialoop.get_array1([sensor_name, "b", "calculated", "value"]) 

144 results["CONSTRAINTS"]["DIAMAG_FLUX"]["WEIGHT"] = dialoop.get_f64([sensor_name, "fit_settings", "weight"]) 

145 

146 for pf_name in coils.keys(["pf"]): 

147 # results["CONSTRAINTS"]["PF_CURRENT"][pf_name]["EXACT"] 

148 # results["CONSTRAINTS"]["PF_CURRENT"][pf_name]["INCLUDE"] = np.int32(coils.get_bool(["pf", pf_name, "fit_settings", "include"])) 

149 results["CONSTRAINTS"]["PF_CURRENT"][pf_name]["MEASURED"] = coils.get_array1(["pf", pf_name, "i", "measured", "value"]) 

150 # results["CONSTRAINTS"]["PF_CURRENT"][pf_name]["RECONSTRUCT"] = coils.get_array1(["pf", pf_name, "i", "calculated", "value"]) 

151 # results["CONSTRAINTS"]["PF_CURRENT"][pf_name]["WEIGHT"] = coils.get_f64(["pf", pf_name, "fit_settings", "weight"]) 

152 # TODO: need to handle circuits vs coils better 

153 results["CONSTRAINTS"]["PF_CURRENT"]["BVL"]["MEASURED"] = coils.get_array1(["pf", "BVLT", "i", "measured", "value"]) 

154 results["CONSTRAINTS"]["PF_CURRENT"]["DIV"]["MEASURED"] = coils.get_array1(["pf", "DIVT", "i", "measured", "value"]) 

155 results["CONSTRAINTS"]["PF_CURRENT"]["PSH"]["MEASURED"] = coils.get_array1(["pf", "PSHT", "i", "measured", "value"]) 

156 

157 # # X-points 

158 # # TODO!!!!!!!!!!! 

159 # results["XPOINTS"]["UPPER"]["R"] = plasma.get_array1(["xpoints", "upper", "r"]) 

160 # results["XPOINTS"]["UPPER"]["Z"] = plasma.get_array1(["xpoints", "upper", "z"]) 

161 # results["XPOINTS"]["LOWER"]["R"] = plasma.get_array1(["xpoints", "lower", "r"]) 

162 # results["XPOINTS"]["LOWER"]["Z"] = plasma.get_array1(["xpoints", "lower", "z"]) 

163 

164 # Passives 

165 for passive_name in passives.keys(): 

166 if passive_name == "IVC": 

167 results["PASSIVES"]["IVC"]["DOF"]["EIG_01"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_01", "calculated"]) 

168 results["PASSIVES"]["IVC"]["DOF"]["EIG_01"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_01", "current_distribution"]) 

169 results["PASSIVES"]["IVC"]["DOF"]["EIG_02"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_02", "calculated"]) 

170 results["PASSIVES"]["IVC"]["DOF"]["EIG_02"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_02", "current_distribution"]) 

171 results["PASSIVES"]["IVC"]["DOF"]["EIG_03"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_03", "calculated"]) 

172 results["PASSIVES"]["IVC"]["DOF"]["EIG_03"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_03", "current_distribution"]) 

173 results["PASSIVES"]["IVC"]["DOF"]["EIG_04"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_04", "calculated"]) 

174 results["PASSIVES"]["IVC"]["DOF"]["EIG_04"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_04", "current_distribution"]) 

175 results["PASSIVES"]["IVC"]["DOF"]["EIG_05"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_05", "calculated"]) 

176 results["PASSIVES"]["IVC"]["DOF"]["EIG_05"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_05", "current_distribution"]) 

177 results["PASSIVES"]["IVC"]["DOF"]["EIG_06"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_06", "calculated"]) 

178 results["PASSIVES"]["IVC"]["DOF"]["EIG_06"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_06", "current_distribution"]) 

179 results["PASSIVES"]["IVC"]["DOF"]["EIG_07"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_07", "calculated"]) 

180 results["PASSIVES"]["IVC"]["DOF"]["EIG_07"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_07", "current_distribution"]) 

181 results["PASSIVES"]["IVC"]["DOF"]["EIG_08"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_08", "calculated"]) 

182 results["PASSIVES"]["IVC"]["DOF"]["EIG_08"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_08", "current_distribution"]) 

183 results["PASSIVES"]["IVC"]["DOF"]["EIG_09"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_09", "calculated"]) 

184 results["PASSIVES"]["IVC"]["DOF"]["EIG_09"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_09", "current_distribution"]) 

185 results["PASSIVES"]["IVC"]["DOF"]["EIG_10"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_10", "calculated"]) 

186 results["PASSIVES"]["IVC"]["DOF"]["EIG_10"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_10", "current_distribution"]) 

187 results["PASSIVES"]["IVC"]["DOF"]["EIG_11"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_11", "calculated"]) 

188 results["PASSIVES"]["IVC"]["DOF"]["EIG_11"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_11", "current_distribution"]) 

189 results["PASSIVES"]["IVC"]["DOF"]["EIG_12"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_12", "calculated"]) 

190 results["PASSIVES"]["IVC"]["DOF"]["EIG_12"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_12", "current_distribution"]) 

191 results["PASSIVES"]["IVC"]["DOF"]["EIG_13"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_13", "calculated"]) 

192 results["PASSIVES"]["IVC"]["DOF"]["EIG_13"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_13", "current_distribution"]) 

193 results["PASSIVES"]["IVC"]["DOF"]["EIG_14"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_14", "calculated"]) 

194 results["PASSIVES"]["IVC"]["DOF"]["EIG_14"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_14", "current_distribution"]) 

195 results["PASSIVES"]["IVC"]["DOF"]["EIG_15"]["CVALUE"] = passives.get_array1(["IVC", "dof", "eig_15", "calculated"]) 

196 results["PASSIVES"]["IVC"]["DOF"]["EIG_15"]["I_DIST"] = passives.get_array1(["IVC", "dof", "eig_15", "current_distribution"]) 

197 results["PASSIVES"]["IVC"]["GEOMETRY"]["ANGLE_1"] = passives.get_array1(["IVC", "geometry", "angle_1"]) 

198 results["PASSIVES"]["IVC"]["GEOMETRY"]["ANGLE_2"] = passives.get_array1(["IVC", "geometry", "angle_2"]) 

199 results["PASSIVES"]["IVC"]["GEOMETRY"]["D_R"] = passives.get_array1(["IVC", "geometry", "d_r"]) 

200 results["PASSIVES"]["IVC"]["GEOMETRY"]["D_Z"] = passives.get_array1(["IVC", "geometry", "d_z"]) 

201 results["PASSIVES"]["IVC"]["GEOMETRY"]["R"] = passives.get_array1(["IVC", "geometry", "r"]) 

202 results["PASSIVES"]["IVC"]["GEOMETRY"]["Z"] = passives.get_array1(["IVC", "geometry", "z"]) 

203 else: 

204 results["PASSIVES"][passive_name]["DOF"]["CONSTANT_J"]["CVALUE"] = passives.get_array1( 

205 [passive_name, "dof", "constant_current_density", "calculated"] 

206 ) 

207 results["PASSIVES"][passive_name]["DOF"]["CONSTANT_J"]["I_DIST"] = passives.get_array1( 

208 [passive_name, "dof", "constant_current_density", "current_distribution"] 

209 ) 

210 results["PASSIVES"][passive_name]["GEOMETRY"]["ANGLE_1"] = passives.get_array1([passive_name, "geometry", "angle_1"]) 

211 results["PASSIVES"][passive_name]["GEOMETRY"]["ANGLE_2"] = passives.get_array1([passive_name, "geometry", "angle_2"]) 

212 results["PASSIVES"][passive_name]["GEOMETRY"]["D_R"] = passives.get_array1([passive_name, "geometry", "d_r"]) 

213 results["PASSIVES"][passive_name]["GEOMETRY"]["D_Z"] = passives.get_array1([passive_name, "geometry", "d_z"]) 

214 results["PASSIVES"][passive_name]["GEOMETRY"]["R"] = passives.get_array1([passive_name, "geometry", "r"]) 

215 results["PASSIVES"][passive_name]["GEOMETRY"]["Z"] = passives.get_array1([passive_name, "geometry", "z"]) 

216 

217 # Scrape off layer (SOL) 

218 results["SOL"]["HFS"]["CONTOUR"]["R"] = plasma.get_array2(["sol", "hfs", "contour", "r"]) # shape = [n_time, n_points] 

219 results["SOL"]["HFS"]["CONTOUR"]["Z"] = plasma.get_array2(["sol", "hfs", "contour", "z"]) # shape = [n_time, n_points] 

220 results["SOL"]["HFS"]["CONTOUR"]["N"] = np.array(plasma.get_vec_usize(["sol", "hfs", "contour", "n"])).astype(np.int32) # shape = [n_time] 

221 results["SOL"]["HFS"]["STRIKE_POINT"]["R"] = plasma.get_array1(["sol", "hfs", "strike_point", "r"]) # shape = [n_time] 

222 results["SOL"]["HFS"]["STRIKE_POINT"]["Z"] = plasma.get_array1(["sol", "hfs", "strike_point", "z"]) # shape = [n_time] 

223 results["SOL"]["LFS"]["CONTOUR"]["R"] = plasma.get_array2(["sol", "lfs", "contour", "r"]) # shape = [n_time, n_points] 

224 results["SOL"]["LFS"]["CONTOUR"]["Z"] = plasma.get_array2(["sol", "lfs", "contour", "z"]) # shape = [n_time, n_points] 

225 results["SOL"]["LFS"]["CONTOUR"]["N"] = np.array(plasma.get_vec_usize(["sol", "lfs", "contour", "n"])).astype(np.int32) # shape = [n_time] 

226 results["SOL"]["LFS"]["STRIKE_POINT"]["R"] = plasma.get_array1(["sol", "lfs", "strike_point", "r"]) # shape = [n_time] 

227 results["SOL"]["LFS"]["STRIKE_POINT"]["Z"] = plasma.get_array1(["sol", "lfs", "strike_point", "z"]) # shape = [n_time] 

228 

229 if len(pressure_sensors.keys()) > 0: 

230 sensor_names = list(pressure_sensors.keys()) 

231 

232 # Per-sensor nodes (keyed by sensor name) 

233 for sensor_name in sensor_names: 

234 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["MEASURED"] = pressure_sensors.get_array1([sensor_name, "pressure", "measured", "value"]) # shape = [n_time] 

235 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["RECONSTRUCT"] = pressure_sensors.get_array1([sensor_name, "pressure", "calculated", "value"]) # shape = [n_time] 

236 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["WEIGHT"] = pressure_sensors.get_f64([sensor_name, "fit_settings", "weight"]) # scalar 

237 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["POSITION"]["R"] = pressure_sensors.get_f64([sensor_name, "geometry", "r"]) # scalar 

238 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["POSITION"]["Z"] = pressure_sensors.get_f64([sensor_name, "geometry", "z"]) # scalar 

239 results["CONSTRAINTS"]["PRESSURE"][sensor_name]["POSITION"]["PSI"] = pressure_sensors.get_array1([sensor_name, "pressure", "calculated", "psi"]) # shape = [n_time] 

240 

241 # ALL aggregate node 

242 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["MEASURED"] = pressure_sensors.get_array2(["*", "pressure", "measured", "value"]) # shape = [n_time, n_points] 

243 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["RECONSTRUCT"] = pressure_sensors.get_array2(["*", "pressure", "calculated", "value"]) # shape = [n_time, n_points] 

244 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["WEIGHT"] = pressure_sensors.get_array1(["*", "fit_settings", "weight"]) # shape = [n_points] 

245 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["POSITION"]["R"] = pressure_sensors.get_array1(["*", "geometry", "r"]) # shape = [n_points] 

246 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["POSITION"]["Z"] = pressure_sensors.get_array1(["*", "geometry", "z"]) # shape = [n_points] 

247 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["POSITION"]["PSI"] = pressure_sensors.get_array2(["*", "pressure", "calculated", "psi"]) # shape = [n_time, n_points] 

248 results["CONSTRAINTS"]["PRESSURE"]["ALL"]["NAMES"] = np.array(sensor_names) 

249 

250 # Store "WORKFLOW" 

251 database_reader_method = settings["GSFIT_code_settings.json"]["database_reader"]["method"] 

252 

253 code_names = settings["GSFIT_code_settings.json"]["database_reader"][database_reader_method]["workflow"].keys() 

254 

255 for code_name in code_names: 

256 pulseNo_json = settings["GSFIT_code_settings.json"]["database_reader"][database_reader_method]["workflow"][code_name]["pulseNo"] 

257 if pulseNo_json is not None: 

258 results["INPUT"]["WORKFLOW"][code_name]["PULSE"] = pulseNo_json 

259 else: 

260 results["INPUT"]["WORKFLOW"][code_name]["PULSE"] = pulseNo 

261 

262 run_name = settings["GSFIT_code_settings.json"]["database_reader"][database_reader_method]["workflow"][code_name]["run_name"] 

263 results["INPUT"]["WORKFLOW"][code_name]["RUN"] = run_name 

264 

265 usage = settings["GSFIT_code_settings.json"]["database_reader"][database_reader_method]["workflow"][code_name]["usage"] 

266 results["INPUT"]["WORKFLOW"][code_name]["USAGE"] = usage