xref: /petsc/src/mat/tests/ex198.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1 static char help[] = "Test MatMatMatMult\n\
2 Reads PETSc matrix A B and C, then comput D=A*B*C \n\
3 Input parameters include\n\
4   -fA <input_file> -fB <input_file> -fC <input_file> \n\n";
5 
6 #include <petscmat.h>
7 
8 int main(int argc,char **args)
9 {
10   Mat            A,B,C,D,BC,ABC;
11   PetscViewer    fd;
12   char           file[3][PETSC_MAX_PATH_LEN];
13   PetscBool      flg;
14   PetscErrorCode ierr;
15 
16   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
17   /* read matrices A, B and C */
18   ierr = PetscOptionsGetString(NULL,NULL,"-fA",file[0],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
19   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Must indicate binary file with the -fA options");
20 
21   ierr = PetscOptionsGetString(NULL,NULL,"-fB",file[1],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
22   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Must indicate binary file with the -fB options");
23 
24   ierr = PetscOptionsGetString(NULL,NULL,"-fC",file[2],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
25   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Must indicate binary file with the -fC options");
26 
27   /* Load matrices */
28   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&fd);CHKERRQ(ierr);
29   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
30   ierr = MatLoad(A,fd);CHKERRQ(ierr);
31   ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);
32 
33   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&fd);CHKERRQ(ierr);
34   ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
35   ierr = MatLoad(B,fd);CHKERRQ(ierr);
36   ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);
37 
38   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[2],FILE_MODE_READ,&fd);CHKERRQ(ierr);
39   ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr);
40   ierr = MatLoad(C,fd);CHKERRQ(ierr);
41   ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);
42 
43   /* Test MatMatMult() */
44   ierr = MatMatMult(B,C,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&BC);CHKERRQ(ierr);
45   ierr = MatMatMult(A,BC,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&ABC);CHKERRQ(ierr);
46 
47   ierr = MatMatMatMult(A,B,C,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&D);CHKERRQ(ierr);
48   ierr = MatMatMatMult(A,B,C,MAT_REUSE_MATRIX,PETSC_DEFAULT,&D);CHKERRQ(ierr);
49   /* ierr = MatView(D,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); */
50 
51   ierr = MatEqual(ABC,D,&flg);CHKERRQ(ierr);
52   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_INCOMP,"ABC != D");
53 
54   ierr = MatDestroy(&ABC);CHKERRQ(ierr);
55   ierr = MatDestroy(&BC);CHKERRQ(ierr);
56   ierr = MatDestroy(&D);CHKERRQ(ierr);
57   ierr = MatDestroy(&C);CHKERRQ(ierr);
58   ierr = MatDestroy(&B);CHKERRQ(ierr);
59   ierr = MatDestroy(&A);CHKERRQ(ierr);
60   ierr = PetscFinalize();
61   return ierr;
62 }
63 
64 /*TEST
65 
66    test:
67       requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
68       args: -fA ${DATAFILESPATH}/matrices/matmatmatmult/A.bin -fB ${DATAFILESPATH}/matrices/matmatmatmult/B.bin -fC ${DATAFILESPATH}/matrices/matmatmatmult/C.bin
69       output_file: output/ex198.out
70 
71    test:
72       suffix: 2
73       nsize: 3
74       requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
75       args: -fA ${DATAFILESPATH}/matrices/matmatmatmult/A.bin -fB ${DATAFILESPATH}/matrices/matmatmatmult/B.bin -fC ${DATAFILESPATH}/matrices/matmatmatmult/C.bin
76       output_file: output/ex198.out
77 
78 TEST*/
79