1*52849c42SDave May 2*52849c42SDave May #ifndef __DATA_BUCKET_H__ 3*52849c42SDave May #define __DATA_BUCKET_H__ 4*52849c42SDave May 5*52849c42SDave May 6*52849c42SDave May #include <petsc.h> 7*52849c42SDave May 8*52849c42SDave May 9*52849c42SDave May #define DEFAULT -32654789 10*52849c42SDave May 11*52849c42SDave May #define DATAFIELD_POINT_ACCESS_GUARD 12*52849c42SDave May 13*52849c42SDave May /* Logging flag */ 14*52849c42SDave May #define PTAT3D_LOG_DATA_BUCKET 15*52849c42SDave May 16*52849c42SDave May 17*52849c42SDave May typedef enum { DATABUCKET_VIEW_STDOUT=0, DATABUCKET_VIEW_ASCII, DATABUCKET_VIEW_BINARY, DATABUCKET_VIEW_HDF5 } DataBucketViewType; 18*52849c42SDave May 19*52849c42SDave May typedef struct _p_DataField* DataField; 20*52849c42SDave May typedef struct _p_DataBucket* DataBucket; 21*52849c42SDave May 22*52849c42SDave May 23*52849c42SDave May struct _p_DataField { 24*52849c42SDave May char *registeration_function; 25*52849c42SDave May int L; 26*52849c42SDave May PetscBool active; 27*52849c42SDave May size_t atomic_size; 28*52849c42SDave May char *name; /* what are they called */ 29*52849c42SDave May void *data; /* the data - an array of structs */ 30*52849c42SDave May }; 31*52849c42SDave May 32*52849c42SDave May struct _p_DataBucket { 33*52849c42SDave May int L; /* number in use */ 34*52849c42SDave May int buffer; /* memory buffer used for re-allocation */ 35*52849c42SDave May int allocated; /* number allocated, this will equal datafield->L */ 36*52849c42SDave May PetscBool finalised; /* DEPRECIATED */ 37*52849c42SDave May int nfields; /* how many fields of this type */ 38*52849c42SDave May DataField *field; /* the data */ 39*52849c42SDave May }; 40*52849c42SDave May 41*52849c42SDave May #define ERROR() {\ 42*52849c42SDave May printf("ERROR: %s() from line %d in %s !!\n", __FUNCTION__, __LINE__, __FILE__);\ 43*52849c42SDave May exit(EXIT_FAILURE);\ 44*52849c42SDave May } 45*52849c42SDave May 46*52849c42SDave May #define __DATATFIELD_point_access(data,index,atomic_size) (void*)((char*)(data) + (index)*(atomic_size)) 47*52849c42SDave May #define __DATATFIELD_point_access_offset(data,index,atomic_size,offset) (void*)((char*)(data) + (index)*(atomic_size) + (offset)) 48*52849c42SDave May 49*52849c42SDave May 50*52849c42SDave May 51*52849c42SDave May void StringInList( const char name[], const int N, const DataField gfield[], PetscBool *val ); 52*52849c42SDave May void StringFindInList( const char name[], const int N, const DataField gfield[], int *index ); 53*52849c42SDave May 54*52849c42SDave May void DataFieldCreate( const char registeration_function[], const char name[], const size_t size, const int L, DataField *DF ); 55*52849c42SDave May void DataFieldDestroy( DataField *DF ); 56*52849c42SDave May void DataBucketCreate( DataBucket *DB ); 57*52849c42SDave May void DataBucketDestroy( DataBucket *DB ); 58*52849c42SDave May void _DataBucketRegisterField( 59*52849c42SDave May DataBucket db, 60*52849c42SDave May const char registeration_function[], 61*52849c42SDave May const char field_name[], 62*52849c42SDave May size_t atomic_size, DataField *_gfield ); 63*52849c42SDave May 64*52849c42SDave May 65*52849c42SDave May #define DataBucketRegisterField(db,name,size,k) {\ 66*52849c42SDave May char *location;\ 67*52849c42SDave May asprintf(&location,"Registered by %s() at line %d within file %s", __FUNCTION__, __LINE__, __FILE__);\ 68*52849c42SDave May _DataBucketRegisterField( (db), location, (name), (size), (k) );\ 69*52849c42SDave May free(location);\ 70*52849c42SDave May } 71*52849c42SDave May 72*52849c42SDave May void DataFieldGetNumEntries(DataField df, int *sum); 73*52849c42SDave May void DataFieldSetSize( DataField df, const int new_L ); 74*52849c42SDave May void DataFieldZeroBlock( DataField df, const int start, const int end ); 75*52849c42SDave May void DataFieldGetAccess( const DataField gfield ); 76*52849c42SDave May void DataFieldAccessPoint( const DataField gfield, const int pid, void **ctx_p ); 77*52849c42SDave May void DataFieldAccessPointOffset( const DataField gfield, const size_t offset, const int pid, void **ctx_p ); 78*52849c42SDave May void DataFieldRestoreAccess( DataField gfield ); 79*52849c42SDave May void DataFieldVerifyAccess( const DataField gfield, const size_t size); 80*52849c42SDave May void DataFieldGetAtomicSize(const DataField gfield,size_t *size); 81*52849c42SDave May 82*52849c42SDave May void DataFieldGetEntries(const DataField gfield,void **data); 83*52849c42SDave May void DataFieldRestoreEntries(const DataField gfield,void **data); 84*52849c42SDave May 85*52849c42SDave May void DataFieldInsertPoint( const DataField field, const int index, const void *ctx ); 86*52849c42SDave May void DataFieldCopyPoint( const int pid_x, const DataField field_x, 87*52849c42SDave May const int pid_y, const DataField field_y ); 88*52849c42SDave May void DataFieldZeroPoint( const DataField field, const int index ); 89*52849c42SDave May 90*52849c42SDave May void DataBucketGetDataFieldByName(DataBucket db,const char name[],DataField *gfield); 91*52849c42SDave May void DataBucketQueryDataFieldByName(DataBucket db,const char name[],PetscBool *found); 92*52849c42SDave May void DataBucketFinalize(DataBucket db); 93*52849c42SDave May void DataBucketSetInitialSizes( DataBucket db, const int L, const int buffer ); 94*52849c42SDave May void DataBucketSetSizes( DataBucket db, const int L, const int buffer ); 95*52849c42SDave May void DataBucketGetSizes( DataBucket db, int *L, int *buffer, int *allocated ); 96*52849c42SDave May void DataBucketGetGlobalSizes(MPI_Comm comm, DataBucket db, long int *L, long int *buffer, long int *allocated ); 97*52849c42SDave May void DataBucketGetDataFields( DataBucket db, int *L, DataField *fields[] ); 98*52849c42SDave May 99*52849c42SDave May void DataBucketCopyPoint( const DataBucket xb, const int pid_x, 100*52849c42SDave May const DataBucket yb, const int pid_y ); 101*52849c42SDave May void DataBucketCreateFromSubset( DataBucket DBIn, const int N, const int list[], DataBucket *DB ); 102*52849c42SDave May void DataBucketZeroPoint( const DataBucket db, const int index ); 103*52849c42SDave May 104*52849c42SDave May //void DataBucketLoadFromFile(const char filename[], DataBucketViewType type, DataBucket *db); 105*52849c42SDave May void DataBucketLoadFromFile(MPI_Comm comm,const char filename[], DataBucketViewType type, DataBucket *db); 106*52849c42SDave May //void DataBucketView(DataBucket db,const char filename[],DataBucketViewType type); 107*52849c42SDave May void DataBucketView(MPI_Comm comm,DataBucket db,const char filename[],DataBucketViewType type); 108*52849c42SDave May 109*52849c42SDave May void DataBucketAddPoint( DataBucket db ); 110*52849c42SDave May void DataBucketRemovePoint( DataBucket db ); 111*52849c42SDave May void DataBucketRemovePointAtIndex( const DataBucket db, const int index ); 112*52849c42SDave May 113*52849c42SDave May void DataBucketDuplicateFields(DataBucket dbA,DataBucket *dbB); 114*52849c42SDave May void DataBucketInsertValues(DataBucket db1,DataBucket db2); 115*52849c42SDave May 116*52849c42SDave May /* helpers for parallel send/recv */ 117*52849c42SDave May void DataBucketCreatePackedArray(DataBucket db,size_t *bytes,void **buf); 118*52849c42SDave May void DataBucketDestroyPackedArray(DataBucket db,void **buf); 119*52849c42SDave May void DataBucketFillPackedArray(DataBucket db,const int index,void *buf); 120*52849c42SDave May void DataBucketInsertPackedArray(DataBucket db,const int idx,void *data); 121*52849c42SDave May 122*52849c42SDave May 123*52849c42SDave May #endif 124*52849c42SDave May 125