xref: /petsc/src/mat/impls/sell/seq/fdsell.c (revision 9566063d113dddea24716c546802770db7481bc0)
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