xref: /petsc/src/dm/impls/swarm/data_bucket.h (revision 502a2867ed8f1e5015efbc8078522ee2a4bcc95e)
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 __DATATFIELD_point_access(data,index,atomic_size) (void*)((char*)(data) + (index)*(atomic_size))
40 #define __DATATFIELD_point_access_offset(data,index,atomic_size,offset) (void*)((char*)(data) + (index)*(atomic_size) + (offset))
41 
42 
43 
44 PetscErrorCode StringInList(const char name[],const PetscInt N,const DataField gfield[],PetscBool *val);
45 PetscErrorCode StringFindInList(const char name[],const PetscInt N,const DataField gfield[],PetscInt *index);
46 
47 PetscErrorCode DataFieldCreate(const char registeration_function[],const char name[],const size_t size,const PetscInt L,DataField *DF);
48 PetscErrorCode DataFieldDestroy(DataField *DF);
49 PetscErrorCode DataBucketCreate(DataBucket *DB);
50 PetscErrorCode DataBucketDestroy(DataBucket *DB);
51 PetscErrorCode DataBucketRegisterField(
52 															DataBucket db,
53 															const char registeration_function[],
54 															const char field_name[],
55 															size_t atomic_size,DataField *_gfield );
56 
57 
58 PetscErrorCode DataFieldGetNumEntries(DataField df,PetscInt *sum);
59 PetscErrorCode DataFieldSetSize(DataField df,const PetscInt new_L);
60 PetscErrorCode DataFieldZeroBlock(DataField df,const PetscInt start,const PetscInt end);
61 PetscErrorCode DataFieldGetAccess(const DataField gfield);
62 PetscErrorCode DataFieldAccessPoint(const DataField gfield,const PetscInt pid,void **ctx_p);
63 PetscErrorCode DataFieldAccessPointOffset(const DataField gfield,const size_t offset,const PetscInt pid,void **ctx_p);
64 PetscErrorCode DataFieldRestoreAccess(DataField gfield);
65 PetscErrorCode DataFieldVerifyAccess(const DataField gfield,const size_t size);
66 PetscErrorCode DataFieldGetAtomicSize(const DataField gfield,size_t *size);
67 
68 PetscErrorCode DataFieldGetEntries(const DataField gfield,void **data);
69 PetscErrorCode DataFieldRestoreEntries(const DataField gfield,void **data);
70 
71 PetscErrorCode DataFieldInsertPoint(const DataField field,const PetscInt index,const void *ctx);
72 PetscErrorCode DataFieldCopyPoint(const PetscInt pid_x,const DataField field_x,const PetscInt pid_y,const DataField field_y);
73 PetscErrorCode DataFieldZeroPoint(const DataField field,const PetscInt index);
74 
75 PetscErrorCode DataBucketGetDataFieldByName(DataBucket db,const char name[],DataField *gfield);
76 PetscErrorCode DataBucketQueryDataFieldByName(DataBucket db,const char name[],PetscBool *found);
77 PetscErrorCode DataBucketFinalize(DataBucket db);
78 PetscErrorCode DataBucketSetInitialSizes(DataBucket db,const PetscInt L,const PetscInt buffer);
79 PetscErrorCode DataBucketSetSizes(DataBucket db,const PetscInt L,const PetscInt buffer);
80 PetscErrorCode DataBucketGetSizes(DataBucket db,PetscInt *L,PetscInt *buffer,PetscInt *allocated);
81 PetscErrorCode DataBucketGetGlobalSizes(MPI_Comm comm,DataBucket db,PetscInt *L,PetscInt *buffer,PetscInt *allocated);
82 PetscErrorCode DataBucketGetDataFields(DataBucket db,PetscInt *L,DataField *fields[]);
83 
84 PetscErrorCode DataBucketCopyPoint(const DataBucket xb,const PetscInt pid_x,const DataBucket yb,const PetscInt pid_y);
85 PetscErrorCode DataBucketCreateFromSubset(DataBucket DBIn,const PetscInt N,const PetscInt list[],DataBucket *DB);
86 PetscErrorCode DataBucketZeroPoint(const DataBucket db,const PetscInt index);
87 
88 //PetscErrorCode DataBucketLoadFromFile(const char filename[],DataBucketViewType type,DataBucket *db);
89 PetscErrorCode DataBucketLoadFromFile(MPI_Comm comm,const char filename[],DataBucketViewType type,DataBucket *db);
90 //PetscErrorCode DataBucketView(DataBucket db,const char filename[],DataBucketViewType type);
91 PetscErrorCode DataBucketView(MPI_Comm comm,DataBucket db,const char filename[],DataBucketViewType type);
92 
93 PetscErrorCode DataBucketAddPoint(DataBucket db);
94 PetscErrorCode DataBucketRemovePoint(DataBucket db);
95 PetscErrorCode DataBucketRemovePointAtIndex(const DataBucket db,const PetscInt index);
96 
97 PetscErrorCode DataBucketDuplicateFields(DataBucket dbA,DataBucket *dbB);
98 PetscErrorCode DataBucketInsertValues(DataBucket db1,DataBucket db2);
99 
100 /* helpers for parallel send/recv */
101 PetscErrorCode DataBucketCreatePackedArray(DataBucket db,size_t *bytes,void **buf);
102 PetscErrorCode DataBucketDestroyPackedArray(DataBucket db,void **buf);
103 PetscErrorCode DataBucketFillPackedArray(DataBucket db,const PetscInt index,void *buf);
104 PetscErrorCode DataBucketInsertPackedArray(DataBucket db,const PetscInt idx,void *data);
105 
106 
107 #endif
108 
109