The TELEMAC-MASCARET system  trunk
om1201.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE om1201
3 ! *****************
4 !
5  &(op , dm,typdim,xm,typexm, dn,typdin,xn,typexn, c,
6  & nulone,nelbor,nbor,nelmax,ndiag,nptfr,nelebx,neleb)
7 !
8 !***********************************************************************
9 ! BIEF V7P0 21/08/2010
10 !***********************************************************************
11 !
12 !brief OPERATIONS ON MATRICES.
13 !code
14 !+ M: QUASI-BUBBLE TRIANGLE
15 !+ N: BOUNDARY MATRIX
16 !+ D: DIAGONAL MATRIX
17 !+ C: CONSTANT
18 !+
19 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES THE OPERATION TO BE
20 !+ PERFORMED ON MATRICES M AND N, D AND C.
21 !+
22 !+ THE RESULT IS MATRIX M.
23 !+
24 !+ OP = 'M=M+N ' : ADDS N TO M
25 !
26 !code
27 !+ CONVENTION FOR THE STORAGE OF EXTRA-DIAGONAL TERMS:
28 !+
29 !+ XM( , 1) ----> M(1,2)
30 !+ XM( , 2) ----> M(1,3)
31 !+ XM( , 3) ----> M(1,4)
32 !+ XM( , 4) ----> M(2,3)
33 !+ XM( , 5) ----> M(2,4)
34 !+ XM( , 6) ----> M(3,4)
35 !+ XM( , 7) ----> M(2,1)
36 !+ XM( , 8) ----> M(3,1)
37 !+ XM( , 9) ----> M(4,1)
38 !+ XM( ,10) ----> M(3,2)
39 !+ XM( ,11) ----> M(4,2)
40 !+ XM( ,12) ----> M(4,3)
41 !
42 !history J-M HERVOUET (LNHE)
43 !+ 23/06/2008
44 !+ V5P9
45 !+
46 !
47 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
48 !+ 13/07/2010
49 !+ V6P0
50 !+ Translation of French comments within the FORTRAN sources into
51 !+ English comments
52 !
53 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
54 !+ 21/08/2010
55 !+ V6P0
56 !+ Creation of DOXYGEN tags for automated documentation and
57 !+ cross-referencing of the FORTRAN sources
58 !
59 !history J-M HERVOUET (EDF LAB, LNHE)
60 !+ 13/03/2014
61 !+ V7P0
62 !+ Now written to enable different numbering of boundary points and
63 !+ boundary segments.
64 !
65 !history S.E.BOURBAN (HRW)
66 !+ 21/03/2017
67 !+ V7P3
68 !+ Replacement of the DATA declarations by the PARAMETER associates
69 !
70 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71 !| C |-->| A GIVEN CONSTANT USED IN OPERATION OP
72 !| DM |<->| DIAGONAL OF M
73 !| DN |-->| DIAGONAL OF N
74 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS
75 !| NDIAG |-->| NUMBER OF TERMS IN THE DIAGONAL
76 !| NELBOR |-->| FOR THE KTH BOUNDARY EDGE, GIVES THE CORRESPONDING
77 !| | | ELEMENT.
78 !| NELEB |-->| NUMBER OF BOUNDARY ELEMENTS
79 !| NELEBX |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS
80 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
81 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
82 !| NULONE |-->| GOES WITH ARRAY NELBOR. NELBOR GIVES THE
83 !| | | ADJACENT ELEMENT, NULONE GIVES THE LOCAL
84 !| | | NUMBER OF THE FIRST NODE OF THE BOUNDARY EDGE
85 !| | | I.E. 1, 2 OR 3 FOR TRIANGLES.
86 !| OP |-->| OPERATION TO BE DONE (SEE ABOVE)
87 !| TYPDIM |<->| TYPE OF DIAGONAL OF M:
88 !| | | TYPDIM = 'Q' : ANY VALUE
89 !| | | TYPDIM = 'I' : IDENTITY
90 !| | | TYPDIM = '0' : ZERO
91 !| TYPDIN |<->| TYPE OF DIAGONAL OF N:
92 !| | | TYPDIN = 'Q' : ANY VALUE
93 !| | | TYPDIN = 'I' : IDENTITY
94 !| | | TYPDIN = '0' : ZERO
95 !| TYPEXM |-->| TYPE OF OFF-DIAGONAL TERMS OF M:
96 !| | | TYPEXM = 'Q' : ANY VALUE
97 !| | | TYPEXM = 'S' : SYMMETRIC
98 !| | | TYPEXM = '0' : ZERO
99 !| TYPEXN |-->| TYPE OF OFF-DIAGONAL TERMS OF N:
100 !| | | TYPEXN = 'Q' : ANY VALUE
101 !| | | TYPEXN = 'S' : SYMMETRIC
102 !| | | TYPEXN = '0' : ZERO
103 !| XM |-->| OFF-DIAGONAL TERMS OF M
104 !| XN |-->| OFF-DIAGONAL TERMS OF N
105 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
106 !
107  USE bief, ex_om1201 => om1201
108 !
110  IMPLICIT NONE
111 !
112 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
113 !
114  INTEGER, INTENT(IN) :: NELMAX,NDIAG,NPTFR,NELEBX,NELEB
115  CHARACTER(LEN=8), INTENT(IN) :: OP
116  INTEGER, INTENT(IN) :: NULONE(nelebx),NELBOR(nelebx)
117  INTEGER, INTENT(IN) :: NBOR(*)
118  DOUBLE PRECISION, INTENT(IN) :: DN(*),XN(*)
119  DOUBLE PRECISION, INTENT(INOUT) :: DM(*),XM(nelmax,*)
120  CHARACTER(LEN=1), INTENT(INOUT) :: TYPDIM,TYPEXM,TYPDIN,TYPEXN
121  DOUBLE PRECISION, INTENT(IN) :: C
122 !
123 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
124 !
125  INTEGER K,IEL
126 !
127  DOUBLE PRECISION Z(1)
128 !
129 !-----------------------------------------------------------------------
130 ! BEWARE: ONLY WORKS FOR QUASI-BUBBLE
131  INTEGER :: CORNSY(4,2)
132  parameter( cornsy = reshape( (/
133  & 1,4,8,0, 7,10,2,0/), shape=(/ 4,2 /) ) )
134  INTEGER :: CORSYM(4)
135  parameter( corsym = (/ 1,4,2,0 /) )
136 !
137 !-----------------------------------------------------------------------
138 !
139  IF(op(1:8).EQ.'M=M+N ') THEN
140 !
141  IF(typdim.EQ.'Q'.AND.typdim.EQ.'Q'.AND.ndiag.GE.nptfr) THEN
142  CALL ovdb( 'X=X+Y ' , dm , dn , z , c , nbor , nptfr )
143  ELSE
144  WRITE(lu,199) typdim(1:1),op(1:8),typdin(1:1)
145 199 FORMAT(1x,'OM1201 (BIEF) : TYPDIM = ',a1,' NOT IMPLEMENTED',
146  & /,1x,'FOR THE OPERATION : ',a8,' WITH TYPDIN = ',a1)
147  CALL plante(1)
148  stop
149  ENDIF
150 !
151  IF(typexm(1:1).EQ.'Q'.AND.typexn(1:1).EQ.'Q') THEN
152 !
153 ! CASE WHERE BOTH MATRICES ARE NONSYMMETRICAL
154 !
155  DO k = 1 , neleb
156  iel = nelbor(k)
157  xm( iel , cornsy(nulone(k),1) ) =
158  & xm( iel , cornsy(nulone(k),1) ) + xn(k)
159  xm( iel , cornsy(nulone(k),2) ) =
160  & xm( iel , cornsy(nulone(k),2) ) + xn(k+nelebx)
161  ENDDO
162 !
163  ELSEIF(typexm(1:1).EQ.'Q'.AND.typexn(1:1).EQ.'S') THEN
164 !
165 ! CASE WHERE M CAN BE ANYTHING AND N IS SYMMETRICAL
166 !
167  DO k = 1 , neleb
168  iel = nelbor(k)
169  xm( iel , cornsy(nulone(k),1) ) =
170  & xm( iel , cornsy(nulone(k),1) ) + xn(k)
171  xm( iel , cornsy(nulone(k),2) ) =
172  & xm( iel , cornsy(nulone(k),2) ) + xn(k)
173  ENDDO
174 !
175  ELSEIF(typexm(1:1).EQ.'S'.AND.typexn(1:1).EQ.'S') THEN
176 !
177 ! CASE WHERE BOTH MATRICES ARE SYMMETRICAL
178 !
179  DO k = 1 , neleb
180  iel = nelbor(k)
181  xm( iel , corsym(nulone(k)) ) =
182  & xm( iel , corsym(nulone(k)) ) + xn(k)
183  ENDDO
184 !
185  ELSE
186  WRITE(lu,99) typexm(1:1),op(1:8),typexn(1:1)
187 99 FORMAT(1x,'OM1201 (BIEF) : TYPEXM = ',a1,' DOES NOT GO',
188  & /,1x,'FOR THE OPERATION : ',a8,' WITH TYPEXN = ',a1)
189  CALL plante(1)
190  stop
191  ENDIF
192 !
193 !-----------------------------------------------------------------------
194 !
195  ELSEIF(op(1:8).EQ.'M=M+TN ') THEN
196 !
197  CALL ovdb( 'X=X+Y ' , dm , dn , z , c , nbor , nptfr )
198 !
199  IF(typexm(1:1).EQ.'Q'.AND.typexn(1:1).EQ.'Q') THEN
200 !
201 ! CASE WHERE BOTH MATRICES ARE NONSYMMETRICAL
202 !
203  DO k = 1 , neleb
204  iel = nelbor(k)
205  xm( iel , cornsy(nulone(k),1) ) =
206  & xm( iel , cornsy(nulone(k),1) ) + xn(k+nelebx)
207  xm( iel , cornsy(nulone(k),2) ) =
208  & xm( iel , cornsy(nulone(k),2) ) + xn(k)
209  ENDDO
210 !
211  ELSEIF(typexm(1:1).EQ.'Q'.AND.typexn(1:1).EQ.'S') THEN
212 !
213 ! CASE WHERE M CAN BE ANYTHING AND N IS SYMMETRICAL
214 !
215  DO k = 1 , neleb
216  iel = nelbor(k)
217  xm( iel , cornsy(nulone(k),1) ) =
218  & xm( iel , cornsy(nulone(k),1) ) + xn(k)
219  xm( iel , cornsy(nulone(k),2) ) =
220  & xm( iel , cornsy(nulone(k),2) ) + xn(k)
221  ENDDO
222 !
223  ELSEIF(typexm(1:1).EQ.'S'.AND.typexn(1:1).EQ.'S') THEN
224 !
225 ! CASE WHERE BOTH MATRICES ARE SYMMETRICAL
226 !
227  DO k = 1 , neleb
228  iel = nelbor(k)
229  xm( iel , corsym(nulone(k)) ) =
230  & xm( iel , corsym(nulone(k)) ) + xn(k)
231  ENDDO
232 !
233  ELSE
234  WRITE(lu,99) typexm(1:1),op(1:8),typexn(1:1)
235  CALL plante(1)
236  stop
237  ENDIF
238 !
239 !-----------------------------------------------------------------------
240 !
241  ELSE
242 !
243  WRITE(lu,141) op
244 141 FORMAT(1x,'OM1201 (BIEF) : UNKNOWN OPERATION : ',a8)
245  CALL plante(1)
246  stop
247 !
248  ENDIF
249 !
250 !-----------------------------------------------------------------------
251 !
252  RETURN
253  END
subroutine om1201(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, NDIAG, NPTFR, NELEBX, NELEB)
Definition: om1201.f:8
subroutine ovdb(OP, X, Y, Z, C, NBOR, NPTFR)
Definition: ovdb.f:7
Definition: bief.f:3