xref: /petsc/src/mat/impls/baij/seq/baij2.c (revision a3192f154fabb63e24f9c46329406a5e50abdd4d)
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