00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "UblasCustomFunctions.hpp"
00031
00032
00033 c_vector<double, 1> Create_c_vector(double x)
00034 {
00035 c_vector<double, 1> v;
00036 v[0] = x;
00037 return v;
00038 }
00039
00040 c_vector<double, 2> Create_c_vector(double x, double y)
00041 {
00042 c_vector<double, 2> v;
00043 v[0] = x;
00044 v[1] = y;
00045 return v;
00046 }
00047
00048 c_vector<double, 3> Create_c_vector(double x, double y, double z)
00049 {
00050 c_vector<double, 3> v;
00051 v[0] = x;
00052 v[1] = y;
00053 v[2] = z;
00054 return v;
00055 }
00056
00057 c_vector<double,3> CalculateEigenvectorForSmallestNonzeroEigenvalue(c_matrix<double,3,3> &A)
00058 {
00059 int info;
00060 c_vector<double, 3 > eigenvalues_real_part;
00061 c_vector<double, 3 > eigenvalues_imaginary_part;
00062 c_vector<double, 4*3 > workspace;
00063 c_matrix<double, 3, 3> right_eigenvalues;
00064
00065 char dont_compute_left_evectors = 'N';
00066 char compute_right_evectors = 'V';
00067
00068 int matrix_size = 3;
00069 int matrix_ld = matrix_size;
00070 int workspace_size = 4*matrix_size;
00071
00072 c_matrix<double, 3, 3> a_transpose;
00073 noalias(a_transpose) = trans(A);
00074
00075
00076 LAPACKgeev_(&dont_compute_left_evectors, &compute_right_evectors,
00077 &matrix_size, a_transpose.data(),&matrix_ld,
00078 eigenvalues_real_part.data(), eigenvalues_imaginary_part.data(),
00079 NULL, &matrix_ld,
00080 right_eigenvalues.data(),&matrix_ld,
00081 workspace.data(),&workspace_size,
00082 &info);
00083 assert(info==0);
00084
00085
00086 assert(norm_2(eigenvalues_imaginary_part) == 0.0);
00087
00088 unsigned index_of_smallest=UINT_MAX;
00089 double min_eigenvalue = DBL_MAX;
00090
00091 for (unsigned i=0; i<3; i++)
00092 {
00093 double eigen_magnitude = fabs(eigenvalues_real_part(i));
00094 if (eigen_magnitude < DBL_EPSILON)
00095 {
00096
00097 continue;
00098 }
00099 if (eigen_magnitude < min_eigenvalue)
00100 {
00101 min_eigenvalue = eigen_magnitude;
00102 index_of_smallest = i;
00103 }
00104 }
00105 assert (min_eigenvalue != DBL_MAX);
00106 assert (index_of_smallest != UINT_MAX);
00107 assert (min_eigenvalue >= DBL_EPSILON);
00108
00109 c_vector<double, 3> output;
00110 output(0) = right_eigenvalues(index_of_smallest,0);
00111 output(1) = right_eigenvalues(index_of_smallest,1);
00112 output(2) = right_eigenvalues(index_of_smallest,2);
00113
00114 return output;
00115
00116 }