[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38628] branches/soc-2011-avocado/blender: Arpack integration test in Mac and initial attempt to generate eigen value of meshes with Arpack .
shuvro sarker
shuvro05 at gmail.com
Sat Jul 23 08:53:59 CEST 2011
Revision: 38628
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38628
Author: shuvro
Date: 2011-07-23 06:53:56 +0000 (Sat, 23 Jul 2011)
Log Message:
-----------
Arpack integration test in Mac and initial attempt to generate eigen value of meshes with Arpack.
Modified Paths:
--------------
branches/soc-2011-avocado/blender/extern/f2c/CMakeLists.txt
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.h
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.cpp
branches/soc-2011-avocado/blender/intern/autoseam/CMakeLists.txt
branches/soc-2011-avocado/blender/intern/autoseam/dssimp.c
branches/soc-2011-avocado/blender/intern/autoseam/dssimp.h
branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c
Modified: branches/soc-2011-avocado/blender/extern/f2c/CMakeLists.txt
===================================================================
--- branches/soc-2011-avocado/blender/extern/f2c/CMakeLists.txt 2011-07-22 22:11:52 UTC (rev 38627)
+++ branches/soc-2011-avocado/blender/extern/f2c/CMakeLists.txt 2011-07-23 06:53:56 UTC (rev 38628)
@@ -189,5 +189,5 @@
if(WIN32)
add_definitions(-DUSE_CLOCK -DMSDOS -DNO_ONEXIT -DNO_My_ctype -DNO_ISATTY)
endif()
-
+add_definitions(-DNO_My_ctype)
blender_add_lib(extern_f2c "${SRC}" "${INC}" "${INC_SYS}")
\ No newline at end of file
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp 2011-07-22 22:11:52 UTC (rev 38627)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp 2011-07-23 06:53:56 UTC (rev 38628)
@@ -33,16 +33,67 @@
#ifdef WITH_ARPACK
#include "dssimp.h"
+//#include "f2c.h"
+//#include "carpack.h"
#endif
+
#define THRESHOLD_ZERO 0.0005
+#define NUM_EIGEN_VAL 30
+
+#define minimum(a,b) (a <= b) ? a : b;
+
+static integer c__9 = 9;
+static integer c__1 = 1;
+static integer c__256 = 256;
+static integer c__3 = 3;
+
+
+
+extern "C"{
+ int s_copy(char *, char *, ftnlen, ftnlen);
+ integer s_wsle(cilist *), do_lio(integer *, integer *, char *, ftnlen),
+ e_wsle(void);
+ extern doublereal dnrm2_(integer *, doublereal *, integer *);
+ extern int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *);
+ extern int dmout_(integer *, integer *, integer *, doublereal *, integer *, integer *, char *, ftnlen);
+ extern int dsaupd_(integer *, char *, integer *, char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, ftnlen, ftnlen);
+ extern int dseupd_(logical *, char *, logical *, doublereal *, doublereal *, integer *, doublereal *, char *, integer *, char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, ftnlen, ftnlen, ftnlen);
+ int av_(integer *, doublereal *, doublereal *);
+}
+
AutoseamAdjacency::AutoseamAdjacency(int dimension)
{
m_adjacency = MatrixXd::Zero(dimension, dimension);
m_index_map_vector.resize(dimension, -1);
+ mul_vec = Eigen::VectorXd(dimension);
+ matrix_dimension = dimension;
//threshold_value = min_value;
}
+int AutoseamAdjacency:: mul_matrix_vector(int dimension, double *vec, double * result)
+{
+ int i;
+ Eigen::VectorXd output(dimension);
+
+ //printf("the dimesion passed here : %d\n The output values are: \n", dimension);
+
+ for(i = 0; i < dimension; i++){
+ //printf("%lf ", *(vec + i));
+ mul_vec(i) = *(vec + i);
+ }
+
+ output = m_adjacency * mul_vec;
+
+ //pack the values into result
+ for(i = 0; i < dimension; i++){
+ //printf("%lf ", output(i));
+ *(result + i) = output(i);
+ }
+
+ return 0;
+
+}
void AutoseamAdjacency::set(int row, int col, float value)
{
m_adjacency(row, col) = value;
@@ -112,24 +163,265 @@
// return m_adjacency(index1, index1) ? 1 : -1;
//}
+
+/**
+ * The function will calculate eigen values using the functions
+ * of arpack.
+ */
+int AutoseamAdjacency:: calculate_eigen_arpack()
+{
+ #ifdef WITH_ARPACK
+
+ /* System generated locals */
+ integer i__1;
+ doublereal d__1;
+
+ /* Local variables */
+ static doublereal d__[50] /* was [25][2] */; // stores the eigen values
+ static integer j, n;
+ static doublereal v[6400] /* was [256][25] */;
+
+ static doublereal ax[256];
+ static integer nx, ido, ncv, nev;
+ static doublereal tol;
+ static char bmat[1];
+ static integer info;
+ static logical rvec;
+ static integer ierr, mode1;
+
+ static doublereal sigma;
+ static char which[2];
+ static doublereal resid[256];
+ static integer nconv;
+
+ static doublereal workd[768];
+
+ static integer ipntr[11];
+ static doublereal workl[825];
+ static integer iparam[11];
+ static logical select[25];
+
+
+ static integer ishfts, maxitr, lworkl;
+
+ /* Fortran I/O blocks */
+ static cilist io___7 = { 0, 6, 0, 0, 0 };
+ static cilist io___8 = { 0, 6, 0, 0, 0 };
+ static cilist io___9 = { 0, 6, 0, 0, 0 };
+ static cilist io___23 = { 0, 6, 0, 0, 0 };
+ static cilist io___24 = { 0, 6, 0, 0, 0 };
+ static cilist io___25 = { 0, 6, 0, 0, 0 };
+ static cilist io___26 = { 0, 6, 0, 0, 0 };
+ static cilist io___32 = { 0, 6, 0, 0, 0 };
+ static cilist io___33 = { 0, 6, 0, 0, 0 };
+ static cilist io___34 = { 0, 6, 0, 0, 0 };
+ static cilist io___35 = { 0, 6, 0, 0, 0 };
+
+
+ nx = matrix_dimension;
+ //nx = 10;
+ n = nx * nx; // here n is the matrix size
+
+
+ // The number of eigen values we want to calculate
+ // This should be the minimum number between matrix_dimension and NUM_EIGEN_VAL
+ //nev = 4;
+ nev = minimum(matrix_dimension, NUM_EIGEN_VAL);
+ ncv = 20;
+
+
+ *(unsigned char *)bmat = 'I';
+
+ //we are looking for the largest eigen values
+ s_copy(which, "LM", (ftnlen)2, (ftnlen)2);
+
+ if (n > 256) {
+ s_wsle(&io___7);
+ do_lio(&c__9, &c__1, " ERROR with _SSIMP: N is greater than MAXN ", (ftnlen)47);
+ e_wsle();
+ goto L9000;
+ }
+ else if (nev > 10) {
+ s_wsle(&io___8);
+ do_lio(&c__9, &c__1, " ERROR with _SSIMP: NEV is greater than MAXNEV ", (ftnlen)47);
+ e_wsle();
+ goto L9000;
+
+ }
+ else if (ncv > 25) {
+ s_wsle(&io___9);
+ do_lio(&c__9, &c__1, " ERROR with _SSIMP: NCV is greater than MAXNCV ", (ftnlen)47);
+ e_wsle();
+ goto L9000;
+ }
+
+ lworkl = ncv * (ncv + 8);
+ tol = 0.;
+ info = 0;
+ ido = 0;
+
+ ishfts = 1;
+ maxitr = 300;
+ mode1 = 1;
+
+ iparam[0] = ishfts;
+ iparam[2] = maxitr;
+ iparam[6] = mode1;
+
+ // main loop
+ L10:
+
+ /* %---------------------------------------------% */
+ /* | Repeatedly call the routine DSAUPD and take | */
+ /* | actions indicated by parameter IDO until | */
+ /* | either convergence is indicated or maxitr | */
+ /* | has been exceeded. | */
+ /* %---------------------------------------------% */
+
+ dsaupd_(&ido, bmat, &n, which, &nev, &tol, resid, &ncv, v, &c__256, iparam, ipntr, workd, workl, &lworkl, &info, (ftnlen)1, (ftnlen)2);
+
+ if (ido == -1 || ido == 1) {
+ //perform matrix-vector multiplication
+ //av_(&nx, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
+ mul_matrix_vector(nx, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
+ goto L10;
+ }
+
+
+ if (info < 0) {
+
+ // error occured
+ s_wsle(&io___23);
+ do_lio(&c__9, &c__1, " ", (ftnlen)1);
+ e_wsle();
+ s_wsle(&io___24);
+
+ do_lio(&c__9, &c__1, " Error with _saupd, info = ", (ftnlen)27);
+ do_lio(&c__3, &c__1, (char *)&info, (ftnlen)sizeof(integer));
+ e_wsle();
+ s_wsle(&io___25);
+ do_lio(&c__9, &c__1, " Check documentation in _saupd ", (ftnlen)31);
+ e_wsle();
+ s_wsle(&io___26);
+ do_lio(&c__9, &c__1, " ", (ftnlen)1);
+ e_wsle();
+
+ }
+ else {
+
+ // no major error
+ rvec = TRUE_;
+
+ dseupd_(&rvec, "All", select, d__, v, &c__256, &sigma, bmat, &n,
+ which, &nev, &tol, resid, &ncv, v, &c__256, iparam, ipntr,
+ workd, workl, &lworkl, &ierr, (ftnlen)3, (ftnlen)1, (ftnlen)2);
+
+ // Block to print eigen values and eigen vectors
+
+ #ifdef EIGEN_DEBUG_ARPACK
+ {
+ int i,j;
+
+ for(i = 1; i <= matrix_dimension; i++)
+ {
+ printf("eigen value : %f\n", d__[i]);
+ //now the eigen vector
+ printf("The eigen vector %d :\n", i);
+
+ for(j = 0; j < matrix_dimension; j++){
+ printf("%lf ", *(v + i + (25*j) ) );
+ }
+ }
+ }
+ #endif
+
+ // Now we are going to print the eigen values and eigen vectors here.
+
+ /* %----------------------------------------------% */
+ /* | Eigenvalues are returned in the first column | */
+ /* | of the two dimensional array D and the | */
+ /* | corresponding eigenvectors are returned in | */
+ /* | the first NCONV (=IPARAM(5)) columns of the | */
+ /* | two dimensional array V if requested. | */
+ /* | Otherwise, an orthogonal basis for the | */
+ /* | invariant subspace corresponding to the | */
+ /* | eigenvalues in D is returned in V. | */
+ /* %----------------------------------------------% */
+
+ if (ierr != 0) {
+
+ s_wsle(&io___32);
+ do_lio(&c__9, &c__1, " ", (ftnlen)1);
+ e_wsle();
+ s_wsle(&io___33);
+ do_lio(&c__9, &c__1, " Error with _seupd, info = ", (ftnlen)27);
+ do_lio(&c__3, &c__1, (char *)&ierr, (ftnlen)sizeof(integer));
+ e_wsle();
+ s_wsle(&io___34);
+ do_lio(&c__9, &c__1, " Check the documentation of _seupd. ", (ftnlen)36);
+ e_wsle();
+ s_wsle(&io___35);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list