12 double north_pole[3]) {
20 "ERROR(yac_rotate_coordinates): "
21 "new north pole is the original north pole "
22 "(new north pole (%.3lf; %.3lf; %.3lf); angle (sin: %e, cos: %e)",
23 north_pole[0], north_pole[1], north_pole[2], rot_angle.
sin, rot_angle.
cos);
27 "ERROR(yac_rotate_coordinates): "
28 "new north pole is on the southern hemisphere "
29 "(new north pole (%.3lf; %.3lf; %.3lf); angle (sin: %e, cos: %e)",
30 north_pole[0], north_pole[1], north_pole[2], rot_angle.
sin, rot_angle.
cos);
38 for (
size_t i = 0; i < num_coordinates; ++i) {
41 coordinates[i][0] = temp[0];
42 coordinates[i][1] = temp[1];
43 coordinates[i][2] = temp[2];
48 size_t nbr_vertices[2], int
cyclic[2],
49 double *lon_vertices,
double *lat_vertices,
50 double north_pol_lon,
double north_pol_lat,
51 void (*LLtoXYZ_ptr)(double, double,
double[])) {
55 "ERROR(yac_generate_basic_grid_data_reg_2d_rot): "
56 "cyclic[1] != 0 not yet supported")
58 size_t num_cells_2d[2] =
59 {nbr_vertices[0] - (
cyclic[0]?0:1), nbr_vertices[1] - (
cyclic[1]?0:1)};
60 size_t num_vertices_2d[2] = {num_cells_2d[0] + (
cyclic[0]?0:1), num_cells_2d[1] + 1};
61 size_t num_vertices = num_vertices_2d[0] * num_vertices_2d[1];
63 (num_cells_2d[0] + (
cyclic[0]?0:1)) * num_cells_2d[1] +
64 num_cells_2d[0] * (num_cells_2d[1] + 1);
68 for (
size_t i = 0, k = 0; i < num_vertices_2d[1]; ++i)
69 for (
size_t j = 0; j < num_vertices_2d[0]; ++j, ++k)
74 LLtoXYZ_ptr(north_pol_lon, north_pol_lat, north_pole);
88 size_t nbr_vertices[2], int
cyclic[2],
89 double *lon_vertices,
double *lat_vertices,
90 double north_pol_lon,
double north_pol_lat) {
94 nbr_vertices,
cyclic, lon_vertices, lat_vertices,
95 north_pol_lon, north_pol_lat,
LLtoXYZ);
99 size_t nbr_vertices[2], int
cyclic[2],
100 double *lon_vertices,
double *lat_vertices,
101 double north_pol_lon,
double north_pol_lat) {
105 nbr_vertices,
cyclic, lon_vertices, lat_vertices,
#define YAC_ASSERT(exp, msg)
static struct sin_cos_angle get_vector_angle_2(double const a[3], double const b[3])
static void crossproduct_kahan(double const a[], double const b[], double cross[])
static const struct sin_cos_angle SIN_COS_TOL
static const struct sin_cos_angle SIN_COS_M_PI_2
static void rotate_vector2(double axis[], struct sin_cos_angle angle, double v_in[], double v_out[])
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
static int compare_angles(struct sin_cos_angle a, struct sin_cos_angle b)
static void normalise_vector(double v[])
@ YAC_GREAT_CIRCLE_EDGE
great circle
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d_common(size_t nbr_vertices[2], int cyclic[2])
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_rot(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pol_lon, double north_pol_lat)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_rot_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pol_lon, double north_pol_lat)
void yac_rotate_coordinates(yac_coordinate_pointer coordinates, size_t num_coordinates, double north_pole[3])
static struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_rot_(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pol_lon, double north_pol_lat, void(*LLtoXYZ_ptr)(double, double, double[]))
yac_coordinate_pointer vertex_coordinates
enum yac_edge_type * edge_type
static void LLtoXYZ(double lon, double lat, double p_out[])
#define YAC_ASSERT_F(exp, format,...)
double(* yac_coordinate_pointer)[3]