Esempio n. 1
0
/************************ begin main **********************************/
int main()
{
    FILE *fp;                   /* file to output data */
    int lattice[ SIZE+1 ];      /* 1d lattice for spins */
    double T = 1;                 /* temperature loop variable */
    int i, j, k;                   /* loop variables */

    double E, E_avg, E_tot=0;        /* for energy observables */
    double norm;
    int de;
    int samples;

    int step[TESTS] = {1, 5, 10, 25, 50, 100, 150, 200, 250, 500, 750, 1000,
                        5000, 10000, 50000, 75000, 100000, 200000, 500000, 750000};

    /* initialize random number generator */
    init_KISS();

    fp = fopen("MCsteps.txt", "w");
    fprintf(fp, "# steps, energy\n");

    fill_lattice(lattice);
    initialize(lattice, T);

    E = total_energy(lattice);
    E_tot = 0;
    samples = 0;
    i = 0;
    k = 0;

    while( i <= 18 )
    {
        /* Metropolis loop */
        for (j=0; j<=SIZE; j++)
        {
            de = new_energy(lattice, j) - local_energy(lattice, j);
            if ( test_flip(lattice, j, T, de) )
            {
                flip(lattice, j);
                E += de;
            }
        }

        if ( k % 20 == 0 )
        {
            E_tot += E / 2.0;
            samples++;
        }

        if ( samples == step[i] )
        {
            norm =  1 / ((double)samples * SIZE);
            E_avg = E_tot * norm;
            fprintf(fp, "%d, %f\n", samples, E_avg);
            i++;
        }
        k++;
    }

    fclose(fp);

    return 0;
}
Esempio n. 2
0
int
main (int argc, char * argv[])
{
  int i,j;
  int size = argc - 2;
  int *data  = (int *)  malloc(sizeof(int)*size);
  int sidelength, spacedims, spindims;
  int * loc;
  int num;
  gsl_rng * rng;
  const gsl_rng_type * RngType;
  gsl_rng_env_setup();
  RngType = gsl_rng_default;
  rng = gsl_rng_alloc (RngType);
  gsl_vector ** lattice;
  gsl_vector * magnet;
  double mag,energy;

  /* Read in data */
  if(size != 0)
  {
    for (i = 0 ; i< size ; i++)
    {
      data[i] = atoi(argv[i+2]);
    }
  }
  switch(atoi(argv[1]))
  {
    case 0: /* Magnetization */
      /**********************************************
       * Outputs magnetization of a uniform lattice *
       **********************************************/
      sidelength = data[0];
      spacedims  = data[1];
      spindims   = data[2];
      magnet = gsl_vector_alloc(spindims);
      lattice = allocate_lattice(sidelength,spacedims,spindims);
      set_homogenious_spins(lattice,sidelength,spacedims,spindims);
      mag = magnetization(lattice,sidelength,spacedims,spindims,magnet);
      free_lattice(lattice,sidelength,spacedims);
      printf("%2.1f\n",mag);
      break;
    case 1: /* Local Energy */
      /**********************************************
       * Outputs energy of a uniform lattice point *
       **********************************************/
      sidelength = data[0];
      spacedims  = data[1];
      spindims   = data[2];
      loc        = (int *) malloc(sizeof(int)*spacedims);
      for(i = 0 ; i < spacedims ; i++)
        loc[i] = data[i+3];
      lattice = allocate_lattice(sidelength,spacedims,spindims);
      set_homogenious_spins(lattice,sidelength,spacedims,spindims);
      energy = 0;
      energy = local_energy(lattice, sidelength, spacedims, spindims, loc);
      free_lattice(lattice,sidelength,spacedims);
      printf("%1.3e\n",energy);
      break;
    case 2: /* Total Energy */
      /********************************************
       * Outputs energy of a checkerboard lattice *
       ********************************************/
      sidelength = data[0];
      spacedims  = data[1];
      spindims   = data[2];
      lattice = allocate_lattice(sidelength,spacedims,spindims);
      set_checkerboard_spins(lattice,sidelength,spacedims,spindims);
      energy = total_energy(lattice, sidelength, spacedims, spindims );
      printf("%1.3e\n",energy);
      break;
    default:
      printf("No arguments!\n");
      exit(EXIT_FAILURE);
  }

}