aboutsummaryrefslogtreecommitdiff
path: root/src/pattern_sim.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pattern_sim.c')
-rw-r--r--src/pattern_sim.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/pattern_sim.c b/src/pattern_sim.c
index ab223288..a0d81a9d 100644
--- a/src/pattern_sim.c
+++ b/src/pattern_sim.c
@@ -53,6 +53,14 @@ static void show_help(const char *s)
" this invocation to results/integr.h5.\n"
" -i, --intensities=<file> Specify file containing reflection intensities\n"
" to use.\n"
+" -g, --gradients=<method> Use <method> for the calculation of shape\n"
+" transform intensities. Choose from:\n"
+" mosaic : Take the intensity of the nearest\n"
+" Bragg position.\n"
+" interpolate : Interpolate trilinearly between\n"
+" six adjacent Bragg intensities.\n"
+" phased : As 'interpolate', but take phase\n"
+" values into account.\n"
"\n"
"By default, the simulation aims to be as accurate as possible. For greater\n"
"speed, or for testing, you can choose to disable certain things using the\n"
@@ -158,6 +166,8 @@ int main(int argc, char *argv[])
int config_nosfac = 0;
int config_gpu = 0;
int config_powder = 0;
+ char *grad_str = NULL;
+ GradientMethod grad;
int ndone = 0; /* Number of simulations done (images or not) */
int number = 1; /* Number used for filename of image */
int n_images = 1; /* Generate one image by default */
@@ -178,11 +188,12 @@ int main(int argc, char *argv[])
{"no-noise", 0, &config_nonoise, 1},
{"intensities", 1, NULL, 'i'},
{"powder", 0, &config_powder, 1},
+ {"gradients", 1, NULL, 'g'},
{0, 0, NULL, 0}
};
/* Short options */
- while ((c = getopt_long(argc, argv, "hrn:i:", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "hrn:i:g:", longopts, NULL)) != -1) {
switch (c) {
case 'h' : {
@@ -205,6 +216,11 @@ int main(int argc, char *argv[])
break;
}
+ case 'g' : {
+ grad_str = strdup(optarg);
+ break;
+ }
+
case 0 : {
break;
}
@@ -240,6 +256,28 @@ int main(int argc, char *argv[])
free(intfile);
}
+ if ( grad_str == NULL ) {
+ STATUS("You didn't specify a gradient calculation method, so"
+ " I'm using the 'mosaic' method, which is fastest.\n");
+ grad = GRADIENT_MOSAIC;
+ } else if ( strcmp(grad_str, "mosaic") == 0 ) {
+ grad = GRADIENT_MOSAIC;
+ } else if ( strcmp(grad_str, "interpolate") == 0) {
+ grad = GRADIENT_INTERPOLATE;
+ } else if ( strcmp(grad_str, "phased") == 0) {
+ grad = GRADIENT_PHASED;
+ } else {
+ ERROR("Unrecognised gradient method '%s'\n", grad_str);
+ return 1;
+ }
+ free(grad_str);
+
+ if ( config_gpu && (grad != GRADIENT_MOSAIC) ) {
+ ERROR("Only the mosaic method can be used for gradients when"
+ "calculating on the GPU.\n");
+ return 1;
+ }
+
/* Define image parameters */
image.width = 1024;
image.height = 1024;
@@ -298,7 +336,7 @@ int main(int argc, char *argv[])
get_diffraction_gpu(gctx, &image, na, nb, nc, cell);
} else {
get_diffraction(&image, na, nb, nc, intensities, counts,
- cell, !config_nowater);
+ cell, !config_nowater, grad);
}
if ( image.data == NULL ) {
ERROR("Diffraction calculation failed.\n");