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

Last change on this file since 1085 was 1085, checked in by yushan, 5 years ago

save modif for local compilation

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