[BACK]Return to gsl.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

File: [local] / OpenXM / src / asir-contrib / packages / src / gsl.rr (download)

Revision 1.2, Wed Oct 23 07:28:11 2019 UTC (4 years, 7 months ago) by takayama
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +14 -12 lines

Fixed a bug.

/*$OpenXM: OpenXM/src/asir-contrib/packages/src/gsl.rr,v 1.2 2019/10/23 07:28:11 takayama Exp $ */

module gsl;

/* ------------ list of local functions ---------- */
localf init_gsl_proc$
localf which_ox_gsl$
localf get_gsl_proc$
localf set_gsl_proc$
localf find_proc$
localf start$
localf start_unix$
localf start_windows$

localf integration_qags$
localf test1$
localf to_double$
localf eigen_nonsymmv$
localf test2$
localf list_to_complex$
/*  ------------ static variables ---------------- */
static GSL_proc$
def init_gsl_proc() {
  GSL_proc = -1$
}

/* Functions to get and set static variables out of the module */
def get_gsl_proc() {
  return GSL_proc;
}

def set_gsl_proc(A) {
  GSL_proc = A;
}

#define    GSL_FIND_PROC(P)  P = getopt(proc);\
                          if (type(P) == -1) {\
                             P = find_proc();\
                          }

def which_ox_gsl() {
  L = ox_get_serverinfo();
  for (I=0; I<length(L); I++) {  
    if (base_position("ox_gsl",L[I][1][0])>0) return L[I][0];
  }
  return -1;
}

def find_proc() {
  /*! extern GSL_proc; */
  if (GSL_proc == -1) {
     GSL_proc = which_ox_gsl();
     if (GSL_proc < 0) GSL_proc = start();
  }
  return(GSL_proc);
}
/* Search : oxPrintMessage, see cmoDebugCMO, too. */
/************** end of configure *******************************/

def start() {
  extern Xm_unix;
  if (ox_ostype()[0] == "windows" && Xm_unix == 0)
    return start_windows(0);
  else
    return start_unix();
}

def start_unix() {
 extern Xm_noX;
 if (Xm_noX) {
   P = ox_launch_nox(0,getenv("OpenXM_HOME")+"/src/ox_gsl/ox_gsl");
 }else{
   P = ox_launch(0,getenv("OpenXM_HOME")+"/src/ox_gsl/ox_gsl");
 }
// ox_check_errors(P);  //workaround to avoid mathcap error.
 GSL_proc = P;
 return(P);
}

def start_windows(U) {
  error("Not implemeted.");
}

def integration_qags(F,Low,Top) {
  GSL_FIND_PROC(Pid);
  ox_cmo_rpc(Pid,"gsl_integration_qags",F,deval(Low*1.0),deval(Top*1.0));
  Ans=ox_pop_cmo(Pid);
  return Ans;
}
def test1() {
  integration_qags(quote(log(x)/x^(1/2)),0.01,1);
}

def list_to_complex(L,Level) {
  if (type(L)<4) return L;
  if (Level == 0) return L[0]+@i*L[1];
  if (Level >= 1) return map(list_to_complex,L,Level-1);
}
def to_double(L) {
  if (L==0) return(0.0);
  if (type(L)<4) return(deval(1.0*L));
  return map(to_double,L);
}
def eigen_nonsymmv(Mat) {
  GSL_FIND_PROC(Pid);
  Mat_double = matrix_list_to_matrix(Mat);
  M=size(Mat_double)[0]; N=size(Mat_double)[1];
  if (M != N) error("eigen_nonsymmv accepts only square matrix.");
  Mat_double=to_double(Mat_double);
  print(Mat_double);
  ox_cmo_rpc(Pid,"gsl_eigen_nonsymmv",base_flatten(Mat_double));
  Ans2=ox_pop_cmo(Pid);
  Ans1=ox_pop_cmo(Pid);
  return [list_to_complex(Ans1,1),list_to_complex(Ans2,2)];
}
def test2() {
  M=[[6.79502,-43.2617,20.7214,0,0,0],[12.7671,-67.4408,21.0846,0,0,0],[45.5035,-358.137,226.992,0,0,0],[0,0,0,6.79502,-43.2617,20.7214],[0,0,0,12.7671,-67.4408,21.0846],[0,0,0,45.5035,-358.137,226.992]];
  // M=[[1,0],[2,3]];
  M = matrix_list_to_matrix(M);
  Ans=eigen_nonsymmv(M);
  N = size(M)[0];
  printf("eigenvalues=%a\neigenvectors=%a\n",Ans[0],Ans[1]);
  for (I=0; I<N; I++) {
    printf("Is it zero? %a\n",(M-Ans[0][I]*matrix_identity_matrix(N))*matrix_list_to_matrix(Ans[1][I]));
  }
  return Ans;
}

endmodule;

gsl.init_gsl_proc()$

end$