Actual source code: ex52f.F90
1: !
2: #include <petsc/finclude/petscksp.h>
3: program main
4: use petscksp
5: implicit none
6: !
7: ! Demonstrates using MatFactorGetError() and MatFactorGetErrorZeroPivot()
8: !
10: PetscErrorCode ierr
11: PetscInt, parameter :: m = 2, n = 2
12: PetscInt row, col
13: Vec x, b
14: Mat A, F
15: KSP ksp
16: PetscScalar, parameter :: two = 2.0, zero = 0.0
17: KSPConvergedReason reason
18: PCFailedReason pcreason
19: PC pc
20: MatFactorError ferr
21: PetscReal pivot
23: PetscCallA(PetscInitialize(ierr))
24: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
25: PetscCallA(MatSetSizes(A, m, n, m, n, ierr))
26: PetscCallA(MatSetType(A, MATSEQAIJ, ierr))
27: PetscCallA(MatSetUp(A, ierr))
28: row = 0
29: col = 0
30: PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, [row], 1_PETSC_INT_KIND, [col], [two], INSERT_VALUES, ierr))
31: row = 1
32: col = 1
33: PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, [row], 1_PETSC_INT_KIND, [col], [zero], INSERT_VALUES, ierr))
34: PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
35: PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
37: PetscCallA(VecCreate(PETSC_COMM_WORLD, b, ierr))
38: PetscCallA(VecSetSizes(b, m, m, ierr))
39: PetscCallA(VecSetType(b, VECSEQ, ierr))
41: ! Set up solution
42: PetscCallA(VecDuplicate(b, x, ierr))
44: ! Solve system
45: PetscCallA(KSPCreate(PETSC_COMM_WORLD, ksp, ierr))
46: PetscCallA(KSPSetOperators(ksp, A, A, ierr))
47: PetscCallA(KSPSetFromOptions(ksp, ierr))
48: PetscCallA(KSPSolve(ksp, b, x, ierr))
49: PetscCallA(KSPGetConvergedReason(ksp, reason, ierr))
50: PetscCallA(KSPGetPC(ksp, pc, ierr))
51: PetscCallA(PCGetFailedReason(pc, pcreason, ierr))
52: PetscCallA(PCFactorGetMatrix(pc, F, ierr))
53: PetscCallA(MatFactorGetError(F, ferr, ierr))
54: PetscCallA(MatFactorGetErrorZeroPivot(F, pivot, row, ierr))
55: write (6, 101) ferr, pivot, row
56: 101 format('MatFactorError ', i4, ' Pivot value ', 1pe9.2, ' row ', i4)
58: ! Cleanup
59: PetscCallA(KSPDestroy(ksp, ierr))
60: PetscCallA(VecDestroy(b, ierr))
61: PetscCallA(VecDestroy(x, ierr))
62: PetscCallA(MatDestroy(A, ierr))
64: PetscCallA(PetscFinalize(ierr))
65: end
67: ! Nag compiler automatically turns on catching of floating point exceptions and prints message at
68: ! end of run about the exceptions seen
69: !
70: !/*TEST
71: !
72: ! test:
73: ! args: -fp_trap 0
74: ! filter: grep -v "Warning: Floating"
75: !
76: !TEST*/