Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/physics/fast.jl

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast_particles_profiles! unconditionally folds density_fast into density_thermal and zeros it, then rebuilds from sources carrying ion.particles + fast_particles_energy (NBI/fusion). With no such source (e.g. an input.gacode/ODS whose fast ions are a precomputed profile), the rebuild loop does nothing, so the prescribed density_fast/pressure_fast is silently destroyed at init and on every flux-matcher iteration.

Add a guard that returns early when no source can rebuild fast ions. The check mirrors the rebuild-entry condition exactly, so it only skips the destructive fold in cases where the rebuild would be a no-op; when a
beam/fusion source is present, behavior is unchanged.

Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,16 @@ function fast_particles_profiles!(cs::IMAS.core_sources, cp1d::IMAS.core_profile

# zero out all cp1d fast-ion related quantities
cp1d.electrons.density_fast = zeros(Npsi)

# --- guard: if no source can rebuild fast ions, leave existing density_fast/pressure_fast alone ---
has_fast_source = any(
!isempty(s.profiles_1d) && any(
!ismissing(si, :particles) && sum(si.particles) > 0.0 &&
!ismissing(si, :fast_particles_energy) && si.fast_particles_energy > 0.0
for si in s.profiles_1d[].ion)
for s in cs.source)
has_fast_source || return

for ion in cp1d.ion
ion.pressure_fast_parallel = zeros(Npsi)
ion.pressure_fast_perpendicular = zeros(Npsi)
Expand Down
49 changes: 29 additions & 20 deletions src/physics/radiation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,15 @@ function line_radiation_source!(dd::IMAS.DD)
ne = cp1d.electrons.density_thermal
Te = cp1d.electrons.temperature

keep = Set("line " * string(elements[round(Int, ion.element[1].z_n, RoundDown)].symbol) for ion in cp1d.ion)
li = name_2_index(dd.core_sources.source)[:line_radiation]
for k in reverse(eachindex(dd.core_sources.source))
s = dd.core_sources.source[k]
if s.identifier.index == li && !(s.identifier.name in keep)
deleteat!(dd.core_sources.source, k)
end
end

sources = [for ion in cp1d.ion
ni = ion.density_thermal
zi = ion.element[1].z_n
Expand Down Expand Up @@ -216,7 +225,7 @@ function adas21(Te, name)
+8.700125448336e-02,
-6.988848399826e-02,
+4.169797142892e-03,
+4.169797142892e-03
+9.826847754665e-03
]
elseif name == "B"
coefficients = [
Expand All @@ -231,7 +240,7 @@ function adas21(Te, name)
-2.497690268099e-02,
+1.137544241417e-02,
-2.413605670955e-03,
-2.413605670955e-03
-1.124244591834e-03
]
elseif name == "He"
coefficients = [
Expand All @@ -246,7 +255,7 @@ function adas21(Te, name)
-1.770156311492e-03,
+5.783337251866e-04,
+2.308975845735e-05,
+2.308975845735e-05
-4.276172509745e-04
]
elseif name == "Be"
coefficients = [
Expand All @@ -261,7 +270,7 @@ function adas21(Te, name)
+2.551848339714e-03,
-1.268897504553e-03,
+2.514022413007e-04,
+2.514022413007e-04
-8.449017995079e-04
]
elseif name == "C"
coefficients = [
Expand All @@ -276,7 +285,7 @@ function adas21(Te, name)
+2.170627066061e-02,
-3.195887243365e-02,
+2.481800173124e-02,
+2.481800173124e-02
-8.949718256775e-03
]
elseif name == "O"
coefficients = [
Expand All @@ -291,7 +300,7 @@ function adas21(Te, name)
+4.535099018906e-02,
+5.682622389415e-02,
-7.724691172118e-02,
-7.724691172118e-02
+4.671388518804e-02
]
elseif name == "N"
coefficients = [
Expand All @@ -306,7 +315,7 @@ function adas21(Te, name)
+1.367404249744e-01,
-7.076042601889e-02,
+1.377707920484e-02,
+1.377707920484e-02
+1.681956225002e-02
]
elseif name == "F"
coefficients = [
Expand All @@ -321,7 +330,7 @@ function adas21(Te, name)
-1.483369633643e-01,
+1.362062267100e-01,
-4.689893298094e-02,
-4.689893298094e-02
-2.644300012089e-02
]
elseif name == "Ne"
coefficients = [
Expand All @@ -336,7 +345,7 @@ function adas21(Te, name)
-1.804901948539e-01,
+1.138691735006e-01,
+1.238414608039e-02,
+1.238414608039e-02
-7.946295188381e-02
]
elseif name == "Al"
coefficients = [
Expand All @@ -351,7 +360,7 @@ function adas21(Te, name)
+1.194090655176e-01,
-2.087103454071e-01,
+8.992619526224e-02,
+8.992619526224e-02
+3.923399787447e-02
]
elseif name == "Si"
coefficients = [
Expand All @@ -366,7 +375,7 @@ function adas21(Te, name)
+2.108242428513e-01,
-1.792043287525e-01,
+9.913893641685e-03,
+9.913893641685e-03
+7.490321841247e-02
]
elseif name == "Ar"
coefficients = [
Expand All @@ -381,7 +390,7 @@ function adas21(Te, name)
+4.842130798317e-02,
+1.715110727683e-01,
-1.077751857577e-01,
-1.077751857577e-01
-4.574007342660e-02
]
elseif name == "Ca"
coefficients = [
Expand All @@ -396,7 +405,7 @@ function adas21(Te, name)
-1.771137529772e-02,
+1.469773755999e-01,
-1.213876050533e-02,
-1.213876050533e-02
-5.491593884657e-02
]
elseif name == "Fe"
coefficients = [
Expand All @@ -411,7 +420,7 @@ function adas21(Te, name)
+2.140105004146e-02,
-1.785057925001e-01,
+5.091860663164e-02,
+5.091860663164e-02
+6.171044344444e-02
]
elseif name == "Ni"
coefficients = [
Expand All @@ -426,7 +435,7 @@ function adas21(Te, name)
+1.513611521059e-01,
-2.308718720128e-01,
-9.023390843523e-03,
-9.023390843523e-03
+1.781391433306e-01
]
elseif name == "Kr"
coefficients = [
Expand All @@ -441,7 +450,7 @@ function adas21(Te, name)
+1.229092533413e-01,
+5.721604110683e-02,
-3.858573093198e-02,
-3.858573093198e-02
-7.656826000830e-02
]
elseif name == "Mo"
coefficients = [
Expand All @@ -456,7 +465,7 @@ function adas21(Te, name)
-1.749938253055e-01,
+7.007588723552e-02,
+8.557768114101e-02,
+8.557768114101e-02
-7.082562416821e-02
]
elseif name == "Xe"
coefficients = [
Expand All @@ -471,7 +480,7 @@ function adas21(Te, name)
+1.738552444143e-02,
+3.245918863202e-03,
-6.535620998184e-02,
-6.535620998184e-02
+3.866947213111e-03
]
elseif name == "Li"
coefficients = [
Expand All @@ -486,7 +495,7 @@ function adas21(Te, name)
+7.058675207572e-03,
-3.451108596954e-03,
-2.663068572132e-03,
-2.663068572132e-03
+6.045007428451e-03
]
elseif name == "H"
coefficients = [
Expand All @@ -501,7 +510,7 @@ function adas21(Te, name)
+4.909076663983e-05,
-5.820357621765e-05,
+8.674684934388e-05,
+8.674684934388e-05
-9.027712584843e-05
]
else
error("No line radiation for $name")
Expand Down
Loading