1212 * Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313 * Copyright (c) 2015-2019 Research Organization for Information Science
1414 * and Technology (RIST). All rights reserved.
15- * Copyright (c) 2024 Triad National Security, LLC. All rights
15+ * Copyright (c) 2024-2025 Triad National Security, LLC. All rights
1616 * reserved.
1717 * $COPYRIGHT$
1818 *
@@ -27,42 +27,42 @@ PROTOTYPE VOID alltoallw(BUFFER x1, COUNT_ARRAY sendcounts,
2727 DISP_ARRAY rdispls, DATATYPE_ARRAY recvtypes,
2828 COMM comm)
2929{
30- MPI_Comm c_comm = PMPI_Comm_f2c(*comm);
31- MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
3230 int size, c_ierr;
31+ MPI_Comm c_comm = PMPI_Comm_f2c(*comm);
3332 char *sendbuf = OMPI_CFI_BASE_ADDR(x1), *recvbuf = OMPI_CFI_BASE_ADDR(x2);
33+ MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
34+ @COUNT_TYPE@ *tmp_sendcounts = NULL;
35+ @DISP_TYPE@ *tmp_sdispls = NULL;
36+ @COUNT_TYPE@ *tmp_recvcounts = NULL;
37+ @DISP_TYPE@ *tmp_rdispls = NULL;
3438
35- OMPI_ARRAY_NAME_DECL(sendcounts);
36- OMPI_ARRAY_NAME_DECL(sdispls);
37- OMPI_ARRAY_NAME_DECL(recvcounts);
38- OMPI_ARRAY_NAME_DECL(rdispls);
39+ size = OMPI_COMM_IS_INTER(c_comm)?ompi_comm_remote_size(c_comm):ompi_comm_size(c_comm);
3940
40- OMPI_CFI_CHECK_CONTIGUOUS(x1, c_ierr);
41- if (MPI_SUCCESS != c_ierr) {
42- if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
43- OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
44- return;
41+ if (OMPI_COMM_IS_INTER(c_comm) || !OMPI_IS_FORTRAN_IN_PLACE(sendbuf)) {
42+ OMPI_CFI_CHECK_CONTIGUOUS(x1, c_ierr);
43+ if (MPI_SUCCESS != c_ierr) {
44+ if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
45+ OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
46+ return;
47+ }
48+ c_sendtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
49+ for (int i=0; i<size; i++) {
50+ c_sendtypes[i] = PMPI_Type_f2c(sendtypes[i]);
51+ }
52+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(sendcounts, tmp_sendcounts, size);
53+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(sdispls, tmp_sdispls, size);
54+ } else {
55+ sendbuf = MPI_IN_PLACE;
4556 }
57+
4658 OMPI_CFI_CHECK_CONTIGUOUS(x2, c_ierr);
4759 if (MPI_SUCCESS != c_ierr) {
4860 if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
4961 OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
5062 return;
5163 }
52- size = OMPI_COMM_IS_INTER(c_comm)?ompi_comm_remote_size(c_comm):ompi_comm_size(c_comm);
53-
54- if (!OMPI_IS_FORTRAN_IN_PLACE(sendbuf)) {
55- c_sendtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
56- OMPI_ARRAY_FINT_2_INT(sendcounts, size);
57- OMPI_ARRAY_FINT_2_INT(sdispls, size);
58- for (int i=0; i<size; i++) {
59- c_sendtypes[i] = PMPI_Type_f2c(sendtypes[i]);
60- }
61- }
6264
6365 c_recvtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
64- OMPI_ARRAY_FINT_2_INT(recvcounts, size);
65- OMPI_ARRAY_FINT_2_INT(rdispls, size);
6666 for (int i=0; i<size; i++) {
6767 c_recvtypes[i] = PMPI_Type_f2c(recvtypes[i]);
6868 }
@@ -71,20 +71,24 @@ PROTOTYPE VOID alltoallw(BUFFER x1, COUNT_ARRAY sendcounts,
7171 sendbuf = (char *) OMPI_F2C_BOTTOM(sendbuf);
7272 recvbuf = (char *) OMPI_F2C_BOTTOM(recvbuf);
7373
74+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(recvcounts, tmp_recvcounts, size);
75+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(rdispls, tmp_rdispls, size);
76+
7477 c_ierr = @INNER_CALL@(sendbuf,
75- OMPI_ARRAY_NAME_CONVERT(sendcounts) ,
76- OMPI_ARRAY_NAME_CONVERT(sdispls) ,
78+ tmp_sendcounts ,
79+ tmp_sdispls ,
7780 c_sendtypes,
7881 recvbuf,
79- OMPI_ARRAY_NAME_CONVERT(recvcounts) ,
80- OMPI_ARRAY_NAME_CONVERT(rdispls) ,
82+ tmp_recvcounts ,
83+ tmp_rdispls ,
8184 c_recvtypes, c_comm);
8285 if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
8386
84- OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
85- OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);
86- OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
87- OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
87+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(sendcounts, tmp_sendcounts);
88+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(sdispls, tmp_sdispls);
89+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(recvcounts, tmp_recvcounts);
90+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(rdispls, tmp_rdispls);
91+
8892 if (NULL != c_sendtypes) {
8993 free(c_sendtypes);
9094 }
0 commit comments