1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
import pytest
import numpy
from testutils import compare_data, tol
@pytest.fixture
def ics_pure_diffusion(neuron_instance):
"""A model using intracellular diffusion in a single section in 3D"""
h, rxd, data, save_path = neuron_instance
dend = h.Section(name="dend")
dend.diam = 2
dend.nseg = 11
dend.L = 5
rxd.set_solve_type(dimension=3)
diff_constant = 1
r = rxd.Region(h.allsec(), dx=0.75)
ca = rxd.Species(
r, d=diff_constant, initial=lambda node: 1 if 0.4 < node.x < 0.6 else 0
)
model = (dend, r, ca)
yield (neuron_instance, model)
def test_pure_diffusion_3d(ics_pure_diffusion):
"""Test ics_pure_diffusion with fixed step methods"""
neuron_instance, model = ics_pure_diffusion
h, rxd, data, save_path = neuron_instance
dend, r, ca = model
h.dt *= 50
h.finitialize(-65)
loss = -(numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
h.continuerun(125)
loss += (numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
if not save_path:
assert loss < tol
max_err = compare_data(data)
if not save_path:
assert max_err < tol
def test_pure_diffusion_3d_cvode(ics_pure_diffusion):
"""Test ics_pure_diffusion with variable step methods"""
neuron_instance, model = ics_pure_diffusion
h, rxd, data, save_path = neuron_instance
dend, r, ca = model
h.CVode().active(True)
vec = h.Vector()
h.CVode().states(vec)
h.finitialize(-65)
loss = -(numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
h.continuerun(125)
loss += (numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
if not save_path:
assert loss < tol
max_err = compare_data(data)
if not save_path:
assert max_err < tol
def test_pure_diffusion_3d_inhom(ics_pure_diffusion):
"""Test ics_pure_diffusion with fixed step methods and inhomogeneous
diffusion coefficients.
"""
neuron_instance, model = ics_pure_diffusion
h, rxd, data, save_path = neuron_instance
dend, r, ca = model
h.dt *= 50
for nd in ca.nodes:
if nd.x >= 0.5:
nd.d = 0
h.finitialize(-65)
loss = -(numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
h.continuerun(125)
loss += (numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
if not save_path:
assert loss < tol
max_err = compare_data(data)
if not save_path:
assert max_err < tol
def test_pure_diffusion_3d_inhom_cvode(ics_pure_diffusion):
"""Test ics_pure_diffusion with variable step methods and inhomogeneous
diffusion coefficients.
"""
neuron_instance, model = ics_pure_diffusion
h, rxd, data, save_path = neuron_instance
dend, r, ca = model
h.CVode().active(True)
for nd in ca.nodes:
if nd.x >= 0.5:
nd.d = 0
h.finitialize(-65)
loss = -(numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
h.continuerun(125)
loss += (numpy.array(ca.nodes.concentration) * numpy.array(ca.nodes.volume)).sum()
if not save_path:
assert loss < tol
max_err = compare_data(data)
if not save_path:
assert max_err < tol
|