# Lorenz96.jl - A type-flexible Lorenz 1996 model

Lorenz96.jl simulates the Lorenz 96 system with one level (two and three level version planned) for any given number type, as long as conversions (to and from Float64) and arithmetics (+,-,*) are defined - the scaled equations are written division-free. Output always in Float64.

Also supports mixed precision: Different number types can be defined for prognostic variables and calculations on the right-hand side, with automatic conversion on every time step.

## Usage

```
using Lorenz96
X = L96()
```

simulates the Lorenz system with `Float64`

and standard parameters. Providing the type (which has to be a subtype of `AbstractFloat`

), returns the simulation calculated in that type (though output in `Float64`

)

```
using SoftPosit
X = L96(Posit32)
```

Change parameters by specifying optional arguments

`X = L96(Float32,N=100_000,n=36,X=zeros(36),F=8.0,s=1.0,η=0.01,Δt=0.01,scheme="RK4")`

with `N`

the number of time steps, `n`

number of variables, `X`

the initial conditions, `F`

the forcing constant, `s`

a scaling factor of the equations (that will be undone for storage), `η`

the perturbation that is added on `X₁`

for the default `X`

, `Δt`

the time step, and `scheme`

the time integration scheme. `α`

is additional parameter that increases the friction for `α>1`

.

For mixed precision you also specify a type `Tprog`

as the second argument, which is the type used for the prognostic variables

`X = L96(Float16,Float32)`

Here, the prognostic variables are kept at single-precision (Float32), but calculations on the right-hand side are performed in half-precision (Float16).

## Equations

The Lorenz system is scaled with `s`

and therefore the prognostic variables are actually `sX -> X`

. The RHS then reads with `s_inv = 1/s`

```
dX_i/dt = (X_i+1 - X_i-2)*X_i-1*s_inv - α*X_i + F
```

## Installation

Lorenz96.jl is registered so simply do

`] add Lorenz96`

where `]`

opens the package manager