Actual source code: dmnetworkimpl.h

      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: typedef struct _p_DMNetworkComponentHeader *DMNetworkComponentHeader;
     10: struct _p_DMNetworkComponentHeader {
     11:   PetscInt index;    /* index for user input global edge and vertex */
     12:   PetscInt subnetid; /* Id for subnetwork */
     13:   PetscInt ndata;    /* number of components */
     14:   PetscInt hsize;    /* Size of the header */
     15:   PetscInt maxcomps; /* Maximum components at this point (ndata <= maxcomps). maxcomps
     16:                         is set initially to a default value and is incremented every time
     17:                         ndata exceeds maxcomps */
     18:   /* The following arrays store the different attributes for each component at the given point.
     19:      The length of these arrays equals maxcomps. The arrays are resized every time
     20:      ndata exceeds maxcomps
     21:   */
     22:   PetscInt *size;    /* component data struct sizes */
     23:   PetscInt *key;     /* component keys */
     24:   PetscInt *offset;  /* component offset in the vector */
     25:   PetscInt *nvar;    /* number of variabes for the component */
     26:   PetscInt *offsetvarrel; /* relative offset from the first component at this point */
     27: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));

     29: typedef struct _p_DMNetworkComponentValue *DMNetworkComponentValue;
     30: struct _p_DMNetworkComponentValue {
     31:   void* *data;
     32: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));

     34: typedef struct {
     35:   char     name[32-sizeof(PetscInt)];
     36:   PetscInt size;
     37: } DMNetworkComponent PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));

     39: /* Indexing data structures for vertex and edges */
     40: typedef struct {
     41:   PetscSection                      DofSection;
     42:   PetscSection                      GlobalDofSection;
     43:   ISLocalToGlobalMapping            mapping;
     44:   PetscSF                           sf;
     45: } DMNetworkVertexInfo;

     47: typedef struct {
     48:   PetscSection                      DofSection;
     49:   PetscSection                      GlobalDofSection;
     50:   ISLocalToGlobalMapping            mapping;
     51:   PetscSF                           sf;
     52: } DMNetworkEdgeInfo;

     54: /*
     55:   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).
     56:   sv is organized as (see SVtxCreate())
     57:         sv(net[0],idx[0]) --> sv(net[1],idx[1])
     58:                           --> sv(net[1],idx[1])
     59:                           ...
     60:                           --> sv(net[n-1],idx[n-1])
     61:         and net[0] < net[1] < ... < net[n-1]
     62:         where sv[0] has SVFROM type, sv[i], i>0, has SVTO type.
     63: */
     64: typedef struct {
     65:   PetscInt gidx;                /* global index of the shared vertices in dmplex */
     66:   PetscInt n;                   /* number of subnetworks that share the common DMNetwork vertex */
     67:   PetscInt *sv;                 /* array of size n: sv[2*i,2*i+1]=(net[i], idx[i]), i=0,...,n-1 */
     68: } SVtx;
     69: typedef enum {SVNONE=-1, SVFROM=0, SVTO=1} SVtxType;

     71: typedef struct {
     72:   PetscInt  Nvtx, nvtx;     /* Number of global/local vertices */
     73:   PetscInt  Nedge,nedge;    /* Number of global/local edges */
     74:   PetscInt  eStart, eEnd;   /* Range of edge numbers (start, end+1) */
     75:   PetscInt  vStart, vEnd;   /* Range of vertex numbers (start, end+1) */
     76:   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 */
     77:   PetscInt  *vertices;      /* Vertices for this subnetwork. These are mapped to the vertex numbers for the whole network */
     78:   PetscInt  *edges;         /* Edges for this subnetwork. These are mapped to the edge numbers for the whole network */
     79:   char      name[32-sizeof(PetscInt)];
     80: } DMSubnetwork;

     82: typedef struct {
     83:   PetscInt                          refct;               /* reference count */
     84:   PetscInt                          NEdges,nEdges;       /* Number of global/local edges */
     85:   PetscInt                          NVertices,nVertices; /* Number of global/local vertices */
     86:   PetscInt                          pStart,pEnd;         /* Start and end indices for topological points */
     87:   PetscInt                          vStart,vEnd;         /* Start and end indices for vertices */
     88:   PetscInt                          eStart,eEnd;         /* Start and end indices for edges */
     89:   DM                                plex;                /* DM created from Plex */
     90:   PetscSection                      DataSection;         /* Section for managing parameter distribution */
     91:   PetscSection                      DofSection;          /* Section for managing data distribution */
     92:   PetscSection                      GlobalDofSection;    /* Global Dof section */
     93:   PetscBool                         distributecalled;    /* Flag if DMNetworkDistribute() is called */
     94:   PetscInt                          *vltog;              /* Maps vertex local ordering to global ordering, include ghost vertices */

     96:   DMNetworkVertexInfo               vertex;
     97:   DMNetworkEdgeInfo                 edge;

     99:   PetscInt                          ncomponent;  /* Number of components that have been registered */
    100:   DMNetworkComponent                *component; /* List of components that have been registered */
    101:   DMNetworkComponentHeader          header;
    102:   DMNetworkComponentValue           cvalue;
    103:   DMNetworkComponentGenericDataType *componentdataarray; /* Array to hold the data */

    105:   PetscInt                          nsubnet,Nsubnet; /* Local and global number of subnetworks */
    106:   DMSubnetwork                      *subnet;         /* Subnetworks */
    107:   PetscInt                          *subnetvtx,*subnetedge; /* Maps local vertex/edge to local subnetwork's vertex/edge */
    108:   SVtx                              *svtx;           /* Array of vertices shared by subnetworks */
    109:   PetscInt                          nsvtx,Nsvtx;     /* Local and global num of entries in svtx */
    110:   PetscInt                          *svertices;      /* Array of local subnetwork vertices that are merged/shared */
    111:   PetscInt                          *sedgelist;      /* Edge list of shared vertices */
    112:   PetscTable                        svtable;         /* hash table for finding shared vertex info */

    114:   PetscBool                         userEdgeJacobian,userVertexJacobian;  /* Global flag for using user's sub Jacobians */
    115:   Mat                               *Je;  /* Pointer array to hold local sub Jacobians for edges, 3 elements for an edge */
    116:   Mat                               *Jv;  /* Pointer array to hold local sub Jacobians for vertices, 1+2*nsupportedges for a vertex */
    117:   PetscInt                          *Jvptr;   /* index of Jv for v-th vertex
    118:                                               Jvpt[v-vStart]:    Jacobian(v,v)
    119:                                               Jvpt[v-vStart]+2i+1: Jacobian(v,e[i]),   e[i]: i-th supporting edge
    120:                                               Jvpt[v-vStart]+2i+2: Jacobian(v,vc[i]), vc[i]: i-th connected vertex
    121:                                               */
    122:   PetscInt                          max_comps_registered; /* Max. number of components that can be registered */
    123: } DM_Network;

    125: #endif /* _NETWORKIMPL_H */