Actual source code: fsolve.F90

  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: !
  9: pure 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:*)

 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
 34: end subroutine FortranSolveAIJ