Rise বা set হলো কোনো celestial body নির্ধারিত horizon condition অতিক্রম করার instant। Clock time কেবল সেই instant-এর local representation। তাই time zone সূর্যোদয়ের physical instant তৈরি করে না; observer coordinates, Earth orientation, body position এবং adopted horizon model সেটি নির্ধারণ করে।
“সূর্য উঠেছে”—কোন সংজ্ঞায়?
সাধারণ দৃশ্যমান sunrise বলতে প্রায়ই Sun-এর upper limb standard atmospheric refraction-সহ apparent horizon স্পর্শ করাকে বোঝানো হয়। কিন্তু astronomical বা traditional calculation অন্য definition নিতে পারে:
| Profile | Body point | Refraction | ব্যবহার |
|---|---|---|---|
| Apparent upper-limb sunrise | Sun-এর উপর প্রান্ত | Standard | সাধারণ almanac/দৃশ্যমান sunrise |
| Geometric center sunrise | Sun center | None | Declared traditional/research profile |
| Apparent disc-center | Center | Standard | Coordinate comparison |
| Twilight | Sun center | Defined depression | Civil, nautical, astronomical twilight |
| Custom terrain rise | Center/limb | Chosen model | বাস্তব পাহাড়/ভবনের horizon |
দুটি profile-এর time না মিললেই কোনোটি ভুল নয়। ভুল হবে যদি profile প্রকাশ না করে শুধু “সূর্যোদয়” লেখা হয় অথবা upper-limb result-কে center/no-refraction result-এর সঙ্গে সরাসরি তুলনা করা হয়।
Latitude ও longitude কী বদলায়?
Longitude
Longitude মূলত local meridian-এর Earth-rotation phase বদলায়। কাছাকাছি latitude-এ eastward location-এ একই celestial geometry সাধারণত আগে ঘটে। আনুমানিক চার মিনিট প্রতি degree ধারণা useful হলেও sunrise-এর exact shift declination, latitude ও horizon crossing angle-এর ওপর নির্ভর করে।
Latitude
Latitude Sun/Moon-এর diurnal path horizon-কে কী angle-এ কাটবে তা বদলায়। উচ্চ latitude-এ:
- দিনের দৈর্ঘ্যের seasonal পরিবর্তন বড় হয়;
- Body horizon-কে shallow angle-এ অতিক্রম করতে পারে;
- ছোট refraction বা altitude change বড় time shift তৈরি করতে পারে;
- কখনও rise বা set event ঘটেই না;
- Twilight সারারাত চলতে পারে।
Coordinate precision
City-center coordinate, observatory coordinate এবং user GPS coordinate এক নয়। Seconds-level result প্রকাশের আগে coordinate source ও precision যাচাই করুন। চার decimal degree প্রায় meter-level দাবি মনে হতে পারে, কিন্তু source যদি কেবল city centroid হয় তবে এত decimal বাস্তব accuracy বোঝায় না।
Observer elevation ও geometric horizon dip
উঁচু observer দূরের horizon দেখতে পান। Unobstructed sea horizon নিচে নেমে যায়; ফলে sunrise আগে এবং sunset পরে দেখা যেতে পারে। Spherical Earth approximation:
dip = arccos(R ÷ (R + h))
small-height approximation: dip ≈ √(2h ÷ R) radians
dip arcminutes ≈ 1.76 × √h, যখন h meter-এ
উদাহরণ হিসেবে ১০০ m elevation-এ ideal geometric dip প্রায় ১৭.৬ arcminute। কিন্তু এই formula তখনই meaningful যখন observer-এর সামনে সত্যিই দূরবর্তী নিচু horizon আছে। পাহাড়ের ওপর দাঁড়িয়েও সামনে আরেকটি উঁচু ridge থাকলে terrain horizon dip-কে বাতিল বা উল্টো করতে পারে।
Astronomical horizon বনাম বাস্তব terrain horizon
Standard almanac সাধারণত unobstructed astronomical horizon ধরে। বাস্তবে eastern horizon-এ পাহাড়, গাছ বা ভবন থাকলে দৃশ্যমান sunrise পরে হবে; western obstruction sunset আগে ঘটাবে। Terrain-aware calculation-এ একটি azimuth-dependent horizon mask দরকার:
effective altitude threshold = horizon altitude at event azimuth
event when apparent body altitude − effective threshold = 0
একটি scalar “horizon = 2°” পুরো দিগন্তের জন্য যথেষ্ট নয়। পূর্বে ৪° পাহাড় এবং পশ্চিমে ০° সমুদ্র থাকতে পারে। Horizon profile ideally azimuth–altitude pairs হিসেবে সংরক্ষণ করুন এবং interpolation করুন।
Digital elevation model-এর সীমা
- DEM resolution ছোট ভবন/গাছ ধরতে পারে না;
- Observer height ground elevation-এর সঙ্গে যোগ করতে হয়;
- Earth curvature ও atmospheric bending model লাগতে পারে;
- Near obstacle-এর angular height survey coordinate থেকে ভালো পাওয়া যায়;
- Historical landscape বর্তমান terrain/building-এর মতো নাও ছিল।
Atmospheric refraction
Horizon-এর কাছে atmosphere আলো বাঁকিয়ে body-কে geometric অবস্থানের চেয়ে উপরে দেখায়। Standard sunrise convention-এ refraction গুরুত্বপূর্ণ; কিন্তু বাস্তব refraction temperature, pressure, humidity, vertical temperature gradient ও weather condition-এ বদলায়।
Common almanac convention-এ Sun-এর center-এর জন্য প্রায় 90°50′ true zenith distance নেওয়া হয়—প্রায় 34′ horizontal refraction এবং 16′ solar semidiameter-এর সমষ্টি। NOAA calculator আরেকটি standard approximation হিসেবে sunrise/sunset-এ 0.833° ব্যবহার করে। এগুলো observed atmosphere-এর guarantee নয়।
উচ্চ latitude-এ sensitivity
Body যদি horizon-কে steep angle-এ কাটে, altitude-এর সামান্য error দ্রুত অতিক্রম হয়। কিন্তু shallow crossing-এ একই angular error অনেক মিনিট time shift করতে পারে। তাই polar circle-এর কাছে standard refraction variation event তৈরি বা বিলুপ্তও করতে পারে।
Refraction disabled মানে কী?
No-refraction profile physical vacuum geometry দেয়। এটি “খারাপ calculation” নয়—কিন্তু visible sunrise নয়। Traditional rule engine যদি intentionally Sun center/no-refraction ব্যবহার করে, UI-তে সেই label রাখতে হবে এবং generic weather/almanac service-এর upper-limb apparent time-এর সঙ্গে পার্থক্য প্রত্যাশিত।
Disc center, upper limb ও lower limb
Sun ও Moon point object নয়। তাদের apparent angular radius আছে। Rise/set instant নির্ধারণে কোন অংশ horizon স্পর্শ করছে তা বলতে হবে:
| Definition | Rise ordering | Set ordering |
|---|---|---|
| Upper limb | সবার আগে দেখা যায় | সবার শেষে অদৃশ্য হয় |
| Disc center | Upper limb-এর পরে | Upper-limb set-এর আগে |
| Lower limb | পুরো disc ওঠার কাছাকাছি | প্রথমে horizon ছোঁয় |
Solar angular radius সামান্য বদলায়; lunar angular radius আরও বেশি বদলায়, কারণ Moon-এর geocentric distance উল্লেখযোগ্যভাবে পরিবর্তিত হয়। Fixed 16′ radius Moon-এর জন্য যথেষ্ট নয়।
Moonrise/Moonset কেন আরও কঠিন?
Moon পৃথিবীর খুব কাছে বলে observer location অনুযায়ী apparent position-এ বড় parallax হয়। Geocentric Moon center horizon-এ পৌঁছানোর সময় এবং topocentric apparent limb দেখা দেওয়ার সময় একই নয়। সঠিক moonrise calculation-এ সাধারণত দরকার:
- Geocentric lunar ephemeris;
- Observer-এর geodetic latitude, longitude ও elevation;
- Topocentric parallax;
- Moon-এর instantaneous distance ও semidiameter;
- Atmospheric refraction profile;
- Upper-limb/center definition;
- Azimuth-dependent horizon;
- Event search window, কারণ successive moonrises প্রায় ২৪ ঘণ্টার বেশি ব্যবধানে হতে পারে।
একটি civil date-এ moonrise field blank মানেই calculation failure নয়; event আগের বা পরের civil day-এ পড়তে পারে, অথবা high latitude-এ Moon সারাদিন horizon-এর এক পাশে থাকতে পারে। আপনার দৈনিক পঞ্জিকায় sunrise-to-next-sunrise window scan করার কারণও এটি।
আপনার পঞ্জিকার দুটি deliberate profile
এই প্রকল্পে পূর্বনির্ধারিত calculation profile:
| Body | Disc | Refraction | Purpose |
|---|---|---|---|
| Sun | Center | No refraction | Declared traditional calculation boundary |
| Moon | Apparent edge/limb | Apparent/refraction profile | Observed moonrise/moonset ordering |
দুটি body-তে একই flag জোর করে ব্যবহার করার প্রয়োজন নেই; উদ্দেশ্য আলাদা হতে পারে। তবে report header-এ profile স্পষ্ট করুন—যেমন Sun: center/no-refraction · Moon: apparent limb। Comparison page-এ optional “civil apparent sunrise” পাশাপাশি দেখানো যেতে পারে, কিন্তু rule engine কোনটি ব্যবহার করেছে তা trace করতে হবে।
Swiss Ephemeris rise/set flags
swe_rise_trans()-এর mode bits দিয়ে rise/set, disc center এবং no-refraction নির্বাচন করা যায়। Wrapper অনুযায়ী নাম/constant binding যাচাই করুন:
int riseMode = SE_CALC_RISE;
// Project Sun profile: center, geometric, no refraction.
int sunMode = riseMode
| SE_BIT_DISC_CENTER
| SE_BIT_NO_REFRACTION;
// Apparent upper-limb profile: omit DISC_CENTER and NO_REFRACTION.
int apparentUpperLimbMode = riseMode;
Observer array সাধারণত longitude, latitude ও height in meters ধারণ করে। Longitude/latitude order এবং sign convention wrapper-এ নিশ্চিত করুন। Pressure/temperature parameters zero দিলে wrapper/library কী default নেয় তা documentation ও test দিয়ে যাচাই করুন; অনুমান করবেন না।
Event status-কে first-class result করুন
Rise/set function success/failure code ফিরিয়ে দিতে পারে। “No event in search interval”, “circumpolar”, “always below”, “invalid input” এবং engine error এক status-এ মিশিয়ে ফেলবেন না।
C#-এ explicit calculation profile
public enum DiscReference
{
Center,
UpperLimb,
LowerLimb
}
public enum RefractionProfile
{
None,
Standard,
MeasuredAtmosphere
}
public sealed class ObserverProfile
{
public double Latitude { get; set; }
public double Longitude { get; set; }
public double ElevationMeters { get; set; }
public double EyeHeightMeters { get; set; }
public string CoordinateSource { get; set; }
}
public sealed class RiseSetProfile
{
public DiscReference Disc { get; set; }
public RefractionProfile Refraction { get; set; }
public double PressureHpa { get; set; }
public double TemperatureCelsius { get; set; }
public bool ApplyGeometricHorizonDip { get; set; }
public string HorizonProfileId { get; set; }
}
Geometric dip helper
static double HorizonDipDegrees(
double observerHeightMeters,
double earthRadiusMeters)
{
if (observerHeightMeters < 0.0)
throw new ArgumentOutOfRangeException("observerHeightMeters");
if (earthRadiusMeters <= 0.0)
throw new ArgumentOutOfRangeException("earthRadiusMeters");
double ratio = earthRadiusMeters /
(earthRadiusMeters + observerHeightMeters);
double radians = Math.Acos(ratio);
return radians * 180.0 / Math.PI;
}
Elevation above mean sea level এবং eye height above local ground আলাদা করুন। Sea-horizon geometry-তে total observer height দরকার হতে পারে; near terrain mask-এ eye height local obstacle angle-কে প্রভাবিত করে।
Horizon mask
public interface IHorizonProfile
{
double GetAltitudeDegrees(double azimuthDegrees);
}
static double HorizonEventFunction(
double bodyApparentAltitude,
double bodyAzimuth,
IHorizonProfile horizon)
{
double obstruction = horizon.GetAltitudeDegrees(bodyAzimuth);
return bodyApparentAltitude - obstruction;
}
Root solve-এর প্রতিটি iteration-এ altitude-এর সঙ্গে azimuth-ও পুনরায় হিসাব করুন। Event azimuth baseline থেকে নিয়ে fixed obstruction ব্যবহার করলে পাহাড়ি horizon-এ bias হতে পারে।
Result metadata
public sealed class RiseSetResult
{
public string Body { get; set; }
public string EventType { get; set; }
public double JulianDayUt1 { get; set; }
public DateTime LocalDisplayTime { get; set; }
public double AzimuthDegrees { get; set; }
public string Status { get; set; }
public ObserverProfile Observer { get; set; }
public RiseSetProfile Profile { get; set; }
public string EngineVersion { get; set; }
}
Validation checklist
- Latitude range −90° to +90° validated;
- Longitude range and sign documented;
- Longitude/latitude argument order tested;
- Coordinate source recorded;
- Elevation unit is meters;
- Elevation datum documented;
- Eye height separated from ground elevation;
- Sea-level baseline test available;
- Horizon dip disabled/enabled comparison;
- 100 m dip sanity check;
- Flat horizon explicitly declared;
- Terrain mask identified by version;
- Horizon altitude varies with azimuth;
- Azimuth interpolation wraps at 0°/360°;
- Body altitude and azimuth recomputed per iteration;
- Sun center profile tested;
- Sun upper-limb profile tested;
- Moon limb profile tested;
- Lower-limb option separately tested;
- Refraction on/off comparison stored;
- Pressure unit validated;
- Temperature unit validated;
- Zero pressure behavior documented;
- Standard refraction profile versioned;
- Measured atmosphere missing-value policy defined;
- Solar semidiameter not double-applied;
- Lunar semidiameter is distance-dependent;
- Moon topocentric parallax enabled;
- Sun parallax/profile consistent;
- Geodetic/geocentric latitude conversion verified;
- UT1 input contract verified;
- ΔT not double-applied;
- Time zone applied after event solve;
- DST does not alter physical event instant;
- Search interval spans requested Vedic day;
- Moon event outside civil day handled;
- No-rise status distinguished;
- No-set status distinguished;
- Always-above status distinguished;
- Always-below status distinguished;
- Engine error not displayed as no event;
- High-latitude cases tested;
- Equatorial cases tested;
- Near-polar shallow crossing tested;
- Known USNO result compared with matching profile;
- NOAA comparison notes convention difference;
- Swiss flags written to audit trace;
- HTML profile label visible;
- XML/API observer metadata preserved;
- Regression snapshot includes engine/profile version।
সাধারণ ভুল ও সমাধান
| ভুল | ফল | সমাধান |
|---|---|---|
| City name থেকে অজানা centroid | Location-dependent time shift | Coordinates ও source দেখান |
| Upper limb বনাম center না বলা | Service comparison mismatch | Disc profile label |
| Refraction default অনুমান | কয়েক minute difference | Explicit flag/parameters |
| Elevation দিলেই terrain ধরা হয়েছে মনে করা | বাস্তব visible rise ভুল | Horizon mask আলাদা |
| Moon-এর geocentric horizon crossing | Large parallax error | Topocentric Moon |
| Blank moonrise = engine failure | ভুল error message | Search-window/status analysis |
| Time zone দিয়ে sunrise solve | Physical ও display layer মিশে যায় | UT1 solve, পরে local display |
| দুটি ভিন্ন profile-এর ফল সরাসরি তুলনা | False discrepancy | Profile-normalized comparison |
উপসংহার
সূর্যোদয় ও চন্দ্রোদয় কোনো শহরের স্থির property নয়; এগুলো নির্দিষ্ট observer, instant এবং horizon definition-এর ফল। Latitude body-এর daily path বদলায়, longitude local rotation phase বদলায়, elevation horizon dip সৃষ্টি করতে পারে এবং terrain সেই ideal horizon ঢেকে দিতে পারে।
Refraction ও limb convention apparent rise/set-এর অবিচ্ছেদ্য অংশ। Moon-এর ক্ষেত্রে topocentric parallax ও পরিবর্তনশীল semidiameter বিশেষভাবে গুরুত্বপূর্ণ। তাই একটি generic “sunrise” বা “moonrise” field-এর বদলে calculation profile সংরক্ষণ করা উচিত।
এই প্রকল্পে Sun center/no-refraction এবং Moon apparent limb profile deliberate ও traceable রাখা হলে traditional day boundary এবং observed moonrise—দুটি উদ্দেশ্য একসঙ্গে পূরণ করা যায়। ব্যবহারকারীও বুঝতে পারেন কেন অন্য weather site বা printed almanac-এর সঙ্গে কয়েক মিনিট পার্থক্য হয়েছে।
তথ্যসূত্র ও আরও পাঠ
- U.S. Naval Observatory—Rise, Set, and Twilight Definitions; horizon ও rise/set definitions.
- USNO—Astronomical Almanac Glossary; sunrise, moonrise, refraction ও semidiameter conventions.
- USNO—Rise/Set/Transit Times; observer height, flat horizon ও apparent-coordinate notes.
- NOAA/GML—Solar Calculator Details; 0.833° convention ও atmospheric variability.
- USNO—Sunrise and Sunset Near the Solstices; upper-limb/refraction definition ও seasonal geometry.
- Swiss Ephemeris Programmer’s Documentation;
swe_rise_trans, disc-center ও no-refraction flags.
মন্তব্য, আলোচনা ও প্রশ্ন