Fast Auxiliary Space Preconditioning 2.7.7 Aug/28/2022
Loading...
Searching...
No Matches
BlaOrderingCSR.c
Go to the documentation of this file.
1
13#include "fasp.h"
14
15/*---------------------------------*/
16/*-- Declare Private Functions --*/
17/*---------------------------------*/
18
19static void CMK_ordering (const dCSRmat *, INT, INT, INT, INT, INT *, INT *);
20
21/*---------------------------------*/
22/*-- Public Functions --*/
23/*---------------------------------*/
24
38 INT *order,
39 INT *oindex)
40{
41 const INT *ia = A->IA;
42 const INT row = A->row;
43
44 INT i, loc, s, vt, mindg, innz;
45
46 s = 0;
47 vt = 0;
48 mindg = row+1;
49
50 // select node with minimal degree
51 for (i=0; i<row; ++i) {
52 innz = ia[i+1] - ia[i];
53 if (innz > 1) {
54 oindex[i] = -innz;
55 if (innz < mindg) {
56 mindg = innz;
57 vt = i;
58 }
59 }
60 else { // order those diagonal rows first
61 oindex[i] = s;
62 order[s] = i;
63 s ++;
64 }
65 }
66
67 loc = s;
68
69 // start to order
70 CMK_ordering (A, loc, s, vt, mindg, oindex, order);
71}
72
88 INT *order,
89 INT *oindex,
90 INT *rorder)
91{
92 INT i;
93 INT row = A->row;
94
95 // Form CMK order
96 fasp_dcsr_CMK_order(A, order, oindex);
97
98 // Reverse CMK order
99 for (i=0; i<row; ++i) rorder[i] = order[row-1-i];
100}
101
102/*---------------------------------*/
103/*-- Private Functions --*/
104/*---------------------------------*/
105
123static void CMK_ordering (const dCSRmat *A,
124 INT loc,
125 INT s,
126 INT jj,
127 INT mindg,
128 INT *oindex,
129 INT *order)
130{
131 const INT row = A->row;
132 const INT *ia = A->IA;
133 const INT *ja = A->JA;
134
135 INT i, j, sp1, k;
136 SHORT flag = 1;
137
138 if (s < row) {
139 order[s] = jj;
140 oindex[jj] = s;
141 }
142
143 while (loc <= s && s < row) {
144 i = order[loc];
145 sp1 = s+1;
146 // neighbor nodes are priority.
147 for (j=ia[i]+1; j<ia[i+1]; ++j) {
148 k = ja[j];
149 if (oindex[k] < 0){
150 s++;
151 order[s] = k;
152 }
153 }
154 // ordering neighbor nodes by increasing degree
155 if (s > sp1) {
156 while (flag) {
157 flag = 0;
158 for (i=sp1+1; i<=s; ++i) {
159 if (oindex[order[i]] > oindex[order[i-1]]) {
160 j = order[i];
161 order[i] = order[i-1];
162 order[i-1] = j;
163 flag = 1;
164 }
165 }
166 }
167 }
168
169 for (i=sp1; i<=s; ++i) oindex[order[i]] = i;
170
171 loc ++;
172 }
173
174 // deal with remainder
175 if (s < row) {
176 jj = 0;
177 i = 0;
178 while (jj == 0) {
179 i ++;
180 if (i >= row) {
181 mindg++;
182 i = 0;
183 }
184 if (oindex[i] < 0 && (ia[i+1]-ia[i] == mindg)) {
185 jj = i;
186 }
187 }
188
189 s ++;
190
191 CMK_ordering (A, loc, s, jj, mindg, oindex, order);
192 }
193}
194
195/*---------------------------------*/
196/*-- End of File --*/
197/*---------------------------------*/
void fasp_dcsr_RCMK_order(const dCSRmat *A, INT *order, INT *oindex, INT *rorder)
Resverse CMK ordering.
void fasp_dcsr_CMK_order(const dCSRmat *A, INT *order, INT *oindex)
Ordering vertices of matrix graph corresponding to A.
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
Definition: fasp.h:71
#define INT
Definition: fasp.h:72
Sparse matrix of REAL type in CSR format.
Definition: fasp.h:151
INT row
row number of matrix A, m
Definition: fasp.h:154
INT * IA
integer array of row pointers, the size is m+1
Definition: fasp.h:163
INT * JA
integer array of column indexes, the size is nnz
Definition: fasp.h:166