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-2013 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>
24 #include <tap/basic.h>
27 static void hkl_test_bench_run_real(HklEngine
*engine
, HklGeometry
*geometry
, size_t n
)
30 const darray_string
*modes
= hkl_engine_modes_get(engine
);
33 /* pseudo -> geometry */
34 darray_foreach(mode
, *modes
){
35 double min
, max
, mean
;
36 const darray_string
*parameters
;
37 const char **parameter
;
39 hkl_engine_select_mode(engine
, *mode
);
40 parameters
= hkl_engine_parameters_get(engine
);
41 if (darray_size(*parameters
)){
44 p
= hkl_parameter_new_copy(hkl_engine_parameter_get(engine
, darray_item(*parameters
, 0)));
45 hkl_parameter_value_set(p
, 1, NULL
);
46 hkl_engine_parameter_set(engine
, p
);
47 hkl_parameter_free(p
);
51 min
= 1000; /* arbitrary value always greater than the real min */
53 struct timeval debut
, fin
, dt
;
56 hkl_geometry_set_values_unit_v(geometry
, 0, 0, 0, 0, 10, 10);
57 gettimeofday(&debut
, NULL
);
58 hkl_engine_set(engine
, NULL
);
59 gettimeofday(&fin
, NULL
);
60 timersub(&fin
, &debut
, &dt
);
61 t
= dt
.tv_sec
* 1000. + dt
.tv_usec
/ 1000.;
62 min
= t
< min
? t
: min
;
63 max
= t
> max
? t
: max
;
66 fprintf(stdout
, "\"%s\" \"%s\" \"%s\" (%d/%d) iterations %f / %f / %f [min/mean/max] ms each\n",
67 hkl_geometry_name_get(geometry
),
68 hkl_engine_name_get(engine
),
69 *mode
, n
, i
, min
, mean
/n
, max
);
73 static void hkl_test_bench_run_v(HklEngineList
*engines
, HklGeometry
*geometry
,
74 char const *name
, unsigned int n
, ...)
78 HklEngine
*engine
= hkl_engine_list_engine_get_by_name(engines
, name
);
79 size_t n_values
= darray_size(*hkl_engine_pseudo_axes_get(engine
));
80 double values
[n_values
];
83 for(i
=0; i
<n_values
; ++i
)
84 values
[i
] = va_arg(ap
, double);
87 hkl_engine_pseudo_axes_values_set(engine
, values
, n_values
, NULL
);
89 hkl_test_bench_run_real(engine
, geometry
, n
);
92 static void hkl_test_bench_k6c(int n
)
94 const HklFactory
*factory
;
95 HklEngineList
*engines
;
98 HklDetector
*detector
;
103 factory
= hkl_factory_get_by_name("K6C");
105 geom
= hkl_factory_create_new_geometry(factory
);
107 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
108 hkl_detector_idx_set(detector
, 1);
110 sample
= hkl_sample_new("test");
112 engines
= hkl_factory_create_new_engine_list(factory
);
113 hkl_engine_list_init(engines
, geom
, detector
, sample
);
115 hkl_test_bench_run_v(engines
, geom
, "hkl", n
, 1., 0., 0.);
116 hkl_test_bench_run_v(engines
, geom
, "eulerians", n
, 0., 90*HKL_DEGTORAD
, 0.);
117 hkl_test_bench_run_v(engines
, geom
, "psi", n
, 10.*HKL_DEGTORAD
);
118 hkl_test_bench_run_v(engines
, geom
, "q2", n
, 1., 10.*HKL_DEGTORAD
);
119 hkl_test_bench_run_v(engines
, geom
, "qper_qpar", n
, 1., 1.);
121 hkl_engine_list_free(engines
);
122 hkl_sample_free(sample
);
123 hkl_detector_free(detector
);
124 hkl_geometry_free(geom
);
127 static void hkl_test_bench_eulerians(void)
129 HklEngineList
*engines
;
132 const darray_string
*modes
;
133 const HklFactory
*factory
;
134 HklGeometry
*geometry
;
135 HklDetector
*detector
;
138 factory
= hkl_factory_get_by_name("K6C");
140 geometry
= hkl_factory_create_new_geometry(factory
);
141 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
142 hkl_detector_idx_set(detector
, 1);
144 sample
= hkl_sample_new("test");
145 engines
= hkl_factory_create_new_engine_list(factory
);
146 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
148 engine
= hkl_engine_list_engine_get_by_name(engines
, "eulerians");
149 modes
= hkl_engine_modes_get(engine
);
151 darray_foreach(mode
, *modes
){
152 static double eulerians
[] = {0, 90 * HKL_DEGTORAD
, 0};
154 hkl_engine_select_mode(engine
, *mode
);
156 /* studdy this degenerated case */
157 hkl_engine_pseudo_axes_values_set(engine
, eulerians
, 3, NULL
);
158 if (hkl_engine_set(engine
, NULL
)) {
159 const HklGeometryList
*geometries
= hkl_engine_list_geometries_get(engines
);
160 const HklGeometryListItem
*item
;
162 HKL_GEOMETRY_LIST_FOREACH(item
, geometries
){
163 static double null
[] = {0, 0, 0};
165 hkl_engine_pseudo_axes_values_set(engine
, null
, 3, NULL
);
166 hkl_geometry_set(geometry
,
167 hkl_geometry_list_item_geometry_get(item
));
168 hkl_engine_get(engine
, NULL
);
173 hkl_engine_list_free(engines
);
174 hkl_sample_free(sample
);
175 hkl_detector_free(detector
);
176 hkl_geometry_free(geometry
);
179 int main(int argc
, char **argv
)
190 hkl_test_bench_k6c(n
);
191 hkl_test_bench_eulerians();
193 ok(HKL_TRUE
== HKL_TRUE
, __func__
);