xref: /petsc/src/mat/utils/matstash.c (revision 87c8f93ccab8331bb93921c2266b0f016797de2e)
19417f4adSLois Curfman McInnes #include "vec/vecimpl.h"
29417f4adSLois Curfman McInnes #include "matimpl.h"
39417f4adSLois Curfman McInnes 
497530c3fSBarry Smith #define CHUNCKSIZE   5000
59417f4adSLois Curfman McInnes /*
69417f4adSLois Curfman McInnes    This stash is currently used for all the parallel matrix implementations.
7d5d45c9bSBarry Smith    The stash is where elements of a matrix destined to be stored on other
8d5d45c9bSBarry 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 
4297530c3fSBarry Smith int StashInfo_Private(Stash *stash)
4397530c3fSBarry Smith {
4497530c3fSBarry Smith   PLogInfo(0,"Stash size %d\n",stash->n);
4597530c3fSBarry Smith   return 0;
4697530c3fSBarry Smith }
4797530c3fSBarry Smith 
4897530c3fSBarry Smith /*
4997530c3fSBarry Smith     Should do this properly. With a sorted array.
5097530c3fSBarry Smith */
519417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn,
529417f4adSLois Curfman McInnes                         Scalar *values,InsertMode addv)
539417f4adSLois Curfman McInnes {
54*87c8f93cSLois Curfman McInnes   int    i,/* j,N = stash->n, */found,*n_idx, *n_idy;
559417f4adSLois Curfman McInnes   Scalar val,*n_array;
569417f4adSLois Curfman McInnes 
579417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
589417f4adSLois Curfman McInnes     found = 0;
599417f4adSLois Curfman McInnes     val = *values++;
60*87c8f93cSLois Curfman McInnes /*
61*87c8f93cSLois Curfman McInnes    Removed search!
62*87c8f93cSLois Curfman McInnes 
639417f4adSLois Curfman McInnes     for ( j=0; j<N; j++ ) {
649417f4adSLois Curfman McInnes       if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) {
65*87c8f93cSLois Curfman McInnes 
66dbb450caSBarry Smith         if (addv == ADD_VALUES) stash->array[j] += val;
679417f4adSLois Curfman McInnes         else stash->array[j] = val;
689417f4adSLois Curfman McInnes         found = 1;
699417f4adSLois Curfman McInnes         break;
709417f4adSLois Curfman McInnes       }
719417f4adSLois Curfman McInnes     }
72*87c8f93cSLois Curfman McInnes */
739417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
749417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
759417f4adSLois Curfman McInnes         /* allocate a larger stash */
760452661fSBarry Smith         n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*(
77416022c9SBarry Smith                                      2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array);
789417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
799417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
80416022c9SBarry Smith         PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar));
81416022c9SBarry Smith         PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int));
82416022c9SBarry Smith         PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int));
830452661fSBarry Smith         if (stash->array) PetscFree(stash->array);
849417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
859417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
869417f4adSLois Curfman McInnes       }
879417f4adSLois Curfman McInnes       stash->array[stash->n]   = val;
889417f4adSLois Curfman McInnes       stash->idx[stash->n]     = row;
899417f4adSLois Curfman McInnes       stash->idy[stash->n++]   = idxn[i];
909417f4adSLois Curfman McInnes     }
919417f4adSLois Curfman McInnes   }
929417f4adSLois Curfman McInnes   return 0;
939417f4adSLois Curfman McInnes }
94d5d45c9bSBarry Smith 
95d5d45c9bSBarry Smith 
9697530c3fSBarry Smith 
97