xref: /petsc/src/dm/impls/composite/packimpl.h (revision 3c48a1e8da19189ff2402a4e41a2fc082d52c349)
1a12302e2SJed Brown #if !defined(_packimpl_h)
2a12302e2SJed Brown #define _packimpl_h
3a12302e2SJed Brown 
4*3c48a1e8SJed Brown #include <petscdmcomposite.h>    /*I "petscdmcomposite.h" I*/
5a12302e2SJed Brown #include <private/dmimpl.h>      /*I      "petscdm.h"     I*/
6a12302e2SJed Brown 
7a12302e2SJed Brown /*
8a12302e2SJed Brown    rstart is where an array/subvector starts in the global parallel vector, so arrays
9a12302e2SJed Brown    rstarts are meaningless (and set to the previous one) except on the processor where the array lives
10a12302e2SJed Brown */
11a12302e2SJed Brown 
12a12302e2SJed Brown typedef enum {DMCOMPOSITE_ARRAY, DMCOMPOSITE_DM} DMCompositeLinkType;
13a12302e2SJed Brown 
14a12302e2SJed Brown struct DMCompositeLink {
15a12302e2SJed Brown   DMCompositeLinkType    type;
16a12302e2SJed Brown   struct DMCompositeLink *next;
17a12302e2SJed Brown   PetscInt               n;             /* number of owned */
18a12302e2SJed Brown   PetscInt               rstart;        /* rstart is relative to this process */
19a12302e2SJed Brown   PetscInt               grstart;       /* grstart is relative to all processes */
20a12302e2SJed Brown   PetscInt               nlocal;
21a12302e2SJed Brown 
22a12302e2SJed Brown   /* only used for DMCOMPOSITE_DM */
23a12302e2SJed Brown   PetscInt               *grstarts;     /* global row for first unknown of this DM on each process */
24a12302e2SJed Brown   DM                     dm;
25a12302e2SJed Brown 
26a12302e2SJed Brown   /* only used for DMCOMPOSITE_ARRAY */
27a12302e2SJed Brown   PetscMPIInt            rank;          /* process where array unknowns live */
28a12302e2SJed Brown };
29a12302e2SJed Brown 
30a12302e2SJed Brown typedef struct {
31a12302e2SJed Brown   PetscInt               n,N,rstart;           /* rstart is relative to all processors, n unknowns owned by this process, N is total unknowns */
32a12302e2SJed Brown   PetscInt               nghost;               /* number of all local entries include DMDA ghost points and any shared redundant arrays */
33a12302e2SJed Brown   PetscInt               nDM,nredundant,nmine; /* how many DM's and seperate redundant arrays used to build DM(nmine is ones on this process) */
34a12302e2SJed Brown   PetscBool              setup;                /* after this is set, cannot add new links to the DM*/
35a12302e2SJed Brown   struct DMCompositeLink *next;
36a12302e2SJed Brown 
37a12302e2SJed Brown   PetscErrorCode (*FormCoupleLocations)(DM,Mat,PetscInt*,PetscInt*,PetscInt,PetscInt,PetscInt,PetscInt);
38a12302e2SJed Brown } DM_Composite;
39a12302e2SJed Brown 
4009573ac7SBarry Smith extern PetscErrorCode DMGetMatrix_Composite(DM,const MatType,Mat*);
41a12302e2SJed Brown 
42a12302e2SJed Brown #endif
43