
#include<stdio.h>

#include<mpi.h>
/***********************************************
mpicc -o block block.c
mpirun -np 2 block
***********************************************/
int main(
int argc,
char *argv[]){
int numTasks, rank, rc;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numTasks);
//get from -np

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//each process's ID
if(rank == 0){
char sendChar = 'A';
char receiveChar;
int count = 1;
int destRank = 1;
int sourceRank = 1;
//MPI_ANY_SOURCE
int tagSendMSGID = 6;
int tagRecvMSGID = 9;

MPI_Status status;

rc = MPI_Send(&sendChar, count, MPI_CHAR, destRank, tagSendMSGID, MPI_COMM_WORLD);

rc = MPI_Recv(&receiveChar, count, MPI_CHAR, sourceRank, tagRecvMSGID, MPI_COMM_WORLD, &status);

printf(
"Rank = %d, sendChar = %c, received char = %c\n", rank, sendChar, receiveChar);

printf(
"Received from task %d with tag %d\n", status.MPI_SOURCE, status.MPI_TAG);

}
else
if(rank == 1){
char sendChar = 'Z';
char receiveChar;
int count = 1;
int destRank = 0;
int sourceRank = 0;
int tagRecvMSGID = 6;
int tagSendMSGID = 9;

MPI_Status status;

rc = MPI_Recv(&receiveChar, count, MPI_CHAR, sourceRank, tagRecvMSGID, MPI_COMM_WORLD, &status);
if(receiveChar == 'A'){

rc = MPI_Send(&sendChar, count, MPI_CHAR, destRank, tagSendMSGID, MPI_COMM_WORLD);

}

printf(
"Rank = %d, received char = %c, then send char = %c\n", rank, receiveChar, sendChar);

printf(
"Received from task %d with tag %d\n", status.MPI_SOURCE, status.MPI_TAG);

}

MPI_Finalize();
return 0;

}