Пример #1
0
      /**
       * The destructor only deletes the pointers if count reaches zero.
       */
      ~gen_workspace(){
	if( count == 0 or --*count == 0 ){
	  // could have allocated null pointer
	  if( ccgsl_pointer != 0 ) gsl_eigen_gen_free( ccgsl_pointer );
	  delete count;
	}
      }
Пример #2
0
void
gen_free(gen_workspace *w)
{
  if (w->gen_p)
    gsl_eigen_gen_free(w->gen_p);

  if (w->A)
    gsl_matrix_free(w->A);

  if (w->B)
    gsl_matrix_free(w->B);

  if (w->alpha)
    gsl_vector_complex_free(w->alpha);

  if (w->beta)
    gsl_vector_free(w->beta);

  if (w->evals)
    gsl_vector_complex_free(w->evals);

  if (w->Q)
    gsl_matrix_free(w->Q);

  if (w->Z)
    gsl_matrix_free(w->Z);

  free(w);
}
Пример #3
0
      /**
       * The assignment operator. This copies elementwise.
       * @param v The gen_workspace to copy
       */
      gen_workspace& operator=( gen_workspace const& v ){
	// first, possibly delete anything pointed to by this
	if( count == 0 or --*count == 0 ){
	  if( ccgsl_pointer != 0 ) gsl_eigen_gen_free( ccgsl_pointer );
	  delete count;
	} // Then copy
	ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this;
      }
Пример #4
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
      }
Пример #5
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;
}
Пример #6
0
void
test_eigen_gen_free(test_eigen_gen_workspace *w)
{
  gsl_matrix_free(w->A);
  gsl_matrix_free(w->B);
  gsl_vector_complex_free(w->alpha);
  gsl_vector_free(w->beta);
  gsl_vector_complex_free(w->alphav);
  gsl_vector_free(w->betav);
  gsl_vector_complex_free(w->eval);
  gsl_vector_complex_free(w->evalv);
  gsl_vector_free(w->x);
  gsl_vector_free(w->y);
  gsl_matrix_free(w->Q);
  gsl_matrix_free(w->Z);
  gsl_matrix_complex_free(w->evec);
  gsl_eigen_gen_free(w->gen_p);
  gsl_eigen_genv_free(w->genv_p);
  free(w);
} /* test_eigen_gen_free() */