/* Reads in FLASH v3 files in HDF5 format */ #include #include #include #include #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]; double lbox, time; int npart; const double kpc2cm = 3.08568025e21; const double km2cm = 1.e5; if (id != 0) throw NoSuchFileException(); data = new SimuData; if (data == 0) { return 0; } filename = fname; try { H5File file (filename, H5F_ACC_RDONLY); // simulation info h5_read_flash3_header_info(&file, &time); data->time = time; h5_read_runtime_parameters(&file, &lbox, &npart); data->TotalNumPart = data->NumPart = npart; data->BoxSize = lbox/kpc2cm; // 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; } } 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++) { data->Pos[n][i] = data->Pos[n][i] / kpc2cm; data->Vel[n][i] = data->Vel[n][i] / km2cm; } } file.close(); } catch (const FileIException& e) { throw NoSuchFileException(); } return data; }