Actual source code: ex135.c
1: static const char help[] = "Test parallel assembly of SBAIJ matrices\n\n";
3: #include <petscmat.h>
5: PetscErrorCode Assemble(MPI_Comm comm, PetscInt n, MatType mtype)
6: {
7: Mat A;
8: PetscInt first, last, i;
9: PetscMPIInt rank, size;
11: PetscFunctionBegin;
12: PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
13: PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n));
14: PetscCall(MatSetType(A, MATMPISBAIJ));
15: PetscCall(MatSetFromOptions(A));
16: PetscCallMPI(MPI_Comm_size(comm, &size));
17: PetscCallMPI(MPI_Comm_rank(comm, &rank));
18: if (rank < size - 1) {
19: PetscCall(MatMPISBAIJSetPreallocation(A, 1, 1, NULL, 1, NULL));
20: } else {
21: PetscCall(MatMPISBAIJSetPreallocation(A, 1, 2, NULL, 0, NULL));
22: }
23: PetscCall(MatGetOwnershipRange(A, &first, &last));
24: PetscCall(MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE));
25: last--;
26: for (i = first; i <= last; i++) {
27: PetscCall(MatSetValue(A, i, i, 2., INSERT_VALUES));
28: if (i != n - 1) PetscCall(MatSetValue(A, i, n - 1, -1., INSERT_VALUES));
29: }
30: PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
31: PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
32: PetscCall(MatDestroy(&A));
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
36: int main(int argc, char *argv[])
37: {
38: MPI_Comm comm;
39: PetscInt n = 6;
41: PetscFunctionBeginUser;
42: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
43: comm = PETSC_COMM_WORLD;
44: PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
45: PetscCall(Assemble(comm, n, MATMPISBAIJ));
46: PetscCall(PetscFinalize());
47: return 0;
48: }
50: /*TEST
52: test:
53: nsize: 4
54: args: -n 1000 -mat_view ascii::ascii_info_detail
55: requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
57: TEST*/