The TELEMAC-MASCARET system  trunk
ovd.f
Go to the documentation of this file.
1 ! **************
2  SUBROUTINE ovd
3 ! **************
4 !
5  & ( op , x , y , z , c , npoin , iopt , d , eps )
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief OPERATIONS ON VECTORS INCLUDING DIVISIONS
12 !+ DIVISION BY 0 CAN BE TESTED.
13 !+
14 !+ IN THE EVENT OF A DIVIDE CHECK, CAN EITHER STOP THE
15 !+ PROGRAM OR SET THE RESULT OF THE OPERATION TO
16 !+ A VALUE: D.
17 !code
18 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES THE OPERATION TO BE
19 !+ PERFORMED ON VECTORS X,Y AND Z AND CONSTANT C.
20 !+
21 !+ THE RESULT IS VECTOR X.
22 !+
23 !+ OP = 'X=1/Y ' : COPIES INVERSE OF Y IN X
24 !+ OP = 'X=C/Y ' : DIVIDES C BY Y
25 !+ OP = 'X=Y/Z ' : DIVIDES Y BY Z
26 !+ OP = 'X=CY/Z ' : DIVIDES C.Y BY Z
27 !+ OP = 'X=CXY/Z ' : DIVIDES C.X.Y BY Z
28 !+ OP = 'X=X+CY/Z' : ADDS C.Y/Z TO X
29 !
30 !warning DIVIDE OPERATIONS INTERNALLY TAKE CARE OF DIVISIONS BY 0.
31 !+ SUCCESSFUL EXIT OF OVD IS THEREFORE NOT A PROOF THAT Y
32 !+ OR Z NEVER ARE 0
33 !
34 !history J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
35 !+ 26/11/93
36 !+ V5P2
37 !+
38 !
39 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
40 !+ 13/07/2010
41 !+ V6P0
42 !+ Translation of French comments within the FORTRAN sources into
43 !+ English comments
44 !
45 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
46 !+ 21/08/2010
47 !+ V6P0
48 !+ Creation of DOXYGEN tags for automated documentation and
49 !+ cross-referencing of the FORTRAN sources
50 !
51 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52 !| C |-->| A GIVEN CONSTANT
53 !| D |-->| A DIAGONAL MATRIX
54 !| EPS |-->| THRESHOLD TO AVOID DIVISIONS BY ZERO
55 !| IOPT |-->| OPTION FOR DIVISIONS BY ZERO
56 !| | | 1: NO TEST DONE (WILL CRASH IF DIVISION BY 0.).
57 !| | | 2: INFINITE TERMS REPLACED BY CONSTANT INFINI.
58 !| | | 3: STOP IF DIVISION BY ZERO.
59 !| | | 4: DIVISIONS BY 0. REPLACED BY DIVISIONS/ZERO
60 !| | | ZERO BEING AN OPTIONAL ARGUMENT
61 !| NPOIN |-->| SIZE OF VECTORS
62 !| OP |-->| STRING INDICATING THE OPERATION TO BE DONE
63 !| X |<--| RESULTING VECTOR
64 !| Y |-->| TO BE USED IN THE OPERATION
65 !| Z |-->| TO BE USED IN THE OPERATION
66 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67 !
69  IMPLICIT NONE
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  INTEGER, INTENT(IN) :: NPOIN,IOPT
74  DOUBLE PRECISION, INTENT(INOUT) :: X(npoin)
75  DOUBLE PRECISION, INTENT(IN) :: Y(npoin),Z(npoin),C,D,EPS
76  CHARACTER(LEN=8), INTENT(IN) :: OP
77 !
78 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 !
80  INTEGER I
81 !
82 !-----------------------------------------------------------------------
83 !
84  IF(op(1:8).EQ.'X=1/Y ') THEN
85 !
86  IF(iopt.EQ.1) THEN
87 !
88  DO i=1,npoin
89  x(i) = 1.d0/y(i)
90  ENDDO ! I
91 !
92  ELSEIF(iopt.EQ.2) THEN
93 !
94  DO i=1,npoin
95 !
96  IF (abs(y(i)).GT.eps) THEN
97  x(i) = 1.d0/y(i)
98  ELSE
99  x(i) = d
100  ENDIF
101 !
102  ENDDO ! I
103 !
104  ELSEIF(iopt.EQ.3) THEN
105 !
106  DO i=1,npoin
107 !
108  IF (abs(y(i)).GT.eps) THEN
109  x(i) = 1.d0/y(i)
110  ELSE
111  WRITE(lu,2000) i,op,eps
112  CALL plante(1)
113  stop
114  ENDIF
115 !
116  ENDDO ! I
117 !
118  ELSEIF(iopt.EQ.4) THEN
119 !
120  DO i=1,npoin
121 !
122  IF (abs(y(i)).GT.eps) THEN
123  x(i) = 1.d0/y(i)
124  ELSEIF (y(i).GE.0.d0) THEN
125  x(i) = 1.d0/eps
126  ELSE
127  x(i) = -1.d0/eps
128  ENDIF
129 !
130  ENDDO ! I
131 !
132  ENDIF
133 !
134 !-----------------------------------------------------------------------
135 !
136  ELSEIF(op(1:8).EQ.'X=C/Y ') THEN
137 !
138  IF(iopt.EQ.1) THEN
139 !
140  DO i=1,npoin
141  x(i) = c/y(i)
142  ENDDO ! I
143 !
144  ELSEIF(iopt.EQ.2) THEN
145 !
146  DO i=1,npoin
147 !
148  IF (abs(y(i)).GT.eps) THEN
149  x(i) = c/y(i)
150  ELSE
151  x(i) = d
152  ENDIF
153 !
154  ENDDO ! I
155 !
156  ELSEIF(iopt.EQ.3) THEN
157 !
158  DO i=1,npoin
159 !
160  IF (abs(y(i)).GT.eps) THEN
161  x(i) = c/y(i)
162  ELSE
163  WRITE(lu,2000) i,op,eps
164  CALL plante(1)
165  stop
166  ENDIF
167 !
168  ENDDO ! I
169 !
170  ELSEIF(iopt.EQ.4) THEN
171 !
172  DO i=1,npoin
173 !
174  IF (abs(y(i)).GT.eps) THEN
175  x(i) = c/y(i)
176  ELSEIF (y(i).GE.0.d0) THEN
177  x(i) = 1.d0/eps
178  ELSE
179  x(i) = -1.d0/eps
180  ENDIF
181 !
182  ENDDO ! I
183 !
184  ENDIF
185 !
186 !-----------------------------------------------------------------------
187 !
188  ELSEIF(op(1:8).EQ.'X=Y/Z ') THEN
189 !
190  IF(iopt.EQ.1) THEN
191 !
192  DO i=1,npoin
193  x(i) = y(i) / z(i)
194  ENDDO ! I
195 !
196  ELSEIF(iopt.EQ.2) THEN
197 !
198  DO i=1,npoin
199 !
200  IF (abs(z(i)).GT.eps) THEN
201  x(i) = y(i) / z(i)
202  ELSE
203  x(i) = d
204  ENDIF
205 !
206  ENDDO ! I
207 !
208  ELSEIF(iopt.EQ.3) THEN
209 !
210  DO i=1,npoin
211 !
212  IF (abs(z(i)).GT.eps) THEN
213  x(i) = y(i) / z(i)
214  ELSE
215  WRITE(lu,2000) i,op,eps
216  CALL plante(1)
217  stop
218  ENDIF
219 !
220  ENDDO ! I
221  ELSEIF(iopt.EQ.4) THEN
222 !
223  DO i=1,npoin
224 !
225  IF (abs(z(i)).GT.eps) THEN
226  x(i) = y(i) / z(i)
227  ELSEIF (abs(y(i)).LT.eps) THEN
228  x(i) = d
229  ELSEIF (z(i).GE.0.d0) THEN
230  x(i) = y(i) / eps
231  ELSE
232  x(i) = -y(i) / eps
233  ENDIF
234 !
235  ENDDO ! I
236 !
237  ENDIF
238 !
239 !-----------------------------------------------------------------------
240 !
241  ELSEIF(op(1:8).EQ.'X=CY/Z ') THEN
242 !
243  IF(iopt.EQ.1) THEN
244 !
245  DO i=1,npoin
246  x(i) = c*y(i) / z(i)
247  ENDDO ! I
248 !
249  ELSEIF(iopt.EQ.2) THEN
250 !
251  DO i=1,npoin
252 !
253  IF (abs(z(i)).GT.eps) THEN
254  x(i) = c*y(i) / z(i)
255  ELSE
256  x(i) = d
257  ENDIF
258 !
259  ENDDO ! I
260 !
261  ELSEIF(iopt.EQ.3) THEN
262 !
263  DO i=1,npoin
264 !
265  IF (abs(z(i)).GT.eps) THEN
266  x(i) = c*y(i) / z(i)
267  ELSE
268  WRITE(lu,2000) i,op,eps
269  CALL plante(1)
270  stop
271  ENDIF
272 !
273  ENDDO ! I
274 !
275  ELSEIF(iopt.EQ.4) THEN
276 !
277  DO i=1,npoin
278 !
279  IF (abs(z(i)).GT.eps) THEN
280  x(i) = c*y(i) / z(i)
281  ELSEIF (abs(c*y(i)).LT.eps) THEN
282  x(i) = d
283  ELSEIF (z(i).GE.0.d0) THEN
284  x(i) = c*y(i) / eps
285  ELSE
286  x(i) = -c*y(i) / eps
287  ENDIF
288 !
289  ENDDO ! I
290 !
291  ENDIF
292 !
293 !-----------------------------------------------------------------------
294 !
295  ELSEIF(op(1:8).EQ.'X=CXY/Z ') THEN
296 !
297  IF(iopt.EQ.1) THEN
298 !
299  DO i=1,npoin
300  x(i) = c*x(i)*y(i) / z(i)
301  ENDDO ! I
302 !
303  ELSEIF(iopt.EQ.2) THEN
304 !
305  DO i=1,npoin
306 !
307  IF (abs(z(i)).GT.eps) THEN
308  x(i) = c*x(i)*y(i) / z(i)
309  ELSE
310  x(i) = d
311  ENDIF
312 !
313  ENDDO ! I
314 !
315  ELSEIF(iopt.EQ.3) THEN
316 !
317  DO i=1,npoin
318 !
319  IF (abs(z(i)).GT.eps) THEN
320  x(i) = c*x(i)*y(i) / z(i)
321  ELSE
322  WRITE(lu,2000) i,op,eps
323  CALL plante(1)
324  stop
325  ENDIF
326 !
327  ENDDO ! I
328 !
329  ELSEIF(iopt.EQ.4) THEN
330 !
331  DO i=1,npoin
332 !
333  IF (abs(z(i)).GT.eps) THEN
334  x(i) = c*x(i)*y(i) / z(i)
335  ELSEIF (abs(c*x(i)*y(i)).LT.eps) THEN
336  x(i) = d
337  ELSEIF (z(i).GE.0.d0) THEN
338  x(i) = c*y(i) / eps
339  ELSE
340  x(i) = -c*y(i) / eps
341  ENDIF
342 !
343  ENDDO ! I
344 !
345 !
346  ENDIF
347 !
348 !-----------------------------------------------------------------------
349 !
350  ELSEIF(op(1:8).EQ.'X=X+CY/Z') THEN
351 !
352  IF(iopt.EQ.1) THEN
353 !
354  DO i=1,npoin
355  x(i) = x(i) + c * y(i) / z(i)
356  ENDDO ! I
357 !
358  ELSEIF(iopt.EQ.2) THEN
359 !
360  DO i=1,npoin
361 !
362  IF (abs(z(i)).GT.eps) THEN
363  x(i) = x(i) + c * y(i) / z(i)
364  ELSE
365  x(i) = d
366  ENDIF
367 !
368  ENDDO ! I
369 !
370  ELSEIF(iopt.EQ.3) THEN
371 !
372  DO i=1,npoin
373 !
374  IF (abs(z(i)).GT.eps) THEN
375  x(i) = x(i) + c * y(i) / z(i)
376  ELSE
377  WRITE(lu,2000) i,op,eps
378  CALL plante(1)
379  stop
380  ENDIF
381 !
382  ENDDO ! I
383 !
384  ELSEIF(iopt.EQ.4) THEN
385 !
386  DO i=1,npoin
387 !
388  IF (abs(z(i)).GT.eps) THEN
389  x(i) = x(i) + c*y(i) / z(i)
390  ELSEIF (abs(c*y(i)).LT.eps) THEN
391  x(i) = d
392  ELSEIF (z(i).GE.0.d0) THEN
393  x(i) = x(i) + c*y(i) / eps
394  ELSE
395  x(i) = x(i) - c*y(i) / eps
396  ENDIF
397 !
398  ENDDO ! I
399 !
400  ENDIF
401 !
402 !-----------------------------------------------------------------------
403 !
404  ELSE
405 !
406  WRITE(lu,4000) op
407  CALL plante(1)
408  stop
409 !
410  ENDIF
411 !
412 !-----------------------------------------------------------------------
413 !
414 2000 FORMAT(1x,'OVD (BIEF) : DIVIDE BY ZERO AT POINT ',1i6,
415  & ' FOR OPERATION ',a8,/,1x,
416  & 'THE CRITERION IS ',g16.7)
417 4000 FORMAT(1x,'OVD (BIEF) : UNKNOWN OPERATION: ',a8)
418 !
419 !-----------------------------------------------------------------------
420 !
421  RETURN
422  END
subroutine ovd(OP, X, Y, Z, C, NPOIN, IOPT, D, EPS)
Definition: ovd.f:7