neuronsimulator / nrn

NEURON Simulator
http://nrn.readthedocs.io
Other
376 stars 113 forks source link

Neuron supports maximum of 64 ions when density mechanisms writing to concentrations are present #2947

Open Hjorthmedh opened 1 week ago

Hjorthmedh commented 1 week ago

Context

There is a limit of 64 species in eion.cpp, see comment in the code:

    /* an embarassing hack */
    /* up to 32 possible ions */
    /* continuously compute a bitmap that allows determination
        of which models WRITE which ion concentrations */

https://github.com/neuronsimulator/nrn/blob/8ffa1fa3acfbb4f91d070312617d83d64634adfb/src/nrnoc/eion.cpp#L406C1-L409C58

failing on line: https://github.com/neuronsimulator/nrn/blob/8ffa1fa3acfbb4f91d070312617d83d64634adfb/src/nrnoc/eion.cpp#L429

Overview of the issue

Unable to have more than 64 species in eion.cpp https://github.com/neuronsimulator/nrn/blob/8ffa1fa3acfbb4f91d070312617d83d64634adfb/src/nrnoc/eion.cpp#L429

Expected result/behavior

Should be able to have more than 64 species.

NEURON setup

Minimal working example - MWE

import neuron
from neuron import h
import neuron.crxd as rxd

soma = h.Section(name="soma")
soma.L = soma.diam = 10

species_list = []

print("Creating regions")
region = rxd.Region(soma, nrn_region="i")

print("Creating species")
for idx in range(0,200):
    species_name = f"species{idx}"
    spec = rxd.Species(region,
                       d=0,
                       initial=1,
                       charge=0,
                       name=species_name)
    species_list.append(spec)

print("Inserting channels")
soma.insert("caldyn_ms")

print("Init")
h.finitialize()
neuron.run(100)

caldyn_ms.mod

TITLE Calcium dynamics for L and T calcium pool

NEURON {
    SUFFIX caldyn_ms
    USEION cal READ ical, cali WRITE cali VALENCE 2
    RANGE pump, cainf, taur, drive, depth
}

UNITS {
    (molar) = (1/liter) 
    (mM) = (millimolar)
    (um) = (micron)
    (mA) = (milliamp)
    (msM) = (ms mM)
    FARADAY = (faraday) (coulomb)
}

PARAMETER {
    drive = 10000 (1)
    depth = 0.2  (um)
    cainf = 70e-6 (mM)
    taur = 43 (ms)
    kt = 1e-4 (mM/ms)
    kd = 1e-4 (mM)
    pump = 0.02
}

STATE { cali (mM) }

INITIAL { cali = cainf }

ASSIGNED {
    ical (mA/cm2)
    drive_channel (mM/ms)
    drive_pump (mM/ms)
}

BREAKPOINT {
    SOLVE state METHOD cnexp
}

DERIVATIVE state { 

    : force concentration to stay above cainf by only pumping if larger
    drive_channel = -drive*ical/(2*FARADAY*depth)
    drive_pump    = -kt*(cali-cainf)/(cali+kd)

    if (drive_channel <= 0.) { drive_channel = 0. }

    cali' = drive_channel + pump*drive_pump + (cainf-cali)/taur
}

COMMENT

Original NEURON model by Wolf (2005) and Destexhe (1992).  Adaptation by
Alexander Kozlov <akozlov@kth.se>. Updated by Robert Lindroos <robert.lindroos@ki.se>.

Updates by RL:
-cainf changed from 10 to 70 nM (sabatini et al., 2002 The Life Cycle of Ca 2+ Ions in Dendritic Spines)
-pump updated to only be active if cai > cainf (neutralized by adding reversed entity) 

[1] Wolf JA, Moyer JT, Lazarewicz MT, Contreras D, Benoit-Marand M,
O'Donnell P, Finkel LH (2005) NMDA/AMPA ratio impacts state transitions
and entrainment to oscillations in a computational model of the nucleus
accumbens medium spiny projection neuron. J Neurosci 25(40):9080-95.

ENDCOMMENT

Logs

Creating regions
Creating species
Inserting channels
Assertion failed: file /root/nrn/src/nrnoc/eion.cpp, line 437
NEURON: k < sizeof(long) * 8
 near line 0
 objref hoc_obj_[2]
                   ^