#include <stdio.h>
#include "f2c.h"
int f2c_dgemm_(char *transa, char *transb, integer *m, integer *
n, integer *k, doublereal *alpha, doublereal *a, integer *lda,
doublereal *b, integer *ldb, doublereal *beta, doublereal *c, integer
*ldc)
{
integer info;
logical nota, notb;
doublereal temp;
integer i, j, l;
extern logical f2c_lsame_(char *, char *);
integer nrowa, nrowb;
extern int f2c_xerbla_(char *, integer *);
#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 = f2c_lsame_(transa, "N");
notb = f2c_lsame_(transb, "N");
if (nota) {
nrowa = *m;
} else {
nrowa = *k;
}
if (notb) {
nrowb = *k;
} else {
nrowb = *n;
}
info = 0;
if (! nota && ! f2c_lsame_(transa, "C") && ! f2c_lsame_(transa, "T")) {
info = 1;
} else if (! notb && ! f2c_lsame_(transb, "C") && ! f2c_lsame_(transb,
"T")) {
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) {
f2c_xerbla_("DGEMM ", &info);
return 0;
}
if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
return 0;
}
if (*alpha == 0.) {
if (*beta == 0.) {
for (j = 1; j <= *n; ++j) {
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
}
} else {
for (j = 1; j <= *n; ++j) {
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
}
return 0;
}
if (notb) {
if (nota) {
for (j = 1; j <= *n; ++j) {
if (*beta == 0.) {
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
} else if (*beta != 1.) {
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
for (l = 1; l <= *k; ++l) {
if (B(l,j) != 0.) {
temp = *alpha * B(l,j);
for (i = 1; i <= *m; ++i) {
C(i,j) += temp * A(i,l);
}
}
}
}
} else {
for (j = 1; j <= *n; ++j) {
for (i = 1; i <= *m; ++i) {
temp = 0.;
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) {
for (j = 1; j <= *n; ++j) {
if (*beta == 0.) {
for (i = 1; i <= *m; ++i) {
C(i,j) = 0.;
}
} else if (*beta != 1.) {
for (i = 1; i <= *m; ++i) {
C(i,j) = *beta * C(i,j);
}
}
for (l = 1; l <= *k; ++l) {
if (B(j,l) != 0.) {
temp = *alpha * B(j,l);
for (i = 1; i <= *m; ++i) {
C(i,j) += temp * A(i,l);
}
}
}
}
} else {
for (j = 1; j <= *n; ++j) {
for (i = 1; i <= *m; ++i) {
temp = 0.;
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;
}
#include "f2c.h"
logical f2c_lsame_(char *ca, char *cb)
{
logical ret_val;
static 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;
}
#include "f2c.h"
int f2c_xerbla_(char *srname, integer *info)
{
printf("** On entry to %6s, parameter number %2i had an illegal value\n",
srname, *info);
return 0;
}