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