1cac129eeSSatish Balay #ifndef lint 2*a3192f15SSatish Balay static char vcid[] = "$Id: baij2.c,v 1.1 1996/04/30 18:51:06 balay Exp balay $"; 3cac129eeSSatish Balay #endif 4cac129eeSSatish Balay 5cac129eeSSatish Balay #include "baij.h" 6cac129eeSSatish Balay #include "petsc.h" 7cac129eeSSatish Balay 8*a3192f15SSatish Balay 9*a3192f15SSatish Balay static int MatIncreaseOverlap_SeqAIJ(Mat A, int is_max, IS *is, int ov) 10*a3192f15SSatish Balay { 11*a3192f15SSatish Balay Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; 12*a3192f15SSatish Balay int row, i,j,k,l,m,n, *idx,ierr, *nidx, isz, val; 13*a3192f15SSatish Balay int start, end, *ai, *aj; 14*a3192f15SSatish Balay char *table; 15*a3192f15SSatish Balay 16*a3192f15SSatish Balay m = a->mbs; 17*a3192f15SSatish Balay ai = a->i; 18*a3192f15SSatish Balay aj = a->j; 19*a3192f15SSatish Balay 20*a3192f15SSatish Balay if (ov < 0) SETERRQ(1,"MatIncreaseOverlap_SeqBAIJ: illegal overlap value used"); 21*a3192f15SSatish Balay 22*a3192f15SSatish Balay table = (char *) PetscMalloc((m/BITSPERBYTE +1)*sizeof(char)); CHKPTRQ(table); 23*a3192f15SSatish Balay nidx = (int *) PetscMalloc((m+1)*sizeof(int)); CHKPTRQ(nidx); 24*a3192f15SSatish Balay 25*a3192f15SSatish Balay for ( i=0; i<is_max; i++ ) { 26*a3192f15SSatish Balay /* Initialise the two local arrays */ 27*a3192f15SSatish Balay isz = 0; 28*a3192f15SSatish Balay PetscMemzero(table,(m/BITSPERBYTE +1)*sizeof(char)); 29*a3192f15SSatish Balay 30*a3192f15SSatish Balay /* Extract the indices, assume there can be duplicate entries */ 31*a3192f15SSatish Balay ierr = ISGetIndices(is[i],&idx); CHKERRQ(ierr); 32*a3192f15SSatish Balay ierr = ISGetSize(is[i],&n); CHKERRQ(ierr); 33*a3192f15SSatish Balay 34*a3192f15SSatish Balay /* Enter these into the temp arrays i.e mark table[row], enter row into new index */ 35*a3192f15SSatish Balay for ( j=0; j<n ; ++j){ 36*a3192f15SSatish Balay if(!BT_LOOKUP(table, idx[j])) { nidx[isz++] = idx[j];} 37*a3192f15SSatish Balay } 38*a3192f15SSatish Balay ierr = ISRestoreIndices(is[i],&idx); CHKERRQ(ierr); 39*a3192f15SSatish Balay ierr = ISDestroy(is[i]); CHKERRQ(ierr); 40*a3192f15SSatish Balay 41*a3192f15SSatish Balay k = 0; 42*a3192f15SSatish Balay for ( j=0; j<ov; j++){ /* for each overlap*/ 43*a3192f15SSatish Balay n = isz; 44*a3192f15SSatish Balay for ( ; k<n ; k++){ /* do only those rows in nidx[k], which are not done yet */ 45*a3192f15SSatish Balay row = nidx[k]; 46*a3192f15SSatish Balay start = ai[row]; 47*a3192f15SSatish Balay end = ai[row+1]; 48*a3192f15SSatish Balay for ( l = start; l<end ; l++){ 49*a3192f15SSatish Balay val = aj[l]; 50*a3192f15SSatish Balay if (!BT_LOOKUP(table,val)) {nidx[isz++] = val;} 51*a3192f15SSatish Balay } 52*a3192f15SSatish Balay } 53*a3192f15SSatish Balay } 54*a3192f15SSatish Balay ierr = ISCreateSeq(MPI_COMM_SELF, isz, nidx, (is+i)); CHKERRQ(ierr); 55*a3192f15SSatish Balay } 56*a3192f15SSatish Balay PetscFree(table); 57*a3192f15SSatish Balay PetscFree(nidx); 58*a3192f15SSatish Balay return 0; 59*a3192f15SSatish Balay } 60