rendered paste body__global__ static void SzimulacioKernel(int* ELETTER, int* ELETKOR, int* EHSEG, int* SZAPOR, int* LEPETT){ int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y; if (x < NX && y < NY && x % 3 == 1 && y % 3 == 1) { switch (ELETTER[x+y*NX]) { case ELEM_FU: if (ELETKOR[x+y*NX] > MH_FU) { ELETTER[x+y*NX] = ELEM_SEMMI; } else { ELETKOR[x+y*NX]++; if (SZAPOR[x+y*NX] > SZ_FU) { int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_SEMMI) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[koord[choosenIndex]] = ELEM_FU; SZAPOR[koord[choosenIndex]] = 0; ELETKOR[koord[choosenIndex]] = 0; SZAPOR[x+y*NX] = 0; } } else { SZAPOR[x+y*NX]++; } } break; case ELEM_KECSKE: if (ELETKOR[x+y*NX] > MH_KECSKE || EHSEG[x+y*NX] > EH_KECSKE) { ELETTER[x+y*NX] = ELEM_SEMMI; } else { ELETKOR[x+y*NX]++; if (SZAPOR[x+y*NX] > SZ_KECSKE) { int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_SEMMI) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[koord[choosenIndex]] = ELEM_KECSKE; SZAPOR[koord[choosenIndex]] = 0; ELETKOR[koord[choosenIndex]] = 0; EHSEG[koord[choosenIndex]] = 0; LEPETT[koord[choosenIndex]] = 1; SZAPOR[x+y*NX] = 0; } } else { SZAPOR[x+y*NX]++; if (EHSEG[x+y*NX] > ESZ_KECSKE) { int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_FU) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[x+y*NX] = ELEM_SEMMI; ELETTER[koord[choosenIndex]] = ELEM_KECSKE; EHSEG[koord[choosenIndex]] = 0; SZAPOR[koord[choosenIndex]] = SZAPOR[x+y*NX]; ELETKOR[koord[choosenIndex]] = ELETKOR[x+y*NX]; LEPETT[x+y*NX] = 1; } else { goto mozog_k; } } else { mozog_k: if (!LEPETT[x+y*NX]) { LEPETT[x+y*NX] = 1; EHSEG[x+y*NX]++; int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_SEMMI) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[x+y*NX] = ELEM_SEMMI; ELETTER[koord[choosenIndex]] = ELEM_KECSKE; EHSEG[koord[choosenIndex]] = EHSEG[x+y*NX]; SZAPOR[koord[choosenIndex]] = SZAPOR[x+y*NX]; ELETKOR[koord[choosenIndex]] = ELETKOR[x+y*NX]; } } } } } break; case ELEM_FARKAS: if (ELETKOR[x+y*NX] > MH_FARKAS || EHSEG[x+y*NX] > EH_FARKAS) { ELETTER[x+y*NX] = ELEM_SEMMI; } else { ELETKOR[x+y*NX]++; if (SZAPOR[x+y*NX] > SZ_FARKAS) { int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_SEMMI) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[koord[choosenIndex]] = ELEM_FARKAS; SZAPOR[koord[choosenIndex]] = 0; ELETKOR[koord[choosenIndex]] = 0; EHSEG[koord[choosenIndex]] = 0; LEPETT[koord[choosenIndex]] = 1; SZAPOR[x+y*NX] = 0; } } else { SZAPOR[x+y*NX]++; if (EHSEG[x+y*NX] > ESZ_FARKAS) { int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_KECSKE) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[x+y*NX] = ELEM_SEMMI; ELETTER[koord[choosenIndex]] = ELEM_FARKAS; EHSEG[koord[choosenIndex]] = 0; SZAPOR[koord[choosenIndex]] = SZAPOR[x+y*NX]; ELETKOR[koord[choosenIndex]] = ELETKOR[x+y*NX]; LEPETT[x+y*NX] = 1; } else { goto mozog_f; } } else { mozog_f: if (!LEPETT[x+y*NX]) { LEPETT[x+y*NX] = 1; EHSEG[x+y*NX]++; int koord[8]; int index = -1; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int p = (x+i)+(y+j)*NX; if (ELETTER[p] == ELEM_SEMMI) { index++; koord[index] = p; } } } if (index > -1) { int choosenIndex = rand() % (index + 1); ELETTER[x+y*NX] = ELEM_SEMMI; ELETTER[koord[choosenIndex]] = ELEM_FARKAS; EHSEG[koord[choosenIndex]] = EHSEG[x+y*NX]; SZAPOR[koord[choosenIndex]] = SZAPOR[x+y*NX]; ELETKOR[koord[choosenIndex]] = ELETKOR[x+y*NX]; } } } } } break; default: break; } }}