Imported all simu data loaders. loadRamses uses UnformattedRead now

This commit is contained in:
Guilhem Lavaux 2009-01-09 19:10:30 -06:00
parent 659cb9affe
commit db5e9b5cde
5 changed files with 908 additions and 324 deletions

View File

@ -9,65 +9,13 @@
#include <string> #include <string>
#include <fstream> #include <fstream>
#include "loadRamses.hpp" #include "loadRamses.hpp"
#include "load_data.h" #include "load_data.hpp"
#include "fortran.hpp"
#include <map> #include <map>
using namespace std; using namespace std;
#if 0 CosmoTool::GadgetData *CosmoTool::loadRamses(const char *name)
#define read_buf(b, n) \
{ \
int k; \
control_size -= n; \
for (k = (n-1); k >= 0; k--) \
infile.read(&b[k],1); \
}
#else
#define read_buf(b, n) \
{ \
int k; \
control_size -= n; \
for (k = 0; k < n; k++) \
infile.read(&b[k], 1); \
}
#endif
#define read_int(i) \
{ \
char *o = (char*)&(i); \
read_buf(o, 4); \
}
#define read_real(f) \
{ \
char *o = (char*)&(f); \
read_buf(o, 4); \
}
#define read_characters(c, n) { \
int k; \
control_size -= n; \
infile.read(c, n); \
}
#define push_dummy_control(id) \
{ int control_size = 0;
#define pop_dummy_control() }
#define push_control(id) \
{ \
int control_size = 0; \
int control_size2 = 0; \
char *intbuf = (char*)&control_size; \
read_int(control_size);
#define pop_control(id) \
assert(control_size == 0); \
read_int(control_size2); \
}
GadgetData *CosmoTool::loadRamses(const char *name)
{ {
GadgetData *gd = (GadgetData *)malloc(sizeof(GadgetData)); GadgetData *gd = (GadgetData *)malloc(sizeof(GadgetData));
int id = 1; int id = 1;
@ -82,28 +30,33 @@ GadgetData *CosmoTool::loadRamses(const char *name)
cout << " ... " << fname << endl; cout << " ... " << fname << endl;
ifstream infile(fname.c_str()); try
if (!infile) {
break; UnformattedRead infile(fname);
int nCpu, ndim, nPar; int nCpu, ndim, nPar;
push_control(CPU); infile.beginCheckpoint();
read_int(nCpu); nCpu = infile.readInt32();
pop_control(CPU); infile.endCheckpoint();
push_control(DIM); infile.beginCheckpoint();
read_int(ndim); ndim = infile.readInt32();
pop_control(DIM); infile.endCheckpoint();
push_control(NPAR); infile.beginCheckpoint();
read_int(nPar); nPar = infile.readInt32();
pop_control(NPAR); infile.endCheckpoint();
cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl; cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl;
totPart += nPar; totPart += nPar;
id++; id++;
}
catch (const NoSuchFileException& e)
{
break;
}
} }
assert (totPart <= ((~(size_t)0)/sizeof(ParticleState))); assert (totPart <= ((~(size_t)0)/sizeof(ParticleState)));
@ -139,81 +92,87 @@ GadgetData *CosmoTool::loadRamses(const char *name)
cout << " ... " << id; cout << " ... " << id;
cout.flush(); cout.flush();
ifstream infile(fname.c_str()); try {
if (!infile) UnformattedRead infile(fname);
break;
int nCpu, ndim, nPar; int nCpu, ndim, nPar;
push_control(CPU);
read_int(nCpu);
pop_control(CPU);
push_control(DIM); infile.beginCheckpoint();
read_int(ndim); nCpu = infile.readInt32();
pop_control(DIM); infile.endCheckpoint();
push_control(NPAR); infile.beginCheckpoint();
read_int(nPar); ndim = infile.readInt32();
pop_control(NPAR); infile.endCheckpoint();
ParticleState *s = &gd->particles[curPos]; infile.beginCheckpoint();
nPar = infile.readInt32();
infile.endCheckpoint();
for (uint32_t i = nPar; i > 0; i--,s++) ParticleState *s = &gd->particles[curPos];
s->Mass = 1.0;
s = &gd->particles[curPos]; for (uint32_t i = nPar; i > 0; i--,s++)
push_control(POSX); s->Mass = 1.0;
for (uint32_t i = nPar; i > 0; i--)
s = &gd->particles[curPos];
infile.beginCheckpoint();
for (uint32_t i = nPar; i > 0; i--)
{
s->Pos[0] = infile.readReal32();
s->Pos[0] *= gd->header.BoxSize;
s++;
}
infile.endCheckpoint();
s = &gd->particles[curPos];
infile.beginCheckpoint();
for (uint32_t i = nPar; i > 0; i--)
{ {
read_real(s->Pos[0]); s->Pos[1] = infile.readReal32();
s->Pos[0] *= gd->header.BoxSize;
s++;
}
pop_control(POSX);
s = &gd->particles[curPos];
push_control(POSY);
for (uint32_t i = nPar; i > 0; i--)
{
read_real(s->Pos[1]);
s->Pos[1] *= gd->header.BoxSize; s->Pos[1] *= gd->header.BoxSize;
s++; s++;
} }
pop_control(POSY); infile.endCheckpoint();
s = &gd->particles[curPos]; s = &gd->particles[curPos];
push_control(POSZ); infile.beginCheckpoint();
for (uint32_t i = nPar; i > 0; i--) for (uint32_t i = nPar; i > 0; i--)
{
s->Pos[2] = infile.readReal32();
s->Pos[2] *= gd->header.BoxSize;
s++;
}
infile.endCheckpoint();
infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++)
{
gd->particles[curPos+i].Vel[0] = infile.readReal32();
}
infile.endCheckpoint();
infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++)
{
gd->particles[curPos+i].Vel[1] = infile.readReal32();
}
infile.endCheckpoint();
infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++)
{
gd->particles[curPos+i].Vel[2] = infile.readReal32();
}
infile.endCheckpoint();
curPos += nPar;
}
catch (const NoSuchFileException& e)
{ {
read_real(s->Pos[2]); break;
s->Pos[2] *= gd->header.BoxSize;
s++;
} }
pop_control(POSZ);
push_control(VELX);
for (uint32_t i = 0; i < nPar; i++)
{
read_real(gd->particles[curPos+i].Vel[0]);
}
pop_control(VELX);
push_control(VELY);
for (uint32_t i = 0; i < nPar; i++)
{
read_real(gd->particles[curPos+i].Vel[1]);
}
pop_control(VELY);
push_control(VELZ);
for (uint32_t i = 0; i < nPar; i++)
{
read_real(gd->particles[curPos+i].Vel[2]);
}
pop_control(VELZ);
curPos += nPar;
id++; id++;
} }
@ -286,7 +245,7 @@ int readInfoFile(const char *basename, int outputId, InfoData& info)
return 1; return 1;
} }
PurePositionData *CosmoTool::loadRamsesPosition(const char *basename, int outputId) CosmoTool::PurePositionData *CosmoTool::loadRamsesPosition(const char *basename, int outputId)
{ {
PurePositionData *gd = (PurePositionData *)malloc(sizeof(PurePositionData)); PurePositionData *gd = (PurePositionData *)malloc(sizeof(PurePositionData));
int id = 1; int id = 1;
@ -311,28 +270,35 @@ PurePositionData *CosmoTool::loadRamsesPosition(const char *basename, int output
cout << " ... " << fname << endl; cout << " ... " << fname << endl;
ifstream infile(fname.c_str());
if (!infile)
break;
int ndim, nPar; try
{
UnformattedRead infile(fname);
push_control(CPU); int nCpu, ndim, nPar;
read_int(nCpu);
pop_control(CPU);
push_control(DIM); infile.beginCheckpoint();
read_int(ndim); nCpu = infile.readInt32();
pop_control(DIM); infile.endCheckpoint();
push_control(NPAR); infile.beginCheckpoint();
read_int(nPar); ndim = infile.readInt32();
pop_control(NPAR); infile.endCheckpoint();
cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl; infile.beginCheckpoint();
nPar = infile.readInt32();
infile.endCheckpoint();
cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl;
totPart += nPar;
id++;
}
catch (const NoSuchFileException& e)
{
break;
}
totPart += nPar;
id++;
} }
assert (totPart <= ((~(size_t)0)/sizeof(FCoordinates))); assert (totPart <= ((~(size_t)0)/sizeof(FCoordinates)));
@ -359,87 +325,75 @@ PurePositionData *CosmoTool::loadRamsesPosition(const char *basename, int output
cout << " ... " << id; cout << " ... " << id;
cout.flush(); cout.flush();
ifstream infile(fname.c_str()); try
if (!infile)
break;
int nCpu, ndim, nPar;
push_control(CPU);
read_int(nCpu);
pop_control(CPU);
push_control(DIM);
read_int(ndim);
pop_control(DIM);
push_control(NPAR);
read_int(nPar);
pop_control(NPAR);
FCoordinates *s = new FCoordinates[nPar];
push_control(POSX);
for (uint32_t i = 0; i < nPar; i++)
{ {
read_real(s[i][0]); UnformattedRead infile(fname);
s[i][0] *= gd->BoxSize;
}
pop_control(POSX);
push_control(POSY); int nCpu, ndim, nPar;
for (uint32_t i = 0; i < nPar; i++)
{
read_real(s[i][1]);
s[i][1] *= gd->BoxSize;
}
pop_control(POSY);
push_control(POSZ); infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++) nCpu = infile.readInt32();
{ infile.endCheckpoint();
read_real(s[i][2]);
s[i][2] *= gd->BoxSize;
}
pop_control(POSZ);
// SKIP VELOCITIES infile.beginCheckpoint();
for (int k = 0; k < 3; k++) { ndim = infile.readInt32();
push_control(V); infile.endCheckpoint();
for (uint32_t i = nPar; i > 0; i--)
{ infile.beginCheckpoint();
float dummyF; nPar = infile.readInt32();
read_real(dummyF); infile.endCheckpoint();
FCoordinates *s = new FCoordinates[nPar];
for (int k = 0; k < 3; k++)
{
infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++)
{
s[i][k] = infile.readReal32();
s[i][k] *= gd->BoxSize;
}
infile.endCheckpoint();
}
// SKIP VELOCITIES
for (int k = 0; k < 3; k++) {
infile.beginCheckpoint();
for (uint32_t i = nPar; i > 0; i--)
{
infile.readReal32();
}
infile.endCheckpoint();
} }
pop_control(V);
}
float minMass = INFINITY; float minMass = INFINITY;
push_control(MASS); infile.beginCheckpoint();
for (uint32_t i = nPar; i > 0; i--) for (uint32_t i = nPar; i > 0; i--)
{
float dummyF = infile.readReal32();
if (dummyF < minMass) minMass = dummyF;
}
infile.endCheckpoint();
infile.beginCheckpoint();
for (uint32_t i = 0; i < nPar; i++)
{
int id = infile.readInt32();
id--;
assert(id >= 0);
assert(id < totPart);
memcpy(&gd->pos[id], &s[i], sizeof(FCoordinates));
}
infile.endCheckpoint();
delete[] s;
curPos += nPar;
} catch (const NoSuchFileException& e)
{ {
float dummyF; break;
read_real(dummyF);
if (dummyF < minMass) minMass = dummyF;
} }
pop_control(MASS);
push_control(ID);
for (uint32_t i = 0; i < nPar; i++)
{
int id;
read_int(id);
id--;
assert(id >= 0);
assert(id < totPart);
memcpy(&gd->pos[id], &s[i], sizeof(FCoordinates));
}
pop_control(ID);
delete[] s;
curPos += nPar;
id++; id++;
} }

View File

@ -1,7 +1,7 @@
#ifndef _LOAD_RAMSES_HPP #ifndef _LOAD_RAMSES_HPP
#define _LOAD_RAMSES_HPP #define _LOAD_RAMSES_HPP
#include "load_data.h" #include "load_data.hpp"
namespace CosmoTool { namespace CosmoTool {

635
src/load_data.cpp Normal file
View File

@ -0,0 +1,635 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "load_data.hpp"
using namespace CosmoTool;
//#define LARGE_CONTROL
#define LITTLE_ENDIAN
#define NEW(t,n) ((t *)malloc(sizeof(t)*n))
#define SKIP(f) fread(&dummy,sizeof(dummy),1,f);
#define WRITE_DUM(f) fwrite(&dummy, sizeof(dummy),1,f);
static int dummy;
void CosmoTool::writeGadget(GadgetData *data, const char *fname)
{
FILE *f;
int k, n, p;
f = fopen(fname, "w");
if (f == NULL) {
fprintf(stderr, "Cannot write gadget to file %s\n", fname);
return;
}
dummy = 256;
WRITE_DUM(f);
fwrite(&data->header, sizeof(data->header), 1, f);
WRITE_DUM(f);
dummy = sizeof(float)*3*data->NumPart;
WRITE_DUM(f);
for(k=0,p=0;k<5;k++) {
for(n=0;n<data->header.npart[k];n++) {
fwrite(&data->particles[p].Pos[0], sizeof(float), 3, f);
p++;
}
}
WRITE_DUM(f);
dummy = sizeof(float)*3*data->NumPart;
WRITE_DUM(f);
for(k=0,p=0;k<6;k++) {
for(n=0;n<data->header.npart[k];n++) {
fwrite(&data->particles[p].Vel[0], sizeof(float), 3, f);
p++;
}
}
WRITE_DUM(f);
dummy = sizeof(int)*data->NumPart;
WRITE_DUM(f);
for(k=0,p=0;k<6;k++)
{
for(n=0;n<data->header.npart[k];n++)
{
fwrite(&data->particles[p].Id, sizeof(int), 1, f);
p++;
}
}
WRITE_DUM(f);
if(data->ntot_withmasses>0) {
dummy = sizeof(float)*data->NumPart;
WRITE_DUM(f);
}
for(k=0, p=0; k<6; k++)
{
for(n=0;n<data->header.npart[k];n++)
{
if(data->header.mass[k]==0)
fwrite(&data->particles[p].Mass, sizeof(float), 1, f);
p++;
}
}
if(data->ntot_withmasses>0)
WRITE_DUM(f);
if(data->header.npart[0]>0) {
dummy = data->header.npart[0]*sizeof(float);
WRITE_DUM(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++) {
fwrite(&data->particles[p].U, sizeof(float), 1, f);
}
WRITE_DUM(f);
WRITE_DUM(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++) {
fwrite(&data->particles[p].Rho, sizeof(float), 1, f);
}
WRITE_DUM(f);
if(data->header.flag_cooling) {
WRITE_DUM(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++) {
fwrite(&data->particles[p].Ne, sizeof(float), 1, f);
}
WRITE_DUM(f);
}
}
fclose(f);
}
GadgetData *CosmoTool::loadGadget(const char *fname)
{
FILE *f;
GadgetData *data;
int p, k, n;
f = fopen(fname, "r");
if (f == NULL)
return NULL;
data = NEW(GadgetData, 1);
SKIP(f);
fread(&data->header, sizeof(data->header), 1, f);
SKIP(f);
for(k=0, data->ntot_withmasses=0; k<5; k++) {
if(data->header.mass[k]==0)
data->ntot_withmasses+= data->header.npart[k];
}
for(k=0, data->NumPart=0; k<5; k++)
data->NumPart+= data->header.npart[k];
data->particles = NEW(ParticleState, data->NumPart);
SKIP(f);
for(k=0,p=0;k<5;k++) {
for(n=0;n<data->header.npart[k];n++) {
fread(&data->particles[p].Pos[0], sizeof(float), 3, f);
p++;
}
}
SKIP(f);
SKIP(f);
for(k=0,p=0;k<6;k++) {
for(n=0;n<data->header.npart[k];n++) {
fread(&data->particles[p].Vel[0], sizeof(float), 3, f);
p++;
}
}
SKIP(f);
SKIP(f);
for(k=0,p=0;k<6;k++)
{
for(n=0;n<data->header.npart[k];n++)
{
fread(&data->particles[p].Id, sizeof(int), 1, f);
p++;
}
}
SKIP(f);
if(data->ntot_withmasses>0)
SKIP(f);
for(k=0, p=0; k<6; k++)
{
for(n=0;n<data->header.npart[k];n++)
{
data->particles[p].Type=k;
if(data->header.mass[k]==0)
fread(&data->particles[p].Mass, sizeof(float), 1, f);
else
data->particles[p].Mass= data->header.mass[k];
p++;
}
}
if(data->ntot_withmasses>0)
SKIP(f);
if(data->header.npart[0]>0)
{
SKIP(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++) {
fread(&data->particles[p].U, sizeof(float), 1, f);
}
SKIP(f);
SKIP(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++) {
fread(&data->particles[p].Rho, sizeof(float), 1, f);
}
SKIP(f);
if(data->header.flag_cooling)
{
SKIP(f);
for(n=0, p=0; n<data->header.npart[0];p++,n++)
{
fread(&data->particles[p].Ne, sizeof(float), 1, f);
}
SKIP(f);
}
else
for(n=0, p=0; n<data->header.npart[0];p++,n++)
{
data->particles[p].Ne= 1.0;
}
}
fclose(f);
return data;
}
void CosmoTool::freeGadget(GadgetData *data)
{
free(data->particles);
free(data);
}
void CosmoTool::writePersoSet(ParticleSet *set, const char *fname)
{
FILE *f;
int i;
f = fopen(fname, "w");
if (f == NULL) {
perror("writePersoSet");
return;
}
fwrite(&set->header, sizeof(set->header), 1, f);
fwrite(set->Npart, sizeof(set->Npart[0]), set->header.Ntypes, f);
for (i=0;i<set->header.Ntypes;i++)
fwrite(set->particles[i], sizeof(ParticleState), set->Npart[i], f);
fclose(f);
}
ParticleSet *CosmoTool::loadPersoSet(const char *fname)
{
ParticleSet *set;
FILE *f;
int i;
f = fopen(fname, "r");
if (f == NULL) {
perror("loadPersoSet");
return NULL;
}
set = NEW(ParticleSet, 1);
fread(&set->header, sizeof(set->header), 1, f);
set->Npart = NEW(int, set->header.Ntypes);
fread(set->Npart, sizeof(set->Npart[0]), set->header.Ntypes, f);;
set->particles = NEW(ParticleState *, set->header.Ntypes);
for (i=0;i<set->header.Ntypes;i++) {
set->particles[i] = NEW(ParticleState, set->Npart[i]);
fread(set->particles[i], sizeof(ParticleState), set->Npart[i], f);
}
fclose(f);
return set;
}
void CosmoTool::freePersoSet(ParticleSet *set)
{
int i;
for (i=0;i<set->header.Ntypes;i++) {
free(set->particles[i]);
}
if (set->Npart != NULL) {
free(set->particles);
free(set->Npart);
}
}
#ifdef WANT_MAIN
int main(int argc, char **argv) {
GadgetData *data;
FILE *plot;
int i;
double bl;
int N;
double rms;
if (argc < 3) {
fprintf(stderr, "Usage: %s [GADGET DATA FILE] [BOXSIZE] [N PARTIC]\n", argv[0]);
return -1;
}
plot = fopen("plot", "w");
bl = atof(argv[2]);
data = loadGadget(argv[1]);
printf("Redshift: %lg\n", data->header.redshift);
rms = 0;
N = atoi(argv[3]);
for (i=0;i<data->NumPart;i++) {
if (i == data->header.npart[0])
fprintf(plot,"\n\n");
fprintf(plot, "%f %f %f\n", data->particles[i].Pos[0], data->particles[i].Pos[1], data->particles[i].Pos[2]);
/* Compute the RMS */
{
/* First find the nearest grid node. */
int k;
int x;
double dx;
for (k=0;k<3;k++) {
x = data->particles[i].Pos[k] / bl * N;
dx = data->particles[i].Pos[k]-x*bl/N;
rms += dx*dx;
}
}
}
printf("delta rms = %e\n", sqrt(rms/data->NumPart));
freeGadget(data);
fclose(plot);
return 0;
}
#endif
#define LEN0 200.0
GadgetData *CosmoTool::loadSimulationData(const char *fname)
{
GadgetData *gd = NEW(GadgetData, 1);
FILE *f;
int lineNo;
char line[1024];
int i;
int j;
gd->header.BoxSize = LEN0;
f = fopen(fname, "r");
lineNo = 0;
while (!feof(f))
{
fgets(line, sizeof(line), f);
lineNo++;
}
lineNo--;
rewind(f);
gd->NumPart = lineNo;
gd->particles = NEW(ParticleState, lineNo);
i = 0;
while (!feof(f))
{
fgets(line, sizeof(line), f);
int r = sscanf(line, "%*d %*d %f %f %f %f %f %f %f %f %f %*f %*f %*f %f %f %f",
&gd->particles[i].Pos[0], &gd->particles[i].Pos[1], &gd->particles[i].Pos[2],
&gd->particles[i].Init[0], &gd->particles[i].Init[1], &gd->particles[i].Init[2],
&gd->particles[i].Vel[0], &gd->particles[i].Vel[1], &gd->particles[i].Vel[2],
&gd->particles[i].VelInit[0], &gd->particles[i].VelInit[1], &gd->particles[i].VelInit[2]
);
if (r != 12)
{
printf("line %d: '%s'\n", i, line);
printf("returned r=%d\n", r);
abort();
}
assert(r == 12);
for (j = 0; j < 3; j++)
{
gd->particles[i].Vel[j] *= 100.0 * LEN0 / (0.9641010);
gd->particles[i].VelInit[j] *= 100.0 * 1/71. * LEN0 / (0.9641010);
gd->particles[i].Pos[j] *= LEN0;
gd->particles[i].Init[j] *= LEN0;
}
gd->particles[i].Type = 0;
gd->particles[i].Mass = 1.0;
gd->particles[i].Id = i;
i++;
}
fclose(f);
return gd;
}
#ifndef LITTLE_ENDIAN
#define read_buf(b, n) \
{ \
int k; \
control_size -= n; \
for (k = (n-1); k >= 0; k--) \
fread(&b[k], 1, 1, infile); \
}
#else
#define read_buf(b, n) \
{ \
int k; \
control_size -= n; \
for (k = 0; k < n; k++) \
fread(&b[k], 1, 1, infile); \
}
#endif
#define read_int(i) \
{ \
char *o = (char*)&(i); \
read_buf(o, 4); \
}
#define read_real(f) \
{ \
char *o = (char*)&(f); \
read_buf(o, 4); \
}
#define read_characters(c, n) { \
int k; \
control_size -= n; \
fread(c, 1, n, outfile); \
}
#define push_dummy_control(id) \
{ int control_size = 0;
#define pop_dummy_control() }
#if defined(LARGE_CONTROL) && defined(LITTLE_ENDIAN)
#define push_control(id) \
{ \
int control_size = 0; \
int control_size2 = 0; \
char *intbuf = (char*)&control_size; \
fread(&control_size, 8, 1, infile);
#define pop_control(id) \
fread(&control_size2, 8, 1, infile); \
assert(control_size == 0); \
}
#elif !defined(LARGE_CONTROL) && defined(LITTLE_ENDIAN)
#define push_control(id) \
{ \
int control_size = 0; \
int control_size2 = 0; \
char *intbuf = (char*)&control_size; \
fread(&control_size, 4, 1, infile);
#define pop_control(id) \
fread(&control_size2, 4, 1, infile); \
assert(control_size == 0); \
}
#elif defined(LARGE_CONTROL) && !defined(LITTLE_ENDIAN)
#define push_control(id) \
{ \
int control_size = 0; \
int control_size2 = 0; \
char *intbuf = (char*)&control_size; \
fread(&control_size, 8, 1, infile);
#define pop_control(id) \
fread(&control_size2, 8, 1, infile); \
assert(control_size == 0); \
}
#elif !defined(LARGE_CONTROL) && !defined(LITTLE_ENDIAN)
#define push_control(id) \
{ \
int control_size = 0; \
int control_size2 = 0; \
char *intbuf = (char*)&control_size; \
fread(&control_size, 4, 1, infile);
#define pop_control(id) \
fread(&control_size2, 4, 1, infile); \
assert(control_size == 0); \
}
#endif
GadgetData *CosmoTool::loadHydra(const char *fname)
{
GadgetData *gd = NEW(GadgetData, 1);
FILE *f;
int version0, version1, version2;
int irun, nobj, ngas, ndark, intl, nlmx, perr;
float dtnorm, sft0, sftmin, sftmax;
int pad3;
float h100, box100, zmet0;
int lcool;
float rmnorm0;
int pad4, pad5;
float tstart, omega0, xlambda0, h0t0, rcen, rmax2;
float rmbary;
int j;
float atime;
f = fopen(fname, "r");
#define infile f
push_control(0);
read_int(version0);
read_int(version1);
read_int(version2);
pop_control(0);
if (version0 != 4)
{
fclose(f);
return NULL;
}
push_control(1);
for (j = 0; j < 200; j++)
{
int mydummy;
read_int(mydummy);
}
for (j = 0; j < 5; j++)
{
float mydummy;
read_real(mydummy);
}
read_real(atime);
gd->header.time = atime;
gd->header.redshift = 1/atime - 1;
for (j = 6; j < 100; j++)
{
int mydummy;
read_int(mydummy);
}
read_int(irun);
read_int(nobj);
read_int(ngas);
read_int(ndark);
read_int(intl);
read_int(nlmx);
read_int(perr);
read_real(dtnorm);
read_real(sft0);
read_real(sftmin);
read_real(sftmax);
read_int(pad3);
read_real(h100);
read_real(box100);
read_real(zmet0);
read_int(lcool);
read_real(rmbary);
read_real(rmnorm0);
read_int(pad4);
read_int(pad5);
read_real(tstart);
read_real(omega0);
read_real(xlambda0);
read_real(h0t0);
read_real(rcen);
read_real(rmax2);
for (j = 0; j < 74; j++)
{
int mydummy;
read_int(mydummy);
}
pop_control(1);
gd->header.npart[1] = ndark;
gd->header.npart[0] = ngas;
gd->header.num_files = 1;
gd->header.flag_cooling = lcool;
gd->header.BoxSize = box100 * 1000;
gd->header.HubbleParam = h100;
gd->header.Omega0 = omega0;
gd->header.OmegaLambda = xlambda0;
push_control(2);
for (j = 0; j < nobj; j++)
{
int mydummy;
read_int(mydummy);
}
pop_control(2);
gd->NumPart = nobj;
gd->ntot_withmasses = nobj;
gd->particles = NEW(ParticleState, nobj);
push_control(3);
for (j = 0; j < nobj; j++)
{
float rm;
gd->particles[j].Id = j;
read_real(gd->particles[j].Mass);
}
pop_control(3);
push_control(4);
for (j = 0; j < nobj; j++)
{
int k;
for (k = 0; k < 3; k++)
{
read_real(gd->particles[j].Pos[k]);
gd->particles[j].Pos[k] *= gd->header.BoxSize;
}
}
pop_control(4);
push_control(5);
for (j = 0; j < nobj; j++)
{
int k;
for (k = 0; k < 3; k++)
{
read_real(gd->particles[j].Vel[k]);
gd->particles[j].Vel[k] *= 100.0 * box100 / h0t0 * atime;
}
}
pop_control(5);
fclose(f);
#undef infile
return gd;
}

View File

@ -1,84 +0,0 @@
#ifndef _LOAD_GADGET_DATA_H
#define _LOAD_GADGET_DATA_H
typedef struct io_header_1
{
int npart[6];
double mass[6];
double time;
double redshift;
int flag_sfr;
int flag_feedback;
int npartTotal[6];
int flag_cooling;
int num_files;
double BoxSize;
double Omega0;
double OmegaLambda;
double HubbleParam;
char fill[256- 6*4- 6*8- 2*8- 2*4- 6*4- 2*4 - 4*8]; /* fills to 256 Bytes */
} GadgetHeader;
typedef struct particle_data
{
float Pos[3];
float Init[3];
float Vel[3];
float VelInit[3];
float Mass;
int Type;
float Rho, U, Temp, Ne;
int Id;
} ParticleState;
typedef struct {
GadgetHeader header;
ParticleState *particles;
int NumPart;
int ntot_withmasses;
} GadgetData;
typedef struct {
int Ntypes;
float BoxSize;
float RedShift;
char header[256 - 4 - 2*4];
} ParticleSetHeader;
typedef struct {
ParticleSetHeader header;
// Particle description
int *Npart;
ParticleState **particles;
} ParticleSet;
typedef float FCoordinates[3];
typedef struct {
unsigned int NumPart;
double BoxSize;
FCoordinates *pos;
} PurePositionData;
#ifdef __cplusplus
extern "C" {
#endif
void writeGadget(GadgetData *data, const char *fname);
GadgetData *loadGadget(const char *fname);
void freeGadget(GadgetData *data);
GadgetData *loadSimulationData(const char *fname);
GadgetData *loadHydra(const char *fname);
void writePersoSet(ParticleSet *set, const char *fname);
ParticleSet *loadPersoSet(const char *fname);
void freePersoSet(ParticleSet *set);
#ifdef __cplusplus
}
#endif
#endif

79
src/load_data.hpp Normal file
View File

@ -0,0 +1,79 @@
#ifndef _LOAD_GADGET_DATA_HPP
#define _LOAD_GADGET_DATA_HPP
#include "config.hpp"
namespace CosmoTool {
struct GadgetHeader
{
int npart[6];
double mass[6];
double time;
double redshift;
int flag_sfr;
int flag_feedback;
int npartTotal[6];
int flag_cooling;
int num_files;
double BoxSize;
double Omega0;
double OmegaLambda;
double HubbleParam;
char fill[256- 6*4- 6*8- 2*8- 2*4- 6*4- 2*4 - 4*8]; /* fills to 256 Bytes */
};
struct ParticleState
{
float Pos[3];
float Init[3];
float Vel[3];
float VelInit[3];
float Mass;
int Type;
float Rho, U, Temp, Ne;
int Id;
};
struct GadgetData {
GadgetHeader header;
ParticleState *particles;
int NumPart;
int ntot_withmasses;
};
struct ParticleSetHeader {
int Ntypes;
float BoxSize;
float RedShift;
char header[256 - 4 - 2*4];
};
struct ParticleSet {
ParticleSetHeader header;
// Particle description
int *Npart;
ParticleState **particles;
};
struct PurePositionData {
unsigned int NumPart;
double BoxSize;
FCoordinates *pos;
};
void writeGadget(GadgetData *data, const char *fname);
GadgetData *loadGadget(const char *fname);
void freeGadget(GadgetData *data);
GadgetData *loadSimulationData(const char *fname);
GadgetData *loadHydra(const char *fname);
void writePersoSet(ParticleSet *set, const char *fname);
ParticleSet *loadPersoSet(const char *fname);
void freePersoSet(ParticleSet *set);
};
#endif