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; 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; PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); n = m; PetscCall(PetscOptionsHasName(NULL,NULL,"-rectA",&flg)); if (flg) n += 2; PetscCall(PetscOptionsHasName(NULL,NULL,"-rectB",&flg)); if (flg) n -= 2; /* ---------- Assemble matrix and vectors ----------- */ PetscCall(MatCreate(PETSC_COMM_WORLD,&C)); PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m,n)); PetscCall(MatSetFromOptions(C)); PetscCall(MatSetUp(C)); PetscCall(MatGetOwnershipRange(C,&rstart,&rend)); PetscCall(VecCreate(PETSC_COMM_WORLD,&x)); PetscCall(VecSetSizes(x,PETSC_DECIDE,m)); PetscCall(VecSetFromOptions(x)); PetscCall(VecDuplicate(x,&z)); PetscCall(VecDuplicate(x,&w)); PetscCall(VecCreate(PETSC_COMM_WORLD,&y)); PetscCall(VecSetSizes(y,PETSC_DECIDE,n)); PetscCall(VecSetFromOptions(y)); PetscCall(VecDuplicate(y,&u)); PetscCall(VecDuplicate(y,&s)); PetscCall(VecGetOwnershipRange(y,&vstart,&vend)); /* Assembly */ for (i=rstart; i tol) { PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Norm of error difference = %g\n",(double)norm)); } /* ------- Test MatMultTranspose(), MatMultTransposeAdd() ------- */ for (i=rstart; i tol) { PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Norm of error difference = %g\n",(double)norm)); } /* -------------------- Test MatGetDiagonal() ------------------ */ PetscCall(PetscPrintf(PETSC_COMM_WORLD,"testing MatGetDiagonal(), MatDiagonalScale()\n")); PetscCall(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(VecSet(x,one)); PetscCall(MatGetDiagonal(C,x)); PetscCall(VecView(x,PETSC_VIEWER_STDOUT_WORLD)); for (i=vstart; i