The TELEMAC-MASCARET system  trunk
gettriseg.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE gettriseg
3 ! ********************
4 !
5  &(xaux,ad,ax,teta,npoin,mesh,nseg3d,nseg2d,nplan,npoin2,ielm3)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief GETS THE TRIDIAGONAL PART OF A DIFFUSION MATRIX ON
12 !+ PRISMS AND REMOVES IT FROM THE INITIAL MATRIX.
13 !code
14 !+ IF MTRI IS THIS TRIDIAGONAL PART, MAUX THE RESULT AND MDIF
15 !+ THE DIFFUSION MATRIX, THIS SUBROUTINE DOES:
16 !+
17 !+ MAUX = TETA * MTRI
18 !+ MDIF CHANGED INTO (1-TETA) * MDIF
19 !+
20 !+ SEGMENT STORAGE FOR MDIFF HERE !!!!!!!!!!!!!!!!!!!!!!!!
21 !
22 !warning THE JACOBIAN MUST BE POSITIVE
23 !
24 !history J-M HERVOUET (LNHE)
25 !+ 11/08/09
26 !+ V6P0
27 !+ CROSSED AND VERTICAL SEGMENTS SWAPPED (SEE STOSEG41)
28 !
29 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
30 !+ 13/07/2010
31 !+ V6P0
32 !+ Translation of French comments within the FORTRAN sources into
33 !+ English comments
34 !
35 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
36 !+ 21/08/2010
37 !+ V6P0
38 !+ Creation of DOXYGEN tags for automated documentation and
39 !+ cross-referencing of the FORTRAN sources
40 !
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !| AD |-->| DIAGONAL TERMS OF MATRIX
43 !| AX |-->| OFF-DIAGONAL TERMS OF MATRIX
44 !| | | HERE DIMENSION 1 BECAUSE SYMMETRY
45 !| IELM3 |-->| TYPE OF ELEMENT
46 !| MESH |-->| MESH STRUCTURE
47 !| NPLAN |-->| NUMBER OF PLANES
48 !| NPOIN |-->| NUMBER OF POINTS
49 !| NPOIN2 |-->| NUMBER OF POINTS OF 2D MESH
50 !| NSEG2D |-->| NUMBER OF SEGMENTS IN 2D
51 !| NSEG3D |-->| NUMBER OF SEGMENTS IN 3D
52 !| TETA |-->| COEFFICIENT USED IN THE RESULT
53 !| XAUX |<--| THE RESULTING MATRIX
54 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 !
56  USE bief, ex_gettriseg => gettriseg
57 !
59  IMPLICIT NONE
60 !
61 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 !
63  INTEGER, INTENT(IN) :: NPOIN,NSEG3D,NSEG2D,NPLAN,NPOIN2,IELM3
64 !
65  DOUBLE PRECISION, INTENT(IN) :: TETA
66  DOUBLE PRECISION, INTENT(INOUT) :: XAUX(npoin,*),AX(nseg3d)
67  DOUBLE PRECISION, INTENT(INOUT) :: AD(npoin)
68 !
69  TYPE(bief_mesh), INTENT(INOUT) :: MESH
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  INTEGER I2,I3,IPLAN,IAN,ICOM,SEGUP,SEGDOWN,NSEGH,NSEGV
74 !
75 !-----------------------------------------------------------------------
76 !
77 ! CONSIDERS HERE THAT NPOIN < NELMAX TO USE XAUX AS XAUX(NPOIN,3)
78 !
79 ! XAUX(I,1) IS COEFFICIENT OF POINT BELOW I IN EQUATION OF POINT I
80 ! XAUX(I,2) IS THE DIAGONAL
81 ! XAUX(I,3) IS COEFFICIENT OF POINT ABOVE I IN EQUATION OF POINT I
82 !
83 !-----------------------------------------------------------------------
84 ! INITIALISES THE DIAGONAL TERMS
85 !-----------------------------------------------------------------------
86 !
87  CALL ov('X=CY ', x=xaux(1,2), y=ad, c=teta, dim1=npoin)
88  CALL ov('X=CX ', x=ad, c=1.d0-teta, dim1=npoin)
89 !
90 !-----------------------------------------------------------------------
91 ! TRIDIAGONAL TERMS
92 !-----------------------------------------------------------------------
93 !
94 ! VERTICAL SEGMENTS HAVE THE SAME POSITION, SEE STOSEG41,STOSEG51
95 !
96  IF(ielm3.EQ.41.OR.ielm3.EQ.51) THEN
97 !
98  nsegh=nseg2d*nplan
99  nsegv=npoin2*(nplan-1)
100 !
101 ! PLANE ON THE BOTTOM
102 !
103  DO i2=1,npoin2
104  segup=nsegh+i2
105  xaux(i2,1)=0.d0
106  xaux(i2,3)=teta*ax(segup)
107  ENDDO
108 !
109 ! PLANE AT THE FREE SURFACE
110 !
111  DO i2=1,npoin2
112  i3=i2+(nplan-1)*npoin2
113  segdown=nsegh+npoin2*(nplan-2)+i2
114  xaux(i3,1)=teta*ax(segdown)
115  xaux(i3,3)=0.d0
116  ENDDO
117 !
118 ! OTHER PLANES
119 !
120  IF(nplan.GT.2) THEN
121  DO iplan=2,nplan-1
122  DO i2=1,npoin2
123  i3=i2+(iplan-1)*npoin2
124  segdown=nsegh+npoin2*(iplan-2)+i2
125  segup =segdown+npoin2
126  xaux(i3,1)=teta*ax(segdown)
127  xaux(i3,3)=teta*ax(segup)
128  ENDDO
129  ENDDO
130  ENDIF
131 !
132  CALL ov('X=CX ', x=ax(nsegh+1:nsegh+nsegv),
133  & c=1.d0-teta, dim1=nsegv)
134 !
135  ELSE
136  WRITE(lu,*) 'GETTRISEG: UNKNOWN ELEMENT:',ielm3
137  CALL plante(1)
138  stop
139  ENDIF
140 !
141 !-----------------------------------------------------------------------
142 !
143 ! PARALLEL MODE
144 !
145  IF(ncsize.GT.1) THEN
146  ian = 3
147  icom = 2
148  CALL parcom2(xaux(1,1),xaux(1,2),xaux(1,3),
149  & npoin2,nplan,icom,ian,mesh)
150  ENDIF
151 !
152 !-----------------------------------------------------------------------
153 !
154  RETURN
155  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine gettriseg(XAUX, AD, AX, TETA, NPOIN, MESH, NSEG3D, NSEG2D, NPLAN, NPOIN2, IELM3)
Definition: gettriseg.f:7
subroutine parcom2(X1, X2, X3, NPOIN, NPLAN, ICOM, IAN, MESH)
Definition: parcom2.f:7
Definition: bief.f:3