:orphan: # PetscSectionGetPointSyms Get the symmetries for a set of points in a `PetscSection` under specific orientations. ## Synopsis ``` #include "petscsection.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 Parameters - ***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) ```none 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) ```none 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); ``` ## Notes `PetscSectionSetSym()` must have been previously called to provide the symmetries to the `PetscSection` Use `PetscSectionRestorePointSyms()` when finished with the data ## See Also [PetscSection](sec_petscsection), `PetscSectionSym`, `PetscSectionRestorePointSyms()`, `PetscSectionSymCreate()`, `PetscSectionSetSym()`, `PetscSectionGetSym()` ## Level developer ## Location src/vec/is/section/interface/section.c --- [Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/vec/is/section/interface/section.c) [Index of all PetscSection routines](index.md) [Table of Contents for all manual pages](/manualpages/index.md) [Index of all manual pages](/manualpages/singleindex.md)