xref: /petsc/src/mat/utils/matstash.c (revision 416022c9818a71eecdf06d41c1abd586feaab60e)
19417f4adSLois Curfman McInnes #include "vec/vecimpl.h"
29417f4adSLois Curfman McInnes #include "matimpl.h"
39417f4adSLois Curfman McInnes 
49417f4adSLois Curfman McInnes #define CHUNCKSIZE   100
59417f4adSLois Curfman McInnes /*
69417f4adSLois Curfman McInnes    This stash is currently used for all the parallel matrix implementations.
79417f4adSLois Curfman McInnes    Perhaps this code ultimately should be moved elsewhere.
89417f4adSLois Curfman McInnes 
99417f4adSLois Curfman McInnes    This is a simple minded stash. Do a linear search to determine if
109417f4adSLois Curfman McInnes    in stash, if not add to end.
119417f4adSLois Curfman McInnes */
129417f4adSLois Curfman McInnes 
139417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
149417f4adSLois Curfman McInnes {
159417f4adSLois Curfman McInnes   stash->nmax  = 0;
169417f4adSLois Curfman McInnes   stash->n     = 0;
179417f4adSLois Curfman McInnes   stash->array = 0;
189417f4adSLois Curfman McInnes   stash->idx   = 0;
199417f4adSLois Curfman McInnes   stash->idy   = 0;
209417f4adSLois Curfman McInnes   return 0;
219417f4adSLois Curfman McInnes }
229417f4adSLois Curfman McInnes 
239417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
249417f4adSLois Curfman McInnes {
259417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
269417f4adSLois Curfman McInnes   stash->n     = 0;
2778b31e54SBarry Smith   stash->array = (Scalar *) PETSCMALLOC( stash->nmax*(2*sizeof(int) +
2878b31e54SBarry Smith                             sizeof(Scalar))); CHKPTRQ(stash->array);
2978b31e54SBarry Smith   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx);
3078b31e54SBarry Smith   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy);
319417f4adSLois Curfman McInnes   return 0;
329417f4adSLois Curfman McInnes }
339417f4adSLois Curfman McInnes 
349417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
359417f4adSLois Curfman McInnes {
369417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
3778b31e54SBarry Smith   if (stash->array) {PETSCFREE(stash->array); stash->array = 0;}
389417f4adSLois Curfman McInnes   return 0;
399417f4adSLois Curfman McInnes }
409417f4adSLois Curfman McInnes 
419417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn,
429417f4adSLois Curfman McInnes                         Scalar *values,InsertMode addv)
439417f4adSLois Curfman McInnes {
449417f4adSLois Curfman McInnes   int    i,j,N = stash->n,found,*n_idx, *n_idy;
459417f4adSLois Curfman McInnes   Scalar val,*n_array;
469417f4adSLois Curfman McInnes 
479417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
489417f4adSLois Curfman McInnes     found = 0;
499417f4adSLois Curfman McInnes     val = *values++;
509417f4adSLois Curfman McInnes     for ( j=0; j<N; j++ ) {
519417f4adSLois Curfman McInnes       if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) {
529417f4adSLois Curfman McInnes         /* found a match */
53dbb450caSBarry Smith         if (addv == ADD_VALUES) stash->array[j] += val;
549417f4adSLois Curfman McInnes         else stash->array[j] = val;
559417f4adSLois Curfman McInnes         found = 1;
569417f4adSLois Curfman McInnes         break;
579417f4adSLois Curfman McInnes       }
589417f4adSLois Curfman McInnes     }
599417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
609417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
619417f4adSLois Curfman McInnes         /* allocate a larger stash */
6278b31e54SBarry Smith         n_array = (Scalar *) PETSCMALLOC( (stash->nmax + CHUNCKSIZE)*(
63*416022c9SBarry Smith                                      2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array);
649417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
659417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
66*416022c9SBarry Smith         PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar));
67*416022c9SBarry Smith         PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int));
68*416022c9SBarry Smith         PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int));
6978b31e54SBarry Smith         if (stash->array) PETSCFREE(stash->array);
709417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
719417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
729417f4adSLois Curfman McInnes       }
739417f4adSLois Curfman McInnes       stash->array[stash->n]   = val;
749417f4adSLois Curfman McInnes       stash->idx[stash->n]     = row;
759417f4adSLois Curfman McInnes       stash->idy[stash->n++]   = idxn[i];
769417f4adSLois Curfman McInnes     }
779417f4adSLois Curfman McInnes   }
789417f4adSLois Curfman McInnes   return 0;
799417f4adSLois Curfman McInnes }
80