[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