xref: /petsc/src/mat/utils/matstash.c (revision d4bb536f0e426e9a0292bbfd5743770a9b03f0d5)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*d4bb536fSBarry Smith static char vcid[] = "$Id: stash.c,v 1.16 1997/07/09 20:56:43 balay Exp bsmith $";
32d5177cdSBarry Smith #endif
42d5177cdSBarry Smith 
52d5177cdSBarry Smith #include "src/vec/vecimpl.h"
670f55243SBarry Smith #include "src/mat/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 
1490f02eecSBarry Smith    This is a simple minded stash. Simply add entry to end of stash.
159417f4adSLois Curfman McInnes */
169417f4adSLois Curfman McInnes 
175615d1e5SSatish Balay #undef __FUNC__
18*d4bb536fSBarry Smith #define __FUNC__ "StashInitialize_Private"
199417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
209417f4adSLois Curfman McInnes {
219417f4adSLois Curfman McInnes   stash->nmax  = 0;
229417f4adSLois Curfman McInnes   stash->n     = 0;
239417f4adSLois Curfman McInnes   stash->array = 0;
249417f4adSLois Curfman McInnes   stash->idx   = 0;
259417f4adSLois Curfman McInnes   stash->idy   = 0;
269417f4adSLois Curfman McInnes   return 0;
279417f4adSLois Curfman McInnes }
289417f4adSLois Curfman McInnes 
295615d1e5SSatish Balay #undef __FUNC__
30*d4bb536fSBarry Smith #define __FUNC__ "StashBuild_Private"
319417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
329417f4adSLois Curfman McInnes {
339417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
349417f4adSLois Curfman McInnes   stash->n     = 0;
350452661fSBarry Smith   stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) +
3678b31e54SBarry Smith                             sizeof(Scalar))); CHKPTRQ(stash->array);
3778b31e54SBarry Smith   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx);
3878b31e54SBarry Smith   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy);
399417f4adSLois Curfman McInnes   return 0;
409417f4adSLois Curfman McInnes }
419417f4adSLois Curfman McInnes 
425615d1e5SSatish Balay #undef __FUNC__
43*d4bb536fSBarry Smith #define __FUNC__ "StashDestroy_Private"
449417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
459417f4adSLois Curfman McInnes {
469417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
470452661fSBarry Smith   if (stash->array) {PetscFree(stash->array); stash->array = 0;}
489417f4adSLois Curfman McInnes   return 0;
499417f4adSLois Curfman McInnes }
509417f4adSLois Curfman McInnes 
515615d1e5SSatish Balay #undef __FUNC__
52*d4bb536fSBarry Smith #define __FUNC__ "StashInfo_Private"
5397530c3fSBarry Smith int StashInfo_Private(Stash *stash)
5497530c3fSBarry Smith {
5597530c3fSBarry Smith   PLogInfo(0,"Stash size %d\n",stash->n);
5697530c3fSBarry Smith   return 0;
5797530c3fSBarry Smith }
5897530c3fSBarry Smith 
5997530c3fSBarry Smith /*
6097530c3fSBarry Smith     Should do this properly. With a sorted array.
6197530c3fSBarry Smith */
625615d1e5SSatish Balay #undef __FUNC__
635615d1e5SSatish Balay #define __FUNC__ "StashValues_Private"
6490f02eecSBarry Smith int StashValues_Private(Stash *stash,int row,int n, int *idxn,Scalar *values,InsertMode addv)
659417f4adSLois Curfman McInnes {
6690f02eecSBarry Smith   int    i, found, *n_idx, *n_idy;
679417f4adSLois Curfman McInnes   Scalar val, *n_array;
689417f4adSLois Curfman McInnes 
699417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
709417f4adSLois Curfman McInnes     found = 0;
719417f4adSLois Curfman McInnes     val = *values++;
729417f4adSLois Curfman McInnes     if (!found) { /* not found so add to end */
739417f4adSLois Curfman McInnes       if ( stash->n == stash->nmax ) {
749417f4adSLois Curfman McInnes         /* allocate a larger stash */
750452661fSBarry Smith         n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*(
76416022c9SBarry Smith                                      2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array);
779417f4adSLois Curfman McInnes         n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE);
789417f4adSLois Curfman McInnes         n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE);
79416022c9SBarry Smith         PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar));
80416022c9SBarry Smith         PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int));
81416022c9SBarry Smith         PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int));
820452661fSBarry Smith         if (stash->array) PetscFree(stash->array);
839417f4adSLois Curfman McInnes         stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy;
849417f4adSLois Curfman McInnes         stash->nmax += CHUNCKSIZE;
859417f4adSLois Curfman McInnes       }
869417f4adSLois Curfman McInnes       stash->array[stash->n] = val;
879417f4adSLois Curfman McInnes       stash->idx[stash->n]   = row;
889417f4adSLois Curfman McInnes       stash->idy[stash->n++] = idxn[i];
899417f4adSLois Curfman McInnes     }
909417f4adSLois Curfman McInnes   }
919417f4adSLois Curfman McInnes   return 0;
929417f4adSLois Curfman McInnes }
93d5d45c9bSBarry Smith 
94d5d45c9bSBarry Smith 
9597530c3fSBarry Smith 
96