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