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;

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

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

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

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

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

 67: /*TEST

 69:    test:
 70:       args: -malloc_dump

 72: TEST*/