[petsc-dev] [PATCH] DMPlex: refine coordinates using spatial dimension
Matthew Knepley
knepley at gmail.com
Mon May 5 20:17:05 CDT 2014
On Mon, May 5, 2014 at 9:35 AM, Lawrence Mitchell <
lawrence.mitchell at imperial.ac.uk> wrote:
> If the plex is an embedded manifold, its topological dimension will not
> match the dimension of the coordinate section. Refine coordinates by
> inspecting the latter (rather than the former) when carrying out uniform
> refinement.
> ---
> I sent this a while ago, but I'm not sure if it got lost in transit
> (hence reposting to petsc-dev for comment). It's possible that
> something similar needs to be done for non-uniform refinement, but
> I'm not sure how to drive those interfaces. We need this, for
> example, when refining a mesh of the surface of the earth.
>
Yes, I lost it. WIll commit to next tonight.
Thanks,
Matt
> Cheers,
> Lawrence
>
> src/dm/impls/plex/plexrefine.c | 32 ++++++++++++++++----------------
> 1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/src/dm/impls/plex/plexrefine.c
> b/src/dm/impls/plex/plexrefine.c
> index fe4d71d..d6cbc74 100644
> --- a/src/dm/impls/plex/plexrefine.c
> +++ b/src/dm/impls/plex/plexrefine.c
> @@ -5339,11 +5339,10 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
> Vec coordinates, coordinatesNew;
> PetscScalar *coords, *coordsNew;
> const PetscInt numVertices = depthSize ? depthSize[0] : 0;
> - PetscInt dim, depth, bs, coordSizeNew, cStart, cEnd, cMax, c,
> vStart, vStartNew, vEnd, v, eStart, eEnd, eMax, e, fStart, fEnd, fMax, f;
> + PetscInt spaceDim, depth, bs, coordSizeNew, cStart, cEnd, cMax,
> c, vStart, vStartNew, vEnd, v, eStart, eEnd, eMax, e, fStart, fEnd, fMax, f;
> PetscErrorCode ierr;
>
> PetscFunctionBegin;
> - ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr);
> ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr);
> ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr);
> ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr);
> @@ -5353,17 +5352,18 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
> if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, NULL,
> NULL, NULL, &vStartNew);CHKERRQ(ierr);}
> ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL,
> &vStartNew);CHKERRQ(ierr);
> ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr);
> + ierr = PetscSectionGetFieldComponents(coordSection, 0,
> &spaceDim);CHKERRQ(ierr);
> ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),
> &coordSectionNew);CHKERRQ(ierr);
> ierr = PetscSectionSetNumFields(coordSectionNew, 1);CHKERRQ(ierr);
> - ierr = PetscSectionSetFieldComponents(coordSectionNew, 0,
> dim);CHKERRQ(ierr);
> + ierr = PetscSectionSetFieldComponents(coordSectionNew, 0,
> spaceDim);CHKERRQ(ierr);
> ierr = PetscSectionSetChart(coordSectionNew, vStartNew,
> vStartNew+numVertices);CHKERRQ(ierr);
> if (cMax < 0) cMax = cEnd;
> if (fMax < 0) fMax = fEnd;
> if (eMax < 0) eMax = eEnd;
> - /* All vertices have the dim coordinates */
> + /* All vertices have spaceDim coordinates */
> for (v = vStartNew; v < vStartNew+numVertices; ++v) {
> - ierr = PetscSectionSetDof(coordSectionNew, v, dim);CHKERRQ(ierr);
> - ierr = PetscSectionSetFieldDof(coordSectionNew, v, 0,
> dim);CHKERRQ(ierr);
> + ierr = PetscSectionSetDof(coordSectionNew, v, spaceDim);CHKERRQ(ierr);
> + ierr = PetscSectionSetFieldDof(coordSectionNew, v, 0,
> spaceDim);CHKERRQ(ierr);
> }
> ierr = PetscSectionSetUp(coordSectionNew);CHKERRQ(ierr);
> ierr = DMSetCoordinateSection(rdm, coordSectionNew);CHKERRQ(ierr);
> @@ -5396,16 +5396,16 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
> ierr = PetscSectionGetOffset(coordSection, cone[v],
> &off[v]);CHKERRQ(ierr);
> }
> ierr = PetscSectionGetOffset(coordSectionNew, newv,
> &offnew);CHKERRQ(ierr);
> - for (d = 0; d < dim; ++d) coordsNew[offnew+d] = 0.0;
> - for (v = 0; v < coneSize; ++v) {ierr =
> DMPlexLocalizeAddCoordinate_Internal(dm, dim, &coords[off[0]],
> &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);}
> - for (d = 0; d < dim; ++d) coordsNew[offnew+d] /= coneSize;
> + for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] = 0.0;
> + for (v = 0; v < coneSize; ++v) {ierr =
> DMPlexLocalizeAddCoordinate_Internal(dm, spaceDim, &coords[off[0]],
> &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);}
> + for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] /= coneSize;
> ierr = DMPlexRestoreTransitiveClosure(dm, f, PETSC_TRUE,
> &closureSize, &cone);CHKERRQ(ierr);
> }
> case 2: /* Hex 2D */
> case 4: /* Hybrid Hex 2D */
> /* Cell vertices have the average of corner coordinates */
> for (c = cStart; c < cMax; ++c) {
> - const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart)
> + (c - cStart) + (dim > 2 ? (fMax - fStart) : 0);
> + const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart)
> + (c - cStart) + (spaceDim > 2 ? (fMax - fStart) : 0);
> PetscInt *cone = NULL;
> PetscInt closureSize, coneSize = 0, off[8], offnew, p, d;
>
> @@ -5418,9 +5418,9 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
> ierr = PetscSectionGetOffset(coordSection, cone[v],
> &off[v]);CHKERRQ(ierr);
> }
> ierr = PetscSectionGetOffset(coordSectionNew, newv,
> &offnew);CHKERRQ(ierr);
> - for (d = 0; d < dim; ++d) coordsNew[offnew+d] = 0.0;
> - for (v = 0; v < coneSize; ++v) {ierr =
> DMPlexLocalizeAddCoordinate_Internal(dm, dim, &coords[off[0]],
> &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);}
> - for (d = 0; d < dim; ++d) coordsNew[offnew+d] /= coneSize;
> + for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] = 0.0;
> + for (v = 0; v < coneSize; ++v) {ierr =
> DMPlexLocalizeAddCoordinate_Internal(dm, spaceDim, &coords[off[0]],
> &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);}
> + for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] /= coneSize;
> ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE,
> &closureSize, &cone);CHKERRQ(ierr);
> }
> case 1: /* Simplicial 2D */
> @@ -5439,8 +5439,8 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
> ierr = PetscSectionGetOffset(coordSection, cone[0],
> &offA);CHKERRQ(ierr);
> ierr = PetscSectionGetOffset(coordSection, cone[1],
> &offB);CHKERRQ(ierr);
> ierr = PetscSectionGetOffset(coordSectionNew, newv,
> &offnew);CHKERRQ(ierr);
> - ierr = DMPlexLocalizeCoordinate_Internal(dm, dim, &coords[offA],
> &coords[offB], &coordsNew[offnew]);CHKERRQ(ierr);
> - for (d = 0; d < dim; ++d) {
> + ierr = DMPlexLocalizeCoordinate_Internal(dm, spaceDim,
> &coords[offA], &coords[offB], &coordsNew[offnew]);CHKERRQ(ierr);
> + for (d = 0; d < spaceDim; ++d) {
> coordsNew[offnew+d] = 0.5*(coords[offA+d] + coordsNew[offnew+d]);
> }
> }
> @@ -5451,7 +5451,7 @@ static PetscErrorCode
> CellRefinerSetCoordinates(CellRefiner refiner, DM dm, Pets
>
> ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr);
> ierr = PetscSectionGetOffset(coordSectionNew, newv,
> &offnew);CHKERRQ(ierr);
> - for (d = 0; d < dim; ++d) {
> + for (d = 0; d < spaceDim; ++d) {
> coordsNew[offnew+d] = coords[off+d];
> }
> }
> --
> 1.8.4.474.g128a96c
>
>
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20140505/299fee74/attachment.html>
More information about the petsc-dev
mailing list