Back to my home page


CMB from ACTive sources

such as cosmic strings

This code is based on the cosmic string model described in astro-ph/9903361 by Pogosian and Vachaspati, and CMBFAST created by Uros Seljak and Matias Zaldarriaga. It contains an integrator for the vector contribution to the CMB temperature and polarization.

Version 4.0

In this version, I fixed several important bugs and made some improvements. Namely,

- removed an extra factor of 2 in the normalization of all vector mode spectra

- fixed the sign of vector E- and B-mode source functions, which affected the vector part of TE correlation (thanks to Adam Moss)

- fixed the initialization of tf(i) array in muxip (thanks again to Adam Moss).

- removed the option that randomized velocities

- updated the velocity dependent one-scale (VOS) model to eliminate k as a free parameter and make it a function of v as prescribed in the Martins and Shellard paper. Also eliminated interpolation of the \tilde{c} parameter from radiation to matter,  it's now a constant. Parameters dksi and vdev set the initial conditions, but the evolution is largerly independent of them. I kept them as parameters in case one wants to hardcode them as constant scaling parameters and bypass the VOS equations.

- Made wiggliness alpha a constant. It was only an effective parameter, and there was no clear model for its evolution. It gives an additional degree of freedom that can be used to tune the unequal-time-correlators (UETC) of the unconnected segement model to the UETC found in simulations.

- made the code compatible with the latest gfortran

Version 3.0

This version is a significant refurbishment of the code.

All parameters are now set in the main routine.

The code is reconfigured to make it easier to use with or without active sources. To produce inflationary CMB spectra one simply sets the string tension to zero (gmu=0.0d0). For a non-zero value of tension only the string contribution is calculated.

An option is added to randomize the directions of velocities of consolidated segments as they evolve in time. In the original segment model, which is still the default version (irandomv=0), each segment is given a random velocity initially, but then continues to move in a straight line for the rest of its life. The new option (irandomv=1) allows to additionally randomize velocities of each segment at roughly each Hubble time. However, the merits of this new option are still under investigation. The default version (irandomv=0) is strongly recommended, since it actually gives reasonable unequal time correlators. For each Fourier mode, k, the string stress-energy components are now evaluated on a time grid sufficiently fine for that k.

Version 2.0

Errors in the vector mode calculation pointed out by Anze Slosar are now fixed. Also, a missing overall factor of 2 multiplying all spectra was discovered and fixed. Details of the fixed errors can be found in astro-ph/0604141.

Previous updates

Added evaluation of the B-polarization spectrum

Compiling and running the code

The code contains remnants of autotasking directives that were used to run an older version of this code in  parallel. They do not work now and will be ignored by f77 or f90 compilers.

The code uses a file jlgen.dat as an input.

Before running the code you must compile and run jlgen.f. When asked, input l=3000, keta=6000 and name of the file = jlgen.dat . If other parameters are desired, you'll need to edit the corresponding values in subroutine initlval. Also make sure that is in the same directory. Files jlgen.f and are included in the compressed package.

Once jlgen.dat is created, compile cmbact.f with the optimization flag -O2, e.g. g77 -O2 cmbact.f

Input and Output

The code does not output anything on the screen, nor it requires any input from the terminal,

Set the values of cosmological parameters, string model parameters, and output file names in the main routine.

Default tension is $G\mu = 1.1e-6$

The code calculates the CMB temperature anisotropy and the matter  power spectrum sourced by a model network of strings. The results  are averages over NEXP realizations (runs) of the network. The variable NEXP should be set in the main routine

Outputs are written to files created in subroutine openfiles:

 cl_tt.d       TT power spectrum (4 columns): l, scalar, vector, tensor
 cl_te.d      TE power spectrum (4 columns): l, scalar, vector, tensor
 cl_ee.d      EE power spectrum (4 columns): l, scalar, vector, tensor
 cl_bb.d     BB power spectrum (3 columns): l, vector, tensor 
 pk_lin.d    linear CDM P(k) (2 columns): k/h Mpc^{-1}, 4piP(k)

 NOTE: Output for TT,TE,EE and BB is (T_cmb)^2 l(l+1)Cl/2pi. Output for  matter power spectrum is 4piP(k).

Computer resources required

When compiled with -O2 the code will require at least 110 Mb of memory to run. 

The time is proportional to the number of experiments (realizations) that you want to average over. NEXP = 100 takes about 3 hours on a single 3 GHz Pentium 4 processor . You can choose not to include vector and tensor contributions and decrease the time by three. However, for cosmic strings the vector modes are as important as scalars, and should not be neglected.

I suggest running the code with NEXP=2 first, to test and to get an estimate of how much time it will take.

Download the code

You can download the code as a tar.gz file containing cmbact4.f,  jlgen.f  and

With further questions e-mail levon<at>