; docformat = 'rst'
;+
; Return comoving distance to z, in Mpc
;-
;+
; Integrand for comoving distance integral
;-
FUNCTION ajs_comdis_er, z
compile_opt idl2, hidden
COMMON cosmology, omega_m, omega_l
return, 1.0 / sqrt(omega_m * (1 + z) ^ 3 $
+ (1 - omega_m - omega_l) * (1 + z) ^ 2 $
+ omega_l)
END
;+
; Integrand for lookback time integral
;-
FUNCTION ajs_lookback_er, z
compile_opt idl2, hidden
return, ajs_comdis_er(z) / (1 + z)
END
;+
; Return comoving distance to z, in Mpc
; :Params:
; z, in, required
; Redshift (or array of values)
; :Keywords:
; omega_m : in, optional
; Matter density (default 0.3)
; omega_l : in, optional
; Vacuum energy density (default 0.7)
; h0 : in, optional
; Hubble constant (default 100)
; c : in, optional
; Speed of light (default 299792.458 km/s)
; slow : in, optional
; Set /slow to force calculation for each value (defaults to
; interpolation if input array has more then 10,000 elements)
; lookback_time : in, optional
; Set /lookback_time to return lookback time in seconds. See
; ajs_lookback_time and ajs_zage.
; :History:
; 13 Mar 2008 Written, Anthony Smith
;
; 10 Oct 2008 Added lookback_time, AJS
;
; 16 Jan 2009 Corrected bug, which was affecting large input arrays
;-
FUNCTION ajs_comdis, z, omega_m=omega_m, omega_l=omega_l, h0=h0, c=c, $
slow=slow, lookback_time=lookback_time
compile_opt idl2
COMMON cosmology, o_m, o_l
IF n_elements(omega_m) EQ 0 THEN $
o_m = 0.3 $
ELSE $
o_m = omega_m
IF n_elements(omega_l) EQ 0 THEN $
o_l = 0.7 $
ELSE $
o_l = omega_l
IF n_elements(h0) EQ 0 THEN $
h0 = 100
IF n_elements(c) EQ 0 THEN $
c = 299792.458
z = double(z)
IF n_elements(z) GT 1e4 AND NOT keyword_set(slow) THEN BEGIN
z_arr = ajs_linspace(min(z), max(z), 5001)
d_arr = ajs_comdis(z_arr, omega_m=o_m, omega_l=o_l, h0=h0, c=c, $
lookback_time=lookback_time)
d = interpol(d_arr, z_arr, z, /quadratic)
ENDIF ELSE BEGIN
IF keyword_set(lookback_time) THEN $
d = qromb('ajs_lookback_er', 0, z, /double) / h0 * 3.085678e19 $
ELSE $
d = qromb('ajs_comdis_er', 0, z, /double) * c / h0
ENDELSE
return, d
END