Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string>
- #include <stdlib.h>
- #include <Windows.h>
- #include <time.h>
- #include <conio.h>
- #include <omp.h>
- const int Size = 30;
- const int StepsNum = 100;
- const int BlockSize = 3;
- double *Koeff;
- double DiffKoeff = 0, Bmid, Bdiff, Smid, Sdiff;
- int PosCell[27][3];
- int PosNbr[6][3] = {{-1, 0, 0},{1, 0, 0},{0, -1, 0},{0, 1, 0},{0, 0, -1},{0, 0, 1}};
- int Int_Temp[Size][Size][Size];
- int Temp_Max = 0, Temp_Opt = 0;
- int Space[Size][Size][Size], Temp[Size][Size][Size];
- int tm, time1 = 0, Bmin = 0, Bmax = 0, Smin = 0, Smax = 0;
- int TSize = 400, LSize = 10;
- DWORD real = 0;
- void Starting ()
- {
- int i, j, k, n = 0;
- HANDLE life = CreateFileA("F:\\Разное\\Проекты\\C++\\life\\InitialLife.init", \
- GENERIC_READ, FILE_SHARE_READ, NULL, \
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- ReadFile(life, Space, Size * Size * Size * sizeof(int), &real, NULL);
- CloseHandle(life);
- HANDLE tmp = CreateFileA("F:\\Разное\\Проекты\\C++\\life\\InitialTemperature.init", \
- GENERIC_READ, FILE_SHARE_READ, NULL, \
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- ReadFile(tmp, Int_Temp, Size * Size * Size * sizeof(int), &real, NULL);
- CloseHandle(tmp);
- FILE *temp = fopen("F:/Разное/Проекты/C++/life/Init.txt", "r");
- fscanf(temp, "%i %i\n%i %i\n%i\n%i\n%le", \
- &Bmin, &Bmax, &Smin, &Smax, &Temp_Max, &Temp_Opt, &DiffKoeff);
- Bmid = float(Bmax + Bmin) / 2.0;
- Bdiff = float(Bmax - Bmin) / 2.0;
- Smid = float(Smax + Smin) / 2.0;
- Sdiff = float(Smax - Smin) / 2.0;
- Koeff = new double [Temp_Max + 1];
- for (i = 0; i < Temp_Opt; i++)
- Koeff[i] = 1.0 / (float)Temp_Opt * (float)i;
- for (i = Temp_Opt; i <= Temp_Max; i++)
- Koeff[i] = 1.0 - 1.0 / (float)(Temp_Max - Temp_Opt) * (float)(i - Temp_Opt);
- for (i = -1; i < 2; i++)
- for (j = -1; j < 2; j++)
- for (k = -1; k < 2; k++, n++)
- {
- PosCell[n][0] = i;
- PosCell[n][1] = j;
- PosCell[n][2] = k;
- }
- }
- int Neighbors (int x, int y, int z)
- {
- int i, j, k, sum = 0;
- for (i = -1; i < 2; i++)
- for (j = -1; j < 2; j++)
- for (k = -1; k < 2; k++)
- sum += Space[(x + i + Size) % Size][(y + j + Size) % Size][(z + k + Size) % Size];
- sum -= Space[x][y][z];
- return sum;
- }
- void Step (int n)
- {
- tm = clock();
- int x, y, z, Num_of_nbr, flag = 0, k = 0, \
- CellNum, NbrNum, Cell1, Cell2, Rem1, Rem2, Mov1, Mov2;
- char Name[255] = "";
- for(int l = 0; l < BlockSize * BlockSize * BlockSize; l++)
- {
- #pragma omp parallel shared(Size, BlockSize, Int_Temp, PosCell, PosNbr, DiffKoeff)\
- private(CellNum, NbrNum, x, y, z, Cell1, Cell2, Rem1, Rem2, Mov1, Mov2)
- {
- CellNum = rand() % 27;
- #pragma omp for
- for (x = 1; x < Size; x += BlockSize)
- for (y = 1; y < Size; y += BlockSize)
- for (z = 1; z < Size; z += BlockSize)
- {
- NbrNum = rand() % 6;
- Cell1 = Int_Temp[(x + PosCell[CellNum][0] + Size) % Size] \
- [(y + PosCell[CellNum][1] + Size) % Size] \
- [(z + PosCell[CellNum][2] + Size) % Size];
- Cell2 = Int_Temp[(x +PosCell[CellNum][0] + PosNbr[NbrNum][0] + Size) % Size] \
- [(y + PosCell[CellNum][1] + PosNbr[NbrNum][1] + Size) % Size] \
- [(z + PosCell[CellNum][2] + PosNbr[NbrNum][2] + Size) % Size];
- //DiffKoeff определяет, какой процент температуры
- //останется в клетке, а какой перейдет в соседнюю.
- Rem1 = Cell1 * (float)(1.0 - DiffKoeff);
- Rem2 = Cell2 * (float)(1.0 - DiffKoeff);
- Mov1 = Cell1 * DiffKoeff;
- Mov2 = Cell2 * DiffKoeff;
- if ((float)Cell1 * DiffKoeff - (float)Mov1 > (float)(rand() % 10) / 10.0)
- Rem1++;
- else if ((float)Cell1 * DiffKoeff - (float)Mov1)
- Mov1++;
- if ((float)Cell2 * DiffKoeff - (float)Mov2 > (float)(rand() % 10) / 10.0)
- Rem2++;
- else if ((float)Cell2 * DiffKoeff - (float)Mov2)
- Mov2++;
- Int_Temp[(x + PosCell[CellNum][0] + Size) % Size] \
- [(y + PosCell[CellNum][1] + Size) % Size] \
- [(z + PosCell[CellNum][2] + Size) % Size] = Mov2 + Rem1;
- Int_Temp[(x +PosCell[CellNum][0] + PosNbr[NbrNum][0] + Size) % Size] \
- [(y + PosCell[CellNum][1] + PosNbr[NbrNum][1] + Size) % Size] \
- [(z + PosCell[CellNum][2] + PosNbr[NbrNum][2] + Size) % Size] \
- = Mov1 + Rem2;
- }
- }
- }
- #pragma omp parallel shared(Temp, Space, Size) private(Num_of_nbr, x, y, z)
- {
- #pragma omp for
- for (x = 0; x < Size; x++)
- for (y = 0; y < Size; y++)
- for (z = 0; z < Size; z++)
- {// Neighbors(x, y, z) вычисляет кол-во соседей
- //у клетки с координатами x, y и z
- Num_of_nbr = Neighbors(x, y, z);
- if (Space[x][y][z] == 1)
- if (Num_of_nbr <= Smid + Sdiff * Koeff[Int_Temp[x][y][z]] \
- && Num_of_nbr >= Smid - Sdiff * Koeff[Int_Temp[x][y][z]])
- Temp[x][y][z] = 1;
- else Temp[x][y][z] = 0;
- else
- if (Num_of_nbr <= Bmid + Bdiff * Koeff[Int_Temp[x][y][z]] \
- && Num_of_nbr >= Bmid - Bdiff * Koeff[Int_Temp[x][y][z]])
- Temp[x][y][z] = 1;
- else Temp[x][y][z] = 0;
- }
- #pragma omp for
- for (x = 0; x < Size; x++)
- for (y = 0; y < Size; y++)
- for (z = 0; z < Size; z++)
- Space[x][y][z] = Temp[x][y][z];
- }
- tm = clock() - tm;
- sprintf(Name, "F:\\Разное\\Проекты\\C++\\life\\temp\\Step%i.step", n);
- HANDLE tmp = CreateFileA(Name, GENERIC_WRITE, FILE_SHARE_WRITE, \
- NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
- WriteFile(tmp, Int_Temp, Size * Size * Size * sizeof(int), &real, NULL);
- CloseHandle(tmp);
- sprintf(Name, "F:\\Разное\\Проекты\\C++\\life\\Step%i.step", n);
- HANDLE out = CreateFileA(Name, GENERIC_WRITE, FILE_SHARE_WRITE, \
- NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
- WriteFile(out, Space, Size * Size * Size * sizeof(int), &real, NULL);
- CloseHandle(out);
- }
- void main ()
- {
- Starting();
- for (int i = 1; i <= StepsNum; i++)
- Step(i);
- printf("%i", tm);
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement