From ff5ef2b3bb57ad62cba671a3ca366da3c1166886 Mon Sep 17 00:00:00 2001 From: Don Cross Date: Tue, 30 Jun 2020 17:58:42 -0400 Subject: [PATCH] Starting to implement ValidateTop2013(). Adding infrastructure for loading TOP2013 models of planets and calculating them. Will start with a unit test to verify I'm calculating the formulas correctly. --- generate/build | 3 ++- generate/generate.c | 30 +++++++++++++++++++++ generate/run | 2 +- generate/top2013/top2013.c | 44 +++++++++++++++++++++++++++++++ generate/top2013/top2013.h | 53 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 generate/top2013/top2013.c create mode 100644 generate/top2013/top2013.h diff --git a/generate/build b/generate/build index 49c2e556..0d5d2b56 100755 --- a/generate/build +++ b/generate/build @@ -12,7 +12,7 @@ else exit 1 fi -${CC} ${BUILDOPT} -Wall -Werror -o generate -I novas -I vsop \ +${CC} ${BUILDOPT} -Wall -Werror -o generate -I novas -I vsop -I top2013 -I . \ generate.c \ earth.c \ astro_vector.c \ @@ -20,6 +20,7 @@ ${CC} ${BUILDOPT} -Wall -Werror -o generate -I novas -I vsop \ codegen.c \ ephfile.c \ vsop/vsop.c \ + top2013/top2013.c \ novas/novas.c \ novas/novascon.c \ novas/nutation.c \ diff --git a/generate/generate.c b/generate/generate.c index c70e39ff..b1e19a00 100644 --- a/generate/generate.c +++ b/generate/generate.c @@ -42,6 +42,7 @@ #include "ephfile.h" #include "novas_body.h" #include "vsop.h" +#include "top2013.h" int Verbose; #define DEBUG(...) do{if(Verbose)printf(__VA_ARGS__);}while(0) @@ -92,6 +93,7 @@ static int UnitTestChebyshev(void); static int DistancePlot(const char *name, double tt1, double tt2); static int ImproveVsopApsides(vsop_model_t *model); static int DeltaTimePlot(const char *outFileName); +static int ValidateTop2013(int planet); #define MOON_PERIGEE 0.00238 #define MERCURY_APHELION 0.466697 @@ -142,6 +144,9 @@ int main(int argc, const char *argv[]) if (argc == 2 && !strcmp(argv[1], "pluto")) return GeneratePluto(); + if (argc == 3 && !strcmp(argv[1], "validate_top2013")) + return ValidateTop2013(atoi(argv[2])); + if (argc == 2 && !strcmp(argv[1], "apsis")) return GenerateApsisTestData(); @@ -191,6 +196,15 @@ static int PrintUsage(void) "generate dtplot outfile.csv\n" " Generate a CSV plot of the Delta-T extrapolator.\n" "\n" + "generate validate_top2013 planet\n" + " Validates code for calculating outer planet positions using TOP2013.\n" + " The 'planet' parameter is one of the following:\n" + " 5 = Jupiter\n" + " 6 = Saturn\n" + " 7 = Uranus\n" + " 8 = Neptune\n" + " 9 = Pluto\n" + "\n" ); return 1; @@ -1837,3 +1851,19 @@ fail: if (outfile != NULL) fclose(outfile); return error; } + +/*-----------------------------------------------------------------------------------------*/ + +static int ValidateTop2013(int planet) +{ + int error = 1; + top_model_t model; + + TopInitModel(&model); + + CHECK(TopLoadModel(&model, "TOP2013.dat", planet)); + +fail: + TopFreeModel(&model); + return error; +} diff --git a/generate/run b/generate/run index 5148ce60..a1011104 100755 --- a/generate/run +++ b/generate/run @@ -71,7 +71,7 @@ Download() Download https://github.com/cosinekitty/ephemeris/raw/master/lnxp1600p2200.405 lnxp1600p2200.405 ephemeris.sha256 ephemeris.md5 Download https://github.com/cosinekitty/ephemeris/raw/master/top2013/TOP2013.dat TOP2013.dat top2013.sha256 top2013.md5 -Download https://raw.githubusercontent.com/astronexus/HYG-Database/master/hygdata_v3.csv hygdata_v3.csv hygdata_v3.sha256 hygdata_v3.sha256 +Download https://raw.githubusercontent.com/astronexus/HYG-Database/master/hygdata_v3.csv hygdata_v3.csv hygdata_v3.sha256 hygdata_v3.md5 rm -f constellation/test_input.txt ./make_constellation_data.py || Fail "Error creating constellation test data." diff --git a/generate/top2013/top2013.c b/generate/top2013/top2013.c new file mode 100644 index 00000000..466df1db --- /dev/null +++ b/generate/top2013/top2013.c @@ -0,0 +1,44 @@ +/* + top2013.c - Don Cross - 2020-06-30 +*/ + +#include +#include +#include +#include +#include "codegen.h" +#include "top2013.h" + + +void TopInitModel(top_model_t *model) +{ + memset(model, 0, sizeof(top_model_t)); +} + + +void TopFreeModel(top_model_t *model) +{ + int f, s; + for (f=0; f < TOP_NCOORDS; ++f) + for (s=0; s < model->formula[f].nseries_total; ++s) + free(model->formula[f].series[s].terms); + + TopInitModel(model); +} + + +int TopLoadModel(top_model_t *model, const char *filename, int planet) +{ + int error = 1; + FILE *infile = NULL; + + TopInitModel(model); + infile = fopen(filename, "rt"); + if (infile == NULL) + FAIL("TopLoadModel: cannot open file: %s\n", filename); + + error = 0; +fail: + if (infile != NULL) fclose(infile); + return error; +} diff --git a/generate/top2013/top2013.h b/generate/top2013/top2013.h new file mode 100644 index 00000000..d10db4b0 --- /dev/null +++ b/generate/top2013/top2013.h @@ -0,0 +1,53 @@ +/* + top2013.h - Don Cross - 2020-06-30 + + Loads and calculates planetary positions using TOP2013 analytic models. + See: https://en.wikipedia.org/wiki/VSOP_(planets) +*/ +#ifndef __DDC_TOP2013_H +#define __DDC_TOP2013_H + +typedef struct +{ + double k; /* mu coefficient */ + double c; /* cosine coefficient */ + double s; /* sine coefficient */ + double p; /* period expressed in years */ +} +top_term_t; + + +typedef struct +{ + int nterms_total; + int nterms_calc; + top_term_t *terms; +} +top_series_t; + +#define TOP_MAX_SERIES 13 + +typedef struct +{ + int nseries_total; + int nseries_calc; + top_series_t series[TOP_MAX_SERIES]; +} +top_formula_t; + + +#define TOP_NCOORDS 6 + +typedef struct +{ + top_formula_t formula[TOP_NCOORDS]; +} +top_model_t; + + +void TopInitModel(top_model_t *model); +void TopFreeModel(top_model_t *model); +int TopLoadModel(top_model_t *model, const char *filename, int planet); + + +#endif /* __DDC_TOP2013_H */