[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