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

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

server mode OK tested with test_complete

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