Actual source code: ex126f.F90
1: !
2: ! This program is modified from a user's contribution.
3: ! It illustrates how to PetscCallA(MUMPS's LU solver
4: !
5: #include <petsc/finclude/petscmat.h>
6: program main
7: use petscmat
8: implicit none
10: Vec x, b, u
11: Mat A, fact
12: PetscInt i, j, II, JJ, m
13: PetscInt Istart, Iend
14: PetscInt ione, ifive
15: PetscBool wmumps
16: PetscBool flg
17: PetscScalar one, v
18: IS perm, iperm
19: PetscErrorCode ierr
20: MatFactorInfo info
22: PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
23: m = 10
24: one = 1.0
25: ione = 1
26: ifive = 5
28: wmumps = PETSC_FALSE
30: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-m', m, flg, ierr))
31: PetscCallA(PetscOptionsGetBool(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-use_mumps', wmumps, flg, ierr))
33: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
34: PetscCallA(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m*m, m*m, ierr))
35: PetscCallA(MatSetType(A, MATAIJ, ierr))
36: PetscCallA(MatSetFromOptions(A, ierr))
37: PetscCallA(MatSeqAIJSetPreallocation(A, ifive, PETSC_NULL_INTEGER_ARRAY, ierr))
38: PetscCallA(MatMPIAIJSetPreallocation(A, ifive, PETSC_NULL_INTEGER_ARRAY, ifive, PETSC_NULL_INTEGER_ARRAY, ierr))
40: PetscCallA(MatGetOwnershipRange(A, Istart, Iend, ierr))
42: do II = Istart, Iend - 1
43: v = -1.0
44: i = II/m
45: j = II - i*m
46: if (i > 0) then
47: JJ = II - m
48: PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
49: end if
50: if (i < m - 1) then
51: JJ = II + m
52: PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
53: end if
54: if (j > 0) then
55: JJ = II - 1
56: PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
57: end if
58: if (j < m - 1) then
59: JJ = II + 1
60: PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
61: end if
62: v = 4.0
63: PetscCallA(MatSetValues(A, ione, [II], ione, [II], [v], INSERT_VALUES, ierr))
64: end do
66: PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
67: PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
69: PetscCallA(VecCreate(PETSC_COMM_WORLD, u, ierr))
70: PetscCallA(VecSetSizes(u, PETSC_DECIDE, m*m, ierr))
71: PetscCallA(VecSetFromOptions(u, ierr))
72: PetscCallA(VecDuplicate(u, b, ierr))
73: PetscCallA(VecDuplicate(b, x, ierr))
74: PetscCallA(VecSet(u, one, ierr))
75: PetscCallA(MatMult(A, u, b, ierr))
77: PetscCallA(MatFactorInfoInitialize(info, ierr))
78: PetscCallA(MatGetOrdering(A, MATORDERINGNATURAL, perm, iperm, ierr))
79: if (wmumps) then
80: write (*, *) 'use MUMPS LU...'
81: PetscCallA(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_LU, fact, ierr))
82: else
83: write (*, *) 'use PETSc LU...'
84: PetscCallA(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_LU, fact, ierr))
85: end if
86: PetscCallA(MatLUFactorSymbolic(fact, A, perm, iperm, info, ierr))
87: PetscCallA(ISDestroy(perm, ierr))
88: PetscCallA(ISDestroy(iperm, ierr))
90: PetscCallA(MatLUFactorNumeric(fact, A, info, ierr))
91: PetscCallA(MatSolve(fact, b, x, ierr))
92: PetscCallA(MatDestroy(fact, ierr))
94: PetscCallA(MatDestroy(A, ierr))
95: PetscCallA(VecDestroy(u, ierr))
96: PetscCallA(VecDestroy(x, ierr))
97: PetscCallA(VecDestroy(b, ierr))
99: PetscCallA(PetscFinalize(ierr))
100: end
102: !/*TEST
103: !
104: ! test:
105: !
106: ! test:
107: ! suffix: 2
108: ! args: -use_mumps
109: ! requires: mumps
110: !
111: !TEST*/