1*2d5177cdSBarry Smith #ifndef lint 2*2d5177cdSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.84 1996/04/12 23:41:27 curfman Exp $"; 3*2d5177cdSBarry Smith #endif 4*2d5177cdSBarry Smith 5*2d5177cdSBarry Smith #include "src/vec/vecimpl.h" 69417f4adSLois Curfman McInnes #include "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 149417f4adSLois Curfman McInnes This is a simple minded stash. Do a linear search to determine if 159417f4adSLois Curfman McInnes in stash, if not add to end. 169417f4adSLois Curfman McInnes */ 179417f4adSLois Curfman McInnes 189417f4adSLois Curfman McInnes int StashInitialize_Private(Stash *stash) 199417f4adSLois Curfman McInnes { 209417f4adSLois Curfman McInnes stash->nmax = 0; 219417f4adSLois Curfman McInnes stash->n = 0; 229417f4adSLois Curfman McInnes stash->array = 0; 239417f4adSLois Curfman McInnes stash->idx = 0; 249417f4adSLois Curfman McInnes stash->idy = 0; 259417f4adSLois Curfman McInnes return 0; 269417f4adSLois Curfman McInnes } 279417f4adSLois Curfman McInnes 289417f4adSLois Curfman McInnes int StashBuild_Private(Stash *stash) 299417f4adSLois Curfman McInnes { 309417f4adSLois Curfman McInnes stash->nmax = CHUNCKSIZE; /* completely arbitrary number */ 319417f4adSLois Curfman McInnes stash->n = 0; 320452661fSBarry Smith stash->array = (Scalar *) PetscMalloc( stash->nmax*(2*sizeof(int) + 3378b31e54SBarry Smith sizeof(Scalar))); CHKPTRQ(stash->array); 3478b31e54SBarry Smith stash->idx = (int *) (stash->array + stash->nmax); CHKPTRQ(stash->idx); 3578b31e54SBarry Smith stash->idy = (int *) (stash->idx + stash->nmax); CHKPTRQ(stash->idy); 369417f4adSLois Curfman McInnes return 0; 379417f4adSLois Curfman McInnes } 389417f4adSLois Curfman McInnes 399417f4adSLois Curfman McInnes int StashDestroy_Private(Stash *stash) 409417f4adSLois Curfman McInnes { 419417f4adSLois Curfman McInnes stash->nmax = stash->n = 0; 420452661fSBarry Smith if (stash->array) {PetscFree(stash->array); stash->array = 0;} 439417f4adSLois Curfman McInnes return 0; 449417f4adSLois Curfman McInnes } 459417f4adSLois Curfman McInnes 4697530c3fSBarry Smith int StashInfo_Private(Stash *stash) 4797530c3fSBarry Smith { 4897530c3fSBarry Smith PLogInfo(0,"Stash size %d\n",stash->n); 4997530c3fSBarry Smith return 0; 5097530c3fSBarry Smith } 5197530c3fSBarry Smith 5297530c3fSBarry Smith /* 5397530c3fSBarry Smith Should do this properly. With a sorted array. 5497530c3fSBarry Smith */ 559417f4adSLois Curfman McInnes int StashValues_Private(Stash *stash,int row,int n, int *idxn, 569417f4adSLois Curfman McInnes Scalar *values,InsertMode addv) 579417f4adSLois Curfman McInnes { 580dd6af04SLois Curfman McInnes int i, found, *n_idx, *n_idy; /* int j, N = stash->n, */ 599417f4adSLois Curfman McInnes Scalar val, *n_array; 609417f4adSLois Curfman McInnes 619417f4adSLois Curfman McInnes for ( i=0; i<n; i++ ) { 629417f4adSLois Curfman McInnes found = 0; 639417f4adSLois Curfman McInnes val = *values++; 6487c8f93cSLois Curfman McInnes /* 650dd6af04SLois Curfman McInnes Removed search! Now much faster assembly. 6687c8f93cSLois Curfman McInnes 679417f4adSLois Curfman McInnes for ( j=0; j<N; j++ ) { 689417f4adSLois Curfman McInnes if ( stash->idx[j] == row && stash->idy[j] == idxn[i]) { 6987c8f93cSLois Curfman McInnes 70dbb450caSBarry Smith if (addv == ADD_VALUES) stash->array[j] += val; 719417f4adSLois Curfman McInnes else stash->array[j] = val; 729417f4adSLois Curfman McInnes found = 1; 739417f4adSLois Curfman McInnes break; 749417f4adSLois Curfman McInnes } 759417f4adSLois Curfman McInnes } 7687c8f93cSLois Curfman McInnes */ 779417f4adSLois Curfman McInnes if (!found) { /* not found so add to end */ 789417f4adSLois Curfman McInnes if ( stash->n == stash->nmax ) { 799417f4adSLois Curfman McInnes /* allocate a larger stash */ 800452661fSBarry Smith n_array = (Scalar *) PetscMalloc( (stash->nmax + CHUNCKSIZE)*( 81416022c9SBarry Smith 2*sizeof(int)+sizeof(Scalar)));CHKPTRQ(n_array); 829417f4adSLois Curfman McInnes n_idx = (int *) (n_array + stash->nmax + CHUNCKSIZE); 839417f4adSLois Curfman McInnes n_idy = (int *) (n_idx + stash->nmax + CHUNCKSIZE); 84416022c9SBarry Smith PetscMemcpy(n_array,stash->array,stash->nmax*sizeof(Scalar)); 85416022c9SBarry Smith PetscMemcpy(n_idx,stash->idx,stash->nmax*sizeof(int)); 86416022c9SBarry Smith PetscMemcpy(n_idy,stash->idy,stash->nmax*sizeof(int)); 870452661fSBarry Smith if (stash->array) PetscFree(stash->array); 889417f4adSLois Curfman McInnes stash->array = n_array; stash->idx = n_idx; stash->idy = n_idy; 899417f4adSLois Curfman McInnes stash->nmax += CHUNCKSIZE; 909417f4adSLois Curfman McInnes } 919417f4adSLois Curfman McInnes stash->array[stash->n] = val; 929417f4adSLois Curfman McInnes stash->idx[stash->n] = row; 939417f4adSLois Curfman McInnes stash->idy[stash->n++] = idxn[i]; 949417f4adSLois Curfman McInnes } 959417f4adSLois Curfman McInnes } 969417f4adSLois Curfman McInnes return 0; 979417f4adSLois Curfman McInnes } 98d5d45c9bSBarry Smith 99d5d45c9bSBarry Smith 10097530c3fSBarry Smith 101