1 /* This file is part of the hkl library.
3 * The hkl library is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * The hkl library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with the hkl library. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright (C) 2003-2014 Synchrotron SOLEIL
17 * L'Orme des Merisiers Saint-Aubin
18 * BP 48 91192 GIF-sur-YVETTE CEDEX
20 * Authors: Picca Frédéric-Emmanuel <picca@synchrotron-soleil.fr>
23 #include <tap/basic.h>
24 #include <tap/float.h>
25 #include <tap/hkl-tap.h>
27 #define CHECK_PARAM(_lattice, _param, _value) \
29 hkl_parameter_value_get(hkl_lattice_## _param ##_get(_lattice), \
31 HKL_EPSILON, __func__);
33 #define CHECK_LATTICE(_lattice, _a, _b, _c, _alpha, _beta, _gamma) do { \
34 CHECK_PARAM(_lattice, a, _a); \
35 CHECK_PARAM(_lattice, b, _b); \
36 CHECK_PARAM(_lattice, c, _c); \
37 CHECK_PARAM(_lattice, alpha, _alpha); \
38 CHECK_PARAM(_lattice, beta, _beta); \
39 CHECK_PARAM(_lattice, gamma, _gamma); \
42 #define SET_PARAM(_lattice, _param, _value) do { \
44 HklParameter *p = hkl_parameter_new_copy(hkl_lattice_ ## _param ## _get(_lattice)); \
45 ok(hkl_parameter_value_set(p, _value, HKL_UNIT_DEFAULT, NULL), __func__); \
46 ok(TRUE == hkl_lattice_ ## _param ## _set(_lattice, p, NULL), __func__); \
48 ok(TRUE == hkl_lattice_ ## _param ## _set(_lattice, p, &error), __func__); \
49 ok(error == NULL, __func__); \
50 hkl_parameter_free(p); \
53 #define SET_LATTICE(_lattice, _a, _b, _c, _alpha, _beta, _gamma) do{ \
54 SET_PARAM(_lattice, a, _a); \
55 SET_PARAM(_lattice, b, _b); \
56 SET_PARAM(_lattice, c, _c); \
57 SET_PARAM(_lattice, alpha, _alpha); \
58 SET_PARAM(_lattice, beta, _beta); \
59 SET_PARAM(_lattice, gamma, _gamma); \
67 /* can not set this lattice */
68 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
69 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
71 ok(NULL
== lattice
, __func__
);
73 /* check GError generation */
75 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
76 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
78 ok(NULL
== lattice
, __func__
);
79 ok(error
!= NULL
, __func__
);
80 g_clear_error(&error
);
82 /* but can create this one */
83 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
84 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
86 ok(0 == !lattice
, __func__
);
88 CHECK_LATTICE(lattice
,
90 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
92 /* but can create this one and no GError are produce */
93 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
94 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
96 ok(0 == !lattice
, __func__
);
97 ok(error
== NULL
, __func__
);
99 CHECK_LATTICE(lattice
,
101 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
103 hkl_lattice_free(lattice
);
106 static void new_copy(void)
111 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
112 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
115 /* copy constructor */
116 copy
= hkl_lattice_new_copy(lattice
);
120 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
122 hkl_lattice_free(lattice
);
123 hkl_lattice_free(copy
);
126 static void set(void)
131 lattice
= hkl_lattice_new_default();
133 /* can not set this lattice */
134 ok(FALSE
== hkl_lattice_set(lattice
,
136 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
137 HKL_UNIT_DEFAULT
, NULL
),
140 /* can not set this lattice with GError */
142 ok(FALSE
== hkl_lattice_set(lattice
,
144 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
145 HKL_UNIT_DEFAULT
, &error
),
147 ok(error
!= NULL
, __func__
);
148 g_clear_error(&error
);
150 /* can set this lattice */
151 ok(TRUE
== hkl_lattice_set(lattice
,
153 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
,
154 HKL_UNIT_DEFAULT
, NULL
),
156 CHECK_LATTICE(lattice
,
158 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
);
160 /* can set this lattice with no GError set */
161 ok(TRUE
== hkl_lattice_set(lattice
,
163 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
164 HKL_UNIT_DEFAULT
, &error
),
166 ok(error
== NULL
, __func__
);
167 CHECK_LATTICE(lattice
,
169 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
173 /* can set this lattice in HKL_UNIT_USER with no GError set */
174 ok(TRUE
== hkl_lattice_set(lattice
, 1.54, 1.54, 1.54, 90, 91, 92,
175 HKL_UNIT_USER
, NULL
),
177 CHECK_LATTICE(lattice
,
179 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
);
181 /* can set this lattice in HKL_UNIT_USER with no GError set */
182 ok(TRUE
== hkl_lattice_set(lattice
,
183 1.54, 1.54, 1.54, 90, 91, 90,
184 HKL_UNIT_USER
, &error
),
186 ok(error
== NULL
, __func__
);
187 CHECK_LATTICE(lattice
,
189 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
191 /* check individual accessor */
192 SET_LATTICE(lattice
, 1.54, 1.54, 1.54, 90*HKL_DEGTORAD
, 91 * HKL_DEGTORAD
, 91 * HKL_DEGTORAD
);
193 CHECK_LATTICE(lattice
, 1.54, 1.54, 1.54, 90*HKL_DEGTORAD
, 91 * HKL_DEGTORAD
, 91 * HKL_DEGTORAD
);
195 hkl_lattice_free(lattice
);
198 static void reciprocal(void)
201 HklLattice
*reciprocal
;
203 lattice
= hkl_lattice_new_default();
204 reciprocal
= hkl_lattice_new_default();
207 ok(TRUE
== hkl_lattice_set(lattice
, 1.54, 1.54, 1.54,
208 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
209 HKL_UNIT_DEFAULT
, NULL
),
212 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
214 CHECK_LATTICE(reciprocal
,
215 HKL_TAU
/ 1.54, HKL_TAU
/ 1.54, HKL_TAU
/ 1.54,
216 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
219 ok(TRUE
== hkl_lattice_set(lattice
,
221 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
222 HKL_UNIT_DEFAULT
, NULL
),
224 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
226 CHECK_LATTICE(reciprocal
,
227 HKL_TAU
/ 1., HKL_TAU
/ 3., HKL_TAU
/ 4.,
228 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
231 ok(TRUE
== hkl_lattice_set(lattice
,
233 90 * HKL_DEGTORAD
, 120 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
234 HKL_UNIT_DEFAULT
, NULL
),
236 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
238 CHECK_LATTICE(reciprocal
,
239 HKL_TAU
* 2. / sqrt(3.), HKL_TAU
/ 2., HKL_TAU
* 2. / sqrt(3.),
240 90. * HKL_DEGTORAD
, 60. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
);
243 ok(TRUE
== hkl_lattice_set(lattice
, 2., 1., 1.,
244 120 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
245 HKL_UNIT_DEFAULT
, NULL
),
247 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
249 CHECK_LATTICE(reciprocal
,
250 HKL_TAU
/ 2., HKL_TAU
* 2. / sqrt(3.), HKL_TAU
* 2. / sqrt(3.),
251 60. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
);
254 ok(TRUE
== hkl_lattice_set(lattice
, 9.32, 8.24, 13.78,
255 91.23 * HKL_DEGTORAD
, 93.64 * HKL_DEGTORAD
, 122.21 * HKL_DEGTORAD
,
256 HKL_UNIT_DEFAULT
, NULL
),
258 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
260 CHECK_LATTICE(reciprocal
,
261 HKL_TAU
* 0.1273130168,HKL_TAU
* 0.1437422974,HKL_TAU
* 0.0728721120,
262 1.5052513337, 1.482101482, 1.0055896011);
265 ok(TRUE
== hkl_lattice_set(lattice
, 18.423, 18.417,
266 18.457, 89.99 * HKL_DEGTORAD
, 89.963 * HKL_DEGTORAD
, 119.99 * HKL_DEGTORAD
,
267 HKL_UNIT_DEFAULT
, NULL
),
269 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
271 CHECK_LATTICE(reciprocal
,
272 HKL_TAU
* 0.0626708259,HKL_TAU
* 0.0626912310,HKL_TAU
* 0.0541800061,
273 1.5713705262, 1.5716426508, 1.0473718249);
275 hkl_lattice_free(lattice
);
276 hkl_lattice_free(reciprocal
);
279 static void get_B(void)
281 HklMatrix
*B_ref
= hkl_matrix_new_full(HKL_TAU
/ 1.54, 0, 0,
282 0, HKL_TAU
/ 1.54, 0,
283 0, 0, HKL_TAU
/ 1.54);
285 HklMatrix
*B
= hkl_matrix_new();
288 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
289 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
292 hkl_lattice_get_B(lattice
, B
);
293 is_matrix(B_ref
, B
, __func__
);
295 hkl_lattice_free(lattice
);
297 hkl_matrix_free(B_ref
);
300 static void get_1_B(void)
302 HklMatrix
*I_ref
= hkl_matrix_new_full(1, 0, 0,
306 HklMatrix
*I
= hkl_matrix_new();
307 HklMatrix
*B_1
= hkl_matrix_new();
310 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
311 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
314 hkl_lattice_get_B(lattice
, I
);
315 hkl_lattice_get_1_B(lattice
, B_1
);
317 /* B times B^-1 = Identity */
318 hkl_matrix_times_matrix(I
, B_1
);
319 is_matrix(I_ref
, I
, __func__
);
321 hkl_lattice_free(lattice
);
322 hkl_matrix_free(B_1
);
324 hkl_matrix_free(I_ref
);
327 int main(int argc
, char** argv
)