Initial commit
This commit is contained in:
commit
1b8ff660c2
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*~
|
||||
*.o
|
||||
*.prog
|
97
config.hpp
Normal file
97
config.hpp
Normal file
@ -0,0 +1,97 @@
|
||||
#ifndef __MAK_CONFIG_HPP
|
||||
#define __MAK_CONFIG_HPP
|
||||
|
||||
#include <stdint.h>
|
||||
#include <exception>
|
||||
#include <cstring>
|
||||
|
||||
namespace CosmoTool
|
||||
{
|
||||
|
||||
#define NUMDIMS 3
|
||||
#define NUMCUBES 8
|
||||
|
||||
/**
|
||||
* Base type to specity at what precision we
|
||||
* must achieve computations.
|
||||
*/
|
||||
typedef double ComputePrecision;
|
||||
/**
|
||||
* Coordinate type (should be a 3-array).
|
||||
*/
|
||||
typedef double Coordinates[NUMDIMS];
|
||||
|
||||
/**
|
||||
* This function is used whenever one needs a general
|
||||
* conversion between mass and luminosity (or the opposite).
|
||||
* It should take a "mass" (or luminosity) in input, a unit is
|
||||
* given to convert this mass into solar units. The output should
|
||||
* be the "luminosity" (or mass), in solar units.
|
||||
*/
|
||||
typedef double (*BiasFunction)(double mass, double unit);
|
||||
|
||||
/**
|
||||
* Function to copy the coordinates "a" into "b".
|
||||
*/
|
||||
inline void copyCoordinates(const Coordinates& a, Coordinates& b)
|
||||
{
|
||||
memcpy(b, a, sizeof(a));
|
||||
}
|
||||
|
||||
/**
|
||||
* Base exception class for all exceptions handled by
|
||||
* this library.
|
||||
*/
|
||||
class Exception : public std::exception
|
||||
{
|
||||
public:
|
||||
Exception(const char *mess = 0)
|
||||
: msg(mess) {}
|
||||
|
||||
const char *getMessage() const { return msg; };
|
||||
virtual const char *what() const throw () { return msg; };
|
||||
|
||||
private:
|
||||
const char *msg;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exception raised when an invalid argument has been
|
||||
* passed to a function of the library.
|
||||
*/
|
||||
class InvalidArgumentException : public Exception
|
||||
{
|
||||
public:
|
||||
InvalidArgumentException(const char *mess = 0)
|
||||
: Exception(mess) {}
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class InvalidRangeException : public Exception
|
||||
{
|
||||
public:
|
||||
InvalidRangeException(const char *mess = 0)
|
||||
: Exception(mess) {}
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class NoSuchFileException : public Exception
|
||||
{
|
||||
public:
|
||||
NoSuchFileException(const char *mess = 0)
|
||||
: Exception(mess) {}
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class InvalidFileFormatException : public Exception
|
||||
{
|
||||
public:
|
||||
InvalidFileFormatException(const char *mess = 0)
|
||||
: Exception(mess) {}
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
390
loadRamses.cpp
Normal file
390
loadRamses.cpp
Normal file
@ -0,0 +1,390 @@
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include "loadRamses.hpp"
|
||||
#include "load_data.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#if 0
|
||||
#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));
|
||||
int id = 1;
|
||||
uint32_t totPart = 0;
|
||||
|
||||
cout << "Detecting number of files and particles..." << endl;
|
||||
while (1)
|
||||
{
|
||||
ostringstream ss_fname;
|
||||
ss_fname << name << setfill('0') << setw(5) << id;
|
||||
string fname = ss_fname.str();
|
||||
|
||||
cout << " ... " << fname << endl;
|
||||
|
||||
ifstream infile(fname.c_str());
|
||||
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);
|
||||
|
||||
cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl;
|
||||
|
||||
totPart += nPar;
|
||||
id++;
|
||||
}
|
||||
|
||||
assert (totPart <= ((~(size_t)0)/sizeof(ParticleState)));
|
||||
size_t memSize = sizeof(ParticleState)*(size_t)totPart;
|
||||
cout << " Needing " << memSize / 1024 << " kBytes" << endl;
|
||||
gd->particles = (ParticleState *)malloc(memSize);
|
||||
assert(gd->particles != 0);
|
||||
gd->NumPart = totPart;
|
||||
gd->ntot_withmasses = totPart;
|
||||
gd->header.npart[0] = totPart;
|
||||
for (int k = 1; k < 6; k++)
|
||||
{
|
||||
gd->header.npart[k] = 0;
|
||||
gd->header.mass[k] = 0;
|
||||
}
|
||||
gd->header.num_files = id;
|
||||
gd->header.BoxSize = 200.0 * 1000; // kPc
|
||||
gd->header.Omega0 = 0.30; // ????
|
||||
gd->header.OmegaLambda = 0.70; // ????
|
||||
gd->header.HubbleParam = 0.70; // ????
|
||||
|
||||
cout << " Total number part=" << totPart << endl
|
||||
<< "Loading particles ..." << endl;
|
||||
|
||||
uint32_t curPos = 0;
|
||||
id = 1;
|
||||
while (1)
|
||||
{
|
||||
ostringstream ss_fname;
|
||||
ss_fname << name << setfill('0') << setw(5) << id;
|
||||
string fname = ss_fname.str();
|
||||
|
||||
cout << " ... " << id;
|
||||
cout.flush();
|
||||
|
||||
ifstream infile(fname.c_str());
|
||||
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);
|
||||
|
||||
ParticleState *s = &gd->particles[curPos];
|
||||
|
||||
for (uint32_t i = nPar; i > 0; i--,s++)
|
||||
s->Mass = 1.0;
|
||||
|
||||
s = &gd->particles[curPos];
|
||||
push_control(POSX);
|
||||
for (uint32_t i = nPar; i > 0; i--)
|
||||
{
|
||||
read_real(s->Pos[0]);
|
||||
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++;
|
||||
}
|
||||
pop_control(POSY);
|
||||
|
||||
s = &gd->particles[curPos];
|
||||
push_control(POSZ);
|
||||
for (uint32_t i = nPar; i > 0; i--)
|
||||
{
|
||||
read_real(s->Pos[2]);
|
||||
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++;
|
||||
}
|
||||
|
||||
cout << endl;
|
||||
|
||||
return gd;
|
||||
}
|
||||
|
||||
PurePositionData *CosmoTool::loadRamsesPosition(const char *name)
|
||||
{
|
||||
PurePositionData *gd = (PurePositionData *)malloc(sizeof(PurePositionData));
|
||||
int id = 1;
|
||||
uint32_t totPart = 0;
|
||||
int nCpu = 0;
|
||||
|
||||
cout << "Detecting number of files and particles..." << endl;
|
||||
while (1)
|
||||
{
|
||||
ostringstream ss_fname;
|
||||
ss_fname << name << setfill('0') << setw(5) << id;
|
||||
string fname = ss_fname.str();
|
||||
|
||||
cout << " ... " << fname << endl;
|
||||
|
||||
ifstream infile(fname.c_str());
|
||||
if (!infile)
|
||||
break;
|
||||
|
||||
int 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);
|
||||
|
||||
cout << " NUMCPU=" << nCpu << " NUMDIM=" << ndim << " NumPart=" << nPar << endl;
|
||||
|
||||
totPart += nPar;
|
||||
id++;
|
||||
}
|
||||
|
||||
assert (totPart <= ((~(size_t)0)/sizeof(FCoordinates)));
|
||||
size_t memSize = sizeof(FCoordinates)*(size_t)(totPart+totPart/nCpu);
|
||||
cout << " Needing " << memSize / 1024 << " kBytes" << endl;
|
||||
gd->pos = (FCoordinates *)malloc(sizeof(FCoordinates)*totPart);
|
||||
assert(gd->pos != 0);
|
||||
gd->NumPart = totPart;
|
||||
gd->BoxSize = 1000.0;
|
||||
|
||||
cout << " Total number part=" << totPart << endl
|
||||
<< "Loading particles ..." << endl;
|
||||
|
||||
uint32_t curPos = 0;
|
||||
id = 1;
|
||||
while (1)
|
||||
{
|
||||
ostringstream ss_fname;
|
||||
ss_fname << name << setfill('0') << setw(5) << id;
|
||||
string fname = ss_fname.str();
|
||||
int *idP;
|
||||
|
||||
cout << " ... " << id;
|
||||
cout.flush();
|
||||
|
||||
ifstream infile(fname.c_str());
|
||||
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]);
|
||||
s[i][0] *= gd->BoxSize;
|
||||
}
|
||||
pop_control(POSX);
|
||||
|
||||
push_control(POSY);
|
||||
for (uint32_t i = 0; i < nPar; i++)
|
||||
{
|
||||
read_real(s[i][1]);
|
||||
s[i][1] *= gd->BoxSize;
|
||||
}
|
||||
pop_control(POSY);
|
||||
|
||||
push_control(POSZ);
|
||||
for (uint32_t i = 0; i < nPar; i++)
|
||||
{
|
||||
read_real(s[i][2]);
|
||||
s[i][2] *= gd->BoxSize;
|
||||
}
|
||||
pop_control(POSZ);
|
||||
|
||||
// SKIP VELOCITIES
|
||||
for (int k = 0; k < 3; k++) {
|
||||
push_control(V);
|
||||
for (uint32_t i = nPar; i > 0; i--)
|
||||
{
|
||||
float dummyF;
|
||||
read_real(dummyF);
|
||||
}
|
||||
pop_control(V);
|
||||
}
|
||||
|
||||
float minMass = INFINITY;
|
||||
push_control(MASS);
|
||||
for (uint32_t i = nPar; i > 0; i--)
|
||||
{
|
||||
float dummyF;
|
||||
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++;
|
||||
}
|
||||
|
||||
cout << endl;
|
||||
|
||||
return gd;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GadgetData *gd = loadRamses(argv[1]);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GadgetData *gd = loadRamses(argv[1]);
|
||||
}
|
||||
|
||||
#endif
|
13
loadRamses.hpp
Normal file
13
loadRamses.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef _LOAD_RAMSES_HPP
|
||||
#define _LOAD_RAMSES_HPP
|
||||
|
||||
#include "load_data.h"
|
||||
|
||||
namespace CosmoTool {
|
||||
|
||||
GadgetData *loadRamses(const char *name);
|
||||
PurePositionData *loadRamsesPosition(const char *fname);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
84
load_data.h
Normal file
84
load_data.h
Normal file
@ -0,0 +1,84 @@
|
||||
#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
|
298
yorick.cpp
Normal file
298
yorick.cpp
Normal file
@ -0,0 +1,298 @@
|
||||
#include "config.hpp"
|
||||
#include <netcdfcpp.h>
|
||||
#include <fstream>
|
||||
#include "yorick.hpp"
|
||||
#include <assert.h>
|
||||
|
||||
using namespace CosmoTool;
|
||||
using namespace std;
|
||||
|
||||
OutputNetCDF::OutputNetCDF(NcFile *f, NcVar *v, long *dimList, uint32_t rank)
|
||||
{
|
||||
this->outFile = f;
|
||||
this->curVar = v;
|
||||
this->dimList = dimList;
|
||||
this->rank = rank;
|
||||
this->counts = new long[rank];
|
||||
this->curPos = new long[rank];
|
||||
|
||||
for (long i = 0; i < rank; i++)
|
||||
this->curPos[i] = 0;
|
||||
|
||||
for (long i = 0; i < rank; i++)
|
||||
this->counts[i] = 1;
|
||||
}
|
||||
|
||||
void OutputNetCDF::addDouble(double a)
|
||||
{
|
||||
curVar->set_cur(curPos);
|
||||
curVar->put(&a, counts);
|
||||
|
||||
curPos[rank-1]++;
|
||||
for (long i = rank-1; i >= 1; i--)
|
||||
{
|
||||
if (curPos[i] == dimList[i])
|
||||
{
|
||||
curPos[i-1]++;
|
||||
curPos[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OutputNetCDF::~OutputNetCDF()
|
||||
{
|
||||
delete counts;
|
||||
delete dimList;
|
||||
delete curPos;
|
||||
delete outFile;
|
||||
}
|
||||
|
||||
class NetCDF_handle
|
||||
{
|
||||
public:
|
||||
NcFile *outFile;
|
||||
NcVar *curVar;
|
||||
long *curPos;
|
||||
long *counts;
|
||||
long *dimList;
|
||||
uint32_t rank;
|
||||
|
||||
NetCDF_handle(NcFile *f, NcVar *v, long *dimList, uint32_t rank);
|
||||
virtual ~NetCDF_handle();
|
||||
};
|
||||
|
||||
NetCDF_handle::NetCDF_handle(NcFile *f, NcVar *v, long *dimList, uint32_t rank)
|
||||
{
|
||||
this->outFile = f;
|
||||
this->curVar = v;
|
||||
this->dimList = dimList;
|
||||
this->rank = rank;
|
||||
this->counts = new long[rank];
|
||||
this->curPos = new long[rank];
|
||||
|
||||
for (long i = 0; i < rank; i++)
|
||||
this->curPos[i] = 0;
|
||||
|
||||
for (long i = 0; i < rank; i++)
|
||||
this->counts[i] = 1;
|
||||
}
|
||||
|
||||
NetCDF_handle::~NetCDF_handle()
|
||||
{
|
||||
delete[] dimList;
|
||||
delete outFile;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
class InputGenCDF: public NetCDF_handle, public ProgressiveInputImpl<T>
|
||||
{
|
||||
public:
|
||||
InputGenCDF(NcFile *f, NcVar *v, long *dimList, uint32_t rank)
|
||||
: NetCDF_handle(f,v,dimList,rank)
|
||||
{}
|
||||
virtual ~InputGenCDF() {}
|
||||
|
||||
virtual T read()
|
||||
{
|
||||
T a;
|
||||
|
||||
curVar->set_cur(curPos);
|
||||
curVar->get(&a, counts);
|
||||
|
||||
curPos[rank-1]++;
|
||||
for (long i = rank-1; i >= 1; i--)
|
||||
{
|
||||
if (curPos[i] == dimList[i])
|
||||
{
|
||||
curPos[i-1]++;
|
||||
curPos[i] = 0;
|
||||
}
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
virtual void seek(uint32_t *pos)
|
||||
{
|
||||
for (long i = rank-1; i >= 0; i--)
|
||||
curPos[i] = pos[rank-1-i];
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class OutputGenCDF: public NetCDF_handle, public ProgressiveOutputImpl<T>
|
||||
{
|
||||
public:
|
||||
OutputGenCDF(NcFile *f, NcVar *v, long *dimList, uint32_t rank)
|
||||
: NetCDF_handle(f,v,dimList,rank)
|
||||
{}
|
||||
virtual ~OutputGenCDF() {}
|
||||
|
||||
virtual void put(T a)
|
||||
{
|
||||
curVar->set_cur(curPos);
|
||||
curVar->put(&a, counts);
|
||||
|
||||
curPos[rank-1]++;
|
||||
for (long i = rank-1; i >= 1; i--)
|
||||
{
|
||||
if (curPos[i] == dimList[i])
|
||||
{
|
||||
curPos[i-1]++;
|
||||
curPos[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class NetCDF_type
|
||||
{
|
||||
public:
|
||||
static const NcType t = (NcType)-1;
|
||||
};
|
||||
|
||||
template<>
|
||||
class NetCDF_type<int>
|
||||
{
|
||||
public:
|
||||
static const NcType t = ncInt;
|
||||
};
|
||||
|
||||
template<>
|
||||
class NetCDF_type<float>
|
||||
{
|
||||
public:
|
||||
static const NcType t = ncFloat;
|
||||
};
|
||||
|
||||
template<>
|
||||
class NetCDF_type<double>
|
||||
{
|
||||
public:
|
||||
static const NcType t = ncDouble;
|
||||
};
|
||||
|
||||
namespace CosmoTool {
|
||||
template<typename T>
|
||||
ProgressiveOutput<T>
|
||||
ProgressiveOutput<T>::saveArrayProgressive(const char *fname, uint32_t *dimList,
|
||||
uint32_t rank)
|
||||
{
|
||||
NcFile *f = new NcFile(fname, NcFile::Replace);
|
||||
|
||||
assert(f->is_valid());
|
||||
|
||||
const NcDim **dimArray = new const NcDim *[rank];
|
||||
for (uint32_t i = 0; i < rank; i++)
|
||||
{
|
||||
char dimName[255];
|
||||
|
||||
sprintf(dimName, "dim%d", i);
|
||||
dimArray[i] = f->add_dim(dimName, dimList[rank-1-i]);
|
||||
}
|
||||
|
||||
NcVar *v = f->add_var("array", NetCDF_type<T>::t, rank, dimArray);
|
||||
|
||||
long *ldimList = new long[rank];
|
||||
|
||||
for (uint32_t i = 0; i < rank; i++)
|
||||
ldimList[rank-1-i] = dimList[i];
|
||||
|
||||
OutputGenCDF<T> *impl = new OutputGenCDF<T>(f, v, ldimList, rank);
|
||||
return ProgressiveOutput<T>(impl);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ProgressiveInput<T>
|
||||
ProgressiveInput<T>::loadArrayProgressive(const char *fname, uint32_t *&dimList,
|
||||
uint32_t& rank)
|
||||
{
|
||||
NcFile *f = new NcFile(fname, NcFile::ReadOnly);
|
||||
|
||||
assert(f->is_valid());
|
||||
|
||||
NcVar *v = f->get_var("array");
|
||||
|
||||
rank = v->num_dims();
|
||||
long *ldimList = v->edges();
|
||||
dimList = new uint32_t[rank];
|
||||
for (uint32_t i = 0; i < rank; i++)
|
||||
{
|
||||
dimList[rank-i-1] = ldimList[i];
|
||||
}
|
||||
InputGenCDF<T> *impl = new InputGenCDF<T>(f, v, ldimList, rank);
|
||||
|
||||
return ProgressiveInput<T>(impl);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void saveArray(const char *fname,
|
||||
T *array, uint32_t *dimList, uint32_t rank)
|
||||
{
|
||||
NcFile f(fname, NcFile::Replace);
|
||||
|
||||
assert(f.is_valid());
|
||||
|
||||
const NcDim **dimArray = new const NcDim *[rank];
|
||||
for (uint32_t i = 0; i < rank; i++)
|
||||
{
|
||||
char dimName[255];
|
||||
|
||||
sprintf(dimName, "dim%d", i);
|
||||
dimArray[i] = f.add_dim(dimName, dimList[i]);
|
||||
}
|
||||
|
||||
NcVar *v = f.add_var("array", NetCDF_type<T>::t, rank, dimArray);
|
||||
|
||||
long *edge = v->edges();
|
||||
v->put(array, edge);
|
||||
delete[] edge;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void loadArray(const char *fname,
|
||||
T*&array, uint32_t *&dimList, uint32_t& rank)
|
||||
{
|
||||
NcFile f(fname, NcFile::ReadOnly);
|
||||
|
||||
if (!f.is_valid())
|
||||
throw NoSuchFileException(fname);
|
||||
|
||||
NcVar *v = f.get_var("array");
|
||||
rank = v->num_dims();
|
||||
long *edge = v->edges();
|
||||
uint32_t fullSize = 1;
|
||||
dimList = new uint32_t[rank];
|
||||
for (int i = 0; i < rank; i++)
|
||||
{
|
||||
dimList[i] = edge[i];
|
||||
fullSize *= edge[i];
|
||||
}
|
||||
array = new T[fullSize];
|
||||
v->get(array, edge);
|
||||
delete[] edge;
|
||||
}
|
||||
|
||||
template class ProgressiveInput<int>;
|
||||
template class ProgressiveInput<float>;
|
||||
template class ProgressiveInput<double>;
|
||||
|
||||
template class ProgressiveOutput<int>;
|
||||
template class ProgressiveOutput<float>;
|
||||
template class ProgressiveOutput<double>;
|
||||
|
||||
template void loadArray<int>(const char *fname,
|
||||
int*& array, uint32_t *&dimList, uint32_t& rank);
|
||||
template void loadArray<float>(const char *fname,
|
||||
float*& array, uint32_t *&dimList, uint32_t& rank);
|
||||
template void loadArray<double>(const char *fname,
|
||||
double*& array, uint32_t *&dimList, uint32_t& rank);
|
||||
|
||||
template void saveArray<int>(const char *fname,
|
||||
int *array, uint32_t *dimList, uint32_t rank);
|
||||
template void saveArray<float>(const char *fname,
|
||||
float *array, uint32_t *dimList, uint32_t rank);
|
||||
template void saveArray<double>(const char *fname,
|
||||
double *array, uint32_t *dimList, uint32_t rank);
|
||||
|
||||
}
|
211
yorick.hpp
Normal file
211
yorick.hpp
Normal file
@ -0,0 +1,211 @@
|
||||
#ifndef __YORICK_HELPERS_HPP
|
||||
#define __YORICK_HELPERS_HPP
|
||||
|
||||
#include "config.hpp"
|
||||
#include <stdint.h>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace CosmoTool
|
||||
{
|
||||
|
||||
class ProgressiveDoubleOutputImpl
|
||||
{
|
||||
public:
|
||||
virtual ~ProgressiveDoubleOutputImpl();
|
||||
virtual void addDouble(double d) = 0;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class ProgressiveInputImpl
|
||||
{
|
||||
public:
|
||||
virtual ~ProgressiveInputImpl() {}
|
||||
virtual T read() = 0;
|
||||
virtual void seek(uint32_t *pos) = 0;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class ProgressiveOutputImpl
|
||||
{
|
||||
public:
|
||||
virtual ~ProgressiveOutputImpl() {}
|
||||
virtual void put(T a) = 0;
|
||||
};
|
||||
|
||||
class ProgressiveDoubleOutput
|
||||
{
|
||||
private:
|
||||
bool initialized;
|
||||
int *ref;
|
||||
ProgressiveDoubleOutputImpl *impl;
|
||||
|
||||
friend ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
||||
void decRef();
|
||||
public:
|
||||
ProgressiveDoubleOutput();
|
||||
ProgressiveDoubleOutput(ProgressiveDoubleOutputImpl *i);
|
||||
ProgressiveDoubleOutput(const ProgressiveDoubleOutput& o);
|
||||
~ProgressiveDoubleOutput();
|
||||
|
||||
virtual void addDouble(double a);
|
||||
|
||||
const ProgressiveDoubleOutput& operator=(const ProgressiveDoubleOutput& b);
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class ProgressiveInput
|
||||
{
|
||||
private:
|
||||
int *ref;
|
||||
ProgressiveInputImpl<T> *impl;
|
||||
|
||||
void decRef()
|
||||
{
|
||||
if (ref == 0)
|
||||
return;
|
||||
|
||||
(*ref)--;
|
||||
if (*ref == 0)
|
||||
{
|
||||
delete ref;
|
||||
delete impl;
|
||||
}
|
||||
impl = 0;
|
||||
ref = 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static ProgressiveInput<T>
|
||||
loadArrayProgressive(const char *fname, uint32_t *&dimList,
|
||||
uint32_t& rank);
|
||||
|
||||
ProgressiveInput() {
|
||||
impl = 0;
|
||||
ref = 0;
|
||||
}
|
||||
ProgressiveInput(ProgressiveInputImpl<T> *i) {
|
||||
impl = i;
|
||||
ref = new int;
|
||||
*ref = 1;
|
||||
}
|
||||
ProgressiveInput(const ProgressiveInput<T>& o) {
|
||||
ref = o.ref;
|
||||
impl = o.impl;
|
||||
(*ref)++;
|
||||
}
|
||||
~ProgressiveInput() {
|
||||
decRef();
|
||||
}
|
||||
|
||||
T read()
|
||||
{
|
||||
return impl->read();
|
||||
}
|
||||
|
||||
void seek(uint32_t *pos)
|
||||
{
|
||||
impl->seek(pos);
|
||||
}
|
||||
|
||||
const ProgressiveInput<T>& operator=(const ProgressiveInput<T>& b)
|
||||
{
|
||||
decRef();
|
||||
ref = b.ref;
|
||||
impl = b.impl;
|
||||
if (ref != 0)
|
||||
(*ref)++;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class ProgressiveOutput
|
||||
{
|
||||
private:
|
||||
int *ref;
|
||||
ProgressiveOutputImpl<T> *impl;
|
||||
|
||||
void decRef()
|
||||
{
|
||||
if (ref == 0)
|
||||
return;
|
||||
|
||||
(*ref)--;
|
||||
if (*ref == 0)
|
||||
{
|
||||
delete ref;
|
||||
delete impl;
|
||||
}
|
||||
impl = 0;
|
||||
ref = 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static ProgressiveOutput<T>
|
||||
saveArrayProgressive(const char *fname, uint32_t *dimList,
|
||||
uint32_t rank);
|
||||
|
||||
ProgressiveOutput() {
|
||||
impl = 0;
|
||||
ref = 0;
|
||||
}
|
||||
ProgressiveOutput(ProgressiveOutputImpl<T> *i) {
|
||||
impl = i;
|
||||
ref = new int;
|
||||
*ref = 1;
|
||||
}
|
||||
ProgressiveOutput(const ProgressiveOutput<T>& o) {
|
||||
ref = o.ref;
|
||||
impl = o.impl;
|
||||
(*ref)++;
|
||||
}
|
||||
~ProgressiveOutput() {
|
||||
decRef();
|
||||
}
|
||||
|
||||
void put(T a)
|
||||
{
|
||||
impl->put(a);
|
||||
}
|
||||
|
||||
const ProgressiveOutput<T>& operator=(const ProgressiveOutput<T>& b)
|
||||
{
|
||||
decRef();
|
||||
ref = b.ref;
|
||||
impl = b.impl;
|
||||
if (ref != 0)
|
||||
(*ref)++;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
void saveArray(const char *fname,
|
||||
T *array, uint32_t *dimList, uint32_t rank);
|
||||
template<typename T>
|
||||
void loadArray(const char *fname,
|
||||
T*& array, uint32_t *& dimList, uint32_t& rank);
|
||||
|
||||
void saveFloatArray(const char *fname,
|
||||
float *array, uint32_t *dimList, uint32_t rank);
|
||||
void loadFloatArray(const char *fname,
|
||||
float *&array, uint32_t *&dimList, uint32_t& rank)
|
||||
throw (NoSuchFileException);
|
||||
|
||||
void saveDoubleArray(const char *fname,
|
||||
double *array, uint32_t *dimList, uint32_t rank);
|
||||
void loadDoubleArray(const char *fname,
|
||||
double *&array, uint32_t *&dimList, uint32_t& rank)
|
||||
throw (NoSuchFileException);
|
||||
|
||||
void loadIntArray(const char *fname,
|
||||
int *&array, uint32_t *&dimList, uint32_t& rank)
|
||||
throw (NoSuchFileException);
|
||||
void saveIntArray(const char *fname,
|
||||
int *array, uint32_t *dimList, uint32_t rank);
|
||||
|
||||
ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user