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

c_cblat3.f 100 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789
  1. PROGRAM CBLAT3
  2. *
  3. * Test program for the COMPLEX Level 3 Blas.
  4. *
  5. * The program must be driven by a short data file. The first 13 records
  6. * of the file are read using list-directed input, the last 9 records
  7. * are read using the format ( A12, L2 ). An annotated example of a data
  8. * file can be obtained by deleting the first 3 characters from the
  9. * following 22 lines:
  10. * 'CBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE
  11. * -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
  12. * F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
  13. * F LOGICAL FLAG, T TO 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*12 SNAMET
  69. CHARACTER*32 SNAPS
  70. * .. Local Arrays ..
  71. COMPLEX AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
  72. $ ALF( NALMAX ), AS( NMAX*NMAX ),
  73. $ BB( NMAX*NMAX ), BET( NBEMAX ),
  74. $ BS( NMAX*NMAX ), C( NMAX, NMAX ),
  75. $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
  76. $ W( 2*NMAX )
  77. REAL G( NMAX )
  78. INTEGER IDIM( NIDMAX )
  79. LOGICAL LTEST( NSUBS )
  80. CHARACTER*12 SNAMES( NSUBS )
  81. * .. External Functions ..
  82. REAL SDIFF
  83. LOGICAL LCE
  84. EXTERNAL SDIFF, LCE
  85. * .. External Subroutines ..
  86. EXTERNAL CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CMMCH
  87. * .. Intrinsic Functions ..
  88. INTRINSIC MAX, MIN
  89. * .. Scalars in Common ..
  90. INTEGER INFOT, NOUTC
  91. LOGICAL LERR, OK
  92. CHARACTER*12 SRNAMT
  93. * .. Common blocks ..
  94. COMMON /INFOC/INFOT, NOUTC, OK, LERR
  95. COMMON /SRNAMC/SRNAMT
  96. * .. Data statements ..
  97. DATA SNAMES/'cblas_cgemm ', 'cblas_chemm ',
  98. $ 'cblas_csymm ', 'cblas_ctrmm ', 'cblas_ctrsm ',
  99. $ 'cblas_cherk ', 'cblas_csyrk ', 'cblas_cher2k',
  100. $ 'cblas_csyr2k'/
  101. * .. Executable Statements ..
  102. *
  103. NOUTC = NOUT
  104. *
  105. * Read name and unit number for snapshot output file and open file.
  106. *
  107. READ( NIN, FMT = * )SNAPS
  108. READ( NIN, FMT = * )NTRA
  109. TRACE = NTRA.GE.0
  110. IF( TRACE )THEN
  111. OPEN( NTRA, FILE = SNAPS )
  112. END IF
  113. * Read the flag that directs rewinding of the snapshot file.
  114. READ( NIN, FMT = * )REWI
  115. REWI = REWI.AND.TRACE
  116. * Read the flag that directs stopping on any failure.
  117. READ( NIN, FMT = * )SFATAL
  118. * Read the flag that indicates whether error exits are to be tested.
  119. READ( NIN, FMT = * )TSTERR
  120. * Read the flag that indicates whether row-major data layout to be tested.
  121. READ( NIN, FMT = * )LAYOUT
  122. * Read the threshold value of the test ratio
  123. READ( NIN, FMT = * )THRESH
  124. *
  125. * Read and check the parameter values for the tests.
  126. *
  127. * Values of N
  128. READ( NIN, FMT = * )NIDIM
  129. IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
  130. WRITE( NOUT, FMT = 9997 )'N', NIDMAX
  131. GO TO 220
  132. END IF
  133. READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
  134. DO 10 I = 1, NIDIM
  135. IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
  136. WRITE( NOUT, FMT = 9996 )NMAX
  137. GO TO 220
  138. END IF
  139. 10 CONTINUE
  140. * Values of ALPHA
  141. READ( NIN, FMT = * )NALF
  142. IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
  143. WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
  144. GO TO 220
  145. END IF
  146. READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
  147. * Values of BETA
  148. READ( NIN, FMT = * )NBET
  149. IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
  150. WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
  151. GO TO 220
  152. END IF
  153. READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
  154. *
  155. * Report values of parameters.
  156. *
  157. WRITE( NOUT, FMT = 9995 )
  158. WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
  159. WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
  160. WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
  161. IF( .NOT.TSTERR )THEN
  162. WRITE( NOUT, FMT = * )
  163. WRITE( NOUT, FMT = 9984 )
  164. END IF
  165. WRITE( NOUT, FMT = * )
  166. WRITE( NOUT, FMT = 9999 )THRESH
  167. WRITE( NOUT, FMT = * )
  168. RORDER = .FALSE.
  169. CORDER = .FALSE.
  170. IF (LAYOUT.EQ.2) THEN
  171. RORDER = .TRUE.
  172. CORDER = .TRUE.
  173. WRITE( *, FMT = 10002 )
  174. ELSE IF (LAYOUT.EQ.1) THEN
  175. RORDER = .TRUE.
  176. WRITE( *, FMT = 10001 )
  177. ELSE IF (LAYOUT.EQ.0) THEN
  178. CORDER = .TRUE.
  179. WRITE( *, FMT = 10000 )
  180. END IF
  181. WRITE( *, FMT = * )
  182. *
  183. * Read names of subroutines and flags which indicate
  184. * whether they are to be tested.
  185. *
  186. DO 20 I = 1, NSUBS
  187. LTEST( I ) = .FALSE.
  188. 20 CONTINUE
  189. 30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
  190. DO 40 I = 1, NSUBS
  191. IF( SNAMET.EQ.SNAMES( I ) )
  192. $ GO TO 50
  193. 40 CONTINUE
  194. WRITE( NOUT, FMT = 9990 )SNAMET
  195. 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 ', A12,' 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( A12,L2 )
  415. 9987 FORMAT( 1X, A12,' 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*12 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 CCGEMM, 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 CCGEMM( 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( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  696. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  697. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  698. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  699. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  700. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  701. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  702. $ ' (', I6, ' CALL', 'S)' )
  703. 10000 FORMAT( ' ', A12,' 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( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  708. C 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',',
  709. C $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,
  710. C $ ',(', 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*12 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, ': ', A12,'(', 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*12 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( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1020. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1021. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1022. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1023. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1024. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1025. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1026. $ ' (', I6, ' CALL', 'S)' )
  1027. 10000 FORMAT( ' ', A12,' 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( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1032. C 9995 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  1033. C $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
  1034. C $ ',', 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*12 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, ': ', A12,'(', 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*12 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( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1370. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1371. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1372. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1373. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1374. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1375. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1376. $ ' (', I6, ' CALL', 'S)' )
  1377. 10000 FORMAT( ' ', A12,' 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(' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1382. C 9995 FORMAT(1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ),
  1383. C $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ',
  1384. C $ ' .' )
  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*12 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, ': ', A12,'(', 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*12 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. RALS = RONE
  1499. RBETS = RONE
  1500. *
  1501. DO 100 IN = 1, NIDIM
  1502. N = IDIM( IN )
  1503. * Set LDC to 1 more than minimum value if room.
  1504. LDC = N
  1505. IF( LDC.LT.NMAX )
  1506. $ LDC = LDC + 1
  1507. * Skip tests if not enough room.
  1508. IF( LDC.GT.NMAX )
  1509. $ GO TO 100
  1510. LCC = LDC*N
  1511. *
  1512. DO 90 IK = 1, NIDIM
  1513. K = IDIM( IK )
  1514. *
  1515. DO 80 ICT = 1, 2
  1516. TRANS = ICHT( ICT: ICT )
  1517. TRAN = TRANS.EQ.'C'
  1518. IF( TRAN.AND..NOT.CONJ )
  1519. $ TRANS = 'T'
  1520. IF( TRAN )THEN
  1521. MA = K
  1522. NA = N
  1523. ELSE
  1524. MA = N
  1525. NA = K
  1526. END IF
  1527. * Set LDA to 1 more than minimum value if room.
  1528. LDA = MA
  1529. IF( LDA.LT.NMAX )
  1530. $ LDA = LDA + 1
  1531. * Skip tests if not enough room.
  1532. IF( LDA.GT.NMAX )
  1533. $ GO TO 80
  1534. LAA = LDA*NA
  1535. *
  1536. * Generate the matrix A.
  1537. *
  1538. CALL CMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
  1539. $ RESET, ZERO )
  1540. *
  1541. DO 70 ICU = 1, 2
  1542. UPLO = ICHU( ICU: ICU )
  1543. UPPER = UPLO.EQ.'U'
  1544. *
  1545. DO 60 IA = 1, NALF
  1546. ALPHA = ALF( IA )
  1547. IF( CONJ )THEN
  1548. RALPHA = REAL( ALPHA )
  1549. ALPHA = CMPLX( RALPHA, RZERO )
  1550. END IF
  1551. *
  1552. DO 50 IB = 1, NBET
  1553. BETA = BET( IB )
  1554. IF( CONJ )THEN
  1555. RBETA = REAL( BETA )
  1556. BETA = CMPLX( RBETA, RZERO )
  1557. END IF
  1558. NULL = N.LE.0
  1559. IF( CONJ )
  1560. $ NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.
  1561. $ RZERO ).AND.RBETA.EQ.RONE )
  1562. *
  1563. * Generate the matrix C.
  1564. *
  1565. CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
  1566. $ NMAX, CC, LDC, RESET, ZERO )
  1567. *
  1568. NC = NC + 1
  1569. *
  1570. * Save every datum before calling the subroutine.
  1571. *
  1572. UPLOS = UPLO
  1573. TRANSS = TRANS
  1574. NS = N
  1575. KS = K
  1576. IF( CONJ )THEN
  1577. RALS = RALPHA
  1578. ELSE
  1579. ALS = ALPHA
  1580. END IF
  1581. DO 10 I = 1, LAA
  1582. AS( I ) = AA( I )
  1583. 10 CONTINUE
  1584. LDAS = LDA
  1585. IF( CONJ )THEN
  1586. RBETS = RBETA
  1587. ELSE
  1588. BETS = BETA
  1589. END IF
  1590. DO 20 I = 1, LCC
  1591. CS( I ) = CC( I )
  1592. 20 CONTINUE
  1593. LDCS = LDC
  1594. *
  1595. * Call the subroutine.
  1596. *
  1597. IF( CONJ )THEN
  1598. IF( TRACE )
  1599. $ CALL CPRCN6( NTRA, NC, SNAME, IORDER,
  1600. $ UPLO, TRANS, N, K, RALPHA, LDA, RBETA,
  1601. $ LDC)
  1602. IF( REWI )
  1603. $ REWIND NTRA
  1604. CALL CCHERK( IORDER, UPLO, TRANS, N, K,
  1605. $ RALPHA, AA, LDA, RBETA, CC,
  1606. $ LDC )
  1607. ELSE
  1608. IF( TRACE )
  1609. $ CALL CPRCN4( NTRA, NC, SNAME, IORDER,
  1610. $ UPLO, TRANS, N, K, ALPHA, LDA, BETA, LDC)
  1611. IF( REWI )
  1612. $ REWIND NTRA
  1613. CALL CCSYRK( IORDER, UPLO, TRANS, N, K,
  1614. $ ALPHA, AA, LDA, BETA, CC, LDC )
  1615. END IF
  1616. *
  1617. * Check if error-exit was taken incorrectly.
  1618. *
  1619. IF( .NOT.OK )THEN
  1620. WRITE( NOUT, FMT = 9992 )
  1621. FATAL = .TRUE.
  1622. GO TO 120
  1623. END IF
  1624. *
  1625. * See what data changed inside subroutines.
  1626. *
  1627. ISAME( 1 ) = UPLOS.EQ.UPLO
  1628. ISAME( 2 ) = TRANSS.EQ.TRANS
  1629. ISAME( 3 ) = NS.EQ.N
  1630. ISAME( 4 ) = KS.EQ.K
  1631. IF( CONJ )THEN
  1632. ISAME( 5 ) = RALS.EQ.RALPHA
  1633. ELSE
  1634. ISAME( 5 ) = ALS.EQ.ALPHA
  1635. END IF
  1636. ISAME( 6 ) = LCE( AS, AA, LAA )
  1637. ISAME( 7 ) = LDAS.EQ.LDA
  1638. IF( CONJ )THEN
  1639. ISAME( 8 ) = RBETS.EQ.RBETA
  1640. ELSE
  1641. ISAME( 8 ) = BETS.EQ.BETA
  1642. END IF
  1643. IF( NULL )THEN
  1644. ISAME( 9 ) = LCE( CS, CC, LCC )
  1645. ELSE
  1646. ISAME( 9 ) = LCERES( SNAME( 8: 9 ), UPLO, N,
  1647. $ N, CS, CC, LDC )
  1648. END IF
  1649. ISAME( 10 ) = LDCS.EQ.LDC
  1650. *
  1651. * If data was incorrectly changed, report and
  1652. * return.
  1653. *
  1654. SAME = .TRUE.
  1655. DO 30 I = 1, NARGS
  1656. SAME = SAME.AND.ISAME( I )
  1657. IF( .NOT.ISAME( I ) )
  1658. $ WRITE( NOUT, FMT = 9998 )I
  1659. 30 CONTINUE
  1660. IF( .NOT.SAME )THEN
  1661. FATAL = .TRUE.
  1662. GO TO 120
  1663. END IF
  1664. *
  1665. IF( .NOT.NULL )THEN
  1666. *
  1667. * Check the result column by column.
  1668. *
  1669. IF( CONJ )THEN
  1670. TRANST = 'C'
  1671. ELSE
  1672. TRANST = 'T'
  1673. END IF
  1674. JC = 1
  1675. DO 40 J = 1, N
  1676. IF( UPPER )THEN
  1677. JJ = 1
  1678. LJ = J
  1679. ELSE
  1680. JJ = J
  1681. LJ = N - J + 1
  1682. END IF
  1683. IF( TRAN )THEN
  1684. CALL CMMCH( TRANST, 'N', LJ, 1, K,
  1685. $ ALPHA, A( 1, JJ ), NMAX,
  1686. $ A( 1, J ), NMAX, BETA,
  1687. $ C( JJ, J ), NMAX, CT, G,
  1688. $ CC( JC ), LDC, EPS, ERR,
  1689. $ FATAL, NOUT, .TRUE. )
  1690. ELSE
  1691. CALL CMMCH( 'N', TRANST, LJ, 1, K,
  1692. $ ALPHA, A( JJ, 1 ), NMAX,
  1693. $ A( J, 1 ), NMAX, BETA,
  1694. $ C( JJ, J ), NMAX, CT, G,
  1695. $ CC( JC ), LDC, EPS, ERR,
  1696. $ FATAL, NOUT, .TRUE. )
  1697. END IF
  1698. IF( UPPER )THEN
  1699. JC = JC + LDC
  1700. ELSE
  1701. JC = JC + LDC + 1
  1702. END IF
  1703. ERRMAX = MAX( ERRMAX, ERR )
  1704. * If got really bad answer, report and
  1705. * return.
  1706. IF( FATAL )
  1707. $ GO TO 110
  1708. 40 CONTINUE
  1709. END IF
  1710. *
  1711. 50 CONTINUE
  1712. *
  1713. 60 CONTINUE
  1714. *
  1715. 70 CONTINUE
  1716. *
  1717. 80 CONTINUE
  1718. *
  1719. 90 CONTINUE
  1720. *
  1721. 100 CONTINUE
  1722. *
  1723. * Report result.
  1724. *
  1725. IF( ERRMAX.LT.THRESH )THEN
  1726. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  1727. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  1728. ELSE
  1729. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  1730. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  1731. END IF
  1732. GO TO 130
  1733. *
  1734. 110 CONTINUE
  1735. IF( N.GT.1 )
  1736. $ WRITE( NOUT, FMT = 9995 )J
  1737. *
  1738. 120 CONTINUE
  1739. WRITE( NOUT, FMT = 9996 )SNAME
  1740. IF( CONJ )THEN
  1741. CALL CPRCN6( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, RALPHA,
  1742. $ LDA, rBETA, LDC)
  1743. ELSE
  1744. CALL CPRCN4( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,
  1745. $ LDA, BETA, LDC)
  1746. END IF
  1747. *
  1748. 130 CONTINUE
  1749. RETURN
  1750. *
  1751. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  1752. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1753. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1754. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  1755. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  1756. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  1757. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  1758. $ ' (', I6, ' CALL', 'S)' )
  1759. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  1760. $ ' (', I6, ' CALL', 'S)' )
  1761. 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1762. $ 'ANGED INCORRECTLY *******' )
  1763. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  1764. 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  1765. C 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  1766. C $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ',
  1767. C $ ' .' )
  1768. C 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  1769. C $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,
  1770. C $ '), C,', I3, ') .' )
  1771. 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1772. $ '******' )
  1773. *
  1774. * End of CCHK4.
  1775. *
  1776. END
  1777. *
  1778. SUBROUTINE CPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  1779. $ N, K, ALPHA, LDA, BETA, LDC)
  1780. INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
  1781. COMPLEX ALPHA, BETA
  1782. CHARACTER*1 UPLO, TRANSA
  1783. CHARACTER*12 SNAME
  1784. CHARACTER*14 CRC, CU, CA
  1785. IF (UPLO.EQ.'U')THEN
  1786. CU = ' CblasUpper'
  1787. ELSE
  1788. CU = ' CblasLower'
  1789. END IF
  1790. IF (TRANSA.EQ.'N')THEN
  1791. CA = ' CblasNoTrans'
  1792. ELSE IF (TRANSA.EQ.'T')THEN
  1793. CA = ' CblasTrans'
  1794. ELSE
  1795. CA = 'CblasConjTrans'
  1796. END IF
  1797. IF (IORDER.EQ.1)THEN
  1798. CRC = ' CblasRowMajor'
  1799. ELSE
  1800. CRC = ' CblasColMajor'
  1801. END IF
  1802. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  1803. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
  1804. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  1805. 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1 ,'), A,',
  1806. $ I3, ', (', F4.1,',', F4.1, '), C,', I3, ').' )
  1807. END
  1808. *
  1809. *
  1810. SUBROUTINE CPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  1811. $ N, K, ALPHA, LDA, BETA, LDC)
  1812. INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
  1813. REAL ALPHA, BETA
  1814. CHARACTER*1 UPLO, TRANSA
  1815. CHARACTER*12 SNAME
  1816. CHARACTER*14 CRC, CU, CA
  1817. IF (UPLO.EQ.'U')THEN
  1818. CU = ' CblasUpper'
  1819. ELSE
  1820. CU = ' CblasLower'
  1821. END IF
  1822. IF (TRANSA.EQ.'N')THEN
  1823. CA = ' CblasNoTrans'
  1824. ELSE IF (TRANSA.EQ.'T')THEN
  1825. CA = ' CblasTrans'
  1826. ELSE
  1827. CA = 'CblasConjTrans'
  1828. END IF
  1829. IF (IORDER.EQ.1)THEN
  1830. CRC = ' CblasRowMajor'
  1831. ELSE
  1832. CRC = ' CblasColMajor'
  1833. END IF
  1834. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  1835. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
  1836. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  1837. 9994 FORMAT( 10X, 2( I3, ',' ),
  1838. $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' )
  1839. END
  1840. *
  1841. SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1842. $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
  1843. $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
  1844. $ IORDER )
  1845. *
  1846. * Tests CHER2K and CSYR2K.
  1847. *
  1848. * Auxiliary routine for test program for Level 3 Blas.
  1849. *
  1850. * -- Written on 8-February-1989.
  1851. * Jack Dongarra, Argonne National Laboratory.
  1852. * Iain Duff, AERE Harwell.
  1853. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  1854. * Sven Hammarling, Numerical Algorithms Group Ltd.
  1855. *
  1856. * .. Parameters ..
  1857. COMPLEX ZERO, ONE
  1858. PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
  1859. REAL RONE, RZERO
  1860. PARAMETER ( RONE = 1.0, RZERO = 0.0 )
  1861. * .. Scalar Arguments ..
  1862. REAL EPS, THRESH
  1863. INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  1864. LOGICAL FATAL, REWI, TRACE
  1865. CHARACTER*12 SNAME
  1866. * .. Array Arguments ..
  1867. COMPLEX AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
  1868. $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
  1869. $ BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
  1870. $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
  1871. $ W( 2*NMAX )
  1872. REAL G( NMAX )
  1873. INTEGER IDIM( NIDIM )
  1874. * .. Local Scalars ..
  1875. COMPLEX ALPHA, ALS, BETA, BETS
  1876. REAL ERR, ERRMAX, RBETA, RBETS
  1877. INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
  1878. $ K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
  1879. $ LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
  1880. LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER
  1881. CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS
  1882. CHARACTER*2 ICHT, ICHU
  1883. * .. Local Arrays ..
  1884. LOGICAL ISAME( 13 )
  1885. * .. External Functions ..
  1886. LOGICAL LCE, LCERES
  1887. EXTERNAL LCE, LCERES
  1888. * .. External Subroutines ..
  1889. EXTERNAL CCHER2K, CMAKE, CMMCH, CCSYR2K
  1890. * .. Intrinsic Functions ..
  1891. INTRINSIC CMPLX, CONJG, MAX, REAL
  1892. * .. Scalars in Common ..
  1893. INTEGER INFOT, NOUTC
  1894. LOGICAL LERR, OK
  1895. * .. Common blocks ..
  1896. COMMON /INFOC/INFOT, NOUTC, OK, LERR
  1897. * .. Data statements ..
  1898. DATA ICHT/'NC'/, ICHU/'UL'/
  1899. * .. Executable Statements ..
  1900. CONJ = SNAME( 8: 9 ).EQ.'he'
  1901. *
  1902. NARGS = 12
  1903. NC = 0
  1904. RESET = .TRUE.
  1905. ERRMAX = RZERO
  1906. *
  1907. DO 130 IN = 1, NIDIM
  1908. N = IDIM( IN )
  1909. * Set LDC to 1 more than minimum value if room.
  1910. LDC = N
  1911. IF( LDC.LT.NMAX )
  1912. $ LDC = LDC + 1
  1913. * Skip tests if not enough room.
  1914. IF( LDC.GT.NMAX )
  1915. $ GO TO 130
  1916. LCC = LDC*N
  1917. *
  1918. DO 120 IK = 1, NIDIM
  1919. K = IDIM( IK )
  1920. *
  1921. DO 110 ICT = 1, 2
  1922. TRANS = ICHT( ICT: ICT )
  1923. TRAN = TRANS.EQ.'C'
  1924. IF( TRAN.AND..NOT.CONJ )
  1925. $ TRANS = 'T'
  1926. IF( TRAN )THEN
  1927. MA = K
  1928. NA = N
  1929. ELSE
  1930. MA = N
  1931. NA = K
  1932. END IF
  1933. * Set LDA to 1 more than minimum value if room.
  1934. LDA = MA
  1935. IF( LDA.LT.NMAX )
  1936. $ LDA = LDA + 1
  1937. * Skip tests if not enough room.
  1938. IF( LDA.GT.NMAX )
  1939. $ GO TO 110
  1940. LAA = LDA*NA
  1941. *
  1942. * Generate the matrix A.
  1943. *
  1944. IF( TRAN )THEN
  1945. CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
  1946. $ LDA, RESET, ZERO )
  1947. ELSE
  1948. CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
  1949. $ RESET, ZERO )
  1950. END IF
  1951. *
  1952. * Generate the matrix B.
  1953. *
  1954. LDB = LDA
  1955. LBB = LAA
  1956. IF( TRAN )THEN
  1957. CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB( K + 1 ),
  1958. $ 2*NMAX, BB, LDB, RESET, ZERO )
  1959. ELSE
  1960. CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
  1961. $ NMAX, BB, LDB, RESET, ZERO )
  1962. END IF
  1963. *
  1964. DO 100 ICU = 1, 2
  1965. UPLO = ICHU( ICU: ICU )
  1966. UPPER = UPLO.EQ.'U'
  1967. *
  1968. DO 90 IA = 1, NALF
  1969. ALPHA = ALF( IA )
  1970. *
  1971. DO 80 IB = 1, NBET
  1972. BETA = BET( IB )
  1973. IF( CONJ )THEN
  1974. RBETA = REAL( BETA )
  1975. BETA = CMPLX( RBETA, RZERO )
  1976. END IF
  1977. NULL = N.LE.0
  1978. IF( CONJ )
  1979. $ NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.
  1980. $ ZERO ).AND.RBETA.EQ.RONE )
  1981. *
  1982. * Generate the matrix C.
  1983. *
  1984. CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
  1985. $ NMAX, CC, LDC, RESET, ZERO )
  1986. *
  1987. NC = NC + 1
  1988. *
  1989. * Save every datum before calling the subroutine.
  1990. *
  1991. UPLOS = UPLO
  1992. TRANSS = TRANS
  1993. NS = N
  1994. KS = K
  1995. ALS = ALPHA
  1996. DO 10 I = 1, LAA
  1997. AS( I ) = AA( I )
  1998. 10 CONTINUE
  1999. LDAS = LDA
  2000. DO 20 I = 1, LBB
  2001. BS( I ) = BB( I )
  2002. 20 CONTINUE
  2003. LDBS = LDB
  2004. IF( CONJ )THEN
  2005. RBETS = RBETA
  2006. ELSE
  2007. BETS = BETA
  2008. END IF
  2009. DO 30 I = 1, LCC
  2010. CS( I ) = CC( I )
  2011. 30 CONTINUE
  2012. LDCS = LDC
  2013. *
  2014. * Call the subroutine.
  2015. *
  2016. IF( CONJ )THEN
  2017. IF( TRACE )
  2018. $ CALL CPRCN7( NTRA, NC, SNAME, IORDER,
  2019. $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
  2020. $ RBETA, LDC)
  2021. IF( REWI )
  2022. $ REWIND NTRA
  2023. CALL CCHER2K( IORDER, UPLO, TRANS, N, K,
  2024. $ ALPHA, AA, LDA, BB, LDB, RBETA,
  2025. $ CC, LDC )
  2026. ELSE
  2027. IF( TRACE )
  2028. $ CALL CPRCN5( NTRA, NC, SNAME, IORDER,
  2029. $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
  2030. $ BETA, LDC)
  2031. IF( REWI )
  2032. $ REWIND NTRA
  2033. CALL CCSYR2K( IORDER, UPLO, TRANS, N, K,
  2034. $ ALPHA, AA, LDA, BB, LDB, BETA,
  2035. $ CC, LDC )
  2036. END IF
  2037. *
  2038. * Check if error-exit was taken incorrectly.
  2039. *
  2040. IF( .NOT.OK )THEN
  2041. WRITE( NOUT, FMT = 9992 )
  2042. FATAL = .TRUE.
  2043. GO TO 150
  2044. END IF
  2045. *
  2046. * See what data changed inside subroutines.
  2047. *
  2048. ISAME( 1 ) = UPLOS.EQ.UPLO
  2049. ISAME( 2 ) = TRANSS.EQ.TRANS
  2050. ISAME( 3 ) = NS.EQ.N
  2051. ISAME( 4 ) = KS.EQ.K
  2052. ISAME( 5 ) = ALS.EQ.ALPHA
  2053. ISAME( 6 ) = LCE( AS, AA, LAA )
  2054. ISAME( 7 ) = LDAS.EQ.LDA
  2055. ISAME( 8 ) = LCE( BS, BB, LBB )
  2056. ISAME( 9 ) = LDBS.EQ.LDB
  2057. IF( CONJ )THEN
  2058. ISAME( 10 ) = RBETS.EQ.RBETA
  2059. ELSE
  2060. ISAME( 10 ) = BETS.EQ.BETA
  2061. END IF
  2062. IF( NULL )THEN
  2063. ISAME( 11 ) = LCE( CS, CC, LCC )
  2064. ELSE
  2065. ISAME( 11 ) = LCERES( 'he', UPLO, N, N, CS,
  2066. $ CC, LDC )
  2067. END IF
  2068. ISAME( 12 ) = LDCS.EQ.LDC
  2069. *
  2070. * If data was incorrectly changed, report and
  2071. * return.
  2072. *
  2073. SAME = .TRUE.
  2074. DO 40 I = 1, NARGS
  2075. SAME = SAME.AND.ISAME( I )
  2076. IF( .NOT.ISAME( I ) )
  2077. $ WRITE( NOUT, FMT = 9998 )I
  2078. 40 CONTINUE
  2079. IF( .NOT.SAME )THEN
  2080. FATAL = .TRUE.
  2081. GO TO 150
  2082. END IF
  2083. *
  2084. IF( .NOT.NULL )THEN
  2085. *
  2086. * Check the result column by column.
  2087. *
  2088. IF( CONJ )THEN
  2089. TRANST = 'C'
  2090. ELSE
  2091. TRANST = 'T'
  2092. END IF
  2093. JJAB = 1
  2094. JC = 1
  2095. DO 70 J = 1, N
  2096. IF( UPPER )THEN
  2097. JJ = 1
  2098. LJ = J
  2099. ELSE
  2100. JJ = J
  2101. LJ = N - J + 1
  2102. END IF
  2103. IF( TRAN )THEN
  2104. DO 50 I = 1, K
  2105. W( I ) = ALPHA*AB( ( J - 1 )*2*
  2106. $ NMAX + K + I )
  2107. IF( CONJ )THEN
  2108. W( K + I ) = CONJG( ALPHA )*
  2109. $ AB( ( J - 1 )*2*
  2110. $ NMAX + I )
  2111. ELSE
  2112. W( K + I ) = ALPHA*
  2113. $ AB( ( J - 1 )*2*
  2114. $ NMAX + I )
  2115. END IF
  2116. 50 CONTINUE
  2117. CALL CMMCH( TRANST, 'N', LJ, 1, 2*K,
  2118. $ ONE, AB( JJAB ), 2*NMAX, W,
  2119. $ 2*NMAX, BETA, C( JJ, J ),
  2120. $ NMAX, CT, G, CC( JC ), LDC,
  2121. $ EPS, ERR, FATAL, NOUT,
  2122. $ .TRUE. )
  2123. ELSE
  2124. DO 60 I = 1, K
  2125. IF( CONJ )THEN
  2126. W( I ) = ALPHA*CONJG( AB( ( K +
  2127. $ I - 1 )*NMAX + J ) )
  2128. W( K + I ) = CONJG( ALPHA*
  2129. $ AB( ( I - 1 )*NMAX +
  2130. $ J ) )
  2131. ELSE
  2132. W( I ) = ALPHA*AB( ( K + I - 1 )*
  2133. $ NMAX + J )
  2134. W( K + I ) = ALPHA*
  2135. $ AB( ( I - 1 )*NMAX +
  2136. $ J )
  2137. END IF
  2138. 60 CONTINUE
  2139. CALL CMMCH( 'N', 'N', LJ, 1, 2*K, ONE,
  2140. $ AB( JJ ), NMAX, W, 2*NMAX,
  2141. $ BETA, C( JJ, J ), NMAX, CT,
  2142. $ G, CC( JC ), LDC, EPS, ERR,
  2143. $ FATAL, NOUT, .TRUE. )
  2144. END IF
  2145. IF( UPPER )THEN
  2146. JC = JC + LDC
  2147. ELSE
  2148. JC = JC + LDC + 1
  2149. IF( TRAN )
  2150. $ JJAB = JJAB + 2*NMAX
  2151. END IF
  2152. ERRMAX = MAX( ERRMAX, ERR )
  2153. * If got really bad answer, report and
  2154. * return.
  2155. IF( FATAL )
  2156. $ GO TO 140
  2157. 70 CONTINUE
  2158. END IF
  2159. *
  2160. 80 CONTINUE
  2161. *
  2162. 90 CONTINUE
  2163. *
  2164. 100 CONTINUE
  2165. *
  2166. 110 CONTINUE
  2167. *
  2168. 120 CONTINUE
  2169. *
  2170. 130 CONTINUE
  2171. *
  2172. * Report result.
  2173. *
  2174. IF( ERRMAX.LT.THRESH )THEN
  2175. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
  2176. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
  2177. ELSE
  2178. IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
  2179. IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
  2180. END IF
  2181. GO TO 160
  2182. *
  2183. 140 CONTINUE
  2184. IF( N.GT.1 )
  2185. $ WRITE( NOUT, FMT = 9995 )J
  2186. *
  2187. 150 CONTINUE
  2188. WRITE( NOUT, FMT = 9996 )SNAME
  2189. IF( CONJ )THEN
  2190. CALL CPRCN7( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
  2191. $ ALPHA, LDA, LDB, RBETA, LDC)
  2192. ELSE
  2193. CALL CPRCN5( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
  2194. $ ALPHA, LDA, LDB, BETA, LDC)
  2195. END IF
  2196. *
  2197. 160 CONTINUE
  2198. RETURN
  2199. *
  2200. 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
  2201. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  2202. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  2203. 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  2204. $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  2205. $ 'RATIO ', F8.2, ' - SUSPECT *******' )
  2206. 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
  2207. $ ' (', I6, ' CALL', 'S)' )
  2208. 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  2209. $ ' (', I6, ' CALL', 'S)' )
  2210. 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  2211. $ 'ANGED INCORRECTLY *******' )
  2212. 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
  2213. 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2214. C 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  2215. C $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,
  2216. C $ ', C,', I3, ') .' )
  2217. C 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
  2218. C $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
  2219. C $ ',', F4.1, '), C,', I3, ') .' )
  2220. 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  2221. $ '******' )
  2222. *
  2223. * End of CCHK5.
  2224. *
  2225. END
  2226. *
  2227. SUBROUTINE CPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  2228. $ N, K, ALPHA, LDA, LDB, BETA, LDC)
  2229. INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
  2230. COMPLEX ALPHA, BETA
  2231. CHARACTER*1 UPLO, TRANSA
  2232. CHARACTER*12 SNAME
  2233. CHARACTER*14 CRC, CU, CA
  2234. IF (UPLO.EQ.'U')THEN
  2235. CU = ' CblasUpper'
  2236. ELSE
  2237. CU = ' CblasLower'
  2238. END IF
  2239. IF (TRANSA.EQ.'N')THEN
  2240. CA = ' CblasNoTrans'
  2241. ELSE IF (TRANSA.EQ.'T')THEN
  2242. CA = ' CblasTrans'
  2243. ELSE
  2244. CA = 'CblasConjTrans'
  2245. END IF
  2246. IF (IORDER.EQ.1)THEN
  2247. CRC = ' CblasRowMajor'
  2248. ELSE
  2249. CRC = ' CblasColMajor'
  2250. END IF
  2251. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  2252. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
  2253. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  2254. 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
  2255. $ I3, ', B', I3, ', (', F4.1, ',', F4.1, '), C,', I3, ').' )
  2256. END
  2257. *
  2258. *
  2259. SUBROUTINE CPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
  2260. $ N, K, ALPHA, LDA, LDB, BETA, LDC)
  2261. INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
  2262. COMPLEX ALPHA
  2263. REAL BETA
  2264. CHARACTER*1 UPLO, TRANSA
  2265. CHARACTER*12 SNAME
  2266. CHARACTER*14 CRC, CU, CA
  2267. IF (UPLO.EQ.'U')THEN
  2268. CU = ' CblasUpper'
  2269. ELSE
  2270. CU = ' CblasLower'
  2271. END IF
  2272. IF (TRANSA.EQ.'N')THEN
  2273. CA = ' CblasNoTrans'
  2274. ELSE IF (TRANSA.EQ.'T')THEN
  2275. CA = ' CblasTrans'
  2276. ELSE
  2277. CA = 'CblasConjTrans'
  2278. END IF
  2279. IF (IORDER.EQ.1)THEN
  2280. CRC = ' CblasRowMajor'
  2281. ELSE
  2282. CRC = ' CblasColMajor'
  2283. END IF
  2284. WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
  2285. WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
  2286. 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
  2287. 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
  2288. $ I3, ', B', I3, ',', F4.1, ', C,', I3, ').' )
  2289. END
  2290. *
  2291. SUBROUTINE CMAKE(TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
  2292. $ TRANSL )
  2293. *
  2294. * Generates values for an M by N matrix A.
  2295. * Stores the values in the array AA in the data structure required
  2296. * by the routine, with unwanted elements set to rogue value.
  2297. *
  2298. * TYPE is 'ge', 'he', 'sy' or 'tr'.
  2299. *
  2300. * Auxiliary routine for test program for Level 3 Blas.
  2301. *
  2302. * -- Written on 8-February-1989.
  2303. * Jack Dongarra, Argonne National Laboratory.
  2304. * Iain Duff, AERE Harwell.
  2305. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2306. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2307. *
  2308. * .. Parameters ..
  2309. COMPLEX ZERO, ONE
  2310. PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
  2311. COMPLEX ROGUE
  2312. PARAMETER ( ROGUE = ( -1.0E10, 1.0E10 ) )
  2313. REAL RZERO
  2314. PARAMETER ( RZERO = 0.0 )
  2315. REAL RROGUE
  2316. PARAMETER ( RROGUE = -1.0E10 )
  2317. * .. Scalar Arguments ..
  2318. COMPLEX TRANSL
  2319. INTEGER LDA, M, N, NMAX
  2320. LOGICAL RESET
  2321. CHARACTER*1 DIAG, UPLO
  2322. CHARACTER*2 TYPE
  2323. * .. Array Arguments ..
  2324. COMPLEX A( NMAX, * ), AA( * )
  2325. * .. Local Scalars ..
  2326. INTEGER I, IBEG, IEND, J, JJ
  2327. LOGICAL GEN, HER, LOWER, SYM, TRI, UNIT, UPPER
  2328. * .. External Functions ..
  2329. COMPLEX CBEG
  2330. EXTERNAL CBEG
  2331. * .. Intrinsic Functions ..
  2332. INTRINSIC CMPLX, CONJG, REAL
  2333. * .. Executable Statements ..
  2334. GEN = TYPE.EQ.'ge'
  2335. HER = TYPE.EQ.'he'
  2336. SYM = TYPE.EQ.'sy'
  2337. TRI = TYPE.EQ.'tr'
  2338. UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'
  2339. LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'
  2340. UNIT = TRI.AND.DIAG.EQ.'U'
  2341. *
  2342. * Generate data in array A.
  2343. *
  2344. DO 20 J = 1, N
  2345. DO 10 I = 1, M
  2346. IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
  2347. $ THEN
  2348. A( I, J ) = CBEG( RESET ) + TRANSL
  2349. IF( I.NE.J )THEN
  2350. * Set some elements to zero
  2351. IF( N.GT.3.AND.J.EQ.N/2 )
  2352. $ A( I, J ) = ZERO
  2353. IF( HER )THEN
  2354. A( J, I ) = CONJG( A( I, J ) )
  2355. ELSE IF( SYM )THEN
  2356. A( J, I ) = A( I, J )
  2357. ELSE IF( TRI )THEN
  2358. A( J, I ) = ZERO
  2359. END IF
  2360. END IF
  2361. END IF
  2362. 10 CONTINUE
  2363. IF( HER )
  2364. $ A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )
  2365. IF( TRI )
  2366. $ A( J, J ) = A( J, J ) + ONE
  2367. IF( UNIT )
  2368. $ A( J, J ) = ONE
  2369. 20 CONTINUE
  2370. *
  2371. * Store elements in array AS in data structure required by routine.
  2372. *
  2373. IF( TYPE.EQ.'ge' )THEN
  2374. DO 50 J = 1, N
  2375. DO 30 I = 1, M
  2376. AA( I + ( J - 1 )*LDA ) = A( I, J )
  2377. 30 CONTINUE
  2378. DO 40 I = M + 1, LDA
  2379. AA( I + ( J - 1 )*LDA ) = ROGUE
  2380. 40 CONTINUE
  2381. 50 CONTINUE
  2382. ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy'.OR.TYPE.EQ.'tr' )THEN
  2383. DO 90 J = 1, N
  2384. IF( UPPER )THEN
  2385. IBEG = 1
  2386. IF( UNIT )THEN
  2387. IEND = J - 1
  2388. ELSE
  2389. IEND = J
  2390. END IF
  2391. ELSE
  2392. IF( UNIT )THEN
  2393. IBEG = J + 1
  2394. ELSE
  2395. IBEG = J
  2396. END IF
  2397. IEND = N
  2398. END IF
  2399. DO 60 I = 1, IBEG - 1
  2400. AA( I + ( J - 1 )*LDA ) = ROGUE
  2401. 60 CONTINUE
  2402. DO 70 I = IBEG, IEND
  2403. AA( I + ( J - 1 )*LDA ) = A( I, J )
  2404. 70 CONTINUE
  2405. DO 80 I = IEND + 1, LDA
  2406. AA( I + ( J - 1 )*LDA ) = ROGUE
  2407. 80 CONTINUE
  2408. IF( HER )THEN
  2409. JJ = J + ( J - 1 )*LDA
  2410. AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )
  2411. END IF
  2412. 90 CONTINUE
  2413. END IF
  2414. RETURN
  2415. *
  2416. * End of CMAKE.
  2417. *
  2418. END
  2419. SUBROUTINE CMMCH(TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
  2420. $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
  2421. $ NOUT, MV )
  2422. *
  2423. * Checks the results of the computational tests.
  2424. *
  2425. * Auxiliary routine for test program for Level 3 Blas.
  2426. *
  2427. * -- Written on 8-February-1989.
  2428. * Jack Dongarra, Argonne National Laboratory.
  2429. * Iain Duff, AERE Harwell.
  2430. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2431. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2432. *
  2433. * .. Parameters ..
  2434. COMPLEX ZERO
  2435. PARAMETER ( ZERO = ( 0.0, 0.0 ) )
  2436. REAL RZERO, RONE
  2437. PARAMETER ( RZERO = 0.0, RONE = 1.0 )
  2438. * .. Scalar Arguments ..
  2439. COMPLEX ALPHA, BETA
  2440. REAL EPS, ERR
  2441. INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT
  2442. LOGICAL FATAL, MV
  2443. CHARACTER*1 TRANSA, TRANSB
  2444. * .. Array Arguments ..
  2445. COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ),
  2446. $ CC( LDCC, * ), CT( * )
  2447. REAL G( * )
  2448. * .. Local Scalars ..
  2449. COMPLEX CL
  2450. REAL ERRI
  2451. INTEGER I, J, K
  2452. LOGICAL CTRANA, CTRANB, TRANA, TRANB
  2453. * .. Intrinsic Functions ..
  2454. INTRINSIC ABS, AIMAG, CONJG, MAX, REAL, SQRT
  2455. * .. Statement Functions ..
  2456. REAL ABS1
  2457. * .. Statement Function definitions ..
  2458. ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) )
  2459. * .. Executable Statements ..
  2460. TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
  2461. TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
  2462. CTRANA = TRANSA.EQ.'C'
  2463. CTRANB = TRANSB.EQ.'C'
  2464. *
  2465. * Compute expected result, one column at a time, in CT using data
  2466. * in A, B and C.
  2467. * Compute gauges in G.
  2468. *
  2469. DO 220 J = 1, N
  2470. *
  2471. DO 10 I = 1, M
  2472. CT( I ) = ZERO
  2473. G( I ) = RZERO
  2474. 10 CONTINUE
  2475. IF( .NOT.TRANA.AND..NOT.TRANB )THEN
  2476. DO 30 K = 1, KK
  2477. DO 20 I = 1, M
  2478. CT( I ) = CT( I ) + A( I, K )*B( K, J )
  2479. G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )
  2480. 20 CONTINUE
  2481. 30 CONTINUE
  2482. ELSE IF( TRANA.AND..NOT.TRANB )THEN
  2483. IF( CTRANA )THEN
  2484. DO 50 K = 1, KK
  2485. DO 40 I = 1, M
  2486. CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J )
  2487. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2488. $ ABS1( B( K, J ) )
  2489. 40 CONTINUE
  2490. 50 CONTINUE
  2491. ELSE
  2492. DO 70 K = 1, KK
  2493. DO 60 I = 1, M
  2494. CT( I ) = CT( I ) + A( K, I )*B( K, J )
  2495. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2496. $ ABS1( B( K, J ) )
  2497. 60 CONTINUE
  2498. 70 CONTINUE
  2499. END IF
  2500. ELSE IF( .NOT.TRANA.AND.TRANB )THEN
  2501. IF( CTRANB )THEN
  2502. DO 90 K = 1, KK
  2503. DO 80 I = 1, M
  2504. CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) )
  2505. G( I ) = G( I ) + ABS1( A( I, K ) )*
  2506. $ ABS1( B( J, K ) )
  2507. 80 CONTINUE
  2508. 90 CONTINUE
  2509. ELSE
  2510. DO 110 K = 1, KK
  2511. DO 100 I = 1, M
  2512. CT( I ) = CT( I ) + A( I, K )*B( J, K )
  2513. G( I ) = G( I ) + ABS1( A( I, K ) )*
  2514. $ ABS1( B( J, K ) )
  2515. 100 CONTINUE
  2516. 110 CONTINUE
  2517. END IF
  2518. ELSE IF( TRANA.AND.TRANB )THEN
  2519. IF( CTRANA )THEN
  2520. IF( CTRANB )THEN
  2521. DO 130 K = 1, KK
  2522. DO 120 I = 1, M
  2523. CT( I ) = CT( I ) + CONJG( A( K, I ) )*
  2524. $ CONJG( B( J, K ) )
  2525. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2526. $ ABS1( B( J, K ) )
  2527. 120 CONTINUE
  2528. 130 CONTINUE
  2529. ELSE
  2530. DO 150 K = 1, KK
  2531. DO 140 I = 1, M
  2532. CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K )
  2533. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2534. $ ABS1( B( J, K ) )
  2535. 140 CONTINUE
  2536. 150 CONTINUE
  2537. END IF
  2538. ELSE
  2539. IF( CTRANB )THEN
  2540. DO 170 K = 1, KK
  2541. DO 160 I = 1, M
  2542. CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) )
  2543. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2544. $ ABS1( B( J, K ) )
  2545. 160 CONTINUE
  2546. 170 CONTINUE
  2547. ELSE
  2548. DO 190 K = 1, KK
  2549. DO 180 I = 1, M
  2550. CT( I ) = CT( I ) + A( K, I )*B( J, K )
  2551. G( I ) = G( I ) + ABS1( A( K, I ) )*
  2552. $ ABS1( B( J, K ) )
  2553. 180 CONTINUE
  2554. 190 CONTINUE
  2555. END IF
  2556. END IF
  2557. END IF
  2558. DO 200 I = 1, M
  2559. CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
  2560. G( I ) = ABS1( ALPHA )*G( I ) +
  2561. $ ABS1( BETA )*ABS1( C( I, J ) )
  2562. 200 CONTINUE
  2563. *
  2564. * Compute the error ratio for this result.
  2565. *
  2566. ERR = ZERO
  2567. DO 210 I = 1, M
  2568. ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS
  2569. IF( G( I ).NE.RZERO )
  2570. $ ERRI = ERRI/G( I )
  2571. ERR = MAX( ERR, ERRI )
  2572. IF( ERR*SQRT( EPS ).GE.RONE )
  2573. $ GO TO 230
  2574. 210 CONTINUE
  2575. *
  2576. 220 CONTINUE
  2577. *
  2578. * If the loop completes, all results are at least half accurate.
  2579. GO TO 250
  2580. *
  2581. * Report fatal error.
  2582. *
  2583. 230 FATAL = .TRUE.
  2584. WRITE( NOUT, FMT = 9999 )
  2585. DO 240 I = 1, M
  2586. IF( MV )THEN
  2587. WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
  2588. ELSE
  2589. WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
  2590. END IF
  2591. 240 CONTINUE
  2592. IF( N.GT.1 )
  2593. $ WRITE( NOUT, FMT = 9997 )J
  2594. *
  2595. 250 CONTINUE
  2596. RETURN
  2597. *
  2598. 9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
  2599. $ 'F ACCURATE *******', /' EXPECTED RE',
  2600. $ 'SULT COMPUTED RESULT' )
  2601. 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) )
  2602. 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2603. *
  2604. * End of CMMCH.
  2605. *
  2606. END
  2607. LOGICAL FUNCTION LCE( RI, RJ, LR )
  2608. *
  2609. * Tests if two arrays are identical.
  2610. *
  2611. * Auxiliary routine for test program for Level 3 Blas.
  2612. *
  2613. * -- Written on 8-February-1989.
  2614. * Jack Dongarra, Argonne National Laboratory.
  2615. * Iain Duff, AERE Harwell.
  2616. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2617. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2618. *
  2619. * .. Scalar Arguments ..
  2620. INTEGER LR
  2621. * .. Array Arguments ..
  2622. COMPLEX RI( * ), RJ( * )
  2623. * .. Local Scalars ..
  2624. INTEGER I
  2625. * .. Executable Statements ..
  2626. DO 10 I = 1, LR
  2627. IF( RI( I ).NE.RJ( I ) )
  2628. $ GO TO 20
  2629. 10 CONTINUE
  2630. LCE = .TRUE.
  2631. GO TO 30
  2632. 20 CONTINUE
  2633. LCE = .FALSE.
  2634. 30 RETURN
  2635. *
  2636. * End of LCE.
  2637. *
  2638. END
  2639. LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )
  2640. *
  2641. * Tests if selected elements in two arrays are equal.
  2642. *
  2643. * TYPE is 'ge' or 'he' or 'sy'.
  2644. *
  2645. * Auxiliary routine for test program for Level 3 Blas.
  2646. *
  2647. * -- Written on 8-February-1989.
  2648. * Jack Dongarra, Argonne National Laboratory.
  2649. * Iain Duff, AERE Harwell.
  2650. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2651. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2652. *
  2653. * .. Scalar Arguments ..
  2654. INTEGER LDA, M, N
  2655. CHARACTER*1 UPLO
  2656. CHARACTER*2 TYPE
  2657. * .. Array Arguments ..
  2658. COMPLEX AA( LDA, * ), AS( LDA, * )
  2659. * .. Local Scalars ..
  2660. INTEGER I, IBEG, IEND, J
  2661. LOGICAL UPPER
  2662. * .. Executable Statements ..
  2663. UPPER = UPLO.EQ.'U'
  2664. IF( TYPE.EQ.'ge' )THEN
  2665. DO 20 J = 1, N
  2666. DO 10 I = M + 1, LDA
  2667. IF( AA( I, J ).NE.AS( I, J ) )
  2668. $ GO TO 70
  2669. 10 CONTINUE
  2670. 20 CONTINUE
  2671. ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy' )THEN
  2672. DO 50 J = 1, N
  2673. IF( UPPER )THEN
  2674. IBEG = 1
  2675. IEND = J
  2676. ELSE
  2677. IBEG = J
  2678. IEND = N
  2679. END IF
  2680. DO 30 I = 1, IBEG - 1
  2681. IF( AA( I, J ).NE.AS( I, J ) )
  2682. $ GO TO 70
  2683. 30 CONTINUE
  2684. DO 40 I = IEND + 1, LDA
  2685. IF( AA( I, J ).NE.AS( I, J ) )
  2686. $ GO TO 70
  2687. 40 CONTINUE
  2688. 50 CONTINUE
  2689. END IF
  2690. *
  2691. C 60 CONTINUE
  2692. LCERES = .TRUE.
  2693. GO TO 80
  2694. 70 CONTINUE
  2695. LCERES = .FALSE.
  2696. 80 RETURN
  2697. *
  2698. * End of LCERES.
  2699. *
  2700. END
  2701. COMPLEX FUNCTION CBEG( RESET )
  2702. *
  2703. * Generates complex numbers as pairs of random numbers uniformly
  2704. * distributed between -0.5 and 0.5.
  2705. *
  2706. * Auxiliary routine for test program for Level 3 Blas.
  2707. *
  2708. * -- Written on 8-February-1989.
  2709. * Jack Dongarra, Argonne National Laboratory.
  2710. * Iain Duff, AERE Harwell.
  2711. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2712. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2713. *
  2714. * .. Scalar Arguments ..
  2715. LOGICAL RESET
  2716. * .. Local Scalars ..
  2717. INTEGER I, IC, J, MI, MJ
  2718. * .. Save statement ..
  2719. SAVE I, IC, J, MI, MJ
  2720. * .. Intrinsic Functions ..
  2721. INTRINSIC CMPLX
  2722. * .. Executable Statements ..
  2723. IF( RESET )THEN
  2724. * Initialize local variables.
  2725. MI = 891
  2726. MJ = 457
  2727. I = 7
  2728. J = 7
  2729. IC = 0
  2730. RESET = .FALSE.
  2731. END IF
  2732. *
  2733. * The sequence of values of I or J is bounded between 1 and 999.
  2734. * If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
  2735. * If initial I or J = 4 or 8, the period will be 25.
  2736. * If initial I or J = 5, the period will be 10.
  2737. * IC is used to break up the period by skipping 1 value of I or J
  2738. * in 6.
  2739. *
  2740. IC = IC + 1
  2741. 10 I = I*MI
  2742. J = J*MJ
  2743. I = I - 1000*( I/1000 )
  2744. J = J - 1000*( J/1000 )
  2745. IF( IC.GE.5 )THEN
  2746. IC = 0
  2747. GO TO 10
  2748. END IF
  2749. CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )
  2750. RETURN
  2751. *
  2752. * End of CBEG.
  2753. *
  2754. END
  2755. REAL FUNCTION SDIFF( X, Y )
  2756. *
  2757. * Auxiliary routine for test program for Level 3 Blas.
  2758. *
  2759. * -- Written on 8-February-1989.
  2760. * Jack Dongarra, Argonne National Laboratory.
  2761. * Iain Duff, AERE Harwell.
  2762. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  2763. * Sven Hammarling, Numerical Algorithms Group Ltd.
  2764. *
  2765. * .. Scalar Arguments ..
  2766. REAL X, Y
  2767. * .. Executable Statements ..
  2768. SDIFF = X - Y
  2769. RETURN
  2770. *
  2771. * End of SDIFF.
  2772. *
  2773. END