Increased resolution simulation of microwave (MW) emission from flares, in particular the foot regions.
Focus on gyrosynchrotron (GS) emission.
Output from PJAS' gyro3d
(IDL)
An emission map plotted in MATLAB
.
GS Simulation as per PJAS' modified version of Ramaty's code, given a quick optimisation pass
Volumetric Raytracing
Original aim was to provide arbitrary flare geometry
Our modified torus presenting a flare shape with −20\(^{\circ}\) lean, at latitude 30\(^{\circ}\) and longitude 70\(^{\circ}\). The shape also presents a 30\(^{\circ}\) back angle and 40\(^{\circ}\) asymmetry or inclination.
Extensible modular modern C++ core
Interpreted full featured Lua scripting front-end.
Unless modifying the software beyond its design role, most users should never have need to touch the C++.
Extensive documentation and examples for the front-end (See users manual). API reference provided for the core.
MATLAB
script (available in the user's manual),
but these are also easily creatable with free software such as gnuplot
, using the following
script:
set terminal pdf color
set datafile separator ","
set output "Colormap.pdf"
set key off
set xrange [0:800]
set yrange [0:800]
set title "Brightness Temperature (K) of ordinary mode of Flare at 1GHz"
plot "th.1.000000GHz.O.csv" matrix with image
This can easily be meta-programmed using bash
, python
, perl
etc. to automatically fill in the
graph titles from the filenames, much as the MATLAB
script does.
IDL
also works well for this task, as does R
for more in-depth statistical processing.
function ArcToCMSun(h)
-- DegToRad / "perDeg * AstroUnit
return math.pi / 180.0 / 3600.0 * 1.49597870e13 * h
end
function CMSunToArc(h)
return h / (math.pi / 180.0 / 3600.0 * 1.49597870e13)
end
densityScaleHeight = CMSunToArc(130e5);
kappa = 10
loopDensity = 10e9
photDensity = 1.16e17
function BMagnitude(s)
if (math.abs(s) > highResRadialPos) then
return 600 + ((20 * math.abs(s) - highResRadialPos)
/ (1- highResRadialPos))^2
else
return 200 + ((20 * math.abs(s))
/ highResRadialPos)^2
end
end
function PlasmaDensity(h)
if (h < highResHeight) then -- roughly based on Battaglia et al. ApJ 752
local nExp = loopDensity + photDensity * math.exp(-h / densityScaleHeight)
local nk = photDensity * (1 + h / (kappa * densityScaleHeight))^(-kappa + 1)
return nExp + nk
else
return 1.0e9
end
end
function Temperature(h)
if (h < highResHeight) then
return 5000 + 5000 * (h / highResHeight)
else
return 2.0e7
end
end
function NonThermalDensity(s)
return 1.0e6
end
function Delta(s)
return 4.0
end
function EnergyMinMax(s)
return 10, 5000
end
RT.SetViewportSize(25,25)
RT.AddLoop('l1')
l1.SetSolarSize(8, 2, 0.2)
l1.SetSolarLoc(0, 60, 40, 70)
l1.SetHighRes(2, 2)
l1.SetDomains(20)
RT.CullDomains()
RT.LoadFreqList('logFreqs.csv')
RT.GUpdate()
RT.SaveAllCSVs('flare1')
Raycasting against large number of domains
Alternative: Replace current domain system with something like BSP
The most time-consuming part of the GS simulation is the Bessel function calculations. These are responsible for peaks in the emission spectrum, however it may be a good idea to use an interpolation scheme depending on the precision that is actually required.
Investigation required.
Other geometry types
Other frequency ranges
The above would require slight modifications of currently hard-coded constants if non-solar bodies were to be analysed.
Made by Íñgo Quílez, using a 4KB binary, no external files, renders on a 4 year old GPU in near real time.
I would like to thank Dr. Simões (my advisor), and the University of Glasgow Astronomy department for supporting me and funding this project. I also wish to thank all the coders whose previous work has been invaluable.