1 /* 2 * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana 3 * University Research and Technology 4 * Corporation. All rights reserved. 5 * Copyright (c) 2004-2005 The University of Tennessee and The University 6 * of Tennessee Research Foundation. All rights 7 * reserved. 8 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 9 * University of Stuttgart. All rights reserved. 10 * Copyright (c) 2004-2005 The Regents of the University of California. 11 * All rights reserved. 12 * Copyright (c) 2015 Los Alamos National Security, LLC. All rights 13 * reserved. 14 * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. 15 * $COPYRIGHT$ 16 * 17 * Additional copyrights may follow 18 * 19 * $HEADER$ 20 * 21 * 22 * This file is almost a complete re-write for Open MPI compared to the 23 * original mpiJava package. Its license and copyright are listed below. 24 * See <path to ompi/mpi/java/README> for more information. 25 * 26 * 27 * Licensed under the Apache License, Version 2.0 (the "License"); 28 * you may not use this file except in compliance with the License. 29 * You may obtain a copy of the License at 30 * 31 * http://www.apache.org/licenses/LICENSE-2.0 32 * 33 * Unless required by applicable law or agreed to in writing, software 34 * distributed under the License is distributed on an "AS IS" BASIS, 35 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 36 * See the License for the specific language governing permissions and 37 * limitations under the License. 38 * 39 * 40 * File : Graphcomm.java 41 * Author : Xinying Li 42 * Created : Thu Apr 9 12:22:15 1998 43 * Revision : $Revision: 1.5 $ 44 * Updated : $Date: 2001/10/22 21:07:55 $ 45 * Copyright: Northeast Parallel Architectures Center 46 * at Syracuse University 1998 47 */ 48 49 package mpi; 50 51 /** 52 * Communicator with graph structure. 53 */ 54 public final class GraphComm extends Intracomm 55 { 56 static 57 { 58 init(); 59 } 60 61 private static native void init(); 62 63 protected GraphComm(long handle) throws MPIException 64 { 65 super(handle); 66 } 67 68 protected GraphComm(long[] commRequest) 69 { 70 super(commRequest); 71 } 72 73 /** 74 * Duplicates this communicator. 75 * <p>Java binding of {@code MPI_COMM_DUP}. 76 * <p>It is recommended to use {@link #dup} instead of {@link #clone} 77 * because the last can't throw an {@link mpi.MPIException}. 78 * @return copy of this communicator 79 */ 80 @Override public GraphComm clone() 81 { 82 try 83 { 84 return dup(); 85 } 86 catch(MPIException e) 87 { 88 throw new RuntimeException(e.getMessage()); 89 } 90 } 91 92 /** 93 * Duplicates this communicator. 94 * <p>Java binding of {@code MPI_COMM_DUP}. 95 * @return copy of this communicator 96 * @throws MPIException Signals that an MPI exception of some sort has occurred. 97 */ 98 @Override public GraphComm dup() throws MPIException 99 { 100 MPI.check(); 101 return new GraphComm(dup(handle)); 102 } 103 104 /** 105 * Duplicates this communicator. 106 * <p>The new communicator can't be used before the operation completes. 107 * The request object must be obtained calling {@link #getRequest}. 108 * <p>Java binding of {@code MPI_COMM_IDUP}. 109 * @return copy of this communicator 110 * @throws MPIException Signals that an MPI exception of some sort has occurred. 111 */ 112 @Override public GraphComm iDup() throws MPIException 113 { 114 MPI.check(); 115 return new GraphComm(iDup(handle)); 116 } 117 118 /** 119 * Duplicates this communicator with the info object used in the call. 120 * <p>Java binding of {@code MPI_COMM_DUP_WITH_INFO}. 121 * @param info info object to associate with the new communicator 122 * @return copy of this communicator 123 * @throws MPIException Signals that an MPI exception of some sort has occurred. 124 */ 125 @Override public GraphComm dupWithInfo(Info info) throws MPIException 126 { 127 MPI.check(); 128 return new GraphComm(dupWithInfo(handle, info.handle)); 129 } 130 131 /** 132 * Returns graph topology information. 133 * <p>Java binding of the MPI operations {@code MPI_GRAPHDIMS_GET} 134 * and {@code MPI_GRAPH_GET}. 135 * <p>The number of nodes and number of edges can be extracted 136 * from the sizes of the {@code index} and {@code edges} fields 137 * of the returned object. 138 * @return object defining node degress and edges of graph 139 * @throws MPIException Signals that an MPI exception of some sort has occurred. 140 */ 141 public GraphParms getDims() throws MPIException 142 { 143 MPI.check(); 144 return getDims(handle); 145 } 146 147 private native GraphParms getDims(long comm) throws MPIException; 148 149 /** 150 * Provides adjacency information for general graph topology. 151 * <p>Java binding of the MPI operations {@code MPI_GRAPH_NEIGHBORS_COUNT} 152 * and {@code MPI_GRAPH_NEIGHBORS}. 153 * <p>The number of neighbors can be extracted from the size of the result. 154 * @param rank rank of a process in the group of this communicator 155 * @return array of ranks of neighboring processes to one specified 156 * @throws MPIException Signals that an MPI exception of some sort has occurred. 157 */ 158 public int[] getNeighbors(int rank) throws MPIException 159 { 160 MPI.check(); 161 return getNeighbors(handle, rank); 162 } 163 164 private native int[] getNeighbors(long comm, int rank) throws MPIException; 165 166 /** 167 * Gets the adjacency information for a distributed graph topology. 168 * @return adjacency information for a distributed graph topology 169 * @throws MPIException Signals that an MPI exception of some sort has occurred. 170 */ 171 public DistGraphNeighbors getDistGraphNeighbors() throws MPIException 172 { 173 MPI.check(); 174 return getDistGraphNeighbors(handle); 175 } 176 177 private native DistGraphNeighbors getDistGraphNeighbors(long comm) 178 throws MPIException; 179 180 /** 181 * Compute an optimal placement. 182 * <p>Java binding of the MPI operation {@code MPI_GRAPH_MAP}. 183 * <p>The number of nodes is taken to be size of the {@code index} argument. 184 * @param index node degrees 185 * @param edges graph edges 186 * @return reordered rank of calling process 187 * @throws MPIException Signals that an MPI exception of some sort has occurred. 188 */ 189 public int map(int[] index, int[] edges) throws MPIException 190 { 191 MPI.check(); 192 return map(handle, index, edges); 193 } 194 195 private native int map(long comm, int[] index, int[] edges) throws MPIException; 196 197 } // Graphcomm