source: XIOS/dev/branch_yushan/extern/src_ep_dev/ep_fortran.cpp @ 1068

Last change on this file since 1068 was 1068, checked in by yushan, 7 years ago

minor modification for using intelmpi

File size: 4.3 KB
Line 
1#include "ep_lib.hpp"
2#include "ep_lib_fortran.hpp"
3#include <mpi.h>
4#include <map>
5#include <utility>
6#include "ep_declaration.hpp"
7
8
9namespace ep_lib
10{
11
12  int EP_Comm_c2f(MPI_Comm comm)
13  {
14    Debug("MPI_Comm_c2f");
15    int fint;
16    #ifdef _intelmpi
17    fint = (::MPI_Fint)(comm.mpi_comm);
18    #elif _openmpi
19    fint = ::MPI_Comm_c2f(static_cast< ::MPI_Comm>(comm.mpi_comm));
20    #endif
21    std::map<std::pair<int, int>, MPI_Comm > ::iterator it;
22   
23    it = fc_comm_map.find(std::make_pair(fint, omp_get_thread_num()));
24    if(it == fc_comm_map.end())
25    {
26      fc_comm_map.insert(std::make_pair( std::make_pair( fint, omp_get_thread_num()) , comm));
27      printf("EP_Comm_c2f : MAP insert: %d, %d, %p\n", fint, omp_get_thread_num(), &comm);
28    }
29   
30   
31    return fint;
32   
33  }
34
35  MPI_Comm EP_Comm_f2c(int comm)
36  {
37    Debug("MPI_Comm_f2c");
38   
39   
40    std::map<std::pair<int, int>, MPI_Comm > ::iterator it;
41   
42    it = fc_comm_map.find(std::make_pair(comm, omp_get_thread_num()));
43    if(it != fc_comm_map.end())
44    {
45      MPI_Comm comm_ptr;
46      comm_ptr = it->second;
47      printf("EP_Comm_f2c : MAP find: %d, %d, %p\n", it->first.first, it->first.second, it->second);
48      return  comm_ptr;
49    }
50    else
51    {     
52      MPI_Comm return_comm;
53      if(omp_get_thread_num() == 0)
54      {
55        #ifdef _openmpi
56        ::MPI_Comm base_comm = ::MPI_Comm_f2c(comm);
57        #elif _intelmpi
58        ::MPI_Comm base_comm = (::MPI_Comm)(comm);
59        #endif
60
61        if(base_comm != MPI_COMM_NULL_STD)
62        {
63          int num_ep = omp_get_num_threads();
64          MPI_Comm *new_comm;
65          MPI_Info info;
66          MPI_Comm_create_endpoints(base_comm, num_ep, info, new_comm);
67          return_comm = new_comm[omp_get_thread_num()];
68        }
69        return MPI_COMM_NULL;
70      }
71     
72     
73      return return_comm;
74    }
75  }
76
77  // #ifdef _intelmpi
78
79  // MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
80  // {
81  //   Debug("MPI_Comm_c2f");
82  //   int fint;
83  //   fint = (::MPI_Fint)(comm.mpi_comm);
84   
85  //   std::map<std::pair<int, int>, MPI_Comm  > ::iterator it;
86   
87  //   it = fc_comm_map.find(std::make_pair(fint, omp_get_thread_num()));
88  //   if(it == fc_comm_map.end())
89  //   {
90  //     fc_comm_map.insert(std::make_pair( std::make_pair( fint, omp_get_thread_num()) , comm));
91  //     printf("MAP insert: %d, %d, %p\n", fint, omp_get_thread_num(), &comm);
92  //   }
93   
94  //   MPI_Fint Fint;
95  //   Fint.mpi_fint = fint;
96  //   return Fint;
97   
98  // }
99
100 
101
102
103  // MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
104  // {
105  //   Debug("MPI_Comm_f2c");
106   
107   
108  //   std::map<std::pair<int, int>, MPI_Comm  > ::iterator it;
109   
110  //   it = fc_comm_map.find(std::make_pair(comm.mpi_fint, omp_get_thread_num()));
111  //   if(it != fc_comm_map.end())
112  //   {
113  //     MPI_Comm comm_ptr;
114  //     comm_ptr =  it->second;
115  //     printf("MAP find: %d, %d, %p\n", it->first.first, it->first.second, &comm_ptr);
116  //     return  comm_ptr;
117  //   }
118  //   else
119  //   {     
120  //     MPI_Comm return_comm;
121  //     return_comm.mpi_comm = (::MPI_Comm)(comm.mpi_fint);
122  //     return return_comm;
123  //   }
124  // }
125
126 
127
128  // #elif _openmpi
129 
130  // int MPI_Comm_c2f(MPI_Comm comm)
131  // {
132  //   Debug("MPI_Comm_c2f");
133  //   int fint;
134  //   fint = ::MPI_Comm_c2f(static_cast< ::MPI_Comm>(comm.mpi_comm));
135   
136  //   std::map<std::pair<int, int>, MPI_Comm > ::iterator it;
137   
138  //   it = fc_comm_map.find(std::make_pair(fint, omp_get_thread_num()));
139  //   if(it == fc_comm_map.end())
140  //   {
141  //     fc_comm_map.insert(std::make_pair( std::make_pair( fint, omp_get_thread_num()) , comm));
142  //     printf("MAP insert: %d, %d, %p\n", fint, omp_get_thread_num(), &comm);
143  //   }
144   
145  //   return fint;
146   
147  // }
148
149  // ep_lib::MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
150  // {
151  //   Debug("MPI_Comm_f2c");
152   
153   
154  //   std::map<std::pair<int, int>, MPI_Comm > ::iterator it;
155   
156  //   it = fc_comm_map.find(std::make_pair(comm, omp_get_thread_num()));
157  //   if(it != fc_comm_map.end())
158  //   {
159  //     MPI_Comm comm_ptr;
160  //     comm_ptr =  it->second;
161  //     printf("MAP find: %d, %d, %p\n", it->first.first, it->first.second, &comm_ptr);
162  //     return  comm_ptr;
163  //   }
164  //   else
165  //   {     
166  //     MPI_Comm return_comm;
167  //     return_comm.mpi_comm = (::MPI_Comm)(comm);
168  //     return return_comm;
169  //   }
170  // }
171  // #endif
172
173}
174
175
Note: See TracBrowser for help on using the repository browser.