static char help[] = "Tests Cholesky factorization for a SBAIJ matrix, (bs=2).\n"; /* This code is modified from the code contributed by JUNWANG@uwm.edu on Apr 13, 2007 */ #include int main(int argc, char **args) { Mat mat, fact, B; PetscInt ind1[2], ind2[2]; PetscScalar temp[4]; PetscInt nnz[3]; IS perm, colp; MatFactorInfo info; PetscMPIInt size; PetscFunctionBeginUser; PetscCall(PetscInitialize(&argc, &args, 0, help)); PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!"); nnz[0] = 2; nnz[1] = 1; nnz[2] = 1; PetscCall(MatCreateSeqSBAIJ(PETSC_COMM_SELF, 2, 6, 6, 0, nnz, &mat)); ind1[0] = 0; ind1[1] = 1; temp[0] = 3; temp[1] = 2; temp[2] = 0; temp[3] = 3; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); ind2[0] = 4; ind2[1] = 5; temp[0] = 1; temp[1] = 1; temp[2] = 2; temp[3] = 1; PetscCall(MatSetValues(mat, 2, ind1, 2, ind2, temp, INSERT_VALUES)); ind1[0] = 2; ind1[1] = 3; temp[0] = 4; temp[1] = 1; temp[2] = 1; temp[3] = 5; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); ind1[0] = 4; ind1[1] = 5; temp[0] = 5; temp[1] = 1; temp[2] = 1; temp[3] = 6; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); PetscCall(MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY)); PetscCall(MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY)); PetscCall(MatDuplicate(mat, MAT_SHARE_NONZERO_PATTERN, &B)); ind1[0] = 0; ind1[1] = 1; temp[0] = 3; temp[1] = 2; temp[2] = 0; temp[3] = 3; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); ind2[0] = 4; ind2[1] = 5; temp[0] = 1; temp[1] = 1; temp[2] = 2; temp[3] = 1; PetscCall(MatSetValues(mat, 2, ind1, 2, ind2, temp, INSERT_VALUES)); ind1[0] = 2; ind1[1] = 3; temp[0] = 4; temp[1] = 1; temp[2] = 1; temp[3] = 5; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); ind1[0] = 4; ind1[1] = 5; temp[0] = 5; temp[1] = 1; temp[2] = 1; temp[3] = 6; PetscCall(MatSetValues(mat, 2, ind1, 2, ind1, temp, INSERT_VALUES)); PetscCall(MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY)); PetscCall(MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY)); PetscCall(PetscPrintf(PETSC_COMM_WORLD, "mat: \n")); PetscCall(MatView(mat, PETSC_VIEWER_STDOUT_SELF)); /* begin cholesky factorization */ PetscCall(MatGetOrdering(mat, MATORDERINGNATURAL, &perm, &colp)); PetscCall(ISDestroy(&colp)); info.fill = 1.0; PetscCall(MatGetFactor(mat, MATSOLVERPETSC, MAT_FACTOR_CHOLESKY, &fact)); PetscCall(MatCholeskyFactorSymbolic(fact, mat, perm, &info)); PetscCall(MatCholeskyFactorNumeric(fact, mat, &info)); PetscCall(ISDestroy(&perm)); PetscCall(MatDestroy(&mat)); PetscCall(MatDestroy(&fact)); PetscCall(MatDestroy(&B)); PetscCall(PetscFinalize()); return 0; }