MPI_CART_SUB(3)

πŸ’… MPI_CART_SUB(3) β€” Open MPI, bestie edition πŸŽ€

okay so this is the MPI_Cart_sub page from the Open MPI manual, and honestly? it's a whole vibe. it partitions a communicator into subgroups, which form lower-dimensional Cartesian subgrids. that's the whole ~thing~. let's get into it ✨


✨ SYNTAX ✨

🌸 C Syntax

#include <mpi.h>

int MPI_Cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *comm_new)

🌸 Fortran Syntax

USE MPI
! or the older form: INCLUDE 'mpif.h'

MPI_CART_SUB(COMM, REMAIN_DIMS, COMM_NEW, IERROR)
    INTEGER COMM, COMM_NEW, IERROR
    LOGICAL REMAIN_DIMS(*)

🌸 Fortran 2008 Syntax

USE mpi_f08

MPI_Cart_sub(comm, remain_dims, newcomm, ierror)
    TYPE(MPI_Comm), INTENT(IN) :: comm
    LOGICAL, INTENT(IN) :: remain_dims(*)
    TYPE(MPI_Comm), INTENT(OUT) :: newcomm
    INTEGER, OPTIONAL, INTENT(OUT) :: ierror

πŸ’– INPUT PARAMETERS πŸ’–

  • comm β€” a communicator that's got that Cartesian structure going on (it's a handle, bestie).
  • remain_dims β€” a logical vector, and here's the tea β˜•: the *i*th entry of remain_dims says whether the *i*th dimension is kept in the subgrid (true) or dropped (false). that's it, that's the whole job πŸ‘‘

🫢 OUTPUT PARAMETERS 🫢

  • comm_new β€” the communicator holding the subgrid that includes the calling process (handle). yes bestie, your subgrid πŸ’…
  • ierror β€” Fortran only: the error status (integer).

πŸ¦‹ DESCRIPTION πŸ¦‹

so like. if a Cartesian topology was already created with MPI_Cart_create, then MPI_Cart_sub is the function you call to partition the communicator group into subgroups that form lower-dimensional Cartesian subgrids πŸŽ€ β€” and then to build, for each subgroup, a communicator with the associated subgrid Cartesian topology. it's lowkey closely related to MPI_Comm_split, iykyk.

Example: picture this β€” assume MPI_Cart_create( ..., comm) already defined a (2 x 3 x 4) grid. let remain_dims = (true, false, true). then a call to

MPI_Cart_sub(comm, remain_dims, comm_new);

will create three communicators, each with eight processes in a 2 x 4 Cartesian topology. iconic ✨

and if instead remain_dims = (false, false, true), then the call to MPI_Cart_sub(comm, remain_dims, comm_new) will create six nonoverlapping communicators, each with four processes, in a one-dimensional Cartesian topology. two completely different looks, same function. main character energy fr fr πŸ’€


😭 ERRORS 😭

almost all MPI routines return an error value, okay? C routines hand it back as the return result of the function, and Fortran routines tuck it into the last argument. noted πŸ“

before that error value gets returned, the current MPI error handler associated with the communication object is called (think communicator, window, file β€” you know the drill). if no communication object is associated with the MPI call, then the call is considered attached to MPI_COMM_SELF and will call that associated MPI error handler. and when MPI_COMM_SELF is not initialized β€” that's before MPI_Init/MPI_Init_thread, after MPI_Finalize, or when using the Sessions Model exclusively β€” the error raises the initial error handler. 🚨

you can change that initial error handler by calling MPI_Comm_set_errhandler on MPI_COMM_SELF when using the World model, or via the mpi_initial_errhandler CLI argument to mpiexec, or via info key to MPI_Comm_spawn/MPI_Comm_spawn_multiple. and if no other appropriate error handler has been set, then the MPI_ERRORS_RETURN error handler is called for MPI I/O functions, and the MPI_ERRORS_ABORT error handler is called for all other MPI functions.

Open MPI ships with three predefined error handlers you can use πŸ‘‡

  • MPI_ERRORS_ARE_FATAL β€” causes the program to abort all connected MPI processes. like, everyone. gone. πŸ’€
  • MPI_ERRORS_ABORT β€” an error handler that can be invoked on a communicator, window, file, or session. when called on a communicator, it acts as if MPI_Abort was called on that communicator. if called on a window or file, it acts as if MPI_Abort was called on a communicator containing the group of processes in the corresponding window or file. if called on a session, it aborts only the local process. nuance, bestie πŸŽ€
  • MPI_ERRORS_RETURN β€” returns an error code to the application. polite. respectful. πŸ™

MPI applications can also implement their own error handlers by calling:

  • MPI_Comm_create_errhandler then MPI_Comm_set_errhandler
  • MPI_File_create_errhandler then MPI_File_set_errhandler
  • MPI_Session_create_errhandler then MPI_Session_set_errhandler or at MPI_Session_init
  • MPI_Win_create_errhandler then MPI_Win_set_errhandler
⚠️ note that MPI does not guarantee that an MPI program can continue past an error. like, no cap, don't count on it surviving 😭

see the MPI man page for a full list of MPI error codes, and the Error Handling section of the MPI-3.1 standard for more information. 🧚

🌈 SEE ALSO:

  • MPI_Cart_create

2003-2026, The Open MPI Community


and that's the page babes πŸ’œ it was authored by The Open MPI Community (copyright 2003-2026, slay), and this particular rendering is dated Sep 11, 2026 β€” go forth and subdivide those grids, you gorgeous Cartesian icon πŸ¦‹βœ¨πŸ“

πŸ“¦ where this page comes from