2011-06-06 15:56:54 +02:00
|
|
|
/* Reads in FLASH v3 files in HDF5 format */
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "load_data.hpp"
|
|
|
|
#include "loadFlash.hpp"
|
|
|
|
#include "h5_readFlash.hpp"
|
|
|
|
#include "H5Cpp.h"
|
|
|
|
|
|
|
|
using namespace CosmoTool;
|
|
|
|
using namespace std;
|
|
|
|
using namespace H5;
|
|
|
|
|
|
|
|
SimuData *CosmoTool::loadFlashMulti(const char *fname, int id, int loadflags)
|
|
|
|
{
|
|
|
|
SimuData *data;
|
|
|
|
int p, n;
|
|
|
|
H5File *fileID;
|
|
|
|
H5std_string filename;
|
|
|
|
//char filename[81];
|
2011-06-06 17:20:03 +02:00
|
|
|
double lbox, time, hubble, omegam, omegalambda, redshift;
|
2011-06-06 15:56:54 +02:00
|
|
|
int npart;
|
|
|
|
|
|
|
|
const double kpc2cm = 3.08568025e21;
|
|
|
|
const double km2cm = 1.e5;
|
2011-06-06 16:58:55 +02:00
|
|
|
const double hubble2cm = 3.240779270005e-18;
|
2011-06-06 15:56:54 +02:00
|
|
|
|
2011-06-06 16:18:25 +02:00
|
|
|
if (id != 0)
|
|
|
|
throw NoSuchFileException();
|
|
|
|
|
2011-06-06 15:56:54 +02:00
|
|
|
data = new SimuData;
|
|
|
|
if (data == 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
filename = fname;
|
2011-06-06 16:18:25 +02:00
|
|
|
try {
|
|
|
|
H5File file (filename, H5F_ACC_RDONLY);
|
|
|
|
|
|
|
|
// simulation info
|
2011-06-06 17:20:03 +02:00
|
|
|
h5_read_flash3_header_info(&file, &time, &redshift);
|
|
|
|
data->time = 1/(1+redshift);
|
2011-06-06 16:18:25 +02:00
|
|
|
|
2011-06-06 16:58:55 +02:00
|
|
|
h5_read_runtime_parameters(&file, &lbox, &npart, &hubble, &omegam, &omegalambda);
|
2011-06-06 16:43:11 +02:00
|
|
|
data->TotalNumPart = data->NumPart = npart;
|
2011-06-06 16:58:55 +02:00
|
|
|
data->Hubble = hubble/hubble2cm;
|
2011-06-06 17:00:03 +02:00
|
|
|
data->BoxSize = lbox/kpc2cm*data->Hubble;
|
2011-06-06 16:58:55 +02:00
|
|
|
data->Omega_M = omegam;
|
|
|
|
data->Omega_Lambda = omegalambda;
|
2011-06-06 16:18:25 +02:00
|
|
|
|
|
|
|
// particle data
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
data->Pos[i] = new float[data->NumPart];
|
|
|
|
if (data->Pos[i] == 0) {
|
|
|
|
delete data;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
data->Vel[i] = new float[data->NumPart];
|
|
|
|
if (data->Vel[i] == 0) {
|
|
|
|
delete data;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2011-06-06 15:56:54 +02:00
|
|
|
|
2011-06-06 16:18:25 +02:00
|
|
|
data->Id = new int[data->NumPart];
|
|
|
|
if (data->Id == 0) {
|
|
|
|
delete data;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int offset = 0;
|
|
|
|
h5_read_flash3_particles(&file, &npart, &npart, &offset,
|
|
|
|
data->Pos[0], data->Pos[1], data->Pos[2],
|
|
|
|
data->Vel[0], data->Vel[1], data->Vel[2],
|
|
|
|
data->Id);
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
for (int n = 0; i < data->NumPart; i++) {
|
2011-06-06 17:22:39 +02:00
|
|
|
data->Pos[i][n] = data->Pos[n][i] / kpc2cm;
|
|
|
|
data->Vel[i][n] = data->Vel[n][i] / km2cm;
|
2011-06-06 16:18:25 +02:00
|
|
|
}
|
2011-06-06 15:56:54 +02:00
|
|
|
}
|
|
|
|
|
2011-06-06 16:18:25 +02:00
|
|
|
file.close();
|
|
|
|
} catch (const FileIException& e) {
|
|
|
|
throw NoSuchFileException();
|
|
|
|
}
|
2011-06-06 15:56:54 +02:00
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
|