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