Advertisement
Guest User

Cellular automata

a guest
Oct 14th, 2012
1,200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string>
  3. #include <stdlib.h>
  4. #include <Windows.h>
  5. #include <time.h>
  6. #include <conio.h>
  7. #include <omp.h>
  8.  
  9. const int Size = 30;
  10. const int StepsNum = 100;
  11. const int BlockSize = 3;
  12. double *Koeff;
  13. double DiffKoeff = 0, Bmid, Bdiff, Smid, Sdiff;
  14. int PosCell[27][3];
  15. int PosNbr[6][3] = {{-1, 0, 0},{1, 0, 0},{0, -1, 0},{0, 1, 0},{0, 0, -1},{0, 0, 1}};
  16. int Int_Temp[Size][Size][Size];
  17. int Temp_Max = 0, Temp_Opt = 0;
  18. int Space[Size][Size][Size], Temp[Size][Size][Size];
  19. int tm, time1 = 0, Bmin = 0, Bmax = 0, Smin = 0, Smax = 0;
  20. int TSize = 400, LSize = 10;
  21. DWORD real = 0;
  22.  
  23. void Starting ()
  24. {
  25.     int i, j, k, n = 0;
  26.     HANDLE life = CreateFileA("F:\\Разное\\Проекты\\C++\\life\\InitialLife.init", \
  27.                 GENERIC_READ, FILE_SHARE_READ, NULL, \
  28.                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  29.     ReadFile(life, Space, Size * Size * Size * sizeof(int), &real, NULL);
  30.     CloseHandle(life);
  31.     HANDLE tmp = CreateFileA("F:\\Разное\\Проекты\\C++\\life\\InitialTemperature.init", \
  32.                 GENERIC_READ, FILE_SHARE_READ, NULL, \
  33.                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  34.     ReadFile(tmp, Int_Temp, Size * Size * Size * sizeof(int), &real, NULL);
  35.     CloseHandle(tmp);
  36.     FILE *temp = fopen("F:/Разное/Проекты/C++/life/Init.txt", "r");
  37.     fscanf(temp, "%i %i\n%i %i\n%i\n%i\n%le", \
  38.         &Bmin, &Bmax, &Smin, &Smax, &Temp_Max, &Temp_Opt, &DiffKoeff);
  39.     Bmid = float(Bmax + Bmin) / 2.0;
  40.     Bdiff = float(Bmax - Bmin) / 2.0;
  41.     Smid = float(Smax + Smin) / 2.0;
  42.     Sdiff = float(Smax - Smin) / 2.0;
  43.     Koeff = new double [Temp_Max + 1];
  44.     for (i = 0; i < Temp_Opt; i++)
  45.         Koeff[i] = 1.0 / (float)Temp_Opt * (float)i;
  46.     for (i = Temp_Opt; i <= Temp_Max; i++)
  47.         Koeff[i] = 1.0 - 1.0 / (float)(Temp_Max - Temp_Opt) * (float)(i - Temp_Opt);
  48.     for (i = -1; i < 2; i++)
  49.         for (j = -1; j < 2; j++)
  50.             for (k = -1; k < 2; k++, n++)
  51.             {
  52.                 PosCell[n][0] = i;
  53.                 PosCell[n][1] = j;
  54.                 PosCell[n][2] = k;
  55.             }
  56. }
  57.  
  58. int Neighbors (int x, int y, int z)
  59. {
  60.     int i, j, k, sum = 0;
  61.     for (i = -1; i < 2; i++)
  62.         for (j = -1; j < 2; j++)
  63.             for (k = -1; k < 2; k++)
  64.                 sum += Space[(x + i + Size) % Size][(y + j + Size) % Size][(z + k + Size) % Size];
  65.     sum -= Space[x][y][z];
  66.     return sum;
  67. }
  68.  
  69. void Step (int n)
  70. {
  71.     tm = clock();
  72.     int x, y, z, Num_of_nbr, flag = 0, k = 0, \
  73.         CellNum, NbrNum, Cell1, Cell2, Rem1, Rem2, Mov1, Mov2;
  74.     char Name[255] = "";
  75.     for(int l = 0; l < BlockSize * BlockSize * BlockSize; l++)
  76.     {
  77. #pragma omp parallel shared(Size, BlockSize, Int_Temp, PosCell, PosNbr, DiffKoeff)\
  78.     private(CellNum, NbrNum, x, y, z, Cell1, Cell2, Rem1, Rem2, Mov1, Mov2)
  79.         {
  80.         CellNum = rand() % 27;
  81. #pragma omp for
  82.     for (x = 1; x < Size; x += BlockSize)
  83.         for (y = 1; y < Size; y += BlockSize)
  84.             for (z = 1; z < Size; z += BlockSize)
  85.             {
  86.             NbrNum = rand() % 6;
  87.             Cell1 = Int_Temp[(x + PosCell[CellNum][0] + Size) % Size] \
  88.                 [(y + PosCell[CellNum][1] + Size) % Size] \
  89.                 [(z + PosCell[CellNum][2] + Size) % Size];
  90.             Cell2 = Int_Temp[(x +PosCell[CellNum][0] + PosNbr[NbrNum][0] + Size) % Size] \
  91.                 [(y +  PosCell[CellNum][1] + PosNbr[NbrNum][1] + Size) % Size] \
  92.                 [(z + PosCell[CellNum][2] + PosNbr[NbrNum][2] + Size) % Size];
  93.             //DiffKoeff определяет, какой процент температуры
  94.             //останется в клетке, а какой перейдет в соседнюю.
  95.             Rem1 = Cell1 * (float)(1.0 - DiffKoeff);
  96.             Rem2 = Cell2 * (float)(1.0 - DiffKoeff);
  97.             Mov1 = Cell1 * DiffKoeff;
  98.             Mov2 = Cell2 * DiffKoeff;
  99.             if ((float)Cell1 * DiffKoeff - (float)Mov1 > (float)(rand() % 10) / 10.0)
  100.                 Rem1++;
  101.             else if ((float)Cell1 * DiffKoeff - (float)Mov1)
  102.                 Mov1++;
  103.             if ((float)Cell2 * DiffKoeff - (float)Mov2 > (float)(rand() % 10) / 10.0)
  104.                 Rem2++;
  105.             else if ((float)Cell2 * DiffKoeff - (float)Mov2)
  106.                 Mov2++;
  107.             Int_Temp[(x + PosCell[CellNum][0] + Size) % Size] \
  108.                 [(y + PosCell[CellNum][1] + Size) % Size] \
  109.                 [(z + PosCell[CellNum][2] + Size) % Size] = Mov2 + Rem1;
  110.             Int_Temp[(x +PosCell[CellNum][0] + PosNbr[NbrNum][0] + Size) % Size] \
  111.                 [(y +  PosCell[CellNum][1] + PosNbr[NbrNum][1] + Size) % Size] \
  112.                 [(z + PosCell[CellNum][2] + PosNbr[NbrNum][2] + Size) % Size] \
  113.                 = Mov1 + Rem2;
  114.             }
  115.         }
  116.     }
  117. #pragma omp parallel shared(Temp, Space, Size) private(Num_of_nbr, x, y, z)
  118.     {
  119. #pragma omp for
  120.     for (x = 0; x < Size; x++)
  121.         for (y = 0; y < Size; y++)
  122.             for (z = 0; z < Size; z++)
  123.             {// Neighbors(x, y, z) вычисляет кол-во соседей
  124.                 //у клетки с координатами x, y и z
  125.                 Num_of_nbr = Neighbors(x, y, z);
  126.                 if (Space[x][y][z] == 1)
  127.                     if (Num_of_nbr <= Smid + Sdiff * Koeff[Int_Temp[x][y][z]] \
  128.                     && Num_of_nbr >= Smid - Sdiff * Koeff[Int_Temp[x][y][z]])
  129.                         Temp[x][y][z] = 1;
  130.                     else Temp[x][y][z] = 0;
  131.                 else
  132.                     if (Num_of_nbr <= Bmid + Bdiff * Koeff[Int_Temp[x][y][z]] \
  133.                     && Num_of_nbr >= Bmid - Bdiff * Koeff[Int_Temp[x][y][z]])
  134.                         Temp[x][y][z] = 1;
  135.                     else Temp[x][y][z] = 0;
  136.             }
  137. #pragma omp for
  138.         for (x = 0; x < Size; x++)
  139.             for (y = 0; y < Size; y++)
  140.                 for (z = 0; z < Size; z++)
  141.                     Space[x][y][z] = Temp[x][y][z];
  142.     }
  143.     tm = clock() - tm;
  144.     sprintf(Name, "F:\\Разное\\Проекты\\C++\\life\\temp\\Step%i.step", n);
  145.     HANDLE tmp = CreateFileA(Name, GENERIC_WRITE, FILE_SHARE_WRITE, \
  146.                         NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  147.     WriteFile(tmp, Int_Temp, Size * Size * Size * sizeof(int), &real, NULL);
  148.     CloseHandle(tmp);
  149.     sprintf(Name, "F:\\Разное\\Проекты\\C++\\life\\Step%i.step", n);
  150.     HANDLE out = CreateFileA(Name, GENERIC_WRITE, FILE_SHARE_WRITE, \
  151.                         NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  152.     WriteFile(out, Space, Size * Size * Size * sizeof(int), &real, NULL);
  153.     CloseHandle(out);
  154. }
  155.  
  156. void main ()
  157. {
  158.     Starting();
  159.     for (int i = 1; i <= StepsNum; i++)
  160.         Step(i);
  161.     printf("%i", tm);
  162.     _getch();
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement