= = = = = = = = = = = = = A S T R O L I B = = = = = = = = = = = = = ΠΕΡΙΓΡΑΦΗ ΣΥΝΑΡΤΗΣΕΩΝ Π ε ρ ι ε χ ό μ ε ν α Α' ΜΕΡΟΣ - ΜΕΤΑΤΡΟΠΕΣ ΧΡΟΝΟΥ double JDGreekEaster(double year) double YYMMDD2JD(double year, double month, double day) void JD2YYMMDD(double JD, double* year, double* month, double* day) int FindDayOfTheWeek(double JD) double HHMMSS2DecHour(double hour, double minute, double second) double DecHour2HHMMSS(double DecHour, double* minute, double* second) double DDDecHour2DecDay(double day, double hour) double DecDay2DDDecHour(double DecDay, double* day, double* hour) double LT2UTC(double TZ,double hour) double UTC2LT(double TZ, double hour) double UTC2GST(double JD) double GST2UTC(double JD, double GST) double GST2LST(double Longitude, double GST) double LST2GST(double Longitude, double LST) Β' ΜΕΡΟΣ - ΑΛΑΓΕΣ ΣΥΣΤΗΜΑΤΩΝ ΑΝΑΦΟΡΑΣ void SystemTransform(double phi,double lamda, double* theta, double* psi, double[3][3] A) void PrecessionTransform(double ,double ,int ,double[] ,double[] ,double[] ,double[] ) void radec2azalt(double LST, double latitude,int n,double ra[],double dec[],double az[],double alt[]) void azalt2radec(double LST, double latitude,int n,double az[],double alt[],double ra[],double dec[]) double obliquity(double JD) void radec2lamdabeta(double obliquity,int n,double ra[],double dec[],double lamda[],double beta[]) void lamdabeta2radec(double obliquity,int n,double lamda[],double beta[],double ra[],double dec[]) void radec2galactic(int n,double ra[],double dec[],double lamda[],double beta[]) void galactic2radec(int n,double lamda[],double beta[],double ra[],double dec[]) void Transform_radec_nutationANDaberration(char flags,double JD,int n,double ra1[],double dec1[],double ra2[],double dec2[]) void Transform_lamdabeta2radec_nutationANDaberration(char flags,double JD,int n,double lamda[],double beta[],double ra[],double dec[]) double refraction(double P, double T, double alt) void GeocentricParalax(double LST, double latitude, double height, double distance, int n,double ra1[],double dec1[],double ra2[],double dec2[]) double JD_from_light_travel_delay(double JD,double distance) Γ' ΜΕΡΟΣ - ΥΠΟΛΟΓΙΣΜΟΙ ΤΡΟΧΙΩΝ double sun_longitude(double JD) double sun_distance(double sun_longitude) double sun_angular_size(double sun_longitude) void calculateMoon(double JD,double Results[6]) Α' ΜΕΡΟΣ - ΜΕΤΑΤΡΟΠΕΣ ΧΡΟΝΟΥ ============================= double JDGreekEaster(double year) ------------------------------- Επιστρέφει την JD που θα έχουμε Ελληνικό Πάσχα, για δεδομένο έτος (year). double YYMMDD2JD(double year, double month, double day) ----------------------------------------------------------------------- Συνάρτηση που επιστρέφει την Julian Date (JD) έχοντας ως ορίσματα την χρονολογία (year) τον μήνα (month) και την ημέρα. Ως ημέρα εισάγεται πραγματικός αριθμός ο οποίος περιέχει εκτός από την ακέραια ημέρα τον χρόνο (π.χ. η ημέρα 2.25 αντιπροσωπεύει την 2η ημέρα του μήνα φούφοτου, ώρα 06:00 πμ). void JD2YYMMDD(double JD, double* year, double* month, double* day) --------------------------------------------------------------------------------- Συνάρτηση που επιστρέφει ημέρα, μήνα, χρόνο σύμφωνα με την JD που τίθεται. Οι τιμές της ημέρας, μήνα, χρόνου (οι επιστρεφόμενες τιμές) επιστρέφονται εξ αναφοράς με χρήση δεικτών, οπότε η συνάρτηση καλείται π.χ. JD2YYMMDD(2446113.75,&year,&month,&day) όπου year,month,day είναι μεταβλητές double. int FindDayOfTheWeek(double JD) ------------------------------- Επιστρέφει μία ακέραιη τιμή από 0 έως 6 σύμφωνα με την JD. 0=Κυριακή, 6=Σάββατο, απλά πράγματα! double HHMMSS2DecHour(double hour, double minute, double second) ------------------------------------------------------------------------ Μετατρέπει ώρα, λεπτά, δευτερόλεπτα σε ώρα με δεκαδικό μέρος που αντι- προσωπεύει τις υποδιαιρέσεις της ώρας. double DecHour2HHMMSS(double DecHour, double* minute, double* second) ---------------------------------------------------------------------------------------- Μετατρέπει την ώρα με δεκαδικό μέρος σε Ώρα, λεπτά, δευτερόλεπτα. Η συνάρτηση επιστρέφει την (ακέραιη) ώρα ενώ οι τιμές ΛΔ επιστρέφονται εξ αναφοράς. double DDDecHour2DecDay(double day, double hour) -------------------------------------------------------------- Μετατρέπει την ημέρα, δεκαδική ώρα σε δεκαδική ημέρα ώστε να χρησιμοποιηθεί π.χ. για τον υπολογισμό της JD. double DecDay2DDDecHour(double DecDay, double* day, double* hour) ------------------------------------------------------------------------------------ Μετατρέπει την ημέρα με δεκαδικό μέρος σε ημέρα και ώρα με δεκαδικό μέρος. Η συνάρτηση επιστρέφει την (ακέραιη) ημέρα ενώ η τιμή της δεκαδικής ώρας επιστρέφεται εξ αναφοράς. double LT2UTC(double TZ,double hour) -------------------------------------- Επιστρέφει την UTC σύμφωνα με την τοπική ώρα (LT) και την Ζώνη Χρόνου (TZ). Η μονάδα μέτρησης της TZ είναι ώρες, θετική ποσότητα για ανατολικά γεωγραφικά μήκη και αρνητική για δυτικά. Πρέπει να περιλαμβάνει και τυχόν διόρθωση λόγω θερινής ώρας (DST). Είναι πιθανόν, να επιστραφεί αρνητική τιμή χρόνου ή μεγαλύτερη του 24.000. Σε περίπτωση εμφάνισης του χρόνου, θα πρέπει να γίνει ορθή προσταφαίρεση 24.000. double UTC2LT(double TZ, double hour) -------------------------------------- Επιστρέφει την τοπική ώρα (LT) σύμφωνα με την UTC και την Ζώνη Χρόνου (TZ). Ισχύουν οι ίδιες παρατηρήσεις με την LT2UTC. Είναι πιθανόν, να επιστραφεί αρνητική τιμή χρόνου ή μεγαλύτερη του 24.000. Σε περίπτωση εμφάνισης του χρόνου, θα πρέπει να γίνει ορθή προσταφαίρεση 24.000. double UTC2GST(double JD) -------------------------- Μετατρέπει την UTC σε GST (Greenwich Sidereal Time) από την JD. Η JD πρέπει να είναι υπολογισμένη για συγκεκριμένο χρόνο ώστε να εμπεριέχει την UTC εκτός της ημερομηνίας. Η επιστρεφόμενη τιμή είναι η GST σε δεκαδικές ώρες. Για τον παραπάνω υπολογισμό γίνεται η παραδοχή UT=UTC=GMT. double GST2UTC(double JD, double GST) -------------------------------------- Το αντίστροφο πρόβλημα της UTC2GST, μετατρέπει την GST σε UTC σύμφωνα με την JD. Η JD αφορά την ημερομηνία και πρέπει να είναι υπολογισμένη για την ώρα 00:00UT (π.χ. με χρήση της συνάρτησης YYMMDD2JD), έτσι το δεκαδικό μέρος της JD θα είναι 0.5. Ο υπολογισμός της UTC από την GST έχει να αντιμετωπίσεις το πρόβλημα πως για τα 4 περίπου πρώτα και τελευταία λεπτά της ημέρας σύμφωνα με την UTC, οι τιμές GST είναι ίδιες. Η συνάρτηση επιστρέφει τιμή για τα 4 πρώτα λεπτά. Η επιστρεφόμενη τιμή είναι η UTC. double GST2LST(double Longitude, double GST) --------------------------------------------- Μετατρέπει την GST σε τοπική LST σύμφωνα με το γεωγραφικό μήκος. Το γεωγραφικό μήκος (παράμετρος Longitude) πρέπει να είναι εκφρασμένο σε ακτίνια (radians). Η GST να είναι σε δεκαδικές ώρες. Η επιστρεφόμενη τιμή είναι η LST σε δεκαδικές ώρες. double LST2GST(double Longitude, double LST) --------------------------------------------- Μετατρέπει την LST σε GST σύμφωνα με το γεωγραφικό μήκος. Ισχύουν οι ίδιες παρατηρήσεις με την GST2LST. Η επιστρεφόμενη τιμή είναι η GST σε δεκαδικές ώρες. Β' ΜΕΡΟΣ - ΑΛΑΓΕΣ ΣΥΣΤΗΜΑΤΩΝ ΑΝΑΦΟΡΑΣ ====================================== void SystemTransform(double phi,double lamda, double* theta, double* psi, double[3][3] A) ------------------------------------------------------------------------- Αλλαγή συστημάτων αναφοράς σφαιρικών συντεταγμένων. (phi,lamda)->(theta,psi) όπου phi και theta είναι μήκη (όπως ορίζεται π.χ. το γεωγραφικό μήκος στην σφαιρική γη) και lamda, psi πλάτη. Οι μονάδες των σφαιρικών συντεταγμένων είναι ακτίνια (radians). Ο μετασχηματισμός πραγματοποιείται με μετατροπή των (φ,λ) σε μοναδιαίο διάνυσμα x=(i,j,k). Εφαρμόζεται περιστροφή του διανύσματος μέσω του πίνακα στροφής A[3x3]. Το νέο μον. διάνυσμα y=(x,y,z) υπολογίζεται ως εξής: y'=[A].x' όπου x',y' είναι διανύσματα στήλες. Τέλος το y μεταφέρεται πάλι σε σφαιρικές συντεταγμένες (theta,psi). Οι τιμές των theta, psi επιστρέφονται εξ'αναφοράς. void PrecessionTransform(double JD1,double JD2,int n,double[] ra1,double[] dec1,double[] ra2,double[] dec2) ------------------------------------------------------------------------------------------- Μετασχηματίζει τις ουράνιες συντεταγμένες α,δ (ra,dec - ορθή αναφορά και απόκλιση), σύμφωνα με την μετάπτωση του άξονα περιστροφής της γης. Η μετάπτωση γίνεται σύμφωνα με την JD2000.0. Εάν οι δεδομένες συντεταγμένες είναι για JD1<>JD2000.0, εισάγεται η κατάλληλη τιμή JD1 (Π.χ. 2433282.500 για JD1950.0), αλλιώς εισάγεται η JD2000.0 (=2451545.000). Τελικά υπολογίζονται οι νέες τιμές των συντεταγμένων λόγω μετάπτωσης για JD2. Η μετατροπή γίνεται για n ζεύγη συντεταγμένων ra1, dec1, (ra1[n],dec1[n])->(ra2[n],dec2[n]). Η κλήση της συνάρτησης γίνεται με τις διευθύνσεις των διανυσμάτων, στα δε διανύσματα ra2,dec2 αποθηκεύονται οι μετασχηματισμένες συντεταγμένες. Αν n<1 τότε αυτόματα τίθεται n=1. Για n=1 μπορούν να χρησιμοποιηθούν απλές τιμές double με χρήση του operator &, για n>1 χρησιμοποιούνται οι διευθύνσεις των πινάκων ra1[] κλπ, χωρίς τα brackets φυσικά. Τέλος οι διευθύνσεις των ra1,ra2 και dec1,dec2 μπορεί να είναι ταυτόσημη οπότε τροποποιείται η εισαγόμενη τιμή. void radec2azalt(double LST, double latitude,int n,double ra[],double dec[],double az[],double alt[]) ------------------------------------------------------------------------------------------- Μετασχηματίζει n τιμές ουράνιων συντεταγμένων (α,δ) σε αλταζιμουθιακές (Αz,alt), σύμφωνα με το γεωγραφικό πλάτος και την LST. Οι LST και πλάτος (latitude), πρέπει να είναι εκφρασμένες σε Ακτίνια (radians). Οι επιστρεφόμενες τιμές σε ακτίνια (radians). Ισχύουν οι παρατηρήσεις για τις παραμέτρους που ισχύουν στην παραπάνω συνάρτηση. void azalt2radec(double LST, double latitude,int n,double az[],double alt[],double ra[],double dec[]) ------------------------------------------------------------------------------------------- Η αντίστροφη συνάρτηση της radec2azalt. Ισχύουν οι ίδιες παρατηρήσεις. double obliquity(double JD) ---------------------------- Υπολογισμός της κλίσης του άξονα περιστροφής της γης σύμφωνα με την JD. Το επιστρεφόμενο αποτέλεσμα είναι η κλίση σε ακτίνια (radians). void radec2lamdabeta(double obliquity,int n,double ra[],double dec[],double lamda[],double beta[]) -------------------------------------------------------------------------------------------------- Μετασχηματισμός n τιμών ουράνιων συντεταγμένων (α,δ) σε εκλειπτικές (l,β), σύμφωνα με την κλίση του άξονα περιστροφής της γης (obliquity). Οι εισαγόμενες τιμές, αποτελέσματα σε ακτίνια. Ισχύουν οι ίδιες παρατηρήσεις με τις υπόλοιπες συναρτήσεις μετασχηματισμού συν/νων. void lamdabeta2radec(double obliquity,int n,double lamda[],double beta[],double ra[],double dec[]) -------------------------------------------------------------------------------------------------- Η αντίστροφη συνάρτηση της radec2lamdabeta. Ισχύουν κατά τα άλλα τα ίδια. void radec2galactic(int n,double ra[],double dec[],double lamda[],double beta[]) --------------------------------------------------------------------------------- Μετασχηματισμός n ουράνιων συντεταγμένων (α,δ) σε γαλαξιακές (l,b). void galactic2radec(int n,double lamda[],double beta[],double ra[],double dec[]) --------------------------------------------------------------------------------- Η αντίστροφη συνάρτηση της παραπάνω. void Transform_radec_nutationANDaberration(char flags,double JD,int n,double ra1[],double dec1[],double ra2[],double dec2[]) -------------------------------------------------------------------------------------------------- Μετασχηματισμός ουράνιων συντεταγμένων ώστε να υπολογιστεί η δράση της κλόνησης του άξονα και της οπτικής αποπλάνησης, σύμφωνα με την JD. Η μετατροπή είναι από (α1,δ1)->(α2,δ2), τιμές σε ακτίνια, ίδιες παρατηρήσεις παραμέτρων και αποτελεσμάτων ως άνω. Στην παράμετρο flags περιέχονται τα εξής bit: 0010(H02) κάνε υπολογισμό κλόνησης, 0100(Η04) κάνε υπολογισμό αποπλάνησης. Για να γίνει υπολογισμός κλόνησης + αποπλάνησης η flags πρέπει να έχει 0110 =(0010AND0100). Η κλόνηση υπολογίζεται σύμφωνα με την θεωρία περί κλόνησης προ 1984, χρησιμοποιούνται οι πρώτοι όροι της σειράς και δίνει ακρίβεια γύρω στο μισό δευτερόλεπτο της μοίρας για την περίοδο (1950.0-2050.0). Το αποτέλεσμα είναι η μεταβολή της κλίσης του άξονα περιστροφής και του εκλειπτικού μήκους. Έτσι για να διορθω- θούν οι (α,δ), μετασχηματίζονται αρχικά σε (l,β) και μετά την διόρθωση πάλι σε (α,δ). Η αποπλάνηση του φωτός οφείλεται στην κίνηση της περιφοράς της γης, γύρω από τον Ήλιο. Ο υπολογισμός γίνεται μέσω της τιμής του εκλειπτικού μήκους του Ήλιου. Η διόρθωση είναι σε όρους dl και dβ. Οπότε εφαρμόζεται στις προσωρινές τιμές (l,β) (από α,δ). void Transform_lamdabeta2radec_nutationANDaberration(char flags,double JD,int n,double lamda[],double beta[],double ra[],double dec[]) -------------------------------------------------------------------------------------------------- Η συνάρτηση είναι όμοια με την παραπάνω (radec->radec), με την διαφορά που παραλείπεται το στάδιο (α,δ)->(l,β) καθώς τα δεδομένα είναι απευθείας τιμές (λ,β) που θα μετασχηματιστούν σε (α,δ). Κατά τα άλλα ισχύουν τα ίδια. double refraction(double P, double T, double alt) --------------------------------------------------- Υπολογίζει την διόρθωση στην γωνία ύψους λόγω αστρονομικής διάθλασης, σύμφωνα με την πίεση P (mbars), την θερμοκρασία του αέρα T (deg Celsius), και την γωνία ύψους alt σε radians. Αν ar η παρατηρούμενη γωνία, η πραγματική γωνία ύψους alt=ar+refraction. Στο αντίστροφο πρόβλημα, για να υπολογιστεί η γωνία παρατήρησης: ar=alt-refraction. void GeocentricParalax(double LST, double latitude, double height, double distance, int n,double ra1[],double dec1[],double ra2[],double dec2[]) ----------------------------------------------------------------------------------------------- Μετασχηματισμός n συντεταγμένων (α,δ) -> (α2,δ2), για την επίδραση της γεωκεντρικής παράλλαξης. Η γη θεωρείται ως ελλειψοειδές εκ΄περιστροφής με μεγάλο ημιάξονα ro=6378km. Το LST εισάγεται σε ακτίνια, το γεωγραφικό πλάτος (latitude) σε ακτίνια, το ύψος (height) σε μέτρα από τη μέση στάθμη της θάλασσας και η απόσταση distance σε χιλιόμετρα (km). Η απόσταση distance αντιπροσωπεύει την απόσταση του μετασχηματισμένου αντικειμένου από το κέντρο της γης (π.χ. απόσταση σελήνης από την γη). double JD_from_light_travel_delay(double JD,double distance) ------------------------------------------------------------- Μετασχηματισμός του χρόνου λόγω ταχύτητας φωτός. Το φως ταξιδεύει με 3e5km/s, το δε φως του ήλιου χρειάζεται περί τα 500 δευτερόλεπτα για να φθάσει στην γη. Η υπολογισμένη θέση του ήλιου για JD αφορά λοιπόν την φαινόμενη θέση που θα έχει 500 δευτ. μετά την JD. Η παρούσα συνάρτηση ανάγει τον χρόνο (αφαιρεί τον χρόνο που μεσολαβεί να φθάσει το φως στην Γη), ώστε να υπολογιστεί σε δεύτερο στάδιο η φαινόμενη θέση ενός κοντινού σώματος στην γη, για το συγκεκριμένο JD. Έτσι γίνεται ένας πρώτος υπολογισμός της απόστασης του σώματος για κάποια δεδομένη JD, ύστερα με την απόσταση που υπολογίσαμε και το JD υπολογίζεται μέσω της συνάρτησης το ανηγμένο JD με το οποίο θα βρούμε την φαινόμενη θέση. Γ' ΜΕΡΟΣ - ΥΠΟΛΟΓΙΣΜΟΙ ΤΡΟΧΙΩΝ ============================== double sun_longitude(double JD) ------------------------------- Υπολογισμός του εκλειπτικού μήκους του Ήλιου σύμφωνα με την JD. Το μήκος από το γ (Vernal Equinox). Το επιστρεφόμενο αποτέλεσμα σε ακτίνια είναι το μήκος για την Epoch 1990 (1990, Jan0.0 JD=2447891.5). Ο υπολογισμός είναι ακριβής, με βηματική επίλυση της εξίσωσης του Kepler. Η τιμή αυτή φυσικά πρέπει να υποστεί διορθώσεις όπως λόγω μετάπτωσης, κλόνησης, αποπλάνησης, παράλλαξης κλπ. double sun_distance(double sun_longitude) ------------------------------------------ Η απόσταση Γης - 'Ηλιου σε km, σύμφωνα με το μήκος του Ήλιου εκφρασμένο σε ακτίνια. double sun_angular_size(double sun_longitude) ---------------------------------------------- Το φαινόμενο γωνιακό μέγεθος του 'Ηλιου σε radians, σύμφωνα με το μήκος του Ήλιου εκφρασμένο σε ακτίνια. void calculateMoon(double JD,double Results[6]) ------------------------------------------------ Υπολογισμός των στοιχείων της Σελήνης. Είσοδος: η JD (η οποία πρέπει στο δεκάδικό μέρος να περιέχει μέχρι και δευτερόλεπτα ώρας). Επιστρέφεται ο πίνακας Results[6], τα στοιχεία του οποίου είναι: Results[0]: Το εκλειπτικό μήκος της Σελήνης (λm) σε ακτίνια Results[1]: Το εκλειπτικό πλάτος της Σελήνης (βm) σε ακτίνια Results[2]: Η απόσταση Γής - Σελήνης σε km Results[3]: Το φαινόμενο γωνιακό μέγεθος της σελήνης σε ακτίνια Results[4]: Η ηλικία της σελήνης σε ακτίνια (x29.5306/2π για ημέρες) Results[5]: Το ποσοστό της φάσης της σελήνης (από 0: νέα σελήνη -> 1: πανσέληνος). (c) 2003, Στέφανος Σ. Κοζάνης - Stefanos S. Kozanis http://users.ntua.gr/soulman/ http://users.ntua.gr/soulman/astrolib/ (astrolib) Για σχόλια και παρατηρήσεις: S.Kozanis@itia.ntua.gr