xref: /petsc/src/mat/utils/matstash.c (revision 2d5177cd23237a9dae1ff2f970f2ff0cd97d6158)
1*2d5177cdSBarry Smith #ifndef lint
2*2d5177cdSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.84 1996/04/12 23:41:27 curfman Exp $";
3*2d5177cdSBarry Smith #endif
4*2d5177cdSBarry Smith 
5*2d5177cdSBarry Smith #include "src/vec/vecimpl.h"
69417f4adSLois Curfman McInnes #include "matimpl.h"
79417f4adSLois Curfman McInnes 
897530c3fSBarry Smith #define CHUNCKSIZE   5000
99417f4adSLois Curfman McInnes /*
109417f4adSLois Curfman McInnes    This stash is currently used for all the parallel matrix implementations.
11d5d45c9bSBarry Smith    The stash is where elements of a matrix destined to be stored on other
12d5d45c9bSBarry Smith    processors are kept until matrix assembly is done.
139417f4adSLois Curfman McInnes 
149417f4adSLois Curfman McInnes    This is a simple minded stash. Do a linear search to determine if
159417f4adSLois Curfman McInnes    in stash, if not add to end.
169417f4adSLois Curfman McInnes */
179417f4adSLois Curfman McInnes 
189417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
199417f4adSLois Curfman McInnes {
209417f4adSLois Curfman McInnes   stash->nmax  = 0;
219417f4adSLois Curfman McInnes   stash->n     = 0;
229417f4adSLois Curfman McInnes   stash->array = 0;
239417f4adSLois Curfman McInnes   stash->idx   = 0;
249417f4adSLois Curfman McInnes   stash->idy   = 0;
259417f4adSLois Curfman McInnes   return 0;
269417f4adSLois Curfman McInnes }
279417f4adSLois Curfman McInnes 
289417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
299417f4adSLois Curfman McInnes {
309417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
319417f4adSLois Curfman McInnes   stash->n     = 0;
320452661fSBarry Smith   stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) +
3378b31e54SBarry Smith                             sizeof(Scalar))); CHKPTRQ(stash->array);
3478b31e54SBarry Smith   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx);
3578b31e54SBarry Smith   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy);
369417f4adSLois Curfman McInnes   return 0;
379417f4adSLois Curfman McInnes }
389417f4adSLois Curfman McInnes 
399417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
409417f4adSLois Curfman McInnes {
419417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
420452661fSBarry Smith   if (stash->array) {PetscFree(stash->array); stash->array = 0;}
439417f4adSLois Curfman McInnes   return 0;
449417f4adSLois Curfman McInnes }
459417f4adSLois Curfman McInnes 
4697530c3fSBarry Smith int StashInfo_Private(Stash *stash)
4797530c3fSBarry Smith {
4897530c3fSBarry Smith   PLogInfo(0,"Stash size %d\n",stash->n);
4997530c3fSBarry Smith   return 0;
5097530c3fSBarry Smith }
5197530c3fSBarry Smith 
5297530c3fSBarry Smith /*
5397530c3fSBarry Smith     Should do this properly. With a sorted array.
5497530c3fSBarry Smith */
559417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn,
569417f4adSLois Curfman McInnes                         Scalar *values,InsertMode addv)
579417f4adSLois Curfman McInnes {
580dd6af04SLois Curfman McInnes   int    i, found, *n_idx, *n_idy;  /* int j, N = stash->n, */
599417f4adSLois Curfman McInnes   Scalar val, *n_array;
609417f4adSLois Curfman McInnes 
619417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
629417f4adSLois Curfman McInnes     found = 0;
639417f4adSLois Curfman McInnes     val = *values++;
6487c8f93cSLois Curfman McInnes /*
650dd6af04SLois Curfman McInnes    Removed search!  Now much faster assembly.
6687c8f93cSLois Curfman McInnes 
679417f4adSLois Curfman McInnes     for ( j=0; j<N; j++ ) {
689417f4adSLois Curfman McInnes       if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) {
6987c8f93cSLois Curfman McInnes 
70dbb450caSBarry Smith         if (addv == ADD_VALUES) stash->array[j] += val;
719417f4adSLois Curfman McInnes         else stash->array[j] = val;
729417f4adSLois Curfman McInnes         found = 1;
739417f4adSLois Curfman McInnes         break;
749417f4adSLois Curfman McInnes       }
759417f4adSLois Curfman McInnes     }
7687c8f93cSLois Curfman McInnes */
779417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
789417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
799417f4adSLois Curfman McInnes         /* allocate a larger stash */
800452661fSBarry Smith         n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*(
81416022c9SBarry Smith                                      2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array);
829417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
839417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
84416022c9SBarry Smith         PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar));
85416022c9SBarry Smith         PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int));
86416022c9SBarry Smith         PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int));
870452661fSBarry Smith         if (stash->array) PetscFree(stash->array);
889417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
899417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
909417f4adSLois Curfman McInnes       }
919417f4adSLois Curfman McInnes       stash->array[stash->n] = val;
929417f4adSLois Curfman McInnes       stash->idx[stash->n]   = row;
939417f4adSLois Curfman McInnes       stash->idy[stash->n++] = idxn[i];
949417f4adSLois Curfman McInnes     }
959417f4adSLois Curfman McInnes   }
969417f4adSLois Curfman McInnes   return 0;
979417f4adSLois Curfman McInnes }
98d5d45c9bSBarry Smith 
99d5d45c9bSBarry Smith 
10097530c3fSBarry Smith 
101