Actual source code: spacepoint.c

  1: #include <petsc/private/petscfeimpl.h>
  2: #include <petsc/private/dtimpl.h>

  4: static PetscErrorCode PetscSpacePointView_Ascii(PetscSpace sp, PetscViewer viewer)
  5: {
  6:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;
  7:   PetscViewerFormat format;

  9:   PetscViewerGetFormat(viewer, &format);
 10:   if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
 11:     PetscViewerASCIIPrintf(viewer, "Point space in dimension %d:\n", sp->Nv);
 12:     PetscViewerASCIIPushTab(viewer);
 13:     PetscQuadratureView(pt->quad, viewer);
 14:     PetscViewerASCIIPopTab(viewer);
 15:   } else {
 16:     PetscViewerASCIIPrintf(viewer, "Point space in dimension %d on %d points\n", sp->Nv, pt->quad->numPoints);
 17:   }
 18:   return 0;
 19: }

 21: static PetscErrorCode PetscSpaceView_Point(PetscSpace sp, PetscViewer viewer)
 22: {
 23:   PetscBool      iascii;

 27:   PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);
 28:   if (iascii) PetscSpacePointView_Ascii(sp, viewer);
 29:   return 0;
 30: }

 32: static PetscErrorCode PetscSpaceSetUp_Point(PetscSpace sp)
 33: {
 34:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;

 36:   if (!pt->quad->points && sp->degree >= 0) {
 37:     PetscQuadratureDestroy(&pt->quad);
 38:     PetscDTStroudConicalQuadrature(sp->Nv, sp->Nc, PetscMax(sp->degree + 1, 1), -1.0, 1.0, &pt->quad);
 39:   }
 40:   return 0;
 41: }

 43: static PetscErrorCode PetscSpaceDestroy_Point(PetscSpace sp)
 44: {
 45:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;

 47:   PetscQuadratureDestroy(&pt->quad);
 48:   PetscFree(pt);
 49:   return 0;
 50: }

 52: static PetscErrorCode PetscSpaceGetDimension_Point(PetscSpace sp, PetscInt *dim)
 53: {
 54:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;

 56:   *dim = pt->quad->numPoints;
 57:   return 0;
 58: }

 60: static PetscErrorCode PetscSpaceEvaluate_Point(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
 61: {
 62:   PetscSpace_Point *pt  = (PetscSpace_Point *) sp->data;
 63:   PetscInt          dim = sp->Nv, pdim = pt->quad->numPoints, d, p, i, c;

 66:   PetscArrayzero(B, npoints*pdim);
 67:   for (p = 0; p < npoints; ++p) {
 68:     for (i = 0; i < pdim; ++i) {
 69:       for (d = 0; d < dim; ++d) {
 70:         if (PetscAbsReal(points[p*dim+d] - pt->quad->points[p*dim+d]) > 1.0e-10) break;
 71:       }
 72:       if (d >= dim) {B[p*pdim+i] = 1.0; break;}
 73:     }
 74:   }
 75:   /* Replicate for other components */
 76:   for (c = 1; c < sp->Nc; ++c) {
 77:     for (p = 0; p < npoints; ++p) {
 78:       for (i = 0; i < pdim; ++i) {
 79:         B[(c*npoints + p)*pdim + i] = B[p*pdim + i];
 80:       }
 81:     }
 82:   }
 83:   if (D) PetscArrayzero(D, npoints*pdim*dim);
 84:   if (H) PetscArrayzero(H, npoints*pdim*dim*dim);
 85:   return 0;
 86: }

 88: static PetscErrorCode PetscSpaceInitialize_Point(PetscSpace sp)
 89: {
 90:   sp->ops->setfromoptions = NULL;
 91:   sp->ops->setup          = PetscSpaceSetUp_Point;
 92:   sp->ops->view           = PetscSpaceView_Point;
 93:   sp->ops->destroy        = PetscSpaceDestroy_Point;
 94:   sp->ops->getdimension   = PetscSpaceGetDimension_Point;
 95:   sp->ops->evaluate       = PetscSpaceEvaluate_Point;
 96:   return 0;
 97: }

 99: /*MC
100:   PETSCSPACEPOINT = "point" - A PetscSpace object that encapsulates functions defined on a set of quadrature points.

102:   Level: intermediate

104: .seealso: PetscSpaceType, PetscSpaceCreate(), PetscSpaceSetType()
105: M*/

107: PETSC_EXTERN PetscErrorCode PetscSpaceCreate_Point(PetscSpace sp)
108: {
109:   PetscSpace_Point *pt;

112:   PetscNewLog(sp,&pt);
113:   sp->data = pt;

115:   sp->Nv = 0;
116:   sp->maxDegree = PETSC_MAX_INT;
117:   PetscQuadratureCreate(PETSC_COMM_SELF, &pt->quad);
118:   PetscQuadratureSetData(pt->quad, 0, 1, 0, NULL, NULL);

120:   PetscSpaceInitialize_Point(sp);
121:   return 0;
122: }

124: /*@
125:   PetscSpacePointSetPoints - Sets the evaluation points for the space to coincide with the points of a quadrature rule

127:   Logically collective

129:   Input Parameters:
130: + sp - The PetscSpace
131: - q  - The PetscQuadrature defining the points

133:   Level: intermediate

135: .seealso: PetscSpaceCreate(), PetscSpaceSetType()
136: @*/
137: PetscErrorCode PetscSpacePointSetPoints(PetscSpace sp, PetscQuadrature q)
138: {
139:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;

143:   PetscQuadratureDestroy(&pt->quad);
144:   PetscQuadratureDuplicate(q, &pt->quad);
145:   return 0;
146: }

148: /*@
149:   PetscSpacePointGetPoints - Gets the evaluation points for the space as the points of a quadrature rule

151:   Logically collective

153:   Input Parameter:
154: . sp - The PetscSpace

156:   Output Parameter:
157: . q  - The PetscQuadrature defining the points

159:   Level: intermediate

161: .seealso: PetscSpaceCreate(), PetscSpaceSetType()
162: @*/
163: PetscErrorCode PetscSpacePointGetPoints(PetscSpace sp, PetscQuadrature *q)
164: {
165:   PetscSpace_Point *pt = (PetscSpace_Point *) sp->data;

169:   *q = pt->quad;
170:   return 0;
171: }