Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
gauss.F90
Go to the documentation of this file.
1 
4 
6 SUBROUTINE lu(A,N,NDIM,IR,IC)
7  use kinds, only : dp
8  implicit none
9  integer :: ndim, n, ir(*), ic(*)
10  real(DP) :: A(ndim,*)
11 
12  integer :: i, j, k, l, m, irl, icm, k1
13  real(DP) :: xmax, y, b, c
14 
15  DO i=1,n
16  ir(i)=i
17  ic(i)=i
18  END DO
19  k=1
20  l=k
21  m=k
22  xmax=abs(a(k,k))
23  DO i=k,n
24  DO j=k,n
25  y=abs(a(i,j))
26  IF(xmax >= y) cycle
27  xmax=y
28  l=i
29  m=j
30  END DO
31  enddo
32  DO k=1,n
33  irl=ir(l)
34  ir(l)=ir(k)
35  ir(k)=irl
36  icm=ic(m)
37  ic(m)=ic(k)
38  ic(k)=icm
39  IF(l /= k) then
40  DO j=1,n
41  b=a(k,j)
42  a(k,j)=a(l,j)
43  a(l,j)=b
44  END DO
45  endif
46  IF(m /= k) then
47  DO i=1,n
48  b=a(i,k)
49  a(i,k)=a(i,m)
50  a(i,m)=b
51  END DO
52  endif
53  c=1./a(k,k)
54  a(k,k)=c
55  IF(k == n) cycle
56  k1=k+1
57  xmax=abs(a(k1,k1))
58  l=k1
59  m=k1
60  DO i=k1,n
61  a(i,k)=c*a(i,k)
62  END DO
63  DO i=k1,n
64  b=a(i,k)
65  DO j=k1,n
66  a(i,j)=a(i,j)-b*a(k,j)
67  y=abs(a(i,j))
68  IF(xmax >= y) cycle
69  xmax=y
70  l=i
71  m=j
72  END DO
73  END DO
74  END DO
75  RETURN
76 END SUBROUTINE lu
77 
79 SUBROUTINE solve(F,A,K,N,NDIM,IR,IC)
80  use kinds, only : dp
81  implicit none
82 
83  integer :: n, k, ndim
84  real(DP) :: A(ndim,*),F(ndim,*)
85  integer :: IR(*),IC(*)
86 
87  real(DP) :: G(2000)
88 
89  integer :: n1, kk, i, iri, i1, j, it, ici
90  real(DP) :: B
91 
92  IF (n > 2000) THEN
93  write(6,*) 'Abort IN Subrtouine SOLVE: N>2000, N=',n
94  call exitt
95  ENDIF
96 
97  n1=n+1
98  DO 1000 kk=1,k
99  DO 100 i=1,n
100  iri=ir(i)
101  g(i)=f(iri,kk)
102  100 END DO
103  DO 400 i=2,n
104  i1=i-1
105  b=g(i)
106  DO 300 j=1,i1
107  b=b-a(i,j)*g(j)
108  300 END DO
109  g(i)=b
110  400 END DO
111  DO 700 it=1,n
112  i=n1-it
113  i1=i+1
114  b=g(i)
115  IF(i == n) goto 701
116  DO 600 j=i1,n
117  b=b-a(i,j)*g(j)
118  600 END DO
119  701 g(i)=b*a(i,i)
120  700 END DO
121  DO 900 i=1,n
122  ici=ic(i)
123  f(ici,kk)=g(i)
124  900 END DO
125  1000 END DO
126  RETURN
127 END SUBROUTINE solve
subroutine lu(A, N, NDIM, IR, IC)
the first subroutine to compute the matrix inverse
Definition: gauss.F90:6
void exitt()
Definition: comm_mpi.F90:411
subroutine solve(F, A, K, N, NDIM, IR, IC)
second part of the matrix inverse
Definition: gauss.F90:79