From a16726652e64ac1eb582d182820b32075953c956 Mon Sep 17 00:00:00 2001
From: "raphael.bach" <raphael.bach@etu.hesge.ch>
Date: Fri, 1 Jul 2022 20:58:44 +0200
Subject: [PATCH] Add `fmpi_mpi_dims_create()`

---
 include/internal/fmpi_mpi.h |  6 ++++++
 src/fmpi_mpi.c              | 22 ++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/include/internal/fmpi_mpi.h b/include/internal/fmpi_mpi.h
index 5202625..5de44f6 100644
--- a/include/internal/fmpi_mpi.h
+++ b/include/internal/fmpi_mpi.h
@@ -237,6 +237,12 @@ int fmpi_mpi_world_reduce_in_place(
     const struct fmpi_mpi_ctx * ctx, void * buf, size_t cnt, MPI_Datatype type,
     MPI_Op op
 );
+/*------------------------------------------------------------------------------
+    fmpi_mpi_dims_create()
+------------------------------------------------------------------------------*/
+int fmpi_mpi_dims_create(
+    const struct fmpi_mpi_ctx * ctx, size_t * const dim_len, size_t dim_cnt
+);
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/src/fmpi_mpi.c b/src/fmpi_mpi.c
index b28b8bd..1af313b 100644
--- a/src/fmpi_mpi.c
+++ b/src/fmpi_mpi.c
@@ -32,6 +32,7 @@
 // External
 #include <mpi.h>
 // Internal
+#include "internal/fmpi_common.h"
 #include "internal/fmpi_error.h"
 #include "internal/fmpi_type.h"
 /*==============================================================================
@@ -314,3 +315,24 @@ int fmpi_mpi_world_reduce_in_place(
     }
     return err;
 }
+/*------------------------------------------------------------------------------
+    fmpi_mpi_dims_create()
+------------------------------------------------------------------------------*/
+int fmpi_mpi_dims_create(
+    const struct fmpi_mpi_ctx * const ctx, size_t * const dim_len,
+    const size_t dim_cnt
+){
+    assert(ctx != NULL);
+    assert(dim_len != NULL);
+    assert(dim_cnt <= FMPI_DIM_MAX);
+    int dims[FMPI_DIM_MAX];
+    for(size_t i = 0; i < dim_cnt; i++) {
+        dims[i] = (int)dim_len[i];
+    }
+    const int err = MPI_Dims_create(ctx->size, (int)dim_cnt, dims);
+    for(size_t i = 0; i < dim_cnt; i++) {
+        assert(dims[i] >= 0);
+        dim_len[i] = (size_t)dims[i];
+    }
+    return fmpi_mpi_check_error(ctx, err, "MPI_Dims_create");
+}
-- 
GitLab