some triangle limit set experiments

This commit is contained in:
Florian Stecker 2018-03-02 17:52:48 +01:00
parent 386387569b
commit 676d12abd2
5 changed files with 50 additions and 13 deletions

View File

@ -7,19 +7,31 @@ SPECIAL_OPTIONS=-O0 -g -D_DEBUG
OPTIONS=-m64 -march=native -mtune=native -std=gnu99 -D_GNU_SOURCE $(SPECIAL_OPTIONS) OPTIONS=-m64 -march=native -mtune=native -std=gnu99 -D_GNU_SOURCE $(SPECIAL_OPTIONS)
all: triangle_group all: triangle_group element_path limit_set
triangle_group: triangle.o linalg.o main.o triangle_group: triangle.o linalg.o main.o
gcc $(OPTIONS) -o triangle_group triangle.o linalg.o main.o -lm -lgsl -lcblas gcc $(OPTIONS) -o triangle_group triangle.o linalg.o main.o -lm -lgsl -lcblas
element_path: element_path.o linalg.o
gcc $(OPTIONS) -o element_path element_path.o linalg.o -lm -lgsl -lcblas
limit_set: limit_set.o linalg.o triangle.o
gcc $(OPTIONS) -o limit_set limit_set.o linalg.o triangle.o -lm -lgsl -lcblas
main.o: main.c $(HEADERS) main.o: main.c $(HEADERS)
gcc $(OPTIONS) -c main.c gcc $(OPTIONS) -c main.c
element_path.o: element_path.c $(HEADERS)
gcc $(OPTIONS) -c element_path.c
linalg.o: linalg.c $(HEADERS) linalg.o: linalg.c $(HEADERS)
gcc $(OPTIONS) -c linalg.c gcc $(OPTIONS) -c linalg.c
triangle.o: triangle.c $(HEADERS) triangle.o: triangle.c $(HEADERS)
gcc $(OPTIONS) -c triangle.c gcc $(OPTIONS) -c triangle.c
limit_set.o: limit_set.c $(HEADERS)
gcc $(OPTIONS) -c limit_set.c
clean: clean:
rm -f triangle_group triangle.o linalg.o main.o rm -f triangle_group element_path limit_set triangle.o linalg.o main.o element_path.o limit_set.o

View File

@ -136,3 +136,27 @@ void jordan_calc(gsl_matrix *g, double *mu, workspace_t *ws)
mu[i] = log(GSL_REAL(gsl_vector_complex_get(ws->eval_complex, i)) / GSL_REAL(gsl_vector_complex_get(ws->eval_complex, i+1))); mu[i] = log(GSL_REAL(gsl_vector_complex_get(ws->eval_complex, i)) / GSL_REAL(gsl_vector_complex_get(ws->eval_complex, i+1)));
} }
} }
void eigenvectors(gsl_matrix *g, gsl_matrix *evec_real, workspace_t *ws)
{
gsl_eigen_nonsymmv_params(0, ws->work_nonsymmv);
int r = gsl_eigen_nonsymmv(g, ws->eval_complex, ws->evec_complex, ws->work_nonsymmv);
ERROR(r, "gsl_eigen_nonsymmv failed!\n");
gsl_eigen_nonsymmv_sort(ws->eval_complex, ws->evec_complex, GSL_EIGEN_SORT_ABS_DESC);
int real = 1;
for(int i = 0; i < 3; i++)
if(FCMP(GSL_IMAG(gsl_vector_complex_get(ws->eval_complex, i)), 0) != 0)
real = 0;
if(!real) {
printf("We have non-real eigenvalues!\n");
exit(1);
}
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
gsl_matrix_set(evec_real, i, j, GSL_REAL(gsl_matrix_complex_get(ws->evec_complex, i, j)));
}

View File

@ -36,5 +36,6 @@ void rotation_matrix(gsl_matrix *g, double *vector);
void jordan_calc(gsl_matrix *g, double *mu, workspace_t *ws); void jordan_calc(gsl_matrix *g, double *mu, workspace_t *ws);
double trace(gsl_matrix *g); double trace(gsl_matrix *g);
double determinant(gsl_matrix *g, workspace_t *ws); double determinant(gsl_matrix *g, workspace_t *ws);
void eigenvectors(gsl_matrix *g, gsl_matrix *evec, workspace_t *ws);
#endif #endif

16
main.c
View File

@ -1,7 +1,7 @@
#include "triangle.h" #include "triangle.h"
#include "linalg.h" #include "linalg.h"
#define MAX_ELEMENTS 20000 #define MAX_ELEMENTS 10000
void initialize_triangle_generators(gsl_matrix **gen, double a1, double a2, double a3, double s) void initialize_triangle_generators(gsl_matrix **gen, double a1, double a2, double a3, double s)
{ {
@ -9,15 +9,15 @@ void initialize_triangle_generators(gsl_matrix **gen, double a1, double a2, doub
gsl_matrix_set_identity(gen[i]); gsl_matrix_set_identity(gen[i]);
gsl_matrix_set(gen[0], 0, 0, -1); gsl_matrix_set(gen[0], 0, 0, -1);
gsl_matrix_set(gen[0], 1, 0, 2*s*cos(M_PI*a1)); gsl_matrix_set(gen[0], 0, 1, 2*s*cos(M_PI*a1));
gsl_matrix_set(gen[0], 2, 0, 2/s*cos(M_PI*a2)); gsl_matrix_set(gen[0], 0, 2, 2/s*cos(M_PI*a2));
gsl_matrix_set(gen[1], 0, 1, 2/s*cos(M_PI*a1)); gsl_matrix_set(gen[1], 1, 0, 2/s*cos(M_PI*a1));
gsl_matrix_set(gen[1], 1, 1, -1); gsl_matrix_set(gen[1], 1, 1, -1);
gsl_matrix_set(gen[1], 2, 1, 2*s*cos(M_PI*a3)); gsl_matrix_set(gen[1], 1, 2, 2*s*cos(M_PI*a3));
gsl_matrix_set(gen[2], 0, 2, 2*s*cos(M_PI*a2)); gsl_matrix_set(gen[2], 2, 0, 2*s*cos(M_PI*a2));
gsl_matrix_set(gen[2], 1, 2, 2/s*cos(M_PI*a3)); gsl_matrix_set(gen[2], 2, 1, 2/s*cos(M_PI*a3));
gsl_matrix_set(gen[2], 2, 2, -1); gsl_matrix_set(gen[2], 2, 2, -1);
} }
@ -64,7 +64,7 @@ int main(int argc, char *argv[])
// the real action // the real action
generate_triangle_group(group, MAX_ELEMENTS, 5, 9, 7); generate_triangle_group(group, MAX_ELEMENTS, 5, 9, 7);
// initialize_triangle_generators(gen, 1.0/5, 1.0/5, 1.0/5, 1.0); // Fuchsian // initialize_triangle_generators(gen, 1.0/5, 1.0/5, 1.0/5, 1.0); // Fuchsian
initialize_triangle_generators(gen, 3.0/5.0, 3.0/5.0, 3.0/5.0, atof(argv[1])); initialize_triangle_generators(gen, 2.0/5.0, 2.0/5.0, 2.0/5.0, atof(argv[1]));
gsl_matrix_set_identity(matrices[0]); gsl_matrix_set_identity(matrices[0]);
for(int i = 1; i < MAX_ELEMENTS; i++) for(int i = 1; i < MAX_ELEMENTS; i++)

View File

@ -1,5 +1,5 @@
#if(!exists("param")) param = log(0.3810364354550512) #if(!exists("param")) param = log(0.3810364354550512)
if(!exists("param")) param = log(2.624420939708161) if(!exists("param")) param = log(2.764)
print sprintf("param = %f", exp(param)) print sprintf("param = %f", exp(param))
file = sprintf("< ./triangle_group %f", exp(param)) file = sprintf("< ./triangle_group %f", exp(param))
@ -11,10 +11,10 @@ set yrange [0:20]
set grid set grid
set parametric set parametric
plot file using 2:3 w p pt 7 ps 1 lc 1 t "" plot file using 2:3 w p pt 7 ps 0.5 lc 1 t ""
pause mouse keypress pause mouse keypress
if(MOUSE_KEY == 60) param=param-0.02 if(MOUSE_KEY == 60) param=param-0.02
if(MOUSE_KEY == 62) param=param+0.02 if(MOUSE_KEY == 62) param=param+0.02
if(MOUSE_KEY == 13) param=0 if(MOUSE_KEY == 13) param=log(2.764)
if(MOUSE_KEY != 113) reread if(MOUSE_KEY != 113) reread