1 /* setup.c */
2
3 #include "../SolveMap.h"
4
5 /*--------------------------------------------------------------------*/
6 /*
7 -----------------------------------------------------------
8 purpose -- to set up the linked lists for the forward solve
9 local to process myid
10
11 created -- 98mar19, cca
12 -----------------------------------------------------------
13 */
14 IP **
SolveMap_forwardSetup(SolveMap * solvemap,int myid,int msglvl,FILE * msgFile)15 SolveMap_forwardSetup (
16 SolveMap *solvemap,
17 int myid,
18 int msglvl,
19 FILE *msgFile
20 ) {
21 int count, J, K, loc, nblock, nfront ;
22 int *colids, *map, *rowids ;
23 IP *ip, *nextip ;
24 IP **heads ;
25 /*
26 ---------------
27 check the input
28 ---------------
29 */
30 if ( solvemap == NULL ) {
31 fprintf(stderr, "\n fatal error in SolveMap_forwardSetup(%p,%d)"
32 "\n solvemap is NULL\n") ;
33 exit(-1) ;
34 }
35 if ( myid < 0 || myid >= solvemap->nproc ) {
36 fprintf(stderr, "\n fatal error in SolveMap_forwardSetup(%p,%d)"
37 "\n myid %d, solvemap->nproc %d\n", myid, solvemap->nproc) ;
38 exit(-1) ;
39 }
40 if ( solvemap == NULL || myid < 0 || myid >= solvemap->nproc ) {
41 fprintf(stderr, "\n fatal error in SolveMap_forwardSetup(%p,%d)"
42 "\n bad input\n", solvemap, myid) ;
43 exit(-1) ;
44 }
45 nfront = solvemap->nfront ;
46 if ( solvemap->symmetryflag == 2 ) {
47 nblock = solvemap->nblockLower ;
48 map = solvemap->mapLower ;
49 rowids = solvemap->rowidsLower ;
50 colids = solvemap->colidsLower ;
51 } else {
52 nblock = solvemap->nblockUpper ;
53 map = solvemap->mapUpper ;
54 rowids = solvemap->colidsUpper ;
55 colids = solvemap->rowidsUpper ;
56 }
57 if ( msglvl > 2 ) {
58 fprintf(msgFile, "\n\n inside SolveMap_forwardSetup()") ;
59 fprintf(msgFile, ", %d blocks", nblock) ;
60 fprintf(msgFile, "\n map") ;
61 IVfprintf(msgFile, nblock, map) ;
62 fprintf(msgFile, "\n rowids") ;
63 IVfprintf(msgFile, nblock, rowids) ;
64 fprintf(msgFile, "\n colids") ;
65 IVfprintf(msgFile, nblock, colids) ;
66 fflush(msgFile) ;
67 }
68 /*
69 ----------------------------------------
70 count the number of necessary IP objects
71 ----------------------------------------
72 */
73 for ( loc = count = 0 ; loc < nblock ; loc++ ) {
74 if ( map[loc] == myid ) {
75 count++ ;
76 }
77 }
78 if ( msglvl > 2 ) {
79 fprintf(msgFile, "\n\n count = %d", count) ;
80 fflush(msgFile) ;
81 }
82 /*
83 ----------------------------------------------
84 allocate the IP objects and vector of pointers
85 ----------------------------------------------
86 */
87 ALLOCATE(heads, struct _IP *, nfront + 2) ;
88 for ( J = 0 ; J < nfront ; J++ ) {
89 heads[J] = NULL ;
90 }
91 heads[nfront] = NULL ;
92 if ( count > 0 ) {
93 heads[nfront+1] = IP_init(count, IP_FORWARD) ;
94 } else {
95 heads[nfront+1] = NULL ;
96 }
97 if ( count > 0 ) {
98 /*
99 ----------------
100 set up the lists
101 ----------------
102 */
103 for ( loc = 0, nextip = heads[nfront + 1] ; loc < nblock ; loc++ ) {
104 if ( msglvl > 2 ) {
105 fprintf(msgFile, "\n map[%d] = %d", loc, map[loc]) ;
106 fflush(msgFile) ;
107 }
108 if ( map[loc] == myid ) {
109 ip = nextip ;
110 nextip = ip->next ;
111 J = colids[loc] ;
112 K = rowids[loc] ;
113 ip->val = J ;
114 ip->next = heads[K] ;
115 heads[K] = ip ;
116 if ( msglvl > 2 ) {
117 fprintf(msgFile, ", linking (K,J) = (%d,%d)"
118 ", heads[%d] = %p", K, J, K, heads[K]) ;
119 fflush(msgFile) ;
120 }
121 }
122 }
123 }
124 return(heads) ; }
125
126 /*--------------------------------------------------------------------*/
127 /*
128 ------------------------------------------------------------
129 purpose -- to set up the linked lists for the backward solve
130 local to process myid
131
132 created -- 98mar19, cca
133 ------------------------------------------------------------
134 */
135 IP **
SolveMap_backwardSetup(SolveMap * solvemap,int myid,int msglvl,FILE * msgFile)136 SolveMap_backwardSetup (
137 SolveMap *solvemap,
138 int myid,
139 int msglvl,
140 FILE *msgFile
141 ) {
142 int count, J, K, loc, nblock, nfront ;
143 int *colids, *map, *rowids ;
144 IP *ip, *nextip ;
145 IP **heads ;
146 /*
147 ---------------
148 check the input
149 ---------------
150 */
151 if ( solvemap == NULL || myid < 0 || myid >= solvemap->nproc ) {
152 fprintf(stderr, "\n fatal error in SolveMap_backwardSetup(%p,%d)"
153 "\n bad input\n", solvemap, myid) ;
154 exit(-1) ;
155 }
156 nfront = solvemap->nfront ;
157 nblock = solvemap->nblockUpper ;
158 map = solvemap->mapUpper ;
159 rowids = solvemap->rowidsUpper ;
160 colids = solvemap->colidsUpper ;
161 if ( msglvl > 2 ) {
162 fprintf(msgFile,
163 "\n nfront %d, nblock %d, map %p, rowids %p, colids %p",
164 nfront, nblock, map, rowids, colids) ;
165 fprintf(msgFile, "\n\n inside SolveMap_backwardSetup()") ;
166 fprintf(msgFile, ", %d blocks", nblock) ;
167 fflush(msgFile) ;
168 fprintf(msgFile, "\n map = %p", map) ;
169 fflush(msgFile) ;
170 IVfprintf(msgFile, nblock, map) ;
171 fflush(msgFile) ;
172 fprintf(msgFile, "\n rowids = %p", rowids) ;
173 fflush(msgFile) ;
174 IVfprintf(msgFile, nblock, rowids) ;
175 fflush(msgFile) ;
176 fprintf(msgFile, "\n colids = %p", colids) ;
177 fflush(msgFile) ;
178 IVfprintf(msgFile, nblock, colids) ;
179 fflush(msgFile) ;
180 }
181 /*
182 ----------------------------------------
183 count the number of necessary IP objects
184 ----------------------------------------
185 */
186 for ( loc = count = 0 ; loc < nblock ; loc++ ) {
187 if ( map[loc] == myid ) {
188 count++ ;
189 }
190 }
191 if ( msglvl > 2 ) {
192 fprintf(msgFile, "\n\n count = %d", count) ;
193 fflush(msgFile) ;
194 }
195 /*
196 ----------------------------------------------
197 allocate the IP objects and vector of pointers
198 ----------------------------------------------
199 */
200 ALLOCATE(heads, struct _IP *, nfront + 2) ;
201 for ( J = 0 ; J < nfront ; J++ ) {
202 heads[J] = NULL ;
203 }
204 heads[nfront] = NULL ;
205 if ( count > 0 ) {
206 heads[nfront+1] = IP_init(count, IP_FORWARD) ;
207 } else {
208 heads[nfront+1] = NULL ;
209 }
210 if ( count > 0 ) {
211 /*
212 ----------------
213 set up the lists
214 ----------------
215 */
216 for ( loc = 0, nextip = heads[nfront + 1] ; loc < nblock ; loc++ ) {
217 if ( msglvl > 2 ) {
218 fprintf(msgFile, "\n map[%d] = %d", loc, map[loc]) ;
219 fflush(msgFile) ;
220 }
221 if ( map[loc] == myid ) {
222 ip = nextip ;
223 nextip = ip->next ;
224 J = rowids[loc] ;
225 K = colids[loc] ;
226 ip->val = K ;
227 ip->next = heads[J] ;
228 heads[J] = ip ;
229 if ( msglvl > 2 ) {
230 fprintf(msgFile, ", linking (J,K) = (%d,%d)"
231 ", heads[%d] = %p", J, K, K, heads[J]) ;
232 fflush(msgFile) ;
233 }
234 }
235 }
236 }
237 return(heads) ; }
238
239 /*--------------------------------------------------------------------*/
240