00001
00002
00003 #include "SparseGridMtx.h"
00004
00005 DSS_NAMESPASE_BEGIN
00006
00007
00008
00009 SparseGridMtx::SparseGridMtx(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,MathTracer* eMT)
00010 {
00011
00012
00013
00014
00015 long* blockP = block_order->perm->Items;
00016 nonzeros = 0;
00017
00018 this->eMT = eMT;
00019 this->block_size = block_size;
00020 this->n_blocks = (long)sm.neq/block_size + ( ((sm.neq % block_size) == 0) ? 0 : 1 );
00021 this->n = (blockP==NULL)?(long)sm.neq:n_blocks*block_size;
00022 this->noDummyDOFs = n_blocks*block_size - (long)sm.neq;
00023 this->block_storage = block_size*block_size;
00024
00025 this->BlockArith = DenseMatrixArithmetics::NewArithmetics(block_size);
00026 this->BlockArith->eMT = eMT;
00027 this->block_order = block_order;
00028 this->node_order = NULL;
00029 this->Columns = new SparseGridColumn*[n_blocks];
00030 this->no_multiplications = 0;
00031
00032 }
00033
00034
00035
00036 SparseGridMtx::SparseGridMtx(SparseMatrixF& sm,BYTE block_size,Ordering* block_order,Ordering* node_order,MathTracer* eMT)
00037 {
00038
00039
00040
00041
00042 long* blockP = block_order->perm->Items;
00043 nonzeros = 0;
00044
00045 this->eMT = eMT;
00046 this->block_size = block_size;
00047 if (node_order)
00048 this->n_blocks = (long)(node_order->order->Count)/block_size + ( ((sm.neq % block_size) == 0) ? 0 : 1 );
00049 else
00050 this->n_blocks = (long)sm.neq/block_size + ( ((sm.neq % block_size) == 0) ? 0 : 1 );
00051
00052 this->n = (blockP==NULL)?(long)sm.neq:n_blocks*block_size;
00053 this->noDummyDOFs = n_blocks*block_size - (long)sm.neq;
00054 this->block_storage = block_size*block_size;
00055
00056 this->BlockArith = DenseMatrixArithmetics::NewArithmetics(block_size);
00057 this->BlockArith->eMT = eMT;
00058 this->block_order = block_order;
00059 this->node_order = node_order;
00060 this->Columns = new SparseGridColumn*[n_blocks];
00061 this->no_multiplications = 0;
00062 }
00063
00064 SparseGridMtx::~SparseGridMtx()
00065 {
00066 if (BlockArith) {delete BlockArith;BlockArith = NULL;}
00067 if (Columns)
00068 {
00069 for (long i=0; i<n_blocks; i++)
00070 if (Columns[i]) { delete Columns[i];Columns[i] = NULL;}
00071
00072 delete [] Columns;
00073 Columns = NULL;
00074 }
00075
00076
00077
00078 if (block_order) {delete block_order; block_order = NULL;}
00079
00080
00081
00082 }
00083
00084 void SparseGridMtx::ComputeBlocks()
00085 {
00086 this->blocks = n_blocks;
00087 for (long bi=0; bi<n_blocks; bi++)
00088 blocks += Columns[bi]->Entries;
00089 }
00090
00091 double SparseGridMtx::GetWaste()
00092 {
00093 return 1.0 - (double)nonzeros / (block_storage*blocks);
00094 }
00095
00096 void SparseGridMtx::WriteStatistics(long no_init_blocks,long no_nonzeros)
00097 {
00098 char str[512];
00099 long blockSize = BlockSize();
00100 double Waste = 100.0*( 1.0-(double)no_nonzeros/(no_init_blocks*blockSize*blockSize) );
00101
00102 sprintf(str," blocks size : %ldx%ld",blockSize,blockSize);
00103 eMT->Writeln(str);
00104 sprintf(str," number of blocks : %ld",Blocks());
00105 eMT->Writeln(str);
00106 sprintf(str," number of nonzeros : %ld",Nonzeros());
00107 eMT->Writeln(str);
00108 sprintf(str," allocation waste : %.2f",Waste);
00109 eMT->Write(str);eMT->Writeln("%% ");
00110 }
00111
00112 void SparseGridMtx::MultiplyByVector(const LargeVectorAttach& , LargeVectorAttach& )
00113 {
00114 EXIT_NOT_IMPLEMENTED;
00115
00116
00117
00118
00119 }
00120
00121
00122 DSS_NAMESPASE_END