-
Notifications
You must be signed in to change notification settings - Fork 1
/
average.c
120 lines (85 loc) · 2.7 KB
/
average.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define nlamax (16*8*8*8*8*8*8) // !не знаю какой нужно задать размер?
double iener[4*nlamax+1];
double g[4*nlamax+1];
int main(void){
int nla;
double x,beta;
int ix,itmin,itmax;
double tmin,tmax;
int ie;
double gmax;
int count;
double a0,ae,ae2,aecp,cv,as,as2; //edited
double weight;
char cdummy[10000];
FILE *fpw;
char filename[100];
printf("# Please, input target filename: ");
if( scanf("%s",filename)==1){}
else{printf("Error! Can not find the file!");return 0;}
fpw=fopen(filename,"r");
if(fpw == 0){
printf("Error with open file");
return 0;
}
printf("# Enter min and max temperature \n");
if(scanf("%lf %lf",&tmin,&tmax)==2){}
else{printf("Error! Failed to read min and max temperature!"); return 0;}
printf("# Enter number of spins \n");
if(scanf("%d",&nla)==1){}
else{printf("Error! Failed to read number of spins!"); return 0;}
char c;
for(c=fgetc(fpw);c=='\n'||c=='\r'||c=='#';c=fgetc(fpw)) //пропуск комментариев
fgets(cdummy,10000,fpw);
fseek(fpw,-1,SEEK_CUR); // сдвиг курсора на один символ назад
ie=0;
// !обязательно! первые две колонки должны быть энергия и g[E], остальное неважно
while(fscanf(fpw,"%lf %lf",&iener[ie],&g[ie]) != EOF)
{
c=fgetc(fpw);
if(c=='\n'||c=='\r'){}
else
fgets(cdummy,10000,fpw);
if(ie<1){
printf("# %lf %e\n",iener[ie],g[ie]);
}
ie++;
}
fclose(fpw);
count=ie;
itmin=tmin*1000;
itmax=tmax*1000;
for(ix=itmin; ix<=itmax; ix++){
x=0.001*ix;
beta=1./x;
gmax=-1000.;
for(ie=0; ie<count; ie++){
if(g[ie]-beta*(iener[ie]-iener[0])>gmax){
gmax=g[ie]-beta*(iener[ie]-iener[0]);
}
}
a0=0;
ae=0;
ae2=0;
aecp=0; //edited
as2=0; //edited
for(ie=0; ie<count; ie++){
weight=exp(g[ie]-beta*(iener[ie]-iener[0])-gmax);
a0 += weight;
ae += weight*iener[ie];
ae2 += weight*iener[ie]*iener[ie];
}
aecp=ae; //edited
ae /= (double)nla;
ae2 /= (double)nla*(double)nla;
ae /= a0;
ae2 /= a0;
aecp /= a0; //edited
as2 = (log(a0) + gmax - beta*iener[0] + aecp*beta)/(double)nla; //edited
cv = beta*beta*(ae2-ae*ae)*(double)nla;
printf("%f %e %e %e \n",x,ae,cv,as2); //edited
}
}