152849c42SDave May 252849c42SDave May #ifndef __DATA_BUCKET_H__ 352849c42SDave May #define __DATA_BUCKET_H__ 452849c42SDave May 552849c42SDave May 652849c42SDave May #include <petsc.h> 752849c42SDave May 852849c42SDave May 952849c42SDave May #define DEFAULT -32654789 1052849c42SDave May 1152849c42SDave May #define DATAFIELD_POINT_ACCESS_GUARD 1252849c42SDave May 1352849c42SDave May /* Logging flag */ 1452849c42SDave May #define PTAT3D_LOG_DATA_BUCKET 1552849c42SDave May 1652849c42SDave May 1752849c42SDave May typedef enum { DATABUCKET_VIEW_STDOUT=0, DATABUCKET_VIEW_ASCII, DATABUCKET_VIEW_BINARY, DATABUCKET_VIEW_HDF5 } DataBucketViewType; 1852849c42SDave May 1952849c42SDave May typedef struct _p_DataField* DataField; 2052849c42SDave May typedef struct _p_DataBucket* DataBucket; 2152849c42SDave May 2252849c42SDave May 2352849c42SDave May struct _p_DataField { 2452849c42SDave May char *registeration_function; 25*5c18a9d6SDave May PetscInt L; 2652849c42SDave May PetscBool active; 2752849c42SDave May size_t atomic_size; 2852849c42SDave May char *name; /* what are they called */ 2952849c42SDave May void *data; /* the data - an array of structs */ 3052849c42SDave May }; 3152849c42SDave May 3252849c42SDave May struct _p_DataBucket { 33*5c18a9d6SDave May PetscInt L; /* number in use */ 34*5c18a9d6SDave May PetscInt buffer; /* memory buffer used for re-allocation */ 35*5c18a9d6SDave May PetscInt allocated; /* number allocated, this will equal datafield->L */ 3652849c42SDave May PetscBool finalised; /* DEPRECIATED */ 37*5c18a9d6SDave May PetscInt nfields; /* how many fields of this type */ 3852849c42SDave May DataField *field; /* the data */ 3952849c42SDave May }; 4052849c42SDave May 4152849c42SDave May #define ERROR() {\ 4252849c42SDave May printf("ERROR: %s() from line %d in %s !!\n", __FUNCTION__, __LINE__, __FILE__);\ 4352849c42SDave May exit(EXIT_FAILURE);\ 4452849c42SDave May } 4552849c42SDave May 4652849c42SDave May #define __DATATFIELD_point_access(data,index,atomic_size) (void*)((char*)(data) + (index)*(atomic_size)) 4752849c42SDave May #define __DATATFIELD_point_access_offset(data,index,atomic_size,offset) (void*)((char*)(data) + (index)*(atomic_size) + (offset)) 4852849c42SDave May 4952849c42SDave May 5052849c42SDave May 51*5c18a9d6SDave May void StringInList( const char name[], const PetscInt N, const DataField gfield[], PetscBool *val ); 52*5c18a9d6SDave May void StringFindInList( const char name[], const PetscInt N, const DataField gfield[], PetscInt *index ); 5352849c42SDave May 54*5c18a9d6SDave May void DataFieldCreate( const char registeration_function[], const char name[], const size_t size, const PetscInt L, DataField *DF ); 5552849c42SDave May void DataFieldDestroy( DataField *DF ); 5652849c42SDave May void DataBucketCreate( DataBucket *DB ); 5752849c42SDave May void DataBucketDestroy( DataBucket *DB ); 5852849c42SDave May void _DataBucketRegisterField( 5952849c42SDave May DataBucket db, 6052849c42SDave May const char registeration_function[], 6152849c42SDave May const char field_name[], 6252849c42SDave May size_t atomic_size, DataField *_gfield ); 6352849c42SDave May 6452849c42SDave May 6552849c42SDave May #define DataBucketRegisterField(db,name,size,k) {\ 6652849c42SDave May char *location;\ 6752849c42SDave May asprintf(&location,"Registered by %s() at line %d within file %s", __FUNCTION__, __LINE__, __FILE__);\ 6852849c42SDave May _DataBucketRegisterField( (db), location, (name), (size), (k) );\ 6952849c42SDave May free(location);\ 7052849c42SDave May } 7152849c42SDave May 72*5c18a9d6SDave May void DataFieldGetNumEntries(DataField df, PetscInt *sum); 73*5c18a9d6SDave May void DataFieldSetSize( DataField df, const PetscInt new_L ); 74*5c18a9d6SDave May void DataFieldZeroBlock( DataField df, const PetscInt start, const PetscInt end ); 7552849c42SDave May void DataFieldGetAccess( const DataField gfield ); 76*5c18a9d6SDave May void DataFieldAccessPoint( const DataField gfield, const PetscInt pid, void **ctx_p ); 77*5c18a9d6SDave May void DataFieldAccessPointOffset( const DataField gfield, const size_t offset, const PetscInt pid, void **ctx_p ); 7852849c42SDave May void DataFieldRestoreAccess( DataField gfield ); 7952849c42SDave May void DataFieldVerifyAccess( const DataField gfield, const size_t size); 8052849c42SDave May void DataFieldGetAtomicSize(const DataField gfield,size_t *size); 8152849c42SDave May 8252849c42SDave May void DataFieldGetEntries(const DataField gfield,void **data); 8352849c42SDave May void DataFieldRestoreEntries(const DataField gfield,void **data); 8452849c42SDave May 85*5c18a9d6SDave May void DataFieldInsertPoint( const DataField field, const PetscInt index, const void *ctx ); 86*5c18a9d6SDave May void DataFieldCopyPoint( const PetscInt pid_x, const DataField field_x, 87*5c18a9d6SDave May const PetscInt pid_y, const DataField field_y ); 88*5c18a9d6SDave May void DataFieldZeroPoint( const DataField field, const PetscInt index ); 8952849c42SDave May 9052849c42SDave May void DataBucketGetDataFieldByName(DataBucket db,const char name[],DataField *gfield); 9152849c42SDave May void DataBucketQueryDataFieldByName(DataBucket db,const char name[],PetscBool *found); 9252849c42SDave May void DataBucketFinalize(DataBucket db); 93*5c18a9d6SDave May void DataBucketSetInitialSizes( DataBucket db, const PetscInt L, const PetscInt buffer ); 94*5c18a9d6SDave May void DataBucketSetSizes( DataBucket db, const PetscInt L, const PetscInt buffer ); 95*5c18a9d6SDave May void DataBucketGetSizes( DataBucket db, PetscInt *L, PetscInt *buffer, PetscInt *allocated ); 96*5c18a9d6SDave May void DataBucketGetGlobalSizes(MPI_Comm comm, DataBucket db, PetscInt *L, PetscInt *buffer, PetscInt *allocated ); 97*5c18a9d6SDave May void DataBucketGetDataFields( DataBucket db, PetscInt *L, DataField *fields[] ); 9852849c42SDave May 99*5c18a9d6SDave May void DataBucketCopyPoint( const DataBucket xb, const PetscInt pid_x, 100*5c18a9d6SDave May const DataBucket yb, const PetscInt pid_y ); 101*5c18a9d6SDave May void DataBucketCreateFromSubset( DataBucket DBIn, const PetscInt N, const PetscInt list[], DataBucket *DB ); 102*5c18a9d6SDave May void DataBucketZeroPoint( const DataBucket db, const PetscInt index ); 10352849c42SDave May 10452849c42SDave May //void DataBucketLoadFromFile(const char filename[], DataBucketViewType type, DataBucket *db); 10552849c42SDave May void DataBucketLoadFromFile(MPI_Comm comm,const char filename[], DataBucketViewType type, DataBucket *db); 10652849c42SDave May //void DataBucketView(DataBucket db,const char filename[],DataBucketViewType type); 10752849c42SDave May void DataBucketView(MPI_Comm comm,DataBucket db,const char filename[],DataBucketViewType type); 10852849c42SDave May 10952849c42SDave May void DataBucketAddPoint( DataBucket db ); 11052849c42SDave May void DataBucketRemovePoint( DataBucket db ); 111*5c18a9d6SDave May void DataBucketRemovePointAtIndex( const DataBucket db, const PetscInt index ); 11252849c42SDave May 11352849c42SDave May void DataBucketDuplicateFields(DataBucket dbA,DataBucket *dbB); 11452849c42SDave May void DataBucketInsertValues(DataBucket db1,DataBucket db2); 11552849c42SDave May 11652849c42SDave May /* helpers for parallel send/recv */ 11752849c42SDave May void DataBucketCreatePackedArray(DataBucket db,size_t *bytes,void **buf); 11852849c42SDave May void DataBucketDestroyPackedArray(DataBucket db,void **buf); 119*5c18a9d6SDave May void DataBucketFillPackedArray(DataBucket db,const PetscInt index,void *buf); 120*5c18a9d6SDave May void DataBucketInsertPackedArray(DataBucket db,const PetscInt idx,void *data); 12152849c42SDave May 12252849c42SDave May 12352849c42SDave May #endif 12452849c42SDave May 125