Skip to content

Commit 2abbd25

Browse files
author
Nicolas Cornu
authored
Refactor MatrixMap (#3176)
The 3 main items of this small patch are: Push elements on vectors only if they are real (means index > 0) Create a function that compute the index Remove useless plen_
1 parent 5cdc7fa commit 2abbd25

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

src/nrniv/matrixmap.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,13 @@ void MatrixMap::mmfree() {
1818
}
1919

2020
void MatrixMap::add(double fac) {
21-
for (int i = 0; i < plen_; ++i) {
21+
for (int i = 0; i < pm_.size(); ++i) {
2222
auto [it, jt] = pm_[i];
2323
*ptree_[i] += fac * m_(it, jt);
2424
}
2525
}
2626

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 {
3628
int it;
3729
if (i < nnode) {
3830
it = nodes[i]->eqn_index_ + layer[i];
@@ -42,17 +34,22 @@ void MatrixMap::alloc(int start, int nnode, Node** nodes, int* layer) {
4234
} else {
4335
it = start + i - nnode;
4436
}
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));
5453
}
55-
ptree_[plen_] = spGetElement(_nt->_sp13mat, it, jt);
56-
++plen_;
5754
}
5855
}

src/nrniv/matrixmap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ class MatrixMap {
115115
Matrix& m_;
116116

117117
// the map
118-
int plen_ = 0;
119118
std::vector<std::pair<int, int>> pm_{};
120119
std::vector<double*> ptree_{};
120+
121+
int compute_index(int, int, int, Node**, int*) const;
121122
};

0 commit comments

Comments
 (0)