if N % processes != 0: print("Error - cannot partition the problem") comm.Abort() rows = int(N / processes) mapper = Mapper(N, rank, rows, debugger) table = Tab(N, rank, rows, mapper, debugger) initial_rank = int(processes / 2) debugger.print_program_info("initial_rank = " + str(initial_rank)) if rank == initial_rank: target_x = int(N / 2) target_y = int(N / 2) debugger.print_program_info("First cell = " + str(target_x) + "," + str(target_y)) initial_bacteria = Bacteria(target_x, target_y, chance=1) table.update_table([initial_bacteria]) def split_bacterias_per_process(bacterias_info, min_x, max_x): send_up = list(filter(lambda bacteria: bacteria.target_x == min_x - 1, bacterias_info)) send_down = list(filter(lambda bacteria: bacteria.target_x == max_x + 1, bacterias_info)) # print(len(send_up), len(send_down), len(bacterias_info)) # print(bacterias_info, min_x, max_x) assert (len(send_up) + len(send_down)) == len(bacterias_info) return send_up, send_down def send_bacterias(processes, rank, bacterias_info, min_x, max_x): bacterias_up, bacterias_down = split_bacterias_per_process(bacterias_info, min_x, max_x) if rank - 1 >= 0: comm.send(bacterias_up, dest=rank - 1)