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