The TELEMAC-MASCARET system  trunk
trid3d.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE trid3d
3 ! *****************
4 !
5  &(xaux,x,b,npoin,npoin2)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLVES TRIDIAGONAL SYSTEMS FOR EVERY VERTICAL
12 !+ IN A MESH OF PRISMS.
13 !
14 !history J-M HERVOUET (LNHE)
15 !+ 30/09/05
16 !+ V5P6
17 !+
18 !
19 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
20 !+ 13/07/2010
21 !+ V6P0
22 !+ Translation of French comments within the FORTRAN sources into
23 !+ English comments
24 !
25 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
26 !+ 21/08/2010
27 !+ V6P0
28 !+ Creation of DOXYGEN tags for automated documentation and
29 !+ cross-referencing of the FORTRAN sources
30 !
31 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 !| B |-->| RIGHT-HAND SIDE OF SYSTEM
33 !| NPOIN |-->| NUMBER OF POINTS
34 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D
35 !| X |<--| SOLUTION OF SYSTEM
36 !| XAUX |-->| TRI-DIAGONAL MATRIX
37 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38 !
39  USE bief, ex_trid3d => trid3d
40 !
42  IMPLICIT NONE
43 !
44 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 !
46  INTEGER, INTENT(IN) :: NPOIN,NPOIN2
47 !
48  DOUBLE PRECISION, INTENT(IN) :: B(npoin2,*)
49  DOUBLE PRECISION, INTENT(INOUT) :: XAUX(npoin,*),X(npoin2,*)
50 !
51 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 !
53  INTEGER I,IPLAN,I3D,NPLAN
54  DOUBLE PRECISION EPS
55 !
56  INTRINSIC abs
57 !
58 !-----------------------------------------------------------------------
59 !
60 ! XAUX(I,1) IS COEFFICIENT OF POINT BELOW I IN EQUATION OF POINT I
61 ! XAUX(I,2) IS THE DIAGONAL
62 ! XAUX(I,3) IS COEFFICIENT OF POINT ABOVE I IN EQUATION OF POINT I
63 !
64 ! XAUX(I,4) HERE USED AS WORKING ARRAY
65 ! XAUX(I,5) HERE USED AS WORKING ARRAY
66 !
67 !-----------------------------------------------------------------------
68 !
69  nplan=npoin/npoin2
70  eps=1.d-8
71 !
72 !-----------------------------------------------------------------------
73 !
74 ! BASIC ALGORITHM TAKEN IN "NUMERICAL RECIPES" PAGE 40 AND ADAPTED
75 ! TO STORAGE
76 !
77 ! XAUX(*,4) : WORKING ARRAY (SIZE NPOIN2)
78 ! XAUX(*,5) : WORKING ARRAY (SIZE NPOIN)
79 !
80  DO i=1,npoin2
81  xaux(i,4)=xaux(i,2)
82  IF(abs(xaux(i,4)).LT.eps) THEN
83  WRITE(lu,*) 'TRID3D: SYSTEM ILL-DEFINED'
84  CALL plante(1)
85  stop
86  ENDIF
87  x(i,1)=b(i,1)/xaux(i,4)
88  ENDDO
89 !
90  DO iplan=2,nplan
91  DO i=1,npoin2
92  i3d=i+npoin2*(iplan-1)
93  xaux(i3d,5)=xaux(i3d-npoin2,3)/xaux(i,4)
94  xaux(i,4)=xaux(i3d,2)-xaux(i3d,1)*xaux(i3d,5)
95  IF(abs(xaux(i,4)).LT.eps) THEN
96  WRITE(lu,*) 'TRID3D: SYSTEM ILL-DEFINED'
97  WRITE(lu,*) ' PRECONDITIONING 17 IMPOSSIBLE'
98  CALL plante(1)
99  stop
100  ENDIF
101  x(i,iplan)=(b(i,iplan)-xaux(i3d,1)*x(i,iplan-1))/xaux(i,4)
102  ENDDO
103  ENDDO
104 !
105  DO iplan=nplan-1,1,-1
106  DO i=1,npoin2
107  i3d=i+npoin2*iplan ! PLAN TO THE TOP
108  x(i,iplan)=x(i,iplan)-xaux(i3d,5)*x(i,iplan+1)
109  ENDDO
110  ENDDO
111 !
112 !-----------------------------------------------------------------------
113 !
114  RETURN
115  END
subroutine trid3d(XAUX, X, B, NPOIN, NPOIN2)
Definition: trid3d.f:7
Definition: bief.f:3