The TELEMAC-MASCARET system  trunk
preverebe.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE preverebe
3 ! ********************
4 !
5  &(xaux,ax,typdia,typext,ikle,npoin,nelem,nelmax,mesh,typemesh)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief BUILDS TRIDIAGONAL SYSTEMS FOR EVERY VERTICAL,
12 !+ BY LUMPING A MATRIX DEFINED ON PRISMS.
13 !
14 !warning THE JACOBIAN MUST BE POSITIVE
15 !
16 !history J-M HERVOUET (LNHE)
17 !+ 02/06/08
18 !+ V5P9
19 !+
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 !| AX |-->| MATRIX OFF-DIAGONAL TERMS
35 !| IKLE |-->| CONNECTIVITY TABLE.
36 !| MESH |-->| MESH STRUCTURE
37 !| NELEM |-->| NUMBER OF ELEMENTS
38 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
39 !| NPOIN |-->| NUMBER OF POINTS
40 !| TYPDIA |-->| TYPE OF DIAGONAL:
41 !| | | TYPDIA = 'Q' : ANY VALUE
42 !| | | TYPDIA = 'I' : IDENTITY
43 !| | | TYPDIA = '0' : ZERO
44 !| TYPEXT |-->| TYPE OF OFF-DIAGONAL TERMS
45 !| | | TYPEXT = 'Q' : ANY VALUE
46 !| | | TYPEXT = 'S' : SYMMETRIC
47 !| | | TYPEXT = '0' : ZERO
48 !| TYPEMESH |-->| TYPE OF MESH (40: PRISMS, 50: PRISMS CUT INTO
49 !| | | TETRAHEDRONS)
50 !| XAUX |<--| TRIDIAGONAL MATRIX
51 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52 !
53  USE bief, ex_preverebe => preverebe
54 !
56  IMPLICIT NONE
57 !
58 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 !
60  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPOIN,TYPEMESH
61  INTEGER, INTENT(IN) :: IKLE(nelmax,6)
62 !
63  DOUBLE PRECISION, INTENT(IN) :: AX(nelmax,*)
64  DOUBLE PRECISION, INTENT(INOUT) :: XAUX(npoin,*)
65 !
66  CHARACTER(LEN=1), INTENT(IN) :: TYPDIA,TYPEXT
67 !
68  TYPE(bief_mesh), INTENT(INOUT) :: MESH
69 !
70 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 !
72  INTEGER I1,I2,I3,I4,I5,I6,IELEM,NPLAN,IAN,ICOM,NPOIN2
73 !
74 !-----------------------------------------------------------------------
75 !
76 ! HERE WE CONSIDER THAT NPOIN < NELMAX TO USE XAUX AS XAUX(NPOIN,3)
77 !
78 ! XAUX(I,1) IS COEFFICIENT OF POINT BELOW I IN EQUATION OF POINT I
79 ! XAUX(I,2) IS THE DIAGONAL
80 ! XAUX(I,3) IS COEFFICIENT OF POINT ABOVE I IN EQUATION OF POINT I
81 !
82 !-----------------------------------------------------------------------
83 ! INITIALISES THE DIAGONAL AND OFF-DIAGONAL TERMS
84 !-----------------------------------------------------------------------
85 !
86 ! OFF-DIAGONAL
87 !
88  CALL ov('X=C ', x=xaux(1,1), c=0.d0, dim1=npoin)
89  CALL ov('X=C ', xaux(1,3), c=0.d0, dim1=npoin)
90 !
91 ! DIAGONAL
92 !
93  IF(typdia(1:1).EQ.'0') THEN
94  CALL ov('X=C ', x=xaux(1,2), c=0.d0, dim1=npoin)
95  ELSEIF(typdia(1:1).EQ.'I') THEN
96  CALL ov('X=C ', x=xaux(1,2), c=1.d0, dim1=npoin)
97  ELSEIF(typdia(1:1).EQ.'Q') THEN
98  CALL ov('X=Y ', x=xaux(1,2), c=0.d0, dim1=npoin)
99  ELSE
100  WRITE(lu,*) typdia
101  WRITE(lu,*) 'UNKNOWN TYPE OF DIAGONAL IN PREVEREBE'
102  CALL plante(1)
103  stop
104  ENDIF
105 !
106 !-----------------------------------------------------------------------
107 ! LUMPS THE OFF-DIAGONAL TERMS
108 !
109 ! ONLY VERTICAL OF POINT, LUMPING ALL TERMS HAS BEEN TESTED, SEE
110 ! LINE COMMENTED, BUT DOES NOT WORK (E.G. TRY SOLITARY WAVE)
111 !
112 !
113 !-----------------------------------------------------------------------
114 !
115  IF(typemesh.EQ.40) THEN
116 !
117  IF(typext.EQ.'Q') THEN
118  DO ielem=1,nelem
119  i1=ikle(ielem,1)
120  i2=ikle(ielem,2)
121  i3=ikle(ielem,3)
122  i4=ikle(ielem,4)
123  i5=ikle(ielem,5)
124  i6=ikle(ielem,6)
125  xaux(i1,3)=xaux(i1,3)+ax(ielem,03) ! TERM 1-4
126  xaux(i2,3)=xaux(i2,3)+ax(ielem,08) ! TERM 2-5
127  xaux(i3,3)=xaux(i3,3)+ax(ielem,12) ! TERM 3-6
128  xaux(i4,1)=xaux(i4,1)+ax(ielem,18) ! TERM 4-1
129  xaux(i5,1)=xaux(i5,1)+ax(ielem,23) ! TERM 5-2
130  xaux(i6,1)=xaux(i6,1)+ax(ielem,27) ! TERM 6-3
131  ENDDO
132  ELSEIF(typext.EQ.'S') THEN
133  DO ielem=1,nelem
134  i1=ikle(ielem,1)
135  i2=ikle(ielem,2)
136  i3=ikle(ielem,3)
137  i4=ikle(ielem,4)
138  i5=ikle(ielem,5)
139  i6=ikle(ielem,6)
140 ! XAUX(I1,2)=XAUX(I1,2)+AX(IELEM,01) ! TERM 1-2
141 ! XAUX(I2,2)=XAUX(I2,2)+AX(IELEM,01) ! TERM 2-1
142 ! XAUX(I1,2)=XAUX(I1,2)+AX(IELEM,02) ! TERM 1-3
143 ! XAUX(I2,2)=XAUX(I2,2)+AX(IELEM,02) ! TERM 3-1
144  xaux(i1,3)=xaux(i1,3)+ax(ielem,03) ! TERM 1-4
145  xaux(i4,1)=xaux(i4,1)+ax(ielem,03) ! TERM 4-1
146 ! XAUX(I1,3)=XAUX(I1,3)+AX(IELEM,04) ! TERM 1-5
147 ! XAUX(I5,1)=XAUX(I5,1)+AX(IELEM,04) ! TERM 5-1
148 ! XAUX(I1,3)=XAUX(I1,3)+AX(IELEM,05) ! TERM 1-6
149 ! XAUX(I6,1)=XAUX(I6,1)+AX(IELEM,05) ! TERM 6-1
150 ! XAUX(I2,2)=XAUX(I2,2)+AX(IELEM,06) ! TERM 2-3
151 ! XAUX(I3,2)=XAUX(I3,2)+AX(IELEM,06) ! TERM 3-2
152 ! XAUX(I2,3)=XAUX(I2,3)+AX(IELEM,07) ! TERM 2-4
153 ! XAUX(I4,1)=XAUX(I4,1)+AX(IELEM,07) ! TERM 4-2
154  xaux(i2,3)=xaux(i2,3)+ax(ielem,08) ! TERM 2-5
155  xaux(i5,1)=xaux(i5,1)+ax(ielem,08) ! TERM 5-2
156 ! XAUX(I2,3)=XAUX(I2,3)+AX(IELEM,09) ! TERM 2-6
157 ! XAUX(I6,1)=XAUX(I6,1)+AX(IELEM,09) ! TERM 6-2
158 ! XAUX(I3,3)=XAUX(I3,3)+AX(IELEM,10) ! TERM 3-4
159 ! XAUX(I4,1)=XAUX(I4,1)+AX(IELEM,10) ! TERM 4-3
160 ! XAUX(I3,3)=XAUX(I3,3)+AX(IELEM,11) ! TERM 3-5
161 ! XAUX(I5,1)=XAUX(I5,1)+AX(IELEM,11) ! TERM 5-3
162  xaux(i3,3)=xaux(i3,3)+ax(ielem,12) ! TERM 3-6
163  xaux(i6,1)=xaux(i6,1)+ax(ielem,12) ! TERM 6-3
164 ! XAUX(I4,2)=XAUX(I4,2)+AX(IELEM,13) ! TERM 4-5
165 ! XAUX(I5,2)=XAUX(I5,2)+AX(IELEM,13) ! TERM 5-4
166 ! XAUX(I4,2)=XAUX(I4,2)+AX(IELEM,14) ! TERM 4-6
167 ! XAUX(I6,2)=XAUX(I6,2)+AX(IELEM,14) ! TERM 6-4
168 ! XAUX(I5,2)=XAUX(I5,2)+AX(IELEM,15) ! TERM 5-6
169 ! XAUX(I6,2)=XAUX(I6,2)+AX(IELEM,15) ! TERM 6-5
170  ENDDO
171  ELSEIF(typext.EQ.'0') THEN
172 ! NOTHING TO DO (BUT WHAT'S THE USE OF AN ITERATIVE SOLVER ?)
173  ELSE
174  WRITE(lu,*) typext
175  WRITE(lu,*) 'UNKNOWN TYPE OF OFF-DIAGONAL TERMS'
176  WRITE(lu,*) 'IN PREVEREBE'
177  CALL plante(1)
178  stop
179  ENDIF
180 !
181  ELSE
182  WRITE(lu,*) typemesh
183  WRITE(lu,*) 'UNKNOWN TYPE OF MESH'
184  WRITE(lu,*) 'IN PREVEREBE: ',typemesh
185  CALL plante(1)
186  stop
187  ENDIF
188 !
189 !-----------------------------------------------------------------------
190 !
191 ! PARALLEL MODE
192 !
193  IF(ncsize.GT.1) THEN
194  ian = 3
195  icom = 2
196  npoin2 = bief_nbpts(11,mesh)
197  nplan=npoin/npoin2
198  CALL parcom2(xaux(1,1),xaux(1,2),xaux(1,3),
199  & npoin2,nplan,icom,ian,mesh)
200  ENDIF
201 !
202 !-----------------------------------------------------------------------
203 !
204  RETURN
205  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
integer function bief_nbpts(IELM, MESH)
Definition: bief_nbpts.f:7
subroutine preverebe(XAUX, AX, TYPDIA, TYPEXT, IKLE, NPOIN, NELEM, NELMAX, MESH, TYPEMESH)
Definition: preverebe.f:7
subroutine parcom2(X1, X2, X3, NPOIN, NPLAN, ICOM, IAN, MESH)
Definition: parcom2.f:7
Definition: bief.f:3