Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Выч.физ / Ising_1D

.cpp
Скачиваний:
9
Добавлен:
12.02.2015
Размер:
3.35 Кб
Скачать
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<time.h>
#include "randomc.h"
#include "mersenne.cpp"

FILE *OUT, *IN, *END;

double T;
long start_configuration_max, mks_max;
long N;

long seed, counter;

int sp[100000];


int SOSEDY ( int i )
{
    int rez;
    if(i==0)
     {
         rez=sp[N-1];
     }
    else
     {
         rez=sp[i-1];
     }
    if(i==N-1)
     {
         rez=rez+sp[0];
     }
    else
     {
         rez=rez+sp[i+1];
     }
    return rez;
}


double MAGNETIC ( )
{
    long i;
    double rez=0.0;
    for(i=0;i<N;i++)
     {
         rez=rez+sp[i];
     }
    return rez/N;
}


double ENERGY ( )
{
    long i;
    double rez=0.0;
    for(i=0;i<N;i++)
     {
         rez=rez - sp[i]*SOSEDY(i);
     }
    return rez/N;
}


void INITIAL ( )
{
    long i;
    for(i=0;i<N;i++)
     {
         sp[i]=1;
     }
}


int main ( void )
{
    IN = fopen("CONFIGURATION.dat","r");
    OUT = fopen("OUT.dat","w+");

    if((OUT==NULL)||(IN==NULL))
     {
         printf("\n ERROR!");
         getch();
         return 0;
     }

    double r, w;
    long i, a, start_configuration, start_configuration_real=0, mks, ss;
    int sp_new, dE;

    fscanf(IN,"%lf",&T);
    fscanf(IN,"%ld",&start_configuration_max);
    fscanf(IN,"%ld",&mks_max);
    fscanf(IN,"%ld",&N);
    fscanf(IN,"%ld",&ss);

    printf("T = %4.3lf\n",T);
    printf("start_configuration_max = %ld\n",start_configuration_max);
    printf("mks_max = %ld\n",mks_max);
    printf("N = %ld\n",N);
    printf("ss = %ld\n",ss);

    fclose(IN);

    seed = time(0);
    CRandomMersenne Mersenne(seed);

    INITIAL();

    for(start_configuration=0;start_configuration<start_configuration_max;start_configuration++)
     {
         if(start_configuration%ss==0)
          {
              printf("\n End %d configuration",start_configuration);
          }

         for(mks=0;mks<mks_max;mks++)
          {
              seed = time(0) + (start_configuration%100) + (mks%1000);
              Mersenne.RandomInit(seed);

              for(a=0;a<N;a++)
               {
                   i = Mersenne.IRandomX(0,N-1);

                   r=Mersenne.IRandomX(0,999)/1000.0;
                   if(r>0.5)
                    {
                        sp_new=sp[i];
                    }
                   else
                    {
                        sp_new=-sp[i];
                    }

                   dE = (sp[i] - sp_new) * SOSEDY(i);
                   if(dE<0)
                    {
                        sp[i]=sp_new;
                        continue;
                    }

                   w=1.0/exp(-dE/T);
                   r=Mersenne.IRandomX(0,999)/1000.0;

                   if(w>=r)
                    {
                        sp[i]=sp_new;
                    }

               }

              r=MAGNETIC();
              fprintf(OUT,"%15.14lf\n",r);
              r=ENERGY();
              fprintf(OUT,"%15.14lf\n",r);
          }

         END = fopen("END.dat","w+");
         start_configuration_real++;
         fprintf(END,"%ld",start_configuration_real);
         fclose(END);
     }

    fclose(OUT);
}



















Соседние файлы в папке Выч.физ
  • #
    12.02.201525 б7CONFIGURATION.dat
  • #
    12.02.20152 б7END.dat
  • #
    12.02.201590 Кб9ERROR_E.dat
  • #
    12.02.201590 Кб10ERROR_M.dat
  • #
    12.02.201530.21 Кб11include.doc
  • #
    12.02.20153.35 Кб9Ising_1D.cpp
  • #
    12.02.20155.82 Кб8Ising_1D.o
  • #
    12.02.20156.24 Кб9mersenne.cpp
  • #
    12.02.201528.32 Mб8OUT.dat
  • #
    12.02.20157.54 Кб9randomc.h
  • #
    12.02.201595.09 Кб8RESULT_E.dat