/*
 * $Id: Mpi2Communicator.java,v 1.8 1999/10/05 14:25:19 yamauchi Exp $
 *     (M\pi)^2 : Interface of Mpi2 Communicator 
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *
 * original source mpi2communStandAlone.h mpi2communStandAlone.cc
 *
 * MPI の実装部分に不明な点が多いので，とりあえず必要なものだけ書いて
 * おく
 *
 * 1999年8月 9日(月) */

package jp.ac.tohoku.is.archi.mpi2.net;

import  mpi.*;
import  jp.ac.tohoku.is.archi.mpi2.common.*;
import  jp.ac.tohoku.is.archi.mpi2.obj.*;
import  jp.ac.tohoku.is.archi.mpi2.sysparam.*;
import  jp.ac.tohoku.is.archi.mpi2.util.*;

/**
 * (M\pi)^2 が用いる通信関数群の interface
 */
public interface Mpi2Communicator {
    /**
     * get name : どんな種類の通信方式か
     */
    public String getName();

    /**
     * initialize commun (M\pi)^2
     */
    public String [] init(String [] args);


    public void finalizecommun(); // finalize() はよくあるので名前を変えた
    public void barrier();
    public void exit(int err_num);

    /**
     * get type
     */
    public int getCommunicatorType();

    /**
     * get identification
     */
    public String getDescription();

    /**
     * sysinfo (Broadcast)
     *  PE 用では object, material, sysinfo の receive はいらない。
     *  send と同時に receive する
     *
     *	各パラメータは IN(root)/OUT(others) なので取り出せるように長さ 
     *  1 の配列とした．
     */
    public void broadSysinfo(SysInfo 	[] sys, 
			     ViewData 	[] view, 
			     SpaceParam [] spcparam);

    /**
     * 各空間に物体が存在するかの表
     */
    public void broadObjectInSpaceMap(Array3D [] objectInSpaceMap);

    /**
     * 物体からの距離の表
     */
    // public void broadPRCSkipMap(int bytes, OBJINSPC_IMPLEMENT_TYPE * pDatArray)

    /*
     * send, recv objects
     */
    /**
     * send objects
     * 	@param destRank 	物体プリミティブ送付先の rank
     * 	@param objprim 		送付する物体プリミティブ
     */
    public void sendObject(int destRank, ObjectPrimitive objprim);
    
    /**
     * recv objects
     * 	@param destRank 	物体プリミティブ送付元の rank の入る長さ 1 配列
     * 	@param objprim 		受信した物体プリミティブの配列
     */
    public void recvObject(int [] srcRank,  ObjectPrimitive [] objprim);
    

    /**
     * Isend objects
     *	non blocking send
     *	
     *	@param destRank	送信先
     *	@param buff	送信する物体の配列
     *	@param sendnum  配列は固定にとられることが多い．そのため，その
     *			配列のいくつまでが送信すべきものかを示しておく．
     */
    public Request IsendObj(int destRank, EncodedData lockedSendBuf, 
			    int sendObjTag);


    /**
     * Irecv objects
     *	non blocking recv
     *	
     *	@param srcRank	  送信元
     *	@param buff	  送信する物体の配列
     *	@param recvObjnum 受信する数
     */
    public Request IrecvObj(int srcRank, EncodedData encodedBuf, int recvTags);

    /*
     * send complete? 
     * (waiting completion of non blocking send)
     */
    public boolean isSendComplete(Request req_handle);

    /*
     * recv complete? 
     * (waiting completion of non blocking recv)
     */
    public boolean isRecvComplete(Request req_handle);

    /**
     * send, recv volume (やがて object として統一すべきか?)
     *	しかし、固定長のものに serialize はしたくないので固定長のもの
     *	はそのまま、serialize すべきものは serialize して統一的に送信
     *	しよう  
     *------------------------------------------------------------
     * send subvolume
     */
    // public void commMpi2_sendVolume(int dstRank, VolumeClass *pVol);

    /**
     * recv subvolume
     */
    // public void commMpi2_recvVolume(int srcRank, int dstRank, 
    // 				       VolumeClass **ppVol);

    /**
     * material
     */
    public void broadMaterial(Material [] aMaterial);


    /*------------------------------------------------------------
     * probe 
     *-----------------------------------------------------------*/
    /**
     * can recv 
     * 	@param srcRank_and_recvDatNum[] : 返り値
     *		srcRank_and_recvDatNum[0] : 送信元
     *		srcRank_and_recvDatNum[1] : 受信する物体数
     *	@param recvStaffTAG 		: 受信したいものの TAG
     *	@return recv 発行可能なら true 
     */
    public boolean canRecv(int [] srcRank_and_recvDatNum, 
			   int    recvStaffTAG,
			   Datatype dat_t);
    
    /**
     * ray
     */
    // public reqHandle_st commMpi2_sendRays(int destRank, Ray* pRay, int numOfRays);

    // public reqHandle_st commMpi2_recvRays(int srcRank, Ray *pRay, int numOfRays)


    /**
     * send intensity to Frame Buffer
     */
    // public void commMpi2_sendIntensity2FB(IntensityClass *pIntensity, int numOfInt);

    // public void commMpi2_recvIntensity2FB(IntensityClass *pIntensity, int numOfIntensity);


    /**
     * send, recv PEStatus
     */
    // public void commMpi2_sendPEstat2Host(PEStatClass *pPEstat);
    // public void commMpi2_recvPEstat(PEStatClass *pPEstat);

    /**
     * send, recv Intensity value and vertex position
     */
    // public reqHandle_st commMpi2_sendIntVer(int destRank, intVerClass *pIntver);
    // public void commMpi2_recvIntVer(int srcRank,  intVerClass *pIntver);

    /**
     * send, recv object
     *	1 PE の場合,実際には通信しないのでこの関数で直接宛先(通常は 
     *	host)に書いてしまう．  
     */
    // public void sendIntensityStandAlone(IntensityClass *pObj, int numOfObj);
}
