From 87e65b43d7a9a6a4ed4e3550e2e0c079bce8a896 Mon Sep 17 00:00:00 2001 From: Don Cross Date: Mon, 20 May 2019 15:23:15 -0400 Subject: [PATCH] Implemented C function Seasons, but not yet tested. --- generate/template/astronomy.c | 31 ++++++++++++++++++++++++++++++- source/c/astronomy.c | 31 ++++++++++++++++++++++++++++++- source/c/astronomy.h | 12 ++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/generate/template/astronomy.c b/generate/template/astronomy.c index acb01cf0..2c6b4608 100644 --- a/generate/template/astronomy.c +++ b/generate/template/astronomy.c @@ -1801,6 +1801,35 @@ static int QuadInterp( return 1; /* success */ } +static astro_status_t FindSeasonChange(double targetLon, int year, int month, int day, astro_time_t *time) +{ + astro_time_t startDate = Astronomy_MakeTime(year, month, day, 0, 0, 0.0); + astro_search_result_t result = Astronomy_SearchSunLongitude(targetLon, startDate, 4.0); + *time = result.time; + return result.status; +} + +astro_seasons_t Astronomy_Seasons(int year) +{ + astro_seasons_t seasons; + astro_status_t status; + + seasons.status = ASTRO_SUCCESS; + + status = FindSeasonChange( 0, year, 3, 19, &seasons.mar_equinox); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange( 90, year, 6, 19, &seasons.jun_solstice); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange(180, year, 9, 21, &seasons.sep_equinox); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange(270, year, 12, 20, &seasons.dec_solstice); + if (status != ASTRO_SUCCESS) seasons.status = status; + + return seasons; +} #ifdef __cplusplus } @@ -1831,6 +1860,6 @@ static int QuadInterp( X SearchRelativeLongitude X SearchRiseSet - SearchSunLongitude - X Seasons + - Seasons - SunPosition */ diff --git a/source/c/astronomy.c b/source/c/astronomy.c index b19232b1..4bef4411 100644 --- a/source/c/astronomy.c +++ b/source/c/astronomy.c @@ -2857,6 +2857,35 @@ static int QuadInterp( return 1; /* success */ } +static astro_status_t FindSeasonChange(double targetLon, int year, int month, int day, astro_time_t *time) +{ + astro_time_t startDate = Astronomy_MakeTime(year, month, day, 0, 0, 0.0); + astro_search_result_t result = Astronomy_SearchSunLongitude(targetLon, startDate, 4.0); + *time = result.time; + return result.status; +} + +astro_seasons_t Astronomy_Seasons(int year) +{ + astro_seasons_t seasons; + astro_status_t status; + + seasons.status = ASTRO_SUCCESS; + + status = FindSeasonChange( 0, year, 3, 19, &seasons.mar_equinox); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange( 90, year, 6, 19, &seasons.jun_solstice); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange(180, year, 9, 21, &seasons.sep_equinox); + if (status != ASTRO_SUCCESS) seasons.status = status; + + status = FindSeasonChange(270, year, 12, 20, &seasons.dec_solstice); + if (status != ASTRO_SUCCESS) seasons.status = status; + + return seasons; +} #ifdef __cplusplus } @@ -2887,6 +2916,6 @@ static int QuadInterp( X SearchRelativeLongitude X SearchRiseSet - SearchSunLongitude - X Seasons + - Seasons - SunPosition */ diff --git a/source/c/astronomy.h b/source/c/astronomy.h index 6512df0c..84ba60f3 100644 --- a/source/c/astronomy.h +++ b/source/c/astronomy.h @@ -134,6 +134,16 @@ typedef struct } astro_search_result_t; +typedef struct +{ + astro_status_t status; + astro_time_t mar_equinox; + astro_time_t jun_solstice; + astro_time_t sep_equinox; + astro_time_t dec_solstice; +} +astro_seasons_t; + typedef double (* astro_search_func_t) (void *context, astro_time_t time); /*---------- functions ----------*/ @@ -169,6 +179,8 @@ astro_search_result_t Astronomy_SearchSunLongitude( astro_time_t dateStart, double limitDays); +astro_seasons_t Astronomy_Seasons(int calendar_year); + #ifdef __cplusplus } #endif