2010-04-27 13:41:41 +02:00
|
|
|
#ifndef __COSMOTOOLBOX_HPP
|
|
|
|
#define __COSMOTOOLBOX_HPP
|
|
|
|
|
2012-11-20 22:58:10 +01:00
|
|
|
#include <map>
|
|
|
|
#include <string>
|
2010-04-27 13:41:41 +02:00
|
|
|
|
|
|
|
namespace CosmoTool
|
|
|
|
{
|
|
|
|
static const int NEED_GADGET_ID = 1;
|
|
|
|
static const int NEED_POSITION = 2;
|
|
|
|
static const int NEED_VELOCITY = 4;
|
2010-09-12 21:09:39 +02:00
|
|
|
static const int NEED_TYPE = 8;
|
2010-04-27 13:41:41 +02:00
|
|
|
|
2012-11-20 22:58:10 +01:00
|
|
|
struct SimuParticle
|
|
|
|
{
|
|
|
|
float Pos[3];
|
|
|
|
float Vel[3];
|
|
|
|
int type;
|
|
|
|
int id;
|
|
|
|
|
|
|
|
bool flag_vel, flag_type, flag_id;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef bool (*SimuFilter)(const SimuParticle& p);
|
|
|
|
|
2010-04-27 13:41:41 +02:00
|
|
|
class SimuData
|
|
|
|
{
|
|
|
|
public:
|
2012-11-20 22:58:10 +01:00
|
|
|
typedef void (*FreeFunction)(void *);
|
|
|
|
typedef std::map<std::string, std::pair<void *, FreeFunction> > AttributeMap;
|
|
|
|
|
2010-04-27 13:41:41 +02:00
|
|
|
float BoxSize;
|
|
|
|
float time;
|
2011-02-22 20:36:17 +01:00
|
|
|
float Hubble;
|
|
|
|
|
|
|
|
float Omega_M;
|
|
|
|
float Omega_Lambda;
|
2010-04-27 13:41:41 +02:00
|
|
|
|
|
|
|
long NumPart;
|
2010-04-27 14:08:46 +02:00
|
|
|
long TotalNumPart;
|
2010-04-27 13:41:41 +02:00
|
|
|
int *Id;
|
|
|
|
float *Pos[3];
|
|
|
|
float *Vel[3];
|
2010-09-12 21:09:39 +02:00
|
|
|
int *type;
|
2012-11-20 22:58:10 +01:00
|
|
|
|
|
|
|
AttributeMap attributes;
|
|
|
|
|
2010-04-27 13:41:41 +02:00
|
|
|
public:
|
2010-09-12 21:09:39 +02:00
|
|
|
SimuData() : Id(0),NumPart(0),type(0) { Pos[0]=Pos[1]=Pos[2]=0; Vel[0]=Vel[1]=Vel[2]=0; }
|
2010-04-27 13:41:41 +02:00
|
|
|
~SimuData()
|
|
|
|
{
|
|
|
|
for (int j = 0; j < 3; j++)
|
|
|
|
{
|
|
|
|
if (Pos[j])
|
|
|
|
delete[] Pos[j];
|
|
|
|
if (Vel[j])
|
|
|
|
delete[] Vel[j];
|
|
|
|
}
|
2010-09-12 21:09:39 +02:00
|
|
|
if (type)
|
|
|
|
delete[] type;
|
2010-04-27 13:41:41 +02:00
|
|
|
if (Id)
|
|
|
|
delete[] Id;
|
2012-11-20 22:58:10 +01:00
|
|
|
|
|
|
|
for (AttributeMap::iterator i = attributes.begin();
|
|
|
|
i != attributes.end();
|
|
|
|
++i)
|
|
|
|
{
|
|
|
|
if (i->second.second)
|
|
|
|
i->second.second(i->second.first);
|
|
|
|
}
|
2010-04-27 13:41:41 +02:00
|
|
|
}
|
2012-11-20 22:58:10 +01:00
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
T *as(const std::string& n)
|
|
|
|
{
|
|
|
|
AttributeMap::iterator i = attributes.find(n);
|
|
|
|
if (i == attributes.end())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return reinterpret_cast<T *>(i->first);
|
|
|
|
}
|
|
|
|
|
|
|
|
void new_attribute(const std::string& n, void *p, FreeFunction free_func)
|
|
|
|
{
|
|
|
|
AttributeMap::iterator i = attributes.find(n);
|
|
|
|
if (i != attributes.end())
|
|
|
|
{
|
|
|
|
if (i->second.second)
|
|
|
|
i->second.second(i->second.first);
|
|
|
|
}
|
|
|
|
attributes[n] = std::make_pair(p, free_func);
|
|
|
|
}
|
|
|
|
|
2010-04-27 13:41:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|