Coverage for python/gsfit/database_readers/st40_spider_mdsplus/setup_plasma.py: 0%
44 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 13:12 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 13:12 +0000
1import typing
2from typing import TYPE_CHECKING
4import gsfit_rs
5import numpy as np
6import numpy.typing as npt
7from gsfit_rs import Plasma
8from st40_database import GetData
10if TYPE_CHECKING:
11 from . import DatabaseReader
14def setup_plasma(
15 self: "DatabaseReader",
16 pulseNo: int,
17 settings: dict[str, typing.Any],
18) -> Plasma:
19 """
20 This method initialises the Rust `Plasma` class.
22 :param pulseNo: Pulse number, used to read from the database
23 :param settings: Dictionary containing the JSON settings read from the `settings` directory
25 **This method is specific to ST40's experimental MDSplus database.**
27 See `python/gsfit/database_readers/interface.py` for more details on how a new database_reader should be implemented.
28 """
30 # Initial plasma conditions
31 initial_ip = settings["GSFIT_code_settings.json"]["initial_guess"]["ip"]
32 initial_cur_r = settings["GSFIT_code_settings.json"]["initial_guess"]["r_cur"]
33 initial_cur_z = settings["GSFIT_code_settings.json"]["initial_guess"]["z_cur"]
35 # Set the source functions types
36 p_prime_source_function: gsfit_rs.EfitPolynomial
37 ff_prime_source_function: gsfit_rs.EfitPolynomial
39 if settings["source_function_p_prime.json"]["method"] == "efit_polynomial":
40 n_dof = settings["source_function_p_prime.json"]["efit_polynomial"]["n_dof"]
41 regularisations = np.array(settings["source_function_p_prime.json"]["efit_polynomial"]["regularizations"])
42 # If `regularisations` is [[]] in the json file, will be interpreted by numpy as having size (1, 0).
43 # Which would be interpreted as (n_regularisations, n_dof). So it would cause an error
44 if regularisations.shape == (1, 0):
45 regularisations = np.zeros((0, n_dof), dtype=np.float64)
46 p_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
47 else:
48 raise ValueError(f"Unknown method for p_prime source function: {settings['source_function_p_prime.json']['method']}")
50 if settings["source_function_ff_prime.json"]["method"] == "efit_polynomial":
51 n_dof = settings["source_function_ff_prime.json"]["efit_polynomial"]["n_dof"]
52 regularisations = np.array(settings["source_function_ff_prime.json"]["efit_polynomial"]["regularizations"])
53 # If `regularisations` is [[]] in the json file, will be interpreted by numpy as having size (1, 0).
54 # Which would be interpreted as (n_regularisations, n_dof). So it would cause an error
55 if regularisations.shape == (1, 0):
56 regularisations = np.zeros((0, n_dof), dtype=np.float64)
57 ff_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
59 # Grid size and shape
60 n_r = settings["GSFIT_code_settings.json"]["grid"]["n_r"]
61 n_z = settings["GSFIT_code_settings.json"]["grid"]["n_z"]
62 r_min = settings["GSFIT_code_settings.json"]["grid"]["r_min"]
63 r_max = settings["GSFIT_code_settings.json"]["grid"]["r_max"]
64 z_min = settings["GSFIT_code_settings.json"]["grid"]["z_min"]
65 z_max = settings["GSFIT_code_settings.json"]["grid"]["z_max"]
67 # Normalised poloidal flux grid
68 n_psi_n = settings["GSFIT_code_settings.json"]["n_psi_n"]
69 psi_n = np.linspace(0.0, 1.0, n_psi_n).astype(np.float64)
71 # Limiter
72 elmag_run_name = settings["GSFIT_code_settings.json"]["database_reader"]["st40_mdsplus"]["workflow"]["elmag"]["run_name"]
73 elmag = GetData(13321, f"ELMAG#{elmag_run_name}", is_fail_quiet=False)
74 limit_pts_r = typing.cast(npt.NDArray[np.float64], elmag.get("LIMITER.LIMIT_PTS.R"))
75 limit_pts_z = typing.cast(npt.NDArray[np.float64], elmag.get("LIMITER.LIMIT_PTS.Z"))
77 # Vacuum vessel where the plasma is allowed to be
78 vessel_r = limit_pts_r
79 vessel_z = limit_pts_z
81 # Add lower MC tiles
82 limit_pts_r = np.append(limit_pts_r, 0.7103)
83 limit_pts_z = np.append(limit_pts_z, -0.3131)
84 # Add upper MC tiles
85 limit_pts_r = np.append(limit_pts_r, 0.7103)
86 limit_pts_z = np.append(limit_pts_z, 0.3031)
88 # Initialise the Plasma Rust class
89 plasma = Plasma(
90 n_r,
91 n_z,
92 r_min,
93 r_max,
94 z_min,
95 z_max,
96 psi_n, # BUXTON: perhaps better to send in `n_psi_n`
97 limit_pts_r,
98 limit_pts_z,
99 vessel_r,
100 vessel_z,
101 p_prime_source_function,
102 ff_prime_source_function,
103 initial_ip,
104 initial_cur_r,
105 initial_cur_z,
106 )
108 return plasma
111# import typing
112# from typing import TYPE_CHECKING
114# import gsfit_rs
115# import numpy as np
116# import numpy.typing as npt
117# from gsfit_rs import Plasma
118# from st40_database import GetData # type: ignore[import-not-found]
120# if TYPE_CHECKING:
121# from . import DatabaseReader
124# def setup_plasma(
125# self: "DatabaseReader",
126# pulseNo: int,
127# settings: dict[str, typing.Any],
128# ) -> Plasma:
129# """
130# This method initialises the Rust `Plasma` class.
132# :param pulseNo: Pulse number, used to read from the database
133# :param settings: Dictionary containing the JSON settings read from the `settings` directory
135# **This method is specific to ST40's ASTRA stored on MDSplus.**
137# See `python/gsfit/database_readers/interface.py` for more details on how a new database_reader should be implemented.
138# """
140# # Initial plasma conditions
141# initial_ip = settings["GSFIT_code_settings.json"]["initial_guess"]["ip"]
142# initial_cur_r = settings["GSFIT_code_settings.json"]["initial_guess"]["r_cur"]
143# initial_cur_z = settings["GSFIT_code_settings.json"]["initial_guess"]["z_cur"]
145# # Set the source functions types
146# p_prime_source_function: gsfit_rs.EfitPolynomial
147# ff_prime_source_function: gsfit_rs.EfitPolynomial
149# if settings["source_function_p_prime.json"]["method"] == "efit_polynomial":
150# n_dof = settings["source_function_p_prime.json"]["efit_polynomial"]["n_dof"]
151# regularisations = np.array(settings["source_function_p_prime.json"]["efit_polynomial"]["regularizations"])
152# p_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
153# elif settings["source_function_p_prime.json"]["method"] == "efit_polynomial":
154# n_dof = settings["source_function_p_prime.json"]["efit_polynomial"]["n_dof"]
155# regularisations = np.array(settings["source_function_p_prime.json"]["efit_polynomial"]["regularizations"])
156# p_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
157# else:
158# raise ValueError(f"Unknown method for p_prime source function: {settings['source_function_p_prime.json']['method']}")
160# if settings["source_function_ff_prime.json"]["method"] == "efit_polynomial":
161# n_dof = settings["source_function_ff_prime.json"]["efit_polynomial"]["n_dof"]
162# regularisations = np.array(settings["source_function_ff_prime.json"]["efit_polynomial"]["regularizations"])
163# ff_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
164# elif settings["source_function_ff_prime.json"]["method"] == "efit_polynomial":
165# n_dof = settings["source_function_ff_prime.json"]["efit_polynomial"]["n_dof"]
166# regularisations = np.array(settings["source_function_ff_prime.json"]["efit_polynomial"]["regularizations"])
167# ff_prime_source_function = gsfit_rs.EfitPolynomial(n_dof, regularisations)
169# # Grid size and shape
170# n_r = settings["GSFIT_code_settings.json"]["grid"]["n_r"]
171# n_z = settings["GSFIT_code_settings.json"]["grid"]["n_z"]
172# r_min = settings["GSFIT_code_settings.json"]["grid"]["r_min"]
173# r_max = settings["GSFIT_code_settings.json"]["grid"]["r_max"]
174# z_min = settings["GSFIT_code_settings.json"]["grid"]["z_min"]
175# z_max = settings["GSFIT_code_settings.json"]["grid"]["z_max"]
177# # Normalised poloidal flux grid
178# n_psi_n = settings["GSFIT_code_settings.json"]["n_psi_n"]
179# psi_n = np.linspace(0.0, 1.0, n_psi_n).astype(np.float64)
181# # Limiter
182# elmag_run_name = settings["GSFIT_code_settings.json"]["database_reader"]["st40_astra_mdsplus"]["elmag_run_name"]
183# elmag = GetData(12050, f"ELMAG#{elmag_run_name}", is_fail_quiet=False)
184# limit_pts_r = typing.cast(npt.NDArray[np.float64], elmag.get("LIMITER.LIMIT_PTS.R"))
185# limit_pts_z = typing.cast(npt.NDArray[np.float64], elmag.get("LIMITER.LIMIT_PTS.Z"))
187# # Vacuum vessel where the plasma is allowed to be
188# vessel_r = limit_pts_r
189# vessel_z = limit_pts_z
191# # Add lower MC tiles
192# limit_pts_r = np.append(limit_pts_r, 0.7103)
193# limit_pts_z = np.append(limit_pts_z, -0.3131)
194# # Add upper MC tiles
195# limit_pts_r = np.append(limit_pts_r, 0.7103)
196# limit_pts_z = np.append(limit_pts_z, 0.3031)
198# # Initialise the Plasma Rust class
199# plasma = Plasma(
200# n_r,
201# n_z,
202# r_min,
203# r_max,
204# z_min,
205# z_max,
206# psi_n, # BUXTON: perhaps better to send in `n_psi_n`
207# limit_pts_r,
208# limit_pts_z,
209# vessel_r,
210# vessel_z,
211# p_prime_source_function,
212# ff_prime_source_function,
213# initial_ip,
214# initial_cur_r,
215# initial_cur_z,
216# )
218# return plasma