#ifdef _usingEP #include "ep_lib.hpp" #include "ep_lib_fortran.hpp" #include #include #include #include "ep_declaration.hpp" #include "ep_mpi.hpp" //namespace ep_lib //{ void* EP_Comm_c2f(ep_lib::MPI_Comm comm) { Debug("MPI_Comm_c2f"); void* fint = new MPI_Fint; #ifdef _intelmpi *static_cast< ::MPI_Fint*>(fint) = (::MPI_Fint)(to_mpi_comm(comm->mpi_comm)); #elif _openmpi *static_cast< MPI_Fint*>(fint) = MPI_Comm_c2f(to_mpi_comm(comm->mpi_comm)); #endif std::map, ep_lib::MPI_Comm > ::iterator it; #pragma omp critical (fc_comm_map) { it = ep_lib::fc_comm_map.find(std::make_pair(*static_cast< MPI_Fint*>(fint), omp_get_thread_num())); if(it == ep_lib::fc_comm_map.end()) { ep_lib::fc_comm_map.insert(std::make_pair( std::make_pair( *static_cast< MPI_Fint*>(fint), omp_get_thread_num()) , comm)); printf("EP_Comm_c2f : MAP %p insert: %d, %d, %p\n", &(ep_lib::fc_comm_map), *static_cast< MPI_Fint*>(fint), omp_get_thread_num(), comm->ep_comm_ptr); } } return fint; } ep_lib::MPI_Comm EP_Comm_f2c(void* comm) { Debug("MPI_Comm_f2c"); std::map, ep_lib::MPI_Comm > ::iterator it; #pragma omp critical (fc_comm_map) it = ep_lib::fc_comm_map.find(std::make_pair(*static_cast< MPI_Fint*>(comm), omp_get_thread_num())); if(it != ep_lib::fc_comm_map.end()) { ep_lib::MPI_Comm comm_ptr; comm_ptr = it->second; printf("EP_Comm_f2c : MAP %p find: %d, %d, %p\n", &(ep_lib::fc_comm_map), it->first.first, it->first.second, comm_ptr->ep_comm_ptr); return comm_ptr; } MPI_Comm *base_comm = new MPI_Comm; #ifdef _intelmpi *base_comm = (MPI_Comm)(*static_cast< MPI_Fint*>(comm)); #elif _openmpi *base_comm = MPI_Comm_f2c(*static_cast< MPI_Fint*>(comm)); #endif if(*base_comm != to_mpi_comm(MPI_COMM_NULL->mpi_comm)) { if(omp_get_thread_num() == 0) { int num_ep = omp_get_num_threads(); ep_lib::MPI_Comm *new_comm; ep_lib::MPI_Info info; ep_lib::MPI_Comm_create_endpoints(base_comm, num_ep, info, new_comm); ep_lib::passage = new_comm; } #pragma omp barrier ep_lib::MPI_Comm return_comm = ep_lib::passage[omp_get_thread_num()]; return return_comm; } return MPI_COMM_NULL; } //} #endif