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

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

OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.

Contributors (1)