@@ -18,21 +18,13 @@ void MatrixMap::mmfree() {
18
18
}
19
19
20
20
void MatrixMap::add (double fac) {
21
- for (int i = 0 ; i < plen_ ; ++i) {
21
+ for (int i = 0 ; i < pm_. size () ; ++i) {
22
22
auto [it, jt] = pm_[i];
23
23
*ptree_[i] += fac * m_ (it, jt);
24
24
}
25
25
}
26
26
27
- void MatrixMap::alloc (int start, int nnode, Node** nodes, int * layer) {
28
- NrnThread* _nt = nrn_threads;
29
- mmfree ();
30
-
31
- plen_ = 0 ;
32
- std::vector<std::pair<int , int >> nzs = m_.nonzeros ();
33
- pm_.resize (nzs.size ());
34
- ptree_.resize (nzs.size ());
35
- for (const auto [i, j]: nzs) {
27
+ int MatrixMap::compute_index (int i, int start, int nnode, Node** nodes, int * layer) const {
36
28
int it;
37
29
if (i < nnode) {
38
30
it = nodes[i]->eqn_index_ + layer[i];
@@ -42,17 +34,22 @@ void MatrixMap::alloc(int start, int nnode, Node** nodes, int* layer) {
42
34
} else {
43
35
it = start + i - nnode;
44
36
}
45
- int jt;
46
- pm_[plen_] = std::make_pair (i, j);
47
- if (j < nnode) {
48
- jt = nodes[j]->eqn_index_ + layer[j];
49
- if (layer[j] > 0 && !nodes[j]->extnode ) {
50
- jt = 0 ;
51
- }
52
- } else {
53
- jt = start + j - nnode;
37
+ return it;
38
+ }
39
+
40
+ void MatrixMap::alloc (int start, int nnode, Node** nodes, int * layer) {
41
+ NrnThread* _nt = nrn_threads;
42
+ mmfree ();
43
+
44
+ std::vector<std::pair<int , int >> nzs = m_.nonzeros ();
45
+ pm_.reserve (nzs.size ());
46
+ ptree_.reserve (nzs.size ());
47
+ for (const auto & [i, j]: nzs) {
48
+ int it = compute_index (i, start, nnode, nodes, layer);
49
+ int jt = compute_index (j, start, nnode, nodes, layer);
50
+ if (it != 0 && jt != 0 ) {
51
+ pm_.emplace_back (i, j);
52
+ ptree_.emplace_back (spGetElement (_nt->_sp13mat , it, jt));
54
53
}
55
- ptree_[plen_] = spGetElement (_nt->_sp13mat , it, jt);
56
- ++plen_;
57
54
}
58
55
}
0 commit comments