@@ -80,25 +80,26 @@ void HybridSolveHandler::forwardSolve(std::vector<double>& x) const {
8080 // temporary space for gemv
8181 const Int gemv_space = ldSn - nb * j - jb;
8282 std::vector<double > y (gemv_space);
83-
84- callAndTime_dgemv (' T' , jb, gemv_space, 1.0 , &sn_columns_[sn][SnCol_ind],
85- jb, &x[x_start], 1 , 0.0 , y.data (), 1 , data_);
86- SnCol_ind += jb * gemv_space;
83+ if (gemv_space > 0 ) {
84+ callAndTime_dgemv (' T' , jb, gemv_space, 1.0 , &sn_columns_[sn][SnCol_ind],
85+ jb, &x[x_start], 1 , 0.0 , y.data (), 1 , data_);
86+ SnCol_ind += jb * gemv_space;
8787#if HIPO_TIMING_LEVEL >= 2
88- if (data_) data_->sumTime (kTimeSolveSolve_dense , clock.stop ());
88+ if (data_) data_->sumTime (kTimeSolveSolve_dense , clock.stop ());
8989#endif
9090
9191#if HIPO_TIMING_LEVEL >= 2
92- clock.start ();
92+ clock.start ();
9393#endif
94- // scatter solution of gemv
95- for (Int i = 0 ; i < gemv_space; ++i) {
96- const Int row = S_.rows (start_row + nb * j + jb + i);
97- x[row] -= y[i];
98- }
94+ // scatter solution of gemv
95+ for (Int i = 0 ; i < gemv_space; ++i) {
96+ const Int row = S_.rows (start_row + nb * j + jb + i);
97+ x[row] -= y[i];
98+ }
9999#if HIPO_TIMING_LEVEL >= 2
100- if (data_) data_->sumTime (kTimeSolveSolve_sparse , clock.stop ());
100+ if (data_) data_->sumTime (kTimeSolveSolve_sparse , clock.stop ());
101101#endif
102+ }
102103
103104#ifdef HIPO_PIVOTING
104105#if HIPO_TIMING_LEVEL >= 2
@@ -145,7 +146,7 @@ void HybridSolveHandler::backwardSolve(std::vector<double>& x) const {
145146
146147 // index to access snColumns[sn]
147148 // initialised with the total number of entries of snColumns[sn]
148- Int64 SnCol_ind = sn_columns_[sn].size () - extra_space_frontal ;
149+ Int64 SnCol_ind = sn_columns_[sn].size ();
149150
150151 // go through blocks of columns for this supernode in reverse order
151152 for (Int j = n_blocks - 1 ; j >= 0 ; --j) {
@@ -173,26 +174,34 @@ void HybridSolveHandler::backwardSolve(std::vector<double>& x) const {
173174 // temporary space for gemv
174175 const Int gemv_space = ldSn - nb * j - jb;
175176 std::vector<double > y (gemv_space);
177+ if (gemv_space > 0 ) {
178+ #if HIPO_TIMING_LEVEL >= 2
179+ clock.start ();
180+ #endif
181+ // scatter entries into y
182+ for (Int i = 0 ; i < gemv_space; ++i) {
183+ const Int row = S_.rows (start_row + nb * j + jb + i);
184+ y[i] = x[row];
185+ }
186+ #if HIPO_TIMING_LEVEL >= 2
187+ if (data_) data_->sumTime (kTimeSolveSolve_sparse , clock.stop ());
188+ #endif
176189
177190#if HIPO_TIMING_LEVEL >= 2
178- clock.start ();
191+ clock.start ();
179192#endif
180- // scatter entries into y
181- for (Int i = 0 ; i < gemv_space; ++i) {
182- const Int row = S_.rows (start_row + nb * j + jb + i);
183- y[i] = x[row];
184- }
193+ SnCol_ind -= jb * gemv_space;
194+ callAndTime_dgemv (' N' , jb, gemv_space, -1.0 ,
195+ &sn_columns_[sn][SnCol_ind], jb, y.data (), 1 , 1.0 ,
196+ &x[x_start], 1 , data_);
185197#if HIPO_TIMING_LEVEL >= 2
186- if (data_) data_->sumTime (kTimeSolveSolve_sparse , clock.stop ());
198+ if (data_) data_->sumTime (kTimeSolveSolve_dense , clock.stop ());
187199#endif
200+ }
188201
189202#if HIPO_TIMING_LEVEL >= 2
190203 clock.start ();
191204#endif
192- SnCol_ind -= jb * gemv_space;
193- callAndTime_dgemv (' N' , jb, gemv_space, -1.0 , &sn_columns_[sn][SnCol_ind],
194- jb, y.data (), 1 , 1.0 , &x[x_start], 1 , data_);
195-
196205 SnCol_ind -= diag_entries;
197206 callAndTime_dtrsv (' U' , ' N' , ' U' , jb, &sn_columns_[sn][SnCol_ind], jb,
198207 &x[x_start], 1 , data_);
0 commit comments