Skip to content

Commit 084a774

Browse files
authored
Merge pull request #1013 from ProjectTorreyPines/diags
New ActorInterferometer and ActorMagnetics
2 parents f998439 + 1db90dd commit 084a774

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

src/FUSE.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ include(joinpath("actors", "current", "steadycurrent_actor.jl"))
109109
include(joinpath("actors", "current", "current_actor.jl"))
110110

111111
include(joinpath("actors", "diagnostics", "fits_actor.jl"))
112+
include(joinpath("actors", "diagnostics", "interferometer_actor.jl"))
113+
include(joinpath("actors", "diagnostics", "magnetics_actor.jl"))
112114

113115
include(joinpath("actors", "hcd", "simple_common.jl"))
114116
include(joinpath("actors", "hcd", "ec", "ec_simple_actor.jl"))
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#= ================== =#
2+
# ActorInterferometer #
3+
#= ================== =#
4+
5+
@actor_parameters_struct ActorInterferometer{T} begin
6+
#== actor parameters ==#
7+
n_points::Entry{Int} = Entry{Int}("-", "Number of integration points along line of sight"; default=100)
8+
#== display and debugging parameters ==#
9+
end
10+
11+
mutable struct ActorInterferometer{D,P} <: SingleAbstractActor{D,P}
12+
dd::IMAS.dd{D}
13+
par::OverrideParameters{P,FUSEparameters__ActorInterferometer{P}}
14+
end
15+
16+
"""
17+
ActorInterferometer(dd::IMAS.dd, act::ParametersAllActors; kw...)
18+
19+
Calculates synthetic interferometer measurements from equilibrium and core profiles.
20+
21+
This actor computes line-averaged electron density measurements that would be observed by
22+
interferometer diagnostics based on the plasma equilibrium and core profiles. It populates
23+
the `dd.interferometer` IDS with synthetic diagnostic signals.
24+
25+
The actor calls `IMAS.interferometer!` to:
26+
- Calculate line-integrated electron density along each interferometer line of sight
27+
- Compute line-averaged density for each channel
28+
- Generate time-dependent synthetic signals consistent with the equilibrium and profile evolution
29+
30+
Key physics:
31+
- Integration of electron density along interferometer chords
32+
- Proper handling of line-of-sight geometry (including multi-segment paths)
33+
- Time-dependent measurements across all equilibrium time slices
34+
35+
Key outputs:
36+
- Line-averaged electron density in `dd.interferometer.channel[:].n_e_line_average`
37+
- Time-dependent diagnostic data for validation and comparison with experimental data
38+
39+
Parameters:
40+
- `n_points`: Number of integration points along each line of sight (default: 100)
41+
42+
!!! note
43+
44+
Requires `dd.equilibrium` and `dd.core_profiles` to be populated.
45+
The `dd.interferometer` must have channels defined with `line_of_sight` geometry.
46+
Results are stored in `dd.interferometer.channel[:].n_e_line_average`.
47+
"""
48+
function ActorInterferometer(dd::IMAS.dd, act::ParametersAllActors; kw...)
49+
actor = ActorInterferometer(dd, act.ActorInterferometer; kw...)
50+
step(actor)
51+
finalize(actor)
52+
return actor
53+
end
54+
55+
function ActorInterferometer(dd::IMAS.dd, par::FUSEparameters__ActorInterferometer; kw...)
56+
logging_actor_init(ActorInterferometer)
57+
par = OverrideParameters(par; kw...)
58+
return ActorInterferometer(dd, par)
59+
end
60+
61+
function _step(actor::ActorInterferometer)
62+
dd = actor.dd
63+
par = actor.par
64+
65+
# Calculate interferometer diagnostics from equilibrium and core profiles
66+
IMAS.interferometer!(dd.interferometer, dd.equilibrium, dd.core_profiles; n_points=par.n_points)
67+
68+
return actor
69+
end
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#= ============== =#
2+
# ActorMagnetics #
3+
#= ============== =#
4+
5+
@actor_parameters_struct ActorMagnetics{T} begin
6+
#== actor parameters ==#
7+
#== display and debugging parameters ==#
8+
end
9+
10+
mutable struct ActorMagnetics{D,P} <: SingleAbstractActor{D,P}
11+
dd::IMAS.dd{D}
12+
par::OverrideParameters{P,FUSEparameters__ActorMagnetics{P}}
13+
end
14+
15+
"""
16+
ActorMagnetics(dd::IMAS.dd, act::ParametersAllActors; kw...)
17+
18+
Calculates magnetic field diagnostics from equilibrium data.
19+
20+
This actor computes the magnetic field measurements that would be observed by
21+
magnetic diagnostics (flux loops, magnetic probes, etc.) based on the plasma
22+
equilibrium. It populates the `dd.magnetics` IDS with synthetic diagnostic signals.
23+
24+
The actor calls `IMAS.magnetics!` to:
25+
- Calculate magnetic flux measurements at diagnostic locations
26+
- Compute magnetic field components for probes
27+
- Generate time-dependent synthetic signals consistent with the equilibrium evolution
28+
29+
Key outputs:
30+
- Magnetic flux loop signals in `dd.magnetics.flux_loop`
31+
- Magnetic probe measurements in `dd.magnetics.bpol_probe`
32+
- Time-dependent diagnostic data for validation and analysis
33+
34+
!!! note
35+
36+
Requires `dd.equilibrium` to be populated with equilibrium data.
37+
Results are stored in `dd.magnetics`.
38+
"""
39+
function ActorMagnetics(dd::IMAS.dd, act::ParametersAllActors; kw...)
40+
actor = ActorMagnetics(dd, act.ActorMagnetics; kw...)
41+
step(actor)
42+
finalize(actor)
43+
return actor
44+
end
45+
46+
function ActorMagnetics(dd::IMAS.dd, par::FUSEparameters__ActorMagnetics; kw...)
47+
logging_actor_init(ActorMagnetics)
48+
par = OverrideParameters(par; kw...)
49+
return ActorMagnetics(dd, par)
50+
end
51+
52+
function _step(actor::ActorMagnetics)
53+
dd = actor.dd
54+
par = actor.par
55+
56+
# Calculate magnetics diagnostics from equilibrium
57+
IMAS.magnetics!(dd.magnetics, dd.equilibrium)
58+
59+
return actor
60+
end

0 commit comments

Comments
 (0)