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