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