12d5177cdSBarry Smith #ifndef lint 2*90f02eecSBarry Smith static char vcid[] = "$Id: stash.c,v 1.11 1996/08/08 14:44:19 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 14*90f02eecSBarry Smith This is a simple minded stash. Simply add entry to end of stash. 159417f4adSLois Curfman McInnes */ 169417f4adSLois Curfman McInnes 179417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash) 189417f4adSLois Curfman McInnes { 199417f4adSLois Curfman McInnes stash->nmax = 0; 209417f4adSLois Curfman McInnes stash->n = 0; 219417f4adSLois Curfman McInnes stash->array = 0; 229417f4adSLois Curfman McInnes stash->idx = 0; 239417f4adSLois Curfman McInnes stash->idy = 0; 249417f4adSLois Curfman McInnes return 0; 259417f4adSLois Curfman McInnes } 269417f4adSLois Curfman McInnes 279417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash) 289417f4adSLois Curfman McInnes { 299417f4adSLois Curfman McInnes stash->nmax = CHUNCKSIZE; /* completely arbitrary number */ 309417f4adSLois Curfman McInnes stash->n = 0; 310452661fSBarry Smith stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) + 3278b31e54SBarry Smith sizeof(Scalar))); CHKPTRQ(stash->array); 3378b31e54SBarry Smith stash->idx = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx); 3478b31e54SBarry Smith stash->idy = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy); 359417f4adSLois Curfman McInnes return 0; 369417f4adSLois Curfman McInnes } 379417f4adSLois Curfman McInnes 389417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash) 399417f4adSLois Curfman McInnes { 409417f4adSLois Curfman McInnes stash->nmax = stash->n = 0; 410452661fSBarry Smith if (stash->array) {PetscFree(stash->array); stash->array = 0;} 429417f4adSLois Curfman McInnes return 0; 439417f4adSLois Curfman McInnes } 449417f4adSLois Curfman McInnes 4597530c3fSBarry Smith int StashInfo_Private(Stash *stash) 4697530c3fSBarry Smith { 4797530c3fSBarry Smith PLogInfo(0,"Stash size %d\n",stash->n); 4897530c3fSBarry Smith return 0; 4997530c3fSBarry Smith } 5097530c3fSBarry Smith 5197530c3fSBarry Smith /* 5297530c3fSBarry Smith Should do this properly. With a sorted array. 5397530c3fSBarry Smith */ 54*90f02eecSBarry Smith int StashValues_Private(Stash *stash,int row,int n, int *idxn,Scalar *values,InsertMode addv) 559417f4adSLois Curfman McInnes { 56*90f02eecSBarry Smith int i, found, *n_idx, *n_idy; 579417f4adSLois Curfman McInnes Scalar val, *n_array; 589417f4adSLois Curfman McInnes 599417f4adSLois Curfman McInnes for ( i=0; i<n; i++ ) { 609417f4adSLois Curfman McInnes found = 0; 619417f4adSLois Curfman McInnes val = *values++; 629417f4adSLois Curfman McInnes if (!found) { /* not found so add to end */ 639417f4adSLois Curfman McInnes if ( stash->n == stash->nmax ) { 649417f4adSLois Curfman McInnes /* allocate a larger stash */ 650452661fSBarry Smith n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*( 66416022c9SBarry Smith 2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array); 679417f4adSLois Curfman McInnes n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE); 689417f4adSLois Curfman McInnes n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE); 69416022c9SBarry Smith PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar)); 70416022c9SBarry Smith PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int)); 71416022c9SBarry Smith PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int)); 720452661fSBarry Smith if (stash->array) PetscFree(stash->array); 739417f4adSLois Curfman McInnes stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy; 749417f4adSLois Curfman McInnes stash->nmax += CHUNCKSIZE; 759417f4adSLois Curfman McInnes } 769417f4adSLois Curfman McInnes stash->array[stash->n] = val; 779417f4adSLois Curfman McInnes stash->idx[stash->n] = row; 789417f4adSLois Curfman McInnes stash->idy[stash->n++] = idxn[i]; 799417f4adSLois Curfman McInnes } 809417f4adSLois Curfman McInnes } 819417f4adSLois Curfman McInnes return 0; 829417f4adSLois Curfman McInnes } 83d5d45c9bSBarry Smith 84d5d45c9bSBarry Smith 8597530c3fSBarry Smith 86