19417f4adSLois Curfman McInnes #include "vec/vecimpl.h" 29417f4adSLois Curfman McInnes #include "matimpl.h" 39417f4adSLois Curfman McInnes 49417f4adSLois Curfman McInnes #define CHUNCKSIZE 100 59417f4adSLois Curfman McInnes /* 69417f4adSLois Curfman McInnes This stash is currently used for all the parallel matrix implementations. 79417f4adSLois Curfman McInnes Perhaps this code ultimately should be moved elsewhere. 89417f4adSLois Curfman McInnes 99417f4adSLois Curfman McInnes This is a simple minded stash. Do a linear search to determine if 109417f4adSLois Curfman McInnes in stash, if not add to end. 119417f4adSLois Curfman McInnes */ 129417f4adSLois Curfman McInnes 139417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash) 149417f4adSLois Curfman McInnes { 159417f4adSLois Curfman McInnes stash->nmax = 0; 169417f4adSLois Curfman McInnes stash->n = 0; 179417f4adSLois Curfman McInnes stash->array = 0; 189417f4adSLois Curfman McInnes stash->idx = 0; 199417f4adSLois Curfman McInnes stash->idy = 0; 209417f4adSLois Curfman McInnes return 0; 219417f4adSLois Curfman McInnes } 229417f4adSLois Curfman McInnes 239417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash) 249417f4adSLois Curfman McInnes { 259417f4adSLois Curfman McInnes stash->nmax = CHUNCKSIZE; /* completely arbitrary number */ 269417f4adSLois Curfman McInnes stash->n = 0; 2778b31e54SBarry Smith stash->array = (Scalar *) PETSCMALLOC( stash->nmax*(2*sizeof(int) + 2878b31e54SBarry Smith sizeof(Scalar))); CHKPTRQ(stash->array); 2978b31e54SBarry Smith stash->idx = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx); 3078b31e54SBarry Smith stash->idy = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy); 319417f4adSLois Curfman McInnes return 0; 329417f4adSLois Curfman McInnes } 339417f4adSLois Curfman McInnes 349417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash) 359417f4adSLois Curfman McInnes { 369417f4adSLois Curfman McInnes stash->nmax = stash->n = 0; 3778b31e54SBarry Smith if (stash->array) {PETSCFREE(stash->array); stash->array = 0;} 389417f4adSLois Curfman McInnes return 0; 399417f4adSLois Curfman McInnes } 409417f4adSLois Curfman McInnes 419417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn, 429417f4adSLois Curfman McInnes Scalar *values,InsertMode addv) 439417f4adSLois Curfman McInnes { 449417f4adSLois Curfman McInnes int i,j,N = stash->n,found,*n_idx, *n_idy; 459417f4adSLois Curfman McInnes Scalar val,*n_array; 469417f4adSLois Curfman McInnes 479417f4adSLois Curfman McInnes for ( i=0; i<n; i++ ) { 489417f4adSLois Curfman McInnes found = 0; 499417f4adSLois Curfman McInnes val = *values++; 509417f4adSLois Curfman McInnes for ( j=0; j<N; j++ ) { 519417f4adSLois Curfman McInnes if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) { 529417f4adSLois Curfman McInnes /* found a match */ 53dbb450caSBarry Smith if (addv == ADD_VALUES) stash->array[j] += val; 549417f4adSLois Curfman McInnes else stash->array[j] = val; 559417f4adSLois Curfman McInnes found = 1; 569417f4adSLois Curfman McInnes break; 579417f4adSLois Curfman McInnes } 589417f4adSLois Curfman McInnes } 599417f4adSLois Curfman McInnes if (!found) { /* not found so add to end */ 609417f4adSLois Curfman McInnes if ( stash->n == stash->nmax ) { 619417f4adSLois Curfman McInnes /* allocate a larger stash */ 6278b31e54SBarry Smith n_array = (Scalar *) PETSCMALLOC( (stash->nmax + CHUNCKSIZE)*( 63*416022c9SBarry Smith 2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array); 649417f4adSLois Curfman McInnes n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE); 659417f4adSLois Curfman McInnes n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE); 66*416022c9SBarry Smith PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar)); 67*416022c9SBarry Smith PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int)); 68*416022c9SBarry Smith PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int)); 6978b31e54SBarry Smith if (stash->array) PETSCFREE(stash->array); 709417f4adSLois Curfman McInnes stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy; 719417f4adSLois Curfman McInnes stash->nmax += CHUNCKSIZE; 729417f4adSLois Curfman McInnes } 739417f4adSLois Curfman McInnes stash->array[stash->n] = val; 749417f4adSLois Curfman McInnes stash->idx[stash->n] = row; 759417f4adSLois Curfman McInnes stash->idy[stash->n++] = idxn[i]; 769417f4adSLois Curfman McInnes } 779417f4adSLois Curfman McInnes } 789417f4adSLois Curfman McInnes return 0; 799417f4adSLois Curfman McInnes } 80