xref: /petsc/src/mat/impls/aij/seq/ftn-kernels/fsolve.F90 (revision 7e1a0bbe36d2be40a00a95404ece00db4857f70d)
1!
2!
3!    Fortran kernel for sparse triangular solve in the AIJ matrix format
4! This ONLY works for factorizations in the NATURAL ORDERING, i.e.
5! with MatSolve_SeqAIJ_NaturalOrdering()
6!
7#include <petsc/finclude/petscsys.h>
8!
9pure subroutine FortranSolveAIJ(n, x, ai, aj, adiag, aa, b)
10  use, intrinsic :: ISO_C_binding
11  implicit none(type, external)
12  PetscScalar, intent(in) :: aa(0:*), b(0:*)
13  PetscInt, intent(in) :: n, ai(0:*), aj(0:*), adiag(0:*)
14  PetscScalar, intent(inout) :: x(0:*)
15
16  PetscInt i, jstart, jend
17  !
18  ! Forward Solve
19  !
20  x(0) = b(0)
21  do i = 1, n - 1
22    jstart = ai(i)
23    jend = adiag(i) - 1
24    x(i) = b(i) - sum(aa(jstart:jend)*x(aj(jstart:jend)))
25  end do
26  !
27  ! Backward solve the upper triangular
28  !
29  do i = n - 1, 0, -1
30    jstart = adiag(i) + 1
31    jend = ai(i + 1) - 1
32    x(i) = x(i) - sum(aa(jstart:jend)*x(aj(jstart:jend)))*aa(adiag(i))
33  end do
34end subroutine FortranSolveAIJ
35