diff options
Diffstat (limited to 'src/eigenvalues.cpp')
| -rw-r--r-- | src/eigenvalues.cpp | 156 | 
1 files changed, 156 insertions, 0 deletions
| diff --git a/src/eigenvalues.cpp b/src/eigenvalues.cpp new file mode 100644 index 0000000..c812d0f --- /dev/null +++ b/src/eigenvalues.cpp @@ -0,0 +1,156 @@ +/* eigenvalues.cpp + * + * Copyright (C) 2013 Jaron Kent-Dobias + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *  + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + *  + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* This program allows for the generalized eigenvalues of a modulated domain to + * be computed and returned. + */ + +#include "domain_energy.h" +#include "domain_eigen.h" + +#include <unistd.h> +#include <stdio.h> +#include <iostream> +#include <stdlib.h> +#include <math.h> +#include <string> + +// GSL includes. +#include <gsl/gsl_sf.h> +#include <gsl/gsl_math.h> +#include <gsl/gsl_complex.h> +#include <gsl/gsl_complex_math.h> +#include <gsl/gsl_vector.h> +#include <gsl/gsl_permutation.h> +#include <gsl/gsl_permute_vector.h> +#include <gsl/gsl_blas.h> +#include <gsl/gsl_linalg.h> +#include <gsl/gsl_sort_vector.h> + + + +// Initializes the program. +int main(int argc, char *argv[]) { + +	int opt, min_fails, eigen_follow, eigen_num, examining; +	unsigned n, N, ord, size, params, j, M; +	double d, c, dc0, dc, g0, g, eigen_thres, approach_thres, eps, eps2, state, old_state, h, bound; +	char *in_filename, *out_filename, *k_filename, *a_filename, *phi_filename, str[19], in; +	bool subcrit, reset, rand, verbose, fixed; + +	// Setting default values. + +	gsl_vector *z, *k, *a, *phi, *old_z, *eigenvalues; +	gsl_permutation *eigenorder; +	gsl_matrix *hess; +	rand = false; +	fixed = false; +	verbose = false; +	N=25; + +	while ((opt = getopt(argc, argv, "n:c:i:o:O:K:A:P:e:g:N:b:rvd:M:f")) != -1) { +		switch (opt) { +			case 'n': +				n = atoi(optarg); +				break; +			case 'c': +				c = atof(optarg); +				break; +			case 'i': +				in_filename = optarg; +				break; +			case 'O': +				ord = atoi(optarg); +				break; +			case 'K': +				k_filename = optarg; +				break; +			case 'A': +				a_filename = optarg; +				break; +			case 'P': +				phi_filename = optarg; +				break; +			case 'N': +				N = atoi(optarg); +				break; +			case 'r': +				rand = true; +				break; +			case 'f': +				fixed = true; +				break; +			default: +				exit(EXIT_FAILURE); +		} +	} + +	if (rand || !fixed) { +		size = 3 * n + 2; +		params = 2 * n + 1; +	} else { +		size = 3 * n + 3; +		params = 2 * n; +	} + +	z = gsl_vector_alloc(size); +	eigenvalues = gsl_vector_alloc(size); +	eigenorder = gsl_permutation_alloc(size); +	hess = gsl_matrix_alloc(size, size); +	if (rand) { +		k = gsl_vector_alloc(2 * ord); +		a = gsl_vector_alloc(ord); +		phi = gsl_vector_alloc(ord); +	} + +	FILE *in_file = fopen(in_filename, "r"); +	gsl_vector_fscanf(in_file, z); +	fclose(in_file); + +	if (rand) { +		FILE *k_file = fopen(k_filename, "r"); +		gsl_vector_fscanf(k_file, k); +		fclose(k_file); + +		FILE *a_file = fopen(a_filename, "r"); +		gsl_vector_fscanf(a_file, a); +		fclose(a_file); + +		FILE *phi_file = fopen(phi_filename, "r"); +		gsl_vector_fscanf(phi_file, phi); +		fclose(phi_file); +	} + +	if (rand) domain_energy_nakedRandHessian(hess, n, z, c, ord, k, a, phi); +	else { +		if (fixed) domain_energy_fixedHessian(hess, n, z, c); +		else domain_energy_nakedHessian(hess, n, z, c); +	} + +	domain_eigen_values(eigenvalues, size, params, hess); +	domain_eigen_sort(eigenorder, size, N, eigenvalues); + +	for (unsigned i = 0; i < N; i++) { +		printf("%e\t", gsl_vector_get(eigenvalues, gsl_permutation_get(eigenorder, i))); +	} +	printf("\n"); + +	gsl_vector_free(z); + + +} | 
