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-2019, 2021, 2023, 2024 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 /* check GError generation */
84 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
85 90*HKL_DEGTORAD
, (90+360)*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
87 ok(NULL
== lattice
, __func__
);
88 ok(error
!= NULL
, __func__
);
89 g_clear_error(&error
);
91 /* but can create this one */
92 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
93 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
95 ok(0 == !lattice
, __func__
);
96 CHECK_LATTICE(lattice
,
98 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
99 hkl_lattice_free(lattice
);
101 /* but can create this one and no GError are produce */
102 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
103 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
105 ok(0 == !lattice
, __func__
);
106 ok(error
== NULL
, __func__
);
107 CHECK_LATTICE(lattice
,
109 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
110 hkl_lattice_free(lattice
);
113 static void new_copy(void)
118 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
119 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
122 /* copy constructor */
123 copy
= hkl_lattice_new_copy(lattice
);
127 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
129 hkl_lattice_free(lattice
);
130 hkl_lattice_free(copy
);
133 static void set(void)
138 lattice
= hkl_lattice_new_default();
140 /* can not set this lattice */
141 ok(FALSE
== hkl_lattice_set(lattice
,
143 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
144 HKL_UNIT_DEFAULT
, NULL
),
147 /* check that the lattice was not changed */
148 CHECK_LATTICE(lattice
,
150 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
152 /* can not set this lattice with GError */
154 ok(FALSE
== hkl_lattice_set(lattice
,
156 90*HKL_DEGTORAD
, 10*HKL_DEGTORAD
, 120*HKL_DEGTORAD
,
157 HKL_UNIT_DEFAULT
, &error
),
159 ok(error
!= NULL
, __func__
);
160 g_clear_error(&error
);
162 /* can set this lattice */
163 ok(TRUE
== hkl_lattice_set(lattice
,
165 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
,
166 HKL_UNIT_DEFAULT
, NULL
),
168 CHECK_LATTICE(lattice
,
170 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
);
172 /* can set this lattice with no GError set */
173 ok(TRUE
== hkl_lattice_set(lattice
,
175 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
176 HKL_UNIT_DEFAULT
, &error
),
178 ok(error
== NULL
, __func__
);
179 CHECK_LATTICE(lattice
,
181 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
185 /* can set this lattice in HKL_UNIT_USER with no GError set */
186 ok(TRUE
== hkl_lattice_set(lattice
, 1.54, 1.54, 1.54, 90, 91, 92,
187 HKL_UNIT_USER
, NULL
),
189 CHECK_LATTICE(lattice
,
191 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 92*HKL_DEGTORAD
);
193 /* can set this lattice in HKL_UNIT_USER with no GError set */
194 ok(TRUE
== hkl_lattice_set(lattice
,
195 1.54, 1.54, 1.54, 90, 91, 90,
196 HKL_UNIT_USER
, &error
),
198 ok(error
== NULL
, __func__
);
199 CHECK_LATTICE(lattice
,
201 90*HKL_DEGTORAD
, 91*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
203 /* check individual accessor */
204 SET_LATTICE(lattice
, 1.54, 1.54, 1.54, 90*HKL_DEGTORAD
, 91 * HKL_DEGTORAD
, 91 * HKL_DEGTORAD
);
205 CHECK_LATTICE(lattice
, 1.54, 1.54, 1.54, 90*HKL_DEGTORAD
, 91 * HKL_DEGTORAD
, 91 * HKL_DEGTORAD
);
207 hkl_lattice_free(lattice
);
210 static void reciprocal(void)
213 HklLattice
*reciprocal
;
215 lattice
= hkl_lattice_new_default();
216 reciprocal
= hkl_lattice_new_default();
219 ok(TRUE
== hkl_lattice_set(lattice
, 1.54, 1.54, 1.54,
220 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
221 HKL_UNIT_DEFAULT
, NULL
),
224 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
226 CHECK_LATTICE(reciprocal
,
227 HKL_TAU
/ 1.54, HKL_TAU
/ 1.54, HKL_TAU
/ 1.54,
228 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
231 ok(TRUE
== hkl_lattice_set(lattice
,
233 90 * HKL_DEGTORAD
, 90 * 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
/ 1., HKL_TAU
/ 3., HKL_TAU
/ 4.,
240 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
);
243 ok(TRUE
== hkl_lattice_set(lattice
,
245 90 * HKL_DEGTORAD
, 120 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
246 HKL_UNIT_DEFAULT
, NULL
),
248 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
250 CHECK_LATTICE(reciprocal
,
251 HKL_TAU
* 2. / sqrt(3.), HKL_TAU
/ 2., HKL_TAU
* 2. / sqrt(3.),
252 90. * HKL_DEGTORAD
, 60. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
);
255 ok(TRUE
== hkl_lattice_set(lattice
, 2., 1., 1.,
256 120 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
257 HKL_UNIT_DEFAULT
, NULL
),
259 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
261 CHECK_LATTICE(reciprocal
,
262 HKL_TAU
/ 2., HKL_TAU
* 2. / sqrt(3.), HKL_TAU
* 2. / sqrt(3.),
263 60. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
, 90. * HKL_DEGTORAD
);
266 ok(TRUE
== hkl_lattice_set(lattice
, 9.32, 8.24, 13.78,
267 91.23 * HKL_DEGTORAD
, 93.64 * HKL_DEGTORAD
, 122.21 * HKL_DEGTORAD
,
268 HKL_UNIT_DEFAULT
, NULL
),
270 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
272 CHECK_LATTICE(reciprocal
,
273 HKL_TAU
* 0.1273130168,HKL_TAU
* 0.1437422974,HKL_TAU
* 0.0728721120,
274 1.5052513337, 1.482101482, 1.0055896011);
277 ok(TRUE
== hkl_lattice_set(lattice
, 18.423, 18.417,
278 18.457, 89.99 * HKL_DEGTORAD
, 89.963 * HKL_DEGTORAD
, 119.99 * HKL_DEGTORAD
,
279 HKL_UNIT_DEFAULT
, NULL
),
281 ok(TRUE
== hkl_lattice_reciprocal(lattice
, reciprocal
), __func__
);
283 CHECK_LATTICE(reciprocal
,
284 HKL_TAU
* 0.0626708259,HKL_TAU
* 0.0626912310,HKL_TAU
* 0.0541800061,
285 1.5713705262, 1.5716426508, 1.0473718249);
287 hkl_lattice_free(lattice
);
288 hkl_lattice_free(reciprocal
);
291 static void volume(void)
294 HklLattice
*reciprocal
;
296 lattice
= hkl_lattice_new_default();
297 reciprocal
= hkl_lattice_new_default();
300 (DIAG(hkl_lattice_set(lattice
, 1.54, 1.54, 1.54,
301 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
, 90*HKL_DEGTORAD
,
302 HKL_UNIT_DEFAULT
, NULL
)));
303 CHECK_PARAM(lattice
, volume
, 1.54*1.54*1.54);
305 hkl_lattice_reciprocal(lattice
, reciprocal
);
306 CHECK_PARAM(reciprocal
, volume
, (HKL_TAU
* HKL_TAU
* HKL_TAU
)/(1.54*1.54*1.54));
308 hkl_lattice_free(lattice
);
309 hkl_lattice_free(reciprocal
);
312 static void get_B(void)
314 HklMatrix
*B_ref
= hkl_matrix_new_full(HKL_TAU
/ 1.54, 0, 0,
315 0, HKL_TAU
/ 1.54, 0,
316 0, 0, HKL_TAU
/ 1.54);
318 HklMatrix
*B
= hkl_matrix_new();
321 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
322 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
325 hkl_lattice_get_B(lattice
, B
);
326 is_matrix(B_ref
, B
, __func__
);
328 hkl_lattice_free(lattice
);
330 hkl_matrix_free(B_ref
);
333 static void get_1_B(void)
335 HklMatrix
*I_ref
= hkl_matrix_new_full(1, 0, 0,
339 HklMatrix
*I
= hkl_matrix_new();
340 HklMatrix
*B_1
= hkl_matrix_new();
343 lattice
= hkl_lattice_new(1.54, 1.54, 1.54,
344 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
, 90 * HKL_DEGTORAD
,
347 hkl_lattice_get_B(lattice
, I
);
348 hkl_lattice_get_1_B(lattice
, B_1
);
350 /* B times B^-1 = Identity */
351 hkl_matrix_times_matrix(I
, B_1
);
352 is_matrix(I_ref
, I
, __func__
);
354 hkl_lattice_free(lattice
);
355 hkl_matrix_free(B_1
);
357 hkl_matrix_free(I_ref
);