gctl/dep/tesseroids/toolkits/tessgrd.c

166 lines
5.3 KiB
C
Raw Normal View History

2024-09-10 15:45:07 +08:00
/*
Program to generate a regular grid of points.
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "../lib/logger.h"
#include "../lib/version.h"
#include "../lib/parsers.h"
/* Print the help message for tessgrd program */
void print_tessgrd_help()
{
printf("Usage: tessgrd [PARAMS] [OPTIONS]\n\n");
printf("Make a regular grid of points.\n\n");
printf("All units either SI or degrees!\n\n");
printf("Output:\n");
printf(" Printed to standard output (stdout) in the format:\n");
printf(" lon1 lat1 height\n");
printf(" lon2 lat1 height\n");
printf(" ... ... ...\n");
printf(" lonNLON lat1 height\n");
printf(" lon1 lat2 height\n");
printf(" ... ... ...\n");
printf(" ... ... ...\n");
printf(" lonNLON latNLAT height\n\n");
printf(" * Comments about the provenance of the data are inserted into\n");
printf(" the top of the output\n\n");
printf("Parameters:\n");
printf(" -r W/E/S/N: Bounding region of the grid.\n");
printf(" -b NLON/NLAT: Number of grid points in the\n");
printf(" longitudinal and latitudinal directions.\n");
printf(" -z HEIGHT: Height of the grid with respect to the\n");
printf(" mean Earth radius.\n");
printf(" -h Print instructions.\n");
printf(" --version Print version and license information.\n");
printf("\nOptions:\n");
printf(" -v Enable verbose printing to stderr.\n");
printf(" -lFILENAME Print log messages to file FILENAME.\n");
print_copyright();
}
/** Main */
int main(int argc, char **argv)
{
TESSGRD_ARGS args;
char progname[] = "tessgrd";
int rc;
FILE *logfile = NULL;
time_t rawtime;
struct tm * timeinfo;
double dlon, dlat;
double lon, lat;
/* Keep track of how many printed. Used to check if produced right amount */
int lons = 0, lats = 0, total = 0;
log_init(LOG_INFO);
rc = parse_tessgrd_args(argc, argv, &args, &print_tessgrd_help);
if(rc == 2)
{
return 0;
}
if(rc == 1)
{
log_warning("Terminating due to bad input");
log_warning("Try '%s -h' for instructions", progname);
return 1;
}
/* Set the appropriate logging level and log to file if necessary */
if(!args.verbose)
{
log_init(LOG_WARNING);
}
if(args.logtofile)
{
logfile = fopen(args.logfname, "w");
if(!logfile)
{
log_error("unable to create log file %s", args.logfname);
log_warning("Terminating due to bad input");
log_warning("Try '%s -h' for instructions", progname);
return 1;
}
log_tofile(logfile, LOG_INFO);
}
/* Print standard verbose */
log_info("%s (Tesseroids project) %s", progname, tesseroids_version);
time(&rawtime);
timeinfo = localtime(&rawtime);
log_info("(local time) %s", asctime(timeinfo));
/* CREATE THE GRID AND PRINT IT TO STDOUT */
log_info("Generating regular grid in region: %g W / %g E / %g S / %g N",
args.w, args.e, args.s, args.n);
log_info("Grid size: %d lon X %d lat = %d points in total", args.nlon,
args.nlat, args.nlon*args.nlat);
/* Define the grid spacing. used nlon or nlat -1 because the borders should
be in the grid */
dlon = (args.e - args.w)/(args.nlon - 1);
dlat = (args.n - args.s)/(args.nlat - 1);
log_info("Grid spacing: %.10f lon / %.10f lat", dlon, dlat);
/* Print a header on the output with provenance information */
printf("# Grid generated with %s %s:\n", progname, tesseroids_version);
printf("# local time: %s", asctime(timeinfo));
printf("# args: -r%g/%g/%g/%g -b%d/%d -z%g\n", args.w, args.e, args.s,
args.n, args.nlon, args.nlat, args.height);
printf("# grid spacing: %.10f lon / %.10f lat\n", dlon, dlat);
printf("# total %d points\n", args.nlon*args.nlat);
/* Make the grid points. Print lon first as x */
for(lat = args.s; lat <= args.n; lat += dlat)
{
lons = 0;
for(lon = args.w; lon <= args.e; lon += dlon)
{
printf("%.15g %.15g %.15g\n", lon, lat, args.height);
lons++;
total++;
}
/* Sometimes prints one less because of rounding errors */
if(lons != args.nlon)
{
printf("%.15g %.15g %.15g\n", lon, lat, args.height);
lons++;
total++;
}
lats++;
printf("\n"); /* To ease plotting in Gnuplot */
}
/* Sometimes prints one less because of rounding errors */
if(lats != args.nlat)
{
lons = 0;
for(lon = args.w; lon <= args.e; lon += dlon)
{
printf("%.15g %.15g %.15g\n", lon, lat, args.height);
lons++;
total++;
}
if(lons != args.nlon)
{
printf("%.15g %.15g %.15g\n", lon, lat, args.height);
lons++;
total++;
}
}
if(total != args.nlat*args.nlon)
{
log_warning("%d total points made instead of required %d", total,
args.nlat*args.nlon);
}
log_info("Total points generated: %d", total);
/* Clean up */
if(args.logtofile)
fclose(logfile);
return 0;
}