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

c_sblat3.f 88 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482
  1. PROGRAM SBLAT3
  2. *
  3. * Test program for the REAL Level 3 Blas.
  4. *
  5. * The program must be driven by a short data file. The first 13 records
  6. * of the file are read using list-directed input, the last 6 records
  7. * are read using the format ( A12, L2 ). An annotated example of a data
  8. * file can be obtained by deleting the first 3 characters from the
  9. * following 19 lines:
  10. * 'SBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE
  11. * -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
  12. * F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
  13. * F LOGICAL FLAG, T TO ERROR STOP ON FAILURES.
  14. * T LOGICAL FLAG, T TO TEST ERROR EXITS.
  15. * 2 0 TO TEST COLUMN-MAJOR, 1 TO TEST ROW-MAJOR, 2 TO TEST BOTH
  16. * 16.0 THRESHOLD VALUE OF TEST RATIO
  17. * 6 NUMBER OF VALUES OF N
  18. * 0 1 2 3 5 9 VALUES OF N
  19. * 3 NUMBER OF VALUES OF ALPHA
  20. * 0.0 1.0 0.7 VALUES OF ALPHA
  21. * 3 NUMBER OF VALUES OF BETA
  22. * 0.0 1.0 1.3 VALUES OF BETA
  23. * cblas_sgemm T PUT F FOR NO TEST. SAME COLUMNS.
  24. * cblas_ssymm T PUT F FOR NO TEST. SAME COLUMNS.
  25. * cblas_strmm T PUT F FOR NO TEST. SAME COLUMNS.
  26. * cblas_strsm T PUT F FOR NO TEST. SAME COLUMNS.
  27. * cblas_ssyrk T PUT F FOR NO TEST. SAME COLUMNS.
  28. * cblas_ssyr2k T PUT F FOR NO TEST. SAME COLUMNS.
  29. *
  30. * See:
  31. *
  32. * Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.
  33. * A Set of Level 3 Basic Linear Algebra Subprograms.
  34. *
  35. * Technical Memorandum No.88 (Revision 1), Mathematics and
  36. * Computer Science Division, Argonne National Laboratory, 9700
  37. * South Cass Avenue, Argonne, Illinois 60439, US.
  38. *
  39. * -- Written on 8-February-1989.
  40. * Jack Dongarra, Argonne National Laboratory.
  41. * Iain Duff, AERE Harwell.
  42. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  43. * Sven Hammarling, Numerical Algorithms Group Ltd.
  44. *
  45. * .. Parameters ..
  46. INTEGER NIN, NOUT
  47. PARAMETER ( NIN = 5, NOUT = 6 )
  48. INTEGER NSUBS
  49. PARAMETER ( NSUBS = 6 )
  50. REAL ZERO, HALF, ONE
  51. PARAMETER ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
  52. INTEGER NMAX
  53. PARAMETER ( NMAX = 65 )
  54. INTEGER NIDMAX, NALMAX, NBEMAX
  55. PARAMETER ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )
  56. * .. Local Scalars ..
  57. REAL EPS, ERR, THRESH
  58. INTEGER I, ISNUM, J, N, NALF, NBET, NIDIM, NTRA,
  59. $ LAYOUT
  60. LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
  61. $ TSTERR, CORDER, RORDER
  62. CHARACTER*1 TRANSA, TRANSB
  63. CHARACTER*12 SNAMET
  64. CHARACTER*32 SNAPS
  65. * .. Local Arrays ..
  66. REAL AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
  67. $ ALF( NALMAX ), AS( NMAX*NMAX ),
  68. $ BB( NMAX*NMAX ), BET( NBEMAX ),
  69. $ BS( NMAX*NMAX ), C( NMAX, NMAX ),
  70. $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
  71. $ G( NMAX ), W( 2*NMAX )
  72. INTEGER IDIM( NIDMAX )
  73. LOGICAL LTEST( NSUBS )
  74. CHARACTER*12 SNAMES( NSUBS )
  75. * .. External Functions ..
  76. REAL SDIFF
  77. LOGICAL LSE
  78. EXTERNAL SDIFF, LSE
  79. * .. External Subroutines ..
  80. EXTERNAL SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, CS3CHKE,
  81. $ SMMCH
  82. * .. Intrinsic Functions ..
  83. INTRINSIC MAX, MIN
  84. * .. Scalars in Common ..
  85. INTEGER INFOT, NOUTC
  86. LOGICAL OK
  87. CHARACTER*12 SRNAMT
  88. * .. Common blocks ..
  89. COMMON /INFOC/INFOT, NOUTC, OK
  90. COMMON /SRNAMC/SRNAMT
  91. * .. Data statements ..
  92. DATA SNAMES/'cblas_sgemm ', 'cblas_ssymm ',
  93. $ 'cblas_strmm ', 'cblas_strsm ','cblas_ssyrk ',
  94. $ 'cblas_ssyr2k'/
  95. * .. Executable Statements ..
  96. *
  97. NOUTC = NOUT
  98. * Read name and unit number for summary output file and open file.
  99. *
  100. READ( NIN, FMT = * )SNAPS
  101. READ( NIN, FMT = * )NTRA
  102. TRACE = NTRA.GE.0
  103. IF( TRACE )THEN
  104. * OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )
  105. OPEN( NTRA, FILE = SNAPS )
  106. END IF
  107. * Read the flag that directs rewinding of the snapshot file.
  108. READ( NIN, FMT = * )REWI
  109. REWI = REWI.AND.TRACE
  110. * Read the flag that directs stopping on any failure.
  111. READ( NIN, FMT = * )SFATAL
  112. * Read the flag that indicates whether error exits are to be tested.
  113. READ( NIN, FMT = * )TSTERR
  114. * Read the flag that indicates whether row-major data layout to be tested.
  115. READ( NIN, FMT = * )LAYOUT
  116. * Read the threshold value of the test ratio
  117. READ( NIN, FMT = * )THRESH
  118. *
  119. * Read and check the parameter values for the tests.
  120. *
  121. * Values of N
  122. READ( NIN, FMT = * )NIDIM
  123. IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
  124. WRITE( NOUT, FMT = 9997 )'N', NIDMAX
  125. GO TO 220
  126. END IF
  127. READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
  128. DO 10 I = 1, NIDIM
  129. IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
  130. WRITE( NOUT, FMT = 9996 )NMAX
  131. GO TO 220
  132. END IF
  133. 10 CONTINUE
  134. * Values of ALPHA
  135. READ( NIN, FMT = * )NALF
  136. IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
  137. WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
  138. GO TO 220
  139. END IF
  140. READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
  141. * Values of BETA
  142. READ( NIN, FMT = * )NBET
  143. IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
  144. WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
  145. GO TO 220
  146. END IF
  147. READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
  148. *
  149. * Report values of parameters.
  150. *
  151. WRITE( NOUT, FMT = 9995 )
  152. WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
  153. WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
  154. WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
  155. IF( .NOT.TSTERR )THEN
  156. WRITE( NOUT, FMT = * )
  157. WRITE( NOUT, FMT = 9984 )
  158. END IF
  159. WRITE( NOUT, FMT = * )
  160. WRITE( NOUT, FMT = 9999 )THRESH
  161. WRITE( NOUT, FMT = * )
  162. RORDER = .FALSE.
  163. CORDER = .FALSE.
  164. IF (LAYOUT.EQ.2) THEN
  165. RORDER = .TRUE.
  166. CORDER = .TRUE.
  167. WRITE( *, FMT = 10002 )
  168. ELSE IF (LAYOUT.EQ.1) THEN
  169. RORDER = .TRUE.
  170. WRITE( *, FMT = 10001 )
  171. ELSE IF (LAYOUT.EQ.0) THEN
  172. CORDER = .TRUE.
  173. WRITE( *, FMT = 10000 )
  174. END IF
  175. WRITE( *, FMT = * )
  176. *
  177. * Read names of subroutines and flags which indicate
  178. * whether they are to be tested.
  179. *
  180. DO 20 I = 1, NSUBS
  181. LTEST( I ) = .FALSE.
  182. 20 CONTINUE
  183. 30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
  184. DO 40 I = 1, NSUBS
  185. IF( SNAMET.EQ.SNAMES( I ) )
  186. $ GO TO 50
  187. 40 CONTINUE
  188. WRITE( NOUT, FMT = 9990 )SNAMET
  189. ERROR STOP
  190. 50 LTEST( I ) = LTESTT
  191. GO TO 30
  192. *
  193. 60 CONTINUE
  194. CLOSE ( NIN )
  195. *
  196. * Compute EPS (the machine precision).
  197. *
  198. EPS = ONE
  199. 70 CONTINUE
  200. IF( SDIFF( ONE + EPS, ONE ).EQ.ZERO )
  201. $ GO TO 80
  202. EPS = HALF*EPS
  203. GO TO 70
  204. 80 CONTINUE
  205. EPS = EPS + EPS
  206. WRITE( NOUT, FMT = 9998 )EPS
  207. *
  208. * Check the reliability of SMMCH using exact data.
  209. *
  210. N = MIN( 32, NMAX )
  211. DO 100 J = 1, N
  212. DO 90 I = 1, N
  213. AB( I, J ) = MAX( I - J + 1, 0 )
  214. 90 CONTINUE
  215. AB( J, NMAX + 1 ) = J
  216. AB( 1, NMAX + J ) = J
  217. C( J, 1 ) = ZERO
  218. 100 CONTINUE
  219. DO 110 J = 1, N
  220. CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
  221. 110 CONTINUE
  222. * CC holds the exact result. On exit from SMMCH CT holds
  223. * the result computed by SMMCH.
  224. TRANSA = 'N'
  225. TRANSB = 'N'
  226. CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
  227. $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
  228. $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
  229. SAME = LSE( CC, CT, N )
  230. IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
  231. WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
  232. ERROR STOP
  233. END IF
  234. TRANSB = 'T'
  235. CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
  236. $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
  237. $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
  238. SAME = LSE( CC, CT, N )
  239. IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
  240. WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
  241. ERROR STOP
  242. END IF
  243. DO 120 J = 1, N
  244. AB( J, NMAX + 1 ) = N - J + 1
  245. AB( 1, NMAX + J ) = N - J + 1
  246. 120 CONTINUE
  247. DO 130 J = 1, N
  248. CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -
  249. $ ( ( J + 1 )*J*( J - 1 ) )/3
  250. 130 CONTINUE
  251. TRANSA = 'T'
  252. TRANSB = 'N'
  253. CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
  254. $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
  255. $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
  256. SAME = LSE( CC, CT, N )
  257. IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
  258. WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
  259. ERROR STOP
  260. END IF
  261. TRANSB = 'T'
  262. CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
  263. $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
  264. $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
  265. SAME = LSE( CC, CT, N )
  266. IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
  267. WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
  268. ERROR STOP
  269. END IF
  270. *
  271. * Test each subroutine in turn.
  272. *
  273. DO 200 ISNUM = 1, NSUBS
  274. WRITE( NOUT, FMT = * )
  275. IF( .NOT.LTEST( ISNUM ) )THEN
  276. * Subprogram is not to be tested.
  277. WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )
  278. ELSE
  279. SRNAMT = SNAMES( ISNUM )
  280. * Test error exits.
  281. IF( TSTERR )THEN
  282. CALL CS3CHKE( SNAMES( ISNUM ) )
  283. WRITE( NOUT, FMT = * )
  284. END IF
  285. * Test computations.
  286. INFOT = 0
  287. OK = .TRUE.
  288. FATAL = .FALSE.
  289. GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM
  290. * Test SGEMM, 01.
  291. 140 IF (CORDER) THEN
  292. CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  293. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  294. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  295. $ CC, CS, CT, G, 0 )
  296. END IF
  297. IF (RORDER) THEN
  298. CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  299. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  300. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  301. $ CC, CS, CT, G, 1 )
  302. END IF
  303. GO TO 190
  304. * Test SSYMM, 02.
  305. 150 IF (CORDER) THEN
  306. CALL SCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  307. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  308. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  309. $ CC, CS, CT, G, 0 )
  310. END IF
  311. IF (RORDER) THEN
  312. CALL SCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  313. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  314. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  315. $ CC, CS, CT, G, 1 )
  316. END IF
  317. GO TO 190
  318. * Test STRMM, 03, STRSM, 04.
  319. 160 IF (CORDER) THEN
  320. CALL SCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  321. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
  322. $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C,
  323. $ 0 )
  324. END IF
  325. IF (RORDER) THEN
  326. CALL SCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  327. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
  328. $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C,
  329. $ 1 )
  330. END IF
  331. GO TO 190
  332. * Test SSYRK, 05.
  333. 170 IF (CORDER) THEN
  334. CALL SCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  335. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  336. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  337. $ CC, CS, CT, G, 0 )
  338. END IF
  339. IF (RORDER) THEN
  340. CALL SCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  341. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  342. $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
  343. $ CC, CS, CT, G, 1 )
  344. END IF
  345. GO TO 190
  346. * Test SSYR2K, 06.
  347. 180 IF (CORDER) THEN
  348. CALL SCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  349. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  350. $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
  351. $ 0 )
  352. END IF
  353. IF (RORDER) THEN
  354. CALL SCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  355. $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
  356. $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
  357. $ 1 )
  358. END IF
  359. GO TO 190
  360. *
  361. 190 IF( FATAL.AND.SFATAL )
  362. $ GO TO 210
  363. END IF
  364. 200 CONTINUE
  365. WRITE( NOUT, FMT = 9986 )
  366. GO TO 230
  367. *
  368. 210 CONTINUE
  369. WRITE( NOUT, FMT = 9985 )
  370. GO TO 230
  371. *
  372. 220 CONTINUE
  373. WRITE( NOUT, FMT = 9991 )
  374. *
  375. 230 CONTINUE
  376. IF( TRACE )
  377. $ CLOSE ( NTRA )
  378. CLOSE ( NOUT )
  379. IF( FATAL ) THEN
  380. ERROR STOP
  381. END IF
  382. *
  383. 10002 FORMAT( ' COLUMN-MAJOR AND ROW-MAJOR DATA LAYOUTS ARE TESTED' )
  384. 10001 FORMAT( ' ROW-MAJOR DATA LAYOUT IS TESTED' )
  385. 10000 FORMAT( ' COLUMN-MAJOR DATA LAYOUT IS TESTED' )
  386. 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
  387. $ 'S THAN', F8.2 )
  388. 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
  389. 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
  390. $ 'THAN ', I2 )
  391. 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
  392. 9995 FORMAT( ' TESTS OF THE REAL LEVEL 3 BLAS', //' THE F',
  393. $ 'OLLOWING PARAMETER VALUES WILL BE USED:' )
  394. 9994 FORMAT( ' FOR N ', 9I6 )
  395. 9993 FORMAT( ' FOR ALPHA ', 7F6.1 )
  396. 9992 FORMAT( ' FOR BETA ', 7F6.1 )
  397. 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
  398. $ /' ******* TESTS ABANDONED *******' )
  399. 9990 FORMAT( ' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* ',
  400. $ 'TESTS ABANDONED *******' )
  401. 9989 FORMAT( ' ERROR IN SMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU',
  402. $ 'ATED WRONGLY.', /' SMMCH WAS CALLED WITH TRANSA = ', A1,
  403. $ ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',
  404. $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',
  405. $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',
  406. $ '*******' )
  407. 9988 FORMAT( A12,L2 )
  408. 9987 FORMAT( 1X, A12,' WAS NOT TESTED' )
  409. 9986 FORMAT( /' END OF TESTS' )
  410. 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
  411. 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
  412. *
  413. * End of SBLAT3.
  414. *
  415. END
  416. SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  417. $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
  418. $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
  419. $ IORDER )
  420. *
  421. * Tests SGEMM.
  422. *
  423. * Auxiliary routine for test program for Level 3 Blas.
  424. *
  425. * -- Written on 8-February-1989.
  426. * Jack Dongarra, Argonne National Laboratory.
  427. * Iain Duff, AERE Harwell.
  428. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  429. * Sven Hammarling, Numerical Algorithms Group Ltd.
  430. *
  431. * .. Parameters ..
  432. REAL ZERO
  433. PARAMETER ( ZERO = 0.0 )
  434. * .. Scalar Arguments ..
  435. REAL EPS, THRESH
  436. INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  437. LOGICAL FATAL, REWI, TRACE
  438. CHARACTER*12 SNAME
  439. * .. Array Arguments ..
  440. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  441. $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
  442. $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
  443. $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
  444. $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
  445. INTEGER IDIM( NIDIM )
  446. * .. Local Scalars ..
  447. REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX
  448. INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
  449. $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
  450. $ MA, MB, MS, N, NA, NARGS, NB, NC, NS
  451. LOGICAL NULL, RESET, SAME, TRANA, TRANB
  452. CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB
  453. CHARACTER*3 ICH
  454. * .. Local Arrays ..
  455. LOGICAL ISAME( 13 )
  456. * .. External Functions ..
  457. LOGICAL LSE, LSERES
  458. EXTERNAL LSE, LSERES
  459. * .. External Subroutines ..
  460. EXTERNAL CSGEMM, SMAKE, SMMCH
  461. * .. Intrinsic Functions ..
  462. INTRINSIC MAX
  463. * .. Scalars in Common ..
  464. INTEGER INFOT, NOUTC
  465. LOGICAL OK
  466. * .. Common blocks ..
  467. COMMON /INFOC/INFOT, NOUTC, OK
  468. * .. Data statements ..
  469. DATA ICH/'NTC'/
  470. * .. Executable Statements ..
  471. *
  472. NARGS = 13
  473. NC = 0
  474. RESET = .TRUE.
  475. ERRMAX = ZERO
  476. *
  477. DO 110 IM = 1, NIDIM
  478. M = IDIM( IM )
  479. *
  480. DO 100 IN = 1, NIDIM
  481. N = IDIM( IN )
  482. * Set LDC to 1 more than minimum value if room.
  483. LDC = M
  484. IF( LDC.LT.NMAX )
  485. $ LDC = LDC + 1
  486. * Skip tests if not enough room.
  487. IF( LDC.GT.NMAX )
  488. $ GO TO 100
  489. LCC = LDC*N
  490. NULL = N.LE.0.OR.M.LE.0
  491. *
  492. DO 90 IK = 1, NIDIM
  493. K = IDIM( IK )
  494. *
  495. DO 80 ICA = 1, 3
  496. TRANSA = ICH( ICA: ICA )
  497. TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
  498. *
  499. IF( TRANA )THEN
  500. MA = K
  501. NA = M
  502. ELSE
  503. MA = M
  504. NA = K
  505. END IF
  506. * Set LDA to 1 more than minimum value if room.
  507. LDA = MA
  508. IF( LDA.LT.NMAX )
  509. $ LDA = LDA + 1
  510. * Skip tests if not enough room.
  511. IF( LDA.GT.NMAX )
  512. $ GO TO 80
  513. LAA = LDA*NA
  514. *
  515. * Generate the matrix A.
  516. *
  517. CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
  518. $ RESET, ZERO )
  519. *
  520. DO 70 ICB = 1, 3
  521. TRANSB = ICH( ICB: ICB )
  522. TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
  523. *
  524. IF( TRANB )THEN
  525. MB = N
  526. NB = K
  527. ELSE
  528. MB = K
  529. NB = N
  530. END IF
  531. * Set LDB to 1 more than minimum value if room.
  532. LDB = MB
  533. IF( LDB.LT.NMAX )
  534. $ LDB = LDB + 1
  535. * Skip tests if not enough room.
  536. IF( LDB.GT.NMAX )
  537. $ GO TO 70
  538. LBB = LDB*NB
  539. *
  540. * Generate the matrix B.
  541. *
  542. CALL SMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,
  543. $ LDB, RESET, ZERO )
  544. *
  545. DO 60 IA = 1, NALF
  546. ALPHA = ALF( IA )
  547. *
  548. DO 50 IB = 1, NBET
  549. BETA = BET( IB )
  550. *
  551. * Generate the matrix C.
  552. *
  553. CALL SMAKE( 'GE', ' ', ' ', M, N, C, NMAX,
  554. $ CC, LDC, RESET, ZERO )
  555. *
  556. NC = NC + 1
  557. *
  558. * Save every datum before calling the
  559. * subroutine.
  560. *
  561. TRANAS = TRANSA
  562. TRANBS = TRANSB
  563. MS = M
  564. NS = N
  565. KS = K
  566. ALS = ALPHA
  567. DO 10 I = 1, LAA
  568. AS( I ) = AA( I )
  569. 10 CONTINUE
  570. LDAS = LDA
  571. DO 20 I = 1, LBB
  572. BS( I ) = BB( I )
  573. 20 CONTINUE
  574. LDBS = LDB
  575. BLS = BETA
  576. DO 30 I = 1, LCC
  577. CS( I ) = CC( I )
  578. 30 CONTINUE
  579. LDCS = LDC
  580. *
  581. * Call the subroutine.
  582. *
  583. IF( TRACE )
  584. $ CALL SPRCN1(NTRA, NC, SNAME, IORDER,
  585. $ TRANSA, TRANSB, M, N, K, ALPHA, LDA,
  586. $ LDB, BETA, LDC)
  587. IF( REWI )
  588. $ REWIND NTRA
  589. CALL CSGEMM( IORDER, TRANSA, TRANSB, M, N,
  590. $ K, ALPHA, AA, LDA, BB, LDB,
  591. $ BETA, CC, LDC )
  592. *
  593. * Check if error-exit was taken incorrectly.
  594. *
  595. IF( .NOT.OK )THEN
  596. WRITE( NOUT, FMT = 9994 )
  597. FATAL = .TRUE.
  598. GO TO 120
  599. END IF
  600. *
  601. * See what data changed inside subroutines.
  602. *
  603. ISAME( 1 ) = TRANSA.EQ.TRANAS
  604. ISAME( 2 ) = TRANSB.EQ.TRANBS
  605. ISAME( 3 ) = MS.EQ.M
  606. ISAME( 4 ) = NS.EQ.N
  607. ISAME( 5 ) = KS.EQ.K
  608. ISAME( 6 ) = ALS.EQ.ALPHA
  609. ISAME( 7 ) = LSE( AS, AA, LAA )
  610. ISAME( 8 ) = LDAS.EQ.LDA
  611. ISAME( 9 ) = LSE( BS, BB, LBB )
  612. ISAME( 10 ) = LDBS.EQ.LDB
  613. ISAME( 11 ) = BLS.EQ.BETA
  614. IF( NULL )THEN
  615. ISAME( 12 ) = LSE( CS, CC, LCC )
  616. ELSE
  617. ISAME( 12 ) = LSERES( 'GE', ' ', M, N, CS,
  618. $ CC, LDC )
  619. END IF
  620. ISAME( 13 ) = LDCS.EQ.LDC
  621. *
  622. * If data was incorrectly changed, report
  623. * and return.
  624. *
  625. SAME = .TRUE.
  626. DO 40 I = 1, NARGS
  627. SAME = SAME.AND.ISAME( I )
  628. IF( .NOT.ISAME( I ) )
  629. $ WRITE( NOUT, FMT = 9998 )I+1
  630. 40 CONTINUE
  631. IF( .NOT.SAME )THEN
  632. FATAL = .TRUE.
  633. GO TO 120
  634. END IF
  635. *
  636. IF( .NOT.NULL )THEN
  637. *
  638. * Check the result.
  639. *
  640. CALL SMMCH( TRANSA, TRANSB, M, N, K,
  641. $ ALPHA, A, NMAX, B, NMAX, BETA,
  642. $ C, NMAX, CT, G, CC, LDC, EPS,
  643. $ ERR, FATAL, NOUT, .TRUE. )
  644. ERRMAX = MAX( ERRMAX, ERR )
  645. * If got really bad answer, report and
  646. * return.
  647. IF( FATAL )
  648. $ GO TO 120
  649. END IF
  650. *
  651. 50 CONTINUE
  652. *
  653. 60 CONTINUE
  654. *
  655. 70 CONTINUE
  656. *
  657. 80 CONTINUE
  658. *
  659. 90 CONTINUE
  660. *
  661. 100 CONTINUE
  662. *
  663. 110 CONTINUE
  664. *
  665. * Report result.
  666. *
  667. IF( ERRMAX.LT.THRESH )THEN
  668. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  669. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  670. ELSE
  671. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  672. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  673. END IF
  674. GO TO 130
  675. *
  676. 120 CONTINUE
  677. WRITE( NOUT, FMT = 9996 )SNAME
  678. CALL SPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB,
  679. $ M, N, K, ALPHA, LDA, LDB, BETA, LDC)
  680. *
  681. 130 CONTINUE
  682. RETURN
  683. *
  684. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  685. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  686. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  687. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  688. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  689. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  690. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  691. $ ' (', I6, ' CALL', 'S)' )
  692. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  693. $ ' (', I6, ' CALL', 'S)' )
  694. 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  695. $ 'ANGED INCORRECTLY *******' )
  696. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  697. C 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',',
  698. C $ 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ',
  699. C $ 'C,', I3, ').' )
  700. 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  701. $ '******' )
  702. *
  703. * End of SCHK1.
  704. *
  705. END
  706. *
  707. *
  708. *
  709. SUBROUTINE SPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N,
  710. $ K, ALPHA, LDA, LDB, BETA, LDC)
  711. INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC
  712. REAL ALPHA, BETA
  713. CHARACTER*1 TRANSA, TRANSB
  714. CHARACTER*12 SNAME
  715. CHARACTER*14 CRC, CTA,CTB
  716. IF (TRANSA.EQ.'N')THEN
  717. CTA = ' CblasNoTrans'
  718. ELSE IF (TRANSA.EQ.'T')THEN
  719. CTA = ' CblasTrans'
  720. ELSE
  721. CTA = 'CblasConjTrans'
  722. END IF
  723. IF (TRANSB.EQ.'N')THEN
  724. CTB = ' CblasNoTrans'
  725. ELSE IF (TRANSB.EQ.'T')THEN
  726. CTB = ' CblasTrans'
  727. ELSE
  728. CTB = 'CblasConjTrans'
  729. END IF
  730. IF (IORDER.EQ.1)THEN
  731. CRC = ' CblasRowMajor'
  732. ELSE
  733. CRC = ' CblasColMajor'
  734. END IF
  735. WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB
  736. WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC
  737. 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
  738. 9994 FORMAT( 20X, 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',',
  739. $ F4.1, ', ', 'C,', I3, ').' )
  740. END
  741. *
  742. SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  743. $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
  744. $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
  745. $ IORDER )
  746. *
  747. * Tests SSYMM.
  748. *
  749. * Auxiliary routine for test program for Level 3 Blas.
  750. *
  751. * -- Written on 8-February-1989.
  752. * Jack Dongarra, Argonne National Laboratory.
  753. * Iain Duff, AERE Harwell.
  754. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  755. * Sven Hammarling, Numerical Algorithms Group Ltd.
  756. *
  757. * .. Parameters ..
  758. REAL ZERO
  759. PARAMETER ( ZERO = 0.0 )
  760. * .. Scalar Arguments ..
  761. REAL EPS, THRESH
  762. INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  763. LOGICAL FATAL, REWI, TRACE
  764. CHARACTER*12 SNAME
  765. * .. Array Arguments ..
  766. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  767. $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
  768. $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
  769. $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
  770. $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
  771. INTEGER IDIM( NIDIM )
  772. * .. Local Scalars ..
  773. REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX
  774. INTEGER I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
  775. $ LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
  776. $ NARGS, NC, NS
  777. LOGICAL LEFT, NULL, RESET, SAME
  778. CHARACTER*1 SIDE, SIDES, UPLO, UPLOS
  779. CHARACTER*2 ICHS, ICHU
  780. * .. Local Arrays ..
  781. LOGICAL ISAME( 13 )
  782. * .. External Functions ..
  783. LOGICAL LSE, LSERES
  784. EXTERNAL LSE, LSERES
  785. * .. External Subroutines ..
  786. EXTERNAL SMAKE, SMMCH, CSSYMM
  787. * .. Intrinsic Functions ..
  788. INTRINSIC MAX
  789. * .. Scalars in Common ..
  790. INTEGER INFOT, NOUTC
  791. LOGICAL OK
  792. * .. Common blocks ..
  793. COMMON /INFOC/INFOT, NOUTC, OK
  794. * .. Data statements ..
  795. DATA ICHS/'LR'/, ICHU/'UL'/
  796. * .. Executable Statements ..
  797. *
  798. NARGS = 12
  799. NC = 0
  800. RESET = .TRUE.
  801. ERRMAX = ZERO
  802. *
  803. DO 100 IM = 1, NIDIM
  804. M = IDIM( IM )
  805. *
  806. DO 90 IN = 1, NIDIM
  807. N = IDIM( IN )
  808. * Set LDC to 1 more than minimum value if room.
  809. LDC = M
  810. IF( LDC.LT.NMAX )
  811. $ LDC = LDC + 1
  812. * Skip tests if not enough room.
  813. IF( LDC.GT.NMAX )
  814. $ GO TO 90
  815. LCC = LDC*N
  816. NULL = N.LE.0.OR.M.LE.0
  817. *
  818. * Set LDB to 1 more than minimum value if room.
  819. LDB = M
  820. IF( LDB.LT.NMAX )
  821. $ LDB = LDB + 1
  822. * Skip tests if not enough room.
  823. IF( LDB.GT.NMAX )
  824. $ GO TO 90
  825. LBB = LDB*N
  826. *
  827. * Generate the matrix B.
  828. *
  829. CALL SMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,
  830. $ ZERO )
  831. *
  832. DO 80 ICS = 1, 2
  833. SIDE = ICHS( ICS: ICS )
  834. LEFT = SIDE.EQ.'L'
  835. *
  836. IF( LEFT )THEN
  837. NA = M
  838. ELSE
  839. NA = N
  840. END IF
  841. * Set LDA to 1 more than minimum value if room.
  842. LDA = NA
  843. IF( LDA.LT.NMAX )
  844. $ LDA = LDA + 1
  845. * Skip tests if not enough room.
  846. IF( LDA.GT.NMAX )
  847. $ GO TO 80
  848. LAA = LDA*NA
  849. *
  850. DO 70 ICU = 1, 2
  851. UPLO = ICHU( ICU: ICU )
  852. *
  853. * Generate the symmetric matrix A.
  854. *
  855. CALL SMAKE( 'SY', UPLO, ' ', NA, NA, A, NMAX, AA, LDA,
  856. $ RESET, ZERO )
  857. *
  858. DO 60 IA = 1, NALF
  859. ALPHA = ALF( IA )
  860. *
  861. DO 50 IB = 1, NBET
  862. BETA = BET( IB )
  863. *
  864. * Generate the matrix C.
  865. *
  866. CALL SMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,
  867. $ LDC, RESET, ZERO )
  868. *
  869. NC = NC + 1
  870. *
  871. * Save every datum before calling the
  872. * subroutine.
  873. *
  874. SIDES = SIDE
  875. UPLOS = UPLO
  876. MS = M
  877. NS = N
  878. ALS = ALPHA
  879. DO 10 I = 1, LAA
  880. AS( I ) = AA( I )
  881. 10 CONTINUE
  882. LDAS = LDA
  883. DO 20 I = 1, LBB
  884. BS( I ) = BB( I )
  885. 20 CONTINUE
  886. LDBS = LDB
  887. BLS = BETA
  888. DO 30 I = 1, LCC
  889. CS( I ) = CC( I )
  890. 30 CONTINUE
  891. LDCS = LDC
  892. *
  893. * Call the subroutine.
  894. *
  895. IF( TRACE )
  896. $ CALL SPRCN2(NTRA, NC, SNAME, IORDER,
  897. $ SIDE, UPLO, M, N, ALPHA, LDA, LDB,
  898. $ BETA, LDC)
  899. IF( REWI )
  900. $ REWIND NTRA
  901. CALL CSSYMM( IORDER, SIDE, UPLO, M, N, ALPHA,
  902. $ AA, LDA, BB, LDB, BETA, CC, LDC )
  903. *
  904. * Check if error-exit was taken incorrectly.
  905. *
  906. IF( .NOT.OK )THEN
  907. WRITE( NOUT, FMT = 9994 )
  908. FATAL = .TRUE.
  909. GO TO 110
  910. END IF
  911. *
  912. * See what data changed inside subroutines.
  913. *
  914. ISAME( 1 ) = SIDES.EQ.SIDE
  915. ISAME( 2 ) = UPLOS.EQ.UPLO
  916. ISAME( 3 ) = MS.EQ.M
  917. ISAME( 4 ) = NS.EQ.N
  918. ISAME( 5 ) = ALS.EQ.ALPHA
  919. ISAME( 6 ) = LSE( AS, AA, LAA )
  920. ISAME( 7 ) = LDAS.EQ.LDA
  921. ISAME( 8 ) = LSE( BS, BB, LBB )
  922. ISAME( 9 ) = LDBS.EQ.LDB
  923. ISAME( 10 ) = BLS.EQ.BETA
  924. IF( NULL )THEN
  925. ISAME( 11 ) = LSE( CS, CC, LCC )
  926. ELSE
  927. ISAME( 11 ) = LSERES( 'GE', ' ', M, N, CS,
  928. $ CC, LDC )
  929. END IF
  930. ISAME( 12 ) = LDCS.EQ.LDC
  931. *
  932. * If data was incorrectly changed, report and
  933. * return.
  934. *
  935. SAME = .TRUE.
  936. DO 40 I = 1, NARGS
  937. SAME = SAME.AND.ISAME( I )
  938. IF( .NOT.ISAME( I ) )
  939. $ WRITE( NOUT, FMT = 9998 )I+1
  940. 40 CONTINUE
  941. IF( .NOT.SAME )THEN
  942. FATAL = .TRUE.
  943. GO TO 110
  944. END IF
  945. *
  946. IF( .NOT.NULL )THEN
  947. *
  948. * Check the result.
  949. *
  950. IF( LEFT )THEN
  951. CALL SMMCH( 'N', 'N', M, N, M, ALPHA, A,
  952. $ NMAX, B, NMAX, BETA, C, NMAX,
  953. $ CT, G, CC, LDC, EPS, ERR,
  954. $ FATAL, NOUT, .TRUE. )
  955. ELSE
  956. CALL SMMCH( 'N', 'N', M, N, N, ALPHA, B,
  957. $ NMAX, A, NMAX, BETA, C, NMAX,
  958. $ CT, G, CC, LDC, EPS, ERR,
  959. $ FATAL, NOUT, .TRUE. )
  960. END IF
  961. ERRMAX = MAX( ERRMAX, ERR )
  962. * If got really bad answer, report and
  963. * return.
  964. IF( FATAL )
  965. $ GO TO 110
  966. END IF
  967. *
  968. 50 CONTINUE
  969. *
  970. 60 CONTINUE
  971. *
  972. 70 CONTINUE
  973. *
  974. 80 CONTINUE
  975. *
  976. 90 CONTINUE
  977. *
  978. 100 CONTINUE
  979. *
  980. * Report result.
  981. *
  982. IF( ERRMAX.LT.THRESH )THEN
  983. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  984. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  985. ELSE
  986. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  987. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  988. END IF
  989. GO TO 120
  990. *
  991. 110 CONTINUE
  992. WRITE( NOUT, FMT = 9996 )SNAME
  993. CALL SPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, ALPHA, LDA,
  994. $ LDB, BETA, LDC)
  995. *
  996. 120 CONTINUE
  997. RETURN
  998. *
  999. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1000. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1001. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1002. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1003. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1004. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1005. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1006. $ ' (', I6, ' CALL', 'S)' )
  1007. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  1008. $ ' (', I6, ' CALL', 'S)' )
  1009. 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1010. $ 'ANGED INCORRECTLY *******' )
  1011. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1012. C 9995 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  1013. C $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ',
  1014. C $ ' .' )
  1015. 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1016. $ '******' )
  1017. *
  1018. * End of SCHK2.
  1019. *
  1020. END
  1021. *
  1022. SUBROUTINE SPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N,
  1023. $ ALPHA, LDA, LDB, BETA, LDC)
  1024. INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC
  1025. REAL ALPHA, BETA
  1026. CHARACTER*1 SIDE, UPLO
  1027. CHARACTER*12 SNAME
  1028. CHARACTER*14 CRC, CS,CU
  1029. IF (SIDE.EQ.'L')THEN
  1030. CS = ' CblasLeft'
  1031. ELSE
  1032. CS = ' CblasRight'
  1033. END IF
  1034. IF (UPLO.EQ.'U')THEN
  1035. CU = ' CblasUpper'
  1036. ELSE
  1037. CU = ' CblasLower'
  1038. END IF
  1039. IF (IORDER.EQ.1)THEN
  1040. CRC = ' CblasRowMajor'
  1041. ELSE
  1042. CRC = ' CblasColMajor'
  1043. END IF
  1044. WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
  1045. WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC
  1046. 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
  1047. 9994 FORMAT( 20X, 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',',
  1048. $ F4.1, ', ', 'C,', I3, ').' )
  1049. END
  1050. *
  1051. SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1052. $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,
  1053. $ B, BB, BS, CT, G, C, IORDER )
  1054. *
  1055. * Tests STRMM and STRSM.
  1056. *
  1057. * Auxiliary routine for test program for Level 3 Blas.
  1058. *
  1059. * -- Written on 8-February-1989.
  1060. * Jack Dongarra, Argonne National Laboratory.
  1061. * Iain Duff, AERE Harwell.
  1062. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  1063. * Sven Hammarling, Numerical Algorithms Group Ltd.
  1064. *
  1065. * .. Parameters ..
  1066. REAL ZERO, ONE
  1067. PARAMETER ( ZERO = 0.0, ONE = 1.0 )
  1068. * .. Scalar Arguments ..
  1069. REAL EPS, THRESH
  1070. INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER
  1071. LOGICAL FATAL, REWI, TRACE
  1072. CHARACTER*12 SNAME
  1073. * .. Array Arguments ..
  1074. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  1075. $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
  1076. $ BB( NMAX*NMAX ), BS( NMAX*NMAX ),
  1077. $ C( NMAX, NMAX ), CT( NMAX ), G( NMAX )
  1078. INTEGER IDIM( NIDIM )
  1079. * .. Local Scalars ..
  1080. REAL ALPHA, ALS, ERR, ERRMAX
  1081. INTEGER I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
  1082. $ LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
  1083. $ NS
  1084. LOGICAL LEFT, NULL, RESET, SAME
  1085. CHARACTER*1 DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
  1086. $ UPLOS
  1087. CHARACTER*2 ICHD, ICHS, ICHU
  1088. CHARACTER*3 ICHT
  1089. * .. Local Arrays ..
  1090. LOGICAL ISAME( 13 )
  1091. * .. External Functions ..
  1092. LOGICAL LSE, LSERES
  1093. EXTERNAL LSE, LSERES
  1094. * .. External Subroutines ..
  1095. EXTERNAL SMAKE, SMMCH, CSTRMM, CSTRSM
  1096. * .. Intrinsic Functions ..
  1097. INTRINSIC MAX
  1098. * .. Scalars in Common ..
  1099. INTEGER INFOT, NOUTC
  1100. LOGICAL OK
  1101. * .. Common blocks ..
  1102. COMMON /INFOC/INFOT, NOUTC, OK
  1103. * .. Data statements ..
  1104. DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/
  1105. * .. Executable Statements ..
  1106. *
  1107. NARGS = 11
  1108. NC = 0
  1109. RESET = .TRUE.
  1110. ERRMAX = ZERO
  1111. * Set up zero matrix for SMMCH.
  1112. DO 20 J = 1, NMAX
  1113. DO 10 I = 1, NMAX
  1114. C( I, J ) = ZERO
  1115. 10 CONTINUE
  1116. 20 CONTINUE
  1117. *
  1118. DO 140 IM = 1, NIDIM
  1119. M = IDIM( IM )
  1120. *
  1121. DO 130 IN = 1, NIDIM
  1122. N = IDIM( IN )
  1123. * Set LDB to 1 more than minimum value if room.
  1124. LDB = M
  1125. IF( LDB.LT.NMAX )
  1126. $ LDB = LDB + 1
  1127. * Skip tests if not enough room.
  1128. IF( LDB.GT.NMAX )
  1129. $ GO TO 130
  1130. LBB = LDB*N
  1131. NULL = M.LE.0.OR.N.LE.0
  1132. *
  1133. DO 120 ICS = 1, 2
  1134. SIDE = ICHS( ICS: ICS )
  1135. LEFT = SIDE.EQ.'L'
  1136. IF( LEFT )THEN
  1137. NA = M
  1138. ELSE
  1139. NA = N
  1140. END IF
  1141. * Set LDA to 1 more than minimum value if room.
  1142. LDA = NA
  1143. IF( LDA.LT.NMAX )
  1144. $ LDA = LDA + 1
  1145. * Skip tests if not enough room.
  1146. IF( LDA.GT.NMAX )
  1147. $ GO TO 130
  1148. LAA = LDA*NA
  1149. *
  1150. DO 110 ICU = 1, 2
  1151. UPLO = ICHU( ICU: ICU )
  1152. *
  1153. DO 100 ICT = 1, 3
  1154. TRANSA = ICHT( ICT: ICT )
  1155. *
  1156. DO 90 ICD = 1, 2
  1157. DIAG = ICHD( ICD: ICD )
  1158. *
  1159. DO 80 IA = 1, NALF
  1160. ALPHA = ALF( IA )
  1161. *
  1162. * Generate the matrix A.
  1163. *
  1164. CALL SMAKE( 'TR', UPLO, DIAG, NA, NA, A,
  1165. $ NMAX, AA, LDA, RESET, ZERO )
  1166. *
  1167. * Generate the matrix B.
  1168. *
  1169. CALL SMAKE( 'GE', ' ', ' ', M, N, B, NMAX,
  1170. $ BB, LDB, RESET, ZERO )
  1171. *
  1172. NC = NC + 1
  1173. *
  1174. * Save every datum before calling the
  1175. * subroutine.
  1176. *
  1177. SIDES = SIDE
  1178. UPLOS = UPLO
  1179. TRANAS = TRANSA
  1180. DIAGS = DIAG
  1181. MS = M
  1182. NS = N
  1183. ALS = ALPHA
  1184. DO 30 I = 1, LAA
  1185. AS( I ) = AA( I )
  1186. 30 CONTINUE
  1187. LDAS = LDA
  1188. DO 40 I = 1, LBB
  1189. BS( I ) = BB( I )
  1190. 40 CONTINUE
  1191. LDBS = LDB
  1192. *
  1193. * Call the subroutine.
  1194. *
  1195. IF( SNAME( 10: 11 ).EQ.'mm' )THEN
  1196. IF( TRACE )
  1197. $ CALL SPRCN3( NTRA, NC, SNAME, IORDER,
  1198. $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
  1199. $ LDA, LDB)
  1200. IF( REWI )
  1201. $ REWIND NTRA
  1202. CALL CSTRMM( IORDER, SIDE, UPLO, TRANSA,
  1203. $ DIAG, M, N, ALPHA, AA, LDA,
  1204. $ BB, LDB )
  1205. ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
  1206. IF( TRACE )
  1207. $ CALL SPRCN3( NTRA, NC, SNAME, IORDER,
  1208. $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
  1209. $ LDA, LDB)
  1210. IF( REWI )
  1211. $ REWIND NTRA
  1212. CALL CSTRSM( IORDER, SIDE, UPLO, TRANSA,
  1213. $ DIAG, M, N, ALPHA, AA, LDA,
  1214. $ BB, LDB )
  1215. END IF
  1216. *
  1217. * Check if error-exit was taken incorrectly.
  1218. *
  1219. IF( .NOT.OK )THEN
  1220. WRITE( NOUT, FMT = 9994 )
  1221. FATAL = .TRUE.
  1222. GO TO 150
  1223. END IF
  1224. *
  1225. * See what data changed inside subroutines.
  1226. *
  1227. ISAME( 1 ) = SIDES.EQ.SIDE
  1228. ISAME( 2 ) = UPLOS.EQ.UPLO
  1229. ISAME( 3 ) = TRANAS.EQ.TRANSA
  1230. ISAME( 4 ) = DIAGS.EQ.DIAG
  1231. ISAME( 5 ) = MS.EQ.M
  1232. ISAME( 6 ) = NS.EQ.N
  1233. ISAME( 7 ) = ALS.EQ.ALPHA
  1234. ISAME( 8 ) = LSE( AS, AA, LAA )
  1235. ISAME( 9 ) = LDAS.EQ.LDA
  1236. IF( NULL )THEN
  1237. ISAME( 10 ) = LSE( BS, BB, LBB )
  1238. ELSE
  1239. ISAME( 10 ) = LSERES( 'GE', ' ', M, N, BS,
  1240. $ BB, LDB )
  1241. END IF
  1242. ISAME( 11 ) = LDBS.EQ.LDB
  1243. *
  1244. * If data was incorrectly changed, report and
  1245. * return.
  1246. *
  1247. SAME = .TRUE.
  1248. DO 50 I = 1, NARGS
  1249. SAME = SAME.AND.ISAME( I )
  1250. IF( .NOT.ISAME( I ) )
  1251. $ WRITE( NOUT, FMT = 9998 )I+1
  1252. 50 CONTINUE
  1253. IF( .NOT.SAME )THEN
  1254. FATAL = .TRUE.
  1255. GO TO 150
  1256. END IF
  1257. *
  1258. IF( .NOT.NULL )THEN
  1259. IF( SNAME( 10: 11 ).EQ.'mm' )THEN
  1260. *
  1261. * Check the result.
  1262. *
  1263. IF( LEFT )THEN
  1264. CALL SMMCH( TRANSA, 'N', M, N, M,
  1265. $ ALPHA, A, NMAX, B, NMAX,
  1266. $ ZERO, C, NMAX, CT, G,
  1267. $ BB, LDB, EPS, ERR,
  1268. $ FATAL, NOUT, .TRUE. )
  1269. ELSE
  1270. CALL SMMCH( 'N', TRANSA, M, N, N,
  1271. $ ALPHA, B, NMAX, A, NMAX,
  1272. $ ZERO, C, NMAX, CT, G,
  1273. $ BB, LDB, EPS, ERR,
  1274. $ FATAL, NOUT, .TRUE. )
  1275. END IF
  1276. ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
  1277. *
  1278. * Compute approximation to original
  1279. * matrix.
  1280. *
  1281. DO 70 J = 1, N
  1282. DO 60 I = 1, M
  1283. C( I, J ) = BB( I + ( J - 1 )*
  1284. $ LDB )
  1285. BB( I + ( J - 1 )*LDB ) = ALPHA*
  1286. $ B( I, J )
  1287. 60 CONTINUE
  1288. 70 CONTINUE
  1289. *
  1290. IF( LEFT )THEN
  1291. CALL SMMCH( TRANSA, 'N', M, N, M,
  1292. $ ONE, A, NMAX, C, NMAX,
  1293. $ ZERO, B, NMAX, CT, G,
  1294. $ BB, LDB, EPS, ERR,
  1295. $ FATAL, NOUT, .FALSE. )
  1296. ELSE
  1297. CALL SMMCH( 'N', TRANSA, M, N, N,
  1298. $ ONE, C, NMAX, A, NMAX,
  1299. $ ZERO, B, NMAX, CT, G,
  1300. $ BB, LDB, EPS, ERR,
  1301. $ FATAL, NOUT, .FALSE. )
  1302. END IF
  1303. END IF
  1304. ERRMAX = MAX( ERRMAX, ERR )
  1305. * If got really bad answer, report and
  1306. * return.
  1307. IF( FATAL )
  1308. $ GO TO 150
  1309. END IF
  1310. *
  1311. 80 CONTINUE
  1312. *
  1313. 90 CONTINUE
  1314. *
  1315. 100 CONTINUE
  1316. *
  1317. 110 CONTINUE
  1318. *
  1319. 120 CONTINUE
  1320. *
  1321. 130 CONTINUE
  1322. *
  1323. 140 CONTINUE
  1324. *
  1325. * Report result.
  1326. *
  1327. IF( ERRMAX.LT.THRESH )THEN
  1328. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  1329. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  1330. ELSE
  1331. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  1332. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  1333. END IF
  1334. GO TO 160
  1335. *
  1336. 150 CONTINUE
  1337. WRITE( NOUT, FMT = 9996 )SNAME
  1338. IF( TRACE )
  1339. $ CALL SPRCN3( NTRA, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, DIAG,
  1340. $ M, N, ALPHA, LDA, LDB)
  1341. *
  1342. 160 CONTINUE
  1343. RETURN
  1344. *
  1345. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1346. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1347. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1348. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1349. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1350. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1351. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1352. $ ' (', I6, ' CALL', 'S)' )
  1353. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  1354. $ ' (', I6, ' CALL', 'S)' )
  1355. 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1356. $ 'ANGED INCORRECTLY *******' )
  1357. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1358. C 9995 FORMAT( 1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ),
  1359. C $ F4.1, ', A,', I3, ', B,', I3, ') .' )
  1360. 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1361. $ '******' )
  1362. *
  1363. * End of SCHK3.
  1364. *
  1365. END
  1366. *
  1367. SUBROUTINE SPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA,
  1368. $ DIAG, M, N, ALPHA, LDA, LDB)
  1369. INTEGER NOUT, NC, IORDER, M, N, LDA, LDB
  1370. REAL ALPHA
  1371. CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
  1372. CHARACTER*12 SNAME
  1373. CHARACTER*14 CRC, CS, CU, CA, CD
  1374. IF (SIDE.EQ.'L')THEN
  1375. CS = ' CblasLeft'
  1376. ELSE
  1377. CS = ' CblasRight'
  1378. END IF
  1379. IF (UPLO.EQ.'U')THEN
  1380. CU = ' CblasUpper'
  1381. ELSE
  1382. CU = ' CblasLower'
  1383. END IF
  1384. IF (TRANSA.EQ.'N')THEN
  1385. CA = ' CblasNoTrans'
  1386. ELSE IF (TRANSA.EQ.'T')THEN
  1387. CA = ' CblasTrans'
  1388. ELSE
  1389. CA = 'CblasConjTrans'
  1390. END IF
  1391. IF (DIAG.EQ.'N')THEN
  1392. CD = ' CblasNonUnit'
  1393. ELSE
  1394. CD = ' CblasUnit'
  1395. END IF
  1396. IF (IORDER.EQ.1)THEN
  1397. CRC = 'CblasRowMajor'
  1398. ELSE
  1399. CRC = 'CblasColMajor'
  1400. END IF
  1401. WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
  1402. WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB
  1403. 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
  1404. 9994 FORMAT( 22X, 2( A14, ',') , 2( I3, ',' ),
  1405. $ F4.1, ', A,', I3, ', B,', I3, ').' )
  1406. END
  1407. *
  1408. SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1409. $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
  1410. $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
  1411. $ IORDER )
  1412. *
  1413. * Tests SSYRK.
  1414. *
  1415. * Auxiliary routine for test program for Level 3 Blas.
  1416. *
  1417. * -- Written on 8-February-1989.
  1418. * Jack Dongarra, Argonne National Laboratory.
  1419. * Iain Duff, AERE Harwell.
  1420. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  1421. * Sven Hammarling, Numerical Algorithms Group Ltd.
  1422. *
  1423. * .. Parameters ..
  1424. REAL ZERO
  1425. PARAMETER ( ZERO = 0.0 )
  1426. * .. Scalar Arguments ..
  1427. REAL EPS, THRESH
  1428. INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  1429. LOGICAL FATAL, REWI, TRACE
  1430. CHARACTER*12 SNAME
  1431. * .. Array Arguments ..
  1432. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  1433. $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
  1434. $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
  1435. $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
  1436. $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
  1437. INTEGER IDIM( NIDIM )
  1438. * .. Local Scalars ..
  1439. REAL ALPHA, ALS, BETA, BETS, ERR, ERRMAX
  1440. INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
  1441. $ LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
  1442. $ NARGS, NC, NS
  1443. LOGICAL NULL, RESET, SAME, TRAN, UPPER
  1444. CHARACTER*1 TRANS, TRANSS, UPLO, UPLOS
  1445. CHARACTER*2 ICHU
  1446. CHARACTER*3 ICHT
  1447. * .. Local Arrays ..
  1448. LOGICAL ISAME( 13 )
  1449. * .. External Functions ..
  1450. LOGICAL LSE, LSERES
  1451. EXTERNAL LSE, LSERES
  1452. * .. External Subroutines ..
  1453. EXTERNAL SMAKE, SMMCH, CSSYRK
  1454. * .. Intrinsic Functions ..
  1455. INTRINSIC MAX
  1456. * .. Scalars in Common ..
  1457. INTEGER INFOT, NOUTC
  1458. LOGICAL OK
  1459. * .. Common blocks ..
  1460. COMMON /INFOC/INFOT, NOUTC, OK
  1461. * .. Data statements ..
  1462. DATA ICHT/'NTC'/, ICHU/'UL'/
  1463. * .. Executable Statements ..
  1464. *
  1465. NARGS = 10
  1466. NC = 0
  1467. RESET = .TRUE.
  1468. ERRMAX = ZERO
  1469. *
  1470. DO 100 IN = 1, NIDIM
  1471. N = IDIM( IN )
  1472. * Set LDC to 1 more than minimum value if room.
  1473. LDC = N
  1474. IF( LDC.LT.NMAX )
  1475. $ LDC = LDC + 1
  1476. * Skip tests if not enough room.
  1477. IF( LDC.GT.NMAX )
  1478. $ GO TO 100
  1479. LCC = LDC*N
  1480. NULL = N.LE.0
  1481. *
  1482. DO 90 IK = 1, NIDIM
  1483. K = IDIM( IK )
  1484. *
  1485. DO 80 ICT = 1, 3
  1486. TRANS = ICHT( ICT: ICT )
  1487. TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
  1488. IF( TRAN )THEN
  1489. MA = K
  1490. NA = N
  1491. ELSE
  1492. MA = N
  1493. NA = K
  1494. END IF
  1495. * Set LDA to 1 more than minimum value if room.
  1496. LDA = MA
  1497. IF( LDA.LT.NMAX )
  1498. $ LDA = LDA + 1
  1499. * Skip tests if not enough room.
  1500. IF( LDA.GT.NMAX )
  1501. $ GO TO 80
  1502. LAA = LDA*NA
  1503. *
  1504. * Generate the matrix A.
  1505. *
  1506. CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
  1507. $ RESET, ZERO )
  1508. *
  1509. DO 70 ICU = 1, 2
  1510. UPLO = ICHU( ICU: ICU )
  1511. UPPER = UPLO.EQ.'U'
  1512. *
  1513. DO 60 IA = 1, NALF
  1514. ALPHA = ALF( IA )
  1515. *
  1516. DO 50 IB = 1, NBET
  1517. BETA = BET( IB )
  1518. *
  1519. * Generate the matrix C.
  1520. *
  1521. CALL SMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,
  1522. $ LDC, RESET, ZERO )
  1523. *
  1524. NC = NC + 1
  1525. *
  1526. * Save every datum before calling the subroutine.
  1527. *
  1528. UPLOS = UPLO
  1529. TRANSS = TRANS
  1530. NS = N
  1531. KS = K
  1532. ALS = ALPHA
  1533. DO 10 I = 1, LAA
  1534. AS( I ) = AA( I )
  1535. 10 CONTINUE
  1536. LDAS = LDA
  1537. BETS = BETA
  1538. DO 20 I = 1, LCC
  1539. CS( I ) = CC( I )
  1540. 20 CONTINUE
  1541. LDCS = LDC
  1542. *
  1543. * Call the subroutine.
  1544. *
  1545. IF( TRACE )
  1546. $ CALL SPRCN4( NTRA, NC, SNAME, IORDER, UPLO,
  1547. $ TRANS, N, K, ALPHA, LDA, BETA, LDC)
  1548. IF( REWI )
  1549. $ REWIND NTRA
  1550. CALL CSSYRK( IORDER, UPLO, TRANS, N, K, ALPHA,
  1551. $ AA, LDA, BETA, CC, LDC )
  1552. *
  1553. * Check if error-exit was taken incorrectly.
  1554. *
  1555. IF( .NOT.OK )THEN
  1556. WRITE( NOUT, FMT = 9993 )
  1557. FATAL = .TRUE.
  1558. GO TO 120
  1559. END IF
  1560. *
  1561. * See what data changed inside subroutines.
  1562. *
  1563. ISAME( 1 ) = UPLOS.EQ.UPLO
  1564. ISAME( 2 ) = TRANSS.EQ.TRANS
  1565. ISAME( 3 ) = NS.EQ.N
  1566. ISAME( 4 ) = KS.EQ.K
  1567. ISAME( 5 ) = ALS.EQ.ALPHA
  1568. ISAME( 6 ) = LSE( AS, AA, LAA )
  1569. ISAME( 7 ) = LDAS.EQ.LDA
  1570. ISAME( 8 ) = BETS.EQ.BETA
  1571. IF( NULL )THEN
  1572. ISAME( 9 ) = LSE( CS, CC, LCC )
  1573. ELSE
  1574. ISAME( 9 ) = LSERES( 'SY', UPLO, N, N, CS,
  1575. $ CC, LDC )
  1576. END IF
  1577. ISAME( 10 ) = LDCS.EQ.LDC
  1578. *
  1579. * If data was incorrectly changed, report and
  1580. * return.
  1581. *
  1582. SAME = .TRUE.
  1583. DO 30 I = 1, NARGS
  1584. SAME = SAME.AND.ISAME( I )
  1585. IF( .NOT.ISAME( I ) )
  1586. $ WRITE( NOUT, FMT = 9998 )I+1
  1587. 30 CONTINUE
  1588. IF( .NOT.SAME )THEN
  1589. FATAL = .TRUE.
  1590. GO TO 120
  1591. END IF
  1592. *
  1593. IF( .NOT.NULL )THEN
  1594. *
  1595. * Check the result column by column.
  1596. *
  1597. JC = 1
  1598. DO 40 J = 1, N
  1599. IF( UPPER )THEN
  1600. JJ = 1
  1601. LJ = J
  1602. ELSE
  1603. JJ = J
  1604. LJ = N - J + 1
  1605. END IF
  1606. IF( TRAN )THEN
  1607. CALL SMMCH( 'T', 'N', LJ, 1, K, ALPHA,
  1608. $ A( 1, JJ ), NMAX,
  1609. $ A( 1, J ), NMAX, BETA,
  1610. $ C( JJ, J ), NMAX, CT, G,
  1611. $ CC( JC ), LDC, EPS, ERR,
  1612. $ FATAL, NOUT, .TRUE. )
  1613. ELSE
  1614. CALL SMMCH( 'N', 'T', LJ, 1, K, ALPHA,
  1615. $ A( JJ, 1 ), NMAX,
  1616. $ A( J, 1 ), NMAX, BETA,
  1617. $ C( JJ, J ), NMAX, CT, G,
  1618. $ CC( JC ), LDC, EPS, ERR,
  1619. $ FATAL, NOUT, .TRUE. )
  1620. END IF
  1621. IF( UPPER )THEN
  1622. JC = JC + LDC
  1623. ELSE
  1624. JC = JC + LDC + 1
  1625. END IF
  1626. ERRMAX = MAX( ERRMAX, ERR )
  1627. * If got really bad answer, report and
  1628. * return.
  1629. IF( FATAL )
  1630. $ GO TO 110
  1631. 40 CONTINUE
  1632. END IF
  1633. *
  1634. 50 CONTINUE
  1635. *
  1636. 60 CONTINUE
  1637. *
  1638. 70 CONTINUE
  1639. *
  1640. 80 CONTINUE
  1641. *
  1642. 90 CONTINUE
  1643. *
  1644. 100 CONTINUE
  1645. *
  1646. * Report result.
  1647. *
  1648. IF( ERRMAX.LT.THRESH )THEN
  1649. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  1650. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  1651. ELSE
  1652. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  1653. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  1654. END IF
  1655. GO TO 130
  1656. *
  1657. 110 CONTINUE
  1658. IF( N.GT.1 )
  1659. $ WRITE( NOUT, FMT = 9995 )J
  1660. *
  1661. 120 CONTINUE
  1662. WRITE( NOUT, FMT = 9996 )SNAME
  1663. CALL SPRCN4( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,
  1664. $ LDA, BETA, LDC)
  1665. *
  1666. 130 CONTINUE
  1667. RETURN
  1668. *
  1669. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1670. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1671. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1672. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1673. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1674. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1675. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1676. $ ' (', I6, ' CALL', 'S)' )
  1677. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  1678. $ ' (', I6, ' CALL', 'S)' )
  1679. 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1680. $ 'ANGED INCORRECTLY *******' )
  1681. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1682. 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  1683. C 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  1684. C $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') .' )
  1685. 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1686. $ '******' )
  1687. *
  1688. * End of SCHK4.
  1689. *
  1690. END
  1691. *
  1692. SUBROUTINE SPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  1693. $ N, K, ALPHA, LDA, BETA, LDC)
  1694. INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
  1695. REAL ALPHA, BETA
  1696. CHARACTER*1 UPLO, TRANSA
  1697. CHARACTER*12 SNAME
  1698. CHARACTER*14 CRC, CU, CA
  1699. IF (UPLO.EQ.'U')THEN
  1700. CU = ' CblasUpper'
  1701. ELSE
  1702. CU = ' CblasLower'
  1703. END IF
  1704. IF (TRANSA.EQ.'N')THEN
  1705. CA = ' CblasNoTrans'
  1706. ELSE IF (TRANSA.EQ.'T')THEN
  1707. CA = ' CblasTrans'
  1708. ELSE
  1709. CA = 'CblasConjTrans'
  1710. END IF
  1711. IF (IORDER.EQ.1)THEN
  1712. CRC = ' CblasRowMajor'
  1713. ELSE
  1714. CRC = ' CblasColMajor'
  1715. END IF
  1716. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  1717. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
  1718. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  1719. 9994 FORMAT( 20X, 2( I3, ',' ),
  1720. $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' )
  1721. END
  1722. *
  1723. SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1724. $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
  1725. $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
  1726. $ IORDER )
  1727. *
  1728. * Tests SSYR2K.
  1729. *
  1730. * Auxiliary routine for test program for Level 3 Blas.
  1731. *
  1732. * -- Written on 8-February-1989.
  1733. * Jack Dongarra, Argonne National Laboratory.
  1734. * Iain Duff, AERE Harwell.
  1735. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  1736. * Sven Hammarling, Numerical Algorithms Group Ltd.
  1737. *
  1738. * .. Parameters ..
  1739. REAL ZERO
  1740. PARAMETER ( ZERO = 0.0 )
  1741. * .. Scalar Arguments ..
  1742. REAL EPS, THRESH
  1743. INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  1744. LOGICAL FATAL, REWI, TRACE
  1745. CHARACTER*12 SNAME
  1746. * .. Array Arguments ..
  1747. REAL AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
  1748. $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
  1749. $ BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
  1750. $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
  1751. $ G( NMAX ), W( 2*NMAX )
  1752. INTEGER IDIM( NIDIM )
  1753. * .. Local Scalars ..
  1754. REAL ALPHA, ALS, BETA, BETS, ERR, ERRMAX
  1755. INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
  1756. $ K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
  1757. $ LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
  1758. LOGICAL NULL, RESET, SAME, TRAN, UPPER
  1759. CHARACTER*1 TRANS, TRANSS, UPLO, UPLOS
  1760. CHARACTER*2 ICHU
  1761. CHARACTER*3 ICHT
  1762. * .. Local Arrays ..
  1763. LOGICAL ISAME( 13 )
  1764. * .. External Functions ..
  1765. LOGICAL LSE, LSERES
  1766. EXTERNAL LSE, LSERES
  1767. * .. External Subroutines ..
  1768. EXTERNAL SMAKE, SMMCH, CSSYR2K
  1769. * .. Intrinsic Functions ..
  1770. INTRINSIC MAX
  1771. * .. Scalars in Common ..
  1772. INTEGER INFOT, NOUTC
  1773. LOGICAL OK
  1774. * .. Common blocks ..
  1775. COMMON /INFOC/INFOT, NOUTC, OK
  1776. * .. Data statements ..
  1777. DATA ICHT/'NTC'/, ICHU/'UL'/
  1778. * .. Executable Statements ..
  1779. *
  1780. NARGS = 12
  1781. NC = 0
  1782. RESET = .TRUE.
  1783. ERRMAX = ZERO
  1784. *
  1785. DO 130 IN = 1, NIDIM
  1786. N = IDIM( IN )
  1787. * Set LDC to 1 more than minimum value if room.
  1788. LDC = N
  1789. IF( LDC.LT.NMAX )
  1790. $ LDC = LDC + 1
  1791. * Skip tests if not enough room.
  1792. IF( LDC.GT.NMAX )
  1793. $ GO TO 130
  1794. LCC = LDC*N
  1795. NULL = N.LE.0
  1796. *
  1797. DO 120 IK = 1, NIDIM
  1798. K = IDIM( IK )
  1799. *
  1800. DO 110 ICT = 1, 3
  1801. TRANS = ICHT( ICT: ICT )
  1802. TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
  1803. IF( TRAN )THEN
  1804. MA = K
  1805. NA = N
  1806. ELSE
  1807. MA = N
  1808. NA = K
  1809. END IF
  1810. * Set LDA to 1 more than minimum value if room.
  1811. LDA = MA
  1812. IF( LDA.LT.NMAX )
  1813. $ LDA = LDA + 1
  1814. * Skip tests if not enough room.
  1815. IF( LDA.GT.NMAX )
  1816. $ GO TO 110
  1817. LAA = LDA*NA
  1818. *
  1819. * Generate the matrix A.
  1820. *
  1821. IF( TRAN )THEN
  1822. CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
  1823. $ LDA, RESET, ZERO )
  1824. ELSE
  1825. CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
  1826. $ RESET, ZERO )
  1827. END IF
  1828. *
  1829. * Generate the matrix B.
  1830. *
  1831. LDB = LDA
  1832. LBB = LAA
  1833. IF( TRAN )THEN
  1834. CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),
  1835. $ 2*NMAX, BB, LDB, RESET, ZERO )
  1836. ELSE
  1837. CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
  1838. $ NMAX, BB, LDB, RESET, ZERO )
  1839. END IF
  1840. *
  1841. DO 100 ICU = 1, 2
  1842. UPLO = ICHU( ICU: ICU )
  1843. UPPER = UPLO.EQ.'U'
  1844. *
  1845. DO 90 IA = 1, NALF
  1846. ALPHA = ALF( IA )
  1847. *
  1848. DO 80 IB = 1, NBET
  1849. BETA = BET( IB )
  1850. *
  1851. * Generate the matrix C.
  1852. *
  1853. CALL SMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,
  1854. $ LDC, RESET, ZERO )
  1855. *
  1856. NC = NC + 1
  1857. *
  1858. * Save every datum before calling the subroutine.
  1859. *
  1860. UPLOS = UPLO
  1861. TRANSS = TRANS
  1862. NS = N
  1863. KS = K
  1864. ALS = ALPHA
  1865. DO 10 I = 1, LAA
  1866. AS( I ) = AA( I )
  1867. 10 CONTINUE
  1868. LDAS = LDA
  1869. DO 20 I = 1, LBB
  1870. BS( I ) = BB( I )
  1871. 20 CONTINUE
  1872. LDBS = LDB
  1873. BETS = BETA
  1874. DO 30 I = 1, LCC
  1875. CS( I ) = CC( I )
  1876. 30 CONTINUE
  1877. LDCS = LDC
  1878. *
  1879. * Call the subroutine.
  1880. *
  1881. IF( TRACE )
  1882. $ CALL SPRCN5( NTRA, NC, SNAME, IORDER, UPLO,
  1883. $ TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC)
  1884. IF( REWI )
  1885. $ REWIND NTRA
  1886. CALL CSSYR2K( IORDER, UPLO, TRANS, N, K, ALPHA,
  1887. $ AA, LDA, BB, LDB, BETA, CC, LDC )
  1888. *
  1889. * Check if error-exit was taken incorrectly.
  1890. *
  1891. IF( .NOT.OK )THEN
  1892. WRITE( NOUT, FMT = 9993 )
  1893. FATAL = .TRUE.
  1894. GO TO 150
  1895. END IF
  1896. *
  1897. * See what data changed inside subroutines.
  1898. *
  1899. ISAME( 1 ) = UPLOS.EQ.UPLO
  1900. ISAME( 2 ) = TRANSS.EQ.TRANS
  1901. ISAME( 3 ) = NS.EQ.N
  1902. ISAME( 4 ) = KS.EQ.K
  1903. ISAME( 5 ) = ALS.EQ.ALPHA
  1904. ISAME( 6 ) = LSE( AS, AA, LAA )
  1905. ISAME( 7 ) = LDAS.EQ.LDA
  1906. ISAME( 8 ) = LSE( BS, BB, LBB )
  1907. ISAME( 9 ) = LDBS.EQ.LDB
  1908. ISAME( 10 ) = BETS.EQ.BETA
  1909. IF( NULL )THEN
  1910. ISAME( 11 ) = LSE( CS, CC, LCC )
  1911. ELSE
  1912. ISAME( 11 ) = LSERES( 'SY', UPLO, N, N, CS,
  1913. $ CC, LDC )
  1914. END IF
  1915. ISAME( 12 ) = LDCS.EQ.LDC
  1916. *
  1917. * If data was incorrectly changed, report and
  1918. * return.
  1919. *
  1920. SAME = .TRUE.
  1921. DO 40 I = 1, NARGS
  1922. SAME = SAME.AND.ISAME( I )
  1923. IF( .NOT.ISAME( I ) )
  1924. $ WRITE( NOUT, FMT = 9998 )I+1
  1925. 40 CONTINUE
  1926. IF( .NOT.SAME )THEN
  1927. FATAL = .TRUE.
  1928. GO TO 150
  1929. END IF
  1930. *
  1931. IF( .NOT.NULL )THEN
  1932. *
  1933. * Check the result column by column.
  1934. *
  1935. JJAB = 1
  1936. JC = 1
  1937. DO 70 J = 1, N
  1938. IF( UPPER )THEN
  1939. JJ = 1
  1940. LJ = J
  1941. ELSE
  1942. JJ = J
  1943. LJ = N - J + 1
  1944. END IF
  1945. IF( TRAN )THEN
  1946. DO 50 I = 1, K
  1947. W( I ) = AB( ( J - 1 )*2*NMAX + K +
  1948. $ I )
  1949. W( K + I ) = AB( ( J - 1 )*2*NMAX +
  1950. $ I )
  1951. 50 CONTINUE
  1952. CALL SMMCH( 'T', 'N', LJ, 1, 2*K,
  1953. $ ALPHA, AB( JJAB ), 2*NMAX,
  1954. $ W, 2*NMAX, BETA,
  1955. $ C( JJ, J ), NMAX, CT, G,
  1956. $ CC( JC ), LDC, EPS, ERR,
  1957. $ FATAL, NOUT, .TRUE. )
  1958. ELSE
  1959. DO 60 I = 1, K
  1960. W( I ) = AB( ( K + I - 1 )*NMAX +
  1961. $ J )
  1962. W( K + I ) = AB( ( I - 1 )*NMAX +
  1963. $ J )
  1964. 60 CONTINUE
  1965. CALL SMMCH( 'N', 'N', LJ, 1, 2*K,
  1966. $ ALPHA, AB( JJ ), NMAX, W,
  1967. $ 2*NMAX, BETA, C( JJ, J ),
  1968. $ NMAX, CT, G, CC( JC ), LDC,
  1969. $ EPS, ERR, FATAL, NOUT,
  1970. $ .TRUE. )
  1971. END IF
  1972. IF( UPPER )THEN
  1973. JC = JC + LDC
  1974. ELSE
  1975. JC = JC + LDC + 1
  1976. IF( TRAN )
  1977. $ JJAB = JJAB + 2*NMAX
  1978. END IF
  1979. ERRMAX = MAX( ERRMAX, ERR )
  1980. * If got really bad answer, report and
  1981. * return.
  1982. IF( FATAL )
  1983. $ GO TO 140
  1984. 70 CONTINUE
  1985. END IF
  1986. *
  1987. 80 CONTINUE
  1988. *
  1989. 90 CONTINUE
  1990. *
  1991. 100 CONTINUE
  1992. *
  1993. 110 CONTINUE
  1994. *
  1995. 120 CONTINUE
  1996. *
  1997. 130 CONTINUE
  1998. *
  1999. * Report result.
  2000. *
  2001. IF( ERRMAX.LT.THRESH )THEN
  2002. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  2003. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  2004. ELSE
  2005. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  2006. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  2007. END IF
  2008. GO TO 160
  2009. *
  2010. 140 CONTINUE
  2011. IF( N.GT.1 )
  2012. $ WRITE( NOUT, FMT = 9995 )J
  2013. *
  2014. 150 CONTINUE
  2015. WRITE( NOUT, FMT = 9996 )SNAME
  2016. CALL SPRCN5( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,
  2017. $ LDA, LDB, BETA, LDC)
  2018. *
  2019. 160 CONTINUE
  2020. RETURN
  2021. *
  2022. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  2023. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  2024. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  2025. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  2026. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  2027. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  2028. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  2029. $ ' (', I6, ' CALL', 'S)' )
  2030. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  2031. $ ' (', I6, ' CALL', 'S)' )
  2032. 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  2033. $ 'ANGED INCORRECTLY *******' )
  2034. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  2035. 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2036. C 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  2037. C $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ',
  2038. C $ ' .' )
  2039. 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  2040. $ '******' )
  2041. *
  2042. * End of SCHK5.
  2043. *
  2044. END
  2045. *
  2046. SUBROUTINE SPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  2047. $ N, K, ALPHA, LDA, LDB, BETA, LDC)
  2048. INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
  2049. REAL ALPHA, BETA
  2050. CHARACTER*1 UPLO, TRANSA
  2051. CHARACTER*12 SNAME
  2052. CHARACTER*14 CRC, CU, CA
  2053. IF (UPLO.EQ.'U')THEN
  2054. CU = ' CblasUpper'
  2055. ELSE
  2056. CU = ' CblasLower'
  2057. END IF
  2058. IF (TRANSA.EQ.'N')THEN
  2059. CA = ' CblasNoTrans'
  2060. ELSE IF (TRANSA.EQ.'T')THEN
  2061. CA = ' CblasTrans'
  2062. ELSE
  2063. CA = 'CblasConjTrans'
  2064. END IF
  2065. IF (IORDER.EQ.1)THEN
  2066. CRC = ' CblasRowMajor'
  2067. ELSE
  2068. CRC = ' CblasColMajor'
  2069. END IF
  2070. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  2071. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
  2072. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  2073. 9994 FORMAT( 20X, 2( I3, ',' ),
  2074. $ F4.1, ', A,', I3, ', B', I3, ',', F4.1, ', C,', I3, ').' )
  2075. END
  2076. *
  2077. SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
  2078. $ TRANSL )
  2079. *
  2080. * Generates values for an M by N matrix A.
  2081. * Stores the values in the array AA in the data structure required
  2082. * by the routine, with unwanted elements set to rogue value.
  2083. *
  2084. * TYPE is 'GE', 'SY' or 'TR'.
  2085. *
  2086. * Auxiliary routine for test program for Level 3 Blas.
  2087. *
  2088. * -- Written on 8-February-1989.
  2089. * Jack Dongarra, Argonne National Laboratory.
  2090. * Iain Duff, AERE Harwell.
  2091. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2092. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2093. *
  2094. * .. Parameters ..
  2095. REAL ZERO, ONE
  2096. PARAMETER ( ZERO = 0.0, ONE = 1.0 )
  2097. REAL ROGUE
  2098. PARAMETER ( ROGUE = -1.0E10 )
  2099. * .. Scalar Arguments ..
  2100. REAL TRANSL
  2101. INTEGER LDA, M, N, NMAX
  2102. LOGICAL RESET
  2103. CHARACTER*1 DIAG, UPLO
  2104. CHARACTER*2 TYPE
  2105. * .. Array Arguments ..
  2106. REAL A( NMAX, * ), AA( * )
  2107. * .. Local Scalars ..
  2108. INTEGER I, IBEG, IEND, J
  2109. LOGICAL GEN, LOWER, SYM, TRI, UNIT, UPPER
  2110. * .. External Functions ..
  2111. REAL SBEG
  2112. EXTERNAL SBEG
  2113. * .. Executable Statements ..
  2114. GEN = TYPE.EQ.'GE'
  2115. SYM = TYPE.EQ.'SY'
  2116. TRI = TYPE.EQ.'TR'
  2117. UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
  2118. LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
  2119. UNIT = TRI.AND.DIAG.EQ.'U'
  2120. *
  2121. * Generate data in array A.
  2122. *
  2123. DO 20 J = 1, N
  2124. DO 10 I = 1, M
  2125. IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
  2126. $ THEN
  2127. A( I, J ) = SBEG( RESET ) + TRANSL
  2128. IF( I.NE.J )THEN
  2129. * Set some elements to zero
  2130. IF( N.GT.3.AND.J.EQ.N/2 )
  2131. $ A( I, J ) = ZERO
  2132. IF( SYM )THEN
  2133. A( J, I ) = A( I, J )
  2134. ELSE IF( TRI )THEN
  2135. A( J, I ) = ZERO
  2136. END IF
  2137. END IF
  2138. END IF
  2139. 10 CONTINUE
  2140. IF( TRI )
  2141. $ A( J, J ) = A( J, J ) + ONE
  2142. IF( UNIT )
  2143. $ A( J, J ) = ONE
  2144. 20 CONTINUE
  2145. *
  2146. * Store elements in array AS in data structure required by routine.
  2147. *
  2148. IF( TYPE.EQ.'GE' )THEN
  2149. DO 50 J = 1, N
  2150. DO 30 I = 1, M
  2151. AA( I + ( J - 1 )*LDA ) = A( I, J )
  2152. 30 CONTINUE
  2153. DO 40 I = M + 1, LDA
  2154. AA( I + ( J - 1 )*LDA ) = ROGUE
  2155. 40 CONTINUE
  2156. 50 CONTINUE
  2157. ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN
  2158. DO 90 J = 1, N
  2159. IF( UPPER )THEN
  2160. IBEG = 1
  2161. IF( UNIT )THEN
  2162. IEND = J - 1
  2163. ELSE
  2164. IEND = J
  2165. END IF
  2166. ELSE
  2167. IF( UNIT )THEN
  2168. IBEG = J + 1
  2169. ELSE
  2170. IBEG = J
  2171. END IF
  2172. IEND = N
  2173. END IF
  2174. DO 60 I = 1, IBEG - 1
  2175. AA( I + ( J - 1 )*LDA ) = ROGUE
  2176. 60 CONTINUE
  2177. DO 70 I = IBEG, IEND
  2178. AA( I + ( J - 1 )*LDA ) = A( I, J )
  2179. 70 CONTINUE
  2180. DO 80 I = IEND + 1, LDA
  2181. AA( I + ( J - 1 )*LDA ) = ROGUE
  2182. 80 CONTINUE
  2183. 90 CONTINUE
  2184. END IF
  2185. RETURN
  2186. *
  2187. * End of SMAKE.
  2188. *
  2189. END
  2190. SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
  2191. $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
  2192. $ NOUT, MV )
  2193. *
  2194. * Checks the results of the computational tests.
  2195. *
  2196. * Auxiliary routine for test program for Level 3 Blas.
  2197. *
  2198. * -- Written on 8-February-1989.
  2199. * Jack Dongarra, Argonne National Laboratory.
  2200. * Iain Duff, AERE Harwell.
  2201. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2202. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2203. *
  2204. * .. Parameters ..
  2205. REAL ZERO, ONE
  2206. PARAMETER ( ZERO = 0.0, ONE = 1.0 )
  2207. * .. Scalar Arguments ..
  2208. REAL ALPHA, BETA, EPS, ERR
  2209. INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT
  2210. LOGICAL FATAL, MV
  2211. CHARACTER*1 TRANSA, TRANSB
  2212. * .. Array Arguments ..
  2213. REAL A( LDA, * ), B( LDB, * ), C( LDC, * ),
  2214. $ CC( LDCC, * ), CT( * ), G( * )
  2215. * .. Local Scalars ..
  2216. REAL ERRI
  2217. INTEGER I, J, K
  2218. LOGICAL TRANA, TRANB
  2219. * .. Intrinsic Functions ..
  2220. INTRINSIC ABS, MAX, SQRT
  2221. * .. Executable Statements ..
  2222. TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
  2223. TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
  2224. *
  2225. * Compute expected result, one column at a time, in CT using data
  2226. * in A, B and C.
  2227. * Compute gauges in G.
  2228. *
  2229. DO 120 J = 1, N
  2230. *
  2231. DO 10 I = 1, M
  2232. CT( I ) = ZERO
  2233. G( I ) = ZERO
  2234. 10 CONTINUE
  2235. IF( .NOT.TRANA.AND..NOT.TRANB )THEN
  2236. DO 30 K = 1, KK
  2237. DO 20 I = 1, M
  2238. CT( I ) = CT( I ) + A( I, K )*B( K, J )
  2239. G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) )
  2240. 20 CONTINUE
  2241. 30 CONTINUE
  2242. ELSE IF( TRANA.AND..NOT.TRANB )THEN
  2243. DO 50 K = 1, KK
  2244. DO 40 I = 1, M
  2245. CT( I ) = CT( I ) + A( K, I )*B( K, J )
  2246. G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) )
  2247. 40 CONTINUE
  2248. 50 CONTINUE
  2249. ELSE IF( .NOT.TRANA.AND.TRANB )THEN
  2250. DO 70 K = 1, KK
  2251. DO 60 I = 1, M
  2252. CT( I ) = CT( I ) + A( I, K )*B( J, K )
  2253. G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) )
  2254. 60 CONTINUE
  2255. 70 CONTINUE
  2256. ELSE IF( TRANA.AND.TRANB )THEN
  2257. DO 90 K = 1, KK
  2258. DO 80 I = 1, M
  2259. CT( I ) = CT( I ) + A( K, I )*B( J, K )
  2260. G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) )
  2261. 80 CONTINUE
  2262. 90 CONTINUE
  2263. END IF
  2264. DO 100 I = 1, M
  2265. CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
  2266. G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) )
  2267. 100 CONTINUE
  2268. *
  2269. * Compute the error ratio for this result.
  2270. *
  2271. ERR = ZERO
  2272. DO 110 I = 1, M
  2273. ERRI = ABS( CT( I ) - CC( I, J ) )/EPS
  2274. IF( G( I ).NE.ZERO )
  2275. $ ERRI = ERRI/G( I )
  2276. ERR = MAX( ERR, ERRI )
  2277. IF( ERR*SQRT( EPS ).GE.ONE )
  2278. $ GO TO 130
  2279. 110 CONTINUE
  2280. *
  2281. 120 CONTINUE
  2282. *
  2283. * If the loop completes, all results are at least half accurate.
  2284. GO TO 150
  2285. *
  2286. * Report fatal error.
  2287. *
  2288. 130 FATAL = .TRUE.
  2289. WRITE( NOUT, FMT = 9999 )
  2290. DO 140 I = 1, M
  2291. IF( MV )THEN
  2292. WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
  2293. ELSE
  2294. WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
  2295. END IF
  2296. 140 CONTINUE
  2297. IF( N.GT.1 )
  2298. $ WRITE( NOUT, FMT = 9997 )J
  2299. *
  2300. 150 CONTINUE
  2301. RETURN
  2302. *
  2303. 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
  2304. $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU',
  2305. $ 'TED RESULT' )
  2306. 9998 FORMAT( 1X, I7, 2G18.6 )
  2307. 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2308. *
  2309. * End of SMMCH.
  2310. *
  2311. END
  2312. LOGICAL FUNCTION LSE( RI, RJ, LR )
  2313. *
  2314. * Tests if two arrays are identical.
  2315. *
  2316. * Auxiliary routine for test program for Level 3 Blas.
  2317. *
  2318. * -- Written on 8-February-1989.
  2319. * Jack Dongarra, Argonne National Laboratory.
  2320. * Iain Duff, AERE Harwell.
  2321. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2322. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2323. *
  2324. * .. Scalar Arguments ..
  2325. INTEGER LR
  2326. * .. Array Arguments ..
  2327. REAL RI( * ), RJ( * )
  2328. * .. Local Scalars ..
  2329. INTEGER I
  2330. * .. Executable Statements ..
  2331. DO 10 I = 1, LR
  2332. IF( RI( I ).NE.RJ( I ) )
  2333. $ GO TO 20
  2334. 10 CONTINUE
  2335. LSE = .TRUE.
  2336. GO TO 30
  2337. 20 CONTINUE
  2338. LSE = .FALSE.
  2339. 30 RETURN
  2340. *
  2341. * End of LSE.
  2342. *
  2343. END
  2344. LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA )
  2345. *
  2346. * Tests if selected elements in two arrays are equal.
  2347. *
  2348. * TYPE is 'GE' or 'SY'.
  2349. *
  2350. * Auxiliary routine for test program for Level 3 Blas.
  2351. *
  2352. * -- Written on 8-February-1989.
  2353. * Jack Dongarra, Argonne National Laboratory.
  2354. * Iain Duff, AERE Harwell.
  2355. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2356. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2357. *
  2358. * .. Scalar Arguments ..
  2359. INTEGER LDA, M, N
  2360. CHARACTER*1 UPLO
  2361. CHARACTER*2 TYPE
  2362. * .. Array Arguments ..
  2363. REAL AA( LDA, * ), AS( LDA, * )
  2364. * .. Local Scalars ..
  2365. INTEGER I, IBEG, IEND, J
  2366. LOGICAL UPPER
  2367. * .. Executable Statements ..
  2368. UPPER = UPLO.EQ.'U'
  2369. IF( TYPE.EQ.'GE' )THEN
  2370. DO 20 J = 1, N
  2371. DO 10 I = M + 1, LDA
  2372. IF( AA( I, J ).NE.AS( I, J ) )
  2373. $ GO TO 70
  2374. 10 CONTINUE
  2375. 20 CONTINUE
  2376. ELSE IF( TYPE.EQ.'SY' )THEN
  2377. DO 50 J = 1, N
  2378. IF( UPPER )THEN
  2379. IBEG = 1
  2380. IEND = J
  2381. ELSE
  2382. IBEG = J
  2383. IEND = N
  2384. END IF
  2385. DO 30 I = 1, IBEG - 1
  2386. IF( AA( I, J ).NE.AS( I, J ) )
  2387. $ GO TO 70
  2388. 30 CONTINUE
  2389. DO 40 I = IEND + 1, LDA
  2390. IF( AA( I, J ).NE.AS( I, J ) )
  2391. $ GO TO 70
  2392. 40 CONTINUE
  2393. 50 CONTINUE
  2394. END IF
  2395. *
  2396. C 60 CONTINUE
  2397. LSERES = .TRUE.
  2398. GO TO 80
  2399. 70 CONTINUE
  2400. LSERES = .FALSE.
  2401. 80 RETURN
  2402. *
  2403. * End of LSERES.
  2404. *
  2405. END
  2406. REAL FUNCTION SBEG( RESET )
  2407. *
  2408. * Generates random numbers uniformly distributed between -0.5 and 0.5.
  2409. *
  2410. * Auxiliary routine for test program for Level 3 Blas.
  2411. *
  2412. * -- Written on 8-February-1989.
  2413. * Jack Dongarra, Argonne National Laboratory.
  2414. * Iain Duff, AERE Harwell.
  2415. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2416. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2417. *
  2418. * .. Scalar Arguments ..
  2419. LOGICAL RESET
  2420. * .. Local Scalars ..
  2421. INTEGER I, IC, MI
  2422. * .. Save statement ..
  2423. SAVE I, IC, MI
  2424. * .. Executable Statements ..
  2425. IF( RESET )THEN
  2426. * Initialize local variables.
  2427. MI = 891
  2428. I = 7
  2429. IC = 0
  2430. RESET = .FALSE.
  2431. END IF
  2432. *
  2433. * The sequence of values of I is bounded between 1 and 999.
  2434. * If initial I = 1,2,3,6,7 or 9, the period will be 50.
  2435. * If initial I = 4 or 8, the period will be 25.
  2436. * If initial I = 5, the period will be 10.
  2437. * IC is used to break up the period by skipping 1 value of I in 6.
  2438. *
  2439. IC = IC + 1
  2440. 10 I = I*MI
  2441. I = I - 1000*( I/1000 )
  2442. IF( IC.GE.5 )THEN
  2443. IC = 0
  2444. GO TO 10
  2445. END IF
  2446. SBEG = ( I - 500 )/1001.0
  2447. RETURN
  2448. *
  2449. * End of SBEG.
  2450. *
  2451. END
  2452. REAL FUNCTION SDIFF( X, Y )
  2453. *
  2454. * Auxiliary routine for test program for Level 3 Blas.
  2455. *
  2456. * -- Written on 8-February-1989.
  2457. * Jack Dongarra, Argonne National Laboratory.
  2458. * Iain Duff, AERE Harwell.
  2459. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2460. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2461. *
  2462. * .. Scalar Arguments ..
  2463. REAL X, Y
  2464. * .. Executable Statements ..
  2465. SDIFF = X - Y
  2466. RETURN
  2467. *
  2468. * End of SDIFF.
  2469. *
  2470. END