-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreorder.cc
157 lines (133 loc) · 5.47 KB
/
reorder.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* This is the function of DOF number reordering using reverse Cuthill McKee
algorithm
It also reorders the mesh regions
Min Zhou summer 2008
*/
#include <list>
#include "phParAdapt.h"
#include "func.h"
#include <iostream>
extern pMeshDataId shpfnNum;
extern pMeshDataId MYCTID;
pMeshDataId doftag;
pMeshDataId ReorderR;
extern pMeshDataId POLYID;
extern forwardblock Iblock;
extern int* NIblock;
extern pMeshDataId RNENID;
using namespace std;
void
V_reordering(pMesh mesh, globalInfo* info, int ipart){
pVertex vertex;
list<pVertex> vList;
int tag = 1,marked;
if(!ipart) //only creat new for the first time
doftag = MD_newMeshDataId("dof tag");
int nnodes = info->nshg-1;
// int nnodesOwn =info->nshgOwn-1;
VIter vIter = M_vertexIter(mesh) ;
while(nnodes!=-1){ //has disjoint part
vertex = VIter_next(vIter) ; // the first vertex not tagged
while(EN_getDataInt(vertex,doftag,&marked))
vertex = VIter_next(vIter);
vList.push_back(vertex);
EN_attachDataInt((pEntity)vertex,doftag,tag);
list<pVertex>::iterator list_iter = vList.begin(); //pop out the first vertex in the list
while(list_iter!=vList.end()){
vertex = *list_iter;
EN_attachDataInt(vertex,MYCTID,nnodes--);
int numEdge = V_numEdges(vertex);
for(int iedge=0; iedge< numEdge; iedge++){ // looking for the adjacent nodes
pEdge edge = V_edge(vertex, iedge);
pVertex V0 = E_vertex(edge,0); // the first nodes of the edge
pVertex V1 = E_vertex(edge,1); // the seconde nodes of the edge
pVertex adjV = (V0==vertex?V1:V0); // take the adjacent node
if(!EN_getDataInt((pEntity)adjV, doftag,&marked)){
vList.push_back(adjV);
EN_attachDataInt((pEntity)adjV,doftag,tag);
}
}
vList.pop_front(); // erase the first one in the list
list_iter = vList.begin();
}
}
VIter_reset(vIter);
while( vertex = VIter_next(vIter))
EN_deleteData((pEntity)vertex,doftag);
VIter_delete(vIter);
}
void R_reordering(pMesh mesh, int ipart){
if(!ipart)
ReorderR = MD_newMeshDataId("Reorder Region");
pVertex vertex;
pRegion region;
int tag = 1,marked;
blockKey BLOCK;
int blockid, porder;
int Rlables[12],sum=0; //regions are stored block by block
for(int iblock=0;iblock<12;iblock++){
Rlables[iblock]=NIblock[iblock]-1;
sum += Rlables[iblock];
}
VIter vIter = M_vertexIter(mesh) ;
while(sum!=-12){
vertex = VIter_next(vIter) ; // the first vertex
while(EN_getDataInt(vertex,doftag,&marked))
vertex = VIter_next(vIter);
list<pVertex> vList;
vList.push_back(vertex);
EN_attachDataInt((pEntity)vertex,doftag,tag);
list<pVertex>::iterator list_iter = vList.begin(); //pop out the first vertex in the list
while(list_iter!=vList.end()){
vertex = *list_iter;
//label the adjcent regions if they are not already been labeled
pPList regions = V_regions(vertex); //adjacent regions;
int numRgn = PList_size(regions);
for(int iRgn=0;iRgn<numRgn;iRgn++){
region = (pRegion)PList_item(regions,iRgn);
if(!EN_getDataInt(region,doftag,&marked)){//not have been labeled
//yet
//find the block the current mesh region belongs to
EN_getDataInt(region,POLYID,&porder);
int nen;
EN_getDataInt(region,RNENID,&nen);
BLOCK.nen = nen;
BLOCK.maxpoly = porder;
BLOCK.nenbl = nen ==8?4:3;
BLOCK.lcsyst=topology(region);
blockid = Iblock[BLOCK]-1;
//attach the label to region, according to block
EN_attachDataInt(region,ReorderR,Rlables[blockid]--);
EN_attachDataInt(region,doftag,tag);
}
}
PList_delete(regions);
//looking for the adjacent vertices, add to the list if not tagged.
int numEdge = V_numEdges(vertex);
for(int iedge=0; iedge< numEdge; iedge++){ // looking for the adjacent nodes
pEdge edge = V_edge(vertex, iedge);
pVertex V0 = E_vertex(edge,0); // the first nodes of the edge
pVertex V1 = E_vertex(edge,1); // the seconde nodes of the edge
pVertex adjV = (V0==vertex?V1:V0); // take the adjacent node
if(!EN_getDataInt((pEntity)adjV, doftag,&marked)){ //not been tagged yet
vList.push_back(adjV);
EN_attachDataInt((pEntity)adjV,doftag,tag);
}
}
vList.pop_front(); // erase the first one in the list
list_iter = vList.begin();
}
sum = 0;
for(int iblock =0; iblock<12;iblock++)
sum+=Rlables[iblock];
}
VIter_reset(vIter);
while( vertex = VIter_next(vIter))
EN_deleteData((pEntity)vertex,doftag);
RIter rIter = M_regionIter(mesh);
while( region = RIter_next(rIter))
EN_deleteData((pEntity)region,doftag);
RIter_delete(rIter);
VIter_delete(vIter);
MD_deleteMeshDataId(doftag);
}