GithubHelp home page GithubHelp logo

stevenblack / astro-rust Goto Github PK

View Code? Open in Web Editor NEW

This project forked from saurvs/astro-rust

4.0 1.0 1.0 690 KB

๐ŸŒŸโ˜€๏ธ๐ŸŒ’ Astronomical algorithms in Rust

Home Page: https://saurvs.github.io/astro-rust/

License: MIT License

Rust 100.00%

astro-rust's Introduction

astro-rust

This is my own fork of Astro-Rust by @saurvs

Contents

API Docs

About

astro-rust is a library of advanced astronomical algorithms for the Rust programming language.

Implemented algorithms include:

  • planetary and solar positioning by the complete set of elements of Bretagnon and Francou's VSP087 theory
  • lunar positioning by the principle elements of Chapront's ELP-2000/82 theory
  • satellite positioning for Saturn and Jupiter
  • finding Julian dates, sidereal time, dynamical time, equinoxes, rising and setting times, times of lunar phases
  • coordinate transformations
  • corrections for precession, nutation, parallax, aberration, atmospheric refraction
  • calculation of the physical ephemeris for Mars, Jupiter, and the rings of Saturn
  • finding position angles, illuminated fractions, visual magnitudes
  • and much more.

Usage

  • Add the dependency astro in your Cargo.toml

    [dependencies]
    astro = "2.0.0"
  • Include the crate astro in your code

    extern crate astro;
    
    use astro::*;
  • Specify your time of interest using the Julian day

    // for example, the time of the Apollo 11 moon landing
    
    let day_of_month = time::DayOfMonth{day      : 20,
      			 			          hr       : 20,
                                        min      : 18,
                                        sec      : 4.0,
                                        time_zone: 0.0};
    
    let date = time::Date{year       : 1969,
                          month      : 7, // July
                          decimal_day: time::decimal_day(&day_of_month),
                          cal_type   : time::CalType::Gregorian};
    
    let julian_day = time::julian_day(&date);
    
    // for higher accuracy in specifying the time of interest,
    // find the Julian Ephemeris day; this slightly differs from
    // the Julian day by ฮ”T, which is usually a few seconds. you
    // can get a reported value of it from the Astronomical
    // Almanac, or calculate it using the built-in function
    
    let delta_t = time::delta_t(date.year, date.month);
    
    let julian_ephm_day = time::julian_ephemeris_day(julian_day, delta_t);
  • Find the position of the Sun and the Moon with respect to the Earth

    // geocentric ecliptic point and radius vector of the Sun
    let (sun_ecl_point, rad_vec_sun) = sun::geocent_ecl_pos(julian_day);
    
    // sun_ecl_point.long    - ecliptic longitude (radians)
    // sun_ecl_point.lat     - ecliptic latitude  (radians)
    // rad_vec_sun - distance between the Sun and the Earth (AU)
    
    // and similarly for the Moon
    let (moon_ecl_point, rad_vec_moon) = lunar::geocent_ecl_pos(julian_day);
  • Find the position of a planet with respect to the Sun

    // the heliocentric point and radius vector of a planet, like Jupiter
    let (jup_long, jup_lat, rad_vec) = planet::heliocent_pos(&planet::Planet::Jupiter, julian_day);
    
    // or neptune
    let (nep_long, nep_lat, rad_vec) = planet::heliocent_pos(&planet::Planet::Neptune, julian_day);
    
    // positioning for all the eight planets (and (the dwarf planet) Pluto) is supported
    let (plut_long, plut_lat, rad_vec) = pluto::heliocent_pos(julian_day);
  • Find the geodesic distance between two locations on Earth

      // geodesic distance between the Observatoire de Paris and
      // the US Naval Observatory at Washington DC
    
      let paris = coords::GeographPoint{long: angle::deg_frm_dms(-2, 20, 14.0).to_radians(),
                                        lat : angle::deg_frm_dms(48, 50, 11.0).to_radians()};
    
      let washington = coords::GeographPoint{long: angle::deg_frm_dms(77,  3, 56.0).to_radians(),
                                             lat : angle::deg_frm_dms(38, 55, 17.0).to_radians()};
    
      // angle::deg_frm_dms() converts degrees expressed in degrees,
      // minutes and seconds into a fractional degree
    
      let distance = planet::earth::geodesic_dist(&paris, &washington); // in meters
  • Convert equatorial coordinates to ecliptic coordinates

      // equatorial coordinates of the star Pollux
    
      let right_ascension = 116.328942_f64.to_radians();
      let declination = 28.026183_f64.to_radians();
    
      // mean obliquity of the ecliptic
    
      let oblq_eclip = 23.4392911_f64.to_radians();
    
      // you can also get oblq_eclip from ecliptic::mn_oblq_IAU(julian_day)
      // for the Julian day on which the coordinates of the star
      // were observed
    
      // also make sure to type #[macro_use] before including the crate
      // to use macros
    
      // now, convert equatorial coordinates to ecliptic coordinates
    
      let (ecl_long, ecl_lat) = ecl_frm_eq!(right_ascension, declination, oblq_eclip);
  • Convert equatorial coordinates to galactic coordinates

      // equatorial coordinates of the Nova Serpentis 1978
    
      let right_ascension = angle::deg_frm_hms(17, 48, 59.74).to_radians();
      let declination = angle::deg_frm_dms(-14, 43, 8.2).to_radians();
    
      // convert to galactic coordinates
    
      let (gal_long, gal_lat) = gal_frm_eq!(right_ascension, declination);
  • Correct for nutation in different coordinate systems

    // nutation in ecliptic longitude and obliquity of the ecliptic
    let (nut_in_long, nut_in_oblq) = nutation::nutation(julian_day);
    
    // nutation in equatorial coordinates
    let (nut_in_asc, nut_in_dec) = nutation::nutation_in_eq_coords(julian_day);

Contributing

Anyone interested to contribute in any way possible is encouraged to do so. Not all the algorithms in Meeus's book have been implemented yet. Documentation and tests need to be written for them as well. Refactored code and minor optimizations for the existing code are also welcome.

The end goal (of this project) is to build a modern, well-tested, well-documented library of algorithms for future use in astronomy. And Rust is very much the right choice for building that.

A fun suggestion is the addition of the recent IAU 2000/2006 precession-nutation model. This method improves upon the existing model implemented here "by taking into account the effect of mantle anelasticity, ocean tides, electromagnetic couplings produced between the fluid outer core and the mantle as well as between the solid inner core and fluid outer core".

References

The main reference used as the source of algorithms is the famous book Astronomical Algorithms by Jean Meeus, whose almost every chapter has been addressed here, with functions that are well-documented and tests that use example data from the book; in some cases, such as ฮ”T approximation and planetary heliocentric positioning, more accurate methods have been implemented.

astro-rust's People

Contributors

saurvs avatar stevenblack avatar liamdawson avatar mhaessig avatar manguluka avatar

Stargazers

Filipe Oliveira avatar raf avatar Barabazs avatar Dmitry avatar

Watchers

 avatar

Forkers

odoochain

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.