#include #include #include "read2.h" #include "stimsyr.h" #include "get_s2.h" #undef __FUNCT__ #define __FUNCT__ "main" void solvequad(double *a, double *b, double *c, double *res){ *res = -*b/(2.0*(*a)) + sqrt((*b)*(*b) - 4.0*(*a)*(*c))/(2.0*(*a)); } int main(int argc,char **argv) { Mat A; /* problem matrix */ EPS eps; /* eigenproblem solver context */ EPSType type; PetscReal error,tol,re,im; PetscReal norm=0.0; PetscReal norm2=0.0; PetscReal norm3=0.0; PetscReal norm4=0.0; PetscReal normfin=0.0; PetscReal normfin2=0.0; PetscReal normfin3=0.0; PetscReal normfin4=0.0; PetscScalar kr,ki,value[700]; Vec xr,xi; PetscInt i,Istart,Iend,col[700],maxit,its,nconv,countcol; PetscInt nev, ncv, mpd; PetscLogDouble t1,t2,tt1,tt2; //PetscBool FirstBlock=PETSC_FALSE,LastBlock=PETSC_FALSE; PetscErrorCode ierr; //PetscScalar eigr; //PetscScalar eigi; int mpiid; int natomax=700; char const* const fileName = argv[1]; FILE* file = fopen(fileName, "r"); Data getdata; PetscInt nlocal; Data_new(file, &getdata); nlocal = getdata.n/getdata.npar; //printf("n=%ld\t nsites=%d\t nnz=%ld\t npar=%ld\t ntrou=%ld\t isz=%ld\n",getdata.n,getdata.natom, getdata.nnz,getdata.npar,getdata.ntrou,getdata.isz); PetscScalar *valxr; PetscInt indxr[nlocal]; //Vec Vr,Vi; char filename[PETSC_MAX_PATH_LEN]="FIL666"; PetscViewer viewer; PetscBool ishermitian; PetscInt kk,ll,mm,nn,iii2,iiii; PetscInt ii; long int iii; long int tcountcol2,tcol[700],tcountcol[getdata.nnz]; double val[700]; PetscReal xymat=0.0; PetscReal xymat2=0.0; PetscReal xymat3=0.0; PetscReal xymat4=0.0; PetscReal xymatfin=0.0; PetscReal xymatfin2=0.0; PetscReal xymatfin3=0.0; PetscReal xymatfin4=0.0; PetscReal weight3fin = 0.0; PetscReal XS = 0.0; PetscReal XS2 = 0.0; PetscReal XS3 = 0.0; PetscReal XS4 = 0.0; PetscReal W3 = 0.0; PetscReal weight3 = 0.0; PetscReal trace1rdm=0.0; PetscReal trace1rdmfin=0.0; PetscReal trace2rdm=0.0; PetscReal trace2rdmfin=0.0; IS from, to; /* index sets that define the scatter */ PetscInt idx_to[nlocal], idx_from[nlocal]; PetscScalar *values; int ndim=(getdata.natom/2)*((getdata.natom/2)-1)/2; double a, b, c; double gamma_p = 0.0, gamma_m = 0.0; double gamma_pfin = 0.0, gamma_mfin = 0.0; double nel, s2dens; double nelfin, s2densfin; double densmat2[getdata.natom][getdata.natom][getdata.natom][getdata.natom]; memset(densmat2, 0, sizeof(densmat2)); // fn = x^2+x^3 //PetscInt range[] ={165094,310638,438886,551954,651820,740324,819168,889916,953994,1012690,1067154,1118398,1167296,1214584,1260860,1306584,1352078,1517172,1662716,1790964,1904032,2003898,2092402,2171246,2241994,2306072,2364768,2419232,2470476,2519374,2566662,2612938,2658662,2704156,2869250,3014794,3143042,3256110,3355976,3444480,3523324,3594072,3658150,3716846,3771310,3822554,3871452,3918740,3965016,4010740,4056234,4221328,4366872,4495120,4608188,4708054,4796558,4875402,4946150,5010228,5068924,5123388,5174632,5223530,5270818,5317094,5362818,5408312,5573406,5718950,5847198,5960266,6060132,6148636,6227480,6298228,6362306,6421002,6475466,6526710,6575608,6622896,6669172,6714896,6760390,6925484,7071028,7199276,7312344,7412210,7500714,7579558,7650306,7714384,7773080,7827544,7878788,7927686,7974974,8021250,8066974,8112468,8277562,8423106,8551354,8664422,8764288,8852792,8931636,9002384,9066462,9125158,9179622,9230866,9279764,9327052,9373328,9419052,9464546,9629640,9775184,9903432,10016500,10116366,10204870,10283714,10354462,10418540,10477236,10531700,10582944,10631842,10679130,10725406,10771130,10816624,10981718,11127262,11255510,11368578,11468444,11556948,11635792,11706540,11770618,11829314,11883778,11935022,11983920,12031208,12077484,12123208,12168702,12333796,12479340,12607588,12720656,12820522,12909026,12987870,13058618,13122696,13181392,13235856,13287100,13335998,13383286,13429562,13475286,13520780,13685874,13831418,13959666,14072734,14172600,14261104,14339948,14410696,14474774,14533470,14587934,14639178,14688076,14735364,14781640,14827364,14872858,15037952,15183496,15311744,15424812,15524678,15613182,15692026,15762774,15826852,15885548,15940012,15991256,16040154,16087442,16133718,16179442,16224936}; SlepcInitialize(&argc,&argv,(char*)0,NULL); ierr = PetscPrintf(PETSC_COMM_WORLD,"\n1-D t-J Eigenproblem, n=%D\n\n",getdata.n);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatCreateAIJ(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,getdata.n,getdata.n,2.0*getdata.natom,NULL,2.0*getdata.natom,NULL,&A);CHKERRQ(ierr); ierr = MatMPIAIJSetPreallocation(A,getdata.natom,NULL,getdata.natom,NULL);CHKERRQ(ierr); //ierr = MatSetFromOptions(A);CHKERRQ(ierr); //ierr = MatSetUp(A);CHKERRQ(ierr); MPI_Comm_rank(MPI_COMM_WORLD,&mpiid); ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr); ierr = PetscTime(&tt1);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD," start: %d end: %d\n",Istart, Iend);CHKERRQ(ierr); // Iend = range[mpiid]; // if(mpiid==0){ // Istart = 0; // } // else{ // Istart = range[mpiid-1]; // } for (i=Istart; i0) { ierr = PetscPrintf(PETSC_COMM_WORLD, " k ||Ax-kx||/||kx|| \n" " ----------------- ----------------- ------------------\n");CHKERRQ(ierr); for(i=0;i