00001 #include "stack-c.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010 #define MAX(x,y) (((x)>(y))?(x):(y))
00011 #define MIN(x,y) (((x)<(y))?(x):(y))
00012
00013 #ifdef WIN32
00014 int select()
00015 {
00016 return 1;
00017 }
00018 #endif
00019
00020 int intdgeesx(fname)
00021 char* fname;
00022 {
00023 int A = 1, W = 2, VS = 3, WORK;
00024 int M, N, lA, lVS;
00025 int NLHS, it=1;
00026 int un=1, lWORK, LWORKMIN, LWORK, IWORK, LIWORK;
00027 int LDA, LDVS, lWR, lWI;
00028 int INFO, SDIM, BWORK;
00029 double RCONDE,RCONDV;
00030 char *JOBVS, *SORT, *SENSE;
00031
00032 #ifndef WIN32
00033 extern select();
00034 #endif
00035
00036 CheckRhs(1,1) ;
00037 CheckLhs(1,3) ;
00038
00039
00040 GetRhsVar(A, "d", &M, &N, &lA);
00041 CheckSquare(A, M, N);
00042
00043
00044 CreateCVar(W, "d", &it, &N, &un, &lWR, &lWI);
00045
00046 NLHS=Lhs;
00047 LDA = MAX(1,N);
00048 LDVS=MAX(1,N);
00049 SORT="N";
00050 SENSE="N";
00051
00052 switch ( NLHS ){
00053 case 3:
00054 case 2:
00055 printf("== 2 ==\r\n");
00056 JOBVS="V";
00057
00058 CreateVar(VS, "d", &N, &N, &lVS);
00059
00060 WORK=4; LWORKMIN = MAX(1, 3*N);
00061 LWORK=Maxvol(WORK,"d");
00062 if (LWORK < LWORKMIN) Scierror(999,"%s: not enough memory (use stacksize) \r\n",fname);
00063
00064 LIWORK = 1;
00065
00066 CreateVar(WORK, "d", &LWORK, &un, &lWORK);
00067 C2F(dgeesx)(JOBVS, SORT, select, SENSE, &N, stk(lA), &LDA, &SDIM,
00068 stk(lWR), stk(lWI),
00069 stk(lVS), &LDVS, &RCONDE, &RCONDV, stk(lWORK),
00070 &LWORK, &IWORK, &LIWORK, BWORK, &INFO);
00071
00072 if (INFO != 0) Errorinfo("DGEESX ", INFO);
00073 LhsVar(1)=W; LhsVar(2)=VS; LhsVar(3)=A;
00074 break;
00075 case 1:
00076 JOBVS="N";
00077
00078 WORK=3; LWORKMIN = MAX(1, 3*N);
00079 LWORK=Maxvol(WORK, "d");
00080 if (LWORK < LWORKMIN) Scierror(999,"%s: not enough memory (use stacksize) \r\n",fname);
00081 CreateVar(WORK, "d", &LWORK, &un, &lWORK);
00082
00083 C2F(dgeesx)(JOBVS, SORT, select, SENSE, &N, stk(lA), &LDA, &SDIM,
00084 stk(lWR), stk(lWI),
00085 VS, &LDVS, &RCONDE, &RCONDV, stk(lWORK),
00086 &LWORK, IWORK, LIWORK, BWORK, &INFO);
00087 if (INFO != 0) Errorinfo("DGEESX ", INFO);
00088 LhsVar(1)=W;
00089 break;
00090 default:
00091 return 0;
00092 }
00093
00094 return 0;
00095 }