The TELEMAC-MASCARET system  trunk
dlduseg.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE dlduseg
3 ! ******************
4 !
5  &(db,xb,typdia,xa,typexa,gloseg,nseg,npoin,copy)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief L D U FACTORISATION OF THE ELEMENTARY MATRICES BY SEGMENT
12 !+ FOR SEGMENTS.
13 !+
14 !+ REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY.
15 !code
16 !+ EACH ELEMENTARY MATRIX IS DECOMPOSED IN THE FORM:
17 !+
18 !+ LE X DE X UE
19 !+
20 !+ LE : LOWER TRIANGULAR WITH 1S ON THE DIAGONAL
21 !+ DE : DIAGONAL
22 !+ UE : UPPER TRIANGULAR WITH 1S ON THE DIAGONAL
23 !+
24 !+ T
25 !+ IF THE MATRIX IS SYMMETRICAL : LE = UE
26 !+
27 !+ "DE" MATRICES ARE CONSIDERED LIKE DIAGONALS OF SIZE
28 !+ NPOIN X NPOIN, WHICH ARE FILLED WITH 1S FOR THE POINTS
29 !+ WHICH DO NOT BELONG TO THE CONSIDERED ELEMENT
30 !+
31 !+ THEN PERFORMS THE PRODUCT OF ALL THESE DIAGONALS
32 !+ YIELDING DIAGONAL DB
33 !+
34 !+
35 !+
36 !+ ( 1 X12 ) ( 1 0 ) ( 1 0 ) ( 1 X12 )
37 !+ ( ) = ( ) ( ) ( )
38 !+ ( X21 1 ) ( X21 1 ) ( 0 1-X12*X21 ) ( 0 1 )
39 !
40 !history J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
41 !+ 24/04/97
42 !+ V5P5
43 !+
44 !
45 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
46 !+ 13/07/2010
47 !+ V6P0
48 !+ Translation of French comments within the FORTRAN sources into
49 !+ English comments
50 !
51 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
52 !+ 21/08/2010
53 !+ V6P0
54 !+ Creation of DOXYGEN tags for automated documentation and
55 !+ cross-referencing of the FORTRAN sources
56 !
57 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58 !| COPY |-->| IF .TRUE. A IS COPIED INTO B.
59 !| | | IF .FALSE. B IS CONSIDERED ALREADY INITIALISED
60 !| DB |<--| DIAGONAL OF MATRIX B
61 !| GLOSEG |-->| FIRST AND SECOND POINT OF SEGMENTS
62 !| NPOIN |-->| NUMBER OF POINTS
63 !| NSEG |-->| NUMBER OF SEGMENTS
64 !| TYPDIA |<--| TYPE OF DIAGONAL ( 'Q', 'I' , OR '0' )
65 !| TYPEXA |<--| TYPE OF OFF-DIAGONAL TERMS ('Q','S',OR '0')
66 !| XA |<--| OFF-DIAGONAL TERMS OF MATRIX A
67 !| XB |<--| OFF-DIAGONAL TERMS OF MATRIX B
68 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 !
70  USE bief, ex_dlduseg => dlduseg
71 !
73  IMPLICIT NONE
74 !
75 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76 !
77  INTEGER, INTENT(IN) :: NSEG,NPOIN
78  DOUBLE PRECISION, INTENT(INOUT) :: DB(npoin),XB(nseg,*)
79  DOUBLE PRECISION, INTENT(IN) :: XA(nseg,*)
80  CHARACTER(LEN=1), INTENT(IN) :: TYPDIA,TYPEXA
81  INTEGER, INTENT(IN) :: GLOSEG(nseg,2)
82  LOGICAL, INTENT(IN) :: COPY
83 !
84 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85 !
86  INTEGER ISEG
87 !
88 !-----------------------------------------------------------------------
89 !
90 ! REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY (EXCEPT IN PARALLEL MODE)
91 !
92  IF(typdia(1:1).NE.'I'.AND.ncsize.LE.1) THEN
93  WRITE(lu,101) typdia(1:1)
94 101 FORMAT(1x,'DLDUSEG (BIEF) : DIAGONAL OF A NOT IDENTITY :',a1)
95  CALL plante(1)
96  stop
97  ENDIF
98 !
99 !-----------------------------------------------------------------------
100 !
101  IF(typexa(1:1).EQ.'S') THEN
102 !
103  IF(copy) THEN
104  CALL ov('X=Y ', x=xb, y=xa, dim1=nseg)
105  ENDIF
106 !
107 !-----------------------------------------------------------------------
108 !
109  ELSEIF(typexa(1:1).EQ.'Q') THEN
110 !
111  IF(copy) THEN
112  CALL ov('X=Y ', x=xb , y=xa, dim1=2*nseg)
113  ENDIF
114 !
115 !-----------------------------------------------------------------------
116 !
117  ELSE
118  WRITE(lu,201) typexa(1:1)
119 201 FORMAT(1x,'DLDUSEG (BIEF) : TYPE OF MATRIX NOT TREATED:',a1)
120  CALL plante(1)
121  stop
122  ENDIF
123 !
124 !-----------------------------------------------------------------------
125 !
126 ! MULTIPLICATIVE ASSEMBLY OF THE DIAGONAL WITH INITIALISATION
127 ! OF DB TO 1
128 !
129  CALL ov('X=C ' , x=db, c=1.d0, dim1=npoin)
130 !
131  IF(typexa(1:1).EQ.'S') THEN
132 !
133  DO iseg=1,nseg
134  db(gloseg(iseg,2))=db(gloseg(iseg,2))*(1.d0-xb(iseg,1)**2)
135  ENDDO
136 !
137  ELSE
138 !
139  DO iseg=1,nseg
140  db(gloseg(iseg,2))=
141  & db(gloseg(iseg,2))*(1.d0-xb(iseg,1)*xb(iseg,2))
142  ENDDO
143 !
144  ENDIF
145 !
146 ! INVERTS DB (COULD DIVIDE BY 0)
147 !
148  CALL ov('X=1/Y ', x=db, y=db, dim1=npoin)
149 !
150 !-----------------------------------------------------------------------
151 !
152  RETURN
153  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine dlduseg(DB, XB, TYPDIA, XA, TYPEXA, GLOSEG, NSEG, NPOIN, COPY)
Definition: dlduseg.f:7
Definition: bief.f:3