Chimera model with two different delays
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Chimera and dissipative solitons demonstrations in a system | |
-- with two strongly different delays \tau_2 = 100*\tau_1 from arXiv:1712.03283 | |
-- | |
-- How to execute: | |
-- 1. Save the code to Chimera.hs | |
-- 2. Install stack (command line interface is marked by $): | |
-- $ wget -qO- https://get.haskellstack.org/ | sh | |
-- OR | |
-- $ curl -sSL https://get.haskellstack.org/ | sh | |
-- 3. Run: | |
-- $ stack --resolver lts-10.6 --install-ghc runghc --package free-vector-spaces-0.1.4.0 --package dde-0.3.0 Chimera.hs | |
-- | |
-- Troubleshooting: | |
-- 1. Make sure gcc compiler is installed by typing | |
-- $ gcc | |
-- To install gcc on Mac OS X: | |
-- $ xcode-select --intall | |
-- To install gcc on Ubuntu: | |
-- $ sudo apt-get install build-essential | |
-- Parameters to experiment with | |
-- | |
-- 1. Dissipative solitons | |
-- | |
-- beta = 1.6 | |
-- gamma = 0.83 | |
-- phi0 = -0.67 | |
-- m = 50 | |
-- epsilon = 0.01 | |
-- delta = 0.009 | |
-- | |
-- NB: Transient time has to be at least | |
-- 20 long delays \tau_2, | |
-- i.e. 20 * 100 * 2000 = 4,000,000 iterations. | |
-- | |
-- 2. Incoherent core | |
-- | |
-- beta = 1.1 | |
-- gamma = 0.5 | |
-- phi0 = -0.5 | |
-- m = 50 | |
-- epsilon = 0.01 | |
-- delta = 0.009 | |
-- | |
-- NB: Transient time has to be at least | |
-- 50 long delays \tau_2. | |
-- | |
-- 3. Coherent core | |
-- | |
-- beta = 1.1 | |
-- gamma = 0.5 | |
-- phi0 = -0.05 | |
-- m = 50 | |
-- epsilon = 0.01 | |
-- delta = 0.009 | |
-- | |
-- NB: Transient time has to be at least | |
-- 50 long delays \tau_2. | |
-- | |
-- Note: to compute for longer transient times, consider discarding | |
-- intermediate data. | |
import Linear ( V2 (..) ) -- From `linear` package | |
import qualified Data.Vector.Storable as V -- From `vector` package | |
import qualified Numeric.DDE as DDE -- From `dde-0.3.0` package | |
-- Model equation | |
rhs phi0 = DDE.RHS derivative | |
where | |
derivative ((V2 x y), (DDE.Hist histSnapshots), _) = V2 x' y' | |
where | |
-- DDE Eq. (4) from arXiv:1712.03283 | |
x' = (-x - delta * y + (1 - gamma) * f x_tau1 + gamma * f x_tau2) / epsilon | |
y' = x | |
f = airy phi0 | |
-- Delay terms where tau2 / tau1 = 100 | |
(V2 x_tau1 _):(V2 x_tau2 _):_ = histSnapshots | |
-- Constants | |
epsilon = 0.01 | |
gamma = 0.5 | |
delta = 0.009 | |
-- Airy function definition | |
airy phi0 x = beta / (1 + m * (sin (x + phi0))^2) | |
where | |
m = 50 | |
beta = 1.6 | |
model phi0 hStep len1 len2 totalIter = (state1, V.map (\(V2 x y) -> x) trace) | |
where | |
-- Initial conditions: | |
-- dynamical state and delay history. | |
state0 = V2 0.0 0.0 | |
hist0 = V.fromList $ map (\n -> let x = sin(2 * pi * fromIntegral n / 1000) | |
in V2 x 0.0) [1..len2] | |
-- Input is ignored in `rhs` | |
inp = DDE.Input $ V.replicate (totalIter + 1) 0 | |
delaysInSamples = [len1, len2] | |
(state1, trace) = DDE.integ DDE.rk4 state0 hist0 delaysInSamples hStep (rhs phi0) inp | |
-- Control parameter | |
phi0 = -0.45 | |
main = do | |
let hStep = 0.0005 -- Integration step | |
tauD1 = 1.0 -- Short delay time | |
len1 = round $ tauD1 / hStep -- Samples per short delay | |
len2 = 100 * len1 -- Long delay (in samples) | |
delays = 20 -- 20 long delays | |
total = delays * len2 | |
let (state1, trace) = model phi0 hStep len1 len2 total | |
mapM_ print $ V.toList trace |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment