xref: /petsc/src/mat/utils/matstash.c (revision 9417f4ad6b350653ba5e6cb1a69c3580011008f1)
1*9417f4adSLois Curfman McInnes #include "vec/vecimpl.h"
2*9417f4adSLois Curfman McInnes #include "matimpl.h"
3*9417f4adSLois Curfman McInnes 
4*9417f4adSLois Curfman McInnes #define CHUNCKSIZE   100
5*9417f4adSLois Curfman McInnes /*
6*9417f4adSLois Curfman McInnes    This stash is currently used for all the parallel matrix implementations.
7*9417f4adSLois Curfman McInnes    Perhaps this code ultimately should be moved elsewhere.
8*9417f4adSLois Curfman McInnes 
9*9417f4adSLois Curfman McInnes    This is a simple minded stash. Do a linear search to determine if
10*9417f4adSLois Curfman McInnes    in stash, if not add to end.
11*9417f4adSLois Curfman McInnes */
12*9417f4adSLois Curfman McInnes 
13*9417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
14*9417f4adSLois Curfman McInnes {
15*9417f4adSLois Curfman McInnes   stash->nmax  = 0;
16*9417f4adSLois Curfman McInnes   stash->n     = 0;
17*9417f4adSLois Curfman McInnes   stash->array = 0;
18*9417f4adSLois Curfman McInnes   stash->idx   = 0;
19*9417f4adSLois Curfman McInnes   stash->idy   = 0;
20*9417f4adSLois Curfman McInnes   return 0;
21*9417f4adSLois Curfman McInnes }
22*9417f4adSLois Curfman McInnes 
23*9417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
24*9417f4adSLois Curfman McInnes {
25*9417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
26*9417f4adSLois Curfman McInnes   stash->n     = 0;
27*9417f4adSLois Curfman McInnes   stash->array = (Scalar *) MALLOC( stash->nmax*(2*sizeof(int) +
28*9417f4adSLois Curfman McInnes                             sizeof(Scalar))); CHKPTR(stash->array);
29*9417f4adSLois Curfman McInnes   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTR(stash->idx);
30*9417f4adSLois Curfman McInnes   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTR(stash->idy);
31*9417f4adSLois Curfman McInnes   return 0;
32*9417f4adSLois Curfman McInnes }
33*9417f4adSLois Curfman McInnes 
34*9417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
35*9417f4adSLois Curfman McInnes {
36*9417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
37*9417f4adSLois Curfman McInnes   if (stash->array) {FREE(stash->array); stash->array = 0;}
38*9417f4adSLois Curfman McInnes   return 0;
39*9417f4adSLois Curfman McInnes }
40*9417f4adSLois Curfman McInnes 
41*9417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn,
42*9417f4adSLois Curfman McInnes                         Scalar *values,InsertMode addv)
43*9417f4adSLois Curfman McInnes {
44*9417f4adSLois Curfman McInnes   int    i,j,N = stash->n,found,*n_idx, *n_idy;
45*9417f4adSLois Curfman McInnes   Scalar val,*n_array;
46*9417f4adSLois Curfman McInnes 
47*9417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
48*9417f4adSLois Curfman McInnes     found = 0;
49*9417f4adSLois Curfman McInnes     val = *values++;
50*9417f4adSLois Curfman McInnes     for ( j=0; j<N; j++ ) {
51*9417f4adSLois Curfman McInnes       if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) {
52*9417f4adSLois Curfman McInnes         /* found a match */
53*9417f4adSLois Curfman McInnes         if (addv == ADDVALUES) stash->array[j] += val;
54*9417f4adSLois Curfman McInnes         else stash->array[j] = val;
55*9417f4adSLois Curfman McInnes         found = 1;
56*9417f4adSLois Curfman McInnes         break;
57*9417f4adSLois Curfman McInnes       }
58*9417f4adSLois Curfman McInnes     }
59*9417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
60*9417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
61*9417f4adSLois Curfman McInnes         /* allocate a larger stash */
62*9417f4adSLois Curfman McInnes         n_array = (Scalar *) MALLOC( (stash->nmax + CHUNCKSIZE)*(
63*9417f4adSLois Curfman McInnes                                      2*sizeof(int) + sizeof(Scalar)));
64*9417f4adSLois Curfman McInnes         CHKPTR(n_array);
65*9417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
66*9417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
67*9417f4adSLois Curfman McInnes         MEMCPY(n_array,stash->array,stash->nmax*sizeof(Scalar));
68*9417f4adSLois Curfman McInnes         MEMCPY(n_idx,stash->idx,stash->nmax*sizeof(int));
69*9417f4adSLois Curfman McInnes         MEMCPY(n_idy,stash->idy,stash->nmax*sizeof(int));
70*9417f4adSLois Curfman McInnes         if (stash->array) FREE(stash->array);
71*9417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
72*9417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
73*9417f4adSLois Curfman McInnes       }
74*9417f4adSLois Curfman McInnes       stash->array[stash->n]   = val;
75*9417f4adSLois Curfman McInnes       stash->idx[stash->n]     = row;
76*9417f4adSLois Curfman McInnes       stash->idy[stash->n++]   = idxn[i];
77*9417f4adSLois Curfman McInnes     }
78*9417f4adSLois Curfman McInnes   }
79*9417f4adSLois Curfman McInnes   return 0;
80*9417f4adSLois Curfman McInnes }
81