@@ -10,6 +10,8 @@ module m_eigen_solver
1010
1111 use m_precision_select
1212
13+ use m_helper_basic ! < Functions to compare floating point numbers
14+
1315 implicit none
1416
1517 private ;
@@ -124,7 +126,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
124126
125127 do 110 i = 1 , l
126128 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
128130110 end do
129131
130132 ml = l
@@ -140,7 +142,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
140142
141143 do 150 i = k, l
142144 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
144146150 end do
145147
146148 ml = k
@@ -164,7 +166,7 @@ pure subroutine cbal(nm, nl, ar, ai, low, igh, scale)
164166 r = r + abs (ar(i, j)) + abs (ai(i, j))
165167200 end do
166168! 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
168170 g = r/ radix
169171 f = 1.0_wp
170172 s = c + r
@@ -242,7 +244,7 @@ pure subroutine corth(nm, nl, low, igh, ar, ai, ortr, orti)
242244 do 90 i = ml, igh
243245 scale = scale + abs (ar(i, ml - 1 )) + abs (ai(i, ml - 1 ))
24424690 end do
245- if (scale == 0._wp ) go to 180
247+ if (f_approx_equal( scale, 0._wp ) ) go to 180
246248 mp = ml + igh
247249! for i=igh step -1 until ml do
248250 do 100 ii = ml, igh
@@ -254,7 +256,7 @@ pure subroutine corth(nm, nl, low, igh, ar, ai, ortr, orti)
254256
255257 g = sqrt (h)
256258 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
258260 h = h + f* g
259261 g = g/ f
260262 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
374376! for i=igh-1 step -1 until low+1 do
375377105 do 140 ii = 1 , iend
376378 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
379381! norm below is negative of h formed in corth
380382 norm = hr(i, i - 1 )* ortr(i) + hi(i, i - 1 )* orti(i)
381383 ip1 = i + 1
@@ -410,7 +412,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
410412
411413 do 170 i = l, igh
412414 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
414416 call pythag(hr(i, i - 1 ), hi(i, i - 1 ), norm)
415417 yr = hr(i, i - 1 )/ norm
416418 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
458460 tst1 = abs (hr(l - 1 , l - 1 )) + abs (hi(l - 1 , l - 1 )) &
459461 + abs (hr(l, l)) + abs (hi(l, l))
460462 tst2 = tst1 + abs (hr(l, l - 1 ))
461- if (tst2 == tst1) go to 300
463+ if (f_approx_equal( tst2, tst1) ) go to 300
462464260 end do
463465! form shift
464466300 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
468470 si = hi(en, en)
469471 xr = hr(enm1, en)* hr(en, enm1)
470472 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
472474 yr = (hr(enm1, enm1) - sr)/ 2.0_wp
473475 yi = (hi(enm1, enm1) - si)/ 2.0_wp
474476 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
522524500 end do
523525
524526 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
526528 call pythag(hr(en, en), si, norm)
527529 sr = hr(en, en)/ norm
528530 si = si/ norm
@@ -567,7 +569,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
567569590 end do
568570600 end do
569571
570- if (abs (si) == 0._wp ) go to 240
572+ if (f_approx_equal( abs (si), 0._wp ) ) go to 240
571573
572574 do 630 i = 1 , en
573575 yr = hr(i, en)
@@ -602,7 +604,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
602604 end do
603605 end do
604606
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
606608! for en=nl step -1 until 2 do
607609 do 800 nn = 2 , nl
608610 en = nl + 2 - nn
@@ -625,7 +627,7 @@ pure subroutine comqr2(nm, nl, low, igh, ortr, orti, hr, hi, wr, wi, zr, zi, ier
625627
626628 yr = xr - wr(i)
627629 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
629631 tst1 = norm
630632 yr = tst1
631633760 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
635637 call cdiv(zzr, zzi, yr, yi, hr(i, en), hi(i, en))
636638! overflow control
637639 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
639641 tst1 = tr
640642 tst2 = tst1 + 1.0_wp / tst1
641643 if (tst2 > tst1) go to 780
@@ -796,11 +798,11 @@ pure elemental subroutine pythag(a, b, c)
796798
797799 real (wp) :: p, r, s, t, u
798800 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
800802 r = (min (abs (a), abs (b))/ p)** 2
80180310 continue
802804 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
804806 s = r/ t
805807 u = 1.0_wp + 2.0_wp * s
806808 p = u* p
0 commit comments