File: intdgeesx.c

package info (click to toggle)
scilab 2.6-4
  • links: PTS
  • area: non-free
  • in suites: woody
  • size: 54,632 kB
  • ctags: 40,267
  • sloc: ansic: 267,851; fortran: 166,549; sh: 10,005; makefile: 4,119; tcl: 1,070; cpp: 233; csh: 143; asm: 135; perl: 130; java: 39
file content (75 lines) | stat: -rw-r--r-- 2,549 bytes parent folder | download
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
#include "stack-c.h"
/*     [W,VS,A]=dgeesx(A)      */
/*     [W,VS]=dgeesx(A)      */
/*     [W]=dgeesx(A)      */
/*      SUBROUTINE DGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM,
     $                   WR, WI, VS, LDVS, RCONDE, RCONDV, WORK, LWORK,
     $                   IWORK, LIWORK, BWORK, INFO )   */

#define MAX(x,y)	(((x)>(y))?(x):(y))
#define MIN(x,y)	(((x)<(y))?(x):(y))

int intdgeesx(fname)
     char* fname;
{ 
  int A = 1, W = 2, VS = 3, WORK;
  int M, N, lA, lVS;
  int NLHS, it=1;
  int un=1, lWORK, LWORKMIN, LWORK, IWORK, LIWORK;
  int LDA, LDVS, lWR, lWI;
  int INFO, SDIM, BWORK;
  double RCONDE,RCONDV;
  char *JOBVS, *SORT, *SENSE;
  extern select();

  CheckRhs(1,1) ;  CheckLhs(1,3) ;
  /*--------------------A---------------------------*/
  GetRhsVar(A, "d", &M, &N, &lA);
  CheckSquare(A, M, N);
  /*--------------------W---------------------------*/
  CreateCVar(W, "d", &it, &N, &un, &lWR, &lWI);

  NLHS=Lhs; LDA = MAX(1,N); LDVS=MAX(1,N); SORT="N"; SENSE="N";

  switch ( NLHS ) {
  case 3:     /*      [W,VS,A]=dgeesx(A)    */
  case 2:     /*        [W,VS]=dgeesx(A)    */
    JOBVS="V";
  /*--------------------VS---------------------------*/
    CreateVar(VS, "d", &N, &N, &lVS);
  /*--------------------WORK---------------------------*/
    WORK=4; LWORKMIN = MAX(1, 3*N);
    LWORK=Maxvol(WORK,"d");  /* max memory currently available */
    if (LWORK < LWORKMIN) Scierror(999,"%s:  not enough memory (use stacksize) \r\n",fname);
    CreateVar(WORK, "d", &LWORK, &un, &lWORK);

    C2F(dgeesx)(JOBVS, SORT, select, SENSE, &N, stk(lA), &LDA, &SDIM, 
                stk(lWR), stk(lWI),
                stk(lVS), &LDVS, &RCONDE, &RCONDV, stk(lWORK), 
                &LWORK, IWORK, LIWORK, BWORK, &INFO);
    if (INFO != 0) Errorinfo("DGEESX ", INFO);
    LhsVar(1)=W; LhsVar(2)=VS; LhsVar(3)=A;
    break;
  case 1:   /*  [W]=dgeesx(A)    */
    JOBVS="N";
  /*--------------------WORK---------------------------*/
    WORK=3; LWORKMIN = MAX(1, 3*N);
    LWORK=Maxvol(WORK, "d"); /* max memory currently available */
    if (LWORK < LWORKMIN)  Scierror(999,"%s:  not enough memory (use stacksize) \r\n",fname); 
    CreateVar(WORK, "d", &LWORK, &un, &lWORK);

    C2F(dgeesx)(JOBVS, SORT, select, SENSE, &N, stk(lA), &LDA, &SDIM, 
                stk(lWR), stk(lWI),
                VS, &LDVS, &RCONDE, &RCONDV, stk(lWORK), 
                &LWORK, IWORK, LIWORK, BWORK, &INFO);
    if (INFO != 0) Errorinfo("DGEESX ", INFO);
    LhsVar(1)=W;
    break;
  default:
    return 0;
  }
  return 0;
}