1 /* Copyright (c) 2007-2018. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "smpi_coll.hpp"
8 #include "smpi_comm.hpp"
9 #include "smpi_datatype_derived.hpp"
10 #include "smpi_op.hpp"
11 #include "smpi_process.hpp"
13 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
16 /* PMPI User level calls */
18 int PMPI_Group_free(MPI_Group * group)
20 if (group == nullptr) {
23 if(*group != MPI_COMM_WORLD->group() && *group != MPI_GROUP_EMPTY)
24 simgrid::smpi::Group::unref(*group);
25 *group = MPI_GROUP_NULL;
30 int PMPI_Group_size(MPI_Group group, int *size)
32 if (group == MPI_GROUP_NULL) {
34 } else if (size == nullptr) {
37 *size = group->size();
42 int PMPI_Group_rank(MPI_Group group, int *rank)
44 if (group == MPI_GROUP_NULL) {
46 } else if (rank == nullptr) {
49 *rank = group->rank(simgrid::s4u::Actor::self()->getPid());
54 int PMPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2)
56 if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
59 for (int i = 0; i < n; i++) {
60 if(ranks1[i]==MPI_PROC_NULL){
61 ranks2[i]=MPI_PROC_NULL;
63 simgrid::s4u::ActorPtr actor = group1->actor(ranks1[i]);
64 ranks2[i] = group2->rank(actor);
71 int PMPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result)
73 if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
75 } else if (result == nullptr) {
78 *result = group1->compare(group2);
83 int PMPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup)
86 if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
88 } else if (newgroup == nullptr) {
91 return group1->group_union(group2, newgroup);
95 int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup)
98 if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
100 } else if (newgroup == nullptr) {
103 return group1->intersection(group2,newgroup);
107 int PMPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup)
109 if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
110 return MPI_ERR_GROUP;
111 } else if (newgroup == nullptr) {
114 return group1->difference(group2,newgroup);
118 int PMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
120 if (group == MPI_GROUP_NULL) {
121 return MPI_ERR_GROUP;
122 } else if (newgroup == nullptr) {
125 return group->incl(n, ranks, newgroup);
129 int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
131 if (group == MPI_GROUP_NULL) {
132 return MPI_ERR_GROUP;
133 } else if (newgroup == nullptr) {
138 if (group != MPI_COMM_WORLD->group() && group != MPI_COMM_SELF->group() && group != MPI_GROUP_EMPTY)
141 } else if (n == group->size()) {
142 *newgroup = MPI_GROUP_EMPTY;
145 return group->excl(n,ranks,newgroup);
150 int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group * newgroup)
152 if (group == MPI_GROUP_NULL) {
153 return MPI_ERR_GROUP;
154 } else if (newgroup == nullptr) {
158 *newgroup = MPI_GROUP_EMPTY;
161 return group->range_incl(n,ranges,newgroup);
166 int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group * newgroup)
168 if (group == MPI_GROUP_NULL) {
169 return MPI_ERR_GROUP;
170 } else if (newgroup == nullptr) {
175 if (group != MPI_COMM_WORLD->group() && group != MPI_COMM_SELF->group() &&
176 group != MPI_GROUP_EMPTY)
180 return group->range_excl(n,ranges,newgroup);
185 MPI_Group PMPI_Group_f2c(MPI_Fint group){
186 return simgrid::smpi::Group::f2c(group);
189 MPI_Fint PMPI_Group_c2f(MPI_Group group){