xref: /petsc/src/mat/utils/matstash.c (revision 3a40ed3dce77c081171d005ae1a6ff4bb9d13b6f)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*3a40ed3dSBarry Smith static char vcid[] = "$Id: stash.c,v 1.17 1997/08/22 15:15:22 bsmith 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__
18d4bb536fSBarry Smith #define __FUNC__ "StashInitialize_Private"
199417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash)
209417f4adSLois Curfman McInnes {
21*3a40ed3dSBarry Smith   PetscFunctionBegin;
229417f4adSLois Curfman McInnes   stash->nmax  = 0;
239417f4adSLois Curfman McInnes   stash->n     = 0;
249417f4adSLois Curfman McInnes   stash->array = 0;
259417f4adSLois Curfman McInnes   stash->idx   = 0;
269417f4adSLois Curfman McInnes   stash->idy   = 0;
27*3a40ed3dSBarry Smith   PetscFunctionReturn(0);
289417f4adSLois Curfman McInnes }
299417f4adSLois Curfman McInnes 
305615d1e5SSatish Balay #undef __FUNC__
31d4bb536fSBarry Smith #define __FUNC__ "StashBuild_Private"
329417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash)
339417f4adSLois Curfman McInnes {
34*3a40ed3dSBarry Smith   PetscFunctionBegin;
359417f4adSLois Curfman McInnes   stash->nmax  = CHUNCKSIZE; /* completely arbitrary number */
369417f4adSLois Curfman McInnes   stash->n     = 0;
370452661fSBarry Smith   stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) +
3878b31e54SBarry Smith                             sizeof(Scalar))); CHKPTRQ(stash->array);
3978b31e54SBarry Smith   stash->idx   = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx);
4078b31e54SBarry Smith   stash->idy   = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy);
41*3a40ed3dSBarry Smith   PetscFunctionReturn(0);
429417f4adSLois Curfman McInnes }
439417f4adSLois Curfman McInnes 
445615d1e5SSatish Balay #undef __FUNC__
45d4bb536fSBarry Smith #define __FUNC__ "StashDestroy_Private"
469417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash)
479417f4adSLois Curfman McInnes {
48*3a40ed3dSBarry Smith   PetscFunctionBegin;
499417f4adSLois Curfman McInnes   stash->nmax = stash->n = 0;
500452661fSBarry Smith   if (stash->array) {PetscFree(stash->array); stash->array = 0;}
51*3a40ed3dSBarry Smith   PetscFunctionReturn(0);
529417f4adSLois Curfman McInnes }
539417f4adSLois Curfman McInnes 
545615d1e5SSatish Balay #undef __FUNC__
55d4bb536fSBarry Smith #define __FUNC__ "StashInfo_Private"
5697530c3fSBarry Smith int StashInfo_Private(Stash *stash)
5797530c3fSBarry Smith {
58*3a40ed3dSBarry Smith   PetscFunctionBegin;
5997530c3fSBarry Smith   PLogInfo(0,"Stash size %d\n",stash->n);
60*3a40ed3dSBarry Smith   PetscFunctionReturn(0);
6197530c3fSBarry Smith }
6297530c3fSBarry Smith 
6397530c3fSBarry Smith /*
6497530c3fSBarry Smith     Should do this properly. With a sorted array.
6597530c3fSBarry Smith */
665615d1e5SSatish Balay #undef __FUNC__
675615d1e5SSatish Balay #define __FUNC__ "StashValues_Private"
6890f02eecSBarry Smith int StashValues_Private(Stash *stash,int row,int n, int *idxn,Scalar *values,InsertMode addv)
699417f4adSLois Curfman McInnes {
7090f02eecSBarry Smith   int    i, found, *n_idx, *n_idy;
719417f4adSLois Curfman McInnes   Scalar val, *n_array;
729417f4adSLois Curfman McInnes 
73*3a40ed3dSBarry Smith   PetscFunctionBegin;
749417f4adSLois Curfman McInnes   for ( i=0; i<n; i++ ) {
759417f4adSLois Curfman McInnes     found = 0;
769417f4adSLois Curfman McInnes     val = *values++;
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   }
96*3a40ed3dSBarry Smith   PetscFunctionReturn(0);
979417f4adSLois Curfman McInnes }
98d5d45c9bSBarry Smith 
99d5d45c9bSBarry Smith 
10097530c3fSBarry Smith 
101