The TELEMAC-MASCARET system  trunk
ov_comp.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE ov_comp
3 ! ******************
4 !
5  & ( op , x , y , z , c , npoin,
6  & x_err , y_err , z_err)
7 !
8 !***********************************************************************
9 ! BIEF V6P1 21/08/2010
10 !***********************************************************************
11 !
12 !brief OPERATIONS ON VECTORS.
13 !code
14 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES THE OPERATION TO BE
15 !+ PERFORMED ON VECTORS X,Y AND Z AND CONSTANT C.
16 !+
17 !+ THE RESULT IS VECTOR X.
18 !+
19 !+ OP = 'X=C ' : SETS X TO C
20 !+ OP = 'X=Y ' : COPIES Y IN X
21 !+ OP = 'X=+Y ' : IDEM
22 !+ OP = 'X=-Y ' : COPIES -Y IN X
23 !+ OP = 'X=1/Y ' : COPIES INVERSE OF Y IN X
24 !+ OP = 'X=Y+Z ' : ADDS Y AND Z
25 !+ OP = 'X=Y-Z ' : SUBTRACTS Z TO Y
26 !+ OP = 'X=YZ ' : Y.Z
27 !+ OP = 'X=-YZ ' : -Y.Z
28 !+ OP = 'X=XY ' : X.Y
29 !+ OP = 'X=X+YZ ' : ADDS Y.Z TO X
30 !+ OP = 'X=X-YZ ' : SUBTRACTS Y.Z FROM X
31 !+ OP = 'X=CXY ' : C.X.Y
32 !+ OP = 'X=CYZ ' : C.Y.Z
33 !+ OP = 'X=CXYZ ' : C.X.Y.Z
34 !+ OP = 'X=X+CYZ ' : ADDS C.Y.Z TO X
35 !+ OP = 'X=Y/Z ' : DIVIDES Y BY Z
36 !+ OP = 'X=CY/Z ' : DIVIDES C.Y BY Z
37 !+ OP = 'X=CXY/Z ' : DIVIDES C.X.Y BY Z
38 !+ OP = 'X=X+CY/Z' : ADDS C.Y/Z TO X
39 !+ OP = 'X=X+Y ' : ADDS Y TO X
40 !+ OP = 'X=X-Y ' : SUBTRACTS Y FROM X
41 !+ OP = 'X=CX ' : MULTIPLIES X BY C
42 !+ OP = 'X=CY ' : MULTIPLIES Y BY C
43 !+ OP = 'X=Y+CZ ' : ADDS C.Z TO Y
44 !+ OP = 'X=X+CY ' : ADDS C.Y TO X
45 !+ OP = 'X=SQR(Y)' : SQUARE ROOT OF Y
46 !+ OP = 'X=ABS(Y)' : ABSOLUTE VALUE OF Y
47 !+ OP = 'X=N(Y,Z)' : NORM OF THE VECTOR WITH COMPONENTS Y AND Z
48 !+ OP = 'X=Y+C ' : ADDS C TO Y
49 !+ OP = 'X=X+C ' : ADDS C TO X
50 !+ OP = 'X=Y**C ' : Y TO THE POWER C
51 !+ OP = 'X=COS(Y)' : COSINE OF Y
52 !+ OP = 'X=SIN(Y)' : SINE OF Y
53 !+ OP = 'X=ATN(Y)' : ARC TANGENT OF Y
54 !+ OP = 'X=A(Y,Z)' : ATAN2(Y,Z)
55 !+ OP = 'X=+(Y,C)' : MAXIMUM OF Y AND C
56 !+ OP = 'X=-(Y,C)' : MINIMUM OF Y AND C
57 !+ OP = 'X=+(Y,Z)' : MAXIMUM OF Y AND Z
58 !+ OP = 'X=-(Y,Z)' : MINIMUM OF Y AND Z
59 !+ OP = 'X=YIFZ<C' : COPIES Y IN X IF Z < C , FOR EACH POINT
60 !+ OP = 'X=C(Y-Z)' : MULTIPLIES C BY (Y-Z)
61 !
62 !warning DIVIDE OPERATIONS INTERNALLY TAKE CARE OF DIVISIONS BY 0.
63 !+ SUCCESSFUL EXIT OF OV IS THEREFORE NOT A PROOF THAT Y OR Z
64 !+ NEVER ARE 0. FOR SUCH OPERATIONS, PREFERABLY USE OVD
65 !
66 !history J-M HERVOUET (LNHE) ; F LEPEINTRE (LNH)
67 !+ 17/03/2010
68 !+ V6P0
69 !+ ORIGINAL IDEA IN ULYSSE. THANK YOU D. LAURENCE
70 !
71 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
72 !+ 13/07/2010
73 !+ V6P0
74 !+ Translation of French comments within the FORTRAN sources into
75 !+ English comments
76 !
77 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
78 !+ 21/08/2010
79 !+ V6P0
80 !+ Creation of DOXYGEN tags for automated documentation and
81 !+ cross-referencing of the FORTRAN sources
82 !
83 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84 !| C |-->| A GIVEN CONSTANT
85 !| NPOIN |-->| SIZE OF VECTORS
86 !| OP |-->| STRING INDICATING THE OPERATION TO BE DONE
87 !| X |<--| RESULTING VECTOR
88 !| Y |-->| TO BE USED IN THE OPERATION
89 !| Z |-->| TO BE USED IN THE OPERATION
90 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91 !
93  IMPLICIT NONE
94 !
95 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
96 !
97  INTEGER, INTENT(IN) :: NPOIN
98  DOUBLE PRECISION, INTENT(IN) :: Y(npoin),Z(*),C
99  DOUBLE PRECISION, INTENT(INOUT) :: X(npoin)
100  DOUBLE PRECISION,OPTIONAL,INTENT(IN):: Y_ERR(npoin),Z_ERR(npoin)
101  DOUBLE PRECISION,OPTIONAL, INTENT(INOUT) :: X_ERR(npoin)
102  CHARACTER(LEN=8), INTENT(IN) :: OP
103 !
104 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
105 !
106  INTEGER I
107  DOUBLE PRECISION ERROR,ERROR1,TEMP(npoin),TEST
108  DOUBLE PRECISION TMP
109 !
110  INTRINSIC sqrt,abs,cos,sin,atan,max,min
111 !
112 !-----------------------------------------------------------------------
113 !
114  temp=0.d0
115  error=0.d0
116  error1=0.d0
117  SELECT CASE(op(3:8))
118 !
119 !-----------------------------------------------------------------------
120 !
121  CASE('C ')
122 !
123  DO i=1,npoin
124  x(i) = c
125  ENDDO
126 !
127 !-----------------------------------------------------------------------
128 !
129  CASE('0 ')
130 !
131  DO i=1,npoin
132  x(i) = 0.d0
133  IF (PRESENT (x_err)) THEN
134  x_err(i)=0.d0
135  ENDIF
136  ENDDO
137 !
138 !-----------------------------------------------------------------------
139 !
140  CASE('Y ')
141 !
142  DO i=1,npoin
143  x(i) = y(i)
144  IF (PRESENT (x_err) .AND. PRESENT (y_err))THEN
145  x_err(i) = y_err(i)
146  ENDIF
147  ENDDO
148 !
149 !-----------------------------------------------------------------------
150 !
151  CASE('+Y ')
152 !
153  DO i=1,npoin
154  x(i) = y(i)
155  IF (PRESENT (x_err).AND. PRESENT (y_err)) THEN
156  x_err(i)=y_err(i)
157  ENDIF
158  ENDDO
159 !
160 !-----------------------------------------------------------------------
161 !
162  CASE('-Y ')
163 !
164  DO i=1,npoin
165  x(i) = - y(i)
166  IF (PRESENT (x_err).AND. PRESENT (y_err)) THEN
167  x_err(i)=-y_err(i)
168  ENDIF
169  ENDDO
170 !
171 !-----------------------------------------------------------------------
172 !
173  CASE('1/Y ')
174 !
175  DO i=1,npoin
176  x(i) = 1.d0/y(i)
177  ENDDO
178 !
179 !-----------------------------------------------------------------------
180 !
181  CASE('Y+Z ')
182 !
183  DO i=1,npoin
184  CALL twosum(y(i),z(i),x(i),error)
185  IF (PRESENT (x_err) .AND. PRESENT (y_err)
186  & .AND. PRESENT (z_err)) THEN
187  x_err(i)=(y_err(i)+z_err(i))+error
188  ENDIF
189  !X(I) = Y(I) + Z(I)
190  ENDDO
191 !
192 !-----------------------------------------------------------------------
193 !
194  CASE('Y-Z ')
195 !
196  DO i=1,npoin
197  CALL twosum(y(i),-z(i),x(i),error)
198  IF (PRESENT (x_err) .AND. PRESENT (y_err)
199  & .AND. PRESENT (z_err)) THEN
200  x_err(i)=(y_err(i)-z_err(i))+error
201  ENDIF
202  !X(I) = Y(I) - Z(I)
203  ENDDO
204 !
205 !-----------------------------------------------------------------------
206 !
207  CASE('YZ ')
208 !
209  DO i=1,npoin
210  CALL twoprod(y(i),z(i),x(i),error)
211  IF (PRESENT (x_err) .AND. PRESENT (y_err)
212  & .AND. PRESENT (z_err)) THEN
213  x_err(i)=(y(i) * z_err(i))+(y_err(i) * z(i))
214  & +(y_err(i) * z_err(i))
215  x_err(i)=x_err(i)+ error
216  ENDIF
217  !X(I) = Y(I) * Z(I)
218  ENDDO
219 !
220 !-----------------------------------------------------------------------
221 !
222  CASE('-YZ ')
223 !
224  DO i=1,npoin
225  CALL twoprod(-y(i),z(i),x(i),error)
226  IF (PRESENT (x_err) .AND. PRESENT (y_err)
227  & .AND. PRESENT (z_err)) THEN
228  x_err(i)=(-y(i) * z_err(i))+(-y_err(i) * z(i))
229  x_err(i)=x_err(i)+ error
230  ENDIF
231  !X(I) = -Y(I) * Z(I)
232  ENDDO
233 !
234 !-----------------------------------------------------------------------
235 !
236  CASE('XY ')
237 !
238  DO i=1,npoin
239  test=0.d0
240  CALL twoprod(x(i),y(i),test,error)
241  IF (PRESENT (x_err) .AND. PRESENT (y_err)) THEN
242  x_err(i)=(x(i) * y_err(i))+(x_err(i) * y(i))
243  & +(x_err(i) * y_err(i))
244  x_err(i)=x_err(i)+ error
245  ENDIF
246  x(i) = test
247  ENDDO
248 !
249 !-----------------------------------------------------------------------
250 !
251  CASE('X+YZ ')
252 !
253  DO i=1,npoin
254  CALL twoprod(y(i),z(i),temp(i),error1)
255  tmp = x(i)
256  CALL twosum(tmp,temp(i),x(i),error)
257  IF (PRESENT (x_err).AND. PRESENT (y_err)
258  & .AND. PRESENT (z_err))THEN
259  x_err(i)=x_err(i)+(y(i) * z_err(i))
260  & +(y_err(i) * z(i))
261  x_err(i)=x_err(i)+ error1
262  x_err(i)=x_err(i)+error
263  ENDIF
264  !X(I) = X(I) + Y(I) * Z(I)
265  ENDDO
266 !
267 !-----------------------------------------------------------------------
268 !
269  CASE('X-YZ ')
270 !
271  DO i=1,npoin
272  CALL twoprod(y(i),z(i),temp(i),error1)
273  tmp = x(i)
274  CALL twosum(tmp,-temp(i),x(i),error)
275  IF (PRESENT (x_err).AND. PRESENT (y_err)
276  & .AND. PRESENT (z_err))THEN
277  temp(i)=(y(i) * z_err(i))
278  & +(y_err(i) * z(i))+(y_err(i) * z_err(i))
279  temp(i)=temp(i)+error1
280  x_err(i)=(x_err(i)-temp(i))+error
281  ENDIF
282  !X(I) = X(I) - Y(I) * Z(I)
283  ENDDO
284 !
285 !-----------------------------------------------------------------------
286 !
287  CASE('CXY ')
288 !
289  DO i=1,npoin
290  x(i) = c * x(i) * y(i)
291  ENDDO
292 !
293 !-----------------------------------------------------------------------
294 !
295  CASE('CYZ ')
296 !
297  DO i=1,npoin
298  CALL twoprod(c*y(i),z(i),x(i),error)
299  IF (PRESENT (x_err) .AND. PRESENT (y_err)
300  & .AND. PRESENT (z_err)) THEN
301  x_err(i)= (c*y(i) * z_err(i))
302  & +(c*y_err(i) * z(i))+(c*y_err(i) * z_err(i))
303  x_err(i)= x_err(i)+error
304  ENDIF
305  !X(I) = C* Y(I) * Z(I)
306  ENDDO
307 !
308 !-----------------------------------------------------------------------
309 !
310  CASE('CXYZ ')
311 !
312  DO i=1,npoin
313  x(i) = c * x(i) * y(i) * z(i)
314  ENDDO
315 !
316 !-----------------------------------------------------------------------
317 !
318  CASE('X+CYZ ')
319 !
320  DO i=1,npoin
321  x(i) = x(i) + c * y(i) * z(i)
322  ENDDO
323 !
324 !-----------------------------------------------------------------------
325 !
326  CASE('Y/Z ')
327 !
328  DO i=1,npoin
329  x(i) = y(i) / z(i)
330  ENDDO
331 !
332 !-----------------------------------------------------------------------
333 !
334  CASE('CY/Z ')
335 !
336  DO i=1,npoin
337  x(i) = c*y(i) / z(i)
338  ENDDO
339 !
340 !-----------------------------------------------------------------------
341 !
342  CASE('CXY/Z ')
343 !
344  DO i=1,npoin
345  x(i) = c*x(i)*y(i) / z(i)
346  ENDDO
347 !
348 !-----------------------------------------------------------------------
349 !
350  CASE('X+CY/Z')
351 !
352  DO i=1,npoin
353  x(i) = x(i) + c * y(i) / z(i)
354  ENDDO
355 !
356 !-----------------------------------------------------------------------
357 !
358  CASE('X+Y ')
359 !
360  DO i=1,npoin
361  tmp = x(i)
362  CALL twosum(tmp,y(i),x(i),error)
363  IF (PRESENT (x_err) .AND. PRESENT (y_err))THEN
364  x_err(i)=(x_err(i)+y_err(i))+error
365  ENDIF
366  !X(I) = X(I) + Y(I)
367  ENDDO
368 !
369 !-----------------------------------------------------------------------
370 !
371  CASE('X-Y ')
372  DO i=1,npoin
373  tmp = x(i)
374  CALL twosum(tmp,-y(i),x(i),error)
375  IF (PRESENT (x_err))THEN
376  x_err(i)=(x_err(i)-y_err(i))+error
377  ENDIF
378  !X(I) = X(I) - Y(I)
379  ENDDO
380 !
381 !-----------------------------------------------------------------------
382 !
383  CASE('CX ')
384 !
385  DO i=1,npoin
386  x(i) = c * x(i)
387  ENDDO
388 !
389 !-----------------------------------------------------------------------
390 !
391  CASE('CY ')
392 !
393  DO i=1,npoin
394  CALL twoprod(c,y(i),x(i),error)
395  IF (PRESENT (x_err) .AND. PRESENT (y_err)) THEN
396  x_err(i)=(c * y_err(i))
397  x_err(i)=x_err(i)+error
398  ENDIF
399  !X(I) = C * Y(I)
400  ENDDO
401 !
402 !-----------------------------------------------------------------------
403 !
404  CASE('Y+CZ ')
405 !
406  DO i=1,npoin
407  x(i) = y(i) + c * z(i)
408  ENDDO
409 !
410 !-----------------------------------------------------------------------
411 !
412  CASE('X+CY ')
413 !
414  DO i=1,npoin
415  CALL twoprod(c,y(i),temp(i),error1)
416  tmp = x(i)
417  CALL twosum(tmp,temp(i),x(i),error)
418  IF (PRESENT (x_err).AND. PRESENT (y_err))THEN
419  x_err(i)=x_err(i)+(c* y_err(i))
420  error=error + error1
421  x_err(i)=x_err(i)+error
422  ENDIF
423  !X(I) = X(I) + C * Y(I)
424  ENDDO
425 !
426 !-----------------------------------------------------------------------
427 !
428  CASE('SQR(Y)')
429 !
430  DO i=1,npoin
431  x(i) = sqrt(y(i))
432  ENDDO
433 !
434 !-----------------------------------------------------------------------
435 !
436  CASE('ABS(Y)')
437 !
438  DO i=1,npoin
439  x(i) = abs(y(i))
440  IF (PRESENT (x_err) .AND. PRESENT (y_err))THEN
441  x_err(i) = abs(y_err(i))
442  ENDIF
443  ENDDO
444 !
445 !-----------------------------------------------------------------------
446 !
447  CASE('N(Y,Z)')
448 !
449  DO i=1,npoin
450  x(i) = sqrt( y(i)**2 + z(i)**2 )
451  ENDDO
452 !
453 !-----------------------------------------------------------------------
454 !
455  CASE('Y+C ')
456 !
457  DO i=1,npoin
458  x(i) = y(i) + c
459  ENDDO
460 !
461 !-----------------------------------------------------------------------
462 !
463  CASE('X+C ')
464 !
465  DO i=1,npoin
466  x(i) = x(i) + c
467  ENDDO
468 !
469 !-----------------------------------------------------------------------
470 !
471  CASE('Y**C ')
472 !
473  DO i=1,npoin
474  IF(y(i).GE.0.d0) THEN
475  x(i) = y(i)**c
476  ELSE
477  WRITE(lu,101)
478 101 FORMAT(1x,'OV (BIEF): Y**C FORBIDDEN IF Y < 0')
479  CALL plante(1)
480  stop
481  ENDIF
482  ENDDO
483 !
484 !-----------------------------------------------------------------------
485 !
486  CASE('COS(Y)')
487 !
488  DO i=1,npoin
489  x(i) = cos(y(i))
490  ENDDO
491 !
492 !-----------------------------------------------------------------------
493 !
494  CASE('SIN(Y)')
495 !
496  DO i=1,npoin
497  x(i) = sin(y(i))
498  ENDDO
499 !
500 !-----------------------------------------------------------------------
501 !
502  CASE('ATN(Y)')
503 !
504  DO i=1,npoin
505  x(i) = atan(y(i))
506  ENDDO
507 !
508 !-----------------------------------------------------------------------
509 !
510  CASE('A(Y,Z)')
511 !
512  DO i=1,npoin
513  x(i) = atan2(y(i),z(i))
514  ENDDO
515 !
516 !-----------------------------------------------------------------------
517 !
518  CASE('+(Y,C)')
519 !
520  DO i=1,npoin
521  x(i) = max(y(i),c)
522  ENDDO
523 !
524 !-----------------------------------------------------------------------
525 !
526  CASE('-(Y,C)')
527 !
528  DO i=1,npoin
529  x(i) = min(y(i),c)
530  ENDDO
531 !
532 !-----------------------------------------------------------------------
533 !
534  CASE('+(Y,Z)')
535 !
536  DO i=1,npoin
537  x(i) = max(y(i),z(i))
538  ENDDO
539 !
540 !-----------------------------------------------------------------------
541 !
542  CASE('-(Y,Z)')
543 !
544  DO i=1,npoin
545  x(i) = min(y(i),z(i))
546  ENDDO
547 !
548 !-----------------------------------------------------------------------
549 !
550  CASE('YIFZ<C')
551 !
552  DO i=1,npoin
553  IF ( z(i).LT.c ) x(i) = y(i)
554  ENDDO
555 !
556 !-----------------------------------------------------------------------
557 !
558  CASE('C(Y-Z)')
559 !
560  DO i=1,npoin
561  x(i) = c*(y(i)-z(i))
562  ENDDO
563 !
564 !-----------------------------------------------------------------------
565 !
566  CASE DEFAULT
567 !
568  WRITE(lu,1001) op
569 1001 FORMAT(1x,'OV (BIEF) : UNKNOWN OPERATION: ',a8)
570  CALL plante(1)
571  stop
572 !
573 !-----------------------------------------------------------------------
574 !
575  END SELECT
576 !
577 !-----------------------------------------------------------------------
578 !
579  RETURN
580  END
subroutine ov_comp(OP, X, Y, Z, C, NPOIN, X_ERR, Y_ERR, Z_ERR)
Definition: ov_comp.f:8
subroutine twoprod(A, B, X, Y)
Definition: twoprod.f:7
subroutine twosum(A, B, X, Y)
Definition: twosum.f:7