19#define YAC_RAD (0.01745329251994329576923690768489)
21static char const *
cmd;
22#define STR_USAGE "Usage: %s -n grid_name -f grid_filename -o vtk_filename\n"
24#define YAC_ASSERT(exp, msg) \
27 fprintf(stderr, "ERROR: %s\n" STR_USAGE, msg, cmd); \
32#define YAC_ASSERT_F(exp, format, ...) \
35 fprintf(stderr, "ERROR: " format "\n" STR_USAGE, __VA_ARGS__, cmd); \
41 char const ** grid_filename,
42 char const ** grid_name,
43 char const ** vtk_filename);
45 char const * grid_filename,
char const * grid_name,
46 size_t * nv,
size_t * nc,
48 int ** gid,
int ** cmk,
int ** rnk);
50 char const * vtk_filename,
char const * grid_name,
53 int * gid,
int * cmk,
int * rnk);
55int main(
int argc,
char ** argv) {
59 char const * grid_name, * grid_filename, * vtk_filename;
64 int * gid, * cmk, * rnk;
67 grid_filename, grid_name,
68 &nv, &nc, &
clon, &
clat, &lon, &lat, &gid, &cmk, &rnk);
71 vtk_filename, grid_name,
72 nv, nc,
clon,
clat, lon, lat, gid, cmk, rnk);
83static double *
read_coords(
int ncid,
int varid,
size_t varlen) {
87 double * coord = malloc(varlen *
sizeof(*coord));
91 if (is_degree)
for (
size_t i = 0; i < varlen; ++i) coord[i] *=
YAC_RAD;
96static int *
read_int(
int ncid,
int varid,
size_t varlen) {
98 int * array = malloc(varlen *
sizeof(*array));
104 char const * grid_filename,
char const * grid_name,
105 size_t * nv,
size_t * nc,
106 double **
clon,
double **
clat,
double ** lon,
double ** lat,
107 int ** gid,
int ** cmk,
int ** rnk) {
111 size_t grid_name_len = strlen(grid_name) + 1;
112 char nv_dim_name[3 + grid_name_len];
113 char nc_dim_name[3 + grid_name_len];
114 char cla_var_name[4 + grid_name_len];
115 char clo_var_name[4 + grid_name_len];
116 char lat_var_name[4 + grid_name_len];
117 char lon_var_name[4 + grid_name_len];
118 char gid_var_name[4 + grid_name_len];
119 char cmk_var_name[4 + grid_name_len];
120 char rnk_var_name[4 + grid_name_len];
122 snprintf(nv_dim_name, 3 + grid_name_len,
"nv_%s", grid_name);
123 snprintf(nc_dim_name, 3 + grid_name_len,
"nc_%s", grid_name);
124 snprintf(cla_var_name, 4 + grid_name_len,
"%s.cla", grid_name);
125 snprintf(clo_var_name, 4 + grid_name_len,
"%s.clo", grid_name);
126 snprintf(lat_var_name, 4 + grid_name_len,
"%s.lat", grid_name);
127 snprintf(lon_var_name, 4 + grid_name_len,
"%s.lon", grid_name);
128 snprintf(gid_var_name, 4 + grid_name_len,
"%s.gid", grid_name);
129 snprintf(cmk_var_name, 4 + grid_name_len,
"%s.cmk", grid_name);
130 snprintf(rnk_var_name, 4 + grid_name_len,
"%s.rnk", grid_name);
133 yac_file_exists(grid_filename),
"File %s does not exist.", grid_filename)
135 int ncid, dimid, var_id;
148 status = nc_inq_varid(ncid, lat_var_name, &var_id);
149 if (status == NC_NOERR) {
151 }
else if (status == NC_ENOTVAR) {
156 status = nc_inq_varid(ncid, lon_var_name, &var_id);
157 if (status == NC_NOERR) {
159 }
else if (status == NC_ENOTVAR) {
165 status = nc_inq_varid(ncid, gid_var_name, &var_id);
166 if (status == NC_NOERR) {
168 }
else if (status == NC_ENOTVAR) {
174 status = nc_inq_varid(ncid, cmk_var_name, &var_id);
175 if (status == NC_NOERR) {
177 }
else if (status == NC_ENOTVAR) {
189static void LLtoXYZ(
double lon,
double lat,
double p_out[]) {
191 if ((fabs(lon) > 8.0 * M_PI) || (fabs(lat) > 2.0 * M_PI)) {
198 while (lon < -M_PI) lon += 2.0 * M_PI;
199 while (lon >= M_PI) lon -= 2.0 * M_PI;
201 double cos_lat = cos(lat);
202 p_out[0] = cos_lat * cos(lon);
203 p_out[1] = cos_lat * sin(lon);
208 char const * vtk_filename,
char const * grid_name,
209 size_t nv,
size_t nc,
210 double *
clon,
double *
clat,
double * lon,
double * lat,
211 int * gid,
int * cmk,
int * rnk) {
214 malloc((nv * nc + ((lon && lat)?nc:0)) *
sizeof(*points));
218 for (
size_t i = 0; i < nc; ++i)
221 unsigned * num_points_per_polygon =
222 malloc(nc *
sizeof(*num_points_per_polygon));
223 for (
size_t i = 0; i < nc; ++i) num_points_per_polygon[i] = (
unsigned)nv;
225 unsigned * polygon_data = malloc(nc * nv *
sizeof(*polygon_data));
226 for (
size_t i = 0; i < nv * nc; ++i) polygon_data[i] = (
unsigned)i;
231 file, polygon_data, num_points_per_polygon, nc);
238 free(num_points_per_polygon);
243 char const ** grid_filename,
244 char const ** grid_name,
245 char const ** vtk_filename) {
248 *grid_filename = NULL;
249 *vtk_filename = NULL;;
252 while ((opt = getopt(argc, argv,
"n:f:o:")) != -1) {
256 (opt ==
'o'),
"invalid command argument")
263 *grid_filename = optarg;
266 *vtk_filename = optarg;
270 YAC_ASSERT_F(optind >= argc,
"non-option ARGV-element: \"%s\"", argv[optind])
272 YAC_ASSERT(*grid_name != NULL,
"grid_name argument is missing")
273 YAC_ASSERT(*grid_filename != NULL,
"grid_filename argument is missing")
274 YAC_ASSERT(*vtk_filename != NULL,
"vtk_filename argument is missing")
static void parse_arguments(int argc, char **argv, char const **grid_filename, char const **grid_name, char const **vtk_filename)
static void write_vtk_file(char const *vtk_filename, char const *grid_name, size_t nv, size_t nc, double *clon, double *clat, double *vlon, double *vlat, int *gid, int *cmk, int *rnk)
#define YAC_ASSERT_F(exp, format,...)
static double * read_coords(int ncid, int varid, size_t varlen)
static int * read_int(int ncid, int varid, size_t varlen)
static void LLtoXYZ(double lon, double lat, double p_out[])
static void read_grid_file(char const *grid_filename, char const *grid_name, size_t *nv, size_t *nc, double **clon, double **clat, double **vlon, double **vlat, int **gid, int **cmk, int **rnk)
#define YAC_ASSERT(exp, msg)
void yac_nc_inq_varid(int ncid, char const *name, int *varidp)
void yac_nc_open(const char *path, int omode, int *ncidp)
void yac_nc_inq_dimid(int ncid, char const *name, int *dimidp)
int yac_file_exists(const char *filename)
int yac_check_coord_units(int ncid, int varid)
#define YAC_HANDLE_ERROR(exp)
void yac_vtk_write_cell_scalars_int(YAC_VTK_FILE *vtk_file, int *scalars, unsigned num_cells, char *name)
void yac_vtk_write_point_data(YAC_VTK_FILE *vtk_file, double *point_data, unsigned num_points)
void yac_vtk_close(YAC_VTK_FILE *vtk_file)
void yac_vtk_write_cell_data(YAC_VTK_FILE *vtk_file, unsigned *cell_corners, unsigned *num_points_per_cell, unsigned num_cells)
YAC_VTK_FILE * yac_vtk_open(const char *filename, const char *title)
static struct user_input_data_points ** points
double(* yac_coordinate_pointer)[3]