###########################################################
# simulation code for Fig. 3;                             #
# with "g_cl=0" (in line 135) also Fig. 4 can be produced #
###########################################################
# t:     time                             in [msec]  #
# v:     membrane potential               in [mV]    #
# n,h:   gating variables                 in [1]     #
# n_ki:  amount of potassium in the ICS   in [fmol]  #
# n_cli: amount of chloride in the ICS    in [fmol]  #
# vli:   ICS volume                       in [um^3]  #
######################################################

##################################################
# rate equations used by solver                  #
# factor 1000. converts from [x/msec] to [x/sec] #
##################################################
v'     = 1000. * V_DOT
n'     = 1000. * N_DOT
h'     = 1000. * H_DOT
n_ki'  = 1000. * N_KI_DOT
n_cli' = 1000. * N_CLI_DOT
vli'   = 1000. * VLI_DOT

############################################
# initial conditions: normal resting state #
############################################
init v=-67.
init n=0.070
init h=0.978
init n_ki=277.7
init n_cli=21.7
init vli=2160.

######################################################
# maximal pump rate drops from 6.8 to 0 after 50 sec #
# unit: [umA/cm^2]                                   #
######################################################
max_p = 6.8 * heav(50.-t)

#######################################
# parameter to between volume models: #
# s=0 -> derived volume model         #
# s=1 -> exponential volume model     #
#######################################
par s=0

########################################
# Hodgkin-Huxley like gating functions #
# adiabatic value for "M"              #
########################################
AN  = 0.01 * (v + 34.0) / (1.0 - exp(-0.1 * (v + 34.0))) 
BN  = 0.125 * exp(-(v + 44.0) / 80.0)
AM  = 0.1 * (v + 30.0) / (1.0 - exp(-0.1 * (v + 30.0))) 
BM  = 4.0 * exp(-(v + 55.0) / 18.0) 
AH  = 0.07 * exp(-(v + 44.0) / 20)
BH  = 1.0 / (1.0 + exp(-0.1 * (v + 14.0)))
M   = AM / (AM + BM)

#####################################################################
# - resting state ion and impermeant particle amounts in [fmol]     #
#   in the ICS (...i0) and the ECS (...e0)                          #
# - "k,na,cl,imp" means potassium, sodium, chloride and impermeant  #
#####################################################################
n_ki0  = 277.7
n_ke0  = 2.8
n_nai0 = 54.6
n_nae0 = 91.3
n_cli0 = 21.7
n_cle0 = 89.8
n_impi = 318.0
n_impe = 40

############################################################################
# electroneutrality (first line) and mass conservation (second to fourth)  #
# conditions to compute ion amounts other than intracellular potassium and #
# chloride                                                                 #
############################################################################
n_nai = n_nai0 + n_ki0  - n_ki - n_cli0 + n_cli
n_nae = n_nae0 + n_nai0 - n_nai
n_ke  = n_ke0  + n_ki0  - n_ki 
n_cle = n_cle0 + n_cli0 - n_cli

########################################################################
# ECS volume "vle" follows from conservation of total volume "vl_tot"  #
# units: [um^3]                                                        #
########################################################################
vl_tot = 2880.
vle    = vl_tot - vli

########################################
# ion concentrations in [mM]=[mMol/l]  #
########################################
nai = n_nai / vli * 1000.
nae = n_nae / vle * 1000.
ki  = n_ki  / vli * 1000.
ke  = n_ke  / vle * 1000.
cli = n_cli / vli * 1000.
cle = n_cle / vle * 1000.

##################################################
# choice between two volume models:              #
# vli_inf0: equil. volume in derived model       #
# vli_inf1: equil. volume in exponential model   #
######################################################
# n_i/e: total amount of particles in ICS/ECS        #
# p_i/e: total concentration of particles in ICS/ECS #
######################################################
n_i      = n_nai + n_ki + n_cli + n_impi
n_e      = n_nae + n_ke + n_cle + n_impe
vli_inf0 = vl_tot * n_i / (n_i + n_e)

vli0     = 2160.
p_i      = n_i / vli * 1000.
p_e      = n_e / vle * 1000.
vli_inf1 = vli0 * (1.35 - 0.35*exp((p_e-p_i)/20.))

vli_inf  = (1-s) * vli_inf0 + s * vli_inf1

#####################
# Nernst potentials #
#####################
EK  = 26.64 * log(ke  / ki)
ENA = 26.64 * log(nae / nai)
ECL =-26.64 * log(cle / cli)

##############################################################################
# - different leak and gated currents             "IION_l/g"   in [umA/cm^2] #
# - leak and gated conductances for each channel  "gion_l/g"   in [mS/cm^2]  #
# - Na/K-exchange pump current "IP" with maximal turnover rate "max_p"       #
##############################################################################
gna_l  = 0.0175
gna_g  = 100.
gk_l   = 0.05
gk_g   = 40.
par gcl_l=0.05
    
INA_l = gna_l            * (v - ENA)
INA_g = gna_g * M**3 * h * (v - ENA)
IK_l  = gk_l             * (v - EK)
IK_g  = gk_g * n**4      * (v - EK)
ICL_l = gcl_l            * (v - ECL)
IP    = max_p / (1.0 + exp((25 - nai)/3.)) / (1. + exp(5.5 - ke))

#####################################
# full sodium and potassium current #
#####################################
INA = INA_l + INA_g + 3. * IP
IK  = IK_l  + IK_g  - 2. * IP

#############################
# list of all changes rates #
#####################################################################
# c: membrane capacitance                   in [uF/cm^2]            #
# conv: conversion from currents to fluxes  in [fmol/msec*cm^2/uA]  #
# phi: gating timescale parameter           in [1/msec]             #
# t_vl: timescale of volume dynamics        in [msec]               #
#####################################################################
c       = 1
conv    = 9.55589e-5
phi     = 3
t_vl    = 250

V_DOT     = -1. / c * (INA + IK + ICL_l)
N_DOT     =  phi * (AN * (1 - n) - BN * n)
H_DOT     =  phi * (AH * (1 - h) - BH * h)
N_KI_DOT  = -conv * IK
N_CLI_DOT =  conv * ICL_l
VLI_DOT   =  1. / t_vl * (vli_inf - vli)

####################################
# auxiliary variables for plotting #
####################################
aux _ki	 = ki
aux _ke	 = ke
aux _nai = nai
aux _nae = nae
aux _cli = cli
aux _cle = cle
aux _EK	 = EK
aux _ENA = ENA
aux _ECL = ECL
aux _vli = vli
aux _vle = vle

############
# numerics #
############
@ meth=cvode
@ dt=5e-4
@ maxstor=10000000, bounds=10000000
@ total=1000
@ bell=0

#############################################
# plot options corresponding to Fig. 3a/b/c #
#############################################
@ xhi=1000
@ nplot=4, yp1=v,  yp2=_EK, yp3=_ENA, yp4=_ECL, ylo=-150, yhi=160
#@ nplot=2, yp1=_vli, yp2=_vle, ylo=0, yhi=2900
#@ nplot=6, yp1=_ki, yp2=_ke, yp3=_cli, yp4=_cle, yp5=_nai, yp6=_nae, ylo=0, yhi=150

done