aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/cell.h
blob: 064dacd021e36c711c83c21a4f5ebe059c3c9756 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * cell.h
 *
 * A class representing a unit cell
 *
 * Copyright © 2012-2020 Deutsches Elektronen-Synchrotron DESY,
 *                       a research centre of the Helmholtz Association.
 * Copyright © 2012 Richard Kirian
 * Copyright © 2012 Lorenzo Galli
 *
 * Authors:
 *   2009-2012,2014,2017 Thomas White <taw@physics.org>
 *   2010,2012           Richard Kirian
 *   2012                Lorenzo Galli
 *
 * This file is part of CrystFEL.
 *
 * CrystFEL is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * CrystFEL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with CrystFEL.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef CELL_H
#define CELL_H

#include "utils.h"
#include "integer_matrix.h"

/**
 * \file cell.h
 * Unit cell structure
 */

/**
 * Structure representing a 3D vector in reciprocal space.
 *
 * Note: Heavily abused to serve as a real space vector as well.
 **/
struct rvec
{
	double   u;  /**< x component (in reciprocal space) */
	double   v;  /**< y component (in reciprocal space) */
	double   w;  /**< z component (in reciprocal space) */
};


/**
 * An enumeration of the possible lattice types: triclinic, monoclinic,
 * orthorhombic, tetragonal, rhombohedral, hexagonal and cubic.
 **/
typedef enum
{
	L_TRICLINIC,
	L_MONOCLINIC,
	L_ORTHORHOMBIC,
	L_TETRAGONAL,
	L_RHOMBOHEDRAL,
	L_HEXAGONAL,
	L_CUBIC
} LatticeType;


/**
 * Opaque data structure representing a unit cell.
 *
 * This data structure is opaque.  You must use the available accessor functions
 * to read and write its contents.
 **/
typedef struct _unitcell UnitCell;


#ifdef __cplusplus
extern "C" {
#endif

extern UnitCell *cell_new(void);
extern UnitCell *cell_new_from_cell(const UnitCell *orig);
extern void cell_free(UnitCell *cell);

/* Lengths in m, angles in radians */
extern UnitCell *cell_new_from_parameters(double a, double b, double c,
				double alpha, double beta, double gamma);

extern UnitCell *cell_new_from_reciprocal_axes(struct rvec as, struct rvec bs,
                                               struct rvec cs);

extern UnitCell *cell_new_from_direct_axes(struct rvec as, struct rvec bs,
                                           struct rvec cs);

extern int cell_has_parameters(const UnitCell *cell);

extern void cell_set_cartesian(UnitCell *cell,
                               double ax, double ay, double az,
                               double bx, double by, double bz,
                               double cx, double cy, double cz);

extern void cell_set_parameters(UnitCell *cell, double a, double b, double c,
				double alpha, double beta, double gamma);

extern int cell_get_parameters(UnitCell *cell, double *a, double *b, double *c,
                               double *alpha, double *beta, double *gamma);

extern int cell_get_cartesian(UnitCell *cell,
                              double *ax, double *ay, double *az,
                              double *bx, double *by, double *bz,
                              double *cx, double *cy, double *cz);

extern int cell_get_reciprocal(UnitCell *cell,
                               double *asx, double *asy, double *asz,
                               double *bsx, double *bsy, double *bsz,
                               double *csx, double *csy, double *csz);

extern void cell_set_reciprocal(UnitCell *cell,
                                double asx, double asy, double asz,
                                double bsx, double bsy, double bsz,
                                double csx, double csy, double csz);

extern LatticeType cell_get_lattice_type(const UnitCell *cell);
extern void cell_set_lattice_type(UnitCell *cell, LatticeType lattice_type);

struct g6
{
	double A;
	double B;
	double C;
	double D;
	double E;
	double F;
};

extern struct g6 cell_get_G6(UnitCell *cell);

extern char cell_get_centering(const UnitCell *cell);
extern void cell_set_centering(UnitCell *cell, char centering);

extern char cell_get_unique_axis(const UnitCell *cell);
extern void cell_set_unique_axis(UnitCell *cell, char unique_axis);

extern UnitCell *cell_transform_gsl_direct(UnitCell *in, gsl_matrix *m);

extern UnitCell *cell_transform_rational(UnitCell *cell, RationalMatrix *m);
extern UnitCell *cell_transform_rational_inverse(UnitCell *cell, RationalMatrix *m);

extern UnitCell *cell_transform_intmat(UnitCell *cell, IntegerMatrix *m);
extern UnitCell *cell_transform_intmat_inverse(UnitCell *cell, IntegerMatrix *m);

#ifdef __cplusplus
}
#endif

#endif	/* CELL_H */