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.
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).
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
Lorenz96.jl is registered so simply do
] add Lorenz96where ] opens the package manager
