@@ -10,6 +10,8 @@ module m_eigen_solver
10
10
11
11
use m_precision_select
12
12
13
+ use m_helper_basic ! < Functions to compare floating point numbers
14
+
13
15
implicit none
14
16
15
17
private ;
@@ -124,7 +126,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
124
126
125
127
do 110 i = 1 , l
126
128
if (i == j) go to 110
127
- if (ar(j, i) /= 0.0_wp .or. ai(j, i) /= 0.0_wp ) go to 120
129
+ if (.not. f_approx_equal( ar(j, i), 0.0_wp ) .or. .not. f_approx_equal( ai(j, i), 0.0_wp ) ) go to 120
128
130
110 end do
129
131
130
132
ml = l
@@ -140,7 +142,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
140
142
141
143
do 150 i = k, l
142
144
if (i == j) go to 150
143
- if (ar(i, j) /= 0.0_wp .or. ai(i, j) /= 0.0_wp ) go to 170
145
+ if (.not. f_approx_equal( ar(i, j), 0.0_wp ) .or. .not. f_approx_equal( ai(i, j), 0.0_wp ) ) go to 170
144
146
150 end do
145
147
146
148
ml = k
@@ -164,7 +166,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
164
166
r = r + abs (ar(i, j)) + abs (ai(i, j))
165
167
200 end do
166
168
! guard against zero c or r due to underflow
167
- if (c == 0.0_wp .or. r == 0.0_wp ) go to 270
169
+ if (f_approx_equal(c, 0.0_wp ) .or. f_approx_equal(r, 0.0_wp ) ) go to 270
168
170
g = r/ radix
169
171
f = 1.0_wp
170
172
s = c + r
@@ -242,7 +244,7 @@ pure subroutine corth(nm, nl, low, igh, ar, ai, ortr, orti)
242
244
do 90 i = ml, igh
243
245
scale = scale + abs (ar(i, ml - 1 )) + abs (ai(i, ml - 1 ))
244
246
90 end do
245
- if (scale == 0._wp ) go to 180
247
+ if (f_approx_equal( scale, 0._wp ) ) go to 180
246
248
mp = ml + igh
247
249
! for i=igh step -1 until ml do
248
250
do 100 ii = ml, igh
@@ -254,7 +256,7 @@ pure subroutine corth(nm, nl, low, igh, ar, ai, ortr, orti)
254
256
255
257
g = sqrt (h)
256
258
call pythag(ortr(ml), orti(ml), f)
257
- if (f == 0._wp ) go to 103
259
+ if (f_approx_equal(f, 0._wp ) ) go to 103
258
260
h = h + f* g
259
261
g = g/ f
260
262
ortr(ml) = (1.0_wp + g)* ortr(ml)
@@ -374,8 +376,8 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
374
376
! for i=igh-1 step -1 until low+1 do
375
377
105 do 140 ii = 1 , iend
376
378
i = igh - ii
377
- if (abs (ortr(i)) == 0._wp .and. abs (orti(i)) == 0._wp ) go to 140
378
- if (abs (hr(i, i - 1 )) == 0._wp .and. abs (hi(i, i - 1 )) == 0._wp ) go to 140
379
+ if (f_approx_equal( abs (ortr(i)), 0._wp ) .and. f_approx_equal( abs (orti(i)), 0._wp ) ) go to 140
380
+ if (f_approx_equal( abs (hr(i, i - 1 )), 0._wp ) .and. f_approx_equal( abs (hi(i, i - 1 )), 0._wp ) ) go to 140
379
381
! norm below is negative of h formed in corth
380
382
norm = hr(i, i - 1 )* ortr(i) + hi(i, i - 1 )* orti(i)
381
383
ip1 = i + 1
@@ -410,7 +412,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
410
412
411
413
do 170 i = l, igh
412
414
ll = min0(i + 1 , igh)
413
- if (abs (hi(i, i - 1 )) == 0._wp ) go to 170
415
+ if (f_approx_equal( abs (hi(i, i - 1 )), 0._wp ) ) go to 170
414
416
call pythag(hr(i, i - 1 ), hi(i, i - 1 ), norm)
415
417
yr = hr(i, i - 1 )/ norm
416
418
yi = hi(i, i - 1 )/ norm
@@ -458,7 +460,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
458
460
tst1 = abs (hr(l - 1 , l - 1 )) + abs (hi(l - 1 , l - 1 )) &
459
461
+ abs (hr(l, l)) + abs (hi(l, l))
460
462
tst2 = tst1 + abs (hr(l, l - 1 ))
461
- if (tst2 == tst1) go to 300
463
+ if (f_approx_equal( tst2, tst1) ) go to 300
462
464
260 end do
463
465
! form shift
464
466
300 if (l == en) go to 660
@@ -468,7 +470,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
468
470
si = hi(en, en)
469
471
xr = hr(enm1, en)* hr(en, enm1)
470
472
xi = hi(enm1, en)* hr(en, enm1)
471
- if (xr == 0.0_wp .and. xi == 0.0_wp ) go to 340
473
+ if (f_approx_equal(xr, 0.0_wp ) .and. f_approx_equal(xi, 0.0_wp ) ) go to 340
472
474
yr = (hr(enm1, enm1) - sr)/ 2.0_wp
473
475
yi = (hi(enm1, enm1) - si)/ 2.0_wp
474
476
call csroot(yr** 2 - yi** 2 + xr, 2.0_wp * yr* yi + xi, zzr, zzi)
@@ -522,7 +524,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
522
524
500 end do
523
525
524
526
si = hi(en, en)
525
- if (abs (si) == 0._wp ) go to 540
527
+ if (f_approx_equal( abs (si), 0._wp ) ) go to 540
526
528
call pythag(hr(en, en), si, norm)
527
529
sr = hr(en, en)/ norm
528
530
si = si/ norm
@@ -567,7 +569,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
567
569
590 end do
568
570
600 end do
569
571
570
- if (abs (si) == 0._wp ) go to 240
572
+ if (f_approx_equal( abs (si), 0._wp ) ) go to 240
571
573
572
574
do 630 i = 1 , en
573
575
yr = hr(i, en)
@@ -602,7 +604,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
602
604
end do
603
605
end do
604
606
605
- if (nl == 1 .or. norm == 0._wp ) go to 1001
607
+ if (nl == 1 .or. f_approx_equal( norm, 0._wp ) ) go to 1001
606
608
! for en=nl step -1 until 2 do
607
609
do 800 nn = 2 , nl
608
610
en = nl + 2 - nn
@@ -625,7 +627,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
625
627
626
628
yr = xr - wr(i)
627
629
yi = xi - wi(i)
628
- if (yr /= 0.0_wp .or. yi /= 0.0_wp ) go to 765
630
+ if (.not. f_approx_equal(yr, 0.0_wp ) .or. .not. f_approx_equal(yi, 0.0_wp ) ) go to 765
629
631
tst1 = norm
630
632
yr = tst1
631
633
760 yr = 0.01_wp * yr
@@ -635,7 +637,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
635
637
call cdiv(zzr, zzi, yr, yi, hr(i, en), hi(i, en))
636
638
! overflow control
637
639
tr = abs (hr(i, en)) + abs (hi(i, en))
638
- if (tr == 0.0_wp ) go to 780
640
+ if (f_approx_equal(tr, 0.0_wp ) ) go to 780
639
641
tst1 = tr
640
642
tst2 = tst1 + 1.0_wp / tst1
641
643
if (tst2 > tst1) go to 780
@@ -796,11 +798,11 @@ pure elemental subroutine pythag(a, b, c)
796
798
797
799
real (wp) :: p, r, s, t, u
798
800
p = max (abs (a), abs (b))
799
- if (p == 0.0_wp ) go to 20
801
+ if (f_approx_equal(p, 0.0_wp ) ) go to 20
800
802
r = (min (abs (a), abs (b))/ p)** 2
801
803
10 continue
802
804
t = 4.0_wp + r
803
- if (t == 4.0_wp ) go to 20
805
+ if (f_approx_equal(t, 4.0_wp ) ) go to 20
804
806
s = r/ t
805
807
u = 1.0_wp + 2.0_wp * s
806
808
p = u* p
0 commit comments