Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / external / lapack / ieeeck.inc
blob851fb2d894f4f7cf1b05509f46f47e8a537133e8
1       INTEGER          FUNCTION IEEECK( ISPEC, ZERO, ONE )
3 !  -- LAPACK auxiliary routine (version 3.1) --
4 !     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5 !     November 2006
7 !     .. Scalar Arguments ..
8       INTEGER            ISPEC
9       REAL               ONE, ZERO
10 !     ..
12 !  Purpose
13 !  =======
15 !  IEEECK is called from the ILAENV to verify that Infinity and
16 !  possibly NaN arithmetic is safe (i.e. will not trap).
18 !  Arguments
19 !  =========
21 !  ISPEC   (input) INTEGER
22 !          Specifies whether to test just for inifinity arithmetic
23 !          or whether to test for infinity and NaN arithmetic.
24 !          = 0: Verify infinity arithmetic only.
25 !          = 1: Verify infinity and NaN arithmetic.
27 !  ZERO    (input) REAL
28 !          Must contain the value 0.0
29 !          This is passed to prevent the compiler from optimizing
30 !          away this code.
32 !  ONE     (input) REAL
33 !          Must contain the value 1.0
34 !          This is passed to prevent the compiler from optimizing
35 !          away this code.
37 !  RETURN VALUE:  INTEGER
38 !          = 0:  Arithmetic failed to produce the correct answers
39 !          = 1:  Arithmetic produced the correct answers
41 !     .. Local Scalars ..
42       REAL               NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF, &
43                          NEGZRO, NEWZRO, POSINF
44 !     ..
45 !     .. Executable Statements ..
46       IEEECK = 1
48       POSINF = ONE / ZERO
49       IF( POSINF.LE.ONE ) THEN
50          IEEECK = 0
51          RETURN
52       END IF
54       NEGINF = -ONE / ZERO
55       IF( NEGINF.GE.ZERO ) THEN
56          IEEECK = 0
57          RETURN
58       END IF
60       NEGZRO = ONE / ( NEGINF+ONE )
61       IF( NEGZRO.NE.ZERO ) THEN
62          IEEECK = 0
63          RETURN
64       END IF
66       NEGINF = ONE / NEGZRO
67       IF( NEGINF.GE.ZERO ) THEN
68          IEEECK = 0
69          RETURN
70       END IF
72       NEWZRO = NEGZRO + ZERO
73       IF( NEWZRO.NE.ZERO ) THEN
74          IEEECK = 0
75          RETURN
76       END IF
78       POSINF = ONE / NEWZRO
79       IF( POSINF.LE.ONE ) THEN
80          IEEECK = 0
81          RETURN
82       END IF
84       NEGINF = NEGINF*POSINF
85       IF( NEGINF.GE.ZERO ) THEN
86          IEEECK = 0
87          RETURN
88       END IF
90       POSINF = POSINF*POSINF
91       IF( POSINF.LE.ONE ) THEN
92          IEEECK = 0
93          RETURN
94       END IF
99 !     Return if we were only asked to check infinity arithmetic
101       IF( ISPEC.EQ.0 ) &
102          RETURN
104       NAN1 = POSINF + NEGINF
106       NAN2 = POSINF / NEGINF
108       NAN3 = POSINF / POSINF
110       NAN4 = POSINF*ZERO
112       NAN5 = NEGINF*NEGZRO
114       NAN6 = NAN5*0.0
116       IF( NAN1.EQ.NAN1 ) THEN
117          IEEECK = 0
118          RETURN
119       END IF
121       IF( NAN2.EQ.NAN2 ) THEN
122          IEEECK = 0
123          RETURN
124       END IF
126       IF( NAN3.EQ.NAN3 ) THEN
127          IEEECK = 0
128          RETURN
129       END IF
131       IF( NAN4.EQ.NAN4 ) THEN
132          IEEECK = 0
133          RETURN
134       END IF
136       IF( NAN5.EQ.NAN5 ) THEN
137          IEEECK = 0
138          RETURN
139       END IF
141       IF( NAN6.EQ.NAN6 ) THEN
142          IEEECK = 0
143          RETURN
144       END IF
146       RETURN
147       END FUNCTION IEEECK