Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / charm++ / mpi-coexist / multirun.cpp
1 /*  Example code to demonstrate Interoperability between MPI and Charm
2     Author - Nikhil Jain
3     Contact - nikhil@illinois.edu
4 */
5
6 //standard header files
7 #include <mpi.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 //header files for libraries in Charm I wish to use with MPI
11 #include "libs/hi/hi.h"
12 #include "libs/hello/hello.h"
13 #include "libs/kNeighbor/kNeighbor.h"
14 //header file from Charm needed for Interoperation
15 #include "mpi-interoperate.h"
16
17 int main(int argc, char **argv){
18   int peid, numpes;
19   MPI_Comm newComm;
20
21   //basic MPI initilization
22   MPI_Init(&argc, &argv);
23   MPI_Comm_rank(MPI_COMM_WORLD, &peid);
24   MPI_Comm_size(MPI_COMM_WORLD, &numpes);
25
26   if(numpes % 4 != 0){
27     if(peid==0){
28       printf("This test program must be run with number of procs = 4x\n");
29     }
30     MPI_Finalize();
31     return 1;
32   }
33
34   //splitting WORLD into 2 sets
35   MPI_Comm_split(MPI_COMM_WORLD, peid%2, peid, &newComm);
36
37   //initialize Charm for each set
38   CharmLibInit(newComm, argc, argv);
39   MPI_Barrier(MPI_COMM_WORLD);
40
41   //do some MPI work
42   for(int i=0; i<5; i++) {
43     if(peid % 2 == 0) {    
44       MPI_Send(&peid, 1, MPI_INT, peid+1, 808, MPI_COMM_WORLD);
45     } else {
46       int recvid = 0;
47       MPI_Status sts;
48       MPI_Recv(&recvid, 1, MPI_INT, peid-1, 808, MPI_COMM_WORLD, &sts);
49     }
50   }
51
52   //on the first set of processors, invoke Hello
53   if(peid%2) {
54     HelloStart(5);
55     MPI_Barrier(newComm);
56   } else {
57   //on the other set of processors, invoke kNeighbor and clean up Charm
58     kNeighbor(10,10,128,2);
59     MPI_Barrier(newComm);
60     CharmLibExit();
61   }
62     
63   //on the first set, do more MPI work, invoke Hi and clean up Charm
64   if(peid%2) {
65     for(int i=0; i<5; i++) {
66       if(peid % 4 == 1) {    
67         MPI_Send(&peid, 1, MPI_INT, peid+2, 808, MPI_COMM_WORLD);
68       }  else {
69         int recvid = 0;
70         MPI_Status sts;
71         MPI_Recv(&recvid, 1, MPI_INT, peid-2, 808, MPI_COMM_WORLD, &sts);
72       }
73     }
74     HiStart(16);
75     MPI_Barrier(newComm);
76     CharmLibExit();
77   }
78
79   //final synchronization
80   MPI_Barrier(MPI_COMM_WORLD);
81
82   MPI_Finalize();
83   return 0;  
84 }