Actual source code: ex124.c

  1: static char help[] = "Check the difference of the two matrices \n\
  2: Reads PETSc matrix A and B, then check B=A-B \n\
  3: Input parameters include\n\
  4:   -fA <input_file> -fB <input_file> \n\n";

  6: #include <petscmat.h>

  8: int main(int argc, char **args)
  9: {
 10:   Mat         A, B;
 11:   PetscViewer fd;
 12:   char        file[2][PETSC_MAX_PATH_LEN];
 13:   PetscBool   flg;
 14:   PetscMPIInt size;
 15:   PetscInt    ma, na, mb, nb;

 17:   PetscFunctionBeginUser;
 18:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 19:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 20:   PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!");

 22:   /* read the two matrices, A and B */
 23:   PetscCall(PetscOptionsGetString(NULL, NULL, "-fA", file[0], sizeof(file[0]), &flg));
 24:   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -fA options");
 25:   PetscCall(PetscOptionsGetString(NULL, NULL, "-fB", file[1], sizeof(file[1]), &flg));
 26:   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -fP options");

 28:   /* Load matrices */
 29:   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[0], FILE_MODE_READ, &fd));
 30:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 31:   PetscCall(MatLoad(A, fd));
 32:   PetscCall(PetscViewerDestroy(&fd));
 33:   printf("\n A:\n");
 34:   printf("----------------------\n");
 35:   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
 36:   PetscCall(MatGetSize(A, &ma, &na));

 38:   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[1], FILE_MODE_READ, &fd));
 39:   PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
 40:   PetscCall(MatLoad(B, fd));
 41:   PetscCall(PetscViewerDestroy(&fd));
 42:   printf("\n B:\n");
 43:   printf("----------------------\n");
 44:   PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
 45:   PetscCall(MatGetSize(B, &mb, &nb));

 47:   /* Compute B = -A + B */
 48:   PetscCheck(ma == mb && na == nb, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "nonconforming matrix size");
 49:   PetscCall(MatAXPY(B, -1.0, A, DIFFERENT_NONZERO_PATTERN));
 50:   printf("\n B - A:\n");
 51:   printf("----------------------\n");
 52:   PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));

 54:   PetscCall(MatDestroy(&B));
 55:   PetscCall(MatDestroy(&A));
 56:   PetscCall(PetscFinalize());
 57:   return 0;
 58: }