The *cosmo.el*
package is a cosmological calculator for the Emacs text editor
(also available from
the MELPA repository).
It provides interactive commands for handy computation of
cosmological distance measures defined
in Hogg
(1999) for ΛCDM models. For instance, the
command *M-x cosmo-calculator* displays a summary table.

All cosmological quantities are computed at a given value of
the gravitational redshift of photons frequency due to the
expansion of the Universe. The ΛCDM model is
characterized by the following parameters (set through the
command *M-x cosmo-set-params*):

*H0*: Hubble parameter (expansion rate) today (e.g., 70 km/s/Mpc).*omatter*: Matter density parameter today (e.g., 0.3).*olambda*: Cosmological constant density parameter (e.g., 0.7).*orel*: Relativistic species density parameter today (e.g., 0.0001).

(The curvature density parameter today is automatically derived from the others above according to Friedmann's equation.)

The package is mainly meant to provide a handy reference to common cosmological quantities directly from the text editor. It is not supposed to be used for heavy computations (Elisp itself is certainly not the optimal choice for numerical computations).

Besides the interactive command, some function can also be
imported in other Lisp programs (names with a double
hyphen *--* are for functions and variables that are meant
to be for internal use only). First load the package:

```
(require 'cosmo)
```

Some function deal with generic numerical utilities. For
instance, numerical quadrature (below we
integrate *x ^{2}* from 0 to 1 with Simpson's
rule) or fundamental functions that extend Elisp mathematical
library (below we call the hyperbolic sine and its inverse).

```
;; integrate(x^2, x, 0, 1) = 1/3
(cosmo-qsimp '(lambda (x) (* x x)) 0 1)
;; => 0.3333331523586992
(cosmo-sinh 0.5)
;; => 0.5210953054937474
(cosmo-asinh 0.5)
;; => 0.48121182505960347
```

Each distance measure can be called through a function with a
name similar to the respective interactive command, extended
by a *-get-* infix. For instance, the function
*cosmo-get-luminosity-distance* corresponds to the
command *M-x cosmo-luminosity-distance*. It takes as
argument the redshift *z*. For instance, the luminosity
distance in units of Mpc at redshift z=0.1 is:

```
(cosmo-get-luminosity-distance 0.1) ; Mpc
;; => 459.48679270216024
```

This provides a handy interface for exploratory computations
from any Emacs buffer. For instance, let's compute the first
derivative of the luminosity distance *D _{L}'(z)* at

```
(defun DM-prime (z)
"Comoving distance (transverse) first derivative in Mpc."
(* (cosmo-inv-efunc z) (cosmo-get-hubble-distance)))
(defun DL-prime (z)
"Luminosity distance first derivative in Mpc."
(let ((DM (cosmo-get-transverse-comoving-distance z))
(DMp (DM-prime z)))
;; DL(z) = (1+z) * DM(z), hence DL'(z) = (1+z) * DM'(z) + DM'(z).
(+ (* (1+ z) DMp) DM)))
(DL-prime 0.1) ; Mpc
;; => 4914.0412065178225
```

Let's check that *D _{L}'(z) / D_{H} =
1*, where

```
(let* ((z 0.0)
(DLp (DL-prime z))
(DH (cosmo-get-hubble-distance)))
(/ DLp DH))
;; => 1.0
```

Cosmological parameters are stored in a hash table called
*cosmo--params*. As the double hyphen in the name
indicates, the variable is meant for internal use
only. However, nothing prevents to do it if someone is aware
of the consequences. For instance, the following function can
be used to set cosmological parameters without calling the
interactive command *M-x cosmo-set-params* (and it may
become part of the package interface).

```
(defun cosmo-set-my-default (H0 omatter olambda orel)
"Set default test cosmological parameters.
Argument H0 Hubble parameter [Km/s/Mpc].
Argument OMATTER matter density parameter today.
Argument OLAMBDA cosmological constant density parameter.
Argument OREL relativistic density parameter today."
(puthash "H0 [Km/s/Mpc]" H0 cosmo--params)
(puthash "omatter" omatter cosmo--params)
(puthash "olambda" olambda cosmo--params)
(puthash "orel" orel cosmo--params)
nil)
(cosmo-set-my-default 67.0 0.27 0.7 4e-5)
(cosmo-get-ocurvature)
;; => 0.029900000000000027
(cosmo-get-luminosity-distance 0.1) ; Mpc
;; => 480.4648601303271
```

Once the new cosmological parameters are set, the curvature parameter changes consistently, as well as other values such as the luminosity distance.

Let's now increase the precision of numerical integrals. This
can done interactively through Emacs *M-x customize*
command, and adapting the options under the *Cosmo*
group. Alternatively, the respective variables that control
the fractional precision and the maximum number of steps can
be set as follow. Note that we change them within a *let*
statement, so that the change will only take place locally and
the global values are unchanged. (The requested fractional
precision below is quite high, so it may take a while to run
with Elisp.)

```
(let ((cosmo-int-prec 1e-8) ; Default: 1e-3
(cosmo-int-maxsteps 25)) ; Default: 20
(cosmo-get-luminosity-distance 0.1)) ; Mpc
;; => 481.64846692907696
```

Let's consider a final example. First, improve the default
precision. Then, set a list of redshifts *z* and compute
the respective luminosity distance *D _{L}(z)*
(mapping the respective function to each redshift). Retrieve
also the Hubble distance

```
(let* ((cosmo-int-prec 1e-4)
(redshifts '(0.1 0.5 1.0))
(DLs (mapcar 'cosmo-get-luminosity-distance redshifts)) ; Mpc
(DH (cosmo-get-hubble-distance)) ; Mpc
(dL ())) ; DL/DH
(dolist (DL DLs) (push (/ DL DH) dL))
(reverse dL))
;; => (0.10757189225827068 0.6651149194795717 1.5614017653281118)
```