Hello all,

I've written a quick patch to allow Remind to calculate astronomical and
nautical twilight, in addition to the existing civil twilight. If other
people find it useful or at least inoffensive, I hope it could be
incorporated into Remind. Thanks for the wonderful program!

Best regards,
Stephen Morgan
diff --git a/man/remind.1 b/man/remind.1
index e430dfe..74425ff 100644
--- a/man/remind.1
+++ b/man/remind.1
@@ -2123,6 +2123,15 @@ be a number as described in the UNIX \fBaccess\fR(2) system call.  The
 function returns 0 if the file can be accessed with the specified \fImode\fR,
 and \-1 otherwise.
 .TP
+.B adawn([dq_date])
+Returns the time of "astronomical dawn" on the specified \fIdate\fR.  If
+\fIdate\fR is omitted, defaults to \fBtoday()\fR.  If a \fIdatetime\fR object
+is supplied, only the date component is used.
+.TP
+.B adusk([dq_date])
+Returns the time of "astronomical twilight" on the specified \fIdate\fR.  If
+\fIdate\fR is omitted, defaults to \fBtoday()\fR.
+.TP
 .B args(s_fname)
 Returns the number of arguments expected by the user-defined function
 \fIfname\fR, or \-1 if no such user-defined function exists.  Note that
@@ -2517,6 +2526,15 @@ which default to \fBtoday()\fR and midnight, respectively.  The returned
 value is an integer from 0 to 359, representing the phase of the moon
 in degrees.  0 is a new moon, 180 is a full moon, 90 is first-quarter, etc.
 .TP
+.B ndawn([dq_date])
+Returns the time of "nautical dawn" on the specified \fIdate\fR.  If
+\fIdate\fR is omitted, defaults to \fBtoday()\fR.  If a \fIdatetime\fR object
+is supplied, only the date component is used.
+.TP
+.B ndusk([dq_date])
+Returns the time of "nautical twilight" on the specified \fIdate\fR.  If
+\fIdate\fR is omitted, defaults to \fBtoday()\fR.
+.TP
 .B nonomitted(dq_start, dq_end [,s_wkday...])
 This function returns the number of \fInon-\fRomitted days between
 \fIstart\fR and \fIend\fR.  If \fIstart\fR is non-omitted, then it is
diff --git a/src/funcs.c b/src/funcs.c
index e834789..fbf6066 100644
--- a/src/funcs.c
+++ b/src/funcs.c
@@ -110,6 +110,10 @@ static int	FPsshade	(func_info *);
 static	int	FShell		(func_info *);
 static	int	FStrlen		(func_info *);
 static	int	FSubstr		(func_info *);
+static	int	FADawn		(func_info *);
+static	int	FADusk	 	(func_info *);
+static	int	FNDawn		(func_info *);
+static	int	FNDusk	 	(func_info *);
 static	int	FDawn		(func_info *);
 static	int	FDusk	 	(func_info *);
 static	int	FSunset		(func_info *);
@@ -188,6 +192,8 @@ BuiltinFunc Func[] = {
 
     {   "abs",          1,      1,      1,          FAbs },
     {   "access",       2,      2,      0,          FAccess },
+    {   "adawn",        0,      1,      0,          FADawn},
+    {   "adusk",        0,      1,      0,          FADusk},
     {   "args",         1,      1,      0,          FArgs   },
     {   "asc",          1,      1,      1,          FAsc    },
     {   "baseyr",       0,      0,      1,          FBaseyr },
@@ -233,6 +239,8 @@ BuiltinFunc Func[] = {
     {   "moondatetime", 1,      3,      0,          FMoondatetime },
     {   "moonphase",    0,      2,      0,          FMoonphase },
     {   "moontime",     1,      3,      0,          FMoontime },
+    {   "ndawn",        0,      1,      0,          FNDawn},
+    {   "ndusk",        0,      1,      0,          FNDusk},
     {   "nonomitted",   2,      NO_MAX, 0,          FNonomitted },
     {   "now",          0,      0,      0,          FNow    },
     {   "ord",          1,      1,      1,          FOrd    },
@@ -1878,9 +1886,6 @@ static int SunStuff(int rise, double cosz, int jul)
 
     FromJulian(jul, &year, &mon, &day);
 
-    if (rise > 1)
-	rise -= 2;
-
 /* Following formula on page B6 exactly... */
     t = (double) jul;
     if (rise) {
@@ -1970,19 +1975,28 @@ static int SunStuff(int rise, double cosz, int jul)
 static int FSun(int rise, func_info *info)
 {
     int jul = JulianToday;
-    double cosz = -0.014543897;  /* for sunrise and sunset */
+    double cosz;
     int r;
 
+    if (rise == 0 || rise == 1) {
+    /* Sunrise and sunset : cos(90 degrees + 50 arcminutes) */
+    cosz = -0.01454389765158243;
+    } else if (rise == 2 || rise == 3) {
     /* Civil twilight: cos(96 degrees) */
-    if (rise == 2 || rise == 3) {
-	cosz = -0.104528463268;
+	cosz = -0.10452846326765333;
+    } else if (rise == 4 || rise == 5) {
+    /* Nautical twilight: cos(102 degrees) */
+	cosz = -0.20791169081775912;
+    } else if (rise == 6 || rise == 7) {
+    /* Astronomical twilight: cos(108 degrees) */
+	cosz = -0.30901699437494734;
     }
     if (Nargs >= 1) {
 	if (!HASDATE(ARG(0))) return E_BAD_TYPE;
 	jul = DATEPART(ARG(0));
     }
 
-    r = SunStuff(rise, cosz, jul);
+    r = SunStuff(rise % 2, cosz, jul);
     if (r == NO_TIME) {
 	RETVAL = 0;
 	RetVal.type = INT_TYPE;
@@ -2014,6 +2028,24 @@ static int FDusk(func_info *info)
     return FSun(2, info);
 }
 
+static int FNDawn(func_info *info)
+{
+    return FSun(5, info);
+}
+static int FNDusk(func_info *info)
+{
+    return FSun(4, info);
+}
+
+static int FADawn(func_info *info)
+{
+    return FSun(7, info);
+}
+static int FADusk(func_info *info)
+{
+    return FSun(6, info);
+}
+
 /***************************************************************/
 /*                                                             */
 /*  FFiledate                                                  */
_______________________________________________
Remind-fans mailing list
Remind-fans@lists.roaringpenguin.com
http://lists.roaringpenguin.com/cgi-bin/mailman/listinfo/remind-fans
Remind is at http://www.roaringpenguin.com/products/remind

Reply via email to