//------------------------------------------------------------
// $Id: objectSet.h,v 1.1.1.1 1999/11/25 06:26:09 yamauchi Exp $
//------------------------------------------------------------
// 	object set 
//	(M\pi)^2 
//
//	object を PE で保持する際に利用するクラス。
//	引数に空間(大域的な空間ではない。このクラスの管理する大きさの
//	配列の index。このクラスは PE のトポロジなどは知らない) の 
//	index を与えるとその空間に属する物体の配列が得られる
// 	実装は空間と速度のトレードオフで変化する予定
//	まずは3次元の配列による
//	1996/7/16
//	Copyright (C) 1996--1998 YAMAUCHI Hitoshi 山内 斉
//------------------------------------------------------------
#ifndef _objectSet_h
#define _objectSet_h 1

// #include "material.h"
// #include "mpi2.h"

#include "IntVec3.h"
#include "objectArray.h"


class objectSetClass {
protected:
    IntVec3 		mTotalSpcNum; // この object セットが担当する空間の数
				      // 全空間分割数の (1 / PE 数)
    objectsArrayClass ***mpppObjArray; // object へのポインタの可変長配列:3次元

protected:
    void delElems(void);
    YorN idxOK(const IntVec3& a3dIdx) const;

public:
    objectSetClass(void) : mpppObjArray(NULL) {}
    ~objectSetClass(void);
    void init(const IntVec3& aTotalSpcNum);

    // a3dIdx は実際の空間の index。
    void setLength(const IntVec3& a3dIdx, int aLen); 
    // lidx は objectSet 内部の index にすぎない
    void setLengthWithLocalIdx(const IntVec3& localIdx, int aLen); 
    int  getLength(const IntVec3& a3dIdx) const;
    void add(const IntVec3& a3dIdx, objBaseClass* pObj);
    objectsArrayClass *get(const IntVec3& a3dIdx);

    // getStat* : get statistics この object set の情報を計算し返す
    void getStat(int 	*pNumberOfTotalSpace, // 総担当空間数
		 double *pAverage,	      // 物体数の平均
		 double *pVariance,	      // 物体数の分散
		 int    *pNoObjectSpaces,     // 物体の存在しない空間数
		 // 物体の存在しない空間を除いた物体数の平均
		 double *pNoObjSpaceAverage,  
		 // 物体の存在しない空間を除いた物体数の分散
		 double *pNoObjSpaceVariance); 
};


#endif				// #ifdef _objectSet_h


