15#include <EntreeSortie.h>
16#include <FichierHDF.h>
18#include <communications.h>
23 Cerr <<
"FichierHDF needs HDF (so MED) to be used!" << finl;
54static inline void hdf5_error(T status)
58 Cerr <<
"HDF5 error occured - exiting" << finl;
64 dataset_transfer_plst_(0) {}
74 file_id_ = H5Fcreate(filename, H5F_ACC_TRUNC , H5P_DEFAULT, file_access_plst_);
75 hdf5_error<hid_t>(file_id_);
76 Cerr <<
"HDF5 " << filename <<
" file created !" << finl;
83 unsigned st = readOnly ? H5F_ACC_RDONLY : H5F_ACC_RDWR;
84 file_id_ = H5Fopen(filename, st, file_access_plst_);
85 hdf5_error<hid_t>(file_id_);
86 Cerr <<
"HDF5 " << filename <<
" file opened !" << finl;
92 file_access_plst_ = H5Pcreate(H5P_FILE_ACCESS);
104 dataset_transfer_plst_ = H5Pcreate(H5P_DATASET_XFER);
110 Cerr <<
"[HDF5] closing file..." << finl;
114 H5Fget_name(file_id_, filename, 100);
118 if(file_access_plst_) H5Pclose(file_access_plst_);
119 if(dataset_transfer_plst_) H5Pclose(dataset_transfer_plst_);
120 Cerr <<
"HDF5 " << filename <<
" file closed !" << finl;
128 Nom dataset_name = dataset_basename;
129 dataset_name = dataset_name.
nom_me(proc_rank, 0, 1 );
131 hid_t dataset_id = H5Dopen2(file_id_, dataset_name, H5P_DEFAULT);
132 hid_t dataspace_id = H5Dget_space(dataset_id);
133 hssize_t sz = H5Sget_simple_extent_npoints(dataspace_id);
134 char * dset_data =
new char[sz];
135 Cerr <<
"[HDF5] Reading into HDF dataset " << dataset_name <<
"...";
136 H5Dread(dataset_id, H5T_NATIVE_OPAQUE, H5S_ALL, H5S_ALL, dataset_transfer_plst_, dset_data);
137 Cerr <<
" Done !" << finl;
140 if(is_different_int_size_)
146 entree.
set_data(dset_data, (
unsigned) sz);
149 H5Dclose(dataset_id);
150 H5Sclose(dataspace_id);
157 hid_t dataspace_id = H5Screate_simple(1, &length,
nullptr);
160 for(
int i=0; i<dataset_names.size(); i++)
162 Nom dataset_name = dataset_names[i];
163 hid_t dataset_id = H5Dcreate2(file_id_, dataset_name, H5T_NATIVE_OPAQUE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
164 hdf5_error<herr_t>(H5Dclose(dataset_id));
167 hdf5_error<herr_t>(H5Sclose(dataspace_id));
169 Cerr <<
"[HDF5] All datasets created !" << finl;
177 hsize_t lenData = sortie.
get_size();
178 const char * data = sortie.
get_data();
180 hsize_t dims[1] = {lenData};
181 hid_t dataspace_id = H5Screate_simple(1, dims,
nullptr);
184 hid_t dataset_id = H5Dopen2(file_id_, dataset_name, H5P_DEFAULT);
185 hdf5_error<hid_t>(dataset_id );
188 Cerr <<
"[HDF5] Writing into HDF dataset " << dataset_name <<
"...";
189 hdf5_error<herr_t>(H5Dwrite(dataset_id, H5T_NATIVE_OPAQUE, H5S_ALL, dataspace_id, dataset_transfer_plst_, data));
190 Cerr <<
" Done !" << finl;
193 hdf5_error<herr_t>(H5Dclose(dataset_id));
194 hdf5_error<herr_t>(H5Sclose(dataspace_id));
202 hsize_t lenData = sortie.
get_size();
203 const char * data = sortie.
get_data();
211 hsize_t lenData = sortie.
get_size();
212 const char * data = sortie.
get_str();
221 long long init_value = lenData;
222 std::vector<long long> datasets_len(
Process::nproc(), init_value);
223 envoyer_all_to_all(datasets_len, datasets_len);
232 Nom dname = dataset_basename;
233 dname = dname.
nom_me(p, 0, 1 );
235 hsize_t dlen= datasets_len[p];
236 hid_t dspace = H5Screate_simple(1, &dlen,
nullptr);
238 datasets_id[p] = H5Dcreate2(file_id_, dname, datatype, dspace,
239 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
243 Cerr <<
"[HDF5] All datasets created !" << finl;
245 hid_t dataspace_id = H5Screate_simple(1, &lenData,
nullptr);
247 Cerr <<
"[HDF5] Writing into HDF dataset " << my_dataset_name <<
"...";
249 H5Dwrite(datasets_id[
Process::me()], datatype, dataspace_id, H5S_ALL, dataset_transfer_plst_, data);
250 Cerr <<
" Dataset written !" << finl;
254 H5Dclose(datasets_id[p]);
255 Cerr <<
"[HDF5] All datasets closed !" << finl;
257 H5Sclose(dataspace_id);
264 hsize_t lenData = sortie.
get_size();
265 const char * data = sortie.
get_data();
267 hsize_t dims[1] = {lenData};
268 hid_t dataspace_id = H5Screate_simple(1, dims,
nullptr);
271 hid_t dataset_id = H5Dcreate2(file_id_, dataset_name, H5T_NATIVE_OPAQUE, dataspace_id,
272 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
275 Cerr <<
"[HDF5] Writing into HDF dataset " << dataset_name <<
"...";
276 H5Dwrite(dataset_id, H5T_NATIVE_OPAQUE, H5S_ALL, H5S_ALL, dataset_transfer_plst_, data);
277 Cerr <<
" Done !" << finl;
280 H5Dclose(dataset_id);
281 H5Sclose(dataspace_id);
289 return H5Lexists( file_id_, dataset_name, H5P_DEFAULT )>0;
294 return H5Fis_hdf5(file_name)>0;
301 hid_t space_id = H5Screate(H5S_SCALAR);
302 hid_t attr_id = H5Acreate(file_id_,
"int_size_in_bits", H5T_NATIVE_INT32, space_id, H5P_DEFAULT, H5P_DEFAULT);
308 H5Awrite(attr_id, H5T_NATIVE_INT32, &int_size);
316 int TRUST_int_type_exists_in_file = H5Aexists(file_id_,
"int_size_in_bits");
317 if (TRUST_int_type_exists_in_file < 0)
319 Cerr <<
"Error " << (int) TRUST_int_type_exists_in_file;
320 Cerr <<
" while getting the attribute 'int_size_in_bits' in the ";
321 Cerr << filename <<
" HDF file" << finl;
324 else if (TRUST_int_type_exists_in_file == 0)
326 Cerr <<
"Warning, we can't find whether the " << filename <<
" HDF file was written with -int32 or -int64" << finl;
327 Cerr <<
"Possibly old files created before 1.8.4 version" << finl;
328 Cerr <<
"If an error occurs, or results seem weird, try opening it with ";
330 Cerr <<
"an -int32 TRUST version." << finl;
332 Cerr <<
"an -int64 TRUST version." << finl;
334 Cerr <<
"Or set environment variable TRUST_FORCE_DIFFERENT_INT_SIZE to 1 to try" << finl;
335 Cerr <<
"reading the int32 (or int64) file by a int64 (or int32) TRUST binary." << finl;
336 if (getenv(
"TRUST_FORCE_DIFFERENT_INT_SIZE")!=
nullptr) is_different_int_size_ =
true;
340 hid_t attr_id = H5Aopen(file_id_,
"int_size_in_bits", H5P_DEFAULT);
341 int int_size_in_bits;
342 H5Aread(attr_id, H5T_NATIVE_INT32, &int_size_in_bits);
343 Cerr <<
"[HDF5] We read that "<< filename <<
" was written in -int" << (int)int_size_in_bits << finl;
345 if (!(int_size_in_bits == 32 || int_size_in_bits == 64))
347 Cerr <<
"[HDF5] We read -int"<< (int)int_size_in_bits <<
" in " << filename <<
" which is abnormal." << finl;
353 if (int_size_in_bits == 32) is_different_int_size_ =
true;
355 if (int_size_in_bits == 64)
357 is_different_int_size_ =
true;
358 Cerr <<
"Warning, HDF file " << filename <<
" was written with an -int64 version and you are reading it with an -int32 version."<< finl;
359 Cerr <<
"Make sure your mesh doesn't contain more than 2^32 elements, nodes or faces." << finl;
virtual void set_64b(bool is_64b)
An Entree whose main source of data is an arbitrary binary buffer set using the set_data() method.
void set_data(const char *data, unsigned sz)
void check_int_size(Nom filename)
static bool is_hdf5(const char *file_name)
virtual void create_and_fill_dataset_MW(Nom dataset_basename, Sortie_Brute &sortie)
virtual void prepare_file_props()
void fill_dataset(Nom dataset_name, Sortie_Brute &sortie)
virtual void read_dataset(Nom dataset_basename, int proc_rank, Entree_Brute &entree)
virtual void open(Nom filename, bool readOnly)
virtual bool exists(const char *dataset_name)
virtual void create_and_fill_dataset_SW(Nom datasetname, Sortie_Brute &sortie)
virtual void prepare_dataset_props()
void create_datasets(Noms dataset_names, long length)
virtual void create(Nom filename)
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom nom_me(int, const char *prefix=0, int without_padding=0) const
Insere _prefix000n (n=me() ou nproc()) dans un nom de fichier (par ex:toto.
Un tableau de chaine de caracteres (VECT(Nom)).
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe derivee de Sortie empile ce qu'on lui envoie dans une chaine de caracteres.
const char * get_str() const
returns a copy of the string stored by the SChaine
unsigned get_size() const
This derived class of Sortie stacks whatever it receives in an internal binary buffer.
unsigned get_size() const
const char * get_data() const
returns a pointer to the internal data.