/*! \fn TPZCartsys::RotationAngle() */ double TPZCartsys::RotationAngle() { double rot = acos (fTr(0,0)); double aux_rot = asin (fTr(0,1)); if (aux_rot < 0.) rot = 2.*M_PI - rot; return rot; }
void TPZCartsys::SetAxes(TPZVec<REAL> &x, TPZVec<REAL> &z){ x[0] -= fOrigin[0]; x[1] -= fOrigin[1]; x[2] -= fOrigin[2]; Normalise(x); fTr(0,0) = x[0]; fTr(0,1) = x[1]; fTr(0,2) = x[2]; z[0] -= fOrigin[0]; z[1] -= fOrigin[1]; z[2] -= fOrigin[2]; Normalise(z); fTr(2,0) = z[0]; fTr(2,1) = z[1]; fTr(2,2) = z[2]; TPZVec<REAL> y(3,0.); GetNormal(z,x,y); fTr(1,0) = y[0]; fTr(1,1) = y[1]; fTr(1,2) = y[2]; }
void TPZCartsys::RotateToReference (TPZVec<REAL> &point) { TPZVec<REAL> newp(3,0.); newp[0] = fTr(0,0)*point[0] + fTr(1,0)*point[1] + fTr(2,0)*point[2]; newp[1] = fTr(0,1)*point[0] + fTr(1,1)*point[1] + fTr(2,1)*point[2]; newp[2] = fTr(0,2)*point[0] + fTr(1,2)*point[1] + fTr(2,2)*point[2]; point[0] = newp[0]; point[1] = newp[1]; point[2] = newp[2]; }
void TPZCartsys::CalcRotMatrix(TPZVec<REAL> &angle){ fTr(0,0)=cos(angle[1])*cos(angle[2]); fTr(0,1)=cos(angle[1])*sin(angle[2]); fTr(0,2)=sin(angle[1]); fTr(1,0)=-(cos(angle[2])*sin(angle[0])*sin(angle[1])) - cos(angle[0])*sin(angle[2]); fTr(1,1)=cos(angle[0])*cos(angle[2]) - sin(angle[0])*sin(angle[1])*sin(angle[2]); fTr(1,2)=cos(angle[1])*sin(angle[0]); fTr(2,0)=-(cos(angle[0])*cos(angle[2])*sin(angle[1])) + sin(angle[0])*sin(angle[2]); fTr(2,1)=-(cos(angle[2])*sin(angle[0])) - cos(angle[0])*sin(angle[1])*sin(angle[2]); fTr(2,2)=cos(angle[0])*cos(angle[1]); }
/**Constructor - * create one object from a reference coordinate system * and a origin and a rotation matrix */ TPZCartsys::TPZCartsys(int num, TPZCartsys * ref, TPZVec<REAL> * org, TPZFMatrix *angles):TPZCosys(num,ref),fOrigin(3,0.){ int i,j; if (org) fOrigin = *org; if (angles) fTr = *angles; else for (i=0; i<3; i++) for (j=0; j<3; j++) fTr(i,j) = (i == j) ? 1.0 : 0.0; }
/**Constructor - * create one object from a reference coordinate system * and a origin and euller angles */ TPZCartsys::TPZCartsys(int num, TPZCartsys * ref, TPZVec<REAL> * org, TPZVec<REAL> *angles):TPZCosys(num,ref),fOrigin(3,0.){ int i,j; if (org) { fOrigin = *org; } if (angles) CalcRotMatrix(*angles); else { for (i=0; i<3; i++) for (j=0; j<3; j++) fTr(i,j) = (i == j) ? 1.0 : 0.0; } }
/** * Default empty constructor */ TPZCartsys::TPZCartsys():TPZCosys(),fOrigin(3,0.){ int i,j; fOrigin.Resize(3,0.); // fOrigin->Redim(3); for (i=0 ; i<3 ; ++i) fOrigin[i] = 0.; fReference = NULL; fTr.Redim(3,3); fTr.Zero(); for (i=0; i<3; i++) for (j=0; j<3; j++) fTr(i,j)=(i == j) ? 1.0 : 0.0; }
void TPZCartsys::TransformGradient(TPZVec<REAL> &X, TPZFMatrix &GradX, TPZVec<REAL> &x, TPZFMatrix &Gradx, TPZCosys *dest) { int i,j; Gradx.Zero(); for (i=0;i<3;i++){ x=X; for (j=0;j<3;j++) Gradx(i,i)+=fTr(i,j)*GradX(j,j); } if (dest != fReference) { TPZFMatrix gradin(GradX); FromReference(x); TransformGradient(x,gradin,x,Gradx,dest); } }
int main() { cout<<"Effective confs: "<<nconfs<<endl; fin=open_file("rende_new","r"); vector<pair<vector<int>,string>> full_Tr_map(nfull_Tr); //prepare all maps DEF_MAP_1(M_dM); DEF_MAP_1(M_d2M); DEF_MAP_1(M_dM_M_dM); DEF_MAP_1(M_d3M); DEF_MAP_1(M_dM_M_d2M); DEF_MAP_1(M_dM_M_dM_M_dM); DEF_MAP_1(M_d2M_M_d2M); DEF_MAP_1(M_d2M_M_dM_M_dM); DEF_MAP_1(M_dM_M_dM_M_dM_M_dM); DEF_MAP_2(M_dM,M_dM); DEF_MAP_2(M_dM,M_dM_M_dM); DEF_MAP_2(M_dM,M_d2M); DEF_MAP_3(M_dM,M_dM,M_dM); DEF_MAP_2(M_dM,M_dM_M_d2M); DEF_MAP_2(M_d2M,M_dM_M_dM); DEF_MAP_2(M_dM_M_dM,M_dM_M_dM); DEF_MAP_2(M_dM_M_dM_M_dM,M_dM); DEF_MAP_2(M_d2M,M_d2M); DEF_MAP_3(M_dM_M_dM,M_dM,M_dM); DEF_MAP_3(M_d2M,M_dM,M_dM); DEF_MAP_4(M_dM,M_dM,M_dM,M_dM); //read all flavour, confs and take all trace products conf by conf for(int iconf=0;iconf<nconfs;iconf++) { const int ijack=iconf/clust_size; read_conf(); for(int iflav=0;iflav<nflavs;iflav++) for(int ifull=0;ifull<nfull_Tr;ifull++) full_Tr[ind_full(iflav,ifull)][ijack]+= Tr(full_Tr_map[ifull].first,iflav).real(); // dcompl a=0; // double nc=0; // for(int icopy=0;icopy<ncopies;icopy++) // for(int jcopy=icopy+1;jcopy<ncopies;jcopy++) // for(int kcopy=jcopy+1;kcopy<ncopies;kcopy++) // for(int lcopy=kcopy+1;lcopy<ncopies;lcopy++) // { // a+= // base_Tr[ind(0,M_dM,icopy)]* // base_Tr[ind(0,M_dM,jcopy)]* // base_Tr[ind(0,M_dM,kcopy)]* // base_Tr[ind(0,M_dM,lcopy)]; // nc+=1; // } // double ex=a.real()/nc; // double al=full_Tr[ind_full(0,Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM)][iconf]; // cout<<"exact: "<<ex<<", algo: "<<al<<", rel diff: "<<(ex-al)/(ex+al)<<", nc: "<<nc<<" "<<((1.0)*(nconfs)*(ncopies)*(ncopies-1)*(ncopies-2)*(ncopies-3))<<endl; } //close and clusterize fclose(fin); full_Tr.clusterize(clust_size); for(int ifull=0;ifull<nfull_Tr;ifull++) cout<<full_Tr_map[ifull].second<<" ("<<Tr_get_nperm(full_Tr_map[ifull].first)<<" "<<Tr_get_mult(full_Tr_map[ifull].first)<<") = "<<fTr(ifull)<<endl; //compute susc2 jack susc2_disc=(fTr(Tr_M_dM_Tr_M_dM)-sqr(fTr(Tr_M_dM)))/(16*V4); jack susc2_conn=(fTr(Tr_M_d2M)-fTr(Tr_M_dM_M_dM))/(4*V4); jack susc2_tot=susc2_conn+susc2_disc; jack susc4= -6*fTr(Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM)/64 +1*fTr(Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM)/256 +6*fTr(Tr_M_d2M_Tr_M_dM_Tr_M_dM)/64 -3*fTr(Tr_M_dM_Tr_M_dM)*fTr(Tr_M_d2M)/64 +3*fTr(Tr_M_dM_Tr_M_dM)*fTr(Tr_M_dM_M_dM)/64 -3*fTr(Tr_M_dM_Tr_M_dM)*fTr(Tr_M_dM_Tr_M_dM)/256 -6*fTr(Tr_M_d2M_Tr_M_dM_M_dM)/16 +3*fTr(Tr_M_dM_M_dM_Tr_M_dM_M_dM)/16 +1*fTr(Tr_M_dM_M_dM_M_dM_Tr_M_dM)/2 +1*fTr(Tr_M_dM_Tr_M_dM)/16 +3*fTr(Tr_M_d2M_Tr_M_d2M)/16 -33*fTr(Tr_M_dM_Tr_M_dM_M_d2M)/64 -3*fTr(Tr_M_d2M)*fTr(Tr_M_d2M)/16 +3*fTr(Tr_M_d2M)*fTr(Tr_M_dM_M_dM)/16 -3*fTr(Tr_M_d2M)*fTr(Tr_M_dM_Tr_M_dM)/64 -3*fTr(Tr_M_d2M_M_d2M)/4 +3*fTr(Tr_M_d2M_M_dM_M_dM)/1 -1*fTr(Tr_M_dM_M_dM)/1 -3*fTr(Tr_M_dM_M_dM_M_dM_M_dM)/2 +1*fTr(Tr_M_d2M)/4 +3*fTr(Tr_M_dM_M_dM)*fTr(Tr_M_d2M)/16 -3*fTr(Tr_M_dM_M_dM)*fTr(Tr_M_dM_M_dM)/16 +3*fTr(Tr_M_dM_M_dM)*fTr(Tr_M_dM_Tr_M_dM)/64; susc4/=V4*Nt*Nt; cout<<"susc2 = "<<susc2_tot<<endl; cout<<"susc4 = "<<susc4<<endl; return 0; }