/*********************************************************************/ /* */ /* */ /* */ /* */ /* */ /*********************************************************************/ public int determineMasa(GPGregorianTime aDate, out int nGaurabdaYear) { GPAstroData day = this; GPGregorianTime date = new GPGregorianTime(aDate); const int PREV_MONTHS = 6; double[] L = new double[8]; GPGregorianTime[] C = new GPGregorianTime[8]; int[] R = new int[8]; int n, rasi; int masa = 0; int ksaya_from = -1; int ksaya_to = -1; date.setDayHours(day.sun.getSunriseDayHours()); // STEP 1: calculate position of the sun and moon // it is done by previous call of DayCalc // and results are in argument DAYDATA day // *DayCalc(date, earth, day, moon, sun);* GPConjunction cit = new GPConjunction(); cit.setStartDate(date); for (n = 1; n >= 0; n--) { cit.getNext(); R[n] = cit.getCurrentPosition(); } //L[1] = /*Long[0] =*/ GPConjunction.GetNextConjunction(date, ref C[1], false, earth); //L[0] = /*LongA =*/ GPConjunction.GetNextConjunction(C[1], ref C[0], true, earth); cit = new GPConjunction(); cit.setStartDate(date); for (n = 2; n < 8; n++) { cit.getPrev(); R[n] = cit.getCurrentPosition(); } // on Pratipat (nTithi == 15) we need to look for previous conjunction // but this conjunction can occur on this date before sunrise // so we need to include this very date into looking for conjunction // on other days we cannot include it // and exclude it from looking for next because otherwise that will cause // incorrect detection of Purusottama adhika masa /*L[2] = GPConjunction.GetPrevConjunction(date, ref C[2], false, earth); * * for (n = 3; n < PREV_MONTHS; n++) * L[n] = GPConjunction.GetPrevConjunction(C[n - 1], ref C[n], true, earth); * * for (n = 0; n < PREV_MONTHS; n++) * { * int nr = GPEngine.GetRasi(L[n], GPAyanamsa.GetAyanamsa(C[n].getJulianLocalNoon())); * //if (nr != R[n]) * // Debugger.Log(0, "", String.Format("Different rasi {0} <=> {1} for input date: {2}", nr, R[n], date)); * R[n] = nr; * }*/ /* TRACE("TEST Date: %d %d %d\n", date.day, date.month, date.year); * TRACE("FOUND CONJ Date: %d %d %d rasi: %d\n", C[1].day, C[1].month, C[1].year, R[1]); * TRACE("FOUND CONJ Date: %d %d %d rasi: %d\n", C[2].day, C[2].month, C[2].year, R[2]); * TRACE("FOUND CONJ Date: %d %d %d rasi: %d\n", C[3].day, C[3].month, C[3].year, R[3]); * TRACE("FOUND CONJ Date: %d %d %d rasi: %d\n", C[4].day, C[4].month, C[4].year, R[4]); * TRACE("---\n"); */ // test for Adhika-Ksaya sequence // this is like 1-2-2-4-5... // second (2) is replaced by rasi(3) /* if ( ((Sank[1] + 2) % 12 == SankA) && ((Sank[1] == Sank[0]) || (Sank[0] == SankA))) * { * Sank[0] = (Sank[1] + 1) % 12; * } * * if ( ((Sank[2] + 2) % 12 == Sank[0]) && ((Sank[2] == Sank[1]) || (Sank[1] == Sank[0]))) * { * Sank[1] = (Sank[2] + 1) % 12; * }*/ // look for ksaya month ksaya_from = -1; for (n = PREV_MONTHS - 2; n >= 0; n--) { if ((R[n + 1] + 2) % 12 == R[n]) { ksaya_from = n; break; } } if (ksaya_from >= 0) { for (n = ksaya_from; n > 0; n--) { if (R[n] == R[n - 1]) { ksaya_to = n; break; } } if (ksaya_to >= 0) { // adhika masa found // now correct succession of rasis } else { // adhika masa not found // there will be some break in masa queue ksaya_to = 0; } int current_rasi = R[ksaya_from + 1] + 1; for (n = ksaya_from; n >= ksaya_to; n--) { R[n] = current_rasi; current_rasi = (current_rasi + 1) % 12; } } // STEP 3: test for adhika masa // test for adhika masa if (R[1] == R[2]) { // it is adhika masa masa = 12; rasi = R[1]; } else { // STEP 2. select nearest Conjunction if (day.nPaksa == 0) { masa = R[1]; } else if (day.nPaksa == 1) { masa = R[2]; } rasi = masa; } // calculation of Gaurabda year nGaurabdaYear = date.getYear() - 1486; if ((rasi > 7) && (rasi < 11)) // Visnu { if (date.getMonth() < 6) { nGaurabdaYear--; } } return(masa); }
public void CalculateEvents(GPLocationProvider loc, GPGregorianTime vcStart, GPGregorianTime vcEnd) { GPCoreEventResults inEvents = this; GPLocationProvider earth = loc; GPGregorianTime vc = new GPGregorianTime(loc); GPSun sun = new GPSun(); //int ndst = 0; int nData; inEvents.clear(); inEvents.m_location = loc; inEvents.m_vcStart = vcStart; inEvents.m_vcEnd = vcEnd; GPGregorianTime vcAdd = new GPGregorianTime(loc); GPGregorianTime vcTemp = null; GPGregorianTime vcNext = new GPGregorianTime(loc); vc.Copy(vcStart); if (GPDisplays.CoreEvents.Sunrise()) { vcAdd.Copy(vc); while (vcAdd.IsBeforeThis(vcEnd)) { sun.SunCalc(vcAdd, earth); vcTemp = new GPGregorianTime(sun.arunodaya); inEvents.AddEvent(vcTemp, GPConstants.CCTYPE_S_ARUN, 0); //GPJulianTime tr, tt, ts; //GPAstroEngine.CalculateTimeSun(vcTemp, vcTemp.getLocation(), out tr, out tt, out ts); vcTemp = new GPGregorianTime(sun.rise); //vcTemp = new GPGregorianTime(vcTemp.getLocation(), tr); inEvents.AddEvent(vcTemp, GPConstants.CCTYPE_S_RISE, 0); vcTemp = new GPGregorianTime(sun.noon); //vcTemp = new GPGregorianTime(vcTemp.getLocation(), tt); inEvents.AddEvent(vcTemp, GPConstants.CCTYPE_S_NOON, 0); vcTemp = new GPGregorianTime(sun.set); //vcTemp = new GPGregorianTime(vcTemp.getLocation(), ts); inEvents.AddEvent(vcTemp, GPConstants.CCTYPE_S_SET, 0); vcAdd.NextDay(); } } if (GPDisplays.CoreEvents.Tithi()) { GPTithi te = new GPTithi(); te.setStartDate(vc); vcAdd = te.getNext(); while (vcAdd.IsBeforeThis(vcEnd)) { nData = te.getCurrentPosition(); //ndst = loc.getTimeZone().GetDaylightChangeType(vcNext); inEvents.AddEvent(vcAdd, GPConstants.CCTYPE_TITHI, nData); vcAdd = te.getNext(); } } if (GPDisplays.CoreEvents.Naksatra()) { GPNaksatra te = new GPNaksatra(); te.setStartDate(vc); vcAdd = te.getNext(); while (vcAdd.IsBeforeThis(vcEnd)) { nData = te.getCurrentNaksatra(); //ndst = loc.getTimeZone().GetDaylightChangeType(vcNext); inEvents.AddEvent(vcAdd, GPConstants.CCTYPE_NAKS, nData); vcAdd = te.getNext(); } } if (GPDisplays.CoreEvents.Sankranti()) { GPSankranti te = new GPSankranti(); te.setStartDate(vc); vcAdd = te.getNext(); while (vcAdd.IsBeforeThis(vcEnd)) { nData = te.getCurrentPosition(); //ndst = loc.getTimeZone().GetDaylightChangeType(vcNext); inEvents.AddEvent(vcAdd, GPConstants.CCTYPE_SANK, nData); vcAdd = te.getNext(); } } if (GPDisplays.CoreEvents.Conjunction()) { double[] times = null; GPConjunction te = new GPConjunction(); te.setStartDate(vc); vcAdd = te.getNext(); while (vcAdd.IsBeforeThis(vcEnd)) { nData = te.getCurrentPosition(); //ndst = loc.getTimeZone().GetDaylightChangeType(vcNext); inEvents.AddEvent(vcAdd, GPConstants.CCTYPE_CONJ, nData); if (GPDisplays.CoreEvents.SunEclipse()) { GPAstroEngine.CalculateTimesSunEclipse(vcAdd.getJulianGreenwichTime(), vcAdd.getLocation(), out times); if (times != null && times[2] > 0) { for (int i = 0; i < 5; i++) { if (times[i] > 0) { GPGregorianTime gt = new GPGregorianTime(vcAdd.getLocation()); gt.setJulianGreenwichTime(new GPJulianTime(times[i], 0.0)); inEvents.AddEvent(gt, GPConstants.SUNECLIPSE_CONSTS[i], 0); } } } } vcAdd = te.getNext(); } } // moon eclipses if (GPDisplays.CoreEvents.MoonEclipse()) { double[] times = null; GPConjunction te = new GPConjunction(); te.setOpositeConjunction(true); te.setStartDate(vc); vcAdd = te.getNext(); while (vcAdd.IsBeforeThis(vcEnd)) { GPAstroEngine.CalculateTimesMoonEclipse(vcAdd.getJulianGreenwichTime(), vcAdd.getLocation(), out times); if (times != null && times[4] > 0) { for (int i = 0; i < 9; i++) { if (times[i] > 0 && GPConstants.MOONECLIPSE_CONSTS[i] > 0) { GPGregorianTime gt = new GPGregorianTime(vcAdd.getLocation()); gt.setJulianGreenwichTime(new GPJulianTime(times[i], 0.0)); inEvents.AddEvent(gt, GPConstants.MOONECLIPSE_CONSTS[i], 0); } } } vcAdd = te.getNext(); } } // rise and set of the moon if (GPDisplays.CoreEvents.Moonrise()) { GPJulianTime julian = vc.getJulian(); GPJulianTime julianEnd = vcEnd.getJulian(); GPJulianTime nextJulian; TRiseSet kind; while (julian.getGreenwichJulianDay() < julianEnd.getGreenwichJulianDay()) { nextJulian = GPAstroEngine.GetNextMoonEvent(julian, vc.getLocationProvider(), out kind); if (kind == TRiseSet.RISE) { inEvents.AddEvent(new GPGregorianTime(loc, nextJulian), GPConstants.CoreEventMoonRise, 0); } else if (kind == TRiseSet.SET) { inEvents.AddEvent(new GPGregorianTime(loc, nextJulian), GPConstants.CoreEventMoonSet, 0); } julian.setGreenwichJulianDay(nextJulian.getGreenwichJulianDay() + 10.0 / 1440.0); } } // travellings { GPJulianTime julian = vc.getJulian(); GPJulianTime julianEnd = vcEnd.getJulian(); double start, end; start = julian.getGreenwichJulianDay(); end = julianEnd.getGreenwichJulianDay(); for (int i = 0; i < loc.getChangeCount(); i++) { GPLocationChange chn = loc.getChangeAtIndex(i); if ((chn.julianStart >= start && chn.julianStart <= end) || (chn.julianStart >= start && chn.julianEnd <= end)) { GPGregorianTime startTime = new GPGregorianTime(chn.LocationA); startTime.setJulianGreenwichTime(new GPJulianTime(chn.julianStart, 0)); GPGregorianTime endTime = new GPGregorianTime(chn.LocationB); endTime.setJulianGreenwichTime(new GPJulianTime(chn.julianEnd, 0)); inEvents.AddEvent(startTime, GPConstants.CCTYPE_TRAVELLING_START, 0); inEvents.AddEvent(endTime, GPConstants.CCTYPE_TRAVELLING_END, 0); } } } // eventual sorting inEvents.Sort(GPDisplays.CoreEvents.Sort()); }