Panjika engine-এ sunrise শুধু একটি display value নয়; এটি day boundary এবং বহু ধর্মীয় rule-এর evaluation instant। তাই weather website-এর sunrise, astronomical almanac-এর sunrise এবং traditional Hindu calendar-এর sunrise দেখতে কাছাকাছি হলেও interchangeable নয়। Project-এর সব page, export ও cache-কে একই declared definition ব্যবহার করতে হবে।
কয়েক মিনিটের পার্থক্য এত গুরুত্বপূর্ণ কেন?
কোনো তিথি যদি sunrise-এর দুই মিনিট আগে বা পরে শেষ হয়, sunrise definition বদলালে ফলের ভাষা বদলে যেতে পারে:
| Calculation | Sunrise-এর ভূমিকা | Definition বদলালে |
|---|---|---|
| Daily tithi | Sunrise-এ চলমান তিথি | দিনের তিথি বদলাতে পারে |
| Bengali date | Saṅkrānti ও sunrise relation | মাসের প্রথম civil date বদলাতে পারে |
| Ekādaśī | Sunrise/aruṇodaya viddhi | উপবাসের দিন বদলাতে পারে |
| Kṣaya/vṛddhi | তিথি কোন sunrise স্পর্শ করে | ক্ষয় বা বৃদ্ধি assignment বদলাতে পারে |
| Traditional time | দণ্ড-পলের origin | সব elapsed value shift করবে |
| Daily XML | Sunrise-to-next-sunrise window | Event কোন record-এ যাবে বদলাতে পারে |
এ কারণে UI-তে শুধু “সূর্যোদয় ৫:৩১” দেখালেই যথেষ্ট নয়। Research metadata-তে disc point, refraction, position mode, coordinates, elevation ও horizon policy লিখতে হবে।
Standard apparent sunrise: upper limb ও refraction
সাধারণ astronomical almanac ও সংবাদপত্রের sunrise সাধারণত তখন, যখন সূর্যের উপরের কিনারা atmospheric refraction-এর সাহায্যে horizon-এ দৃশ্যমান হয়। Computational approximation-এ সূর্যের center geometric horizon-এর প্রায় ৫০ arcminute নিচে থাকে:
= ৫০′ = ০.৮৩৩৩°
Sun-center geometric altitude ≈ −০.৮৩৩৩°
Equivalent zenith distance প্রায় ৯০.৮৩৩৩°। এটি average sea-level atmosphere ও unobstructed horizon-এর standard model; বাস্তব refraction আবহাওয়ার কারণে বদলায়।
Sun-center geometric sunrise: center ঠিক horizon-এ
Traditional Hindu-calendar profile-এ একটি প্রচলিত সংজ্ঞা হলো solar disc-এর center geometric horizon অতিক্রমের মুহূর্ত, refraction উপেক্ষা করে:
Refraction: none
Geometric altitude: ০°
Zenith distance: ৯০°
Morning-এ standard apparent upper-limb sunrise আগে এবং geometric center sunrise পরে ঘটে। কত মিনিট ব্যবধান হবে তা latitude, season এবং horizon-crossing angle-এর ওপর নির্ভর করে; fixed “সব জায়গায় ৩ মিনিট” ধরে নেবেন না। Sunset-এ ক্রম উল্টোভাবে প্রতিফলিত হয়—apparent upper limb দেরিতে অদৃশ্য হয়।
| Profile | Solar point | Refraction | Typical use |
|---|---|---|---|
| Standard apparent | Upper limb | Average refraction | Weather/almanac sunrise |
| Center apparent | Disc center | Included | Special comparison profile |
| Center geometric | Disc center | Excluded | Traditional Hindu sunrise profile |
| Custom true horizon | Declared point | Declared | Research with local horizon altitude |
সূর্য সিদ্ধান্ত পঞ্জিকা project-এর নির্বাচিত profile
এই project-এর declared solar-day profile:
Atmospheric refraction: off
Daily boundary: local center/no-refraction sunrise
Sunset: একই center/no-refraction convention
অতএব weather service-এর apparent sunrise সরাসরি copy করা যাবে না। Swiss Ephemeris call-এ অন্তত SE_BIT_DISC_CENTER ও SE_BIT_NO_REFRACTION flags স্পষ্টভাবে দিতে হবে। Full Swiss “Hindu rising” preset আরও একটি geocentric/no-ecliptic-latitude flag যোগ করে; project যদি সেটি গ্রহণ করে, profile ID বদলিয়ে ফল পুনরায় validate করতে হবে। Center/no-refraction থেকে full preset-এ silent switch করা উচিত নয়।
Moonrise/moonset-এর project policy আলাদা—Moon edge/apparent। Solar flags Moon-এর calculation-এ reuse করলে parallax, semidiameter ও refraction treatment ভুল হবে। Sun ও Moon rise/set profile পৃথক রাখুন।
Atmospheric refraction: বাস্তব sunrise পূর্বানুমান কেন পুরো নির্ভুল নয়
Horizon-এর কাছে atmosphere আলো বাঁকায়, ফলে সূর্য geometric অবস্থানের তুলনায় উপরে দেখা যায়। Refraction-এর পরিমাণ pressure, temperature, humidity এবং atmospheric layering-এর ওপর নির্ভরশীল। Standard apparent sunrise একটি adopted average ব্যবহার করে; সেদিনের বাস্তব atmosphere জানে না।
এই কারণে official source-ও rise/set computation এক মিনিট বা তার বেশি ভুল হতে পারে বলে সতর্ক করে, এমনকি sea-level clear horizon-এও। পাহাড়, ভবন, কুয়াশা ও observer height আরও পার্থক্য ঘটায়।
| Input | Refraction-on profile-এ প্রভাব | No-refraction profile-এ |
|---|---|---|
| Atmospheric pressure | Refraction estimate বদলায় | Rise/set boundary-তে উপেক্ষিত |
| Temperature | Refraction estimate বদলায় | Rise/set boundary-তে উপেক্ষিত |
| Solar semidiameter | Upper-limb event-এ লাগে | Center event-এ লাগে না |
| Weather observation | Actual sighting বদলাতে পারে | Geometric computed instant বদলায় না |
No-refraction profile “খালি চোখে সূর্য দেখা যাওয়ার exact সময়” নয়; এটি reproducible geometric convention। Traditional calendar comparison-এর জন্য এটাই তার শক্তি।
Observer elevation ও local horizon
উঁচু স্থানে observer দূরের horizon বেশি নিচে দেখতে পান; apparent sunrise আগে ও sunset পরে দেখা যেতে পারে। পাহাড় বা ভবন পূর্ব horizon ঢেকে রাখলে observed sunrise আবার দেরি হয়। দুটি elevation আলাদা:
- Observer elevation: sea level থেকে observer-এর উচ্চতা;
- Local horizon altitude: নির্দিষ্ট azimuth-এ দৃশ্যমান পাহাড়/বাধার angular height।
City-level calendar সাধারণত standardized flat-horizon/elevation policy ব্যবহার করে। User যদি পাহাড়ি এলাকার actual visible sunrise চান, true-horizon solver ও horizon data দরকার। Standard profile বদলে না দিয়ে নতুন profile তৈরি করুন।
Project center/no-refraction profile-এ Swiss preset-এর exact geocentric mode ব্যবহার করলে elevation irrelevant হতে পারে; topocentric/custom-horizon profile-এ তা relevant। Metadata-তে observerElevationMeters এবং horizonAltitudeDegrees রাখুন, এমনকি value ০ হলেও।
Civil, nautical ও astronomical twilight
Twilight sunrise নয়। Morning twilight-এর শুরু সূর্যের geometric center horizon-এর নির্দিষ্ট নিচে পৌঁছালে:
| পর্যায় | Sun center altitude | Zenith distance |
|---|---|---|
| Civil dawn | −৬° | ৯৬° |
| Nautical dawn | −১২° | ১০২° |
| Astronomical dawn | −১৮° | ১০৮° |
| Project sunrise | ০° center, no refraction | ৯০° |
Twilight duration latitude ও season অনুযায়ী বদলে যায়। Civil dawn কখনো sunrise-এর প্রায় আধঘণ্টা আগে, আবার অন্য স্থানে/ঋতুতে অনেক বেশি আগে হতে পারে। তাই “অরুণোদয় = civil dawn” বা “অরুণোদয় = −৬°” ধরে নেওয়া যাবে না, যদি ritual rule fixed ৯৬ মিনিট বলে।
অরুণোদয়: project rule-এ sunrise-এর ৯৬ মিনিট আগে
এই project-এর Vaiṣṇava observance convention-এ অরুণোদয় হলো selected Panjika sunrise-এর ঠিক ৯৬ মিনিট আগে—অর্থাৎ চার fixed দণ্ড:
৪ দণ্ড = ৯৬ মিনিট
AruṇodayaInstant = ProjectSunriseInstant − ৯৬ মিনিট
এটি ritual evaluation moment; astronomical twilight category নয়। Sunrise profile বদলালে aruṇodaya-ও একই পরিমাণ shift করবে। তাই festival engine নিজে sunrise calculate না করে canonical SunDayResult থেকে sunrise নেবে।
DST-safe calculation:
DateTimeOffset arunodayaUtc = sunrise.ToUniversalTime()
.Subtract(TimeSpan.FromMinutes(96));
DateTimeOffset arunodayaLocal = TimeZoneInfo.ConvertTime(
arunodayaUtc, selectedZone);
Local wall-clock value থেকে AddMinutes(-96) অধিকাংশ দিনে কাজ করলেও timezone transition-এর ক্ষেত্রে offset context হারানোর ঝুঁকি থাকে। Absolute instant থেকে subtract করে পুনরায় localize করা নিরাপদ।
একাদশী ও festival rule-এ sunrise/aruṇodaya
Festival engine raw astronomical timeline-এর ওপর নির্বাচিত rule-moment-এ state পরীক্ষা করে। উদাহরণস্বরূপ:
- Current local date-এর project sunrise solve করুন;
- তার ৯৬ মিনিট আগে aruṇodaya instant নিন;
- Aruṇodaya-তে তিথি ও তার remaining interval নির্ণয় করুন;
- Current ও next sunrise-এ তিথি দেখুন;
- School-specific viddhi/mahādvādaśī rule প্রয়োগ করুন;
- Applied rule code ও evaluated instants result-এ রাখুন।
শুধু daily header-এর sunrise tithi ব্যবহার করলে aruṇodaya-তে দশমী ছিল কি না বোঝা যায় না। আবার civil dawn-কে aruṇodaya ধরলে latitude অনুযায়ী rule moment বদলে যায়—project-এর fixed ৯৬-minute convention ভেঙে যায়।
Janmāṣṭamī-তে local midnight, Pradosha rule-এ sunset-পরবর্তী interval, Pāraṇa-তে next-day sunrise—প্রতিটি rule-moment আলাদা। একটিকে আরেকটির synonym হিসেবে ব্যবহার করবেন না।
Panjika day: বর্তমান sunrise অন্তর্ভুক্ত, পরের sunrise বাদ
Project daily window:
Next sunrise currentSunrise + 24 hours নয়। পরের local civil date-এর coordinates/profile দিয়ে আবার solve করতে হবে। DST, equation of time ও seasonal motion-এর কারণে interval fixed নয়।
Exact current sunrise-এর event current day-এর; exact next sunrise-এর event next day-এর। Festival rule-এর aruṇodaya window-এর আগে হলেও same day object-এ auxiliary moment হিসেবে থাকবে—daily event filter দিয়ে বাদ দেবেন না।
Swiss Ephemeris flags কী বোঝায়?
| Flag | মান | অর্থ |
|---|---|---|
SE_CALC_RISE | ১ | Rise event |
SE_CALC_SET | ২ | Set event |
SE_BIT_GEOCTR_NO_ECL_LAT | ১২৮ | Geocentric position ও ecliptic latitude ignore |
SE_BIT_DISC_CENTER | ২৫৬ | Upper limb নয়, disc center |
SE_BIT_NO_REFRACTION | ৫১২ | Atmospheric refraction বাদ |
SE_BIT_CIVIL_TWILIGHT | ১০২৪ | Civil twilight |
SE_BIT_NAUTIC_TWILIGHT | ২০৪৮ | Nautical twilight |
SE_BIT_ASTRO_TWILIGHT | ৪০৯৬ | Astronomical twilight |
Swiss SE_BIT_HINDU_RISING preset হলো center + no refraction + geocentric/no-ecliptic-latitude combination। Project-এর exact binding-এ constant names/values library version থেকে নিন; article-এর numeric table documentation বুঝতে সহায়ক, copy-paste-এর একমাত্র source নয়।
rsmi = 0 default astronomical upper-limb/refraction sunrise দিতে পারে। Explicit flags না দিলে library upgrade বা wrapper default বদলালে calendar silently shift করতে পারে।
C# 5/.NET Framework-compatible profile
public sealed class SolarRiseSetProfile
{
public string Id { get; set; }
public bool DiscCenter { get; set; }
public bool Refraction { get; set; }
public bool GeocentricNoEclipticLatitude { get; set; }
public double ObserverElevationMeters { get; set; }
public double HorizonAltitudeDegrees { get; set; }
}
public static readonly SolarRiseSetProfile ProjectSunProfile =
new SolarRiseSetProfile
{
Id = "sun-center-no-refraction-v1",
DiscCenter = true,
Refraction = false,
GeocentricNoEclipticLatitude = false,
ObserverElevationMeters = 0.0,
HorizonAltitudeDegrees = 0.0
};
Flags এক জায়গায় তৈরি করুন:
const int SE_CALC_RISE = 1;
const int SE_CALC_SET = 2;
const int SE_BIT_GEOCTR_NO_ECL_LAT = 128;
const int SE_BIT_DISC_CENTER = 256;
const int SE_BIT_NO_REFRACTION = 512;
static int BuildSwissFlags(
bool rising,
SolarRiseSetProfile profile)
{
int flags = rising ? SE_CALC_RISE : SE_CALC_SET;
if (profile.DiscCenter)
flags |= SE_BIT_DISC_CENTER;
if (!profile.Refraction)
flags |= SE_BIT_NO_REFRACTION;
if (profile.GeocentricNoEclipticLatitude)
flags |= SE_BIT_GEOCTR_NO_ECL_LAT;
return flags;
}
Result model:
public sealed class SunDayResult
{
public DateTime LocalDate { get; set; }
public DateTimeOffset Sunrise { get; set; }
public DateTimeOffset Sunset { get; set; }
public DateTimeOffset NextSunrise { get; set; }
public DateTimeOffset Arunodaya { get; set; }
public string SolarProfileId { get; set; }
public string TimeZoneId { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
}
Canonical service:
public SunDayResult CalculateSunDay(
DateTime localDate,
LocationProfile location,
SolarRiseSetProfile profile)
{
DateTimeOffset sunrise = SolveRiseOrSet(
localDate, location, profile, true);
DateTimeOffset sunset = SolveRiseOrSet(
localDate, location, profile, false);
DateTimeOffset nextSunrise = SolveRiseOrSet(
localDate.AddDays(1), location, profile, true);
DateTimeOffset arunodayaUtc = sunrise.ToUniversalTime()
.Subtract(TimeSpan.FromMinutes(96));
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(
location.WindowsTimeZoneId);
return new SunDayResult
{
LocalDate = localDate.Date,
Sunrise = sunrise,
Sunset = sunset,
NextSunrise = nextSunrise,
Arunodaya = TimeZoneInfo.ConvertTime(arunodayaUtc, zone),
SolarProfileId = profile.Id,
TimeZoneId = location.WindowsTimeZoneId,
Latitude = location.Latitude,
Longitude = location.Longitude
};
}
SolveRiseOrSet ephemeris error ও no-event return code surface করবে। ব্যর্থ হলে midnight বা 6:00 AM fallback দিয়ে calculation চালানো যাবে না; এতে সব downstream festival result বিশ্বাসযোগ্য দেখালেও ভুল হবে।
উচ্চ latitude ও sunrise না-থাকার দিন
Polar circle-এর কাছে এমন দিন থাকে যখন সূর্য ওঠে না বা অস্ত যায় না। Swiss rise/set function no-event/circumpolar status দিতে পারে। Application-এর behavior:
- Result-এ
sunriseStatus = "no-rise"বাsunsetStatus = "no-set"; - Daily Panchanga rule engine silent অনুমান করবে না;
- প্রযোজ্য ধর্মীয় fallback rule থাকলে আলাদা documented profile;
- User-কে nearest valid sunrise বা reference-location method-এর ব্যাখ্যা;
- Batch export-এ error log ও chosen fallback policy।
Twilight-ও polar regions-এ অনুপস্থিত বা দীর্ঘস্থায়ী হতে পারে। Fixed ৯৬-minute aruṇodaya কেবল valid selected sunrise থাকলে সহজে নির্ণীত। No-rise day-এ sunrise − 96m কল্পনা করা যাবে না।
API ও XML metadata
{
"sunDay": {
"localDate": "2026-10-08",
"sunrise": "2026-10-08T05:31:00+05:30",
"sunset": "2026-10-08T17:18:00+05:30",
"nextSunrise": "2026-10-09T05:31:30+05:30",
"arunodaya": "2026-10-08T03:55:00+05:30"
},
"definition": {
"profileId": "sun-center-no-refraction-v1",
"discPoint": "center",
"refraction": false,
"geocentricNoEclipticLatitude": false,
"observerElevationMeters": 0,
"horizonAltitudeDegrees": 0,
"arunodayaOffsetMinutes": -96
}
}
সময়গুলো illustrative। Production API-তে actual result থাকবে। XML:
<sun-day profile="sun-center-no-refraction-v1"
latitude="22.5833"
longitude="88.3500"
timezone="India Standard Time">
<sunrise>...ISO local time...</sunrise>
<sunset>...ISO local time...</sunset>
<next-sunrise>...ISO local time...</next-sunrise>
<arunodaya offset-minutes="-96">...ISO local time...</arunodaya>
<definition disc-point="center"
refraction="false"
elevation-m="0"
horizon-deg="0" />
</sun-day>
Human-facing footer-এ সংক্ষিপ্তভাবে লেখা যায়: “সূর্যোদয়/সূর্যাস্ত: সূর্যকেন্দ্র, refraction-বর্জিত।” Research details expandable panel-এ থাকবে।
Validation checklist
- Project profile ID সব page-এ একই;
- Sun disc center flag set;
- No-refraction flag set;
- Geocentric/no-ecliptic-latitude flag explicit on/off;
- Standard apparent comparison profile upper limb/refraction ব্যবহার করে;
- Standard apparent sunrise center geometric sunrise-এর আগে;
- Standard apparent sunset center geometric sunset-এর পরে;
- Difference fixed minutes হিসেবে hard-code নয়;
- Civil dawn Sun center −৬°;
- Nautical dawn −১২°;
- Astronomical dawn −১৮°;
- Aruṇodaya twilight flag ব্যবহার করে না;
- Aruṇodaya exactly ৯৬ absolute minutes before project sunrise;
- Aruṇodaya = ৪ fixed দণ্ড;
- Festival engine canonical SunDayResult ব্যবহার করে;
- Ekādaśī rule aruṇodaya-র তিথি evaluate করে;
- Current sunrise window-start inclusive;
- Next sunrise window-end exclusive;
- Next sunrise localDate+1 থেকে পুনর্গণিত;
- Next sunrise current+24h নয়;
- DST day-এ absolute aruṇodaya subtraction;
- Kolkata, Dhaka, New York coordinates আলাদা ফল দেয়;
- Elevation metadata present;
- Horizon altitude metadata present;
- No-rise/no-set status handled;
- Failure-এ fabricated 6:00 AM fallback নেই;
- Sun ও Moon rise/set profiles পৃথক;
- Moon edge/apparent policy অপরিবর্তিত;
- Daily tithi একই sunrise instant ব্যবহার করে;
- Bengali date service একই sunrise instant ব্যবহার করে;
- Traditional time converter একই sunrise origin ব্যবহার করে;
- API ও XML profile metadata মেলে;
- Cache key-তে solar profile version থাকে;
- Profile বদলালে cached calendar invalidated;
- Reference printed Panjika-এর সঙ্গে regression dates test করা হয়।
উপসংহার
Sunrise একটি calculated convention। সাধারণ apparent sunrise upper limb ও atmospheric refraction ধরে; project-এর traditional day boundary Sun center এবং no refraction ধরে। একই city/date-এ এই দুটির কয়েক মিনিট পার্থক্য স্বাভাবিক, এবং সেই পার্থক্য sunrise-tithi, Bengali date বা festival observance-এ কার্যকর হতে পারে।
Aruṇodaya-ও astronomical civil dawn নয়। এই project-এ এটি canonical project sunrise-এর ঠিক ৯৬ মিনিট বা চার দণ্ড আগে একটি ritual instant। তাই aruṇodaya calculation twilight flag দিয়ে নয়, sunrise instant থেকে absolute duration subtract করে হবে।
একটি versioned SolarRiseSetProfile সব service-এ inject করলে flags, refraction ও horizon policy বিচ্ছিন্ন হয় না। Daily HTML, Calendar grid, festival engine, API, print ও XML একই SunDayResult ব্যবহার করলে পঞ্জিকার দিনের সীমা reproducible থাকে এবং printed reference-এর সঙ্গে regression test অর্থপূর্ণ হয়।
তথ্যসূত্র ও আরও পাঠ
- U.S. Naval Observatory—Rise, Set, and Twilight Definitions; ৯০.৮৩৩৩° standard sunrise, solar semidiameter, refraction ও accuracy limitations.
- U.S. Naval Observatory—Astronomical Applications Glossary; apparent upper-limb sunrise ও ৯০°৫০′ zenith distance.
- NOAA/National Weather Service—Twilight Types; civil −৬°, nautical −১২°, astronomical −১৮°.
- Astrodienst—Swiss Ephemeris Programmer’s Documentation;
swe_rise_trans, disc-center, no-refraction, twilight ও Hindu-rising flags. - Swiss Ephemeris 2.10 Programming Guide; pressure, temperature, horizon ও no-event return values.
- সূর্য সিদ্ধান্ত পঞ্জিকা project; Sun center/no-refraction, Moon edge/apparent, sunrise-window এবং ৯৬-minute Vaiṣṇava aruṇodaya policy.
মন্তব্য, আলোচনা ও প্রশ্ন