#!/usr/local/bin/luajit -O2
-- Run models from this file
require 'lib' -- small utility library
require 'el_ph' -- auxilary routines and electrophysiology
require 'ode' -- ODE solvers
--require "profiler"
_s_ = 200
--_s_ = 200 -- [global] s parameter for RKC algorithm
--local s = 95 -- minimal for h = 1e-3 |
--local s = 215 -- minimal for h = 5e-3 | Mysa0
--local s = 275 -- minimal for h = 1e-2 |
--local s = 30 -- minimal for mysa2 and h = 1e-2, 1ms->1s
--local s = 50
--local s = 10 -- minimal for mysa2 and h = 1e-3; 1ms->3s
function safe_write(fname, str)
-- Safely write a string to a file
local f = assert(io.open(fname,'w'))
f:write(str)
f:close()
end
function mymessage(str)
--wrap around stderr:write
io.stderr:write(str..'\n')
end
function patch_table(t_to, t_from, n)
local v = t_from[n]
if type(v) == "string" then
if type(t_from[n+1]) ~= "string" then
t_to[v] = t_from[n+1]
else
patch_table(t_to[v], t_from,n+1)
end
end
end
--- The main function ---
function main()
local t0, t1, h, stf, conf
-- Default values:
t0, h, t1 = 0, 1e-6, 10
local tstep = 200
stf = 'rkc_a' -- stepper function
conf_file = 'dc-conf'
model_file = 'dc-mod'
local sstate_fname -- save state file name
local lstate_fname -- load state file name
local gp_fname -- gnuplot dictionary
local verbose = 0
local loadp = false
local savep = false
local arg_layout
local patchstr
local print_paramsp = false
local stim = {}
-- User defined values:
for key,val in pairs(arg) do -- PATTERNS
if val == '-c' then
conf_file = arg[key+1] -- config file
elseif val == '-m' then
model_file = arg[key+1]
elseif val == '-h' then
h = tonumber(arg[key+1]) -- time step
elseif val == '-t' then
t0 = tonumber(arg[key+1]) -- start time (ms)
elseif val == '-T' then
t1 = tonumber(arg[key+1]) -- end time (ms)
elseif val == '-i' then
stf = arg[key+1] -- stepper function
elseif val == '-e' then
stim = assert(loadstring(arg[key+1]))()
elseif val == "-P" then
patchstr = arg[key+1]
elseif val == '-p' then
print_paramsp = true
elseif val == '-s' then
_s_ = tonumber(arg[key+1])
elseif val == '-w' then
tstep = tonumber(arg[key+1])
elseif val == '-L' then
arg_layout = arg[key+1]
elseif val == '-v' then
verbose = verbose + 1
elseif val == '-l' then
loadp = true
if arg[key+1] then
lstate_fname = arg[key+1]
end
elseif val == '-S' then
savep = true
if arg[key+1] then
sstate_fname = arg[key+1]
end
end
end
conf = require(conf_file)
if patchstr then
patch = assert(loadstring(patchstr))()
patch_table(conf,patch,1)
end
model = require(model_file)
for name, segment in pairs(conf.segments) do
if segment.pars.stimulated then
segment.pars.iappl = stim
end
end
if arg_layout then
layout_rule = conf[arg_layout]
end
nn = model.Nerve:new(conf.segments,layout_rule)
if loadp then nn:luaload_state(lstate_fname) end
if not sstate_fname then
sstate_fname = nn.layout_rule.tag..'-state.lua'
end
--- Write the Gnuplot dictionary ---
gp_fname = nn.layout_rule.tag..'-dict.gp'
safe_write(gp_fname, nn:gp_print())
if verbose > 0 then
io.stderr:write(nn:pp_state(t0)..'\n')
end
if print_paramsp then
io.stderr:write(nn:print_parameters())
end
--- Run the simulation ---
local t = t0
if profiler then profiler.start() end
while t <= t1 do
local phase
local t2 = (t+tstep > t1) and t1 or t+tstep
t,phase = nn:run(t, h, t2, stf)
--- Save state ---
if savep then
safe_write(sstate_fname, nn:luaprint_state(phase, tend))
end
end
io.stderr:write('\n')
if profiler then profiler.stop() end
end
main()