1c4762a1bSJed Brown static char help[] = "Check the difference of the two matrices \n\
2c4762a1bSJed Brown Reads PETSc matrix A and B, then check B=A-B \n\
3c4762a1bSJed Brown Input parameters include\n\
4c4762a1bSJed Brown -fA <input_file> -fB <input_file> \n\n";
5c4762a1bSJed Brown
6c4762a1bSJed Brown #include <petscmat.h>
7c4762a1bSJed Brown
main(int argc,char ** args)8d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
9d71ae5a4SJacob Faibussowitsch {
10c4762a1bSJed Brown Mat A, B;
11c4762a1bSJed Brown PetscViewer fd;
12c4762a1bSJed Brown char file[2][PETSC_MAX_PATH_LEN];
13c4762a1bSJed Brown PetscBool flg;
14c4762a1bSJed Brown PetscMPIInt size;
15c4762a1bSJed Brown PetscInt ma, na, mb, nb;
16c4762a1bSJed Brown
17327415f7SBarry Smith PetscFunctionBeginUser;
18*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &args, NULL, help));
199566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
20be096a46SBarry Smith PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!");
21c4762a1bSJed Brown
22c4762a1bSJed Brown /* read the two matrices, A and B */
239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-fA", file[0], sizeof(file[0]), &flg));
2428b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -fA options");
259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-fB", file[1], sizeof(file[1]), &flg));
2628b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -fP options");
27c4762a1bSJed Brown
28c4762a1bSJed Brown /* Load matrices */
299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[0], FILE_MODE_READ, &fd));
309566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
319566063dSJacob Faibussowitsch PetscCall(MatLoad(A, fd));
329566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fd));
33c4762a1bSJed Brown printf("\n A:\n");
34c4762a1bSJed Brown printf("----------------------\n");
359566063dSJacob Faibussowitsch PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
369566063dSJacob Faibussowitsch PetscCall(MatGetSize(A, &ma, &na));
37c4762a1bSJed Brown
389566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[1], FILE_MODE_READ, &fd));
399566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
409566063dSJacob Faibussowitsch PetscCall(MatLoad(B, fd));
419566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fd));
42c4762a1bSJed Brown printf("\n B:\n");
43c4762a1bSJed Brown printf("----------------------\n");
449566063dSJacob Faibussowitsch PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
459566063dSJacob Faibussowitsch PetscCall(MatGetSize(B, &mb, &nb));
46c4762a1bSJed Brown
47c4762a1bSJed Brown /* Compute B = -A + B */
48e00437b9SBarry Smith PetscCheck(ma == mb && na == nb, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "nonconforming matrix size");
499566063dSJacob Faibussowitsch PetscCall(MatAXPY(B, -1.0, A, DIFFERENT_NONZERO_PATTERN));
50c4762a1bSJed Brown printf("\n B - A:\n");
51c4762a1bSJed Brown printf("----------------------\n");
529566063dSJacob Faibussowitsch PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
53c4762a1bSJed Brown
549566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B));
559566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A));
569566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
57b122ec5aSJacob Faibussowitsch return 0;
58c4762a1bSJed Brown }
59