1*9417f4adSLois Curfman McInnes #include "vec/vecimpl.h" 2*9417f4adSLois Curfman McInnes #include "matimpl.h" 3*9417f4adSLois Curfman McInnes 4*9417f4adSLois Curfman McInnes #define CHUNCKSIZE 100 5*9417f4adSLois Curfman McInnes /* 6*9417f4adSLois Curfman McInnes This stash is currently used for all the parallel matrix implementations. 7*9417f4adSLois Curfman McInnes Perhaps this code ultimately should be moved elsewhere. 8*9417f4adSLois Curfman McInnes 9*9417f4adSLois Curfman McInnes This is a simple minded stash. Do a linear search to determine if 10*9417f4adSLois Curfman McInnes in stash, if not add to end. 11*9417f4adSLois Curfman McInnes */ 12*9417f4adSLois Curfman McInnes 13*9417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash) 14*9417f4adSLois Curfman McInnes { 15*9417f4adSLois Curfman McInnes stash->nmax = 0; 16*9417f4adSLois Curfman McInnes stash->n = 0; 17*9417f4adSLois Curfman McInnes stash->array = 0; 18*9417f4adSLois Curfman McInnes stash->idx = 0; 19*9417f4adSLois Curfman McInnes stash->idy = 0; 20*9417f4adSLois Curfman McInnes return 0; 21*9417f4adSLois Curfman McInnes } 22*9417f4adSLois Curfman McInnes 23*9417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash) 24*9417f4adSLois Curfman McInnes { 25*9417f4adSLois Curfman McInnes stash->nmax = CHUNCKSIZE; /* completely arbitrary number */ 26*9417f4adSLois Curfman McInnes stash->n = 0; 27*9417f4adSLois Curfman McInnes stash->array = (Scalar *) MALLOC( stash->nmax*(2*sizeof(int) + 28*9417f4adSLois Curfman McInnes sizeof(Scalar))); CHKPTR(stash->array); 29*9417f4adSLois Curfman McInnes stash->idx = (int *) (stash->array + stash->nmax); CHKPTR(stash->idx); 30*9417f4adSLois Curfman McInnes stash->idy = (int *) (stash->idx + stash->nmax); CHKPTR(stash->idy); 31*9417f4adSLois Curfman McInnes return 0; 32*9417f4adSLois Curfman McInnes } 33*9417f4adSLois Curfman McInnes 34*9417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash) 35*9417f4adSLois Curfman McInnes { 36*9417f4adSLois Curfman McInnes stash->nmax = stash->n = 0; 37*9417f4adSLois Curfman McInnes if (stash->array) {FREE(stash->array); stash->array = 0;} 38*9417f4adSLois Curfman McInnes return 0; 39*9417f4adSLois Curfman McInnes } 40*9417f4adSLois Curfman McInnes 41*9417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn, 42*9417f4adSLois Curfman McInnes Scalar *values,InsertMode addv) 43*9417f4adSLois Curfman McInnes { 44*9417f4adSLois Curfman McInnes int i,j,N = stash->n,found,*n_idx, *n_idy; 45*9417f4adSLois Curfman McInnes Scalar val,*n_array; 46*9417f4adSLois Curfman McInnes 47*9417f4adSLois Curfman McInnes for ( i=0; i<n; i++ ) { 48*9417f4adSLois Curfman McInnes found = 0; 49*9417f4adSLois Curfman McInnes val = *values++; 50*9417f4adSLois Curfman McInnes for ( j=0; j<N; j++ ) { 51*9417f4adSLois Curfman McInnes if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) { 52*9417f4adSLois Curfman McInnes /* found a match */ 53*9417f4adSLois Curfman McInnes if (addv == ADDVALUES) stash->array[j] += val; 54*9417f4adSLois Curfman McInnes else stash->array[j] = val; 55*9417f4adSLois Curfman McInnes found = 1; 56*9417f4adSLois Curfman McInnes break; 57*9417f4adSLois Curfman McInnes } 58*9417f4adSLois Curfman McInnes } 59*9417f4adSLois Curfman McInnes if (!found) { /* not found so add to end */ 60*9417f4adSLois Curfman McInnes if ( stash->n == stash->nmax ) { 61*9417f4adSLois Curfman McInnes /* allocate a larger stash */ 62*9417f4adSLois Curfman McInnes n_array = (Scalar *) MALLOC( (stash->nmax + CHUNCKSIZE)*( 63*9417f4adSLois Curfman McInnes 2*sizeof(int) + sizeof(Scalar))); 64*9417f4adSLois Curfman McInnes CHKPTR(n_array); 65*9417f4adSLois Curfman McInnes n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE); 66*9417f4adSLois Curfman McInnes n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE); 67*9417f4adSLois Curfman McInnes MEMCPY(n_array,stash->array,stash->nmax*sizeof(Scalar)); 68*9417f4adSLois Curfman McInnes MEMCPY(n_idx,stash->idx,stash->nmax*sizeof(int)); 69*9417f4adSLois Curfman McInnes MEMCPY(n_idy,stash->idy,stash->nmax*sizeof(int)); 70*9417f4adSLois Curfman McInnes if (stash->array) FREE(stash->array); 71*9417f4adSLois Curfman McInnes stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy; 72*9417f4adSLois Curfman McInnes stash->nmax += CHUNCKSIZE; 73*9417f4adSLois Curfman McInnes } 74*9417f4adSLois Curfman McInnes stash->array[stash->n] = val; 75*9417f4adSLois Curfman McInnes stash->idx[stash->n] = row; 76*9417f4adSLois Curfman McInnes stash->idy[stash->n++] = idxn[i]; 77*9417f4adSLois Curfman McInnes } 78*9417f4adSLois Curfman McInnes } 79*9417f4adSLois Curfman McInnes return 0; 80*9417f4adSLois Curfman McInnes } 81