'Program LEPLOT.BAS makes plot of largest LE for Smith, Thiffeault, Horton model vs. Vsw
'(c) 2000 by J. C. Sprott
'Compile with PowerBASIC for DOS 3.5
'$error all on
SCREEN 12
defext a - z
shared a1, a2, b1, b2, b3, d1, f1, g1, g2, g3, vsw
randomize timer
line(0, 0) - (639, 479), ,b
for i%=1 to 9
line(64*i%,479)-(64*i%,469)
line(64*i%,1)-(64*i%,11)
line(1,48*i%)-(11,48*i%)
line(629,48*i%)-(639,48*i%)
next i%
pset(0,240)
call insolve(1, 1, 638, 478)
while inkey$ <> chr$(27): wend
end
SUB calculate(xp%, yp%, le!)
h = 0.1 'Iteration step size
dr = 1e-8 'Perturbation for LE calculation
x = .06: y = .11: z = 43: w = .75
xe = x + dr: ye = y: ze = z: we = w
a1 =.247
a2 =.391
b1=10.8
b2=0.0752
b3=1.06
d1=2200
f1=2.47
g1=1080
g2=4
g3=3.79
vsw=.01+9.99*xp%/639
iter& = 0: lsum = 0: ub% = 0
for j& = 1 to 200000
call rk4(x, y, z, w, h)
call rk4(xe, ye, ze, we, h)
dx = xe - x: dy = ye - y: dz = ze - z: dw = we - w
dsq = dx * dx + dy * dy + dz * dz + dw * dw
rs = sqr(dsq) / dr
if rs > 0 then
xe = x + dx / rs: ye = y + dy / rs: ze = z + dz / rs: we = w + dw/rs
if j& > 2000 then lsum = lsum + log(rs): incr iter&
end if
if abs(x) > 10000 then lsum=0: exit for
next j&
le! = lsum / (iter& * h)
'locate 1,1: print le!
END SUB
def fnx(x,y,z,w) = a1*(vsw-y)+a2*(y-fnvi(y))
def fny(x,y,z,w) = b1*(x-fni1(y))-b2*sqr(z)-b3*y
def fnz(x,y,z,w) = y*y-sqr(w)*z*.5*(1+tanh(d1*(x-1)))
def fnw(x,y,z,w) = sqr(z)*y-w
def fnvi(y) = y+a2*(vsw-y)/f1
def fni1(y) = g3*g3*fnvi(y)^3/(2*g1*g1)+g2*fnvi(y)/g1+(g3*fnvi(y)^2/(2*g1*g1))*sqr(4*g1*g2+g3*g3*fnvi(y)^2)
SUB rk4 (x, y, z, w, h)
'Advances (x, y, z, w) with a fourth order Runge-Kutta method
'User must provide the functions fnx, fny, fnz, fnw, and a step size h
k1x = h * fnx(x, y, z, w)
k1y = h * fny(x, y, z, w)
k1z = h * fnz(x, y, z, w)
k1w = h * fnw(x, y, z, w)
k2x = h * fnx(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z, w + .5 * k1w)
k2y = h * fny(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z, w + .5 * k1w)
k2z = h * fnz(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z, w + .5 * k1w)
k2w = h * fnw(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z, w + .5 * k1w)
k3x = h * fnx(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z, w + .5 * k2w)
k3y = h * fny(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z, w + .5 * k2w)
k3z = h * fnz(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z, w + .5 * k2w)
k3w = h * fnw(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z, w + .5 * k2w)
k4x = h * fnx(x + k3x, y + k3y, z + k3z, w + k3w)
k4y = h * fny(x + k3x, y + k3y, z + k3z, w + k3w)
k4z = h * fnz(x + k3x, y + k3y, z + k3z, w + k3w)
k4w = h * fnw(x + k3x, y + k3y, z + k3z, w + k3w)
x = x + (k1x + 2 * (k2x + k3x) + k4x) / 6
y = y + (k1y + 2 * (k2y + k3y) + k4y) / 6
z = z + (k1z + 2 * (k2z + k3z) + k4z) / 6
w = w + (k1w + 2 * (k2w + k3w) + k4w) / 6
END SUB
SUB insolve (x1%, y1%, x2%, y2%)
'Makes a plot of LE vs Vsw
for x%=x1% to x2% 'step 10
if inkey$=chr$(27) then end
call calculate (x%,y%,le!)
line-(x%,240-480*le!)
next x%
END SUB
FUNCTION tanh (x)
'Returns hyperbolic tangent of x
tanh = 1 - 2 / (EXP(2 * x) + 1)
END FUNCTION