The TELEMAC-MASCARET system  trunk
assvec.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE assvec
3 ! *****************
4 !
5  &(x, ikle,npoin,nelem,nelmax,w,init,lv,msk,maskel,ndp,errx)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief VECTOR ASSEMBLY.
12 !
13 !warning THIS VECTOR IS ONLY INITIALISED TO 0 IF INIT = .TRUE.
14 !
15 !history J-M HERVOUET (LNH)
16 !+ 29/02/08
17 !+ V5P9
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !history R.NHEILI (Univerte de Perpignan, DALI)
32 !+ 24/02/2016
33 !+ V7P3
34 !+ COMPENSATED ASSEMBLY (MODASS=3)
35 !
36 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 !| IKLE |-->| CONNECTIVITY TABLE
38 !| INIT |-->| LOGICAL : IF TRUE X IS INITIALISED TO 0.
39 !| LV |-->| VECTOR LENGTH OF THE COMPUTER
40 !| MASKEL |-->| MASKING OF ELEMENTS
41 !| | | =1. : NORMAL =0. : MASKED ELEMENT
42 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
43 !| NDP |-->| NUMBER OF POINTS PER ELEMENT
44 !| NELEM |-->| NUMBER OF ELEMENTS IN THE MESH
45 !| NELMAX |-->| FIRST DIMENSION OF IKLE AND W.
46 !| NPOIN |-->| NUMBER OF POINTS IN X
47 !| W |-->| WORK ARRAY WITH A NON ASSEMBLED FORM OF THE
48 !| | | RESULT
49 !| | | W HAS DIMENSION NELMAX * NDP
50 !| | | NDP IS THE NUMBER OF POINTS IN THE ELEMENT
51 !| X |<->| ASSEMBLED VECTOR
52 !| ERRX |<->| ERRORS OF ASSEMBLED VECTOR
53 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 !
55  USE bief, ex_assvec => assvec
56  USE declarations_telemac, ONLY : modass
57 !
59  IMPLICIT NONE
60 !
61 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 !
63  DOUBLE PRECISION, INTENT(INOUT) :: X(*)
64  INTEGER , INTENT(IN) :: NELEM,NELMAX,NPOIN,LV,NDP
65  INTEGER , INTENT(IN) :: IKLE(nelmax,ndp)
66  DOUBLE PRECISION, INTENT(IN) :: W(nelmax,ndp),MASKEL(*)
67  LOGICAL , INTENT(IN) :: INIT,MSK
68  DOUBLE PRECISION,OPTIONAL, INTENT(INOUT) :: ERRX(*)
69 !
70 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 !
72  INTEGER IDP,IELEM
73  DOUBLE PRECISION ERREUR
74  DOUBLE PRECISION TMP
75 !
76 !-----------------------------------------------------------------------
77 ! INITIALISES VECTOR X TO 0 IF(INIT)
78 !-----------------------------------------------------------------------
79 !
80  IF(init) THEN
81  CALL ov('X=C ', x=x, c=0.d0, dim1=npoin)
82  ENDIF
83 !
84 !-----------------------------------------------------------------------
85 ! ASSEMBLES, CONTRIBUTION OF LOCAL POINTS 1,... TO NDP
86 !-----------------------------------------------------------------------
87 !
88 ! FpSum
89  IF(modass.EQ.1) THEN
90  DO idp = 1 , ndp
91  CALL assve1(x,ikle(1,idp),w(1,idp),nelem,nelmax,lv,msk,
92  & maskel)
93  ENDDO
94 ! CompSum
95  ELSEIF(modass.EQ.3) THEN
96  IF(PRESENT(errx)) THEN
97  IF(msk) THEN
98  IF(lv.EQ.1) THEN
99  DO idp = 1 , ndp
100  DO ielem = 1 , nelem
101  erreur=0.d0
102  tmp = x(ikle(ielem,idp))
103  CALL twosum(tmp,
104  & w(ielem,idp)* maskel(ielem),
105  & x(ikle(ielem,idp)),erreur)
106 ! CALL TWOSUM(ERRX(IKLE(IELEM,IDP)),ERREUR,
107 ! & ERRX(IKLE(IELEM,IDP)),ERREUR)
108  errx(ikle(ielem,idp)) = errx(ikle(ielem,idp))+erreur
109  ENDDO
110  ENDDO
111 ! DO IDP = 1 , NDP
112 ! CALL ASSVE1(X,IKLE(1,IDP),W(1,IDP),NELEM,NELMAX,LV,MSK
113 ! & ,MASKEL,NPOIN)
114 ! ENDDO
115  ELSE
116  DO idp = 1 , ndp
117  CALL assve1(x,ikle(1,idp),w(1,idp),nelem,nelmax,lv,msk
118  & ,maskel)
119  ENDDO
120  ENDIF
121  ELSE
122  IF(lv.EQ.1) THEN
123  DO idp = 1 , ndp
124  DO ielem = 1 , nelem
125  erreur=0.d0
126  tmp = x(ikle(ielem,idp))
127  CALL twosum(tmp,w(ielem,idp),
128  & x(ikle(ielem,idp)),erreur)
129 ! CALL TWOSUM(ERRX(IKLE(IELEM,IDP)),ERREUR,
130 ! & ERRX(IKLE(IELEM,IDP)),ERREUR)
131  errx(ikle(ielem,idp)) = errx(ikle(ielem,idp))+erreur
132  ENDDO
133  ENDDO
134  ELSE
135  DO idp = 1 , ndp
136  CALL assve1(x,ikle(1,idp),w(1,idp),nelem,nelmax,lv,msk
137  & ,maskel)
138  ENDDO
139  ENDIF
140  ENDIF
141  ELSE
142  DO idp = 1 , ndp
143  CALL assve1(x,ikle(1,idp),w(1,idp),nelem,nelmax,lv,msk
144  & ,maskel)
145  ENDDO
146 !
147  ENDIF
148  ENDIF
149 !
150 !-----------------------------------------------------------------------
151 !
152  RETURN
153  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine assvec(X, IKLE, NPOIN, NELEM, NELMAX, W, INIT, LV, MSK, MASKEL, NDP, ERRX)
Definition: assvec.f:7
subroutine assve1(X, IKLE, W, NELEM, NELMAX, LV, MSK, MASKEL)
Definition: assve1.f:7
subroutine twosum(A, B, X, Y)
Definition: twosum.f:7
Definition: bief.f:3