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