Stride Reference Manual  1.0
RemoteSimulatorReceiver.cpp
Go to the documentation of this file.
2 #include "mpi.h"
3 
4 #include <iostream>
5 
6 using namespace stride;
7 using namespace std;
8 using namespace util;
9 
11  cout << "Listening\n";
12  MPI_Status status;
13  int flag = 0;
14  while (!flag && m_listening) {
15  MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
16  }
17  cout << "Tag: " << status.MPI_TAG << endl;
18  // Message received
19  if (status.MPI_TAG == 1 or status.MPI_TAG == 7) {
20  cout << "Received travellers " << status.MPI_TAG << endl;
21  // Tag 1 means travellers from another region (sendNewTravellers @ RemoteSimulatorSender)
22  TravelData data;
23  MPI_Recv(&data, m_count, MPI_INT, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
24  m_sim->hostForeignTravellers(data.m_travellers, data.m_days, data.m_destination_district,
26  }
27  if (status.MPI_TAG == 2 or status.MPI_TAG == 5) {
28  // Tag 2 means travellers returning home (returnForeignTravellers @ RemoteSimulatorSender)
29  ReturnData data;
30  MPI_Recv(&data, m_count, MPI_INT, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
31  m_sim->welcomeHomeTravellers(data.m_travellers.first, data.m_travellers.second);
32  }
33  if (status.MPI_TAG == 3) {
34  // Tag 3 means travellers from another region (issued by the Coordinator)
35  TravelData data;
36  MPI_Recv(&data, m_count, MPI_INT, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
37  m_sim->sendNewTravellers(data.m_amount, data.m_days, data.m_destination_simulator, data.m_destination_district,
39  }
40  if (status.MPI_TAG == 4) {
41  // Tag 4 means that this simulator must execute a timestep
42  MPI_Recv(nullptr, 0, MPI_INT, 0, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
43  std::cout << "Before timestep @ " << status.MPI_SOURCE << std::endl;
44  m_sim->timeStep();
45  std::cout << "After timestep @ " << status.MPI_SOURCE << std::endl;
46  MPI_Send(nullptr, 0, MPI_INT, 0, 4, MPI_COMM_WORLD);
47  }
48  if (status.MPI_TAG == 6) {
49  // Tag 6 means travellers returning home
50  MPI_Recv(nullptr, 0, MPI_INT, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
51  m_sim->returnForeignTravellers();
52  }
53  if (status.MPI_TAG == 10) { // End listening
54  MPI_Recv(nullptr, 0, MPI_INT, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
55  std::cout << "No more messages\n";
56  return;
57  }
58  // After message is received and processed, start listening again
59  this->listen();
60 }
Time Dependent Person DataType.
Definition: NoBehaviour.h:17
STL namespace.
vector< Simulator::TravellerType > m_travellers
Definition: TravelData.h:28
pair< vector< uint >, vector< Health > > m_travellers
Definition: TravelData.h:35