xref: /petsc/src/dm/dt/space/impls/point/spacepoint.c (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
120cf1dd8SToby Isaac #include <petsc/private/petscfeimpl.h> /*I "petscfe.h" I*/
220cf1dd8SToby Isaac #include <petsc/private/dtimpl.h>      /*I "petscdt.h" I*/
320cf1dd8SToby Isaac 
49371c9d4SSatish Balay static PetscErrorCode PetscSpacePointView_Ascii(PetscSpace sp, PetscViewer viewer) {
520cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
620cf1dd8SToby Isaac   PetscViewerFormat format;
720cf1dd8SToby Isaac 
820cf1dd8SToby Isaac   PetscFunctionBegin;
99566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
1020cf1dd8SToby Isaac   if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
1163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Point space in dimension %" PetscInt_FMT ":\n", sp->Nv));
129566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
139566063dSJacob Faibussowitsch     PetscCall(PetscQuadratureView(pt->quad, viewer));
149566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
151baa6e33SBarry Smith   } else PetscCall(PetscViewerASCIIPrintf(viewer, "Point space in dimension %" PetscInt_FMT " on %" PetscInt_FMT " points\n", sp->Nv, pt->quad->numPoints));
1620cf1dd8SToby Isaac   PetscFunctionReturn(0);
1720cf1dd8SToby Isaac }
1820cf1dd8SToby Isaac 
199371c9d4SSatish Balay static PetscErrorCode PetscSpaceView_Point(PetscSpace sp, PetscViewer viewer) {
2020cf1dd8SToby Isaac   PetscBool iascii;
2120cf1dd8SToby Isaac 
2220cf1dd8SToby Isaac   PetscFunctionBegin;
2320cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
2420cf1dd8SToby Isaac   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
259566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
269566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscSpacePointView_Ascii(sp, viewer));
2720cf1dd8SToby Isaac   PetscFunctionReturn(0);
2820cf1dd8SToby Isaac }
2920cf1dd8SToby Isaac 
309371c9d4SSatish Balay static PetscErrorCode PetscSpaceSetUp_Point(PetscSpace sp) {
3120cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
3220cf1dd8SToby Isaac 
3320cf1dd8SToby Isaac   PetscFunctionBegin;
3420cf1dd8SToby Isaac   if (!pt->quad->points && sp->degree >= 0) {
359566063dSJacob Faibussowitsch     PetscCall(PetscQuadratureDestroy(&pt->quad));
369566063dSJacob Faibussowitsch     PetscCall(PetscDTStroudConicalQuadrature(sp->Nv, sp->Nc, PetscMax(sp->degree + 1, 1), -1.0, 1.0, &pt->quad));
3720cf1dd8SToby Isaac   }
3820cf1dd8SToby Isaac   PetscFunctionReturn(0);
3920cf1dd8SToby Isaac }
4020cf1dd8SToby Isaac 
419371c9d4SSatish Balay static PetscErrorCode PetscSpaceDestroy_Point(PetscSpace sp) {
4220cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
4320cf1dd8SToby Isaac 
4420cf1dd8SToby Isaac   PetscFunctionBegin;
459566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureDestroy(&pt->quad));
469566063dSJacob Faibussowitsch   PetscCall(PetscFree(pt));
4720cf1dd8SToby Isaac   PetscFunctionReturn(0);
4820cf1dd8SToby Isaac }
4920cf1dd8SToby Isaac 
509371c9d4SSatish Balay static PetscErrorCode PetscSpaceGetDimension_Point(PetscSpace sp, PetscInt *dim) {
5120cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
5220cf1dd8SToby Isaac 
5320cf1dd8SToby Isaac   PetscFunctionBegin;
5420cf1dd8SToby Isaac   *dim = pt->quad->numPoints;
5520cf1dd8SToby Isaac   PetscFunctionReturn(0);
5620cf1dd8SToby Isaac }
5720cf1dd8SToby Isaac 
589371c9d4SSatish Balay static PetscErrorCode PetscSpaceEvaluate_Point(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) {
5920cf1dd8SToby Isaac   PetscSpace_Point *pt  = (PetscSpace_Point *)sp->data;
6020cf1dd8SToby Isaac   PetscInt          dim = sp->Nv, pdim = pt->quad->numPoints, d, p, i, c;
6120cf1dd8SToby Isaac 
6220cf1dd8SToby Isaac   PetscFunctionBegin;
6363a3b9bcSJacob Faibussowitsch   PetscCheck(npoints == pt->quad->numPoints, PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot evaluate Point space on %" PetscInt_FMT " points != %" PetscInt_FMT " size", npoints, pt->quad->numPoints);
649566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(B, npoints * pdim));
6520cf1dd8SToby Isaac   for (p = 0; p < npoints; ++p) {
6620cf1dd8SToby Isaac     for (i = 0; i < pdim; ++i) {
6720cf1dd8SToby Isaac       for (d = 0; d < dim; ++d) {
6820cf1dd8SToby Isaac         if (PetscAbsReal(points[p * dim + d] - pt->quad->points[p * dim + d]) > 1.0e-10) break;
6920cf1dd8SToby Isaac       }
709371c9d4SSatish Balay       if (d >= dim) {
719371c9d4SSatish Balay         B[p * pdim + i] = 1.0;
729371c9d4SSatish Balay         break;
739371c9d4SSatish Balay       }
7420cf1dd8SToby Isaac     }
7520cf1dd8SToby Isaac   }
7620cf1dd8SToby Isaac   /* Replicate for other components */
7720cf1dd8SToby Isaac   for (c = 1; c < sp->Nc; ++c) {
7820cf1dd8SToby Isaac     for (p = 0; p < npoints; ++p) {
79ad540459SPierre Jolivet       for (i = 0; i < pdim; ++i) B[(c * npoints + p) * pdim + i] = B[p * pdim + i];
8020cf1dd8SToby Isaac     }
8120cf1dd8SToby Isaac   }
829566063dSJacob Faibussowitsch   if (D) PetscCall(PetscArrayzero(D, npoints * pdim * dim));
839566063dSJacob Faibussowitsch   if (H) PetscCall(PetscArrayzero(H, npoints * pdim * dim * dim));
8420cf1dd8SToby Isaac   PetscFunctionReturn(0);
8520cf1dd8SToby Isaac }
8620cf1dd8SToby Isaac 
879371c9d4SSatish Balay static PetscErrorCode PetscSpaceInitialize_Point(PetscSpace sp) {
8820cf1dd8SToby Isaac   PetscFunctionBegin;
8920cf1dd8SToby Isaac   sp->ops->setfromoptions = NULL;
9020cf1dd8SToby Isaac   sp->ops->setup          = PetscSpaceSetUp_Point;
9120cf1dd8SToby Isaac   sp->ops->view           = PetscSpaceView_Point;
9220cf1dd8SToby Isaac   sp->ops->destroy        = PetscSpaceDestroy_Point;
9320cf1dd8SToby Isaac   sp->ops->getdimension   = PetscSpaceGetDimension_Point;
9420cf1dd8SToby Isaac   sp->ops->evaluate       = PetscSpaceEvaluate_Point;
9520cf1dd8SToby Isaac   PetscFunctionReturn(0);
9620cf1dd8SToby Isaac }
9720cf1dd8SToby Isaac 
9820cf1dd8SToby Isaac /*MC
9920cf1dd8SToby Isaac   PETSCSPACEPOINT = "point" - A PetscSpace object that encapsulates functions defined on a set of quadrature points.
10020cf1dd8SToby Isaac 
10120cf1dd8SToby Isaac   Level: intermediate
10220cf1dd8SToby Isaac 
103db781477SPatrick Sanan .seealso: `PetscSpaceType`, `PetscSpaceCreate()`, `PetscSpaceSetType()`
10420cf1dd8SToby Isaac M*/
10520cf1dd8SToby Isaac 
1069371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscSpaceCreate_Point(PetscSpace sp) {
10720cf1dd8SToby Isaac   PetscSpace_Point *pt;
10820cf1dd8SToby Isaac 
10920cf1dd8SToby Isaac   PetscFunctionBegin;
11020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
111*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&pt));
11220cf1dd8SToby Isaac   sp->data = pt;
11320cf1dd8SToby Isaac 
11420cf1dd8SToby Isaac   sp->Nv        = 0;
11520cf1dd8SToby Isaac   sp->maxDegree = PETSC_MAX_INT;
1169566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureCreate(PETSC_COMM_SELF, &pt->quad));
1179566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureSetData(pt->quad, 0, 1, 0, NULL, NULL));
11820cf1dd8SToby Isaac 
1199566063dSJacob Faibussowitsch   PetscCall(PetscSpaceInitialize_Point(sp));
12020cf1dd8SToby Isaac   PetscFunctionReturn(0);
12120cf1dd8SToby Isaac }
12220cf1dd8SToby Isaac 
12320cf1dd8SToby Isaac /*@
12420cf1dd8SToby Isaac   PetscSpacePointSetPoints - Sets the evaluation points for the space to coincide with the points of a quadrature rule
12520cf1dd8SToby Isaac 
12620cf1dd8SToby Isaac   Logically collective
12720cf1dd8SToby Isaac 
12820cf1dd8SToby Isaac   Input Parameters:
12920cf1dd8SToby Isaac + sp - The PetscSpace
13020cf1dd8SToby Isaac - q  - The PetscQuadrature defining the points
13120cf1dd8SToby Isaac 
13220cf1dd8SToby Isaac   Level: intermediate
13320cf1dd8SToby Isaac 
134db781477SPatrick Sanan .seealso: `PetscSpaceCreate()`, `PetscSpaceSetType()`
13520cf1dd8SToby Isaac @*/
1369371c9d4SSatish Balay PetscErrorCode PetscSpacePointSetPoints(PetscSpace sp, PetscQuadrature q) {
13720cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
13820cf1dd8SToby Isaac 
13920cf1dd8SToby Isaac   PetscFunctionBegin;
14020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
141064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(q, PETSCQUADRATURE_CLASSID, 2);
1429566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureDestroy(&pt->quad));
1439566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureDuplicate(q, &pt->quad));
14420cf1dd8SToby Isaac   PetscFunctionReturn(0);
14520cf1dd8SToby Isaac }
14620cf1dd8SToby Isaac 
14720cf1dd8SToby Isaac /*@
14820cf1dd8SToby Isaac   PetscSpacePointGetPoints - Gets the evaluation points for the space as the points of a quadrature rule
14920cf1dd8SToby Isaac 
15020cf1dd8SToby Isaac   Logically collective
15120cf1dd8SToby Isaac 
15220cf1dd8SToby Isaac   Input Parameter:
15320cf1dd8SToby Isaac . sp - The PetscSpace
15420cf1dd8SToby Isaac 
15520cf1dd8SToby Isaac   Output Parameter:
15620cf1dd8SToby Isaac . q  - The PetscQuadrature defining the points
15720cf1dd8SToby Isaac 
15820cf1dd8SToby Isaac   Level: intermediate
15920cf1dd8SToby Isaac 
160db781477SPatrick Sanan .seealso: `PetscSpaceCreate()`, `PetscSpaceSetType()`
16120cf1dd8SToby Isaac @*/
1629371c9d4SSatish Balay PetscErrorCode PetscSpacePointGetPoints(PetscSpace sp, PetscQuadrature *q) {
16320cf1dd8SToby Isaac   PetscSpace_Point *pt = (PetscSpace_Point *)sp->data;
16420cf1dd8SToby Isaac 
16520cf1dd8SToby Isaac   PetscFunctionBegin;
16620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
16720cf1dd8SToby Isaac   PetscValidPointer(q, 2);
16820cf1dd8SToby Isaac   *q = pt->quad;
16920cf1dd8SToby Isaac   PetscFunctionReturn(0);
17020cf1dd8SToby Isaac }
171