5 #ifndef _SPIKEMATRIX_H_
6 #define _SPIKEMATRIX_H_
19 template<
typename T_Diag,
typename T_OffDiag,
typename X>
39 _ncells(conn.getRowSite().getSelfCount()),
107 _procID = MPI::COMM_WORLD.Get_rank();
108 _nprocs = MPI::COMM_WORLD.Get_size();
131 for (
int i = 0; i < nc; i++ )
135 for (
int i = 0; i < nc; i++ ){
136 for (
int n = row[i]; n < row[i+1]; n++ ){
156 int ncount = countGhost[n];
157 for (
int c = 0; c < ncount; c++){
170 for (
int i = 0; i <
_ncells-1; i++ ){
171 const Diag pivot =
_A(b,i);
172 for (
int j = i+1; j <=
min(_ncells-1,i+b); j++ ){
173 const int j2 = b+j-i;
174 const Diag m =
_A(j2,i) / pivot;
176 for (
int k = i+1; k <=
min(_ncells-1,i+b); k++ ){
177 const int j2 = b+j-k;
178 const int i2 = b+i-k;
179 _A(j2,k) -= m *
_A(i2,k);
195 int ncount = countGhost[n];
196 for (
int c = 0; c < ncount; c++){
214 for (
int n = 0; n < b; n++ ){
216 for (
int i = 1; i <
_ncells; i++ ){
218 for (
int j =
max(0,i-b); j <= i-1; j++ ){
219 const int i2 = b+i-j;
220 yi -=
_A(i2,j) *
_yL(j,n);
227 for (
int n = 0; n < b; n++ ){
229 for (
int i =
_ncells-2; i >= 0; i-- ){
231 for (
int j = i+1; j <=
min(
_ncells-1,i+b); j++ ){
232 const int i2 = b+i-j;
252 for (
int n = 0; n < b; n++ ){
254 for (
int i = 1; i <
_ncells; i++ ){
256 for (
int j =
max(0,i-b); j <= i-1; j++ ){
257 const int i2 = b+i-j;
258 yi -=
_A(i2,j) *
_yR(j,n);
265 for (
int n = 0; n < b; n++ ){
267 for (
int i =
_ncells-2; i >= 0; i-- ){
269 for (
int j = i+1; j <=
min(
_ncells-1,i+b); j++ ){
270 const int i2 = b+i-j;
290 for (
int n = 0; n < b; n++ ){
292 for (
int i = 1; i < b; i++ ){
295 for (
int j = 0; j < i; j++ ){
297 const int i2 = b+ii-jj;
298 yi -=
_A(i2,jj) *
_yR(j,n);
305 for (
int n = 0; n < b; n++ ){
307 for (
int i = b-2; i >= 0; i-- ){
310 for (
int j = b-1; j > i; j-- ){
312 const int i2 = b+ii-jj;
375 for(
int i = 0; i < pp.
getLength(); i++ )
379 for (
int i = 0; i < n-1; i++ ){
383 for (
int j = i+1; j < n; j++){
391 for (
int j = i; j < n; j++){
392 const Diag tmp = A(i,j);
400 for (
int j = i+1; j < n; j++ ){
401 const Diag m = A(j,i) / pivot;
403 for (
int k = i+1; k < n; k++ ){
404 A(j,k) -= m * A(i,k);
424 for (
int i = 1; i <
_ncells; i++ ){
426 for (
int j =
max(0,i-b); j <= i-1; j++ ){
427 const int i2 = b+i-j;
428 yi -=
_A(i2,j) *
_y[j];
434 for (
int i = 1; i <
_ncells; i++ ){
436 for (
int j =
max(0,i-b); j <= i-1; j++ ){
437 const int i2 = b+i-j;
438 yi -=
_A(i2,j) *
_y[j];
447 for (
int i =
_ncells-2; i >= 0; i-- ){
449 for (
int j = i+1; j <=
min(
_ncells-1,i+b); j++ ){
450 const int i2 = b+i-j;
451 soli -=
_A(i2,j)*x[j];
453 x[i] = soli /
_A(b,i);
538 for (
int i = 0; i < n-1; i++ ){
545 for (
int j = i+1; j < n; j++ ){
546 rhs[j] -= A(j,i) * rhs[i];
552 rhs[n-1] = rhs[n-1] / A(n-1,n-1);
554 for (
int i = n-2; i >=0; i-- ){
555 for (
int j = i+1; j < n; j++ ){
556 rhs[i] -= A(i,j) * rhs[j];
558 rhs[i] = rhs[i] / A(i,i);
591 if ( negate_rhs ==
true ){
592 for (
int i = 0; i <
_ncells; i++ )
595 for (
int i = 0; i <
_ncells; i++ )
604 _RHS[i] -= dot_product;
609 const int indx =
_ncells-_bandwidth+i;
613 _RHS[indx] -= dot_product;
const Array< int > & getCol() const
const Array< int > & getRow() const
const vector< int > & getRSPKOffDiagPtr() const
const vector< int > & getRSPKCountGhost() const
Array2D< Diag > _reducedA2
void partialCopyFrom(const Array2D &aij)
void exchange_reducedSol()
Array< OffDiag > OffDiagArray
const Array< OffDiag > & _offDiag
double max(double x, double y)
const vector< int > & getLSPKCountGhost() const
const vector< int > & getLSPKIndexI() const
void partialCopyTo(Array2D &aij)
void solveReducedSystem()
void denseMtrxLU(Array2D< Diag > &A, Array< int > &pp)
virtual int getDataSize() const
virtual void * getData() const
const CRConnectivity & _conn
void luSolver(const Array< X > &f, Array< X > &x, bool negate_rhs=false)
const Array< Diag > & _diag
Array2D< Diag > _reducedA1
SpikeMatrix(const CRConnectivity &conn, const Array< T_Diag > &diag, const Array< T_OffDiag > &off_diag, const SpikeStorage &spike_storage)
const vector< int > & getLSPKOffDiagPtr() const
const vector< int > & getRSPKIndexJ() const
Array2D< Diag > _JokerSpikeB
void setRHS(const Array< X > &f, bool negate_rhs=false)
void solve(const XArray &f, XArray &x)
const vector< int > & getLSPKIndexJ() const
const vector< int > & getRSPKIndexI() const
double min(double x, double y)
void denseLUsolve(const Array2D< Diag > &A, const Array< int > &pp, Array< X > &rhs)
Array2D< Diag > _JokerSpikeT
const SpikeStorage & _spikeStorage