The TELEMAC-MASCARET system  trunk
preverseg.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE preverseg
3 ! ********************
4 !
5  &(xaux,ad,ax,typdia,typext,npoin,mesh,nseg3d,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 JMH
17 !+ 11/08/09
18 !+
19 !+ CROSSED AND VERTICAL SEGMENTS SWAPPED (SEE STOSEG41)
20 !
21 !history J-M HERVOUET (LNHE)
22 !+ 11/08/09
23 !+ V6P0
24 !+
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 13/07/2010
28 !+ V6P0
29 !+ Translation of French comments within the FORTRAN sources into
30 !+ English comments
31 !
32 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
33 !+ 21/08/2010
34 !+ V6P0
35 !+ Creation of DOXYGEN tags for automated documentation and
36 !+ cross-referencing of the FORTRAN sources
37 !
38 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 !| AD |-->| MATRIX DIAGONAL
40 !| AX |-->| MATRIX OFF-DIAGONAL TERMS
41 !| MESH |-->| MESH STRUCTURE
42 !| NPOIN |-->| NUMBER OF POINTS
43 !| NSEG3D |-->| NUMBER OF SEGMENTS IN 3D MESH
44 !| TYPDIA |-->| TYPE OF DIAGONAL:
45 !| | | TYPDIA = 'Q' : ANY VALUE
46 !| | | TYPDIA = 'I' : IDENTITY
47 !| | | TYPDIA = '0' : ZERO
48 !| TYPEXT |-->| TYPE OF OFF-DIAGONAL TERMS
49 !| | | TYPEXT = 'Q' : ANY VALUE
50 !| | | TYPEXT = 'S' : SYMMETRIC
51 !| | | TYPEXT = '0' : ZERO
52 !| TYPEMESH |-->| TYPE OF MESH (40: PRISMS, 50: PRISMS CUT INTO
53 !| | | TETRAHEDRONS)
54 !| XAUX |<--| TRIDIAGONAL MATRIX
55 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56 !
57  USE bief, ex_preverseg => preverseg
58 !
60  IMPLICIT NONE
61 !
62 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 !
64  INTEGER, INTENT(IN) :: NPOIN,NSEG3D,TYPEMESH
65 !
66  DOUBLE PRECISION, INTENT(IN) :: AD(npoin),AX(nseg3d,*)
67  DOUBLE PRECISION, INTENT(INOUT) :: XAUX(npoin,*)
68 !
69  CHARACTER(LEN=1), INTENT(IN) :: TYPDIA,TYPEXT
70 !
71  TYPE(bief_mesh), INTENT(INOUT) :: MESH
72 !
73 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 !
75  INTEGER I2,I3,NPLAN,IAN,ICOM,NPOIN2,SEGUP,SEGDOWN,NSEG2D
76  INTEGER IPLAN,NSEGH
77 !
78 !-----------------------------------------------------------------------
79 !
80 ! HERE WE CONSIDER THAT NPOIN < NELMAX TO USE XAUX AS XAUX(NPOIN,3)
81 !
82 ! XAUX(I,1) IS COEFFICIENT OF POINT BELOW I IN EQUATION OF POINT I
83 ! XAUX(I,2) IS THE DIAGONAL
84 ! XAUX(I,3) IS COEFFICIENT OF POINT ABOVE I IN EQUATION OF POINT I
85 !
86 !-----------------------------------------------------------------------
87 ! INITIALISES THE DIAGONAL
88 !-----------------------------------------------------------------------
89 !
90  IF(typdia(1:1).EQ.'0') THEN
91  CALL ov('X=C ', x=xaux(1,2), c=0.d0, dim1=npoin)
92  ELSEIF(typdia(1:1).EQ.'I') THEN
93  CALL ov('X=C ', x=xaux(1,2), c=1.d0, dim1=npoin)
94  ELSEIF(typdia(1:1).EQ.'Q') THEN
95  CALL ov('X=Y ', x=xaux(1,2), y=ad, dim1=npoin)
96  ELSE
97  WRITE(lu,*) typdia
98  WRITE(lu,*) 'UNKNOWN TYPE OF DIAGONAL IN PREVERSEG'
99  CALL plante(1)
100  stop
101  ENDIF
102 !
103 !-----------------------------------------------------------------------
104 ! LUMPS THE OFF-DIAGONAL TERMS CORRESPONDING TO VERTICAL SEGMENTS
105 !-----------------------------------------------------------------------
106 !
107  npoin2 = bief_nbpts(11,mesh)
108  nplan = npoin/npoin2
109  nseg2d = bief_nbseg(11,mesh)
110  nsegh = nseg2d*nplan
111 !
112  IF(typemesh.EQ.40.OR.typemesh.EQ.50) THEN
113 !
114  IF(typext.EQ.'Q') THEN
115 ! PLANE ON THE BOTTOM
116  DO i2=1,npoin2
117  segup=nsegh+i2
118  xaux(i2,1)=0.d0
119  xaux(i2,3)=ax(segup,1)
120  ENDDO
121 ! PLANE AT THE FREE SURFACE
122  DO i2=1,npoin2
123  i3=i2+(nplan-1)*npoin2
124  segdown=nsegh+npoin2*(nplan-2)+i2
125  xaux(i3,1)=ax(segdown,2)
126  xaux(i3,3)=0.d0
127  ENDDO
128 ! OTHER PLANES
129  IF(nplan.GT.2) THEN
130  DO iplan=2,nplan-1
131  DO i2=1,npoin2
132  i3=i2+(iplan-1)*npoin2
133  segdown=nsegh+npoin2*(iplan-2)+i2
134  segup =segdown+npoin2
135  xaux(i3,1)=ax(segdown,2)
136  xaux(i3,3)=ax(segup,1)
137  ENDDO
138  ENDDO
139  ENDIF
140  ELSEIF(typext.EQ.'S') THEN
141 ! PLANE ON THE BOTTOM
142  DO i2=1,npoin2
143  segup=nsegh+i2
144  xaux(i2,1)=0.d0
145  xaux(i2,3)=ax(segup,1)
146  ENDDO
147 ! PLANE AT THE FREE SURFACE
148  DO i2=1,npoin2
149  i3=i2+(nplan-1)*npoin2
150  segdown=nsegh+npoin2*(nplan-2)+i2
151  xaux(i3,1)=ax(segdown,1)
152  xaux(i3,3)=0.d0
153  ENDDO
154 ! OTHER PLANES
155  IF(nplan.GT.2) THEN
156  DO iplan=2,nplan-1
157  DO i2=1,npoin2
158  i3=i2+(iplan-1)*npoin2
159  segdown=nsegh+npoin2*(iplan-2)+i2
160  segup =segdown+npoin2
161  xaux(i3,1)=ax(segdown,1)
162  xaux(i3,3)=ax(segup,1)
163  ENDDO
164  ENDDO
165  ENDIF
166  ELSEIF(typext.EQ.'0') THEN
167 ! NOTHING TO DO (BUT WHAT'S THE USE OF AN ITERATIVE SOLVER ?)
168  ELSE
169  WRITE(lu,*) typext
170  WRITE(lu,*) 'UNKNOWN TYPE OF OFF-DIAGONAL TERMS'
171  WRITE(lu,*) 'IN PREVERSEG'
172  CALL plante(1)
173  stop
174  ENDIF
175 !
176  ELSE
177  WRITE(lu,*) typemesh
178  WRITE(lu,*) 'UNKNOWN TYPE OF MESH'
179  WRITE(lu,*) 'IN PREVERSEG: ',typemesh
180  CALL plante(1)
181  stop
182  ENDIF
183 !
184 !-----------------------------------------------------------------------
185 !
186 ! PARALLEL MODE
187 !
188  IF(ncsize.GT.1) THEN
189  ian = 3
190  icom = 2
191  CALL parcom2(xaux(1,1),xaux(1,2),xaux(1,3),
192  & npoin2,nplan,icom,ian,mesh)
193  ENDIF
194 !
195 !-----------------------------------------------------------------------
196 !
197  RETURN
198  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 preverseg(XAUX, AD, AX, TYPDIA, TYPEXT, NPOIN, MESH, NSEG3D, TYPEMESH)
Definition: preverseg.f:7
subroutine parcom2(X1, X2, X3, NPOIN, NPLAN, ICOM, IAN, MESH)
Definition: parcom2.f:7
integer function bief_nbseg(IELM, MESH)
Definition: bief_nbseg.f:7
Definition: bief.f:3