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_cblat3.f 100 kB

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