NEURON { SUFFIX ip3dif USEION ip3 READ iip3 WRITE ip3i VALENCE 1 GLOBAL vrat, DIP3, ip3i0 } DEFINE Nannuli 4 UNITS { (molar) = (1/liter) (mM) = (millimolar) (uM) = (micromolar) (um) = (micron) (mA) = (milliamp) FARADAY = (faraday) (coulomb) PI = (pi) (1) } PARAMETER { kdegr = 0.14e-3 (/ms) : degredation rate Finck et al & wang ey al 1995 DIP3 = 0.283(um2/ms) ip3i0 = 0.16e-3 (mM) : [IP3]0 initial and resting ip3i conc } ASSIGNED { diam (um) ip3i (mM) iip3 (mA/cm2) vrat[Nannuli] : numeric value of vrat[i] equals the volume : of annulus i of a 1um diameter cylinder : multiply by diam^2 to get volume per um length } STATE { : ip3[0] is equivalent to ip3i : ip3[] are very small, so specify absolute tolerance ip3[Nannuli] (mM) <1e-6> } LOCAL factors_done BREAKPOINT { SOLVE state METHOD sparse} INITIAL { if (factors_done == 0) { : flag becomes 1 in the first segment factors_done = 1 : all subsequent segments will have factors() : vrat = 0 unless vrat is GLOBAL } ip3i = ip3i0 FROM i=0 TO Nannuli-1 { ip3[i] = ip3i } } LOCAL frat[Nannuli] : scales the rate constants for model geometry PROCEDURE factors() { LOCAL r, dr2 r = 1/2 : starts at edge (half diam) dr2 = r/(Nannuli-1)/2 : full thickness of outermost annulus, : half thickness of all other annuli 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) : outer radius of annulus : div 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 statement KINETIC state { COMPARTMENT i, diam*diam*vrat[i] {ip3 ip3i0} LONGITUDINAL_DIFFUSION i, DIP3*diam*diam*vrat[i] {ip3} ~ ip3[0] << (iip3*PI*diam*(1e4)/FARADAY) FROM i=0 TO Nannuli-2 { ~ ip3[i] <-> ip3[i+1] (DIP3*frat[i+1], DIP3*frat[i+1]) } dsq = diam*diam FROM i=0 TO Nannuli-1 { dsqvol = dsq*vrat[i] ~ ip3[i] <-> ip3i0 (kdegr*dsqvol, kdegr*dsqvol) } ip3i = ip3[0] }