Run the Fleischman & Kuznetsov (2010) synchrotron code (pwkit.fk10)

This module helps you run the synchrotron code described in Fleischman & Kuznetsov (2010; hereafter FK10) [DOI:10.1088/0004-637X/721/2/1127]. The code is provided as a precompiled binary module. It’s meant to be called from IDL, but we won’t let that stop us!

The main interface to the code is the Calculator class. But before you can use it, you must install the code, as described below.

Installing the code

To do anything useful with this module, you must first obtain the precompiled module. This isn’t the sort of module you’d want to install into your system shared libraries, so for applications you’ll probably be storing it in some random directory. Therefore, all actions in this module start by specifying the path to the library.

The module can be downloaded from as part of a Supplementary Data archive attached to the journal paper. At the moment, the direct link is here, but that might change over time. The journal’s website for the paper should always have a link.

The archive contains compiled versions of the code for Windows, 32-bit Linux, and 64-bit Linux. It is quite worrisome that maybe one day these files will stop working, but that’s what we’ve got right now.

Anyway, you should download and unpack the archive and copy the desired file to wherever makes the most sense for your software environment and application. On 64-bit Linux, the file name is libGS_Std_HomSrc_CEH.so.64. Any variable named shlib_path that comes up in the API should be a path to this file. Note that relative paths should include a directory component (e.g. ./libGS_Std_HomSrc_CEH.so.64); the ctypes module treats bare filenames specially.

class pwkit.fk10.Calculator(shlib_path)[source]

An interface to the FK10 synchrotron routines.

This class maintains state about the input parameters that can be passed to the routines, and can invoke them for you.

Constructor arguments

shlib_path

The path to the compiled FK10 code, as described in the module-level documentation.

Newly-constructed objects are initialized with:

self.set_hybrid_parameters(12, 12)
self.set_ignore_q_terms(False)
self.set_trapezoidal_integration(15)

Setting parameters

set_bfield(B_G)

Set the strength of the local magnetic field.

set_bfield_for_s0(s0)

Set B to probe a certain harmonic number.

set_edist_powerlaw(emin_mev, emax_mev, ...)

Set the energy distribution function to a power law.

set_edist_powerlaw_gamma(gmin, gmax, delta, ...)

Set the energy distribution function to a power law in the Lorentz factor

set_freqs(n, f_lo_ghz, f_hi_ghz)

Set the frequency grid on which to perform the calculations.

set_hybrid_parameters(s_C, s_WH[, do_renorm])

Set the hybrid/renormalization control parameters.

set_ignore_q_terms(ignore_q_terms)

Set whether "Q" terms are ignored.

set_obs_angle(theta_rad)

Set the observer angle relative to the field.

set_one_freq(f_ghz)

Set the code to calculate results at just one frequency.

set_padist_gaussian_loss_cone(boundary_rad, ...)

Set the pitch-angle distribution to a Gaussian loss cone.

set_padist_isotropic()

Set the pitch-angle distribution to be isotropic.

set_thermal_background(T_K, nth_cc)

Set the properties of the background thermal plasma.

set_trapezoidal_integration(n)

Set the code to use trapezoidal integration.

Running calculations

find_rt_coefficients([depth0])

Figure out emission and absorption coefficients for the current parameters.

find_rt_coefficients_tot_intens([depth0])

Figure out total-intensity emission and absorption coefficients for the current parameters.

set_bfield(B_G)[source]

Set the strength of the local magnetic field.

Call signature

B_G

The magnetic field strength, in Gauss

Returns

self for convenience in chaining.

set_bfield_for_s0(s0)[source]

Set B to probe a certain harmonic number.

Call signature

s0

The harmonic number to probe at the lowest frequency

Returns

self for convenience in chaining.

This just proceeds from the relation nu = s nu_c = s e B / 2 pi m_e c. Since s and nu scale with each other, if multiple frequencies are being probed, the harmonic numbers being probed will scale in the same way.

set_edist_powerlaw(emin_mev, emax_mev, delta, ne_cc)[source]

Set the energy distribution function to a power law.

Call signature

emin_mev

The minimum energy of the distribution, in MeV

emax_mev

The maximum energy of the distribution, in MeV

delta

The power-law index of the distribution

ne_cc

The number density of energetic electrons, in cm^-3.

Returns

self for convenience in chaining.

set_edist_powerlaw_gamma(gmin, gmax, delta, ne_cc)[source]

Set the energy distribution function to a power law in the Lorentz factor

Call signature

gmin

The minimum Lorentz factor of the distribution

gmax

The maximum Lorentz factor of the distribution

delta

The power-law index of the distribution

ne_cc

The number density of energetic electrons, in cm^-3.

Returns

self for convenience in chaining.

set_freqs(n, f_lo_ghz, f_hi_ghz)[source]

Set the frequency grid on which to perform the calculations.

Call signature

n

The number of frequency points to sample.

f_lo_ghz

The lowest frequency to sample, in GHz.

f_hi_ghz

The highest frequency to sample, in GHz.

Returns

self for convenience in chaining.

set_hybrid_parameters(s_C, s_WH, do_renorm=True)[source]

Set the hybrid/renormalization control parameters.

Call signature

s_C

The harmonic number above which the continuous approximation is used (with special behavior; see below).

s_WH

The harmonic number above which the Wild-Hill BEssel function approximations are used.

do_renorm (default True)

Whether to do any renormalization at all.

Returns

self for convenience in chaining.

FK10 uses frequency parameters f^C_cr and f^WH_cr to control some of its optimizations. This function sets these parameters as multiples of the electron cyclotron frequency (f_Be in FK10 notation): e.g., f^C_cr = s_C * f_Be.

At frequencies above f^C_cr, the “continuum” approximation is introduced, replacing the “exact” sum with an integral. At frequencies above f^WH_cr, the Wild-Hild approximations to the Bessel functions are used. In both cases, the activation of the optimizations can result in normalization shifts in the calculations. “Renormalization” computes these shifts (by doing both kinds of calculations at the transition frequencies) and attempts to correct them. (Some of the FK10 documentation seems to refer to renormalization as “R-optimization”.)

If f^C_cr is below the lowest frequency integrated, all calculations will be done in continuum mode. In this case, the sign of s_C sets whether Wild-Hill renormalization is applied. If s_C is negative and f^WH_cr is above the lowest frequency integration, renormalization is done. Otherwise, it is not.

The documentation regarding f^WH_cr is confusing. It states that f^WH_cr only matters if (1) s_WH < s_C or (2) s_C < 0 and f^WH_cr > f_0. It is not obvious to me why s_WH > s_C should only matter if s_C < 0, but that’s what’s implied.

In most examples in FK10, both of these parameters are set to 12.

set_ignore_q_terms(ignore_q_terms)[source]

Set whether “Q” terms are ignored.

Call signature

ignore_q_terms

If true, ignore “Q” terms in the integrations.

Returns

self for convenience in chaining.

See Section 4.3 of FK10 and OnlineII.pdf in the Supplementary Data for a precise explanation. The default is to not ignore the terms.

set_obs_angle(theta_rad)[source]

Set the observer angle relative to the field.

Call signature

theta_rad

The angle between the ray path and the local magnetic field, in radians.

Returns

self for convenience in chaining.

set_one_freq(f_ghz)[source]

Set the code to calculate results at just one frequency.

Call signature

f_ghz

The frequency to sample, in GHz.

Returns

self for convenience in chaining.

set_padist_gaussian_loss_cone(boundary_rad, expwidth)[source]

Set the pitch-angle distribution to a Gaussian loss cone.

Call signature

boundary_rad

The angle inside which there are no losses, in radians.

expwidth

The characteristic width of the Gaussian loss profile in direction-cosine units.

Returns

self for convenience in chaining.

See OnlineI.pdf in the Supplementary Data for a precise definition. (And note the distinction between α_c and μ_c since not everything is direction cosines.)

set_padist_isotropic()[source]

Set the pitch-angle distribution to be isotropic.

Returns

self for convenience in chaining.

set_thermal_background(T_K, nth_cc)[source]

Set the properties of the background thermal plasma.

Call signature

T_K

The temperature of the background plasma, in Kelvin.

nth_cc

The number density of thermal electrons, in cm^-3.

Returns

self for convenience in chaining.

Note that the parameters set here are the same as the ones that describe the thermal electron distribution, if you choose one of the electron energy distributions that explicitly models a thermal component (“thm”, “tnt”, “tnp”, “tng”, “kappa” in the code’s terminology). For the power-law-y electron distributions, these parameters are used to calculate dispersion parameters (e.g. refractive indices) and a free-free contribution, but their synchrotron contribution is ignored.

set_trapezoidal_integration(n)[source]

Set the code to use trapezoidal integration.

Call signature

n

Use this many nodes

Returns

self for convenience in chaining.

find_rt_coefficients(depth0=None)[source]

Figure out emission and absorption coefficients for the current parameters.

Argument

depth0 (default None)

A first guess to use for a good integration depth, in cm. If None, the most recent value is used.

Return value

A tuple (j_O, alpha_O, j_X, alpha_X), where:

j_O

The O-mode emission coefficient, in erg/s/cm^3/Hz/sr.

alpha_O

The O-mode absorption coefficient, in cm^-1.

j_X

The X-mode emission coefficient, in erg/s/cm^3/Hz/sr.

alpha_X

The X-mode absorption coefficient, in cm^-1.

The main outputs of the FK10 code are intensities and “damping factors” describing a radiative transfer integration of the emission from a homogeneous source. But there are times when we’d rather just know what the actual emission and absorption coefficients are. These can be backed out from the FK10 outputs, but only if the “damping factor” takes on an intermediate value not extremely close to either 0 or 1. Unfortunately, there’s no way for us to know a priori what choice of the “depth” parameter will yield a nice value for the damping factor. This routine automatically figures one out, by repeatedly running the calculation.

To keep things simple, this routine requires that you only be solving for coefficients for one frequency at a time (e.g., set_one_freq()).

find_rt_coefficients_tot_intens(depth0=None)[source]

Figure out total-intensity emission and absorption coefficients for the current parameters.

Argument

depth0 (default None)

A first guess to use for a good integration depth, in cm. If None, the most recent value is used.

Return value

A tuple (j_I, alpha_I), where:

j_I

The total intensity emission coefficient, in erg/s/cm^3/Hz/sr.

alpha_I

The total intensity absorption coefficient, in cm^-1.

See find_rt_coefficients() for an explanation how this routine works. This version merely postprocesses the results from that method to convert the coefficients to refer to total intensity.