1 /*
2 * Copyright (c) 2011-2021, The OSKAR Developers.
3 * See the LICENSE file at the top-level directory of this distribution.
4 */
5
6 #include "telescope/station/private_station.h"
7 #include "telescope/station/oskar_station.h"
8 #include "math/oskar_cmath.h"
9 #include <string.h>
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
oskar_station_resize(oskar_Station * station,int num_elements,int * status)15 void oskar_station_resize(oskar_Station* station, int num_elements,
16 int* status)
17 {
18 int feed = 0, dim = 0;
19 if (*status || !station) return;
20 for (feed = 0; feed < 2; feed++)
21 {
22 for (dim = 0; dim < 3; dim++)
23 {
24 oskar_mem_realloc(station->element_true_enu_metres[feed][dim],
25 num_elements, status);
26 oskar_mem_realloc(station->element_measured_enu_metres[feed][dim],
27 num_elements, status);
28 oskar_mem_realloc(station->element_euler_cpu[feed][dim],
29 num_elements, status);
30 }
31 oskar_mem_realloc(station->element_weight[feed],
32 num_elements, status);
33 oskar_mem_realloc(station->element_cable_length_error[feed],
34 num_elements, status);
35 oskar_mem_realloc(station->element_gain[feed],
36 num_elements, status);
37 oskar_mem_realloc(station->element_gain_error[feed],
38 num_elements, status);
39 oskar_mem_realloc(station->element_phase_offset_rad[feed],
40 num_elements, status);
41 oskar_mem_realloc(station->element_phase_error_rad[feed],
42 num_elements, status);
43 }
44 oskar_mem_realloc(station->element_types, num_elements, status);
45 oskar_mem_realloc(station->element_types_cpu, num_elements, status);
46 oskar_mem_realloc(station->element_mount_types_cpu, num_elements, status);
47
48 /* Initialise any new elements with default values. */
49 if (num_elements > station->num_elements)
50 {
51 int offset = 0, num_new = 0;
52 offset = station->num_elements;
53 num_new = num_elements - offset;
54
55 /* Must set default element weight and gain. */
56 for (feed = 0; feed < 2; feed++)
57 {
58 if (station->element_gain[feed])
59 {
60 oskar_mem_set_value_real(station->element_gain[feed],
61 1.0, offset, num_new, status);
62 }
63 if (station->element_weight[feed])
64 {
65 oskar_mem_set_value_real(station->element_weight[feed],
66 1.0, offset, num_new, status);
67 }
68 }
69 memset(oskar_mem_char(station->element_mount_types_cpu) + offset,
70 'F', num_new);
71 }
72
73 /* Set the new number of elements. */
74 station->num_elements = num_elements;
75 }
76
77 #ifdef __cplusplus
78 }
79 #endif
80