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