void oskar_telescope_load_position(oskar_Telescope* telescope, const char* filename, int* status) { int num_coords; oskar_Mem *lon, *lat, *alt; /* Load columns from file. */ lon = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); lat = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); alt = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); num_coords = (int) oskar_mem_load_ascii(filename, 3, status, lon, "", lat, "", alt, "0.0"); /* Set the telescope centre coordinates. */ if (num_coords == 1) { telescope->lon_rad = (oskar_mem_double(lon, status))[0] * M_PI / 180.0; telescope->lat_rad = (oskar_mem_double(lat, status))[0] * M_PI / 180.0; telescope->alt_metres = (oskar_mem_double(alt, status))[0]; } else { *status = OSKAR_ERR_BAD_COORD_FILE; } /* Free memory. */ oskar_mem_free(lon, status); oskar_mem_free(lat, status); oskar_mem_free(alt, status); }
int main(int argc, char** argv) { int status = 0; oskar::OptionParser opt("oskar_convert_geodetic_to_ecef", oskar_version_string()); opt.set_description("Converts geodetic longitude/latitude/altitude to " "Cartesian ECEF coordinates. Assumes WGS84 ellipsoid."); opt.add_required("input file", "Path to file containing input coordinates. " "Angles must be in degrees."); if (!opt.check_options(argc, argv)) return OSKAR_FAIL; const char* filename = opt.get_arg(); // Load the input file. oskar_Mem *lon = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, &status); oskar_Mem *lat = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, &status); oskar_Mem *alt = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, &status); size_t num_points = oskar_mem_load_ascii(filename, 3, &status, lon, "", lat, "", alt, "0.0"); oskar_mem_scale_real(lon, M_PI / 180.0, &status); oskar_mem_scale_real(lat, M_PI / 180.0, &status); // Convert coordinates. oskar_Mem *x = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_points, &status); oskar_Mem *y = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_points, &status); oskar_Mem *z = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_points, &status); oskar_convert_geodetic_spherical_to_ecef(num_points, oskar_mem_double_const(lon, &status), oskar_mem_double_const(lat, &status), oskar_mem_double_const(alt, &status), oskar_mem_double(x, &status), oskar_mem_double(y, &status), oskar_mem_double(z, &status)); // Print converted coordinates. oskar_mem_save_ascii(stdout, 3, num_points, &status, x, y, z); // Clean up. oskar_mem_free(lon, &status); oskar_mem_free(lat, &status); oskar_mem_free(alt, &status); oskar_mem_free(x, &status); oskar_mem_free(y, &status); oskar_mem_free(z, &status); if (status) { oskar_log_error(0, oskar_get_error_string(status)); return status; } return 0; }
void oskar_telescope_set_noise_rms_file(oskar_Telescope* model, const char* filename, int* status) { int i; if (*status) return; for (i = 0; i < model->num_stations; ++i) { oskar_mem_load_ascii(filename, 1, status, oskar_station_noise_rms_jy(model->station[i]), ""); } }
void oskar_telescope_load_station_coords_wgs84(oskar_Telescope* telescope, const char* filename, double longitude, double latitude, double altitude, int* status) { int num_stations; oskar_Mem *lon_deg, *lat_deg, *alt_m; /* Load columns from file into memory. */ lon_deg = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); lat_deg = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); alt_m = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 0, status); num_stations = (int) oskar_mem_load_ascii(filename, 3, status, lon_deg, "", lat_deg, "", alt_m, "0.0"); /* Set the station coordinates. */ oskar_telescope_set_station_coords_wgs84(telescope, longitude, latitude, altitude, num_stations, lon_deg, lat_deg, alt_m, status); /* Free memory. */ oskar_mem_free(lon_deg, status); oskar_mem_free(lat_deg, status); oskar_mem_free(alt_m, status); }