10 #include <sys/types.h> 52 if (room[
i] == NULL) {
58 if (room[
i][
j] == NULL) {
82 printf(
"No Mem Bro!");
87 if (room[
i] == NULL) {
88 printf(
"No Mem Bro!");
93 if (room[
i][
j] == NULL) {
94 printf(
"No Mem Bro!");
108 if (room_new == NULL) {
111 if (room_new == NULL) {
117 if (room_new[
i] == NULL) {
123 if (room_new[
i][
j] == NULL) {
135 if ((room[
j][
k][
l].next) != NULL) {
136 if ((room[
j][
k][
l].next->
id) == 1) {
137 room_new[
j][
k][
l] = room[
j][
k][
l];
140 room_new[
j][
k][
l].
id = 3;
148 room_new[
j][
k][
l].
id = 3;
210 if (x <
x_format && y <
y_format && z < z_format && x >= 0 && y >= 0 && z >= 0)
212 if (room[x][y][z].next != NULL) {
214 returnvalue = room[x][y][z].
next->
id;
216 else returnvalue = 3;
238 bool returnvalue =
false;
239 if (room[x][y][z].next != NULL) {
240 if (room[x][y][z].next->
id == 1)
301 node->
data.
Sound.freq_6000_10000 = value;
307 node->
data.
Sound.freq_10000_20000 = value;
387 return node->
data.
Sound.freq_10000_20000;
423 switch (currentDirectionID)
425 case 1:
return 5;
break;
426 case 2:
return 4;
break;
427 case 3:
return 7;
break;
428 case 4:
return 2;
break;
429 case 5:
return 1;
break;
430 case 6:
return 8;
break;
431 case 7:
return 3;
break;
432 case 8:
return 6;
break;
433 default:
return 0;
break;
456 if (x <
x_format && y <
y_format && z < z_format && x >= 0 && y >= 0 && z >= 0)
458 return &room[x][y][z];
462 newNode->
next = NULL;
483 while (selected->
next != NULL)
484 selected = selected->
next;
487 selected = selected->
next;
489 selected->
next = NULL;
490 if (selected->
id == 0) {
501 if (node->
next == NULL) {
503 if (node->
prev == NULL) {
529 while (selected->
next != NULL)
530 selected = selected->
next;
531 selected->
next = node;
533 selected = selected->
next;
534 selected->
next = NULL;
547 if (x <
x_format && y <
y_format && z < z_format && x >= 0 && y >= 0 && z >= 0)
549 return &room_new[x][y][z];
553 newNode->
next = NULL;
571 while (selected->
next != NULL)
572 selected = selected->
next;
573 selected->
next = node;
575 selected = selected->
next;
576 selected->
next = NULL;
589 if (x <
x_format && y <
y_format && z < z_format && x >= 0 && y >= 0 && z >= 0)
591 if (room[x][y][z].next != NULL) {
593 if (room[x][y][z].next->
id == 0)
598 else returnvalue = 1;
605 if (
isSoundField(x, roomtrans[var][16], roomtrans[var][17]) == 1) {
643 int *sarray = malloc(
cols *
sizeof(
int));
665 else if (side == 2) {
700 int (*sendarray)[
cols] = malloc(
sizeof * sendarray * rows);
707 if (realcount == rows) {
708 int newnum = (rows + 2) * 2;
709 int (*newptr)[
cols] = realloc(sendarray,
sizeof * newptr * newnum);
716 sendarray[realcount][0] =
j + x_offset;
717 sendarray[realcount][1] =
k;
718 sendarray[realcount][2] =
l;
719 sendarray[realcount][3] = 0;
738 sendarray[realcount][0] =
j + x_offset;
739 sendarray[realcount][1] =
k;
740 sendarray[realcount][2] =
l;
741 sendarray[realcount][3] = max;
749 MPI_Isend(sendarray, realcount * cols, MPI_INT, 1, 1, MPI_COMM_WORLD, &req);
750 MPI_Wait(&req, MPI_STATUS_IGNORE);
755 int main (
int argc,
char *argv[])
757 double start_t, end_t, total_t;
758 MPI_Request *request;
759 MPI_Request *request_ready;
761 MPI_Init(&argc, &argv);
762 MPI_Comm_rank(MPI_COMM_WORLD, &
myrank);
763 MPI_Comm_size(MPI_COMM_WORLD, &
size);
764 int NSimulations =
size - 2;
770 int setting_runs = 100;
771 start_t = MPI_Wtime();
772 printf(
"%s\n",
"-----STARTING THE ENGINE-----" );
776 int * paraarray = malloc(NSimulations *
sizeof(
int));
778 for (
int j = 0;
j < NSimulations;
j++) {
782 int new_process_rank = 0;
785 paraarray[new_process_rank] = paraarray[new_process_rank] + 1;
787 if (new_process_rank + 1 >= NSimulations) {
788 new_process_rank = 0;
795 for (
int var = 2; var < NSimulations + 2; ++var) {
796 printf(
"Rank: %d, Values: %d\n", var, paraarray[var - 2]);
800 int * SimSetting = malloc(5 *
sizeof(
int));
801 request = malloc(
sizeof(MPI_Request) * NSimulations);
802 for (
int t = 0; t < NSimulations; ++t) {
805 for (
int j = 0;
j < t; ++
j) {
806 offset = offset + paraarray[
j];
808 SimSetting[0] = paraarray[t];
811 SimSetting[3] = offset;
812 SimSetting[4] = setting_runs;
815 MPI_Isend(SimSetting, 5, MPI_INT, t + 2, t + 2, MPI_COMM_WORLD, &request[t]);
817 printf(
"Offset: %d\n", offset);
819 MPI_Waitall(NSimulations, request, MPI_STATUSES_IGNORE);
820 printf(
"Tasks wurden verteilt!\n");
823 for (
int i = 1;
i <= setting_runs; ++
i)
826 MPI_Isend(&NSimulations, 1, MPI_INT, 1, 1, MPI_COMM_WORLD, &visuGo);
828 MPI_Request_free(&visuGo);
829 for (
int t = 0; t < NSimulations; ++t) {
830 MPI_Isend(&go, 1, MPI_INT, t + 2, t + 2, MPI_COMM_WORLD, &request[t]);
833 MPI_Waitall(NSimulations, request, MPI_STATUSES_IGNORE);
835 for (
int t = 0; t < NSimulations; ++t) {
837 MPI_Recv(&add, 1, MPI_INT, t + 2, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
838 sum_tasks = sum_tasks + add;
844 MPI_Isend(&go, 1, MPI_INT, 1, 1, MPI_COMM_WORLD, &visuGo);
846 MPI_Request_free(&visuGo);
847 for (
int t = 0; t < NSimulations; ++t) {
848 MPI_Isend(&go, 1, MPI_INT, t + 2, t + 2, MPI_COMM_WORLD, &request[t]);
851 MPI_Waitall(NSimulations, request, MPI_STATUSES_IGNORE);
857 fp = fopen(
"output",
"a");
862 MPI_Recv(&go, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
864 fprintf(fp,
"\"soundarray%d\": [", run );
866 for (
i = 2;
i < go + 2; ++
i) {
869 MPI_Probe(
i, 1, MPI_COMM_WORLD, &status);
870 MPI_Get_count(&status, MPI_INT, &amount);
872 int (*recv_buf)[
cols] = malloc(
sizeof * recv_buf * amount / 4);
873 MPI_Recv(recv_buf, amount, MPI_INT,
i, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
874 for (
int var = 0; var < amount / 4; ++var) {
875 fprintf(fp,
"{ \"x\": %d, \"y\": %d, \"z\": %d, \"value\": %d },", recv_buf[var][0], recv_buf[var][1], recv_buf[var][2], recv_buf[var][3]);
881 MPI_Recv(&go, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
885 int * mySimSetting = malloc(5 *
sizeof(
int));
886 MPI_Recv(mySimSetting, 5, MPI_INT, 0,
myrank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
891 int x_offset = mySimSetting[3];
892 int runs = mySimSetting[4];
895 MPI_Recv(&go, 1, MPI_INT, 0,
myrank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
900 if (
myrank == 2 && run == 1) {
912 int sendrowsleft = 5;
913 int sendrowsright = 5;
914 int (*sendarrayleft)[
cols] = malloc(
sizeof * sendarrayleft * sendrowsleft);
915 int (*sendarrayright)[
cols] = malloc(
sizeof * sendarrayright * sendrowsright);
920 int sourceleft =
myrank - 1;
922 MPI_Probe(sourceleft, 14, MPI_COMM_WORLD, &status);
923 MPI_Get_count(&status, MPI_INT, &amountleft);
924 int (*recv_bufl)[
cols] = malloc(
sizeof * recv_bufl * amountleft /
cols);
925 MPI_Recv(recv_bufl, amountleft, MPI_INT, sourceleft, 14, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
926 for (
int var = 0; var < amountleft /
cols; ++var) {
932 int sourceright =
myrank + 1;
933 MPI_Probe(sourceright, 14, MPI_COMM_WORLD, &status);
934 MPI_Get_count(&status, MPI_INT, &amountright);
935 int (*recv_bufr)[
cols] = malloc(
sizeof * recv_bufr * amountright /
cols);
936 MPI_Recv(recv_bufr, amountright, MPI_INT, sourceright, 14, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
937 for (
int var = 0; var < amountright /
cols; ++var) {
942 else if (
myrank == 2 && run > 1) {
947 MPI_Probe(source, 14, MPI_COMM_WORLD, &status);
948 MPI_Get_count(&status, MPI_INT, &amount);
949 int (*recv_buf)[
cols] = malloc(
sizeof * recv_buf * amount /
cols);
950 MPI_Recv(recv_buf, amount, MPI_INT, source, 14, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
951 for (
int var = 0; var < amount /
cols; ++var) {
961 MPI_Probe(source, 14, MPI_COMM_WORLD, &status);
962 MPI_Get_count(&status, MPI_INT, &amount);
963 int (*recv_buf)[
cols] = malloc(
sizeof * recv_buf * amount /
cols);
964 MPI_Recv(recv_buf, amount, MPI_INT, source, 14, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
965 for (
int var = 0; var < amount /
cols; ++var) {
982 while (temp != NULL) {
991 if (direction_id == 1) {
993 if (next_itemID == 0 || next_itemID == 3) {
996 }
else if (next_itemID == 1) {
1004 }
else if (next_itemID == 2)
1009 else if (direction_id == 2) {
1011 if (next_itemID == 0 || next_itemID == 3) {
1014 else if (next_itemID == 1) {
1019 }
else if (next_itemID == 2 &&
j == x_format - 1 &&
myrank !=
size - 1) {
1021 int newnum = (sendrowsright + 2) * 2;
1022 int (*newptr)[
cols] = realloc(sendarrayright,
sizeof * newptr * newnum);
1023 sendrowsright = newnum;
1024 sendarrayright = newptr;
1027 for (
int var = 0; var <
cols; ++var) {
1030 free(sendarrayright_new);
1038 else if (direction_id == 3) {
1040 if (next_itemID == 0 || next_itemID == 3) {
1043 else if (next_itemID == 1) {
1048 }
else if (next_itemID == 2 &&
j == x_format - 1 &&
myrank !=
size - 1) {
1050 int newnum = (sendrowsright + 2) * 2;
1051 int (*newptr)[
cols] = realloc(sendarrayright,
sizeof * newptr * newnum);
1052 sendrowsright = newnum;
1053 sendarrayright = newptr;
1056 for (
int var = 0; var <
cols; ++var) {
1059 free(sendarrayright_new);
1067 else if (direction_id == 4) {
1069 if (next_itemID == 0 || next_itemID == 3) {
1072 else if (next_itemID == 1) {
1077 }
else if (next_itemID == 2 &&
j == x_format - 1 &&
myrank !=
size - 1) {
1079 int newnum = (sendrowsright + 2) * 2;
1080 int (*newptr)[
cols] = realloc(sendarrayright,
sizeof * newptr * newnum);
1081 sendrowsright = newnum;
1082 sendarrayright = newptr;
1085 for (
int var = 0; var <
cols; ++var) {
1088 free(sendarrayright_new);
1095 else if (direction_id == 5)
1099 if (next_itemID == 0 || next_itemID == 3) {
1102 }
else if (next_itemID == 1) {
1111 }
else if (next_itemID == 2)
1116 else if (direction_id == 6) {
1118 if (next_itemID == 0 || next_itemID == 3) {
1121 else if (next_itemID == 1) {
1126 }
else if (next_itemID == 2 &&
j == 0 &&
myrank != 2) {
1128 int newnum = (sendrowsleft + 2) * 2;
1129 int (*newptr)[
cols] = realloc(sendarrayleft,
sizeof * newptr * newnum);
1130 sendrowsleft = newnum;
1131 sendarrayleft = newptr;
1134 for (
int var = 0; var <
cols; ++var) {
1137 free(sendarrayleft_new);
1144 else if (direction_id == 7) {
1146 if (next_itemID == 0 || next_itemID == 3) {
1149 else if (next_itemID == 1) {
1154 }
else if (next_itemID == 2 &&
j == 0 &&
myrank != 2) {
1156 int newnum = (sendrowsleft + 2) * 2;
1157 int (*newptr)[
cols] = realloc(sendarrayleft,
sizeof * newptr * newnum);
1158 sendrowsleft = newnum;
1159 sendarrayleft = newptr;
1162 for (
int var = 0; var <
cols; ++var) {
1171 else if (direction_id == 8) {
1173 if (next_itemID == 0 || next_itemID == 3) {
1176 else if (next_itemID == 1) {
1181 }
else if (next_itemID == 2 &&
j == 0 &&
myrank != 2) {
1183 int newnum = (sendrowsleft + 2) * 2;
1184 int (*newptr)[
cols] = realloc(sendarrayleft,
sizeof * newptr * newnum);
1185 sendrowsleft = newnum;
1186 sendarrayleft = newptr;
1189 for (
int var = 0; var <
cols; ++var) {
1213 MPI_Isend(sendarrayright,
realcountright *
cols, MPI_INT, desti, 14, MPI_COMM_WORLD, &reqr);
1214 MPI_Wait(&reqr, MPI_STATUS_IGNORE);
1218 MPI_Isend(sendarrayleft,
realcountleft * cols, MPI_INT, desti, 14, MPI_COMM_WORLD, &reql);
1219 MPI_Wait(&reql, MPI_STATUS_IGNORE);
1222 else if (run < runs &&
myrank == 2) {
1225 MPI_Isend(sendarrayright,
realcountright *
cols, MPI_INT, desti, 14, MPI_COMM_WORLD, &reqr);
1226 MPI_Wait(&reqr, MPI_STATUS_IGNORE);
1231 MPI_Isend(sendarrayleft,
realcountleft *
cols, MPI_INT, desti, 14, MPI_COMM_WORLD, &reql);
1232 MPI_Wait(&reql, MPI_STATUS_IGNORE);
1234 free(sendarrayleft);
1235 free(sendarrayright);
1242 MPI_Send(&sendready, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
1244 MPI_Recv(&go, 1, MPI_INT, 0,
myrank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
1247 MPI_Barrier(MPI_COMM_WORLD);
1249 end_t = MPI_Wtime();
1250 total_t = end_t - start_t;
1251 printf(
"Time for executing were: %f seconds\n " , total_t);
1253 printf(
"%s\n",
"-----ENGINE STOPPED-----" );
1254 }
else if (
myrank == 1) {
1257 fp = fopen(
"output",
"a");
void setTouche(item_node *node)
void interference(int x, int y, int z)
int main(int argc, char *argv[])
void absorption(item_node *temp, float coeff)
int * prepareArrays(item_node *node, int side)
void setSideOfWave(item_node *node, int side)
void setFreq100b150(item_node *node, int value)
item_node getSound(item_node *node)
void changeRoom(item_node ***newRoom)
item_node * allElementsNew
void setFreq1000b2000(item_node *node, int value)
int getFreq400b1000(item_node *node)
item_node getObstacle(item_node *node)
int getFieldID(int x, int y, int z)
void setDirectionID(item_node *node, int value)
void setFreq6000b10000(item_node *node, int value)
item_node * createItem(int x, int y, int z, int id)
int visuStep
Step Counter für Visualisierung.
void setFreq10000b20000(item_node *node, int value)
void setItemID(item_node *node, int id)
int x_format
Raum Formate.
void saveVisualisation(int x_offset)
void createReceipt(int(*roomtrans)[cols], int var, int x)
int getFreq20b40(item_node *node)
void setFreq40b100(item_node *node, int value)
void setFreq3500b6000(item_node *node, int value)
item_node * addItem(item_node *node, int x, int y, int z)
void setMovement(item_node *node, int m)
bool getTouch(item_node *node)
void increaseMovement(item_node *node)
int getItemID(item_node *node)
void setFreq20b40(item_node *node, int value)
int getFreq150b400(item_node *node)
int getFreq100b150(item_node *node)
int getFreq10000b20000(item_node *node)
struct item_node::@0::@1 Sound
int getFreq6000b10000(item_node *node)
int getSideOfWave(item_node *node)
void removeItem(item_node *node)
void addWave(item_node *temp, int x, int y, int z)
int getFreq1000b2000(item_node *node)
void addItemNewRoom(item_node *node, int x, int y, int z)
item_node * roomtrans
Modelierung eines Fragments !
int getFreq3500b6000(item_node *node)
int getDirectionID(item_node *node)
item_node *** createRoom()
int getFreq2000b3500(item_node *node)
int getReboundID(int currentDirectionID)
void decSoundWithMovement(item_node *node)
void changeReboundSideOfWave(item_node *node)
int isSoundField(int x, int y, int z)
void setFreq2000b3500(item_node *node, int value)
int getFreq40b100(item_node *node)
bool checkSoundValid(item_node *temp, int x, int y, int z)
void setFreq150b400(item_node *node, int value)
item_node * getItem_Root(int x, int y, int z)
item_node *** createRoomNew()
void setFreq400b1000(item_node *node, int value)
item_node * getItem_RootNewRoom(int x, int y, int z)
bool isObstacle(int x, int y, int z)
int getMovement(item_node *node)