xref: /petsc/src/ts/characteristic/impls/da/slda.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
130a76a96SBarry Smith #include <../src/ts/characteristic/impls/da/slda.h> /*I  "petsccharacteristic.h"  I*/
21e25c274SJed Brown #include <petscdmda.h>
3665c2dedSJed Brown #include <petscviewer.h>
4af33a6ddSJed Brown 
5*9371c9d4SSatish Balay PetscErrorCode CharacteristicView_DA(Characteristic c, PetscViewer viewer) {
6af33a6ddSJed Brown   Characteristic_DA *da = (Characteristic_DA *)c->data;
7af33a6ddSJed Brown   PetscBool          iascii, isstring;
8af33a6ddSJed Brown 
9af33a6ddSJed Brown   PetscFunctionBegin;
10af33a6ddSJed Brown   /* Pull out field names from DM */
119566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
129566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
13af33a6ddSJed Brown   if (iascii) {
1463a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  DMDA: dummy=%" PetscInt_FMT "\n", da->dummy));
15af33a6ddSJed Brown   } else if (isstring) {
1663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerStringSPrintf(viewer, "dummy %" PetscInt_FMT, da->dummy));
17af33a6ddSJed Brown   }
18af33a6ddSJed Brown   PetscFunctionReturn(0);
19af33a6ddSJed Brown }
20af33a6ddSJed Brown 
21*9371c9d4SSatish Balay PetscErrorCode CharacteristicDestroy_DA(Characteristic c) {
22af33a6ddSJed Brown   Characteristic_DA *da = (Characteristic_DA *)c->data;
23af33a6ddSJed Brown 
24af33a6ddSJed Brown   PetscFunctionBegin;
259566063dSJacob Faibussowitsch   PetscCall(PetscFree(da));
26af33a6ddSJed Brown   PetscFunctionReturn(0);
27af33a6ddSJed Brown }
28af33a6ddSJed Brown 
29*9371c9d4SSatish Balay PetscErrorCode CharacteristicSetUp_DA(Characteristic c) {
30af33a6ddSJed Brown   PetscMPIInt  blockLen[2];
31af33a6ddSJed Brown   MPI_Aint     indices[2];
32af33a6ddSJed Brown   MPI_Datatype oldtypes[2];
33af33a6ddSJed Brown   PetscInt     dim, numValues;
34af33a6ddSJed Brown 
359566063dSJacob Faibussowitsch   PetscCall(DMDAGetInfo(c->velocityDA, &dim, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
36af33a6ddSJed Brown   if (c->structured) c->numIds = dim;
37af33a6ddSJed Brown   else c->numIds = 3;
3863a3b9bcSJacob Faibussowitsch   PetscCheck(c->numFieldComp <= MAX_COMPONENTS, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The maximum number of fields allowed is %d, you have %" PetscInt_FMT ". You can recompile after increasing MAX_COMPONENTS.", MAX_COMPONENTS, c->numFieldComp);
39af33a6ddSJed Brown   numValues = 4 + MAX_COMPONENTS;
40af33a6ddSJed Brown 
41af33a6ddSJed Brown   /* Create new MPI datatype for communication of characteristic point structs */
42*9371c9d4SSatish Balay   blockLen[0] = 1 + c->numIds;
43*9371c9d4SSatish Balay   indices[0]  = 0;
44*9371c9d4SSatish Balay   oldtypes[0] = MPIU_INT;
45*9371c9d4SSatish Balay   blockLen[1] = numValues;
46*9371c9d4SSatish Balay   indices[1]  = (1 + c->numIds) * sizeof(PetscInt);
47*9371c9d4SSatish Balay   oldtypes[1] = MPIU_SCALAR;
489566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_create_struct(2, blockLen, indices, oldtypes, &c->itemType));
499566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_commit(&c->itemType));
50af33a6ddSJed Brown 
51af33a6ddSJed Brown   /* Initialize the local queue for char foot values */
529566063dSJacob Faibussowitsch   PetscCall(VecGetLocalSize(c->velocity, &c->queueMax));
539566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->queueMax, &c->queue));
54af33a6ddSJed Brown   c->queueSize = 0;
55af33a6ddSJed Brown 
56af33a6ddSJed Brown   /* Allocate communication structures */
5763a3b9bcSJacob Faibussowitsch   PetscCheck(c->numNeighbors > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Invalid number of neighbors %" PetscInt_FMT ". Call CharactersiticSetNeighbors() before setup.", c->numNeighbors);
589566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors, &c->needCount));
599566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors, &c->localOffsets));
609566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors, &c->fillCount));
619566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors, &c->remoteOffsets));
629566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors - 1, &c->request));
639566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(c->numNeighbors - 1, &c->status));
64af33a6ddSJed Brown   PetscFunctionReturn(0);
65af33a6ddSJed Brown }
66af33a6ddSJed Brown 
67*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode CharacteristicCreate_DA(Characteristic c) {
68af33a6ddSJed Brown   Characteristic_DA *da;
69af33a6ddSJed Brown 
70af33a6ddSJed Brown   PetscFunctionBegin;
719566063dSJacob Faibussowitsch   PetscCall(PetscNew(&da));
729566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(da, sizeof(Characteristic_DA)));
739566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectMemory((PetscObject)c, sizeof(Characteristic_DA)));
74af33a6ddSJed Brown   c->data = (void *)da;
75af33a6ddSJed Brown 
76af33a6ddSJed Brown   c->ops->setup   = CharacteristicSetUp_DA;
77af33a6ddSJed Brown   c->ops->destroy = CharacteristicDestroy_DA;
78af33a6ddSJed Brown   c->ops->view    = CharacteristicView_DA;
79af33a6ddSJed Brown 
80af33a6ddSJed Brown   da->dummy = 0;
81af33a6ddSJed Brown   PetscFunctionReturn(0);
82af33a6ddSJed Brown }
83af33a6ddSJed Brown 
84af33a6ddSJed Brown /* -----------------------------------------------------------------------------
85af33a6ddSJed Brown    Checks for periodicity of a DM and Maps points outside of a domain back onto the domain
86af33a6ddSJed Brown    using appropriate periodicity. At the moment assumes only a 2-D DMDA.
87af33a6ddSJed Brown    ----------------------------------------------------------------------------------------*/
88*9371c9d4SSatish Balay PetscErrorCode DMDAMapCoordsToPeriodicDomain(DM da, PetscScalar *x, PetscScalar *y) {
89bff4a2f0SMatthew G. Knepley   DMBoundaryType bx, by;
90af33a6ddSJed Brown   PetscInt       dim, gx, gy;
91af33a6ddSJed Brown 
92af33a6ddSJed Brown   PetscFunctionBegin;
939566063dSJacob Faibussowitsch   PetscCall(DMDAGetInfo(da, &dim, &gx, &gy, NULL, NULL, NULL, NULL, NULL, NULL, &bx, &by, NULL, NULL));
94af33a6ddSJed Brown 
95bff4a2f0SMatthew G. Knepley   if (bx == DM_BOUNDARY_PERIODIC) {
96bbd56ea5SKarl Rupp     while (*x >= (PetscScalar)gx) *x -= (PetscScalar)gx;
97bbd56ea5SKarl Rupp     while (*x < 0.0) *x += (PetscScalar)gx;
98af33a6ddSJed Brown   }
99bff4a2f0SMatthew G. Knepley   if (by == DM_BOUNDARY_PERIODIC) {
100bbd56ea5SKarl Rupp     while (*y >= (PetscScalar)gy) *y -= (PetscScalar)gy;
101bbd56ea5SKarl Rupp     while (*y < 0.0) *y += (PetscScalar)gy;
102af33a6ddSJed Brown   }
1033db9a53dSBarry Smith   PetscFunctionReturn(0);
104af33a6ddSJed Brown }
105