#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
typedef int32_t integer;
typedef double doublereal;
typedef bool logical;
#define abs(x) ((x) >= 0 ? (x) : -(x))
#define min(a,b) ((a) <= (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))
#define TRUE_ true
#define FALSE_ false
#ifdef __cplusplus
extern "C" {
#endif
__attribute__((noinline))
int xerbla_(const char *srname, integer *info, int len)
{
static char fmt_9999[] = "(\002 ** On entry to \002,a,\002 parameter num"
"ber \002,i2,\002 had \002,\002an illegal value\002)";
printf("** On entry to %6s, parameter number %2i had an illegal value\n",
srname, *info);
assert(0 &&" error");
exit(1);
return 0;
}
__attribute__((noinline))
logical lsame_(char *ca, char *cb, int ca_size, int cb_size)
{
logical ret_val;
integer inta, intb, zcode;
ret_val = *(unsigned char *)ca == *(unsigned char *)cb;
if (ret_val) {
return ret_val;
}
zcode = 'Z';
inta = *(unsigned char *)ca;
intb = *(unsigned char *)cb;
if (zcode == 90 || zcode == 122) {
if (inta >= 97 && inta <= 122) {
inta += -32;
}
if (intb >= 97 && intb <= 122) {
intb += -32;
}
} else if (zcode == 233 || zcode == 169) {
if (inta >= 129 && inta <= 137 || inta >= 145 && inta <= 153 || inta
>= 162 && inta <= 169) {
inta += 64;
}
if (intb >= 129 && intb <= 137 || intb >= 145 && intb <= 153 || intb
>= 162 && intb <= 169) {
intb += 64;
}
} else if (zcode == 218 || zcode == 250) {
if (inta >= 225 && inta <= 250) {
inta += -32;
}
if (intb >= 225 && intb <= 250) {
intb += -32;
}
}
ret_val = inta == intb;
return ret_val;
}
__attribute__((noinline))
logical dlaisnan_(doublereal *din1, doublereal *din2)
{
logical ret_val;
ret_val = *din1 != *din2;
return ret_val;
}
__attribute__((noinline))
logical disnan_(doublereal *din)
{
logical ret_val;
ret_val = dlaisnan_(din, din);
return ret_val;
}
__attribute__((noinline))
void dlacpy_(char *uplo, integer *m, integer *n, const doublereal *
a, integer *lda, doublereal *b, integer *ldb)
{
integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2;
integer i__, j;
a_dim1 = *lda;
a_offset = 1 + a_dim1;
a -= a_offset;
b_dim1 = *ldb;
b_offset = 1 + b_dim1;
b -= b_offset;
if (lsame_(uplo, (char*)"U", 1, 1)) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = min(j,*m);
for (i__ = 1; i__ <= i__2; ++i__) {
b[i__ + j * b_dim1] = a[i__ + j * a_dim1];
}
}
} else if (lsame_(uplo, (char*)"L", 1, 1)) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = *m;
for (i__ = j; i__ <= i__2; ++i__) {
b[i__ + j * b_dim1] = a[i__ + j * a_dim1];
}
}
} else {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = *m;
for (i__ = 1; i__ <= i__2; ++i__) {
b[i__ + j * b_dim1] = a[i__ + j * a_dim1];
}
}
}
return;
}
__attribute__((noinline))
int dlascl_(char *type__, integer *kl, integer *ku,
doublereal *cfrom, doublereal *cto, integer *m, integer *n,
doublereal *a, integer *lda, integer *info)
{
integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5;
integer i__, j, k1, k2, k3, k4;
doublereal mul, cto1;
logical done;
doublereal ctoc;
integer itype;
doublereal cfrom1;
doublereal cfromc;
doublereal bignum, smlnum;
a_dim1 = *lda;
a_offset = 1 + a_dim1;
a -= a_offset;
*info = 0;
if (lsame_(type__, (char*)"G", 1, 1)) {
itype = 0;
} else if (lsame_(type__, (char*)"L", 1, 1)) {
itype = 1;
} else if (lsame_(type__, (char*)"U", 1, 1)) {
itype = 2;
} else if (lsame_(type__, (char*)"H", 1, 1)) {
itype = 3;
} else if (lsame_(type__, (char*)"B", 1, 1)) {
itype = 4;
} else if (lsame_(type__, (char*)"Q", 1, 1)) {
itype = 5;
} else if (lsame_(type__, (char*)"Z", 1, 1)) {
itype = 6;
} else {
itype = -1;
}
if (itype == -1) {
*info = -1;
} else if (*cfrom == 0. || disnan_(cfrom)) {
*info = -4;
} else if (disnan_(cto)) {
*info = -5;
} else if (*m < 0) {
*info = -6;
} else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) {
*info = -7;
} else if (itype <= 3 && *lda < max(1,*m)) {
*info = -9;
} else if (itype >= 4) {
i__1 = *m - 1;
if (*kl < 0 || *kl > max(i__1,0)) {
*info = -2;
} else {
i__1 = *n - 1;
if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) &&
*kl != *ku) {
*info = -3;
} else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < *
ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) {
*info = -9;
}
}
}
if (*info != 0) {
i__1 = -(*info);
xerbla_("DLASCL", &i__1, 0);
return 0;
}
if (*n == 0 || *m == 0) {
return 0;
}
smlnum = 0.0001; bignum = 1. / smlnum;
cfromc = *cfrom;
ctoc = *cto;
L10:
cfrom1 = cfromc * smlnum;
if (cfrom1 == cfromc) {
mul = ctoc / cfromc;
done = TRUE_;
cto1 = ctoc;
} else {
cto1 = ctoc / bignum;
if (cto1 == ctoc) {
mul = ctoc;
done = TRUE_;
cfromc = 1.;
} else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) {
mul = smlnum;
done = FALSE_;
cfromc = cfrom1;
} else if (abs(cto1) > abs(cfromc)) {
mul = bignum;
done = FALSE_;
ctoc = cto1;
} else {
mul = ctoc / cfromc;
done = TRUE_;
}
}
if (itype == 0) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = *m;
for (i__ = 1; i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 1) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = *m;
for (i__ = j; i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 2) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = min(j,*m);
for (i__ = 1; i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 3) {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__3 = j + 1;
i__2 = min(i__3,*m);
for (i__ = 1; i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 4) {
k3 = *kl + 1;
k4 = *n + 1;
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__3 = k3, i__4 = k4 - j;
i__2 = min(i__3,i__4);
for (i__ = 1; i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 5) {
k1 = *ku + 2;
k3 = *ku + 1;
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__2 = k1 - j;
i__3 = k3;
for (i__ = max(i__2,1); i__ <= i__3; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
} else if (itype == 6) {
k1 = *kl + *ku + 2;
k2 = *kl + 1;
k3 = (*kl << 1) + *ku + 1;
k4 = *kl + *ku + 1 + *m;
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
i__3 = k1 - j;
i__4 = k3, i__5 = k4 - j;
i__2 = min(i__4,i__5);
for (i__ = max(i__3,k2); i__ <= i__2; ++i__) {
a[i__ + j * a_dim1] *= mul;
}
}
}
if (! done) {
goto L10;
}
return 0;
}
__attribute__((noinline))
doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy,
integer *incy)
{
integer i__1;
doublereal ret_val;
integer i__, m, ix, iy, mp1;
doublereal dtemp;
--dy;
--dx;
ret_val = 0.;
dtemp = 0.;
if (*n <= 0) {
return ret_val;
}
if (*incx == 1 && *incy == 1) {
goto L20;
}
ix = 1;
iy = 1;
if (*incx < 0) {
ix = (-(*n) + 1) * *incx + 1;
}
if (*incy < 0) {
iy = (-(*n) + 1) * *incy + 1;
}
i__1 = *n;
for (i__ = 1; i__ <= i__1; ++i__) {
dtemp += dx[ix] * dy[iy];
ix += *incx;
iy += *incy;
}
ret_val = dtemp;
return ret_val;
L20:
m = *n % 5;
if (m == 0) {
goto L40;
}
i__1 = m;
for (i__ = 1; i__ <= i__1; ++i__) {
dtemp += dx[i__] * dy[i__];
}
if (*n < 5) {
goto L60;
}
L40:
mp1 = m + 1;
i__1 = *n;
for (i__ = mp1; i__ <= i__1; i__ += 5) {
dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[
i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ +
4] * dy[i__ + 4];
}
L60:
ret_val = dtemp;
return ret_val;
}
__attribute__((noinline))
int dgemm_(const char *transa_t, const char *transb_t, const integer *m, const integer *
n, const integer *k, const doublereal *alpha, const doublereal *a, const integer *lda,
const doublereal *b, const integer *ldb, const doublereal *beta, doublereal *c, const integer
*ldc)
{
char transa_v = *transa_t;
char* transa = &transa_v;
char transb_v = *transb_t;
char* transb = &transb_v;
integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2,
i__3;
integer info;
logical nota, notb;
doublereal temp;
integer i, j, l, ncola;
integer nrowa, nrowb;
#define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)]
#define B(I,J) b[(I)-1 + ((J)-1)* ( *ldb)]
#define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)]
nota = lsame_((char*)transa, (char*)"N", 1, 1);
notb = lsame_((char*)transb, (char*)"N", 1, 1);
if (nota) {
nrowa = *m;
ncola = *k;
} else {
nrowa = *k;
ncola = *m;
}
if (notb) {
nrowb = *k;
} else {
nrowb = *n;
}
info = 0;
if (! nota && ! lsame_((char*)transa, (char*)"C", 1, 1) && ! lsame_((char*)transa, (char*)"T", 1, 1)) {
info = 1;
} else if (! notb && ! lsame_((char*)transb, (char*)"C", 1, 1) && ! lsame_((char*)transb,
(char*)"T", 1, 1)) {
info = 2;
} else if (*m < 0) {
info = 3;
} else if (*n < 0) {
info = 4;
} else if (*k < 0) {
info = 5;
} else if (*lda < max(1,nrowa)) {
info = 8;
} else if (*ldb < max(1,nrowb)) {
info = 10;
} else if (*ldc < max(1,*m)) {
info = 13;
}
if (info != 0) {
xerbla_("DGEMM ", &info, 0);
return 0;
}
if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
return 0;
}
if (*alpha == 0.) {
if (*beta == 0.) {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
}
} else {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
}
return 0;
}
if (notb) {
if (nota) {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
if (*beta == 0.) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
} else if (*beta != 1.) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
i__2 = *k;
for (l = 1; l <= *k; ++l) {
if (B(l,j) != 0.) {
temp = *alpha * B(l,j);
i__3 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) += temp * A(i,l);
}
}
}
}
} else {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
temp = 0.;
i__3 = *k;
for (l = 1; l <= *k; ++l) {
temp += A(l,i) * B(l,j);
}
if (*beta == 0.) {
C(i,j) = *alpha * temp;
} else {
C(i,j) = *alpha * temp + *beta * C(i,j);
}
}
}
}
} else {
if (nota) {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
if (*beta == 0.) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
} else if (*beta != 1.) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
i__2 = *k;
for (l = 1; l <= *k; ++l) {
if (B(j,l) != 0.) {
temp = *alpha * B(j,l);
i__3 = *m;
for (i = 1; i <= *m; ++i) {
C(i,j) += temp * A(i,l);
}
}
}
}
} else {
i__1 = *n;
for (j = 1; j <= *n; ++j) {
i__2 = *m;
for (i = 1; i <= *m; ++i) {
temp = 0.;
i__3 = *k;
for (l = 1; l <= *k; ++l) {
temp += A(l,i) * B(j,l);
}
if (*beta == 0.) {
C(i,j) = *alpha * temp;
} else {
C(i,j) = *alpha * temp + *beta * C(i,j);
}
}
}
}
}
return 0;
#undef A
#undef B
#undef C
}
#undef max
#undef min
#undef abs
#ifdef __cplusplus
}
#endif