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