petsc-3.10.5 2019-03-28
Report Typos and Errors

# PetscSectionGetPointSyms

Get the symmetries for a set of points in a PetscSection under specific orientations.

### Synopsis

    #include "petscvec.h"
    PetscErrorCode PetscSectionGetPointSyms(PetscSection section, PetscInt numPoints, const PetscInt *points, const PetscInt ***perms, const PetscScalar ***rots)

Not collective

### Input Parameters

| section | - the section
| numPoints | - the number of points
| points | - an array of size 2 * numPoints, containing a list of (point, orientation) pairs. (An orientation is an arbitrary integer: its interpretation is up to sym. Orientations are used by DM: for their interpretation in that context, see DMPlexGetConeOrientation()).

### Output Parameter

| perms | - The permutations for the given orientations (or NULL if there is no symmetry or the permutation is the identity).
| rots | - The field rotations symmetries for the given orientations (or NULL if there is no symmetry or the rotations are all identity).

### Example of usage, gathering dofs into a local array (lArray) from a section array (sArray)

         const PetscInt    **perms;
         const PetscScalar **rots;
         PetscInt            lOffset;

         PetscSectionGetPointSyms(section,numPoints,points,&perms,&rots);
         for (i = 0, lOffset = 0; i < numPoints; i++) {
           PetscInt           point = points[2*i], dof, sOffset;
           const PetscInt    *perm  = perms ? perms[i] : NULL;
           const PetscScalar *rot   = rots  ? rots[i]  : NULL;

           PetscSectionGetDof(section,point,&dof);
           PetscSectionGetOffset(section,point,&sOffset);

           if (perm) {for (j = 0; j < dof; j++) {lArray[lOffset + perm[j]]  = sArray[sOffset + j];}}
           else      {for (j = 0; j < dof; j++) {lArray[lOffset +      j ]  = sArray[sOffset + j];}}
           if (rot)  {for (j = 0; j < dof; j++) {lArray[lOffset +      j ] *= rot[j];             }}
           lOffset += dof;
         }
         PetscSectionRestorePointSyms(section,numPoints,points,&perms,&rots);

### Example of usage, adding dofs into a section array (sArray) from a local array (lArray)

         const PetscInt    **perms;
         const PetscScalar **rots;
         PetscInt            lOffset;

         PetscSectionGetPointSyms(section,numPoints,points,&perms,&rots);
         for (i = 0, lOffset = 0; i < numPoints; i++) {
           PetscInt           point = points[2*i], dof, sOffset;
           const PetscInt    *perm  = perms ? perms[i] : NULL;
           const PetscScalar *rot   = rots  ? rots[i]  : NULL;

           PetscSectionGetDof(section,point,&dof);
           PetscSectionGetOffset(section,point,&sOff);

           if (perm) {for (j = 0; j < dof; j++) {sArray[sOffset + j] += lArray[lOffset + perm[j]] * (rot ? PetscConj(rot[perm[j]]) : 1.);}}
           else      {for (j = 0; j < dof; j++) {sArray[sOffset + j] += lArray[lOffset +      j ] * (rot ? PetscConj(rot[     j ]) : 1.);}}
           offset += dof;
         }
         PetscSectionRestorePointSyms(section,numPoints,points,&perms,&rots);

### See Also

PetscSectionRestorePointSyms(), PetscSectionSymCreate(), PetscSectionSetSym(), PetscSectionGetSym()

### Level

developer

### Location

src/vec/is/utils/vsectionis.c
Index of all IS routines
Table of Contents for all manual pages
Index of all manual pages