FUSE Introductory Tutorial
Download this tutorial from the FuseExamples repository
Basic concepts
To make sense of this tutorial, you'll need to know the following organization concepts of FUSE:
- 📂 Data storage: All data is stored in the
ddstructure, which follows the ITER IMAS ontology. - 🧠 Actors: The core components of FUSE simulations are physics and engineering actors.
- 🕹️ Control: Actor functionality is governed by
actparameters. - 🚀 Initialization: The data structure can be initialized from 0D
iniparameters. - 🔧 Use cases: FUSE includes templates for various machines (e.g., FPP, ITER, ARC).
- 🔄 Workflows: Self-contained studies and optimizations are conducted via workflows, typically involving multiple FUSE simulations.
- 🌍 Interoperability: FUSE interfaces with existing modeling tools like OMFIT/OMAS and the IMAS ecosystem.
A diagram illustrating these concepts is provided below: 
Let's get started!
NOTE: Julia is a Just In Time (JIT) programming language. The first time something is executed it will take longer because of the compilation process. Subsequent calls the the same code will be blazingly fast.
Import the necessary packages
using Plots # for plotting
using FUSE # this will also import IMAS in the current namespaceStarting from a use-case
FUSE comes with some predefined use-cases, some of which are used for regression testing.
Note that some use cases are for non-nuclear experiments and certain actors like Blankets or BalanceOfPlant will not perform any actions.
Get initial parameters (ini) and actions (act) for a given use-case, let's use KDEMO for example
ini, act = FUSE.case_parameters(:KDEMO);The ini data structure contains 0D parameters that will be used to bootstrap the dd with plausible data.
The ini parameters can be modified.
ini.equilibrium.B0 = 7.8
ini.equilibrium.R0 = 6.5;The act data structure contains parameters that define how the actors (ie the models) will behave.
The act parameters can also be modified.
act.ActorCoreTransport.model = :FluxMatcher;ini and act can now be used to initialize the data dictionary (dd) using the 0D parameters.
NOTE: init() does not return a self-consistent solution, just a plausible starting point to initialize our simulations!
dd = IMAS.dd() # an empty dd
FUSE.init(dd, ini, act);actors: Equilibrium
actors: TEQUILA
actors: CXbuild
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Current
actors: QED
actors: PassiveStructuresLet's see what we got
plot(dd.build)
plot(dd.equilibrium)
plot(dd.core_profiles)
plot(dd.core_sources)We can @checkin and @checkout variables with an associated tag.
This is handy to save and restore (checkpoint) our progress without having to always start from scratch (we'll use this later).
@checkin :init dd ini actRunning Actors
Let's now run a series of actors and play around with plotting to get a sense of what each individual actor does.
Here's how we can restore things back to after the initialization stage (in case we did anything else in between)
@checkout :init dd ini actActors in FUSE can be executed by passing two arguments to them: dd and act.
Let's start by positioning the PF coils, so that we stand a chance to reproduce the desired plasma shape. This will be important to ensure the stability of the ActorStationaryPlasma that we are going to run next.
FUSE.ActorPFdesign(dd, act; do_plot=true); # instead of setting `act.ActorPFdesign.do_plot=true` we can just pass `do_plot=true` as argument without chaning `act`actors: PFdesignThe ActorStationaryPlasma iterates between plasma transport, pedestal, equilibrium and sources to return a self-consistent plasma solution
peq = plot(dd.equilibrium; label="before")
pcp = plot(dd.core_profiles; color=:gray, label="before")
#act.ActorFluxMatcher.verbose = true
act.ActorFluxMatcher.algorithm = :anderson
#act.ActorFluxMatcher.step_size = 0.1
FUSE.ActorStationaryPlasma(dd, act);actors: StationaryPlasma
actors: --------------- 1/5
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 1/5 @ 631.51%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 2/5 @ 576.59%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 3/5 @ 378.47%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 4/5 @ 212.63%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 5/5 @ 80.72%we can compare equilibrium before and after the self-consistency loop
plot!(peq, dd.equilibrium; label="after")we can compare core_profiles before and after the self-consistency loop
plot!(pcp, dd.core_profiles; label="after")here are the sources
plot(dd.core_sources)and the flux-matched transport
plot(dd.core_transport)HFS sizing actor changes the thickness of the OH and TF layers on the high field side to satisfy current and stresses constraints
plot(dd.build)
FUSE.ActorHFSsizing(dd, act);
plot!(dd.build; cx=false)The stresses on the center stack are stored in the solid_mechanics IDS
plot(dd.solid_mechanics.center_stack.stress)LFS sizing actors change location of the outer TF leg to meet ripple requirements
plot(dd.build)
FUSE.ActorLFSsizing(dd, act);
plot!(dd.build; cx=false)A custom show() method is defined to print the summary of dd.build.layer
dd.build.layer23×10 DataFrame
Row │ group details type ΔR R_start R_end material area volume shape
│ String String String Float64 Float64 Float64 String Float64 Float64 String
─────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ in 1.34387 0.0 1.34387 steel 20.0722 98.9922 rectangle
2 │ in oh 0.308212 1.34387 1.65208 nb3sn 6.96307 80.5936 rectangle
3 │ hfs tf 1.64586 1.65208 3.29794 nb3sn_kdemo 42.9267 889.509 convex hull
4 │ hfs gap tf vacuum vessel 0.0 3.29794 3.29794 vacuum 7.46579 490.894 double ellipse
5 │ hfs vacuum outer vessel 0.0982993 3.29794 3.39624 steel 3.06133 124.725 negative offset
6 │ hfs gap water 0.147449 3.39624 3.54369 water 4.47813 182.564 negative offset
7 │ hfs vacuum inner vessel 0.0982993 3.54369 3.64199 steel 2.90951 118.694 negative offset
8 │ hfs gap high temp shield vacuum vess… 0.00982993 3.64199 3.65182 vacuum 0.287611 11.7367 negative offset
9 │ hfs high temp shield 0.196599 3.65182 3.84842 steel 5.62468 229.669 negative offset
10 │ hfs blanket 0.373538 3.84842 4.22196 lithium_lead 20.8601 951.677 negative offset
11 │ hfs first wall 0.0196599 4.22196 4.24162 tungsten 1.02432 34.0916 offset
12 │ lhfs plasma 4.51651 4.24162 8.75812 plasma 32.1357 1252.48
13 │ lfs first wall 0.0196599 8.75812 8.77778 tungsten 1.02432 34.0916 offset
14 │ lfs blanket 1.17959 8.77778 9.95738 lithium_lead 20.8601 951.677 negative offset
15 │ lfs high temp shield 0.196599 9.95738 10.154 steel 5.62468 229.669 negative offset
16 │ lfs gap high temp shield vacuum vess… 0.0442026 10.154 10.1982 vacuum 0.287611 11.7367 negative offset
17 │ lfs vacuum inner vessel 0.0982993 10.1982 10.2965 steel 2.90951 118.694 negative offset
18 │ lfs gap water 0.147449 10.2965 10.4439 water 4.47813 182.564 negative offset
19 │ lfs vacuum outer vessel 0.0982993 10.4439 10.5422 steel 3.06133 124.725 negative offset
20 │ lfs gap tf vacuum vessel 0.775582 10.5422 11.3178 vacuum 7.46579 490.894 double ellipse
21 │ lfs tf 1.64586 11.3178 12.9637 nb3sn_kdemo 42.9267 889.509 convex hull
22 │ out 1.96599 0.0 14.9297 vacuum 164.179 8376.89
23 │ out cryostat 0.0982993 0.0 15.028 steel 4.86736 309.729 siloActorHFSsizing and ActorLFSsizing only change the layer's thicknesses, so we then need to trigger a build of the 2D cross-sections after them:
FUSE.ActorCXbuild(dd, act);
plot(dd.build)Generate passive structures information (for now the vacuum vessel)
FUSE.ActorPassiveStructures(dd, act)
plot(dd.pf_passive)We can now give the PF coils their final position given the new build
actor = FUSE.ActorPFdesign(dd, act);
plot(actor) # some actors define their own plotWith information about both pfactive and pfpassive we can now evaluate vertical stability
FUSE.ActorVerticalStability(dd, act)
IMAS.freeze(dd.mhd_linear)mhd_linear [DETACHED]
├─ time ➡ [0] [s]
└─ time_slice
└─ 1
├─ time ➡ 0 [s]
└─ toroidal_mode
├─ 1
│ ├─ n_tor ➡ 0
│ ├─ perturbation_type
│ │ ├─ description ➡ "Vertical stability margin > 0.15 for stability"
│ │ └─ name ➡ "m_s"
│ └─ stability_metric ➡ 0.203146
└─ 2
├─ n_tor ➡ 0
├─ perturbation_type
│ ├─ description ➡ "Normalized vertical growth rate < 10 for stability"
│ └─ name ➡ "γτ"
└─ stability_metric ➡ 5.82255
The ActorNeutronics calculates the heat flux on the first wall
FUSE.ActorNeutronics(dd, act);
p = plot(; layout=2, size=(900, 350))
plot!(p, dd.neutronics.time_slice[].wall_loading, subplot=1)
plot!(p, FUSE.define_neutrons(dd, 100000)[1], dd.equilibrium.time_slice[]; subplot=1, colorbar_entry=false)
plot!(p, dd.neutronics.time_slice[].wall_loading; cx=false, subplot=2, ylabel="")The ActorBlanket will change the thickess of the first wall, breeder, shield, and Li6 enrichment to achieve target TBR
FUSE.ActorBlanket(dd, act);
print_tree(IMAS.freeze(dd.blanket); maxdepth=5)actors: Blanket
blanket [DETACHED]
├─ module
│ └─ 1
│ ├─ layer
│ │ ├─ 1
│ │ │ ├─ material ➡ "tungsten"
│ │ │ ├─ midplane_thickness ➡ 0.0199499 [m]
│ │ │ └─ name ➡ "lfs first wall"
│ │ ├─ 2
│ │ │ ├─ material ➡ "lithium-lead: Li6/7=90.000%"
│ │ │ ├─ midplane_thickness ➡ 1.29145 [m]
│ │ │ └─ name ➡ "lfs blanket"
│ │ └─ 3
│ │ ├─ material ➡ "steel"
│ │ ├─ midplane_thickness ➡ 0.0844532 [m]
│ │ └─ name ➡ "lfs high temp shield"
│ ├─ name ➡ "blanket"
│ └─ time_slice
│ └─ 1
│ ├─ peak_escape_flux ➡ 184801 [W/m^2]
│ ├─ peak_wall_flux ➡ 956045 [W/m^2]
│ ├─ power_incident_neutrons ➡ 9.85595e+06 [W]
│ ├─ power_incident_radiated ➡ 0 [W]
│ ├─ power_thermal_extracted ➡ 1.18271e+07 [W]
│ ├─ power_thermal_neutrons ➡ 1.18271e+07 [W]
│ ├─ power_thermal_radiated ➡ 0 [W]
│ ├─ time ➡ 0 [s]
│ └─ tritium_breeding_ratio ➡ 1.67847
├─ time ➡ [0] [s]
└─ tritium_breeding_ratio ➡ [0.0758177]The ActorDivertors actor calculates the divertors heat flux
FUSE.ActorDivertors(dd, act);
print_tree(IMAS.freeze(dd.divertors); maxdepth=4)actors: Divertors
divertors [DETACHED]
├─ divertor
│ └─ 1
│ ├─ power_black_body
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_conducted
│ │ ├─ data ➡ [1.19647e+08] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_convected
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_currents
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_incident
│ │ ├─ data ➡ [4.09981e+07] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_neutrals
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_radiated
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_recombination_neutrals
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_recombination_plasma
│ │ ├─ data ➡ [0] [W]
│ │ └─ time ➡ [0] [s]
│ ├─ power_thermal_extracted
│ │ ├─ data ➡ [4.09981e+07] [W]
│ │ └─ time ➡ [0] [s]
│ └─ target
│ ├─ 1
│ │ ⋮
│ │
│ └─ 2
│ ⋮
│
└─ time ➡ [0] [s]The ActorBalanceOfPlant calculates the optimal cooling flow rates for the heat sources (breeder, divertor, and wall) and get an efficiency for the electricity conversion cycle
FUSE.ActorBalanceOfPlant(dd, act);
IMAS.freeze(dd.balance_of_plant)balance_of_plant [DETACHED]
├─ Q_plant ➡ [0.138152]
├─ power_electric_net ➡ [-1.24968e+08] [W]
├─ power_electric_plant_operation
│ ├─ system
│ │ ├─ 1
│ │ │ ├─ index ➡ 1
│ │ │ ├─ name ➡ "HCD"
│ │ │ ├─ power ➡ [1e+08] [W]
│ │ │ └─ subsystem
│ │ │ ├─ 1
│ │ │ │ ├─ index ➡ 1
│ │ │ │ ├─ name ➡ "nbi"
│ │ │ │ └─ power ➡ [0] [W]
│ │ │ ├─ 2
│ │ │ │ ├─ index ➡ 2
│ │ │ │ ├─ name ➡ "ec_launchers"
│ │ │ │ └─ power ➡ [5e+07] [W]
│ │ │ ├─ 3
│ │ │ │ ├─ index ➡ 3
│ │ │ │ ├─ name ➡ "ic_antennas"
│ │ │ │ └─ power ➡ [5e+07] [W]
│ │ │ └─ 4
│ │ │ ├─ index ➡ 4
│ │ │ ├─ name ➡ "lh_antennas"
│ │ │ └─ power ➡ [0] [W]
│ │ ├─ 2
│ │ │ ├─ index ➡ 3
│ │ │ ├─ name ➡ "cryostat"
│ │ │ └─ power ➡ [3e+07] [W]
│ │ ├─ 3
│ │ │ ├─ index ➡ 4
│ │ │ ├─ name ➡ "tritium_handling"
│ │ │ └─ power ➡ [1.5e+07] [W]
│ │ └─ 4
│ │ ├─ index ➡ 6
│ │ ├─ name ➡ "pf_active"
│ │ └─ power ➡ [0] [W]
│ └─ total_power ➡ [1.45e+08] [W]
├─ power_plant
│ ├─ heat_load
│ │ ├─ breeder ➡ [1.18271e+07] [W]
│ │ ├─ divertor ➡ [4.09981e+07] [W]
│ │ └─ wall ➡ [3.54523e+07] [W]
│ ├─ power_cycle_type ➡ "rankine"
│ ├─ power_electric_generated ➡ [2.0032e+07] [W]
│ └─ total_heat_supplied ➡ [8.82775e+07] [W]
├─ thermal_efficiency_plant ➡ [0.226921]
└─ time ➡ [0] [s]
ActorCosting will break down the capital and operational costs
FUSE.ActorCosting(dd, act)
plot(dd.costing)Let's checkpoint our results
@checkin :manual dd ini actWhole facility design
Here we restore the :init checkpoint that we had previously stored. Resetting any changes to dd, ini, and act that we did in the meantime.
@checkout :init dd ini actActors can call other actors, creating workflows. For example, the ActorWholeFacility can be used to to get a self-consistent stationary whole facility design.
FUSE.ActorWholeFacility(dd, act);actors: WholeFacility
actors: PFdesign
actors: StationaryPlasma
actors: --------------- 1/5
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 1/5 @ 631.12%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 2/5 @ 575.90%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 3/5 @ 374.93%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 4/5 @ 127.19%
actors: HCD
actors: SimpleEC
actors: SimpleIC
actors: NeutralFueling
actors: Pedestal
actors: EPED
actors: CoreTransport
actors: FluxMatcher
actors: Pedestal
actors: EPED
actors: FluxCalculator
actors: TGLF
actors: Neoclassical
actors: Current
actors: QED
actors: Sawteeth
actors: Equilibrium
actors: TEQUILA
actors: --------------- 5/5 @ 62.25%
actors: HFSsizing
actors: FluxSwing
actors: Stresses
actors: LFSsizing
actors: CXbuild
actors: PFdesign
actors: Equilibrium
actors: TEQUILA
actors: CXbuild
actors: Neutronics
actors: Blanket
actors: CXbuild
actors: PassiveStructures
actors: Divertors
actors: PlasmaLimits
actors: VerticalStability
actors: TroyonBetaNN
actors: BalanceOfPlant
actors: ThermalPlant
actors: PowerNeeds
actors: Costing
actors: CostingARIESLet's check what we got at a glance with the FUSE.digest(dd) function:
FUSE.digest(dd)GEOMETRY EQUILIBRIUM TEMPERATURES
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
R0 → 6.5 [m] B0 → 7.8 [T] Te0 → 18.4 [keV]
a → 2.01 [m] ip → 12.7 [MA] Ti0 → 17.9 [keV]
1/ϵ → 3.24 q95 → 6.11 <Te> → 8.5 [keV]
κ → 2 <Bpol> → 0.803 [T] <Ti> → 7.72 [keV]
δ → 0.588 βpol_MHD → 0.789 Te0/<Te> → 2.16
ζ → -0.0136 βtor_MHD → 0.00872 Ti0/<Ti> → 2.32
Volume → 930 [m³] βn_MHD → 1.06
Surface → 755 [m²]
DENSITIES PRESSURES TRANSPORT
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
ne0 → 9.26e+19 [m⁻³] P0 → 0.594 [MPa] τe → 2.36 [s]
ne_ped → 6.79e+19 [m⁻³] <P> → 0.211 [MPa] τe_exp → 1.83 [s]
ne_line → 8.32e+19 [m⁻³] P0/<P> → 2.81 H98y2 → 0.85
<ne> → 7.58e+19 [m⁻³] βn → 1.07 H98y2_exp → 0.785
ne0/<ne> → 1.22 βn_th → 1.02 Hds03 → 0.634
fGW → 0.827 Hds03_exp → 0.565
zeff_ped → 2 τα_thermalization → 0.868 [s]
<zeff> → 2 τα_slowing_down → 0.955 [s]
impurities → DT Ne20 He4
SOURCES EXHAUST CURRENTS
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
Pec → 50 [MW] Psol → 118 [MW] ip_bs_aux_ohm → 13 [MA]
rho0_ec → 0.54 [MW] PLH → 134 [MW] ip_ni → 5.9 [MA]
Pnbi → NaN [MW] Bpol_omp → 1.11 [T] ip_bs → 2.91 [MA]
Enbi1 → NaN [MeV] λq → 0.974 [mm] ip_aux → 2.99 [MA]
Pic → 50 [MW] qpol → 2.28e+03 [MW/m²] ip_ohm → 7.13 [MA]
Plh → NaN [MW] qpar → 1.24e+04 [MW/m²] ejima → 0.4
Paux_tot → 100 [MW] P/R0 → 18.2 [MW/m] flattop → 0.7 [Hours]
Pα → 52.5 [MW] PB/R0 → 142 [MW T/m]
Pohm → 0.593 [MW] PBp/R0 → 14.6 [MW T/m]
Pheat → 153 [MW] PBϵ/R0q95 → 7.19 [MW T/m]
Prad_tot → -34.7 [MW] neutrons_peak → 0.339 [MW/m²]
BOP BUILD COSTING
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
Pfusion → 263 [MW] PF_material → nb3sn capital_cost → 6.91 [$B]
Qfusion → 2.63 TF_material → nb3sn_kdemo levelized_CoE → Inf [$/kWh]
thermal_cycle_type → rankine OH_material → nb3sn TF_of_total → 18.1 [%]
thermal_efficiency_plant → 22.7 [%] TF_max_b → 15.4 [T] BOP_of_total → 1.76 [%]
thermal_efficiency_cycle → NaN [%] OH_max_b → 15.3 [T] blanket_of_total → 19.8 [%]
power_electric_generated → 18.6 [MW] TF_j_margin → 5.86 cryostat_of_total → 2.92 [%]
Pelectric_net → -126 [MW] OH_j_margin → 1.4
Qplant → 0.128 TF_stress_margin → 2.97
TBR → 0.0767 OH_stress_margin → 1.21
@ time = 0.0 [s]
GKS: could not find font middle.ttf
Like before we can checkpoint results for later use
@checkin :awf dd ini actWorking with the IMAS data structure
See the IMAS tutorial https://github.com/ProjectTorreyPines/FuseExamples/blob/master/tutorial_imas.ipynb
Understanding how to work with the IMAS data structure is a must for working within the FUSE ecosystem!
Summary
Snapshot of dd in 0D quantities (evaluated at dd.global_time).
Extract + plots saved to PDF (printed to screen if filename is omitted). NOTE: For PDF creation to work, one may need to install of DejaVu Sans Mono font.
tutorial_temp_dir = tempdir()
filename = joinpath(tutorial_temp_dir, "$(ini.general.casename).pdf")
display(filename)
FUSE.digest(dd)#, filename)GEOMETRY EQUILIBRIUM TEMPERATURES
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
R0 → 6.5 [m] B0 → 7.8 [T] Te0 → 18.4 [keV]
a → 2.01 [m] ip → 12.7 [MA] Ti0 → 17.9 [keV]
1/ϵ → 3.24 q95 → 6.11 <Te> → 8.5 [keV]
κ → 2 <Bpol> → 0.803 [T] <Ti> → 7.72 [keV]
δ → 0.588 βpol_MHD → 0.789 Te0/<Te> → 2.16
ζ → -0.0136 βtor_MHD → 0.00872 Ti0/<Ti> → 2.32
Volume → 930 [m³] βn_MHD → 1.06
Surface → 755 [m²]
DENSITIES PRESSURES TRANSPORT
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
ne0 → 9.26e+19 [m⁻³] P0 → 0.594 [MPa] τe → 2.36 [s]
ne_ped → 6.79e+19 [m⁻³] <P> → 0.211 [MPa] τe_exp → 1.83 [s]
ne_line → 8.32e+19 [m⁻³] P0/<P> → 2.81 H98y2 → 0.85
<ne> → 7.58e+19 [m⁻³] βn → 1.07 H98y2_exp → 0.785
ne0/<ne> → 1.22 βn_th → 1.02 Hds03 → 0.634
fGW → 0.827 Hds03_exp → 0.565
zeff_ped → 2 τα_thermalization → 0.868 [s]
<zeff> → 2 τα_slowing_down → 0.955 [s]
impurities → DT Ne20 He4
SOURCES EXHAUST CURRENTS
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
Pec → 50 [MW] Psol → 118 [MW] ip_bs_aux_ohm → 13 [MA]
rho0_ec → 0.54 [MW] PLH → 134 [MW] ip_ni → 5.9 [MA]
Pnbi → NaN [MW] Bpol_omp → 1.11 [T] ip_bs → 2.91 [MA]
Enbi1 → NaN [MeV] λq → 0.974 [mm] ip_aux → 2.99 [MA]
Pic → 50 [MW] qpol → 2.28e+03 [MW/m²] ip_ohm → 7.13 [MA]
Plh → NaN [MW] qpar → 1.24e+04 [MW/m²] ejima → 0.4
Paux_tot → 100 [MW] P/R0 → 18.2 [MW/m] flattop → 0.7 [Hours]
Pα → 52.5 [MW] PB/R0 → 142 [MW T/m]
Pohm → 0.593 [MW] PBp/R0 → 14.6 [MW T/m]
Pheat → 153 [MW] PBϵ/R0q95 → 7.19 [MW T/m]
Prad_tot → -34.7 [MW] neutrons_peak → 0.339 [MW/m²]
BOP BUILD COSTING
──────────────────────────────────── ──────────────────────────────────── ────────────────────────────────────
Pfusion → 263 [MW] PF_material → nb3sn capital_cost → 6.91 [$B]
Qfusion → 2.63 TF_material → nb3sn_kdemo levelized_CoE → Inf [$/kWh]
thermal_cycle_type → rankine OH_material → nb3sn TF_of_total → 18.1 [%]
thermal_efficiency_plant → 22.7 [%] TF_max_b → 15.4 [T] BOP_of_total → 1.76 [%]
thermal_efficiency_cycle → NaN [%] OH_max_b → 15.3 [T] blanket_of_total → 19.8 [%]
power_electric_generated → 18.6 [MW] TF_j_margin → 5.86 cryostat_of_total → 2.92 [%]
Pelectric_net → -126 [MW] OH_j_margin → 1.4
Qplant → 0.128 TF_stress_margin → 2.97
TBR → 0.0767 OH_stress_margin → 1.21
@ time = 0.0 [s]