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