152849c42SDave May 252849c42SDave May #ifndef __DATA_BUCKET_H__ 352849c42SDave May #define __DATA_BUCKET_H__ 452849c42SDave May 552849c42SDave May 652849c42SDave May #include <petsc.h> 74b46c5e1SDave May #include <petsc/private/dmswarmimpl.h> /*I "petscdmswarm.h" I*/ 852849c42SDave May 952849c42SDave May 1052849c42SDave May #define DATAFIELD_POINT_ACCESS_GUARD 1152849c42SDave May 1252849c42SDave May /* Logging flag */ 134b46c5e1SDave May #define DATA_BUCKET_LOG 1452849c42SDave May 1552849c42SDave May 1652849c42SDave May typedef enum { DATABUCKET_VIEW_STDOUT=0, DATABUCKET_VIEW_ASCII, DATABUCKET_VIEW_BINARY, DATABUCKET_VIEW_HDF5 } DataBucketViewType; 1752849c42SDave May 1852849c42SDave May 1952849c42SDave May 2052849c42SDave May struct _p_DataField { 2152849c42SDave May char *registeration_function; 225c18a9d6SDave May PetscInt L; 2352849c42SDave May PetscBool active; 2452849c42SDave May size_t atomic_size; 2552849c42SDave May char *name; /* what are they called */ 2652849c42SDave May void *data; /* the data - an array of structs */ 274b46c5e1SDave May PetscDataType petsc_type; 2852849c42SDave May }; 2952849c42SDave May 3052849c42SDave May struct _p_DataBucket { 315c18a9d6SDave May PetscInt L; /* number in use */ 325c18a9d6SDave May PetscInt buffer; /* memory buffer used for re-allocation */ 335c18a9d6SDave May PetscInt allocated; /* number allocated, this will equal datafield->L */ 3452849c42SDave May PetscBool finalised; /* DEPRECIATED */ 355c18a9d6SDave May PetscInt nfields; /* how many fields of this type */ 3652849c42SDave May DataField *field; /* the data */ 3752849c42SDave May }; 3852849c42SDave May 3952849c42SDave May #define ERROR() {\ 4052849c42SDave May printf("ERROR: %s() from line %d in %s !!\n", __FUNCTION__, __LINE__, __FILE__);\ 4152849c42SDave May exit(EXIT_FAILURE);\ 4252849c42SDave May } 4352849c42SDave May 4452849c42SDave May #define __DATATFIELD_point_access(data,index,atomic_size) (void*)((char*)(data) + (index)*(atomic_size)) 4552849c42SDave May #define __DATATFIELD_point_access_offset(data,index,atomic_size,offset) (void*)((char*)(data) + (index)*(atomic_size) + (offset)) 4652849c42SDave May 4752849c42SDave May 4852849c42SDave May 492eac95f8SDave May PetscErrorCode StringInList( const char name[], const PetscInt N, const DataField gfield[], PetscBool *val ); 502eac95f8SDave May PetscErrorCode StringFindInList( const char name[], const PetscInt N, const DataField gfield[], PetscInt *index ); 5152849c42SDave May 522eac95f8SDave May PetscErrorCode DataFieldCreate( const char registeration_function[], const char name[], const size_t size, const PetscInt L, DataField *DF ); 532eac95f8SDave May PetscErrorCode DataFieldDestroy( DataField *DF ); 542eac95f8SDave May PetscErrorCode DataBucketCreate( DataBucket *DB ); 552eac95f8SDave May PetscErrorCode DataBucketDestroy( DataBucket *DB ); 562eac95f8SDave May PetscErrorCode DataBucketRegisterField( 5752849c42SDave May DataBucket db, 5852849c42SDave May const char registeration_function[], 5952849c42SDave May const char field_name[], 6052849c42SDave May size_t atomic_size, DataField *_gfield ); 6152849c42SDave May 6252849c42SDave May 63*7fbf63aeSDave May PetscErrorCode DataFieldGetNumEntries(DataField df, PetscInt *sum); 64*7fbf63aeSDave May PetscErrorCode DataFieldSetSize( DataField df, const PetscInt new_L ); 65*7fbf63aeSDave May PetscErrorCode DataFieldZeroBlock( DataField df, const PetscInt start, const PetscInt end ); 66*7fbf63aeSDave May PetscErrorCode DataFieldGetAccess( const DataField gfield ); 67*7fbf63aeSDave May PetscErrorCode DataFieldAccessPoint( const DataField gfield, const PetscInt pid, void **ctx_p ); 68*7fbf63aeSDave May PetscErrorCode DataFieldAccessPointOffset( const DataField gfield, const size_t offset, const PetscInt pid, void **ctx_p ); 69*7fbf63aeSDave May PetscErrorCode DataFieldRestoreAccess( DataField gfield ); 70*7fbf63aeSDave May PetscErrorCode DataFieldVerifyAccess( const DataField gfield, const size_t size); 71*7fbf63aeSDave May PetscErrorCode DataFieldGetAtomicSize(const DataField gfield,size_t *size); 7252849c42SDave May 73*7fbf63aeSDave May PetscErrorCode DataFieldGetEntries(const DataField gfield,void **data); 74*7fbf63aeSDave May PetscErrorCode DataFieldRestoreEntries(const DataField gfield,void **data); 7552849c42SDave May 76*7fbf63aeSDave May PetscErrorCode DataFieldInsertPoint( const DataField field, const PetscInt index, const void *ctx ); 77*7fbf63aeSDave May PetscErrorCode DataFieldCopyPoint( const PetscInt pid_x, const DataField field_x, 785c18a9d6SDave May const PetscInt pid_y, const DataField field_y ); 79*7fbf63aeSDave May PetscErrorCode DataFieldZeroPoint( const DataField field, const PetscInt index ); 8052849c42SDave May 812eac95f8SDave May PetscErrorCode DataBucketGetDataFieldByName(DataBucket db,const char name[],DataField *gfield); 82*7fbf63aeSDave May PetscErrorCode DataBucketQueryDataFieldByName(DataBucket db,const char name[],PetscBool *found); 83*7fbf63aeSDave May PetscErrorCode DataBucketFinalize(DataBucket db); 84*7fbf63aeSDave May PetscErrorCode DataBucketSetInitialSizes( DataBucket db, const PetscInt L, const PetscInt buffer ); 85*7fbf63aeSDave May PetscErrorCode DataBucketSetSizes( DataBucket db, const PetscInt L, const PetscInt buffer ); 86*7fbf63aeSDave May PetscErrorCode DataBucketGetSizes( DataBucket db, PetscInt *L, PetscInt *buffer, PetscInt *allocated ); 87*7fbf63aeSDave May PetscErrorCode DataBucketGetGlobalSizes(MPI_Comm comm, DataBucket db, PetscInt *L, PetscInt *buffer, PetscInt *allocated ); 88*7fbf63aeSDave May PetscErrorCode DataBucketGetDataFields( DataBucket db, PetscInt *L, DataField *fields[] ); 8952849c42SDave May 90*7fbf63aeSDave May PetscErrorCode DataBucketCopyPoint( const DataBucket xb, const PetscInt pid_x, 915c18a9d6SDave May const DataBucket yb, const PetscInt pid_y ); 92*7fbf63aeSDave May PetscErrorCode DataBucketCreateFromSubset( DataBucket DBIn, const PetscInt N, const PetscInt list[], DataBucket *DB ); 93*7fbf63aeSDave May PetscErrorCode DataBucketZeroPoint( const DataBucket db, const PetscInt index ); 9452849c42SDave May 95*7fbf63aeSDave May //PetscErrorCode DataBucketLoadFromFile(const char filename[], DataBucketViewType type, DataBucket *db); 96*7fbf63aeSDave May PetscErrorCode DataBucketLoadFromFile(MPI_Comm comm,const char filename[], DataBucketViewType type, DataBucket *db); 97*7fbf63aeSDave May //PetscErrorCode DataBucketView(DataBucket db,const char filename[],DataBucketViewType type); 98*7fbf63aeSDave May PetscErrorCode DataBucketView(MPI_Comm comm,DataBucket db,const char filename[],DataBucketViewType type); 9952849c42SDave May 100*7fbf63aeSDave May PetscErrorCode DataBucketAddPoint( DataBucket db ); 101*7fbf63aeSDave May PetscErrorCode DataBucketRemovePoint( DataBucket db ); 102*7fbf63aeSDave May PetscErrorCode DataBucketRemovePointAtIndex( const DataBucket db, const PetscInt index ); 10352849c42SDave May 104*7fbf63aeSDave May PetscErrorCode DataBucketDuplicateFields(DataBucket dbA,DataBucket *dbB); 105*7fbf63aeSDave May PetscErrorCode DataBucketInsertValues(DataBucket db1,DataBucket db2); 10652849c42SDave May 10752849c42SDave May /* helpers for parallel send/recv */ 108*7fbf63aeSDave May PetscErrorCode DataBucketCreatePackedArray(DataBucket db,size_t *bytes,void **buf); 109*7fbf63aeSDave May PetscErrorCode DataBucketDestroyPackedArray(DataBucket db,void **buf); 110*7fbf63aeSDave May PetscErrorCode DataBucketFillPackedArray(DataBucket db,const PetscInt index,void *buf); 111*7fbf63aeSDave May PetscErrorCode DataBucketInsertPackedArray(DataBucket db,const PetscInt idx,void *data); 11252849c42SDave May 11352849c42SDave May 11452849c42SDave May #endif 11552849c42SDave May 116