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