Skip to content

Commit

Permalink
Make MPI_Initialized in Fortran callable before initializing MPItramp…
Browse files Browse the repository at this point in the history
…oline
  • Loading branch information
eschnett committed Apr 20, 2023
1 parent 7e3c8d4 commit 07b5042
Showing 1 changed file with 96 additions and 0 deletions.
96 changes: 96 additions & 0 deletions src/mpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@
#define PMPI_Get_library_version PMPItrampoline_Get_library_version
#define PMPI_Get_version PMPItrampoline_Get_version
#define PMPI_Initialized PMPItrampoline_Initialized
#ifdef ENABLE_FORTRAN
#define mpi_finalized_ mpitrampoline_finalized_
#define mpi_get_library_version_ mpitrampoline_get_library_version_
#define mpi_get_version_ mpitrampoline_get_version_
#define mpi_initialized_ mpitrampoline_initialized_
#define pmpi_finalized_ pmpitrampoline_finalized_
#define pmpi_get_library_version_ pmpitrampoline_get_library_version_
#define pmpi_get_version_ pmpitrampoline_get_version_
#define pmpi_initialized_ pmpitrampoline_initialized_
#endif

#include "mpi.h"
#include "mpi_defaults.h"
Expand Down Expand Up @@ -62,6 +72,16 @@ static bool did_init_mpitrampoline = false;
#undef PMPI_Get_library_version
#undef PMPI_Get_version
#undef PMPI_Initialized
#ifdef ENABLE_FORTRAN
#undef mpi_finalized_
#undef mpi_get_library_version_
#undef mpi_get_version_
#undef mpi_initialized_
#undef pmpi_finalized_
#undef pmpi_get_library_version_
#undef pmpi_get_version_
#undef pmpi_initialized_
#endif

int MPI_Finalized(int *flag) {
if (did_init_mpitrampoline)
Expand Down Expand Up @@ -118,6 +138,72 @@ int PMPI_Initialized(int *flag) {
return MPI_Initialized(flag);
}

#ifdef ENABLE_FORTRAN

void mpitrampoline_finalized_(int *flag, MPIABI_Fint *ierror);
void mpi_finalized_(int *restrict flag, MPIABI_Fint *restrict ierror) {
if (did_init_mpitrampoline)
return mpitrampoline_finalized_(flag, ierror);
*flag = 0;
*ierror = MPI_SUCCESS;
}
void pmpi_finalized_(int *flag, MPIABI_Fint *ierror) {
mpi_finalized_(flag, ierror);
}

void mpitrampoline_get_library_version_(char *version, int *resultlen,
MPIABI_Fint *ierror,
size_t version_len);
void mpi_get_library_version_(char *restrict version, int *restrict resultlen,
MPIABI_Fint *restrict ierror,
size_t version_len) {
if (did_init_mpitrampoline)
return mpitrampoline_get_library_version_(version, resultlen, ierror,
version_len);
*resultlen =
snprintf(version, version_len,
"MPItrampoline %d.%d.%d, requiring MPI ABI %d.%d.%d, waiting "
"for manual initialization",
MPITRAMPOLINE_VERSION_MAJOR, MPITRAMPOLINE_VERSION_MINOR,
MPITRAMPOLINE_VERSION_PATCH, MPIABI_VERSION_MAJOR,
MPIABI_VERSION_MINOR, MPIABI_VERSION_PATCH);
if (*resultlen >= version_len)
*resultlen = version_len - 1;
memset(version + *resultlen, ' ', version_len - *resultlen);
*ierror = MPI_SUCCESS;
}
void pmpi_get_library_version_(char *version, int *resultlen,
MPIABI_Fint *ierror, size_t version_len) {
mpi_get_library_version_(version, resultlen, ierror, version_len);
}

void mpitrampoline_get_version_(int *version, int *subversion,
MPIABI_Fint *ierror);
void mpi_get_version_(int *restrict version, int *restrict subversion,
MPIABI_Fint *restrict ierror) {
if (did_init_mpitrampoline)
return mpitrampoline_get_version_(version, subversion, ierror);
*version = MPI_VERSION;
*subversion = MPI_SUBVERSION;
*ierror = MPI_SUCCESS;
}
void pmpi_get_version_(int *version, int *subversion, MPIABI_Fint *ierror) {
mpi_get_version_(version, subversion, ierror);
}

void mpitrampoline_initialized_(int *flag, MPIABI_Fint *ierror);
void mpi_initialized_(int *restrict flag, MPIABI_Fint *restrict ierror) {
if (did_init_mpitrampoline)
return mpitrampoline_initialized_(flag, ierror);
*flag = 0;
*ierror = MPI_SUCCESS;
}
void pmpi_initialized_(int *flag, MPIABI_Fint *ierror) {
mpi_initialized_(flag, ierror);
}

#endif

#define MPI_Finalized MPItrampoline_Finalized
#define MPI_Get_library_version MPItrampoline_Get_library_version
#define MPI_Get_version MPItrampoline_Get_version
Expand All @@ -126,6 +212,16 @@ int PMPI_Initialized(int *flag) {
#define PMPI_Get_library_version PMPItrampoline_Get_library_version
#define PMPI_Get_version PMPItrampoline_Get_version
#define PMPI_Initialized PMPItrampoline_Initialized
#ifdef ENABLE_FORTRAN
#define mpi_finalized_ mpitrampoline_finalized_
#define mpi_get_library_version_ mpitrampoline_get_library_version_
#define mpi_get_version_ mpitrampoline_get_version_
#define mpi_initialized_ mpitrampoline_initialized_
#define pmpi_finalized_ pmpitrampoline_finalized_
#define pmpi_get_library_version_ pmpitrampoline_get_library_version_
#define pmpi_get_version_ pmpitrampoline_get_version_
#define pmpi_initialized_ pmpitrampoline_initialized_
#endif

int MPI_Pcontrol(int level, ...) { return MPI_SUCCESS; }
int PMPI_Pcontrol(int level, ...) { return MPI_SUCCESS; }
Expand Down

0 comments on commit 07b5042

Please sign in to comment.