xref: /petsc/src/mat/tests/ex126f.F90 (revision 9b88ac225e01f016352a5f4cd90e158abe5f5675)
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#include <petsc/finclude/petscmat.h>
6c5e229c2SMartin Diehlprogram main
7d8606c27SBarry Smith  use petscmat
8d8606c27SBarry Smith  implicit none
9d8606c27SBarry Smith
10d8606c27SBarry Smith  Vec x, b, u
11d8606c27SBarry Smith  Mat A, fact
12d8606c27SBarry Smith  PetscInt i, j, II, JJ, m
13d8606c27SBarry Smith  PetscInt Istart, Iend
14d8606c27SBarry Smith  PetscInt ione, ifive
15d8606c27SBarry Smith  PetscBool wmumps
16d8606c27SBarry Smith  PetscBool flg
17d8606c27SBarry Smith  PetscScalar one, v
18d8606c27SBarry Smith  IS perm, iperm
19d8606c27SBarry Smith  PetscErrorCode ierr
20ce78bad3SBarry Smith  MatFactorInfo info
21d8606c27SBarry Smith
22d8606c27SBarry Smith  PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
23d8606c27SBarry Smith  m = 10
24d8606c27SBarry Smith  one = 1.0
25d8606c27SBarry Smith  ione = 1
26d8606c27SBarry Smith  ifive = 5
27d8606c27SBarry Smith
28d8606c27SBarry Smith  wmumps = PETSC_FALSE
29d8606c27SBarry Smith
30d8606c27SBarry Smith  PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-m', m, flg, ierr))
31d8606c27SBarry Smith  PetscCallA(PetscOptionsGetBool(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-use_mumps', wmumps, flg, ierr))
32d8606c27SBarry Smith
33d8606c27SBarry Smith  PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
34d8606c27SBarry Smith  PetscCallA(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m*m, m*m, ierr))
35d8606c27SBarry Smith  PetscCallA(MatSetType(A, MATAIJ, ierr))
36d8606c27SBarry Smith  PetscCallA(MatSetFromOptions(A, ierr))
375d83a8b1SBarry Smith  PetscCallA(MatSeqAIJSetPreallocation(A, ifive, PETSC_NULL_INTEGER_ARRAY, ierr))
385d83a8b1SBarry Smith  PetscCallA(MatMPIAIJSetPreallocation(A, ifive, PETSC_NULL_INTEGER_ARRAY, ifive, PETSC_NULL_INTEGER_ARRAY, ierr))
39d8606c27SBarry Smith
40d8606c27SBarry Smith  PetscCallA(MatGetOwnershipRange(A, Istart, Iend, ierr))
41d8606c27SBarry Smith
42*ceeae6b5SMartin Diehl  do II = Istart, Iend - 1
43d8606c27SBarry Smith    v = -1.0
44d8606c27SBarry Smith    i = II/m
45d8606c27SBarry Smith    j = II - i*m
464820e4eaSBarry Smith    if (i > 0) then
47d8606c27SBarry Smith      JJ = II - m
485d83a8b1SBarry Smith      PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
49d8606c27SBarry Smith    end if
504820e4eaSBarry Smith    if (i < m - 1) then
51d8606c27SBarry Smith      JJ = II + m
525d83a8b1SBarry Smith      PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
53d8606c27SBarry Smith    end if
544820e4eaSBarry Smith    if (j > 0) then
55d8606c27SBarry Smith      JJ = II - 1
565d83a8b1SBarry Smith      PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
57d8606c27SBarry Smith    end if
584820e4eaSBarry Smith    if (j < m - 1) then
59d8606c27SBarry Smith      JJ = II + 1
605d83a8b1SBarry Smith      PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
61d8606c27SBarry Smith    end if
62d8606c27SBarry Smith    v = 4.0
635d83a8b1SBarry Smith    PetscCallA(MatSetValues(A, ione, [II], ione, [II], [v], INSERT_VALUES, ierr))
64*ceeae6b5SMartin Diehl  end do
65d8606c27SBarry Smith
66d8606c27SBarry Smith  PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
67d8606c27SBarry Smith  PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
68d8606c27SBarry Smith
69d8606c27SBarry Smith  PetscCallA(VecCreate(PETSC_COMM_WORLD, u, ierr))
70d8606c27SBarry Smith  PetscCallA(VecSetSizes(u, PETSC_DECIDE, m*m, ierr))
71d8606c27SBarry Smith  PetscCallA(VecSetFromOptions(u, ierr))
72d8606c27SBarry Smith  PetscCallA(VecDuplicate(u, b, ierr))
73d8606c27SBarry Smith  PetscCallA(VecDuplicate(b, x, ierr))
74d8606c27SBarry Smith  PetscCallA(VecSet(u, one, ierr))
75d8606c27SBarry Smith  PetscCallA(MatMult(A, u, b, ierr))
76d8606c27SBarry Smith
77d8606c27SBarry Smith  PetscCallA(MatFactorInfoInitialize(info, ierr))
78d8606c27SBarry Smith  PetscCallA(MatGetOrdering(A, MATORDERINGNATURAL, perm, iperm, ierr))
79d8606c27SBarry Smith  if (wmumps) then
80d8606c27SBarry Smith    write (*, *) 'use MUMPS LU...'
81d8606c27SBarry Smith    PetscCallA(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_LU, fact, ierr))
82d8606c27SBarry Smith  else
83d8606c27SBarry Smith    write (*, *) 'use PETSc LU...'
84d8606c27SBarry Smith    PetscCallA(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_LU, fact, ierr))
85d8606c27SBarry Smith  end if
86d8606c27SBarry Smith  PetscCallA(MatLUFactorSymbolic(fact, A, perm, iperm, info, ierr))
87d8606c27SBarry Smith  PetscCallA(ISDestroy(perm, ierr))
88d8606c27SBarry Smith  PetscCallA(ISDestroy(iperm, ierr))
89d8606c27SBarry Smith
90d8606c27SBarry Smith  PetscCallA(MatLUFactorNumeric(fact, A, info, ierr))
91d8606c27SBarry Smith  PetscCallA(MatSolve(fact, b, x, ierr))
92d8606c27SBarry Smith  PetscCallA(MatDestroy(fact, ierr))
93d8606c27SBarry Smith
94d8606c27SBarry Smith  PetscCallA(MatDestroy(A, ierr))
95d8606c27SBarry Smith  PetscCallA(VecDestroy(u, ierr))
96d8606c27SBarry Smith  PetscCallA(VecDestroy(x, ierr))
97d8606c27SBarry Smith  PetscCallA(VecDestroy(b, ierr))
98d8606c27SBarry Smith
99d8606c27SBarry Smith  PetscCallA(PetscFinalize(ierr))
100d8606c27SBarry Smithend
101d8606c27SBarry Smith
102d8606c27SBarry Smith!/*TEST
103d8606c27SBarry Smith!
104d8606c27SBarry Smith!   test:
105d8606c27SBarry Smith!
106d8606c27SBarry Smith!   test:
107d8606c27SBarry Smith!     suffix: 2
108d8606c27SBarry Smith!     args: -use_mumps
109d8606c27SBarry Smith!     requires: mumps
110d8606c27SBarry Smith!
111d8606c27SBarry Smith!TEST*/
112