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() */
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() */
/** * 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 }
/* 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; }