The TELEMAC-MASCARET system  trunk
twoprod.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE twoprod
3 ! ******************
4 !
5  &(a,b,x,y)
6 !
7 !***********************************************************************
8 ! BIEF V7P3 24/02/2016
9 !***********************************************************************
10 !
11 !brief SCALAR PRODUCT AND CALCULATE ROUNDING ERROR.
12 !
13 !history R.NHEILI (Univerte de Perpignan, DALI)
14 !+ 24/02/2016
15 !+ V7P3
16 !+
17 !
18 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 !| A,B |-->| DOUBLE PRECISION SCALAR
20 !| X |<--| DOUBLE PRECISION PRODUC RESULT
21 !| Y |<--| DOUBLE PRECISION ROUNDING ERROR
22 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 !
25  IMPLICIT NONE
26 !
27 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 !
29  DOUBLE PRECISION, INTENT(IN) :: A,B
30  DOUBLE PRECISION, INTENT(OUT) :: X,Y
31 !
32 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33 !
34  DOUBLE PRECISION AH,AL,BH,BL
35 !
36 !-----------------------------------------------------------------------
37 !
38  ah=0.d0
39  al=0.d0
40  bh=0.d0
41  bl=0.d0
42  x=a*b
43  CALL split(a,ah,al)
44  CALL split(b,bh,bl)
45  y=al*bl-(((x-ah*bh)-al*bh)-ah*bl)
46 !
47 !
48 !-----------------------------------------------------------------------
49 !
50  END
51 !
52 !-----------------------------------------------------------------------
53 !
54 ! ****************
55  SUBROUTINE split
56 ! ****************
57  & (a,x,y)
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !
60 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61  DOUBLE PRECISION, INTENT(IN) :: A
62  DOUBLE PRECISION, INTENT(OUT) :: X,Y
63 !
64 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 !
66  DOUBLE PRECISION Z
67  INTEGER CONSTANTE
68 !
69 !-----------------------------------------------------------------------
70 !
71  constante= 134217729
72  z=0.d0
73  z=constante*a
74  x=z-(z-a)
75  y=a-x
76 !
77  END SUBROUTINE split
78 !
79 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
80 !
subroutine split(A, X, Y)
Definition: twoprod.f:58
subroutine twoprod(A, B, X, Y)
Definition: twoprod.f:7