10 #include "linalg/clapack.h"
12 #include"borderbasix/linalg/Lapack.H"
13 #include"borderbasix/linalg/Eigen.H"
30 template<
typename Mat>
33 typedef typename Mat::rep_t rept;
35 bool (*SELECT)(double,double)=(
bool (*)(double,double))1;
37 double *wr=(
double*)
malloc(m.nbrow()*
sizeof(double));
38 double *wi=(
double*)
malloc(m.nbrow()*
sizeof(double));
39 Mat Mres(m.nbrow(),m.nbrow());
40 double *work=(
double*)
malloc(10*
sizeof(
double)*m.nbrow());
41 int info,n,
i,l,lres,lwork,sdim;
42 double* tab =(
double*)
malloc(m.nbcol()*m.nbrow()*
sizeof(double));
43 double* tabres =(
double*)
malloc(m.nbcol_*m.nbrow_*
sizeof(
double));
44 n=m.nbrow();l=m.nbrow();lres=m.nbrow();lwork=10*m.nbrow();
45 for(i=0;i<m.nbcol_*m.nbrow_;i++) tab[i]=m.tab_[i];
46 dgees_(
"V",
"N",SELECT,&n,tab,&l,&sdim,wr,wi,tabres,&lres,work,
48 (Mres.rep).reserve(m.nbcol_,m.nbcol_);
49 for(i=0;i<m.nbcol_*m.nbrow_;i++) (Mres.rep).tab_[
i]=tabres[
i];
62 static long int rep=1;
72 template<
typename Mat>
75 typedef typename Mat::rep_t rept;
80 double *rwork=(
double*)
malloc(m.nbrow_*
sizeof(
double));
82 Mat Mres(m.nbrow_,m.nbrow_);
85 int info,n,l,lres,lwork,sdim;
91 char *JOBS=
"V",*SORT=
"N";
93 n=m.nbrow_;l=m.nbrow_;lres=m.nbrow_;lwork=5*m.nbrow_;
95 for(i=0;i<m.nbcol_*m.nbrow_;i++) {
96 tab[
i].
r=m.tab_[
i].real();
97 tab[
i].
i=m.tab_[
i].imag();
100 zgees_(JOBS,SORT,SELECT,&n,tab,&l,&sdim,
101 w,tabres,&lres,work,&lwork,rwork,bwork,&info);
102 (Mres.rep).reserve(m.nbcol_,m.nbcol_);
103 for(i=0;i<m.nbcol_*m.nbrow_;i++)
105 (Mres.rep).tab_[i]=complex<double>(tab[i].
r,tab[i].i);
106 toto=*(((
float*)tabres)+i+2);
108 cout<<
"info "<<info<<endl;
110 for(i=0;i<m.nbcol_*m.nbrow_;i++)
112 (Mres.rep).tab_[i]=complex<double>(tabres[i].
r,tabres[i].i);
127 template<
typename Mat>
133 Shurvect.transpose();
134 invShurvect=Shurvect;
135 Shurvect.transpose();
136 typename list<Mat>::iterator iter;
137 for(iter=lmat.begin();iter!=lmat.end();iter++)
139 Mat tmp=invShurvect*(*iter)*Shurvect;
144 template<
typename Mat>
147 char *JOBS=
"E",*COMPQ=
"N";
148 int N=M.nbcol(),LDT=M.nbcol();
156 int LWORK=2*N*N,info;
158 for(
int i=0;
i<N*N;
i++)
160 T[
i].
r=(M.rep).tab_[
i].real();
161 T[
i].
i=(M.rep).tab_[
i].imag();
163 ztrsen_(JOBS,COMPQ,select,&N,T,&LDT,Q,&LDQ,W,&m,&S,&SEP,WORK,&LWORK,&info);
172 template<
typename Mat>
187 template<
typename Mat,
typename typcond>
190 double EPSILON=1e-16;
193 int *digits=(
int*)
malloc(M.nbcol()*
sizeof(int));
195 char tampon1[60],tampon2[60],*rien;
197 for(
int i=0;
i<M.nbcol();
i++)
198 normM=
max(
sqrt((M(
i,
i)*conj(M(
i,
i))).real()),normM);
199 for(
int i=0;
i<M.nbcol();
i++)
202 double lambda=1.0/cond[
i]*EPSILON*normM;
203 double nbdigits=(1/lambda);
205 for(k=1;nbdigits>1;k++,nbdigits/=10);
210 snprintf(tampon1,60,
"%%.%dg\0",(k>16)?16:k);
212 snprintf(tampon2,60,tampon1,M(
i,
i).real());
214 truncnum[
i].
r=strtod(tampon2,&rien);
215 snprintf(tampon2,60,tampon1,M(
i,
i).imag());
217 truncnum[
i].
i=strtod(tampon2,&rien);
219 for(
int i=0;
i<M.nbcol();
i++)
225 for(
int j=0;
j<M.nbcol();
j++)
229 for(
int k=0;
k<
min(digits[
i],digits[
j]);
k++,val*=10);
234 if ((
abs(truncnum[j].
r-truncnum[i].
r)*val<1.0)
235 &&(
abs(truncnum[j].i-truncnum[i].i)*val<1.0))
237 typcond stock=cond[
j];
238 for(
int k=0;
k<M.nbcol();
k++)
239 if(cond[
k]==stock) cond[
k]=-
i;
258 template<
typename Mat>
264 int N=M.nbcol(),LDT=M.nbcol(),LDQ=M.nbcol();
265 int m,info,LWORK=N*N*2;
267 double *stockcond=(
double*)
malloc(N*
sizeof(
double));
268 double *WORK=(
double*)
malloc(2*
sizeof(
double)*LWORK);
274 for(
int k=0;
k<N*N;
k++)
276 tmpM[
k].
r=(M.rep).tab_[
k].real();
277 tmpM[
k].
i=(M.rep).tab_[
k].imag();
279 for(
int k=0;
k<N*N;
k++)
281 tmpQ[
k].
r=(Shurvect.rep).tab_[
k].real();
282 tmpQ[
k].
i=(Shurvect.rep).tab_[
k].imag();
285 for(
int k=0;
k<M.nbcol();
k++)
287 stockW[
k].
r=M(
k,
k).real();
288 stockW[
k].
i=M(
k,
k).imag();
291 for(
int k=1;
k<=M.nbcol();
k++)
293 flag+=(select[
k]=(cond[
k]==-
i)?1l:0l);
300 ztrsen_(
"B",
"V",select,&N,tmpM,&LDT,tmpQ,
301 &LDQ,W,&m,&S,&SEP,WORK,&LWORK,&info);
302 for(
int k=0;
k<N*N;
k++)
303 (M.rep).tab_[
k]=complex<double>(tmpM[
k].
r,tmpM[
k].
i);
304 for(
int k=0;
k<N*N;
k++)
305 (Shurvect.rep).tab_[
k]=complex<double>(tmpQ[
k].
r,tmpQ[
k].
i);
314 (W[0].
r-stockW[
k].
r)*(W[0].r-stockW[
k].r)
315 +(W[0].i-stockW[
k].i)*(W[0].i-stockW[
k].i)
319 if(
abs((W[l].r-stockW[
k].r)*(W[l].r-stockW[
k].r)+
320 (W[l].i-stockW[
k].i)*(W[l].i-stockW[
k].i)<mindiff)
323 mindiff=
abs((W[l].r-stockW[
k].r)*(W[l].r-stockW[
k].r)
324 +(W[l].i-stockW[
k].i)*(W[l].i-stockW[
k].i)
328 stockcond[stockpos]=cond[
k];
331 cond[
k]=stockcond[
k];
345 template<
typename Mat>
346 void reorder(Mat &Combilin,Mat &Shurvect,Mat &invShurvect)
351 for(i=0;i<Combilin.nbcol();i++)
359 for(i=0;i<nbcluster;i++)
362 for(i=0;i<invShurvect.nbrow();i++)
363 for(
int j=0;
j<invShurvect.nbcol();
j++)
364 invShurvect(i,
j)=conj(Shurvect(
j,i));
374 template<
typename Mat>
379 Mat Shurvect,Combilin,tmp;
382 double *tab=(
double*)
malloc(lmat.size()*
sizeof(double));
384 typename list<Mat>::iterator iterComb=lmat.begin();
385 for(
int i=0;
i<lmat.size();
i++)
386 tab[
i]=rand()% 32003;
387 for(
int i=0;
i<lmat.size();
i++)
394 Combilin=lmat.front();
395 for(
int i=0;iterComb!=lmat.end();iterComb++,
i++)
397 Combilin+=tab[
i]*(*iterComb);
402 Shurvect.transpose();
403 invShurvect=Shurvect;
404 Shurvect.transpose();
408 for(
int i=0;
i<invShurvect.nbrow();
i++)
409 for(
int j=0;
j<invShurvect.nbcol();
j++)
410 invShurvect(
i,
j)=conj(invShurvect(
i,
j));
412 tmp=invShurvect*Combilin*Shurvect;
415 reorder(Combilin,Shurvect,invShurvect);
417 typename list<Mat>::iterator iter;
418 for(iter=lmat.begin();iter!=lmat.end();iter++)
432 template<
typename Mat,
typename Complex_Mat>
436 typename list<Mat>::const_iterator iter,deb=lmat.begin();
437 for(i=0;i<deb->nbrow();i++)
440 for(iter=lmat.begin();iter!=lmat.end();iter++)
442 res(i,comp,(*iter)(i,i));
451 template<
typename Mat,
typename Complex_Mat>
455 typename list<Mat>::const_iterator iter,deb=lmat.begin();
456 for(i=0;i<deb->nbrow();)
458 if ((*deb)(i+1,
i)+(*deb)(
i,
i)==(*deb)(
i,
i))
462 for(iter=lmat.begin();iter!=lmat.end();iter++)
464 res(i,comp)=(*iter)(
i,
i);
472 Complex_Mat tmp(2,2),tmpShu(2,2),invtmpShu(2,2);
473 tmp(0,0)=(*deb)(
i,
i);
474 tmp(1,0)=(*deb)(i+1,
i);
475 tmp(1,1)=(*deb)(i+1,i+1);
476 tmp(0,1)=(*deb)(
i,i+1);
481 invtmpShu(0,0)=conj(invtmpShu(0,0));
482 invtmpShu(1,0)=conj(invtmpShu(1,0));
483 invtmpShu(1,1)=conj(invtmpShu(1,1));
484 invtmpShu(0,1)=conj(invtmpShu(0,1));
485 for(iter=lmat.begin();iter!=lmat.end();iter++)
487 tmp(0,0)=(*iter)(
i,
i);
488 tmp(1,0)=(*iter)(i+1,
i);
489 tmp(1,1)=(*iter)(i+1,i+1);
490 tmp(0,1)=(*iter)(
i,i+1);
491 tmp=invtmpShu*tmp*tmpShu;
492 res(i,comp)=tmp(0,0);
493 res(i+1,comp)=tmp(1,1);
501 template<
typename Mat>
504 typedef typename Mat::rep_t rept;
507 Mat Mres(m.nbrow(),m.nbrow());
508 int info,n,l,ilo,ihi;
516 n=m.nbrow_;l=m.nbrow_;
518 for(i=0;i<m.nbcol_*m.nbrow_;i++) {
519 tab[
i].
r=m.tab_[
i].real();
520 tab[
i].
i=m.tab_[
i].imag();
530 zgebal_(JOBS,&n,tab,&l,&ilo,&ihi,scale,&info);
532 (Mres.rep).reserve(n,n);
533 for(
unsigned int i=0;i<m.nbcol_*m.nbrow_;i++)
535 (Mres.rep).tab_[i]=complex<double>(tab[i].
r,tab[i].i);
537 cout<<tab[
i].
r<<
" "<<tab[
i].
i<<endl;
554 template<
typename lmat,
typename typres>
559 typres tmpres((lres.front()).nbrow(),lres.size());
565 template<
typename typres,
typename Base>
569 list<MatDense<lapack<complex<double > > > >lres;
571 for(list<harewell<QQ> >::const_iterator iter=lmat.begin()
572 ;iter!=lmat.end();iter++)
574 MatDense<lapack<complex<double> > > tmp(iter->nrow,iter->ncol);
575 (tmp.rep).reserve(iter->nrow,iter->ncol);
576 for(
int j=0;
j<iter->nrow;
j++)
577 for(
int k=0;
k<iter->ncol;
k++)
579 tmp(
j,
k)=mpq_get_d(&(*iter)(
j,
k).rep());
588 template<
typename typres,
typename Base>
592 list<MatDense<lapack<complex<double > > > >lres;
594 for(list<harewell<RR> >::const_iterator iter=lmat.begin()
595 ;iter!=lmat.end();iter++)
597 MatDense<lapack<complex<double> > > tmp(iter->nrow,iter->ncol);
598 (tmp.rep).reserve(iter->nrow,iter->ncol);
599 for(
int j=0;
j<iter->nrow;
j++)
600 for(
int k=0;
k<iter->ncol;
k++)
602 tmp(
j,
k)=mpf_get_d((*iter)(
j,
k).rep());
611 template<
typename typres,
612 typename typlmat,
typename Base>
616 list<MatDense<lapack<complex<double > > > >lres;
618 for(
typename typlmat::const_iterator iter=lmat.begin()
619 ;iter!=lmat.end();iter++)
621 MatDense<lapack<complex<double> > > tmp(iter->nrow,iter->ncol);
622 (tmp.rep).reserve(iter->nrow,iter->ncol);
623 for(
int j=0;
j<iter->nrow;
j++)
624 for(
int k=0;
k<iter->ncol;
k++)
626 tmp(
j,
k)=mpq_get_d(&(*iter)(
j,
k).rep());
void GetRootMat(lmat &lres, typres &res)
Definition: resolve.hpp:555
#define max(a, b)
Definition: alp_f2c.H:167
void realsolve3(const typlmat &lmat, const Base &b, typres &res)
Definition: resolve.hpp:613
Mat wraplapack_zgebal(Mat M)
Definition: resolve.hpp:502
int ztrsen_(const char *job, const char *compq, logical *select, tla_int *n, doublecomplex< T > *t, tla_int *ldt, doublecomplex< T > *q, tla_int *ldq, doublecomplex< T > *w, tla_int *m, T *s, T *sep, doublecomplex< T > *work, tla_int *lwork, tla_int *info)
doublereal i
Definition: alp_f2c.H:30
long int select_true(doublecomplex *toto)
Definition: resolve.hpp:60
void wraplapack_ztrsen(Mat &M, logical *select, doublereal *res)
Definition: resolve.hpp:145
void solvefromcompltrigsim(const list< Mat > &lmat, Complex_Mat &res)
Definition: resolve.hpp:433
void solvefromtrigsim(const list< Mat > &lmat, Complex_Mat &res)
Definition: resolve.hpp:452
MSKint32t MSKint32t MSKint32t MSKrealt * val
Definition: mosek.h:2359
Mat wraplapack_dgees(const Mat &M)
Definition: resolve.hpp:31
long flag
Definition: alp_f2c.H:52
Mat wraplapack_zgees(Mat M)
Definition: resolve.hpp:73
double doublereal
Definition: resolve.hpp:7
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
void realsolve2(const list< harewell< QQ > > &lmat, const Base &b, typres &res)
Definition: resolve.hpp:566
MSKint32t k
Definition: mosek.h:2713
void docluster(Mat &M, Mat &Shurvect, doublereal *cond, int i)
Definition: resolve.hpp:259
int getcluster(Mat &M, typcond *cond)
Definition: resolve.hpp:188
typedef void(MSKAPI *MSKexitfunc)(MSKuserhandle_t usrptr
doublereal r
Definition: alp_f2c.H:30
Scl< T > & sqrt(const Scl< T > &b)
Definition: BC.hpp:1103
doublereal cond_number(Mat &Combilin, int i)
Definition: resolve.hpp:173
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
void compltrigsim(list< Mat > &lmat)
Definition: resolve.hpp:375
void dgees_(char *JOBVS, char *SORT, bool(*SELECT)(double, double), int *N, double *A, int *LDA, int *SDIM, double *WR, double *WI, double *VS, int *LDVS, double *WORK, int *LWORK, double *BWORK, int *info)
#define abs(x)
Definition: f2c.H:161
MSKrescodee r
Definition: mosek.h:2321
void reorder(Mat &Combilin, Mat &Shurvect, Mat &invShurvect)
Definition: resolve.hpp:346
long int logical
Definition: resolve.hpp:8
int zgees_(const char *jobvs, const char *sort, logical(*select)(doublecomplex< T > *), tla_int *n, doublecomplex< T > *a, tla_int *lda, tla_int *sdim, doublecomplex< T > *w, doublecomplex< T > *vs, tla_int *ldvs, doublecomplex< T > *work, tla_int *lwork, T *rwork, logical *bwork, tla_int *info)
void trigsim(list< Mat > &lmat)
Definition: resolve.hpp:128
long min(long a, long b)
Definition: workspace.hpp:3