#ifndef MultiLevelSVD_H #define MultiLevelSVD_H #include #include #include #include #include #include #include //////////////////////////////////////////////////////////////////////////// template group* InitilizeTopGroup(element **ElementArray, int nElement); template group** MeshPartition(group *top, int grpsize, int &numGrp); template void BuildGroupBasisLink(group *top, Basis* BasisArray); //////////////////////////////////////////////////////////////////////////// template group* InitilizeTopGroup(element **ElementArray, int nElement) { int i, j; for (i = 0; i < nElement; i ++) { element *elem = ElementArray[i]; double cx = 0.0, cy = 0.0, cz = 0.0; int nodeNum = 3; double x, y ,z; for (j = 0; j < nodeNum; j ++) { x = elem->GetNodePtr(j)->GetX(); y = elem->GetNodePtr(j)->GetY(); z = elem->GetNodePtr(j)->GetZ(); cx += x; cy += y; cz += z; } cx /= (double) nodeNum; cy /= (double) nodeNum; cz /= (double) nodeNum; elem->SetCenter(cx, cy, cz); } group *top; top = new group [1]; top->SetnElement(nElement); top->Initialize(); for (i = 0; i < nElement; i ++) top->InsertElement(ElementArray[i]); return top; } template group** MeshPartition(group *top, int grpsize, int &numGrp) { numGrp = 0; top->PartitionMultiLevelSVD(grpsize, numGrp); group **groupArray; groupArray = new group* [numGrp]; top->findGroup(groupArray); return groupArray; } template void BuildGroupBasisLink(group *top, Basis* BasisArray) { top->BuildGroupBarray(BasisArray); } #endif