Actual source code: ex203.c


  2: static char help[] = "Tests incorrect use of MatDiagonalSet() for SHELL matrices\n\n";

  4: #include <petscmat.h>

  6: typedef struct _n_User *User;
  7: struct _n_User {
  8:   Mat B;
  9: };

 11: static PetscErrorCode MatGetDiagonal_User(Mat A, Vec X)
 12: {
 13:   User user;

 15:   MatShellGetContext(A, &user);
 16:   MatGetDiagonal(user->B, X);
 17:   return 0;
 18: }

 20: int main(int argc, char **args)
 21: {
 22:   const PetscScalar xvals[] = {11, 13};
 23:   const PetscInt    inds[]  = {0, 1};
 24:   PetscScalar       avals[] = {2, 3, 5, 7};
 25:   Mat               A, S;
 26:   Vec               X, Y;
 27:   User              user;

 30:   PetscInitialize(&argc, &args, (char *)0, help);
 31:   MatCreateSeqAIJ(PETSC_COMM_WORLD, 2, 2, 2, NULL, &A);
 32:   MatSetUp(A);
 33:   MatSetValues(A, 2, inds, 2, inds, avals, INSERT_VALUES);
 34:   MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
 35:   MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
 36:   VecCreateSeq(PETSC_COMM_WORLD, 2, &X);
 37:   VecSetValues(X, 2, inds, xvals, INSERT_VALUES);
 38:   VecAssemblyBegin(X);
 39:   VecAssemblyEnd(X);
 40:   VecDuplicate(X, &Y);

 42:   PetscNew(&user);
 43:   user->B = A;

 45:   MatCreateShell(PETSC_COMM_WORLD, 2, 2, 2, 2, user, &S);
 46:   MatShellSetOperation(S, MATOP_GET_DIAGONAL, (void (*)(void))MatGetDiagonal_User);
 47:   MatSetUp(S);

 49:   MatShift(S, 42);
 50:   MatGetDiagonal(S, Y);
 51:   VecView(Y, PETSC_VIEWER_STDOUT_WORLD);
 52:   MatDiagonalSet(S, X, ADD_VALUES);
 53:   MatGetDiagonal(S, Y);
 54:   VecView(Y, PETSC_VIEWER_STDOUT_WORLD);
 55:   MatScale(S, 42);
 56:   MatGetDiagonal(S, Y);
 57:   VecView(Y, PETSC_VIEWER_STDOUT_WORLD);

 59:   MatDestroy(&A);
 60:   MatDestroy(&S);
 61:   VecDestroy(&X);
 62:   VecDestroy(&Y);
 63:   PetscFree(user);
 64:   PetscFinalize();
 65:   return 0;
 66: }

 68: /*TEST

 70:    test:
 71:       args: -malloc_dump

 73: TEST*/