00001
00002
00003 #ifndef _SPARSEGRIDMTXLDL_H__
00004 #define _SPARSEGRIDMTXLDL_H__
00005
00006 #include "SparseGridMtx.h"
00007
00008 DSS_NAMESPASE_BEGIN
00009
00010
00011
00012
00013 class SparseGridMtxLDL :
00014 public SparseGridMtx
00015 {
00016 public:
00017
00018
00019 SparseGridMtxLDL(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,MathTracer* eMT,BOOL load_data = TRUE);
00020
00021
00022
00023 SparseGridMtxLDL(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,Ordering* node_order,MathTracer* eMT,BOOL load_data = TRUE);
00024
00025 virtual ~SparseGridMtxLDL();
00026
00027 public:
00028
00029 double* Columns_data;
00030
00031 void AlocateMemoryByPattern(IConectMatrix* bskl);
00032
00033
00034 void SetValue(long bi,long bj,long si, long sj,double val,long& aux_bi_idx,long& aux_bj_idx)
00035 {
00036 if (bi==bj)
00037 this->Columns_data[bi*block_storage+si+sj*block_size] = val;
00038 else
00039 if (bj>bi)
00040 Columns[bj]->SetValue(block_size,bi,si,sj,val,Columns_data,aux_bj_idx);
00041 else
00042 Columns[bi]->SetValue(block_size,bj,sj,si,val,Columns_data,aux_bi_idx);
00043 }
00044
00045
00046 double GetValue(long bi,long bj,long si, long sj,long& aux_bi_idx,long& aux_bj_idx)
00047 {
00048 if (bi==bj)
00049 return this->Columns_data[bi*block_storage+si+sj*block_size];
00050 else
00051 if (bj>bi)
00052 return Columns[bj]->GetValue(block_size,bi,si,sj,Columns_data,aux_bj_idx);
00053 else
00054 return Columns[bi]->GetValue(block_size,bj,sj,si,Columns_data,aux_bi_idx);
00055 }
00056
00057
00058 void AddValue(long bi,long bj,long si, long sj,double val)
00059 {
00060 if (bi==bj)
00061 this->Columns_data[bi*block_storage+si+sj*block_size] += val;
00062 else
00063 if (bj>bi)
00064 Columns[bj]->AddValue(block_size,bi,si,sj,val,Columns_data);
00065 else
00066 Columns[bi]->AddValue(block_size,bj,sj,si,val,Columns_data);
00067 }
00068
00069
00070 virtual void Solve(double* b, double* x);
00071
00072
00073 virtual double& ElementAt(int i, int j);
00074 virtual void LoadZeros();
00075 virtual void LoadMatrixNumbers(SparseMatrixF& sm);
00076 virtual void SolveLV(const LargeVector& b, LargeVector& x);
00077 virtual void MultiplyByVector(const LargeVectorAttach& x, LargeVectorAttach& y);
00078
00079 virtual void Factorize();
00080 void FactorizeOMP();
00081 virtual void Factorize_Incomplete();
00082
00083 LargeVector* tmp_vector_BS_nodes;
00084 void SolveLDL_node_perm(const LargeVector& b, LargeVector& x);
00085
00086 LargeVector* tmp_vector_BS;
00087 void SolveLDL_block_perm(const LargeVector& b, LargeVector& x);
00088
00089 void SolveLDL(double* x,long fixed_blocks=0);
00090
00091 private:
00092
00093 void SubMultL12T(double* px, double* py,long fixed_blocks);
00094 void SubMultL12(double* px, double* py,long fixed_blocks);
00095 void ForwardSubstL(double* x,long fixed_blocks);
00096 void SolveD(double* x,long fixed_blocks);
00097 void BackSubstLT(double* x,long fixed_blocks);
00098
00099 public:
00100
00101 virtual void SchurComplementFactorization(int fixed_blocks);
00102 virtual void SolveA11(double* x,long fixed_blocks);
00103 virtual void Sub_A21_A11inv(double* x,long fixed_blocks);
00104 virtual void Sub_A11inv_A12(double* x,long fixed_blocks);
00105 virtual void WriteCondensedMatrixA22(double* a,Ordering* mcn,IntArrayList* lncn);
00106
00107 };
00108
00109 DSS_NAMESPASE_END
00110
00111 #endif// _SPARSEGRIDMTXLDL_H__