#include <string.h>
#include "../stack-c.h"
#include "../graphics/Math.h" /* Abs */
#include "matdsr.h"
#if WIN32
#include "../os_specific/win_mem_alloc.h"
extern char *GetExceptionString(DWORD ExceptionCode);
#endif
static integer cx1 = 1;
static integer cx0 = 0;
static double c_b40 = 0.;
/*--------------------------------------------------
* [Ab [,X [,bs]]]=bdiag(A [,rMax])
*--------------------------------------------------*/
int C2F(intbdiagr)(char *fname, long unsigned int fname_len)
{
integer ix1, ix2;
double dx1;
int fail;
double rMax;
integer ix, j, k, m, n;
double t;
integer nbloc, lrMax;
integer m1, n1, la, le, lj, it;
integer lw, lx ;
integer lai, lib, lbs, lxi, lxr;
CheckRhs(1,2);
CheckLhs(1,3);
GetRhsCVar(1, "d", &it, &m, &n, &la, &lai);
CheckSquare(1,m,n);
if (n == 0) {
CreateVar(2, "d", &cx0, &cx0, &lx);
CreateVar(3, "d", &cx0, &cx0, &lbs);
LhsVar(1) = 1;
LhsVar(2) = 2;
LhsVar(3) = 3;
return 0;
}
ix1 = (it + 1) * m * n;
if (C2F(vfinite)(&ix1, stk(la )) == 0) {
Err = 1;
Error(264);
return 0;
}
if (Rhs == 2) {
GetRhsVar(2, "d", &n1, &m1, &lrMax);
CheckScalar(2,n1,m1);
rMax = *stk(lrMax );
} else {
rMax = 1.;
lj = la - 1;
ix1 = n;
for (j = 1; j <= ix1; ++j) {
t = 0.;
ix2 = n;
for (ix = 1; ix <= ix2; ++ix) {
t += (dx1 = *stk(lj + ix ), Abs(dx1));
}
if (t > rMax) {
rMax = t;
}
lj += n;
}
}
CreateCVar(2, "d", &it, &n, &n, &lxr, &lxi);
ix1 = n << 1;
CreateVar(3, "d", &cx1, &ix1, &le);
CreateVar(4, "i", &cx1, &n, &lib);
CreateVar(5, "d", &cx1, &n, &lw);
if (it == 0) {
/* subroutine bdiag(lda,n,a,epsshr,rMax,er,ei,bs,x,xi,scale,job,fail) */
C2F(bdiag)(&n, &n, stk(la ), &c_b40, &rMax, stk(le ), stk(le + n ),
istk(lib ), stk(lxr ), stk(lxi ), stk(lw ), &cx0, &fail);
} else {
C2F(wbdiag)(&n, &n, stk(la ), stk(la + n * n ), &rMax, stk(le ),
stk(le + n ), istk(lib ), stk(lxr ), stk(lxi ), &t, &t, stk(lw ), &cx0, &fail);
}
if (fail) {
Scierror(24,"%s: Non convergence in QR steps.\r\n",fname);
return 0;
}
if (Lhs == 3) {
nbloc = 0;
for (k = 1; k <= n; ++k)
if (*istk(lib + k - 2 +1) >= 0) ++nbloc;
CreateVar(6, "d", &nbloc, &cx1, &lbs);
ix = 0;
for (k = 1; k <= n; ++k) {
if (*istk(lib + k - 2 +1) >= 0) {
*stk(lbs + ix ) = (double) *istk(lib + k - 2 +1);
++ix;
}
}
}
LhsVar(1) = 1;
LhsVar(2) = 2;
LhsVar(3) = 6;
return 0;
} /* intbdiagr_ */
/*-------------------------------------------------------
* matdsr table
*-------------------------------------------------------*/
typedef int (*des_interf) __PARAMS((char *fname,unsigned long l));
static int C2F(intvoid) (char *fname,unsigned long l) {return 0;}
typedef struct table_struct {
des_interf f; /** function **/
char *name; /** its name **/
} LapackTable;
static LapackTable Tab[]={
{C2F(inthess),"hess"},
{C2F(intschur),"schur"},
{C2F(inteig),"spec"},
{C2F(intbdiagr),"bdiag"},
{C2F(intvoid),"xxxx"},
{C2F(intbalanc),"balanc"}
};
int C2F(matdsr)(void)
{
Rhs = Max(0, Rhs);
#if WIN32
#ifndef _DEBUG
_try
{
(*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
}
_except (EXCEPTION_EXECUTE_HANDLER)
{
char *ExceptionString=GetExceptionString(GetExceptionCode());
sciprint("Warning !!!\nScilab has found a critical error (%s)\nwith \"%s\" function.\nScilab may become unstable.\n",ExceptionString,Tab[Fin-1].name);
if (ExceptionString) {FREE(ExceptionString);ExceptionString=NULL;}
}
#else
(*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
#endif
#else
(*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
#endif
C2F(putlhsvar)();
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1