The TELEMAC-MASCARET system  trunk
gettriebe.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE gettriebe
3 ! ********************
4 !
5  &(xaux,ad,ax,teta,ikle,npoin,nelem,nelmax,mesh,ielm3,nelem2,nplan,
6  & knolg)
7 !
8 !***********************************************************************
9 ! BIEF V6P2 21/08/2010
10 !***********************************************************************
11 !
12 !brief GETS THE TRIDIAGONAL PART OF A DIFFUSION MATRIX ON
13 !+ PRISMS AND REMOVES IT FROM THE INITIAL MATRIX.
14 !code
15 !+ IF MTRI IS THIS TRIDIAGONAL PART, MAUX THE RESULT AND MDIF
16 !+ THE DIFFUSION MATRIX, THIS SUBROUTINE DOES:
17 !+
18 !+ MAUX = TETA * MTRI
19 !+ MDIF CHANGED INTO (1-TETA) * MDIF
20 !
21 !warning THE JACOBIAN MUST BE POSITIVE
22 !
23 !history J-M HERVOUET (LNHE)
24 !+ 13/08/08
25 !+ V5P9
26 !+
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 13/07/2010
30 !+ V6P0
31 !+ Translation of French comments within the FORTRAN sources into
32 !+ English comments
33 !
34 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
35 !+ 21/08/2010
36 !+ V6P0
37 !+ Creation of DOXYGEN tags for automated documentation and
38 !+ cross-referencing of the FORTRAN sources
39 !
40 !history J-M HERVOUET (LNHE)
41 !+ 29/11/2011
42 !+ V6P2
43 !+ Element 51 programmed, KNOLG added
44 !+
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !| AD |-->| DIAGONAL TERMS OF MATRIX
47 !| AX |-->| OFF-DIAGONAL TERMS OF MATRIX
48 !| IELM3 |-->| TYPE OF ELEMENT
49 !| IKLE |-->| CONNECTIVITY TABLE
50 !| KNOLG |-->| ORIGINAL (I.E. SCALAR MODE) GLOBAL NUMBER OF POINTS
51 !| MESH |-->| MESH STRUCTURE
52 !| NELEM |-->| NUMBER OF ELEMENTS
53 !| NELEM2 |-->| NUMBER OF TRIANGLES OF ORIGINAL 2D MESH
54 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
55 !| NPLAN |-->| NUMBER OF PLANES IN THE ORIGINAL MESH
56 !| NPOIN |-->| NUMBER OF POINTS
57 !| TETA |-->| COEFFICIENT USED IN THE RESULT
58 !| XAUX |<--| THE RESULTING MATRIX
59 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
60 !
61  USE bief, ex_gettriebe => gettriebe
62  USE declarations_telemac, ONLY : tetra,isegt
63 !
65  IMPLICIT NONE
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPOIN,IELM3,NELEM2,NPLAN
70  INTEGER, INTENT(IN) :: IKLE(nelmax,*),KNOLG(npoin)
71 !
72  DOUBLE PRECISION, INTENT(IN) :: TETA
73  DOUBLE PRECISION, INTENT(INOUT) :: XAUX(npoin,*),AX(nelmax,*)
74  DOUBLE PRECISION, INTENT(INOUT) :: AD(npoin)
75 !
76  TYPE(bief_mesh) :: MESH
77 !
78 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 !
80  INTEGER I1,I2,I3,I4,I5,I6,IELEM,IAN,ICOM,NPOIN2,IPLAN,K
81  INTEGER S1,S2,S3,IT1,IT2,IELEM3D,L1,L2,ISEG
82 !
83 ! TETRA : WILL GIVE THE LOCAL NUMBERS OF POINTS IN THE PRISM
84 ! THE 0 CORRESPOND TO SITUATIONS
85 ! THAT NEVER HAPPEN (TETRA(1,1,1,... OR TETRA(2,2,2,...)
86 ! SEE ALSO CPIKLE3 AND FLUX_EF_VF_3D, WITH SIMILAR USE
87 ! INTEGER TETRA(2,2,2,3,4)
88 ! DATA TETRA / 0,1,1,1,1,1,1,0,0,4,4,4,4,4,4,0,0,6,4,5,5,4,6,0,
89 ! & 0,2,2,2,2,2,2,0,0,6,6,6,6,6,6,0,0,3,1,2,2,1,3,0,
90 ! & 0,3,3,3,3,3,3,0,0,5,5,5,5,5,5,0,0,2,3,4,1,6,5,0,
91 ! & 0,4,5,4,6,6,5,0,0,2,3,3,1,2,1,0,0,4,5,3,6,2,1,0 /
92 ! EBE SYMMETRIC STORAGE OF OFF-DIAGONAL TERMS FOR TETRAHEDRONS
93 ! 0 ARE PUT FOR DIAGONALS
94  INTEGER :: STO(4,4)
95  parameter( sto = reshape( (/
96  & 0, 1, 2, 3,
97  & 1, 0, 4, 5,
98  & 2, 4, 0, 6,
99  & 3, 5, 6, 0 /), shape=(/ 4,4 /) ) )
100 ! CORRESPONDING OFF-DIAGONAL TERMS
101 ! DATA STO /1-1,2-1,3-1,4-1,
102 ! & 1-2,2-2,3-2,4-2,
103 ! & 1-3,2-3,3-3,4-3,
104 ! & 1-4,2-4,3-4,4-4/
105 ! INTEGER ISEGT(6,2)
106 ! DATA ISEGT/1,2,3,1,2,3,2,3,1,4,4,4/
107 !
108 !-----------------------------------------------------------------------
109 !
110 ! CONSIDERS HERE THAT NPOIN < NELMAX TO USE XAUX AS XAUX(NPOIN,3)
111 !
112 ! XAUX(I,1) IS COEFFICIENT OF POINT BELOW I IN EQUATION OF POINT I
113 ! XAUX(I,2) IS THE DIAGONAL
114 ! XAUX(I,3) IS COEFFICIENT OF POINT ABOVE I IN EQUATION OF POINT I
115 !
116 !-----------------------------------------------------------------------
117 ! INITIALISES THE DIAGONAL AND OFF-DIAGONAL TERMS
118 !-----------------------------------------------------------------------
119 !
120  CALL ov('X=C ', x=xaux(1,1), c=0.d0, dim1=npoin)
121  CALL ov('X=CY ', x=xaux(1,2), y=ad, c=teta, dim1=npoin)
122  CALL ov('X=C ', x=xaux(1,3), c=0.d0, dim1=npoin)
123 !
124  CALL ov('X=CX ',x=ad, c=1.d0-teta, dim1=npoin)
125 !
126 !-----------------------------------------------------------------------
127 ! ADDS TRIDIAGONAL TERMS
128 !-----------------------------------------------------------------------
129 !
130  IF(ielm3.EQ.41) THEN
131 !
132  DO ielem=1,nelem
133 !
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,3)=xaux(i1,3)+teta*ax(ielem,03) ! TERM 1-4
141  xaux(i2,3)=xaux(i2,3)+teta*ax(ielem,08) ! TERM 2-5
142  xaux(i3,3)=xaux(i3,3)+teta*ax(ielem,12) ! TERM 3-6
143  xaux(i4,1)=xaux(i4,1)+teta*ax(ielem,03) ! TERM 4-1
144  xaux(i5,1)=xaux(i5,1)+teta*ax(ielem,08) ! TERM 5-2
145  xaux(i6,1)=xaux(i6,1)+teta*ax(ielem,12) ! TERM 6-3
146 !
147  ax(ielem,03)=ax(ielem,03)*(1.d0-teta)
148  ax(ielem,08)=ax(ielem,08)*(1.d0-teta)
149  ax(ielem,12)=ax(ielem,12)*(1.d0-teta)
150 !
151  ENDDO
152 !
153  ELSEIF(ielm3.EQ.51) THEN
154 !
155  DO iplan=1,nplan-1
156  DO ielem=1,nelem2
157 !
158 ! HERE LOWER LEVEL OF ELEMENTS ALWAYS TAKEN
159 ! TO FIND THE WAY THE PRISM HAS BEEN CUT BY LOOKING
160 ! AT GLOBAL NUMBERS OF POINTS
161 ! THIS PART IS THUS COMMON TO ALL PLANES
162 ! IKLE 3D IS TAKEN, COULD BE IKLE 2D AS WELL
163  i1=ikle(ielem,1)
164  i2=ikle(ielem,2)
165  i3=ikle(ielem,3)
166  IF(ncsize.GT.1) THEN
167  i1=knolg(i1)
168  i2=knolg(i2)
169  i3=knolg(i3)
170  ENDIF
171 ! THIS IS DONE LIKE IN CPIKLE3 TO USE ARRAY TETRA
172  IF(i1.GT.i2) THEN
173  s1=1
174  ELSE
175  s1=2
176  ENDIF
177  IF(i2.GT.i3) THEN
178  s2=1
179  ELSE
180  s2=2
181  ENDIF
182  IF(i3.GT.i1) THEN
183  s3=1
184  ELSE
185  s3=2
186  ENDIF
187 !
188 ! NOW TAKING CONTRIBUTIONS OF TETRAHEDRON K= 1, 2 AND 3
189 !
190  DO k=1,3
191  ielem3d=3*(iplan-1)*nelem2+ielem+(k-1)*nelem2
192 ! SEGMENTS 1 TO 6
193  DO iseg=1,6
194 ! LOCAL NUMBERS OF 2 POINTS OF SEGMENT IN THE TETRAHEDRON
195  l1=isegt(iseg,1)
196  l2=isegt(iseg,2)
197 ! GLOBAL NUMBERS OF 2 POINTS OF SEGMENT
198  i1=ikle(ielem3d,l1)
199  i2=ikle(ielem3d,l2)
200 ! NUMBERS OF 2 POINTS OF SEGMENT IN THE ORIGINAL PRISM
201  it1=tetra(s1,s2,s3,k,l1)
202  it2=tetra(s1,s2,s3,k,l2)
203 ! WE LOOK FOR VERTICALS OF THE ORIGINAL PRISM
204  IF(it1.EQ.1.AND.it2.EQ.4) THEN
205  xaux(i1,3)=xaux(i1,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 1-4
206  xaux(i2,1)=xaux(i2,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 4-1
207  ax(ielem3d,sto(l1,l2))=
208  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
209  ELSEIF(it1.EQ.4.AND.it2.EQ.1) THEN
210  xaux(i1,1)=xaux(i1,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 4-1
211  xaux(i2,3)=xaux(i2,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 1-4
212  ax(ielem3d,sto(l1,l2))=
213  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
214  ELSEIF(it1.EQ.2.AND.it2.EQ.5) THEN
215  xaux(i1,3)=xaux(i1,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 2-5
216  xaux(i2,1)=xaux(i2,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 5-2
217  ax(ielem3d,sto(l1,l2))=
218  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
219  ELSEIF(it1.EQ.5.AND.it2.EQ.2) THEN
220  xaux(i1,1)=xaux(i1,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 5-2
221  xaux(i2,3)=xaux(i2,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 2-5
222  ax(ielem3d,sto(l1,l2))=
223  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
224  ELSEIF(it1.EQ.3.AND.it2.EQ.6) THEN
225  xaux(i1,3)=xaux(i1,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 3-6
226  xaux(i2,1)=xaux(i2,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 6-3
227  ax(ielem3d,sto(l1,l2))=
228  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
229  ELSEIF(it1.EQ.6.AND.it2.EQ.3) THEN
230  xaux(i1,1)=xaux(i1,1)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 6-3
231  xaux(i2,3)=xaux(i2,3)+teta*ax(ielem3d,sto(l1,l2)) ! TERM 3-6
232  ax(ielem3d,sto(l1,l2))=
233  & ax(ielem3d,sto(l1,l2))*(1.d0-teta)
234  ENDIF
235  ENDDO
236  ENDDO
237 !
238  ENDDO
239  ENDDO
240 !
241 !-----------------------------------------------------------------------
242 !
243  ELSE
244  WRITE(lu,*) 'GETTRIEBE: ELEMENT NOT IMPLEMENTED:',ielm3
245  CALL plante(1)
246  stop
247  ENDIF
248 !
249 !-----------------------------------------------------------------------
250 !
251 ! PARALLEL MODE
252 !
253  IF(ncsize.GT.1) THEN
254  ian = 3
255  icom = 2
256  npoin2 = bief_nbpts(11,mesh)
257  CALL parcom2(xaux(1,1),xaux(1,2),xaux(1,3),
258  & npoin2,nplan,icom,ian,mesh)
259  ENDIF
260 !
261 !-----------------------------------------------------------------------
262 !
263  RETURN
264  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
integer, dimension(6, 2) isegt
integer function bief_nbpts(IELM, MESH)
Definition: bief_nbpts.f:7
integer, dimension(2, 2, 2, 3, 4) tetra
subroutine parcom2(X1, X2, X3, NPOIN, NPLAN, ICOM, IAN, MESH)
Definition: parcom2.f:7
subroutine gettriebe(XAUX, AD, AX, TETA, IKLE, NPOIN, NELEM, NELMAX, MESH, IELM3, NELEM2, NPLAN, KNOLG)
Definition: gettriebe.f:8
Definition: bief.f:3