Line radiative transfer (ray-tracing)¶
ProDiMo includes a module to calculate the formal solution of line (+dust) radiative transfer to calculate emission line profiles and line fluxes.
Please note the line transfer can only be run for molecules included in the heating/cooling balance, as the population levels are calculated there. For certain molecules, you might have to activate dedicated switches to get the required transitions. See Heating and Cooling, and the List_of_transitions available.
Setup and options¶
Activate the line transfer¶
Settings in Parameter.in¶
To activate ProDiMo's line transfer, add the following lines to your Parameter.in:
------ line transfer? ------
.true. ! line_transfer : calculate line transfer?
.false. ! immediate_lines : line RT directly after init?
140.0 ! dist [pc] : distance
45.0 ! incl [deg] : inclination (0=face-on)
0.15 ! v_turb [km/s] : turbulent Doppler width
Required additional input file LineTransferList.in¶
During initialisation, ProDiMo will read an additional input file named LineTransferList.in, which has the following format:
number of lines, number of velo-points
5 151
upper level, lower level, vmax[km/s], name of molecule, line cube [optional]
2 1 10.0 CII F
2 1 15.0 OI F
3 2 15.0 OI T
2 1 30.0 o-H2O F
2 1 30.0 o-H2O_lte F
Here you can specify which lines of which molecules are to be calculated, and you can specify the velocity-range [-vmax ... +vmax] to be computed.
In the last column, one can switch on/off the production of a full line cube (channel map) per individual line. For this, the global channel maps option must be activated (see channel maps), otherwise, this column is ignored. For each line, 151+1 velocity points will be calculated here, where point 0 contains the pure continuum (line opacity=0). You can choose every spectral line (UV-radio) included in ProDiMo, currently about 3600 lines! See LineList.out to make your choice, but be careful; some species, like CO, will appear twice for historical reasons. ProDiMo will take the line properties and population numbers from the last heating/cooling species with matching name, so you should make your choice "from the bottom" of LineList.out.
Notice that ProDiMo uses a similar convention as Leiden-Lambda, i.e. the lowest transition is set to one.
Options for running only the line transfer¶
If the line transfer is activated it will be run automatically after the chemistry and if you have an iterative model after each iteration. Often it is useful to only run the line transfer (i.e. you want to have different inclinations) and in that case, there are options to speed up things after you have run a model at least once.
using immediate_lines and pop files¶
.true. ! line_transfer
.true. ! immediate_lines
.true. ! restart
With these settings the line transfer is calculated directly after the restart, taking the population numbers from pop_PRO_*.out. Make sure, in that case, that
.true. ! write_pop : Output the population numbers for a set of species.
is set in Parameter.in when the disk structure was calculated before. Be aware that NOT all species have their level population stored in pop***.out files, so that option might not work for all molecules.
using restart and freeze options¶
If you have run models without the pop***.out files or the pop files are not written for your species one can still use the restart option to calculate the line transfer as quickly as possible. The dust radiative transfer, the chemistry, and the gas temperature calculations will be taken from the restart file, which contains the results from your previous run.
The species populations will be recomputed as well as the ray tracing for the requested lines (see below). Without re-computing the dust RT, the Tgas iteration, and the gas/surface chemistry, the code runs are much shorter.
In Parameter.in for a parametric disk structure:
.true. ! freeze_RT : freeze radiative transfer results Td/Jv?
.false. ! freeze_diskstruc : freeze density/pressure structure?
.true. ! freeze_Tgas : freeze gas temperature?
.true. ! freeze_chemistry : freeze chemical concentrations?
.true. ! line_transfer : call for the line ray-tracing
.false. ! immediate_lines : no pop***.out files
.true. ! restart : needed if one use freeze_* = true
Number of rays¶
One can also control how many rays are used to do the line radiative transfer. This also controls the resolution e.g. the output image has. For details on those parameters see channel_maps.
The RT is done using concentric radial rings, where Nstar, Nhole, Ndisk and Npuff specify how many radial grid points a certain region has. While Nhole and Npuff use a linear spacing, Ndisk generates a logarithmically spaced grid. If you calculate lines that originate very close to the inner rim, such as CO vibrot lines, make sure that the resolution is adopted. Often Ntheta=360 is required to obtain smooth profiles.
Options for the velocity field¶
There are three options for the rotation velocity considered in the line radiativ Transfer. See for example For further details, see e.g. Rosenfeld et al. (2013), in particular, their equations 14, 15 and 16.
You can set the velocity field via the parameter
1 ! line_vkep : 0 ... thin-disk approximation (Keplerian velocity)
1 ... take the height of the disk into account for the rotation velocity
2 ... height and radial pressure gradient are considered
line_vkep=1 is the default value. For an application of the radial pressure gradient see Rab et al. (2020)
We note that line_vkep=2 replaces the now deprecated parameter line_vkepprad (i.e. should not be used anymore).
LTE line transfer¶
ProDiMo can be asked to calculate the profile of all transitions in LTE. You just need to add "_lte" at the end of the transition you request. For example, to ask for OI 63 micron in non-LTE and in LTE:
number of lines, number of velo-points
2 151
upper level, lower level, vmax[km/s], name of molecule
2 1 10.0 OI
2 1 10.0 OI_lte
Two additional output files will be created: line_fluxes.out (containing the fluxes Fnu(velo)) and line_image.out (containing velocity-collapsed 2D line intensities Iline(x,y) to calculate images, where Iline(x,y) = \int (Inu(x,y)-Icont(x,y)) dnu.
Options for analysing the results¶
There are a couple of options that allow you to switch off certain aspects of the line transfer. Those are mainly useful to investigate the impact of e.g. the velocity field, the background and stellar radiation field, or the impact of the dust on the resulting line emission. Those options will also affect the calculated spectra line profiles but also the channel maps if activated. We note one should not use those options to analyze things and to understand what is happening but not for e.g. comparing line profiles to observatoins etc.
- Deactivate the stellar and/or the background radiation field
For the line ray-tracing also the stellar and a background radiation field are considered. This can be switched off by setting those parameters.
.true. ! line_nostar : ignore the stellar emission in the line transfer
.true. ! line_nobackground : ignore the background radiation field in the line transfer
- switch off the velocity field
By setting
.true. ! line_novel : switch off the global disk velocity field for the line transfer
one can switch off the global velocity field. The shape of the line profile will then be only determined by the local conditions for thermal and turbulent line broadening.
- ignore the dust
For the line ray tracing ProDiMo also considers the dust component which can for example absorb parts of the lines (i.e. from the backside of the disk). Switching on this parameter
.true. ! line_nodust : ignore the dust for the line transfer
will neglect the dust for both, as an emission and as an opacity source for the line ray-tracing.
Calculate lines within wavelength/frequency ranges¶
From revision 371fba62 (14/4/2016)
There is a new optional input file: LineRangeList.in (see /input_examples/line_range_input/LineRangeList.in). The inputs in LineRangeList.in will overwrite those in LineTransferList.in (see below). The new input allows to ask ProDiMo to perform a ray-tracing for transitions in ranges of wavelengths (micron)/frequencies (GHz) for a specific species or all species in the ranges lte/nlte populations are possible. This option then does everything what LineTransferList.in implies. The other switches will perform as before.
Warning ProDiMo will create/overwrite the existing !LineTransferList.in. Be careful and save a copy_LineTransferList.in if you want to keep a previous version.
An example of LineRangeList.in
number of lines, number of velo-points
6 151
minimum maximum vmax[km/s] Emax[K] units(micron or GHz) lte/nlte species (all/ALL/CO ...) comments
225.3 235.0 8.0 100. GHz nlte all always something around 12CO 2-1
200.0 260. 8.0 100. GHz nlte C18O isotopologue of CO
1300. 1329. 8.0 100. micron lte o-H2CO only lines from H2CO is needed at LTE
344.0 347.0 8.0 150. GHz nlte CO ...
4.64 4.68 15.0 5550. micron nlte CO a few CO ro-vibrational lines
223.0 223.5 8.0 100. GHz nlte all ...
Here we require the 6 ranges to be taken into account and request 151 (odd number) velocity bins (channels). The first two columns are the minimum and maximum value in the units of GHz (frequency) or micron (wavelength). vmax[km/s] is the minimum/maximum velocity, i.e. the first channel will be at -vmax and the last channel will be at +vmax. Lines can be computed with populations at lte or nlte. all means that all the transitions found in the range with upper level energy below Emax[K] will be included for the ray-tracing. Otherwise please indicate the species (i.e. transition type) like CO 13CO o-H2CO, ... Comments have to be always provided (use ... if you have nothing to say).
Here is a way to generate a CO rotational Spectral Line Energy Distribution (SLED) up to J=29-28:
number of lines, number of velo-points
1 151
minimum maximum vmax[km/s] Emax[K] units(micron or GHz) lte/nlte species (all/ALL/CO ...) comments
50.0 5000.0 8.0 3000. micron nlte CO CO SLED nlte
Comparing model line fluxes with observations¶
If you want a summary of how good the predicted line fluxes and FWHM fit to the observed ones, you'll need another input file called LINEobs.dat which contains entries for line flux [W/m2], sigma_flux [W/m2], FWHM [km/s] and sigma_FWHM [km/s].
If you have observations at 3 positions ([OI] at 63 micron, CO 2-1 at 230.538 GHz and CO 1-0 at 115.271 GHz. One can request ProDiMo to automatically compare the model output to the observations described in the file LINEobs.dat
2.0 ! version
flux[W/m2] sig[W/m2] FWHM[km/s] sig[km/s] flag
28.60E-18 1.88E-18 0.0 0.0 ok
5.90E-18 1.70E-18 0.0 0.0 ok
6.50E-20 1.5E-21 0.0 0.0 ok
Use "0.0 0.0" if FWHM is unknown. For the flag you can use also ul (upper limit). These informations are essential for automated fitting. The order of lines has to be the same as in LineTransferList.in
One can also use LineRangeList.in to provide the necessary input for ProDiMo to model the line and give a chi^2.
number of lines, number of velo-points
3 151
minimum maximum vmax[km/s] Emax[K] units(micron or GHz) lte/nlte species (all/ALL/CO ...) comments
62. 64. 20. 500. micron nlte OI 63 micron Herschel
230.4 230.6 10.0 100. GHz nlte CO J=2-1
115.1 115.3 10. 100. GHz nlte CO J=1=0
One has to provide here 3 wavelength/frequency ranges for the corresponding species (OI, CO, and CO). The line order has to be the same between the two files.
The generated LineTransferList.in reads
number of lines, number of velo-points
3 151
upper level, lower level, vmax[km/s], name of molecule
2 1 20.00 O
3 2 10.00 CO
2 1 10.00 CO
The screen output looks like this
line u -> l lamb[mic] Fmodel[W/m^2] Fobs[W/m^2] err FWHM[km/s] FWHMobs err
No extinction data found
O 002->001 63.1837 ok 1.9337E-16 2.8600E-17 12.741 13.36 0.00 0.000
No extinction data found
CO 003->002 1300.4036 ok 1.6131E-19 5.9000E-18 -12.492 3.52 0.00 0.000
No extinction data found
CO 002->001 2600.7579 ok 1.8423E-20 6.5000E-20 -8.405 3.45 0.00 0.000
==> LINE-chi = 11.3877
Obviously, here the match is bad.