qpms/qpms/symmetries.h

79 lines
2.8 KiB
C

/*! \file symmetries.h
* \brief Functions providing point group operations operating on translation
* operators and T-matrices.
*
* Here will be functions providing point group operations
* operating on translation operators and T-matrices
* similar to tmatrices.py.
*
* At least I want:
* - Wigner D matrices
* - Basic mirror operations for T-matrices
* - Inversion operation for the translation matrices
*
* Maybe (much later) also point and space group irrep
* functionality as in symmetries.py.
* However, I think that the group structures can be simply
* hard-coded/generated by a python script, then there is
* no need to check the group consistency etc. at runtime.
*
*
*/
#ifndef SYMMETRIES_H
#define SYMMETRIES_H
#include "qpms_types.h"
#include <cblas.h>
/// Dense matrix representation of the z coordinate sign flip operation (xy-plane mirroring).
complex double *qpms_zflip_uvswi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec);
/// Dense matrix representation of the y coordinate sign flip operation (xz-plane mirroring).
complex double *qpms_yflip_uvswi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec);
/// Dense matrix representation of the x coordinate sign flip operation (yz-plane mirroring).
complex double *qpms_xflip_uvswi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec);
/// Dense matrix representation of a rotation around the z-axis
complex double *qpms_zrot_uvswi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec,
double phi ///< Rotation angle
);
/// Dense matrix representation of a "rational" rotation around the z-axis
/** Just for convenience. Corresponds to the angle \f$ \phi = 2\piw/N \f$.
*/
complex double *qpms_zrot_rational_uvswi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec,
int N,
int w
);
/// Dense matrix (uvswi-indexed) representation of any O(3) transformation.
complex double *qpms_irot3_uvswfi_dense(
complex double *target, ///< If NULL, a new array is allocated.
const qpms_vswf_set_spec_t *bspec,
const qpms_irot3_t transf);
// Some auxilliary functions for "numerical cleaning" of the roundoff error
/// Cleans the roundoff error of an array.
/**
* Replaces all the array members \a x for which |\a x| <= \a atol
* with exact zeros.
*
* Returns the count of modified array members.
*/
size_t qpms_zero_roundoff_clean(double *arr, size_t nmemb, double atol);
/// Cleans the roundoff error of an array.
/**
* Works on real and imaginary parts separately.
* TODO doc.
*/
size_t qpms_czero_roundoff_clean(complex double *arr, size_t nmemb, double atol);
#endif // SYMMETRIES_H