19417f4adSLois Curfman McInnes #include "vec/vecimpl.h" 29417f4adSLois Curfman McInnes #include "matimpl.h" 39417f4adSLois Curfman McInnes 497530c3fSBarry Smith #define CHUNCKSIZE 5000 59417f4adSLois Curfman McInnes /* 69417f4adSLois Curfman McInnes This stash is currently used for all the parallel matrix implementations. 7d5d45c9bSBarry Smith The stash is where elements of a matrix destined to be stored on other 8d5d45c9bSBarry Smith processors are kept until matrix assembly is done. 99417f4adSLois Curfman McInnes 109417f4adSLois Curfman McInnes This is a simple minded stash. Do a linear search to determine if 119417f4adSLois Curfman McInnes in stash, if not add to end. 129417f4adSLois Curfman McInnes */ 139417f4adSLois Curfman McInnes 149417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash) 159417f4adSLois Curfman McInnes { 169417f4adSLois Curfman McInnes stash->nmax = 0; 179417f4adSLois Curfman McInnes stash->n = 0; 189417f4adSLois Curfman McInnes stash->array = 0; 199417f4adSLois Curfman McInnes stash->idx = 0; 209417f4adSLois Curfman McInnes stash->idy = 0; 219417f4adSLois Curfman McInnes return 0; 229417f4adSLois Curfman McInnes } 239417f4adSLois Curfman McInnes 249417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash) 259417f4adSLois Curfman McInnes { 269417f4adSLois Curfman McInnes stash->nmax = CHUNCKSIZE; /* completely arbitrary number */ 279417f4adSLois Curfman McInnes stash->n = 0; 280452661fSBarry Smith stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) + 2978b31e54SBarry Smith sizeof(Scalar))); CHKPTRQ(stash->array); 3078b31e54SBarry Smith stash->idx = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx); 3178b31e54SBarry Smith stash->idy = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy); 329417f4adSLois Curfman McInnes return 0; 339417f4adSLois Curfman McInnes } 349417f4adSLois Curfman McInnes 359417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash) 369417f4adSLois Curfman McInnes { 379417f4adSLois Curfman McInnes stash->nmax = stash->n = 0; 380452661fSBarry Smith if (stash->array) {PetscFree(stash->array); stash->array = 0;} 399417f4adSLois Curfman McInnes return 0; 409417f4adSLois Curfman McInnes } 419417f4adSLois Curfman McInnes 4297530c3fSBarry Smith int StashInfo_Private(Stash *stash) 4397530c3fSBarry Smith { 4497530c3fSBarry Smith PLogInfo(0,"Stash size %d\n",stash->n); 4597530c3fSBarry Smith return 0; 4697530c3fSBarry Smith } 4797530c3fSBarry Smith 4897530c3fSBarry Smith /* 4997530c3fSBarry Smith Should do this properly. With a sorted array. 5097530c3fSBarry Smith */ 519417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn, 529417f4adSLois Curfman McInnes Scalar *values,InsertMode addv) 539417f4adSLois Curfman McInnes { 54*87c8f93cSLois Curfman McInnes int i,/* j,N = stash->n, */found,*n_idx, *n_idy; 559417f4adSLois Curfman McInnes Scalar val,*n_array; 569417f4adSLois Curfman McInnes 579417f4adSLois Curfman McInnes for ( i=0; i<n; i++ ) { 589417f4adSLois Curfman McInnes found = 0; 599417f4adSLois Curfman McInnes val = *values++; 60*87c8f93cSLois Curfman McInnes /* 61*87c8f93cSLois Curfman McInnes Removed search! 62*87c8f93cSLois Curfman McInnes 639417f4adSLois Curfman McInnes for ( j=0; j<N; j++ ) { 649417f4adSLois Curfman McInnes if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) { 65*87c8f93cSLois Curfman McInnes 66dbb450caSBarry Smith if (addv == ADD_VALUES) stash->array[j] += val; 679417f4adSLois Curfman McInnes else stash->array[j] = val; 689417f4adSLois Curfman McInnes found = 1; 699417f4adSLois Curfman McInnes break; 709417f4adSLois Curfman McInnes } 719417f4adSLois Curfman McInnes } 72*87c8f93cSLois Curfman McInnes */ 739417f4adSLois Curfman McInnes if (!found) { /* not found so add to end */ 749417f4adSLois Curfman McInnes if ( stash->n == stash->nmax ) { 759417f4adSLois Curfman McInnes /* allocate a larger stash */ 760452661fSBarry Smith n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*( 77416022c9SBarry Smith 2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array); 789417f4adSLois Curfman McInnes n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE); 799417f4adSLois Curfman McInnes n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE); 80416022c9SBarry Smith PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar)); 81416022c9SBarry Smith PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int)); 82416022c9SBarry Smith PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int)); 830452661fSBarry Smith if (stash->array) PetscFree(stash->array); 849417f4adSLois Curfman McInnes stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy; 859417f4adSLois Curfman McInnes stash->nmax += CHUNCKSIZE; 869417f4adSLois Curfman McInnes } 879417f4adSLois Curfman McInnes stash->array[stash->n] = val; 889417f4adSLois Curfman McInnes stash->idx[stash->n] = row; 899417f4adSLois Curfman McInnes stash->idy[stash->n++] = idxn[i]; 909417f4adSLois Curfman McInnes } 919417f4adSLois Curfman McInnes } 929417f4adSLois Curfman McInnes return 0; 939417f4adSLois Curfman McInnes } 94d5d45c9bSBarry Smith 95d5d45c9bSBarry Smith 9697530c3fSBarry Smith 97