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