Advertisement
Guest User

C average code

a guest
Jun 20th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.35 KB | None | 0 0
  1. /**
  2. * Программа для подсчета термодинамических средних величин на заданном интервале температур.
  3. * На вход получает плотность вероятности состояний, на выходе выдает термодинамически усредненные значения.
  4. *
  5. * Входной файл должен состоять из двух столбцов, разделенных знаком табуляции:
  6. * энергия E и ln(g(E)) где g(E) - количество конфигураций системы,
  7. * которым соответствует энергия E. Все значения столбца g(e) могут быть нормированы, т.е.
  8. * поделены на любую константу. Соответственно при записи ln(g(e)) из всех значений вычтется константа.
  9. * На результат это не повлияет.
  10. *
  11. * В результате работы программа выдаст 4 столбца с данными.
  12. * 1 - температура
  13. * 2 - средняя энергия
  14. * 3 - теплоемкость
  15. * 4 - энтропия
  16. *
  17. * При запуске программа запросит 4 параметра:
  18. * 1. Имя входного файла
  19. * 2. Минимальная температура
  20. * 3. Максимальная температура
  21. * 4. Число спинов системы
  22. **/
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <math.h>
  27.  
  28. //Сколько выделить ячеек памяти под считанный из файла массив данных
  29. #define nlamax (100000)
  30.  
  31. double    iener[nlamax+1];
  32. double g[nlamax+1];
  33.  
  34. int main(void){
  35.     int nla;
  36.     double x,beta;
  37.     int ix,itmin,itmax;
  38.     double tmin,tmax;
  39.  
  40.     int ie;
  41.     double gmax;
  42.  
  43.     int count;
  44.     double a0,ae,ae2,aecp,cv,as,as2,ddummy;
  45.     double weight;
  46.  
  47.     char cdummy[10000];
  48.     FILE *fpw;
  49.  
  50.     char filename[100];
  51.     printf("# Please, input target filename: ");
  52.     if( scanf("%s",filename)==1){}
  53.     else{printf("Error! Can not find the file!");return 0;}
  54.  
  55.  
  56.     fpw=fopen(filename,"r");
  57.     if(fpw == 0){
  58.         printf("Error with open file");
  59.         return 0;
  60.     }
  61.  
  62.    
  63.     printf("# Enter min and max temperature \n");
  64.     if(scanf("%lf\t%lf",&tmin,&tmax)==2){}
  65.     else{printf("Error! Failed to read min and max temperature!"); return 0;}
  66.    
  67.    
  68.     printf("# Enter number of spins  \n");
  69.     if(scanf("%d",&nla)==1){}
  70.     else{printf("Error! Failed to read number of spins!"); return 0;}
  71.  
  72.  
  73.     char c;
  74.  
  75.     for(c=fgetc(fpw);c=='\n'||c=='\r'||c=='#';c=fgetc(fpw)) //пропуск комментариев
  76.         fgets(cdummy,10000,fpw);
  77.  
  78.     fseek(fpw,-1,SEEK_CUR);       // сдвиг курсора на один символ назад
  79.  
  80.     ie=0;
  81.  
  82.     // !обязательно! первые две колонки должны быть энергия и ln(g[E])
  83.     while(fscanf(fpw,"%lf %lf",&iener[ie],&g[ie]) != EOF)
  84.     {
  85.         c=fgetc(fpw);
  86.         if(c=='\n'||c=='\r'){}
  87.             else
  88.             fgets(cdummy,10000,fpw);
  89.  
  90.         if(ie<1){
  91.             printf("# %lf %e\n",iener[ie],g[ie]);
  92.         }
  93.         ie++;
  94.     }
  95.  
  96.     fclose(fpw);
  97.  
  98.     count=ie;
  99.  
  100.  
  101.     itmin=tmin*1000;
  102.     itmax=tmax*1000;
  103.  
  104.     for(ix=itmin; ix<=itmax; ix++){
  105.         x=0.001*ix;
  106.         beta=1./x;
  107.  
  108.         gmax=-1000.;
  109.  
  110.         for(ie=0; ie<count; ie++){
  111.             if(g[ie]-beta*(iener[ie]-iener[0])>gmax){
  112.                 gmax=g[ie]-beta*(iener[ie]-iener[0]);
  113.             }
  114.         }
  115.  
  116.         a0=0;
  117.         ae=0;
  118.         ae2=0;
  119.         aecp=0; //edited
  120.         as2=0;  //edited
  121.  
  122.         for(ie=0; ie<count; ie++){
  123.             weight=exp(g[ie]-beta*(iener[ie]-iener[0])-gmax);
  124.             a0  += weight;
  125.             ae  += weight*iener[ie];
  126.             ae2 += weight*iener[ie]*iener[ie];
  127.         }
  128.  
  129.         aecp=ae;  //edited
  130.  
  131.         ae  /= (double)nla;
  132.         ae2 /= (double)nla*(double)nla;
  133.  
  134.         ae  /= a0;
  135.         ae2 /= a0;
  136.         aecp /= a0;  //edited
  137.  
  138.         as2 = (log(a0) + gmax - beta*iener[0] + aecp*beta)/(double)nla; //edited
  139.  
  140.         cv = beta*beta*(ae2-ae*ae)*(double)nla;
  141.  
  142.         printf("%f %e %e %e \n",x,ae,cv,as2); //edited
  143.  
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement