Actual source code: ex238.c
1: static char help[] = "Creates MatSeqBAIJ matrix of given BS for timing tests of MatMult().\n";
3: #include <petscmat.h>
5: int main(int argc, char **args)
6: {
7: Mat A;
8: Vec x, y;
9: PetscInt m = 50000, bs = 12, i, j, k, l, row, col, M, its = 25;
10: PetscScalar rval, *vals;
11: PetscRandom rdm;
14: PetscInitialize(&argc, &args, (char *)0, help);
15: PetscOptionsGetInt(NULL, NULL, "-mat_block_size", &bs, NULL);
16: PetscOptionsGetInt(NULL, NULL, "-its", &its, NULL);
17: PetscOptionsGetInt(NULL, NULL, "-mat_size", &m, NULL);
18: M = m * bs;
19: MatCreateSeqBAIJ(PETSC_COMM_SELF, bs, M, M, 27, NULL, &A);
20: MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
22: PetscRandomCreate(PETSC_COMM_SELF, &rdm);
23: PetscRandomSetFromOptions(rdm);
24: VecCreateSeq(PETSC_COMM_SELF, M, &x);
25: VecDuplicate(x, &y);
27: /* For each block row insert at most 27 blocks */
28: PetscMalloc1(bs * bs, &vals);
29: for (i = 0; i < m; i++) {
30: row = i;
31: for (j = 0; j < 27; j++) {
32: PetscRandomGetValue(rdm, &rval);
33: col = (PetscInt)(PetscRealPart(rval) * m);
34: for (k = 0; k < bs; k++) {
35: for (l = 0; l < bs; l++) {
36: PetscRandomGetValue(rdm, &rval);
37: vals[k * bs + l] = rval;
38: }
39: }
40: MatSetValuesBlocked(A, 1, &row, 1, &col, vals, INSERT_VALUES);
41: }
42: }
43: MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
44: MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
45: PetscFree(vals);
47: /* Time MatMult(), MatMultAdd() */
48: for (i = 0; i < its; i++) {
49: VecSetRandom(x, rdm);
50: MatMult(A, x, y);
51: VecSetRandom(x, rdm);
52: VecSetRandom(y, rdm);
53: MatMultAdd(A, x, y, y);
54: }
56: MatDestroy(&A);
57: VecDestroy(&x);
58: VecDestroy(&y);
59: PetscRandomDestroy(&rdm);
60: PetscFinalize();
61: return 0;
62: }
64: /*TEST
66: testset:
67: requires: defined(PETSC_USING_64BIT_PTR)
68: output_file: output/ex238_1.out
69: test:
70: suffix: 1
71: args: -mat_block_size 1 -mat_size 1000 -its 2
72: test:
73: suffix: 2
74: args: -mat_block_size 2 -mat_size 1000 -its 2
75: test:
76: suffix: 4
77: args: -mat_block_size 4 -mat_size 1000 -its 2
78: test:
79: suffix: 5
80: args: -mat_block_size 5 -mat_size 1000 -its 2
81: test:
82: suffix: 6
83: args: -mat_block_size 6 -mat_size 1000 -its 2
84: test:
85: suffix: 8
86: args: -mat_block_size 8 -mat_size 1000 -its 2
87: test:
88: suffix: 12
89: args: -mat_block_size 12 -mat_size 1000 -its 2
90: test:
91: suffix: 15
92: args: -mat_block_size 15 -mat_size 1000 -its 2
94: TEST*/