Memosa-FVM  0.2
SpikeMatrix.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _SPIKEMATRIX_H_
6 #define _SPIKEMATRIX_H_
7 
8 #ifdef FVM_PARALLEL
9 #include <mpi.h>
10 #endif
11 
12 #include "Matrix.h"
13 #include "CRConnectivity.h"
14 #include "Array.h"
15 #include "Array2D.h"
16 #include "SpikeStorage.h"
17 #include "Array.h"
18 
19 template<typename T_Diag, typename T_OffDiag, typename X>
20 class SpikeMatrix : public Matrix
21 {
22 public:
23 
24  //friend class LinearSystemMerger;
25 
26  typedef T_Diag Diag;
27  typedef T_OffDiag OffDiag;
30  typedef Array<X> XArray;
31 
32  SpikeMatrix( const CRConnectivity& conn, const Array<T_Diag>& diag, const Array<T_OffDiag>& off_diag, const SpikeStorage& spike_storage ) :
33  Matrix(),
34  _conn(conn),
35  _diag(diag),
36  _offDiag(off_diag),
37  _spikeStorage(spike_storage),
38  _bandwidth(spike_storage.getBandWidth()),
39  _ncells(conn.getRowSite().getSelfCount()),
40  _procID(0),
41  _nprocs(1),
42  _A(2*_bandwidth+1,_ncells),
59  _RHS(_ncells),
60  _g(_ncells),
61  _gB(_bandwidth),
62  _gT(_bandwidth),
67  _y(_ncells),
70  {
71  initAssembly();
72  logCtor();
73  }
74 
75  void solve( const XArray& f, XArray& x )
76  {
77  //negate rhs (f) for x
78  luSolver(f, _g, true);
79  //set gB, gT from
80  setgBgT();
81  //communicate gB and gT to neighbourhood processors
82  exchange_gTgB();
83  //setting rhs for reduced system
84  setReducedRHS();
85  //solve reduced system
87  //exchange reduced system solutions
89  //setting final system rhs
90  setRHS(f, true);
91  //get solution
92  luSolver( _RHS, x, false);
93 
94  }
95 
96  virtual ~SpikeMatrix()
97  {
98  logDtor();
99  }
100 
101 
102 private:
103  //initial assamely
105  {
106 #ifdef FVM_PARALLEL
107  _procID = MPI::COMM_WORLD.Get_rank();
108  _nprocs = MPI::COMM_WORLD.Get_size();
109 #endif
110  setMatrix();
111  setLMtrx();
112  setRMtrx();
113  lu();
114  setLSpikeMtrx();
115  setRSpikeMtrx();
117  setReducedMtrx();
118  //setRSpikeMtrxFull();
119  if (_procID != _nprocs-1)
121  if ( _procID != 0 )
123  }
124 
125  void setMatrix()
126  {
127  //forming A
128  //const int nr = 2 * _bandwidth + 1;
129  const int nc = _ncells;
130  //diagonal filling
131  for ( int i = 0; i < nc; i++ )
132  _A(_bandwidth,i) = _diag[i];
133  const Array<int>& row = _conn.getRow();
134  const Array<int>& col = _conn.getCol();
135  for ( int i = 0; i < nc; i++ ){
136  for (int n = row[i]; n < row[i+1]; n++ ){
137  int j = col[n];
138  //check if it is in bandwidth and inner coefficient
139  if ( abs(j-i) <= _bandwidth && j < nc ){
140  _A(_bandwidth-(j-i),j) = _offDiag[n];
141  }
142  }
143  }
144 
145  /*_A.print(cout);*/
146  }
147  //left matrix
148  void setLMtrx()
149  {
150  const vector<int>& vecI = _spikeStorage.getLSPKIndexI();
151  const vector<int>& vecJ = _spikeStorage.getLSPKIndexJ();
152  const vector<int>& offDiagPtr = _spikeStorage.getLSPKOffDiagPtr();
153  const vector<int>& countGhost = _spikeStorage.getLSPKCountGhost();
154  int indx = 0;
155  for ( int n = 0; n < _bandwidth; n++ ){
156  int ncount = countGhost[n];
157  for ( int c = 0; c < ncount; c++){
158  int i = vecI[indx];
159  int j = vecJ[indx];
160  _L(i,j) = _offDiag[offDiagPtr[indx++]];
161  }
162  }
163  /*_L.print(cout);*/
164  }
165 
166  //lu
167  void lu()
168  {
169  const int b = _bandwidth;
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; //Division(/) should be defined as _A * pivot^-1 for matrix ops.
175  _A(j2,i) = m;
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);
180  }
181  }
182  }
183  /*_A.print(cout);*/
184  }
185 
186  //right matrix
187  void setRMtrx()
188  {
189  const vector<int>& vecI = _spikeStorage.getRSPKIndexI();
190  const vector<int>& vecJ = _spikeStorage.getRSPKIndexJ();
191  const vector<int>& offDiagPtr = _spikeStorage.getRSPKOffDiagPtr();
192  const vector<int>& countGhost = _spikeStorage.getRSPKCountGhost();
193  int indx = 0;
194  for ( int n = _ncells-_bandwidth; n < _ncells; n++ ){
195  int ncount = countGhost[n];
196  for ( int c = 0; c < ncount; c++){
197  int i = _bandwidth - _ncells + vecI[indx];
198  int j = vecJ[indx];
199  _R(i,j) = _offDiag[offDiagPtr[indx++]];
200  }
201  }
202  /*_R.print(cout);*/
203  }
204 
205  //left Spike Mtrx
207  {
208  //copy _L to LSpike
210  /*_LL.print(cout);*/
211  //zeros yL
212  _yL.zeros();
213  const int b = _bandwidth;
214  for ( int n = 0; n < b; n++ ){
215  _yL(0,n) = _LL(0,n);
216  for ( int i = 1; i < _ncells; i++ ){
217  Diag yi = _LL(i,n);
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);
221  }
222  _yL(i,n) = yi;
223  }
224  }
225  /*_yL.print(cout);*/
226  //backward solve
227  for ( int n = 0; n < b; n++ ){
228  _LSpike(_ncells-1,n) = _yL(_ncells-1,n) / _A(b,_ncells-1);
229  for ( int i = _ncells-2; i >= 0; i-- ){
230  Diag soli = _yL(i,n);
231  for ( int j = i+1; j <= min(_ncells-1,i+b); j++ ){
232  const int i2 = b+i-j;
233  soli -= _A(i2,j)*_LSpike(j,n);
234  }
235  _LSpike(i,n) = soli / _A(b,i);
236  }
237  }
238  /*_LSpike.print(cout);*/
240  /*_LSpikeT.print(cout);*/
241 
242  }
243  //Right Spike Mtrx
245  {
246  //copy _R to RSpike
248  /*_RR.print(cout);*/
249  //zeros yR
250  _yR.zeros();
251  const int b = _bandwidth;
252  for ( int n = 0; n < b; n++ ){
253  _yR(0,n) = _RR(0,n);
254  for ( int i = 1; i < _ncells; i++ ){
255  Diag yi = _RR(i,n);
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);
259  }
260  _yR(i,n) = yi;
261  }
262  }
263  /*_yR.print(cout);*/
264  //backward solve
265  for ( int n = 0; n < b; n++ ){
266  _RSpike(_ncells-1,n) = _yR(_ncells-1,n) / _A(b,_ncells-1);
267  for ( int i = _ncells-2; i >= 0; i-- ){
268  Diag soli = _yR(i,n);
269  for ( int j = i+1; j <= min(_ncells-1,i+b); j++ ){
270  const int i2 = b+i-j;
271  soli -= _A(i2,j)*_RSpike(j,n);
272  }
273  _RSpike(i,n) = soli / _A(b,i);
274  }
275  }
276  /*_RSpike.print(cout);*/
278  /*_RSpikeB.print(cout);*/
279 
280  }
281 
282 
283  //right Spike Mtrx
285  {
286  //forward solve
287  //zeros yR
288  _yR.zeros();
289  const int b = _bandwidth;
290  for ( int n = 0; n < b; n++ ){
291  _yR(0,n) = _R(0,n);
292  for ( int i = 1; i < b; i++ ){
293  const int ii = _ncells-b+i;
294  Diag yi = _R(i,n);
295  for ( int j = 0; j < i; j++ ){
296  const int jj = _ncells-b + j;
297  const int i2 = b+ii-jj;
298  yi -= _A(i2,jj) * _yR(j,n);
299  }
300  _yR(i,n) = yi;
301  }
302  }
303  /*_yR.print(cout);*/
304  //backward solve
305  for ( int n = 0; n < b; n++ ){
306  _RSpikeB(b-1,n) = _yR(b-1,n) / _A(b,_ncells-1);
307  for ( int i = b-2; i >= 0; i-- ){
308  Diag soli = _yR(i,n);
309  const int ii = _ncells-b+i;
310  for ( int j = b-1; j > i; j-- ){
311  const int jj = _ncells-b+j;
312  const int i2 = b+ii-jj;
313  soli -= _A(i2,jj)*_RSpikeB(j,n);
314  }
315  _RSpikeB(i,n) = soli / _A(b,ii);
316  }
317  }
318  /*_RSpikeB.print(cout);*/
319  }
320 
321  //exchanging LSpikeT (to rank-1) and RSpikeB(to rank+1), will be stored _JokerSpike Mtrx
323  {
324  #ifdef FVM_PARALLEL
325  //send-recv single call since each process is involving send and recv
326  MPI::Status status;
327  if ( _procID != _nprocs-1)
328  MPI::COMM_WORLD.Sendrecv(_RSpikeB.getData() , _RSpikeB.getDataSize() , MPI::BYTE, _procID+1, 1199,
329  _JokerSpikeT.getData(), _JokerSpikeT.getDataSize(), MPI::BYTE, _procID+1, 2199, status );
330  if ( _procID != 0 )
331  MPI::COMM_WORLD.Sendrecv(_LSpikeT.getData() , _LSpikeT.getDataSize() , MPI::BYTE, _procID-1, 2199,
332  _JokerSpikeB.getData(), _JokerSpikeB.getDataSize(), MPI::BYTE, _procID-1, 1199, status );
333  /*_JokerSpikeB.print(cout);*/
334  /*_JokerSpikeT.print(cout);*/
335 #endif
336 
337 
338  }
339 
340 //settting reduced matrix
342 {
343  //system above the processor line
344  if ( _procID != _nprocs-1 ){
346  for ( int i = 0; i < _bandwidth; i++ ){
347  for ( int j = 0; j < _bandwidth; j++ ){
348  for ( int k = 0; k < _bandwidth; k++ ){
349  _reducedA1(i,j) -= _RSpikeB(i,k) * _JokerSpikeT(k,j);
350  }
351  }
352  }
353  }
354  /*_reducedA1.print(cout);*/
355 
356  //system above the processor line
357  if ( _procID != 0 ){
359  for ( int i = 0; i < _bandwidth; i++ ){
360  for ( int j = 0; j < _bandwidth; j++ ){
361  for ( int k = 0; k < _bandwidth; k++ ){
362  _reducedA2(i,j) -= _LSpikeT(i,k) * _JokerSpikeB(k,j);
363  }
364  }
365  }
366  }
367  /*_reducedA2.print(cout);*/
368 }
369 
370 //getting LU decomposigion for dense matrix, the LU decomposition is stored in
372 {
373  /*A.print(cout);*/
374  //fill permutation
375  for( int i = 0; i < pp.getLength(); i++ )
376  pp[i] = i;
377 
378  const int n = A.getRow();
379  for ( int i = 0; i < n-1; i++ ){
380  //doing paritial (column) pivoting
381  Diag pivot = A(i,i);
382  int jj = i;
383  for ( int j = i+1; j < n; j++){
385  jj = j;
386  pivot = A(j,i);
387  }
388  }
389  //explicitly swap A(i,i:n-1) and A(jj,i:n-1)
390  if ( jj > i ){
391  for ( int j = i; j < n; j++){
392  const Diag tmp = A(i,j);
393  A(i,j) = A(jj,j);
394  A(jj,j) = tmp;
395  }
396  pp[i] = jj;
397  }
399  pivot = A(i,i);
400  for ( int j = i+1; j < n; j++ ){
401  const Diag m = A(j,i) / pivot;
402  A(j,i) = m;
403  for ( int k = i+1; k < n; k++ ){
404  A(j,k) -= m * A(i,k);
405  }
406  }
407  }
408  /*pp.print(cout);*/
409  /*A.print(cout);*/
410 
411 
412 }
413 
414 
415 // generalized Lu solve Lu x = f as Vector
416  void luSolver(const Array<X>& f, Array<X>& x, bool negate_rhs=false)
417  {
418  x.zero();
419  //zeros y
420  _y.zero();
421  const int b = _bandwidth;
422  if ( negate_rhs ){
423  _y[0] = -f[0];
424  for ( int i = 1; i < _ncells; i++ ){
425  X yi = -f[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];
429  }
430  _y[i] = yi;
431  }
432  } else {
433  _y[0] = f[0];
434  for ( int i = 1; i < _ncells; i++ ){
435  X yi = f[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];
439  }
440  _y[i] = yi;
441  }
442  }
443  /*_y.print(cout);*/
444  //backward solve
445  x.zero();
446  x[_ncells-1] = _y[_ncells-1] / _A(b,_ncells-1);
447  for ( int i = _ncells-2; i >= 0; i-- ){
448  X soli = _y[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];
452  }
453  x[i] = soli / _A(b,i);
454  }
455  /*f.print(cout);*/
456  /*cout << endl;*/
457  /*_y.print(cout);*/
458  /*cout << endl;*/
459  /*x.print(cout);*/
460  /*cout << endl;*/
461  }
462 
463  //setting gB and gT from g
464  void setgBgT()
465  {
466  //top part of g
467  _gT.zero();
468  for ( int i = 0; i < _bandwidth; i++ )
469  _gT[i] = _g[i];
470  //bottom part of g
471  _gB.zero();
472  int indx = 0;
473  for ( int i = _ncells-_bandwidth; i < _ncells; i++ )
474  _gB[indx++] = _g[i];
475  /*_g.print(cout);*/
476  /*_gT.print(cout);*/
477  /*_gB.print(cout);*/
478 
479  }
480  //exhange gT and gB to temporary arrays
482  {
483  _JokergB.zero();
484  _JokergT.zero();
485  #ifdef FVM_PARALLEL
486  //send-recv single call since each process is involving send and recv
487  MPI::Status status;
488  if (_procID != _nprocs-1)
489  MPI::COMM_WORLD.Sendrecv(_gB.getData() , _gB.getDataSize() , MPI::BYTE, _procID+1, 3199,
490  _JokergT.getData(), _JokergT.getDataSize(), MPI::BYTE, _procID+1, 4199, status );
491  if ( _procID != 0 )
492  MPI::COMM_WORLD.Sendrecv(_gT.getData() , _gT.getDataSize() , MPI::BYTE, _procID-1, 4199,
493  _JokergB.getData(), _JokergB.getDataSize(), MPI::BYTE, _procID-1, 3199, status );
494  #endif
495  /*_JokergB.print(cout);*/
496  /*_JokergT.print(cout);*/
497 
498  }
499 
500  //setting rhs for reduced system
502  {
503  //rhs1
504  _reducedRHS1.zero();
505  for ( int i = 0; i < _bandwidth; i++ ){
506  X dot_product = NumTypeTraits<X>::getZero();
507  for ( int j = 0; j < _bandwidth; j++ ){
508  dot_product += _RSpikeB(i,j) * _JokergT[j];
509  }
510  _reducedRHS1[i] = _gB[i] - dot_product;
511  }
512  /*_reducedRHS1.print(cout);*/
513  //rhs2
514  _reducedRHS2.zero();
515  for ( int i = 0; i < _bandwidth; i++ ){
516  X dot_product = NumTypeTraits<X>::getZero();
517  for ( int j = 0; j < _bandwidth; j++ ){
518  dot_product += _LSpikeT(i,j) * _JokergB[j];
519  }
520  _reducedRHS2[i] = _gT[i] - dot_product;
521  }
522  /*_reducedRHS2.print(cout);*/
523  }
524  //solving reduced system
526  {
527  if (_procID != _nprocs-1)
528  denseLUsolve(_reducedA1, _pp1, _reducedRHS1); //solution z1 is stored in reducedRHS1
529  if ( _procID != 0 )
530  denseLUsolve(_reducedA2, _pp2, _reducedRHS2);//solution z2 is stored in reducedRHS2
531  }
532  //dens LU solver
533  void denseLUsolve( const Array2D<Diag>& A, const Array<int>& pp, Array<X>& rhs )
534  {
535  /*rhs.print(cout);*/
536  const int n = A.getRow();
537  //forward solve
538  for ( int i = 0; i < n-1; i++ ){
539  //swap components of y: y(i) <---> y(pp(i))
540  if ( pp[i] > i ){
541  X tmp = rhs[i];
542  rhs[i] = rhs[pp[i]];
543  rhs[pp[i]]=tmp;
544  }
545  for ( int j = i+1; j < n; j++ ){
546  rhs[j] -= A(j,i) * rhs[i];
547  }
548  }
549 
550  //back solve (later =/ might be useful to define)
551  if ( n >= 1 ) //prevent accessing arrays if n=0 size
552  rhs[n-1] = rhs[n-1] / A(n-1,n-1);
553 
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];
557  }
558  rhs[i] = rhs[i] / A(i,i);
559  }
560  /*cout << endl;*/
561  /*rhs.print(cout);*/
562  /*cout << endl;*/
563  }
564 
565 //exchange reduced system solution between neighbourhodds
567  {
568  _JokerZ1.zero();
569  _JokerZ2.zero();
570  #ifdef FVM_PARALLEL
571  //send-recv single call since each process is involving send and recv
572  MPI::Status status;
573  if (_procID != _nprocs-1)
574  MPI::COMM_WORLD.Sendrecv(_reducedRHS1.getData(), _reducedRHS1.getDataSize(), MPI::BYTE, _procID+1, 3199,
575  _JokerZ2.getData(), _JokerZ2.getDataSize(), MPI::BYTE, _procID+1, 4199, status );
576  if ( _procID != 0 )
577  MPI::COMM_WORLD.Sendrecv(_reducedRHS2.getData(), _reducedRHS2.getDataSize(), MPI::BYTE, _procID-1, 4199,
578  _JokerZ1.getData(), _JokerZ1.getDataSize(), MPI::BYTE, _procID-1, 3199, status );
579  #endif
580  /*cout << endl;*/
581  /*_JokerZ1.print(cout);*/
582  /*cout << endl;*/
583  /*_JokerZ2.print(cout);*/
584  /*cout << endl;*/
585 
586  }
587 //setting rhs for final
588  void setRHS(const Array<X>& f, bool negate_rhs=false)
589  {
590  _RHS.zero();
591  if ( negate_rhs == true ){
592  for ( int i = 0; i < _ncells; i++ )
593  _RHS[i] = -f[i];
594  } else {
595  for ( int i = 0; i < _ncells; i++ )
596  _RHS[i] = f[i];
597  }
598  //top part
599  for ( int i = 0; i < _bandwidth; i++ ){
600  X dot_product = NumTypeTraits<X>::getZero();
601  for ( int j = 0; j < _bandwidth; j++ ){
602  dot_product += _L(i,j) * _JokerZ1[j];
603  }
604  _RHS[i] -= dot_product;
605  }
606  //bottom part
607  for ( int i = 0; i < _bandwidth; i++ ){
608  X dot_product = NumTypeTraits<X>::getZero();
609  const int indx = _ncells-_bandwidth+i;
610  for ( int j = 0; j < _bandwidth; j++ ){
611  dot_product += _R(i,j) * _JokerZ2[j];
612  }
613  _RHS[indx] -= dot_product;
614  }
615  /*_RHS.print(cout);*/
616  /*cout << endl;*/
617  }
618 
619 
620 
625  const int _bandwidth;
626  const int _ncells;
627  int _procID;
628  int _nprocs;
630  Array2D<Diag> _LL; //C matrix full Nxb
631  Array2D<Diag> _L; //C matrix only bxb
632  Array2D<Diag> _RR; //B matrix full Nxb
633  Array2D<Diag> _R; //B matrix bxb
634  Array2D<Diag> _LSpike; //full left spike matrix
635  Array2D<Diag> _LSpikeT; //left-top spike matrix
636  Array2D<Diag> _RSpike; //full right spike matrix
637  Array2D<Diag> _RSpikeB; //right-top spike matrix
638  Array2D<Diag> _JokerSpikeT; // bxb matrix come from rank+1(source)
639  Array2D<Diag> _JokerSpikeB; // bxb matrix come from rank-1(source)
640  Array2D<Diag> _reducedA1; // bxb matrix (I-V * W )z1 = g1 - V g2 (system above processor boundary line)
641  Array2D<Diag> _reducedA2; // bxb matrix (I-W * V )z2 = g2 - V g1 (system below processor boundayr line)
642  Array<X> _reducedRHS1; // g1 - V g2
643  Array<X> _reducedRHS2; // g2 - W g1
644  Array<X> _JokerZ1; //store z1 solution from other process(rank-1)
645  Array<X> _JokerZ2; //store z2 solution from other process(rank+1)
646  Array<X> _RHS; //final step f1 - C2*z1 - B2*z4
647  Array<X> _g; //g matrix LU g = f
648  Array<X> _gB; //bottom part of g, gB = g(ncells-b,ncells-1)
649  Array<X> _gT; //top part of g, gT = g(0:b-1)
650  Array<X> _JokergB; //from top process
651  Array<X> _JokergT; //from bottom process
653  Array2D<Diag> _yR; //joker vector for intermiediate steps,
654  //LU x = f, Ux = y first solve L y = f and then solve U x = y
655  Array<X> _y; //joker vector
657  Array<int> _pp2; //permutation vectors
658 };
659 
660 
661 #endif
const Array< int > & getCol() const
virtual void zero()
Definition: Array.h:281
Array< X > _JokergT
Definition: SpikeMatrix.h:651
Array< X > _gT
Definition: SpikeMatrix.h:649
const Array< int > & getRow() const
const vector< int > & getRSPKOffDiagPtr() const
Definition: SpikeStorage.h:29
int getRow() const
Definition: Array2D.h:37
const vector< int > & getRSPKCountGhost() const
Definition: SpikeStorage.h:37
Array< X > _reducedRHS2
Definition: SpikeMatrix.h:643
Array2D< Diag > _reducedA2
Definition: SpikeMatrix.h:641
T_OffDiag OffDiag
Definition: SpikeMatrix.h:27
const int _bandwidth
Definition: SpikeMatrix.h:625
Array< X > _RHS
Definition: SpikeMatrix.h:646
void * getData()
Definition: Array2D.h:97
void partialCopyFrom(const Array2D &aij)
Definition: Array2D.h:60
const int _ncells
Definition: SpikeMatrix.h:626
void exchangeSpikeMtrx()
Definition: SpikeMatrix.h:322
Array2D< Diag > _LL
Definition: SpikeMatrix.h:630
void exchange_reducedSol()
Definition: SpikeMatrix.h:566
Array< OffDiag > OffDiagArray
Definition: SpikeMatrix.h:29
Array2D< Diag > _RR
Definition: SpikeMatrix.h:632
virtual ~SpikeMatrix()
Definition: SpikeMatrix.h:96
Array2D< Diag > _RSpike
Definition: SpikeMatrix.h:636
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
void setLSpikeMtrx()
Definition: SpikeMatrix.h:206
const Array< OffDiag > & _offDiag
Definition: SpikeMatrix.h:623
void setMatrix()
Definition: SpikeMatrix.h:125
void setRMtrx()
Definition: SpikeMatrix.h:187
double max(double x, double y)
Definition: Octree.cpp:18
Array2D< Diag > _yL
Definition: SpikeMatrix.h:652
const vector< int > & getLSPKCountGhost() const
Definition: SpikeStorage.h:36
void setRSpikeMtrx()
Definition: SpikeMatrix.h:284
#define logCtor()
Definition: RLogInterface.h:26
const vector< int > & getLSPKIndexI() const
Definition: SpikeStorage.h:31
Array< X > _JokerZ2
Definition: SpikeMatrix.h:645
void partialCopyTo(Array2D &aij)
Definition: Array2D.h:70
void solveReducedSystem()
Definition: SpikeMatrix.h:525
void denseMtrxLU(Array2D< Diag > &A, Array< int > &pp)
Definition: SpikeMatrix.h:371
void initAssembly()
Definition: SpikeMatrix.h:104
Array2D< Diag > _LSpike
Definition: SpikeMatrix.h:634
virtual int getDataSize() const
Definition: Array.h:276
virtual void * getData() const
Definition: Array.h:275
void setgBgT()
Definition: SpikeMatrix.h:464
Array< X > _gB
Definition: SpikeMatrix.h:648
const CRConnectivity & _conn
Definition: SpikeMatrix.h:621
Array< X > _g
Definition: SpikeMatrix.h:647
void luSolver(const Array< X > &f, Array< X > &x, bool negate_rhs=false)
Definition: SpikeMatrix.h:416
Array2D< Diag > _LSpikeT
Definition: SpikeMatrix.h:635
Array2D< Diag > _yR
Definition: SpikeMatrix.h:653
const Array< Diag > & _diag
Definition: SpikeMatrix.h:622
Array2D< Diag > _reducedA1
Definition: SpikeMatrix.h:640
Array< int > _pp2
Definition: SpikeMatrix.h:657
SpikeMatrix(const CRConnectivity &conn, const Array< T_Diag > &diag, const Array< T_OffDiag > &off_diag, const SpikeStorage &spike_storage)
Definition: SpikeMatrix.h:32
Definition: Matrix.h:16
void setReducedMtrx()
Definition: SpikeMatrix.h:341
#define logDtor()
Definition: RLogInterface.h:33
void setIdentity()
Definition: Array2D.h:85
void setReducedRHS()
Definition: SpikeMatrix.h:501
Array< X > _reducedRHS1
Definition: SpikeMatrix.h:642
const vector< int > & getLSPKOffDiagPtr() const
Definition: SpikeStorage.h:28
const vector< int > & getRSPKIndexJ() const
Definition: SpikeStorage.h:34
Array2D< Diag > _JokerSpikeB
Definition: SpikeMatrix.h:639
void setLMtrx()
Definition: SpikeMatrix.h:148
Array< int > _pp1
Definition: SpikeMatrix.h:656
void setRHS(const Array< X > &f, bool negate_rhs=false)
Definition: SpikeMatrix.h:588
void solve(const XArray &f, XArray &x)
Definition: SpikeMatrix.h:75
Array< X > XArray
Definition: SpikeMatrix.h:30
Array< Diag > DiagArray
Definition: SpikeMatrix.h:28
Array< X > _JokerZ1
Definition: SpikeMatrix.h:644
const vector< int > & getLSPKIndexJ() const
Definition: SpikeStorage.h:32
Array2D< Diag > _L
Definition: SpikeMatrix.h:631
void exchange_gTgB()
Definition: SpikeMatrix.h:481
T_Diag Diag
Definition: SpikeMatrix.h:26
const vector< int > & getRSPKIndexI() const
Definition: SpikeStorage.h:33
double min(double x, double y)
Definition: Octree.cpp:23
void zeros()
Definition: Array2D.h:80
int getDataSize() const
Definition: Array2D.h:98
void denseLUsolve(const Array2D< Diag > &A, const Array< int > &pp, Array< X > &rhs)
Definition: SpikeMatrix.h:533
Array< X > _y
Definition: SpikeMatrix.h:655
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
Array< X > _JokergB
Definition: SpikeMatrix.h:650
Array2D< Diag > _JokerSpikeT
Definition: SpikeMatrix.h:638
void setRSpikeMtrxFull()
Definition: SpikeMatrix.h:244
const SpikeStorage & _spikeStorage
Definition: SpikeMatrix.h:624
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
int getLength() const
Definition: Array.h:87