00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SELDON_FILE_BLAS_1_CXX
00021
00022
00023 #include "Blas_1.hxx"
00024
00025
00026 namespace Seldon
00027 {
00028
00029
00031
00032
00033
00034 void GenRot(float& a, float& b, float& c, float& d)
00035 {
00036 cblas_srotg(&a, &b, &c, &d);
00037 }
00038
00039
00040 void GenRot(double& a, double& b, double& c, double& d)
00041 {
00042 cblas_drotg(&a, &b, &c, &d);
00043 }
00044
00045
00046
00048
00049
00050
00052
00053
00054
00055 void GenModifRot(float& d1, float& d2,
00056 float& x1, const float& y1,
00057 float* param)
00058 {
00059 cblas_srotmg(&d1, &d2, &x1, y1, param);
00060 }
00061
00062
00063 void GenModifRot(double& d1, double& d2,
00064 double& x1, const double& y1,
00065 double* param)
00066 {
00067 cblas_drotmg(&d1, &d2, &x1, y1, param);
00068 }
00069
00070
00071
00073
00074
00075
00077
00078
00079
00080 template <class Allocator>
00081 void ApplyRot(Vector<float, VectFull, Allocator>& X,
00082 Vector<float, VectFull, Allocator>& Y,
00083 const float c, const float s)
00084 {
00085 cblas_srot(X.GetLength(), X.GetData(), 1,
00086 Y.GetData(), 1, c, s);
00087 }
00088
00089
00090 template <class Allocator>
00091 void ApplyRot(Vector<double, VectFull, Allocator>& X,
00092 Vector<double, VectFull, Allocator>& Y,
00093 const double c, const double s)
00094 {
00095 cblas_drot(X.GetLength(), X.GetData(), 1,
00096 Y.GetData(), 1, c, s);
00097 }
00098
00099
00100
00102
00103
00104
00106
00107
00108
00109 template <class Allocator>
00110 void ApplyModifRot(Vector<float, VectFull, Allocator>& X,
00111 Vector<float, VectFull, Allocator>& Y,
00112 const float* param)
00113 {
00114 cblas_srotm(X.GetLength(), X.GetData(), 1,
00115 Y.GetData(), 1, param);
00116 }
00117
00118
00119 template <class Allocator>
00120 void ApplyModifRot(Vector<double, VectFull, Allocator>& X,
00121 Vector<double, VectFull, Allocator>& Y,
00122 const double* param)
00123 {
00124 cblas_drotm(X.GetLength(), X.GetData(), 1,
00125 Y.GetData(), 1, param);
00126 }
00127
00128
00129
00131
00132
00133
00135
00136
00137
00138 template <class Allocator>
00139 void Swap(Vector<float, VectFull, Allocator>& X,
00140 Vector<float, VectFull, Allocator>& Y)
00141 {
00142
00143 #ifdef SELDON_CHECK_DIMENSIONS
00144 CheckDim(X, Y, "Swap(X, Y)", "X <-> Y");
00145 #endif
00146
00147 cblas_sswap(X.GetLength(), X.GetData(), 1,
00148 Y.GetData(), 1);
00149 }
00150
00151
00152 template <class Allocator>
00153 void Swap(Vector<double, VectFull, Allocator>& X,
00154 Vector<double, VectFull, Allocator>& Y)
00155 {
00156
00157 #ifdef SELDON_CHECK_DIMENSIONS
00158 CheckDim(X, Y, "Swap(X, Y)", "X <-> Y");
00159 #endif
00160
00161 cblas_dswap(X.GetLength(), X.GetData(), 1,
00162 Y.GetData(), 1);
00163 }
00164
00165
00166 template <class Allocator>
00167 void Swap(Vector<complex<float>, VectFull, Allocator>& X,
00168 Vector<complex<float>, VectFull, Allocator>& Y)
00169 {
00170
00171 #ifdef SELDON_CHECK_DIMENSIONS
00172 CheckDim(X, Y, "Swap(X, Y)", "X <-> Y");
00173 #endif
00174
00175 cblas_cswap(X.GetLength(), reinterpret_cast<void*>(X.GetData()), 1,
00176 reinterpret_cast<void*>(Y.GetData()), 1);
00177 }
00178
00179
00180 template <class Allocator>
00181 void Swap(Vector<complex<double>, VectFull, Allocator>& X,
00182 Vector<complex<double>, VectFull, Allocator>& Y)
00183 {
00184
00185 #ifdef SELDON_CHECK_DIMENSIONS
00186 CheckDim(X, Y, "Swap(X, Y)", "X <-> Y");
00187 #endif
00188
00189 cblas_zswap(X.GetLength(), reinterpret_cast<void*>(X.GetData()), 1,
00190 reinterpret_cast<void*>(Y.GetData()), 1);
00191 }
00192
00193
00194
00196
00197
00198
00200
00201
00202
00203 template <class Allocator>
00204 void Mlt(const float alpha,
00205 Vector<float, VectFull, Allocator>& X)
00206 {
00207 cblas_sscal(X.GetLength(), alpha, X.GetData(), 1);
00208 }
00209
00210
00211 template <class Allocator>
00212 void Mlt(const double alpha,
00213 Vector<double, VectFull, Allocator>& X)
00214 {
00215 cblas_dscal(X.GetLength(), alpha, X.GetData(), 1);
00216 }
00217
00218
00219 template <class Allocator>
00220 void Mlt(const float alpha,
00221 Vector<complex<float>, VectFull, Allocator>& X)
00222 {
00223 cblas_csscal(X.GetLength(), alpha,
00224 reinterpret_cast<void*>(X.GetData()), 1);
00225 }
00226
00227
00228 template <class Allocator>
00229 void Mlt(const double alpha,
00230 Vector<complex<double>, VectFull, Allocator>& X)
00231 {
00232 cblas_zdscal(X.GetLength(), alpha,
00233 reinterpret_cast<void*>(X.GetData()), 1);
00234 }
00235
00236
00237 template <class Allocator>
00238 void Mlt(const complex<float> alpha,
00239 Vector<complex<float>, VectFull, Allocator>& X)
00240 {
00241 cblas_cscal(X.GetLength(),
00242 reinterpret_cast<const void*>(&alpha),
00243 reinterpret_cast<void*>(X.GetData()), 1);
00244 }
00245
00246
00247 template <class Allocator>
00248 void Mlt(const complex<double> alpha,
00249 Vector<complex<double>, VectFull, Allocator>& X)
00250 {
00251 cblas_zscal(X.GetLength(),
00252 reinterpret_cast<const void*>(&alpha),
00253 reinterpret_cast<void*>(X.GetData()), 1);
00254 }
00255
00256
00257
00259
00260
00261
00263
00264
00265
00266 template <class Allocator0, class Allocator1>
00267 void Copy(const Vector<float, VectFull, Allocator0>& X,
00268 Vector<float, VectFull, Allocator1>& Y)
00269 {
00270
00271 #ifdef SELDON_CHECK_DIMENSIONS
00272 CheckDim(X, Y, "Copy(X, Y)", "X -> Y");
00273 #endif
00274
00275 cblas_scopy(Y.GetLength(),
00276 reinterpret_cast<const float*>(X.GetData()), 1,
00277 reinterpret_cast<float*>(Y.GetData()), 1);
00278 }
00279
00280
00281 template <class Allocator0, class Allocator1>
00282 void Copy(const Vector<double, VectFull, Allocator0>& X,
00283 Vector<double, VectFull, Allocator1>& Y)
00284 {
00285
00286 #ifdef SELDON_CHECK_DIMENSIONS
00287 CheckDim(X, Y, "Copy(X, Y)", "X -> Y");
00288 #endif
00289
00290 cblas_dcopy(Y.GetLength(),
00291 reinterpret_cast<const double*>(X.GetData()), 1,
00292 reinterpret_cast<double*>(Y.GetData()), 1);
00293 }
00294
00295
00296 template <class Allocator0, class Allocator1>
00297 void Copy(const Vector<complex<float>, VectFull, Allocator0>& X,
00298 Vector<complex<float>, VectFull, Allocator1>& Y)
00299 {
00300
00301 #ifdef SELDON_CHECK_DIMENSIONS
00302 CheckDim(X, Y, "Copy(X, Y)", "X -> Y");
00303 #endif
00304
00305 cblas_ccopy(Y.GetLength(),
00306 reinterpret_cast<const void*>(X.GetData()), 1,
00307 reinterpret_cast<void*>(Y.GetData()), 1);
00308 }
00309
00310
00311 template <class Allocator0, class Allocator1>
00312 void Copy(const Vector<complex<double>, VectFull, Allocator0>& X,
00313 Vector<complex<double>, VectFull, Allocator1>& Y)
00314 {
00315
00316 #ifdef SELDON_CHECK_DIMENSIONS
00317 CheckDim(X, Y, "Copy(X, Y)", "X -> Y");
00318 #endif
00319
00320 cblas_zcopy(Y.GetLength(),
00321 reinterpret_cast<const void*>(X.GetData()), 1,
00322 reinterpret_cast<void*>(Y.GetData()), 1);
00323 }
00324
00325
00326
00328
00329
00330
00332
00333
00334
00335 template <class Allocator0, class Allocator1>
00336 void Add(const float alpha,
00337 const Vector<float, VectFull, Allocator0>& X,
00338 Vector<float, VectFull, Allocator1>& Y)
00339 {
00340
00341 #ifdef SELDON_CHECK_DIMENSIONS
00342 CheckDim(X, Y, "Add(alpha, X, Y)");
00343 #endif
00344
00345 cblas_saxpy(Y.GetLength(),
00346 alpha,
00347 reinterpret_cast<const float*>(X.GetData()), 1,
00348 reinterpret_cast<float*>(Y.GetData()), 1);
00349 }
00350
00351
00352 template <class Allocator0, class Allocator1>
00353 void Add(const double alpha,
00354 const Vector<double, VectFull, Allocator0>& X,
00355 Vector<double, VectFull, Allocator1>& Y)
00356 {
00357
00358 #ifdef SELDON_CHECK_DIMENSIONS
00359 CheckDim(X, Y, "Add(alpha, X, Y)");
00360 #endif
00361
00362 cblas_daxpy(Y.GetLength(),
00363 alpha,
00364 reinterpret_cast<const double*>(X.GetData()), 1,
00365 reinterpret_cast<double*>(Y.GetData()), 1);
00366 }
00367
00368
00369 template <class Allocator0, class Allocator1>
00370 void Add(const complex<float> alpha,
00371 const Vector<complex<float>, VectFull, Allocator0>& X,
00372 Vector<complex<float>, VectFull, Allocator1>& Y)
00373 {
00374
00375 #ifdef SELDON_CHECK_DIMENSIONS
00376 CheckDim(X, Y, "Add(alpha, X, Y)");
00377 #endif
00378
00379 cblas_caxpy(Y.GetLength(),
00380 reinterpret_cast<const void*>(&alpha),
00381 reinterpret_cast<const void*>(X.GetData()), 1,
00382 reinterpret_cast<float*>(Y.GetData()), 1);
00383 }
00384
00385
00386 template <class Allocator0, class Allocator1>
00387 void Add(const complex<double> alpha,
00388 const Vector<complex<double>, VectFull, Allocator0>& X,
00389 Vector<complex<double>, VectFull, Allocator1>& Y)
00390 {
00391
00392 #ifdef SELDON_CHECK_DIMENSIONS
00393 CheckDim(X, Y, "Add(alpha, X, Y)");
00394 #endif
00395
00396 cblas_zaxpy(Y.GetLength(),
00397 reinterpret_cast<const void*>(&alpha),
00398 reinterpret_cast<const void*>(X.GetData()), 1,
00399 reinterpret_cast<double*>(Y.GetData()), 1);
00400 }
00401
00402
00403
00405
00406
00407
00409
00410
00411
00412 template <class Allocator0, class Allocator1>
00413 float DotProd(const Vector<float, VectFull, Allocator0>& X,
00414 const Vector<float, VectFull, Allocator1>& Y)
00415 {
00416
00417 #ifdef SELDON_CHECK_DIMENSIONS
00418 CheckDim(X, Y, "DotProd(X, Y)", "dot(X, Y)");
00419 #endif
00420
00421 return cblas_sdot(Y.GetLength(),
00422 reinterpret_cast<const float*>(X.GetData()), 1,
00423 reinterpret_cast<const float*>(Y.GetData()), 1);
00424 }
00425
00426
00427 template <class Allocator0, class Allocator1>
00428 double DotProd(const Vector<double, VectFull, Allocator0>& X,
00429 const Vector<double, VectFull, Allocator1>& Y)
00430 {
00431
00432 #ifdef SELDON_CHECK_DIMENSIONS
00433 CheckDim(X, Y, "DotProd(X, Y)", "dot(X, Y)");
00434 #endif
00435
00436 return cblas_ddot(Y.GetLength(),
00437 reinterpret_cast<const double*>(X.GetData()), 1,
00438 reinterpret_cast<const double*>(Y.GetData()), 1);
00439 }
00440
00441
00442 template <class Allocator0, class Allocator1>
00443 complex<float>
00444 DotProd(const Vector<complex<float>, VectFull, Allocator0>& X,
00445 const Vector<complex<float>, VectFull, Allocator1>& Y)
00446 {
00447
00448 #ifdef SELDON_CHECK_DIMENSIONS
00449 CheckDim(X, Y, "DotProd(X, Y)", "dot(X, Y)");
00450 #endif
00451
00452 complex<float> dotu;
00453 cblas_cdotu_sub(Y.GetLength(),
00454 reinterpret_cast<const void*>(X.GetData()), 1,
00455 reinterpret_cast<const void*>(Y.GetData()), 1,
00456 reinterpret_cast<void*>(&dotu));
00457 return dotu;
00458 }
00459
00460
00461 template <class Allocator0, class Allocator1>
00462 complex<double>
00463 DotProd(const Vector<complex<double>, VectFull, Allocator0>& X,
00464 const Vector<complex<double>, VectFull, Allocator1>& Y)
00465 {
00466
00467 #ifdef SELDON_CHECK_DIMENSIONS
00468 CheckDim(X, Y, "DotProd(X, Y)", "dot(X, Y)");
00469 #endif
00470
00471 complex<double> dotu;
00472 cblas_zdotu_sub(Y.GetLength(),
00473 reinterpret_cast<const void*>(X.GetData()), 1,
00474 reinterpret_cast<const void*>(Y.GetData()), 1,
00475 reinterpret_cast<void*>(&dotu));
00476 return dotu;
00477 }
00478
00479
00480
00482
00483
00484
00486
00487
00488
00489 template <class Allocator0, class Allocator1>
00490 float ScaledDotProd(const float alpha,
00491 const Vector<float, VectFull, Allocator0>& X,
00492 const Vector<float, VectFull, Allocator1>& Y)
00493 {
00494
00495 #ifdef SELDON_CHECK_DIMENSIONS
00496 CheckDim(X, Y, "ScaledDotProd(X, Y)", "dot(X, Y)");
00497 #endif
00498
00499 return cblas_sdsdot(Y.GetLength(), alpha,
00500 reinterpret_cast<const float*>(X.GetData()), 1,
00501 reinterpret_cast<const float*>(Y.GetData()), 1);
00502 }
00503
00504
00505
00507
00508
00509
00511
00512
00513
00514 template <class Allocator0, class Allocator1>
00515 complex<float>
00516 DotProdConj(const Vector<complex<float>, VectFull, Allocator0>& X,
00517 const Vector<complex<float>, VectFull, Allocator1>& Y)
00518 {
00519
00520 #ifdef SELDON_CHECK_DIMENSIONS
00521 CheckDim(X, Y, "DotProdConj(X, Y)", "dot(X, Y)");
00522 #endif
00523
00524 complex<float> dotc;
00525 cblas_cdotc_sub(Y.GetLength(),
00526 reinterpret_cast<const void*>(X.GetData()), 1,
00527 reinterpret_cast<const void*>(Y.GetData()), 1,
00528 reinterpret_cast<void*>(&dotc));
00529 return dotc;
00530 }
00531
00532
00533 template <class Allocator0, class Allocator1>
00534 complex<double>
00535 DotProdConj(const Vector<complex<double>, VectFull, Allocator0>& X,
00536 const Vector<complex<double>, VectFull, Allocator1>& Y)
00537 {
00538
00539 #ifdef SELDON_CHECK_DIMENSIONS
00540 CheckDim(X, Y, "DotProdConj(X, Y)", "dot(X, Y)");
00541 #endif
00542
00543 complex<double> dotc;
00544 cblas_zdotc_sub(Y.GetLength(),
00545 reinterpret_cast<const void*>(X.GetData()), 1,
00546 reinterpret_cast<const void*>(Y.GetData()), 1,
00547 reinterpret_cast<void*>(&dotc));
00548 return dotc;
00549 }
00550
00551
00552
00554
00555
00556
00558
00559
00560
00561 template <class Allocator>
00562 float Norm1(const Vector<float, VectFull, Allocator>& X)
00563 {
00564 return cblas_sasum(X.GetLength(),
00565 reinterpret_cast<const float*>(X.GetData()), 1);
00566 }
00567
00568
00569 template <class Allocator>
00570 double Norm1(const Vector<double, VectFull, Allocator>& X)
00571 {
00572 return cblas_dasum(X.GetLength(),
00573 reinterpret_cast<const double*>(X.GetData()), 1);
00574 }
00575
00576
00577 template <class Allocator>
00578 float Norm1(const Vector<complex<float>, VectFull, Allocator>& X)
00579 {
00580 return cblas_scasum(X.GetLength(),
00581 reinterpret_cast<const void*>(X.GetData()), 1);
00582 }
00583
00584
00585 template <class Allocator>
00586 double Norm1(const Vector<complex<double>, VectFull, Allocator>& X)
00587 {
00588 return cblas_dzasum(X.GetLength(),
00589 reinterpret_cast<const void*>(X.GetData()), 1);
00590 }
00591
00592
00593
00595
00596
00597
00599
00600
00601
00602 template <class Allocator>
00603 float Norm2(const Vector<float, VectFull, Allocator>& X)
00604 {
00605 return cblas_snrm2(X.GetLength(),
00606 reinterpret_cast<const float*>(X.GetData()), 1);
00607 }
00608
00609
00610 template <class Allocator>
00611 double Norm2(const Vector<double, VectFull, Allocator>& X)
00612 {
00613 return cblas_dnrm2(X.GetLength(),
00614 reinterpret_cast<const double*>(X.GetData()), 1);
00615 }
00616
00617
00618 template <class Allocator>
00619 float Norm2(const Vector<complex<float>, VectFull, Allocator>& X)
00620 {
00621 return cblas_scnrm2(X.GetLength(),
00622 reinterpret_cast<const void*>(X.GetData()), 1);
00623 }
00624
00625
00626 template <class Allocator>
00627 double Norm2(const Vector<complex<double>, VectFull, Allocator>& X)
00628 {
00629 return cblas_dznrm2(X.GetLength(),
00630 reinterpret_cast<const void*>(X.GetData()), 1);
00631 }
00632
00633
00634
00636
00637
00638
00640
00641
00642
00643 template <class Allocator>
00644 size_t GetMaxAbsIndex(const Vector<float, VectFull, Allocator>& X)
00645 {
00646 return cblas_isamax(X.GetLength(),
00647 reinterpret_cast<const float*>(X.GetData()), 1);
00648 }
00649
00650
00651 template <class Allocator>
00652 size_t GetMaxAbsIndex(const Vector<double, VectFull, Allocator>& X)
00653 {
00654 return cblas_idamax(X.GetLength(),
00655 reinterpret_cast<const double*>(X.GetData()), 1);
00656 }
00657
00658
00659 template <class Allocator>
00660 size_t GetMaxAbsIndex(const Vector<complex<float>, VectFull, Allocator>& X)
00661 {
00662 return cblas_icamax(X.GetLength(),
00663 reinterpret_cast<const void*>(X.GetData()), 1);
00664 }
00665
00666
00667 template <class Allocator>
00668 size_t
00669 GetMaxAbsIndex(const Vector<complex<double>, VectFull, Allocator>& X)
00670 {
00671 return cblas_izamax(X.GetLength(),
00672 reinterpret_cast<const void*>(X.GetData()), 1);
00673 }
00674
00675
00676
00678
00679
00680 }
00681
00682 #define SELDON_FILE_BLAS_1_CXX
00683 #endif