`Cosmology.jl`

is the
cosmology calculator for
Julia. After you define a cosmological model, you can use it to perform some
operations like computation of angular diameter distance or comoving radial
distance at given redshift values, or calculate the age of the Universe in a
certain cosmological model at a specific redshift.

The package doesn’t have a full documentation, but the information in the
`README.md`

file should be sufficient to get you started, if you’re already
familiar with the topic.

`Cosmology.jl`

is a registered package, so you can install it in the Julia REPL
with the package manager:

```
pkg> add Cosmology
```

## New release

A few days ago version
`v0.5.0`

has
been released. The main new feature is the long-awaited integration with
`Unitful.jl`

and
`UnitfulAstro.jl`

. This means
that the functions defined in this package now return a number with proper
physical units. For example:

```
julia> using Cosmology
julia> c = cosmology(h=0.7, OmegaM=0.3, OmegaR=0, w0=-0.9, wa=0.1)
Cosmology.FlatWCDM{Float64}(0.7, 0.0, 0.7, 0.3, 0.0, -0.9, 0.1)
julia> comoving_radial_dist(c, 0.6)
2162.83342244173 Mpc
```

Previously, instead, the units were attached to the name of the function, without possibility to easily change units. These methods are now deprecated:

```
julia> comoving_radial_dist_mpc(c, 0.6)
┌ Warning: `comoving_radial_dist_mpc(c::AbstractCosmology, z; kws...)` is deprecated, use `ustrip(comoving_radial_dist(c::AbstractCosmology, z; kws...))` instead.
│ caller = top-level scope at none:0
└ @ Core none:0
2162.83342244173
```

In addition, now you can select a different unit for the output by simply passing the desired output unit as first argument:

```
julia> using Unitful
julia> comoving_radial_dist(u"ly", c, 0.6)
7.054219146683016e9 ly
```

## Integration with Measurements.jl

`Cosmology.jl`

is one of the several examples of how easy is in Julia to combine
together structures from different and independent packages. Thanks to Julia’s
type system:

- the data structure used in this package to represent a cosmological model and
the units data structure in
`Unitful.jl`

don’t know anything about each other (in`Cosmology.jl`

the numbers are just multiplied by the appropriate unit, in the most natural way possible), - units in
`Unitful`

and the`Measurement`

structure in`Measurements.jl`

don’t know anything about each other, - by now you can already tell that
`Measurement`

and the data structure for cosmological models don’t know anything about each other,

yet, we can use numbers with uncertainties as parameters of cosmological models
or for the redshift. This enable use to propagate the uncertainties through the
operations performed by `Cosmology.jl`

getting the results with the appropriate
physical units.

As an example, we can define a cosmological model using the parameters determined by the Planck collaboration in 2015:

```
julia> using Cosmology, Measurements
julia> planck2015 = cosmology(h=0.6774±0.0046, OmegaM=0.3089±0.0062, Tcmb=2.718±0.021, Neff=3.04±0.33)
Cosmology.FlatLCDM{Measurement{Float64}}(0.6774 ± 0.0046, 0.6910099044166828 ± 0.006200002032729847, 0.3089 ± 0.0062, 9.009558331733912e-5 ± 5.020543222494152e-6)
```

Now we calculate the comoving volume at redshift z = 3.62±0.04:

```
julia> z = 3.62 ± 0.04
3.62 ± 0.04
julia> cv = comoving_volume(planck2015, z)
1471.004984671155 ± 45.25029615715926 Gpc^3
```

`Measurements.jl`

provides a utility,
`Measurements.uncertainty_components`

,
to determine the contribution to the total uncertainty of a quantity:

```
julia> Measurements.uncertainty_components(cv.val)
Dict{Tuple{Float64,Float64,UInt64},Float64} with 5 entries:
(3.04, 0.33, 0x0000000000000005) => 0.0499315
(0.3089, 0.0062, 0x0000000000000003) => 27.5208
(3.62, 0.04, 0x0000000000000006) => 19.8259
(0.6774, 0.0046, 0x0000000000000002) => 29.952
(2.718, 0.021, 0x0000000000000004) => 0.0348057
```

This means that the major contributions to the uncertainty of `cv`

comes from
the Hubble parameter (`0.6774±0.0046`

) and the matter density (`0.3089±0.0062`

).

We can also compute, in this cosmological model, the age of the Universe today and at redshift z = 1.42:

```
julia> age(planck2015, 0) # Age of the Universe today
13.79748128449975 ± 0.12164948254546123 Gyr
julia> age(planck2015, 1.42) # Age of the Universe at redshift z = 1.42
4.481579852131797 ± 0.05168067053818648 Gyr
```

`lookback_time`

gives the difference between age at redshift 0 and age at
redshift z:

```
julia> lookback_time(planck2015, 1.42)
9.315901432385681 ± 0.07270835053850357 Gyr
```

Note that uncertainties are always propagated taking care of the correlation between quantities. Indeed, we can check that the sum of the lookback time at redshift z and the age of the Universe at the same redshift is equal to the age of the Universe today, up to numerical errors of the integrals involved in the calculations:

```
julia> lookback_time(planck2015, 1.42) + age(planck2015, 1.42)
13.797481284517477 ± 0.12164948254345108 Gyr
```