1d4002b98SHong Zhang #include <../src/mat/impls/sell/seq/sell.h> 2d4002b98SHong Zhang #include <../src/mat/impls/aij/seq/aij.h> 3d4002b98SHong Zhang #include <petsc/private/isimpl.h> 4d4002b98SHong Zhang 5d4002b98SHong Zhang /* 6d4002b98SHong Zhang MatGetColumnIJ_SeqSELL_Color() and MatRestoreColumnIJ_SeqSELL_Color() are customized from 7d4002b98SHong Zhang MatGetColumnIJ_SeqSELL() and MatRestoreColumnIJ_SeqSELL() by adding an output 8d4002b98SHong Zhang spidx[], index of a->a, to be used in MatTransposeColoringCreate_SeqSELL() and MatFDColoringCreate_SeqSELL() 9d4002b98SHong Zhang */ 10d4002b98SHong Zhang PetscErrorCode MatGetColumnIJ_SeqSELL_Color(Mat A,PetscInt oshift,PetscBool symmetric,PetscBool inodecompressed,PetscInt *nn,const PetscInt *ia[],const PetscInt *ja[],PetscInt *spidx[],PetscBool *done) 11d4002b98SHong Zhang { 12d4002b98SHong Zhang Mat_SeqSELL *a = (Mat_SeqSELL*)A->data; 13d4002b98SHong Zhang PetscInt i,j,*collengths,*cia,*cja,n = A->cmap->n,totalslices; 14d4002b98SHong Zhang PetscInt row,col; 15d4002b98SHong Zhang PetscInt *cspidx; 16d4002b98SHong Zhang PetscBool isnonzero; 17d4002b98SHong Zhang 18d4002b98SHong Zhang PetscFunctionBegin; 19d4002b98SHong Zhang *nn = n; 20d4002b98SHong Zhang if (!ia) PetscFunctionReturn(0); 21d4002b98SHong Zhang 22*9566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(n+1,&collengths)); 23*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n+1,&cia)); 24*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(a->nz+1,&cja)); 25*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(a->nz+1,&cspidx)); 26d4002b98SHong Zhang 27d4002b98SHong Zhang totalslices = A->rmap->n/8+((A->rmap->n & 0x07)?1:0); /* floor(n/8) */ 28d4002b98SHong Zhang for (i=0; i<totalslices; i++) { /* loop over slices */ 29d4002b98SHong Zhang for (j=a->sliidx[i],row=0; j<a->sliidx[i+1]; j++,row=((row+1)&0x07)) { 30d4002b98SHong Zhang isnonzero = (PetscBool)((j-a->sliidx[i])/8 < a->rlen[8*i+row]); 31d4002b98SHong Zhang if (isnonzero) collengths[a->colidx[j]]++; 32d4002b98SHong Zhang } 33d4002b98SHong Zhang } 34d4002b98SHong Zhang 35d4002b98SHong Zhang cia[0] = oshift; 36d4002b98SHong Zhang for (i=0; i<n; i++) { 37d4002b98SHong Zhang cia[i+1] = cia[i] + collengths[i]; 38d4002b98SHong Zhang } 39*9566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(collengths,n)); 40d4002b98SHong Zhang 41d4002b98SHong Zhang for (i=0; i<totalslices; i++) { /* loop over slices */ 42d4002b98SHong Zhang for (j=a->sliidx[i],row=0; j<a->sliidx[i+1]; j++,row=((row+1)&0x07)) { 43d4002b98SHong Zhang isnonzero = (PetscBool)((j-a->sliidx[i])/8 < a->rlen[8*i+row]); 44d4002b98SHong Zhang if (isnonzero) { 45d4002b98SHong Zhang col = a->colidx[j]; 46d4002b98SHong Zhang cspidx[cia[col]+collengths[col]-oshift] = j; /* index of a->colidx */ 47d4002b98SHong Zhang cja[cia[col]+collengths[col]-oshift] = 8*i+row +oshift; /* row index */ 48d4002b98SHong Zhang collengths[col]++; 49d4002b98SHong Zhang } 50d4002b98SHong Zhang } 51d4002b98SHong Zhang } 52d4002b98SHong Zhang 53*9566063dSJacob Faibussowitsch PetscCall(PetscFree(collengths)); 54d4002b98SHong Zhang *ia = cia; *ja = cja; 55d4002b98SHong Zhang *spidx = cspidx; 56d4002b98SHong Zhang PetscFunctionReturn(0); 57d4002b98SHong Zhang } 58d4002b98SHong Zhang 59d4002b98SHong Zhang PetscErrorCode MatRestoreColumnIJ_SeqSELL_Color(Mat A,PetscInt oshift,PetscBool symmetric,PetscBool inodecompressed,PetscInt *n,const PetscInt *ia[],const PetscInt *ja[],PetscInt *spidx[],PetscBool *done) 60d4002b98SHong Zhang { 61d4002b98SHong Zhang PetscFunctionBegin; 62d4002b98SHong Zhang 63d4002b98SHong Zhang if (!ia) PetscFunctionReturn(0); 64*9566063dSJacob Faibussowitsch PetscCall(PetscFree(*ia)); 65*9566063dSJacob Faibussowitsch PetscCall(PetscFree(*ja)); 66*9566063dSJacob Faibussowitsch PetscCall(PetscFree(*spidx)); 67d4002b98SHong Zhang PetscFunctionReturn(0); 68d4002b98SHong Zhang } 69