xref: /petsc/src/dm/impls/swarm/data_bucket.h (revision 5c18a9d6df074311e0190533f80a7b3fbef8b03a)
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