package mpi; import java.nio.ByteBuffer; public class MPITransportComponentPacket { private ByteBuffer buffer; private int extent; public int numberOfClustersOffset = 0; public int numberOfDoubleComponentsOffset = Integer.BYTES; public int numberOfIntegerComponentsOffset = 2*Integer.BYTES; public int clusterDoubleComponentsOffset; // Not placed in the buffer to save space public int clusterIntegerComponentsOffset; public int associatedCreatedIndexOffset; public int clusterHostRangeOffset; public static MPITransportComponentPacket loadMPITransportComponentPacket(ByteBuffer buffer){ MPITransportComponentPacket packet = new MPITransportComponentPacket(); packet.buffer = buffer; packet.extent = buffer.capacity(); packet.clusterDoubleComponentsOffset = 6 * Integer.BYTES; packet.clusterIntegerComponentsOffset = buffer.getInt(3*Integer.BYTES); packet.associatedCreatedIndexOffset = buffer.getInt(4*Integer.BYTES); packet.clusterHostRangeOffset = buffer.getInt(5*Integer.BYTES); return packet; } public int getExtent(){ return extent; } public ByteBuffer getBuffer(){ return buffer; } /** * @return Number of Clusters in Package */ public int getNumberOfClusters(){ return buffer.getInt(numberOfClustersOffset); } /** * @return Number of Double Components in Package */ public int getNumberOfDoubleComponents(){ return buffer.getInt(numberOfDoubleComponentsOffset); } /** * @return Number of Integer Components in Package */ public int getNumberOfIntegerComponents(){ return buffer.getInt(numberOfIntegerComponentsOffset); } public void setNumberOfClusters(int numberOfClusters){ buffer.putInt(numberOfClustersOffset, numberOfClusters); } public void setNumberOfIntegerComponents(int numberOfIntegerComponents){ buffer.putInt(numberOfIntegerComponentsOffset, numberOfIntegerComponents); } public void setNumberOfDoubleComponents(int numberOfDoubleComponents){ buffer.putInt(numberOfDoubleComponentsOffset, numberOfDoubleComponents); } public double getClusterDoubleComponentAt(int index){ return buffer.getDouble(clusterDoubleComponentsOffset + index*Double.BYTES); } public int getClusterIntegerComponentAt(int index){ return buffer.getInt(clusterIntegerComponentsOffset + index*Integer.BYTES); } public int getAssociatedCreatedIndexAt(int index){ return buffer.getInt(associatedCreatedIndexOffset+index*Integer.BYTES); } public int getClusterHostRangeAt(int index){ return buffer.getInt(clusterHostRangeOffset + index*Integer.BYTES); } public void setClusterDoubleComponentAt(int index, double value){ buffer.putDouble(clusterDoubleComponentsOffset + index*Double.BYTES, value); } public void setClusterIntegerComponentAt(int index, int value){ buffer.putInt(clusterIntegerComponentsOffset + index*Integer.BYTES, value); } public void setAssociatedCreatedIndexAt(int index, int value){ buffer.putInt(associatedCreatedIndexOffset+index*Integer.BYTES, value); } public void setClusterHostRangeAt(int index, int value){ buffer.putInt(clusterHostRangeOffset + index*Integer.BYTES, value); } private MPITransportComponentPacket(){} public MPITransportComponentPacket(int numberOfClusters, int numberOfDoubleComponents, int numberOfIntegerComponents) { extent = 6 * Integer.BYTES; // 3 for three int values and another 3 to point to three arrays - one array doesn't need to be pointed to clusterDoubleComponentsOffset = extent; int maxLength = numberOfClusters * numberOfDoubleComponents; maxLength = Math.max(maxLength, 1); extent += maxLength * Double.BYTES; clusterIntegerComponentsOffset = extent; maxLength = numberOfClusters * numberOfIntegerComponents; maxLength = Math.max(maxLength, 1); extent += maxLength * Integer.BYTES; associatedCreatedIndexOffset = extent; maxLength = Math.max(numberOfClusters, 1); extent += maxLength * Integer.BYTES; clusterHostRangeOffset = extent; extent += maxLength * Integer.BYTES; buffer = MPI.newByteBuffer(extent); buffer.putInt(numberOfClusters). putInt(numberOfDoubleComponents). putInt(numberOfIntegerComponents). putInt(clusterIntegerComponentsOffset). putInt(associatedCreatedIndexOffset). putInt(clusterHostRangeOffset); } }