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

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