xref: /petsc/include/petsc/private/characteristicimpl.h (revision 2b338477d770c45a88d8c20a3ee06ef156cc4d7c)
1 #pragma once
2 
3 #include <petsccharacteristic.h>
4 #include <petsc/private/petscimpl.h>
5 
6 /* Logging support */
7 PETSC_EXTERN PetscClassId   CHARACTERISTIC_CLASSID;
8 PETSC_EXTERN PetscBool      CharacteristicRegisterAllCalled;
9 PETSC_EXTERN PetscErrorCode CharacteristicRegisterAll(void);
10 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_SetUp;
11 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_Solve;
12 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_QueueSetup;
13 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_DAUpdate;
14 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_HalfTimeLocal;
15 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_HalfTimeRemote;
16 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_HalfTimeExchange;
17 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_FullTimeLocal;
18 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_FullTimeRemote;
19 PETSC_EXTERN PetscLogEvent  CHARACTERISTIC_FullTimeExchange;
20 
21 #define MAX_COMPONENTS 10
22 
23 typedef struct _p_Item {
24   PetscMPIInt proc;                  /* Relative processor from which data is required (mapped to absolute by neighbors) */
25   PetscInt    i, j;                  /* The vertex for which we need field values */
26   PetscScalar x, y;                  /* Coordinates of a point on the characteristic */
27   PetscScalar u, v;                  /* Velocity of a point on the characteristic */
28   PetscScalar field[MAX_COMPONENTS]; /* Field being advected */
29 } CharacteristicPointDA2D;
30 
31 typedef CharacteristicPointDA2D *Queue;
32 
33 struct _CharacteristicOps {
34   PetscErrorCode (*view)(Characteristic, PetscViewer);
35   PetscErrorCode (*destroy)(Characteristic);
36   PetscErrorCode (*setup)(Characteristic);
37 };
38 
39 struct _p_Characteristic {
40   PETSCHEADER(struct _CharacteristicOps);
41   PetscBool setupcalled; /* true if setup has been called */
42   PetscBool structured;  /* Flag for mesh type */
43   int       numIds;      /* Number of integers necessary to identify a mesh element (from problem dimension) */
44   /* Velocity interpolation structures */
45   DM        velocityDA;      /* DM for the velocity field */
46   Vec       velocity;        /* Velocity field at t_n */
47   Vec       velocityOld;     /* Velocity field at t_n-1 */
48   PetscInt  numVelocityComp; /* Number of velocity components (should be the mesh dimension) */
49   PetscInt *velocityComp;    /* Components of the velocity in the DM */
50   PetscErrorCode (*velocityInterp)(Vec, PetscReal[], PetscInt, PetscInt[], PetscScalar[], void *);
51   PetscErrorCode (*velocityInterpLocal)(void *, PetscReal[], PetscInt, PetscInt[], PetscScalar[], void *);
52   void *velocityCtx; /* User context for velocity inteprolation */
53   /* Field interpolation structures */
54   DM        fieldDA;      /* DM for the field field */
55   Vec       field;        /* Field field at t_n */
56   Vec       fieldOld;     /* Field field at t_n-1 */
57   PetscInt  numFieldComp; /* Number of field components (should be the mesh dimension) */
58   PetscInt *fieldComp;    /* Components of the field in the DM */
59   PetscErrorCode (*fieldInterp)(Vec, PetscReal[], PetscInt, PetscInt[], PetscScalar[], void *);
60   PetscErrorCode (*fieldInterpLocal)(void *, PetscReal[], PetscInt, PetscInt[], PetscScalar[], void *);
61   void *fieldCtx; /* User context for field inteprolation */
62   /* Communication structures*/
63   MPI_Datatype itemType; /* Type corresponding to the item struct */
64   Queue        queue;
65   PetscInt     queueSize;
66   PetscInt     queueMax;
67   Queue        queueLocal; /* Queue of Items to receive from other processes */
68   PetscInt     queueLocalSize;
69   PetscInt     queueLocalMax;
70   Queue        queueRemote; /* Queue of Items to send to other processes */
71   PetscInt     queueRemoteSize;
72   PetscInt     queueRemoteMax;
73   PetscMPIInt  numNeighbors;  /* Number of neighboring processes */
74   PetscMPIInt *neighbors;     /* Ranks of neighbors */
75   PetscInt    *needCount;     /* Number of Items requested from other processes */
76   PetscInt    *localOffsets;  /* Offset into queue for each process (Prefix sums of need_count) */
77   PetscInt    *fillCount;     /* Number of Items requested by other processes */
78   PetscInt    *remoteOffsets; /* Offset into remote queue for each process (Prefix sums of fill_count) */
79   MPI_Request *request;       /* Requests for sizes/velocities/fields from other processes */
80   MPI_Status  *status;        /* Status structures for the persistent requests */
81   void        *data;          /* Holder for implementation class */
82 };
83 
84 PETSC_EXTERN PetscErrorCode CharacteristicSetNeighbors(Characteristic, PetscInt, PetscMPIInt[]);
85 PETSC_EXTERN PetscErrorCode CharacteristicAddPoint(Characteristic, CharacteristicPointDA2D *);
86 PETSC_EXTERN PetscErrorCode CharacteristicSendCoordinatesBegin(Characteristic);
87 PETSC_EXTERN PetscErrorCode CharacteristicSendCoordinatesEnd(Characteristic);
88 PETSC_EXTERN PetscErrorCode CharacteristicGetValuesBegin(Characteristic);
89 PETSC_EXTERN PetscErrorCode CharacteristicGetValuesEnd(Characteristic);
90