Actual source code: ex185.c
petsc-3.12.0 2019-09-29
1: static char help[] = "Tests MatCreateConstantDiagonal().\n"
2: "\n";
4: #include <petscmat.h>
6: /*T
7: Concepts: Mat
8: T*/
10: int main(int argc, char **args)
11: {
13: Vec X, Y;
14: Mat A,Af;
15: PetscReal xnorm,ynorm;
17: PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
19: MatCreateConstantDiagonal(PETSC_COMM_WORLD,PETSC_DETERMINE,PETSC_DETERMINE,20,20,3.0,&A);
20: MatCreateVecs(A,&X,&Y);
21: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
23: VecSetRandom(X,NULL);
24: VecNorm(X,NORM_2,&xnorm);
25: MatMult(A,X,Y);
26: VecNorm(Y,NORM_2,&ynorm);
27: if (PetscAbsReal(ynorm - 3*xnorm) > PETSC_SMALL) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Expected norm %g actual norm %g\n",(double)3*xnorm,(double)ynorm);
28: MatShift(A,5.0);
29: MatScale(A,.5);
30: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
31: MatGetDiagonal(A,Y);
33: MatGetFactor(A,MATSOLVERPETSC,MAT_FACTOR_LU,&Af);
34: MatLUFactorSymbolic(Af,A,NULL,NULL,NULL);
35: MatLUFactorNumeric(Af,A,NULL);
36: MatSolve(Af,X,Y);
37: VecNorm(Y,NORM_2,&ynorm);
38: if (PetscAbsReal(ynorm - xnorm/4) > PETSC_SMALL) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Expected norm %g actual norm %g\n",(double).25*xnorm,(double)ynorm);
40: MatDestroy(&A);
41: MatDestroy(&Af);
42: VecDestroy(&X);
43: VecDestroy(&Y);
45: PetscFinalize();
46: return ierr;
47: }
49: /*TEST
51: test:
52: nsize: 2
54: TEST*/