Actual source code: ex38.c
2: static char help[] = "Test interface of Elemental. \n\n";
4: #include <petscmat.h>
6: int main(int argc, char **args)
7: {
8: Mat C, Caij;
9: PetscInt i, j, m = 5, n, nrows, ncols;
10: const PetscInt *rows, *cols;
11: IS isrows, iscols;
12: PetscBool flg, Test_MatMatMult = PETSC_FALSE, mats_view = PETSC_FALSE;
13: PetscScalar *v;
14: PetscMPIInt rank, size;
17: PetscInitialize(&argc, &args, (char *)0, help);
18: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
19: MPI_Comm_size(PETSC_COMM_WORLD, &size);
20: PetscOptionsHasName(NULL, NULL, "-mats_view", &mats_view);
22: /* Get local block or element size*/
23: PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL);
24: n = m;
25: PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL);
27: MatCreate(PETSC_COMM_WORLD, &C);
28: MatSetSizes(C, m, n, PETSC_DECIDE, PETSC_DECIDE);
29: MatSetType(C, MATELEMENTAL);
30: MatSetFromOptions(C);
31: MatSetUp(C);
33: PetscOptionsHasName(NULL, NULL, "-row_oriented", &flg);
34: if (flg) MatSetOption(C, MAT_ROW_ORIENTED, PETSC_TRUE);
35: MatGetOwnershipIS(C, &isrows, &iscols);
36: PetscOptionsHasName(NULL, NULL, "-Cexp_view_ownership", &flg);
37: if (flg) { /* View ownership of explicit C */
38: IS tmp;
39: PetscPrintf(PETSC_COMM_WORLD, "Ownership of explicit C:\n");
40: PetscPrintf(PETSC_COMM_WORLD, "Row index set:\n");
41: ISOnComm(isrows, PETSC_COMM_WORLD, PETSC_USE_POINTER, &tmp);
42: ISView(tmp, PETSC_VIEWER_STDOUT_WORLD);
43: ISDestroy(&tmp);
44: PetscPrintf(PETSC_COMM_WORLD, "Column index set:\n");
45: ISOnComm(iscols, PETSC_COMM_WORLD, PETSC_USE_POINTER, &tmp);
46: ISView(tmp, PETSC_VIEWER_STDOUT_WORLD);
47: ISDestroy(&tmp);
48: }
50: /* Set local matrix entries */
51: ISGetLocalSize(isrows, &nrows);
52: ISGetIndices(isrows, &rows);
53: ISGetLocalSize(iscols, &ncols);
54: ISGetIndices(iscols, &cols);
55: PetscMalloc1(nrows * ncols, &v);
56: for (i = 0; i < nrows; i++) {
57: for (j = 0; j < ncols; j++) {
58: /*v[i*ncols+j] = (PetscReal)(rank);*/
59: v[i * ncols + j] = (PetscReal)(rank * 10000 + 100 * rows[i] + cols[j]);
60: }
61: }
62: MatSetValues(C, nrows, rows, ncols, cols, v, INSERT_VALUES);
63: ISRestoreIndices(isrows, &rows);
64: ISRestoreIndices(iscols, &cols);
65: MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY);
66: MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY);
68: /* Test MatView() */
69: if (mats_view) MatView(C, PETSC_VIEWER_STDOUT_WORLD);
71: /* Test MatMissingDiagonal() */
72: MatMissingDiagonal(C, &flg, NULL);
75: /* Set unowned matrix entries - add subdiagonals and diagonals from proc[0] */
76: if (rank == 0) {
77: PetscInt M, N, cols[2];
78: MatGetSize(C, &M, &N);
79: for (i = 0; i < M; i++) {
80: cols[0] = i;
81: v[0] = i + 0.5;
82: cols[1] = i - 1;
83: v[1] = 0.5;
84: if (i) {
85: MatSetValues(C, 1, &i, 2, cols, v, ADD_VALUES);
86: } else {
87: MatSetValues(C, 1, &i, 1, &i, v, ADD_VALUES);
88: }
89: }
90: }
91: MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY);
92: MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY);
94: /* Test MatMult() */
95: MatComputeOperator(C, MATAIJ, &Caij);
96: MatMultEqual(C, Caij, 5, &flg);
98: MatMultTransposeEqual(C, Caij, 5, &flg);
101: /* Test MatMultAdd() and MatMultTransposeAddEqual() */
102: MatMultAddEqual(C, Caij, 5, &flg);
104: MatMultTransposeAddEqual(C, Caij, 5, &flg);
107: /* Test MatMatMult() */
108: PetscOptionsHasName(NULL, NULL, "-test_matmatmult", &Test_MatMatMult);
109: if (Test_MatMatMult) {
110: Mat CCelem, CCaij;
111: MatMatMult(C, C, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &CCelem);
112: MatMatMult(Caij, Caij, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &CCaij);
113: MatMultEqual(CCelem, CCaij, 5, &flg);
115: MatDestroy(&CCaij);
116: MatDestroy(&CCelem);
117: }
119: PetscFree(v);
120: ISDestroy(&isrows);
121: ISDestroy(&iscols);
122: MatDestroy(&C);
123: MatDestroy(&Caij);
124: PetscFinalize();
125: return 0;
126: }
128: /*TEST
130: test:
131: nsize: 2
132: requires: elemental
133: args: -mat_type elemental -m 2 -n 3
135: test:
136: suffix: 2
137: nsize: 6
138: requires: elemental
139: args: -mat_type elemental -m 2 -n 2
141: test:
142: suffix: 3
143: nsize: 6
144: requires: elemental
145: args: -mat_type elemental -m 2 -n 2 -test_matmatmult
146: output_file: output/ex38_2.out
148: TEST*/