File: test_pure_diffusion_3d.py

package info (click to toggle)
neuron 8.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 34,760 kB
  • sloc: cpp: 149,571; python: 58,465; ansic: 50,329; sh: 3,510; xml: 213; pascal: 51; makefile: 35; sed: 5
file content (104 lines) | stat: -rw-r--r-- 3,315 bytes parent folder | download | duplicates (3)
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