xref: /petsc/src/mat/impls/aij/seq/ftn-kernels/fsolve.F90 (revision ce8e69c20f969a62c59a6779888aebb0764bdb1f)
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      subroutine FortranSolveAIJ(n,x,ai,aj,adiag,aa,b)
10      implicit none
11      PetscScalar x(0:*),aa(0:*),b(0:*)
12      PetscInt n,ai(0:*)
13      PetscInt aj(0:*),adiag(0:*)
14
15      PetscInt i,j,jstart,jend
16      PetscScalar sum
17!
18!     Forward Solve
19!
20      x(0) = b(0)
21      do 20 i=1,n-1
22         jstart = ai(i)
23         jend   = adiag(i) - 1
24         sum    = b(i)
25         do 30 j=jstart,jend
26            sum  = sum -  aa(j) * x(aj(j))
27 30      continue
28         x(i) = sum
29 20   continue
30
31!
32!     Backward solve the upper triangular
33!
34      do 40 i=n-1,0,-1
35         jstart  = adiag(i) + 1
36         jend    = ai(i+1) - 1
37         sum     = x(i)
38         do 50 j=jstart,jend
39            sum = sum - aa(j)* x(aj(j))
40 50      continue
41         x(i)    = sum * aa(adiag(i))
42 40   continue
43      return
44      end
45