00001
00002
00003 #ifndef _SPARSEGRIDMTXLU_H__
00004 #define _SPARSEGRIDMTXLU_H__
00005
00006 #include "SparseGridMtx.h"
00007
00008 DSS_NAMESPASE_BEGIN
00009
00010
00011
00012
00013 class SparseGridMtxLU :
00014 public SparseGridMtx
00015 {
00016 public:
00017
00018
00019 SparseGridMtxLU(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,MathTracer* eMT,BOOL load_data = TRUE);
00020
00021
00022
00023 SparseGridMtxLU(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,Ordering* node_order,MathTracer* eMT,BOOL load_data = TRUE);
00024
00025 virtual ~SparseGridMtxLU();
00026
00027 public:
00028
00029 double* Columns_data;
00030 double* Rows_data;
00031 double* Diagonal_data;
00032
00033 void AlocateMemoryByPattern(IConectMatrix* bskl);
00034
00035 double GetValue(long bi,long bj,long si, long sj,long& aux_bi_idx,long& aux_bj_idx)
00036 {
00037 if (bi==bj)
00038 return this->Diagonal_data[bi*block_storage+si+sj*block_size];
00039 else
00040 if (bj>bi)
00041 return Columns[bj]->GetValue(block_size,bi,si,sj,Columns_data,aux_bj_idx);
00042 else
00043 return Columns[bi]->GetValue(block_size,bj,sj,si,Rows_data,aux_bi_idx);
00044 }
00045
00046 void Solve(double* b, double* x);
00047
00048
00049 virtual double& ElementAt(int i, int j);
00050 virtual void LoadZeros();
00051 virtual void LoadMatrixNumbers(SparseMatrixF& sm);
00052 virtual void SolveLV(const LargeVector& b, LargeVector& x);
00053 virtual void MultiplyByVector(const LargeVectorAttach& x, LargeVectorAttach& y);
00054 virtual void Factorize();
00055
00056 void BackSubstU(double* x,long fixed_blocks);
00057 void ForwardSubstL(double* x,long fixed_blocks);
00058
00059
00060 void SolveLU(double* x,long fixed_blocks=0);
00061
00062 void SubMultU12(double* px, double* py,long fixed_blocks);
00063 void SubMultL21(double* px, double* py,long fixed_blocks);
00064
00065 public:
00066
00067 virtual void SchurComplementFactorization(int fixed_blocks);
00068 virtual void SolveA11(double* x,long fixed_blocks);
00069 virtual void Sub_A21_A11inv(double* x,long fixed_blocks);
00070 virtual void Sub_A11inv_A12(double* x,long fixed_blocks);
00071 virtual void WriteCondensedMatrixA22(double* a,Ordering* mcn,IntArrayList* lncn);
00072
00073 };
00074
00075 DSS_NAMESPASE_END
00076
00077 #endif// _SPARSEGRIDMTXLU_H__