EstOutput SharedJackknife::getValues(vector<SharedRAbundVector*> vectorShared){ //Fix this for collect, mistake was that it was made with summary in mind. try { SharedRAbundVector* shared1 = vectorShared[0]; SharedRAbundVector* shared2 = vectorShared[1]; if(numGroups == -1) { numGroups = m->getNumGroups(); } if(callCount == numGroups*(numGroups-1)/2) { currentCallDone = true; callCount = 0; } callCount++; if(currentCallDone) { groups.clear(); currentCallDone = false; } if(groups.size() != numGroups) { if(groups.size() == 0) groups.push_back(shared1); groups.push_back(shared2); } if(groups.size() == numGroups && callCount < numGroups) { data.resize(3,0); double* rdata = jackknife(); data[0] = rdata[0]; data[1] = rdata[1]; data[2] = rdata[2]; if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; } if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; } if (isnan(data[2]) || isinf(data[0])) { data[2] = 0; } return data; } data.resize(3,0); data[0] = 0; data[1] = 0; data[2] = 0; if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; } if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; } if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; } return data; } catch(exception& e) { m->errorOut(e, "SharedJackknife", "getValues"); exit(1); } }
int main () { int traces_id2[2]; int traces_id3[3]; int traces_id4[4]; double complex Tr_M_dM[nflavs]; double complex Tr_M_d2M[nflavs]; double complex Tr_M_dM_M_dM[nflavs]; double complex Tr_M_dM2[nflavs]; double complex Tr_M_dM3[nflavs]; double complex Tr_M_dM_Tr_M_dM_M_dM[nflavs]; double complex Tr_M_dM_Tr_M_d2M[nflavs]; double complex Tr_M_dM_M_d2M[nflavs]; double complex Tr_M_dM_M_dM_M_dM[nflavs]; double complex Tr_M_d2M_M_d2M[nflavs]; double complex Tr_M_dM_M_dM_M_d2M[nflavs]; double complex Tr_M_dM_M_dM_M_dM_M_dM[nflavs]; double complex Tr_M_d2M_Tr_M_dM_M_dM[nflavs]; double complex Tr_M_dM_Tr_M_dM_M_d2M[nflavs]; double complex Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[nflavs]; double complex Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[nflavs]; double complex Tr_M_dM_Tr_M_dM_Tr_M_d2M[nflavs]; double complex Tr_M_dM_M_dM_Tr_M_dM_M_dM[nflavs]; double complex Tr_M_dM_M_dM_M_dM_Tr_M_dM[nflavs]; double complex Tr_M_d2M_Tr_M_d2M[nflavs]; //definisci i vettori per le tracce delle suscettività miste double complex err_diag[nflavs]; double complex susc_jack_diag[nflavs]; double complex susc_jack_diag_2nd[nflavs]; //init to zero for(int iflav=0;iflav<nflavs;iflav++) { Tr_M_dM[iflav]=Tr_M_d2M[iflav]=Tr_M_dM_M_dM[iflav]=Tr_M_dM2[iflav]=Tr_M_dM_M_d2M[iflav]=0; Tr_M_d2M_M_d2M[iflav]= Tr_M_dM_M_dM_M_d2M[iflav]= Tr_M_dM_M_dM_M_dM_M_dM[iflav]= Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]= Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[iflav]=Tr_M_d2M_Tr_M_dM_M_dM[iflav]=Tr_M_dM_Tr_M_dM_M_d2M[iflav]=0; Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]= Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav]= Tr_M_d2M_Tr_M_d2M[iflav]=Tr_M_dM_M_dM_Tr_M_dM_M_dM[iflav]=0; Tr_M_dM_M_dM_M_dM[iflav]=Tr_M_dM3[iflav]=Tr_M_dM_Tr_M_d2M[iflav]=Tr_M_dM_Tr_M_dM_M_dM[iflav]=err_diag[iflav]=0; } //loop until reach end of file double complex MAT_RES[ncopies_eff][nflavs*nind_trace]; FILE *file_in=open_file("rende_new.txt","r"); int nconfs=0; int eof=0; while(!eof) { //init to zero temp traces //loop over copies for(int icopy=0;icopy<ncopies;icopy++) { //skip iconf: if not read it means we reached eof int puppa; if(fscanf(file_in,"%d",&puppa)!=1) eof=1; if(!eof) for(int j=0;j<nflavs*nind_trace;j++) { //load real and immaginary part double re,im; if(fscanf(file_in,"%lf %lf",&re,&im)!=2) { fprintf(stderr,"error reading re/im for copy %d flavour/nind_trace %d\n",icopy,j); exit(1); } //put in place if(icopy<ncopies_eff && nconfs>=conf_out_eq) MAT_RES[icopy][j]=re+I*im; } } if(!eof) { if(nconfs>=conf_out_eq) { //loop over flavour for(int iflav=0;iflav<nflavs;iflav++) { //compute all mean values //compute TR_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_dM[iflav]+= MAT_RES[icopy][iflav*nind_trace+0]; //store the trace computed over one config. Will be used when computing Tr_(dMM)_i_Tr(dMM)_j } //compute TR_M_d2M for(int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_d2M[iflav]+= MAT_RES[icopy][iflav*nind_trace+1]; } //compute TR_M_dM_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_dM_M_dM[iflav]+=MAT_RES[icopy][iflav*nind_trace+2]; } //compute TR_M_dM_M_d2M for(int icopy=0;icopy<ncopies_eff;icopy++) Tr_M_dM_M_d2M[iflav]+=MAT_RES[icopy][iflav*nind_trace+4]; //compute TR_M_dM_M_dM_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) Tr_M_dM_M_dM_M_dM[iflav]+=MAT_RES[icopy][iflav*nind_trace+5]; //compute (TrM_dM)^2 traces_id2[0]=0; traces_id2[1]=0; Tr_M_dM2[iflav]+= traces_calculator(2,traces_id2, MAT_RES, iflav); //store the trace computed over one config. Will be used when computing the products of traces of different flavour matrix //compute (TrM_dM)(Tr(M_dM)^2) for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+0]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+2]; Tr_M_dM_Tr_M_dM_M_dM[iflav]+=complex1*complex2; //compute the products for rcopy<icopy complex1=MAT_RES[rcopy][iflav*nind_trace+0]; complex2=MAT_RES[icopy][iflav*nind_trace+2]; Tr_M_dM_Tr_M_dM_M_dM[iflav]+=complex1*complex2; } //compute (TrM_dM)(TrM_d2M) for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+0]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+1]; Tr_M_dM_Tr_M_d2M[iflav]+=complex1*complex2; //compute the products for rcopy<ncopy complex1=MAT_RES[rcopy][iflav*nind_trace+0]; complex2=MAT_RES[icopy][iflav*nind_trace+1]; Tr_M_dM_Tr_M_d2M[iflav]+=complex1*complex2; } //compute (TrM_dM)^3 traces_id3[0]=0; traces_id3[1]=0; traces_id3[2]=0; Tr_M_dM3[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); //Traces at order 4 //compute Tr_M_d2M_M_d2M for (int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_d2M_M_d2M[iflav] += MAT_RES[icopy][iflav*nind_trace + 6]; } //compute Tr_M_d2M_M_dM_M_dM for (int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_dM_M_dM_M_d2M[iflav] += MAT_RES[icopy][iflav*nind_trace + 7]; } //compute Tr_M_dM_M_dM_M_dM_M_dM for (int icopy=0;icopy<ncopies_eff;icopy++) { Tr_M_dM_M_dM_M_dM_M_dM[iflav] += MAT_RES[icopy][iflav*nind_trace + 8]; } // compute Tr_M_dM_Tr_M_dM_M_d2M for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+0]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+4]; Tr_M_d2M_Tr_M_dM_M_dM[iflav]+=complex1*complex2; //compute the products for rcopy<ncopy complex1=MAT_RES[rcopy][iflav*nind_trace+0]; complex2=MAT_RES[icopy][iflav*nind_trace+4]; Tr_M_d2M_Tr_M_dM_M_dM[iflav]+=complex1*complex2; } //compute Tr_M_d2M_Tr_M_dM_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+1]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+2]; Tr_M_d2M_Tr_M_dM_M_dM[iflav]+=complex1*complex2; //compute the products for rcopy<ncopy complex1=MAT_RES[rcopy][iflav*nind_trace+1]; complex2=MAT_RES[icopy][iflav*nind_trace+2]; Tr_M_d2M_Tr_M_dM_M_dM[iflav]+=complex1*complex2; } //compute Tr_M_dM_M_dM_Tr_M_dM_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+2]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+2]; Tr_M_dM_M_dM_Tr_M_dM_M_dM[iflav]+=complex1*complex2; } //compute Tr_M_dM_M_dM_M_dM_Tr_M_dM for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+5]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+0]; Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav]+=complex1*complex2; //compute the products for rcopy<ncopy complex1=MAT_RES[rcopy][iflav*nind_trace+5]; complex2=MAT_RES[icopy][iflav*nind_trace+0]; Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav]+=complex1*complex2; } //compute Tr_M_d2M_Tr_M_d2M for(int icopy=0;icopy<ncopies_eff;icopy++) for(int rcopy=icopy+1;rcopy<ncopies_eff;rcopy++) { double complex complex1=MAT_RES[icopy][iflav*nind_trace+1]; double complex complex2=MAT_RES[rcopy][iflav*nind_trace+1]; Tr_M_d2M_Tr_M_d2M[iflav]+=complex1*complex2; } //compute Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM traces_id3[0]=2; traces_id3[1]=0; traces_id3[2]=0; Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); traces_id3[0]=0; traces_id3[1]=2; traces_id3[2]=0; Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); traces_id3[0]=0; traces_id3[1]=0; traces_id3[2]=2; Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); //compute Tr_M_d2M_Tr_M_dM_Tr_M_dM traces_id3[0]=0; traces_id3[1]=0; traces_id3[2]=1; Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); traces_id3[0]=0; traces_id3[1]=1; traces_id3[2]=0; Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); traces_id3[0]=1; traces_id3[1]=0; traces_id3[2]=0; Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]+= traces_calculator(3,traces_id3, MAT_RES, iflav); //compute Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM traces_id4[0]=0; traces_id4[1]=0; traces_id4[2]=0; traces_id4[3]=0; Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[iflav] += traces_calculator(4,traces_id4, MAT_RES, iflav); //** FINE DELLA PARTE DI CALCOLO DELLE TRACCE **// //exit from loop over flavour } //exit from loop over copies } printf("%d \n",nconfs); nconfs++; } //end of the reading part } //close and print the number of confs fclose(file_in); printf("Nconfs read: %d\n",nconfs); printf("Nconfs used: %d\n", nconfs- conf_out_eq); nconfs -= conf_out_eq; //save the traces before normalization (for jackknife) const int n_traces=20; double complex Tr_S[n_traces][nflavs]; for(int iflav=0;iflav<nflavs;iflav++) { Tr_S[0][iflav]= Tr_M_dM[iflav]; Tr_S[1][iflav]= Tr_M_d2M[iflav]; Tr_S[2][iflav]= Tr_M_dM_M_dM[iflav]; Tr_S[3][iflav]= Tr_M_dM2[iflav]; Tr_S[4][iflav]= Tr_M_dM3[iflav]; Tr_S[5][iflav]= Tr_M_dM_Tr_M_dM_M_dM[iflav]; Tr_S[6][iflav]= Tr_M_dM_Tr_M_d2M[iflav]; Tr_S[7][iflav]= Tr_M_dM_M_d2M[iflav]; Tr_S[8][iflav]= Tr_M_dM_M_dM_M_dM[iflav]; Tr_S[9][iflav]= Tr_M_d2M_M_d2M[iflav]; Tr_S[10][iflav]= Tr_M_dM_M_dM_M_d2M[iflav]; Tr_S[11][iflav]= Tr_M_dM_M_dM_M_dM_M_dM[iflav]; Tr_S[12][iflav]= Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]; Tr_S[13][iflav]= Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[iflav]; Tr_S[14][iflav]= Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]; Tr_S[15][iflav]= Tr_M_dM_M_dM_Tr_M_dM_M_dM[iflav]; Tr_S[16][iflav]= Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav]; Tr_S[17][iflav]= Tr_M_d2M_Tr_M_d2M[iflav]; Tr_S[18][iflav]= Tr_M_d2M_Tr_M_dM_M_dM[iflav]; Tr_S[19][iflav]= Tr_M_dM_Tr_M_dM_M_d2M[iflav]; } const double V_4=32.0*32.0*4.0; // normalize the traces for(int iflav=0;iflav<nflavs;iflav++) { Tr_M_dM2[iflav] = (2.0*Tr_M_dM2[iflav])/((nconfs)*(ncopies_eff)*(ncopies_eff -1)); Tr_M_dM[iflav]= ((1.0)*Tr_M_dM[iflav])/((nconfs)*(ncopies_eff)); Tr_M_dM_M_dM[iflav]= ((1.0)*Tr_M_dM_M_dM[iflav])/((nconfs)*(ncopies_eff)); Tr_M_d2M[iflav]= ((1.0)*Tr_M_d2M[iflav])/((nconfs)*(ncopies_eff)); Tr_M_dM_M_d2M[iflav]= ((1.0)*Tr_M_dM_M_d2M[iflav])/((nconfs)*(ncopies_eff)); Tr_M_dM_M_dM_M_dM[iflav]= ((1.0)*Tr_M_dM_M_dM_M_dM[iflav])/((nconfs)*(ncopies_eff)); Tr_M_dM_Tr_M_dM_M_dM[iflav] = ((1.0)*Tr_M_dM_Tr_M_dM_M_dM[iflav])/((nconfs)*(ncopies_eff)*(ncopies_eff -1)); Tr_M_dM_Tr_M_d2M[iflav] = ((1.0)*Tr_M_dM_Tr_M_d2M[iflav])/((nconfs)*(ncopies_eff)*(ncopies_eff -1)); Tr_M_dM3[iflav] = ((6.0)*Tr_M_dM3[iflav])/((nconfs)*(ncopies_eff)*(ncopies_eff -1)*(ncopies_eff -2)); Tr_M_d2M_M_d2M[iflav]*= (1.0)/((nconfs)*(ncopies_eff)); Tr_M_dM_M_dM_M_d2M[iflav]*= (1.0)/((nconfs)*(ncopies_eff)); Tr_M_dM_M_dM_M_dM_M_dM[iflav]*= (1.0)/((nconfs)*(ncopies_eff)); Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav]*=(2.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)*(ncopies_eff-2)); Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[iflav]*=(24.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)*(ncopies_eff-2)*(ncopies_eff-3)); Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav]*= (2.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)*(ncopies_eff-2)); Tr_M_dM_M_dM_Tr_M_dM_M_dM[iflav]*=(2.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)); Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav]*= (1.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)); Tr_M_d2M_Tr_M_d2M[iflav]*=(2.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)); Tr_M_d2M_Tr_M_dM_M_dM[iflav] *= (1.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)); Tr_M_dM_Tr_M_dM_M_d2M[iflav] *= (1.0)/((nconfs)*(ncopies_eff)*(ncopies_eff-1)); } //// end of normalization //compute susceptibilities //compute and store diagonal susceptibilities for(int iflav=0;iflav<nflavs;iflav++) { double complex susc_diag= -((6.0)/(64))*Tr_M_dM_M_dM_Tr_M_dM_Tr_M_dM[iflav] +((1.0)/(256))*Tr_M_dM_Tr_M_dM_Tr_M_dM_Tr_M_dM[iflav] +((6.0)/(64))*Tr_M_dM_Tr_M_dM_Tr_M_d2M[iflav] -((3.0)/(64))*Tr_M_dM2[iflav]*Tr_M_d2M[iflav] +((3.0)/(64))*Tr_M_dM2[iflav]*Tr_M_dM_M_dM[iflav] -((3.0)/(256))*Tr_M_dM2[iflav]*Tr_M_dM2[iflav] -((6.0)/(16))*Tr_M_d2M_Tr_M_dM_M_dM[iflav] +((3.0)/(16))*Tr_M_dM_M_dM_Tr_M_dM_M_dM[iflav] +((1.0)/(2))*Tr_M_dM_M_dM_M_dM_Tr_M_dM[iflav] -((1.0)/(16))*Tr_M_dM2[iflav] +((3.0)/(16))*Tr_M_d2M_Tr_M_d2M[iflav] -((33.0)/(64))*Tr_M_dM_Tr_M_dM_M_d2M[iflav] -((3.0)/(16))*Tr_M_d2M[iflav]*Tr_M_d2M[iflav] +((3.0)/(16))*Tr_M_d2M[iflav]*Tr_M_dM_M_dM[iflav] -((3.0)/(64))*Tr_M_d2M[iflav]*Tr_M_dM2[iflav] -((3.0)/(4))*Tr_M_d2M_M_d2M[iflav] +((3.0)/(1))*Tr_M_dM_M_dM_M_d2M[iflav] +((1.0)/(1))*Tr_M_dM_M_dM[iflav] -((3.0)/(2))*Tr_M_dM_M_dM_M_dM_M_dM[iflav] -((1.0)/(4))*Tr_M_d2M[iflav] +((3.0)/(16))*Tr_M_dM_M_dM[iflav]*Tr_M_d2M[iflav] -((3.0)/(16))*Tr_M_dM_M_dM[iflav]*Tr_M_dM_M_dM[iflav] +((3.0)/(64))*Tr_M_dM_M_dM[iflav]*Tr_M_dM2[iflav]; susc_diag *= (1.0)/V_4; //store susc for jackknife susc_jack_diag[iflav]=susc_diag; } //compute diagonal susceptibilities for(int iflav=0; iflav<nflavs;iflav++) { double complex susc_disc=(1.0/(16*V_4))*(Tr_M_dM2[iflav]-Tr_M_dM[iflav]*Tr_M_dM[iflav]); double complex susc_conn=(1.0/(4*V_4))*(Tr_M_d2M[iflav]-Tr_M_dM_M_dM[iflav]); double complex tot=susc_conn+susc_disc; susc_jack_diag_2nd[iflav]=tot; printf("%lf %d \n", creal(susc_jack_diag_2nd[iflav]),iflav); } //Qui memorizzo di nuovo le tracce. Salvo tutto in un matricione perchè mi serve poi nel Jackknife quando devo fare le medie sui blocchi. FILE *file_in2= open_file("rende_new.txt","r"); double complex **mat_restot; mat_restot= (double complex **)malloc(nconfs*ncopies_eff*sizeof(double complex*)); for(int i=0;i<nconfs*ncopies_eff;i++) { mat_restot[i]= (double complex *)malloc(nflavs*nind_trace*sizeof(double complex)); } int iconf=0; eof=0; while(!eof) { //loop over copies for(int icopy=0;icopy<ncopies;icopy++) { //skip iconf: if not read it means we reached eof int puppa; if(fscanf(file_in2,"%d",&puppa)!=1) eof=1; if(!eof) for(int j=0;j<nflavs*nind_trace;j++) { //load real and immaginary part double re,im; if(fscanf(file_in2,"%lf %lf",&re,&im)!=2) { fprintf(stderr,"error reading re/im for copy %d flavour/nind_trace %d\n",icopy,j); exit(1); } //put in place // 2nd cond is to skip non-termalized confs if(iconf>=conf_out_eq && icopy<ncopies_eff) mat_restot[icopy + (iconf-conf_out_eq)*ncopies_eff ][j]=re+I*im; } } if(!eof) iconf++; } fclose(file_in2); printf("%d \n",iconf); printf("%d \n", iconf -conf_out_eq); //calcolo l'errore sulle suscettivita del terz'ordine int block_size_max= 12; int file_created=0; for(int block_size=1; block_size< block_size_max; block_size++) { int error=0; error=jackknife(file_created,err_diag,ncopies_eff,block_size,nconfs,Tr_S,susc_jack_diag,mat_restot); if (error!=0) { printf("errore nel blocco: %d", block_size); exit(1); } file_created=1; printf("block_size:%d \n",block_size); } // //compute the average of the jackknife estimation of variance (average over block size); for(int iflav=0; iflav<nflavs;iflav++) { err_diag[iflav] /= block_size_max -4; } // //stampo i risultati //memorizzo il potenziale chimico FILE *file_pot= open_file("pot.txt", "r"); //ora questa parte è inutile ma serviva prima quando c'erano tanti run a vari potenziali chimici double u,d,s; if(fscanf(file_pot,"%lf %lf %lf",&u,&d,&s)!=3) { fprintf(stderr,"errore nel leggere i potenziali chimici"); exit(1); } fclose(file_pot); //create file and store the results //check di esistenza del file int b=0; FILE *file_check= fopen("suscettivita_4_ord.txt","r"); if (file_check==NULL) b=1; else fclose(file_check); FILE *file_out_bis=open_file("suscettivita_4_ord.txt",b?"w":"a"); //stampa le suscettività for(int iflav=0;iflav<nflavs;iflav++) fprintf(file_out_bis,"%lf %lf \t",-creal(susc_jack_diag[iflav])/(N_t*N_t), creal(err_diag[iflav])/(N_t*N_t)); fprintf(file_out_bis,"\n"); fclose(file_out_bis); //disalloco la memoria for(int i=0;i<nconfs*ncopies_eff;i++) free(mat_restot[i]); free(mat_restot); return 0; }
int main ( int argc, char *argv[] ) { if( argc < 2 ){ printf( "usage: %s <input.bin> [<input.bin>]\n", argv[0] ); return 0; } int i; for(i = 1; i < argc; i++){ /* read from input */ FILE *fin; if( !(fin = fopen(argv[i], "rb") ) ){ printf("Error opening file: %s\n", argv[i]); break; } /*** energy ***/ raw storage = load_data(fin,0,1000); int t; int n_states = storage.hdr.q; int lattice_size = storage.hdr.l; double beta_value = storage.hdr.b; int bin_size = 50; double n_bins = storage.hdr.size / bin_size; double *binned_data, mean, error; /* open output and write header */ char output[50]; sprintf(output, "data/%d_%s.obs", lattice_size, storage.hdr.algorithm ); FILE *fout = fopen(output,"a"); fprintf(fout, "%e\t", beta_value ); /* header */ /* mean */ binned_data = jackknife(storage.data, storage.hdr.size, bin_size ); mean = 0.0f; for(t = 0; t < n_bins; t++) mean += binned_data[t]; mean /= n_bins; free(binned_data); fprintf(fout, "%e\t", mean ); /* energy */ /* variance */ for(t = 0; t < storage.hdr.size; t++) storage.data[t] = (storage.data[t]-mean)*(storage.data[t]-mean); binned_data = jackknife(storage.data, storage.hdr.size, bin_size ); raw_close(&storage); mean = 0.0f; for(t = 0; t < n_bins; t++) mean += binned_data[t]; mean /= n_bins; error = 0.0f; for(t = 0; t < n_bins; t++) error += (binned_data[t]-mean)*(binned_data[t]-mean); error *= (n_bins-1.0f)/n_bins; free(binned_data); mean *= beta_value * beta_value * lattice_size * lattice_size; error = beta_value * beta_value * lattice_size * lattice_size * sqrt(error); fprintf(fout, "%e\t%e\t", mean, error ); /* heat capacity w error */ /*** magnetization ***/ storage = load_data(fin,1+n_states,1000); /* mean */ binned_data = jackknife(storage.data, storage.hdr.size, bin_size ); mean = 0.0f; for(t = 0; t < n_bins; t++) mean += binned_data[t]; mean /= n_bins; free(binned_data); fprintf(fout, "%e\t", mean ); /* magnetization */ /* variance */ for(t = 0; t < storage.hdr.size; t++) storage.data[t] = (storage.data[t]-mean)*(storage.data[t]-mean); binned_data = jackknife(storage.data, storage.hdr.size, bin_size ); raw_close(&storage); mean = 0.0f; for(t = 0; t < n_bins; t++) mean += binned_data[t]; mean /= n_bins; error = 0.0f; for(t = 0; t < n_bins; t++) error += (binned_data[t]-mean)*(binned_data[t]-mean); error *= (n_bins-1.0f)/n_bins; free(binned_data); mean *= beta_value * lattice_size * lattice_size; error = beta_value * lattice_size * lattice_size * sqrt(error); fprintf(fout, "%e\t%e\t%d\n", mean, error, lattice_size ); /* susceptibility w error */ printf("Written to: %s\t\tβ -> %f\n", output, beta_value); fclose(fout); } return 0; }