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