-/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2014-2020. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <vector>
/* static functions */
-static int assignnodes(int ndim, int nfactor, int *pfacts,int **pdims);
+static int assignnodes(int ndim, int nfactor, const int* pfacts, int** pdims);
static int getfactors(int num, int *nfators, int **factors);
{
xbt_assert(not comm_);
comm_ = comm;
- if (comm_)
- comm_->topo_ = this;
}
/*******************************************************************************
for (int i = 0 ; i < newSize ; i++) {
newGroup->set_mapping(oldGroup->actor(i), i);
}
- *comm_cart = new Comm(newGroup, this);
+ *comm_cart = new Comm(newGroup, std::shared_ptr<Topo>(this));
}
} else {
if(comm_cart != nullptr){
if (rank == 0) {
- MPI_Group group = new Group(MPI_COMM_SELF->group());
- *comm_cart = new Comm(group, this);
+ auto* group = new Group(MPI_COMM_SELF->group());
+ *comm_cart = new Comm(group, std::shared_ptr<Topo>(this));
} else {
*comm_cart = MPI_COMM_NULL;
}
}
}
- if(comm_cart != nullptr)
+ if(comm_cart != nullptr){
setComm(*comm_cart);
+ }
}
Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
// that should not segfault
int j = 0;
- for (int i = 0 ; j < newNDims ; i++) {
+ for (int i = 0; i < oldNDims; i++) {
if(remain_dims[i]) {
newDims[j] =dims_[i];
newPeriodic[j] =periodic_[i];
res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, newcomm);
} else {
*newcomm = getComm()->split(color, getComm()->rank());
- res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, nullptr);
+ auto topo = std::make_shared<Topo_Cart>(getComm(), newNDims, newDims, newPeriodic, 0, nullptr);
+ res = topo.get();
res->setComm(*newcomm);
+ (*newcomm)->set_topo(topo);
}
delete[] newDims;
delete[] newPeriodic;
return MPI_ERR_DIMS;
}
- int* position = new int[ndims_];
+ auto* position = new int[ndims_];
this->coords(getComm()->rank(), ndims_, position);
position[direction] += disp;
return MPI_SUCCESS;
}
-int Topo_Cart::dim_get(int *ndims) {
+int Topo_Cart::dim_get(int* ndims) const
+{
*ndims =ndims_;
return MPI_SUCCESS;
}
/* Get # of free-to-be-assigned processes and # of free dimensions */
int freeprocs = nnodes;
int freedims = 0;
- int *p = dims;
+ const int* p = dims;
for (int i = 0; i < ndims; ++i) {
if (*p == 0) {
++freedims;
* - ptr to array of dimensions (returned value)
* Returns: - 0 or ERROR
*/
-static int assignnodes(int ndim, int nfactor, int *pfacts, int **pdims)
+static int assignnodes(int ndim, int nfactor, const int* pfacts, int** pdims)
{
int *pmin;
}
/* Allocate and initialize the bins */
- int *bins = new int[ndim];
+ auto* bins = new int[ndim];
*pdims = bins;
int *p = bins;