https://github.com/teuben/nemo
Revision d0f673bdaeabe8dffa77528c13d81063a20d29f6 authored by Peter Teuben on 03 April 2024, 01:39:10 UTC, committed by Peter Teuben on 03 April 2024, 01:39:10 UTC
1 parent 0615225
Raw File
Tip revision: d0f673bdaeabe8dffa77528c13d81063a20d29f6 authored by Peter Teuben on 03 April 2024, 01:39:10 UTC
format
Tip revision: d0f673b
read_eagle.h
#include "hdf5.h"

#ifndef _READ_EAGLE_H
#define _READ_EAGLE_H

#define MAX_NAMELEN 500

typedef unsigned long long peanokey;

peanokey peano_hilbert_key(int x, int y, int z, int bits);

/*
  Type to store information about an open snapshot
*/
typedef struct
{
  double         boxsize;
  int            numfiles;
  int            hashbits;
  char           basename[MAX_NAMELEN];
  unsigned char *hashmap;
  int            ncell;
  int            nhash;
  long long     *first_key_in_file[6];
  long long     *last_key_in_file[6];
  long long     *num_keys_in_file[6];
  unsigned int **part_per_cell[6];
  unsigned int **first_in_cell[6];
  long long      numpart_total[6];
  int            num_datasets[6];
  char          *dataset_name[6];
  double         sampling_rate;
  int            split_rank, split_size;
} EagleSnapshot;

/* 
   Type codes for returning the type of a dataset
   (mostly for the use of Fortran/Python/IDL wrappers)
*/
typedef enum e_TypeCode
  {
    t_int       = 0,
    t_long_long = 1,
    t_float     = 2,
    t_double    = 3,
    t_uint      = 4,
    t_ulong_long = 5
  } TypeCode;

/* Return a pointer to the last error message */
char *get_error(void);

/* Set whether we should abort on errors */
void abort_on_error(int flag);

/*
  Function to open a snapshot

  Parameters:
    fname - name of one file in the snapshot

  Return value:
    Success - returns a pointer to a new EagleSnapshot
    Failure - returns a null pointer

  The EagleSnapshot should be deallocated with a call to
  close_snapshot() to avoid memory leaks.
*/
EagleSnapshot *open_snapshot(char *fname);


/*
  Function to close a snapshot

  Parameters:
    snap - pointer to the EagleSnapshot
*/
void close_snapshot(EagleSnapshot *snap);


/*
  Function to select a region in a snapshot

  Parameters:
    snap  - pointer to the EagleSnapshot
    xmin  - minimum x coordinate
    xmax  - maximum x coordinate
    ymin  - minimum y coordinate
    ymax  - maximum y coordinate
    zmin  - minimum z coordinate
    zmax  - maximum z coordinate

 Repeated calls to select_region() can be used to select
 oddly shaped or disjoint regions.
*/
void select_region(EagleSnapshot *snap, 
		  double xmin, double xmax,
		  double ymin, double ymax,
		  double zmin, double zmax);

/*
  Alternate version of select region where integer cell
  coordinates are specified
*/
void select_grid_cells(EagleSnapshot *snap, 
		       int ixmin, int ixmax,
		       int iymin, int iymax,
		       int izmin, int izmax);

/*
  This version allows regions which are not axis aligned
*/
void select_rotated_region(EagleSnapshot *snap,
			   double *centre,
			   double *xvec, double *yvec, double *zvec,
			   double *length);

/*
  Function to set sampling rate
*/
void set_sampling_rate(EagleSnapshot *snap, double rate);

/*
  Clear any selection associated with the specified snapshot

  Parameters:
    snap - pointer to the EagleSnapshot
*/
void clear_selection(EagleSnapshot *snap);


/*
  Count the particles in the selected region

  Parameters:
    snap      - pointer to the eagle snapshot
    itype     - particle type to read

  Return value:
    Success - Number of particles in the selected region
    Failure - a negative number
*/
long long count_particles_with_index(EagleSnapshot *snap, int itype, 
				     int *file_index, int *file_offset,
				     size_t nmax);

/*
  Macros to call count_particles_with_index()
*/
#define count_particles(snap, itype) count_particles_with_index((snap), (itype), NULL, NULL, 0)
#define get_particle_locations count_particles_with_index

/*
  Function to read a dataset for all particles in the
  selected region. Works with 1D datasets and 2D Nx3 datasets.

  Parameters:
    snap      - pointer to the eagle snapshot
    itype     - particle type to read
    name      - HDF5 dataset name relative to the PartTypeX group
    hdf5_type - HDF5 type of the output buffer 'buf'
    buf       - buffer in which to store the result
    n         - size of the buffer 'buf'
    extra_basename - if this is set, read from alternate files <extra_basename>.*.hdf5

  Return value:
    Success - the number of particles read
    Failure - a negative number
*/
long long read_extra_dataset(EagleSnapshot *snap, int itype, char *name, hid_t hdf5_type, void *buf, size_t n,
			     char *extra_basename);
#define read_dataset(snap, itype, name, hdf5_type, buf, n) read_extra_dataset((snap), (itype), (name), (hdf5_type), (buf), (n), NULL)

/*
  Macros for reading data into buffers of specific types.

  These avoid the need to use quantities from hdf5.h in the
  calling program. Parameters have the same meaning as in
  read_dataset().
*/
#define read_dataset_int(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_INT,buf,n,NULL)
#define read_dataset_float(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_FLOAT,buf,n,NULL)
#define read_dataset_double(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_DOUBLE,buf,n,NULL)
#define read_dataset_long_long(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_LLONG,buf,n,NULL)
#define read_dataset_unsigned_int(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_UINT,buf,n,NULL)
#define read_dataset_unsigned_long_long(snap,itype,name,buf,n) read_extra_dataset(snap,itype,name,H5T_NATIVE_ULLONG,buf,n,NULL)

/*
  Return information about a dataset given its name

  Parameters:
    snap      - pointer to the eagle snapshot
    itype     - particle type to read
    name      - HDF5 dataset name relative to the PartTypeX group
    typecode  - 
    rank      - the rank of the dataset (1 for scalar particle
                properties, 2 for vectors)

 Return value:
    Success - zero
    Failure - non-zero

*/
int get_extra_dataset_info(EagleSnapshot *snap, int itype, char *dset_name, TypeCode *typecode, int *rank, char *extra_basename);
#define get_dataset_info(snap,itype,dset_name,typecode,rank) get_extra_dataset_info(snap, itype, dset_name, typecode, rank, NULL)

/*
  Return the number of datasets available for the specified particle type

  Parameters:
    snap      - pointer to the eagle snapshot
    itype     - particle type to read

  Return value:
    Success - the number of datasets
    Failure - a negative number

*/
int get_dataset_count(EagleSnapshot *snap, int itype);

/*
  Get the name of the specified dataset.

  Parameters:
    snap      - pointer to the eagle snapshot
    itype     - particle type to read
    iset      - index of the dataset
    buf       - pointer to the output buffer
    len       - length of the output buffer

  Return value:
    Success - the length of the string copied to the output buffer
    Failure - a negative number

*/
int get_dataset_name(EagleSnapshot *snap, int itype, int iset, char *buf, size_t len);

/*
  Split the region to be read between processors.
  For use in MPI programs. When using MPI all read_eagle 
  calls are collective.
  
  Parameters:
    ThisTask - MPI rank of this process
    NTask    - Number of MPI ranks
  
  Return value:
    Success - returns zero
    Failure - a negative number

  This must be called after select_region and before read_dataset.
  Each selection can only be split once. I.e. must call clear_selection
  before split_selection can be called again.

*/
int split_selection(EagleSnapshot *snap, int ThisTask, int NTask);


double random_double(void);
void set_random_seed(void);

#endif
back to top