The Sentience

The Sentience

Tuesday, August 16, 2011

The Hindu Lunisolar Calendar

Research Sources

  • Calendrical Calculations: Third Edition - Nachum Dershowitz and Edward M. Reingold
  • Notes and Errata on Calendrical Calculations: Third Edition - 25th May 2011
  • Astronomical Algorithms: First Edition - Jean Meeus
  • Practical Astronomy with your Calculator: Third Edition - Peter Duffet-Smith
  • How to compute planetary positions - Paul Schlyter
  • Indian Calendars - Leow Choon Lian/Professor Helmer Aslaken

Astro Library

Most of the astronomical functions have already been described in the implementation of previous astronomical Calendars. A few functions were appended to the Astro Library to implement the Hindu calendar, namely:

astrosolar.h

double precession(double time)

Calculates the precession value.

double bisectionSearch(double a, double b, bool c, bool d)

Returns the result of bisection search between the two values a and b depending upon the conditions c and d.

double solarLongitudeAtOrAfter(double longitude, double time)

Computes the solar longitude at or after a given moment of time.


KCalendarSystem API

To implement the Chinese calendar, certain changes had to be made in the KCalendar System API in order to incorporate features requiring leap months, namely:

QString monthName(double month, int year, MonthNameFormat format = LongName)

Gets specific calendar type month for a given date. The monthName() method is overloaded to use a double type value of the month returned by calculations.

bool julianDayToDate(int jd, int &year, double &month, double &day) const

Method to convert Julian day to calendar specific date.

bool dateToJulianDay(int year, double month, double day, int &jd) const

Method to convert calendar specific date to Julian day.

int daysInMonth(int year, double month) const

Returns the number of days in the given month of year. The double data type implements functionalities for leap months.

The Hindu Calendar

The header file defining the implementation of Hindu Lunisolar Calendar is kcalendarsystemhindu.h. It has defined two classes:

KCalendarSystemHindu

Class definition in the public domain, publicly inherited from KCalendarSystem. It re-implements the virtual functions defined in the KCalendarSystem class. The re-implemented functions are defined in the public domain of the class.

virtual QString calendarType() const

Returns the calendar system type.

virtual QDate epoch() const

Returns a QDate holding the epoch of the calendar system. Hindu epoch is defined on Julian Day 599466. (Kali Yug - January 23, -3101 in Gregorian Calendar).

virtual QDate earliestValidDate() const

Returns the earliest date valid in this calendar system implementation, i.e. epoch + 3044*The length of mean sidereal year, as this marks the beginning of the Vikrama Era

virtual QDate latestValidDate() const

Returns the latest date valid in this calendar system implementation, i.e. 9999*The length of mean sidereal year - 1

virtual bool isValid(int year, int month, int day) const

Returns whether a given date is valid in this calendar system.

virtual bool isValid(const QDate &date) const

Returns whether a given date is valid in this calendar system.

virtual bool isLeapYear(int year) const

Returns whether a given year is a leap year.

virtual bool isLeapYear(const QDate &date) const

Returns whether a given year(taken from the QDate) is a leap year.

virtual QString monthName(double month, int year, MonthNameFormat format = LongName) const

Gets specific calendar type month name for a given month number If an invalid month is specified, QString() is returned. The double data type is used to incorporate functionalities requiring leap months.

virtual QString monthName(const QDate &date, MonthNameFormat format = LongName) const

Gets specific calendar type month name for a given date.

virtual QString weekDayName(int weekDay, WeekDayNameFormat format = LongDayName) const

Gets specific calendar type week day name. If an invalid week day is specified, QString() is returned.

virtual QString weekDayName(const QDate &date, WeekDayNameFormat format = LongDayName) const

Gets specific calendar type week day name.

virtual int weekDayOfPray() const

Returns the weekday of pray for this calendar system, 7th day of the Hindu Week.

virtual bool isLunar() const

Returns whether the calendar is lunar. (False)

virtual bool isLunisolar() const

Returns whether the calendar is lunisolar. (True)

virtual bool isSolar() const

Returns whether the calendar is solar. (False)

virtual bool isProleptic() const

Returns whether the calendar is proleptic, i.e, supports dates before the epoch. (False)

KCalendarSystemHinduPrivate

Class definition in the private domain, publicy inherited from KCalendarSystemPrivate. It re-implements the virtual functions defined in the KCalendarSystem class. The re-implemented functions are defined in the public domain of the class.

virtual void loadDefaultEraList()

Gives the Era name of the Hindu Calendar, i.e. the Vikrama Era

virtual KLocale::CalendarSystem calendarSystem() const

Returns the calendar type.

virtual int monthsInYear(int year) const

Returns the number of months in the year used by this calendar system.

virtual int daysInMonth(int year, int month) const

Returns the number of days in a month used by this calendar system.

virtual int daysInYear(int year) const

Returns the number of days in a year used by this calendar system.

virtual int daysInWeek() const

Returns the number of days in a week used by this calendar system, i.e, 7.

virtual bool isLeapYear(int year) const

Checks whether a year is a leap year or not.

virtual bool hasLeapMonths() const

Returns true is this calendar system has leap months. The Hindu calendar has leap months.

virtual bool hasYearZero() const

Returns true is this calendar system uses year 0. The Hindu calendar doesn't have a year 0.

virtual int maxDaysInWeek() const

Returns the maximum number of days in a week in this calendar system, i.e, 7.

virtual int maxMonthsInYear() const

Returns the maximum number of months in a year in this calendar system, i.e. 13.

virtual int earliestValidYear() const

Returns the earliest valid year in this calendar system, i.e., year 1.

virtual int latestValidYear() const

Returns the latest valid year in this calendar system, i.e., year 9999.

virtual QString monthName(double month, int year, Locale::DateTimeComponentFormat format, bool possessive) const

Gets specific calendar type month name for a given month number If an invalid month is specified, QString() is returned.

virtual QString weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const

Gets specific calendar type weekday name for a given month number If an invalid weekday is specified, QString() is returned.

double meshaSankranti(int year)

Computes the solar longitude at or after Mesha Sankranti.

double siderealSolarLongitude(double time)

Computes the sidereal solar longitude.

int siderealZodiac(double time)

Returns sidereal zodiac based on sidereal solar longitude.

int hinduSunrise(int date)

Returns the time of dawn at the Hindu locale.

int hinduCalendarYear(double time)

Returns the Hindu calendar year at the given time.

void julianDayToHinduDate(int jd, int &year, double &month, bool &leapMonth, double &day, bool &leapDay)

Function used to convert Julian day to Hindu date.

void hinduDateToJulianDay(int year, double month, bool leapMonth, double day, bool leapDay, int &jd)

Function used to convert Hindu date to Julian day.

Astronomical Implementation

Re-implementations of the functions dateToJulianDay() and julianDayToDate() using the functions defined in the Astro Library.

bool julianDayToDate(int jd, int &year, double &month, double &day) const

Returns the date implemented in this calendar system from Julian day. It implements the previously defined julianDayToHinduDate() function.

bool dateToJulianDay(int &jd, int year, double month, double day) const

Returns the Julian day from the date in this calendar system. It implements the previously defined hinduDateToJulianDay() function.

The calculations for implementing the Hindu Calendar have been derived from the public domain Lisp code/Mathematical functions of Calendrical Calculations by Edward M. Reingold on the Illinois Institute of Technology website, and from the book Astronomical Algorithms by Jean Meeus