Esempio n. 1
0
File: test.c Progetto: lemahdi/mglib
test_eigen_gen_workspace *
test_eigen_gen_alloc(const size_t n)
{
  test_eigen_gen_workspace *w;

  w = (test_eigen_gen_workspace *) calloc(1, sizeof(test_eigen_gen_workspace));

  w->A = gsl_matrix_alloc(n, n);
  w->B = gsl_matrix_alloc(n, n);
  w->alpha = gsl_vector_complex_alloc(n);
  w->beta = gsl_vector_alloc(n);
  w->alphav = gsl_vector_complex_alloc(n);
  w->betav = gsl_vector_alloc(n);
  w->eval = gsl_vector_complex_alloc(n);
  w->evalv = gsl_vector_complex_alloc(n);
  w->x = gsl_vector_alloc(n);
  w->y = gsl_vector_alloc(n);
  w->Q = gsl_matrix_alloc(n, n);
  w->Z = gsl_matrix_alloc(n, n);
  w->evec = gsl_matrix_complex_alloc(n, n);
  w->gen_p = gsl_eigen_gen_alloc(n);
  w->genv_p = gsl_eigen_genv_alloc(n);

  return (w);
} /* test_eigen_gen_alloc() */
Esempio n. 2
0
gen_workspace *
gen_alloc(size_t n, int compute_schur)
{
  gen_workspace *w;

  w = (gen_workspace *) calloc(1, sizeof(gen_workspace));

  w->gen_p = gsl_eigen_gen_alloc(n);

  w->A = gsl_matrix_alloc(n, n);
  w->B = gsl_matrix_alloc(n, n);
  w->alpha = gsl_vector_complex_alloc(n);
  w->beta = gsl_vector_alloc(n);
  w->evals = gsl_vector_complex_alloc(n);
  w->compute_schur = compute_schur;

  if (compute_schur)
    {
      w->Q = gsl_matrix_alloc(n, n);
      w->Z = gsl_matrix_alloc(n, n);
      gsl_eigen_gen_params(1, 1, 0, w->gen_p);
    }

  return (w);
} /* gen_alloc() */
Esempio n. 3
0
      /**
       * The default constructor creates a new gen_workspace with n elements
       * @param n The number of elements in the gen_workspace
       */
      explicit gen_workspace( size_t const n ){
	ccgsl_pointer = gsl_eigen_gen_alloc( n );
	// just plausibly we could allocate gen_workspace but not count
	try { count = new size_t; } catch( std::bad_alloc& e ){
	  // try to tidy up before rethrowing
	  gsl_eigen_gen_free( ccgsl_pointer );
	  throw e;
	}
	*count = 1; // initially there is just one reference to ccgsl_pointer
      }
Esempio n. 4
0
/* Uses the GSL library to solve the GEVP */
int gevp(const double **a0, const double **a1, double *ev, int ms){
	int i,j;
	gsl_set_error_handler_off();
	gsl_matrix *c0 = gsl_matrix_alloc(ms,ms);
	gsl_matrix *c1 = gsl_matrix_alloc(ms,ms);
	for (i = 0; i < ms; i++) {
		for (j = 0; j < ms; j++) {
			gsl_matrix_set(c0, i, j, a0[i][j]);
			gsl_matrix_set(c1, i, j, a1[i][j]);
		}
	}
	/* Run GEVP */
	gsl_eigen_gen_workspace *gevp_ws = gsl_eigen_gen_alloc(ms);
	gsl_vector_complex *al = gsl_vector_complex_alloc(ms);
	gsl_vector *be = gsl_vector_alloc(ms);
	int err = gsl_eigen_gen(c1, c0, al, be, gevp_ws);
	if (err) {
		fprintf(stderr, "GEVP had errors.\n");
		return err;
	}
	/* Sort into descending order */
	gsl_vector *evs = gsl_vector_alloc(ms);
	for (i = 0; i < ms; i++) {
		gsl_complex q = gsl_vector_complex_get(al,i);
		double w = gsl_vector_get(be,i);
		if (w == 0)
			gsl_vector_set(evs,i,0);
		else
			gsl_vector_set(evs,i,GSL_REAL(q)/w);
	}
	gsl_sort_vector(evs);
	for (i = 0; i < ms; i++) {
		ev[i] = gsl_vector_get(evs,ms-i-1);
	}
	/* Clean up */
	gsl_matrix_free(c0);
	gsl_matrix_free(c1);
	gsl_vector_complex_free(al);
	gsl_vector_free(be);
	gsl_vector_free(evs);
	gsl_eigen_gen_free(gevp_ws);
	return 0;
}