পঞ্জিকায় গ্রহণ প্রকাশের ক্ষেত্রে সবচেয়ে সাধারণ ভুল হলো global event এবং local visibility-কে এক মনে করা। পৃথিবীর কোথাও সূর্যগ্রহণ ঘটেছে—এই তথ্য থেকে Kolkata, Dhaka বা New York-এ সেটি দৃশ্যমান ছিল কি না জানা যায় না। আবার চন্দ্রগ্রহণ পৃথিবীর রাতের অর্ধাংশ থেকে বিস্তৃতভাবে দেখা গেলেও নির্দিষ্ট contact-এর সময় চন্দ্র স্থানীয় দিগন্তের ওপরে থাকা আবশ্যক।
গ্রহণের মৌলিক জ্যামিতি
চন্দ্রের কক্ষপথ পৃথিবীর সূর্যপথ বা ecliptic plane-এর সঙ্গে কিছুটা কাত হয়ে আছে। কক্ষপথ দুটি যেখানে ছেদ করে সেই দুটি বিন্দুকে lunar node বলা হয়। ভারতীয় জ্যোতির্বিদ্যা ও পঞ্জিকায় এগুলো রাহু ও কেতু নামে পরিচিত।
- সূর্যগ্রহণ: অমাবস্যার কাছে চন্দ্র সূর্য ও পৃথিবীর মাঝখানে এসে তার ছায়া পৃথিবীর ওপর ফেলে।
- চন্দ্রগ্রহণ: পূর্ণিমার কাছে চন্দ্র পৃথিবীর penumbral বা umbral shadow-এর মধ্যে প্রবেশ করে।
প্রতি অমাবস্যায় সূর্যগ্রহণ বা প্রতি পূর্ণিমায় চন্দ্রগ্রহণ হয় না, কারণ অধিকাংশ সময় চন্দ্র node-এর যথেষ্ট কাছে থাকে না এবং ছায়ার alignment মিস করে।
Lunar eclipse ≈ Full Moon + node proximity + Moon inside Earth's shadow
Traditional রাহু–কেতু terminology এবং modern orbital geometry পরস্পরবিরোধী করে দেখার প্রয়োজন নেই। প্রথমটি পঞ্জিকা ও ধর্মীয় ভাষা; দ্বিতীয়টি physical contact ও visibility গণনার numerical model।
সূর্যগ্রহণ ও চন্দ্রগ্রহণের প্রকার
| গ্রহণ | প্রকার | অর্থ |
|---|---|---|
| সূর্যগ্রহণ | আংশিক | চন্দ্র সূর্যের disk-এর একটি অংশ ঢাকে |
| পূর্ণগ্রাস | নির্দিষ্ট path-এ চন্দ্র সূর্যের visible disk সম্পূর্ণ ঢাকে | |
| বলয়গ্রাস | চন্দ্রের apparent disk ছোট হওয়ায় সূর্যের উজ্জ্বল বলয় থাকে | |
| Hybrid | Path-এর বিভিন্ন অংশে total ও annular classification বদলায় | |
| চন্দ্রগ্রহণ | উপচ্ছায়া | চন্দ্র পৃথিবীর penumbra-র মধ্যে প্রবেশ করে |
| আংশিক | চন্দ্রের একটি অংশ পৃথিবীর umbra-তে প্রবেশ করে | |
| পূর্ণগ্রাস | চন্দ্রের সম্পূর্ণ disk umbra-র মধ্যে থাকে |
একটি সূর্যগ্রহণ global classification-এ total হতে পারে, কিন্তু central path-এর বাইরে কোনো শহরে সেটি partial দেখা যেতে পারে অথবা একেবারেই দেখা নাও যেতে পারে। তাই global type এবং local type দুটিই সংরক্ষণ করা দরকার।
Global event এবং local circumstance
Global eclipse search প্রশ্ন করে—নির্দিষ্ট সময়ের পরে পৃথিবীর কোথাও পরবর্তী গ্রহণ কখন ঘটবে এবং তার global type কী? Local search প্রশ্ন করে—নির্দিষ্ট latitude, longitude ও elevation-এ গ্রহণের কোনো দৃশ্যমান phase আছে কি, contact time কখন এবং সর্বোচ্চ অবস্থায় altitude কত?
| স্তর | Input | Output |
|---|---|---|
| Global search | Start Julian Day ও eclipse-type filter | পৃথিবীর কোথাও eclipse maximum ও global contacts |
| Local circumstance | Global candidate + observer coordinates | স্থানীয় contact, magnitude, altitude, azimuth ও visibility |
| Display conversion | Contact instant + timezone rule | স্থানীয় civil date, clock time ও UTC offset |
| Panchanga assignment | Contact interval + local sunrise window | কোন Vedic day ও calendar cell-এ দেখানো হবে |
সূর্যগ্রহণের contact time
Local solar eclipse-এর সময় সাধারণত নিচের contact sequence ব্যবহার করা হয়:
| Contact | অর্থ | কোন eclipse-এ |
|---|---|---|
| C1 | চন্দ্রের disk প্রথম সূর্যের disk স্পর্শ করে; partial phase শুরু | সব দৃশ্যমান solar eclipse |
| C2 | Total বা annular central phase শুরু | Total/annular path-এর ভিতরে |
| Maximum | স্থানীয়ভাবে সর্বাধিক আচ্ছাদন | সব local eclipse |
| C3 | Total বা annular central phase শেষ | Total/annular path-এর ভিতরে |
| C4 | শেষ বাহ্যিক স্পর্শ; partial phase শেষ | সব দৃশ্যমান solar eclipse |
Partial-only location-এ C2 ও C3 থাকে না। গ্রহণ sunrise-এর আগে শুরু হলে C1 clock time গণনাযোগ্য হলেও observer তখন দেখতে পারবেন না; display-তে “সূর্যোদয়ের সময় গ্রহণ চলমান” লিখতে হবে। একইভাবে sunset-এর পরে C4 হলে visible segment sunset-এ শেষ হবে।
চন্দ্রগ্রহণের contact time
চন্দ্রগ্রহণে penumbra ও umbra—দুই shadow boundary-এর কারণে contact বেশি:
| Contact | অর্থ |
|---|---|
| P1 | চন্দ্র penumbra-তে প্রবেশ শুরু; উপচ্ছায়া গ্রহণ শুরু |
| U1 | চন্দ্র umbra-তে প্রবেশ শুরু; আংশিক গ্রহণ শুরু |
| U2 | চন্দ্র সম্পূর্ণ umbra-র মধ্যে; পূর্ণগ্রাস শুরু |
| Maximum | চন্দ্র পৃথিবীর shadow axis-এর সবচেয়ে কাছে |
| U3 | পূর্ণগ্রাস শেষ |
| U4 | চন্দ্র umbra থেকে সম্পূর্ণ বের হয়; আংশিক phase শেষ |
| P4 | চন্দ্র penumbra থেকে বের হয়; গ্রহণ শেষ |
Penumbral eclipse-এ শুধু P1, maximum ও P4 প্রযোজ্য। Partial lunar eclipse-এ U1 ও U4 থাকে; total না হলে U2 ও U3 থাকে না। Missing contact-কে midnight বা zero date হিসেবে format না করে “প্রযোজ্য নয়” হিসেবে প্রকাশ করতে হবে।
স্থানীয় দৃশ্যমানতা কীভাবে পরীক্ষা করবেন?
Global contact list পাওয়ার পর প্রতিটি location-এর জন্য horizon-aware calculation প্রয়োজন।
সূর্যগ্রহণ
- Observer-কে Moon shadow-এর local footprint-এর মধ্যে থাকতে হবে;
- কমপক্ষে একটি eclipse phase-এ সূর্যের altitude স্থানীয় horizon-এর ওপরে থাকতে হবে;
- sunrise বা sunset গ্রহণের মধ্যে পড়লে দৃশ্যমান অংশ clip করতে হবে;
- central path-এর বাইরে global total eclipse-ও local partial হতে পারে।
চন্দ্রগ্রহণ
- গ্রহণের phase চলাকালে চন্দ্র স্থানীয় দিগন্তের ওপরে থাকতে হবে;
- Moonrise-এর আগে global contact হলে সেই contact স্থানীয়ভাবে দৃশ্যমান নয়;
- Moonset-এর পরে contact হলে visible segment Moonset-এ শেষ;
- একটি শহর শুধু শেষ অংশ বা শুধু প্রথম অংশ দেখতে পারে।
= Eclipse geometry valid at location
AND celestial body above declared local horizon
during at least one observable phase
Atmospheric cloud, building বা পাহাড় software ephemeris-এর geometric visibility-র অংশ নয়। Result-এ “গাণিতিকভাবে দৃশ্যমান” লেখা অধিক নির্ভুল; প্রকৃত আবহাওয়া পর্যবেক্ষণের নিশ্চয়তা দেওয়া যায় না।
Magnitude, obscuration ও duration এক নয়
Solar eclipse magnitude সাধারণত maximum-এ সূর্যের diameter-এর কত অংশ চন্দ্র দ্বারা covered—তার linear ratio। Obscuration হলো সূর্যের disk area-এর আচ্ছাদিত fraction। একটি সংখ্যা আরেকটির সমান নয়।
Lunar eclipse-এ penumbral magnitude ও umbral magnitude চন্দ্রের diameter shadow-এর কত গভীরে প্রবেশ করেছে তা প্রকাশ করে; total eclipse-এ umbral magnitude ১-এর বেশি হতে পারে। তাই solar magnitude, solar obscuration এবং lunar umbral magnitude একই column-এ unit ছাড়া দেখানো উচিত নয়।
| পরিমাপ | অর্থ | Display label |
|---|---|---|
| Solar magnitude | Diameter-এর linear coverage | গ্রহণ magnitude |
| Solar obscuration | আচ্ছাদিত disk area fraction | সূর্যচ্ছাদন |
| Umbral magnitude | চন্দ্রের diameter-এর umbral immersion | প্রচ্ছায়া magnitude |
| Duration | দুটি applicable contact-এর time difference | Phase duration |
এই প্রকল্পে কোন engine ব্যবহার করা উচিত?
এই hybrid Panchanga-তে traditional Surya Siddhanta layer তিথি, নক্ষত্র, করণ, যোগ, lunar month, traditional planets এবং Bengali solar date তৈরি করে। কিন্তু physical eclipse contact ও local visibility modern Swiss Ephemeris layer থেকে নেওয়া উচিত।
গ্রহণ গণনার ক্ষেত্রে বিশেষভাবে মনে রাখতে হবে:
- Sankranti Star Correction table গ্রহণে প্রয়োগ হবে না;
- Modern Fit Bengali-date branch গ্রহণের geometry বদলাবে না;
- Traditional Bīja correction eclipse contact-এ মেশানো হবে না;
- Lahiri ayanāṃśa physical shadow contact নির্ণয়ের input নয়;
- একই ephemeris files, Delta-T policy ও library version নথিভুক্ত করতে হবে।
Swiss Ephemeris-এর প্রয়োজনীয় functions
C API বা wrapper version অনুযায়ী method signature বদলাতে পারে, কিন্তু function family সাধারণত নিম্নরূপ:
| Function | কাজ |
|---|---|
swe_sol_eclipse_when_glob |
পৃথিবীর কোথাও পরবর্তী solar eclipse খোঁজা |
swe_sol_eclipse_when_loc |
নির্দিষ্ট location-এর পরবর্তী visible solar eclipse ও contacts |
swe_sol_eclipse_how |
একটি instant ও location-এ solar eclipse attributes |
swe_sol_eclipse_where |
Shadow path-এর geographic অবস্থান |
swe_lun_eclipse_when |
পরবর্তী global lunar eclipse |
swe_lun_eclipse_when_loc |
নির্দিষ্ট location-এর lunar eclipse circumstance |
swe_lun_eclipse_how |
একটি instant ও location-এ lunar eclipse attributes |
Returned tret[] এবং attr[] index wrapper-এর current documentation দেখে map করতে হবে। সব index-এ valid contact থাকবে ধরে নেওয়া যাবে না। Return flags দিয়ে eclipse type ও local visibility যাচাই করার পরে contact format করুন।
// Conceptual flow; exact wrapper signatures may differ.
double startJdUt = ToJulianDayUtc(searchStartUtc);
var global = swiss.FindNextGlobalEclipse(startJdUt, requestedTypes);
var local = swiss.CalculateLocalCircumstances(
global.MaximumJdUt,
location.Longitude,
location.Latitude,
location.ElevationMeters);
if (local.HasObservablePhase)
Publish(LocalizeContacts(local, location.TimeZoneId));
Search loop-এর পরবর্তী start time আগের maximum বা final contact-এর সামান্য পরে এগিয়ে দিন; একই event বারবার ফেরত এলে infinite loop তৈরি হতে পারে। সমস্ত call Swiss Ephemeris lock-এর মধ্যে চালানো প্রয়োজন হলে project-এর বিদ্যমান synchronization policy অনুসরণ করুন।
UTC, local timezone এবং Vedic day
Swiss Ephemeris eclipse search সাধারণত Julian Day UT-এ event instant দেয়। প্রতিটি contact প্রথমে canonical UTC instant হিসেবে সংরক্ষণ করুন, তারপর selected timezone-এ রূপান্তর করুন। Server-এর local timezone ব্যবহার করবেন না।
একটি গ্রহণ civil midnight অতিক্রম করতে পারে। উদাহরণস্বরূপ, New York-এ P1 বুধবার রাতে এবং P4 বৃহস্পতিবার ভোরে হতে পারে; Kolkata-তে একই global eclipse বৃহস্পতিবার সকাল হতে পারে। তাই প্রতিটি contact-এর local date আলাদাভাবে format করা উচিত।
Daily Panchanga-এর sunrise-to-next-sunrise model-এ event assignment-এর জন্য একটি স্পষ্ট policy দরকার:
- যে Vedic day window-তে local maximum পড়ে, সেটিকে primary day ধরুন;
- পূর্ণ contact sequence সেই primary day-তে প্রকাশ করুন;
- গ্রহণ আগের civil date-এ শুরু হলে contact-এর পাশে পূর্ণ date দেখান;
- দুই Vedic day overlap করলে adjacent day-তে সংক্ষিপ্ত cross-reference দিন;
- calendar grid icon-এর key হিসেবে primary local civil date বা declared Vedic-day date ব্যবহার করুন—দুটি মিশ্রিত করবেন না।
Details, calendar grid ও print report-এ প্রকাশ
| Page বা report | যা দেখানো উচিত |
|---|---|
| Daily Details | স্থানীয় visibility, type, contacts, maximum, magnitude, altitude এবং sunrise/moonrise clipping |
| Monthly grid | ☀/☾ icon, “স্থানীয়ভাবে দৃশ্যমান” short label এবং details link |
| Yearly grid | Visible eclipse summary; global-only event চাইলে আলাদা style |
| Yearly Printed Panjika | গ্রহণের day entry, type, স্পর্শ–মধ্য–মোক্ষ এবং location note |
| Eclipse Search | Date range, solar/lunar filter, visible-only option ও selected location |
| Eclipse Details | Full contacts, magnitude/obscuration, altitude/azimuth, method metadata ও historical warning |
Local visibility false হলে Daily Details-এ বড় ধর্মীয় alert না দেখিয়ে “পৃথিবীর অন্য অঞ্চলে গ্রহণ; এই location থেকে দৃশ্যমান নয়” সংক্ষিপ্ত research note দেওয়া যায়। Global event-কে local গ্রহণ বলে festival icon দেওয়া উচিত নয়।
Yearly Printed Panjika XML-এ গ্রহণ
গ্রহণের data শুধু formatted CDATA text-এ রাখলে পরে search বা conversion কঠিন হয়। Existing <tithi> text-এর সঙ্গে মানবপাঠ্য summary রাখা যায়, তবে একটি structured <eclipses> child সবচেয়ে উপযোগী:
<panji date="১৫ এপ্রিল ২০২৫"
bangla_date="১ বৈশাখ ১৪৩২ বঙ্গাব্দ">
<din><![CDATA[...]]></din>
<graha><![CDATA[...]]></graha>
<tithi><![CDATA[...]]></tithi>
<hoba><![CDATA[...]]></hoba>
<lagna><![CDATA[...]]></lagna>
<eclipses>
<eclipse kind="lunar" type="total"
locally_visible="true"
location="Dhaka, Bangladesh"
timezone="Bangladesh Standard Time">
<contact name="P1" utc="2025-09-07T15:28:00Z"
local="2025-09-07T21:28:00+06:00" />
<contact name="MAX" utc="2025-09-07T18:12:00Z"
local="2025-09-08T00:12:00+06:00" />
</eclipse>
</eclipses>
</panji>
উপরের contact times কেবল schema example—calculation result নয়। Production export-এ exact engine output বসবে। Attribute-এ অন্তত global/local type, visibility, location, timezone, UTC instant, local offset, magnitude এবং calculation version রাখা ভালো।
ঐতিহাসিক গ্রহণ, calendar label ও Delta-T
Eclipse orbit calculation-এ uniform dynamical time এবং পৃথিবীর rotation-ভিত্তিক Universal Time-এর সম্পর্ক গুরুত্বপূর্ণ। এদের পার্থক্যকে Delta-T বলা হয়:
আধুনিক যুগে Delta-T তুলনামূলকভাবে ভালোভাবে জানা যায়। বহু শতাব্দী আগের ক্ষেত্রে historical observation ও model থেকে অনুমান করতে হয়; যত দূরে অতীত বা ভবিষ্যতে যাওয়া হয় uncertainty তত বাড়ে। Solar eclipse-এর geographic path ও local clock time পৃথিবীর rotation-এর কারণে এই uncertainty-তে বিশেষভাবে সংবেদনশীল।
ঐতিহাসিক output-এ তাই রাখতে হবে:
- ব্যবহৃত Delta-T model ও library version;
- Julian Day of maximum;
- UT/UTC-equivalent display;
- Julian এবং proleptic Gregorian date label—project policy অনুযায়ী;
- প্রাচীন local path বা clock time-এর uncertainty note।
NASA-এর ঐতিহাসিক catalog-এর সঙ্গে তুলনার সময় calendar convention-ও মিলাতে হবে। শুধু year-month-day string তুলনা করলে Julian/Gregorian label difference-কে calculation error মনে হতে পারে।
গ্রহণের ধর্মীয় নিয়ম আলাদা layer
কোনো গ্রহণ গাণিতিকভাবে দৃশ্যমান হওয়া এবং সেই গ্রহণের জন্য Sūtaka, স্নান, দান, উপবাস বা মন্দির-আচার প্রযোজ্য হওয়া একই সিদ্ধান্ত নয়। ধর্মীয় বিধান tradition, eclipse type, স্থানীয় দৃশ্যমানতা, গ্রহণোদয় বা গ্রহণাস্ত এবং আঞ্চলিক practice অনুযায়ী বদলাতে পারে।
সুতরাং software-এ দুটি আলাদা result রাখুন:
- Astronomical eclipse result: contacts, visibility, magnitude ও horizon;
- Ritual observance result: নির্বাচিত rule profile অনুসারে Sūtaka ও করণীয়।
Ritual profile না থাকলে app শুধু astronomy প্রকাশ করবে এবং লিখবে—“আচার-সংক্রান্ত সিদ্ধান্তের জন্য নিজ সম্প্রদায়ের অনুমোদিত পঞ্জিকা অনুসরণ করুন।” Generic internet rule থেকে একটি fixed Sūtaka duration hard-code করা উচিত নয়।
Validation checklist
গ্রহণ code-এর regression test-এ ordinary event-এর পাশাপাশি horizon ও date boundary case রাখতে হবে:
- Global total eclipse কিন্তু selected location-এ not visible;
- Global total, local partial;
- Sunrise-এর আগে C1 এবং sunrise-এর পরে maximum;
- Maximum-এর আগে sunset;
- Moonrise-এর সময় lunar eclipse already in progress;
- Moonset-এর আগে U3 কিন্তু P4 moonset-এর পরে;
- Penumbral lunar eclipse-এ U contacts absent;
- Partial solar eclipse-এ C2/C3 absent;
- একই event Kolkata, Dhaka ও New York timezone-এ ভিন্ন local date;
- DST transition-এর কাছে local formatting;
- Gregorian/Julian historical label comparison;
- Ancient event-এ Delta-T model metadata;
- Grid, Daily Details, print report ও XML-এ একই event ID;
- Global-only event-এ local religious alert না আসা;
- Ephemeris file unavailable হলে পরিষ্কার error—silent fallback নয়।
NASA catalog বা অন্য reference-এর সঙ্গে comparison-এ প্রথমে time scale, Delta-T, calendar, location, elevation, refraction/horizon convention এবং ephemeris version মিলিয়ে নিন। কয়েক সেকেন্ডের difference দেখলেই wrapper ভুল—এ সিদ্ধান্তে যাওয়া উচিত নয়।
উপসংহার
গ্রহণ পঞ্জিকার সবচেয়ে দৃশ্যমান কিন্তু সবচেয়ে location-sensitive astronomical event-গুলোর একটি। অমাবস্যা বা পূর্ণিমা event-এর context দেয়, কিন্তু গ্রহণ নিশ্চিত করতে node proximity ও shadow geometry দরকার। পৃথিবীতে গ্রহণ ঘটলেই সব শহরে দেখা যায় না; observer coordinates ও horizon test ছাড়া local ফল অসম্পূর্ণ।
এই প্রকল্পে গ্রহণের physical contacts Swiss Ephemeris থেকে আসবে এবং Surya Siddhanta traditional Panchanga-এর সঙ্গে পাশাপাশি প্রকাশিত হবে। Bengali solar-date matching-এর correction, Bīja বা ayanāṃśa eclipse geometry-তে প্রবেশ করবে না। প্রতিটি contact UTC instant হিসেবে সংরক্ষিত হবে, তারপর selected timezone ও sunrise-to-sunrise day policy অনুযায়ী display হবে।
সর্বোত্তম প্রকাশনা শুধু গ্রহণের নাম দেয় না; global type, local type, visible contacts, magnitude, horizon condition, location, timezone, engine version এবং historical uncertainty-ও জানায়। এই স্বচ্ছতা daily page, calendar grid, printed Panjika ও XML export—সব ক্ষেত্রেই একই ফলকে যাচাইযোগ্য রাখে।
তথ্যসূত্র ও আরও পাঠ
- Astrodienst—Swiss Ephemeris Programmer’s Manual; eclipse search, local circumstance, horizon ও Delta-T functions.
- Swiss Ephemeris programming interface—online documentation.
- NASA/GSFC—Basic Geometry of Solar Eclipses.
- NASA/GSFC—Glossary of Solar Eclipse Terms.
- NASA/GSFC—Lunar Eclipse Figures and contact definitions.
- NASA/GSFC—Solar Eclipse Local Circumstances.
- NASA/GSFC—Delta-T and lunar eclipse predictions.
- NASA/GSFC—Accuracy of Eclipse Predictions.
- NASA Science—Eclipse Viewing Safety.
- সূর্য সিদ্ধান্ত পঞ্জিকা প্রকল্পের SwissEphemerisEngine, Eclipse Search, Daily Details, Printed Panjika ও XML export implementation notes.
মন্তব্য, আলোচনা ও প্রশ্ন