gsl_blas__blas.c 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191
  1. /* blas/blas.c
  2. *
  3. * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman & Brian
  4. * Gough
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or (at
  9. * your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. /* GSL implementation of BLAS operations for vectors and dense
  21. * matrices. Note that GSL native storage is row-major. */
  22. #include "gsl__config.h"
  23. #include "gsl_math.h"
  24. #include "gsl_errno.h"
  25. #include "gsl_cblas.h"
  26. #include "gsl_cblas.h"
  27. #include "gsl_blas_types.h"
  28. #include "gsl_blas.h"
  29. /* ========================================================================
  30. * Level 1
  31. * ========================================================================
  32. */
  33. /* CBLAS defines vector sizes in terms of int. GSL defines sizes in
  34. terms of size_t, so we need to convert these into integers. There
  35. is the possibility of overflow here. FIXME: Maybe this could be
  36. caught */
  37. #define INT(X) ((int)(X))
  38. int
  39. gsl_blas_sdsdot (float alpha, const gsl_vector_float * X,
  40. const gsl_vector_float * Y, float *result)
  41. {
  42. if (X->size == Y->size)
  43. {
  44. *result =
  45. cblas_sdsdot (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
  46. INT (Y->stride));
  47. return GSL_SUCCESS;
  48. }
  49. else
  50. {
  51. GSL_ERROR ("invalid length", GSL_EBADLEN);
  52. }
  53. }
  54. int
  55. gsl_blas_dsdot (const gsl_vector_float * X, const gsl_vector_float * Y,
  56. double *result)
  57. {
  58. if (X->size == Y->size)
  59. {
  60. *result =
  61. cblas_dsdot (INT (X->size), X->data, INT (X->stride), Y->data,
  62. INT (Y->stride));
  63. return GSL_SUCCESS;
  64. }
  65. else
  66. {
  67. GSL_ERROR ("invalid length", GSL_EBADLEN);
  68. }
  69. }
  70. int
  71. gsl_blas_sdot (const gsl_vector_float * X, const gsl_vector_float * Y,
  72. float *result)
  73. {
  74. if (X->size == Y->size)
  75. {
  76. *result =
  77. cblas_sdot (INT (X->size), X->data, INT (X->stride), Y->data,
  78. INT (Y->stride));
  79. return GSL_SUCCESS;
  80. }
  81. else
  82. {
  83. GSL_ERROR ("invalid length", GSL_EBADLEN);
  84. }
  85. }
  86. int
  87. gsl_blas_ddot (const gsl_vector * X, const gsl_vector * Y, double *result)
  88. {
  89. if (X->size == Y->size)
  90. {
  91. *result =
  92. cblas_ddot (INT (X->size), X->data, INT (X->stride), Y->data,
  93. INT (Y->stride));
  94. return GSL_SUCCESS;
  95. }
  96. else
  97. {
  98. GSL_ERROR ("invalid length", GSL_EBADLEN);
  99. }
  100. }
  101. int
  102. gsl_blas_cdotu (const gsl_vector_complex_float * X,
  103. const gsl_vector_complex_float * Y, gsl_complex_float * dotu)
  104. {
  105. if (X->size == Y->size)
  106. {
  107. cblas_cdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
  108. INT (Y->stride), GSL_COMPLEX_P (dotu));
  109. return GSL_SUCCESS;
  110. }
  111. else
  112. {
  113. GSL_ERROR ("invalid length", GSL_EBADLEN);
  114. }
  115. }
  116. int
  117. gsl_blas_cdotc (const gsl_vector_complex_float * X,
  118. const gsl_vector_complex_float * Y, gsl_complex_float * dotc)
  119. {
  120. if (X->size == Y->size)
  121. {
  122. cblas_cdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
  123. INT (Y->stride), GSL_COMPLEX_P (dotc));
  124. return GSL_SUCCESS;
  125. }
  126. else
  127. {
  128. GSL_ERROR ("invalid length", GSL_EBADLEN);
  129. }
  130. }
  131. int
  132. gsl_blas_zdotu (const gsl_vector_complex * X, const gsl_vector_complex * Y,
  133. gsl_complex * dotu)
  134. {
  135. if (X->size == Y->size)
  136. {
  137. cblas_zdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
  138. INT (Y->stride), GSL_COMPLEX_P (dotu));
  139. return GSL_SUCCESS;
  140. }
  141. else
  142. {
  143. GSL_ERROR ("invalid length", GSL_EBADLEN);
  144. }
  145. }
  146. int
  147. gsl_blas_zdotc (const gsl_vector_complex * X, const gsl_vector_complex * Y,
  148. gsl_complex * dotc)
  149. {
  150. if (X->size == Y->size)
  151. {
  152. cblas_zdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
  153. INT (Y->stride), GSL_COMPLEX_P (dotc));
  154. return GSL_SUCCESS;
  155. }
  156. else
  157. {
  158. GSL_ERROR ("invalid length", GSL_EBADLEN);
  159. }
  160. }
  161. /* Norms of vectors */
  162. float
  163. gsl_blas_snrm2 (const gsl_vector_float * X)
  164. {
  165. return cblas_snrm2 (INT (X->size), X->data, INT (X->stride));
  166. }
  167. double
  168. gsl_blas_dnrm2 (const gsl_vector * X)
  169. {
  170. return cblas_dnrm2 (INT (X->size), X->data, INT (X->stride));
  171. }
  172. float
  173. gsl_blas_scnrm2 (const gsl_vector_complex_float * X)
  174. {
  175. return cblas_scnrm2 (INT (X->size), X->data, INT (X->stride));
  176. }
  177. double
  178. gsl_blas_dznrm2 (const gsl_vector_complex * X)
  179. {
  180. return cblas_dznrm2 (INT (X->size), X->data, INT (X->stride));
  181. }
  182. /* Absolute sums of vectors */
  183. float
  184. gsl_blas_sasum (const gsl_vector_float * X)
  185. {
  186. return cblas_sasum (INT (X->size), X->data, INT (X->stride));
  187. }
  188. double
  189. gsl_blas_dasum (const gsl_vector * X)
  190. {
  191. return cblas_dasum (INT (X->size), X->data, INT (X->stride));
  192. }
  193. float
  194. gsl_blas_scasum (const gsl_vector_complex_float * X)
  195. {
  196. return cblas_scasum (INT (X->size), X->data, INT (X->stride));
  197. }
  198. double
  199. gsl_blas_dzasum (const gsl_vector_complex * X)
  200. {
  201. return cblas_dzasum (INT (X->size), X->data, INT (X->stride));
  202. }
  203. /* Maximum elements of vectors */
  204. CBLAS_INDEX_t
  205. gsl_blas_isamax (const gsl_vector_float * X)
  206. {
  207. return cblas_isamax (INT (X->size), X->data, INT (X->stride));
  208. }
  209. CBLAS_INDEX_t
  210. gsl_blas_idamax (const gsl_vector * X)
  211. {
  212. return cblas_idamax (INT (X->size), X->data, INT (X->stride));
  213. }
  214. CBLAS_INDEX_t
  215. gsl_blas_icamax (const gsl_vector_complex_float * X)
  216. {
  217. return cblas_icamax (INT (X->size), X->data, INT (X->stride));
  218. }
  219. CBLAS_INDEX_t
  220. gsl_blas_izamax (const gsl_vector_complex * X)
  221. {
  222. return cblas_izamax (INT (X->size), X->data, INT (X->stride));
  223. }
  224. /* Swap vectors */
  225. int
  226. gsl_blas_sswap (gsl_vector_float * X, gsl_vector_float * Y)
  227. {
  228. if (X->size == Y->size)
  229. {
  230. cblas_sswap (INT (X->size), X->data, INT (X->stride), Y->data,
  231. INT (Y->stride));
  232. return GSL_SUCCESS;
  233. }
  234. else
  235. {
  236. GSL_ERROR ("invalid length", GSL_EBADLEN);
  237. }
  238. }
  239. int
  240. gsl_blas_dswap (gsl_vector * X, gsl_vector * Y)
  241. {
  242. if (X->size == Y->size)
  243. {
  244. cblas_dswap (INT (X->size), X->data, INT (X->stride), Y->data,
  245. INT (Y->stride));
  246. return GSL_SUCCESS;
  247. }
  248. else
  249. {
  250. GSL_ERROR ("invalid length", GSL_EBADLEN);
  251. };
  252. }
  253. int
  254. gsl_blas_cswap (gsl_vector_complex_float * X, gsl_vector_complex_float * Y)
  255. {
  256. if (X->size == Y->size)
  257. {
  258. cblas_cswap (INT (X->size), X->data, INT (X->stride), Y->data,
  259. INT (Y->stride));
  260. return GSL_SUCCESS;
  261. }
  262. else
  263. {
  264. GSL_ERROR ("invalid length", GSL_EBADLEN);
  265. }
  266. }
  267. int
  268. gsl_blas_zswap (gsl_vector_complex * X, gsl_vector_complex * Y)
  269. {
  270. if (X->size == Y->size)
  271. {
  272. cblas_zswap (INT (X->size), X->data, INT (X->stride), Y->data,
  273. INT (Y->stride));
  274. return GSL_SUCCESS;
  275. }
  276. else
  277. {
  278. GSL_ERROR ("invalid length", GSL_EBADLEN);
  279. }
  280. }
  281. /* Copy vectors */
  282. int
  283. gsl_blas_scopy (const gsl_vector_float * X, gsl_vector_float * Y)
  284. {
  285. if (X->size == Y->size)
  286. {
  287. cblas_scopy (INT (X->size), X->data, INT (X->stride), Y->data,
  288. INT (Y->stride));
  289. return GSL_SUCCESS;
  290. }
  291. else
  292. {
  293. GSL_ERROR ("invalid length", GSL_EBADLEN);
  294. }
  295. }
  296. int
  297. gsl_blas_dcopy (const gsl_vector * X, gsl_vector * Y)
  298. {
  299. if (X->size == Y->size)
  300. {
  301. cblas_dcopy (INT (X->size), X->data, INT (X->stride), Y->data,
  302. INT (Y->stride));
  303. return GSL_SUCCESS;
  304. }
  305. else
  306. {
  307. GSL_ERROR ("invalid length", GSL_EBADLEN);
  308. }
  309. }
  310. int
  311. gsl_blas_ccopy (const gsl_vector_complex_float * X,
  312. gsl_vector_complex_float * Y)
  313. {
  314. if (X->size == Y->size)
  315. {
  316. cblas_ccopy (INT (X->size), X->data, INT (X->stride), Y->data,
  317. INT (Y->stride));
  318. return GSL_SUCCESS;
  319. }
  320. else
  321. {
  322. GSL_ERROR ("invalid length", GSL_EBADLEN);
  323. }
  324. }
  325. int
  326. gsl_blas_zcopy (const gsl_vector_complex * X, gsl_vector_complex * Y)
  327. {
  328. if (X->size == Y->size)
  329. {
  330. cblas_zcopy (INT (X->size), X->data, INT (X->stride), Y->data,
  331. INT (Y->stride));
  332. return GSL_SUCCESS;
  333. }
  334. else
  335. {
  336. GSL_ERROR ("invalid length", GSL_EBADLEN);
  337. }
  338. }
  339. /* Compute Y = alpha X + Y */
  340. int
  341. gsl_blas_saxpy (float alpha, const gsl_vector_float * X, gsl_vector_float * Y)
  342. {
  343. if (X->size == Y->size)
  344. {
  345. cblas_saxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
  346. INT (Y->stride));
  347. return GSL_SUCCESS;
  348. }
  349. else
  350. {
  351. GSL_ERROR ("invalid length", GSL_EBADLEN);
  352. }
  353. }
  354. int
  355. gsl_blas_daxpy (double alpha, const gsl_vector * X, gsl_vector * Y)
  356. {
  357. if (X->size == Y->size)
  358. {
  359. cblas_daxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
  360. INT (Y->stride));
  361. return GSL_SUCCESS;
  362. }
  363. else
  364. {
  365. GSL_ERROR ("invalid length", GSL_EBADLEN);
  366. }
  367. }
  368. int
  369. gsl_blas_caxpy (const gsl_complex_float alpha,
  370. const gsl_vector_complex_float * X,
  371. gsl_vector_complex_float * Y)
  372. {
  373. if (X->size == Y->size)
  374. {
  375. cblas_caxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
  376. INT (X->stride), Y->data, INT (Y->stride));
  377. return GSL_SUCCESS;
  378. }
  379. else
  380. {
  381. GSL_ERROR ("invalid length", GSL_EBADLEN);
  382. }
  383. }
  384. int
  385. gsl_blas_zaxpy (const gsl_complex alpha, const gsl_vector_complex * X,
  386. gsl_vector_complex * Y)
  387. {
  388. if (X->size == Y->size)
  389. {
  390. cblas_zaxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
  391. INT (X->stride), Y->data, INT (Y->stride));
  392. return GSL_SUCCESS;
  393. }
  394. else
  395. {
  396. GSL_ERROR ("invalid length", GSL_EBADLEN);
  397. }
  398. }
  399. /* Generate rotation */
  400. int
  401. gsl_blas_srotg (float a[], float b[], float c[], float s[])
  402. {
  403. cblas_srotg (a, b, c, s);
  404. return GSL_SUCCESS;
  405. }
  406. int
  407. gsl_blas_drotg (double a[], double b[], double c[], double s[])
  408. {
  409. cblas_drotg (a, b, c, s);
  410. return GSL_SUCCESS;
  411. }
  412. /* Apply rotation to vectors */
  413. int
  414. gsl_blas_srot (gsl_vector_float * X, gsl_vector_float * Y, float c, float s)
  415. {
  416. if (X->size == Y->size)
  417. {
  418. cblas_srot (INT (X->size), X->data, INT (X->stride), Y->data,
  419. INT (Y->stride), c, s);
  420. return GSL_SUCCESS;
  421. }
  422. else
  423. {
  424. GSL_ERROR ("invalid length", GSL_EBADLEN);
  425. }
  426. }
  427. int
  428. gsl_blas_drot (gsl_vector * X, gsl_vector * Y, const double c, const double s)
  429. {
  430. if (X->size == Y->size)
  431. {
  432. cblas_drot (INT (X->size), X->data, INT (X->stride), Y->data,
  433. INT (Y->stride), c, s);
  434. return GSL_SUCCESS;
  435. }
  436. else
  437. {
  438. GSL_ERROR ("invalid length", GSL_EBADLEN);
  439. }
  440. }
  441. /* Generate modified rotation */
  442. int
  443. gsl_blas_srotmg (float d1[], float d2[], float b1[], float b2, float P[])
  444. {
  445. cblas_srotmg (d1, d2, b1, b2, P);
  446. return GSL_SUCCESS;
  447. }
  448. int
  449. gsl_blas_drotmg (double d1[], double d2[], double b1[], double b2, double P[])
  450. {
  451. cblas_drotmg (d1, d2, b1, b2, P);
  452. return GSL_SUCCESS;
  453. }
  454. /* Apply modified rotation */
  455. int
  456. gsl_blas_srotm (gsl_vector_float * X, gsl_vector_float * Y, const float P[])
  457. {
  458. if (X->size == Y->size)
  459. {
  460. cblas_srotm (INT (X->size), X->data, INT (X->stride), Y->data,
  461. INT (Y->stride), P);
  462. return GSL_SUCCESS;
  463. }
  464. else
  465. {
  466. GSL_ERROR ("invalid length", GSL_EBADLEN);
  467. }
  468. }
  469. int
  470. gsl_blas_drotm (gsl_vector * X, gsl_vector * Y, const double P[])
  471. {
  472. if (X->size != Y->size)
  473. {
  474. cblas_drotm (INT (X->size), X->data, INT (X->stride), Y->data,
  475. INT (Y->stride), P);
  476. return GSL_SUCCESS;
  477. }
  478. else
  479. {
  480. GSL_ERROR ("invalid length", GSL_EBADLEN);
  481. }
  482. }
  483. /* Scale vector */
  484. void
  485. gsl_blas_sscal (float alpha, gsl_vector_float * X)
  486. {
  487. cblas_sscal (INT (X->size), alpha, X->data, INT (X->stride));
  488. }
  489. void
  490. gsl_blas_dscal (double alpha, gsl_vector * X)
  491. {
  492. cblas_dscal (INT (X->size), alpha, X->data, INT (X->stride));
  493. }
  494. void
  495. gsl_blas_cscal (const gsl_complex_float alpha, gsl_vector_complex_float * X)
  496. {
  497. cblas_cscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
  498. INT (X->stride));
  499. }
  500. void
  501. gsl_blas_zscal (const gsl_complex alpha, gsl_vector_complex * X)
  502. {
  503. cblas_zscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
  504. INT (X->stride));
  505. }
  506. void
  507. gsl_blas_csscal (float alpha, gsl_vector_complex_float * X)
  508. {
  509. cblas_csscal (INT (X->size), alpha, X->data, INT (X->stride));
  510. }
  511. void
  512. gsl_blas_zdscal (double alpha, gsl_vector_complex * X)
  513. {
  514. cblas_zdscal (INT (X->size), alpha, X->data, INT (X->stride));
  515. }
  516. /* ===========================================================================
  517. * Level 2
  518. * ===========================================================================
  519. */
  520. /* GEMV */
  521. int
  522. gsl_blas_sgemv (CBLAS_TRANSPOSE_t TransA, float alpha,
  523. const gsl_matrix_float * A, const gsl_vector_float * X,
  524. float beta, gsl_vector_float * Y)
  525. {
  526. const size_t M = A->size1;
  527. const size_t N = A->size2;
  528. if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
  529. || (TransA == CblasTrans && M == X->size && N == Y->size))
  530. {
  531. cblas_sgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
  532. INT (A->tda), X->data, INT (X->stride), beta, Y->data,
  533. INT (Y->stride));
  534. return GSL_SUCCESS;
  535. }
  536. else
  537. {
  538. GSL_ERROR ("invalid length", GSL_EBADLEN);
  539. }
  540. }
  541. int
  542. gsl_blas_dgemv (CBLAS_TRANSPOSE_t TransA, double alpha, const gsl_matrix * A,
  543. const gsl_vector * X, double beta, gsl_vector * Y)
  544. {
  545. const size_t M = A->size1;
  546. const size_t N = A->size2;
  547. if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
  548. || (TransA == CblasTrans && M == X->size && N == Y->size))
  549. {
  550. cblas_dgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
  551. INT (A->tda), X->data, INT (X->stride), beta, Y->data,
  552. INT (Y->stride));
  553. return GSL_SUCCESS;
  554. }
  555. else
  556. {
  557. GSL_ERROR ("invalid length", GSL_EBADLEN);
  558. }
  559. }
  560. int
  561. gsl_blas_cgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex_float alpha,
  562. const gsl_matrix_complex_float * A,
  563. const gsl_vector_complex_float * X,
  564. const gsl_complex_float beta, gsl_vector_complex_float * Y)
  565. {
  566. const size_t M = A->size1;
  567. const size_t N = A->size2;
  568. if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
  569. || (TransA == CblasTrans && M == X->size && N == Y->size)
  570. || (TransA == CblasConjTrans && M == X->size && N == Y->size))
  571. {
  572. cblas_cgemv (CblasRowMajor, TransA, INT (M), INT (N),
  573. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
  574. INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
  575. INT (Y->stride));
  576. return GSL_SUCCESS;
  577. }
  578. else
  579. {
  580. GSL_ERROR ("invalid length", GSL_EBADLEN);
  581. }
  582. }
  583. int
  584. gsl_blas_zgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex alpha,
  585. const gsl_matrix_complex * A, const gsl_vector_complex * X,
  586. const gsl_complex beta, gsl_vector_complex * Y)
  587. {
  588. const size_t M = A->size1;
  589. const size_t N = A->size2;
  590. if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
  591. || (TransA == CblasTrans && M == X->size && N == Y->size)
  592. || (TransA == CblasConjTrans && M == X->size && N == Y->size))
  593. {
  594. cblas_zgemv (CblasRowMajor, TransA, INT (M), INT (N),
  595. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
  596. INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
  597. INT (Y->stride));
  598. return GSL_SUCCESS;
  599. }
  600. else
  601. {
  602. GSL_ERROR ("invalid length", GSL_EBADLEN);
  603. }
  604. }
  605. /* HEMV */
  606. int
  607. gsl_blas_chemv (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
  608. const gsl_matrix_complex_float * A,
  609. const gsl_vector_complex_float * X,
  610. const gsl_complex_float beta, gsl_vector_complex_float * Y)
  611. {
  612. const size_t M = A->size1;
  613. const size_t N = A->size2;
  614. if (M != N)
  615. {
  616. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  617. }
  618. else if (N != X->size || N != Y->size)
  619. {
  620. GSL_ERROR ("invalid length", GSL_EBADLEN);
  621. }
  622. cblas_chemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
  623. INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
  624. Y->data, INT (Y->stride));
  625. return GSL_SUCCESS;
  626. }
  627. int
  628. gsl_blas_zhemv (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
  629. const gsl_matrix_complex * A, const gsl_vector_complex * X,
  630. const gsl_complex beta, gsl_vector_complex * Y)
  631. {
  632. const size_t M = A->size1;
  633. const size_t N = A->size2;
  634. if (M != N)
  635. {
  636. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  637. }
  638. else if (N != X->size || N != Y->size)
  639. {
  640. GSL_ERROR ("invalid length", GSL_EBADLEN);
  641. }
  642. cblas_zhemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
  643. INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
  644. Y->data, INT (Y->stride));
  645. return GSL_SUCCESS;
  646. }
  647. /* SYMV */
  648. int
  649. gsl_blas_ssymv (CBLAS_UPLO_t Uplo, float alpha, const gsl_matrix_float * A,
  650. const gsl_vector_float * X, float beta, gsl_vector_float * Y)
  651. {
  652. const size_t M = A->size1;
  653. const size_t N = A->size2;
  654. if (M != N)
  655. {
  656. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  657. }
  658. else if (N != X->size || N != Y->size)
  659. {
  660. GSL_ERROR ("invalid length", GSL_EBADLEN);
  661. }
  662. cblas_ssymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
  663. X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
  664. return GSL_SUCCESS;
  665. }
  666. int
  667. gsl_blas_dsymv (CBLAS_UPLO_t Uplo, double alpha, const gsl_matrix * A,
  668. const gsl_vector * X, double beta, gsl_vector * Y)
  669. {
  670. const size_t M = A->size1;
  671. const size_t N = A->size2;
  672. if (M != N)
  673. {
  674. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  675. }
  676. else if (N != X->size || N != Y->size)
  677. {
  678. GSL_ERROR ("invalid length", GSL_EBADLEN);
  679. }
  680. cblas_dsymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
  681. X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
  682. return GSL_SUCCESS;
  683. }
  684. /* TRMV */
  685. int
  686. gsl_blas_strmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  687. CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
  688. gsl_vector_float * X)
  689. {
  690. const size_t M = A->size1;
  691. const size_t N = A->size2;
  692. if (M != N)
  693. {
  694. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  695. }
  696. else if (N != X->size)
  697. {
  698. GSL_ERROR ("invalid length", GSL_EBADLEN);
  699. }
  700. cblas_strmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  701. INT (A->tda), X->data, INT (X->stride));
  702. return GSL_SUCCESS;
  703. }
  704. int
  705. gsl_blas_dtrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  706. CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
  707. {
  708. const size_t M = A->size1;
  709. const size_t N = A->size2;
  710. if (M != N)
  711. {
  712. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  713. }
  714. else if (N != X->size)
  715. {
  716. GSL_ERROR ("invalid length", GSL_EBADLEN);
  717. }
  718. cblas_dtrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  719. INT (A->tda), X->data, INT (X->stride));
  720. return GSL_SUCCESS;
  721. }
  722. int
  723. gsl_blas_ctrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  724. CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
  725. gsl_vector_complex_float * X)
  726. {
  727. const size_t M = A->size1;
  728. const size_t N = A->size2;
  729. if (M != N)
  730. {
  731. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  732. }
  733. else if (N != X->size)
  734. {
  735. GSL_ERROR ("invalid length", GSL_EBADLEN);
  736. }
  737. cblas_ctrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  738. INT (A->tda), X->data, INT (X->stride));
  739. return GSL_SUCCESS;
  740. }
  741. int
  742. gsl_blas_ztrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  743. CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
  744. gsl_vector_complex * X)
  745. {
  746. const size_t M = A->size1;
  747. const size_t N = A->size2;
  748. if (M != N)
  749. {
  750. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  751. }
  752. else if (N != X->size)
  753. {
  754. GSL_ERROR ("invalid length", GSL_EBADLEN);
  755. }
  756. cblas_ztrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  757. INT (A->tda), X->data, INT (X->stride));
  758. return GSL_SUCCESS;
  759. }
  760. /* TRSV */
  761. int
  762. gsl_blas_strsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  763. CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
  764. gsl_vector_float * X)
  765. {
  766. const size_t M = A->size1;
  767. const size_t N = A->size2;
  768. if (M != N)
  769. {
  770. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  771. }
  772. else if (N != X->size)
  773. {
  774. GSL_ERROR ("invalid length", GSL_EBADLEN);
  775. }
  776. cblas_strsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  777. INT (A->tda), X->data, INT (X->stride));
  778. return GSL_SUCCESS;
  779. }
  780. int
  781. gsl_blas_dtrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  782. CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
  783. {
  784. const size_t M = A->size1;
  785. const size_t N = A->size2;
  786. if (M != N)
  787. {
  788. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  789. }
  790. else if (N != X->size)
  791. {
  792. GSL_ERROR ("invalid length", GSL_EBADLEN);
  793. }
  794. cblas_dtrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  795. INT (A->tda), X->data, INT (X->stride));
  796. return GSL_SUCCESS;
  797. }
  798. int
  799. gsl_blas_ctrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  800. CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
  801. gsl_vector_complex_float * X)
  802. {
  803. const size_t M = A->size1;
  804. const size_t N = A->size2;
  805. if (M != N)
  806. {
  807. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  808. }
  809. else if (N != X->size)
  810. {
  811. GSL_ERROR ("invalid length", GSL_EBADLEN);
  812. }
  813. cblas_ctrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  814. INT (A->tda), X->data, INT (X->stride));
  815. return GSL_SUCCESS;
  816. }
  817. int
  818. gsl_blas_ztrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
  819. CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
  820. gsl_vector_complex * X)
  821. {
  822. const size_t M = A->size1;
  823. const size_t N = A->size2;
  824. if (M != N)
  825. {
  826. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  827. }
  828. else if (N != X->size)
  829. {
  830. GSL_ERROR ("invalid length", GSL_EBADLEN);
  831. }
  832. cblas_ztrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
  833. INT (A->tda), X->data, INT (X->stride));
  834. return GSL_SUCCESS;
  835. }
  836. /* GER */
  837. int
  838. gsl_blas_sger (float alpha, const gsl_vector_float * X,
  839. const gsl_vector_float * Y, gsl_matrix_float * A)
  840. {
  841. const size_t M = A->size1;
  842. const size_t N = A->size2;
  843. if (X->size == M && Y->size == N)
  844. {
  845. cblas_sger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
  846. INT (X->stride), Y->data, INT (Y->stride), A->data,
  847. INT (A->tda));
  848. return GSL_SUCCESS;
  849. }
  850. else
  851. {
  852. GSL_ERROR ("invalid length", GSL_EBADLEN);
  853. }
  854. }
  855. int
  856. gsl_blas_dger (double alpha, const gsl_vector * X, const gsl_vector * Y,
  857. gsl_matrix * A)
  858. {
  859. const size_t M = A->size1;
  860. const size_t N = A->size2;
  861. if (X->size == M && Y->size == N)
  862. {
  863. cblas_dger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
  864. INT (X->stride), Y->data, INT (Y->stride), A->data,
  865. INT (A->tda));
  866. return GSL_SUCCESS;
  867. }
  868. else
  869. {
  870. GSL_ERROR ("invalid length", GSL_EBADLEN);
  871. }
  872. }
  873. /* GERU */
  874. int
  875. gsl_blas_cgeru (const gsl_complex_float alpha,
  876. const gsl_vector_complex_float * X,
  877. const gsl_vector_complex_float * Y,
  878. gsl_matrix_complex_float * A)
  879. {
  880. const size_t M = A->size1;
  881. const size_t N = A->size2;
  882. if (X->size == M && Y->size == N)
  883. {
  884. cblas_cgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
  885. X->data, INT (X->stride), Y->data, INT (Y->stride),
  886. A->data, INT (A->tda));
  887. return GSL_SUCCESS;
  888. }
  889. else
  890. {
  891. GSL_ERROR ("invalid length", GSL_EBADLEN);
  892. }
  893. }
  894. int
  895. gsl_blas_zgeru (const gsl_complex alpha, const gsl_vector_complex * X,
  896. const gsl_vector_complex * Y, gsl_matrix_complex * A)
  897. {
  898. const size_t M = A->size1;
  899. const size_t N = A->size2;
  900. if (X->size == M && Y->size == N)
  901. {
  902. cblas_zgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
  903. X->data, INT (X->stride), Y->data, INT (Y->stride),
  904. A->data, INT (A->tda));
  905. return GSL_SUCCESS;
  906. }
  907. else
  908. {
  909. GSL_ERROR ("invalid length", GSL_EBADLEN);
  910. }
  911. }
  912. /* GERC */
  913. int
  914. gsl_blas_cgerc (const gsl_complex_float alpha,
  915. const gsl_vector_complex_float * X,
  916. const gsl_vector_complex_float * Y,
  917. gsl_matrix_complex_float * A)
  918. {
  919. const size_t M = A->size1;
  920. const size_t N = A->size2;
  921. if (X->size == M && Y->size == N)
  922. {
  923. cblas_cgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
  924. X->data, INT (X->stride), Y->data, INT (Y->stride),
  925. A->data, INT (A->tda));
  926. return GSL_SUCCESS;
  927. }
  928. else
  929. {
  930. GSL_ERROR ("invalid length", GSL_EBADLEN);
  931. }
  932. }
  933. int
  934. gsl_blas_zgerc (const gsl_complex alpha, const gsl_vector_complex * X,
  935. const gsl_vector_complex * Y, gsl_matrix_complex * A)
  936. {
  937. const size_t M = A->size1;
  938. const size_t N = A->size2;
  939. if (X->size == M && Y->size == N)
  940. {
  941. cblas_zgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
  942. X->data, INT (X->stride), Y->data, INT (Y->stride),
  943. A->data, INT (A->tda));
  944. return GSL_SUCCESS;
  945. }
  946. else
  947. {
  948. GSL_ERROR ("invalid length", GSL_EBADLEN);
  949. }
  950. }
  951. /* HER */
  952. int
  953. gsl_blas_cher (CBLAS_UPLO_t Uplo, float alpha,
  954. const gsl_vector_complex_float * X,
  955. gsl_matrix_complex_float * A)
  956. {
  957. const size_t M = A->size1;
  958. const size_t N = A->size2;
  959. if (M != N)
  960. {
  961. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  962. }
  963. else if (X->size != N)
  964. {
  965. GSL_ERROR ("invalid length", GSL_EBADLEN);
  966. }
  967. cblas_cher (CblasRowMajor, Uplo, INT (M), alpha, X->data, INT (X->stride),
  968. A->data, INT (A->tda));
  969. return GSL_SUCCESS;
  970. }
  971. int
  972. gsl_blas_zher (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector_complex * X,
  973. gsl_matrix_complex * A)
  974. {
  975. const size_t M = A->size1;
  976. const size_t N = A->size2;
  977. if (M != N)
  978. {
  979. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  980. }
  981. else if (X->size != N)
  982. {
  983. GSL_ERROR ("invalid length", GSL_EBADLEN);
  984. }
  985. cblas_zher (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
  986. A->data, INT (A->tda));
  987. return GSL_SUCCESS;
  988. }
  989. /* HER2 */
  990. int
  991. gsl_blas_cher2 (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
  992. const gsl_vector_complex_float * X,
  993. const gsl_vector_complex_float * Y,
  994. gsl_matrix_complex_float * A)
  995. {
  996. const size_t M = A->size1;
  997. const size_t N = A->size2;
  998. if (M != N)
  999. {
  1000. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1001. }
  1002. else if (X->size != N || Y->size != N)
  1003. {
  1004. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1005. }
  1006. cblas_cher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
  1007. INT (X->stride), Y->data, INT (Y->stride), A->data,
  1008. INT (A->tda));
  1009. return GSL_SUCCESS;
  1010. }
  1011. int
  1012. gsl_blas_zher2 (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
  1013. const gsl_vector_complex * X, const gsl_vector_complex * Y,
  1014. gsl_matrix_complex * A)
  1015. {
  1016. const size_t M = A->size1;
  1017. const size_t N = A->size2;
  1018. if (M != N)
  1019. {
  1020. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1021. }
  1022. else if (X->size != N || Y->size != N)
  1023. {
  1024. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1025. }
  1026. cblas_zher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
  1027. INT (X->stride), Y->data, INT (Y->stride), A->data,
  1028. INT (A->tda));
  1029. return GSL_SUCCESS;
  1030. }
  1031. /* SYR */
  1032. int
  1033. gsl_blas_ssyr (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
  1034. gsl_matrix_float * A)
  1035. {
  1036. const size_t M = A->size1;
  1037. const size_t N = A->size2;
  1038. if (M != N)
  1039. {
  1040. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1041. }
  1042. else if (X->size != N)
  1043. {
  1044. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1045. }
  1046. cblas_ssyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
  1047. A->data, INT (A->tda));
  1048. return GSL_SUCCESS;
  1049. }
  1050. int
  1051. gsl_blas_dsyr (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
  1052. gsl_matrix * A)
  1053. {
  1054. const size_t M = A->size1;
  1055. const size_t N = A->size2;
  1056. if (M != N)
  1057. {
  1058. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1059. }
  1060. else if (X->size != N)
  1061. {
  1062. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1063. }
  1064. cblas_dsyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
  1065. A->data, INT (A->tda));
  1066. return GSL_SUCCESS;
  1067. }
  1068. /* SYR2 */
  1069. int
  1070. gsl_blas_ssyr2 (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
  1071. const gsl_vector_float * Y, gsl_matrix_float * A)
  1072. {
  1073. const size_t M = A->size1;
  1074. const size_t N = A->size2;
  1075. if (M != N)
  1076. {
  1077. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1078. }
  1079. else if (X->size != N || Y->size != N)
  1080. {
  1081. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1082. }
  1083. cblas_ssyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
  1084. Y->data, INT (Y->stride), A->data, INT (A->tda));
  1085. return GSL_SUCCESS;
  1086. }
  1087. int
  1088. gsl_blas_dsyr2 (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
  1089. const gsl_vector * Y, gsl_matrix * A)
  1090. {
  1091. const size_t M = A->size1;
  1092. const size_t N = A->size2;
  1093. if (M != N)
  1094. {
  1095. GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
  1096. }
  1097. else if (X->size != N || Y->size != N)
  1098. {
  1099. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1100. }
  1101. cblas_dsyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
  1102. Y->data, INT (Y->stride), A->data, INT (A->tda));
  1103. return GSL_SUCCESS;
  1104. }
  1105. /*
  1106. * ===========================================================================
  1107. * Prototypes for level 3 BLAS
  1108. * ===========================================================================
  1109. */
  1110. /* GEMM */
  1111. int
  1112. gsl_blas_sgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
  1113. float alpha, const gsl_matrix_float * A,
  1114. const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
  1115. {
  1116. const size_t M = C->size1;
  1117. const size_t N = C->size2;
  1118. const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
  1119. const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
  1120. const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
  1121. const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
  1122. if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
  1123. {
  1124. cblas_sgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
  1125. alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
  1126. C->data, INT (C->tda));
  1127. return GSL_SUCCESS;
  1128. }
  1129. else
  1130. {
  1131. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1132. }
  1133. }
  1134. int
  1135. gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
  1136. double alpha, const gsl_matrix * A, const gsl_matrix * B,
  1137. double beta, gsl_matrix * C)
  1138. {
  1139. const size_t M = C->size1;
  1140. const size_t N = C->size2;
  1141. const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
  1142. const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
  1143. const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
  1144. const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
  1145. if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
  1146. {
  1147. cblas_dgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
  1148. alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
  1149. C->data, INT (C->tda));
  1150. return GSL_SUCCESS;
  1151. }
  1152. else
  1153. {
  1154. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1155. }
  1156. }
  1157. int
  1158. gsl_blas_cgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
  1159. const gsl_complex_float alpha,
  1160. const gsl_matrix_complex_float * A,
  1161. const gsl_matrix_complex_float * B,
  1162. const gsl_complex_float beta, gsl_matrix_complex_float * C)
  1163. {
  1164. const size_t M = C->size1;
  1165. const size_t N = C->size2;
  1166. const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
  1167. const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
  1168. const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
  1169. const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
  1170. if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
  1171. {
  1172. cblas_cgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
  1173. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1174. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1175. INT (C->tda));
  1176. return GSL_SUCCESS;
  1177. }
  1178. else
  1179. {
  1180. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1181. }
  1182. }
  1183. int
  1184. gsl_blas_zgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
  1185. const gsl_complex alpha, const gsl_matrix_complex * A,
  1186. const gsl_matrix_complex * B, const gsl_complex beta,
  1187. gsl_matrix_complex * C)
  1188. {
  1189. const size_t M = C->size1;
  1190. const size_t N = C->size2;
  1191. const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
  1192. const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
  1193. const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
  1194. const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
  1195. if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
  1196. {
  1197. cblas_zgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
  1198. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1199. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1200. INT (C->tda));
  1201. return GSL_SUCCESS;
  1202. }
  1203. else
  1204. {
  1205. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1206. }
  1207. }
  1208. /* SYMM */
  1209. int
  1210. gsl_blas_ssymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, float alpha,
  1211. const gsl_matrix_float * A, const gsl_matrix_float * B,
  1212. float beta, gsl_matrix_float * C)
  1213. {
  1214. const size_t M = C->size1;
  1215. const size_t N = C->size2;
  1216. const size_t MA = A->size1;
  1217. const size_t NA = A->size2;
  1218. const size_t MB = B->size1;
  1219. const size_t NB = B->size2;
  1220. if (MA != NA)
  1221. {
  1222. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1223. }
  1224. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1225. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1226. {
  1227. cblas_ssymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
  1228. A->data, INT (A->tda), B->data, INT (B->tda), beta,
  1229. C->data, INT (C->tda));
  1230. return GSL_SUCCESS;
  1231. }
  1232. else
  1233. {
  1234. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1235. }
  1236. }
  1237. int
  1238. gsl_blas_dsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, double alpha,
  1239. const gsl_matrix * A, const gsl_matrix * B, double beta,
  1240. gsl_matrix * C)
  1241. {
  1242. const size_t M = C->size1;
  1243. const size_t N = C->size2;
  1244. const size_t MA = A->size1;
  1245. const size_t NA = A->size2;
  1246. const size_t MB = B->size1;
  1247. const size_t NB = B->size2;
  1248. if (MA != NA)
  1249. {
  1250. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1251. }
  1252. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1253. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1254. {
  1255. cblas_dsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
  1256. A->data, INT (A->tda), B->data, INT (B->tda), beta,
  1257. C->data, INT (C->tda));
  1258. return GSL_SUCCESS;
  1259. }
  1260. else
  1261. {
  1262. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1263. }
  1264. }
  1265. int
  1266. gsl_blas_csymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1267. const gsl_complex_float alpha,
  1268. const gsl_matrix_complex_float * A,
  1269. const gsl_matrix_complex_float * B,
  1270. const gsl_complex_float beta, gsl_matrix_complex_float * C)
  1271. {
  1272. const size_t M = C->size1;
  1273. const size_t N = C->size2;
  1274. const size_t MA = A->size1;
  1275. const size_t NA = A->size2;
  1276. const size_t MB = B->size1;
  1277. const size_t NB = B->size2;
  1278. if (MA != NA)
  1279. {
  1280. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1281. }
  1282. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1283. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1284. {
  1285. cblas_csymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
  1286. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1287. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1288. INT (C->tda));
  1289. return GSL_SUCCESS;
  1290. }
  1291. else
  1292. {
  1293. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1294. }
  1295. }
  1296. int
  1297. gsl_blas_zsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1298. const gsl_complex alpha, const gsl_matrix_complex * A,
  1299. const gsl_matrix_complex * B, const gsl_complex beta,
  1300. gsl_matrix_complex * C)
  1301. {
  1302. const size_t M = C->size1;
  1303. const size_t N = C->size2;
  1304. const size_t MA = A->size1;
  1305. const size_t NA = A->size2;
  1306. const size_t MB = B->size1;
  1307. const size_t NB = B->size2;
  1308. if (MA != NA)
  1309. {
  1310. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1311. }
  1312. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1313. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1314. {
  1315. cblas_zsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
  1316. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1317. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1318. INT (C->tda));
  1319. return GSL_SUCCESS;
  1320. }
  1321. else
  1322. {
  1323. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1324. }
  1325. }
  1326. /* HEMM */
  1327. int
  1328. gsl_blas_chemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1329. const gsl_complex_float alpha,
  1330. const gsl_matrix_complex_float * A,
  1331. const gsl_matrix_complex_float * B,
  1332. const gsl_complex_float beta, gsl_matrix_complex_float * C)
  1333. {
  1334. const size_t M = C->size1;
  1335. const size_t N = C->size2;
  1336. const size_t MA = A->size1;
  1337. const size_t NA = A->size2;
  1338. const size_t MB = B->size1;
  1339. const size_t NB = B->size2;
  1340. if (MA != NA)
  1341. {
  1342. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1343. }
  1344. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1345. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1346. {
  1347. cblas_chemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
  1348. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1349. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1350. INT (C->tda));
  1351. return GSL_SUCCESS;
  1352. }
  1353. else
  1354. {
  1355. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1356. }
  1357. }
  1358. int
  1359. gsl_blas_zhemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1360. const gsl_complex alpha, const gsl_matrix_complex * A,
  1361. const gsl_matrix_complex * B, const gsl_complex beta,
  1362. gsl_matrix_complex * C)
  1363. {
  1364. const size_t M = C->size1;
  1365. const size_t N = C->size2;
  1366. const size_t MA = A->size1;
  1367. const size_t NA = A->size2;
  1368. const size_t MB = B->size1;
  1369. const size_t NB = B->size2;
  1370. if (MA != NA)
  1371. {
  1372. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1373. }
  1374. if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
  1375. || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
  1376. {
  1377. cblas_zhemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
  1378. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1379. INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
  1380. INT (C->tda));
  1381. return GSL_SUCCESS;
  1382. }
  1383. else
  1384. {
  1385. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1386. }
  1387. }
  1388. /* SYRK */
  1389. int
  1390. gsl_blas_ssyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
  1391. const gsl_matrix_float * A, float beta, gsl_matrix_float * C)
  1392. {
  1393. const size_t M = C->size1;
  1394. const size_t N = C->size2;
  1395. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1396. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1397. if (M != N)
  1398. {
  1399. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1400. }
  1401. else if (N != J)
  1402. {
  1403. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1404. }
  1405. cblas_ssyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
  1406. INT (A->tda), beta, C->data, INT (C->tda));
  1407. return GSL_SUCCESS;
  1408. }
  1409. int
  1410. gsl_blas_dsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
  1411. const gsl_matrix * A, double beta, gsl_matrix * C)
  1412. {
  1413. const size_t M = C->size1;
  1414. const size_t N = C->size2;
  1415. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1416. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1417. if (M != N)
  1418. {
  1419. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1420. }
  1421. else if (N != J)
  1422. {
  1423. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1424. }
  1425. cblas_dsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
  1426. INT (A->tda), beta, C->data, INT (C->tda));
  1427. return GSL_SUCCESS;
  1428. }
  1429. int
  1430. gsl_blas_csyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1431. const gsl_complex_float alpha,
  1432. const gsl_matrix_complex_float * A,
  1433. const gsl_complex_float beta, gsl_matrix_complex_float * C)
  1434. {
  1435. const size_t M = C->size1;
  1436. const size_t N = C->size2;
  1437. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1438. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1439. if (M != N)
  1440. {
  1441. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1442. }
  1443. else if (N != J)
  1444. {
  1445. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1446. }
  1447. cblas_csyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
  1448. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
  1449. GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
  1450. return GSL_SUCCESS;
  1451. }
  1452. int
  1453. gsl_blas_zsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1454. const gsl_complex alpha, const gsl_matrix_complex * A,
  1455. const gsl_complex beta, gsl_matrix_complex * C)
  1456. {
  1457. const size_t M = C->size1;
  1458. const size_t N = C->size2;
  1459. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1460. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1461. if (M != N)
  1462. {
  1463. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1464. }
  1465. else if (N != J)
  1466. {
  1467. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1468. }
  1469. cblas_zsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
  1470. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
  1471. GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
  1472. return GSL_SUCCESS;
  1473. }
  1474. /* HERK */
  1475. int
  1476. gsl_blas_cherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
  1477. const gsl_matrix_complex_float * A, float beta,
  1478. gsl_matrix_complex_float * C)
  1479. {
  1480. const size_t M = C->size1;
  1481. const size_t N = C->size2;
  1482. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1483. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1484. if (M != N)
  1485. {
  1486. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1487. }
  1488. else if (N != J)
  1489. {
  1490. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1491. }
  1492. cblas_cherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
  1493. INT (A->tda), beta, C->data, INT (C->tda));
  1494. return GSL_SUCCESS;
  1495. }
  1496. int
  1497. gsl_blas_zherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
  1498. const gsl_matrix_complex * A, double beta,
  1499. gsl_matrix_complex * C)
  1500. {
  1501. const size_t M = C->size1;
  1502. const size_t N = C->size2;
  1503. const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1504. const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1505. if (M != N)
  1506. {
  1507. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1508. }
  1509. else if (N != J)
  1510. {
  1511. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1512. }
  1513. cblas_zherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
  1514. INT (A->tda), beta, C->data, INT (C->tda));
  1515. return GSL_SUCCESS;
  1516. }
  1517. /* SYR2K */
  1518. int
  1519. gsl_blas_ssyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
  1520. const gsl_matrix_float * A, const gsl_matrix_float * B,
  1521. float beta, gsl_matrix_float * C)
  1522. {
  1523. const size_t M = C->size1;
  1524. const size_t N = C->size2;
  1525. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1526. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1527. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1528. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1529. if (M != N)
  1530. {
  1531. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1532. }
  1533. else if (N != MA || N != MB || NA != NB)
  1534. {
  1535. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1536. }
  1537. cblas_ssyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
  1538. INT (A->tda), B->data, INT (B->tda), beta, C->data,
  1539. INT (C->tda));
  1540. return GSL_SUCCESS;
  1541. }
  1542. int
  1543. gsl_blas_dsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
  1544. const gsl_matrix * A, const gsl_matrix * B, double beta,
  1545. gsl_matrix * C)
  1546. {
  1547. const size_t M = C->size1;
  1548. const size_t N = C->size2;
  1549. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1550. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1551. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1552. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1553. if (M != N)
  1554. {
  1555. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1556. }
  1557. else if (N != MA || N != MB || NA != NB)
  1558. {
  1559. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1560. }
  1561. cblas_dsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
  1562. INT (A->tda), B->data, INT (B->tda), beta, C->data,
  1563. INT (C->tda));
  1564. return GSL_SUCCESS;
  1565. }
  1566. int
  1567. gsl_blas_csyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1568. const gsl_complex_float alpha,
  1569. const gsl_matrix_complex_float * A,
  1570. const gsl_matrix_complex_float * B,
  1571. const gsl_complex_float beta, gsl_matrix_complex_float * C)
  1572. {
  1573. const size_t M = C->size1;
  1574. const size_t N = C->size2;
  1575. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1576. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1577. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1578. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1579. if (M != N)
  1580. {
  1581. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1582. }
  1583. else if (N != MA || N != MB || NA != NB)
  1584. {
  1585. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1586. }
  1587. cblas_csyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
  1588. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1589. INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
  1590. return GSL_SUCCESS;
  1591. }
  1592. int
  1593. gsl_blas_zsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1594. const gsl_complex alpha, const gsl_matrix_complex * A,
  1595. const gsl_matrix_complex * B, const gsl_complex beta,
  1596. gsl_matrix_complex * C)
  1597. {
  1598. const size_t M = C->size1;
  1599. const size_t N = C->size2;
  1600. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1601. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1602. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1603. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1604. if (M != N)
  1605. {
  1606. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1607. }
  1608. else if (N != MA || N != MB || NA != NB)
  1609. {
  1610. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1611. }
  1612. cblas_zsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
  1613. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1614. INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
  1615. return GSL_SUCCESS;
  1616. }
  1617. /* HER2K */
  1618. int
  1619. gsl_blas_cher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1620. const gsl_complex_float alpha,
  1621. const gsl_matrix_complex_float * A,
  1622. const gsl_matrix_complex_float * B, float beta,
  1623. gsl_matrix_complex_float * C)
  1624. {
  1625. const size_t M = C->size1;
  1626. const size_t N = C->size2;
  1627. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1628. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1629. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1630. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1631. if (M != N)
  1632. {
  1633. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1634. }
  1635. else if (N != MA || N != MB || NA != NB)
  1636. {
  1637. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1638. }
  1639. cblas_cher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
  1640. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1641. INT (B->tda), beta, C->data, INT (C->tda));
  1642. return GSL_SUCCESS;
  1643. }
  1644. int
  1645. gsl_blas_zher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
  1646. const gsl_complex alpha, const gsl_matrix_complex * A,
  1647. const gsl_matrix_complex * B, double beta,
  1648. gsl_matrix_complex * C)
  1649. {
  1650. const size_t M = C->size1;
  1651. const size_t N = C->size2;
  1652. const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
  1653. const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
  1654. const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
  1655. const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
  1656. if (M != N)
  1657. {
  1658. GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
  1659. }
  1660. else if (N != MA || N != MB || NA != NB)
  1661. {
  1662. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1663. }
  1664. cblas_zher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
  1665. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1666. INT (B->tda), beta, C->data, INT (C->tda));
  1667. return GSL_SUCCESS;
  1668. }
  1669. /* TRMM */
  1670. int
  1671. gsl_blas_strmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1672. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
  1673. const gsl_matrix_float * A, gsl_matrix_float * B)
  1674. {
  1675. const size_t M = B->size1;
  1676. const size_t N = B->size2;
  1677. const size_t MA = A->size1;
  1678. const size_t NA = A->size2;
  1679. if (MA != NA)
  1680. {
  1681. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1682. }
  1683. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1684. {
  1685. cblas_strmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1686. alpha, A->data, INT (A->tda), B->data, INT (B->tda));
  1687. return GSL_SUCCESS;
  1688. }
  1689. else
  1690. {
  1691. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1692. }
  1693. }
  1694. int
  1695. gsl_blas_dtrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1696. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
  1697. const gsl_matrix * A, gsl_matrix * B)
  1698. {
  1699. const size_t M = B->size1;
  1700. const size_t N = B->size2;
  1701. const size_t MA = A->size1;
  1702. const size_t NA = A->size2;
  1703. if (MA != NA)
  1704. {
  1705. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1706. }
  1707. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1708. {
  1709. cblas_dtrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1710. alpha, A->data, INT (A->tda), B->data, INT (B->tda));
  1711. return GSL_SUCCESS;
  1712. }
  1713. else
  1714. {
  1715. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1716. }
  1717. }
  1718. int
  1719. gsl_blas_ctrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1720. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
  1721. const gsl_complex_float alpha,
  1722. const gsl_matrix_complex_float * A,
  1723. gsl_matrix_complex_float * B)
  1724. {
  1725. const size_t M = B->size1;
  1726. const size_t N = B->size2;
  1727. const size_t MA = A->size1;
  1728. const size_t NA = A->size2;
  1729. if (MA != NA)
  1730. {
  1731. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1732. }
  1733. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1734. {
  1735. cblas_ctrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1736. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1737. INT (B->tda));
  1738. return GSL_SUCCESS;
  1739. }
  1740. else
  1741. {
  1742. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1743. }
  1744. }
  1745. int
  1746. gsl_blas_ztrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1747. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
  1748. const gsl_complex alpha, const gsl_matrix_complex * A,
  1749. gsl_matrix_complex * B)
  1750. {
  1751. const size_t M = B->size1;
  1752. const size_t N = B->size2;
  1753. const size_t MA = A->size1;
  1754. const size_t NA = A->size2;
  1755. if (MA != NA)
  1756. {
  1757. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1758. }
  1759. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1760. {
  1761. cblas_ztrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1762. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1763. INT (B->tda));
  1764. return GSL_SUCCESS;
  1765. }
  1766. else
  1767. {
  1768. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1769. }
  1770. }
  1771. /* TRSM */
  1772. int
  1773. gsl_blas_strsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1774. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
  1775. const gsl_matrix_float * A, gsl_matrix_float * B)
  1776. {
  1777. const size_t M = B->size1;
  1778. const size_t N = B->size2;
  1779. const size_t MA = A->size1;
  1780. const size_t NA = A->size2;
  1781. if (MA != NA)
  1782. {
  1783. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1784. }
  1785. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1786. {
  1787. cblas_strsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1788. alpha, A->data, INT (A->tda), B->data, INT (B->tda));
  1789. return GSL_SUCCESS;
  1790. }
  1791. else
  1792. {
  1793. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1794. }
  1795. }
  1796. int
  1797. gsl_blas_dtrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1798. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
  1799. const gsl_matrix * A, gsl_matrix * B)
  1800. {
  1801. const size_t M = B->size1;
  1802. const size_t N = B->size2;
  1803. const size_t MA = A->size1;
  1804. const size_t NA = A->size2;
  1805. if (MA != NA)
  1806. {
  1807. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1808. }
  1809. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1810. {
  1811. cblas_dtrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1812. alpha, A->data, INT (A->tda), B->data, INT (B->tda));
  1813. return GSL_SUCCESS;
  1814. }
  1815. else
  1816. {
  1817. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1818. }
  1819. }
  1820. int
  1821. gsl_blas_ctrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1822. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
  1823. const gsl_complex_float alpha,
  1824. const gsl_matrix_complex_float * A,
  1825. gsl_matrix_complex_float * B)
  1826. {
  1827. const size_t M = B->size1;
  1828. const size_t N = B->size2;
  1829. const size_t MA = A->size1;
  1830. const size_t NA = A->size2;
  1831. if (MA != NA)
  1832. {
  1833. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1834. }
  1835. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1836. {
  1837. cblas_ctrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1838. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1839. INT (B->tda));
  1840. return GSL_SUCCESS;
  1841. }
  1842. else
  1843. {
  1844. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1845. }
  1846. }
  1847. int
  1848. gsl_blas_ztrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
  1849. CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
  1850. const gsl_complex alpha, const gsl_matrix_complex * A,
  1851. gsl_matrix_complex * B)
  1852. {
  1853. const size_t M = B->size1;
  1854. const size_t N = B->size2;
  1855. const size_t MA = A->size1;
  1856. const size_t NA = A->size2;
  1857. if (MA != NA)
  1858. {
  1859. GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
  1860. }
  1861. if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
  1862. {
  1863. cblas_ztrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
  1864. GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
  1865. INT (B->tda));
  1866. return GSL_SUCCESS;
  1867. }
  1868. else
  1869. {
  1870. GSL_ERROR ("invalid length", GSL_EBADLEN);
  1871. }
  1872. }