diff options
Diffstat (limited to 'lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c')
-rw-r--r-- | lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c index 04ef416..cab3f5b 100644 --- a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c +++ b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c | |||
@@ -701,3 +701,52 @@ int hess_l_C(KCMAT(a), CVEC(tau), CMAT(r)) { | |||
701 | free(WORK); | 701 | free(WORK); |
702 | OK | 702 | OK |
703 | } | 703 | } |
704 | |||
705 | //////////////////// Schur factorization ///////////////////////// | ||
706 | |||
707 | int schur_l_R(KDMAT(a), DMAT(u), DMAT(s)) { | ||
708 | integer m = ar; | ||
709 | integer n = ac; | ||
710 | REQUIRES(m>=1 && n==m && ur==n && uc==n && sr==n && sc==n, BAD_SIZE); | ||
711 | DEBUGMSG("schur_l_R"); | ||
712 | memcpy(sp,ap,n*n*sizeof(double)); | ||
713 | integer lwork = 6*n; // fixme | ||
714 | double *WORK = (double*)malloc(lwork*sizeof(double)); | ||
715 | double *WR = (double*)malloc(n*sizeof(double)); | ||
716 | double *WI = (double*)malloc(n*sizeof(double)); | ||
717 | // WR and WI not really required in this call | ||
718 | logical *BWORK = (logical*)malloc(n*sizeof(logical)); | ||
719 | integer res; | ||
720 | integer sdim; | ||
721 | dgees_ ("V","N",NULL,&n,sp,&n,&sdim,WR,WI,up,&n,WORK,&lwork,BWORK,&res); | ||
722 | CHECK(res,res); | ||
723 | free(WR); | ||
724 | free(WI); | ||
725 | free(BWORK); | ||
726 | free(WORK); | ||
727 | OK | ||
728 | } | ||
729 | |||
730 | int schur_l_C(KCMAT(a), CMAT(u), CMAT(s)) { | ||
731 | integer m = ar; | ||
732 | integer n = ac; | ||
733 | REQUIRES(m>=1 && n==m && ur==n && uc==n && sr==n && sc==n, BAD_SIZE); | ||
734 | DEBUGMSG("schur_l_C"); | ||
735 | memcpy(sp,ap,n*n*sizeof(doublecomplex)); | ||
736 | integer lwork = 6*n; // fixme | ||
737 | doublecomplex *WORK = (doublecomplex*)malloc(lwork*sizeof(doublecomplex)); | ||
738 | doublecomplex *W = (doublecomplex*)malloc(n*sizeof(doublecomplex)); | ||
739 | // W not really required in this call | ||
740 | logical *BWORK = (logical*)malloc(n*sizeof(logical)); | ||
741 | double *RWORK = (double*)malloc(n*sizeof(double)); | ||
742 | integer res; | ||
743 | integer sdim; | ||
744 | zgees_ ("V","N",NULL,&n,(doublecomplex*)sp,&n,&sdim,W, | ||
745 | (doublecomplex*)up,&n, | ||
746 | WORK,&lwork,RWORK,BWORK,&res); | ||
747 | CHECK(res,res); | ||
748 | free(W); | ||
749 | free(BWORK); | ||
750 | free(WORK); | ||
751 | OK | ||
752 | } | ||