1: #if !defined(_NETWORKIMPL_H)
2: #define _NETWORKIMPL_H 4: #include <petscmat.h> 5: #include <petscdmnetwork.h> 6: #include <petsc/private/dmpleximpl.h> 7: #include <petscctable.h> 9: /* The maximum number of components registered and maximum number of components per network point */
10: #define MAX_NETCOMPONENTS 36 12: typedef struct _p_DMNetworkComponentHeader *DMNetworkComponentHeader;
13: struct _p_DMNetworkComponentHeader {
14: PetscInt index; /* index for user input global edge and vertex */
15: PetscInt subnetid; /* Id for subnetwork */
16: PetscInt ndata; /* number of components */
17: PetscInt size[MAX_NETCOMPONENTS];
18: PetscInt key[MAX_NETCOMPONENTS];
19: PetscInt offset[MAX_NETCOMPONENTS];
20: PetscInt nvar[MAX_NETCOMPONENTS]; /* Number of variables */
21: PetscInt offsetvarrel[MAX_NETCOMPONENTS]; /* offset from the first variable of the network point */
22: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));
24: typedef struct _p_DMNetworkComponentValue *DMNetworkComponentValue;
25: struct _p_DMNetworkComponentValue {
26: void* data[MAX_NETCOMPONENTS];
27: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));
29: typedef struct {
30: char name[32-sizeof(PetscInt)];
31: PetscInt size;
32: } DMNetworkComponent PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));
34: /* Indexing data structures for vertex and edges */
35: typedef struct {
36: PetscSection DofSection;
37: PetscSection GlobalDofSection;
38: ISLocalToGlobalMapping mapping;
39: PetscSF sf;
40: } DMNetworkVertexInfo;
42: typedef struct {
43: PetscSection DofSection;
44: PetscSection GlobalDofSection;
45: ISLocalToGlobalMapping mapping;
46: PetscSF sf;
47: } DMNetworkEdgeInfo;
49: /*
50: Shared vertex - a vertex in DMNetwork that is shared by 2 or more subnetworks. sv provides the mapping from the subnetwork vertices to the global DMNetwork vertex (merged network).
51: sv is organized as (see SVtxCreate())
52: sv(net[0],idx[0]) --> sv(net[1],idx[1])
53: --> sv(net[1],idx[1])
54: ...
55: --> sv(net[n-1],idx[n-1])
56: and net[0] < net[1] < ... < net[n-1]
57: where sv[0] has SVFROM type, sv[i], i>0, has SVTO type.
58: */
59: typedef struct {
60: PetscInt gidx; /* global index of the shared vertices in dmplex */
61: PetscInt n; /* number of subnetworks that share the common DMNetwork vertex */
62: PetscInt *sv; /* array of size n: sv[2*i,2*i+1]=(net[i], idx[i]), i=0,...,n-1 */
63: } SVtx;
64: typedef enum {SVNONE=-1, SVFROM=0, SVTO=1} SVtxType;
66: typedef struct {
67: PetscInt Nvtx, nvtx; /* Number of global/local vertices */
68: PetscInt Nedge,nedge; /* Number of global/local edges */
69: PetscInt eStart, eEnd; /* Range of edge numbers (start, end+1) */
70: PetscInt vStart, vEnd; /* Range of vertex numbers (start, end+1) */
71: PetscInt *edgelist; /* User provided list of edges. Each edge has the format [from to] where from and to are the vertices covering the edge in the subnet numbering */
72: PetscInt *vertices; /* Vertices for this subnetwork. These are mapped to the vertex numbers for the whole network */
73: PetscInt *edges; /* Edges for this subnetwork. These are mapped to the edge numbers for the whole network */
74: char name[32-sizeof(PetscInt)];
75: } DMSubnetwork;
77: typedef struct {
78: PetscInt refct; /* reference count */
79: PetscInt NEdges,nEdges; /* Number of global/local edges */
80: PetscInt NVertices,nVertices; /* Number of global/local vertices */
81: PetscInt pStart,pEnd; /* Start and end indices for topological points */
82: PetscInt vStart,vEnd; /* Start and end indices for vertices */
83: PetscInt eStart,eEnd; /* Start and end indices for edges */
84: DM plex; /* DM created from Plex */
85: PetscSection DataSection; /* Section for managing parameter distribution */
86: PetscSection DofSection; /* Section for managing data distribution */
87: PetscSection GlobalDofSection; /* Global Dof section */
88: PetscBool distributecalled; /* Flag if DMNetworkDistribute() is called */
89: PetscInt *vltog; /* Maps vertex local ordering to global ordering, include ghost vertices */
91: DMNetworkVertexInfo vertex;
92: DMNetworkEdgeInfo edge;
94: PetscInt ncomponent; /* Number of components */
95: DMNetworkComponent component[MAX_NETCOMPONENTS]; /* List of components */
96: DMNetworkComponentHeader header;
97: DMNetworkComponentValue cvalue;
98: PetscInt dataheadersize;
99: DMNetworkComponentGenericDataType *componentdataarray; /* Array to hold the data */
101: PetscInt nsubnet,Nsubnet; /* Local and global number of subnetworks */
102: DMSubnetwork *subnet; /* Subnetworks */
103: PetscInt *subnetvtx; /* Maps local vertex to local subnetwork's vertex */
104: SVtx *svtx; /* Array of vertices shared by subnetworks */
105: PetscInt nsvtx,Nsvtx; /* Local and global num of entries in svtx */
106: PetscInt *svertices; /* Array of local subnetwork vertices that are merged/shared */
107: PetscInt *sedgelist; /* Edge list of shared vertices */
108: PetscTable svtable; /* hash table for finding shared vertex info */
110: PetscBool userEdgeJacobian,userVertexJacobian; /* Global flag for using user's sub Jacobians */
111: Mat *Je; /* Pointer array to hold local sub Jacobians for edges, 3 elements for an edge */
112: Mat *Jv; /* Pointer array to hold local sub Jacobians for vertices, 1+2*nsupportedges for a vertex */
113: PetscInt *Jvptr; /* index of Jv for v-th vertex
114: Jvpt[v-vStart]: Jacobian(v,v)
115: Jvpt[v-vStart]+2i+1: Jacobian(v,e[i]), e[i]: i-th supporting edge
116: Jvpt[v-vStart]+2i+2: Jacobian(v,vc[i]), vc[i]: i-th connected vertex
117: */
118: } DM_Network;
120: #endif /* _NETWORKIMPL_H */