1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#include "rb_lapack.h"
extern VOID cla_geamv_(integer* trans, integer* m, integer* n, real* alpha, complex* a, integer* lda, complex* x, integer* incx, real* beta, real* y, integer* incy);
static VALUE
rblapack_cla_geamv(int argc, VALUE *argv, VALUE self){
VALUE rblapack_trans;
integer trans;
VALUE rblapack_m;
integer m;
VALUE rblapack_alpha;
real alpha;
VALUE rblapack_a;
complex *a;
VALUE rblapack_x;
complex *x;
VALUE rblapack_incx;
integer incx;
VALUE rblapack_beta;
real beta;
VALUE rblapack_y;
real *y;
VALUE rblapack_incy;
integer incy;
VALUE rblapack_y_out__;
real *y_out__;
integer lda;
integer n;
VALUE rblapack_options;
if (argc > 0 && TYPE(argv[argc-1]) == T_HASH) {
argc--;
rblapack_options = argv[argc];
if (rb_hash_aref(rblapack_options, sHelp) == Qtrue) {
printf("%s\n", "USAGE:\n y = NumRu::Lapack.cla_geamv( trans, m, alpha, a, x, incx, beta, y, incy, [:usage => usage, :help => help])\n\n\nFORTRAN MANUAL\n SUBROUTINE CLA_GEAMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY )\n\n* Purpose\n* =======\n*\n* CLA_GEAMV performs one of the matrix-vector operations\n*\n* y := alpha*abs(A)*abs(x) + beta*abs(y),\n* or y := alpha*abs(A)'*abs(x) + beta*abs(y),\n*\n* where alpha and beta are scalars, x and y are vectors and A is an\n* m by n matrix.\n*\n* This function is primarily used in calculating error bounds.\n* To protect against underflow during evaluation, components in\n* the resulting vector are perturbed away from zero by (N+1)\n* times the underflow threshold. To prevent unnecessarily large\n* errors for block-structure embedded in general matrices,\n* \"symbolically\" zero components are not perturbed. A zero\n* entry is considered \"symbolic\" if all multiplications involved\n* in computing that entry have at least one zero multiplicand.\n*\n\n* Arguments\n* ==========\n*\n* TRANS (input) INTEGER\n* On entry, TRANS specifies the operation to be performed as\n* follows:\n*\n* BLAS_NO_TRANS y := alpha*abs(A)*abs(x) + beta*abs(y)\n* BLAS_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y)\n* BLAS_CONJ_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y)\n*\n* Unchanged on exit.\n*\n* M (input) INTEGER\n* On entry, M specifies the number of rows of the matrix A.\n* M must be at least zero.\n* Unchanged on exit.\n*\n* N (input) INTEGER\n* On entry, N specifies the number of columns of the matrix A.\n* N must be at least zero.\n* Unchanged on exit.\n*\n* ALPHA (input) REAL\n* On entry, ALPHA specifies the scalar alpha.\n* Unchanged on exit.\n*\n* A (input) COMPLEX array, dimension (LDA,n)\n* Before entry, the leading m by n part of the array A must\n* contain the matrix of coefficients.\n* Unchanged on exit.\n*\n* LDA (input) INTEGER\n* On entry, LDA specifies the first dimension of A as declared\n* in the calling (sub) program. LDA must be at least\n* max( 1, m ).\n* Unchanged on exit.\n*\n* X (input) COMPLEX array, dimension\n* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'\n* and at least\n* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.\n* Before entry, the incremented array X must contain the\n* vector x.\n* Unchanged on exit.\n*\n* INCX (input) INTEGER\n* On entry, INCX specifies the increment for the elements of\n* X. INCX must not be zero.\n* Unchanged on exit.\n*\n* BETA (input) REAL\n* On entry, BETA specifies the scalar beta. When BETA is\n* supplied as zero then Y need not be set on input.\n* Unchanged on exit.\n*\n* Y (input/output) REAL array, dimension\n* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'\n* and at least\n* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.\n* Before entry with BETA non-zero, the incremented array Y\n* must contain the vector y. On exit, Y is overwritten by the\n* updated vector y.\n*\n* INCY (input) INTEGER\n* On entry, INCY specifies the increment for the elements of\n* Y. INCY must not be zero.\n* Unchanged on exit.\n*\n*\n* Level 2 Blas routine.\n*\n\n* =====================================================================\n*\n\n");
return Qnil;
}
if (rb_hash_aref(rblapack_options, sUsage) == Qtrue) {
printf("%s\n", "USAGE:\n y = NumRu::Lapack.cla_geamv( trans, m, alpha, a, x, incx, beta, y, incy, [:usage => usage, :help => help])\n");
return Qnil;
}
} else
rblapack_options = Qnil;
if (argc != 9 && argc != 9)
rb_raise(rb_eArgError,"wrong number of arguments (%d for 9)", argc);
rblapack_trans = argv[0];
rblapack_m = argv[1];
rblapack_alpha = argv[2];
rblapack_a = argv[3];
rblapack_x = argv[4];
rblapack_incx = argv[5];
rblapack_beta = argv[6];
rblapack_y = argv[7];
rblapack_incy = argv[8];
if (argc == 9) {
} else if (rblapack_options != Qnil) {
} else {
}
trans = NUM2INT(rblapack_trans);
alpha = (real)NUM2DBL(rblapack_alpha);
incx = NUM2INT(rblapack_incx);
incy = NUM2INT(rblapack_incy);
m = NUM2INT(rblapack_m);
beta = (real)NUM2DBL(rblapack_beta);
if (!NA_IsNArray(rblapack_a))
rb_raise(rb_eArgError, "a (4th argument) must be NArray");
if (NA_RANK(rblapack_a) != 2)
rb_raise(rb_eArgError, "rank of a (4th argument) must be %d", 2);
lda = NA_SHAPE0(rblapack_a);
n = NA_SHAPE1(rblapack_a);
if (NA_TYPE(rblapack_a) != NA_SCOMPLEX)
rblapack_a = na_change_type(rblapack_a, NA_SCOMPLEX);
a = NA_PTR_TYPE(rblapack_a, complex*);
if (!NA_IsNArray(rblapack_y))
rb_raise(rb_eArgError, "y (8th argument) must be NArray");
if (NA_RANK(rblapack_y) != 1)
rb_raise(rb_eArgError, "rank of y (8th argument) must be %d", 1);
if (NA_SHAPE0(rblapack_y) != (trans == ilatrans_("N") ? 1 + ( m - 1 )*abs( incy ) : 1 + ( n - 1 )*abs( incy )))
rb_raise(rb_eRuntimeError, "shape 0 of y must be %d", trans == ilatrans_("N") ? 1 + ( m - 1 )*abs( incy ) : 1 + ( n - 1 )*abs( incy ));
if (NA_TYPE(rblapack_y) != NA_SFLOAT)
rblapack_y = na_change_type(rblapack_y, NA_SFLOAT);
y = NA_PTR_TYPE(rblapack_y, real*);
if (!NA_IsNArray(rblapack_x))
rb_raise(rb_eArgError, "x (5th argument) must be NArray");
if (NA_RANK(rblapack_x) != 1)
rb_raise(rb_eArgError, "rank of x (5th argument) must be %d", 1);
if (NA_SHAPE0(rblapack_x) != (trans == ilatrans_("N") ? 1 + ( n - 1 )*abs( incx ) : 1 + ( m - 1 )*abs( incx )))
rb_raise(rb_eRuntimeError, "shape 0 of x must be %d", trans == ilatrans_("N") ? 1 + ( n - 1 )*abs( incx ) : 1 + ( m - 1 )*abs( incx ));
if (NA_TYPE(rblapack_x) != NA_SCOMPLEX)
rblapack_x = na_change_type(rblapack_x, NA_SCOMPLEX);
x = NA_PTR_TYPE(rblapack_x, complex*);
{
na_shape_t shape[1];
shape[0] = trans == ilatrans_("N") ? 1 + ( m - 1 )*abs( incy ) : 1 + ( n - 1 )*abs( incy );
rblapack_y_out__ = na_make_object(NA_SFLOAT, 1, shape, cNArray);
}
y_out__ = NA_PTR_TYPE(rblapack_y_out__, real*);
MEMCPY(y_out__, y, real, NA_TOTAL(rblapack_y));
rblapack_y = rblapack_y_out__;
y = y_out__;
cla_geamv_(&trans, &m, &n, &alpha, a, &lda, x, &incx, &beta, y, &incy);
return rblapack_y;
}
void
init_lapack_cla_geamv(VALUE mLapack, VALUE sH, VALUE sU, VALUE zero){
sHelp = sH;
sUsage = sU;
rblapack_ZERO = zero;
rb_define_module_function(mLapack, "cla_geamv", rblapack_cla_geamv, -1);
}
|