From 189da15810deabd739d7c11c6e95fea55739fe60 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 1 Aug 2020 15:13:49 +0200 Subject: Initial import from archive --- src/symmetry.h | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/symmetry.h (limited to 'src/symmetry.h') diff --git a/src/symmetry.h b/src/symmetry.h new file mode 100644 index 0000000..bdcd63e --- /dev/null +++ b/src/symmetry.h @@ -0,0 +1,89 @@ +/* + * symmetry.h + * + * Symmetry stuff + * + * (c) 2006 Thomas White + * Synth2d - two-dimensional Fourier synthesis + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifndef SYMMETRY_H +#define SYMMETRY_H + +#include + +#include "reflist.h" + +/* Symmetry elements */ +typedef enum { + SYMMETRY_IDENTITY = 0, + SYMMETRY_FRIEDEL = 1<<0, + SYMMETRY_MIRROR_DIAGONAL = 1<<1, + SYMMETRY_CENTRE = 1<<2, + SYMMETRY_GLIDE_HORIZONTAL_QUARTER = 1<<3, + SYMMETRY_GLIDE_VERTICAL_QUARTER = 1<<4, + SYMMETRY_ROTATION_4 = 1<<5, + SYMMETRY_GLIDE_DIAGONAL = 1<<6, + SYMMETRY_MIRROR_VERTICAL = 1<<7, + SYMMETRY_MIRROR_HORIZONTAL = 1<<8, + SYMMETRY_GLIDE_HORIZONTAL = 1<<9, + SYMMETRY_GLIDE_VERTICAL = 1<<10, + SYMMETRY_TRIAD = 1<<11, + SYMMETRY_MIRROR_VERTICAL_QUARTER = 1<<12, + SYMMETRY_MIRROR_HORIZONTAL_QUARTER = 1<<13 +} Symmetry; + +/* Atoms at cell edges and corners need to be duplicated when displaying the model, + but not when calculating structure factors. */ +typedef enum { + MODEL_TARGET_DISPLAY, + MODEL_TARGET_CALCULATION +} ModelTarget; + +/* Planegroups */ +#define PLANEGROUP_P1 (SYMMETRY_IDENTITY) +#define PLANEGROUP_P2 (SYMMETRY_CENTRE) +#define PLANEGROUP_PM_X (SYMMETRY_MIRROR_HORIZONTAL) +#define PLANEGROUP_PM_Y (SYMMETRY_MIRROR_VERTICAL) +#define PLANEGROUP_PG_X (SYMMETRY_GLIDE_HORIZONTAL) +#define PLANEGROUP_PG_Y (SYMMETRY_GLIDE_VERTICAL) +#define PLANEGROUP_CM_X (SYMMETRY_MIRROR_HORIZONTAL | SYMMETRY_GLIDE_HORIZONTAL_QUARTER) +#define PLANEGROUP_CM_Y (SYMMETRY_MIRROR_VERTICAL | SYMMETRY_GLIDE_VERTICAL_QUARTER) +#define PLANEGROUP_P2MM (SYMMETRY_CENTRE | SYMMETRY_MIRROR_HORIZONTAL | SYMMETRY_MIRROR_VERTICAL) +#define PLANEGROUP_P2MG_X (SYMMETRY_CENTRE | SYMMETRY_GLIDE_VERTICAL | SYMMETRY_MIRROR_HORIZONTAL_QUARTER) +#define PLANEGROUP_P2MG_Y (SYMMETRY_CENTRE | SYMMETRY_GLIDE_HORIZONTAL | SYMMETRY_MIRROR_VERTICAL_QUARTER) +#define PLANEGROUP_P2GG (SYMMETRY_CENTRE | SYMMETRY_GLIDE_HORIZONTAL_QUARTER | SYMMETRY_GLIDE_VERTICAL_QUARTER) +#define PLANEGROUP_C2MM (SYMMETRY_CENTRE | SYMMETRY_GLIDE_HORIZONTAL_QUARTER | SYMMETRY_GLIDE_VERTICAL_QUARTER \ + | SYMMETRY_MIRROR_HORIZONTAL | SYMMETRY_MIRROR_VERTICAL) +#define PLANEGROUP_P4 (SYMMETRY_CENTRE | SYMMETRY_ROTATION_4) +#define PLANEGROUP_P4MM (SYMMETRY_CENTRE | SYMMETRY_MIRROR_DIAGONAL | SYMMETRY_ROTATION_4) /* Implies the other diagonal */ +#define PLANEGROUP_P4GM (SYMMETRY_CENTRE | SYMMETRY_ROTATION_4 | SYMMETRY_GLIDE_DIAGONAL) /*| SYMMETRY_GLIDE_HORIZONTAL_QUARTER */ +#define PLANEGROUP_P3 (SYMMETRY_TRIAD) +#define PLANEGROUP_P3M1 (SYMMETRY_TRIAD | SYMMETRY_MIRROR_DIAGONAL) +#define PLANEGROUP_P31M (SYMMETRY_TRIAD | SYMMETRY_MIRROR_HORIZONTAL) +#define PLANEGROUP_P6 (SYMMETRY_TRIAD | SYMMETRY_CENTRE) +#define PLANEGROUP_P6MM (SYMMETRY_TRIAD | SYMMETRY_CENTRE | SYMMETRY_MIRROR_VERTICAL | SYMMETRY_MIRROR_HORIZONTAL) + +typedef enum { + SYMFLAG_NONE = 0, + SYMFLAG_PHASES_KNOWN = 1<<0, + SYMFLAG_PHASES_CALC = 1<<1, +} SymFlags; + +/* Functions */ +extern struct struct_atomicmodel *symmetry_generate_equivalent_atoms(struct struct_atomicmodel *model, size_t j, ModelTarget target); +extern ReflectionList *symmetry_generate_equivalent_reflections(Symmetry sym, signed int h, signed int k, signed int l); +extern ReflectionList symmetry_reduce(ReflectionList *input, Symmetry sym); +extern double symmetry_symmetrise(ReflectionList *input, Symmetry sym, SymFlags flags); /* Returns R_sym */ +extern const char *symmetry_decode(Symmetry sym); +extern Symmetry symmetry_encode(const char *symmetry); +extern void symmetry_centricity(ReflectionList *reflections, unsigned int i, Symmetry sym, SymFlags flags); +extern void symmetry_symmetrise_array(fftw_complex *in, signed int width, signed int height, Symmetry sym); + +#endif /* SYMMETRY_H */ + -- cgit v1.2.3