[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38716] branches/soc-2011-avocado/blender/ intern/autoseam/AutoseamAdjacency.cpp: Memories are allocated dynamically for calling arpack routines.

shuvro sarker shuvro05 at gmail.com
Tue Jul 26 06:18:00 CEST 2011


Revision: 38716
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38716
Author:   shuvro
Date:     2011-07-26 04:17:59 +0000 (Tue, 26 Jul 2011)
Log Message:
-----------
Memories are allocated dynamically for calling arpack routines. go to label removed from the code. The codes will be modified soon to remove the bugs of this commit

Modified Paths:
--------------
    branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp

Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp	2011-07-26 04:17:15 UTC (rev 38715)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp	2011-07-26 04:17:59 UTC (rev 38716)
@@ -31,7 +31,7 @@
 #include "BKE_report.h"
 #include "AutoseamAdjacency.h"
 
-//#define EIGEN_DEBUG_ARPACK 1
+#define EIGEN_DEBUG_ARPACK 1
 
 #ifdef WITH_ARPACK
 #include "dssimp.h"
@@ -39,29 +39,19 @@
 //#include "carpack.h"
 #endif
 
+//define the dimension of each eigen vector
+//static integer c__256 = 256;
 
 #define THRESHOLD_ZERO 0.0005
+#define EXTRA_MEMORY_SIZE 10
 //#define NUM_EIGEN_VAL  25
 
 #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)
@@ -179,50 +169,43 @@
         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;
+        integer j, n;
+        integer nx, ido, ncv, nev;
+        doublereal tol;
+        char bmat[1];
+        integer info;
+        logical rvec;
+        integer ierr, mode1;
+        doublereal sigma;
+        char which[3] = "SM"; // we are looking for the smallest eigen values
     
-        static doublereal workd[768];
     
-        static integer ipntr[11];
-        static doublereal workl[825];
-        static integer iparam[11];
-        static logical select[25];
-      
+        integer nconv;
+        integer ipntr[11];
+        integer iparam[11];
+        integer ldv;
+    
+        integer ishfts, maxitr, lworkl;
+        int vectors_size;
+    
+        // size : number of eigen vectors
+        logical *select = NULL;
+        // LWORKL must be at least NCV**2 + 8*NCV.
+        doublereal *workl = NULL; 
+        // 3*N
+        doublereal *workd = NULL;
+        doublereal *d__ = NULL;  
+        doublereal *v = NULL;
+        doublereal *resid = NULL;
 
-        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 };
-          
+
     
+        
+    
         // This is the dimension of the matrix
         n = matrix_dimension;
-    
+                    
         /**
          *The number of eigen values we want to calculate
          * This should be the minimum number between matrix_dimension and NUM_EIGEN_VAL
@@ -230,37 +213,44 @@
          * nev + 1 <= ncv <= maxncv
          * n >= ncv
          */
-    
+        
+        
+        ldv = (integer)matrix_dimension;
         nev = minimum(matrix_dimension - 1, NUM_EIGEN_VAL);
         num_eigen_values = nev;
-        ncv = minimum(nev + 1, 20);
+        ncv = minimum(nev + 1, n);
     
     
         *(unsigned char *)bmat = 'I';
     
-        //we are looking for the smallest eigen values
-        s_copy(which, "SM", (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;
+        
+        if (n > ldv) {
+            printf(" ERROR with _SSIMP: N is greater than MAXN \n");
+            //goto L9000;
+            return NULL;
         }
         else if (nev > NUM_EIGEN_VAL) {
-            s_wsle(&io___8);
-            do_lio(&c__9, &c__1, " ERROR with _SSIMP: NEV is greater than MAXNEV ", (ftnlen)47);
-            e_wsle();
-            goto L9000;
+            printf(" ERROR with _SSIMP: NEV is greater than MAXNEV \n");
+            //goto L9000;
+            return NULL;
                                                                             
         }
-        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;
+        else if (ncv <= nev || ncv > n) {
+            printf(" ERROR with _SSIMP: NCV is greater than MAXNCV \n");
+            // goto L9000;
+            return NULL;
         }
+    
+        //dynamic memory allocation block
+        d__ = new doublereal[matrix_dimension];
+        resid = new doublereal[matrix_dimension];
+        workd = new doublereal[3*matrix_dimension];
+        vectors_size = matrix_dimension * nev;
+        v = new doublereal[vectors_size];
+        select = new logical[nev];
+        workl  = new  doublereal[ncv*ncv + 8*ncv];/* LWORKL must be at least NCV**2 + 8*NCV . */
 
+
         lworkl = ncv * (ncv + 8);
         tol = 0.;
         info = 0;
@@ -275,8 +265,11 @@
         iparam[6] = mode1;
     
         // main loop        
-        L10:
+        //L10:
+        while (true) {
+        
     
+    
             /* %---------------------------------------------% */
             /* | Repeatedly call the routine DSAUPD and take | */
             /* | actions indicated by parameter IDO until    | */
@@ -284,42 +277,36 @@
             /* | 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);
+            //dsaupd_(&ido, bmat, &n, which, &nev, &tol, resid, &ncv, v, &c__256, iparam, ipntr, workd, workl, &lworkl, &info, (ftnlen)1, (ftnlen)2);
+            dsaupd_(&ido, bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, 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(n, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
-            goto L10;
+            if (ido == -1 || ido == 1) {
+                //perform matrix-vector multiplication
+                //av_(&nx, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
+                mul_matrix_vector(n, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
+                //goto L10;
+            }
+            else{
+                break;
+            }
+            
         }
     
     
         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();
-        
+            printf(" Error with _saupd, info = %d\n", info);
+            printf(" Check documentation in _saupd \n");
         } 
         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, 
+            dseupd_(&rvec, "All", select, d__, v, &ldv, &sigma, bmat, &n, 
+                which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, 
                 workd, workl, &lworkl, &ierr, (ftnlen)3, (ftnlen)1, (ftnlen)2);
         
         
@@ -336,20 +323,9 @@
         
             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);
-                do_lio(&c__9, &c__1, " ", (ftnlen)1);
-                e_wsle();
-            
+               printf(" Error with _seupd, info = %d\n", ierr);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list