The TELEMAC-MASCARET system  trunk
mer41.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE mer41
3 ! ****************
4 !
5  &(x, xa1 ,xa2 ,xa3 ,xa4 ,xa5 ,
6  & xa6 ,xa7 ,xa8 ,xa9 ,xa10,
7  & xa11,xa12,xa13,xa14,xa15,
8  & ikle1,ikle2,ikle3,ikle4,ikle5,ikle6,
9  & nelem,nelmax,npoin,lv)
10 !
11 !***********************************************************************
12 ! BIEF V6P1 21/08/2010
13 !***********************************************************************
14 !
15 !brief PRODUCT X = U B (BEWARE: ELEMENT BY ELEMENT).
16 !+
17 !+ HERE: P1 PRISM ELEMENT OR ELEMENT WITH 6 POINTS.
18 !+
19 !+ REVERSE OPERATION FROM THAT IN SUBROUTINE REMONT,
20 !+ HENCE THE NAME.
21 !code
22 !+ THE MATRIX U IS HERE THE RESULT OF A DECOMPOSITION
23 !+ DONE IN SUBROUTINE DECLDU.
24 !+
25 !+ EACH ELEMENTARY MATRIX HAS BEEN FACTORISED IN THE FORM :
26 !+
27 !+ LE X DE X UE
28 !+
29 !+ LE : LOWER TRIANGULAR WITH 1S ON THE DIAGONAL
30 !+ DE : DIAGONAL
31 !+ UE : UPPER TRIANGULAR WITH 1S ON THE DIAGONAL
32 !+
33 !+ T
34 !+ IF THE MATRIX IS SYMMETRICAL : LE = UE
35 !
36 !history J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
37 !+ 05/02/91
38 !+ V5P1
39 !+
40 !
41 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
42 !+ 13/07/2010
43 !+ V6P0
44 !+ Translation of French comments within the FORTRAN sources into
45 !+ English comments
46 !
47 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
48 !+ 21/08/2010
49 !+ V6P0
50 !+ Creation of DOXYGEN tags for automated documentation and
51 !+ cross-referencing of the FORTRAN sources
52 !
53 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 !| IKLE1 |-->| FIRST POINTS OF PRISMS
55 !| IKLE2 |-->| SECOND POINTS OF PRISMS
56 !| IKLE3 |-->| THIRD POINTS OF PRISMS
57 !| IKLE4 |-->| FOUTH POINTS OF PRISMS
58 !| IKLE5 |-->| FIFTH POINTS OF PRISMS
59 !| IKLE6 |-->| SIXTH POINTS OF PRISMS
60 !| LV |-->| VECTOR LENGTH OF THE MACHINE
61 !| NELEM |-->| NUMBER OF ELEMENTS
62 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
63 !| NPOIN |-->| NUMBER OF POINTS
64 !| X |<--| RESULTING VECTOR
65 !| XA10 |-->| OFF-DIAGONAL TERM
66 !| XA11 |-->| OFF-DIAGONAL TERM
67 !| XA12 |-->| OFF-DIAGONAL TERM
68 !| XA13 |-->| OFF-DIAGONAL TERM
69 !| XA14 |-->| OFF-DIAGONAL TERM
70 !| XA15 |-->| OFF-DIAGONAL TERM
71 !| XA2 |-->| OFF-DIAGONAL TERM
72 !| XA3 |-->| OFF-DIAGONAL TERM
73 !| XA4 |-->| OFF-DIAGONAL TERM
74 !| XA5 |-->| OFF-DIAGONAL TERM
75 !| XA6 |-->| OFF-DIAGONAL TERM
76 !| XA7 |-->| OFF-DIAGONAL TERM
77 !| XA8 |-->| OFF-DIAGONAL TERM
78 !| XA9 |-->| OFF-DIAGONAL TERM
79 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
80 !
82  IMPLICIT NONE
83 !
84 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85 !
86  INTEGER, INTENT(IN) :: NPOIN,NELEM,NELMAX,LV
87  INTEGER, INTENT(IN) :: IKLE1(nelmax),IKLE2(nelmax),IKLE3(nelmax)
88  INTEGER, INTENT(IN) :: IKLE4(nelmax),IKLE5(nelmax),IKLE6(nelmax)
89 !
90  DOUBLE PRECISION, INTENT(INOUT) :: X(npoin)
91  DOUBLE PRECISION, INTENT(IN) :: XA1(nelmax),XA2(nelmax)
92  DOUBLE PRECISION, INTENT(IN) :: XA3(nelmax)
93  DOUBLE PRECISION, INTENT(IN) :: XA4(nelmax),XA5(nelmax)
94  DOUBLE PRECISION, INTENT(IN) :: XA6(nelmax)
95  DOUBLE PRECISION, INTENT(IN) :: XA7(nelmax),XA8(nelmax)
96  DOUBLE PRECISION, INTENT(IN) :: XA9(nelmax)
97  DOUBLE PRECISION, INTENT(IN) :: XA10(nelmax),XA11(nelmax)
98  DOUBLE PRECISION, INTENT(IN) :: XA12(nelmax)
99  DOUBLE PRECISION, INTENT(IN) :: XA13(nelmax),XA14(nelmax)
100  DOUBLE PRECISION, INTENT(IN) :: XA15(nelmax)
101 !
102 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
103 !
104  INTEGER IELEM,IB
105 !
106  INTRINSIC min
107 !
108 !-----------------------------------------------------------------------
109 !
110 ! RESUMES INVERSION OF THE LOWER TRIANGULAR MATRICES
111 !
112 !-----------------------------------------------------------------------
113 ! LOOP IN SCALAR MODE (LV=1) OR WITH FORCED VECTORISATION
114 !-----------------------------------------------------------------------
115 !
116  IF(lv.EQ.1) THEN
117 !
118 ! SCALAR MODE
119 !
120  DO ielem = 1 , nelem
121  x(ikle1(ielem))=x(ikle1(ielem))+xa5(ielem)*x(ikle6(ielem))
122  & +xa4(ielem)*x(ikle5(ielem))
123  & +xa3(ielem)*x(ikle4(ielem))
124  & +xa2(ielem)*x(ikle3(ielem))
125  & +xa1(ielem)*x(ikle2(ielem))
126  x(ikle2(ielem))=x(ikle2(ielem))+xa9(ielem)*x(ikle6(ielem))
127  & +xa8(ielem)*x(ikle5(ielem))
128  & +xa7(ielem)*x(ikle4(ielem))
129  & +xa6(ielem)*x(ikle3(ielem))
130  x(ikle3(ielem))=x(ikle3(ielem))+xa12(ielem)*x(ikle6(ielem))
131  & +xa11(ielem)*x(ikle5(ielem))
132  & +xa10(ielem)*x(ikle4(ielem))
133  x(ikle4(ielem))=x(ikle4(ielem))+xa14(ielem)*x(ikle6(ielem))
134  & +xa13(ielem)*x(ikle5(ielem))
135  x(ikle5(ielem))=x(ikle5(ielem))+xa15(ielem)*x(ikle6(ielem))
136  ENDDO ! IELEM
137 !
138  ELSE
139 !
140 ! VECTOR MODE
141 !
142  DO ib = 1,(nelem+lv-1)/lv
143 !VOCL LOOP,NOVREC
144 !DIR$ IVDEP
145  DO ielem = 1+(ib-1)*lv , min(nelem,ib*lv)
146  x(ikle1(ielem))=x(ikle1(ielem))+xa5(ielem)*x(ikle6(ielem))
147  & +xa4(ielem)*x(ikle5(ielem))
148  & +xa3(ielem)*x(ikle4(ielem))
149  & +xa2(ielem)*x(ikle3(ielem))
150  & +xa1(ielem)*x(ikle2(ielem))
151  x(ikle2(ielem))=x(ikle2(ielem))+xa9(ielem)*x(ikle6(ielem))
152  & +xa8(ielem)*x(ikle5(ielem))
153  & +xa7(ielem)*x(ikle4(ielem))
154  & +xa6(ielem)*x(ikle3(ielem))
155  x(ikle3(ielem))=x(ikle3(ielem))+xa12(ielem)*x(ikle6(ielem))
156  & +xa11(ielem)*x(ikle5(ielem))
157  & +xa10(ielem)*x(ikle4(ielem))
158  x(ikle4(ielem))=x(ikle4(ielem))+xa14(ielem)*x(ikle6(ielem))
159  & +xa13(ielem)*x(ikle5(ielem))
160  x(ikle5(ielem))=x(ikle5(ielem))+xa15(ielem)*x(ikle6(ielem))
161  ENDDO ! IELEM
162  ENDDO ! IB
163 !
164  ENDIF
165 !
166 !-----------------------------------------------------------------------
167 !
168  RETURN
169  END
subroutine mer41(X, XA1, XA2, XA3, XA4, XA5, XA6, XA7, XA8, XA9, XA10, XA11, XA12, XA13, XA14, XA15, IKLE1, IKLE2, IKLE3, IKLE4, IKLE5, IKLE6, NELEM, NELMAX, NPOIN, LV)
Definition: mer41.f:11