static char help[] = "Tests MatNorm(), MatLUFactor(), MatSolve() and MatSolveAdd().\n\n"; #include int main(int argc,char **args) { Mat C; PetscInt i,j,m = 3,n = 3,Ii,J; PetscErrorCode ierr; PetscBool flg; PetscScalar v; IS perm,iperm; Vec x,u,b,y; PetscReal norm,tol=PETSC_SMALL; MatFactorInfo info; PetscMPIInt size; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); PetscCheckFalse(size != 1,PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"This is a uniprocessor example only!"); CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C)); CHKERRQ(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); CHKERRQ(MatSetFromOptions(C)); CHKERRQ(MatSetUp(C)); CHKERRQ(PetscOptionsHasName(NULL,NULL,"-symmetric",&flg)); if (flg) { /* Treat matrix as symmetric only if we set this flag */ CHKERRQ(MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE)); CHKERRQ(MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE)); } /* Create the matrix for the five point stencil, YET AGAIN */ for (i=0; i0) {J = Ii - n; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES));} if (i0) {J = Ii - 1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES));} if (j tol) { CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"MatSolve: Norm of error %g\n",(double)norm)); } /* Test MatSolveAdd */ CHKERRQ(MatSolveAdd(C,b,y,x)); CHKERRQ(VecAXPY(x,-1.0,y)); CHKERRQ(VecAXPY(x,-1.0,u)); CHKERRQ(VecNorm(x,NORM_2,&norm)); if (norm > tol) { CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"MatSolveAdd(): Norm of error %g\n",(double)norm)); } CHKERRQ(ISDestroy(&perm)); CHKERRQ(ISDestroy(&iperm)); CHKERRQ(VecDestroy(&u)); CHKERRQ(VecDestroy(&y)); CHKERRQ(VecDestroy(&b)); CHKERRQ(VecDestroy(&x)); CHKERRQ(MatDestroy(&C)); ierr = PetscFinalize(); return ierr; } /*TEST test: TEST*/