static char help[] = "Tests MatMult(), MatMultAdd(), MatMultTranspose().\n\ Also MatMultTransposeAdd(), MatScale(), MatGetDiagonal(), and MatDiagonalScale().\n\n"; #include int main(int argc,char **args) { Mat C; Vec s,u,w,x,y,z; PetscErrorCode ierr; PetscInt i,j,m = 8,n,rstart,rend,vstart,vend; PetscScalar one = 1.0,negone = -1.0,v,alpha=0.1; PetscReal norm, tol = PETSC_SQRT_MACHINE_EPSILON; PetscBool flg; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; CHKERRQ(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON)); CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); n = m; CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rectA",&flg)); if (flg) n += 2; CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rectB",&flg)); if (flg) n -= 2; /* ---------- Assemble matrix and vectors ----------- */ CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C)); CHKERRQ(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m,n)); CHKERRQ(MatSetFromOptions(C)); CHKERRQ(MatSetUp(C)); CHKERRQ(MatGetOwnershipRange(C,&rstart,&rend)); CHKERRQ(VecCreate(PETSC_COMM_WORLD,&x)); CHKERRQ(VecSetSizes(x,PETSC_DECIDE,m)); CHKERRQ(VecSetFromOptions(x)); CHKERRQ(VecDuplicate(x,&z)); CHKERRQ(VecDuplicate(x,&w)); CHKERRQ(VecCreate(PETSC_COMM_WORLD,&y)); CHKERRQ(VecSetSizes(y,PETSC_DECIDE,n)); CHKERRQ(VecSetFromOptions(y)); CHKERRQ(VecDuplicate(y,&u)); CHKERRQ(VecDuplicate(y,&s)); CHKERRQ(VecGetOwnershipRange(y,&vstart,&vend)); /* Assembly */ for (i=rstart; i tol) { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Norm of error difference = %g\n",(double)norm)); } /* ------- Test MatMultTranspose(), MatMultTransposeAdd() ------- */ for (i=rstart; i tol) { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Norm of error difference = %g\n",(double)norm)); } /* -------------------- Test MatGetDiagonal() ------------------ */ CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"testing MatGetDiagonal(), MatDiagonalScale()\n")); CHKERRQ(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); CHKERRQ(VecSet(x,one)); CHKERRQ(MatGetDiagonal(C,x)); CHKERRQ(VecView(x,PETSC_VIEWER_STDOUT_WORLD)); for (i=vstart; i