Statistics
| Branch: | Revision:

root / synthbench / euroben-dm / mod2b / .svn / text-base / getrs.f.svn-base @ 0:839f52ef7657

History | View | Annotate | Download (1.9 kB)

1
      Subroutine getrs( m, n, a, lda, ipiv, b, info )
2
! -----------------------------------------------------------------------
3
      Use        numerics
4
      Use        dist_module
5
      Implicit   None
6
      Include    'mpif.h'
7

    
8
      Integer  :: m, n, lda  ! Dimension of factorization
9
      Integer  :: info       ! Result parameter (always zero)
10
      Integer  :: ipiv(*)    ! Pivot indices
11
      Real(l_) :: a(lda,*)   ! Factorization
12
      Real(l_) :: b(*)       ! Input vector, overwritten by solution
13
      Logical  :: send
14
      Integer  :: i, j, k    ! Counters
15
      Integer  :: comm, ierr
16
! -----------------------------------------------------------------------
17
      info = 0
18
      comm = MPI_Comm_World
19

    
20
      Call laswp( 1, b, m, 1, m, ipiv, 1 )
21

    
22
      Do i = 1, m                                     ! --- Solve L*Y = X
23
         If ( me == owner(i) ) Then
24
            If ( b(i) /= 0.0_l_ ) Then
25
               j = localindex(i)
26
               Do k = i+1, m
27
                  b(k) = b(k) - a(k,j)*b(i)
28
               End Do
29
            End If
30
         End If
31
         If ( i /= m ) Then
32
            Send = ( owner(i+1) /= owner(i) )
33
         Else
34
            Send = .TRUE.
35
         End If
36
         If ( Send )
37
     &      Call MPI_Bcast( b, m, MPI_Real8, owner(i), comm, ierr )
38
      End Do
39

    
40
      Do i = m, 1, -1                                 ! --- Solve U*Z = Y
41
         If ( me == owner(i) ) Then
42
            If ( b(i) /= 0.0_l_ ) Then
43
               j = localindex(i)
44
               b(i) = b(i)/a(i,j)
45
               Do k = 1, i-1
46
                  b(k) = b(k) - a(k,j)*b(i)
47
               End Do
48
            End If
49
         End If
50
         If ( i /= 1 ) Then
51
            Send = ( owner(i-1) /= owner(i) )
52
         Else
53
            Send = .TRUE.
54
         End If
55
         If (Send)
56
     &      Call MPI_BCast( b, m, MPI_Real8, owner(i), comm, ierr)
57
      End Do
58
! -----------------------------------------------------------------------
59
      End Subroutine getrs