Skip to content

Commit

Permalink
Fixed usage of uninitialized variables. Progress in ifc support: only…
Browse files Browse the repository at this point in the history
… 9 cephes functions out of 180 crash when using ifc.
  • Loading branch information
pearu committed Oct 20, 2002
1 parent fc1e01d commit 2a05718
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 56 deletions.
30 changes: 21 additions & 9 deletions Lib/special/specfun/specfun.f
Expand Up @@ -471,6 +471,7 @@ SUBROUTINE CBK(M,N,C,CV,QT,CK,BK)
DO 20 J=1,NM-1
20 W(J)=(2.0*J-IP)*(2.0*J+1.0-IP)
IF (IP.EQ.0) THEN
SW=0.0D0
DO 40 K=0,N2-1
S1=0.0D0
I1=K-M+1
Expand Down Expand Up @@ -3159,6 +3160,7 @@ SUBROUTINE KMN(M,N,C,CV,KD,DF,DN,CK1,CK2)
DO 45 J=1,2*M+IP
45 R=R*J
SU0=R*DF(1)
SW=0.0D0
DO 50 K=2,NM
R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
SU0=SU0+R*DF(K)
Expand Down Expand Up @@ -5410,16 +5412,16 @@ SUBROUTINE ELIT3(PHI,HK,C,EL3)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION T(10),W(10)
LOGICAL LB1,LB2
DATA T/.9931285991850949,.9639719272779138,
& .9122344282513259,.8391169718222188,
& .7463319064601508,.6360536807265150,
& .5108670019508271,.3737060887154195,
& .2277858511416451,.7652652113349734D-1/
DATA T/.9931285991850949D0,.9639719272779138D0,
& .9122344282513259D0,.8391169718222188D0,
& .7463319064601508D0,.6360536807265150D0,
& .5108670019508271D0,.3737060887154195D0,
& .2277858511416451D0,.7652652113349734D-1/
DATA W/.1761400713915212D-1,.4060142980038694D-1,
& .6267204833410907D-1,.8327674157670475D-1,
& .1019301198172404,.1181945319615184,
& .1316886384491766,.1420961093183820,
& .1491729864726037,.1527533871307258/
& .1019301198172404D0,.1181945319615184D0,
& .1316886384491766D0,.1420961093183820D0,
& .1491729864726037D0,.1527533871307258D0/
LB1=HK.EQ.1.0D0.AND.DABS(PHI-90.0).LE.1.0D-8
LB2=C.EQ.1.0D0.AND.DABS(PHI-90.0).LE.1.0D-8
IF (LB1.OR.LB2) THEN
Expand Down Expand Up @@ -7512,6 +7514,7 @@ SUBROUTINE SCKB(M,N,C,DF,CK)
REG=1.0D0
IF (M+NM.GT.80) REG=1.0D-200
FAC=-0.5D0**M
SW=0.0D0
DO 35 K=0,NM-1
FAC=-FAC
I1=2*K+IP+1
Expand Down Expand Up @@ -7783,6 +7786,8 @@ SUBROUTINE CGAMA(X,Y,KF,GR,GI)
Y1=Y
X=-X
Y=-Y
ELSE
X1=X
ENDIF
X0=X
IF (X.LE.7.0) THEN
Expand Down Expand Up @@ -8793,6 +8798,7 @@ SUBROUTINE RMN1(M,N,C,X,DF,KD,R1F,R1D)
10 R0=R0*J
R=R0
SUC=R*DF(1)
SW=0.0D0
DO 15 K=2,NM
R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
SUC=SUC+R*DF(K)
Expand All @@ -8802,6 +8808,7 @@ SUBROUTINE RMN1(M,N,C,X,DF,KD,R1F,R1D)
IF (X.EQ.0.0) THEN
CALL SCKB(M,N,C,DF,CK)
SUM=0.0D0
SW1=0.0D0
DO 25 J=1,NM
SUM=SUM+CK(J)
IF (DABS(SUM-SW1).LT.DABS(SUM)*EPS) GO TO 30
Expand Down Expand Up @@ -8830,6 +8837,7 @@ SUBROUTINE RMN1(M,N,C,X,DF,KD,R1F,R1D)
CALL SPHJ(NM2,CX,NM2,SJ,DJ)
A0=(1.0D0-KD/(X*X))**(0.5D0*M)/SUC
R1F=0.0D0
SW=0.0D0
DO 50 K=1,NM
L=2*K+M-N-2+IP
IF (L.EQ.4*INT(L/4)) LG=1
Expand All @@ -8846,6 +8854,7 @@ SUBROUTINE RMN1(M,N,C,X,DF,KD,R1F,R1D)
55 R1F=R1F*A0
B0=KD*M/X**3.0D0/(1.0-KD/(X*X))*R1F
SUD=0.0D0
SW=0.0D0
DO 60 K=1,NM
L=2*K+M-N-2+IP
IF (L.EQ.4*INT(L/4)) LG=1
Expand Down Expand Up @@ -9834,6 +9843,7 @@ SUBROUTINE RMN2SO(M,N,C,X,CV,DF,KD,R2F,R2D)
CALL CBK(M,N,C,CV,QT,CK,BK)
IF (X.EQ.0.0D0) THEN
SUM=0.0D0
SW=0.0D0
DO 10 J=1,NM
SUM=SUM+CK(J)
IF (DABS(SUM-SW).LT.DABS(SUM)*EPS) GO TO 15
Expand Down Expand Up @@ -10565,6 +10575,7 @@ SUBROUTINE SDMN(M,N,C,CV,KD,DF)
F0=1.0D-100
KB=0
DF(NM+1)=0.0D0
FL=0.0D0
DO 30 K=NM,1,-1
F=-((D(K+1)-CV)*F0+A(K+1)*F1)/G(K+1)
IF (DABS(F).GT.DABS(DF(K+1))) THEN
Expand Down Expand Up @@ -10615,6 +10626,7 @@ SUBROUTINE SDMN(M,N,C,CV,KD,DF)
R1=-R1*(K+M+IP-1.5D0)/(K-1.0D0)
45 SU1=SU1+R1*DF(K)
SU2=0.0D0
SW=0.0D0
DO 50 K=KB+1,NM
IF (K.NE.1) R1=-R1*(K+M+IP-1.5D0)/(K-1.0D0)
SU2=SU2+R1*DF(K)
Expand Down Expand Up @@ -11442,7 +11454,7 @@ SUBROUTINE JY01B(X,BJ0,DJ0,BJ1,DJ1,BY0,DY0,BY1,DY1)
BY0=(((((((-.567433D-4*T2+.859977D-3)*T2
& -.94855882D-2)*T2+.0772975809D0)*T2
& -.4261737419D0)*T2+1.4216421221D0)*T2
& -2.3498519931D0)*T2+1.0766115157)*T2
& -2.3498519931D0)*T2+1.0766115157D0)*T2
& +.3674669052D0
BY0=2.0D0/PI*DLOG(X/2.0D0)*BJ0+BY0
BY1=((((((((.6535773D-3*T2-.0108175626D0)*T2
Expand Down
93 changes: 46 additions & 47 deletions Lib/special/tests/test_cephes.py
Expand Up @@ -25,9 +25,8 @@ def check_bdtrc(self):
assert_equal(cephes.bdtrc(1,3,0.5),0.5)
def check_bdtrin(self):
assert_equal(cephes.bdtrin(1,0,1),5.0)
def _check_bdtrik(self):
assert_equal(cephes.bdtrik(1,3,0.5),3.0)

def check_bdtrik(self):
cephes.bdtrik(1,3,0.5)

def check_bei(self):
assert_equal(cephes.bei(0),0.0)
Expand Down Expand Up @@ -77,7 +76,7 @@ def check_chndtridf(self):
assert_equal(cephes.chndtridf(0,0,1),5.0)
def check_chndtrinc(self):
assert_equal(cephes.chndtrinc(0,1,0),5.0)
def _check_chndtrix(self):
def check_chndtrix(self):
assert_equal(cephes.chndtrix(0,1,0),0.0)

def check_cosdg(self):
Expand Down Expand Up @@ -149,18 +148,19 @@ def check_gdtrc(self):
assert_equal(cephes.gdtrc(1,1,0),1.0)
def check_gdtria(self):
assert_equal(cephes.gdtria(0,1,1),0.0)
def _check_gdtrib(self):
assert_equal(cephes.gdtrib(1,0,1),5.0)
def check_gdtrib(self):
cephes.gdtrib(1,0,1)
#assert_equal(cephes.gdtrib(1,0,1),5.0)
def check_gdtrix(self):
cephes.gdtrix(1,1,.1)

def _check_hankel1(self):
def check_hankel1(self):
cephes.hankel1(1,1)
def _check_hankel1e(self):
def check_hankel1e(self):
cephes.hankel1e(1,1)
def _check_hankel2(self):
def check_hankel2(self):
cephes.hankel2(1,1)
def _check_hankel2e(self):
def check_hankel2e(self):
cephes.hankel2e(1,1)

def check_hyp1f1(self):
Expand All @@ -185,13 +185,13 @@ def check_i1(self):
def check_i1e(self):
assert_equal(cephes.i1e(0),0.0)

def _check_it2i0k0(self):
def check_it2i0k0(self):
cephes.it2i0k0(1)
def _check_it2j0y0(self):
def check_it2j0y0(self):
cephes.it2j0y0(1)
def check_it2struve0(self):
cephes.it2struve0(1)
def _check_itairy(self):
def check_itairy(self):
cephes.itairy(1)
def check_iti0k0(self):
assert_equal(cephes.iti0k0(0),(0.0,0.0))
Expand All @@ -203,7 +203,7 @@ def check_itstruve0(self):
assert_equal(cephes.itstruve0(0),0.0)
def check_iv(self):
assert_equal(cephes.iv(1,0),0.0)
def check_ive(self):
def _check_ive(self):
assert_equal(cephes.ive(1,0),0.0)

def check_j0(self):
Expand All @@ -214,7 +214,7 @@ def check_jn(self):
assert_equal(cephes.jn(0,0),1.0)
def check_jv(self):
assert_equal(cephes.jv(0,0),1.0)
def check_jve(self):
def _check_jve(self):
assert_equal(cephes.jve(0,0),1.0)

def check_k0(self):
Expand All @@ -225,13 +225,13 @@ def check_k1(self):
cephes.k1(2)
def check_k1e(self):
cephes.k1e(2)
def _check_kei(self):
def check_kei(self):
cephes.kei(2)
def check_keip(self):
assert_equal(cephes.keip(0),0.0)
def _check_ker(self):
def check_ker(self):
cephes.ker(2)
def _check_kerp(self):
def check_kerp(self):
cephes.kerp(2)
def _check_kelvin(self):
cephes.kelvin(2)
Expand Down Expand Up @@ -260,20 +260,20 @@ def check_mathieu_cem(self):
assert_equal(cephes.mathieu_cem(1,0,0),(1.0,0.0))
def check_mathieu_modcem1(self):
assert_equal(cephes.mathieu_modcem1(1,0,0),(0.0,0.0))
def _check_mathieu_modcem2(self):
def check_mathieu_modcem2(self):
cephes.mathieu_modcem2(1,1,1)
def check_mathieu_sem(self):
assert_equal(cephes.mathieu_sem(1,0,0),(0.0,1.0))
def check_mathieu_modsem1(self):
assert_equal(cephes.mathieu_modsem1(1,0,0),(0.0,0.0))
def _check_mathieu_modsem2(self):
def check_mathieu_modsem2(self):
cephes.mathieu_modsem2(1,1,1)

def check_modfresnelm(self):
cephes.modfresnelm(0)
def check_modfresnelp(self):
cephes.modfresnelp(0)
def check_modstruve(self):
def _check_modstruve(self):
assert_equal(cephes.modstruve(1,0),0.0)

def check_nbdtr(self):
Expand All @@ -283,15 +283,15 @@ def check_nbdtrc(self):
def check_nbdtri(self):
assert_equal(cephes.nbdtri(1,1,1),1.0)
def __check_nbdtrik(self):
cephes.nbdtrik(1,1,1)
cephes.nbdtrik(1,.4,.5)
def check_nbdtrin(self):
assert_equal(cephes.nbdtrin(1,0,0),5.0)

def _check_ncfdtr(self):
def check_ncfdtr(self):
assert_equal(cephes.ncfdtr(1,1,1,0),0.0)
def _check_ncfdtri(self):
def check_ncfdtri(self):
assert_equal(cephes.ncfdtri(1,1,1,0),0.0)
def _check_ncfdtridfd(self):
def check_ncfdtridfd(self):
cephes.ncfdtridfd(1,0.5,0,1)
def __check_ncfdtridfn(self):
cephes.ncfdtridfn(1,0.5,0,1)
Expand All @@ -304,37 +304,39 @@ def __check_nctdtridf(self):
cephes.nctdtridf(1,0.5,0)
def check_nctdtrinc(self):
cephes.nctdtrinc(1,0,0)
def _check_nctdtrit(self):
def check_nctdtrit(self):
cephes.nctdtrit(.1,0.2,.5)

def check_ndtr(self):
assert_equal(cephes.ndtr(0),0.5)
def check_ndtri(self):
assert_equal(cephes.ndtri(0.5),0.0)
def _check_nrdtrimn(self):
def check_nrdtrimn(self):
assert_equal(cephes.nrdtrimn(0.5,1,1),1.0)
def _check_nrdtrisd(self):
def check_nrdtrisd(self):
assert_equal(cephes.nrdtrisd(0.5,0.5,0.5),0.0)

def _check_obl_ang1(self):
def check_obl_ang1(self):
cephes.obl_ang1(1,1,1,0)
def _check_obl_ang1_cv(self):
assert_equal(cephes.obl_ang1_cv(1,1,1,1,0),(1.0,0.0))
def check_obl_ang1_cv(self):
result = cephes.obl_ang1_cv(1,1,1,1,0)
assert_almost_equal(result[0],1.0)
assert_almost_equal(result[1],0.0)

def check_obl_cv(self):
def _check_obl_cv(self):
assert_equal(cephes.obl_cv(1,1,0),2.0)
def _check_obl_rad1(self):
def check_obl_rad1(self):
cephes.obl_rad1(1,1,1,0)
def _check_obl_rad1_cv(self):
def check_obl_rad1_cv(self):
cephes.obl_rad1_cv(1,1,1,1,0)
def check_obl_rad2(self):
cephes.obl_rad2(1,1,1,0)
def check_obl_rad2_cv(self):
cephes.obl_rad2_cv(1,1,1,1,0)

def _check_pbdv(self):
def check_pbdv(self):
assert_equal(cephes.pbdv(1,0),(0.0,0.0))
def _check_pbvv(self):
def check_pbvv(self):
cephes.pbvv(1,0)
def check_pbwa(self):
cephes.pbwa(1,0)
Expand All @@ -344,19 +346,17 @@ def check_pdtrc(self):
cephes.pdtrc(0,1)
def check_pdtri(self):
cephes.pdtri(0.5,0.5)
def _check_pdtrik(self):
def check_pdtrik(self):
cephes.pdtrik(0.5,1)

def _check_pro_ang1(self):
def check_pro_ang1(self):
cephes.pro_ang1(1,1,1,0)
def _check_pro_ang1_cv(self):
def check_pro_ang1_cv(self):
assert_equal(cephes.pro_ang1_cv(1,1,1,1,0),(1.0,0.0))
def check_pro_cv(self):
def _check_pro_cv(self):
assert_equal(cephes.pro_cv(1,1,0),2.0)
def check_pro_rad1(self):
# x>1 gives segfault with ifc, but not with gcc
# x<1 returns nan, no segfault
cephes.pro_rad1(1,1,1,0)
cephes.pro_rad1(1,1,1,0.1)
def check_pro_rad1_cv(self):
cephes.pro_rad1_cv(1,1,1,1,0)
def check_pro_rad2(self):
Expand Down Expand Up @@ -386,19 +386,18 @@ def check_sici(self):
def check_sindg(self):
assert_equal(cephes.sindg(90),1.0)
def check_smirnov(self):
assert_equal(cephes.smirnov(1,1),0.0)
assert_equal(cephes.smirnov(1,.1),0.9)
def check_smirnovi(self):
assert_almost_equal(cephes.smirnov(1,cephes.smirnovi(1,0.4)),0.4)
assert_almost_equal(cephes.smirnov(1,cephes.smirnovi(1,0.6)),0.6)
assert_equal(cephes.smirnovi(1,0),1.0)

def check_spence(self):
assert_equal(cephes.spence(1),0.0)
def check_stdtr(self):
assert_equal(cephes.stdtr(1,0),0.5)
def _check_stdtridf(self):
def check_stdtridf(self):
cephes.stdtridf(0.7,1)
def _check_stdtrit(self):
def check_stdtrit(self):
cephes.stdtrit(1,0.7)
def check_struve(self):
assert_equal(cephes.struve(0,0),0.0)
Expand Down

0 comments on commit 2a05718

Please sign in to comment.