Memosa-FVM  0.2
SpikeMatrix< T_Diag, T_OffDiag, X > Class Template Reference

#include <SpikeMatrix.h>

Inheritance diagram for SpikeMatrix< T_Diag, T_OffDiag, X >:
Collaboration diagram for SpikeMatrix< T_Diag, T_OffDiag, X >:

Public Types

typedef T_Diag Diag
 
typedef T_OffDiag OffDiag
 
typedef Array< DiagDiagArray
 
typedef Array< OffDiagOffDiagArray
 
typedef Array< X > XArray
 

Public Member Functions

 SpikeMatrix (const CRConnectivity &conn, const Array< T_Diag > &diag, const Array< T_OffDiag > &off_diag, const SpikeStorage &spike_storage)
 
void solve (const XArray &f, XArray &x)
 
virtual ~SpikeMatrix ()
 
- Public Member Functions inherited from Matrix
 Matrix ()
 
virtual ~Matrix ()
 
 DEFINE_TYPENAME ("Matrix")
 
virtual void multiply (IContainer &yB, const IContainer &xB) const
 
virtual void multiplyAndAdd (IContainer &yB, const IContainer &xB) const
 
virtual shared_ptr< ArrayBasequadProduct (const IContainer &xB) const
 
virtual void forwardGS (IContainer &xB, IContainer &bB, IContainer &residual) const
 
virtual void reverseGS (IContainer &xB, IContainer &bB, IContainer &residual) const
 
virtual void Jacobi (IContainer &xnew, const IContainer &xold, const IContainer &b) const
 
virtual void iluSolve (IContainer &xB, const IContainer &bB, const IContainer &residual) const
 
virtual void spikeSolve (IContainer &xB, const IContainer &bB, const IContainer &residual, const SpikeStorage &spike_storage) const
 
virtual void solveBoundary (IContainer &xB, IContainer &bB, IContainer &residual) const
 
virtual void computeResidual (const IContainer &xB, const IContainer &bB, IContainer &residual) const
 
virtual int createCoarsening (IContainer &coarseIndex, const int groupSize, const double weighRatioThreshold)
 
virtual const CRConnectivitygetConnectivity () const
 
virtual void eliminateBoundaryEquations (IContainer &xB)
 
virtual void printRow (const int nr) const
 
virtual void * getDiagData () const
 
virtual void * getOffDiagData () const
 
virtual int getDiagDataSize () const
 
virtual int getOffDiagDataSize () const
 
virtual shared_ptr< MatrixcreateMergeMatrix (const LinearSystemMerger &mergeLS)
 
virtual void setFlatMatrix (Matrix &fmg) const
 
virtual void transpose ()
 
virtual shared_ptr
< CRConnectivity
createCoarseConnectivity (const IContainer &coarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
 
virtual shared_ptr< MatrixcreateCoarseMatrix (const IContainer &coarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &coarseConnectivity)
 
virtual bool isInvertible ()
 

Private Member Functions

void initAssembly ()
 
void setMatrix ()
 
void setLMtrx ()
 
void lu ()
 
void setRMtrx ()
 
void setLSpikeMtrx ()
 
void setRSpikeMtrxFull ()
 
void setRSpikeMtrx ()
 
void exchangeSpikeMtrx ()
 
void setReducedMtrx ()
 
void denseMtrxLU (Array2D< Diag > &A, Array< int > &pp)
 
void luSolver (const Array< X > &f, Array< X > &x, bool negate_rhs=false)
 
void setgBgT ()
 
void exchange_gTgB ()
 
void setReducedRHS ()
 
void solveReducedSystem ()
 
void denseLUsolve (const Array2D< Diag > &A, const Array< int > &pp, Array< X > &rhs)
 
void exchange_reducedSol ()
 
void setRHS (const Array< X > &f, bool negate_rhs=false)
 

Private Attributes

const CRConnectivity_conn
 
const Array< Diag > & _diag
 
const Array< OffDiag > & _offDiag
 
const SpikeStorage_spikeStorage
 
const int _bandwidth
 
const int _ncells
 
int _procID
 
int _nprocs
 
Array2D< Diag_A
 
Array2D< Diag_LL
 
Array2D< Diag_L
 
Array2D< Diag_RR
 
Array2D< Diag_R
 
Array2D< Diag_LSpike
 
Array2D< Diag_LSpikeT
 
Array2D< Diag_RSpike
 
Array2D< Diag_RSpikeB
 
Array2D< Diag_JokerSpikeT
 
Array2D< Diag_JokerSpikeB
 
Array2D< Diag_reducedA1
 
Array2D< Diag_reducedA2
 
Array< X > _reducedRHS1
 
Array< X > _reducedRHS2
 
Array< X > _JokerZ1
 
Array< X > _JokerZ2
 
Array< X > _RHS
 
Array< X > _g
 
Array< X > _gB
 
Array< X > _gT
 
Array< X > _JokergB
 
Array< X > _JokergT
 
Array2D< Diag_yL
 
Array2D< Diag_yR
 
Array< X > _y
 
Array< int > _pp1
 
Array< int > _pp2
 

Detailed Description

template<typename T_Diag, typename T_OffDiag, typename X>
class SpikeMatrix< T_Diag, T_OffDiag, X >

Definition at line 20 of file SpikeMatrix.h.

Member Typedef Documentation

template<typename T_Diag , typename T_OffDiag , typename X >
typedef T_Diag SpikeMatrix< T_Diag, T_OffDiag, X >::Diag

Definition at line 26 of file SpikeMatrix.h.

template<typename T_Diag , typename T_OffDiag , typename X >
typedef Array<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::DiagArray

Definition at line 28 of file SpikeMatrix.h.

template<typename T_Diag , typename T_OffDiag , typename X >
typedef T_OffDiag SpikeMatrix< T_Diag, T_OffDiag, X >::OffDiag

Definition at line 27 of file SpikeMatrix.h.

template<typename T_Diag , typename T_OffDiag , typename X >
typedef Array<OffDiag> SpikeMatrix< T_Diag, T_OffDiag, X >::OffDiagArray

Definition at line 29 of file SpikeMatrix.h.

template<typename T_Diag , typename T_OffDiag , typename X >
typedef Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::XArray

Definition at line 30 of file SpikeMatrix.h.

Constructor & Destructor Documentation

template<typename T_Diag , typename T_OffDiag , typename X >
SpikeMatrix< T_Diag, T_OffDiag, X >::SpikeMatrix ( const CRConnectivity conn,
const Array< T_Diag > &  diag,
const Array< T_OffDiag > &  off_diag,
const SpikeStorage spike_storage 
)
inline

Definition at line 32 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly(), and logCtor.

32  :
33  Matrix(),
34  _conn(conn),
35  _diag(diag),
36  _offDiag(off_diag),
37  _spikeStorage(spike_storage),
38  _bandwidth(spike_storage.getBandWidth()),
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  }
Array< X > _JokergT
Definition: SpikeMatrix.h:651
Array< X > _gT
Definition: SpikeMatrix.h:649
int getSelfCount() const
Definition: StorageSite.h:40
Array< X > _reducedRHS2
Definition: SpikeMatrix.h:643
Array2D< Diag > _reducedA2
Definition: SpikeMatrix.h:641
const int _bandwidth
Definition: SpikeMatrix.h:625
Array< X > _RHS
Definition: SpikeMatrix.h:646
const int _ncells
Definition: SpikeMatrix.h:626
Array2D< Diag > _LL
Definition: SpikeMatrix.h:630
Array2D< Diag > _RR
Definition: SpikeMatrix.h:632
Matrix()
Definition: Matrix.cpp:8
Array2D< Diag > _RSpike
Definition: SpikeMatrix.h:636
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
const Array< OffDiag > & _offDiag
Definition: SpikeMatrix.h:623
Array2D< Diag > _yL
Definition: SpikeMatrix.h:652
#define logCtor()
Definition: RLogInterface.h:26
Array< X > _JokerZ2
Definition: SpikeMatrix.h:645
void initAssembly()
Definition: SpikeMatrix.h:104
Array2D< Diag > _LSpike
Definition: SpikeMatrix.h:634
Array< X > _gB
Definition: SpikeMatrix.h:648
const CRConnectivity & _conn
Definition: SpikeMatrix.h:621
Array< X > _g
Definition: SpikeMatrix.h:647
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
Array< X > _reducedRHS1
Definition: SpikeMatrix.h:642
Array2D< Diag > _JokerSpikeB
Definition: SpikeMatrix.h:639
int getBandWidth() const
Definition: SpikeStorage.h:39
Array< int > _pp1
Definition: SpikeMatrix.h:656
Array< X > _JokerZ1
Definition: SpikeMatrix.h:644
Array2D< Diag > _L
Definition: SpikeMatrix.h:631
const StorageSite & getRowSite() const
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
const SpikeStorage & _spikeStorage
Definition: SpikeMatrix.h:624
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
template<typename T_Diag , typename T_OffDiag , typename X >
virtual SpikeMatrix< T_Diag, T_OffDiag, X >::~SpikeMatrix ( )
inlinevirtual

Definition at line 96 of file SpikeMatrix.h.

References logDtor.

97  {
98  logDtor();
99  }
#define logDtor()
Definition: RLogInterface.h:33

Member Function Documentation

template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::denseLUsolve ( const Array2D< Diag > &  A,
const Array< int > &  pp,
Array< X > &  rhs 
)
inlineprivate

Definition at line 533 of file SpikeMatrix.h.

References Array2D< T >::getRow().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solveReducedSystem().

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  }
int getRow() const
Definition: Array2D.h:37
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::denseMtrxLU ( Array2D< Diag > &  A,
Array< int > &  pp 
)
inlineprivate

Definition at line 371 of file SpikeMatrix.h.

References Array< T >::getLength(), and Array2D< T >::getRow().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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 }
int getRow() const
Definition: Array2D.h:37
T_Diag Diag
Definition: SpikeMatrix.h:26
int getLength() const
Definition: Array.h:87
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::exchange_gTgB ( )
inlineprivate

Definition at line 481 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_gB, SpikeMatrix< T_Diag, T_OffDiag, X >::_gT, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergB, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergT, SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, Array< T >::getData(), Array< T >::getDataSize(), and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
Array< X > _JokergT
Definition: SpikeMatrix.h:651
Array< X > _gT
Definition: SpikeMatrix.h:649
virtual int getDataSize() const
Definition: Array.h:276
virtual void * getData() const
Definition: Array.h:275
Array< X > _gB
Definition: SpikeMatrix.h:648
Array< X > _JokergB
Definition: SpikeMatrix.h:650
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::exchange_reducedSol ( )
inlineprivate

Definition at line 566 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ1, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ2, SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS2, Array< T >::getData(), Array< T >::getDataSize(), and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
Array< X > _reducedRHS2
Definition: SpikeMatrix.h:643
Array< X > _JokerZ2
Definition: SpikeMatrix.h:645
virtual int getDataSize() const
Definition: Array.h:276
virtual void * getData() const
Definition: Array.h:275
Array< X > _reducedRHS1
Definition: SpikeMatrix.h:642
Array< X > _JokerZ1
Definition: SpikeMatrix.h:644
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::exchangeSpikeMtrx ( )
inlineprivate

Definition at line 322 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeB, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpikeB, Array2D< T >::getData(), and Array2D< T >::getDataSize().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
void * getData()
Definition: Array2D.h:97
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
Array2D< Diag > _LSpikeT
Definition: SpikeMatrix.h:635
Array2D< Diag > _JokerSpikeB
Definition: SpikeMatrix.h:639
int getDataSize() const
Definition: Array2D.h:98
Array2D< Diag > _JokerSpikeT
Definition: SpikeMatrix.h:638
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly ( )
inlineprivatevirtual

Implements Matrix.

Definition at line 104 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_pp1, SpikeMatrix< T_Diag, T_OffDiag, X >::_pp2, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA2, SpikeMatrix< T_Diag, T_OffDiag, X >::denseMtrxLU(), SpikeMatrix< T_Diag, T_OffDiag, X >::exchangeSpikeMtrx(), SpikeMatrix< T_Diag, T_OffDiag, X >::lu(), SpikeMatrix< T_Diag, T_OffDiag, X >::setLMtrx(), SpikeMatrix< T_Diag, T_OffDiag, X >::setLSpikeMtrx(), SpikeMatrix< T_Diag, T_OffDiag, X >::setMatrix(), SpikeMatrix< T_Diag, T_OffDiag, X >::setReducedMtrx(), SpikeMatrix< T_Diag, T_OffDiag, X >::setRMtrx(), and SpikeMatrix< T_Diag, T_OffDiag, X >::setRSpikeMtrx().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::SpikeMatrix().

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  }
Array2D< Diag > _reducedA2
Definition: SpikeMatrix.h:641
void exchangeSpikeMtrx()
Definition: SpikeMatrix.h:322
void setLSpikeMtrx()
Definition: SpikeMatrix.h:206
void setMatrix()
Definition: SpikeMatrix.h:125
void setRMtrx()
Definition: SpikeMatrix.h:187
void setRSpikeMtrx()
Definition: SpikeMatrix.h:284
void denseMtrxLU(Array2D< Diag > &A, Array< int > &pp)
Definition: SpikeMatrix.h:371
Array2D< Diag > _reducedA1
Definition: SpikeMatrix.h:640
Array< int > _pp2
Definition: SpikeMatrix.h:657
void setReducedMtrx()
Definition: SpikeMatrix.h:341
void setLMtrx()
Definition: SpikeMatrix.h:148
Array< int > _pp1
Definition: SpikeMatrix.h:656
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::lu ( )
inlineprivate

Definition at line 167 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, and min().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
T_Diag Diag
Definition: SpikeMatrix.h:26
double min(double x, double y)
Definition: Octree.cpp:23
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::luSolver ( const Array< X > &  f,
Array< X > &  x,
bool  negate_rhs = false 
)
inlineprivate

Definition at line 416 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_y, max(), min(), and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
double max(double x, double y)
Definition: Octree.cpp:18
double min(double x, double y)
Definition: Octree.cpp:23
Array< X > _y
Definition: SpikeMatrix.h:655
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setgBgT ( )
inlineprivate

Definition at line 464 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_g, SpikeMatrix< T_Diag, T_OffDiag, X >::_gB, SpikeMatrix< T_Diag, T_OffDiag, X >::_gT, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
Array< X > _gT
Definition: SpikeMatrix.h:649
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
Array< X > _gB
Definition: SpikeMatrix.h:648
Array< X > _g
Definition: SpikeMatrix.h:647
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setLMtrx ( )
inlineprivate

Definition at line 148 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_L, SpikeMatrix< T_Diag, T_OffDiag, X >::_offDiag, SpikeMatrix< T_Diag, T_OffDiag, X >::_spikeStorage, SpikeStorage::getLSPKCountGhost(), SpikeStorage::getLSPKIndexI(), SpikeStorage::getLSPKIndexJ(), and SpikeStorage::getLSPKOffDiagPtr().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const int _bandwidth
Definition: SpikeMatrix.h:625
const Array< OffDiag > & _offDiag
Definition: SpikeMatrix.h:623
const vector< int > & getLSPKCountGhost() const
Definition: SpikeStorage.h:36
const vector< int > & getLSPKIndexI() const
Definition: SpikeStorage.h:31
const vector< int > & getLSPKOffDiagPtr() const
Definition: SpikeStorage.h:28
const vector< int > & getLSPKIndexJ() const
Definition: SpikeStorage.h:32
Array2D< Diag > _L
Definition: SpikeMatrix.h:631
const SpikeStorage & _spikeStorage
Definition: SpikeMatrix.h:624
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setLSpikeMtrx ( )
inlineprivate

Definition at line 206 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_L, SpikeMatrix< T_Diag, T_OffDiag, X >::_LL, SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpike, SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_yL, max(), min(), Array2D< T >::partialCopyFrom(), Array2D< T >::partialCopyTo(), and Array2D< T >::zeros().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const int _bandwidth
Definition: SpikeMatrix.h:625
void partialCopyFrom(const Array2D &aij)
Definition: Array2D.h:60
const int _ncells
Definition: SpikeMatrix.h:626
Array2D< Diag > _LL
Definition: SpikeMatrix.h:630
double max(double x, double y)
Definition: Octree.cpp:18
Array2D< Diag > _yL
Definition: SpikeMatrix.h:652
void partialCopyTo(Array2D &aij)
Definition: Array2D.h:70
Array2D< Diag > _LSpike
Definition: SpikeMatrix.h:634
Array2D< Diag > _LSpikeT
Definition: SpikeMatrix.h:635
Array2D< Diag > _L
Definition: SpikeMatrix.h:631
T_Diag Diag
Definition: SpikeMatrix.h:26
double min(double x, double y)
Definition: Octree.cpp:23
void zeros()
Definition: Array2D.h:80
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setMatrix ( )
inlineprivate

Definition at line 125 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_conn, SpikeMatrix< T_Diag, T_OffDiag, X >::_diag, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRConnectivity::getCol(), and CRConnectivity::getRow().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const Array< int > & getCol() const
const Array< int > & getRow() const
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
const Array< OffDiag > & _offDiag
Definition: SpikeMatrix.h:623
const CRConnectivity & _conn
Definition: SpikeMatrix.h:621
const Array< Diag > & _diag
Definition: SpikeMatrix.h:622
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setReducedMtrx ( )
inlineprivate

Definition at line 341 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeB, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA2, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpikeB, and Array2D< T >::setIdentity().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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 }
Array2D< Diag > _reducedA2
Definition: SpikeMatrix.h:641
const int _bandwidth
Definition: SpikeMatrix.h:625
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
Array2D< Diag > _LSpikeT
Definition: SpikeMatrix.h:635
Array2D< Diag > _reducedA1
Definition: SpikeMatrix.h:640
void setIdentity()
Definition: Array2D.h:85
Array2D< Diag > _JokerSpikeB
Definition: SpikeMatrix.h:639
Array2D< Diag > _JokerSpikeT
Definition: SpikeMatrix.h:638
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setReducedRHS ( )
inlineprivate

Definition at line 501 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_gB, SpikeMatrix< T_Diag, T_OffDiag, X >::_gT, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergB, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergT, SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpikeT, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS2, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpikeB, and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
Array< X > _JokergT
Definition: SpikeMatrix.h:651
Array< X > _gT
Definition: SpikeMatrix.h:649
Array< X > _reducedRHS2
Definition: SpikeMatrix.h:643
const int _bandwidth
Definition: SpikeMatrix.h:625
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
Array< X > _gB
Definition: SpikeMatrix.h:648
Array2D< Diag > _LSpikeT
Definition: SpikeMatrix.h:635
Array< X > _reducedRHS1
Definition: SpikeMatrix.h:642
Array< X > _JokergB
Definition: SpikeMatrix.h:650
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setRHS ( const Array< X > &  f,
bool  negate_rhs = false 
)
inlineprivate

Definition at line 588 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ1, SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ2, SpikeMatrix< T_Diag, T_OffDiag, X >::_L, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_R, SpikeMatrix< T_Diag, T_OffDiag, X >::_RHS, and Array< T >::zero().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
virtual void zero()
Definition: Array.h:281
const int _bandwidth
Definition: SpikeMatrix.h:625
Array< X > _RHS
Definition: SpikeMatrix.h:646
const int _ncells
Definition: SpikeMatrix.h:626
Array< X > _JokerZ2
Definition: SpikeMatrix.h:645
Array< X > _JokerZ1
Definition: SpikeMatrix.h:644
Array2D< Diag > _L
Definition: SpikeMatrix.h:631
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setRMtrx ( )
inlineprivate

Definition at line 187 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_offDiag, SpikeMatrix< T_Diag, T_OffDiag, X >::_R, SpikeMatrix< T_Diag, T_OffDiag, X >::_spikeStorage, SpikeStorage::getRSPKCountGhost(), SpikeStorage::getRSPKIndexI(), SpikeStorage::getRSPKIndexJ(), and SpikeStorage::getRSPKOffDiagPtr().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const vector< int > & getRSPKOffDiagPtr() const
Definition: SpikeStorage.h:29
const vector< int > & getRSPKCountGhost() const
Definition: SpikeStorage.h:37
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
const Array< OffDiag > & _offDiag
Definition: SpikeMatrix.h:623
const vector< int > & getRSPKIndexJ() const
Definition: SpikeStorage.h:34
const vector< int > & getRSPKIndexI() const
Definition: SpikeStorage.h:33
const SpikeStorage & _spikeStorage
Definition: SpikeMatrix.h:624
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setRSpikeMtrx ( )
inlineprivate

Definition at line 284 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_R, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpikeB, SpikeMatrix< T_Diag, T_OffDiag, X >::_yR, and Array2D< T >::zeros().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::initAssembly().

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  }
const int _bandwidth
Definition: SpikeMatrix.h:625
const int _ncells
Definition: SpikeMatrix.h:626
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
Array2D< Diag > _yR
Definition: SpikeMatrix.h:653
T_Diag Diag
Definition: SpikeMatrix.h:26
void zeros()
Definition: Array2D.h:80
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::setRSpikeMtrxFull ( )
inlineprivate

Definition at line 244 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_A, SpikeMatrix< T_Diag, T_OffDiag, X >::_bandwidth, SpikeMatrix< T_Diag, T_OffDiag, X >::_ncells, SpikeMatrix< T_Diag, T_OffDiag, X >::_R, SpikeMatrix< T_Diag, T_OffDiag, X >::_RR, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpike, SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpikeB, SpikeMatrix< T_Diag, T_OffDiag, X >::_yR, max(), min(), Array2D< T >::partialCopyFrom(), Array2D< T >::partialCopyTo(), and Array2D< T >::zeros().

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  }
const int _bandwidth
Definition: SpikeMatrix.h:625
void partialCopyFrom(const Array2D &aij)
Definition: Array2D.h:60
const int _ncells
Definition: SpikeMatrix.h:626
Array2D< Diag > _RR
Definition: SpikeMatrix.h:632
Array2D< Diag > _RSpike
Definition: SpikeMatrix.h:636
Array2D< Diag > _RSpikeB
Definition: SpikeMatrix.h:637
double max(double x, double y)
Definition: Octree.cpp:18
void partialCopyTo(Array2D &aij)
Definition: Array2D.h:70
Array2D< Diag > _yR
Definition: SpikeMatrix.h:653
T_Diag Diag
Definition: SpikeMatrix.h:26
double min(double x, double y)
Definition: Octree.cpp:23
void zeros()
Definition: Array2D.h:80
Array2D< Diag > _A
Definition: SpikeMatrix.h:629
Array2D< Diag > _R
Definition: SpikeMatrix.h:633
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::solve ( const XArray f,
XArray x 
)
inline

Definition at line 75 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_g, SpikeMatrix< T_Diag, T_OffDiag, X >::_RHS, SpikeMatrix< T_Diag, T_OffDiag, X >::exchange_gTgB(), SpikeMatrix< T_Diag, T_OffDiag, X >::exchange_reducedSol(), SpikeMatrix< T_Diag, T_OffDiag, X >::luSolver(), SpikeMatrix< T_Diag, T_OffDiag, X >::setgBgT(), SpikeMatrix< T_Diag, T_OffDiag, X >::setReducedRHS(), SpikeMatrix< T_Diag, T_OffDiag, X >::setRHS(), and SpikeMatrix< T_Diag, T_OffDiag, X >::solveReducedSystem().

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  }
Array< X > _RHS
Definition: SpikeMatrix.h:646
void exchange_reducedSol()
Definition: SpikeMatrix.h:566
void solveReducedSystem()
Definition: SpikeMatrix.h:525
void setgBgT()
Definition: SpikeMatrix.h:464
Array< X > _g
Definition: SpikeMatrix.h:647
void luSolver(const Array< X > &f, Array< X > &x, bool negate_rhs=false)
Definition: SpikeMatrix.h:416
void setReducedRHS()
Definition: SpikeMatrix.h:501
void setRHS(const Array< X > &f, bool negate_rhs=false)
Definition: SpikeMatrix.h:588
void exchange_gTgB()
Definition: SpikeMatrix.h:481
template<typename T_Diag , typename T_OffDiag , typename X >
void SpikeMatrix< T_Diag, T_OffDiag, X >::solveReducedSystem ( )
inlineprivate

Definition at line 525 of file SpikeMatrix.h.

References SpikeMatrix< T_Diag, T_OffDiag, X >::_nprocs, SpikeMatrix< T_Diag, T_OffDiag, X >::_pp1, SpikeMatrix< T_Diag, T_OffDiag, X >::_pp2, SpikeMatrix< T_Diag, T_OffDiag, X >::_procID, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA2, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS1, SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS2, and SpikeMatrix< T_Diag, T_OffDiag, X >::denseLUsolve().

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::solve().

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  }
Array< X > _reducedRHS2
Definition: SpikeMatrix.h:643
Array2D< Diag > _reducedA2
Definition: SpikeMatrix.h:641
Array2D< Diag > _reducedA1
Definition: SpikeMatrix.h:640
Array< int > _pp2
Definition: SpikeMatrix.h:657
Array< X > _reducedRHS1
Definition: SpikeMatrix.h:642
Array< int > _pp1
Definition: SpikeMatrix.h:656
void denseLUsolve(const Array2D< Diag > &A, const Array< int > &pp, Array< X > &rhs)
Definition: SpikeMatrix.h:533

Member Data Documentation

template<typename T_Diag , typename T_OffDiag , typename X >
const CRConnectivity& SpikeMatrix< T_Diag, T_OffDiag, X >::_conn
private

Definition at line 621 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::setMatrix().

template<typename T_Diag , typename T_OffDiag , typename X >
const Array<Diag>& SpikeMatrix< T_Diag, T_OffDiag, X >::_diag
private

Definition at line 622 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::setMatrix().

template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_g
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_gB
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_gT
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergB
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokergT
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeB
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerSpikeT
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ1
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_JokerZ2
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_L
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_LL
private

Definition at line 630 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::setLSpikeMtrx().

template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_LSpike
private

Definition at line 634 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::setLSpikeMtrx().

template<typename T_Diag , typename T_OffDiag , typename X >
const Array<OffDiag>& SpikeMatrix< T_Diag, T_OffDiag, X >::_offDiag
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<int> SpikeMatrix< T_Diag, T_OffDiag, X >::_pp1
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<int> SpikeMatrix< T_Diag, T_OffDiag, X >::_pp2
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA1
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedA2
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS1
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_reducedRHS2
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_RHS
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_RR
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_RSpike
private
template<typename T_Diag , typename T_OffDiag , typename X >
const SpikeStorage& SpikeMatrix< T_Diag, T_OffDiag, X >::_spikeStorage
private
template<typename T_Diag , typename T_OffDiag , typename X >
Array<X> SpikeMatrix< T_Diag, T_OffDiag, X >::_y
private

Definition at line 655 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::luSolver().

template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_yL
private

Definition at line 652 of file SpikeMatrix.h.

Referenced by SpikeMatrix< T_Diag, T_OffDiag, X >::setLSpikeMtrx().

template<typename T_Diag , typename T_OffDiag , typename X >
Array2D<Diag> SpikeMatrix< T_Diag, T_OffDiag, X >::_yR
private

The documentation for this class was generated from the following file: