#ifndef __DT_ASTRO_SOLAR_TERM_C__
#define __DT_ASTRO_SOLAR_TERM_C__
#include "dt_astro.h"
STATIC_INLINE
int
next_term_at( mpfr_t *result, mpfr_t *moment, mpfr_t *phi ) {
return solar_longitude_after( result, moment, phi );
}
STATIC_INLINE
int
prev_term_at( mpfr_t *result, mpfr_t *moment, mpfr_t *phi ) {
return estimate_prior_solar_longitude( result, moment, phi );
}
STATIC_INLINE
int
major_term_after( mpfr_t *result, mpfr_t *moment ) {
mpfr_t x, lon, l, midnight, fullangle;
mpfr_init_set( midnight, *moment, GMP_RNDN );
mpfr_floor( midnight, midnight );
mpfr_init_set_ui( fullangle, 360, GMP_RNDN );
mpfr_init(lon);
solar_longitude( &lon, &midnight );
mpfr_init_set(x, lon, GMP_RNDN);
mpfr_div_ui(x, x, 30, GMP_RNDN);
mpfr_clear(lon);
mpfr_ceil( x, x );
mpfr_mul_ui( x, x, 30, GMP_RNDN );
mpfr_init(l);
dt_astro_mod( &l, &x, &fullangle );
mpfr_clear(x);
next_term_at( result, moment, &l);
mpfr_clear(l);
mpfr_clear( fullangle );
mpfr_clear( midnight );
return 1;
}
STATIC_INLINE
int
major_term_before( mpfr_t *result, mpfr_t *moment ) {
mpfr_t x, lon, l, midnight, fullangle;
mpfr_init_set( midnight, *moment, GMP_RNDN );
mpfr_floor( midnight, midnight );
mpfr_init_set_ui( fullangle, 360, GMP_RNDN );
mpfr_init(lon);
solar_longitude( &lon, &midnight );
mpfr_init_set(x, lon, GMP_RNDN);
mpfr_div_ui(x, x, 30, GMP_RNDN);
mpfr_clear(lon);
mpfr_floor( x, x );
mpfr_mul_ui( x, x, 30, GMP_RNDN );
mpfr_init(l);
dt_astro_mod( &l, &x, &fullangle );
mpfr_clear(x);
prev_term_at( result, moment, &l);
mpfr_clear(l);
mpfr_clear( fullangle );
mpfr_clear( midnight );
return 1;
}
STATIC_INLINE
int
minor_term_after( mpfr_t *result, mpfr_t *moment ) {
mpfr_t l, fullangle, lon, midnight;
mpfr_init_set( midnight, *moment, GMP_RNDN );
mpfr_floor( midnight, midnight );
mpfr_init_set_ui( fullangle, 360, GMP_RNDN );
mpfr_init(lon);
solar_longitude( &lon, &midnight );
mpfr_sub_ui( lon, lon, 15, GMP_RNDN );
mpfr_div_ui( lon, lon, 30, GMP_RNDN );
mpfr_ceil( lon, lon );
mpfr_mul_ui( lon, lon, 30, GMP_RNDN );
mpfr_add_ui( lon, lon, 15, GMP_RNDN );
mpfr_init(l);
dt_astro_mod( &l, &lon, &fullangle );
mpfr_clear(lon);
next_term_at( result, moment, &l );
mpfr_clear(l);
mpfr_clear( fullangle );
mpfr_clear( midnight );
return 1;
}
STATIC_INLINE
int
minor_term_before( mpfr_t *result, mpfr_t *moment ) {
mpfr_t l, fullangle, lon, midnight;
mpfr_init_set( midnight, *moment, GMP_RNDN );
mpfr_floor( midnight, midnight );
mpfr_init_set_ui( fullangle, 360, GMP_RNDN );
mpfr_init(lon);
solar_longitude( &lon, &midnight );
mpfr_sub_ui( lon, lon, 15, GMP_RNDN );
mpfr_div_ui( lon, lon, 30, GMP_RNDN );
mpfr_floor( lon, lon );
mpfr_mul_ui( lon, lon, 30, GMP_RNDN );
mpfr_add_ui( lon, lon, 15, GMP_RNDN );
mpfr_init(l);
dt_astro_mod( &l, &lon, &fullangle );
mpfr_clear( lon );
prev_term_at( result, moment, &l );
mpfr_clear( l );
mpfr_clear( fullangle );
mpfr_clear( midnight );
return 1;
}
#endif /** __DT_ASTRO_SOLAR_TERM_C__ **/