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$
15  *
16  * Additional copyrights may follow
17  *
18  * $HEADER$
19  *
20  *
21  * This file is almost a complete re-write for Open MPI compared to the
22  * original mpiJava package. Its license and copyright are listed below.
23  * See <path to ompi/mpi/java/README> for more information.
24  *
25  *
26  *  Licensed under the Apache License, Version 2.0 (the "License");
27  *  you may not use this file except in compliance with the License.
28  *  You may obtain a copy of the License at
29  *
30  *     http://www.apache.org/licenses/LICENSE-2.0
31  *
32  *  Unless required by applicable law or agreed to in writing, software
33  *  distributed under the License is distributed on an "AS IS" BASIS,
34  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
35  *  See the License for the specific language governing permissions and
36  *  limitations under the License.
37  *
38  *
39  * File         : Intercomm.java
40  * Author       : Xinying Li
41  * Created      : Thu Apr  9 12:22:15 1998
42  * Revision     : $Revision: 1.5 $
43  * Updated      : $Date: 1999/09/14 20:50:11 $
44  * Copyright: Northeast Parallel Architectures Center
45  *            at Syracuse University 1998
46  */
47 
48 package mpi;
49 
50 /**
51  * This class represents intercommunicators.
52  */
53 public final class Intercomm extends Comm
54 {
Intercomm(long handle)55 	protected Intercomm(long handle)
56 	{
57 		super(handle);
58 	}
59 
Intercomm(long[] commRequest)60 	protected Intercomm(long[] commRequest)
61 	{
62 		super(commRequest);
63 	}
64 
65 	/**
66 	 * Duplicates this communicator.
67 	 * <p>Java binding of {@code MPI_COMM_DUP}.
68 	 * <p>It is recommended to use {@link #dup} instead of {@link #clone}
69 	 * because the last can't throw an {@link mpi.MPIException}.
70 	 * @return copy of this communicator
71 	 */
clone()72 	@Override public Intercomm clone()
73 	{
74 		try
75 		{
76 			return dup();
77 		}
78 		catch(MPIException e)
79 		{
80 			throw new RuntimeException(e.getMessage());
81 		}
82 	}
83 
84 	/**
85 	 * Duplicates this communicator.
86 	 * <p>Java binding of {@code MPI_COMM_DUP}.
87 	 * @return copy of this communicator
88 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
89 	 */
dup()90 	@Override public Intercomm dup() throws MPIException
91 	{
92 		MPI.check();
93 		return new Intercomm(dup(handle));
94 	}
95 
96 	/**
97 	 * Duplicates this communicator.
98 	 * <p>Java binding of {@code MPI_COMM_IDUP}.
99 	 * <p>The new communicator can't be used before the operation completes.
100 	 * The request object must be obtained calling {@link #getRequest}.
101 	 * @return copy of this communicator
102 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
103 	 */
iDup()104 	@Override public Intercomm iDup() throws MPIException
105 	{
106 		MPI.check();
107 		return new Intercomm(iDup(handle));
108 	}
109 
110 	/**
111 	* Duplicates this communicator with the info object used in the call.
112 	* <p>Java binding of {@code MPI_COMM_DUP_WITH_INFO}.
113 	* @param info	info object to associate with the new communicator
114 	* @return copy of this communicator
115 	* @throws MPIException Signals that an MPI exception of some sort has occurred.
116 	*/
dupWithInfo(Info info)117 	@Override public Intercomm dupWithInfo(Info info) throws MPIException
118 	{
119 	    MPI.check();
120 	    return new Intercomm(dupWithInfo(handle, info.handle));
121 	}
122 
123 	// Inter-Communication
124 
125 	/**
126 	 * Size of remote group.
127 	 * <p>Java binding of the MPI operation {@code MPI_COMM_REMOTE_SIZE}.
128 	 * @return number of process in remote group of this communicator
129 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
130 	 */
getRemoteSize()131 	public int getRemoteSize() throws MPIException
132 	{
133 		MPI.check();
134 		return getRemoteSize_jni();
135 	}
136 
getRemoteSize_jni()137 	private native int getRemoteSize_jni() throws MPIException;
138 
139 	/**
140 	 * Return the remote group.
141 	 * <p>Java binding of the MPI operation {@code MPI_COMM_REMOTE_GROUP}.
142 	 * @return remote group of this communicator
143 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
144 	 */
getRemoteGroup()145 	public Group getRemoteGroup() throws MPIException
146 	{
147 		MPI.check();
148 		return new Group(getRemoteGroup_jni());
149 	}
150 
getRemoteGroup_jni()151 	private native long getRemoteGroup_jni();
152 
153 	/**
154 	 * Creates an intracommuncator from an intercommunicator
155 	 * <p>Java binding of the MPI operation {@code MPI_INTERCOMM_MERGE}.
156 	 * @param high true if the local group has higher ranks in combined group
157 	 * @return new intra-communicator
158 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
159 	 */
merge(boolean high)160 	public Intracomm merge(boolean high) throws MPIException
161 	{
162 		MPI.check();
163 		return new Intracomm(merge_jni(high));
164 	}
165 
merge_jni(boolean high)166 	private native long merge_jni(boolean high);
167 
168 	/**
169 	 * Java binding of {@code MPI_COMM_GET_PARENT}.
170 	 * @return the parent communicator
171 	 * @throws MPIException Signals that an MPI exception of some sort has occurred.
172 	 */
getParent()173 	public static Intercomm getParent() throws MPIException
174 	{
175 		MPI.check();
176 		return new Intercomm(getParent_jni());
177 	}
178 
getParent_jni()179 	private native static long getParent_jni() throws MPIException;
180 
181 } // Intercomm
182