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: !

  6: program main
  7: #include <petsc/finclude/petscmat.h>
  8:   use petscmat
  9:   implicit none

 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:   MatFactorInfo info

 23:   PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
 24:   m = 10
 25:   one = 1.0
 26:   ione = 1
 27:   ifive = 5

 29:   wmumps = PETSC_FALSE

 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))

 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_ARRAY, ierr))
 39:   PetscCallA(MatMPIAIJSetPreallocation(A, ifive, PETSC_NULL_INTEGER_ARRAY, ifive, PETSC_NULL_INTEGER_ARRAY, ierr))

 41:   PetscCallA(MatGetOwnershipRange(A, Istart, Iend, ierr))

 43:   do 10, II = Istart, Iend - 1
 44:     v = -1.0
 45:     i = II/m
 46:     j = II - i*m
 47:     if (i > 0) then
 48:       JJ = II - m
 49:       PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
 50:     end if
 51:     if (i < m - 1) then
 52:       JJ = II + m
 53:       PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
 54:     end if
 55:     if (j > 0) then
 56:       JJ = II - 1
 57:       PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
 58:     end if
 59:     if (j < m - 1) then
 60:       JJ = II + 1
 61:       PetscCallA(MatSetValues(A, ione, [II], ione, [JJ], [v], INSERT_VALUES, ierr))
 62:     end if
 63:     v = 4.0
 64:     PetscCallA(MatSetValues(A, ione, [II], ione, [II], [v], INSERT_VALUES, ierr))
 65: 10  continue

 67:     PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
 68:     PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))

 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))

 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:     end if
 87:     PetscCallA(MatLUFactorSymbolic(fact, A, perm, iperm, info, ierr))
 88:     PetscCallA(ISDestroy(perm, ierr))
 89:     PetscCallA(ISDestroy(iperm, ierr))

 91:     PetscCallA(MatLUFactorNumeric(fact, A, info, ierr))
 92:     PetscCallA(MatSolve(fact, b, x, ierr))
 93:     PetscCallA(MatDestroy(fact, ierr))

 95:     PetscCallA(MatDestroy(A, ierr))
 96:     PetscCallA(VecDestroy(u, ierr))
 97:     PetscCallA(VecDestroy(x, ierr))
 98:     PetscCallA(VecDestroy(b, ierr))

100:     PetscCallA(PetscFinalize(ierr))
101:   end

103: !/*TEST
104: !
105: !   test:
106: !
107: !   test:
108: !     suffix: 2
109: !     args: -use_mumps
110: !     requires: mumps
111: !
112: !TEST*/