TITLE Calcium ion accumulation with longitudinal and radial diffusion
COMMENT
PROCEDURE factors_cadiffus() sets up the scale factors
needed to model radial diffusion.
These scale factors do not have to be recomputed
when diam is changed.
The amount of calcium in an annulus is ca[i]*diam^2*vol[i]
with ca[0] being the 2nd order correct concentration at the exact edge
and ca[NANN-1] being the concentration at the exact center.
ENDCOMMENT
NEURON {
SUFFIX cadiffus
USEION ca READ cai, ica WRITE cai
GLOBAL vrat
}
DEFINE Nannuli 4
UNITS {
(molar) = (1/liter)
(mM) = (millimolar)
(um) = (micron)
(mA) = (milliamp)
FARADAY = (faraday) (10000 coulomb)
PI = (pi) (1)
}
PARAMETER {
DCa = 0.23 (um2/ms)
}
ASSIGNED {
diam (um)
ica (mA/cm2)
cai (mM)
vrat[Nannuli] : numeric value of vrat[i] equals the volume
: of annulis i of a 1um diameter cylinder
: multiply by diam^2 to get volume per um length
B0 (mM)
}
CONSTANT { volo = 1e10 (um2)}
STATE {
ca[Nannuli] (mM) <1e-6> : ca[0] is equivalent to cai
}
BREAKPOINT {
SOLVE state METHOD sparse
}
LOCAL factors_done
INITIAL {
if (factors_done == 0) {
factors_done = 1
factors()
}
FROM i=0 TO Nannuli-1 {
ca[i] = cai
}
}
LOCAL frat[Nannuli]
PROCEDURE factors() {
LOCAL r, dr2
r = 1/2 :starts at edge (half diam)
dr2 = r/(Nannuli-1)/2 :half thickness of annulus
vrat[0] = 0
frat[0] = 2*r
FROM i=0 TO Nannuli-2 {
vrat[i] = vrat[i] + PI*(r-dr2/2)*2*dr2 :interior half
r = r - dr2
frat[i+1] = 2*PI*r/(2*dr2) :exterior edge of annulus
: divided by distance between centers
r = r - dr2
vrat[i+1] = PI*(r+dr2/2)*2*dr2 :outer half of annulus
}
}
LOCAL dsq, dsqvol : can't define local variable in KINETIC block
: or use in COMPARTMENT
KINETIC state {
COMPARTMENT i, diam*diam*vrat[i] {ca CaBuffer Buffer}
LONGITUDINAL_DIFFUSION i, DCa*diam*diam*vrat[i] {ca}
~ ca[0] << (-ica*PI*diam/(2*FARADAY))
FROM i=0 TO Nannuli-2 {
~ ca[i] <-> ca[i+1] (DCa*frat[i+1], DCa*frat[i+1])
}
cai = ca[0]
}