//------------------------------------------------------------
// $Id: constants.h,v 1.2 2000/05/15 14:20:43 yamauchi Exp $
//------------------------------------------------------------
//	constants.h
//	constant values
//	1996/3/17 
//	(C) Copyright Hitoshi Yamauchi
//------------------------------------------------------------
#ifndef _constants_h
#define _constants_h 1

#include <math.h>
#include <limits.h>

#ifdef FLT_MAX
const double PlusInfty  	= FLT_MAX;
// use FLT_MAX in limits.h but not in SunOS 4.x include file
#else
const double PlusInfty  	= 3.4E+38;
#endif

#include "IntVec3.h"

// PE の 特殊な ID 
static const IntVec3 HostID(     -1, -1, -1);
static const IntVec3 IllegalPEID(-2, -2, -2);

// 出力の際のヘッダ
static const char * const NORMALHEAD  = "//";
static const char * const VERBOSEHEAD = "##";
static const char * const DEBUGHEAD   = "<<";
static const char * const OUTDATAHEAD = ";;";
static const char * const TRACE_STDOUT_HEAD = "TR: ";

// material の名前の最大長さ
const unsigned int MAX_MATERIAL_NAME_LEN = 64;

// image を save するための tmp file name のテンプレート
#define pTEMP_SAVE_IMAGE_FILENAME "tempMpi2imageXXXXXX"

// material name の初期値(この名前は material の名前として使えない)
#define NULLMaterialName "This is NULL material, can not use."

// 輝度の範囲 0 からいくつまでか
const double MAX_INTENSITY	= 1.0;

// 誤差の範囲とみなす値
const double D_ERROR_RES	= 1e-5;

// ラジオシティエネルギの最小放射値
const double	DEFAULT_MIN_RAD_ENERGY		= 0.01; 

// ヘミキューブの上面の一辺の解像度
const int	DEFAULT_HEMRES			= 10; 

// レイの最大反射回数
const int    	DEFAULT_MAX_REFLECTION_RAY_NUM	= 3; 

// レイの反射減衰率の最小値^2
const double 	DEFAULT_MIN_REFLECTION_COEFF_NORM2	= 0.00001; 

// 分散レイトレーシング法のレイ数の初期値(初期レイのみ)
const int    	DEFAULT_DIST_RAY_NUM		= 1; 

// レイトレーシング法における初期レイ発生数係数 (通信量の何倍かの値)
const int 	GEN_FRAYS_FACTOR_BY_COMMUN	= 2;

// 角錐の解像度
const int 	DEFAULT_FRUSTUM_RES		= 2;

// 受信バッファ数
const int	MAX_RECV_BUFFNUM		= 8;

// 通信遅延を考慮し、retry する。その回数とリトライ間隔(μ秒)
// SP2 の HPS の割り込みが 400 msec らしい = 400*1e3 = 4e5 micro sec.
const int 	MAX_RETRY_NUM_WAIT_BARRIER	= 36;
const int 	MAX_RETRY_NUM_CALC		= 16;
#ifdef USE_MPI
const int 	RETRY_WAIT_TIME			= 100000;
#else
const int 	RETRY_WAIT_TIME			= 100;
#endif

// 監視の休止時間(通信遅延を考慮した値:いいかげんな値)(μ秒)
// SP2 の High Performance Switch の割り込みが 400 msec らしいのでそれ
// を考慮した値 しかしこれはエラー回復のための間隔で実際はもっと小さい
//const int 	POLLING_SLEEP_TIME		= 200000; 
const int 	POLLING_SLEEP_TIME		= 0; 

// 輝度情報を最大いくつまとめて送信するか FIXHERE
const int 	MAX_INTVER_NUM_AT_ONCE		= 64;

// 送信閾値サイズの何倍のサイズのバッファを用意するか
const int BUFSIZE_FACTOR_BY_THREASH = 3;

// time display precision for gettimeofday
const int TIMEOFDAYPREC = 16;

//------------------------------------------------------------
// compiling option
//------------------------------------------------------------
// 実行時の内部情報の出力等を抑制する(コードも)
// #define REDUCE_VERBOSE_INFO


#endif				// #ifndef _constants_h
