You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

769 lines
30 KiB

  1. PROGRAM DBLAT1
  2. * Test program for the DOUBLE PRECISION Level 1 BLAS.
  3. * Based upon the original BLAS test routine together with:
  4. * F06EAF Example Program Text
  5. * .. Parameters ..
  6. INTEGER NOUT
  7. PARAMETER (NOUT=6)
  8. * .. Scalars in Common ..
  9. INTEGER ICASE, INCX, INCY, MODE, N
  10. LOGICAL PASS
  11. * .. Local Scalars ..
  12. DOUBLE PRECISION SFAC
  13. INTEGER IC
  14. * .. External Subroutines ..
  15. EXTERNAL CHECK0, CHECK1, CHECK2, CHECK3, HEADER
  16. * .. Common blocks ..
  17. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  18. * .. Data statements ..
  19. DATA SFAC/9.765625D-4/
  20. * .. Executable Statements ..
  21. WRITE (NOUT,99999)
  22. DO 20 IC = 1, 10
  23. ICASE = IC
  24. CALL HEADER
  25. *
  26. * .. Initialize PASS, INCX, INCY, and MODE for a new case. ..
  27. * .. the value 9999 for INCX, INCY or MODE will appear in the ..
  28. * .. detailed output, if any, for cases that do not involve ..
  29. * .. these parameters ..
  30. *
  31. PASS = .TRUE.
  32. INCX = 9999
  33. INCY = 9999
  34. MODE = 9999
  35. IF (ICASE.EQ.3) THEN
  36. CALL CHECK0(SFAC)
  37. ELSE IF (ICASE.EQ.7 .OR. ICASE.EQ.8 .OR. ICASE.EQ.9 .OR.
  38. + ICASE.EQ.10) THEN
  39. CALL CHECK1(SFAC)
  40. ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR.
  41. + ICASE.EQ.6) THEN
  42. CALL CHECK2(SFAC)
  43. ELSE IF (ICASE.EQ.4) THEN
  44. CALL CHECK3(SFAC)
  45. END IF
  46. * -- Print
  47. IF (PASS) WRITE (NOUT,99998)
  48. 20 CONTINUE
  49. STOP
  50. *
  51. 99999 FORMAT (' Real BLAS Test Program Results',/1X)
  52. 99998 FORMAT (' ----- PASS -----')
  53. END
  54. SUBROUTINE HEADER
  55. * .. Parameters ..
  56. INTEGER NOUT
  57. PARAMETER (NOUT=6)
  58. * .. Scalars in Common ..
  59. INTEGER ICASE, INCX, INCY, MODE, N
  60. LOGICAL PASS
  61. * .. Local Arrays ..
  62. CHARACTER*6 L(10)
  63. * .. Common blocks ..
  64. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  65. * .. Data statements ..
  66. DATA L(1)/' DDOT '/
  67. DATA L(2)/'DAXPY '/
  68. DATA L(3)/'DROTG '/
  69. DATA L(4)/' DROT '/
  70. DATA L(5)/'DCOPY '/
  71. DATA L(6)/'DSWAP '/
  72. DATA L(7)/'DNRM2 '/
  73. DATA L(8)/'DASUM '/
  74. DATA L(9)/'DSCAL '/
  75. DATA L(10)/'IDAMAX'/
  76. * .. Executable Statements ..
  77. WRITE (NOUT,99999) ICASE, L(ICASE)
  78. RETURN
  79. *
  80. 99999 FORMAT (/' Test of subprogram number',I3,12X,A6)
  81. END
  82. SUBROUTINE CHECK0(SFAC)
  83. * .. Parameters ..
  84. INTEGER NOUT
  85. PARAMETER (NOUT=6)
  86. * .. Scalar Arguments ..
  87. DOUBLE PRECISION SFAC
  88. * .. Scalars in Common ..
  89. INTEGER ICASE, INCX, INCY, MODE, N
  90. LOGICAL PASS
  91. * .. Local Scalars ..
  92. DOUBLE PRECISION D12, SA, SB, SC, SS
  93. INTEGER K
  94. * .. Local Arrays ..
  95. DOUBLE PRECISION DA1(8), DATRUE(8), DB1(8), DBTRUE(8), DC1(8),
  96. + DS1(8)
  97. * .. External Subroutines ..
  98. EXTERNAL DROTG, STEST1
  99. * .. Common blocks ..
  100. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  101. * .. Data statements ..
  102. DATA DA1/0.3D0, 0.4D0, -0.3D0, -0.4D0, -0.3D0, 0.0D0,
  103. + 0.0D0, 1.0D0/
  104. DATA DB1/0.4D0, 0.3D0, 0.4D0, 0.3D0, -0.4D0, 0.0D0,
  105. + 1.0D0, 0.0D0/
  106. DATA DC1/0.6D0, 0.8D0, -0.6D0, 0.8D0, 0.6D0, 1.0D0,
  107. + 0.0D0, 1.0D0/
  108. DATA DS1/0.8D0, 0.6D0, 0.8D0, -0.6D0, 0.8D0, 0.0D0,
  109. + 1.0D0, 0.0D0/
  110. DATA DATRUE/0.5D0, 0.5D0, 0.5D0, -0.5D0, -0.5D0,
  111. + 0.0D0, 1.0D0, 1.0D0/
  112. DATA DBTRUE/0.0D0, 0.6D0, 0.0D0, -0.6D0, 0.0D0,
  113. + 0.0D0, 1.0D0, 0.0D0/
  114. DATA D12/4096.0D0/
  115. * .. Executable Statements ..
  116. *
  117. * Compute true values which cannot be prestored
  118. * in decimal notation
  119. *
  120. DBTRUE(1) = 1.0D0/0.6D0
  121. DBTRUE(3) = -1.0D0/0.6D0
  122. DBTRUE(5) = 1.0D0/0.6D0
  123. *
  124. DO 20 K = 1, 8
  125. * .. Set N=K for identification in output if any ..
  126. N = K
  127. IF (ICASE.EQ.3) THEN
  128. * .. DROTG ..
  129. IF (K.GT.8) GO TO 40
  130. SA = DA1(K)
  131. SB = DB1(K)
  132. CALL DROTG(SA,SB,SC,SS)
  133. CALL STEST1(SA,DATRUE(K),DATRUE(K),SFAC)
  134. CALL STEST1(SB,DBTRUE(K),DBTRUE(K),SFAC)
  135. CALL STEST1(SC,DC1(K),DC1(K),SFAC)
  136. CALL STEST1(SS,DS1(K),DS1(K),SFAC)
  137. ELSE
  138. WRITE (NOUT,*) ' Shouldn''t be here in CHECK0'
  139. STOP
  140. END IF
  141. 20 CONTINUE
  142. 40 RETURN
  143. END
  144. SUBROUTINE CHECK1(SFAC)
  145. * .. Parameters ..
  146. INTEGER NOUT
  147. PARAMETER (NOUT=6)
  148. * .. Scalar Arguments ..
  149. DOUBLE PRECISION SFAC
  150. * .. Scalars in Common ..
  151. INTEGER ICASE, INCX, INCY, MODE, N
  152. LOGICAL PASS
  153. * .. Local Scalars ..
  154. INTEGER I, LEN, NP1
  155. * .. Local Arrays ..
  156. DOUBLE PRECISION DTRUE1(5), DTRUE3(5), DTRUE5(8,5,2), DV(8,5,2),
  157. + SA(10), STEMP(1), STRUE(8), SX(8)
  158. INTEGER ITRUE2(5)
  159. * .. External Functions ..
  160. DOUBLE PRECISION DASUM, DNRM2
  161. INTEGER IDAMAX
  162. EXTERNAL DASUM, DNRM2, IDAMAX
  163. * .. External Subroutines ..
  164. EXTERNAL ITEST1, DSCAL, STEST, STEST1
  165. * .. Intrinsic Functions ..
  166. INTRINSIC MAX
  167. * .. Common blocks ..
  168. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  169. * .. Data statements ..
  170. DATA SA/0.3D0, -1.0D0, 0.0D0, 1.0D0, 0.3D0, 0.3D0,
  171. + 0.3D0, 0.3D0, 0.3D0, 0.3D0/
  172. DATA DV/0.1D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,
  173. + 2.0D0, 2.0D0, 0.3D0, 3.0D0, 3.0D0, 3.0D0, 3.0D0,
  174. + 3.0D0, 3.0D0, 3.0D0, 0.3D0, -0.4D0, 4.0D0,
  175. + 4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0, 0.2D0,
  176. + -0.6D0, 0.3D0, 5.0D0, 5.0D0, 5.0D0, 5.0D0,
  177. + 5.0D0, 0.1D0, -0.3D0, 0.5D0, -0.1D0, 6.0D0,
  178. + 6.0D0, 6.0D0, 6.0D0, 0.1D0, 8.0D0, 8.0D0, 8.0D0,
  179. + 8.0D0, 8.0D0, 8.0D0, 8.0D0, 0.3D0, 9.0D0, 9.0D0,
  180. + 9.0D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0, 0.3D0, 2.0D0,
  181. + -0.4D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,
  182. + 0.2D0, 3.0D0, -0.6D0, 5.0D0, 0.3D0, 2.0D0,
  183. + 2.0D0, 2.0D0, 0.1D0, 4.0D0, -0.3D0, 6.0D0,
  184. + -0.5D0, 7.0D0, -0.1D0, 3.0D0/
  185. DATA DTRUE1/0.0D0, 0.3D0, 0.5D0, 0.7D0, 0.6D0/
  186. DATA DTRUE3/0.0D0, 0.3D0, 0.7D0, 1.1D0, 1.0D0/
  187. DATA DTRUE5/0.10D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,
  188. + 2.0D0, 2.0D0, 2.0D0, -0.3D0, 3.0D0, 3.0D0,
  189. + 3.0D0, 3.0D0, 3.0D0, 3.0D0, 3.0D0, 0.0D0, 0.0D0,
  190. + 4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0,
  191. + 0.20D0, -0.60D0, 0.30D0, 5.0D0, 5.0D0, 5.0D0,
  192. + 5.0D0, 5.0D0, 0.03D0, -0.09D0, 0.15D0, -0.03D0,
  193. + 6.0D0, 6.0D0, 6.0D0, 6.0D0, 0.10D0, 8.0D0,
  194. + 8.0D0, 8.0D0, 8.0D0, 8.0D0, 8.0D0, 8.0D0,
  195. + 0.09D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0,
  196. + 9.0D0, 9.0D0, 0.09D0, 2.0D0, -0.12D0, 2.0D0,
  197. + 2.0D0, 2.0D0, 2.0D0, 2.0D0, 0.06D0, 3.0D0,
  198. + -0.18D0, 5.0D0, 0.09D0, 2.0D0, 2.0D0, 2.0D0,
  199. + 0.03D0, 4.0D0, -0.09D0, 6.0D0, -0.15D0, 7.0D0,
  200. + -0.03D0, 3.0D0/
  201. DATA ITRUE2/0, 1, 2, 2, 3/
  202. * .. Executable Statements ..
  203. DO 80 INCX = 1, 2
  204. DO 60 NP1 = 1, 5
  205. N = NP1 - 1
  206. LEN = 2*MAX(N,1)
  207. * .. Set vector arguments ..
  208. DO 20 I = 1, LEN
  209. SX(I) = DV(I,NP1,INCX)
  210. 20 CONTINUE
  211. *
  212. IF (ICASE.EQ.7) THEN
  213. * .. DNRM2 ..
  214. STEMP(1) = DTRUE1(NP1)
  215. CALL STEST1(DNRM2(N,SX,INCX),STEMP,STEMP,SFAC)
  216. ELSE IF (ICASE.EQ.8) THEN
  217. * .. DASUM ..
  218. STEMP(1) = DTRUE3(NP1)
  219. CALL STEST1(DASUM(N,SX,INCX),STEMP,STEMP,SFAC)
  220. ELSE IF (ICASE.EQ.9) THEN
  221. * .. DSCAL ..
  222. CALL DSCAL(N,SA((INCX-1)*5+NP1),SX,INCX)
  223. DO 40 I = 1, LEN
  224. STRUE(I) = DTRUE5(I,NP1,INCX)
  225. 40 CONTINUE
  226. CALL STEST(LEN,SX,STRUE,STRUE,SFAC)
  227. ELSE IF (ICASE.EQ.10) THEN
  228. * .. IDAMAX ..
  229. CALL ITEST1(IDAMAX(N,SX,INCX),ITRUE2(NP1))
  230. ELSE
  231. WRITE (NOUT,*) ' Shouldn''t be here in CHECK1'
  232. STOP
  233. END IF
  234. 60 CONTINUE
  235. 80 CONTINUE
  236. RETURN
  237. END
  238. SUBROUTINE CHECK2(SFAC)
  239. * .. Parameters ..
  240. INTEGER NOUT
  241. PARAMETER (NOUT=6)
  242. * .. Scalar Arguments ..
  243. DOUBLE PRECISION SFAC
  244. * .. Scalars in Common ..
  245. INTEGER ICASE, INCX, INCY, MODE, N
  246. LOGICAL PASS
  247. * .. Local Scalars ..
  248. DOUBLE PRECISION SA, SC, SS
  249. INTEGER I, J, KI, KN, KSIZE, LENX, LENY, MX, MY
  250. * .. Local Arrays ..
  251. DOUBLE PRECISION DT10X(7,4,4), DT10Y(7,4,4), DT7(4,4),
  252. + DT8(7,4,4), DT9X(7,4,4), DT9Y(7,4,4), DX1(7),
  253. + DY1(7), SSIZE1(4), SSIZE2(14,2), STX(7), STY(7),
  254. + SX(7), SY(7)
  255. INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4)
  256. * .. External Functions ..
  257. DOUBLE PRECISION DDOT
  258. EXTERNAL DDOT
  259. * .. External Subroutines ..
  260. EXTERNAL DAXPY, DCOPY, DSWAP, STEST, STEST1
  261. * .. Intrinsic Functions ..
  262. INTRINSIC ABS, MIN
  263. * .. Common blocks ..
  264. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  265. * .. Data statements ..
  266. DATA SA/0.3D0/
  267. DATA INCXS/1, 2, -2, -1/
  268. DATA INCYS/1, -2, 1, -2/
  269. DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/
  270. DATA NS/0, 1, 2, 4/
  271. DATA DX1/0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.9D0, -0.3D0,
  272. + -0.4D0/
  273. DATA DY1/0.5D0, -0.9D0, 0.3D0, 0.7D0, -0.6D0, 0.2D0,
  274. + 0.8D0/
  275. DATA SC, SS/0.8D0, 0.6D0/
  276. DATA DT7/0.0D0, 0.30D0, 0.21D0, 0.62D0, 0.0D0,
  277. + 0.30D0, -0.07D0, 0.85D0, 0.0D0, 0.30D0, -0.79D0,
  278. + -0.74D0, 0.0D0, 0.30D0, 0.33D0, 1.27D0/
  279. DATA DT8/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  280. + 0.0D0, 0.68D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  281. + 0.0D0, 0.0D0, 0.68D0, -0.87D0, 0.0D0, 0.0D0,
  282. + 0.0D0, 0.0D0, 0.0D0, 0.68D0, -0.87D0, 0.15D0,
  283. + 0.94D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,
  284. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.68D0,
  285. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  286. + 0.35D0, -0.9D0, 0.48D0, 0.0D0, 0.0D0, 0.0D0,
  287. + 0.0D0, 0.38D0, -0.9D0, 0.57D0, 0.7D0, -0.75D0,
  288. + 0.2D0, 0.98D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0,
  289. + 0.0D0, 0.0D0, 0.0D0, 0.68D0, 0.0D0, 0.0D0,
  290. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.35D0, -0.72D0,
  291. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.38D0,
  292. + -0.63D0, 0.15D0, 0.88D0, 0.0D0, 0.0D0, 0.0D0,
  293. + 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  294. + 0.68D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  295. + 0.0D0, 0.68D0, -0.9D0, 0.33D0, 0.0D0, 0.0D0,
  296. + 0.0D0, 0.0D0, 0.68D0, -0.9D0, 0.33D0, 0.7D0,
  297. + -0.75D0, 0.2D0, 1.04D0/
  298. DATA DT9X/0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  299. + 0.0D0, 0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  300. + 0.0D0, 0.0D0, 0.78D0, -0.46D0, 0.0D0, 0.0D0,
  301. + 0.0D0, 0.0D0, 0.0D0, 0.78D0, -0.46D0, -0.22D0,
  302. + 1.06D0, 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0,
  303. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.78D0,
  304. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  305. + 0.66D0, 0.1D0, -0.1D0, 0.0D0, 0.0D0, 0.0D0,
  306. + 0.0D0, 0.96D0, 0.1D0, -0.76D0, 0.8D0, 0.90D0,
  307. + -0.3D0, -0.02D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0,
  308. + 0.0D0, 0.0D0, 0.0D0, 0.78D0, 0.0D0, 0.0D0,
  309. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.06D0, 0.1D0,
  310. + -0.1D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.90D0,
  311. + 0.1D0, -0.22D0, 0.8D0, 0.18D0, -0.3D0, -0.02D0,
  312. + 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  313. + 0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  314. + 0.0D0, 0.78D0, 0.26D0, 0.0D0, 0.0D0, 0.0D0,
  315. + 0.0D0, 0.0D0, 0.78D0, 0.26D0, -0.76D0, 1.12D0,
  316. + 0.0D0, 0.0D0, 0.0D0/
  317. DATA DT9Y/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  318. + 0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  319. + 0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.0D0, 0.0D0,
  320. + 0.0D0, 0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.54D0,
  321. + 0.08D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,
  322. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.04D0,
  323. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.7D0,
  324. + -0.9D0, -0.12D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  325. + 0.64D0, -0.9D0, -0.30D0, 0.7D0, -0.18D0, 0.2D0,
  326. + 0.28D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  327. + 0.0D0, 0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0,
  328. + 0.0D0, 0.0D0, 0.0D0, 0.7D0, -1.08D0, 0.0D0,
  329. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.64D0, -1.26D0,
  330. + 0.54D0, 0.20D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0,
  331. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  332. + 0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  333. + 0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.0D0, 0.0D0,
  334. + 0.0D0, 0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.7D0,
  335. + -0.18D0, 0.2D0, 0.16D0/
  336. DATA DT10X/0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  337. + 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  338. + 0.0D0, 0.5D0, -0.9D0, 0.0D0, 0.0D0, 0.0D0,
  339. + 0.0D0, 0.0D0, 0.5D0, -0.9D0, 0.3D0, 0.7D0,
  340. + 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0,
  341. + 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0,
  342. + 0.0D0, 0.0D0, 0.0D0, 0.3D0, 0.1D0, 0.5D0, 0.0D0,
  343. + 0.0D0, 0.0D0, 0.0D0, 0.8D0, 0.1D0, -0.6D0,
  344. + 0.8D0, 0.3D0, -0.3D0, 0.5D0, 0.6D0, 0.0D0,
  345. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,
  346. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.9D0,
  347. + 0.1D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.7D0,
  348. + 0.1D0, 0.3D0, 0.8D0, -0.9D0, -0.3D0, 0.5D0,
  349. + 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  350. + 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  351. + 0.5D0, 0.3D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  352. + 0.5D0, 0.3D0, -0.6D0, 0.8D0, 0.0D0, 0.0D0,
  353. + 0.0D0/
  354. DATA DT10Y/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  355. + 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  356. + 0.0D0, 0.6D0, 0.1D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  357. + 0.0D0, 0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.0D0,
  358. + 0.0D0, 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  359. + 0.0D0, 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  360. + 0.0D0, 0.0D0, -0.5D0, -0.9D0, 0.6D0, 0.0D0,
  361. + 0.0D0, 0.0D0, 0.0D0, -0.4D0, -0.9D0, 0.9D0,
  362. + 0.7D0, -0.5D0, 0.2D0, 0.6D0, 0.5D0, 0.0D0,
  363. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0,
  364. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.5D0,
  365. + 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  366. + -0.4D0, 0.9D0, -0.5D0, 0.6D0, 0.0D0, 0.0D0,
  367. + 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  368. + 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  369. + 0.0D0, 0.6D0, -0.9D0, 0.1D0, 0.0D0, 0.0D0,
  370. + 0.0D0, 0.0D0, 0.6D0, -0.9D0, 0.1D0, 0.7D0,
  371. + -0.5D0, 0.2D0, 0.8D0/
  372. DATA SSIZE1/0.0D0, 0.3D0, 1.6D0, 3.2D0/
  373. DATA SSIZE2/0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  374. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  375. + 0.0D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,
  376. + 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,
  377. + 1.17D0, 1.17D0, 1.17D0/
  378. * .. Executable Statements ..
  379. *
  380. DO 120 KI = 1, 4
  381. INCX = INCXS(KI)
  382. INCY = INCYS(KI)
  383. MX = ABS(INCX)
  384. MY = ABS(INCY)
  385. *
  386. DO 100 KN = 1, 4
  387. N = NS(KN)
  388. KSIZE = MIN(2,KN)
  389. LENX = LENS(KN,MX)
  390. LENY = LENS(KN,MY)
  391. * .. Initialize all argument arrays ..
  392. DO 20 I = 1, 7
  393. SX(I) = DX1(I)
  394. SY(I) = DY1(I)
  395. 20 CONTINUE
  396. *
  397. IF (ICASE.EQ.1) THEN
  398. * .. DDOT ..
  399. CALL STEST1(DDOT(N,SX,INCX,SY,INCY),DT7(KN,KI),SSIZE1(KN)
  400. + ,SFAC)
  401. ELSE IF (ICASE.EQ.2) THEN
  402. * .. DAXPY ..
  403. CALL DAXPY(N,SA,SX,INCX,SY,INCY)
  404. DO 40 J = 1, LENY
  405. STY(J) = DT8(J,KN,KI)
  406. 40 CONTINUE
  407. CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)
  408. ELSE IF (ICASE.EQ.5) THEN
  409. * .. DCOPY ..
  410. DO 60 I = 1, 7
  411. STY(I) = DT10Y(I,KN,KI)
  412. 60 CONTINUE
  413. CALL DCOPY(N,SX,INCX,SY,INCY)
  414. CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0D0)
  415. ELSE IF (ICASE.EQ.6) THEN
  416. * .. DSWAP ..
  417. CALL DSWAP(N,SX,INCX,SY,INCY)
  418. DO 80 I = 1, 7
  419. STX(I) = DT10X(I,KN,KI)
  420. STY(I) = DT10Y(I,KN,KI)
  421. 80 CONTINUE
  422. CALL STEST(LENX,SX,STX,SSIZE2(1,1),1.0D0)
  423. CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0D0)
  424. ELSE
  425. WRITE (NOUT,*) ' Shouldn''t be here in CHECK2'
  426. STOP
  427. END IF
  428. 100 CONTINUE
  429. 120 CONTINUE
  430. RETURN
  431. END
  432. SUBROUTINE CHECK3(SFAC)
  433. * .. Parameters ..
  434. INTEGER NOUT
  435. PARAMETER (NOUT=6)
  436. * .. Scalar Arguments ..
  437. DOUBLE PRECISION SFAC
  438. * .. Scalars in Common ..
  439. INTEGER ICASE, INCX, INCY, MODE, N
  440. LOGICAL PASS
  441. * .. Local Scalars ..
  442. DOUBLE PRECISION SA, SC, SS
  443. INTEGER I, K, KI, KN, KSIZE, LENX, LENY, MX, MY
  444. * .. Local Arrays ..
  445. DOUBLE PRECISION COPYX(5), COPYY(5), DT9X(7,4,4), DT9Y(7,4,4),
  446. + DX1(7), DY1(7), MWPC(11), MWPS(11), MWPSTX(5),
  447. + MWPSTY(5), MWPTX(11,5), MWPTY(11,5), MWPX(5),
  448. + MWPY(5), SSIZE2(14,2), STX(7), STY(7), SX(7),
  449. + SY(7)
  450. INTEGER INCXS(4), INCYS(4), LENS(4,2), MWPINX(11),
  451. + MWPINY(11), MWPN(11), NS(4)
  452. * .. External Subroutines ..
  453. EXTERNAL DROT, STEST
  454. * .. Intrinsic Functions ..
  455. INTRINSIC ABS, MIN
  456. * .. Common blocks ..
  457. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  458. * .. Data statements ..
  459. DATA SA/0.3D0/
  460. DATA INCXS/1, 2, -2, -1/
  461. DATA INCYS/1, -2, 1, -2/
  462. DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/
  463. DATA NS/0, 1, 2, 4/
  464. DATA DX1/0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.9D0, -0.3D0,
  465. + -0.4D0/
  466. DATA DY1/0.5D0, -0.9D0, 0.3D0, 0.7D0, -0.6D0, 0.2D0,
  467. + 0.8D0/
  468. DATA SC, SS/0.8D0, 0.6D0/
  469. DATA DT9X/0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  470. + 0.0D0, 0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  471. + 0.0D0, 0.0D0, 0.78D0, -0.46D0, 0.0D0, 0.0D0,
  472. + 0.0D0, 0.0D0, 0.0D0, 0.78D0, -0.46D0, -0.22D0,
  473. + 1.06D0, 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0,
  474. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.78D0,
  475. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  476. + 0.66D0, 0.1D0, -0.1D0, 0.0D0, 0.0D0, 0.0D0,
  477. + 0.0D0, 0.96D0, 0.1D0, -0.76D0, 0.8D0, 0.90D0,
  478. + -0.3D0, -0.02D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0,
  479. + 0.0D0, 0.0D0, 0.0D0, 0.78D0, 0.0D0, 0.0D0,
  480. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.06D0, 0.1D0,
  481. + -0.1D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.90D0,
  482. + 0.1D0, -0.22D0, 0.8D0, 0.18D0, -0.3D0, -0.02D0,
  483. + 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  484. + 0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  485. + 0.0D0, 0.78D0, 0.26D0, 0.0D0, 0.0D0, 0.0D0,
  486. + 0.0D0, 0.0D0, 0.78D0, 0.26D0, -0.76D0, 1.12D0,
  487. + 0.0D0, 0.0D0, 0.0D0/
  488. DATA DT9Y/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  489. + 0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  490. + 0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.0D0, 0.0D0,
  491. + 0.0D0, 0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.54D0,
  492. + 0.08D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,
  493. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.04D0,
  494. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.7D0,
  495. + -0.9D0, -0.12D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  496. + 0.64D0, -0.9D0, -0.30D0, 0.7D0, -0.18D0, 0.2D0,
  497. + 0.28D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  498. + 0.0D0, 0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0,
  499. + 0.0D0, 0.0D0, 0.0D0, 0.7D0, -1.08D0, 0.0D0,
  500. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.64D0, -1.26D0,
  501. + 0.54D0, 0.20D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0,
  502. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  503. + 0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  504. + 0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.0D0, 0.0D0,
  505. + 0.0D0, 0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.7D0,
  506. + -0.18D0, 0.2D0, 0.16D0/
  507. DATA SSIZE2/0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  508. + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,
  509. + 0.0D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,
  510. + 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,
  511. + 1.17D0, 1.17D0, 1.17D0/
  512. * .. Executable Statements ..
  513. *
  514. DO 60 KI = 1, 4
  515. INCX = INCXS(KI)
  516. INCY = INCYS(KI)
  517. MX = ABS(INCX)
  518. MY = ABS(INCY)
  519. *
  520. DO 40 KN = 1, 4
  521. N = NS(KN)
  522. KSIZE = MIN(2,KN)
  523. LENX = LENS(KN,MX)
  524. LENY = LENS(KN,MY)
  525. *
  526. IF (ICASE.EQ.4) THEN
  527. * .. DROT ..
  528. DO 20 I = 1, 7
  529. SX(I) = DX1(I)
  530. SY(I) = DY1(I)
  531. STX(I) = DT9X(I,KN,KI)
  532. STY(I) = DT9Y(I,KN,KI)
  533. 20 CONTINUE
  534. CALL DROT(N,SX,INCX,SY,INCY,SC,SS)
  535. CALL STEST(LENX,SX,STX,SSIZE2(1,KSIZE),SFAC)
  536. CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)
  537. ELSE
  538. WRITE (NOUT,*) ' Shouldn''t be here in CHECK3'
  539. STOP
  540. END IF
  541. 40 CONTINUE
  542. 60 CONTINUE
  543. *
  544. MWPC(1) = 1
  545. DO 80 I = 2, 11
  546. MWPC(I) = 0
  547. 80 CONTINUE
  548. MWPS(1) = 0
  549. DO 100 I = 2, 6
  550. MWPS(I) = 1
  551. 100 CONTINUE
  552. DO 120 I = 7, 11
  553. MWPS(I) = -1
  554. 120 CONTINUE
  555. MWPINX(1) = 1
  556. MWPINX(2) = 1
  557. MWPINX(3) = 1
  558. MWPINX(4) = -1
  559. MWPINX(5) = 1
  560. MWPINX(6) = -1
  561. MWPINX(7) = 1
  562. MWPINX(8) = 1
  563. MWPINX(9) = -1
  564. MWPINX(10) = 1
  565. MWPINX(11) = -1
  566. MWPINY(1) = 1
  567. MWPINY(2) = 1
  568. MWPINY(3) = -1
  569. MWPINY(4) = -1
  570. MWPINY(5) = 2
  571. MWPINY(6) = 1
  572. MWPINY(7) = 1
  573. MWPINY(8) = -1
  574. MWPINY(9) = -1
  575. MWPINY(10) = 2
  576. MWPINY(11) = 1
  577. DO 140 I = 1, 11
  578. MWPN(I) = 5
  579. 140 CONTINUE
  580. MWPN(5) = 3
  581. MWPN(10) = 3
  582. DO 160 I = 1, 5
  583. MWPX(I) = I
  584. MWPY(I) = I
  585. MWPTX(1,I) = I
  586. MWPTY(1,I) = I
  587. MWPTX(2,I) = I
  588. MWPTY(2,I) = -I
  589. MWPTX(3,I) = 6 - I
  590. MWPTY(3,I) = I - 6
  591. MWPTX(4,I) = I
  592. MWPTY(4,I) = -I
  593. MWPTX(6,I) = 6 - I
  594. MWPTY(6,I) = I - 6
  595. MWPTX(7,I) = -I
  596. MWPTY(7,I) = I
  597. MWPTX(8,I) = I - 6
  598. MWPTY(8,I) = 6 - I
  599. MWPTX(9,I) = -I
  600. MWPTY(9,I) = I
  601. MWPTX(11,I) = I - 6
  602. MWPTY(11,I) = 6 - I
  603. 160 CONTINUE
  604. MWPTX(5,1) = 1
  605. MWPTX(5,2) = 3
  606. MWPTX(5,3) = 5
  607. MWPTX(5,4) = 4
  608. MWPTX(5,5) = 5
  609. MWPTY(5,1) = -1
  610. MWPTY(5,2) = 2
  611. MWPTY(5,3) = -2
  612. MWPTY(5,4) = 4
  613. MWPTY(5,5) = -3
  614. MWPTX(10,1) = -1
  615. MWPTX(10,2) = -3
  616. MWPTX(10,3) = -5
  617. MWPTX(10,4) = 4
  618. MWPTX(10,5) = 5
  619. MWPTY(10,1) = 1
  620. MWPTY(10,2) = 2
  621. MWPTY(10,3) = 2
  622. MWPTY(10,4) = 4
  623. MWPTY(10,5) = 3
  624. DO 200 I = 1, 11
  625. INCX = MWPINX(I)
  626. INCY = MWPINY(I)
  627. DO 180 K = 1, 5
  628. COPYX(K) = MWPX(K)
  629. COPYY(K) = MWPY(K)
  630. MWPSTX(K) = MWPTX(I,K)
  631. MWPSTY(K) = MWPTY(I,K)
  632. 180 CONTINUE
  633. CALL DROT(MWPN(I),COPYX,INCX,COPYY,INCY,MWPC(I),MWPS(I))
  634. CALL STEST(5,COPYX,MWPSTX,MWPSTX,SFAC)
  635. CALL STEST(5,COPYY,MWPSTY,MWPSTY,SFAC)
  636. 200 CONTINUE
  637. RETURN
  638. END
  639. SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC)
  640. * ********************************* STEST **************************
  641. *
  642. * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO
  643. * SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE
  644. * NEGLIGIBLE.
  645. *
  646. * C. L. LAWSON, JPL, 1974 DEC 10
  647. *
  648. * .. Parameters ..
  649. INTEGER NOUT
  650. PARAMETER (NOUT=6)
  651. * .. Scalar Arguments ..
  652. DOUBLE PRECISION SFAC
  653. INTEGER LEN
  654. * .. Array Arguments ..
  655. DOUBLE PRECISION SCOMP(LEN), SSIZE(LEN), STRUE(LEN)
  656. * .. Scalars in Common ..
  657. INTEGER ICASE, INCX, INCY, MODE, N
  658. LOGICAL PASS
  659. * .. Local Scalars ..
  660. DOUBLE PRECISION SD
  661. INTEGER I
  662. * .. External Functions ..
  663. DOUBLE PRECISION SDIFF
  664. EXTERNAL SDIFF
  665. * .. Intrinsic Functions ..
  666. INTRINSIC ABS
  667. * .. Common blocks ..
  668. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  669. * .. Executable Statements ..
  670. *
  671. DO 40 I = 1, LEN
  672. SD = SCOMP(I) - STRUE(I)
  673. IF (SDIFF(ABS(SSIZE(I))+ABS(SFAC*SD),ABS(SSIZE(I))).EQ.0.0D0)
  674. + GO TO 40
  675. *
  676. * HERE SCOMP(I) IS NOT CLOSE TO STRUE(I).
  677. *
  678. IF ( .NOT. PASS) GO TO 20
  679. * PRINT FAIL MESSAGE AND HEADER.
  680. PASS = .FALSE.
  681. WRITE (NOUT,99999)
  682. WRITE (NOUT,99998)
  683. 20 WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, I, SCOMP(I),
  684. + STRUE(I), SD, SSIZE(I)
  685. 40 CONTINUE
  686. RETURN
  687. *
  688. 99999 FORMAT (' FAIL')
  689. 99998 FORMAT (/' CASE N INCX INCY MODE I ',
  690. + ' COMP(I) TRUE(I) DIFFERENCE',
  691. + ' SIZE(I)',/1X)
  692. 99997 FORMAT (1X,I4,I3,3I5,I3,2D36.8,2D12.4)
  693. END
  694. SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC)
  695. * ************************* STEST1 *****************************
  696. *
  697. * THIS IS AN INTERFACE SUBROUTINE TO ACCOMODATE THE FORTRAN
  698. * REQUIREMENT THAT WHEN A DUMMY ARGUMENT IS AN ARRAY, THE
  699. * ACTUAL ARGUMENT MUST ALSO BE AN ARRAY OR AN ARRAY ELEMENT.
  700. *
  701. * C.L. LAWSON, JPL, 1978 DEC 6
  702. *
  703. * .. Scalar Arguments ..
  704. DOUBLE PRECISION SCOMP1, SFAC, STRUE1
  705. * .. Array Arguments ..
  706. DOUBLE PRECISION SSIZE(*)
  707. * .. Local Arrays ..
  708. DOUBLE PRECISION SCOMP(1), STRUE(1)
  709. * .. External Subroutines ..
  710. EXTERNAL STEST
  711. * .. Executable Statements ..
  712. *
  713. SCOMP(1) = SCOMP1
  714. STRUE(1) = STRUE1
  715. CALL STEST(1,SCOMP,STRUE,SSIZE,SFAC)
  716. *
  717. RETURN
  718. END
  719. DOUBLE PRECISION FUNCTION SDIFF(SA,SB)
  720. * ********************************* SDIFF **************************
  721. * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15
  722. *
  723. * .. Scalar Arguments ..
  724. DOUBLE PRECISION SA, SB
  725. * .. Executable Statements ..
  726. SDIFF = SA - SB
  727. RETURN
  728. END
  729. SUBROUTINE ITEST1(ICOMP,ITRUE)
  730. * ********************************* ITEST1 *************************
  731. *
  732. * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR
  733. * EQUALITY.
  734. * C. L. LAWSON, JPL, 1974 DEC 10
  735. *
  736. * .. Parameters ..
  737. INTEGER NOUT
  738. PARAMETER (NOUT=6)
  739. * .. Scalar Arguments ..
  740. INTEGER ICOMP, ITRUE
  741. * .. Scalars in Common ..
  742. INTEGER ICASE, INCX, INCY, MODE, N
  743. LOGICAL PASS
  744. * .. Local Scalars ..
  745. INTEGER ID
  746. * .. Common blocks ..
  747. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS
  748. * .. Executable Statements ..
  749. *
  750. IF (ICOMP.EQ.ITRUE) GO TO 40
  751. *
  752. * HERE ICOMP IS NOT EQUAL TO ITRUE.
  753. *
  754. IF ( .NOT. PASS) GO TO 20
  755. * PRINT FAIL MESSAGE AND HEADER.
  756. PASS = .FALSE.
  757. WRITE (NOUT,99999)
  758. WRITE (NOUT,99998)
  759. 20 ID = ICOMP - ITRUE
  760. WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, ICOMP, ITRUE, ID
  761. 40 CONTINUE
  762. RETURN
  763. *
  764. 99999 FORMAT (' FAIL')
  765. 99998 FORMAT (/' CASE N INCX INCY MODE ',
  766. + ' COMP TRUE DIFFERENCE',
  767. + /1X)
  768. 99997 FORMAT (1X,I4,I3,3I5,2I36,I12)
  769. END