diff --git a/src/debug.c b/src/debug.c index 65991231fd0e2e565c012b6f8e8c9df3132dd30a..d9fbc5168171dba6df0385645d1182caa301cc8b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -331,4 +331,48 @@ void dumpMETISGraph(const char *prefix, idx_t nvertices, idx_t nvertexweights, } } -#endif +#endif /* HAVE_METIS */ + +#ifdef HAVE_MPI +/** + * @brief Dump the positions and MPI ranks of the given top-level cells + * to a simple text file. + * + * Can be used to visualise the partitioning of an MPI run. Note should + * be used immediately after repartitioning when the top-level cells + * have been assigned their nodes. Each time this is called a new file + * with the given prefix, a unique integer and type of .dat is created. + * + * @param prefix base output filename + * @param cells_top the top-level cells. + * @param nr_cells the number of cells. + */ +void dumpCellRanks(const char *prefix, struct cell *cells_top, + int nr_cells) { + + FILE *file = NULL; + + /* Name of output file. */ + static int nseq = 0; + char fname[200]; + sprintf(fname, "%s_%03d.dat", prefix, nseq); + nseq++; + + file = fopen(fname, "w"); + + /* Header. */ + fprintf(file, "# %6s %6s %6s %6s %6s %6s %6s\n", + "x", "y", "z", "xw", "yw", "zw", "rank"); + + /* Output */ + for (int i = 0; i < nr_cells; i++) { + struct cell *c = &cells_top[i]; + fprintf(file, " %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6d\n", + c->loc[0], c->loc[1], c->loc[2], c->width[0], + c->width[1], c->width[2], c->nodeID); + } + + fclose(file); +} + +#endif /* HAVE_MPI */ diff --git a/src/debug.h b/src/debug.h index 2142a22eca91338580d8f50197a57de0cf248bee..d42bc5b108bce8762b42bcea42f39e250060d61f 100644 --- a/src/debug.h +++ b/src/debug.h @@ -37,6 +37,11 @@ int checkSpacehmax(struct space *s); #include "metis.h" void dumpMETISGraph(const char *prefix, idx_t nvtxs, idx_t ncon, idx_t *xadj, idx_t *adjncy, idx_t *vwgt, idx_t *vsize, idx_t *adjwgt); +#endif +#ifdef HAVE_MPI +void dumpCellRanks(const char *prefix, struct cell *cells_top, + int nr_cells); #endif + #endif /* SWIFT_DEBUG_H */