xref: /petsc/src/mat/utils/matstash.c (revision d5d45c9bad5d66633d6ef030bee5689b038db93c)
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.
7*d5d45c9bSBarry Smith    The stash is where elements of a matrix destined to be stored on other
8*d5d45c9bSBarry Smith    processors are kept until matrix assembly is done.
99417f4adSLois Curfman McInnes 
109417f4adSLois Curfman McInnes    This is a simple minded stash. Do a linear search to determine if
119417f4adSLois Curfman McInnes    in stash, if not add to end.
129417f4adSLois Curfman McInnes */
139417f4adSLois Curfman McInnes 
149417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
159417f4adSLois Curfman McInnes {
169417f4adSLois Curfman McInnes   stash->nmax  = 0;
179417f4adSLois Curfman McInnes   stash->n     = 0;
189417f4adSLois Curfman McInnes   stash->array = 0;
199417f4adSLois Curfman McInnes   stash->idx   = 0;
209417f4adSLois Curfman McInnes   stash->idy   = 0;
219417f4adSLois Curfman McInnes   return 0;
229417f4adSLois Curfman McInnes }
239417f4adSLois Curfman McInnes 
249417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
259417f4adSLois Curfman McInnes {
269417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
279417f4adSLois Curfman McInnes   stash->n     = 0;
280452661fSBarry Smith   stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) +
2978b31e54SBarry Smith                             sizeof(Scalar))); CHKPTRQ(stash->array);
3078b31e54SBarry Smith   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx);
3178b31e54SBarry Smith   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy);
329417f4adSLois Curfman McInnes   return 0;
339417f4adSLois Curfman McInnes }
349417f4adSLois Curfman McInnes 
359417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
369417f4adSLois Curfman McInnes {
379417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
380452661fSBarry Smith   if (stash->array) {PetscFree(stash->array); stash->array = 0;}
399417f4adSLois Curfman McInnes   return 0;
409417f4adSLois Curfman McInnes }
419417f4adSLois Curfman McInnes 
429417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn,
439417f4adSLois Curfman McInnes                         Scalar *values,InsertMode addv)
449417f4adSLois Curfman McInnes {
459417f4adSLois Curfman McInnes   int    i,j,N = stash->n,found,*n_idx, *n_idy;
469417f4adSLois Curfman McInnes   Scalar val,*n_array;
479417f4adSLois Curfman McInnes 
489417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
499417f4adSLois Curfman McInnes     found = 0;
509417f4adSLois Curfman McInnes     val = *values++;
519417f4adSLois Curfman McInnes     for ( j=0; j<N; j++ ) {
529417f4adSLois Curfman McInnes       if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) {
539417f4adSLois Curfman McInnes         /* found a match */
54dbb450caSBarry Smith         if (addv == ADD_VALUES) stash->array[j] += val;
559417f4adSLois Curfman McInnes         else stash->array[j] = val;
569417f4adSLois Curfman McInnes         found = 1;
579417f4adSLois Curfman McInnes         break;
589417f4adSLois Curfman McInnes       }
599417f4adSLois Curfman McInnes     }
609417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
619417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
629417f4adSLois Curfman McInnes         /* allocate a larger stash */
630452661fSBarry Smith         n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*(
64416022c9SBarry Smith                                      2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array);
659417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
669417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
67416022c9SBarry Smith         PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar));
68416022c9SBarry Smith         PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int));
69416022c9SBarry Smith         PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int));
700452661fSBarry Smith         if (stash->array) PetscFree(stash->array);
719417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
729417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
739417f4adSLois Curfman McInnes       }
749417f4adSLois Curfman McInnes       stash->array[stash->n]   = val;
759417f4adSLois Curfman McInnes       stash->idx[stash->n]     = row;
769417f4adSLois Curfman McInnes       stash->idy[stash->n++]   = idxn[i];
779417f4adSLois Curfman McInnes     }
789417f4adSLois Curfman McInnes   }
799417f4adSLois Curfman McInnes   return 0;
809417f4adSLois Curfman McInnes }
81*d5d45c9bSBarry Smith 
82*d5d45c9bSBarry Smith 
83