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