From d58cae90b98fda6d9e09d26e314f3db0bb1aa5da Mon Sep 17 00:00:00 2001 From: Daniel Waggoner <dwaggoner@frbatlanta.org> Date: Thu, 3 Mar 2011 22:39:50 -0500 Subject: [PATCH] finished changes in bmatrix to make compatible with blas/lapack calls in dynare (cherry picked from commit 390bb6746ea7c9a1f2eea11d3b420661789c9ebb) --- include/blas_lapack.h | 13 ++++++------- matrix/bmatrix.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/include/blas_lapack.h b/include/blas_lapack.h index 186cfc2..08ad286 100644 --- a/include/blas_lapack.h +++ b/include/blas_lapack.h @@ -18,7 +18,6 @@ #ifndef __BLAS_LAPACK__ #define __BLAS_LAPACK__ - #if !defined(MATLAB_MEX_FILE) && !defined(OCTAVE_MEX_FILE) #include "dw_std.h" @@ -159,14 +158,14 @@ void sgelqf(lapack_int*,lapack_int*,float*,lapack_int*,float*,float*,lapack_int* void dorglq(lapack_int*,lapack_int*,lapack_int*,double*,lapack_int*,double*,double*,lapack_int*,lapack_int*); void sorglq(lapack_int*,lapack_int*,lapack_int*,float*,lapack_int*,float*,float*,lapack_int*,lapack_int*); -void dgges(char*,char*,char*,void*,lapack_int*,double*,lapack_int*,double*,lapack_int*,lapack_int*,double*,double*,double*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,void*,lapack_int*); -void sgges(char*,char*,char*,void*,lapack_int*,float*,lapack_int*,float*,lapack_int*,lapack_int*,float*,float*,float*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,void*,lapack_int*); +void dgges(char*,char*,char*,lapack_int*,lapack_int*,double*,lapack_int*,double*,lapack_int*,lapack_int*,double*,double*,double*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,void*,lapack_int*); +void sgges(char*,char*,char*,lapack_int*,lapack_int*,float*,lapack_int*,float*,lapack_int*,lapack_int*,float*,float*,float*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,void*,lapack_int*); -void dtgsen(lapack_int*,void*,void*,void*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,double*,double*,double*,lapack_int*,double*,lapack_int*,lapack_int*,double*,double*,double*,double*,lapack_int*,lapack_int*,lapack_int*,lapack_int*); -void stgsen(lapack_int*,void*,void*,void*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,float*,float*,float*,lapack_int*,float*,lapack_int*,lapack_int*,float*,float*,float*,float*,lapack_int*,lapack_int*,lapack_int*,lapack_int*); +void dtgsen(lapack_int*,lapack_int*,lapack_int*,lapack_int*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,double*,double*,double*,lapack_int*,double*,lapack_int*,lapack_int*,double*,double*,double*,double*,lapack_int*,lapack_int*,lapack_int*,lapack_int*); +void stgsen(lapack_int*,lapack_int*,lapack_int*,lapack_int*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,float*,float*,float*,lapack_int*,float*,lapack_int*,lapack_int*,float*,float*,float*,float*,lapack_int*,lapack_int*,lapack_int*,lapack_int*); -void dtgexc(void*,void*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,lapack_int*,lapack_int*,double*,lapack_int*,lapack_int*); -void stgexc(void*,void*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,lapack_int*,lapack_int*,float*,lapack_int*,lapack_int*); +void dtgexc(lapack_int*,lapack_int*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,double*,lapack_int*,lapack_int*,lapack_int*,double*,lapack_int*,lapack_int*); +void stgexc(lapack_int*,lapack_int*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,float*,lapack_int*,lapack_int*,lapack_int*,float*,lapack_int*,lapack_int*); void dsyev(char*,char*,lapack_int*,double*,lapack_int*,double*,double*,lapack_int*,lapack_int*); void ssyev(char*,char*,lapack_int*,float*,lapack_int*,float*,float*,lapack_int*,lapack_int*); diff --git a/matrix/bmatrix.c b/matrix/bmatrix.c index d7d5146..bc8e9e8 100644 --- a/matrix/bmatrix.c +++ b/matrix/bmatrix.c @@ -1465,13 +1465,13 @@ int bGeneralizedSchur_real(PRECISION *Q, PRECISION *Z, PRECISION *S, PRECISION * if (!bt) bTransposeInPlace(B,n); lwork=-1; - gges(&jobvsl,&jobvsr,&sort,(void*)NULL,&bn,S,&bn,T,&bn,&simd,palpha_r,palpha_i,pbeta,Q,&bn,Z,&bn,&size,&lwork,(void*)NULL,&info); + gges(&jobvsl,&jobvsr,&sort,(lapack_int*)NULL,&bn,S,&bn,T,&bn,&simd,palpha_r,palpha_i,pbeta,Q,&bn,Z,&bn,&size,&lwork,(void*)NULL,&info); if (!info) if (!(work=(PRECISION*)dw_malloc((lwork=(lapack_int)size)*sizeof(PRECISION)))) rtrn=MEM_ERR; else { - gges(&jobvsl,&jobvsr,&sort,(void*)NULL,&bn,S,&bn,T,&bn,&simd,palpha_r,palpha_i,pbeta,Q,&bn,Z,&bn,work,&lwork,(void*)NULL,&info); + gges(&jobvsl,&jobvsr,&sort,(lapack_int*)NULL,&bn,S,&bn,T,&bn,&simd,palpha_r,palpha_i,pbeta,Q,&bn,Z,&bn,work,&lwork,(void*)NULL,&info); if (!info) { if (Q && !qt) bTransposeInPlace(Q,n); @@ -1560,7 +1560,8 @@ int bReorderGeneralizedSchur_real(int *select, PRECISION *QQ, PRECISION *ZZ, PRE #define tgsen dtgsen #endif - int ijob=0, wantq, wantz, lwork=-1, liwork=1, m, info, rtrn=NO_ERR, iwork; + int i, rtrn=NO_ERR; + lapack_int ijob=0, wantq, wantz, lwork=-1, liwork=-1, isize, info, *iwork, *bselect, bm, bn=n; PRECISION size, *palpha_r, *palpha_i, *pbeta, *work, pl, pr, dif, *pQQ=QQ; wantq=(QQ && Q) ? 1 : 0; @@ -1569,8 +1570,9 @@ int bReorderGeneralizedSchur_real(int *select, PRECISION *QQ, PRECISION *ZZ, PRE palpha_r=alpha_r ? alpha_r : (PRECISION*)dw_malloc(n*sizeof(PRECISION)); palpha_i=alpha_i ? alpha_i : (PRECISION*)dw_malloc(n*sizeof(PRECISION)); pbeta=beta ? beta : (PRECISION*)dw_malloc(n*sizeof(PRECISION)); + bselect=(lapack_int*)dw_malloc(n*sizeof(lapack_int)); - if (palpha_r && palpha_i && pbeta) + if (palpha_r && palpha_i && pbeta && bselect) { if (SS != S) if (st) @@ -1610,18 +1612,25 @@ int bReorderGeneralizedSchur_real(int *select, PRECISION *QQ, PRECISION *ZZ, PRE else if (!zt) bTransposeInPlace(Z,n); + for (i=n-1; i >= 0; i--) bselect[i]=select[i]; - tgsen(&ijob,&wantq,&wantz,select,&n,SS,&n,TT,&n,palpha_r,palpha_i,pbeta,pQQ,&n,ZZ,&n,&m, - &pl,&pr,&dif,&size,&lwork,&iwork,&liwork,&info); + tgsen(&ijob,&wantq,&wantz,bselect,&bn,SS,&bn,TT,&bn,palpha_r,palpha_i,pbeta,pQQ,&n,ZZ,&bn,&bm, + &pl,&pr,&dif,&size,&lwork,&isize,&liwork,&info); if (!info) if (!(work=(PRECISION*)dw_malloc((lwork=(int)size)*sizeof(PRECISION)))) rtrn=MEM_ERR; else { - tgsen(&ijob,&wantq,&wantz,select,&n,SS,&n,TT,&n,palpha_r,palpha_i,pbeta,pQQ,&n,ZZ,&n,&m, - &pl,&pr,&dif,work,&lwork,&iwork,&liwork,&info); - if (info) - rtrn=BLAS_LAPACK_ERR; + if (!(iwork=(lapack_int*)dw_malloc((liwork=isize)*sizeof(lapack_int)))) + rtrn=MEM_ERR; + else + { + tgsen(&ijob,&wantq,&wantz,bselect,&bn,SS,&bn,TT,&bn,palpha_r,palpha_i,pbeta,pQQ,&bn,ZZ,&bn,&bm, + &pl,&pr,&dif,work,&lwork,iwork,&liwork,&info); + if (info) + rtrn=BLAS_LAPACK_ERR; + dw_free(iwork); + } dw_free(work); } else @@ -1640,6 +1649,7 @@ int bReorderGeneralizedSchur_real(int *select, PRECISION *QQ, PRECISION *ZZ, PRE if (!alpha_r && palpha_r) dw_free(palpha_r); if (!alpha_i && palpha_i) dw_free(palpha_i); if (!beta && pbeta) dw_free(pbeta); + if (bselect) dw_free(bselect); return rtrn; @@ -1708,7 +1718,8 @@ int bSortGeneralizedSchur_real(PRECISION *QQ, PRECISION *ZZ, PRECISION *SS, PREC #define tgexc dtgexc #endif - int wantq, wantz, lwork=-1, info, rtrn=NO_ERR, k, i, j, ii=2, jj=1; + int rtrn=NO_ERR, k, i, j; + lapack_int wantq, wantz, lwork=-1, info, ii=2, jj=1, bn=n; PRECISION tmp1, tmp2, size, *work; wantq=(QQ && Q) ? 1 : 0; @@ -1750,9 +1761,9 @@ int bSortGeneralizedSchur_real(PRECISION *QQ, PRECISION *ZZ, PRECISION *SS, PREC if (n > 1) { - tgexc(&wantq,&wantz,&n,SS,&n,TT,&n,QQ,&n,ZZ,&n,&ii,&jj,&size,&lwork,&info); + tgexc(&wantq,&wantz,&bn,SS,&bn,TT,&bn,QQ,&bn,ZZ,&bn,&ii,&jj,&size,&lwork,&info); if (!info) - if (!(work=(PRECISION*)dw_malloc((lwork=(int)size)*sizeof(PRECISION)))) + if (!(work=(PRECISION*)dw_malloc((lwork=(lapack_int)size)*sizeof(PRECISION)))) rtrn=MEM_ERR; else { @@ -1770,7 +1781,7 @@ int bSortGeneralizedSchur_real(PRECISION *QQ, PRECISION *ZZ, PRECISION *SS, PREC k=((i == n-1) || (SS[i*n+i+1] == 0.0)) ? 1 : 2; if (jj < ii) { - tgexc(&wantq,&wantz,&n,SS,&n,TT,&n,QQ,&n,ZZ,&n,&ii,&jj,work,&lwork,&info); + tgexc(&wantq,&wantz,&bn,SS,&bn,TT,&bn,QQ,&bn,ZZ,&bn,&ii,&jj,work,&lwork,&info); if (info) { dw_free(work); -- GitLab