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