*** empty log message ***

This commit is contained in:
jiri 2005-02-27 21:13:50 +00:00
parent 7f79e55a63
commit 1025128075

175
t.cc
View File

@ -9,6 +9,7 @@
#include "davidson.h" #include "davidson.h"
#include "gmres.h" #include "gmres.h"
#include "conjgrad.h" #include "conjgrad.h"
#include "diis.h"
extern void test(const NRVec<double> &x); extern void test(const NRVec<double> &x);
@ -541,26 +542,50 @@ cout <<v;
*/ */
if(0) if(0)
{ {
const int n=3; int n;
cin >>n;
NRMat<double> a(n,n); NRMat<double> a(n,n);
for(int i=0;i<n;++i) for(int j=0;j<=i;++j) for(int i=0;i<n;++i) for(int j=0;j<=i;++j)
{ {
a(i,j)= random()/(1.+RAND_MAX); a(i,j)= random()/(1.+RAND_MAX);
a(j,i)= -a(i,j); a(j,i)= random()/(1.+RAND_MAX);
} }
NRMat<double> b; b|=a; NRMat<double> b; b|=a;
NRVec<double> er(n),ei(n); NRVec<double> er(n),ei(n);
NRMat<double> vr(n,n),vl(n,n); NRMat<double> vr(n,n),vl(n,n);
gdiagonalize(b,er,ei,&vl,&vr); gdiagonalize(b,er,ei,&vl,&vr,1,0,1,1);
cout <<er<<ei; cout <<er<<ei;
cout <<"left eivec\n"<<vl <<"right eivec\n"<<vr; cout <<"left eivec\n"<<vl <<"right eivec\n"<<vr;
NRMat<double> u=exp(a*.125); cout <<"test orthogonality\n" << vl.transpose() * vr;
cout <<"norms "<<u.norm() << ' '<<(u-1.).norm()<<endl; NRMat<double> u=exp(a*.1);
gdiagonalize(u,er,ei,&vl,&vr); gdiagonalize(u,er,ei,&vl,&vr,1,0,1,1);
cout <<er<<ei; cout <<er<<ei;
cout <<"left eivec\n"<<vl <<"right eivec\n"<<vr; cout <<"left eivec\n"<<vl <<"right eivec\n"<<vr;
cout <<"test orthogonality\n" << vl.transpose() * vr;
} }
if(0)
{
int k;
cin >>k;
int n=2*k;
NRMat<double> a(n,n);
//matrix with known spectrum
for(int i=0;i<n;++i)
{
for(int j=0;j<k;++j) a(i,j)=j+1.+k*k-(i==j?0.:i+1.);
for(int j=k; j<n; ++j) a(i,j)=i-j-k*k+(i==j?i+1.:0.);
}
NRVec<double> er(n),ei(n);
NRMat<double> vr(n,n),vl(n,n);
cout <<"input matrix\n"<<a;
gdiagonalize(a,er,ei,&vl,&vr,1,0,1);
cout <<er<<ei;
cout <<"left eivec\n"<<vl <<"right eivec\n"<<vr;
cout <<"test orthogonality\n" << vl.transpose() * vr;
}
if(0) if(0)
{ {
/* /*
@ -785,7 +810,7 @@ NRMat<double> amat,bmat;
cin >>amat; cin >>amat;
cin >>bmat; cin >>bmat;
NRVec<double> v(amat.nrows()); NRVec<double> v(amat.nrows());
gendiagonalize(amat,v,bmat,2); diagonalize(amat,v,1,1,0,&bmat,1);
cout <<amat; cout <<amat;
cout <<v; cout <<v;
} }
@ -795,18 +820,18 @@ if(0)
{ {
int n,m; int n,m;
cin>>n >>m; cin>>n >>m;
NRMat<double> a(n,n); NRSMat<double> a(n,n);
NRVec<double> rr(n); NRVec<double> rr(n);
for(int i=0;i<n;++i) for(int j=0;j<=i;++j) for(int i=0;i<n;++i) for(int j=0;j<=i;++j)
{ {
a(i,j)= random()/(1.+RAND_MAX); a(i,j)= random()/(1.+RAND_MAX);
a(j,i)= a(i,j);
if(i==j) a(i,i)+= .5*(i-n); if(i==j) a(i,i)+= .5*(i-n);
} }
NRMat<double> aa; NRSMat<double> aa;
aa=a; diagonalize(aa,rr); NRMat<double> vv(n,n);
aa=a; diagonalize(aa,rr,&vv);
NRVec<double> r(m); NRVec<double> r(m);
NRVec<double> *eivecs = new NRVec<double>[m]; NRVec<double> *eivecs = new NRVec<double>[m];
davidson(a,r,eivecs,NULL,m,1,1e-6,1,200); davidson(a,r,eivecs,NULL,m,1,1e-6,1,200);
@ -820,7 +845,46 @@ cout <<"Eigenvectors compare:\n";
for(int i=0; i<m; ++i) for(int i=0; i<m; ++i)
{ {
cout <<eivecs[i]; cout <<eivecs[i];
for(int j=0; j<n;++j) cout <<aa[j][i]<<" "; for(int j=0; j<n;++j) cout <<vv[j][i]<<" ";
cout <<endl;
}
}
if(0) //davidson of a non-symmetric matrix
{
int n,m;
cin>>n >>m;
NRMat<double> a(n,n);
NRVec<double> rr(n),ii(n);
double tmp=0.;
for(int i=0;i<n;++i) for(int j=0;j<n;++j)
{
a(i,j)= random()/(1.+RAND_MAX);
a(j,i)= random()/(1.+RAND_MAX);
if(i==j) a(i,i)+= .5*(i-n);
tmp+= (a(i,j)-a(j,i))*(a(i,j)-a(j,i));
}
cout <<"norm of asymmetry "<<sqrt(tmp)<<endl;
NRMat<double> aa=a;
NRMat<double> vv=aa;
gdiagonalize(aa, rr, ii, NULL, &vv, 1, 0, 2, 0, NULL,NULL);
NRVec<double> r(m);
NRVec<double> *eivecs = new NRVec<double>[m];
davidson(a,r,eivecs,NULL,m,1,1e-6,1,200);
cout <<"Davidson energies " <<r;
cout <<"Exact energies " ;
for(int i=0; i<m; ++i) cout <<rr[i]<<" ";
cout <<endl;
cout <<"Eigenvectors compare:\n";
for(int i=0; i<m; ++i)
{
cout <<eivecs[i];
for(int j=0; j<n;++j) cout <<vv[j][i]<<" ";
cout <<endl; cout <<endl;
} }
@ -829,7 +893,7 @@ for(int i=0; i<m; ++i)
//davidson of large very sparse matrix (10n/n^2) //davidson of large very sparse matrix (10n/n^2)
#undef sparsity #undef sparsity
#define sparsity (n/2) #define sparsity (n*2)
if(0) if(0)
{ {
int n,m; int n,m;
@ -843,6 +907,57 @@ davidson(aa,r,(NRVec<double> *)NULL,"eivecs",m,1,1e-5,0,300,300);
cout <<r; cout <<r;
} }
//davidson of symmetric matrix and of its unsymmetric similarity transform
#undef sparsity
#define sparsity (n*2)
#define sparsity2 (n/5)
if(1)
{
int n,m;
cin >>n>>m;
SparseMat<double> aa(n,n);
aa.setsymmetric();
for(int i=0; i<sparsity;i++) aa.add(randind(n),randind(n),random()/(1.+RAND_MAX));
for(int i=0; i<n; ++i) aa.add(i,i,500*random()/(1.+RAND_MAX));
NRVec<double> r(m);
NRVec<double> r2(m);
davidson(aa,r,(NRVec<double> *)NULL,"eivecs",m,1,1e-5,1,300,300);
SparseMat<double> bb(n,n);
for(int i=0; i<sparsity2;i++) bb.add(randind(n),randind(n),random()/(1.+RAND_MAX));
SparseMat<double> e1,e2,cc;
e1=exp(bb);
e2=exp(bb*-1.);
aa.setunsymmetric();
cc=e1*aa*e2;
davidson(cc,r2,(NRVec<double> *)NULL,"eivecs2",m,1,1e-5,1,300,300);
cout <<"original matrix" <<r;
cout <<"transformed matrix" <<r2;
}
//davidson of large very sparse matrix unsymmetric matrix
#undef sparsity
#define sparsity (n)
if(0)
{
int n,m;
cin >>n>>m;
SparseMat<double> aa(n,n);
for(int i=0; i<sparsity;i++)
{
int k= randind(n);
int l= randind(n);
double a=random()/(1.+RAND_MAX);
double b=random()/(1.+RAND_MAX)-.5;
aa.add(k,l,a);
aa.add(l,k,a+b/20);
}
for(int i=0; i<n; ++i) aa.add(i,i,500*random()/(1.+RAND_MAX));
NRVec<double> r(m);
davidson(aa,r,(NRVec<double> *)NULL,"eivecs",m,1,1e-5,0,300,300);
cout <<r;
}
if(0) if(0)
{ {
int n,m; int n,m;
@ -881,7 +996,7 @@ for(int i=0; i<m; ++i)
} }
if(1) if(0)
{ {
int n,m; int n,m;
cin>>n >>m; cin>>n >>m;
@ -899,4 +1014,36 @@ gmres(aa,b,x,1,1e-20,20,1,1,1,1000,1);
//conjgrad(aa,b,x,1,1e-10,1000,1,0,1); //conjgrad(aa,b,x,1,1e-10,1000,1,0,1);
} }
if(0)
{
NRMat<double> A(3,3);
A=1.;
double *p = (double *)A;
*p=2.;
cout <<A;
}
if(0)
{
int i;
DIIS<NRVec<double> > diis(5,1);
int dim=8;
NRVec<double> solution(dim), deviation(dim);
for(i=0; i<dim; ++i) solution[i]=i&1 ? i/2.:-i-3.;
for(i=0; i<dim; ++i) deviation[i]= (i&2 ? 1:-1) * random()/(1.+RAND_MAX);
double norm=1e100;
for(int iter=1; iter<100 && norm>1e-8 ; ++iter)
{
NRVec<double> trial=solution;
trial.copyonwrite();
for(i=0; i<dim; ++i) trial[i] += deviation[i]/iter;
cout <<"iter "<<iter<<endl;
cout << "trial "<<trial;
cout <<"diis " << (norm=diis.extrapolate(trial)) <<endl;
cout << "after diis "<<trial;
deviation=trial-solution;
}
}
} }