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