1 /*
2 * Copyright (c) 2012-2021, The OSKAR Developers.
3 * See the LICENSE file at the top-level directory of this distribution.
4 */
5
6 #include "apps/oskar_app_settings.h"
7 #include "apps/oskar_settings_log.h"
8 #include "apps/oskar_settings_to_interferometer.h"
9 #include "apps/oskar_settings_to_sky.h"
10 #include "apps/oskar_settings_to_telescope.h"
11 #include "log/oskar_log.h"
12 #include "settings/oskar_option_parser.h"
13 #include "interferometer/oskar_interferometer.h"
14 #include "utility/oskar_get_error_string.h"
15 #include "utility/oskar_version_string.h"
16
17 #include <cstdio>
18 #include <cstdlib>
19
20 using namespace oskar;
21
22 static const char app[] = "oskar_sim_interferometer";
23
main(int argc,char ** argv)24 int main(int argc, char** argv)
25 {
26 OptionParser opt(app, oskar_version_string(), oskar_app_settings(app));
27 opt.add_settings_options();
28 opt.add_flag("-q", "Suppress printing.", false, "--quiet");
29 if (!opt.check_options(argc, argv)) return EXIT_FAILURE;
30 const char* settings = opt.get_arg(0);
31 int status = 0;
32
33 // Load the settings file.
34 SettingsTree* s = oskar_app_settings_tree(app, settings);
35 if (!s)
36 {
37 oskar_log_error(0, "Failed to read settings file '%s'", settings);
38 return EXIT_FAILURE;
39 }
40
41 // Get/set setting if necessary.
42 if (opt.is_set("--get"))
43 {
44 printf("%s\n", s->to_string(opt.get_arg(1), &status));
45 SettingsTree::free(s);
46 return !status ? 0 : EXIT_FAILURE;
47 }
48 else if (opt.is_set("--set"))
49 {
50 const char* key = opt.get_arg(1);
51 const char* val = opt.get_arg(2);
52 bool ok = val ? s->set_value(key, val) : s->set_default(key);
53 if (!ok) oskar_log_error(0, "Failed to set '%s'='%s'", key, val);
54 SettingsTree::free(s);
55 return ok ? 0 : EXIT_FAILURE;
56 }
57
58 // Set up the interferometer simulator.
59 oskar_Interferometer* sim =
60 oskar_settings_to_interferometer(s, NULL, &status);
61 oskar_Log* log = oskar_interferometer_log(sim);
62 int priority = opt.is_set("-q") ? OSKAR_LOG_WARNING : OSKAR_LOG_STATUS;
63 oskar_log_set_term_priority(log, priority);
64
65 // Write settings to log.
66 oskar_settings_log(s, log);
67
68 // Set up the sky model and telescope model.
69 oskar_Telescope* tel = 0;
70 oskar_Sky* sky = oskar_settings_to_sky(s, log, &status);
71 if (!sky || status)
72 {
73 oskar_log_error(log, "Failed to set up sky model: %s.",
74 oskar_get_error_string(status));
75 }
76 else
77 {
78 tel = oskar_settings_to_telescope(s, log, &status);
79 if (!tel || status)
80 {
81 oskar_log_error(log, "Failed to set up telescope model: %s.",
82 oskar_get_error_string(status));
83
84 }
85 }
86
87 // Set sky and telescope models.
88 if (sky && tel)
89 {
90 oskar_interferometer_set_sky_model(sim, sky, &status);
91 oskar_interferometer_set_telescope_model(sim, tel, &status);
92 }
93 oskar_sky_free(sky, &status);
94 oskar_telescope_free(tel, &status);
95
96 // Run simulation.
97 oskar_interferometer_run(sim, &status);
98
99 // Free memory.
100 oskar_interferometer_free(sim, &status);
101 SettingsTree::free(s);
102 return status ? EXIT_FAILURE : EXIT_SUCCESS;
103 }
104