161e22dc2SBarry Smith 2c6db04a5SJed Brown #include <../src/mat/impls/baij/seq/baij.h> 361e22dc2SBarry Smith 49371c9d4SSatish Balay PETSC_INTERN PetscErrorCode MatConvert_SeqBAIJ_SeqAIJ(Mat A, MatType newtype, MatReuse reuse, Mat *newmat) { 5676c34cdSKris Buschelman Mat B; 60f6d62edSLisandro Dalcin Mat_SeqAIJ *b; 70f6d62edSLisandro Dalcin PetscBool roworiented; 861e22dc2SBarry Smith Mat_SeqBAIJ *a = (Mat_SeqBAIJ *)A->data; 9d0f46423SBarry Smith PetscInt bs = A->rmap->bs, *ai = a->i, *aj = a->j, n = A->rmap->N / bs, i, j, k; 10690b6cddSBarry Smith PetscInt *rowlengths, *rows, *cols, maxlen = 0, ncols; 11dd6ea824SBarry Smith MatScalar *aa = a->a; 1261e22dc2SBarry Smith 1361e22dc2SBarry Smith PetscFunctionBegin; 140f6d62edSLisandro Dalcin if (reuse == MAT_REUSE_MATRIX) { 150f6d62edSLisandro Dalcin B = *newmat; 16*ad540459SPierre Jolivet for (i = 0; i < n; i++) maxlen = PetscMax(maxlen, (ai[i + 1] - ai[i])); 170f6d62edSLisandro Dalcin } else { 189566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n * bs, &rowlengths)); 1961e22dc2SBarry Smith for (i = 0; i < n; i++) { 20b9b97703SBarry Smith maxlen = PetscMax(maxlen, (ai[i + 1] - ai[i])); 21*ad540459SPierre Jolivet for (j = 0; j < bs; j++) rowlengths[i * bs + j] = bs * (ai[i + 1] - ai[i]); 2261e22dc2SBarry Smith } 239566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A), &B)); 249566063dSJacob Faibussowitsch PetscCall(MatSetType(B, MATSEQAIJ)); 259566063dSJacob Faibussowitsch PetscCall(MatSetSizes(B, A->rmap->n, A->cmap->n, A->rmap->N, A->cmap->N)); 269566063dSJacob Faibussowitsch PetscCall(MatSetBlockSizes(B, A->rmap->bs, A->cmap->bs)); 279566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(B, 0, rowlengths)); 289566063dSJacob Faibussowitsch PetscCall(PetscFree(rowlengths)); 290f6d62edSLisandro Dalcin } 300f6d62edSLisandro Dalcin b = (Mat_SeqAIJ *)B->data; 310f6d62edSLisandro Dalcin roworiented = b->roworiented; 3261e22dc2SBarry Smith 339566063dSJacob Faibussowitsch PetscCall(MatSetOption(B, MAT_ROW_ORIENTED, PETSC_FALSE)); 349566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(bs, &rows)); 359566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(bs * maxlen, &cols)); 36b9b97703SBarry Smith for (i = 0; i < n; i++) { 37*ad540459SPierre Jolivet for (j = 0; j < bs; j++) rows[j] = i * bs + j; 38b9b97703SBarry Smith ncols = ai[i + 1] - ai[i]; 39b9b97703SBarry Smith for (k = 0; k < ncols; k++) { 40*ad540459SPierre Jolivet for (j = 0; j < bs; j++) cols[k * bs + j] = bs * (*aj) + j; 41b9b97703SBarry Smith aj++; 42b9b97703SBarry Smith } 439566063dSJacob Faibussowitsch PetscCall(MatSetValues(B, bs, rows, bs * ncols, cols, aa, INSERT_VALUES)); 44b9b97703SBarry Smith aa += ncols * bs * bs; 45b9b97703SBarry Smith } 469566063dSJacob Faibussowitsch PetscCall(PetscFree(cols)); 479566063dSJacob Faibussowitsch PetscCall(PetscFree(rows)); 489566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY)); 499566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY)); 509566063dSJacob Faibussowitsch PetscCall(MatSetOption(B, MAT_ROW_ORIENTED, roworiented)); 51521d7252SBarry Smith 52511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 539566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(A, &B)); 54ae8d29abSPierre Jolivet } else *newmat = B; 5561e22dc2SBarry Smith PetscFunctionReturn(0); 5661e22dc2SBarry Smith } 5761e22dc2SBarry Smith 58c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h> 5985fc7724SBarry Smith 609371c9d4SSatish Balay PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqBAIJ(Mat A, MatType newtype, MatReuse reuse, Mat *newmat) { 61676c34cdSKris Buschelman Mat B; 6285fc7724SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data; 6385fc7724SBarry Smith Mat_SeqBAIJ *b; 64ae8d29abSPierre Jolivet PetscInt *ai = a->i, m = A->rmap->N, n = A->cmap->N, i, *rowlengths, bs = PetscAbs(A->rmap->bs); 6585fc7724SBarry Smith 6685fc7724SBarry Smith PetscFunctionBegin; 67345dab1aSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 689566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m / bs, &rowlengths)); 69*ad540459SPierre Jolivet for (i = 0; i < m / bs; i++) rowlengths[i] = (ai[i * bs + 1] - ai[i * bs]) / bs; 709566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A), &B)); 719566063dSJacob Faibussowitsch PetscCall(MatSetSizes(B, m, n, m, n)); 729566063dSJacob Faibussowitsch PetscCall(MatSetType(B, MATSEQBAIJ)); 739566063dSJacob Faibussowitsch PetscCall(MatSeqBAIJSetPreallocation(B, bs, 0, rowlengths)); 749566063dSJacob Faibussowitsch PetscCall(PetscFree(rowlengths)); 75345dab1aSStefano Zampini } else B = *newmat; 7685fc7724SBarry Smith 77ae8d29abSPierre Jolivet if (bs == 1) { 78676c34cdSKris Buschelman b = (Mat_SeqBAIJ *)(B->data); 7985fc7724SBarry Smith 809566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(b->i, a->i, m + 1)); 819566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(b->ilen, a->ilen, m)); 829566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(b->j, a->j, a->nz)); 839566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(b->a, a->a, a->nz)); 8485fc7724SBarry Smith 859566063dSJacob Faibussowitsch PetscCall(MatSetOption(B, MAT_ROW_ORIENTED, PETSC_TRUE)); 869566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY)); 879566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY)); 88ae8d29abSPierre Jolivet } else { 89ae8d29abSPierre Jolivet /* reuse may not be equal to MAT_REUSE_MATRIX, but the basic converter will reallocate or replace newmat if this value is not used */ 90ae8d29abSPierre Jolivet /* if reuse is equal to MAT_INITIAL_MATRIX, it has been appropriately preallocated before */ 91ae8d29abSPierre Jolivet /* MAT_INPLACE_MATRIX, it will be replaced with MatHeaderReplace below */ 929566063dSJacob Faibussowitsch PetscCall(MatConvert_Basic(A, newtype, MAT_REUSE_MATRIX, &B)); 93ae8d29abSPierre Jolivet } 94676c34cdSKris Buschelman 95511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 969566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(A, &B)); 97ae8d29abSPierre Jolivet } else *newmat = B; 9885fc7724SBarry Smith PetscFunctionReturn(0); 9985fc7724SBarry Smith } 100