diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..c56754f9555ac192d600794aacef9ae5f874c5c6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +practical_astronomy/source/src/practical_astronomy/__pycache__/pa_macro.cpython-310.pyc filter=lfs diff=lfs merge=lfs -text diff --git a/practical_astronomy/mcp_output/README_MCP.md b/practical_astronomy/mcp_output/README_MCP.md new file mode 100644 index 0000000000000000000000000000000000000000..5697b0cc5a9bb4d29d901f120aa85866b252a527 --- /dev/null +++ b/practical_astronomy/mcp_output/README_MCP.md @@ -0,0 +1,83 @@ +# Practical Astronomy Python Plugin + +## Overview + +The Practical Astronomy Python Plugin is a comprehensive library designed to assist with various astronomical calculations and data processing tasks. This plugin is part of the [Practical Astronomy Python](https://github.com/jfcarr/practical-astronomy-python) project, which provides tools for handling celestial mechanics, coordinate transformations, and other astronomy-related computations. + +## Installation + +To install the Practical Astronomy Python Plugin, ensure you have Python installed on your system. The plugin can be installed using the following steps: + +1. Clone the repository: + ``` + git clone https://github.com/jfcarr/practical-astronomy-python.git + ``` + +2. Navigate to the project directory: + ``` + cd practical-astronomy-python + ``` + +3. Install the package using `pip`: + ``` + pip install . + ``` + +Alternatively, you can use the `pyproject.toml` file to manage dependencies and build the project. + +## Usage + +The Practical Astronomy Python Plugin provides a variety of modules for different astronomical calculations. Below are some examples of how to use the plugin: + +### Coordinate Transformations + +To perform coordinate transformations, you can use the `pa_coordinate` module: + +```python +from practical_astronomy import pa_coordinate + +# Example usage +result = pa_coordinate.some_function() +print(result) +``` + +### Calculating Eclipses + +To calculate eclipses, utilize the `pa_eclipses` module: + +```python +from practical_astronomy import pa_eclipses + +# Example usage +eclipse_data = pa_eclipses.calculate_eclipse() +print(eclipse_data) +``` + +## Available Tool Endpoints + +The plugin includes several modules, each with specific functionalities: + +- `pa_binary`: Functions related to binary star systems. +- `pa_comet`: Tools for comet calculations. +- `pa_coordinate`: Coordinate transformation utilities. +- `pa_datetime`: Date and time utilities for astronomical events. +- `pa_eclipses`: Eclipse prediction and calculation. +- `pa_macro`: Macro functions for various astronomical calculations. +- `pa_moon`: Lunar calculations and data. +- `pa_planet`: Planetary data and calculations. +- `pa_sun`: Solar calculations and data. +- `pa_util`: Utility functions for general use. + +## Notes and Troubleshooting + +- Ensure that all dependencies are correctly installed. The project uses `pyproject.toml` for dependency management. +- If you encounter issues with installation or usage, verify that your Python environment is correctly set up and that all necessary packages are installed. +- For further assistance, refer to the [GitHub repository](https://github.com/jfcarr/practical-astronomy-python) for additional documentation and support. + +## Contributing + +Contributions to the Practical Astronomy Python Plugin are welcome. Please fork the repository and submit a pull request with your changes. Ensure that your code adheres to the project's coding standards and includes appropriate tests. + +## License + +This project is licensed under the MIT License. See the [LICENSE](https://github.com/jfcarr/practical-astronomy-python/blob/main/LICENSE) file for more details. \ No newline at end of file diff --git a/practical_astronomy/mcp_output/analysis.json b/practical_astronomy/mcp_output/analysis.json new file mode 100644 index 0000000000000000000000000000000000000000..4723d426d2ef28870632d27423b0ad75bb6e8a38 --- /dev/null +++ b/practical_astronomy/mcp_output/analysis.json @@ -0,0 +1,497 @@ +{ + "summary": { + "repository_url": "https://github.com/jfcarr/practical-astronomy-python", + "summary": "Imported via zip fallback, file count: 112", + "file_tree": { + "CHANGELOG.md": { + "size": 218 + }, + "README.md": { + "size": 3460 + }, + "docs-gen/src/glossary.md": { + "size": 25334 + }, + "docs/dir_45978790aec87fba6f3407586a078612.js": { + "size": 990 + }, + "docs/dir_68267d1309a1af8e8297ef4c3efbcdba.js": { + "size": 162 + }, + "docs/dynsections.js": { + "size": 4452 + }, + "docs/files_dup.js": { + "size": 185 + }, + "docs/jquery.js": { + "size": 175451 + }, + "docs/menu.js": { + "size": 3222 + }, + "docs/menudata.js": { + "size": 4010 + }, + "docs/namespacemembers_dup.js": { + "size": 994 + }, + "docs/namespacemembers_func.js": { + "size": 1100 + }, + "docs/namespacepractical__astronomy.js": { + "size": 29160 + }, + "docs/namespaces_dup.js": { + "size": 126 + }, + "docs/navtree.js": { + "size": 15609 + }, + "docs/navtreedata.js": { + "size": 11924 + }, + "docs/navtreeindex0.js": { + "size": 13734 + }, + "docs/navtreeindex1.js": { + "size": 22396 + }, + "docs/navtreeindex2.js": { + "size": 12319 + }, + "docs/pa__binary_8py.js": { + "size": 116 + }, + "docs/pa__binary__data_8py.js": { + "size": 217 + }, + "docs/pa__comet_8py.js": { + "size": 226 + }, + "docs/pa__comet__data_8py.js": { + "size": 435 + }, + "docs/pa__coordinate_8py.js": { + "size": 2460 + }, + "docs/pa__datetime_8py.js": { + "size": 2017 + }, + "docs/pa__eclipses_8py.js": { + "size": 436 + }, + "docs/pa__macro_8py.js": { + "size": 13320 + }, + "docs/pa__moon_8py.js": { + "size": 604 + }, + "docs/pa__planet_8py.js": { + "size": 331 + }, + "docs/pa__planet__data_8py.js": { + "size": 217 + }, + "docs/pa__sun_8py.js": { + "size": 682 + }, + "docs/pa__util_8py.js": { + "size": 269 + }, + "docs/resize.js": { + "size": 5054 + }, + "docs/search/all_0.js": { + "size": 101 + }, + "docs/search/all_1.js": { + "size": 1514 + }, + "docs/search/all_10.js": { + "size": 5761 + }, + "docs/search/all_11.js": { + "size": 1769 + }, + "docs/search/all_12.js": { + "size": 4749 + }, + "docs/search/all_13.js": { + "size": 1122 + }, + "docs/search/all_14.js": { + "size": 4578 + }, + "docs/search/all_15.js": { + "size": 222 + }, + "docs/search/all_2.js": { + "size": 370 + }, + "docs/search/all_3.js": { + "size": 1777 + }, + "docs/search/all_4.js": { + "size": 2519 + }, + "docs/search/all_5.js": { + "size": 4292 + }, + "docs/search/all_6.js": { + "size": 632 + }, + "docs/search/all_7.js": { + "size": 2396 + }, + "docs/search/all_8.js": { + "size": 1293 + }, + "docs/search/all_9.js": { + "size": 332 + }, + "docs/search/all_a.js": { + "size": 1452 + }, + "docs/search/all_b.js": { + "size": 177 + }, + "docs/search/all_c.js": { + "size": 2227 + }, + "docs/search/all_d.js": { + "size": 6237 + }, + "docs/search/all_e.js": { + "size": 944 + }, + "docs/search/all_f.js": { + "size": 170 + }, + "docs/search/files_0.js": { + "size": 103 + }, + "docs/search/files_1.js": { + "size": 91 + }, + "docs/search/files_2.js": { + "size": 1069 + }, + "docs/search/files_3.js": { + "size": 85 + }, + "docs/search/functions_0.js": { + "size": 1530 + }, + "docs/search/functions_1.js": { + "size": 200 + }, + "docs/search/functions_10.js": { + "size": 1704 + }, + "docs/search/functions_11.js": { + "size": 4749 + }, + "docs/search/functions_12.js": { + "size": 1122 + }, + "docs/search/functions_13.js": { + "size": 4578 + }, + "docs/search/functions_14.js": { + "size": 222 + }, + "docs/search/functions_2.js": { + "size": 1410 + }, + "docs/search/functions_3.js": { + "size": 2534 + }, + "docs/search/functions_4.js": { + "size": 4316 + }, + "docs/search/functions_5.js": { + "size": 636 + }, + "docs/search/functions_6.js": { + "size": 2250 + }, + "docs/search/functions_7.js": { + "size": 1300 + }, + "docs/search/functions_8.js": { + "size": 334 + }, + "docs/search/functions_9.js": { + "size": 1460 + }, + "docs/search/functions_a.js": { + "size": 178 + }, + "docs/search/functions_b.js": { + "size": 2233 + }, + "docs/search/functions_c.js": { + "size": 6237 + }, + "docs/search/functions_d.js": { + "size": 944 + }, + "docs/search/functions_e.js": { + "size": 170 + }, + "docs/search/functions_f.js": { + "size": 2770 + }, + "docs/search/namespaces_0.js": { + "size": 1693 + }, + "docs/search/pages_0.js": { + "size": 108 + }, + "docs/search/pages_1.js": { + "size": 116 + }, + "docs/search/search.js": { + "size": 23521 + }, + "docs/search/searchdata.js": { + "size": 392 + }, + "docs/search/variables_0.js": { + "size": 193 + }, + "docs/search/variables_1.js": { + "size": 396 + }, + "docs/search/variables_2.js": { + "size": 193 + }, + "pyproject.toml": { + "size": 688 + }, + "src/practical_astronomy/__init__.py": { + "size": 0 + }, + "src/practical_astronomy/pa_binary.py": { + "size": 1724 + }, + "src/practical_astronomy/pa_binary_data.py": { + "size": 2118 + }, + "src/practical_astronomy/pa_comet.py": { + "size": 7666 + }, + "src/practical_astronomy/pa_comet_data.py": { + "size": 3610 + }, + "src/practical_astronomy/pa_coordinate.py": { + "size": 28562 + }, + "src/practical_astronomy/pa_datetime.py": { + "size": 7006 + }, + "src/practical_astronomy/pa_eclipses.py": { + "size": 14838 + }, + "src/practical_astronomy/pa_macro.py": { + "size": 147348 + }, + "src/practical_astronomy/pa_moon.py": { + "size": 18381 + }, + "src/practical_astronomy/pa_planet.py": { + "size": 11275 + }, + "src/practical_astronomy/pa_planet_data.py": { + "size": 1971 + }, + "src/practical_astronomy/pa_sun.py": { + "size": 13296 + }, + "src/practical_astronomy/pa_util.py": { + "size": 422 + }, + "test_coordinate.py": { + "size": 26244 + }, + "test_date_of_easter.py": { + "size": 950 + }, + "test_day_number.py": { + "size": 631 + }, + "test_eclipses.py": { + "size": 7283 + }, + "test_julian.py": { + "size": 2069 + }, + "test_moon.py": { + "size": 8880 + }, + "test_planet_comet_binary.py": { + "size": 8151 + }, + "test_sun.py": { + "size": 8206 + }, + "test_time.py": { + "size": 6694 + } + }, + "processed_by": "zip_fallback", + "success": true + }, + "structure": { + "packages": [ + "source.src.practical_astronomy" + ] + }, + "dependencies": { + "has_environment_yml": false, + "has_requirements_txt": false, + "pyproject": true, + "setup_cfg": false, + "setup_py": false + }, + "entry_points": { + "imports": [], + "cli": [], + "modules": [] + }, + "llm_analysis": { + "core_modules": [ + { + "package": "source.src.practical_astronomy", + "module": "pa_binary", + "functions": [ + "calculate_binary_star_orbit", + "get_binary_star_data" + ], + "classes": [], + "description": "Functions related to binary star calculations." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_comet", + "functions": [ + "calculate_comet_position", + "get_comet_data" + ], + "classes": [], + "description": "Functions for comet position calculations and data retrieval." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_coordinate", + "functions": [ + "convert_coordinates", + "get_coordinate_data" + ], + "classes": [], + "description": "Functions for astronomical coordinate conversions." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_datetime", + "functions": [ + "convert_to_julian_date", + "get_current_astronomical_time" + ], + "classes": [], + "description": "Functions for handling astronomical date and time conversions." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_eclipses", + "functions": [ + "calculate_solar_eclipse", + "calculate_lunar_eclipse" + ], + "classes": [], + "description": "Functions for calculating solar and lunar eclipses." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_macro", + "functions": [ + "run_astronomical_macro" + ], + "classes": [], + "description": "Functions for executing predefined astronomical macros." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_moon", + "functions": [ + "calculate_moon_phase", + "get_moon_data" + ], + "classes": [], + "description": "Functions for moon phase calculations and data retrieval." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_planet", + "functions": [ + "calculate_planet_position", + "get_planet_data" + ], + "classes": [], + "description": "Functions for planet position calculations and data retrieval." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_sun", + "functions": [ + "calculate_sun_position", + "get_sun_data" + ], + "classes": [], + "description": "Functions for sun position calculations and data retrieval." + }, + { + "package": "source.src.practical_astronomy", + "module": "pa_util", + "functions": [ + "utility_function" + ], + "classes": [], + "description": "Utility functions for various astronomical calculations." + } + ], + "cli_commands": [], + "import_strategy": { + "primary": "import", + "fallback": "blackbox", + "confidence": 0.85 + }, + "dependencies": { + "required": [], + "optional": [] + }, + "risk_assessment": { + "import_feasibility": 0.85, + "intrusiveness_risk": "low", + "complexity": "medium" + } + }, + "deepwiki_analysis": { + "repo_url": "https://github.com/jfcarr/practical-astronomy-python", + "repo_name": "practical-astronomy-python", + "content": null, + "model": "gpt-4o", + "source": "selenium", + "success": true + }, + "deepwiki_options": { + "enabled": true, + "model": "gpt-4o" + }, + "risk": { + "import_feasibility": 0.85, + "intrusiveness_risk": "low", + "complexity": "medium" + } +} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/env_info.json b/practical_astronomy/mcp_output/env_info.json new file mode 100644 index 0000000000000000000000000000000000000000..65b9a4b8176d209716842e99ae45b55e141d0bec --- /dev/null +++ b/practical_astronomy/mcp_output/env_info.json @@ -0,0 +1,17 @@ +{ + "environment": { + "type": "conda", + "name": "practical-astronomy-python_556933_env", + "files": { + "pyproject_toml": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/source/pyproject.toml" + }, + "python": "3.10", + "exec_prefix": [] + }, + "original_tests": { + "passed": true, + "report_path": null + }, + "timestamp": 1763557176.8413343, + "conda_available": true +} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/mcp_logs/llm_statistics.json b/practical_astronomy/mcp_output/mcp_logs/llm_statistics.json new file mode 100644 index 0000000000000000000000000000000000000000..2b2115531354c35fd500dbc695af4ab952ef21e3 --- /dev/null +++ b/practical_astronomy/mcp_output/mcp_logs/llm_statistics.json @@ -0,0 +1,11 @@ +{ + "total_calls": 11, + "failed_calls": 0, + "retry_count": 0, + "total_prompt_tokens": 22745, + "total_completion_tokens": 6197, + "total_tokens": 28942, + "average_prompt_tokens": 2067.7272727272725, + "average_completion_tokens": 563.3636363636364, + "average_tokens": 2631.090909090909 +} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/mcp_logs/run_log.json b/practical_astronomy/mcp_output/mcp_logs/run_log.json new file mode 100644 index 0000000000000000000000000000000000000000..5112d64ac8f0045f0701fa75a8d4a781649b4759 --- /dev/null +++ b/practical_astronomy/mcp_output/mcp_logs/run_log.json @@ -0,0 +1,76 @@ +{ + "timestamp": 1763557471.1230416, + "node": "RunNode", + "test_result": { + "passed": false, + "report_path": null, + "stdout": "", + "stderr": "ERROR conda.cli.main_run:execute(41): `conda run python mcp_output/start_mcp.py` failed. (See above for error)\nTraceback (most recent call last):\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/start_mcp.py\", line 17, in \n from mcp_service import create_app\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/mcp_service.py\", line 5, in \n from src.practical_astronomy.pa_coordinate import *\nModuleNotFoundError: No module named 'src'\n\n" + }, + "run_result": { + "success": false, + "test_passed": false, + "exit_code": 1, + "stdout": "", + "stderr": "ERROR conda.cli.main_run:execute(41): `conda run python mcp_output/start_mcp.py` failed. (See above for error)\nTraceback (most recent call last):\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/start_mcp.py\", line 17, in \n from mcp_service import create_app\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/mcp_service.py\", line 5, in \n from src.practical_astronomy.pa_coordinate import *\nModuleNotFoundError: No module named 'src'\n\n", + "timestamp": 1763557471.1229722, + "error_type": "ImportError", + "error": "Module import failed: ERROR conda.cli.main_run:execute(41): `conda run python mcp_output/start_mcp.py` failed. (See above for error)\nTraceback (most recent call last):\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/start_mcp.py\", line 17, in \n from mcp_service import create_app\n File \"/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/mcp_service.py\", line 5, in \n from src.practical_astronomy.pa_coordinate import *\nModuleNotFoundError: No module named 'src'\n\n", + "details": { + "command": "/home/wshiah/code/miniconda3/bin/conda run -n practical-astronomy-python_556933_env --cwd /export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python python mcp_output/start_mcp.py", + "working_directory": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python", + "environment_type": "conda" + } + }, + "environment": { + "type": "conda", + "name": "practical-astronomy-python_556933_env", + "files": { + "pyproject_toml": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/source/pyproject.toml" + }, + "python": "3.10", + "exec_prefix": [] + }, + "plugin_info": { + "files": { + "mcp_output/start_mcp.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/start_mcp.py", + "mcp_output/mcp_plugin/__init__.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/__init__.py", + "mcp_output/mcp_plugin/mcp_service.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/mcp_service.py", + "mcp_output/mcp_plugin/adapter.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/adapter.py", + "mcp_output/mcp_plugin/main.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin/main.py", + "mcp_output/requirements.txt": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/requirements.txt", + "mcp_output/README_MCP.md": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/README_MCP.md", + "mcp_output/tests_mcp/test_mcp_basic.py": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/tests_mcp/test_mcp_basic.py" + }, + "adapter_mode": "import", + "endpoints": [ + "calculate_binary_star_orbit", + "get_binary_star_data", + "calculate_comet_position", + "get_comet_data", + "convert_coordinates", + "get_coordinate_data", + "convert_to_julian_date", + "get_current_astronomical_time", + "calculate_solar_eclipse", + "calculate_lunar_eclipse", + "run_astronomical_macro", + "calculate_moon_phase", + "get_moon_data", + "calculate_planet_position", + "get_planet_data", + "calculate_sun_position", + "get_sun_data", + "utility_function" + ], + "mcp_dir": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/mcp_plugin", + "tests_dir": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/tests_mcp", + "main_entry": "start_mcp.py", + "readme_path": "/export/project/shiweijie/ghh/LLM_MCP_RAG/MCP-agent-github-repo-output/workspace/practical-astronomy-python/mcp_output/README_MCP.md", + "requirements": [ + "fastmcp>=0.1.0", + "pydantic>=2.0.0" + ] + }, + "fastmcp_installed": false +} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/mcp_plugin/__init__.py b/practical_astronomy/mcp_output/mcp_plugin/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/practical_astronomy/mcp_output/mcp_plugin/__pycache__/adapter.cpython-310.pyc b/practical_astronomy/mcp_output/mcp_plugin/__pycache__/adapter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d5f272594388e286b39c34e4a3b25c069aa7f7 Binary files /dev/null and b/practical_astronomy/mcp_output/mcp_plugin/__pycache__/adapter.cpython-310.pyc differ diff --git a/practical_astronomy/mcp_output/mcp_plugin/__pycache__/mcp_service.cpython-310.pyc b/practical_astronomy/mcp_output/mcp_plugin/__pycache__/mcp_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8792e38f07f26118db7d9004a837fb1458cdef2f Binary files /dev/null and b/practical_astronomy/mcp_output/mcp_plugin/__pycache__/mcp_service.cpython-310.pyc differ diff --git a/practical_astronomy/mcp_output/mcp_plugin/adapter.py b/practical_astronomy/mcp_output/mcp_plugin/adapter.py new file mode 100644 index 0000000000000000000000000000000000000000..499730674d4b5e410f24f5a53f542f2b00abba8b --- /dev/null +++ b/practical_astronomy/mcp_output/mcp_plugin/adapter.py @@ -0,0 +1,224 @@ +import os +import sys + +# Path settings +source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "source") +sys.path.insert(0, source_path) + +# Import statements +try: + from src.practical_astronomy import pa_binary, pa_comet, pa_coordinate, pa_datetime, pa_eclipses, pa_macro, pa_moon, pa_planet, pa_sun, pa_util +except ImportError as e: + print("Failed to import modules from practical_astronomy. Please ensure the source path is correct.") + raise e + +# Adapter class +class Adapter: + """ + Adapter class to interface with the practical-astronomy-python library. + Provides methods to utilize various astronomical calculations and data. + """ + + def __init__(self): + self.mode = "import" + + # -------------------- Binary Module Methods -------------------- + + def call_pa_binary_function(self, *args, **kwargs): + """ + Call a function from the pa_binary module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_binary.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Comet Module Methods -------------------- + + def call_pa_comet_function(self, *args, **kwargs): + """ + Call a function from the pa_comet module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_comet.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Coordinate Module Methods -------------------- + + def call_pa_coordinate_function(self, *args, **kwargs): + """ + Call a function from the pa_coordinate module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_coordinate.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- DateTime Module Methods -------------------- + + def call_pa_datetime_function(self, *args, **kwargs): + """ + Call a function from the pa_datetime module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_datetime.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Eclipses Module Methods -------------------- + + def call_pa_eclipses_function(self, *args, **kwargs): + """ + Call a function from the pa_eclipses module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_eclipses.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Macro Module Methods -------------------- + + def call_pa_macro_function(self, *args, **kwargs): + """ + Call a function from the pa_macro module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_macro.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Moon Module Methods -------------------- + + def call_pa_moon_function(self, *args, **kwargs): + """ + Call a function from the pa_moon module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_moon.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Planet Module Methods -------------------- + + def call_pa_planet_function(self, *args, **kwargs): + """ + Call a function from the pa_planet module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_planet.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Sun Module Methods -------------------- + + def call_pa_sun_function(self, *args, **kwargs): + """ + Call a function from the pa_sun module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_sun.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Util Module Methods -------------------- + + def call_pa_util_function(self, *args, **kwargs): + """ + Call a function from the pa_util module. + + Parameters: + - args: Positional arguments for the function. + - kwargs: Keyword arguments for the function. + + Returns: + - dict: Contains the status and result of the function call. + """ + try: + result = pa_util.some_function(*args, **kwargs) + return {"status": "success", "result": result} + except Exception as e: + return {"status": "error", "message": str(e)} + + # -------------------- Error Handling -------------------- + + def handle_import_failure(self): + """ + Handle import failure gracefully. + + Returns: + - dict: Contains the status and error message. + """ + return {"status": "error", "message": "Failed to import modules. Please check the source path and module availability."} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/mcp_plugin/main.py b/practical_astronomy/mcp_output/mcp_plugin/main.py new file mode 100644 index 0000000000000000000000000000000000000000..fca6ec384e22f703b287550e94cc00baaaa4c4a7 --- /dev/null +++ b/practical_astronomy/mcp_output/mcp_plugin/main.py @@ -0,0 +1,13 @@ +""" +MCP Service Auto-Wrapper - Auto-generated +""" +from mcp_service import create_app + +def main(): + """Main entry point""" + app = create_app() + return app + +if __name__ == "__main__": + app = main() + app.run() \ No newline at end of file diff --git a/practical_astronomy/mcp_output/mcp_plugin/mcp_service.py b/practical_astronomy/mcp_output/mcp_plugin/mcp_service.py new file mode 100644 index 0000000000000000000000000000000000000000..39f70140d49331f04b318ded78f0b7f4c832b0bf --- /dev/null +++ b/practical_astronomy/mcp_output/mcp_plugin/mcp_service.py @@ -0,0 +1,710 @@ +import os +import sys +import math +from fastmcp import FastMCP +from src.practical_astronomy.pa_coordinate import * +from src.practical_astronomy.pa_datetime import * +from src.practical_astronomy.pa_eclipses import * +from src.practical_astronomy.pa_moon import * +from src.practical_astronomy.pa_planet import * +from src.practical_astronomy.pa_sun import * + +# Path settings +source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "source") +sys.path.insert(0, source_path) + +# Create the FastMCP service application +mcp = FastMCP("astronomy_service") + +# ============================================================================ +# MOON TOOLS +# ============================================================================ + +@mcp.tool( + name="approximate_position_of_moon", + description="Calculate the approximate position of the Moon using simplified algorithms. Returns RA and Dec coordinates." +) +def tool_approximate_position_of_moon( + lct_hour: int, lct_min: int, lct_sec: int, + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int +) -> dict: + """Approximate Moon position (faster, less accurate)""" + try: + moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec = \ + approximate_position_of_moon(lct_hour, lct_min, lct_sec, is_daylight_saving, + zone_correction_hours, local_date_day, local_date_month, local_date_year) + return { + "success": True, + "result": { + "type": "moon_position", + "accuracy": "approximate", + "right_ascension": { + "hour": moon_ra_hour, + "minute": moon_ra_min, + "second": moon_ra_sec, + "formatted": f"{moon_ra_hour:02d}h {moon_ra_min:02d}m {moon_ra_sec:05.2f}s" + }, + "declination": { + "degree": moon_dec_deg, + "minute": moon_dec_min, + "second": moon_dec_sec, + "formatted": f"{moon_dec_deg:+.0f}° {moon_dec_min:02d}' {moon_dec_sec:05.2f}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating approximate Moon position: {str(e)}"} + +@mcp.tool( + name="precise_position_of_moon", + description="Calculate the precise position of the Moon with high accuracy. Returns RA, Dec, distance, and parallax." +) +def tool_precise_position_of_moon( + lct_hour: int, lct_min: int, lct_sec: int, + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int +) -> dict: + """Precise Moon position (slower, more accurate)""" + try: + moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec, \ + earth_moon_dist_km, moon_hor_parallax_deg = \ + precise_position_of_moon(lct_hour, lct_min, lct_sec, is_daylight_saving, + zone_correction_hours, local_date_day, local_date_month, local_date_year) + return { + "success": True, + "result": { + "type": "moon_position", + "accuracy": "precise", + "right_ascension": { + "hour": moon_ra_hour, + "minute": moon_ra_min, + "second": moon_ra_sec, + "formatted": f"{moon_ra_hour:02d}h {moon_ra_min:02d}m {moon_ra_sec:05.2f}s" + }, + "declination": { + "degree": moon_dec_deg, + "minute": moon_dec_min, + "second": moon_dec_sec, + "formatted": f"{moon_dec_deg:+.0f}° {moon_dec_min:02d}' {moon_dec_sec:05.2f}\"" + }, + "distance": { + "km": int(earth_moon_dist_km), + "description": f"Earth-Moon distance: {int(earth_moon_dist_km):,} km" + }, + "horizontal_parallax": { + "degree": moon_hor_parallax_deg, + "description": f"Horizontal parallax: {moon_hor_parallax_deg:.6f}°" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating precise Moon position: {str(e)}"} + +@mcp.tool( + name="moon_phase", + description="Calculate the Moon's illumination phase (0=New, 0.5=Half, 1=Full) and bright limb position angle." +) +def tool_moon_phase( + lct_hour: int, lct_min: int, lct_sec: int, + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int, + accuracy_level: str = "A" +) -> dict: + """Moon phase calculation""" + try: + moon_phase_val, pa_bright_limb_deg = moon_phase( + lct_hour, lct_min, lct_sec, is_daylight_saving, + zone_correction_hours, local_date_day, local_date_month, local_date_year, accuracy_level + ) + + # Determine phase name + if moon_phase_val < 0.125: + phase_name = "New Moon" + elif moon_phase_val < 0.375: + phase_name = "Waxing Crescent" + elif moon_phase_val < 0.625: + phase_name = "First Quarter" + elif moon_phase_val < 0.875: + phase_name = "Waxing Gibbous" + else: + phase_name = "Full Moon" + + illumination_percent = round(moon_phase_val * 100, 1) + + return { + "success": True, + "result": { + "type": "moon_phase", + "phase": { + "value": moon_phase_val, + "name": phase_name, + "illumination_percent": illumination_percent, + "description": f"{phase_name} - {illumination_percent}% illuminated" + }, + "bright_limb": { + "position_angle_deg": pa_bright_limb_deg, + "description": f"Position angle of bright limb: {pa_bright_limb_deg:.2f}°" + }, + "accuracy": "precise" if accuracy_level == "P" else "approximate" + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating Moon phase: {str(e)}"} + +@mcp.tool( + name="times_of_new_and_full_moon", + description="Calculate the times of the next New Moon and Full Moon after the given date." +) +def tool_times_of_new_moon_and_full_moon( + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int +) -> dict: + """New and Full Moon times""" + try: + nm_hour, nm_min, nm_day, nm_month, nm_year, \ + fm_hour, fm_min, fm_day, fm_month, fm_year = \ + times_of_new_moon_and_full_moon(is_daylight_saving, zone_correction_hours, + local_date_day, local_date_month, local_date_year) + return { + "success": True, + "result": { + "type": "lunar_phases", + "new_moon": { + "date": f"{nm_year}-{nm_month:02d}-{nm_day:02d}", + "time": f"{nm_hour:02d}:{nm_min:02d}", + "hour": nm_hour, + "minute": nm_min, + "day": nm_day, + "month": nm_month, + "year": nm_year, + "description": f"New Moon on {nm_year}-{nm_month:02d}-{nm_day:02d} at {nm_hour:02d}:{nm_min:02d}" + }, + "full_moon": { + "date": f"{fm_year}-{fm_month:02d}-{fm_day:02d}", + "time": f"{fm_hour:02d}:{fm_min:02d}", + "hour": fm_hour, + "minute": fm_min, + "day": fm_day, + "month": fm_month, + "year": fm_year, + "description": f"Full Moon on {fm_year}-{fm_month:02d}-{fm_day:02d} at {fm_hour:02d}:{fm_min:02d}" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating lunar phases: {str(e)}"} + +@mcp.tool( + name="moon_distance_and_size", + description="Calculate the Moon's distance from Earth (km), angular diameter, and horizontal parallax." +) +def tool_moon_dist_ang_diam_hor_parallax( + lct_hour: int, lct_min: int, lct_sec: int, + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int +) -> dict: + """Moon's distance, size, and parallax""" + try: + earth_moon_dist, ang_diameter_deg, ang_diameter_min, \ + hor_parallax_deg, hor_parallax_min, hor_parallax_sec = \ + moon_dist_ang_diam_hor_parallax(lct_hour, lct_min, lct_sec, is_daylight_saving, + zone_correction_hours, local_date_day, local_date_month, local_date_year) + return { + "success": True, + "result": { + "type": "moon_physical_data", + "distance": { + "km": int(earth_moon_dist), + "description": f"Distance: {int(earth_moon_dist):,} km" + }, + "angular_diameter": { + "degree": ang_diameter_deg, + "minute": ang_diameter_min, + "formatted": f"{ang_diameter_deg}° {ang_diameter_min}'", + "description": f"Angular diameter: {ang_diameter_deg}° {ang_diameter_min}'" + }, + "horizontal_parallax": { + "degree": hor_parallax_deg, + "minute": hor_parallax_min, + "second": hor_parallax_sec, + "formatted": f"{hor_parallax_deg}° {hor_parallax_min}' {hor_parallax_sec}\"", + "description": f"Horizontal parallax: {hor_parallax_deg}° {hor_parallax_min}' {hor_parallax_sec}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating Moon distance and size: {str(e)}"} + +@mcp.tool( + name="moonrise_and_moonset", + description="Calculate local date and time of moonrise and moonset for a specific location." +) +def tool_moonrise_and_moonset( + local_date_day: int, local_date_month: int, local_date_year: int, + is_daylight_saving: bool, zone_correction_hours: int, + geog_long_deg: float, geog_lat_deg: float +) -> dict: + """Moonrise and moonset times""" + try: + mr_hour, mr_min, mr_day, mr_month, mr_year, mr_azimuth, \ + ms_hour, ms_min, ms_day, ms_month, ms_year, ms_azimuth = \ + moonrise_and_moonset(local_date_day, local_date_month, local_date_year, + is_daylight_saving, zone_correction_hours, geog_long_deg, geog_lat_deg) + return { + "success": True, + "result": { + "type": "moonrise_moonset", + "location": { + "latitude": geog_lat_deg, + "longitude": geog_long_deg + }, + "moonrise": { + "date": f"{mr_year}-{mr_month:02d}-{mr_day:02d}", + "time": f"{mr_hour:02d}:{mr_min:02d}", + "hour": mr_hour, + "minute": mr_min, + "day": mr_day, + "month": mr_month, + "year": mr_year, + "azimuth_deg": mr_azimuth, + "description": f"Moonrise on {mr_year}-{mr_month:02d}-{mr_day:02d} at {mr_hour:02d}:{mr_min:02d} (azimuth {mr_azimuth:.2f}°)" + }, + "moonset": { + "date": f"{ms_year}-{ms_month:02d}-{ms_day:02d}", + "time": f"{ms_hour:02d}:{ms_min:02d}", + "hour": ms_hour, + "minute": ms_min, + "day": ms_day, + "month": ms_month, + "year": ms_year, + "azimuth_deg": ms_azimuth, + "description": f"Moonset on {ms_year}-{ms_month:02d}-{ms_day:02d} at {ms_hour:02d}:{ms_min:02d} (azimuth {ms_azimuth:.2f}°)" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating moonrise and moonset: {str(e)}"} + +# ============================================================================ +# SUN TOOLS +# ============================================================================ + +@mcp.tool( + name="approximate_position_of_sun", + description="Calculate the approximate position of the Sun. Returns RA and Dec coordinates." +) +def tool_approximate_position_of_sun( + lct_hours: int, lct_minutes: int, lct_seconds: int, + local_day: int, local_month: int, local_year: int, + is_daylight_saving: bool, zone_correction: int +) -> dict: + """Approximate Sun position""" + try: + sun_ra_hour, sun_ra_min, sun_ra_sec, sun_dec_deg, sun_dec_min, sun_dec_sec = \ + approximate_position_of_sun(lct_hours, lct_minutes, lct_seconds, local_day, + local_month, local_year, is_daylight_saving, zone_correction) + return { + "success": True, + "result": { + "type": "sun_position", + "accuracy": "approximate", + "right_ascension": { + "hour": sun_ra_hour, + "minute": sun_ra_min, + "second": sun_ra_sec, + "formatted": f"{sun_ra_hour:02d}h {sun_ra_min:02d}m {sun_ra_sec:05.2f}s" + }, + "declination": { + "degree": sun_dec_deg, + "minute": sun_dec_min, + "second": sun_dec_sec, + "formatted": f"{sun_dec_deg:+.0f}° {sun_dec_min:02d}' {sun_dec_sec:05.2f}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating approximate Sun position: {str(e)}"} + +@mcp.tool( + name="precise_position_of_sun", + description="Calculate the precise position of the Sun with high accuracy. Returns RA and Dec." +) +def tool_precise_position_of_sun( + lct_hours: int, lct_minutes: int, lct_seconds: int, + local_day: int, local_month: int, local_year: int, + is_daylight_saving: bool, zone_correction: int +) -> dict: + """Precise Sun position""" + try: + sun_ra_hour, sun_ra_min, sun_ra_sec, sun_dec_deg, sun_dec_min, sun_dec_sec = \ + precise_position_of_sun(lct_hours, lct_minutes, lct_seconds, local_day, + local_month, local_year, is_daylight_saving, zone_correction) + return { + "success": True, + "result": { + "type": "sun_position", + "accuracy": "precise", + "right_ascension": { + "hour": sun_ra_hour, + "minute": sun_ra_min, + "second": sun_ra_sec, + "formatted": f"{sun_ra_hour:02d}h {sun_ra_min:02d}m {sun_ra_sec:05.2f}s" + }, + "declination": { + "degree": sun_dec_deg, + "minute": sun_dec_min, + "second": sun_dec_sec, + "formatted": f"{sun_dec_deg:+.0f}° {sun_dec_min:02d}' {sun_dec_sec:05.2f}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating precise Sun position: {str(e)}"} + +@mcp.tool( + name="sun_distance_and_angular_size", + description="Calculate the Sun's distance from Earth (km) and angular diameter." +) +def tool_sun_distance_and_angular_size( + lct_hours: int, lct_minutes: int, lct_seconds: int, + local_day: int, local_month: int, local_year: int, + is_daylight_saving: bool, zone_correction: int +) -> dict: + """Sun's distance and angular size""" + try: + sun_dist_km, sun_ang_size_deg, sun_ang_size_min, sun_ang_size_sec = \ + sun_distance_and_angular_size(lct_hours, lct_minutes, lct_seconds, local_day, + local_month, local_year, is_daylight_saving, zone_correction) + return { + "success": True, + "result": { + "type": "sun_physical_data", + "distance": { + "km": int(sun_dist_km), + "AU": round(sun_dist_km / 149598500, 4), + "description": f"Distance: {int(sun_dist_km):,} km ({round(sun_dist_km / 149598500, 4)} AU)" + }, + "angular_diameter": { + "degree": sun_ang_size_deg, + "minute": sun_ang_size_min, + "second": sun_ang_size_sec, + "formatted": f"{sun_ang_size_deg}° {sun_ang_size_min}' {sun_ang_size_sec}\"", + "description": f"Angular diameter: {sun_ang_size_deg}° {sun_ang_size_min}' {sun_ang_size_sec}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating Sun distance and size: {str(e)}"} + +@mcp.tool( + name="sunrise_and_sunset", + description="Calculate local sunrise and sunset times for a specific geographic location." +) +def tool_sunrise_and_sunset( + local_day: int, local_month: int, local_year: int, + is_daylight_saving: bool, zone_correction: int, + geographical_long_deg: float, geographical_lat_deg: float +) -> dict: + """Sunrise and sunset times""" + try: + local_sunrise_hour, local_sunrise_minute, local_sunset_hour, local_sunset_minute, \ + azimuth_of_sunrise_deg, azimuth_of_sunset_deg, status = \ + sunrise_and_sunset(local_day, local_month, local_year, is_daylight_saving, + zone_correction, geographical_long_deg, geographical_lat_deg) + + if status != "OK": + return { + "success": True, + "result": { + "type": "sunrise_sunset", + "status": status, + "description": f"Sunrise/sunset calculation status: {status} (may not be available at this latitude)" + }, + "error": None + } + + return { + "success": True, + "result": { + "type": "sunrise_sunset", + "date": f"{local_year}-{local_month:02d}-{local_day:02d}", + "location": { + "latitude": geographical_lat_deg, + "longitude": geographical_long_deg + }, + "sunrise": { + "time": f"{local_sunrise_hour:02d}:{local_sunrise_minute:02d}", + "hour": local_sunrise_hour, + "minute": local_sunrise_minute, + "azimuth_deg": azimuth_of_sunrise_deg, + "description": f"Sunrise at {local_sunrise_hour:02d}:{local_sunrise_minute:02d} (azimuth {azimuth_of_sunrise_deg:.2f}°)" + }, + "sunset": { + "time": f"{local_sunset_hour:02d}:{local_sunset_minute:02d}", + "hour": local_sunset_hour, + "minute": local_sunset_minute, + "azimuth_deg": azimuth_of_sunset_deg, + "description": f"Sunset at {local_sunset_hour:02d}:{local_sunset_minute:02d} (azimuth {azimuth_of_sunset_deg:.2f}°)" + }, + "daylight_hours": f"{local_sunset_hour - local_sunrise_hour} hours {local_sunset_minute - local_sunrise_minute} minutes", + "status": status + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating sunrise and sunset: {str(e)}"} + +@mcp.tool( + name="twilight_times", + description="Calculate morning and evening twilight times (civil, nautical, or astronomical)." +) +def tool_morning_and_evening_twilight( + local_day: int, local_month: int, local_year: int, + is_daylight_saving: bool, zone_correction: int, + geographical_long_deg: float, geographical_lat_deg: float, + twilight_type: str = "C" +) -> dict: + """Twilight times (Civil, Nautical, or Astronomical)""" + try: + am_hour, am_min, pm_hour, pm_min, status = \ + morning_and_evening_twilight(local_day, local_month, local_year, is_daylight_saving, + zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type) + + twilight_names = {"C": "Civil", "N": "Nautical", "A": "Astronomical"} + twilight_name = twilight_names.get(twilight_type, "Unknown") + + if status != "OK": + return { + "success": True, + "result": { + "type": "twilight", + "twilight_type": twilight_name, + "status": status, + "description": f"{twilight_name} twilight not available at this latitude on this date" + }, + "error": None + } + + return { + "success": True, + "result": { + "type": "twilight", + "date": f"{local_year}-{local_month:02d}-{local_day:02d}", + "twilight_type": twilight_name, + "location": { + "latitude": geographical_lat_deg, + "longitude": geographical_long_deg + }, + "morning_twilight": { + "begins_hour": am_hour, + "begins_minute": am_min, + "begins_time": f"{am_hour:02d}:{am_min:02d}", + "description": f"Morning {twilight_name.lower()} twilight begins at {am_hour:02d}:{am_min:02d}" + }, + "evening_twilight": { + "ends_hour": pm_hour, + "ends_minute": pm_min, + "ends_time": f"{pm_hour:02d}:{pm_min:02d}", + "description": f"Evening {twilight_name.lower()} twilight ends at {pm_hour:02d}:{pm_min:02d}" + }, + "status": status + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating twilight times: {str(e)}"} + +@mcp.tool( + name="equation_of_time", + description="Calculate the equation of time (difference between real Sun time and mean Sun time in minutes)." +) +def tool_equation_of_time( + gwdate_day: int, gwdate_month: int, gwdate_year: int +) -> dict: + """Equation of time""" + try: + eot_min, eot_sec = equation_of_time(gwdate_day, gwdate_month, gwdate_year) + total_minutes = eot_min + eot_sec / 60 + return { + "success": True, + "result": { + "type": "equation_of_time", + "date": f"{gwdate_year}-{gwdate_month:02d}-{gwdate_day:02d}", + "equation_of_time": { + "minute": eot_min, + "second": eot_sec, + "total_minutes": round(total_minutes, 2), + "formatted": f"{eot_min}m {eot_sec:.1f}s", + "description": f"Equation of time: {eot_min}m {eot_sec:.1f}s ({total_minutes:+.2f} minutes)" + }, + "interpretation": "This is the difference between apparent solar time and mean solar time" + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating equation of time: {str(e)}"} + +# ============================================================================ +# PLANET TOOLS +# ============================================================================ + +@mcp.tool( + name="approximate_position_of_planet", + description="Calculate the approximate position of a planet. Returns RA and Dec coordinates." +) +def tool_approximate_position_of_planet( + lct_hour: int, lct_min: int, lct_sec: int, + is_daylight_saving: bool, zone_correction_hours: int, + local_date_day: int, local_date_month: int, local_date_year: int, + planet_name: str +) -> dict: + """Approximate planet position""" + try: + planet_ra_hour, planet_ra_min, planet_ra_sec, \ + planet_dec_deg, planet_dec_min, planet_dec_sec = \ + approximate_position_of_planet(lct_hour, lct_min, lct_sec, is_daylight_saving, + zone_correction_hours, local_date_day, local_date_month, + local_date_year, planet_name) + return { + "success": True, + "result": { + "type": "planet_position", + "accuracy": "approximate", + "planet": planet_name, + "right_ascension": { + "hour": planet_ra_hour, + "minute": planet_ra_min, + "second": planet_ra_sec, + "formatted": f"{planet_ra_hour:02d}h {planet_ra_min:02d}m {planet_ra_sec:05.2f}s" + }, + "declination": { + "degree": planet_dec_deg, + "minute": planet_dec_min, + "second": planet_dec_sec, + "formatted": f"{planet_dec_deg:+.0f}° {planet_dec_min:02d}' {planet_dec_sec:05.2f}\"" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating planet position: {str(e)}"} + +# ============================================================================ +# ECLIPSE TOOLS +# ============================================================================ + +@mcp.tool( + name="lunar_eclipse_occurrence", + description="Determine if a lunar eclipse occurs in the given month and calculate its circumstances." +) +def tool_lunar_eclipse_occurrence( + local_date_day: int, local_date_month: int, local_date_year: int, + is_daylight_saving: bool, zone_correction_hours: int +) -> dict: + """Lunar eclipse occurrence""" + try: + eclipse_occurs, utstart_hours, utstart_minutes, utmag_start_hours, utmag_start_minutes, \ + utmag_max_hours, utmag_max_minutes, utmag_end_hours, utmag_end_minutes, ut_end_hours, ut_end_minutes, \ + eclipse_type = lunar_eclipse_occurrence(local_date_day, local_date_month, local_date_year, + is_daylight_saving, zone_correction_hours) + + if not eclipse_occurs: + return { + "success": True, + "result": { + "type": "lunar_eclipse", + "month": f"{local_date_year}-{local_date_month:02d}", + "eclipse_occurs": False, + "description": "No lunar eclipse occurs in this month" + }, + "error": None + } + + return { + "success": True, + "result": { + "type": "lunar_eclipse", + "month": f"{local_date_year}-{local_date_month:02d}", + "eclipse_occurs": True, + "eclipse_type": eclipse_type, + "circumstances": { + "eclipse_start_ut": f"{utstart_hours:02d}:{utstart_minutes:02d}", + "magnitude_start_ut": f"{utmag_start_hours:02d}:{utmag_start_minutes:02d}", + "magnitude_max_ut": f"{utmag_max_hours:02d}:{utmag_max_minutes:02d}", + "magnitude_end_ut": f"{utmag_end_hours:02d}:{utmag_end_minutes:02d}", + "eclipse_end_ut": f"{ut_end_hours:02d}:{ut_end_minutes:02d}" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating lunar eclipse occurrence: {str(e)}"} + +@mcp.tool( + name="solar_eclipse_occurrence", + description="Determine if a solar eclipse occurs in the given month." +) +def tool_solar_eclipse_occurrence( + local_date_day: int, local_date_month: int, local_date_year: int, + is_daylight_saving: bool, zone_correction_hours: int +) -> dict: + """Solar eclipse occurrence""" + try: + eclipse_occurs, utstart_hours, utstart_minutes, utmag_start_hours, utmag_start_minutes, \ + utmag_max_hours, utmag_max_minutes, utmag_end_hours, utmag_end_minutes, ut_end_hours, ut_end_minutes = \ + solar_eclipse_occurrence(local_date_day, local_date_month, local_date_year, + is_daylight_saving, zone_correction_hours) + + if not eclipse_occurs: + return { + "success": True, + "result": { + "type": "solar_eclipse", + "month": f"{local_date_year}-{local_date_month:02d}", + "eclipse_occurs": False, + "description": "No solar eclipse occurs in this month" + }, + "error": None + } + + return { + "success": True, + "result": { + "type": "solar_eclipse", + "month": f"{local_date_year}-{local_date_month:02d}", + "eclipse_occurs": True, + "circumstances": { + "eclipse_start_ut": f"{utstart_hours:02d}:{utstart_minutes:02d}", + "magnitude_start_ut": f"{utmag_start_hours:02d}:{utmag_start_minutes:02d}", + "magnitude_max_ut": f"{utmag_max_hours:02d}:{utmag_max_minutes:02d}", + "magnitude_end_ut": f"{utmag_end_hours:02d}:{utmag_end_minutes:02d}", + "eclipse_end_ut": f"{ut_end_hours:02d}:{ut_end_minutes:02d}" + } + }, + "error": None + } + except Exception as e: + return {"success": False, "result": None, "error": f"Error calculating solar eclipse occurrence: {str(e)}"} + +# ============================================================================ +# APP CREATION +# ============================================================================ + +def create_app() -> FastMCP: + """ + Create and return the FastMCP application instance. + + Returns: + - FastMCP: The configured FastMCP instance with 15+ astronomy tools. + """ + return mcp \ No newline at end of file diff --git a/practical_astronomy/mcp_output/requirements.txt b/practical_astronomy/mcp_output/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..dde114a933b7bd22ac7d74742832b07a8ea9353e --- /dev/null +++ b/practical_astronomy/mcp_output/requirements.txt @@ -0,0 +1,2 @@ +fastmcp>=0.1.0 +pydantic>=2.0.0 diff --git a/practical_astronomy/mcp_output/simple_revise_error_analysis.json b/practical_astronomy/mcp_output/simple_revise_error_analysis.json new file mode 100644 index 0000000000000000000000000000000000000000..293315d5e68d79edafe669eb36ac6e4b1fb34bf1 --- /dev/null +++ b/practical_astronomy/mcp_output/simple_revise_error_analysis.json @@ -0,0 +1,6 @@ +{ + "status": "FAIL", + "next_action": "fix_directly", + "confidence": 0.9, + "summary": "The error is caused by a ModuleNotFoundError indicating that the module 'src.practical_astronomy' cannot be found. This suggests that the module path is incorrect or the module is not installed. To fix this, verify that the 'src' directory is in the PYTHONPATH or adjust the import statement to the correct path. Additionally, ensure that the 'practical_astronomy' package is properly installed and accessible. If the module is part of the project, check the directory structure to confirm the module's location." +} \ No newline at end of file diff --git a/practical_astronomy/mcp_output/start_mcp.py b/practical_astronomy/mcp_output/start_mcp.py new file mode 100644 index 0000000000000000000000000000000000000000..32b2bac53b3a817116c6bc774f59c1f46be157ea --- /dev/null +++ b/practical_astronomy/mcp_output/start_mcp.py @@ -0,0 +1,33 @@ +""" +MCP Service Startup Entry +""" +import sys +import os + +project_root = os.path.dirname(os.path.abspath(__file__)) +mcp_plugin_dir = os.path.join(project_root, "mcp_plugin") +if mcp_plugin_dir not in sys.path: + sys.path.insert(0, mcp_plugin_dir) + +# Set path to source directory +source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "src") +sys.path.insert(0, source_path) + +from mcp_service import create_app + +def main(): + """Start FastMCP service""" + app = create_app() + # Use environment variable to configure port, default 8000 + port = int(os.environ.get("MCP_PORT", "8000")) + + # Choose transport mode based on environment variable + transport = os.environ.get("MCP_TRANSPORT", "stdio") + if transport == "http": + app.run(transport="http", host="0.0.0.0", port=port) + else: + # Default to STDIO mode + app.run() + +if __name__ == "__main__": + main() diff --git a/practical_astronomy/mcp_output/tests_mcp/test_mcp_basic.py b/practical_astronomy/mcp_output/tests_mcp/test_mcp_basic.py new file mode 100644 index 0000000000000000000000000000000000000000..cfa9b36554276548850db7754ed047b24a344402 --- /dev/null +++ b/practical_astronomy/mcp_output/tests_mcp/test_mcp_basic.py @@ -0,0 +1,49 @@ +""" +MCP Service Basic Test +""" +import sys +import os + +project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +mcp_plugin_dir = os.path.join(project_root, "mcp_plugin") +if mcp_plugin_dir not in sys.path: + sys.path.insert(0, mcp_plugin_dir) + +source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "source") +sys.path.insert(0, source_path) + +def test_import_mcp_service(): + """Test if MCP service can be imported normally""" + try: + from mcp_service import create_app + app = create_app() + assert app is not None + print("MCP service imported successfully") + return True + except Exception as e: + print("MCP service import failed: " + str(e)) + return False + +def test_adapter_init(): + """Test if adapter can be initialized normally""" + try: + from adapter import Adapter + adapter = Adapter() + assert adapter is not None + print("Adapter initialized successfully") + return True + except Exception as e: + print("Adapter initialization failed: " + str(e)) + return False + +if __name__ == "__main__": + print("Running MCP service basic test...") + test1 = test_import_mcp_service() + test2 = test_adapter_init() + + if test1 and test2: + print("All basic tests passed") + sys.exit(0) + else: + print("Some tests failed") + sys.exit(1) diff --git a/practical_astronomy/mcp_output/tests_smoke/test_smoke.py b/practical_astronomy/mcp_output/tests_smoke/test_smoke.py new file mode 100644 index 0000000000000000000000000000000000000000..482541b10e6200c8b2b5a7b6f31308d7dc33c1ca --- /dev/null +++ b/practical_astronomy/mcp_output/tests_smoke/test_smoke.py @@ -0,0 +1,29 @@ +import importlib, sys +import os + +# Add current directory to Python path +sys.path.insert(0, os.getcwd()) + +source_dir = os.path.join(os.getcwd(), "source") +if os.path.exists(source_dir): + sys.path.insert(0, source_dir) + + +try: + importlib.import_module("src.practical_astronomy") + print("OK - Successfully imported src.practical_astronomy") +except ImportError as e: + print(f"Failed to import src.practical_astronomy: {e}") + fallback_packages = [] + + fallback_packages = ['practical_astronomy', 'src.practical_astronomy'] + + for pkg in fallback_packages: + try: + importlib.import_module(pkg) + print(f"OK - Successfully imported {pkg}") + break + except ImportError: + continue + else: + print("All import attempts failed") diff --git a/practical_astronomy/source/.gitignore b/practical_astronomy/source/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fea00e8eaaf6ed478458aabb3d464f3d34209547 --- /dev/null +++ b/practical_astronomy/source/.gitignore @@ -0,0 +1,3 @@ +dist/* + +src/practical_astronomy/__pycache__/* diff --git a/practical_astronomy/source/CHANGELOG.md b/practical_astronomy/source/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..a02d3b176dd603730b4c7982976e13512427338f --- /dev/null +++ b/practical_astronomy/source/CHANGELOG.md @@ -0,0 +1,11 @@ +# Version 1.0.2 + +* Added change log. + +# Version 1.0.1 + +* Fixed undefined variables in angle macro. + +# Version 1.0.0 + +* Substantial refactor to support publishing to PyPI. https://pypi.org/project/practical-astronomy/ diff --git a/practical_astronomy/source/LICENSE b/practical_astronomy/source/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..335ea9d070ad1c319906aeff798584ded23c7387 --- /dev/null +++ b/practical_astronomy/source/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018 The Python Packaging Authority + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/practical_astronomy/source/Makefile b/practical_astronomy/source/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e80d5a3eebb207b2a196b378e03c189092d716f8 --- /dev/null +++ b/practical_astronomy/source/Makefile @@ -0,0 +1,55 @@ +PYEXE = python3 + +default: + @echo 'Targets:' + @echo ' all-tests' + @echo ' test-easter' + @echo ' test-day-number' + @echo ' test-julian' + @echo ' test-time' + @echo ' test-coordinate' + @echo ' test-sun' + @echo ' test-planet-comet-binary' + @echo ' test-moon' + @echo ' test-eclipses' + @echo ' build' + @echo ' upload-test' + @echo ' upload' + +all-tests: test-easter test-day-number test-julian test-time test-coordinate test-sun test-planet-comet-binary test-moon test-eclipses + +test-easter: + @$(PYEXE) test_date_of_easter.py + +test-day-number: + @$(PYEXE) test_day_number.py + +test-julian: + @$(PYEXE) test_julian.py + +test-time: + @$(PYEXE) test_time.py + +test-coordinate: + @$(PYEXE) test_coordinate.py + +test-sun: + @$(PYEXE) test_sun.py + +test-planet-comet-binary: + @$(PYEXE) test_planet_comet_binary.py + +test-moon: + @$(PYEXE) test_moon.py + +test-eclipses: + @$(PYEXE) test_eclipses.py + +build: + $(PYEXE) -m build + +upload-test: build + $(PYEXE) -m twine upload --repository testpypi dist/* + +upload: build + $(PYEXE) -m twine upload dist/* diff --git a/practical_astronomy/source/README.md b/practical_astronomy/source/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dedc8e51e54cbcb1cea4dfb0e82f52999042ef58 --- /dev/null +++ b/practical_astronomy/source/README.md @@ -0,0 +1,117 @@ +# practical-astronomy-python + +Algorithms from [Practical Astronomy with your Calculator or Spreadsheet](https://www.amazon.com/Practical-Astronomy-your-Calculator-Spreadsheet/dp/1108436072) by Peter Duffett-Smith, implemented in Python 3. API documentation is published [here](https://jfcarr.github.io/practical-astronomy-python/). + +If you're interested in this topic, please buy the book! It provides far more detail and context. + +## Quick Start + +Install: + +```bash +pip install practical-astronomy +``` + +Create `easter.py`: + +```python +import practical_astronomy.pa_datetime as pd + +print(pd.get_date_of_easter(2024)) +``` + +Run it: + +```bash +python easter.py +``` + +Result: + +``` +(3, 31, 2024) +``` + +## Unit Tests + +If you clone the [repo](https://github.com/jfcarr/practical-astronomy-python) locally, you can run unit tests with the Make utility: + +``` +make all-tests +``` + +## Library Functions + +Documentation [here](https://jfcarr.github.io/practical-astronomy-python/). + +### Date/Time + +Type | Description +-----|------------ +Calculate | Date of Easter +Convert | Civil Date to Day Number +Convert | Greenwich Date <-> Julian Date +Convert | Julian Date to Day-of-Week +Extract | Day, Month, and Year parts of Julian Date +Convert | Civil Time <-> Decimal Hours +Extract | Hour, Minutes, and Seconds parts of Decimal Hours +Convert | Local Civil Time <-> Universal Time +Convert | Universal Time <-> Greenwich Sidereal Time +Convert | Greenwich Sidereal Time <-> Local Sidereal Time + +### Coordinates + +Type | Description +-----|------------ +Convert | Angle <-> Decimal Degrees +Convert | Right Ascension <-> Hour Angle +Convert | Equatorial Coordinates <-> Horizon Coordinates +Calculate | Obliquity of the Ecliptic +Convert | Ecliptic Coordinates <-> Equatorial Coordinates +Convert | Equatorial Coordinates <-> Galactic Coordinates +Calculate | Angle between two objects +Calculate | Rising and Setting times for an object +Calculate | Precession (corrected coordinates between two epochs) +Calculate | Nutation (in ecliptic longitude and obliquity) for a Greenwich date +Calculate | Effects of aberration for ecliptic coordinates +Calculate | RA and Declination values, corrected for atmospheric refraction and geocentric parallax +Calculate | Heliographic coordinates +Calculate | Carrington rotation number +Calculate | Selenographic (lunar) coordinates (sub-Earth and sub-Solar) + +### The Sun + +Type | Description +-----|------------ +Calculate | Approximate and precise positions of the Sun +Calculate | Sun's distance and angular size +Calculate | Local sunrise and sunset +Calculate | Morning and evening twilight +Calculate | Equation of time +Calculate | Solar elongation + +### Planets + +Type | Description +-----|------------ +Calculate | Approximate and precise position of planet +Calculate | Visual aspects of planet (distance, angular diameter, phase, light time, position angle of bright limb, and apparent magnitude) +Calculate | Position of comet (elliptical and parabolic) +Calculate | Binary star orbit data + +### The Moon + +Type | Description +-----|------------ +Calculate | Approximate and precise position of Moon +Calculate | Moon phase and position angle of bright limb +Calculate | Times of new Moon and full Moon +Calculate | Moon's distance, angular diameter, and horizontal parallax +Calculate | Local moonrise and moonset + +### Eclipses + +Type | Description +-----|------------ +Calculate | Lunar eclipse occurrence and circumstances +Calculate | Solar eclipse occurrence and circumstances diff --git a/practical_astronomy/source/__init__.py b/practical_astronomy/source/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..31e0ac452640922986e4f62f76c75347ac238d5e --- /dev/null +++ b/practical_astronomy/source/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +""" +practical-astronomy-python Project Package Initialization File +""" diff --git a/practical_astronomy/source/docs-gen/Doxyfile b/practical_astronomy/source/docs-gen/Doxyfile new file mode 100644 index 0000000000000000000000000000000000000000..60642a88be2899e32f4ca9e86f89f4ca99008fce --- /dev/null +++ b/practical_astronomy/source/docs-gen/Doxyfile @@ -0,0 +1,27 @@ +PROJECT_NAME = "Practical Astronomy" +OUTPUT_DIRECTORY = .. +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = YES +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +HIDE_SCOPE_NAMES = YES +INPUT = src ../src/practical_astronomy ../README.md +USE_MDFILE_AS_MAINPAGE = README.md +RECURSIVE = YES +EXAMPLE_PATTERNS = * +GENERATE_HTML = YES +HTML_OUTPUT = docs +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_TREEVIEW = YES +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +GENERATE_XML = NO +GENERATE_DOCBOOK = NO +CLASS_DIAGRAMS = YES +HAVE_DOT = NO diff --git a/practical_astronomy/source/docs-gen/Makefile b/practical_astronomy/source/docs-gen/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..45563586acdb0be111901431f3f56496c21608f1 --- /dev/null +++ b/practical_astronomy/source/docs-gen/Makefile @@ -0,0 +1,13 @@ +default: + @echo 'Targets:' + @echo ' view View documentation in Firefox.' + @echo ' build-python Build documentation from Python sources.' + +view: build-python + @firefox ../docs/index.html & + +build-python: + @-rm -rf ../docs + @mkdir ../docs + @doxygen + diff --git a/practical_astronomy/source/docs-gen/src/glossary.md b/practical_astronomy/source/docs-gen/src/glossary.md new file mode 100644 index 0000000000000000000000000000000000000000..d25b6e02d126e7b863b7a0d211554997580ad919 --- /dev/null +++ b/practical_astronomy/source/docs-gen/src/glossary.md @@ -0,0 +1,417 @@ +# Glossary of Terms + +## aberration +The apparent angular displacement of a celestial object from its geometric position, caused by the motion of the observer with respect to the object, and the finite speed of light. + +## age of Moon +The angle between the Sun and the Moon measured at the Earth. + +## altitude +The angle up from the horizon. + +## annual equation +A correction of the Moon’s orbital motion due to the variation of the Sun–Earth distance as the Earth travels in its own ellipse about the Sun. + +## anomaly +The angle at the focus or the centre of an orbital ellipse between the major axis and the orbiting body or its projection. + +## apastron +The point in an orbit about a star that is furthest from the star. + +## aphelion +The point in an orbit about the Sun most distant from the Sun. + +## apogee +The point in an orbit about the Earth most distant from the Earth. + +## Astronomical Almanac +A collection of tables predicting the positions and circumstances of astronomical phenomena. This title replaced both the _American Ephemeris and Nautical Almanac_ and the _Astronomical Ephemeris_, beginning with the 1981 edition. + +## Astronomical Ephemeris +_see Astronomical Almanac._ + +## astronomical latitude +The angle between the astronomical zenith and the equator. + +## astronomical unit +Approximately equal to the length of the semi-major axis of the Earth’s orbit about the Sun, 1.496 × 10 11 metres. + +## atmospheric refraction +The apparent shift in the position of a celestial object due to the bending of light rays by the atmosphere. + +## azimuth +The angle round from the north point measured on the horizon in the sense NESW. + +## binary star +A pair of stars bound together by their mutual gravitational attraction, both in orbit about their common centre of mass. + +## calendar +System of accounting the days in the year. The **Julian calendar**, introduced by Julius Caesar, divides the year into 365 days except for every fourth year which has 366. The **Gregorian calendar**, introduced by Pope Gregory XIII (1502–1585) in 1582 and accepted in England in 1752, is the one generally in use in the West today. It reduced the errors in the Julian calendar by removing three days every four centuries; if the year ends in two noughts it is only a leap year if it is divisible by 400. So, for example, 2000 was a leap year, but 1700, 1800 and 1900 were not. 2100 will not be a leap year either. + +## celestial sphere +An imaginary sphere, usually centred on the Earth, of arbitrarily large radius on the surface of which the stars can be considered to be fixed. + +## circumpolar stars +Stars whose angular distances from the north or south celestial pole are sufficiently small that they never dip below the horizon. + +## comet +A diffuse member of the Solar System, usually with a highly elongated orbit, which becomes visible near the Sun. It has a bright head and one or more diffuse tails of variable length. + +## companion star +The fainter of the pair of stars in a visual-**binary star** system. + +## conjunction +The moment when two celestial bodies occupy the same position in the sky or share a common +coordinate when viewed from a particular place. Thus **heliocentric conjunction**, and **conjunction in +right ascension**. + +## coordinate systems +Frames of reference by means of which the position of any point can be uniquely specified. In astronomy, the systems take their names from the fundamental planes on which they are based. Thus the **ecliptic coordinate system** measures longitude round from the first point of Aries, in the plane of the ecliptic and latitude northwards from it. The **equatorial coordinate system** measures right ascension round from Aries in the plane of the Earth’s equator, and declination northwards from it. In the **horizon coordinate system**, the azimuth is measured round from the north point in the sense NESW and the altitude is the angle up from the horizon. The **galactic coordinate system** specifies position by longitude measured in the galactic plane round from the direction of the galactic centre and by latitude +measured perpendicular to the plane. **Heliographic coordinates** enable the position of an object on the surface of the Sun to be specified with respect to the solar equator and a fundamental meridian assumed to rotate at a uniform rate. **Selenographic coordinates** define positions on the surface of the Moon with +respect to the lunar equator and the mean **sub-Earth point**. + +## coordinated universal time (UTC) +The time scale available from broadcast time signals. It differs from **International atomic time (TAI)** by a whole number of seconds, and is maintained within 0.9 s of +universal time (strictly UT1) by the insertion of leap seconds, usually at the ends of June or December. + +## culmination +The moment at which a celestial body crosses the observer’s meridian. Circumpolar stars +cross the meridian above the horizon twice in one day, giving **upper culmination** and **lower culmination**. + +## day +The interval between two successive transits across the observer’s meridian of a fixed star (**sidereal day**), of the Sun (**solar day**), or of a fictitious body called the mean Sun which moves at a uniform rate along the equator (**mean solar day**). + +## daylight saving time +see **time**. + +## declination +In the equatorial coordinate system, the angle measured perpendicular to the equator (north positive, south negative). + +## dynamical time +The family of time scales introduced in 1984 that replaces **ephemeris time**. See **time**. + +## earthshine +Light reflected from the Earth which sometimes illuminates the dark portion of the Moon’s +disc, making it visible. + +## eccentricity +A measure of the degree of elongation of an ellipse, equal to the ratio of the distance of the focus from the centre to the length of the **semi-major axis**. + +## eclipse +The passage of the Moon through the Earth’s shadow (**lunar eclipse**) or parts of the Earth through the Moon’s shadow (**solar eclipse**). If, at the moment of greatest eclipse, the Moon or Sun is only partly obscured it is a **partial eclipse**; if completely obscured it is a **total eclipse**. If during a solar eclipse the +Moon obscures the central part of the Sun’s disc but leaves an unobscured ring around its edge, then it is an **annular eclipse**. + +## ecliptic +The plane containing the orbit of the Earth about the Sun. + +## ellipse +A type of regular closed curve, oval in shape, of which a circle is a special case. It is traced by a point moving in such a manner that it keeps constant the sum of its distances from two fixed points, each of which is called a **focus** of the ellipse. The longest diameter of the ellipse, which goes through both foci and the centre, is called the **major axis**, the portion from the centre to the curve in either direction being called the **semi-major axis**. + +## ephemeris time (ET) +See **time**. + +## epoch +A particular moment specified as the reference point from which time is measured. The dates 1950.0 (strictly 1950 January 0.923) and 2000.0 (2000 January 1.5) are often used as standard epochs. + +## equation of the centre +A relation between the true and mean anomalies which is an approximation to Kepler’s equation. In its simplest form it is + +_v_ = _M_ + 2_e_ sin _M_, + +where _v_ and _M_ are expressed in radians, useful for values of _e_ less than about 0.1. + +## equation of the equinoxes +Apparent sidereal time minus mean sidereal time, taking account of the effect of **nutation** on the positions of the **equinoxes**. + +## equation of time +The difference between the real solar time and the mean solar time. + +## equator +The plane through the centre of the Earth which is perpendicular to the spin axis. + +## equinox +The moment at which the Sun crosses the celestial equator. This occurs on about 21 March when its right ascension is zero (the **vernal equinox**) and about 22 September when its right ascension is 12 h (the **autumnal equinox**). The positions of the equinoxes on the celestial sphere lie along the line of the intersection of the planes of the equator and the ecliptic. + +## evection +A correction to the Moon’s orbital motion taking account of slight variations in the apparent value +of the eccentricity of its orbit. + +## extinction +The attenuation and colouring of light as it travels through a medium; in particular, **atmospheric extinction**. + +## figure of the Earth +The true shape of the Earth. It is often approximated by a **spheroid of revolution**, a geometrical shape in which any cross-section parallel to the equator is a circle, while any cross-section through the north–south axis is an ellipse with the minor axis coincident with the diameter joining the north and south poles. + +## first point of Aries +The position on the celestial sphere of the **vernal equinox**. + +## focus of an ellipse +see **ellipse**. + +## geocentric coordinates +Coordinates measured with respect to the centre of the Earth. Hence the **geocentric latitude** is the angle between the equator and a point on the surface of the Earth, as measured at the centre of the Earth. + +## geocentric parallax +The angle subtended at a heavenly body by the centre of the Earth and the point of observation on the Earth’s surface. + +## geostationary satellite +A body orbiting the Earth in the plane of the equator in such a direction and at such a height that its orbital period equals 1 day so that it keeps constant position with respect to the Earth’s surface. + +## GPS time +An atomic time kept by the US Naval Observatory and broadcast by the satellites of the global positioning system. GPS time was equal to UTC on 1980 January 6 0.0, but, unlike UTC, is not adjusted by the insertion of leap seconds. Hence GPS time is equal, in June 2011, to UTC + 15 seconds (kept to within a microsecond) and is the time you can extract from your GPS navigation device. + +## gravity +The mutual force of attraction between any two bodies which is proportional to the product of their masses and inversely proportional to the square of their separation. + +## great circle +Any circle drawn on the surface of a sphere whose centre is the same as that of the sphere. + +## Greenwich mean time (GMT) +This is ambiguous and is not now used in the _Astronomical Almanac_. Its meaning in civil life is usually the same as UTC, though previously it has been used to mean UT. Before 1925 it was reckoned from Greenwich mean noon (12 h UT). + +## Greenwich meridian +That half of the great circle on the surface of the Earth passing through the north and south poles and through the reference point in Greenwich, England. It is taken as the line of longitude 0◦. + +## horizontal parallax +The geocentric parallax when the celestial body is on the observer’s horizon; hence **equatorial horizontal parallax** when the observer is also on the equator. + +## hour angle +The difference between the local sidereal time and the right ascension. + +## inclination of orbit +The angle between the plane of the orbit and the plane of the ecliptic. + +## inner planet +A planet whose semi-major axis is smaller than that of the Earth; that is the planets Mercury and Venus. + +## international atomic time (TAI) +see **time**. + +## Julian date +The number of Julian days that have elapsed since the fundamental epoch Greenwich mean noon of 1 January 4713 BC. For 2010 January 0.0 its value is 2 455 196.5. The **Julian day number** is the integer part of the Julian date. See also **modified Julian date** (MJD). + +## Kepler’s equation +The relation between the mean and eccentric anomalies, _M_ and _E_, + +_E_ − _e_sin_E_ = _M_, + +where the angles are expressed in radians. + +## latitude +The coordinate expressing the angle (north positive, south negative) perpendicular to a fundamental plane, hence **ecliptic latitude** and **galactic latitude**. On the Earth, the **geographical latitude** is measured with respect to the equator. The ecliptic latitude can be measured either at the Earth (**geocentric**) or at the Sun (**heliocentric**). + +## librations +Variations in the orientation of the Moon’s surface with respect to an observer on the Earth. + +## light time +The time it takes light signals from a celestial body to reach an observer. + +## longitude +The coordinate expressing the angle round from a fixed direction measured in a fundamental plane, hence **ecliptic longitude** and **galactic longitude**. On the Earth, the **geographical longitude** is measured at the equator. The ecliptic longitude can be measured either at the Earth (**geocentric**) or at the Sun (**heliocentric**). + +## lunation +The period between two successive new Moons. + +## luni–solar precession +The slow retrograde motion of the first point of Aries along the equator caused by the combined effects of the Sun and the Moon on the slightly non-spherical Earth. + +## magnitude + +(i) the unit defined on a logarithmic scale which measures the brightness of a celestial object considered as a point. + +(ii) **in a lunar eclipse**, the fraction of the lunar diameter obscured by the shadow of the Earth at the moment of greatest eclipse, measured along the common diameter. + +(iii) **in a solar eclipse**, the fraction of the solar diameter obscured by the Moon at the moment of greatest eclipse, measured along the common diameter. + +## mean Sun +A fictitious heavenly body that moves at a uniform rate along the equator making one complete circuit in the same time (1 year) as the real Sun takes to make a complete circuit. + +## meridian +That half of a great circle which is terminated at the north and south poles. On the Earth a meridian is a line of longitude. On the celestial sphere, the meridian which passes through the zenith is called the **observer’s meridian**. + +## modified Julian date (MJD) +The number of Julian days elapsed since 1858 November 17.0. + +## month +The period taken by the Moon to make one complete circuit of its orbit from reference point to reference point. The **draconic month** or **nodal month** takes the ascending node as the reference and is equal to 27.212 2 mean solar days. The **sidereal month** is reckoned against the background of stars and is equal to 27.321 7 mean solar days. The Sun is used as the reference for the **synodic month** of 29.530 6 mean solar days, and the perigee for the **anomalistic month** of 27.554 6 mean solar days. + +## nadir +The point on the celestial sphere diametrically opposite the **zenith**. + +## node +A point on the celestial sphere where the great circle representing the orbit cuts the great circle representing the plane of the ecliptic. The point where the orbiting body is moving from below (south of) to above the ecliptic is called the **ascending node**; the other is the **descending node**. + +## noon +The instant at which the Sun crosses the observer’s meridian. + +## north celestial pole +The point at which the projection of the Earth’s rotation axis through the north pole intersects the celestial sphere. + +## nutation +A small periodic wobbling motion of the Earth’s rotation axis. + +## obliquity of the ecliptic +The angle at which the plane of the ecliptic is inclined to the plane of the equator. + +## opposition +The moment when two celestial bodies occupy opposite positions in the sky, or have longitudes different by 180◦ , when viewed at a particular place. + +## orbit +The path through space taken by a body gravitationally attracted to another body. + +## orbital elements +The quantities which need to be known in order to specify an orbit uniquely. + +## osculating elements +The elements describing the elliptical orbit followed by a body if all perturbing influences vanish. Since perturbations disturb the true orbit of any member of the Solar System, the osculating elements are constantly changing. + +## outer planet +Those planets having semi-major axes larger than that of the Earth. The major outer planets are Mars, Jupiter, Saturn, Uranus and Neptune. In 2006, Pluto was reclassified as a dwarf planet by the International Astronomical Union. + +## parabolic orbit +An orbit in which the velocity at any point is equal to the escape velocity. + +## parallax +The amount by which the apparent position of a celestial object shifts as the point of observation is changed. + +## penumbra +The outer portion of a shadow where the light is only partially cut off. + +## periastron +The point in an orbit about a star that is nearest to the star. + +## perigee +The point in an orbit about the Earth which is nearest the Earth. + +## perihelion +The point of closest approach to the Sun in an orbit about the Sun. + +## period of orbit +The time taken by the orbiting body to make one complete circuit. + +## perturbations +Deviations from true elliptical motion caused by the gravitational fields of other members of the Solar System. + +## phase +(i) **of Moon or planet**: the fraction of the area of the disc which is illuminated. When the dark side of the Moon faces the Earth, the phase is zero and it is **new Moon**. At the **first quarter** and the **third quarter**, the phase is equal to a half and the Moon is in **quadrature**. **Full Moon** has a phase equal to one. Whenever the phase is greater than a half, the Moon is described as **gibbous**. + +(ii) **of an eclipse**: the stage of a lunar or solar eclipse during which the eclipsed body is partly obscured (**partial phase**) or totally obscured (**total phase**). During a lunar eclipse, the Moon is in the penumbra of the Earth’s shadow during the **penumbral phase** and partially or totally in the umbra during the **umbral phase**. The partial and total phases occur during the umbral phase. + +## planet +A solid body in closed orbit about a star. In our own Solar System, the major planets are (in order of increasing distance from the Sun) Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Pluto, formerly recognised as a planet, was reclassified as a dwarf planet in 2006. + +## polar distance +The angle on the celestial sphere from the celestial pole. + +## pole +The point on a sphere which is perpendicular to a given plane. Hence **pole of the ecliptic** and **pole of the equator** (each has two poles called north and south poles for short). + +## position-angle +A celestial angle measured from 0◦ to 360◦ eastwards from the north. + +## precession +see **luni-solar precession**. + +## primary star +The brighter of the pair of stars in a visual-binary system. + +## prograde motion +Motion in the same sense as that of all the planets about the Sun. When looking down on the Solar System from the north celestial pole, prograde motion is counter-clockwise. + +## radian +A natural unit used to measure angles, equal to 1/2π revolutions and 180/π degrees. + +## radius vector +The line joining the principal focus to the position of the orbiting body on its orbital ellipse. + +## reflectivity of planet +A measure of a planet’s ability to reflect sunlight; a factor affecting its apparent brightness. + +## refraction +see **atmospheric refraction**. + +## retrograde motion +Motion in the opposite sense to that of all the planets about the Sun. When looking down on the Solar System from the north celestial pole, retrograde motion is clockwise. + +## right ascension +In the equatorial coordinate system the angle measured round from the first point of Aries in the plane of the equator, in the sense NWSE. + +## rising +The moment when a celestial body crosses the horizon on the way up. + +## Saros cycle +The period of 18 years 11 days and 8 hours after which the pattern of lunar and solar eclipses tends to repeat. + +## second (SI second) +The unit of time for the **international atomic time (TAI)** scale defined to be exactly 9 192 631 770 cycles of radiation corresponding to the transition between two hyperfine levels in the ground state of caesium 133. + +## semi-major axis +see **ellipse**. + +## setting +The moment when a celestial body crosses the horizon on the way down. + +## solar elongation +The angle between the lines of sight to the Sun and to the celestial body in question. + +## Solar System +The Sun and all the bodies, planets, comets and asteroids in closed orbits about it. + +## solstice +The points at which the apparent longitude of the Sun is 90◦ and 270◦, or the moments at which the Sun is at either of these points. These occur around 21 June and 21 December. + +## sub-Earth point +The point on a celestial body (especially the Moon) where the line joining the centre of the Earth and the centre of the body intersects the surface of the body. + +## synodic period +The time between successive conjunctions in longitude. + +## terminator +The line marking the boundary between the dark and sunlit hemispheres of a member of the Solar System. + +## terrestrial dynamical time (TDT) +see **time**. + +## terrestrial time (TT) +see **time**. + +## time +### atomic time +Time measured with respect to the natural period of oscillations of an atomic system. Caesium beam clocks currently constitute the most precise time-keepers available, and the SI unit of atomic time is defined in terms of the caesium 133 atom (see **second**). **International atomic time (TAI)** is the continuous scale resulting from analyses by the Bureau International des Poids et Mesures of atomic time standards in many countries, starting from the epoch 1958 January 1. **Coordinated universal time** (UTC) is the time scale distributed by standard time services and is tied to both TAI and UT in such a manner that (a) it differs from TAI by a whole number of +seconds, and (b) it is never more than 0.9 s different from UT (strictly UT1). This is achieved by the introduction of leap seconds into UTC from time to time. UTC constitutes the basis for legal time keeping in most parts of the world. **Terrestrial time (TT)** (**called terrestrial dynamic time (TDT)** until 1991) is used as the argument in theories of celestial dynamics and in the compilation of the _Astronomical Almanac_. It is equal to TAI +32.184 s. **TDT** had replaced **ephemeris time (ET)** in 1984, which was itself derived from analyses of the Moon’s motion. + +### solar time +Time measured with respect to the motion of the Sun or a fictitious body, no longer used, called the mean Sun (**mean solar time**). **Universal time (UT)** is, broadly speaking, the mean solar time as measured on the Greenwich meridian. It is formally defined by a mathematical formula as a function of **sidereal time** (see below), and is thus determined from observations of the stars. A direct application of the formula gives UT0; with a small correction for polar motion the scale UT1 is obtained. Whenever the term UT is used, UT1 is usually implied. **British summer time (BST)** is 1 hour ahead of UT and is an example of **daylight saving time** in which the time is adjusted to make the working day fit more conveniently into the daylight hours. + +### sidereal time +Time measured with respect to the apparent motion of the stars. The **local sidereal time** at any place is equal to the hour angle of the first point of Aries; local sidereal time on the Greenwich meridian is called **Greenwich sidereal time**. The difference between **apparent sidereal time** and **mean sidereal time** is called the **equation of the equinoxes**, and takes account of **nutation**. It may be as much as 1.2 seconds. + +## time zone +A longitudinal strip on the surface of the Earth in which the **zone time**, usually a whole number of hours before or after UT, is adopted as the local civil time by national or international agreement. + +## transit +The moment at which a celestial body crosses the observer’s meridian. + +## twilight +That period of semi-darkness after sunset or before sunrise during which the sun’s zenith distance is more than 90◦ but less than some agreed figure. This figure is 108◦ for **astronomical twilight** and 102◦ for **nautical twilight**, while for **civil twilight** it is 96◦. + +## umbra +The inner portion of a shadow where the light is completely obscured. + +## universal time +see **time**. + +## variation +A correction to the Moon’s orbital motion about the Earth that takes account of the changing solar gravitational field. + +## vernal equinox +see **equinox**. + +## year +The interval between two successive passages of the Sun through a reference point. A particular point among the stars is used as reference in the **sidereal year**, equal to 365.2564 mean solar days. The **tropical year**, 365.242 191 mean solar days, uses the first point of Aries as its reference. When no qualifying adjective is used with the word 'year', it is usually the tropical year that is meant. Perturbations to the Earth’s orbit by the other planets cause small changes in the Earth’s orbital elements. The **anomalistic year**, 365.2596 mean solar days, is the interval between two successive passages of the Sun through perigee. The **Besselian year**, not used since 1984, is the period of one complete revolution in right ascension of the fictitious mean Sun as defined by the astronomer Simon Newcomb (1835–1909). It is almost the same as the tropical year, but begins when the right ascension of the Sun is exactly 240◦ ; this instant falls very near the beginning of the **civil year**. + +## zenith +The point directly overhead at the observer. The **zenith angle** or **zenith distance** of a star is the angle between the star and the zenith. + +## zone correction +The number of hours that needs to be added to or subtracted from UT to get the **zone time**. diff --git a/practical_astronomy/source/docs/README_8md.html b/practical_astronomy/source/docs/README_8md.html new file mode 100644 index 0000000000000000000000000000000000000000..c846f5554b79453d122dca0d14f881206748cdd3 --- /dev/null +++ b/practical_astronomy/source/docs/README_8md.html @@ -0,0 +1,98 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/README.md File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
/home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/README.md File Reference
+
+
+
+
+ + + + diff --git a/practical_astronomy/source/docs/____init_____8py.html b/practical_astronomy/source/docs/____init_____8py.html new file mode 100644 index 0000000000000000000000000000000000000000..52d562509060fa8fc6b565b8d2d2376c7671af35 --- /dev/null +++ b/practical_astronomy/source/docs/____init_____8py.html @@ -0,0 +1,106 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/__init__.py File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
__init__.py File Reference
+
+
+ + + + +

+Namespaces

 practical_astronomy
 
+
+
+ + + + diff --git a/practical_astronomy/source/docs/bc_s.png b/practical_astronomy/source/docs/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 Binary files /dev/null and b/practical_astronomy/source/docs/bc_s.png differ diff --git a/practical_astronomy/source/docs/bdwn.png b/practical_astronomy/source/docs/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 Binary files /dev/null and b/practical_astronomy/source/docs/bdwn.png differ diff --git a/practical_astronomy/source/docs/closed.png b/practical_astronomy/source/docs/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 Binary files /dev/null and b/practical_astronomy/source/docs/closed.png differ diff --git a/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.html b/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.html new file mode 100644 index 0000000000000000000000000000000000000000..f2d31c3fee5b905f339b0b59f31c89ab7dc167e5 --- /dev/null +++ b/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.html @@ -0,0 +1,130 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
practical_astronomy Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  __init__.py
 
file  pa_binary.py
 
file  pa_binary_data.py
 
file  pa_comet.py
 
file  pa_comet_data.py
 
file  pa_coordinate.py
 
file  pa_datetime.py
 
file  pa_eclipses.py
 
file  pa_macro.py
 
file  pa_moon.py
 
file  pa_planet.py
 
file  pa_planet_data.py
 
file  pa_sun.py
 
file  pa_util.py
 
+
+
+ + + + diff --git a/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.js b/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.js new file mode 100644 index 0000000000000000000000000000000000000000..402252e3b5423bfd9c94996602b25a40623dbed6 --- /dev/null +++ b/practical_astronomy/source/docs/dir_45978790aec87fba6f3407586a078612.js @@ -0,0 +1,17 @@ +var dir_45978790aec87fba6f3407586a078612 = +[ + [ "__init__.py", "____init_____8py.html", null ], + [ "pa_binary.py", "pa__binary_8py.html", "pa__binary_8py" ], + [ "pa_binary_data.py", "pa__binary__data_8py.html", "pa__binary__data_8py" ], + [ "pa_comet.py", "pa__comet_8py.html", "pa__comet_8py" ], + [ "pa_comet_data.py", "pa__comet__data_8py.html", "pa__comet__data_8py" ], + [ "pa_coordinate.py", "pa__coordinate_8py.html", "pa__coordinate_8py" ], + [ "pa_datetime.py", "pa__datetime_8py.html", "pa__datetime_8py" ], + [ "pa_eclipses.py", "pa__eclipses_8py.html", "pa__eclipses_8py" ], + [ "pa_macro.py", "pa__macro_8py.html", "pa__macro_8py" ], + [ "pa_moon.py", "pa__moon_8py.html", "pa__moon_8py" ], + [ "pa_planet.py", "pa__planet_8py.html", "pa__planet_8py" ], + [ "pa_planet_data.py", "pa__planet__data_8py.html", "pa__planet__data_8py" ], + [ "pa_sun.py", "pa__sun_8py.html", "pa__sun_8py" ], + [ "pa_util.py", "pa__util_8py.html", "pa__util_8py" ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000000000000000000000000000000000000..4984de5024a0e1c7418cf924923a1b97a6b1f748 --- /dev/null +++ b/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,104 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
src Directory Reference
+
+
+ + + + +

+Directories

directory  practical_astronomy
 
+
+
+ + + + diff --git a/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.js new file mode 100644 index 0000000000000000000000000000000000000000..a2fe9e38aa5d4beb832983021e1c6570e8cfa3c2 --- /dev/null +++ b/practical_astronomy/source/docs/dir_68267d1309a1af8e8297ef4c3efbcdba.js @@ -0,0 +1,4 @@ +var dir_68267d1309a1af8e8297ef4c3efbcdba = +[ + [ "practical_astronomy", "dir_45978790aec87fba6f3407586a078612.html", "dir_45978790aec87fba6f3407586a078612" ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/dir_8ebb4883bd5210c1437544ca4cb0df32.html b/practical_astronomy/source/docs/dir_8ebb4883bd5210c1437544ca4cb0df32.html new file mode 100644 index 0000000000000000000000000000000000000000..978e0ef5ba55544955a7522bc4998ad7a3a4916f --- /dev/null +++ b/practical_astronomy/source/docs/dir_8ebb4883bd5210c1437544ca4cb0df32.html @@ -0,0 +1,98 @@ + + + + + + + +Practical Astronomy: src Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
src Directory Reference
+
+
+
+
+ + + + diff --git a/practical_astronomy/source/docs/doc.png b/practical_astronomy/source/docs/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 Binary files /dev/null and b/practical_astronomy/source/docs/doc.png differ diff --git a/practical_astronomy/source/docs/doxygen.css b/practical_astronomy/source/docs/doxygen.css new file mode 100644 index 0000000000000000000000000000000000000000..ffbff0224931d970bd6092ba0ca5fe5b9b2bc2ea --- /dev/null +++ b/practical_astronomy/source/docs/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/practical_astronomy/source/docs/doxygen.svg b/practical_astronomy/source/docs/doxygen.svg new file mode 100644 index 0000000000000000000000000000000000000000..d42dad52d5d1d835a65d89dbddd042c44ee40d3b --- /dev/null +++ b/practical_astronomy/source/docs/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/practical_astronomy/source/docs/dynsections.js b/practical_astronomy/source/docs/dynsections.js new file mode 100644 index 0000000000000000000000000000000000000000..3174bd7bebbfd7f0d536023e43f8bebf4f40faad --- /dev/null +++ b/practical_astronomy/source/docs/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +Practical Astronomy: File List + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+
+
+ + + + diff --git a/practical_astronomy/source/docs/files_dup.js b/practical_astronomy/source/docs/files_dup.js new file mode 100644 index 0000000000000000000000000000000000000000..e31f28ee91dac9b5e956d9fa98f212bf075aa667 --- /dev/null +++ b/practical_astronomy/source/docs/files_dup.js @@ -0,0 +1,5 @@ +var files_dup = +[ + [ "src", "dir_8ebb4883bd5210c1437544ca4cb0df32.html", null ], + [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/folderclosed.png b/practical_astronomy/source/docs/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 Binary files /dev/null and b/practical_astronomy/source/docs/folderclosed.png differ diff --git a/practical_astronomy/source/docs/folderopen.png b/practical_astronomy/source/docs/folderopen.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c7f676a3b3ef8c2c307d319dff3c6a604eb227 Binary files /dev/null and b/practical_astronomy/source/docs/folderopen.png differ diff --git a/practical_astronomy/source/docs/glossary_8md.html b/practical_astronomy/source/docs/glossary_8md.html new file mode 100644 index 0000000000000000000000000000000000000000..1b8cdbc759c35bd91a56be072264f92d1cbf7e5e --- /dev/null +++ b/practical_astronomy/source/docs/glossary_8md.html @@ -0,0 +1,98 @@ + + + + + + + +Practical Astronomy: src/glossary.md File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
src/glossary.md File Reference
+
+
+
+
+ + + + diff --git a/practical_astronomy/source/docs/index.html b/practical_astronomy/source/docs/index.html new file mode 100644 index 0000000000000000000000000000000000000000..2f624b68cdfc49be7eb1758d62404d9a2e44821d --- /dev/null +++ b/practical_astronomy/source/docs/index.html @@ -0,0 +1,239 @@ + + + + + + + +Practical Astronomy: practical-astronomy-python + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
practical-astronomy-python
+
+
+

Algorithms from Practical Astronomy with your Calculator or Spreadsheet by Peter Duffett-Smith, implemented in Python 3. API documentation is published here.

+

If you're interested in this topic, please buy the book! It provides far more detail and context.

+

+Quick Start

+

Install:

+
pip install practical-astronomy
+

Create easter.py:

+
import practical_astronomy.pa_datetime as pd
+
+
print(pd.get_date_of_easter(2024))
+

Run it:

+
python easter.py
+

Result:

+
(3, 31, 2024)
+

+Unit Tests

+

If you clone the repo locally, you can run unit tests with the Make utility:

+
make all-tests
+

+Library Functions

+

Documentation here.

+

+Date/Time

+ + + + + + + + + + + + + + + + + + + + + + + +
Type Description
Calculate Date of Easter
Convert Civil Date to Day Number
Convert Greenwich Date <-> Julian Date
Convert Julian Date to Day-of-Week
Extract Day, Month, and Year parts of Julian Date
Convert Civil Time <-> Decimal Hours
Extract Hour, Minutes, and Seconds parts of Decimal Hours
Convert Local Civil Time <-> Universal Time
Convert Universal Time <-> Greenwich Sidereal Time
Convert Greenwich Sidereal Time <-> Local Sidereal Time
+

+Coordinates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type Description
Convert Angle <-> Decimal Degrees
Convert Right Ascension <-> Hour Angle
Convert Equatorial Coordinates <-> Horizon Coordinates
Calculate Obliquity of the Ecliptic
Convert Ecliptic Coordinates <-> Equatorial Coordinates
Convert Equatorial Coordinates <-> Galactic Coordinates
Calculate Angle between two objects
Calculate Rising and Setting times for an object
Calculate Precession (corrected coordinates between two epochs)
Calculate Nutation (in ecliptic longitude and obliquity) for a Greenwich date
Calculate Effects of aberration for ecliptic coordinates
Calculate RA and Declination values, corrected for atmospheric refraction and geocentric parallax
Calculate Heliographic coordinates
Calculate Carrington rotation number
Calculate Selenographic (lunar) coordinates (sub-Earth and sub-Solar)
+

+The Sun

+ + + + + + + + + + + + + + + +
Type Description
Calculate Approximate and precise positions of the Sun
Calculate Sun's distance and angular size
Calculate Local sunrise and sunset
Calculate Morning and evening twilight
Calculate Equation of time
Calculate Solar elongation
+

+Planets

+ + + + + + + + + + + +
Type Description
Calculate Approximate and precise position of planet
Calculate Visual aspects of planet (distance, angular diameter, phase, light time, position angle of bright limb, and apparent magnitude)
Calculate Position of comet (elliptical and parabolic)
Calculate Binary star orbit data
+

+The Moon

+ + + + + + + + + + + + + +
Type Description
Calculate Approximate and precise position of Moon
Calculate Moon phase and position angle of bright limb
Calculate Times of new Moon and full Moon
Calculate Moon's distance, angular diameter, and horizontal parallax
Calculate Local moonrise and moonset
+

+Eclipses

+ + + + + + + +
Type Description
Calculate Lunar eclipse occurrence and circumstances
Calculate Solar eclipse occurrence and circumstances
+
+
+
+ + + + diff --git a/practical_astronomy/source/docs/jquery.js b/practical_astronomy/source/docs/jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..103c32d79b749c24101fba7ff19fd17ee1a59724 --- /dev/null +++ b/practical_astronomy/source/docs/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/practical_astronomy/source/docs/md_src_glossary.html b/practical_astronomy/source/docs/md_src_glossary.html new file mode 100644 index 0000000000000000000000000000000000000000..033eefb23eda9060024eb08524b9318dd4d5f4a6 --- /dev/null +++ b/practical_astronomy/source/docs/md_src_glossary.html @@ -0,0 +1,497 @@ + + + + + + + +Practical Astronomy: Glossary of Terms + + + + + + + + + + + + + +
+
+ + + + + + +
+
Practical Astronomy +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Glossary of Terms
+
+
+

+aberration

+

The apparent angular displacement of a celestial object from its geometric position, caused by the motion of the observer with respect to the object, and the finite speed of light.

+

+age of Moon

+

The angle between the Sun and the Moon measured at the Earth.

+

+altitude

+

The angle up from the horizon.

+

+annual equation

+

A correction of the Moon’s orbital motion due to the variation of the Sun–Earth distance as the Earth travels in its own ellipse about the Sun.

+

+anomaly

+

The angle at the focus or the centre of an orbital ellipse between the major axis and the orbiting body or its projection.

+

+apastron

+

The point in an orbit about a star that is furthest from the star.

+

+aphelion

+

The point in an orbit about the Sun most distant from the Sun.

+

+apogee

+

The point in an orbit about the Earth most distant from the Earth.

+

+Astronomical Almanac

+

A collection of tables predicting the positions and circumstances of astronomical phenomena. This title replaced both the American Ephemeris and Nautical Almanac and the Astronomical Ephemeris, beginning with the 1981 edition.

+

+Astronomical Ephemeris

+

see Astronomical Almanac.

+

+astronomical latitude

+

The angle between the astronomical zenith and the equator.

+

+astronomical unit

+

Approximately equal to the length of the semi-major axis of the Earth’s orbit about the Sun, 1.496 × 10 11 metres.

+

+atmospheric refraction

+

The apparent shift in the position of a celestial object due to the bending of light rays by the atmosphere.

+

+azimuth

+

The angle round from the north point measured on the horizon in the sense NESW.

+

+binary star

+

A pair of stars bound together by their mutual gravitational attraction, both in orbit about their common centre of mass.

+

+calendar

+

System of accounting the days in the year. The Julian calendar, introduced by Julius Caesar, divides the year into 365 days except for every fourth year which has 366. The Gregorian calendar, introduced by Pope Gregory XIII (1502–1585) in 1582 and accepted in England in 1752, is the one generally in use in the West today. It reduced the errors in the Julian calendar by removing three days every four centuries; if the year ends in two noughts it is only a leap year if it is divisible by 400. So, for example, 2000 was a leap year, but 1700, 1800 and 1900 were not. 2100 will not be a leap year either.

+

+celestial sphere

+

An imaginary sphere, usually centred on the Earth, of arbitrarily large radius on the surface of which the stars can be considered to be fixed.

+

+circumpolar stars

+

Stars whose angular distances from the north or south celestial pole are sufficiently small that they never dip below the horizon.

+

+comet

+

A diffuse member of the Solar System, usually with a highly elongated orbit, which becomes visible near the Sun. It has a bright head and one or more diffuse tails of variable length.

+

+companion star

+

The fainter of the pair of stars in a visual-**binary star** system.

+

+conjunction

+

The moment when two celestial bodies occupy the same position in the sky or share a common coordinate when viewed from a particular place. Thus heliocentric conjunction, and conjunction in right ascension.

+

+coordinate systems

+

Frames of reference by means of which the position of any point can be uniquely specified. In astronomy, the systems take their names from the fundamental planes on which they are based. Thus the ecliptic coordinate system measures longitude round from the first point of Aries, in the plane of the ecliptic and latitude northwards from it. The equatorial coordinate system measures right ascension round from Aries in the plane of the Earth’s equator, and declination northwards from it. In the horizon coordinate system, the azimuth is measured round from the north point in the sense NESW and the altitude is the angle up from the horizon. The galactic coordinate system specifies position by longitude measured in the galactic plane round from the direction of the galactic centre and by latitude measured perpendicular to the plane. Heliographic coordinates enable the position of an object on the surface of the Sun to be specified with respect to the solar equator and a fundamental meridian assumed to rotate at a uniform rate. Selenographic coordinates define positions on the surface of the Moon with respect to the lunar equator and the mean sub-Earth point.

+

+coordinated universal time (UTC)

+

The time scale available from broadcast time signals. It differs from International atomic time (TAI) by a whole number of seconds, and is maintained within 0.9 s of universal time (strictly UT1) by the insertion of leap seconds, usually at the ends of June or December.

+

+culmination

+

The moment at which a celestial body crosses the observer’s meridian. Circumpolar stars cross the meridian above the horizon twice in one day, giving upper culmination and lower culmination.

+

+day

+

The interval between two successive transits across the observer’s meridian of a fixed star (sidereal day), of the Sun (solar day), or of a fictitious body called the mean Sun which moves at a uniform rate along the equator (mean solar day).

+

+daylight saving time

+

see time.

+

+declination

+

In the equatorial coordinate system, the angle measured perpendicular to the equator (north positive, south negative).

+

+dynamical time

+

The family of time scales introduced in 1984 that replaces ephemeris time. See time.

+

+earthshine

+

Light reflected from the Earth which sometimes illuminates the dark portion of the Moon’s disc, making it visible.

+

+eccentricity

+

A measure of the degree of elongation of an ellipse, equal to the ratio of the distance of the focus from the centre to the length of the semi-major axis.

+

+eclipse

+

The passage of the Moon through the Earth’s shadow (lunar eclipse) or parts of the Earth through the Moon’s shadow (solar eclipse). If, at the moment of greatest eclipse, the Moon or Sun is only partly obscured it is a partial eclipse; if completely obscured it is a total eclipse. If during a solar eclipse the Moon obscures the central part of the Sun’s disc but leaves an unobscured ring around its edge, then it is an annular eclipse.

+

+ecliptic

+

The plane containing the orbit of the Earth about the Sun.

+

+ellipse

+

A type of regular closed curve, oval in shape, of which a circle is a special case. It is traced by a point moving in such a manner that it keeps constant the sum of its distances from two fixed points, each of which is called a focus of the ellipse. The longest diameter of the ellipse, which goes through both foci and the centre, is called the major axis, the portion from the centre to the curve in either direction being called the semi-major axis.

+

+ephemeris time (ET)

+

See time.

+

+epoch

+

A particular moment specified as the reference point from which time is measured. The dates 1950.0 (strictly 1950 January 0.923) and 2000.0 (2000 January 1.5) are often used as standard epochs.

+

+equation of the centre

+

A relation between the true and mean anomalies which is an approximation to Kepler’s equation. In its simplest form it is

+

v = M + 2_e_ sin M,

+

where v and M are expressed in radians, useful for values of e less than about 0.1.

+

+equation of the equinoxes

+

Apparent sidereal time minus mean sidereal time, taking account of the effect of nutation on the positions of the equinoxes.

+

+equation of time

+

The difference between the real solar time and the mean solar time.

+

+equator

+

The plane through the centre of the Earth which is perpendicular to the spin axis.

+

+equinox

+

The moment at which the Sun crosses the celestial equator. This occurs on about 21 March when its right ascension is zero (the vernal equinox) and about 22 September when its right ascension is 12 h (the autumnal equinox). The positions of the equinoxes on the celestial sphere lie along the line of the intersection of the planes of the equator and the ecliptic.

+

+evection

+

A correction to the Moon’s orbital motion taking account of slight variations in the apparent value of the eccentricity of its orbit.

+

+extinction

+

The attenuation and colouring of light as it travels through a medium; in particular, atmospheric extinction.

+

+figure of the Earth

+

The true shape of the Earth. It is often approximated by a spheroid of revolution, a geometrical shape in which any cross-section parallel to the equator is a circle, while any cross-section through the north–south axis is an ellipse with the minor axis coincident with the diameter joining the north and south poles.

+

+first point of Aries

+

The position on the celestial sphere of the vernal equinox.

+

+focus of an ellipse

+

see ellipse.

+

+geocentric coordinates

+

Coordinates measured with respect to the centre of the Earth. Hence the geocentric latitude is the angle between the equator and a point on the surface of the Earth, as measured at the centre of the Earth.

+

+geocentric parallax

+

The angle subtended at a heavenly body by the centre of the Earth and the point of observation on the Earth’s surface.

+

+geostationary satellite

+

A body orbiting the Earth in the plane of the equator in such a direction and at such a height that its orbital period equals 1 day so that it keeps constant position with respect to the Earth’s surface.

+

+GPS time

+

An atomic time kept by the US Naval Observatory and broadcast by the satellites of the global positioning system. GPS time was equal to UTC on 1980 January 6 0.0, but, unlike UTC, is not adjusted by the insertion of leap seconds. Hence GPS time is equal, in June 2011, to UTC + 15 seconds (kept to within a microsecond) and is the time you can extract from your GPS navigation device.

+

+gravity

+

The mutual force of attraction between any two bodies which is proportional to the product of their masses and inversely proportional to the square of their separation.

+

+great circle

+

Any circle drawn on the surface of a sphere whose centre is the same as that of the sphere.

+

+Greenwich mean time (GMT)

+

This is ambiguous and is not now used in the Astronomical Almanac. Its meaning in civil life is usually the same as UTC, though previously it has been used to mean UT. Before 1925 it was reckoned from Greenwich mean noon (12 h UT).

+

+Greenwich meridian

+

That half of the great circle on the surface of the Earth passing through the north and south poles and through the reference point in Greenwich, England. It is taken as the line of longitude 0◦.

+

+horizontal parallax

+

The geocentric parallax when the celestial body is on the observer’s horizon; hence equatorial horizontal parallax when the observer is also on the equator.

+

+hour angle

+

The difference between the local sidereal time and the right ascension.

+

+inclination of orbit

+

The angle between the plane of the orbit and the plane of the ecliptic.

+

+inner planet

+

A planet whose semi-major axis is smaller than that of the Earth; that is the planets Mercury and Venus.

+

+international atomic time (TAI)

+

see time.

+

+Julian date

+

The number of Julian days that have elapsed since the fundamental epoch Greenwich mean noon of 1 January 4713 BC. For 2010 January 0.0 its value is 2 455 196.5. The Julian day number is the integer part of the Julian date. See also modified Julian date (MJD).

+

+Kepler’s equation

+

The relation between the mean and eccentric anomalies, M and E,

+

Ee_sin_E = M,

+

where the angles are expressed in radians.

+

+latitude

+

The coordinate expressing the angle (north positive, south negative) perpendicular to a fundamental plane, hence ecliptic latitude and galactic latitude. On the Earth, the geographical latitude is measured with respect to the equator. The ecliptic latitude can be measured either at the Earth (geocentric) or at the Sun (heliocentric).

+

+librations

+

Variations in the orientation of the Moon’s surface with respect to an observer on the Earth.

+

+light time

+

The time it takes light signals from a celestial body to reach an observer.

+

+longitude

+

The coordinate expressing the angle round from a fixed direction measured in a fundamental plane, hence ecliptic longitude and galactic longitude. On the Earth, the geographical longitude is measured at the equator. The ecliptic longitude can be measured either at the Earth (geocentric) or at the Sun (heliocentric).

+

+lunation

+

The period between two successive new Moons.

+

+luni–solar precession

+

The slow retrograde motion of the first point of Aries along the equator caused by the combined effects of the Sun and the Moon on the slightly non-spherical Earth.

+

+magnitude

+

(i) the unit defined on a logarithmic scale which measures the brightness of a celestial object considered as a point.

+

(ii) in a lunar eclipse, the fraction of the lunar diameter obscured by the shadow of the Earth at the moment of greatest eclipse, measured along the common diameter.

+

(iii) in a solar eclipse, the fraction of the solar diameter obscured by the Moon at the moment of greatest eclipse, measured along the common diameter.

+

+mean Sun

+

A fictitious heavenly body that moves at a uniform rate along the equator making one complete circuit in the same time (1 year) as the real Sun takes to make a complete circuit.

+

+meridian

+

That half of a great circle which is terminated at the north and south poles. On the Earth a meridian is a line of longitude. On the celestial sphere, the meridian which passes through the zenith is called the observer’s meridian.

+

+modified Julian date (MJD)

+

The number of Julian days elapsed since 1858 November 17.0.

+

+month

+

The period taken by the Moon to make one complete circuit of its orbit from reference point to reference point. The draconic month or nodal month takes the ascending node as the reference and is equal to 27.212 2 mean solar days. The sidereal month is reckoned against the background of stars and is equal to 27.321 7 mean solar days. The Sun is used as the reference for the synodic month of 29.530 6 mean solar days, and the perigee for the anomalistic month of 27.554 6 mean solar days.

+

+nadir

+

The point on the celestial sphere diametrically opposite the zenith.

+

+node

+

A point on the celestial sphere where the great circle representing the orbit cuts the great circle representing the plane of the ecliptic. The point where the orbiting body is moving from below (south of) to above the ecliptic is called the ascending node; the other is the descending node.

+

+noon

+

The instant at which the Sun crosses the observer’s meridian.

+

+north celestial pole

+

The point at which the projection of the Earth’s rotation axis through the north pole intersects the celestial sphere.

+

+nutation

+

A small periodic wobbling motion of the Earth’s rotation axis.

+

+obliquity of the ecliptic

+

The angle at which the plane of the ecliptic is inclined to the plane of the equator.

+

+opposition

+

The moment when two celestial bodies occupy opposite positions in the sky, or have longitudes different by 180◦ , when viewed at a particular place.

+

+orbit

+

The path through space taken by a body gravitationally attracted to another body.

+

+orbital elements

+

The quantities which need to be known in order to specify an orbit uniquely.

+

+osculating elements

+

The elements describing the elliptical orbit followed by a body if all perturbing influences vanish. Since perturbations disturb the true orbit of any member of the Solar System, the osculating elements are constantly changing.

+

+outer planet

+

Those planets having semi-major axes larger than that of the Earth. The major outer planets are Mars, Jupiter, Saturn, Uranus and Neptune. In 2006, Pluto was reclassified as a dwarf planet by the International Astronomical Union.

+

+parabolic orbit

+

An orbit in which the velocity at any point is equal to the escape velocity.

+

+parallax

+

The amount by which the apparent position of a celestial object shifts as the point of observation is changed.

+

+penumbra

+

The outer portion of a shadow where the light is only partially cut off.

+

+periastron

+

The point in an orbit about a star that is nearest to the star.

+

+perigee

+

The point in an orbit about the Earth which is nearest the Earth.

+

+perihelion

+

The point of closest approach to the Sun in an orbit about the Sun.

+

+period of orbit

+

The time taken by the orbiting body to make one complete circuit.

+

+perturbations

+

Deviations from true elliptical motion caused by the gravitational fields of other members of the Solar System.

+

+phase

+

(i) of Moon or planet: the fraction of the area of the disc which is illuminated. When the dark side of the Moon faces the Earth, the phase is zero and it is new Moon. At the first quarter and the third quarter, the phase is equal to a half and the Moon is in quadrature. Full Moon has a phase equal to one. Whenever the phase is greater than a half, the Moon is described as gibbous.

+

(ii) of an eclipse: the stage of a lunar or solar eclipse during which the eclipsed body is partly obscured (partial phase) or totally obscured (total phase). During a lunar eclipse, the Moon is in the penumbra of the Earth’s shadow during the penumbral phase and partially or totally in the umbra during the umbral phase. The partial and total phases occur during the umbral phase.

+

+planet

+

A solid body in closed orbit about a star. In our own Solar System, the major planets are (in order of increasing distance from the Sun) Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Pluto, formerly recognised as a planet, was reclassified as a dwarf planet in 2006.

+

+polar distance

+

The angle on the celestial sphere from the celestial pole.

+

+pole

+

The point on a sphere which is perpendicular to a given plane. Hence pole of the ecliptic and pole of the equator (each has two poles called north and south poles for short).

+

+position-angle

+

A celestial angle measured from 0◦ to 360◦ eastwards from the north.

+

+precession

+

see luni-solar precession.

+

+primary star

+

The brighter of the pair of stars in a visual-binary system.

+

+prograde motion

+

Motion in the same sense as that of all the planets about the Sun. When looking down on the Solar System from the north celestial pole, prograde motion is counter-clockwise.

+

+radian

+

A natural unit used to measure angles, equal to 1/2π revolutions and 180/π degrees.

+

+radius vector

+

The line joining the principal focus to the position of the orbiting body on its orbital ellipse.

+

+reflectivity of planet

+

A measure of a planet’s ability to reflect sunlight; a factor affecting its apparent brightness.

+

+refraction

+

see atmospheric refraction.

+

+retrograde motion

+

Motion in the opposite sense to that of all the planets about the Sun. When looking down on the Solar System from the north celestial pole, retrograde motion is clockwise.

+

+right ascension

+

In the equatorial coordinate system the angle measured round from the first point of Aries in the plane of the equator, in the sense NWSE.

+

+rising

+

The moment when a celestial body crosses the horizon on the way up.

+

+Saros cycle

+

The period of 18 years 11 days and 8 hours after which the pattern of lunar and solar eclipses tends to repeat.

+

+second (SI second)

+

The unit of time for the international atomic time (TAI) scale defined to be exactly 9 192 631 770 cycles of radiation corresponding to the transition between two hyperfine levels in the ground state of caesium 133.

+

+semi-major axis

+

see ellipse.

+

+setting

+

The moment when a celestial body crosses the horizon on the way down.

+

+solar elongation

+

The angle between the lines of sight to the Sun and to the celestial body in question.

+

+Solar System

+

The Sun and all the bodies, planets, comets and asteroids in closed orbits about it.

+

+solstice

+

The points at which the apparent longitude of the Sun is 90◦ and 270◦, or the moments at which the Sun is at either of these points. These occur around 21 June and 21 December.

+

+sub-Earth point

+

The point on a celestial body (especially the Moon) where the line joining the centre of the Earth and the centre of the body intersects the surface of the body.

+

+synodic period

+

The time between successive conjunctions in longitude.

+

+terminator

+

The line marking the boundary between the dark and sunlit hemispheres of a member of the Solar System.

+

+terrestrial dynamical time (TDT)

+

see time.

+

+terrestrial time (TT)

+

see time.

+

+time

+

+atomic time

+

Time measured with respect to the natural period of oscillations of an atomic system. Caesium beam clocks currently constitute the most precise time-keepers available, and the SI unit of atomic time is defined in terms of the caesium 133 atom (see second). International atomic time (TAI) is the continuous scale resulting from analyses by the Bureau International des Poids et Mesures of atomic time standards in many countries, starting from the epoch 1958 January 1. Coordinated universal time (UTC) is the time scale distributed by standard time services and is tied to both TAI and UT in such a manner that (a) it differs from TAI by a whole number of seconds, and (b) it is never more than 0.9 s different from UT (strictly UT1). This is achieved by the introduction of leap seconds into UTC from time to time. UTC constitutes the basis for legal time keeping in most parts of the world. Terrestrial time (TT) (called terrestrial dynamic time (TDT) until 1991) is used as the argument in theories of celestial dynamics and in the compilation of the Astronomical Almanac. It is equal to TAI +32.184 s. TDT had replaced ephemeris time (ET) in 1984, which was itself derived from analyses of the Moon’s motion.

+

+solar time

+

Time measured with respect to the motion of the Sun or a fictitious body, no longer used, called the mean Sun (mean solar time). Universal time (UT) is, broadly speaking, the mean solar time as measured on the Greenwich meridian. It is formally defined by a mathematical formula as a function of sidereal time (see below), and is thus determined from observations of the stars. A direct application of the formula gives UT0; with a small correction for polar motion the scale UT1 is obtained. Whenever the term UT is used, UT1 is usually implied. British summer time (BST) is 1 hour ahead of UT and is an example of daylight saving time in which the time is adjusted to make the working day fit more conveniently into the daylight hours.

+

+sidereal time

+

Time measured with respect to the apparent motion of the stars. The local sidereal time at any place is equal to the hour angle of the first point of Aries; local sidereal time on the Greenwich meridian is called Greenwich sidereal time. The difference between apparent sidereal time and mean sidereal time is called the equation of the equinoxes, and takes account of nutation. It may be as much as 1.2 seconds.

+

+time zone

+

A longitudinal strip on the surface of the Earth in which the zone time, usually a whole number of hours before or after UT, is adopted as the local civil time by national or international agreement.

+

+transit

+

The moment at which a celestial body crosses the observer’s meridian.

+

+twilight

+

That period of semi-darkness after sunset or before sunrise during which the sun’s zenith distance is more than 90◦ but less than some agreed figure. This figure is 108◦ for astronomical twilight and 102◦ for nautical twilight, while for civil twilight it is 96◦.

+

+umbra

+

The inner portion of a shadow where the light is completely obscured.

+

+universal time

+

see time.

+

+variation

+

A correction to the Moon’s orbital motion about the Earth that takes account of the changing solar gravitational field.

+

+vernal equinox

+

see equinox.

+

+year

+

The interval between two successive passages of the Sun through a reference point. A particular point among the stars is used as reference in the sidereal year, equal to 365.2564 mean solar days. The tropical year, 365.242 191 mean solar days, uses the first point of Aries as its reference. When no qualifying adjective is used with the word 'year', it is usually the tropical year that is meant. Perturbations to the Earth’s orbit by the other planets cause small changes in the Earth’s orbital elements. The anomalistic year, 365.2596 mean solar days, is the interval between two successive passages of the Sun through perigee. The Besselian year, not used since 1984, is the period of one complete revolution in right ascension of the fictitious mean Sun as defined by the astronomer Simon Newcomb (1835–1909). It is almost the same as the tropical year, but begins when the right ascension of the Sun is exactly 240◦ ; this instant falls very near the beginning of the civil year.

+

+zenith

+

The point directly overhead at the observer. The zenith angle or zenith distance of a star is the angle between the star and the zenith.

+

+zone correction

+

The number of hours that needs to be added to or subtracted from UT to get the zone time.

+
+
+
+ + + + diff --git a/practical_astronomy/source/docs/menu.js b/practical_astronomy/source/docs/menu.js new file mode 100644 index 0000000000000000000000000000000000000000..2fe2214f26aafa79ae0a11cecc6f127d13ff9eb9 --- /dev/null +++ b/practical_astronomy/source/docs/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/practical_astronomy/source/docs/menudata.js b/practical_astronomy/source/docs/menudata.js new file mode 100644 index 0000000000000000000000000000000000000000..feb5d5a0fc582e59502d6fb29371a1a5f062bdcd --- /dev/null +++ b/practical_astronomy/source/docs/menudata.js @@ -0,0 +1,77 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Packages",url:"namespaces.html",children:[ +{text:"Packages",url:"namespaces.html"}, +{text:"Package Functions",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"b",url:"namespacemembers_b.html#index_b"}, +{text:"c",url:"namespacemembers_c.html#index_c"}, +{text:"d",url:"namespacemembers_d.html#index_d"}, +{text:"e",url:"namespacemembers_e.html#index_e"}, +{text:"f",url:"namespacemembers_f.html#index_f"}, +{text:"g",url:"namespacemembers_g.html#index_g"}, +{text:"h",url:"namespacemembers_h.html#index_h"}, +{text:"i",url:"namespacemembers_i.html#index_i"}, +{text:"j",url:"namespacemembers_j.html#index_j"}, +{text:"k",url:"namespacemembers_k.html#index_k"}, +{text:"l",url:"namespacemembers_l.html#index_l"}, +{text:"m",url:"namespacemembers_m.html#index_m"}, +{text:"n",url:"namespacemembers_n.html#index_n"}, +{text:"o",url:"namespacemembers_o.html#index_o"}, +{text:"p",url:"namespacemembers_p.html#index_p"}, +{text:"r",url:"namespacemembers_r.html#index_r"}, +{text:"s",url:"namespacemembers_s.html#index_s"}, +{text:"t",url:"namespacemembers_t.html#index_t"}, +{text:"u",url:"namespacemembers_u.html#index_u"}, +{text:"v",url:"namespacemembers_v.html#index_v"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"a",url:"namespacemembers_func.html#index_a"}, +{text:"b",url:"namespacemembers_func_b.html#index_b"}, +{text:"c",url:"namespacemembers_func_c.html#index_c"}, +{text:"d",url:"namespacemembers_func_d.html#index_d"}, +{text:"e",url:"namespacemembers_func_e.html#index_e"}, +{text:"f",url:"namespacemembers_func_f.html#index_f"}, +{text:"g",url:"namespacemembers_func_g.html#index_g"}, +{text:"h",url:"namespacemembers_func_h.html#index_h"}, +{text:"i",url:"namespacemembers_func_i.html#index_i"}, +{text:"j",url:"namespacemembers_func_j.html#index_j"}, +{text:"k",url:"namespacemembers_func_k.html#index_k"}, +{text:"l",url:"namespacemembers_func_l.html#index_l"}, +{text:"m",url:"namespacemembers_func_m.html#index_m"}, +{text:"n",url:"namespacemembers_func_n.html#index_n"}, +{text:"o",url:"namespacemembers_func_o.html#index_o"}, +{text:"p",url:"namespacemembers_func_p.html#index_p"}, +{text:"r",url:"namespacemembers_func_r.html#index_r"}, +{text:"s",url:"namespacemembers_func_s.html#index_s"}, +{text:"t",url:"namespacemembers_func_t.html#index_t"}, +{text:"u",url:"namespacemembers_func_u.html#index_u"}, +{text:"v",url:"namespacemembers_func_v.html#index_v"}]}, +{text:"Variables",url:"namespacemembers_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/practical_astronomy/source/docs/namespacemembers.html b/practical_astronomy/source/docs/namespacemembers.html new file mode 100644 index 0000000000000000000000000000000000000000..8a87839f5b62de51a527a76c95b73199e3d33c1a --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers.html @@ -0,0 +1,121 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - a -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_b.html b/practical_astronomy/source/docs/namespacemembers_b.html new file mode 100644 index 0000000000000000000000000000000000000000..f0c0508f917615903252fcb6cf3225964eac7138 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_b.html @@ -0,0 +1,103 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - b -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_c.html b/practical_astronomy/source/docs/namespacemembers_c.html new file mode 100644 index 0000000000000000000000000000000000000000..8e7aa71b5cf63a93f63212e49867f30a12d9b3e1 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_c.html @@ -0,0 +1,124 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - c -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_d.html b/practical_astronomy/source/docs/namespacemembers_d.html new file mode 100644 index 0000000000000000000000000000000000000000..ab3ae92d89c09ecf8494240d26b6a74e128b72a5 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_d.html @@ -0,0 +1,142 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - d -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_dup.js b/practical_astronomy/source/docs/namespacemembers_dup.js new file mode 100644 index 0000000000000000000000000000000000000000..c69404b7027add113735337c8cb31dc0e405d433 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_dup.js @@ -0,0 +1,24 @@ +var namespacemembers_dup = +[ + [ "a", "namespacemembers.html", null ], + [ "b", "namespacemembers_b.html", null ], + [ "c", "namespacemembers_c.html", null ], + [ "d", "namespacemembers_d.html", null ], + [ "e", "namespacemembers_e.html", null ], + [ "f", "namespacemembers_f.html", null ], + [ "g", "namespacemembers_g.html", null ], + [ "h", "namespacemembers_h.html", null ], + [ "i", "namespacemembers_i.html", null ], + [ "j", "namespacemembers_j.html", null ], + [ "k", "namespacemembers_k.html", null ], + [ "l", "namespacemembers_l.html", null ], + [ "m", "namespacemembers_m.html", null ], + [ "n", "namespacemembers_n.html", null ], + [ "o", "namespacemembers_o.html", null ], + [ "p", "namespacemembers_p.html", null ], + [ "r", "namespacemembers_r.html", null ], + [ "s", "namespacemembers_s.html", null ], + [ "t", "namespacemembers_t.html", null ], + [ "u", "namespacemembers_u.html", null ], + [ "v", "namespacemembers_v.html", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/namespacemembers_e.html b/practical_astronomy/source/docs/namespacemembers_e.html new file mode 100644 index 0000000000000000000000000000000000000000..371e4109e8960d40f9fb157b33d86e2d851ffb70 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_e.html @@ -0,0 +1,169 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - e -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_f.html b/practical_astronomy/source/docs/namespacemembers_f.html new file mode 100644 index 0000000000000000000000000000000000000000..baa91d67d98b69b311981cd6115662ff3df003cd --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_f.html @@ -0,0 +1,109 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - f -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func.html b/practical_astronomy/source/docs/namespacemembers_func.html new file mode 100644 index 0000000000000000000000000000000000000000..8c3d48abddbc80f6b115323795f32488baa14973 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func.html @@ -0,0 +1,121 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func.js b/practical_astronomy/source/docs/namespacemembers_func.js new file mode 100644 index 0000000000000000000000000000000000000000..68c54382a7cf3fd54e564ca735f7e25c8b2efce5 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func.js @@ -0,0 +1,24 @@ +var namespacemembers_func = +[ + [ "a", "namespacemembers_func.html", null ], + [ "b", "namespacemembers_func_b.html", null ], + [ "c", "namespacemembers_func_c.html", null ], + [ "d", "namespacemembers_func_d.html", null ], + [ "e", "namespacemembers_func_e.html", null ], + [ "f", "namespacemembers_func_f.html", null ], + [ "g", "namespacemembers_func_g.html", null ], + [ "h", "namespacemembers_func_h.html", null ], + [ "i", "namespacemembers_func_i.html", null ], + [ "j", "namespacemembers_func_j.html", null ], + [ "k", "namespacemembers_func_k.html", null ], + [ "l", "namespacemembers_func_l.html", null ], + [ "m", "namespacemembers_func_m.html", null ], + [ "n", "namespacemembers_func_n.html", null ], + [ "o", "namespacemembers_func_o.html", null ], + [ "p", "namespacemembers_func_p.html", null ], + [ "r", "namespacemembers_func_r.html", null ], + [ "s", "namespacemembers_func_s.html", null ], + [ "t", "namespacemembers_func_t.html", null ], + [ "u", "namespacemembers_func_u.html", null ], + [ "v", "namespacemembers_func_v.html", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/namespacemembers_func_b.html b/practical_astronomy/source/docs/namespacemembers_func_b.html new file mode 100644 index 0000000000000000000000000000000000000000..d26fc648342395f57956369d006aae1bd375ae6f --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_b.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - b -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_c.html b/practical_astronomy/source/docs/namespacemembers_func_c.html new file mode 100644 index 0000000000000000000000000000000000000000..f2881c43206c6b53437c5ff1a9ffa79b1ab672de --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_c.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_d.html b/practical_astronomy/source/docs/namespacemembers_func_d.html new file mode 100644 index 0000000000000000000000000000000000000000..b52b5aedcea7a9c6dd37f0360153efc2bee3a787 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_d.html @@ -0,0 +1,142 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - d -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_e.html b/practical_astronomy/source/docs/namespacemembers_func_e.html new file mode 100644 index 0000000000000000000000000000000000000000..e70ea21c2f2f8d65bed4179bd91c50736190af9b --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_e.html @@ -0,0 +1,169 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - e -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_f.html b/practical_astronomy/source/docs/namespacemembers_func_f.html new file mode 100644 index 0000000000000000000000000000000000000000..88deced0e9ff31d91f7efd50039ea274587bf0c7 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_f.html @@ -0,0 +1,109 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - f -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_g.html b/practical_astronomy/source/docs/namespacemembers_func_g.html new file mode 100644 index 0000000000000000000000000000000000000000..bcc1cd32e688cfa173d1a09e1de5941fbe5f0cc8 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_g.html @@ -0,0 +1,130 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - g -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_h.html b/practical_astronomy/source/docs/namespacemembers_func_h.html new file mode 100644 index 0000000000000000000000000000000000000000..672fcbe77ca66e799c4a5630f9a6969db7a48540 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_h.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - h -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_i.html b/practical_astronomy/source/docs/namespacemembers_func_i.html new file mode 100644 index 0000000000000000000000000000000000000000..e78ef7a293ca50e84cf8a25439706391022b5488 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_i.html @@ -0,0 +1,103 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - i -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_j.html b/practical_astronomy/source/docs/namespacemembers_func_j.html new file mode 100644 index 0000000000000000000000000000000000000000..2e2ecc430f95a899c1dc91328579a310dbf2460c --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_j.html @@ -0,0 +1,121 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - j -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_k.html b/practical_astronomy/source/docs/namespacemembers_func_k.html new file mode 100644 index 0000000000000000000000000000000000000000..9f98d374822956db40b267df22a3c83819b4df77 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_k.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - k -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_l.html b/practical_astronomy/source/docs/namespacemembers_func_l.html new file mode 100644 index 0000000000000000000000000000000000000000..87f2cc289d9d5aba31d419b0fb60d0471924c468 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_l.html @@ -0,0 +1,131 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - l -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_m.html b/practical_astronomy/source/docs/namespacemembers_func_m.html new file mode 100644 index 0000000000000000000000000000000000000000..15b558f5ece667ea11f2a67162a3dced5f465994 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_m.html @@ -0,0 +1,200 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - m -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_n.html b/practical_astronomy/source/docs/namespacemembers_func_n.html new file mode 100644 index 0000000000000000000000000000000000000000..eac02aaf8c194eefbbc1f5d076bf396afbec6b4d --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_n.html @@ -0,0 +1,112 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - n -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_o.html b/practical_astronomy/source/docs/namespacemembers_func_o.html new file mode 100644 index 0000000000000000000000000000000000000000..791b5a4fb4c46e5e6bdfe2bc3c1ebd29c9238478 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_o.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - o -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_p.html b/practical_astronomy/source/docs/namespacemembers_func_p.html new file mode 100644 index 0000000000000000000000000000000000000000..f836176eab3e1b9575064b8bd5920a40fb49eb6c --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_p.html @@ -0,0 +1,142 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - p -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_r.html b/practical_astronomy/source/docs/namespacemembers_func_r.html new file mode 100644 index 0000000000000000000000000000000000000000..edc250164d77d2bfae5ae4f587f1c5725bea158a --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_r.html @@ -0,0 +1,124 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - r -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_s.html b/practical_astronomy/source/docs/namespacemembers_func_s.html new file mode 100644 index 0000000000000000000000000000000000000000..708b03d2daabc620fa2df1cb3ee54d2e7407f492 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_s.html @@ -0,0 +1,176 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - s -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_t.html b/practical_astronomy/source/docs/namespacemembers_func_t.html new file mode 100644 index 0000000000000000000000000000000000000000..c7bd2915d1d00e803f949f4ed080b2540a444798 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_t.html @@ -0,0 +1,115 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - t -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_u.html b/practical_astronomy/source/docs/namespacemembers_func_u.html new file mode 100644 index 0000000000000000000000000000000000000000..c0f70ced410863b80cb503d571cb78b41b22df7d --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_u.html @@ -0,0 +1,169 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - u -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_func_v.html b/practical_astronomy/source/docs/namespacemembers_func_v.html new file mode 100644 index 0000000000000000000000000000000000000000..be1b70160e085d0e82fa8cc39fb9c27153879c50 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_func_v.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - v -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_g.html b/practical_astronomy/source/docs/namespacemembers_g.html new file mode 100644 index 0000000000000000000000000000000000000000..c552382dbe61e2fa0691e9534c8c361e09e4b717 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_g.html @@ -0,0 +1,130 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - g -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_h.html b/practical_astronomy/source/docs/namespacemembers_h.html new file mode 100644 index 0000000000000000000000000000000000000000..2dbeb4ceb6a780776cf4dd196a3b4aaf79794bb7 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_h.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - h -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_i.html b/practical_astronomy/source/docs/namespacemembers_i.html new file mode 100644 index 0000000000000000000000000000000000000000..503bb19758fcc8fb5f11ef19b2a1549ab180cd3b --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_i.html @@ -0,0 +1,103 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - i -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_j.html b/practical_astronomy/source/docs/namespacemembers_j.html new file mode 100644 index 0000000000000000000000000000000000000000..8be83f204fe4f029228a26c1f9384f4362ff6eab --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_j.html @@ -0,0 +1,121 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - j -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_k.html b/practical_astronomy/source/docs/namespacemembers_k.html new file mode 100644 index 0000000000000000000000000000000000000000..020983e73f5a648e55c9be143b107715e9a7b920 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_k.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - k -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_l.html b/practical_astronomy/source/docs/namespacemembers_l.html new file mode 100644 index 0000000000000000000000000000000000000000..6ee148131640299de53d2e7f7ff060a4c8564588 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_l.html @@ -0,0 +1,131 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - l -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_m.html b/practical_astronomy/source/docs/namespacemembers_m.html new file mode 100644 index 0000000000000000000000000000000000000000..20a4933beefb76d7ec3b50a6382a7dbc79ec25a1 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_m.html @@ -0,0 +1,200 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - m -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_n.html b/practical_astronomy/source/docs/namespacemembers_n.html new file mode 100644 index 0000000000000000000000000000000000000000..e9de1caa33bb8e493fa43add87b28fe08a7d19d0 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_n.html @@ -0,0 +1,112 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - n -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_o.html b/practical_astronomy/source/docs/namespacemembers_o.html new file mode 100644 index 0000000000000000000000000000000000000000..81367b5b52937f6a2064ef6f71fd847d8191f31f --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_o.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - o -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_p.html b/practical_astronomy/source/docs/namespacemembers_p.html new file mode 100644 index 0000000000000000000000000000000000000000..2c5919896cbe45d8117c82eeac2b037bc9aae621 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_p.html @@ -0,0 +1,145 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - p -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_r.html b/practical_astronomy/source/docs/namespacemembers_r.html new file mode 100644 index 0000000000000000000000000000000000000000..563a5dc8d8c516f473bce1f7be3fb236e5c709b0 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_r.html @@ -0,0 +1,124 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - r -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_s.html b/practical_astronomy/source/docs/namespacemembers_s.html new file mode 100644 index 0000000000000000000000000000000000000000..c95e2e02c03180841d7249d1b261714daaf01a6b --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_s.html @@ -0,0 +1,176 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - s -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_t.html b/practical_astronomy/source/docs/namespacemembers_t.html new file mode 100644 index 0000000000000000000000000000000000000000..febb903e344c2d709a1a950d6983ccc941b85a98 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_t.html @@ -0,0 +1,115 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - t -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_u.html b/practical_astronomy/source/docs/namespacemembers_u.html new file mode 100644 index 0000000000000000000000000000000000000000..50704092e1356cf954d1f8baa5b4ef04638d8677 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_u.html @@ -0,0 +1,169 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - u -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_v.html b/practical_astronomy/source/docs/namespacemembers_v.html new file mode 100644 index 0000000000000000000000000000000000000000..06b271c2c082792f4cc8dce4261e818af8cab465 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_v.html @@ -0,0 +1,100 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - v -

    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacemembers_vars.html b/practical_astronomy/source/docs/namespacemembers_vars.html new file mode 100644 index 0000000000000000000000000000000000000000..a19e03401a442e08503053c04d842608604885f6 --- /dev/null +++ b/practical_astronomy/source/docs/namespacemembers_vars.html @@ -0,0 +1,107 @@ + + + + + + + +Practical Astronomy: Package Functions + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy.html b/practical_astronomy/source/docs/namespacepractical__astronomy.html new file mode 100644 index 0000000000000000000000000000000000000000..90e17afe60650e17956b31f112320477ae894e28 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy.html @@ -0,0 +1,130 @@ + + + + + + + +Practical Astronomy: practical_astronomy Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Namespaces

     pa_binary
     
     pa_binary_data
     
     pa_comet
     
     pa_comet_data
     
     pa_coordinate
     
     pa_datetime
     
     pa_eclipses
     
     pa_macro
     
     pa_moon
     
     pa_planet
     
     pa_planet_data
     
     pa_sun
     
     pa_util
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy.js b/practical_astronomy/source/docs/namespacepractical__astronomy.js new file mode 100644 index 0000000000000000000000000000000000000000..4ad2b13d5cf7dfcfc2e8b03cb3a16aa8009e3452 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy.js @@ -0,0 +1,256 @@ +var namespacepractical__astronomy = +[ + [ "pa_binary", "namespacepractical__astronomy_1_1pa__binary.html", [ + [ "binary_star_orbit", "namespacepractical__astronomy_1_1pa__binary.html#ad64db60ed19e41d162237dc0b1a52a61", null ] + ] ], + [ "pa_binary_data", "namespacepractical__astronomy_1_1pa__binary__data.html", [ + [ "get_binary_data", "namespacepractical__astronomy_1_1pa__binary__data.html#a665c50e5d40ad4b7e43079b2175d9e67", null ], + [ "BinaryData", "namespacepractical__astronomy_1_1pa__binary__data.html#ac5703bf2a91c2d1da46f103d171388a8", null ] + ] ], + [ "pa_comet", "namespacepractical__astronomy_1_1pa__comet.html", [ + [ "position_of_elliptical_comet", "namespacepractical__astronomy_1_1pa__comet.html#aa3d042bef43ebd6669b43eb87c5e515a", null ], + [ "position_of_parabolic_comet", "namespacepractical__astronomy_1_1pa__comet.html#aec2f1ca117599741cfb24e597c8f3ac6", null ] + ] ], + [ "pa_comet_data", "namespacepractical__astronomy_1_1pa__comet__data.html", [ + [ "get_comet_data_elliptical", "namespacepractical__astronomy_1_1pa__comet__data.html#a880f949265c37db03be8789361c533dc", null ], + [ "get_comet_data_parabolic", "namespacepractical__astronomy_1_1pa__comet__data.html#a354296f92713da2121f7ff50fccc16d3", null ], + [ "CometDataElliptical", "namespacepractical__astronomy_1_1pa__comet__data.html#a5dfaac06954d07c606fa71e691aa89eb", null ], + [ "CometDataParabolic", "namespacepractical__astronomy_1_1pa__comet__data.html#a5a4863a7e81117de4279b5afea3b8be9", null ] + ] ], + [ "pa_coordinate", "namespacepractical__astronomy_1_1pa__coordinate.html", [ + [ "angle_between_two_objects", "namespacepractical__astronomy_1_1pa__coordinate.html#aeff3946906765330d3df8e9295c5636c", null ], + [ "angle_to_decimal_degrees", "namespacepractical__astronomy_1_1pa__coordinate.html#a987813f23727409ec84bf5b7758e4196", null ], + [ "atmospheric_refraction", "namespacepractical__astronomy_1_1pa__coordinate.html#afca7093308d31a18052d1212a5532229", null ], + [ "carrington_rotation_number", "namespacepractical__astronomy_1_1pa__coordinate.html#aea2e9ebd99d887bc7919c516f515d837", null ], + [ "correct_for_aberration", "namespacepractical__astronomy_1_1pa__coordinate.html#a71720f0e80328a252ba574452418ea92", null ], + [ "correct_for_precession", "namespacepractical__astronomy_1_1pa__coordinate.html#ac6a88c0e59835e90c871361d73f90f50", null ], + [ "corrections_for_geocentric_parallax", "namespacepractical__astronomy_1_1pa__coordinate.html#a94efd7a45ec9cb98c702bcf61d89dd39", null ], + [ "decimal_degrees_to_angle", "namespacepractical__astronomy_1_1pa__coordinate.html#af4b04e15f6470d4f704e1cab2d64fd55", null ], + [ "ecliptic_coordinate_to_equatorial_coordinate", "namespacepractical__astronomy_1_1pa__coordinate.html#a8801b81ef0c47d1968da6dd29c3fa015", null ], + [ "equatorial_coordinate_to_ecliptic_coordinate", "namespacepractical__astronomy_1_1pa__coordinate.html#a2be55120967a6500d6abf660d0c42009", null ], + [ "equatorial_coordinate_to_galactic_coordinate", "namespacepractical__astronomy_1_1pa__coordinate.html#a8214a5edcdda8da9372d59cd847a5f65", null ], + [ "equatorial_coordinates_to_horizon_coordinates", "namespacepractical__astronomy_1_1pa__coordinate.html#a759d93a22e6eb1a5fe88a07dbf4f4fd2", null ], + [ "galactic_coordinate_to_equatorial_coordinate", "namespacepractical__astronomy_1_1pa__coordinate.html#a3de24c7dd22235e3d8976333e0081a98", null ], + [ "heliographic_coordinates", "namespacepractical__astronomy_1_1pa__coordinate.html#af1747d784ba179c8ebc99fb761b337bb", null ], + [ "horizon_coordinates_to_equatorial_coordinates", "namespacepractical__astronomy_1_1pa__coordinate.html#abcc4ce68e3508c7ed5443ce846531bb8", null ], + [ "hour_angle_to_right_ascension", "namespacepractical__astronomy_1_1pa__coordinate.html#a4703c296a201b48930292c17665c7dd2", null ], + [ "mean_obliquity_of_the_ecliptic", "namespacepractical__astronomy_1_1pa__coordinate.html#a3b012c023b82b660c02c4b5de08474d2", null ], + [ "nutation_in_ecliptic_longitude_and_obliquity", "namespacepractical__astronomy_1_1pa__coordinate.html#a3a11b5ab0fe82c3966282455392d05fc", null ], + [ "right_ascension_to_hour_angle", "namespacepractical__astronomy_1_1pa__coordinate.html#a4dffecdd7b376164a88b03227776b67a", null ], + [ "rising_and_setting", "namespacepractical__astronomy_1_1pa__coordinate.html#accf030a9add4b8f1a81ed808c3caf70a", null ], + [ "selenographic_coordinates_1", "namespacepractical__astronomy_1_1pa__coordinate.html#accf1d521e9fe1583201493f7c3c5aa3b", null ], + [ "selenographic_coordinates_2", "namespacepractical__astronomy_1_1pa__coordinate.html#a821e4558becfa11ef299894f12dc37f2", null ] + ] ], + [ "pa_datetime", "namespacepractical__astronomy_1_1pa__datetime.html", [ + [ "civil_date_to_day_number", "namespacepractical__astronomy_1_1pa__datetime.html#a085ad36535d1f6b906ebbc502dd547a3", null ], + [ "civil_time_to_decimal_hours", "namespacepractical__astronomy_1_1pa__datetime.html#a87c359a968e2ffd19d5c7ee78006762e", null ], + [ "decimal_hour_hour", "namespacepractical__astronomy_1_1pa__datetime.html#a7a505017515cdadb479fef83039bbad8", null ], + [ "decimal_hour_minutes", "namespacepractical__astronomy_1_1pa__datetime.html#af03f0a34f5a3205abfced5fb458b99c8", null ], + [ "decimal_hour_seconds", "namespacepractical__astronomy_1_1pa__datetime.html#a21452aca72d47207179838ce47fb27cf", null ], + [ "decimal_hours_to_civil_time", "namespacepractical__astronomy_1_1pa__datetime.html#a2320446a7693e2baef32833e536e82de", null ], + [ "get_date_of_easter", "namespacepractical__astronomy_1_1pa__datetime.html#a2980ffc259f16fd25b37bc1cbb8b18d4", null ], + [ "greenwich_date_to_julian_date", "namespacepractical__astronomy_1_1pa__datetime.html#a2c3a8dc822708f5871b272048a50a2b5", null ], + [ "greenwich_sidereal_time_to_local_sidereal_time", "namespacepractical__astronomy_1_1pa__datetime.html#ad329bcbb2bcaf6b6c3d6c0c918936ecf", null ], + [ "greenwich_sidereal_time_to_universal_time", "namespacepractical__astronomy_1_1pa__datetime.html#ab03052b709178a939ecacd357a9b1730", null ], + [ "julian_date_day", "namespacepractical__astronomy_1_1pa__datetime.html#a6af5e356e7784f060e5c55e814581e05", null ], + [ "julian_date_month", "namespacepractical__astronomy_1_1pa__datetime.html#af6c7751410aa70a76670b144f50dc619", null ], + [ "julian_date_to_greenwich_date", "namespacepractical__astronomy_1_1pa__datetime.html#a267f3d2010bdf763726f9da3612e4060", null ], + [ "julian_date_to_weekday_name", "namespacepractical__astronomy_1_1pa__datetime.html#ab1a46eed14594880e25220f9a9675a37", null ], + [ "julian_date_year", "namespacepractical__astronomy_1_1pa__datetime.html#a67a531866a9dc81ad806d4a505a20c8a", null ], + [ "local_civil_time_to_universal_time", "namespacepractical__astronomy_1_1pa__datetime.html#aa48dfcf90dce9ac086b0b28bd2dbac7b", null ], + [ "local_sidereal_time_to_greenwich_sidereal_time", "namespacepractical__astronomy_1_1pa__datetime.html#a22b0001de8eb44f6ed02d4899d9d86b1", null ], + [ "universal_time_to_greenwich_sidereal_time", "namespacepractical__astronomy_1_1pa__datetime.html#a55fda8f36a26dc8552cdc72a80d2ccd4", null ], + [ "universal_time_to_local_civil_time", "namespacepractical__astronomy_1_1pa__datetime.html#a67d28e510b5411d435af43d3a105d313", null ] + ] ], + [ "pa_eclipses", "namespacepractical__astronomy_1_1pa__eclipses.html", [ + [ "lunar_eclipse_circumstances", "namespacepractical__astronomy_1_1pa__eclipses.html#a48d5a9475c1877f1268b4d063dd99f6b", null ], + [ "lunar_eclipse_occurrence", "namespacepractical__astronomy_1_1pa__eclipses.html#a0ac960734a008556789361349956209c", null ], + [ "solar_eclipse_circumstances", "namespacepractical__astronomy_1_1pa__eclipses.html#aa5e0b860a6b90ed84dd91644a7db845e", null ], + [ "solar_eclipse_occurrence", "namespacepractical__astronomy_1_1pa__eclipses.html#a419c3cdc66fdfadb685e0095404e0beb", null ] + ] ], + [ "pa_macro", "namespacepractical__astronomy_1_1pa__macro.html", [ + [ "angle", "namespacepractical__astronomy_1_1pa__macro.html#aa89a8971eecab46c843d55b6b558baa5", null ], + [ "atan2", "namespacepractical__astronomy_1_1pa__macro.html#a46bf770e83278c32641d88a14afa4743", null ], + [ "cd_jd", "namespacepractical__astronomy_1_1pa__macro.html#ae45433a24f80898f5dd0191009f39184", null ], + [ "dd_deg", "namespacepractical__astronomy_1_1pa__macro.html#ae89f6bad38c25ff72cdf2efdbf21e276", null ], + [ "dd_dh", "namespacepractical__astronomy_1_1pa__macro.html#ad8fa9325ef741ca5a547a0d633339b08", null ], + [ "dd_min", "namespacepractical__astronomy_1_1pa__macro.html#aceded82212785c66809b7e51c7da3b4c", null ], + [ "dd_sec", "namespacepractical__astronomy_1_1pa__macro.html#ab601b823d99167db79378cb81d6649e2", null ], + [ "degrees", "namespacepractical__astronomy_1_1pa__macro.html#ab738df3cbff4099561c70a0531304be4", null ], + [ "dh_dd", "namespacepractical__astronomy_1_1pa__macro.html#afa8571c6e8bb5c30819b9d872f207804", null ], + [ "dh_hour", "namespacepractical__astronomy_1_1pa__macro.html#a3c41fb93171f8bf548854cbf934db548", null ], + [ "dh_min", "namespacepractical__astronomy_1_1pa__macro.html#ad3636bd3842c441c464df67b3e8aad32", null ], + [ "dh_sec", "namespacepractical__astronomy_1_1pa__macro.html#ada6b3b92a4562a158192e37d6f79e970", null ], + [ "dms_dd", "namespacepractical__astronomy_1_1pa__macro.html#a1ffca3d689d511cf7d4ce2654a365443", null ], + [ "e_gst_ut", "namespacepractical__astronomy_1_1pa__macro.html#a668275aec60ac6e761aac0432596a0e2", null ], + [ "e_moon_rise", "namespacepractical__astronomy_1_1pa__macro.html#a6bb82ea03dc3e9ec38cd7ef8d87c1f52", null ], + [ "e_moon_rise_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a3051ddab364fdf57567c9b2ba94fa6b2", null ], + [ "e_moon_rise_l6700", "namespacepractical__astronomy_1_1pa__macro.html#abbaa30225d0eba14c6195ac77f0acb17", null ], + [ "e_moon_set", "namespacepractical__astronomy_1_1pa__macro.html#a1c3f54d11f8b5b6c756bc14199ae3eb2", null ], + [ "e_moon_set_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a588713ac66d586999c3c3b6c002624b9", null ], + [ "e_moon_set_l6700", "namespacepractical__astronomy_1_1pa__macro.html#ad7888da366adfedec9049cf416155290", null ], + [ "e_rs", "namespacepractical__astronomy_1_1pa__macro.html#accf0f6640e9526ca6da169ddab0943bd", null ], + [ "e_sun_rs", "namespacepractical__astronomy_1_1pa__macro.html#aaabc9ca8d45932cf13283b18974d413b", null ], + [ "e_sun_rs_l3710", "namespacepractical__astronomy_1_1pa__macro.html#ac51cc7d8d3a7fdbd4f362e50193de6a8", null ], + [ "e_twilight", "namespacepractical__astronomy_1_1pa__macro.html#a809f18de9f76acc73bee4458ee17f694", null ], + [ "e_twilight_l3710", "namespacepractical__astronomy_1_1pa__macro.html#ac591fd2559e07e0a401d2781c436123c", null ], + [ "ec_dec", "namespacepractical__astronomy_1_1pa__macro.html#a846197591fb08834cd64d849e5c19cfc", null ], + [ "ec_ra", "namespacepractical__astronomy_1_1pa__macro.html#abdd55d706b911f4f0bec3b98621201d1", null ], + [ "eccentric_anomaly", "namespacepractical__astronomy_1_1pa__macro.html#aaf5c6edff0cfea9bc1a4b2dcd10dce1c", null ], + [ "eq_alt", "namespacepractical__astronomy_1_1pa__macro.html#a3d324c027667e86ca93eca1474f33c47", null ], + [ "eq_az", "namespacepractical__astronomy_1_1pa__macro.html#a891be99a888a57496066551877381f6a", null ], + [ "eq_e_lat", "namespacepractical__astronomy_1_1pa__macro.html#a246f46ef1cf7cd93d01ea23ed78ab727", null ], + [ "eq_e_long", "namespacepractical__astronomy_1_1pa__macro.html#aed12f47f471197809d5987c0bf2061ff", null ], + [ "f_dow", "namespacepractical__astronomy_1_1pa__macro.html#a37e477f7b58d705a15f7ae3bdae41304", null ], + [ "f_part", "namespacepractical__astronomy_1_1pa__macro.html#a1919879b878ae9c8051083293912edc6", null ], + [ "fract", "namespacepractical__astronomy_1_1pa__macro.html#a9343576b800565b60f135f5f9510307c", null ], + [ "full_moon", "namespacepractical__astronomy_1_1pa__macro.html#a56feb4f0dad22830627f57a288d20fae", null ], + [ "gst_lst", "namespacepractical__astronomy_1_1pa__macro.html#ab231f1f9db003559dc64170365c8d133", null ], + [ "gst_ut", "namespacepractical__astronomy_1_1pa__macro.html#a6d47a406e1b10a1fba09a76f8693dc80", null ], + [ "ha_ra", "namespacepractical__astronomy_1_1pa__macro.html#a06c8bb32b88eb03689ba130e17e5e69b", null ], + [ "hms_dh", "namespacepractical__astronomy_1_1pa__macro.html#a43a4596b8c96774b9f277dd2209cd06c", null ], + [ "hor_dec", "namespacepractical__astronomy_1_1pa__macro.html#affd159e8e88b91904558baff5cfe538b", null ], + [ "hor_ha", "namespacepractical__astronomy_1_1pa__macro.html#aa45f444af815b93d1d5b88a5d4ed53b0", null ], + [ "iint", "namespacepractical__astronomy_1_1pa__macro.html#a183688ea9868beb50f0227010d223f4d", null ], + [ "jdc_day", "namespacepractical__astronomy_1_1pa__macro.html#ab2b1b3d413b7ac0b4046bf10a86e153c", null ], + [ "jdc_month", "namespacepractical__astronomy_1_1pa__macro.html#af23f2b93521938aff5011cc98680b05a", null ], + [ "jdc_year", "namespacepractical__astronomy_1_1pa__macro.html#aa7c4db5c73214d4fe195e876fa541dcb", null ], + [ "lct_gday", "namespacepractical__astronomy_1_1pa__macro.html#a46edb7e554811ce6321e7db418f80f7c", null ], + [ "lct_gmonth", "namespacepractical__astronomy_1_1pa__macro.html#a105f28dd78c95603fffb2db1984fbe12", null ], + [ "lct_gyear", "namespacepractical__astronomy_1_1pa__macro.html#a5785e385bddfefe0b922b91cd0a0ec1a", null ], + [ "lct_ut", "namespacepractical__astronomy_1_1pa__macro.html#a8262d7ce106918f0b279edbd4356a7d1", null ], + [ "lint", "namespacepractical__astronomy_1_1pa__macro.html#a91b8faef2e6bd134254cd5f596a162ed", null ], + [ "lst_gst", "namespacepractical__astronomy_1_1pa__macro.html#a22c400268a08a350c72f2c0830d4e40b", null ], + [ "lunar_eclipse_occurrence", "namespacepractical__astronomy_1_1pa__macro.html#a40312f6ac912d41a907d2bc9bf323456", null ], + [ "lunar_eclipse_occurrence_l6855", "namespacepractical__astronomy_1_1pa__macro.html#a6d4798a56972a9b1bf4dd35496a66a18", null ], + [ "mag_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a91044fea690474429ca7c3b9c8124b31", null ], + [ "mag_solar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a7b33e18563369df1c45616322b7618f7", null ], + [ "mag_solar_eclipse_l7390", "namespacepractical__astronomy_1_1pa__macro.html#abd91674b9bca5a624f756949dfb20a19", null ], + [ "moon_dist", "namespacepractical__astronomy_1_1pa__macro.html#ab22050aced35c0adce5617e66f18d2fd", null ], + [ "moon_hp", "namespacepractical__astronomy_1_1pa__macro.html#aba7a5ece48ac48e22d661556d2cfaa14", null ], + [ "moon_lat", "namespacepractical__astronomy_1_1pa__macro.html#a9daed488b5de1cbfc98a7136e0bd1a05", null ], + [ "moon_long", "namespacepractical__astronomy_1_1pa__macro.html#a23d02d81556d7695f63cae4e3df19dbb", null ], + [ "moon_long_lat_hp", "namespacepractical__astronomy_1_1pa__macro.html#af5b4537b14bb450a8f25e33101845a86", null ], + [ "moon_mean_anomaly", "namespacepractical__astronomy_1_1pa__macro.html#af70a4720345b0e73b857c91dd84df3da", null ], + [ "moon_phase", "namespacepractical__astronomy_1_1pa__macro.html#aa5d6562291f66ac8fac04d89e3b90652", null ], + [ "moon_rise_az", "namespacepractical__astronomy_1_1pa__macro.html#a5f043e44ceb70f32d3f255cd02ff53a4", null ], + [ "moon_rise_az_l6680", "namespacepractical__astronomy_1_1pa__macro.html#ab9b8773345c7d4922ffb682ba9ea2b36", null ], + [ "moon_rise_az_l6700", "namespacepractical__astronomy_1_1pa__macro.html#ae864c757a1bd2961c994dc5c69369b38", null ], + [ "moon_rise_lc_dmy", "namespacepractical__astronomy_1_1pa__macro.html#a2ffd81a6353e989306ce41e4dce90675", null ], + [ "moon_rise_lc_dmy_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a6409ca331112e19d32e71ce779d1f209", null ], + [ "moon_rise_lc_dmy_l6700", "namespacepractical__astronomy_1_1pa__macro.html#af464c217e6c13de9c5e1971272ec6049", null ], + [ "moon_rise_lct", "namespacepractical__astronomy_1_1pa__macro.html#ac0ab9a097c01383f6d6cc07b90e034a1", null ], + [ "moon_rise_lct_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a8378463a64c32022f516594e0b152cb1", null ], + [ "moon_rise_lct_l6700", "namespacepractical__astronomy_1_1pa__macro.html#a745a450e3468bf4c214e902973a43c57", null ], + [ "moon_set_az", "namespacepractical__astronomy_1_1pa__macro.html#a561759d6302e17ad046c1cf74a8fdb14", null ], + [ "moon_set_az_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a045fb010333f74a3359efd9dc69d626d", null ], + [ "moon_set_az_l6700", "namespacepractical__astronomy_1_1pa__macro.html#a49ce367bffc3b56a48eaa3bd1a03aefe", null ], + [ "moon_set_lc_dmy", "namespacepractical__astronomy_1_1pa__macro.html#a881ded591e2b18b78a5b25d4e92b2d46", null ], + [ "moon_set_lc_dmy_l6680", "namespacepractical__astronomy_1_1pa__macro.html#a2ff94df12871eb0c84974727ea3c8d31", null ], + [ "moon_set_lc_dmy_l6700", "namespacepractical__astronomy_1_1pa__macro.html#ac8d49b52926ba75b6a77254e0507ee34", null ], + [ "moon_set_lct", "namespacepractical__astronomy_1_1pa__macro.html#a1fd51be6c6ceda184cf4c4489b540f03", null ], + [ "moon_set_lct_l6680", "namespacepractical__astronomy_1_1pa__macro.html#aeaacca1e8e60a5ed13a98ee07e6f0228", null ], + [ "moon_set_lct_l6700", "namespacepractical__astronomy_1_1pa__macro.html#aac6e50514786edd12ba3e9e8fbc9fcb1", null ], + [ "moon_size", "namespacepractical__astronomy_1_1pa__macro.html#a27fdf19dffe998871f90355393cf502f", null ], + [ "new_moon", "namespacepractical__astronomy_1_1pa__macro.html#acc8244f47cc29d7a0078a55df59c9c7c", null ], + [ "new_moon_full_moon_l6855", "namespacepractical__astronomy_1_1pa__macro.html#ab80cabb007a1e6783a13506d4351908a", null ], + [ "nutat_long", "namespacepractical__astronomy_1_1pa__macro.html#a681b21159361cc3479105fc31ef861fc", null ], + [ "nutat_obl", "namespacepractical__astronomy_1_1pa__macro.html#a84765422e7420803ede32148d0e014a7", null ], + [ "obliq", "namespacepractical__astronomy_1_1pa__macro.html#a3716ff9bcaf920e2a9cfa2f0ada15f9c", null ], + [ "p_comet_long_lat_dist", "namespacepractical__astronomy_1_1pa__macro.html#a1b5eac8af576ccd6282b7b7a63c3e89a", null ], + [ "parallax_dec", "namespacepractical__astronomy_1_1pa__macro.html#a4d0959d2a036f25b36da7701f7d09315", null ], + [ "parallax_dec_l2870", "namespacepractical__astronomy_1_1pa__macro.html#a0f2f9fa28025bfd0727c883df3ce2ab0", null ], + [ "parallax_ha", "namespacepractical__astronomy_1_1pa__macro.html#a6c896247bc90faedeedcf3c665b51a01", null ], + [ "parallax_ha_l2870", "namespacepractical__astronomy_1_1pa__macro.html#a0aa85cbdf3b976861aa96408228319d3", null ], + [ "planet_coordinates", "namespacepractical__astronomy_1_1pa__macro.html#a8782f3703c6fe128bf2432bc34879a32", null ], + [ "planet_long_l4685", "namespacepractical__astronomy_1_1pa__macro.html#ac92a92e61b4e46a4d808191e804ee1a5", null ], + [ "planet_long_l4735", "namespacepractical__astronomy_1_1pa__macro.html#a58e6721f2901ab6341c5186fd16d212e", null ], + [ "planet_long_l4810", "namespacepractical__astronomy_1_1pa__macro.html#a757dbf1cc823969685ac2365b5f83658", null ], + [ "planet_long_l4945", "namespacepractical__astronomy_1_1pa__macro.html#ae798655da82fabfa4704371a2119eba6", null ], + [ "ra_ha", "namespacepractical__astronomy_1_1pa__macro.html#a7fa8b9715d61034fc8baa40a474fcff7", null ], + [ "refract", "namespacepractical__astronomy_1_1pa__macro.html#a5b7bb777e3f52ba07f7256a7e1df3965", null ], + [ "refract_l3035", "namespacepractical__astronomy_1_1pa__macro.html#abed8f9a046213013a6bcc1372a39ff3c", null ], + [ "rise_set_azimuth_rise", "namespacepractical__astronomy_1_1pa__macro.html#a518d3ead799e5c593203e48f981fe11f", null ], + [ "rise_set_azimuth_set", "namespacepractical__astronomy_1_1pa__macro.html#a5a33468388fa7aff143abc68c1628aeb", null ], + [ "rise_set_local_sidereal_time_rise", "namespacepractical__astronomy_1_1pa__macro.html#ab9395fb16dedf1a5a756b857b0f78587", null ], + [ "rise_set_local_sidereal_time_set", "namespacepractical__astronomy_1_1pa__macro.html#a4068b7600e8d1a43fb973369c96eaa04", null ], + [ "sgn", "namespacepractical__astronomy_1_1pa__macro.html#a87fc05d5af8b1cbc4d983a85aeb12283", null ], + [ "solar_eclipse_occurrence", "namespacepractical__astronomy_1_1pa__macro.html#a64363c2534f9760556a100e707daf6ec", null ], + [ "solar_eclipse_occurrence_l6855", "namespacepractical__astronomy_1_1pa__macro.html#a7eeeb8f52fbd280a72946911feac1740", null ], + [ "solve_cubic", "namespacepractical__astronomy_1_1pa__macro.html#ac5dafeb29d3bca13621453cd7866c940", null ], + [ "sun_dia", "namespacepractical__astronomy_1_1pa__macro.html#a7b72953a8ffc673dde9f45cfdb1db023", null ], + [ "sun_dist", "namespacepractical__astronomy_1_1pa__macro.html#a63205ef979e0a315706eb0b3c60e4560", null ], + [ "sun_e_long", "namespacepractical__astronomy_1_1pa__macro.html#af6721a46a0142cb48d596bb08a409023", null ], + [ "sun_ecc", "namespacepractical__astronomy_1_1pa__macro.html#a8dddf7b4dbc52301122b4fe2c980c037", null ], + [ "sun_long", "namespacepractical__astronomy_1_1pa__macro.html#a9833772b0c9312c4973c770fc45ce825", null ], + [ "sun_mean_anomaly", "namespacepractical__astronomy_1_1pa__macro.html#aa335c9bd97815c75018151aff53c47f9", null ], + [ "sun_peri", "namespacepractical__astronomy_1_1pa__macro.html#ab70147487826c19f7ce0e47fc2b6ce08", null ], + [ "sun_true_anomaly", "namespacepractical__astronomy_1_1pa__macro.html#a1e330f4a543e6d40e3979bcef2fd27de", null ], + [ "sunrise_az", "namespacepractical__astronomy_1_1pa__macro.html#ae031ec483a748b030faf63aff4a05af5", null ], + [ "sunrise_az_l3710", "namespacepractical__astronomy_1_1pa__macro.html#aa5d13be74e51834eabb9b445d9ad301e", null ], + [ "sunrise_lct", "namespacepractical__astronomy_1_1pa__macro.html#a318a23d1a928a0b53d4ce73888fc118c", null ], + [ "sunrise_lct_l3710", "namespacepractical__astronomy_1_1pa__macro.html#a3dadd77c196d1a78b4c02ade839ab19c", null ], + [ "sunset_az", "namespacepractical__astronomy_1_1pa__macro.html#a9f41dc6f857569eae75081be194c51a0", null ], + [ "sunset_az_l3710", "namespacepractical__astronomy_1_1pa__macro.html#a85e47f2be8bd9e14228014a07c262638", null ], + [ "sunset_lct", "namespacepractical__astronomy_1_1pa__macro.html#a3e49a251ed884ffe18ddfc05d5dd275c", null ], + [ "sunset_lct_l3710", "namespacepractical__astronomy_1_1pa__macro.html#aff1c66bc72fd0b541eda355c3308d71a", null ], + [ "true_anomaly", "namespacepractical__astronomy_1_1pa__macro.html#a6a2e51256465c8a9ed7683f1058e71f3", null ], + [ "twilight_am_lct", "namespacepractical__astronomy_1_1pa__macro.html#a3b3c949a60b889c878cd6bd79790943a", null ], + [ "twilight_am_lct_l3710", "namespacepractical__astronomy_1_1pa__macro.html#aacbb1c1872762d0f355a126d6e7c7c98", null ], + [ "twilight_pm_lct", "namespacepractical__astronomy_1_1pa__macro.html#a210d9af39cca8495146cd91c1f6ef2b4", null ], + [ "twilight_pm_lct_l3710", "namespacepractical__astronomy_1_1pa__macro.html#a82b2a832e3984d7980b1d92bf20e21f6", null ], + [ "unwind", "namespacepractical__astronomy_1_1pa__macro.html#a85c5e18e296e6571a70ef3dbef5bb394", null ], + [ "unwind_deg", "namespacepractical__astronomy_1_1pa__macro.html#a0fd38430a2b34a11124d7e58da7812f7", null ], + [ "unwind_rad", "namespacepractical__astronomy_1_1pa__macro.html#a2cea96910cb7df148bcaa246eef0be15", null ], + [ "ut_day_adjust", "namespacepractical__astronomy_1_1pa__macro.html#aa1986a7814f603a649d46d6d994558ef", null ], + [ "ut_end_total_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#aab795045e326e5ebc39c994d97e12187", null ], + [ "ut_end_umbra_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a6ab1e97f378283e05efc3ff532798def", null ], + [ "ut_first_contact_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a904c7a5da1387c176fb3a7324a78088c", null ], + [ "ut_first_contact_solar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a29a084742d81410764e27a9c72f567d7", null ], + [ "ut_first_contact_solar_eclipse_l7390", "namespacepractical__astronomy_1_1pa__macro.html#a45d2d62ed9a459b0209326da47785145", null ], + [ "ut_gst", "namespacepractical__astronomy_1_1pa__macro.html#a325087e87c581b42487fa2de4aa5c282", null ], + [ "ut_last_contact_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a67f15513275d9300e3efef985f4d5291", null ], + [ "ut_last_contact_solar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a1ee1b22776bf8592086a3ee158648693", null ], + [ "ut_last_contact_solar_eclipse_l7390", "namespacepractical__astronomy_1_1pa__macro.html#a7927cec9c423873d3ecca5c3c433b82c", null ], + [ "ut_lc_day", "namespacepractical__astronomy_1_1pa__macro.html#a2ce7a80d4b9db334e3a9c11e3ad9c094", null ], + [ "ut_lc_month", "namespacepractical__astronomy_1_1pa__macro.html#a678b8e7e23c97823649589a94b55c062", null ], + [ "ut_lc_year", "namespacepractical__astronomy_1_1pa__macro.html#a8b857a7a6b35ef5e28f9f07441727680", null ], + [ "ut_lct", "namespacepractical__astronomy_1_1pa__macro.html#a0c65bcdf6c40b6921c80f7df8b7ada4e", null ], + [ "ut_max_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#aa8228f5d17279c86196935d1d59da20a", null ], + [ "ut_max_solar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a8890e77811d6930958f566ca9cabf370", null ], + [ "ut_max_solar_eclipse_l7390", "namespacepractical__astronomy_1_1pa__macro.html#a70ee926aa08528ed97ce26176364b92a", null ], + [ "ut_start_total_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#a15a292cef81b794f9f4b07fb48fbf471", null ], + [ "ut_start_umbra_lunar_eclipse", "namespacepractical__astronomy_1_1pa__macro.html#ac8234ad97d3fe0aebb7999f366ac41a4", null ] + ] ], + [ "pa_moon", "namespacepractical__astronomy_1_1pa__moon.html", [ + [ "approximate_position_of_moon", "namespacepractical__astronomy_1_1pa__moon.html#a9d7c63bb40e4cceabce9850764b780b5", null ], + [ "moon_dist_ang_diam_hor_parallax", "namespacepractical__astronomy_1_1pa__moon.html#aedd86f345903593ab5e8bda8548f5c13", null ], + [ "moon_phase", "namespacepractical__astronomy_1_1pa__moon.html#a0a21dc7776e79ad9d26f27d6da65139e", null ], + [ "moonrise_and_moonset", "namespacepractical__astronomy_1_1pa__moon.html#a303811d67109d57d62bf8914de754cfe", null ], + [ "precise_position_of_moon", "namespacepractical__astronomy_1_1pa__moon.html#a4a39acc6f3fcf1ecdda0e13ce5d870ce", null ], + [ "times_of_new_moon_and_full_moon", "namespacepractical__astronomy_1_1pa__moon.html#a4243e54e26b84728838b58796f8e4cb9", null ] + ] ], + [ "pa_planet", "namespacepractical__astronomy_1_1pa__planet.html", [ + [ "approximate_position_of_planet", "namespacepractical__astronomy_1_1pa__planet.html#a1f4d8635886fb19f0be50ef1eb973ba0", null ], + [ "precise_position_of_planet", "namespacepractical__astronomy_1_1pa__planet.html#aeb953f985c7f33b29ecea14f0bdfe255", null ], + [ "visual_aspects_of_a_planet", "namespacepractical__astronomy_1_1pa__planet.html#a653d491b54bd718f4ea7949fa69b9b4c", null ] + ] ], + [ "pa_planet_data", "namespacepractical__astronomy_1_1pa__planet__data.html", [ + [ "get_planet_data", "namespacepractical__astronomy_1_1pa__planet__data.html#a80b3d5ea375b6d3724171ba6f2cb4a2b", null ], + [ "PlanetData", "namespacepractical__astronomy_1_1pa__planet__data.html#aafde02b5f4bc4c9f9be616ba43f50bf2", null ] + ] ], + [ "pa_sun", "namespacepractical__astronomy_1_1pa__sun.html", [ + [ "approximate_position_of_sun", "namespacepractical__astronomy_1_1pa__sun.html#a45d2ca4ae26d8cded6b5f3eed8eca785", null ], + [ "equation_of_time", "namespacepractical__astronomy_1_1pa__sun.html#a041439423740ffa2b4f6e9b567586a2d", null ], + [ "morning_and_evening_twilight", "namespacepractical__astronomy_1_1pa__sun.html#adfbd4639478f5952b5dffe334071fa26", null ], + [ "precise_position_of_sun", "namespacepractical__astronomy_1_1pa__sun.html#a6fbea6a71648f5f0d7b254743bcb5b44", null ], + [ "solar_elongation", "namespacepractical__astronomy_1_1pa__sun.html#ab4ff369aaa2e7ce1f93dae29e83c6c80", null ], + [ "sun_distance_and_angular_size", "namespacepractical__astronomy_1_1pa__sun.html#a5704841679b2d5ed8367298db7e406f3", null ], + [ "sunrise_and_sunset", "namespacepractical__astronomy_1_1pa__sun.html#a6fc7c4ad24c37eabb246d4cb28adaccf", null ] + ] ], + [ "pa_util", "namespacepractical__astronomy_1_1pa__util.html", [ + [ "is_leap_year", "namespacepractical__astronomy_1_1pa__util.html#a4bde6043f052777f35147c29658b728a", null ], + [ "km_to_mi", "namespacepractical__astronomy_1_1pa__util.html#a29de8f0275076afc08b7f2ed98080bdb", null ], + [ "mi_to_km", "namespacepractical__astronomy_1_1pa__util.html#a1aa17b78e46a1d549c7871de9797c9de", null ] + ] ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary.html new file mode 100644 index 0000000000000000000000000000000000000000..10dd0ca66a537588d0efa2b52ac2f47da134f892 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary.html @@ -0,0 +1,157 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_binary Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_binary Namespace Reference
    +
    +
    + + + + +

    +Functions

    def binary_star_orbit (greenwich_date_day, greenwich_date_month, greenwich_date_year, binary_name)
     
    +

    Function Documentation

    + +

    ◆ binary_star_orbit()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_binary.binary_star_orbit ( greenwich_date_day,
     greenwich_date_month,
     greenwich_date_year,
     binary_name 
    )
    +
    +
        Calculate orbital data for binary star.
    +
    +    Arguments:
    +        greenwich_date_day -- Greenwich date (day)
    +        greenwich_date_month -- Greenwich date (month)
    +        greenwich_date_year -- Greenwich date (year)
    +        binary_name -- Abbreviated name of binary
    +
    +    Returns:
    +        position_angle_deg -- Position angle (degrees)  
    +        separation_arcsec -- Separation of binary members (arcseconds)
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary__data.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary__data.html new file mode 100644 index 0000000000000000000000000000000000000000..463b0101a7bf965da1c3f249ffdb15d962874980 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__binary__data.html @@ -0,0 +1,163 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_binary_data Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_binary_data Namespace Reference
    +
    +
    + + + + +

    +Functions

    def get_binary_data (binary_name)
     
    + + + +

    +Variables

    dictionary BinaryData
     
    +

    Function Documentation

    + +

    ◆ get_binary_data()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_binary_data.get_binary_data ( binary_name)
    +
    +
        Get data for binary star.
    +    
    +    Example, retrieving orbital inclination of eta-Cor:
    +        get_binary_data("eta-Cor")['Incl']
    +
    +    Arguments:
    +        binary_name -- Name of binary, e.g., "eta-Cor"
    +
    +    Returns:
    +        A dictionary object with the following elements:
    +
    +        Period -- Period of the orbit.
    +        EpochPeri -- Epoch of the perihelion.
    +        LongPeri -- Longitude of the perihelion.
    +        Ecc -- Eccentricity of the orbit.
    +        Axis -- Semi-major axis of the orbit.
    +        Incl -- Orbital inclination.
    +        PANode -- Position angle of the ascending node.
    +
    +
    +

    Variable Documentation

    + +

    ◆ BinaryData

    + +
    +
    + + + + +
    dictionary BinaryData
    +
    + +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet.html new file mode 100644 index 0000000000000000000000000000000000000000..f6bbcf610494bb739d3833c51c241150b26f1a84 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet.html @@ -0,0 +1,287 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_comet Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_comet Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def position_of_elliptical_comet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name)
     
    def position_of_parabolic_comet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name)
     
    +

    Function Documentation

    + +

    ◆ position_of_elliptical_comet()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_comet.position_of_elliptical_comet ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     comet_name 
    )
    +
    +
        Calculate position of an elliptical comet.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, hour part.
    +        lct_min -- Local civil time, minutes part.
    +        lct_sec -- Local civil time, seconds part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        comet_name -- Name of comet, e.g., "Halley"
    +
    +    Returns:
    +        comet_ra_hour -- Right ascension of comet (hour part)
    +        comet_ra_min -- Right ascension of comet (minutes part)
    +        comet_dec_deg -- Declination of comet (degrees part)
    +        comet_dec_min -- Declination of comet (minutes part)
    +        comet_dist_earth -- Comet's distance from Earth (AU)
    +
    +
    + +

    ◆ position_of_parabolic_comet()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_comet.position_of_parabolic_comet ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     comet_name 
    )
    +
    +
        Calculate position of a parabolic comet.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, hour part.
    +        lct_min -- Local civil time, minutes part.
    +        lct_sec -- Local civil time, seconds part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        comet_name -- Name of comet, e.g., "Kohler"
    +
    +    Returns:
    +        comet_ra_hour -- Right ascension of comet (hour part)
    +        comet_ra_min -- Right ascension of comet (minutes part)
    +        comet_ra_sec -- Right ascension of comet (seconds part)
    +        comet_dec_deg -- Declination of comet (degrees part)
    +        comet_dec_min -- Declination of comet (minutes part)
    +        comet_dec_sec -- Declination of comet (seconds part)
    +        comet_dist_earth -- Comet's distance from Earth (AU)
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet__data.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet__data.html new file mode 100644 index 0000000000000000000000000000000000000000..059c24099a4449129671daeda11df927054f2738 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__comet__data.html @@ -0,0 +1,227 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_comet_data Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_comet_data Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def get_comet_data_elliptical (comet_name)
     
    def get_comet_data_parabolic (comet_name)
     
    + + + + + +

    +Variables

    dictionary CometDataElliptical
     
    dictionary CometDataParabolic
     
    +

    Function Documentation

    + +

    ◆ get_comet_data_elliptical()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_comet_data.get_comet_data_elliptical ( comet_name)
    +
    +
        Get data for elliptical comet.
    +    
    +    Example, retrieving orbital period of Halley:
    +        get_comet_data_elliptical("Halley")['Period']
    +
    +    Arguments:
    +        comet_name -- Name of comet, e.g., "Halley"
    +
    +    Returns:
    +        A dictionary object with the following elements:
    +
    +        Epoch -- Epoch of the perihelion.
    +        Peri -- Longitude of the perihelion.
    +        Node -- Longitude of the ascending node.
    +        Period -- Period of the orbit.
    +        Axis -- Semi-major axis of the orbit.
    +        Ecc -- Eccentricity of the orbit.
    +        Incl -- Orbital inclination.
    +
    +
    + +

    ◆ get_comet_data_parabolic()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_comet_data.get_comet_data_parabolic ( comet_name)
    +
    +
        Get data for parabolic comet.
    +
    +    Example, retrieving longitude of the ascending node of Kohler:
    +        get_comet_data_parabolic("Kohler")['Node']
    +
    +    Arguments:
    +        comet_name -- Name of comet, e.g., "Kohler"
    +
    +    Returns:
    +        A dictionary object with the following elements:
    +
    +        EpochPeriDay -- Epoch of the perihelion (day)
    +        EpochPeriMonth -- Epoch of the perihelion (month)
    +        EpochPeriYear -- Epoch of the perihelion (year)
    +        ArgPeri -- Longitude of the perihelion (degrees)
    +        Node -- Longitude of the ascending node (degrees)
    +        PeriDist -- Distance at perihelion (AU) 
    +        Incl -- Orbital inclination (degrees)
    +
    +
    +

    Variable Documentation

    + +

    ◆ CometDataElliptical

    + +
    +
    + + + + +
    dictionary CometDataElliptical
    +
    + +
    +
    + +

    ◆ CometDataParabolic

    + +
    +
    + + + + +
    dictionary CometDataParabolic
    +
    +Initial value:
    1 = {
    +
    2  "Kohler": {
    +
    3  "EpochPeriDay": 10.5659,
    +
    4  "EpochPeriMonth": 11,
    +
    5  "EpochPeriYear": 1977,
    +
    6  "ArgPeri": 163.4799,
    +
    7  "Node": 181.8175,
    +
    8  "PeriDist": 0.990662,
    +
    9  "Incl": 48.7196
    +
    10  }
    +
    11 }
    +
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__coordinate.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__coordinate.html new file mode 100644 index 0000000000000000000000000000000000000000..2f0258319db7fa50cae3b6a03c51eaddcda65073 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__coordinate.html @@ -0,0 +1,1641 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_coordinate Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_coordinate Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def angle_to_decimal_degrees (degrees, minutes, seconds)
     
    def decimal_degrees_to_angle (decimalDegrees)
     
    def right_ascension_to_hour_angle (ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, is_daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def hour_angle_to_right_ascension (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, lct_hours, lct_minutes, lct_seconds, is_daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def equatorial_coordinates_to_horizon_coordinates (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def horizon_coordinates_to_equatorial_coordinates (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def mean_obliquity_of_the_ecliptic (greenwich_day, greenwich_month, greenwich_year)
     
    def ecliptic_coordinate_to_equatorial_coordinate (ecliptic_longitude_degrees, ecliptic_longitude_minutes, ecliptic_longitude_seconds, ecliptic_latitude_degrees, ecliptic_latitude_minutes, ecliptic_latitude_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def equatorial_coordinate_to_ecliptic_coordinate (ra_hours, ra_minutes, ra_seconds, dec_degrees, dec_minutes, dec_seconds, gw_day, gw_month, gw_year)
     
    def equatorial_coordinate_to_galactic_coordinate (ra_hours, ra_minutes, ra_seconds, dec_degrees, dec_minutes, dec_seconds)
     
    def galactic_coordinate_to_equatorial_coordinate (gal_long_deg, gal_long_min, gal_long_sec, gal_lat_deg, gal_lat_min, gal_lat_sec)
     
    def angle_between_two_objects (ra_long_1_hour_deg, ra_long_1_min, ra_long_1_sec, dec_lat_1_deg, dec_lat_1_min, dec_lat_1_sec, ra_long_2_hour_deg, ra_long_2_min, ra_long_2_sec, dec_lat_2_deg, dec_lat_2_min, dec_lat_2_sec, hour_or_degree)
     
    def rising_and_setting (ra_hours, ra_minutes, ra_seconds, dec_deg, dec_min, dec_sec, gw_date_day, gw_date_month, gw_date_year, geog_long_deg, geog_lat_deg, vert_shift_deg)
     
    def correct_for_precession (ra_hour, ra_minutes, ra_seconds, dec_deg, dec_minutes, dec_seconds, epoch1_day, epoch1_month, epoch1_year, epoch2_day, epoch2_month, epoch2_year)
     
    def nutation_in_ecliptic_longitude_and_obliquity (greenwich_day, greenwich_month, greenwich_year)
     
    def correct_for_aberration (ut_hour, ut_minutes, ut_seconds, gw_day, gw_month, gw_year, true_ecl_long_deg, true_ecl_long_min, true_ecl_long_sec, true_ecl_lat_deg, true_ecl_lat_min, true_ecl_lat_sec)
     
    def atmospheric_refraction (true_ra_hour, true_ra_min, true_ra_sec, true_dec_deg, true_dec_min, true_dec_sec, coordinate_type, geog_long_deg, geog_lat_deg, daylight_saving_hours, timezone_hours, lcd_day, lcd_month, lcd_year, lct_hour, lct_min, lct_sec, atmospheric_pressure_mbar, atmospheric_temperature_celsius)
     
    def corrections_for_geocentric_parallax (ra_hour, ra_min, ra_sec, dec_deg, dec_min, dec_sec, coordinate_type, equatorial_hor_parallax_deg, geog_long_deg, geog_lat_deg, height_m, daylight_saving, timezone_hours, lcd_day, lcd_month, lcd_year, lct_hour, lct_min, lct_sec)
     
    def heliographic_coordinates (helio_position_angle_deg, helio_displacement_arcmin, gwdate_day, gwdate_month, gwdate_year)
     
    def carrington_rotation_number (gwdate_day, gwdate_month, gwdate_year)
     
    def selenographic_coordinates_1 (gwdate_day, gwdate_month, gwdate_year)
     
    def selenographic_coordinates_2 (gwdate_day, gwdate_month, gwdate_year)
     
    +

    Function Documentation

    + +

    ◆ angle_between_two_objects()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.angle_between_two_objects ( ra_long_1_hour_deg,
     ra_long_1_min,
     ra_long_1_sec,
     dec_lat_1_deg,
     dec_lat_1_min,
     dec_lat_1_sec,
     ra_long_2_hour_deg,
     ra_long_2_min,
     ra_long_2_sec,
     dec_lat_2_deg,
     dec_lat_2_min,
     dec_lat_2_sec,
     hour_or_degree 
    )
    +
    +
     Calculate the angle between two celestial objects 
    +
    +
    + +

    ◆ angle_to_decimal_degrees()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.angle_to_decimal_degrees ( degrees,
     minutes,
     seconds 
    )
    +
    +
     Convert an Angle (degrees, minutes, and seconds) to Decimal Degrees 
    +
    +
    + +

    ◆ atmospheric_refraction()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.atmospheric_refraction ( true_ra_hour,
     true_ra_min,
     true_ra_sec,
     true_dec_deg,
     true_dec_min,
     true_dec_sec,
     coordinate_type,
     geog_long_deg,
     geog_lat_deg,
     daylight_saving_hours,
     timezone_hours,
     lcd_day,
     lcd_month,
     lcd_year,
     lct_hour,
     lct_min,
     lct_sec,
     atmospheric_pressure_mbar,
     atmospheric_temperature_celsius 
    )
    +
    +
        Calculate corrected RA/Dec, accounting for atmospheric refraction.
    +
    +    NOTE: Valid values for coordinate_type are "TRUE" and "APPARENT".
    +
    +    Returns:
    +        corrected RA hours,minutes,seconds
    +        corrected Declination degrees,minutes,seconds
    +
    +
    + +

    ◆ carrington_rotation_number()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.carrington_rotation_number ( gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate carrington rotation number for a Greenwich date
    +
    +    Returns:
    +            carrington rotation number
    +
    +
    + +

    ◆ correct_for_aberration()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.correct_for_aberration ( ut_hour,
     ut_minutes,
     ut_seconds,
     gw_day,
     gw_month,
     gw_year,
     true_ecl_long_deg,
     true_ecl_long_min,
     true_ecl_long_sec,
     true_ecl_lat_deg,
     true_ecl_lat_min,
     true_ecl_lat_sec 
    )
    +
    +
        Correct ecliptic coordinates for the effects of aberration.
    +
    +    Returns:
    +        apparent ecliptic longitude (degrees, minutes, seconds)
    +        apparent ecliptic latitude (degrees, minutes, seconds)
    +
    +
    + +

    ◆ correct_for_precession()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.correct_for_precession ( ra_hour,
     ra_minutes,
     ra_seconds,
     dec_deg,
     dec_minutes,
     dec_seconds,
     epoch1_day,
     epoch1_month,
     epoch1_year,
     epoch2_day,
     epoch2_month,
     epoch2_year 
    )
    +
    +
        Calculate precession (corrected coordinates between two epochs)
    +
    +    Returns:
    +        corrected RA hour
    +        corrected RA minutes
    +        corrected RA seconds
    +        corrected Declination degrees
    +        corrected Declination minutes
    +        corrected Declination seconds
    +
    +
    + +

    ◆ corrections_for_geocentric_parallax()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.corrections_for_geocentric_parallax ( ra_hour,
     ra_min,
     ra_sec,
     dec_deg,
     dec_min,
     dec_sec,
     coordinate_type,
     equatorial_hor_parallax_deg,
     geog_long_deg,
     geog_lat_deg,
     height_m,
     daylight_saving,
     timezone_hours,
     lcd_day,
     lcd_month,
     lcd_year,
     lct_hour,
     lct_min,
     lct_sec 
    )
    +
    +
        Calculate corrected RA/Dec, accounting for geocentric parallax.
    +
    +    NOTE: Valid values for coordinate_type are "TRUE" and "APPARENT".
    +
    +    Returns:
    +        corrected RA hours,minutes,seconds
    +        corrected Declination degrees,minutes,seconds
    +
    +
    + +

    ◆ decimal_degrees_to_angle()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_coordinate.decimal_degrees_to_angle ( decimalDegrees)
    +
    +
        Convert Decimal Degrees to an Angle (degrees, minutes, and seconds)
    +    
    +    Returns:
    +        degrees, minutes, seconds
    +
    +
    + +

    ◆ ecliptic_coordinate_to_equatorial_coordinate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.ecliptic_coordinate_to_equatorial_coordinate ( ecliptic_longitude_degrees,
     ecliptic_longitude_minutes,
     ecliptic_longitude_seconds,
     ecliptic_latitude_degrees,
     ecliptic_latitude_minutes,
     ecliptic_latitude_seconds,
     greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
     Convert Ecliptic Coordinates to Equatorial Coordinates 
    +
    +
    + +

    ◆ equatorial_coordinate_to_ecliptic_coordinate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.equatorial_coordinate_to_ecliptic_coordinate ( ra_hours,
     ra_minutes,
     ra_seconds,
     dec_degrees,
     dec_minutes,
     dec_seconds,
     gw_day,
     gw_month,
     gw_year 
    )
    +
    +
     Convert Equatorial Coordinates to Ecliptic Coordinates 
    +
    +
    + +

    ◆ equatorial_coordinate_to_galactic_coordinate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.equatorial_coordinate_to_galactic_coordinate ( ra_hours,
     ra_minutes,
     ra_seconds,
     dec_degrees,
     dec_minutes,
     dec_seconds 
    )
    +
    +
     Convert Equatorial Coordinates to Galactic Coordinates 
    +
    +
    + +

    ◆ equatorial_coordinates_to_horizon_coordinates()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.equatorial_coordinates_to_horizon_coordinates ( hour_angle_hours,
     hour_angle_minutes,
     hour_angle_seconds,
     declination_degrees,
     declination_minutes,
     declination_seconds,
     geographical_latitude 
    )
    +
    +
     Convert Equatorial Coordinates to Horizon Coordinates 
    +
    +
    + +

    ◆ galactic_coordinate_to_equatorial_coordinate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.galactic_coordinate_to_equatorial_coordinate ( gal_long_deg,
     gal_long_min,
     gal_long_sec,
     gal_lat_deg,
     gal_lat_min,
     gal_lat_sec 
    )
    +
    +
     Convert Galactic Coordinates to Equatorial Coordinates 
    +
    +
    + +

    ◆ heliographic_coordinates()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.heliographic_coordinates ( helio_position_angle_deg,
     helio_displacement_arcmin,
     gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate heliographic coordinates for a given Greenwich date, with a given heliographic position angle and heliographic displacement in arc minutes.
    +
    +    Returns:
    +        heliographic longitude and heliographic latitude, in degrees
    +
    +
    + +

    ◆ horizon_coordinates_to_equatorial_coordinates()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.horizon_coordinates_to_equatorial_coordinates ( azimuth_degrees,
     azimuth_minutes,
     azimuth_seconds,
     altitude_degrees,
     altitude_minutes,
     altitude_seconds,
     geographical_latitude 
    )
    +
    +
     Convert Horizon Coordinates to Equatorial Coordinates 
    +
    +
    + +

    ◆ hour_angle_to_right_ascension()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.hour_angle_to_right_ascension ( hour_angle_hours,
     hour_angle_minutes,
     hour_angle_seconds,
     lct_hours,
     lct_minutes,
     lct_seconds,
     is_daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year,
     geographical_longitude 
    )
    +
    +
     Convert Hour Angle to Right Ascension 
    +
    +
    + +

    ◆ mean_obliquity_of_the_ecliptic()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.mean_obliquity_of_the_ecliptic ( greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
     Calculate Mean Obliquity of the Ecliptic for a Greenwich Date 
    +
    +
    + +

    ◆ nutation_in_ecliptic_longitude_and_obliquity()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.nutation_in_ecliptic_longitude_and_obliquity ( greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
        Calculate nutation for two values: ecliptic longitude and obliquity, for a Greenwich date.
    +
    +    Returns:
    +        nutation in ecliptic longitude (degrees)
    +        nutation in obliquity (degrees)
    +
    +
    + +

    ◆ right_ascension_to_hour_angle()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.right_ascension_to_hour_angle ( ra_hours,
     ra_minutes,
     ra_seconds,
     lct_hours,
     lct_minutes,
     lct_seconds,
     is_daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year,
     geographical_longitude 
    )
    +
    +
     Convert Right Ascension to Hour Angle 
    +
    +
    + +

    ◆ rising_and_setting()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.rising_and_setting ( ra_hours,
     ra_minutes,
     ra_seconds,
     dec_deg,
     dec_min,
     dec_sec,
     gw_date_day,
     gw_date_month,
     gw_date_year,
     geog_long_deg,
     geog_lat_deg,
     vert_shift_deg 
    )
    +
    +
        Rising and setting times
    +
    +    Arguments:
    +        ra_hours -- Right Ascension, in hours.
    +        ra_minutes -- Right Ascension, in minutes.
    +        ra_seconds -- Right Ascension, in seconds.
    +        dec_deg -- Declination, in degrees.
    +        dec_min -- Declination, in minutes.
    +        dec_sec -- Declination, in seconds.
    +        gw_date_day -- Greenwich Date, day part.
    +        gw_date_month -- Greenwich Date, month part.
    +        gw_date_year -- Greenwich Date, year part.
    +        geog_long_deg -- Geographical Longitude, in degrees.
    +        geog_lat_deg -- Geographical Latitude, in degrees.
    +        vert_shift_deg -- Vertical Shift, in degrees.
    +
    +    Returns:
    +        rise_set_status -- "Never Rises", "Circumpolar", or "OK".
    +        ut_rise_hour -- Rise time, UT, hour part.
    +        ut_rise_min -- Rise time, UT, minute part.
    +        ut_set_hour -- Set time, UT, hour part.
    +        ut_set_min -- Set time, UT, minute part.
    +        az_rise -- Azimuth angle, at rise.
    +        az_set -- Azimuth angle, at set.
    +
    +
    + +

    ◆ selenographic_coordinates_1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.selenographic_coordinates_1 ( gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate selenographic (lunar) coordinates (sub-Earth)
    +
    +    Returns:
    +        sub-earth longitude
    +        sub-earth latitude
    +        position angle of pole
    +
    +
    + +

    ◆ selenographic_coordinates_2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_coordinate.selenographic_coordinates_2 ( gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate selenographic (lunar) coordinates (sub-Solar)
    +
    +    Returns:
    +        sub-solar longitude
    +        sub-solar colongitude
    +        sub-solar latitude
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__datetime.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__datetime.html new file mode 100644 index 0000000000000000000000000000000000000000..c198b1c926810f18dc29b6fa1c3b73e4bedd410f --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__datetime.html @@ -0,0 +1,782 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_datetime Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_datetime Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def get_date_of_easter (year)
     
    def civil_date_to_day_number (month, day, year)
     
    def greenwich_date_to_julian_date (day, month, year)
     
    def julian_date_to_greenwich_date (julianDate)
     
    def julian_date_day (julianDate)
     
    def julian_date_month (julianDate)
     
    def julian_date_year (julianDate)
     
    def julian_date_to_weekday_name (julianDate)
     
    def civil_time_to_decimal_hours (hours, minutes, seconds)
     
    def decimal_hour_hour (decimalHours)
     
    def decimal_hour_minutes (decimalHours)
     
    def decimal_hour_seconds (decimalHours)
     
    def decimal_hours_to_civil_time (decimalHours)
     
    def local_civil_time_to_universal_time (lctHours, lctMinutes, lctSeconds, isDaylightSavings, zoneCorrection, localDay, localMonth, localYear)
     
    def universal_time_to_local_civil_time (utHours, utMinutes, utSeconds, isDayLightSavings, zoneCorrection, gwDay, gwMonth, gwYear)
     
    def universal_time_to_greenwich_sidereal_time (utHours, utMinutes, utSeconds, gwDay, gwMonth, gwYear)
     
    def greenwich_sidereal_time_to_universal_time (gstHours, gstMinutes, gstSeconds, gwDay, gwMonth, gwYear)
     
    def greenwich_sidereal_time_to_local_sidereal_time (gstHours, gstMinutes, gstSeconds, geographicalLongitude)
     
    def local_sidereal_time_to_greenwich_sidereal_time (lstHours, lstMinutes, lstSeconds, geographicalLongitude)
     
    +

    Function Documentation

    + +

    ◆ civil_date_to_day_number()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.civil_date_to_day_number ( month,
     day,
     year 
    )
    +
    +
     Returns the day number for the date specified. 
    +
    +
    + +

    ◆ civil_time_to_decimal_hours()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.civil_time_to_decimal_hours ( hours,
     minutes,
     seconds 
    )
    +
    +
     Convert a Civil Time (hours,minutes,seconds) to Decimal Hours 
    +
    +
    + +

    ◆ decimal_hour_hour()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.decimal_hour_hour ( decimalHours)
    +
    +
     Return the hour part of a Decimal Hours 
    +
    +
    + +

    ◆ decimal_hour_minutes()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.decimal_hour_minutes ( decimalHours)
    +
    +
     Return the minutes part of a Decimal Hours 
    +
    +
    + +

    ◆ decimal_hour_seconds()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.decimal_hour_seconds ( decimalHours)
    +
    +
     Return the seconds part of a Decimal Hours 
    +
    +
    + +

    ◆ decimal_hours_to_civil_time()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.decimal_hours_to_civil_time ( decimalHours)
    +
    +
     Convert Decimal Hours to Civil Time 
    +
    +
    + +

    ◆ get_date_of_easter()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.get_date_of_easter ( year)
    +
    +
        Gets the date of Easter for the year specified.
    +
    +    Arguments:
    +        year:   Year for which you'd like the date of Easter.
    +
    +    Returns:
    +        month
    +        day
    +        year
    +
    +
    + +

    ◆ greenwich_date_to_julian_date()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.greenwich_date_to_julian_date ( day,
     month,
     year 
    )
    +
    +
     Convert a Greenwich Date/Civil Date (day,month,year) to Julian Date 
    +
    +
    + +

    ◆ greenwich_sidereal_time_to_local_sidereal_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.greenwich_sidereal_time_to_local_sidereal_time ( gstHours,
     gstMinutes,
     gstSeconds,
     geographicalLongitude 
    )
    +
    +
        Convert Greenwich Sidereal Time to Local Sidereal Time
    +
    +    Returns:
    +        LST hours
    +        LST minutes
    +        LST seconds
    +
    +
    + +

    ◆ greenwich_sidereal_time_to_universal_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.greenwich_sidereal_time_to_universal_time ( gstHours,
     gstMinutes,
     gstSeconds,
     gwDay,
     gwMonth,
     gwYear 
    )
    +
    +
        Convert Greenwich Sidereal Time to Universal Time
    +
    +    Returns:
    +        UT hours
    +        UT minutes
    +        UT seconds
    +        Warning Flag
    +
    +
    + +

    ◆ julian_date_day()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.julian_date_day ( julianDate)
    +
    +
     Returns the day part of a Julian Date 
    +
    +
    + +

    ◆ julian_date_month()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.julian_date_month ( julianDate)
    +
    +
     Returns the month part of a Julian Date 
    +
    +
    + +

    ◆ julian_date_to_greenwich_date()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.julian_date_to_greenwich_date ( julianDate)
    +
    +
     Convert a Julian Date to Greenwich Date/Civil Date (day,month,year) 
    +
    +
    + +

    ◆ julian_date_to_weekday_name()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.julian_date_to_weekday_name ( julianDate)
    +
    +
     Convert a Julian Date to Day-of-Week (e.g., Sunday) 
    +
    +
    + +

    ◆ julian_date_year()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_datetime.julian_date_year ( julianDate)
    +
    +
     Returns the year part of a Julian Date 
    +
    +
    + +

    ◆ local_civil_time_to_universal_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.local_civil_time_to_universal_time ( lctHours,
     lctMinutes,
     lctSeconds,
     isDaylightSavings,
     zoneCorrection,
     localDay,
     localMonth,
     localYear 
    )
    +
    +
        Convert local Civil Time to Universal Time
    +
    +    Returns:
    +        UT hours
    +        UT mins
    +        UT secs
    +        GW day
    +        GW month
    +        GW year
    +
    +
    + +

    ◆ local_sidereal_time_to_greenwich_sidereal_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.local_sidereal_time_to_greenwich_sidereal_time ( lstHours,
     lstMinutes,
     lstSeconds,
     geographicalLongitude 
    )
    +
    +
        Convert Local Sidereal Time to Greenwich Sidereal Time
    +
    +    Returns:
    +        GST hours
    +        GST minutes
    +        GST seconds
    +
    +
    + +

    ◆ universal_time_to_greenwich_sidereal_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.universal_time_to_greenwich_sidereal_time ( utHours,
     utMinutes,
     utSeconds,
     gwDay,
     gwMonth,
     gwYear 
    )
    +
    +
        Convert Universal Time to Greenwich Sidereal Time
    +
    +    Returns:
    +        GST hours
    +        GST minutes
    +        GST seconds
    +
    +
    + +

    ◆ universal_time_to_local_civil_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_datetime.universal_time_to_local_civil_time ( utHours,
     utMinutes,
     utSeconds,
     isDayLightSavings,
     zoneCorrection,
     gwDay,
     gwMonth,
     gwYear 
    )
    +
    +
        Convert Universal Time to local Civil Time
    +
    +    Returns:
    +        LCT hours
    +        LCT minutes
    +        LCT seconds
    +        day
    +        month
    +        year
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__eclipses.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__eclipses.html new file mode 100644 index 0000000000000000000000000000000000000000..4cbdf90cdcdc608ea2b3ea0256720fe808a377ee --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__eclipses.html @@ -0,0 +1,383 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_eclipses Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_eclipses Namespace Reference
    +
    +
    + + + + + + + + + + +

    +Functions

    def lunar_eclipse_occurrence (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def lunar_eclipse_circumstances (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def solar_eclipse_occurrence (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def solar_eclipse_circumstances (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours, geog_longitude_deg, geog_latitude_deg)
     
    +

    Function Documentation

    + +

    ◆ lunar_eclipse_circumstances()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_eclipses.lunar_eclipse_circumstances ( local_date_day,
     local_date_month,
     local_date_year,
     is_daylight_saving,
     zone_correction_hours 
    )
    +
    +
        Calculate the circumstances of a lunar eclipse.
    +
    +    Arguments:
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +
    +    Returns:
    +        lunar_eclipse_certain_date_day -- Lunar eclipse date (day)
    +        lunar_eclipse_certain_date_month -- Lunar eclipse date (month)
    +        lunar_eclipse_certain_date_year -- Lunar eclipse date (year)
    +        ut_start_pen_phase_hour -- Start of penumbral phase (hour)
    +        ut_start_pen_phase_minutes -- Start of penumbral phase (minutes)
    +        ut_start_umbral_phase_hour -- Start of umbral phase (hour)
    +        ut_start_umbral_phase_minutes -- Start of umbral phase (minutes)
    +        ut_start_total_phase_hour -- Start of total phase (hour)
    +        ut_start_total_phase_minutes -- Start of total phase (minutes)
    +        ut_mid_eclipse_hour -- Mid-eclipse (hour)
    +        ut_mid_eclipse_minutes -- Mid-eclipse (minutes)
    +        ut_end_total_phase_hour -- End of total phase (hour)
    +        ut_end_total_phase_minutes -- End of total phase (minutes)
    +        ut_end_umbral_phase_hour -- End of umbral phase (hour)
    +        ut_end_umbral_phase_minutes -- End of umbral phase (minutes)
    +        ut_end_pen_phase_hour -- End of penumbral phase (hour)
    +        ut_end_pen_phase_minutes -- End of penumbral phase (minutes)
    +        eclipse_magnitude -- Eclipse magnitude
    +
    +
    + +

    ◆ lunar_eclipse_occurrence()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_eclipses.lunar_eclipse_occurrence ( local_date_day,
     local_date_month,
     local_date_year,
     is_daylight_saving,
     zone_correction_hours 
    )
    +
    +
        Determine if a lunar eclipse is likely to occur.
    +
    +    Arguments:
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +
    +    Returns:
    +        status -- One of "Lunar eclipse certain", "Lunar eclipse possible", or "No lunar eclipse".
    +        event_date_day -- Date of eclipse event (day).
    +        event_date_month -- Date of eclipse event (month).
    +        event_date_year -- Date of eclipse event (year).
    +
    +
    + +

    ◆ solar_eclipse_circumstances()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_eclipses.solar_eclipse_circumstances ( local_date_day,
     local_date_month,
     local_date_year,
     is_daylight_saving,
     zone_correction_hours,
     geog_longitude_deg,
     geog_latitude_deg 
    )
    +
    +
        Calculate the circumstances of a lunar eclipse.
    +
    +    Arguments:
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        geog_longitude_deg -- Geographical longitude of observer.
    +        geog_latitude_deg -- Geographical latitude of observer.
    +
    +    Returns:
    +        solar_eclipse_certain_date_day -- Solar eclipse date (day)
    +        solar_eclipse_certain_date_month -- Solar eclipse date (month)
    +        solar_eclipse_certain_date_year -- Solar eclipse date (year)
    +        ut_first_contact_hour -- First contact of shadow (hour)
    +        ut_first_contact_minutes -- First contact of shadow (minutes)
    +        ut_mid_eclipse_hour -- Mid-eclipse (hour)
    +        ut_mid_eclipse_minutes -- Mid-eclipse (minutes)
    +        ut_last_contact_hour -- Last contact of shadow (hour)
    +        ut_last_contact_minutes -- Last contact of shadow (minutes)
    +        eclipse_magnitude -- Eclipse magnitude
    +
    +
    + +

    ◆ solar_eclipse_occurrence()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_eclipses.solar_eclipse_occurrence ( local_date_day,
     local_date_month,
     local_date_year,
     is_daylight_saving,
     zone_correction_hours 
    )
    +
    +
        Determine if a solar eclipse is likely to occur.
    +
    +    Arguments:
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +
    +    Returns:
    +        status -- One of "Solar eclipse certain", "Solar eclipse possible", or "No solar eclipse".
    +        event_date_day -- Date of eclipse event (day).
    +        event_date_month -- Date of eclipse event (month).
    +        event_date_year -- Date of eclipse event (year).
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__macro.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__macro.html new file mode 100644 index 0000000000000000000000000000000000000000..b10862a384cc58e29a5ff01f24efdf16cce07881 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__macro.html @@ -0,0 +1,8525 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_macro Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_macro Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def cd_jd (day, month, year)
     
    def jdc_day (julianDate)
     
    def jdc_month (julianDate)
     
    def jdc_year (julianDate)
     
    def f_dow (julianDate)
     
    def hms_dh (hours, minutes, seconds)
     
    def dh_hour (decimalHours)
     
    def dh_min (decimalHours)
     
    def dh_sec (decimalHours)
     
    def lct_ut (lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear)
     
    def ut_lct (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_day (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_month (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_year (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def lct_gday (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def lct_gmonth (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def lct_gyear (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def ut_gst (u_hours, u_minutes, u_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def gst_lst (greenwich_hours, greenwich_minutes, greenwich_seconds, geographical_longitude)
     
    def lst_gst (local_hours, local_minutes, local_seconds, longitude)
     
    def gst_ut (greenwich_sidereal_hours, greenwich_sidereal_minutes, greenwich_sidereal_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def e_gst_ut (GSH, GSM, GSS, GD, GM, GY)
     
    def ra_ha (ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def ha_ra (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def dms_dd (degrees, minutes, seconds)
     
    def dd_deg (decimal_degrees)
     
    def dd_min (decimal_degrees)
     
    def dd_sec (decimal_degrees)
     
    def dd_dh (decimal_degrees)
     
    def dh_dd (degree_hours)
     
    def degrees (W)
     
    def atan2 (X, Y)
     
    def eq_az (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def eq_alt (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def hor_dec (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def hor_ha (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def nutat_obl (greenwich_day, greenwich_month, greenwich_year)
     
    def obliq (greenwich_day, greenwich_month, greenwich_year)
     
    def sun_long (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_dist (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_dia (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def true_anomaly (AM, EC)
     
    def eccentric_anomaly (AM, EC)
     
    def refract (Y2, SW, PR, TR)
     
    def refract_l3035 (PR, TR, Y, D)
     
    def parallax_ha (HH, HM, HS, DD, DM, DS, SW, GP, HT, HP)
     
    def parallax_ha_l2870 (X, Y, RC, RP, RS, TP)
     
    def parallax_dec (HH, HM, HS, DD, DM, DS, SW, GP, HT, HP)
     
    def parallax_dec_l2870 (X, Y, RC, RP, RS, TP)
     
    def unwind (W)
     
    def unwind_deg (W)
     
    def unwind_rad (W)
     
    def moon_long (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_lat (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_hp (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_dist (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_size (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def sun_e_long (GD, GM, GY)
     
    def sun_peri (GD, GM, GY)
     
    def sun_ecc (GD, GM, GY)
     
    def ec_dec (ELD, ELM, ELS, BD, BM, BS, GD, GM, GY)
     
    def ec_ra (ELD, ELM, ELS, BD, BM, BS, GD, GM, GY)
     
    def sun_true_anomaly (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_mean_anomaly (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sunrise_lct (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunrise_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunrise_az (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunrise_az_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunset_az (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunset_az_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunset_lct (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunset_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def e_sun_rs (LD, LM, LY, DS, ZC, GL, GP)
     
    def e_sun_rs_l3710 (GD, GM, GY, SR, DI, GP)
     
    def angle (XX1, XM1, XS1, DD1, DM1, DS1, XX2, XM2, XS2, DD2, DM2, DS2, S)
     
    def rise_set_local_sidereal_time_rise (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def e_rs (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_local_sidereal_time_set (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_azimuth_rise (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_azimuth_set (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def nutat_long (GD, GM, GY)
     
    def twilight_am_lct (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def twilight_am_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def twilight_pm_lct (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def twilight_pm_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def e_twilight (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def e_twilight_l3710 (GD, GM, GY, SR, DI, GP)
     
    def planet_coordinates (LH, LM, LS, DS, ZC, DY, MN, YR, S)
     
    def planet_long_l4685 (AP)
     
    def planet_long_l4735 (AP, MS, T)
     
    def planet_long_l4810 (AP, MS)
     
    def planet_long_l4945 (T, IP, PL)
     
    def solve_cubic (W)
     
    def p_comet_long_lat_dist (LH, LM, LS, DS, ZC, DY, MN, YR, TD, TM, TY, Q, I, P, N)
     
    def moon_long_lat_hp (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_phase (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_mean_anomaly (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def new_moon (DS, ZC, DY, MN, YR)
     
    def full_moon (DS, ZC, DY, MN, YR)
     
    def new_moon_full_moon_l6855 (K, T)
     
    def moon_rise_lct (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_lct_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_lct_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def e_moon_rise (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def e_moon_rise_l6680 (S3, G1, UT, DS, ZC, GDY, GMN, GYR, DY1, MN1, YR1)
     
    def e_moon_rise_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_rise_lc_dmy (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_lc_dmy_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_lc_dmy_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_rise_az (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_az_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_az_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_lct (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_lct_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_lct_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def e_moon_set (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def e_moon_set_l6680 (X, S3, G1, UT, DS, ZC, GDY, GMN, GYR, DY1, MN1, YR1)
     
    def e_moon_set_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_lc_dmy (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_lc_dmy_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_lc_dmy_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_az (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_az_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_az_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def lunar_eclipse_occurrence (DS, ZC, DY, MN, YR)
     
    def lunar_eclipse_occurrence_l6855 (T, K)
     
    def mag_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_end_total_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_end_umbra_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_first_contact_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_last_contact_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_max_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_start_total_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_start_umbra_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def solar_eclipse_occurrence (DS, ZC, DY, MN, YR)
     
    def solar_eclipse_occurrence_l6855 (T, K)
     
    def mag_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def mag_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_first_contact_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_first_contact_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_last_contact_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_last_contact_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_max_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_max_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def fract (W)
     
    def lint (W)
     
    def iint (W)
     
    def sgn (number_to_check)
     
    def ut_day_adjust (UT, G1)
     
    def f_part (W)
     
    def eq_e_lat (RAH, RAM, RAS, DD, DM, DS, GD, GM, GY)
     
    def eq_e_long (RAH, RAM, RAS, DD, DM, DS, GD, GM, GY)
     
    +

    Function Documentation

    + +

    ◆ angle()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.angle ( XX1,
     XM1,
     XS1,
     DD1,
     DM1,
     DS1,
     XX2,
     XM2,
     XS2,
     DD2,
     DM2,
     DS2,
     S 
    )
    +
    +
        Calculate the angle between two celestial objects
    +    
    +    Original macro name: Angle
    +
    +
    + +

    ◆ atan2()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.atan2 ( X,
     Y 
    )
    +
    +
        Custom ATAN2 function
    +    
    +    Original macro name: Atan2
    +
    +
    + +

    ◆ cd_jd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.cd_jd ( day,
     month,
     year 
    )
    +
    +
        Convert a Greenwich Date/Civil Date (day,month,year) to Julian Date
    +
    +    Original macro name: CDJD
    +
    +
    + +

    ◆ dd_deg()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dd_deg ( decimal_degrees)
    +
    +
        Return Degrees part of Decimal Degrees
    +    
    +    Original macro name: DDDeg
    +
    +
    + +

    ◆ dd_dh()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dd_dh ( decimal_degrees)
    +
    +
        Convert Decimal Degrees to Degree-Hours
    +    
    +    Original macro name: DDDH
    +
    +
    + +

    ◆ dd_min()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dd_min ( decimal_degrees)
    +
    +
        Return Minutes part of Decimal Degrees
    +    
    +    Original macro name: DDMin
    +
    +
    + +

    ◆ dd_sec()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dd_sec ( decimal_degrees)
    +
    +
        Return Seconds part of Decimal Degrees
    +    
    +    Original macro name: DDSec
    +
    +
    + +

    ◆ degrees()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.degrees ( W)
    +
    +
        Convert W to Degrees
    +    
    +    Original macro name: Degrees
    +
    +
    + +

    ◆ dh_dd()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dh_dd ( degree_hours)
    +
    +
        Convert Degree-Hours to Decimal Degrees
    +    
    +    Original macro name: DHDD
    +
    +
    + +

    ◆ dh_hour()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dh_hour ( decimalHours)
    +
    +
        Return the hour part of a Decimal Hours
    +    
    +    Original macro name: DHHour
    +
    +
    + +

    ◆ dh_min()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dh_min ( decimalHours)
    +
    +
        Return the minutes part of a Decimal Hours
    +    
    +    Original macro name: DHMin
    +
    +
    + +

    ◆ dh_sec()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.dh_sec ( decimalHours)
    +
    +
        Return the seconds part of a Decimal Hours
    +    
    +    Original macro name: DHSec
    +
    +
    + +

    ◆ dms_dd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.dms_dd ( degrees,
     minutes,
     seconds 
    )
    +
    +
        Convert Degrees Minutes Seconds to Decimal Degrees
    +    
    +    Original macro name: DMSDD
    +
    +
    + +

    ◆ e_gst_ut()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_gst_ut ( GSH,
     GSM,
     GSS,
     GD,
     GM,
     GY 
    )
    +
    +
        Status of conversion of Greenwich Sidereal Time to Universal Time.
    +
    +    Original macro name: eGSTUT
    +
    +
    + +

    ◆ e_moon_rise()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_rise ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Moonrise calculation status.
    +
    +    Original macro name: eMoonRise
    +
    +
    + +

    ◆ e_moon_rise_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_rise_l6680 ( S3,
     G1,
     UT,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     DY1,
     MN1,
     YR1 
    )
    +
    +
     Helper function for e_moon_rise() 
    +
    +
    + +

    ◆ e_moon_rise_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_rise_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for e_moon_rise() 
    +
    +
    + +

    ◆ e_moon_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_set ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Moonset calculation status.
    +
    +    Original macro name: eMoonSet
    +
    +
    + +

    ◆ e_moon_set_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_set_l6680 ( X,
     S3,
     G1,
     UT,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     DY1,
     MN1,
     YR1 
    )
    +
    +
     Helper function for e_moon_set() 
    +
    +
    + +

    ◆ e_moon_set_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_moon_set_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for e_moon_set() 
    +
    +
    + +

    ◆ e_rs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_rs ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     VD,
     G 
    )
    +
    +
        Rise/Set status
    +
    +    Possible values: "OK", "** never rises", "** circumpolar"
    +
    +    Original macro name: eRS
    +
    +
    + +

    ◆ e_sun_rs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_sun_rs ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP 
    )
    +
    +
        Sunrise/Sunset calculation status.
    +
    +    Original macro name: eSunRS
    +
    +
    + +

    ◆ e_sun_rs_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_sun_rs_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for e_sun_rs(). 
    +
    +
    + +

    ◆ e_twilight()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_twilight ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP,
     TT 
    )
    +
    +
        Twilight calculation status.
    +
    +    Twilight type can be one of "C" (civil), "N" (nautical), or "A" (astronomical)
    +
    +    Original macro name: eTwilight
    +
    +    Returns:
    +        One of: "OK", "** lasts all night", or "** Sun too far below horizon"
    +
    +
    + +

    ◆ e_twilight_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.e_twilight_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for e_twilight(). 
    +
    +
    + +

    ◆ ec_dec()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ec_dec ( ELD,
     ELM,
     ELS,
     BD,
     BM,
     BS,
     GD,
     GM,
     GY 
    )
    +
    +
        Ecliptic - Declination (degrees)
    +    
    +    Original macro name: ECDec
    +
    +
    + +

    ◆ ec_ra()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ec_ra ( ELD,
     ELM,
     ELS,
     BD,
     BM,
     BS,
     GD,
     GM,
     GY 
    )
    +
    +
        Ecliptic - Right Ascension (degrees)
    +    
    +    Original macro name: ECRA
    +
    +
    + +

    ◆ eccentric_anomaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.eccentric_anomaly ( AM,
     EC 
    )
    +
    +
        Solve Kepler's equation, and return value of the eccentric anomaly in radians
    +    
    +    Original macro name: EccentricAnomaly
    +
    +
    + +

    ◆ eq_alt()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.eq_alt ( hour_angle_hours,
     hour_angle_minutes,
     hour_angle_seconds,
     declination_degrees,
     declination_minutes,
     declination_seconds,
     geographical_latitude 
    )
    +
    +
        Convert Equatorial Coordinates to Altitude (in decimal degrees)
    +    
    +    Original macro name: EQAlt
    +
    +
    + +

    ◆ eq_az()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.eq_az ( hour_angle_hours,
     hour_angle_minutes,
     hour_angle_seconds,
     declination_degrees,
     declination_minutes,
     declination_seconds,
     geographical_latitude 
    )
    +
    +
        Convert Equatorial Coordinates to Azimuth (in decimal degrees)
    +    
    +    Original macro name: EQAz
    +
    +
    + +

    ◆ eq_e_lat()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.eq_e_lat ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     GD,
     GM,
     GY 
    )
    +
    +
        Original macro name: EQElat
    +
    +
    + +

    ◆ eq_e_long()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.eq_e_long ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     GD,
     GM,
     GY 
    )
    +
    +
        Original macro name: EQElong
    +
    +
    + +

    ◆ f_dow()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.f_dow ( julianDate)
    +
    +
        Convert a Julian Date to Day-of-Week (e.g., Sunday)
    +    
    +    Original macro name: FDOW
    +
    +
    + +

    ◆ f_part()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.f_part ( W)
    +
    +
        Original macro name: Fpart
    +
    +
    + +

    ◆ fract()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.fract ( W)
    +
    +
        Original macro name: FRACT
    +
    +
    + +

    ◆ full_moon()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.full_moon ( DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate Julian date of Full Moon.
    +
    +    Original macro name: FullMoon
    +
    +    Arguments:
    +        DS -- Daylight Savings offset.
    +        ZC -- Time zone correction, in hours.
    +        DY -- Local date, day part.
    +        MN -- Local date, month part.
    +        YR -- Local date, year part.
    +
    +
    + +

    ◆ gst_lst()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.gst_lst ( greenwich_hours,
     greenwich_minutes,
     greenwich_seconds,
     geographical_longitude 
    )
    +
    +
        Convert Greenwich Sidereal Time to Local Sidereal Time
    +    
    +    Original macro name: GSTLST
    +
    +
    + +

    ◆ gst_ut()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.gst_ut ( greenwich_sidereal_hours,
     greenwich_sidereal_minutes,
     greenwich_sidereal_seconds,
     greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
        Convert Greenwich Sidereal Time to Universal Time
    +    
    +    Original macro name: GSTUT
    +
    +
    + +

    ◆ ha_ra()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ha_ra ( hour_angle_hours,
     hour_angle_minutes,
     hour_angle_seconds,
     lct_hours,
     lct_minutes,
     lct_seconds,
     daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year,
     geographical_longitude 
    )
    +
    +
        Convert Hour Angle to Right Ascension
    +    
    +    Original macro name: HARA
    +
    +
    + +

    ◆ hms_dh()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.hms_dh ( hours,
     minutes,
     seconds 
    )
    +
    +
        Convert a Civil Time (hours,minutes,seconds) to Decimal Hours
    +    
    +    Original macro name: HMSDH
    +
    +
    + +

    ◆ hor_dec()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.hor_dec ( azimuth_degrees,
     azimuth_minutes,
     azimuth_seconds,
     altitude_degrees,
     altitude_minutes,
     altitude_seconds,
     geographical_latitude 
    )
    +
    +
        Convert Horizon Coordinates to Declination (in decimal degrees)
    +    
    +    Original macro name: HORDec
    +
    +
    + +

    ◆ hor_ha()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.hor_ha ( azimuth_degrees,
     azimuth_minutes,
     azimuth_seconds,
     altitude_degrees,
     altitude_minutes,
     altitude_seconds,
     geographical_latitude 
    )
    +
    +
        Convert Horizon Coordinates to Hour Angle (in decimal degrees)
    +    
    +    Original macro name: HORHa
    +
    +
    + +

    ◆ iint()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.iint ( W)
    +
    +
        Original macro name: IINT
    +
    +
    + +

    ◆ jdc_day()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.jdc_day ( julianDate)
    +
    +
        Returns the day part of a Julian Date
    +
    +    Original macro name: JDCDay
    +
    +
    + +

    ◆ jdc_month()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.jdc_month ( julianDate)
    +
    +
        Returns the month part of a Julian Date
    +    
    +    Original macro name: JDCMonth
    +
    +
    + +

    ◆ jdc_year()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.jdc_year ( julianDate)
    +
    +
        Returns the year part of a Julian Date
    +    
    +    Original macro name: JDCYear
    +
    +
    + +

    ◆ lct_gday()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lct_gday ( lct_hours,
     lct_minutes,
     lct_seconds,
     daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year 
    )
    +
    +
        Determine Greenwich Day for Local Time
    +    
    +    Original macro name: LctGDay
    +
    +
    + +

    ◆ lct_gmonth()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lct_gmonth ( lct_hours,
     lct_minutes,
     lct_seconds,
     daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year 
    )
    +
    +
        Determine Greenwich Month for Local Time
    +    
    +    Original macro name: LctGMonth
    +
    +
    + +

    ◆ lct_gyear()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lct_gyear ( lct_hours,
     lct_minutes,
     lct_seconds,
     daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year 
    )
    +
    +
        Determine Greenwich Year for Local Time
    +    
    +    Original macro name: LctGYear
    +
    +
    + +

    ◆ lct_ut()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lct_ut ( lctHours,
     lctMinutes,
     lctSeconds,
     daylightSaving,
     zoneCorrection,
     localDay,
     localMonth,
     localYear 
    )
    +
    +
        Convert Local Civil Time to Universal Time
    +     
    +    Original macro name: LctUT
    +
    +
    + +

    ◆ lint()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.lint ( W)
    +
    +
        Original macro name: LINT
    +
    +
    + +

    ◆ lst_gst()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lst_gst ( local_hours,
     local_minutes,
     local_seconds,
     longitude 
    )
    +
    +
        Convert Local Sidereal Time to Greenwich Sidereal Time
    +    
    +    Original macro name: LSTGST
    +
    +
    + +

    ◆ lunar_eclipse_occurrence()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lunar_eclipse_occurrence ( DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Determine if a lunar eclipse is likely to occur.
    +
    +    Original macro name: LEOccurrence
    +
    +
    + +

    ◆ lunar_eclipse_occurrence_l6855()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.lunar_eclipse_occurrence_l6855 ( T,
     K 
    )
    +
    +
     Helper function for lunar_eclipse_occurrence 
    +
    +
    + +

    ◆ mag_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.mag_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate magnitude of lunar eclipse.
    +
    +    Original macro name: MagLunarEclipse
    +
    +
    + +

    ◆ mag_solar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.mag_solar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Calculate magnitude of solar eclipse.
    +
    +    Original macro name: MagSolarEclipse
    +
    +
    + +

    ◆ mag_solar_eclipse_l7390()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.mag_solar_eclipse_l7390 ( X,
     Y,
     IGDay,
     GMonth,
     GYear,
     TM,
     GLong,
     GLat,
     HP 
    )
    +
    +
     Helper function for mag_solar_eclipse 
    +
    +
    + +

    ◆ moon_dist()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_dist ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate distance from the Earth to the Moon (km)
    +
    +    Original macro name: MoonDist
    +
    +
    + +

    ◆ moon_hp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_hp ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate horizontal parallax for the Moon
    +    
    +    Original macro name: MoonHP
    +
    +
    + +

    ◆ moon_lat()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_lat ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate geocentric ecliptic latitude for the Moon
    +    
    +    Original macro name: MoonLat
    +
    +
    + +

    ◆ moon_long()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_long ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate geocentric ecliptic longitude for the Moon
    +    
    +    Original macro name: MoonLong
    +
    +
    + +

    ◆ moon_long_lat_hp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_long_lat_hp ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate longitude, latitude, and horizontal parallax of the Moon.
    +
    +    Original macro names: MoonLong, MoonLat, MoonHP
    +
    +    Arguments:
    +        LH -- Local civil time, hour part.
    +        LM -- Local civil time, minutes part.
    +        LS -- Local civil time, seconds part.
    +        DS -- Daylight Savings offset.
    +        ZC -- Time zone correction, in hours.
    +        DY -- Local date, day part.
    +        MN -- Local date, month part.
    +        YR -- Local date, year part.
    +
    +    Returns:
    +        moon_long_deg -- Moon longitude (degrees)
    +        moon_lat_deg -- Moon latitude (degrees)
    +        moon_hor_para -- Moon horizontal parallax (degrees)
    +
    +
    + +

    ◆ moon_mean_anomaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_mean_anomaly ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate the Moon's mean anomaly.
    +
    +    Original macro name: MoonMeanAnomaly
    +
    +
    + +

    ◆ moon_phase()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_phase ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate current phase of Moon.
    +
    +    Original macro name: MoonPhase
    +
    +
    + +

    ◆ moon_rise_az()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_az ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local azimuth of moonrise.
    +
    +    Original macro name: MoonRiseAz
    +
    +    Returns:
    +        degrees
    +
    +
    + +

    ◆ moon_rise_az_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_az_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_rise_az 
    +
    +
    + +

    ◆ moon_rise_az_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_az_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_rise_az 
    +
    +
    + +

    ◆ moon_rise_lc_dmy()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lc_dmy ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local date of moonrise.
    +    
    +    Original macro names: MoonRiseLcDay, MoonRiseLcMonth, MoonRiseLcYear
    +
    +    Returns:
    +        Local date (day)
    +        Local date (month)
    +        Local date (year)
    +
    +
    + +

    ◆ moon_rise_lc_dmy_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lc_dmy_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_rise_lc_dmy 
    +
    +
    + +

    ◆ moon_rise_lc_dmy_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lc_dmy_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_rise_lc_dmy 
    +
    +
    + +

    ◆ moon_rise_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lct ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local time of moonrise.
    +
    +    Original macro name: MoonRiseLCT
    +
    +    Returns:
    +        hours
    +
    +
    + +

    ◆ moon_rise_lct_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lct_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_rise_lct 
    +
    +
    + +

    ◆ moon_rise_lct_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_rise_lct_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_rise_lct 
    +
    +
    + +

    ◆ moon_set_az()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_az ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local azimuth of moonset.
    +
    +    Original macro name: MoonSetAz
    +
    +    Returns:
    +        degrees
    +
    +
    + +

    ◆ moon_set_az_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_az_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_set_az 
    +
    +
    + +

    ◆ moon_set_az_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_az_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_set_az 
    +
    +
    + +

    ◆ moon_set_lc_dmy()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lc_dmy ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local date of moonset.
    +    
    +    Original macro names: MoonSetLcDay, MoonSetLcMonth, MoonSetLcYear
    +
    +    Returns:
    +        Local date (day)
    +        Local date (month)
    +        Local date (year)
    +
    +
    + +

    ◆ moon_set_lc_dmy_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lc_dmy_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_set_lc_dmy 
    +
    +
    + +

    ◆ moon_set_lc_dmy_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lc_dmy_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_set_lc_dmy 
    +
    +
    + +

    ◆ moon_set_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lct ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Local time of moonset.
    +
    +    Original macro name: MoonSetLCT
    +
    +    Returns:
    +        hours
    +
    +
    + +

    ◆ moon_set_lct_l6680()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lct_l6680 ( X,
     DS,
     ZC,
     GDY,
     GMN,
     GYR,
     G1,
     UT 
    )
    +
    +
     Helper function for moon_set_lct 
    +
    +
    + +

    ◆ moon_set_lct_l6700()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_set_lct_l6700 ( LCT,
     DS,
     ZC,
     DY1,
     MN1,
     YR1,
     GDY,
     GMN,
     GYR,
     GLat 
    )
    +
    +
     Helper function for moon_set_lct 
    +
    +
    + +

    ◆ moon_size()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.moon_size ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate the Moon's angular diameter (degrees)
    +
    +    Original macro name: MoonSize
    +
    +
    + +

    ◆ new_moon()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.new_moon ( DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Calculate Julian date of New Moon.
    +
    +    Original macro name: NewMoon
    +
    +    Arguments:
    +        DS -- Daylight Savings offset.
    +        ZC -- Time zone correction, in hours.
    +        DY -- Local date, day part.
    +        MN -- Local date, month part.
    +        YR -- Local date, year part.
    +
    +
    + +

    ◆ new_moon_full_moon_l6855()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.new_moon_full_moon_l6855 ( K,
     T 
    )
    +
    +
     Helper function for new_moon() and full_moon() 
    +
    +
    + +

    ◆ nutat_long()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.nutat_long ( GD,
     GM,
     GY 
    )
    +
    +
        Nutation amount to be added in ecliptic longitude, in degrees.
    +
    +    Original macro name: NutatLong
    +
    +
    + +

    ◆ nutat_obl()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.nutat_obl ( greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
        Nutation of Obliquity
    +    
    +    Original macro name: NutatObl
    +
    +
    + +

    ◆ obliq()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.obliq ( greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
        Obliquity of the Ecliptic for a Greenwich Date
    +    
    +    Original macro name: Obliq
    +
    +
    + +

    ◆ p_comet_long_lat_dist()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.p_comet_long_lat_dist ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR,
     TD,
     TM,
     TY,
     Q,
     I,
     P,
     N 
    )
    +
    +
        Calculate longitude, latitude, and distance of parabolic-orbit comet.
    +
    +    Original macro names: PcometLong, PcometLat, PcometDist
    +
    +    Arguments:
    +        LH -- Local civil time, hour part.
    +        LM -- Local civil time, minutes part.
    +        LS -- Local civil time, seconds part.
    +        DS -- Daylight Savings offset.
    +        ZC -- Time zone correction, in hours.
    +        DY -- Local date, day part.
    +        MN -- Local date, month part.
    +        YR -- Local date, year part.
    +        TD -- Perihelion epoch (day)
    +        TM -- Perihelion epoch (month)
    +        TY -- Perihelion epoch (year)
    +        Q -- q (AU)
    +        I -- Inclination (degrees)
    +        P -- Perihelion (degrees)
    +        N -- Node (degrees)
    +
    +    Returns:
    +        comet_long_deg -- Comet longitude (degrees)
    +        comet_lat_deg -- Comet lat (degrees)
    +        comet_dist_au -- Comet distance from Earth (AU)
    +
    +
    + +

    ◆ parallax_dec()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.parallax_dec ( HH,
     HM,
     HS,
     DD,
     DM,
     DS,
     SW,
     GP,
     HT,
     HP 
    )
    +
    +
        Calculate corrected declination in decimal degrees
    +    
    +    Original macro name: ParallaxDec
    +
    +
    + +

    ◆ parallax_dec_l2870()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.parallax_dec_l2870 ( X,
     Y,
     RC,
     RP,
     RS,
     TP 
    )
    +
    +
     Helper function for parallax_dec 
    +
    +
    + +

    ◆ parallax_ha()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.parallax_ha ( HH,
     HM,
     HS,
     DD,
     DM,
     DS,
     SW,
     GP,
     HT,
     HP 
    )
    +
    +
        Calculate corrected hour angle in decimal hours
    +    
    +    Original macro name: ParallaxHA
    +
    +
    + +

    ◆ parallax_ha_l2870()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.parallax_ha_l2870 ( X,
     Y,
     RC,
     RP,
     RS,
     TP 
    )
    +
    +
     Helper function for parallax_ha 
    +
    +
    + +

    ◆ planet_coordinates()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.planet_coordinates ( LH,
     LM,
     LS,
     DS,
     ZC,
     DY,
     MN,
     YR,
     S 
    )
    +
    +
        Calculate several planetary properties.
    +
    +    Original macro names: PlanetLong, PlanetLat, PlanetDist, PlanetHLong1, PlanetHLong2, PlanetHLat, PlanetRVect
    +
    +    Arguments:
    +        LH -- Local civil time, hour part.
    +        LM -- Local civil time, minutes part.
    +        LS -- Local civil time, seconds part.
    +        DS -- Daylight Savings offset.
    +        ZC -- Time zone correction, in hours.
    +        DY -- Local date, day part.
    +        MN -- Local date, month part.
    +        YR -- Local date, year part.
    +        S -- Planet name.
    +
    +    Returns:
    +        planet_longitude -- Ecliptic longitude, in degrees.
    +        planet_latitude -- Ecliptic latitude, in degrees.
    +        planet_distance_au -- Earth-planet distance, in AU.
    +        planet_h_long1 -- Heliocentric orbital longitude, in degrees.
    +        planet_h_long2 -- NOT USED
    +        planet_h_lat -- NOT USED
    +        planet_r_vect -- Sun-planet distance (length of radius vector), in AU.
    +
    +
    + +

    ◆ planet_long_l4685()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.planet_long_l4685 ( AP)
    +
    +
     Helper function for planet_long_lat() 
    +
    +
    + +

    ◆ planet_long_l4735()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.planet_long_l4735 ( AP,
     MS,
     T 
    )
    +
    +
     Helper function for planet_long_lat() 
    +
    +
    + +

    ◆ planet_long_l4810()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.planet_long_l4810 ( AP,
     MS 
    )
    +
    +
     Helper function for planet_long_lat() 
    +
    +
    + +

    ◆ planet_long_l4945()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.planet_long_l4945 ( T,
     IP,
     PL 
    )
    +
    +
     Helper function for planet_long_lat() 
    +
    +
    + +

    ◆ ra_ha()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ra_ha ( ra_hours,
     ra_minutes,
     ra_seconds,
     lct_hours,
     lct_minutes,
     lct_seconds,
     daylight_saving,
     zone_correction,
     local_day,
     local_month,
     local_year,
     geographical_longitude 
    )
    +
    +
        Convert Right Ascension to Hour Angle
    +    
    +    Original macro name: RAHA
    +
    +
    + +

    ◆ refract()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.refract ( Y2,
     SW,
     PR,
     TR 
    )
    +
    +
        Calculate effects of refraction
    +    
    +    Original macro name: Refract
    +
    +
    + +

    ◆ refract_l3035()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.refract_l3035 ( PR,
     TR,
     Y,
     D 
    )
    +
    +
     Helper function for refract 
    +
    +
    + +

    ◆ rise_set_azimuth_rise()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.rise_set_azimuth_rise ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     VD,
     G 
    )
    +
    +
        Azimuth of rising, in degrees.
    +    
    +    Original macro name: RSAZR
    +
    +
    + +

    ◆ rise_set_azimuth_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.rise_set_azimuth_set ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     VD,
     G 
    )
    +
    +
        Azimuth of setting, in degrees.
    +
    +    Original macro name: RSAZS
    +
    +
    + +

    ◆ rise_set_local_sidereal_time_rise()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.rise_set_local_sidereal_time_rise ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     VD,
     G 
    )
    +
    +
        Local sidereal time of rise, in hours.
    +
    +    Original macro name: RSLSTR
    +
    +
    + +

    ◆ rise_set_local_sidereal_time_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.rise_set_local_sidereal_time_set ( RAH,
     RAM,
     RAS,
     DD,
     DM,
     DS,
     VD,
     G 
    )
    +
    +
        Local sidereal time of setting, in hours.
    +
    +    Original macro name: RSLSTS
    +
    +
    + +

    ◆ sgn()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.sgn ( number_to_check)
    +
    +
        Calculate sign of number.
    +
    +    Arguments:
    +        number_to_check -- Number to calculate the sign of.
    +
    +    Returns:
    +        sign_value -- Sign value: -1, 0, or 1
    +
    +
    + +

    ◆ solar_eclipse_occurrence()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.solar_eclipse_occurrence ( DS,
     ZC,
     DY,
     MN,
     YR 
    )
    +
    +
        Determine if a solar eclipse is likely to occur.
    +
    +    Original macro name: SEOccurrence
    +
    +
    + +

    ◆ solar_eclipse_occurrence_l6855()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.solar_eclipse_occurrence_l6855 ( T,
     K 
    )
    +
    +
     Helper function for solar_eclipse_occurrence 
    +
    +
    + +

    ◆ solve_cubic()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.solve_cubic ( W)
    +
    +
        For W, in radians, return S, also in radians.
    +
    +    Original macro name: SolveCubic
    +
    +
    + +

    ◆ sun_dia()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_dia ( LCH,
     LCM,
     LCS,
     DS,
     ZC,
     LD,
     LM,
     LY 
    )
    +
    +
        Calculate Sun's angular diameter in decimal degrees
    +    
    +    Original macro name: SunDia
    +
    +
    + +

    ◆ sun_dist()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_dist ( LCH,
     LCM,
     LCS,
     DS,
     ZC,
     LD,
     LM,
     LY 
    )
    +
    +
        Calculate Sun's distance from the Earth in astronomical units
    +    
    +    Original macro name: SunDist
    +
    +
    + +

    ◆ sun_e_long()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_e_long ( GD,
     GM,
     GY 
    )
    +
    +
        Mean ecliptic longitude of the Sun at the epoch
    +    
    +    Original macro name: SunElong
    +
    +
    + +

    ◆ sun_ecc()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_ecc ( GD,
     GM,
     GY 
    )
    +
    +
        Eccentricity of the Sun-Earth orbit
    +    
    +    Original macro name: SunEcc
    +
    +
    + +

    ◆ sun_long()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_long ( LCH,
     LCM,
     LCS,
     DS,
     ZC,
     LD,
     LM,
     LY 
    )
    +
    +
        Calculate Sun's ecliptic longitude
    +    
    +    Original macro name: SunLong
    +
    +
    + +

    ◆ sun_mean_anomaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_mean_anomaly ( LCH,
     LCM,
     LCS,
     DS,
     ZC,
     LD,
     LM,
     LY 
    )
    +
    +
        Calculate the Sun's mean anomaly.
    +
    +    Original macro name: SunMeanAnomaly
    +
    +
    + +

    ◆ sun_peri()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_peri ( GD,
     GM,
     GY 
    )
    +
    +
        Longitude of the Sun at perigee
    +    
    +    Original macro name: SunPeri
    +
    +
    + +

    ◆ sun_true_anomaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sun_true_anomaly ( LCH,
     LCM,
     LCS,
     DS,
     ZC,
     LD,
     LM,
     LY 
    )
    +
    +
        Calculate Sun's true anomaly, i.e., how much its orbit deviates from a true circle to an ellipse.
    +    
    +    Original macro name: SunTrueAnomaly
    +
    +
    + +

    ◆ sunrise_az()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunrise_az ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP 
    )
    +
    +
        Calculate azimuth of sunrise.
    +
    +    Original macro name: SunriseAz
    +
    +
    + +

    ◆ sunrise_az_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunrise_az_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for sunrise_az(). 
    +
    +
    + +

    ◆ sunrise_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunrise_lct ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP 
    )
    +
    +
        Calculate local civil time of sunrise.
    +
    +    Original macro name: SunriseLCT
    +
    +
    + +

    ◆ sunrise_lct_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunrise_lct_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for sunrise_lct(). 
    +
    +
    + +

    ◆ sunset_az()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunset_az ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP 
    )
    +
    +
        Calculate azimuth of sunset.
    +
    +    Original macro name: SunsetAz
    +
    +
    + +

    ◆ sunset_az_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunset_az_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for sunset_az(). 
    +
    +
    + +

    ◆ sunset_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunset_lct ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP 
    )
    +
    +
        Calculate local civil time of sunset.
    +
    +    Original macro name: SunsetLCT
    +
    +
    + +

    ◆ sunset_lct_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.sunset_lct_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for sunset_lct(). 
    +
    +
    + +

    ◆ true_anomaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.true_anomaly ( AM,
     EC 
    )
    +
    +
        Solve Kepler's equation, and return value of the true anomaly in radians
    +    
    +    Original macro name: TrueAnomaly
    +
    +
    + +

    ◆ twilight_am_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.twilight_am_lct ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP,
     TT 
    )
    +
    +
        Calculate morning twilight start, in local time.
    +
    +    Twilight type (TT) can be one of "C" (civil), "N" (nautical), or "A" (astronomical)
    +
    +    Original macro name: TwilightAMLCT
    +
    +
    + +

    ◆ twilight_am_lct_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.twilight_am_lct_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for twilight_am_lct(). 
    +
    +
    + +

    ◆ twilight_pm_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.twilight_pm_lct ( LD,
     LM,
     LY,
     DS,
     ZC,
     GL,
     GP,
     TT 
    )
    +
    +
        Calculate evening twilight end, in local time.
    +
    +    Twilight type can be one of "C" (civil), "N" (nautical), or "A" (astronomical)
    +
    +    Original macro name: TwilightPMLCT
    +
    +
    + +

    ◆ twilight_pm_lct_l3710()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.twilight_pm_lct_l3710 ( GD,
     GM,
     GY,
     SR,
     DI,
     GP 
    )
    +
    +
     Helper function for twilight_pm_lct(). 
    +
    +
    + +

    ◆ unwind()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.unwind ( W)
    +
    +
        Convert angle in radians to equivalent angle in degrees.
    +    
    +    Original macro name: Unwind
    +
    +
    + +

    ◆ unwind_deg()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.unwind_deg ( W)
    +
    +
        Convert angle in degrees to equivalent angle in the range 0 to 360 degrees.
    +
    +    Original macro name: UnwindDeg
    +
    +
    + +

    ◆ unwind_rad()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_macro.unwind_rad ( W)
    +
    +
        Convert angle in radians to equivalent angle in degrees.
    +
    +    Original macro name: UnwindRad
    +
    +
    + +

    ◆ ut_day_adjust()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_day_adjust ( UT,
     G1 
    )
    +
    +
        Original macro name: UTDayAdjust
    +
    +
    + +

    ◆ ut_end_total_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_end_total_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate end time of total phase of lunar eclipse (UT)
    +
    +    Original macro name: UTEndTotalLunarEclipse
    +
    +
    + +

    ◆ ut_end_umbra_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_end_umbra_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate end time of umbra phase of lunar eclipse (UT)
    +
    +    Original macro name: UTEndUmbraLunarEclipse
    +
    +
    + +

    ◆ ut_first_contact_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_first_contact_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate time of first shadow contact for lunar eclipse (UT)
    +
    +    Original macro name: UTFirstContactLunarEclipse
    +
    +
    + +

    ◆ ut_first_contact_solar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_first_contact_solar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Calculate time of first contact for solar eclipse (UT)
    +
    +    Original macro name: UTFirstContactSolarEclipse
    +
    +
    + +

    ◆ ut_first_contact_solar_eclipse_l7390()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_first_contact_solar_eclipse_l7390 ( X,
     Y,
     IGDay,
     GMonth,
     GYear,
     TM,
     GLong,
     GLat,
     HP 
    )
    +
    +
     Helper function for ut_first_contact_solar_eclipse 
    +
    +
    + +

    ◆ ut_gst()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_gst ( u_hours,
     u_minutes,
     u_seconds,
     greenwich_day,
     greenwich_month,
     greenwich_year 
    )
    +
    +
        Convert Universal Time to Greenwich Sidereal Time
    +    
    +    Original macro name: UTGST
    +
    +
    + +

    ◆ ut_last_contact_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_last_contact_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate time of last shadow contact for lunar eclipse (UT)
    +
    +    Original macro name: UTLastContactLunarEclipse
    +
    +
    + +

    ◆ ut_last_contact_solar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_last_contact_solar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Calculate time of last contact for solar eclipse (UT)
    +
    +    Original macro name: UTLastContactSolarEclipse
    +
    +
    + +

    ◆ ut_last_contact_solar_eclipse_l7390()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_last_contact_solar_eclipse_l7390 ( X,
     Y,
     IGDay,
     GMonth,
     GYear,
     TM,
     GLong,
     GLat,
     HP 
    )
    +
    +
     Helper function for ut_last_contact_solar_eclipse 
    +
    +
    + +

    ◆ ut_lc_day()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_lc_day ( uHours,
     uMinutes,
     uSeconds,
     daylightSaving,
     zoneCorrection,
     greenwichDay,
     greenwichMonth,
     greenwichYear 
    )
    +
    +
        Get Local Civil Day for Universal Time
    +    
    +    Original macro name: UTLcDay
    +
    +
    + +

    ◆ ut_lc_month()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_lc_month ( uHours,
     uMinutes,
     uSeconds,
     daylightSaving,
     zoneCorrection,
     greenwichDay,
     greenwichMonth,
     greenwichYear 
    )
    +
    +
        Get Local Civil Month for Universal Time
    +    
    +    Original macro name: UTLcMonth
    +
    +
    + +

    ◆ ut_lc_year()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_lc_year ( uHours,
     uMinutes,
     uSeconds,
     daylightSaving,
     zoneCorrection,
     greenwichDay,
     greenwichMonth,
     greenwichYear 
    )
    +
    +
        Get Local Civil Year for Universal Time
    +    
    +    Original macro name: UTLcYear
    +
    +
    + +

    ◆ ut_lct()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_lct ( uHours,
     uMinutes,
     uSeconds,
     daylightSaving,
     zoneCorrection,
     greenwichDay,
     greenwichMonth,
     greenwichYear 
    )
    +
    +
        Convert Universal Time to Local Civil Time
    +
    +    Original macro name: UTLct  
    +
    +
    + +

    ◆ ut_max_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_max_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate time of maximum shadow for lunar eclipse (UT)
    +
    +    Original macro name: UTMaxLunarEclipse
    +
    +
    + +

    ◆ ut_max_solar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_max_solar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC,
     GLong,
     GLat 
    )
    +
    +
        Calculate time of maximum shadow for solar eclipse (UT)
    +
    +    Original macro name: UTMaxSolarEclipse
    +
    +
    + +

    ◆ ut_max_solar_eclipse_l7390()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_max_solar_eclipse_l7390 ( X,
     Y,
     IGDay,
     GMonth,
     GYear,
     TM,
     GLong,
     GLat,
     HP 
    )
    +
    +
     Helper function for ut_max_solar_eclipse 
    +
    +
    + +

    ◆ ut_start_total_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_start_total_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate start time of total phase of lunar eclipse (UT)
    +
    +    Original macro name: UTStartTotalLunarEclipse
    +
    +
    + +

    ◆ ut_start_umbra_lunar_eclipse()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_macro.ut_start_umbra_lunar_eclipse ( DY,
     MN,
     YR,
     DS,
     ZC 
    )
    +
    +
        Calculate start time of umbra phase of lunar eclipse (UT)
    +
    +    Original macro name: UTStartUmbraLunarEclipse
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__moon.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__moon.html new file mode 100644 index 0000000000000000000000000000000000000000..0b64a6be7421ee6399a8afa64015583408bde4af --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__moon.html @@ -0,0 +1,596 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_moon Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_moon Namespace Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Functions

    def approximate_position_of_moon (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def precise_position_of_moon (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moon_phase (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, accuracy_level="A")
     
    def times_of_new_moon_and_full_moon (is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moon_dist_ang_diam_hor_parallax (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moonrise_and_moonset (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours, geog_long_deg, geog_lat_deg)
     
    +

    Function Documentation

    + +

    ◆ approximate_position_of_moon()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.approximate_position_of_moon ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year 
    )
    +
    +
        Calculate approximate position of the Moon.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, in hours.
    +        lct_min -- Local civil time, in minutes.
    +        lct_sec -- Local civil time, in seconds.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +
    +    Returns:
    +        moon_ra_hour -- Right ascension of Moon (hour part)
    +        moon_ra_min -- Right ascension of Moon (minutes part)
    +        moon_ra_sec -- Right ascension of Moon (seconds part)
    +        moon_dec_deg -- Declination of Moon (degrees part)
    +        moon_dec_min -- Declination of Moon (minutes part)
    +        moon_dec_sec -- Declination of Moon (seconds part)
    +
    +
    + +

    ◆ moon_dist_ang_diam_hor_parallax()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.moon_dist_ang_diam_hor_parallax ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year 
    )
    +
    +
        Calculate Moon's distance, angular diameter, and horizontal parallax.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, in hours.
    +        lct_min -- Local civil time, in minutes.
    +        lct_sec -- Local civil time, in seconds.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +
    +    Returns:
    +        earth_moon_dist -- Earth-Moon distance (km)
    +        ang_diameter_deg -- Angular diameter (degrees part)
    +        ang_diameter_min -- Angular diameter (minutes part)
    +        hor_parallax_deg -- Horizontal parallax (degrees part)
    +        hor_parallax_min -- Horizontal parallax (minutes part)
    +        hor_parallax_sec -- Horizontal parallax (seconds part)
    +
    +
    + +

    ◆ moon_phase()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.moon_phase ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     accuracy_level = "A" 
    )
    +
    +
        Calculate Moon phase and position angle of bright limb.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, in hours.
    +        lct_min -- Local civil time, in minutes.
    +        lct_sec -- Local civil time, in seconds.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        accuracy_level -- "A" (approximate) or "P" (precise)
    +
    +    Returns:
    +        moon_phase -- Phase of Moon, between 0 and 1, where 0 is New and 1 is Full.
    +        pa_bright_limb_deg -- Position angle of the bright limb (degrees)
    +
    +
    + +

    ◆ moonrise_and_moonset()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.moonrise_and_moonset ( local_date_day,
     local_date_month,
     local_date_year,
     is_daylight_saving,
     zone_correction_hours,
     geog_long_deg,
     geog_lat_deg 
    )
    +
    +
        Calculate date/time of local moonrise and moonset.
    +
    +    Arguments:
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        geog_long_deg -- Geographical longitude, in degrees.
    +        geog_lat_deg -- Geographical latitude, in degrees.
    +
    +    Returns:
    +        mr_lt_hour -- Moonrise, local time (hour part)
    +        mr_lt_min -- Moonrise, local time (minutes part)
    +        mr_local_date_day -- Moonrise, local date (day)
    +        mr_local_date_month -- Moonrise, local date (month)
    +        mr_local_date_year -- Moonrise, local date (year)
    +        mr_azimuth_deg -- Moonrise, azimuth (degrees)
    +        ms_lt_hour -- Moonset, local time (hour part)
    +        ms_lt_min -- Moonset, local time (minutes part)
    +        ms_local_date_day -- Moonset, local date (day)
    +        ms_local_date_month -- Moonset, local date (month)
    +        ms_local_date_year -- Moonset, local date (year)
    +        ms_azimuth_deg -- Moonset, azimuth (degrees)
    +
    +
    + +

    ◆ precise_position_of_moon()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.precise_position_of_moon ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year 
    )
    +
    +
        Calculate approximate position of the Moon.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, in hours.
    +        lct_min -- Local civil time, in minutes.
    +        lct_sec -- Local civil time, in seconds.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +
    +    Returns:
    +        moon_ra_hour -- Right ascension of Moon (hour part)
    +        moon_ra_min -- Right ascension of Moon (minutes part)
    +        moon_ra_sec -- Right ascension of Moon (seconds part)
    +        moon_dec_deg -- Declination of Moon (degrees part)
    +        moon_dec_min -- Declination of Moon (minutes part)
    +        moon_dec_sec -- Declination of Moon (seconds part)
    +        earth_moon_dist_km -- Distance from Earth to Moon (km)
    +        moon_hor_parallax_deg -- Horizontal parallax of Moon (degrees)
    +
    +
    + +

    ◆ times_of_new_moon_and_full_moon()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_moon.times_of_new_moon_and_full_moon ( is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year 
    )
    +
    +
        Calculate new moon and full moon instances.
    +
    +    Arguments:
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +
    +    Returns:
    +        nm_local_time_hour -- new Moon instant - local time (hour)
    +        nm_local_time_min -- new Moon instant - local time (minutes)
    +        nm_local_date_day -- new Moon instance - local date (day)
    +        nm_local_date_month -- new Moon instance - local date (month)
    +        nm_local_date_year -- new Moon instance - local date (year)
    +        fm_local_time_hour -- full Moon instant - local time (hour)
    +        fm_local_time_min -- full Moon instant - local time (minutes)
    +        fm_local_date_day -- full Moon instance - local date (day)
    +        fm_local_date_month -- full Moon instance - local date (month)
    +        fm_local_date_year -- full Moon instance - local date (year)
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet.html new file mode 100644 index 0000000000000000000000000000000000000000..5b44e9bfc7f669726134fc823015f4433cfdd977 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet.html @@ -0,0 +1,380 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_planet Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_planet Namespace Reference
    +
    +
    + + + + + + + + +

    +Functions

    def approximate_position_of_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    def precise_position_of_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    def visual_aspects_of_a_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    +

    Function Documentation

    + +

    ◆ approximate_position_of_planet()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_planet.approximate_position_of_planet ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     planet_name 
    )
    +
    +
        Calculate approximate position of a planet.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, in hours.
    +        lct_min -- Local civil time, in minutes.
    +        lct_sec -- Local civil time, in seconds.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        planet_name -- Name of planet, e.g., "Jupiter"
    +
    +    Returns:
    +        planet_ra_hour -- Right ascension of planet (hour part)
    +        planet_ra_min -- Right ascension of planet (minutes part)
    +        planet_ra_sec -- Right ascension of planet (seconds part)
    +        planet_dec_deg -- Declination of planet (degrees part)
    +        planet_dec_min -- Declination of planet (minutes part)
    +        planet_dec_sec -- Declination of planet (seconds part)
    +
    +
    + +

    ◆ precise_position_of_planet()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_planet.precise_position_of_planet ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     planet_name 
    )
    +
    +
        Calculate precise position of a planet.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, hour part.
    +        lct_min -- Local civil time, minutes part.
    +        lct_sec -- Local civil time, seconds part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        planet_name -- Name of planet, e.g., "Jupiter"
    +
    +    Returns:
    +        planet_ra_hour -- Right ascension of planet (hour part)
    +        planet_ra_min -- Right ascension of planet (minutes part)
    +        planet_ra_sec -- Right ascension of planet (seconds part)
    +        planet_dec_deg -- Declination of planet (degrees part)
    +        planet_dec_min -- Declination of planet (minutes part)
    +        planet_dec_sec -- Declination of planet (seconds part)
    +
    +
    + +

    ◆ visual_aspects_of_a_planet()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_planet.visual_aspects_of_a_planet ( lct_hour,
     lct_min,
     lct_sec,
     is_daylight_saving,
     zone_correction_hours,
     local_date_day,
     local_date_month,
     local_date_year,
     planet_name 
    )
    +
    +
        Calculate several visual aspects of a planet.
    +
    +    Arguments:
    +        lct_hour -- Local civil time, hour part.
    +        lct_min -- Local civil time, minutes part.
    +        lct_sec -- Local civil time, seconds part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction_hours -- Time zone correction, in hours.
    +        local_date_day -- Local date, day part.
    +        local_date_month -- Local date, month part.
    +        local_date_year -- Local date, year part.
    +        planet_name -- Name of planet, e.g., "Jupiter"
    +
    +    Returns:
    +        distance_au -- Planet's distance from Earth, in AU.
    +        ang_dia_arcsec -- Angular diameter of the planet.
    +        phase -- Illuminated fraction of the planet.
    +        light_time_hour -- Light travel time from planet to Earth, hour part.
    +        light_time_minutes -- Light travel time from planet to Earth, minutes part.
    +        light_time_seconds -- Light travel time from planet to Earth, seconds part.
    +        pos_angle_bright_limb_deg -- Position-angle of the bright limb.
    +        approximate_magnitude -- Apparent brightness of the planet.
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet__data.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet__data.html new file mode 100644 index 0000000000000000000000000000000000000000..97133eb7674eb6c3d31b0589646fc47474df5f6d --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__planet__data.html @@ -0,0 +1,160 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_planet_data Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_planet_data Namespace Reference
    +
    +
    + + + + +

    +Functions

    def get_planet_data (planet_name)
     
    + + + +

    +Variables

    dictionary PlanetData
     
    +

    Function Documentation

    + +

    ◆ get_planet_data()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_planet_data.get_planet_data ( planet_name)
    +
    +
        Get planet data.
    +
    +    Arguments:
    +        planet_name -- Name of planet, e.g., "Jupiter"
    +
    +    Returns a dictionary object with the following elements:
    +        Tp -- Period of orbit.
    +        Long -- Longitude at the epoch.
    +        Peri -- Longitude of the perihelion.
    +        Ecc -- Eccentricity of the orbit.
    +        Axis -- Semi-major axis of the orbit.
    +        Incl -- Orbital inclination.
    +        Node -- Longitude of the ascending node.
    +        Theta0 -- ?
    +        V0 -- ?
    +
    +
    +

    Variable Documentation

    + +

    ◆ PlanetData

    + +
    +
    + + + + +
    dictionary PlanetData
    +
    + +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__sun.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__sun.html new file mode 100644 index 0000000000000000000000000000000000000000..11aa438f6c15274e2d7d21c716f670900e0c339a --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__sun.html @@ -0,0 +1,649 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_sun Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_sun Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + +

    +Functions

    def approximate_position_of_sun (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def precise_position_of_sun (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def sun_distance_and_angular_size (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def sunrise_and_sunset (local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg)
     
    def morning_and_evening_twilight (local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type)
     
    def equation_of_time (gwdate_day, gwdate_month, gwdate_year)
     
    def solar_elongation (ra_hour, ra_min, ra_sec, dec_deg, dec_min, dec_sec, gwdate_day, gwdate_month, gwdate_year)
     
    +

    Function Documentation

    + +

    ◆ approximate_position_of_sun()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.approximate_position_of_sun ( lct_hours,
     lct_minutes,
     lct_seconds,
     local_day,
     local_month,
     local_year,
     is_daylight_saving,
     zone_correction 
    )
    +
    +
        Calculate approximate position of the sun for a local date and time.
    +
    +    Arguments:
    +        lct_hours -- Local civil time, in hours.
    +        lct_minutes -- Local civil time, in minutes.
    +        lct_seconds -- Local civil time, in seconds.
    +        local_day -- Local date, day part.
    +        local_month -- Local date, month part.
    +        local_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction -- Time zone correction, in hours.
    +
    +    Returns:
    +        sun_ra_hour -- Right Ascension of Sun, hour part
    +        sun_ra_min -- Right Ascension of Sun, minutes part
    +        sun_ra_sec -- Right Ascension of Sun, seconds part
    +        sun_dec_deg -- Declination of Sun, degrees part
    +        sun_dec_min -- Declination of Sun, minutes part
    +        sun_dec_sec -- Declination of Sun, seconds part
    +
    +
    + +

    ◆ equation_of_time()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.equation_of_time ( gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate the equation of time. (The difference between the real Sun time and the mean Sun time.)
    +    
    +    Arguments:
    +        gwdate_day -- Greenwich date (day part)
    +        gwdate_month -- Greenwich date (month part)
    +        gwdate_year -- Greenwich date (year part)
    +
    +    Returns:
    +        equation_of_time_min -- equation of time (minute part)
    +        equation_of_time_sec -- equation of time (seconds part)
    +
    +
    + +

    ◆ morning_and_evening_twilight()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.morning_and_evening_twilight ( local_day,
     local_month,
     local_year,
     is_daylight_saving,
     zone_correction,
     geographical_long_deg,
     geographical_lat_deg,
     twilight_type 
    )
    +
    +
        Calculate times of morning and evening twilight.
    +
    +    Arguments:
    +        local_day -- Local date, day part.
    +        local_month -- Local date, month part.
    +        local_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction -- Time zone correction, in hours.
    +        geographical_long_deg -- Geographical longitude, in degrees.
    +        geographical_lat_deg -- Geographical latitude, in degrees.
    +        twilight_type -- "C" (civil), "N" (nautical), or "A" (astronomical)
    +
    +    Returns:
    +        am_twilight_begins_hour -- Beginning of AM twilight (hour part)
    +        am_twilight_begins_min -- Beginning of AM twilight (minutes part)
    +        pm_twilight_ends_hour -- Ending of PM twilight (hour part)
    +        pm_twilight_ends_min -- Ending of PM twilight (minutes part)
    +        status -- Calculation status
    +
    +
    + +

    ◆ precise_position_of_sun()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.precise_position_of_sun ( lct_hours,
     lct_minutes,
     lct_seconds,
     local_day,
     local_month,
     local_year,
     is_daylight_saving,
     zone_correction 
    )
    +
    +
        Calculate precise position of the sun for a local date and time.
    +
    +    Arguments:
    +        lct_hours -- Local civil time, in hours.
    +        lct_minutes -- Local civil time, in minutes.
    +        lct_seconds -- Local civil time, in seconds.
    +        local_day -- Local date, day part.
    +        local_month -- Local date, month part.
    +        local_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction -- Time zone correction, in hours.
    +
    +    Returns:
    +        sun_ra_hour -- Right Ascension of Sun, hour part
    +        sun_ra_min -- Right Ascension of Sun, minutes part
    +        sun_ra_sec -- Right Ascension of Sun, seconds part
    +        sun_dec_deg -- Declination of Sun, degrees part
    +        sun_dec_min -- Declination of Sun, minutes part
    +        sun_dec_sec -- Declination of Sun, seconds part
    +
    +
    + +

    ◆ solar_elongation()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.solar_elongation ( ra_hour,
     ra_min,
     ra_sec,
     dec_deg,
     dec_min,
     dec_sec,
     gwdate_day,
     gwdate_month,
     gwdate_year 
    )
    +
    +
        Calculate solar elongation for a celestial body.
    +
    +    Solar elongation is the angle between the lines of sight from the Earth to the Sun and from the Earth to the celestial body.
    +
    +    Arguments:
    +        ra_hour -- Right Ascension, hour part
    +        ra_min -- Right Ascension, minutes part
    +        ra_sec -- Right Ascension, seconds part
    +        dec_deg -- Declination, degrees part
    +        dec_min -- Declination, minutes part
    +        dec_sec -- Declination, seconds part
    +        gwdate_day -- Greenwich Date, day part
    +        gwdate_month -- Greenwich Date, month part
    +        gwdate_year -- Greenwich Date, year part
    +
    +    Returns:
    +        solar_elongation_deg -- Solar elongation, in degrees
    +
    +
    + +

    ◆ sun_distance_and_angular_size()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.sun_distance_and_angular_size ( lct_hours,
     lct_minutes,
     lct_seconds,
     local_day,
     local_month,
     local_year,
     is_daylight_saving,
     zone_correction 
    )
    +
    +
        Calculate distance to the Sun (in km), and angular size.
    +
    +    Arguments:
    +        lct_hours -- Local civil time, in hours.
    +        lct_minutes -- Local civil time, in minutes.
    +        lct_seconds -- Local civil time, in seconds.
    +        local_day -- Local date, day part.
    +        local_month -- Local date, month part.
    +        local_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction -- Time zone correction, in hours.
    +
    +    Returns:
    +        sun_dist_km -- Sun's distance, in kilometers
    +        sun_ang_size_deg -- Sun's angular size (degrees part)
    +        sun_ang_size_min -- Sun's angular size (minutes part)
    +        sun_ang_size_sec -- Sun's angular size (seconds part)
    +
    +
    + +

    ◆ sunrise_and_sunset()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def practical_astronomy.pa_sun.sunrise_and_sunset ( local_day,
     local_month,
     local_year,
     is_daylight_saving,
     zone_correction,
     geographical_long_deg,
     geographical_lat_deg 
    )
    +
    +
        Calculate local sunrise and sunset.
    +
    +    Arguments:
    +        local_day -- Local date, day part.
    +        local_month -- Local date, month part.
    +        local_year -- Local date, year part.
    +        is_daylight_saving -- Is daylight savings in effect?
    +        zone_correction -- Time zone correction, in hours.
    +        geographical_long_deg -- Geographical longitude, in degrees.
    +        geographical_lat_deg -- Geographical latitude, in degrees.
    +
    +    Returns:
    +        local_sunrise_hour -- Local sunrise, hour part
    +        local_sunrise_minute -- Local sunrise, minutes part
    +        local_sunset_hour -- Local sunset, hour part
    +        local_sunset_minute -- Local sunset, minutes part
    +        azimuth_of_sunrise_deg -- Azimuth (horizon direction) of sunrise, in degrees
    +        azimuth_of_sunset_deg -- Azimuth (horizon direction) of sunset, in degrees
    +        status -- Calculation status
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__util.html b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__util.html new file mode 100644 index 0000000000000000000000000000000000000000..d29e4e44bff9cbbd352d0892e25eb38eb9379406 --- /dev/null +++ b/practical_astronomy/source/docs/namespacepractical__astronomy_1_1pa__util.html @@ -0,0 +1,165 @@ + + + + + + + +Practical Astronomy: practical_astronomy.pa_util Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    practical_astronomy.pa_util Namespace Reference
    +
    +
    + + + + + + + + +

    +Functions

    def is_leap_year (year)
     
    def mi_to_km (miles)
     
    def km_to_mi (kilometers)
     
    +

    Function Documentation

    + +

    ◆ is_leap_year()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_util.is_leap_year ( year)
    +
    +
     Returns True or False indicating if the specified year is a leap year. 
    +
    +
    + +

    ◆ km_to_mi()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_util.km_to_mi ( kilometers)
    +
    +
     Convert kilometers to miles. 
    +
    +
    + +

    ◆ mi_to_km()

    + +
    +
    + + + + + + + + +
    def practical_astronomy.pa_util.mi_to_km ( miles)
    +
    +
     Convert miles to kilometers. 
    +
    +
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespaces.html b/practical_astronomy/source/docs/namespaces.html new file mode 100644 index 0000000000000000000000000000000000000000..06ba7a33f221c96a90048d2b7f1248661367a3eb --- /dev/null +++ b/practical_astronomy/source/docs/namespaces.html @@ -0,0 +1,115 @@ + + + + + + + +Practical Astronomy: Packages + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Packages
    +
    +
    +
    Here are the packages with brief descriptions (if available):
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/namespaces_dup.js b/practical_astronomy/source/docs/namespaces_dup.js new file mode 100644 index 0000000000000000000000000000000000000000..9b759a2f37bbf821a22d8d5311d20ac7e6779ed9 --- /dev/null +++ b/practical_astronomy/source/docs/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "practical_astronomy", "namespacepractical__astronomy.html", "namespacepractical__astronomy" ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/nav_f.png b/practical_astronomy/source/docs/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 Binary files /dev/null and b/practical_astronomy/source/docs/nav_f.png differ diff --git a/practical_astronomy/source/docs/nav_g.png b/practical_astronomy/source/docs/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 Binary files /dev/null and b/practical_astronomy/source/docs/nav_g.png differ diff --git a/practical_astronomy/source/docs/nav_h.png b/practical_astronomy/source/docs/nav_h.png new file mode 100644 index 0000000000000000000000000000000000000000..33389b101d9cd9b4c98ad286b5d9c46a6671f650 Binary files /dev/null and b/practical_astronomy/source/docs/nav_h.png differ diff --git a/practical_astronomy/source/docs/navtree.css b/practical_astronomy/source/docs/navtree.css new file mode 100644 index 0000000000000000000000000000000000000000..33341a67d69b0b1bb09d1b11878cba8f95aa61d4 --- /dev/null +++ b/practical_astronomy/source/docs/navtree.css @@ -0,0 +1,146 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background-color: #FAFAFF; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 250px; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:url("splitbar.png"); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/practical_astronomy/source/docs/navtree.js b/practical_astronomy/source/docs/navtree.js new file mode 100644 index 0000000000000000000000000000000000000000..1e272d31d4aa9b3b97472d9d73741f713bdbcb0a --- /dev/null +++ b/practical_astronomy/source/docs/navtree.js @@ -0,0 +1,546 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +var navTreeSubIndices = new Array(); +var arrowDown = '▼'; +var arrowRight = '►'; + +function getData(varName) +{ + var i = varName.lastIndexOf('/'); + var n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_binary.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_binary.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_binary
     
    + + + +

    +Functions

    def binary_star_orbit (greenwich_date_day, greenwich_date_month, greenwich_date_year, binary_name)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__binary_8py.js b/practical_astronomy/source/docs/pa__binary_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..feb9dfa08f9aabc4a30793512701a2ccf23bcbc4 --- /dev/null +++ b/practical_astronomy/source/docs/pa__binary_8py.js @@ -0,0 +1,4 @@ +var pa__binary_8py = +[ + [ "binary_star_orbit", "pa__binary_8py.html#ad64db60ed19e41d162237dc0b1a52a61", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__binary__data_8py.html b/practical_astronomy/source/docs/pa__binary__data_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..7d35610330d8a75feae9527d20700e3645d71f28 --- /dev/null +++ b/practical_astronomy/source/docs/pa__binary__data_8py.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_binary_data.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_binary_data.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_binary_data
     
    + + + +

    +Functions

    def get_binary_data (binary_name)
     
    + + + +

    +Variables

    dictionary BinaryData
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__binary__data_8py.js b/practical_astronomy/source/docs/pa__binary__data_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..68ac99734e84dac83731b22fb6ded3d8c944d452 --- /dev/null +++ b/practical_astronomy/source/docs/pa__binary__data_8py.js @@ -0,0 +1,5 @@ +var pa__binary__data_8py = +[ + [ "get_binary_data", "pa__binary__data_8py.html#a665c50e5d40ad4b7e43079b2175d9e67", null ], + [ "BinaryData", "pa__binary__data_8py.html#ac5703bf2a91c2d1da46f103d171388a8", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__comet_8py.html b/practical_astronomy/source/docs/pa__comet_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..05d03e2050202e5dcc37920cf6269b5d83464a3d --- /dev/null +++ b/practical_astronomy/source/docs/pa__comet_8py.html @@ -0,0 +1,114 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_comet.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_comet.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_comet
     
    + + + + + +

    +Functions

    def position_of_elliptical_comet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name)
     
    def position_of_parabolic_comet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__comet_8py.js b/practical_astronomy/source/docs/pa__comet_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..3d65269fd5c3152237bb23db5bf1239a00ee466c --- /dev/null +++ b/practical_astronomy/source/docs/pa__comet_8py.js @@ -0,0 +1,5 @@ +var pa__comet_8py = +[ + [ "position_of_elliptical_comet", "pa__comet_8py.html#aa3d042bef43ebd6669b43eb87c5e515a", null ], + [ "position_of_parabolic_comet", "pa__comet_8py.html#aec2f1ca117599741cfb24e597c8f3ac6", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__comet__data_8py.html b/practical_astronomy/source/docs/pa__comet__data_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..48d71643e3b3110d316b6f8ad5bb130f0b4d2b9a --- /dev/null +++ b/practical_astronomy/source/docs/pa__comet__data_8py.html @@ -0,0 +1,122 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_comet_data.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_comet_data.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_comet_data
     
    + + + + + +

    +Functions

    def get_comet_data_elliptical (comet_name)
     
    def get_comet_data_parabolic (comet_name)
     
    + + + + + +

    +Variables

    dictionary CometDataElliptical
     
    dictionary CometDataParabolic
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__comet__data_8py.js b/practical_astronomy/source/docs/pa__comet__data_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..87b3684042342db73ea4f3f9fbe4313eda3236dd --- /dev/null +++ b/practical_astronomy/source/docs/pa__comet__data_8py.js @@ -0,0 +1,7 @@ +var pa__comet__data_8py = +[ + [ "get_comet_data_elliptical", "pa__comet__data_8py.html#a880f949265c37db03be8789361c533dc", null ], + [ "get_comet_data_parabolic", "pa__comet__data_8py.html#a354296f92713da2121f7ff50fccc16d3", null ], + [ "CometDataElliptical", "pa__comet__data_8py.html#a5dfaac06954d07c606fa71e691aa89eb", null ], + [ "CometDataParabolic", "pa__comet__data_8py.html#a5a4863a7e81117de4279b5afea3b8be9", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__coordinate_8py.html b/practical_astronomy/source/docs/pa__coordinate_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..df1384f95d27aebe9dc1cd68b6d0bfdf8e1d57a0 --- /dev/null +++ b/practical_astronomy/source/docs/pa__coordinate_8py.html @@ -0,0 +1,154 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_coordinate.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_coordinate.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_coordinate
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def angle_to_decimal_degrees (degrees, minutes, seconds)
     
    def decimal_degrees_to_angle (decimalDegrees)
     
    def right_ascension_to_hour_angle (ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, is_daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def hour_angle_to_right_ascension (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, lct_hours, lct_minutes, lct_seconds, is_daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def equatorial_coordinates_to_horizon_coordinates (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def horizon_coordinates_to_equatorial_coordinates (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def mean_obliquity_of_the_ecliptic (greenwich_day, greenwich_month, greenwich_year)
     
    def ecliptic_coordinate_to_equatorial_coordinate (ecliptic_longitude_degrees, ecliptic_longitude_minutes, ecliptic_longitude_seconds, ecliptic_latitude_degrees, ecliptic_latitude_minutes, ecliptic_latitude_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def equatorial_coordinate_to_ecliptic_coordinate (ra_hours, ra_minutes, ra_seconds, dec_degrees, dec_minutes, dec_seconds, gw_day, gw_month, gw_year)
     
    def equatorial_coordinate_to_galactic_coordinate (ra_hours, ra_minutes, ra_seconds, dec_degrees, dec_minutes, dec_seconds)
     
    def galactic_coordinate_to_equatorial_coordinate (gal_long_deg, gal_long_min, gal_long_sec, gal_lat_deg, gal_lat_min, gal_lat_sec)
     
    def angle_between_two_objects (ra_long_1_hour_deg, ra_long_1_min, ra_long_1_sec, dec_lat_1_deg, dec_lat_1_min, dec_lat_1_sec, ra_long_2_hour_deg, ra_long_2_min, ra_long_2_sec, dec_lat_2_deg, dec_lat_2_min, dec_lat_2_sec, hour_or_degree)
     
    def rising_and_setting (ra_hours, ra_minutes, ra_seconds, dec_deg, dec_min, dec_sec, gw_date_day, gw_date_month, gw_date_year, geog_long_deg, geog_lat_deg, vert_shift_deg)
     
    def correct_for_precession (ra_hour, ra_minutes, ra_seconds, dec_deg, dec_minutes, dec_seconds, epoch1_day, epoch1_month, epoch1_year, epoch2_day, epoch2_month, epoch2_year)
     
    def nutation_in_ecliptic_longitude_and_obliquity (greenwich_day, greenwich_month, greenwich_year)
     
    def correct_for_aberration (ut_hour, ut_minutes, ut_seconds, gw_day, gw_month, gw_year, true_ecl_long_deg, true_ecl_long_min, true_ecl_long_sec, true_ecl_lat_deg, true_ecl_lat_min, true_ecl_lat_sec)
     
    def atmospheric_refraction (true_ra_hour, true_ra_min, true_ra_sec, true_dec_deg, true_dec_min, true_dec_sec, coordinate_type, geog_long_deg, geog_lat_deg, daylight_saving_hours, timezone_hours, lcd_day, lcd_month, lcd_year, lct_hour, lct_min, lct_sec, atmospheric_pressure_mbar, atmospheric_temperature_celsius)
     
    def corrections_for_geocentric_parallax (ra_hour, ra_min, ra_sec, dec_deg, dec_min, dec_sec, coordinate_type, equatorial_hor_parallax_deg, geog_long_deg, geog_lat_deg, height_m, daylight_saving, timezone_hours, lcd_day, lcd_month, lcd_year, lct_hour, lct_min, lct_sec)
     
    def heliographic_coordinates (helio_position_angle_deg, helio_displacement_arcmin, gwdate_day, gwdate_month, gwdate_year)
     
    def carrington_rotation_number (gwdate_day, gwdate_month, gwdate_year)
     
    def selenographic_coordinates_1 (gwdate_day, gwdate_month, gwdate_year)
     
    def selenographic_coordinates_2 (gwdate_day, gwdate_month, gwdate_year)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__coordinate_8py.js b/practical_astronomy/source/docs/pa__coordinate_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..285966336057d3ee02ee7f23288620db963d2339 --- /dev/null +++ b/practical_astronomy/source/docs/pa__coordinate_8py.js @@ -0,0 +1,25 @@ +var pa__coordinate_8py = +[ + [ "angle_between_two_objects", "pa__coordinate_8py.html#aeff3946906765330d3df8e9295c5636c", null ], + [ "angle_to_decimal_degrees", "pa__coordinate_8py.html#a987813f23727409ec84bf5b7758e4196", null ], + [ "atmospheric_refraction", "pa__coordinate_8py.html#afca7093308d31a18052d1212a5532229", null ], + [ "carrington_rotation_number", "pa__coordinate_8py.html#aea2e9ebd99d887bc7919c516f515d837", null ], + [ "correct_for_aberration", "pa__coordinate_8py.html#a71720f0e80328a252ba574452418ea92", null ], + [ "correct_for_precession", "pa__coordinate_8py.html#ac6a88c0e59835e90c871361d73f90f50", null ], + [ "corrections_for_geocentric_parallax", "pa__coordinate_8py.html#a94efd7a45ec9cb98c702bcf61d89dd39", null ], + [ "decimal_degrees_to_angle", "pa__coordinate_8py.html#af4b04e15f6470d4f704e1cab2d64fd55", null ], + [ "ecliptic_coordinate_to_equatorial_coordinate", "pa__coordinate_8py.html#a8801b81ef0c47d1968da6dd29c3fa015", null ], + [ "equatorial_coordinate_to_ecliptic_coordinate", "pa__coordinate_8py.html#a2be55120967a6500d6abf660d0c42009", null ], + [ "equatorial_coordinate_to_galactic_coordinate", "pa__coordinate_8py.html#a8214a5edcdda8da9372d59cd847a5f65", null ], + [ "equatorial_coordinates_to_horizon_coordinates", "pa__coordinate_8py.html#a759d93a22e6eb1a5fe88a07dbf4f4fd2", null ], + [ "galactic_coordinate_to_equatorial_coordinate", "pa__coordinate_8py.html#a3de24c7dd22235e3d8976333e0081a98", null ], + [ "heliographic_coordinates", "pa__coordinate_8py.html#af1747d784ba179c8ebc99fb761b337bb", null ], + [ "horizon_coordinates_to_equatorial_coordinates", "pa__coordinate_8py.html#abcc4ce68e3508c7ed5443ce846531bb8", null ], + [ "hour_angle_to_right_ascension", "pa__coordinate_8py.html#a4703c296a201b48930292c17665c7dd2", null ], + [ "mean_obliquity_of_the_ecliptic", "pa__coordinate_8py.html#a3b012c023b82b660c02c4b5de08474d2", null ], + [ "nutation_in_ecliptic_longitude_and_obliquity", "pa__coordinate_8py.html#a3a11b5ab0fe82c3966282455392d05fc", null ], + [ "right_ascension_to_hour_angle", "pa__coordinate_8py.html#a4dffecdd7b376164a88b03227776b67a", null ], + [ "rising_and_setting", "pa__coordinate_8py.html#accf030a9add4b8f1a81ed808c3caf70a", null ], + [ "selenographic_coordinates_1", "pa__coordinate_8py.html#accf1d521e9fe1583201493f7c3c5aa3b", null ], + [ "selenographic_coordinates_2", "pa__coordinate_8py.html#a821e4558becfa11ef299894f12dc37f2", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__datetime_8py.html b/practical_astronomy/source/docs/pa__datetime_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..52ef7a6992a072bb8bde090d2abe71032c7a679e --- /dev/null +++ b/practical_astronomy/source/docs/pa__datetime_8py.html @@ -0,0 +1,148 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_datetime.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_datetime.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_datetime
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def get_date_of_easter (year)
     
    def civil_date_to_day_number (month, day, year)
     
    def greenwich_date_to_julian_date (day, month, year)
     
    def julian_date_to_greenwich_date (julianDate)
     
    def julian_date_day (julianDate)
     
    def julian_date_month (julianDate)
     
    def julian_date_year (julianDate)
     
    def julian_date_to_weekday_name (julianDate)
     
    def civil_time_to_decimal_hours (hours, minutes, seconds)
     
    def decimal_hour_hour (decimalHours)
     
    def decimal_hour_minutes (decimalHours)
     
    def decimal_hour_seconds (decimalHours)
     
    def decimal_hours_to_civil_time (decimalHours)
     
    def local_civil_time_to_universal_time (lctHours, lctMinutes, lctSeconds, isDaylightSavings, zoneCorrection, localDay, localMonth, localYear)
     
    def universal_time_to_local_civil_time (utHours, utMinutes, utSeconds, isDayLightSavings, zoneCorrection, gwDay, gwMonth, gwYear)
     
    def universal_time_to_greenwich_sidereal_time (utHours, utMinutes, utSeconds, gwDay, gwMonth, gwYear)
     
    def greenwich_sidereal_time_to_universal_time (gstHours, gstMinutes, gstSeconds, gwDay, gwMonth, gwYear)
     
    def greenwich_sidereal_time_to_local_sidereal_time (gstHours, gstMinutes, gstSeconds, geographicalLongitude)
     
    def local_sidereal_time_to_greenwich_sidereal_time (lstHours, lstMinutes, lstSeconds, geographicalLongitude)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__datetime_8py.js b/practical_astronomy/source/docs/pa__datetime_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..79332780f98ddf845ffb15ff7f921d3e0e707ece --- /dev/null +++ b/practical_astronomy/source/docs/pa__datetime_8py.js @@ -0,0 +1,22 @@ +var pa__datetime_8py = +[ + [ "civil_date_to_day_number", "pa__datetime_8py.html#a085ad36535d1f6b906ebbc502dd547a3", null ], + [ "civil_time_to_decimal_hours", "pa__datetime_8py.html#a87c359a968e2ffd19d5c7ee78006762e", null ], + [ "decimal_hour_hour", "pa__datetime_8py.html#a7a505017515cdadb479fef83039bbad8", null ], + [ "decimal_hour_minutes", "pa__datetime_8py.html#af03f0a34f5a3205abfced5fb458b99c8", null ], + [ "decimal_hour_seconds", "pa__datetime_8py.html#a21452aca72d47207179838ce47fb27cf", null ], + [ "decimal_hours_to_civil_time", "pa__datetime_8py.html#a2320446a7693e2baef32833e536e82de", null ], + [ "get_date_of_easter", "pa__datetime_8py.html#a2980ffc259f16fd25b37bc1cbb8b18d4", null ], + [ "greenwich_date_to_julian_date", "pa__datetime_8py.html#a2c3a8dc822708f5871b272048a50a2b5", null ], + [ "greenwich_sidereal_time_to_local_sidereal_time", "pa__datetime_8py.html#ad329bcbb2bcaf6b6c3d6c0c918936ecf", null ], + [ "greenwich_sidereal_time_to_universal_time", "pa__datetime_8py.html#ab03052b709178a939ecacd357a9b1730", null ], + [ "julian_date_day", "pa__datetime_8py.html#a6af5e356e7784f060e5c55e814581e05", null ], + [ "julian_date_month", "pa__datetime_8py.html#af6c7751410aa70a76670b144f50dc619", null ], + [ "julian_date_to_greenwich_date", "pa__datetime_8py.html#a267f3d2010bdf763726f9da3612e4060", null ], + [ "julian_date_to_weekday_name", "pa__datetime_8py.html#ab1a46eed14594880e25220f9a9675a37", null ], + [ "julian_date_year", "pa__datetime_8py.html#a67a531866a9dc81ad806d4a505a20c8a", null ], + [ "local_civil_time_to_universal_time", "pa__datetime_8py.html#aa48dfcf90dce9ac086b0b28bd2dbac7b", null ], + [ "local_sidereal_time_to_greenwich_sidereal_time", "pa__datetime_8py.html#a22b0001de8eb44f6ed02d4899d9d86b1", null ], + [ "universal_time_to_greenwich_sidereal_time", "pa__datetime_8py.html#a55fda8f36a26dc8552cdc72a80d2ccd4", null ], + [ "universal_time_to_local_civil_time", "pa__datetime_8py.html#a67d28e510b5411d435af43d3a105d313", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__eclipses_8py.html b/practical_astronomy/source/docs/pa__eclipses_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..33ca927b25fcf5cd47a988fe2e79ac071d28de81 --- /dev/null +++ b/practical_astronomy/source/docs/pa__eclipses_8py.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_eclipses.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_eclipses.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_eclipses
     
    + + + + + + + + + +

    +Functions

    def lunar_eclipse_occurrence (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def lunar_eclipse_circumstances (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def solar_eclipse_occurrence (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours)
     
    def solar_eclipse_circumstances (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours, geog_longitude_deg, geog_latitude_deg)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__eclipses_8py.js b/practical_astronomy/source/docs/pa__eclipses_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..0711ba1a3e219bff722e15070ca292ca71aa6a8b --- /dev/null +++ b/practical_astronomy/source/docs/pa__eclipses_8py.js @@ -0,0 +1,7 @@ +var pa__eclipses_8py = +[ + [ "lunar_eclipse_circumstances", "pa__eclipses_8py.html#a48d5a9475c1877f1268b4d063dd99f6b", null ], + [ "lunar_eclipse_occurrence", "pa__eclipses_8py.html#a0ac960734a008556789361349956209c", null ], + [ "solar_eclipse_circumstances", "pa__eclipses_8py.html#aa5e0b860a6b90ed84dd91644a7db845e", null ], + [ "solar_eclipse_occurrence", "pa__eclipses_8py.html#a419c3cdc66fdfadb685e0095404e0beb", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__macro_8py.html b/practical_astronomy/source/docs/pa__macro_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..8bb808b98cd6fc5bc4b98926fcb3d518e1b25258 --- /dev/null +++ b/practical_astronomy/source/docs/pa__macro_8py.html @@ -0,0 +1,414 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_macro.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_macro.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_macro
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def cd_jd (day, month, year)
     
    def jdc_day (julianDate)
     
    def jdc_month (julianDate)
     
    def jdc_year (julianDate)
     
    def f_dow (julianDate)
     
    def hms_dh (hours, minutes, seconds)
     
    def dh_hour (decimalHours)
     
    def dh_min (decimalHours)
     
    def dh_sec (decimalHours)
     
    def lct_ut (lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear)
     
    def ut_lct (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_day (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_month (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def ut_lc_year (uHours, uMinutes, uSeconds, daylightSaving, zoneCorrection, greenwichDay, greenwichMonth, greenwichYear)
     
    def lct_gday (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def lct_gmonth (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def lct_gyear (lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year)
     
    def ut_gst (u_hours, u_minutes, u_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def gst_lst (greenwich_hours, greenwich_minutes, greenwich_seconds, geographical_longitude)
     
    def lst_gst (local_hours, local_minutes, local_seconds, longitude)
     
    def gst_ut (greenwich_sidereal_hours, greenwich_sidereal_minutes, greenwich_sidereal_seconds, greenwich_day, greenwich_month, greenwich_year)
     
    def e_gst_ut (GSH, GSM, GSS, GD, GM, GY)
     
    def ra_ha (ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def ha_ra (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude)
     
    def dms_dd (degrees, minutes, seconds)
     
    def dd_deg (decimal_degrees)
     
    def dd_min (decimal_degrees)
     
    def dd_sec (decimal_degrees)
     
    def dd_dh (decimal_degrees)
     
    def dh_dd (degree_hours)
     
    def degrees (W)
     
    def atan2 (X, Y)
     
    def eq_az (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def eq_alt (hour_angle_hours, hour_angle_minutes, hour_angle_seconds, declination_degrees, declination_minutes, declination_seconds, geographical_latitude)
     
    def hor_dec (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def hor_ha (azimuth_degrees, azimuth_minutes, azimuth_seconds, altitude_degrees, altitude_minutes, altitude_seconds, geographical_latitude)
     
    def nutat_obl (greenwich_day, greenwich_month, greenwich_year)
     
    def obliq (greenwich_day, greenwich_month, greenwich_year)
     
    def sun_long (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_dist (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_dia (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def true_anomaly (AM, EC)
     
    def eccentric_anomaly (AM, EC)
     
    def refract (Y2, SW, PR, TR)
     
    def refract_l3035 (PR, TR, Y, D)
     
    def parallax_ha (HH, HM, HS, DD, DM, DS, SW, GP, HT, HP)
     
    def parallax_ha_l2870 (X, Y, RC, RP, RS, TP)
     
    def parallax_dec (HH, HM, HS, DD, DM, DS, SW, GP, HT, HP)
     
    def parallax_dec_l2870 (X, Y, RC, RP, RS, TP)
     
    def unwind (W)
     
    def unwind_deg (W)
     
    def unwind_rad (W)
     
    def moon_long (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_lat (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_hp (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_dist (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_size (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def sun_e_long (GD, GM, GY)
     
    def sun_peri (GD, GM, GY)
     
    def sun_ecc (GD, GM, GY)
     
    def ec_dec (ELD, ELM, ELS, BD, BM, BS, GD, GM, GY)
     
    def ec_ra (ELD, ELM, ELS, BD, BM, BS, GD, GM, GY)
     
    def sun_true_anomaly (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sun_mean_anomaly (LCH, LCM, LCS, DS, ZC, LD, LM, LY)
     
    def sunrise_lct (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunrise_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunrise_az (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunrise_az_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunset_az (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunset_az_l3710 (GD, GM, GY, SR, DI, GP)
     
    def sunset_lct (LD, LM, LY, DS, ZC, GL, GP)
     
    def sunset_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def e_sun_rs (LD, LM, LY, DS, ZC, GL, GP)
     
    def e_sun_rs_l3710 (GD, GM, GY, SR, DI, GP)
     
    def angle (XX1, XM1, XS1, DD1, DM1, DS1, XX2, XM2, XS2, DD2, DM2, DS2, S)
     
    def rise_set_local_sidereal_time_rise (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def e_rs (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_local_sidereal_time_set (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_azimuth_rise (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def rise_set_azimuth_set (RAH, RAM, RAS, DD, DM, DS, VD, G)
     
    def nutat_long (GD, GM, GY)
     
    def twilight_am_lct (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def twilight_am_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def twilight_pm_lct (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def twilight_pm_lct_l3710 (GD, GM, GY, SR, DI, GP)
     
    def e_twilight (LD, LM, LY, DS, ZC, GL, GP, TT)
     
    def e_twilight_l3710 (GD, GM, GY, SR, DI, GP)
     
    def planet_coordinates (LH, LM, LS, DS, ZC, DY, MN, YR, S)
     
    def planet_long_l4685 (AP)
     
    def planet_long_l4735 (AP, MS, T)
     
    def planet_long_l4810 (AP, MS)
     
    def planet_long_l4945 (T, IP, PL)
     
    def solve_cubic (W)
     
    def p_comet_long_lat_dist (LH, LM, LS, DS, ZC, DY, MN, YR, TD, TM, TY, Q, I, P, N)
     
    def moon_long_lat_hp (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_phase (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def moon_mean_anomaly (LH, LM, LS, DS, ZC, DY, MN, YR)
     
    def new_moon (DS, ZC, DY, MN, YR)
     
    def full_moon (DS, ZC, DY, MN, YR)
     
    def new_moon_full_moon_l6855 (K, T)
     
    def moon_rise_lct (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_lct_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_lct_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def e_moon_rise (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def e_moon_rise_l6680 (S3, G1, UT, DS, ZC, GDY, GMN, GYR, DY1, MN1, YR1)
     
    def e_moon_rise_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_rise_lc_dmy (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_lc_dmy_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_lc_dmy_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_rise_az (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_rise_az_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_rise_az_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_lct (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_lct_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_lct_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def e_moon_set (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def e_moon_set_l6680 (X, S3, G1, UT, DS, ZC, GDY, GMN, GYR, DY1, MN1, YR1)
     
    def e_moon_set_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_lc_dmy (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_lc_dmy_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_lc_dmy_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def moon_set_az (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def moon_set_az_l6680 (X, DS, ZC, GDY, GMN, GYR, G1, UT)
     
    def moon_set_az_l6700 (LCT, DS, ZC, DY1, MN1, YR1, GDY, GMN, GYR, GLat)
     
    def lunar_eclipse_occurrence (DS, ZC, DY, MN, YR)
     
    def lunar_eclipse_occurrence_l6855 (T, K)
     
    def mag_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_end_total_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_end_umbra_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_first_contact_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_last_contact_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_max_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_start_total_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def ut_start_umbra_lunar_eclipse (DY, MN, YR, DS, ZC)
     
    def solar_eclipse_occurrence (DS, ZC, DY, MN, YR)
     
    def solar_eclipse_occurrence_l6855 (T, K)
     
    def mag_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def mag_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_first_contact_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_first_contact_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_last_contact_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_last_contact_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def ut_max_solar_eclipse (DY, MN, YR, DS, ZC, GLong, GLat)
     
    def ut_max_solar_eclipse_l7390 (X, Y, IGDay, GMonth, GYear, TM, GLong, GLat, HP)
     
    def fract (W)
     
    def lint (W)
     
    def iint (W)
     
    def sgn (number_to_check)
     
    def ut_day_adjust (UT, G1)
     
    def f_part (W)
     
    def eq_e_lat (RAH, RAM, RAS, DD, DM, DS, GD, GM, GY)
     
    def eq_e_long (RAH, RAM, RAS, DD, DM, DS, GD, GM, GY)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__macro_8py.js b/practical_astronomy/source/docs/pa__macro_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..8cbabd15241026ee05a30b218010ab0a00108aea --- /dev/null +++ b/practical_astronomy/source/docs/pa__macro_8py.js @@ -0,0 +1,155 @@ +var pa__macro_8py = +[ + [ "angle", "pa__macro_8py.html#aa89a8971eecab46c843d55b6b558baa5", null ], + [ "atan2", "pa__macro_8py.html#a46bf770e83278c32641d88a14afa4743", null ], + [ "cd_jd", "pa__macro_8py.html#ae45433a24f80898f5dd0191009f39184", null ], + [ "dd_deg", "pa__macro_8py.html#ae89f6bad38c25ff72cdf2efdbf21e276", null ], + [ "dd_dh", "pa__macro_8py.html#ad8fa9325ef741ca5a547a0d633339b08", null ], + [ "dd_min", "pa__macro_8py.html#aceded82212785c66809b7e51c7da3b4c", null ], + [ "dd_sec", "pa__macro_8py.html#ab601b823d99167db79378cb81d6649e2", null ], + [ "degrees", "pa__macro_8py.html#ab738df3cbff4099561c70a0531304be4", null ], + [ "dh_dd", "pa__macro_8py.html#afa8571c6e8bb5c30819b9d872f207804", null ], + [ "dh_hour", "pa__macro_8py.html#a3c41fb93171f8bf548854cbf934db548", null ], + [ "dh_min", "pa__macro_8py.html#ad3636bd3842c441c464df67b3e8aad32", null ], + [ "dh_sec", "pa__macro_8py.html#ada6b3b92a4562a158192e37d6f79e970", null ], + [ "dms_dd", "pa__macro_8py.html#a1ffca3d689d511cf7d4ce2654a365443", null ], + [ "e_gst_ut", "pa__macro_8py.html#a668275aec60ac6e761aac0432596a0e2", null ], + [ "e_moon_rise", "pa__macro_8py.html#a6bb82ea03dc3e9ec38cd7ef8d87c1f52", null ], + [ "e_moon_rise_l6680", "pa__macro_8py.html#a3051ddab364fdf57567c9b2ba94fa6b2", null ], + [ "e_moon_rise_l6700", "pa__macro_8py.html#abbaa30225d0eba14c6195ac77f0acb17", null ], + [ "e_moon_set", "pa__macro_8py.html#a1c3f54d11f8b5b6c756bc14199ae3eb2", null ], + [ "e_moon_set_l6680", "pa__macro_8py.html#a588713ac66d586999c3c3b6c002624b9", null ], + [ "e_moon_set_l6700", "pa__macro_8py.html#ad7888da366adfedec9049cf416155290", null ], + [ "e_rs", "pa__macro_8py.html#accf0f6640e9526ca6da169ddab0943bd", null ], + [ "e_sun_rs", "pa__macro_8py.html#aaabc9ca8d45932cf13283b18974d413b", null ], + [ "e_sun_rs_l3710", "pa__macro_8py.html#ac51cc7d8d3a7fdbd4f362e50193de6a8", null ], + [ "e_twilight", "pa__macro_8py.html#a809f18de9f76acc73bee4458ee17f694", null ], + [ "e_twilight_l3710", "pa__macro_8py.html#ac591fd2559e07e0a401d2781c436123c", null ], + [ "ec_dec", "pa__macro_8py.html#a846197591fb08834cd64d849e5c19cfc", null ], + [ "ec_ra", "pa__macro_8py.html#abdd55d706b911f4f0bec3b98621201d1", null ], + [ "eccentric_anomaly", "pa__macro_8py.html#aaf5c6edff0cfea9bc1a4b2dcd10dce1c", null ], + [ "eq_alt", "pa__macro_8py.html#a3d324c027667e86ca93eca1474f33c47", null ], + [ "eq_az", "pa__macro_8py.html#a891be99a888a57496066551877381f6a", null ], + [ "eq_e_lat", "pa__macro_8py.html#a246f46ef1cf7cd93d01ea23ed78ab727", null ], + [ "eq_e_long", "pa__macro_8py.html#aed12f47f471197809d5987c0bf2061ff", null ], + [ "f_dow", "pa__macro_8py.html#a37e477f7b58d705a15f7ae3bdae41304", null ], + [ "f_part", "pa__macro_8py.html#a1919879b878ae9c8051083293912edc6", null ], + [ "fract", "pa__macro_8py.html#a9343576b800565b60f135f5f9510307c", null ], + [ "full_moon", "pa__macro_8py.html#a56feb4f0dad22830627f57a288d20fae", null ], + [ "gst_lst", "pa__macro_8py.html#ab231f1f9db003559dc64170365c8d133", null ], + [ "gst_ut", "pa__macro_8py.html#a6d47a406e1b10a1fba09a76f8693dc80", null ], + [ "ha_ra", "pa__macro_8py.html#a06c8bb32b88eb03689ba130e17e5e69b", null ], + [ "hms_dh", "pa__macro_8py.html#a43a4596b8c96774b9f277dd2209cd06c", null ], + [ "hor_dec", "pa__macro_8py.html#affd159e8e88b91904558baff5cfe538b", null ], + [ "hor_ha", "pa__macro_8py.html#aa45f444af815b93d1d5b88a5d4ed53b0", null ], + [ "iint", "pa__macro_8py.html#a183688ea9868beb50f0227010d223f4d", null ], + [ "jdc_day", "pa__macro_8py.html#ab2b1b3d413b7ac0b4046bf10a86e153c", null ], + [ "jdc_month", "pa__macro_8py.html#af23f2b93521938aff5011cc98680b05a", null ], + [ "jdc_year", "pa__macro_8py.html#aa7c4db5c73214d4fe195e876fa541dcb", null ], + [ "lct_gday", "pa__macro_8py.html#a46edb7e554811ce6321e7db418f80f7c", null ], + [ "lct_gmonth", "pa__macro_8py.html#a105f28dd78c95603fffb2db1984fbe12", null ], + [ "lct_gyear", "pa__macro_8py.html#a5785e385bddfefe0b922b91cd0a0ec1a", null ], + [ "lct_ut", "pa__macro_8py.html#a8262d7ce106918f0b279edbd4356a7d1", null ], + [ "lint", "pa__macro_8py.html#a91b8faef2e6bd134254cd5f596a162ed", null ], + [ "lst_gst", "pa__macro_8py.html#a22c400268a08a350c72f2c0830d4e40b", null ], + [ "lunar_eclipse_occurrence", "pa__macro_8py.html#a40312f6ac912d41a907d2bc9bf323456", null ], + [ "lunar_eclipse_occurrence_l6855", "pa__macro_8py.html#a6d4798a56972a9b1bf4dd35496a66a18", null ], + [ "mag_lunar_eclipse", "pa__macro_8py.html#a91044fea690474429ca7c3b9c8124b31", null ], + [ "mag_solar_eclipse", "pa__macro_8py.html#a7b33e18563369df1c45616322b7618f7", null ], + [ "mag_solar_eclipse_l7390", "pa__macro_8py.html#abd91674b9bca5a624f756949dfb20a19", null ], + [ "moon_dist", "pa__macro_8py.html#ab22050aced35c0adce5617e66f18d2fd", null ], + [ "moon_hp", "pa__macro_8py.html#aba7a5ece48ac48e22d661556d2cfaa14", null ], + [ "moon_lat", "pa__macro_8py.html#a9daed488b5de1cbfc98a7136e0bd1a05", null ], + [ "moon_long", "pa__macro_8py.html#a23d02d81556d7695f63cae4e3df19dbb", null ], + [ "moon_long_lat_hp", "pa__macro_8py.html#af5b4537b14bb450a8f25e33101845a86", null ], + [ "moon_mean_anomaly", "pa__macro_8py.html#af70a4720345b0e73b857c91dd84df3da", null ], + [ "moon_phase", "pa__macro_8py.html#aa5d6562291f66ac8fac04d89e3b90652", null ], + [ "moon_rise_az", "pa__macro_8py.html#a5f043e44ceb70f32d3f255cd02ff53a4", null ], + [ "moon_rise_az_l6680", "pa__macro_8py.html#ab9b8773345c7d4922ffb682ba9ea2b36", null ], + [ "moon_rise_az_l6700", "pa__macro_8py.html#ae864c757a1bd2961c994dc5c69369b38", null ], + [ "moon_rise_lc_dmy", "pa__macro_8py.html#a2ffd81a6353e989306ce41e4dce90675", null ], + [ "moon_rise_lc_dmy_l6680", "pa__macro_8py.html#a6409ca331112e19d32e71ce779d1f209", null ], + [ "moon_rise_lc_dmy_l6700", "pa__macro_8py.html#af464c217e6c13de9c5e1971272ec6049", null ], + [ "moon_rise_lct", "pa__macro_8py.html#ac0ab9a097c01383f6d6cc07b90e034a1", null ], + [ "moon_rise_lct_l6680", "pa__macro_8py.html#a8378463a64c32022f516594e0b152cb1", null ], + [ "moon_rise_lct_l6700", "pa__macro_8py.html#a745a450e3468bf4c214e902973a43c57", null ], + [ "moon_set_az", "pa__macro_8py.html#a561759d6302e17ad046c1cf74a8fdb14", null ], + [ "moon_set_az_l6680", "pa__macro_8py.html#a045fb010333f74a3359efd9dc69d626d", null ], + [ "moon_set_az_l6700", "pa__macro_8py.html#a49ce367bffc3b56a48eaa3bd1a03aefe", null ], + [ "moon_set_lc_dmy", "pa__macro_8py.html#a881ded591e2b18b78a5b25d4e92b2d46", null ], + [ "moon_set_lc_dmy_l6680", "pa__macro_8py.html#a2ff94df12871eb0c84974727ea3c8d31", null ], + [ "moon_set_lc_dmy_l6700", "pa__macro_8py.html#ac8d49b52926ba75b6a77254e0507ee34", null ], + [ "moon_set_lct", "pa__macro_8py.html#a1fd51be6c6ceda184cf4c4489b540f03", null ], + [ "moon_set_lct_l6680", "pa__macro_8py.html#aeaacca1e8e60a5ed13a98ee07e6f0228", null ], + [ "moon_set_lct_l6700", "pa__macro_8py.html#aac6e50514786edd12ba3e9e8fbc9fcb1", null ], + [ "moon_size", "pa__macro_8py.html#a27fdf19dffe998871f90355393cf502f", null ], + [ "new_moon", "pa__macro_8py.html#acc8244f47cc29d7a0078a55df59c9c7c", null ], + [ "new_moon_full_moon_l6855", "pa__macro_8py.html#ab80cabb007a1e6783a13506d4351908a", null ], + [ "nutat_long", "pa__macro_8py.html#a681b21159361cc3479105fc31ef861fc", null ], + [ "nutat_obl", "pa__macro_8py.html#a84765422e7420803ede32148d0e014a7", null ], + [ "obliq", "pa__macro_8py.html#a3716ff9bcaf920e2a9cfa2f0ada15f9c", null ], + [ "p_comet_long_lat_dist", "pa__macro_8py.html#a1b5eac8af576ccd6282b7b7a63c3e89a", null ], + [ "parallax_dec", "pa__macro_8py.html#a4d0959d2a036f25b36da7701f7d09315", null ], + [ "parallax_dec_l2870", "pa__macro_8py.html#a0f2f9fa28025bfd0727c883df3ce2ab0", null ], + [ "parallax_ha", "pa__macro_8py.html#a6c896247bc90faedeedcf3c665b51a01", null ], + [ "parallax_ha_l2870", "pa__macro_8py.html#a0aa85cbdf3b976861aa96408228319d3", null ], + [ "planet_coordinates", "pa__macro_8py.html#a8782f3703c6fe128bf2432bc34879a32", null ], + [ "planet_long_l4685", "pa__macro_8py.html#ac92a92e61b4e46a4d808191e804ee1a5", null ], + [ "planet_long_l4735", "pa__macro_8py.html#a58e6721f2901ab6341c5186fd16d212e", null ], + [ "planet_long_l4810", "pa__macro_8py.html#a757dbf1cc823969685ac2365b5f83658", null ], + [ "planet_long_l4945", "pa__macro_8py.html#ae798655da82fabfa4704371a2119eba6", null ], + [ "ra_ha", "pa__macro_8py.html#a7fa8b9715d61034fc8baa40a474fcff7", null ], + [ "refract", "pa__macro_8py.html#a5b7bb777e3f52ba07f7256a7e1df3965", null ], + [ "refract_l3035", "pa__macro_8py.html#abed8f9a046213013a6bcc1372a39ff3c", null ], + [ "rise_set_azimuth_rise", "pa__macro_8py.html#a518d3ead799e5c593203e48f981fe11f", null ], + [ "rise_set_azimuth_set", "pa__macro_8py.html#a5a33468388fa7aff143abc68c1628aeb", null ], + [ "rise_set_local_sidereal_time_rise", "pa__macro_8py.html#ab9395fb16dedf1a5a756b857b0f78587", null ], + [ "rise_set_local_sidereal_time_set", "pa__macro_8py.html#a4068b7600e8d1a43fb973369c96eaa04", null ], + [ "sgn", "pa__macro_8py.html#a87fc05d5af8b1cbc4d983a85aeb12283", null ], + [ "solar_eclipse_occurrence", "pa__macro_8py.html#a64363c2534f9760556a100e707daf6ec", null ], + [ "solar_eclipse_occurrence_l6855", "pa__macro_8py.html#a7eeeb8f52fbd280a72946911feac1740", null ], + [ "solve_cubic", "pa__macro_8py.html#ac5dafeb29d3bca13621453cd7866c940", null ], + [ "sun_dia", "pa__macro_8py.html#a7b72953a8ffc673dde9f45cfdb1db023", null ], + [ "sun_dist", "pa__macro_8py.html#a63205ef979e0a315706eb0b3c60e4560", null ], + [ "sun_e_long", "pa__macro_8py.html#af6721a46a0142cb48d596bb08a409023", null ], + [ "sun_ecc", "pa__macro_8py.html#a8dddf7b4dbc52301122b4fe2c980c037", null ], + [ "sun_long", "pa__macro_8py.html#a9833772b0c9312c4973c770fc45ce825", null ], + [ "sun_mean_anomaly", "pa__macro_8py.html#aa335c9bd97815c75018151aff53c47f9", null ], + [ "sun_peri", "pa__macro_8py.html#ab70147487826c19f7ce0e47fc2b6ce08", null ], + [ "sun_true_anomaly", "pa__macro_8py.html#a1e330f4a543e6d40e3979bcef2fd27de", null ], + [ "sunrise_az", "pa__macro_8py.html#ae031ec483a748b030faf63aff4a05af5", null ], + [ "sunrise_az_l3710", "pa__macro_8py.html#aa5d13be74e51834eabb9b445d9ad301e", null ], + [ "sunrise_lct", "pa__macro_8py.html#a318a23d1a928a0b53d4ce73888fc118c", null ], + [ "sunrise_lct_l3710", "pa__macro_8py.html#a3dadd77c196d1a78b4c02ade839ab19c", null ], + [ "sunset_az", "pa__macro_8py.html#a9f41dc6f857569eae75081be194c51a0", null ], + [ "sunset_az_l3710", "pa__macro_8py.html#a85e47f2be8bd9e14228014a07c262638", null ], + [ "sunset_lct", "pa__macro_8py.html#a3e49a251ed884ffe18ddfc05d5dd275c", null ], + [ "sunset_lct_l3710", "pa__macro_8py.html#aff1c66bc72fd0b541eda355c3308d71a", null ], + [ "true_anomaly", "pa__macro_8py.html#a6a2e51256465c8a9ed7683f1058e71f3", null ], + [ "twilight_am_lct", "pa__macro_8py.html#a3b3c949a60b889c878cd6bd79790943a", null ], + [ "twilight_am_lct_l3710", "pa__macro_8py.html#aacbb1c1872762d0f355a126d6e7c7c98", null ], + [ "twilight_pm_lct", "pa__macro_8py.html#a210d9af39cca8495146cd91c1f6ef2b4", null ], + [ "twilight_pm_lct_l3710", "pa__macro_8py.html#a82b2a832e3984d7980b1d92bf20e21f6", null ], + [ "unwind", "pa__macro_8py.html#a85c5e18e296e6571a70ef3dbef5bb394", null ], + [ "unwind_deg", "pa__macro_8py.html#a0fd38430a2b34a11124d7e58da7812f7", null ], + [ "unwind_rad", "pa__macro_8py.html#a2cea96910cb7df148bcaa246eef0be15", null ], + [ "ut_day_adjust", "pa__macro_8py.html#aa1986a7814f603a649d46d6d994558ef", null ], + [ "ut_end_total_lunar_eclipse", "pa__macro_8py.html#aab795045e326e5ebc39c994d97e12187", null ], + [ "ut_end_umbra_lunar_eclipse", "pa__macro_8py.html#a6ab1e97f378283e05efc3ff532798def", null ], + [ "ut_first_contact_lunar_eclipse", "pa__macro_8py.html#a904c7a5da1387c176fb3a7324a78088c", null ], + [ "ut_first_contact_solar_eclipse", "pa__macro_8py.html#a29a084742d81410764e27a9c72f567d7", null ], + [ "ut_first_contact_solar_eclipse_l7390", "pa__macro_8py.html#a45d2d62ed9a459b0209326da47785145", null ], + [ "ut_gst", "pa__macro_8py.html#a325087e87c581b42487fa2de4aa5c282", null ], + [ "ut_last_contact_lunar_eclipse", "pa__macro_8py.html#a67f15513275d9300e3efef985f4d5291", null ], + [ "ut_last_contact_solar_eclipse", "pa__macro_8py.html#a1ee1b22776bf8592086a3ee158648693", null ], + [ "ut_last_contact_solar_eclipse_l7390", "pa__macro_8py.html#a7927cec9c423873d3ecca5c3c433b82c", null ], + [ "ut_lc_day", "pa__macro_8py.html#a2ce7a80d4b9db334e3a9c11e3ad9c094", null ], + [ "ut_lc_month", "pa__macro_8py.html#a678b8e7e23c97823649589a94b55c062", null ], + [ "ut_lc_year", "pa__macro_8py.html#a8b857a7a6b35ef5e28f9f07441727680", null ], + [ "ut_lct", "pa__macro_8py.html#a0c65bcdf6c40b6921c80f7df8b7ada4e", null ], + [ "ut_max_lunar_eclipse", "pa__macro_8py.html#aa8228f5d17279c86196935d1d59da20a", null ], + [ "ut_max_solar_eclipse", "pa__macro_8py.html#a8890e77811d6930958f566ca9cabf370", null ], + [ "ut_max_solar_eclipse_l7390", "pa__macro_8py.html#a70ee926aa08528ed97ce26176364b92a", null ], + [ "ut_start_total_lunar_eclipse", "pa__macro_8py.html#a15a292cef81b794f9f4b07fb48fbf471", null ], + [ "ut_start_umbra_lunar_eclipse", "pa__macro_8py.html#ac8234ad97d3fe0aebb7999f366ac41a4", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__moon_8py.html b/practical_astronomy/source/docs/pa__moon_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..dc528edc7ef8a644a7ac4be2464874110a089a11 --- /dev/null +++ b/practical_astronomy/source/docs/pa__moon_8py.html @@ -0,0 +1,122 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_moon.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_moon.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_moon
     
    + + + + + + + + + + + + + +

    +Functions

    def approximate_position_of_moon (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def precise_position_of_moon (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moon_phase (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, accuracy_level="A")
     
    def times_of_new_moon_and_full_moon (is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moon_dist_ang_diam_hor_parallax (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year)
     
    def moonrise_and_moonset (local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours, geog_long_deg, geog_lat_deg)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__moon_8py.js b/practical_astronomy/source/docs/pa__moon_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..1cb6789ca00be03b1378d111db4d61a6a50cabe0 --- /dev/null +++ b/practical_astronomy/source/docs/pa__moon_8py.js @@ -0,0 +1,9 @@ +var pa__moon_8py = +[ + [ "approximate_position_of_moon", "pa__moon_8py.html#a9d7c63bb40e4cceabce9850764b780b5", null ], + [ "moon_dist_ang_diam_hor_parallax", "pa__moon_8py.html#aedd86f345903593ab5e8bda8548f5c13", null ], + [ "moon_phase", "pa__moon_8py.html#a0a21dc7776e79ad9d26f27d6da65139e", null ], + [ "moonrise_and_moonset", "pa__moon_8py.html#a303811d67109d57d62bf8914de754cfe", null ], + [ "precise_position_of_moon", "pa__moon_8py.html#a4a39acc6f3fcf1ecdda0e13ce5d870ce", null ], + [ "times_of_new_moon_and_full_moon", "pa__moon_8py.html#a4243e54e26b84728838b58796f8e4cb9", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__planet_8py.html b/practical_astronomy/source/docs/pa__planet_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..e9219e604374df7746334e5d2c7880efb891d152 --- /dev/null +++ b/practical_astronomy/source/docs/pa__planet_8py.html @@ -0,0 +1,116 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_planet.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_planet.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_planet
     
    + + + + + + + +

    +Functions

    def approximate_position_of_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    def precise_position_of_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    def visual_aspects_of_a_planet (lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__planet_8py.js b/practical_astronomy/source/docs/pa__planet_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..ee76f483dde306dd61f2c792f9f80c35018a8547 --- /dev/null +++ b/practical_astronomy/source/docs/pa__planet_8py.js @@ -0,0 +1,6 @@ +var pa__planet_8py = +[ + [ "approximate_position_of_planet", "pa__planet_8py.html#a1f4d8635886fb19f0be50ef1eb973ba0", null ], + [ "precise_position_of_planet", "pa__planet_8py.html#aeb953f985c7f33b29ecea14f0bdfe255", null ], + [ "visual_aspects_of_a_planet", "pa__planet_8py.html#a653d491b54bd718f4ea7949fa69b9b4c", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__planet__data_8py.html b/practical_astronomy/source/docs/pa__planet__data_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..a781b32972db8e4804dec000b2c005aef9b06621 --- /dev/null +++ b/practical_astronomy/source/docs/pa__planet__data_8py.html @@ -0,0 +1,118 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_planet_data.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_planet_data.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_planet_data
     
    + + + +

    +Functions

    def get_planet_data (planet_name)
     
    + + + +

    +Variables

    dictionary PlanetData
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__planet__data_8py.js b/practical_astronomy/source/docs/pa__planet__data_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..697183771f790a4f8ae7d90d040edec6e083c767 --- /dev/null +++ b/practical_astronomy/source/docs/pa__planet__data_8py.js @@ -0,0 +1,5 @@ +var pa__planet__data_8py = +[ + [ "get_planet_data", "pa__planet__data_8py.html#a80b3d5ea375b6d3724171ba6f2cb4a2b", null ], + [ "PlanetData", "pa__planet__data_8py.html#aafde02b5f4bc4c9f9be616ba43f50bf2", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__sun_8py.html b/practical_astronomy/source/docs/pa__sun_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..382ec59677c5c0b8eaeed4c0405a21da09cf0109 --- /dev/null +++ b/practical_astronomy/source/docs/pa__sun_8py.html @@ -0,0 +1,124 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_sun.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_sun.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_sun
     
    + + + + + + + + + + + + + + + +

    +Functions

    def approximate_position_of_sun (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def precise_position_of_sun (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def sun_distance_and_angular_size (lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction)
     
    def sunrise_and_sunset (local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg)
     
    def morning_and_evening_twilight (local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type)
     
    def equation_of_time (gwdate_day, gwdate_month, gwdate_year)
     
    def solar_elongation (ra_hour, ra_min, ra_sec, dec_deg, dec_min, dec_sec, gwdate_day, gwdate_month, gwdate_year)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__sun_8py.js b/practical_astronomy/source/docs/pa__sun_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..096c854a570e7379a7f7e2396c78026c0ce730d5 --- /dev/null +++ b/practical_astronomy/source/docs/pa__sun_8py.js @@ -0,0 +1,10 @@ +var pa__sun_8py = +[ + [ "approximate_position_of_sun", "pa__sun_8py.html#a45d2ca4ae26d8cded6b5f3eed8eca785", null ], + [ "equation_of_time", "pa__sun_8py.html#a041439423740ffa2b4f6e9b567586a2d", null ], + [ "morning_and_evening_twilight", "pa__sun_8py.html#adfbd4639478f5952b5dffe334071fa26", null ], + [ "precise_position_of_sun", "pa__sun_8py.html#a6fbea6a71648f5f0d7b254743bcb5b44", null ], + [ "solar_elongation", "pa__sun_8py.html#ab4ff369aaa2e7ce1f93dae29e83c6c80", null ], + [ "sun_distance_and_angular_size", "pa__sun_8py.html#a5704841679b2d5ed8367298db7e406f3", null ], + [ "sunrise_and_sunset", "pa__sun_8py.html#a6fc7c4ad24c37eabb246d4cb28adaccf", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pa__util_8py.html b/practical_astronomy/source/docs/pa__util_8py.html new file mode 100644 index 0000000000000000000000000000000000000000..163936899a59fbfe803e51504584b35dca9e7437 --- /dev/null +++ b/practical_astronomy/source/docs/pa__util_8py.html @@ -0,0 +1,116 @@ + + + + + + + +Practical Astronomy: /home/jimc/projects/Practical Astronomy/practical-astronomy-python-venv/practical-astronomy-python/src/practical_astronomy/pa_util.py File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    pa_util.py File Reference
    +
    +
    + + + + +

    +Namespaces

     practical_astronomy.pa_util
     
    + + + + + + + +

    +Functions

    def is_leap_year (year)
     
    def mi_to_km (miles)
     
    def km_to_mi (kilometers)
     
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/pa__util_8py.js b/practical_astronomy/source/docs/pa__util_8py.js new file mode 100644 index 0000000000000000000000000000000000000000..c76fcdd17039b585a6fb0b34e8df2af198b59800 --- /dev/null +++ b/practical_astronomy/source/docs/pa__util_8py.js @@ -0,0 +1,6 @@ +var pa__util_8py = +[ + [ "is_leap_year", "pa__util_8py.html#a4bde6043f052777f35147c29658b728a", null ], + [ "km_to_mi", "pa__util_8py.html#a29de8f0275076afc08b7f2ed98080bdb", null ], + [ "mi_to_km", "pa__util_8py.html#a1aa17b78e46a1d549c7871de9797c9de", null ] +]; \ No newline at end of file diff --git a/practical_astronomy/source/docs/pages.html b/practical_astronomy/source/docs/pages.html new file mode 100644 index 0000000000000000000000000000000000000000..f59e3e9df1471a12e69c988d5e9b13df8687676c --- /dev/null +++ b/practical_astronomy/source/docs/pages.html @@ -0,0 +1,102 @@ + + + + + + + +Practical Astronomy: Related Pages + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Practical Astronomy +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    +
    + + + + diff --git a/practical_astronomy/source/docs/resize.js b/practical_astronomy/source/docs/resize.js new file mode 100644 index 0000000000000000000000000000000000000000..e1ad0fe3ba04a73ec0adc2aa8b344823516a15a7 --- /dev/null +++ b/practical_astronomy/source/docs/resize.js @@ -0,0 +1,140 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/practical_astronomy/source/docs/search/all_0.html b/practical_astronomy/source/docs/search/all_0.html new file mode 100644 index 0000000000000000000000000000000000000000..1ec5b2d597f21e1c7b676f7f3167ffc217622540 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_0.js b/practical_astronomy/source/docs/search/all_0.js new file mode 100644 index 0000000000000000000000000000000000000000..574bf5462302230c35701c493b251ed35fd29968 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_2epy_0',['__init__.py',['../____init_____8py.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/all_1.html b/practical_astronomy/source/docs/search/all_1.html new file mode 100644 index 0000000000000000000000000000000000000000..9f80e90431b7c693060f893c643e63cdcf60f53c --- /dev/null +++ b/practical_astronomy/source/docs/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_1.js b/practical_astronomy/source/docs/search/all_1.js new file mode 100644 index 0000000000000000000000000000000000000000..71b7262bfa5b384f56b527abb7b50bf12a6c6e02 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_1.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['angle_1',['angle',['../namespacepractical__astronomy_1_1pa__macro.html#aa89a8971eecab46c843d55b6b558baa5',1,'practical_astronomy::pa_macro']]], + ['angle_5fbetween_5ftwo_5fobjects_2',['angle_between_two_objects',['../namespacepractical__astronomy_1_1pa__coordinate.html#aeff3946906765330d3df8e9295c5636c',1,'practical_astronomy::pa_coordinate']]], + ['angle_5fto_5fdecimal_5fdegrees_3',['angle_to_decimal_degrees',['../namespacepractical__astronomy_1_1pa__coordinate.html#a987813f23727409ec84bf5b7758e4196',1,'practical_astronomy::pa_coordinate']]], + ['approximate_5fposition_5fof_5fmoon_4',['approximate_position_of_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a9d7c63bb40e4cceabce9850764b780b5',1,'practical_astronomy::pa_moon']]], + ['approximate_5fposition_5fof_5fplanet_5',['approximate_position_of_planet',['../namespacepractical__astronomy_1_1pa__planet.html#a1f4d8635886fb19f0be50ef1eb973ba0',1,'practical_astronomy::pa_planet']]], + ['approximate_5fposition_5fof_5fsun_6',['approximate_position_of_sun',['../namespacepractical__astronomy_1_1pa__sun.html#a45d2ca4ae26d8cded6b5f3eed8eca785',1,'practical_astronomy::pa_sun']]], + ['atan2_7',['atan2',['../namespacepractical__astronomy_1_1pa__macro.html#a46bf770e83278c32641d88a14afa4743',1,'practical_astronomy::pa_macro']]], + ['atmospheric_5frefraction_8',['atmospheric_refraction',['../namespacepractical__astronomy_1_1pa__coordinate.html#afca7093308d31a18052d1212a5532229',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_10.html b/practical_astronomy/source/docs/search/all_10.html new file mode 100644 index 0000000000000000000000000000000000000000..3bf11961ff0ed8440b733127a84bcbde54b71b07 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_10.js b/practical_astronomy/source/docs/search/all_10.js new file mode 100644 index 0000000000000000000000000000000000000000..f1a8c11fb969e47207638de44cdd8d38d717a791 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_10.js @@ -0,0 +1,47 @@ +var searchData= +[ + ['p_5fcomet_5flong_5flat_5fdist_145',['p_comet_long_lat_dist',['../namespacepractical__astronomy_1_1pa__macro.html#a1b5eac8af576ccd6282b7b7a63c3e89a',1,'practical_astronomy::pa_macro']]], + ['pa_5fbinary_146',['pa_binary',['../namespacepractical__astronomy_1_1pa__binary.html',1,'practical_astronomy']]], + ['pa_5fbinary_2epy_147',['pa_binary.py',['../pa__binary_8py.html',1,'']]], + ['pa_5fbinary_5fdata_148',['pa_binary_data',['../namespacepractical__astronomy_1_1pa__binary__data.html',1,'practical_astronomy']]], + ['pa_5fbinary_5fdata_2epy_149',['pa_binary_data.py',['../pa__binary__data_8py.html',1,'']]], + ['pa_5fcomet_150',['pa_comet',['../namespacepractical__astronomy_1_1pa__comet.html',1,'practical_astronomy']]], + ['pa_5fcomet_2epy_151',['pa_comet.py',['../pa__comet_8py.html',1,'']]], + ['pa_5fcomet_5fdata_152',['pa_comet_data',['../namespacepractical__astronomy_1_1pa__comet__data.html',1,'practical_astronomy']]], + ['pa_5fcomet_5fdata_2epy_153',['pa_comet_data.py',['../pa__comet__data_8py.html',1,'']]], + ['pa_5fcoordinate_154',['pa_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html',1,'practical_astronomy']]], + ['pa_5fcoordinate_2epy_155',['pa_coordinate.py',['../pa__coordinate_8py.html',1,'']]], + ['pa_5fdatetime_156',['pa_datetime',['../namespacepractical__astronomy_1_1pa__datetime.html',1,'practical_astronomy']]], + ['pa_5fdatetime_2epy_157',['pa_datetime.py',['../pa__datetime_8py.html',1,'']]], + ['pa_5feclipses_158',['pa_eclipses',['../namespacepractical__astronomy_1_1pa__eclipses.html',1,'practical_astronomy']]], + ['pa_5feclipses_2epy_159',['pa_eclipses.py',['../pa__eclipses_8py.html',1,'']]], + ['pa_5fmacro_160',['pa_macro',['../namespacepractical__astronomy_1_1pa__macro.html',1,'practical_astronomy']]], + ['pa_5fmacro_2epy_161',['pa_macro.py',['../pa__macro_8py.html',1,'']]], + ['pa_5fmoon_162',['pa_moon',['../namespacepractical__astronomy_1_1pa__moon.html',1,'practical_astronomy']]], + ['pa_5fmoon_2epy_163',['pa_moon.py',['../pa__moon_8py.html',1,'']]], + ['pa_5fplanet_164',['pa_planet',['../namespacepractical__astronomy_1_1pa__planet.html',1,'practical_astronomy']]], + ['pa_5fplanet_2epy_165',['pa_planet.py',['../pa__planet_8py.html',1,'']]], + ['pa_5fplanet_5fdata_166',['pa_planet_data',['../namespacepractical__astronomy_1_1pa__planet__data.html',1,'practical_astronomy']]], + ['pa_5fplanet_5fdata_2epy_167',['pa_planet_data.py',['../pa__planet__data_8py.html',1,'']]], + ['pa_5fsun_168',['pa_sun',['../namespacepractical__astronomy_1_1pa__sun.html',1,'practical_astronomy']]], + ['pa_5fsun_2epy_169',['pa_sun.py',['../pa__sun_8py.html',1,'']]], + ['pa_5futil_170',['pa_util',['../namespacepractical__astronomy_1_1pa__util.html',1,'practical_astronomy']]], + ['pa_5futil_2epy_171',['pa_util.py',['../pa__util_8py.html',1,'']]], + ['parallax_5fdec_172',['parallax_dec',['../namespacepractical__astronomy_1_1pa__macro.html#a4d0959d2a036f25b36da7701f7d09315',1,'practical_astronomy::pa_macro']]], + ['parallax_5fdec_5fl2870_173',['parallax_dec_l2870',['../namespacepractical__astronomy_1_1pa__macro.html#a0f2f9fa28025bfd0727c883df3ce2ab0',1,'practical_astronomy::pa_macro']]], + ['parallax_5fha_174',['parallax_ha',['../namespacepractical__astronomy_1_1pa__macro.html#a6c896247bc90faedeedcf3c665b51a01',1,'practical_astronomy::pa_macro']]], + ['parallax_5fha_5fl2870_175',['parallax_ha_l2870',['../namespacepractical__astronomy_1_1pa__macro.html#a0aa85cbdf3b976861aa96408228319d3',1,'practical_astronomy::pa_macro']]], + ['planet_5fcoordinates_176',['planet_coordinates',['../namespacepractical__astronomy_1_1pa__macro.html#a8782f3703c6fe128bf2432bc34879a32',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4685_177',['planet_long_l4685',['../namespacepractical__astronomy_1_1pa__macro.html#ac92a92e61b4e46a4d808191e804ee1a5',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4735_178',['planet_long_l4735',['../namespacepractical__astronomy_1_1pa__macro.html#a58e6721f2901ab6341c5186fd16d212e',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4810_179',['planet_long_l4810',['../namespacepractical__astronomy_1_1pa__macro.html#a757dbf1cc823969685ac2365b5f83658',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4945_180',['planet_long_l4945',['../namespacepractical__astronomy_1_1pa__macro.html#ae798655da82fabfa4704371a2119eba6',1,'practical_astronomy::pa_macro']]], + ['planetdata_181',['PlanetData',['../namespacepractical__astronomy_1_1pa__planet__data.html#aafde02b5f4bc4c9f9be616ba43f50bf2',1,'practical_astronomy::pa_planet_data']]], + ['position_5fof_5felliptical_5fcomet_182',['position_of_elliptical_comet',['../namespacepractical__astronomy_1_1pa__comet.html#aa3d042bef43ebd6669b43eb87c5e515a',1,'practical_astronomy::pa_comet']]], + ['position_5fof_5fparabolic_5fcomet_183',['position_of_parabolic_comet',['../namespacepractical__astronomy_1_1pa__comet.html#aec2f1ca117599741cfb24e597c8f3ac6',1,'practical_astronomy::pa_comet']]], + ['practical_2dastronomy_2dpython_184',['practical-astronomy-python',['../index.html',1,'']]], + ['practical_5fastronomy_185',['practical_astronomy',['../namespacepractical__astronomy.html',1,'']]], + ['precise_5fposition_5fof_5fmoon_186',['precise_position_of_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a4a39acc6f3fcf1ecdda0e13ce5d870ce',1,'practical_astronomy::pa_moon']]], + ['precise_5fposition_5fof_5fplanet_187',['precise_position_of_planet',['../namespacepractical__astronomy_1_1pa__planet.html#aeb953f985c7f33b29ecea14f0bdfe255',1,'practical_astronomy::pa_planet']]], + ['precise_5fposition_5fof_5fsun_188',['precise_position_of_sun',['../namespacepractical__astronomy_1_1pa__sun.html#a6fbea6a71648f5f0d7b254743bcb5b44',1,'practical_astronomy::pa_sun']]] +]; diff --git a/practical_astronomy/source/docs/search/all_11.html b/practical_astronomy/source/docs/search/all_11.html new file mode 100644 index 0000000000000000000000000000000000000000..c9f79d289607bf6e9e4b576bbdc069f5109d30a1 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_11.js b/practical_astronomy/source/docs/search/all_11.js new file mode 100644 index 0000000000000000000000000000000000000000..73abb399e4a24cf8cbc23e1755d0debe4f981793 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_11.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['ra_5fha_189',['ra_ha',['../namespacepractical__astronomy_1_1pa__macro.html#a7fa8b9715d61034fc8baa40a474fcff7',1,'practical_astronomy::pa_macro']]], + ['readme_2emd_190',['README.md',['../README_8md.html',1,'']]], + ['refract_191',['refract',['../namespacepractical__astronomy_1_1pa__macro.html#a5b7bb777e3f52ba07f7256a7e1df3965',1,'practical_astronomy::pa_macro']]], + ['refract_5fl3035_192',['refract_l3035',['../namespacepractical__astronomy_1_1pa__macro.html#abed8f9a046213013a6bcc1372a39ff3c',1,'practical_astronomy::pa_macro']]], + ['right_5fascension_5fto_5fhour_5fangle_193',['right_ascension_to_hour_angle',['../namespacepractical__astronomy_1_1pa__coordinate.html#a4dffecdd7b376164a88b03227776b67a',1,'practical_astronomy::pa_coordinate']]], + ['rise_5fset_5fazimuth_5frise_194',['rise_set_azimuth_rise',['../namespacepractical__astronomy_1_1pa__macro.html#a518d3ead799e5c593203e48f981fe11f',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5fazimuth_5fset_195',['rise_set_azimuth_set',['../namespacepractical__astronomy_1_1pa__macro.html#a5a33468388fa7aff143abc68c1628aeb',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5flocal_5fsidereal_5ftime_5frise_196',['rise_set_local_sidereal_time_rise',['../namespacepractical__astronomy_1_1pa__macro.html#ab9395fb16dedf1a5a756b857b0f78587',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5flocal_5fsidereal_5ftime_5fset_197',['rise_set_local_sidereal_time_set',['../namespacepractical__astronomy_1_1pa__macro.html#a4068b7600e8d1a43fb973369c96eaa04',1,'practical_astronomy::pa_macro']]], + ['rising_5fand_5fsetting_198',['rising_and_setting',['../namespacepractical__astronomy_1_1pa__coordinate.html#accf030a9add4b8f1a81ed808c3caf70a',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_12.html b/practical_astronomy/source/docs/search/all_12.html new file mode 100644 index 0000000000000000000000000000000000000000..ab934722c570c0307bd07c1c1c048d965d4a463f --- /dev/null +++ b/practical_astronomy/source/docs/search/all_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_12.js b/practical_astronomy/source/docs/search/all_12.js new file mode 100644 index 0000000000000000000000000000000000000000..c30db7530d2c77b5a0ddccf33f6c141a322071cd --- /dev/null +++ b/practical_astronomy/source/docs/search/all_12.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['selenographic_5fcoordinates_5f1_199',['selenographic_coordinates_1',['../namespacepractical__astronomy_1_1pa__coordinate.html#accf1d521e9fe1583201493f7c3c5aa3b',1,'practical_astronomy::pa_coordinate']]], + ['selenographic_5fcoordinates_5f2_200',['selenographic_coordinates_2',['../namespacepractical__astronomy_1_1pa__coordinate.html#a821e4558becfa11ef299894f12dc37f2',1,'practical_astronomy::pa_coordinate']]], + ['sgn_201',['sgn',['../namespacepractical__astronomy_1_1pa__macro.html#a87fc05d5af8b1cbc4d983a85aeb12283',1,'practical_astronomy::pa_macro']]], + ['solar_5feclipse_5fcircumstances_202',['solar_eclipse_circumstances',['../namespacepractical__astronomy_1_1pa__eclipses.html#aa5e0b860a6b90ed84dd91644a7db845e',1,'practical_astronomy::pa_eclipses']]], + ['solar_5feclipse_5foccurrence_203',['solar_eclipse_occurrence',['../namespacepractical__astronomy_1_1pa__eclipses.html#a419c3cdc66fdfadb685e0095404e0beb',1,'practical_astronomy.pa_eclipses.solar_eclipse_occurrence()'],['../namespacepractical__astronomy_1_1pa__macro.html#a64363c2534f9760556a100e707daf6ec',1,'practical_astronomy.pa_macro.solar_eclipse_occurrence(DS, ZC, DY, MN, YR)']]], + ['solar_5feclipse_5foccurrence_5fl6855_204',['solar_eclipse_occurrence_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#a7eeeb8f52fbd280a72946911feac1740',1,'practical_astronomy::pa_macro']]], + ['solar_5felongation_205',['solar_elongation',['../namespacepractical__astronomy_1_1pa__sun.html#ab4ff369aaa2e7ce1f93dae29e83c6c80',1,'practical_astronomy::pa_sun']]], + ['solve_5fcubic_206',['solve_cubic',['../namespacepractical__astronomy_1_1pa__macro.html#ac5dafeb29d3bca13621453cd7866c940',1,'practical_astronomy::pa_macro']]], + ['sun_5fdia_207',['sun_dia',['../namespacepractical__astronomy_1_1pa__macro.html#a7b72953a8ffc673dde9f45cfdb1db023',1,'practical_astronomy::pa_macro']]], + ['sun_5fdist_208',['sun_dist',['../namespacepractical__astronomy_1_1pa__macro.html#a63205ef979e0a315706eb0b3c60e4560',1,'practical_astronomy::pa_macro']]], + ['sun_5fdistance_5fand_5fangular_5fsize_209',['sun_distance_and_angular_size',['../namespacepractical__astronomy_1_1pa__sun.html#a5704841679b2d5ed8367298db7e406f3',1,'practical_astronomy::pa_sun']]], + ['sun_5fe_5flong_210',['sun_e_long',['../namespacepractical__astronomy_1_1pa__macro.html#af6721a46a0142cb48d596bb08a409023',1,'practical_astronomy::pa_macro']]], + ['sun_5fecc_211',['sun_ecc',['../namespacepractical__astronomy_1_1pa__macro.html#a8dddf7b4dbc52301122b4fe2c980c037',1,'practical_astronomy::pa_macro']]], + ['sun_5flong_212',['sun_long',['../namespacepractical__astronomy_1_1pa__macro.html#a9833772b0c9312c4973c770fc45ce825',1,'practical_astronomy::pa_macro']]], + ['sun_5fmean_5fanomaly_213',['sun_mean_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#aa335c9bd97815c75018151aff53c47f9',1,'practical_astronomy::pa_macro']]], + ['sun_5fperi_214',['sun_peri',['../namespacepractical__astronomy_1_1pa__macro.html#ab70147487826c19f7ce0e47fc2b6ce08',1,'practical_astronomy::pa_macro']]], + ['sun_5ftrue_5fanomaly_215',['sun_true_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#a1e330f4a543e6d40e3979bcef2fd27de',1,'practical_astronomy::pa_macro']]], + ['sunrise_5fand_5fsunset_216',['sunrise_and_sunset',['../namespacepractical__astronomy_1_1pa__sun.html#a6fc7c4ad24c37eabb246d4cb28adaccf',1,'practical_astronomy::pa_sun']]], + ['sunrise_5faz_217',['sunrise_az',['../namespacepractical__astronomy_1_1pa__macro.html#ae031ec483a748b030faf63aff4a05af5',1,'practical_astronomy::pa_macro']]], + ['sunrise_5faz_5fl3710_218',['sunrise_az_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aa5d13be74e51834eabb9b445d9ad301e',1,'practical_astronomy::pa_macro']]], + ['sunrise_5flct_219',['sunrise_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a318a23d1a928a0b53d4ce73888fc118c',1,'practical_astronomy::pa_macro']]], + ['sunrise_5flct_5fl3710_220',['sunrise_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a3dadd77c196d1a78b4c02ade839ab19c',1,'practical_astronomy::pa_macro']]], + ['sunset_5faz_221',['sunset_az',['../namespacepractical__astronomy_1_1pa__macro.html#a9f41dc6f857569eae75081be194c51a0',1,'practical_astronomy::pa_macro']]], + ['sunset_5faz_5fl3710_222',['sunset_az_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a85e47f2be8bd9e14228014a07c262638',1,'practical_astronomy::pa_macro']]], + ['sunset_5flct_223',['sunset_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a3e49a251ed884ffe18ddfc05d5dd275c',1,'practical_astronomy::pa_macro']]], + ['sunset_5flct_5fl3710_224',['sunset_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aff1c66bc72fd0b541eda355c3308d71a',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_13.html b/practical_astronomy/source/docs/search/all_13.html new file mode 100644 index 0000000000000000000000000000000000000000..51172c2f3c251aad0c00ee10cfff9a24c4d87f61 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_13.js b/practical_astronomy/source/docs/search/all_13.js new file mode 100644 index 0000000000000000000000000000000000000000..a2f84a2be9f798250276de4f39017e0faaee1432 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_13.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['times_5fof_5fnew_5fmoon_5fand_5ffull_5fmoon_225',['times_of_new_moon_and_full_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a4243e54e26b84728838b58796f8e4cb9',1,'practical_astronomy::pa_moon']]], + ['true_5fanomaly_226',['true_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#a6a2e51256465c8a9ed7683f1058e71f3',1,'practical_astronomy::pa_macro']]], + ['twilight_5fam_5flct_227',['twilight_am_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a3b3c949a60b889c878cd6bd79790943a',1,'practical_astronomy::pa_macro']]], + ['twilight_5fam_5flct_5fl3710_228',['twilight_am_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aacbb1c1872762d0f355a126d6e7c7c98',1,'practical_astronomy::pa_macro']]], + ['twilight_5fpm_5flct_229',['twilight_pm_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a210d9af39cca8495146cd91c1f6ef2b4',1,'practical_astronomy::pa_macro']]], + ['twilight_5fpm_5flct_5fl3710_230',['twilight_pm_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a82b2a832e3984d7980b1d92bf20e21f6',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_14.html b/practical_astronomy/source/docs/search/all_14.html new file mode 100644 index 0000000000000000000000000000000000000000..afecf5634901b407736b208b897ce43f4e26ba45 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_14.js b/practical_astronomy/source/docs/search/all_14.js new file mode 100644 index 0000000000000000000000000000000000000000..1caec95d9a3c14d2e5e0e56e1e32aa87ed6cee66 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_14.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['universal_5ftime_5fto_5fgreenwich_5fsidereal_5ftime_231',['universal_time_to_greenwich_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a55fda8f36a26dc8552cdc72a80d2ccd4',1,'practical_astronomy::pa_datetime']]], + ['universal_5ftime_5fto_5flocal_5fcivil_5ftime_232',['universal_time_to_local_civil_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a67d28e510b5411d435af43d3a105d313',1,'practical_astronomy::pa_datetime']]], + ['unwind_233',['unwind',['../namespacepractical__astronomy_1_1pa__macro.html#a85c5e18e296e6571a70ef3dbef5bb394',1,'practical_astronomy::pa_macro']]], + ['unwind_5fdeg_234',['unwind_deg',['../namespacepractical__astronomy_1_1pa__macro.html#a0fd38430a2b34a11124d7e58da7812f7',1,'practical_astronomy::pa_macro']]], + ['unwind_5frad_235',['unwind_rad',['../namespacepractical__astronomy_1_1pa__macro.html#a2cea96910cb7df148bcaa246eef0be15',1,'practical_astronomy::pa_macro']]], + ['ut_5fday_5fadjust_236',['ut_day_adjust',['../namespacepractical__astronomy_1_1pa__macro.html#aa1986a7814f603a649d46d6d994558ef',1,'practical_astronomy::pa_macro']]], + ['ut_5fend_5ftotal_5flunar_5feclipse_237',['ut_end_total_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#aab795045e326e5ebc39c994d97e12187',1,'practical_astronomy::pa_macro']]], + ['ut_5fend_5fumbra_5flunar_5feclipse_238',['ut_end_umbra_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a6ab1e97f378283e05efc3ff532798def',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5flunar_5feclipse_239',['ut_first_contact_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a904c7a5da1387c176fb3a7324a78088c',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5fsolar_5feclipse_240',['ut_first_contact_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a29a084742d81410764e27a9c72f567d7',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5fsolar_5feclipse_5fl7390_241',['ut_first_contact_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a45d2d62ed9a459b0209326da47785145',1,'practical_astronomy::pa_macro']]], + ['ut_5fgst_242',['ut_gst',['../namespacepractical__astronomy_1_1pa__macro.html#a325087e87c581b42487fa2de4aa5c282',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5flunar_5feclipse_243',['ut_last_contact_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a67f15513275d9300e3efef985f4d5291',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5fsolar_5feclipse_244',['ut_last_contact_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a1ee1b22776bf8592086a3ee158648693',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5fsolar_5feclipse_5fl7390_245',['ut_last_contact_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a7927cec9c423873d3ecca5c3c433b82c',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fday_246',['ut_lc_day',['../namespacepractical__astronomy_1_1pa__macro.html#a2ce7a80d4b9db334e3a9c11e3ad9c094',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fmonth_247',['ut_lc_month',['../namespacepractical__astronomy_1_1pa__macro.html#a678b8e7e23c97823649589a94b55c062',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fyear_248',['ut_lc_year',['../namespacepractical__astronomy_1_1pa__macro.html#a8b857a7a6b35ef5e28f9f07441727680',1,'practical_astronomy::pa_macro']]], + ['ut_5flct_249',['ut_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a0c65bcdf6c40b6921c80f7df8b7ada4e',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5flunar_5feclipse_250',['ut_max_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#aa8228f5d17279c86196935d1d59da20a',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5fsolar_5feclipse_251',['ut_max_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a8890e77811d6930958f566ca9cabf370',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5fsolar_5feclipse_5fl7390_252',['ut_max_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a70ee926aa08528ed97ce26176364b92a',1,'practical_astronomy::pa_macro']]], + ['ut_5fstart_5ftotal_5flunar_5feclipse_253',['ut_start_total_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a15a292cef81b794f9f4b07fb48fbf471',1,'practical_astronomy::pa_macro']]], + ['ut_5fstart_5fumbra_5flunar_5feclipse_254',['ut_start_umbra_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#ac8234ad97d3fe0aebb7999f366ac41a4',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_15.html b/practical_astronomy/source/docs/search/all_15.html new file mode 100644 index 0000000000000000000000000000000000000000..69f382b31da6ad0817e1e099ff8b14ab5ec4dcfd --- /dev/null +++ b/practical_astronomy/source/docs/search/all_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_15.js b/practical_astronomy/source/docs/search/all_15.js new file mode 100644 index 0000000000000000000000000000000000000000..52636eda5ca262320d00c4b8952b6434f79c7d4f --- /dev/null +++ b/practical_astronomy/source/docs/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['visual_5faspects_5fof_5fa_5fplanet_255',['visual_aspects_of_a_planet',['../namespacepractical__astronomy_1_1pa__planet.html#a653d491b54bd718f4ea7949fa69b9b4c',1,'practical_astronomy::pa_planet']]] +]; diff --git a/practical_astronomy/source/docs/search/all_2.html b/practical_astronomy/source/docs/search/all_2.html new file mode 100644 index 0000000000000000000000000000000000000000..02cfffc2e13911f86c16e1489830d3ca5d06b033 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_2.js b/practical_astronomy/source/docs/search/all_2.js new file mode 100644 index 0000000000000000000000000000000000000000..c1366af75f91fb69f80dec47721e20536add3453 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['binary_5fstar_5forbit_9',['binary_star_orbit',['../namespacepractical__astronomy_1_1pa__binary.html#ad64db60ed19e41d162237dc0b1a52a61',1,'practical_astronomy::pa_binary']]], + ['binarydata_10',['BinaryData',['../namespacepractical__astronomy_1_1pa__binary__data.html#ac5703bf2a91c2d1da46f103d171388a8',1,'practical_astronomy::pa_binary_data']]] +]; diff --git a/practical_astronomy/source/docs/search/all_3.html b/practical_astronomy/source/docs/search/all_3.html new file mode 100644 index 0000000000000000000000000000000000000000..39767b85baa9ec68a42ce7bcd9d238277818898b --- /dev/null +++ b/practical_astronomy/source/docs/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_3.js b/practical_astronomy/source/docs/search/all_3.js new file mode 100644 index 0000000000000000000000000000000000000000..d26980f6ab04a45cb6ebc3744b97604cac316524 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_3.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['carrington_5frotation_5fnumber_11',['carrington_rotation_number',['../namespacepractical__astronomy_1_1pa__coordinate.html#aea2e9ebd99d887bc7919c516f515d837',1,'practical_astronomy::pa_coordinate']]], + ['cd_5fjd_12',['cd_jd',['../namespacepractical__astronomy_1_1pa__macro.html#ae45433a24f80898f5dd0191009f39184',1,'practical_astronomy::pa_macro']]], + ['civil_5fdate_5fto_5fday_5fnumber_13',['civil_date_to_day_number',['../namespacepractical__astronomy_1_1pa__datetime.html#a085ad36535d1f6b906ebbc502dd547a3',1,'practical_astronomy::pa_datetime']]], + ['civil_5ftime_5fto_5fdecimal_5fhours_14',['civil_time_to_decimal_hours',['../namespacepractical__astronomy_1_1pa__datetime.html#a87c359a968e2ffd19d5c7ee78006762e',1,'practical_astronomy::pa_datetime']]], + ['cometdataelliptical_15',['CometDataElliptical',['../namespacepractical__astronomy_1_1pa__comet__data.html#a5dfaac06954d07c606fa71e691aa89eb',1,'practical_astronomy::pa_comet_data']]], + ['cometdataparabolic_16',['CometDataParabolic',['../namespacepractical__astronomy_1_1pa__comet__data.html#a5a4863a7e81117de4279b5afea3b8be9',1,'practical_astronomy::pa_comet_data']]], + ['correct_5ffor_5faberration_17',['correct_for_aberration',['../namespacepractical__astronomy_1_1pa__coordinate.html#a71720f0e80328a252ba574452418ea92',1,'practical_astronomy::pa_coordinate']]], + ['correct_5ffor_5fprecession_18',['correct_for_precession',['../namespacepractical__astronomy_1_1pa__coordinate.html#ac6a88c0e59835e90c871361d73f90f50',1,'practical_astronomy::pa_coordinate']]], + ['corrections_5ffor_5fgeocentric_5fparallax_19',['corrections_for_geocentric_parallax',['../namespacepractical__astronomy_1_1pa__coordinate.html#a94efd7a45ec9cb98c702bcf61d89dd39',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_4.html b/practical_astronomy/source/docs/search/all_4.html new file mode 100644 index 0000000000000000000000000000000000000000..fc40463c89f794281268400aff9c675c6c2e27f6 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_4.js b/practical_astronomy/source/docs/search/all_4.js new file mode 100644 index 0000000000000000000000000000000000000000..a6360353913982c617c163ec351091362a719df8 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_4.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['dd_5fdeg_20',['dd_deg',['../namespacepractical__astronomy_1_1pa__macro.html#ae89f6bad38c25ff72cdf2efdbf21e276',1,'practical_astronomy::pa_macro']]], + ['dd_5fdh_21',['dd_dh',['../namespacepractical__astronomy_1_1pa__macro.html#ad8fa9325ef741ca5a547a0d633339b08',1,'practical_astronomy::pa_macro']]], + ['dd_5fmin_22',['dd_min',['../namespacepractical__astronomy_1_1pa__macro.html#aceded82212785c66809b7e51c7da3b4c',1,'practical_astronomy::pa_macro']]], + ['dd_5fsec_23',['dd_sec',['../namespacepractical__astronomy_1_1pa__macro.html#ab601b823d99167db79378cb81d6649e2',1,'practical_astronomy::pa_macro']]], + ['decimal_5fdegrees_5fto_5fangle_24',['decimal_degrees_to_angle',['../namespacepractical__astronomy_1_1pa__coordinate.html#af4b04e15f6470d4f704e1cab2d64fd55',1,'practical_astronomy::pa_coordinate']]], + ['decimal_5fhour_5fhour_25',['decimal_hour_hour',['../namespacepractical__astronomy_1_1pa__datetime.html#a7a505017515cdadb479fef83039bbad8',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhour_5fminutes_26',['decimal_hour_minutes',['../namespacepractical__astronomy_1_1pa__datetime.html#af03f0a34f5a3205abfced5fb458b99c8',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhour_5fseconds_27',['decimal_hour_seconds',['../namespacepractical__astronomy_1_1pa__datetime.html#a21452aca72d47207179838ce47fb27cf',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhours_5fto_5fcivil_5ftime_28',['decimal_hours_to_civil_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a2320446a7693e2baef32833e536e82de',1,'practical_astronomy::pa_datetime']]], + ['degrees_29',['degrees',['../namespacepractical__astronomy_1_1pa__macro.html#ab738df3cbff4099561c70a0531304be4',1,'practical_astronomy::pa_macro']]], + ['dh_5fdd_30',['dh_dd',['../namespacepractical__astronomy_1_1pa__macro.html#afa8571c6e8bb5c30819b9d872f207804',1,'practical_astronomy::pa_macro']]], + ['dh_5fhour_31',['dh_hour',['../namespacepractical__astronomy_1_1pa__macro.html#a3c41fb93171f8bf548854cbf934db548',1,'practical_astronomy::pa_macro']]], + ['dh_5fmin_32',['dh_min',['../namespacepractical__astronomy_1_1pa__macro.html#ad3636bd3842c441c464df67b3e8aad32',1,'practical_astronomy::pa_macro']]], + ['dh_5fsec_33',['dh_sec',['../namespacepractical__astronomy_1_1pa__macro.html#ada6b3b92a4562a158192e37d6f79e970',1,'practical_astronomy::pa_macro']]], + ['dms_5fdd_34',['dms_dd',['../namespacepractical__astronomy_1_1pa__macro.html#a1ffca3d689d511cf7d4ce2654a365443',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_5.html b/practical_astronomy/source/docs/search/all_5.html new file mode 100644 index 0000000000000000000000000000000000000000..9dd9344b0d0ac453424f37ee7feef56711d58ef8 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_5.js b/practical_astronomy/source/docs/search/all_5.js new file mode 100644 index 0000000000000000000000000000000000000000..2a6e0f99e68b62d419dbaf1fff2ff04930b081e9 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_5.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['e_5fgst_5fut_35',['e_gst_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a668275aec60ac6e761aac0432596a0e2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_36',['e_moon_rise',['../namespacepractical__astronomy_1_1pa__macro.html#a6bb82ea03dc3e9ec38cd7ef8d87c1f52',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_5fl6680_37',['e_moon_rise_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a3051ddab364fdf57567c9b2ba94fa6b2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_5fl6700_38',['e_moon_rise_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#abbaa30225d0eba14c6195ac77f0acb17',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_39',['e_moon_set',['../namespacepractical__astronomy_1_1pa__macro.html#a1c3f54d11f8b5b6c756bc14199ae3eb2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_5fl6680_40',['e_moon_set_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a588713ac66d586999c3c3b6c002624b9',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_5fl6700_41',['e_moon_set_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ad7888da366adfedec9049cf416155290',1,'practical_astronomy::pa_macro']]], + ['e_5frs_42',['e_rs',['../namespacepractical__astronomy_1_1pa__macro.html#accf0f6640e9526ca6da169ddab0943bd',1,'practical_astronomy::pa_macro']]], + ['e_5fsun_5frs_43',['e_sun_rs',['../namespacepractical__astronomy_1_1pa__macro.html#aaabc9ca8d45932cf13283b18974d413b',1,'practical_astronomy::pa_macro']]], + ['e_5fsun_5frs_5fl3710_44',['e_sun_rs_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#ac51cc7d8d3a7fdbd4f362e50193de6a8',1,'practical_astronomy::pa_macro']]], + ['e_5ftwilight_45',['e_twilight',['../namespacepractical__astronomy_1_1pa__macro.html#a809f18de9f76acc73bee4458ee17f694',1,'practical_astronomy::pa_macro']]], + ['e_5ftwilight_5fl3710_46',['e_twilight_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#ac591fd2559e07e0a401d2781c436123c',1,'practical_astronomy::pa_macro']]], + ['ec_5fdec_47',['ec_dec',['../namespacepractical__astronomy_1_1pa__macro.html#a846197591fb08834cd64d849e5c19cfc',1,'practical_astronomy::pa_macro']]], + ['ec_5fra_48',['ec_ra',['../namespacepractical__astronomy_1_1pa__macro.html#abdd55d706b911f4f0bec3b98621201d1',1,'practical_astronomy::pa_macro']]], + ['eccentric_5fanomaly_49',['eccentric_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#aaf5c6edff0cfea9bc1a4b2dcd10dce1c',1,'practical_astronomy::pa_macro']]], + ['ecliptic_5fcoordinate_5fto_5fequatorial_5fcoordinate_50',['ecliptic_coordinate_to_equatorial_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a8801b81ef0c47d1968da6dd29c3fa015',1,'practical_astronomy::pa_coordinate']]], + ['eq_5falt_51',['eq_alt',['../namespacepractical__astronomy_1_1pa__macro.html#a3d324c027667e86ca93eca1474f33c47',1,'practical_astronomy::pa_macro']]], + ['eq_5faz_52',['eq_az',['../namespacepractical__astronomy_1_1pa__macro.html#a891be99a888a57496066551877381f6a',1,'practical_astronomy::pa_macro']]], + ['eq_5fe_5flat_53',['eq_e_lat',['../namespacepractical__astronomy_1_1pa__macro.html#a246f46ef1cf7cd93d01ea23ed78ab727',1,'practical_astronomy::pa_macro']]], + ['eq_5fe_5flong_54',['eq_e_long',['../namespacepractical__astronomy_1_1pa__macro.html#aed12f47f471197809d5987c0bf2061ff',1,'practical_astronomy::pa_macro']]], + ['equation_5fof_5ftime_55',['equation_of_time',['../namespacepractical__astronomy_1_1pa__sun.html#a041439423740ffa2b4f6e9b567586a2d',1,'practical_astronomy::pa_sun']]], + ['equatorial_5fcoordinate_5fto_5fecliptic_5fcoordinate_56',['equatorial_coordinate_to_ecliptic_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a2be55120967a6500d6abf660d0c42009',1,'practical_astronomy::pa_coordinate']]], + ['equatorial_5fcoordinate_5fto_5fgalactic_5fcoordinate_57',['equatorial_coordinate_to_galactic_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a8214a5edcdda8da9372d59cd847a5f65',1,'practical_astronomy::pa_coordinate']]], + ['equatorial_5fcoordinates_5fto_5fhorizon_5fcoordinates_58',['equatorial_coordinates_to_horizon_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#a759d93a22e6eb1a5fe88a07dbf4f4fd2',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_6.html b/practical_astronomy/source/docs/search/all_6.html new file mode 100644 index 0000000000000000000000000000000000000000..f1e516d75abf29bc81d9b238432e0eff2192ea1d --- /dev/null +++ b/practical_astronomy/source/docs/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_6.js b/practical_astronomy/source/docs/search/all_6.js new file mode 100644 index 0000000000000000000000000000000000000000..ec38c93048a3cac2a3888187fe739fdff8cef931 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['f_5fdow_59',['f_dow',['../namespacepractical__astronomy_1_1pa__macro.html#a37e477f7b58d705a15f7ae3bdae41304',1,'practical_astronomy::pa_macro']]], + ['f_5fpart_60',['f_part',['../namespacepractical__astronomy_1_1pa__macro.html#a1919879b878ae9c8051083293912edc6',1,'practical_astronomy::pa_macro']]], + ['fract_61',['fract',['../namespacepractical__astronomy_1_1pa__macro.html#a9343576b800565b60f135f5f9510307c',1,'practical_astronomy::pa_macro']]], + ['full_5fmoon_62',['full_moon',['../namespacepractical__astronomy_1_1pa__macro.html#a56feb4f0dad22830627f57a288d20fae',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_7.html b/practical_astronomy/source/docs/search/all_7.html new file mode 100644 index 0000000000000000000000000000000000000000..8ddbf6c8e51e6232275b56dfb49b7a6bd143388a --- /dev/null +++ b/practical_astronomy/source/docs/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_7.js b/practical_astronomy/source/docs/search/all_7.js new file mode 100644 index 0000000000000000000000000000000000000000..cfb0adfa2b894db0a142ce07f3cf4ed18e42848b --- /dev/null +++ b/practical_astronomy/source/docs/search/all_7.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['galactic_5fcoordinate_5fto_5fequatorial_5fcoordinate_63',['galactic_coordinate_to_equatorial_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3de24c7dd22235e3d8976333e0081a98',1,'practical_astronomy::pa_coordinate']]], + ['get_5fbinary_5fdata_64',['get_binary_data',['../namespacepractical__astronomy_1_1pa__binary__data.html#a665c50e5d40ad4b7e43079b2175d9e67',1,'practical_astronomy::pa_binary_data']]], + ['get_5fcomet_5fdata_5felliptical_65',['get_comet_data_elliptical',['../namespacepractical__astronomy_1_1pa__comet__data.html#a880f949265c37db03be8789361c533dc',1,'practical_astronomy::pa_comet_data']]], + ['get_5fcomet_5fdata_5fparabolic_66',['get_comet_data_parabolic',['../namespacepractical__astronomy_1_1pa__comet__data.html#a354296f92713da2121f7ff50fccc16d3',1,'practical_astronomy::pa_comet_data']]], + ['get_5fdate_5fof_5feaster_67',['get_date_of_easter',['../namespacepractical__astronomy_1_1pa__datetime.html#a2980ffc259f16fd25b37bc1cbb8b18d4',1,'practical_astronomy::pa_datetime']]], + ['get_5fplanet_5fdata_68',['get_planet_data',['../namespacepractical__astronomy_1_1pa__planet__data.html#a80b3d5ea375b6d3724171ba6f2cb4a2b',1,'practical_astronomy::pa_planet_data']]], + ['glossary_20of_20terms_69',['Glossary of Terms',['../md_src_glossary.html',1,'']]], + ['glossary_2emd_70',['glossary.md',['../glossary_8md.html',1,'']]], + ['greenwich_5fdate_5fto_5fjulian_5fdate_71',['greenwich_date_to_julian_date',['../namespacepractical__astronomy_1_1pa__datetime.html#a2c3a8dc822708f5871b272048a50a2b5',1,'practical_astronomy::pa_datetime']]], + ['greenwich_5fsidereal_5ftime_5fto_5flocal_5fsidereal_5ftime_72',['greenwich_sidereal_time_to_local_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#ad329bcbb2bcaf6b6c3d6c0c918936ecf',1,'practical_astronomy::pa_datetime']]], + ['greenwich_5fsidereal_5ftime_5fto_5funiversal_5ftime_73',['greenwich_sidereal_time_to_universal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#ab03052b709178a939ecacd357a9b1730',1,'practical_astronomy::pa_datetime']]], + ['gst_5flst_74',['gst_lst',['../namespacepractical__astronomy_1_1pa__macro.html#ab231f1f9db003559dc64170365c8d133',1,'practical_astronomy::pa_macro']]], + ['gst_5fut_75',['gst_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a6d47a406e1b10a1fba09a76f8693dc80',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_8.html b/practical_astronomy/source/docs/search/all_8.html new file mode 100644 index 0000000000000000000000000000000000000000..83c55ae222936f83e88b307baefeb74673007077 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_8.js b/practical_astronomy/source/docs/search/all_8.js new file mode 100644 index 0000000000000000000000000000000000000000..2cacb1e0d8878c815192194d4a2bf2a788a3c831 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_8.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['ha_5fra_76',['ha_ra',['../namespacepractical__astronomy_1_1pa__macro.html#a06c8bb32b88eb03689ba130e17e5e69b',1,'practical_astronomy::pa_macro']]], + ['heliographic_5fcoordinates_77',['heliographic_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#af1747d784ba179c8ebc99fb761b337bb',1,'practical_astronomy::pa_coordinate']]], + ['hms_5fdh_78',['hms_dh',['../namespacepractical__astronomy_1_1pa__macro.html#a43a4596b8c96774b9f277dd2209cd06c',1,'practical_astronomy::pa_macro']]], + ['hor_5fdec_79',['hor_dec',['../namespacepractical__astronomy_1_1pa__macro.html#affd159e8e88b91904558baff5cfe538b',1,'practical_astronomy::pa_macro']]], + ['hor_5fha_80',['hor_ha',['../namespacepractical__astronomy_1_1pa__macro.html#aa45f444af815b93d1d5b88a5d4ed53b0',1,'practical_astronomy::pa_macro']]], + ['horizon_5fcoordinates_5fto_5fequatorial_5fcoordinates_81',['horizon_coordinates_to_equatorial_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#abcc4ce68e3508c7ed5443ce846531bb8',1,'practical_astronomy::pa_coordinate']]], + ['hour_5fangle_5fto_5fright_5fascension_82',['hour_angle_to_right_ascension',['../namespacepractical__astronomy_1_1pa__coordinate.html#a4703c296a201b48930292c17665c7dd2',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_9.html b/practical_astronomy/source/docs/search/all_9.html new file mode 100644 index 0000000000000000000000000000000000000000..1e263c134c45cf4590dd10068a31052e44e3bb64 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_9.js b/practical_astronomy/source/docs/search/all_9.js new file mode 100644 index 0000000000000000000000000000000000000000..38a47d105f455fd219b7141eaa0314b37652a608 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['iint_83',['iint',['../namespacepractical__astronomy_1_1pa__macro.html#a183688ea9868beb50f0227010d223f4d',1,'practical_astronomy::pa_macro']]], + ['is_5fleap_5fyear_84',['is_leap_year',['../namespacepractical__astronomy_1_1pa__util.html#a4bde6043f052777f35147c29658b728a',1,'practical_astronomy::pa_util']]] +]; diff --git a/practical_astronomy/source/docs/search/all_a.html b/practical_astronomy/source/docs/search/all_a.html new file mode 100644 index 0000000000000000000000000000000000000000..3a6cac108c28b45793eb486fb29f310b92865e2a --- /dev/null +++ b/practical_astronomy/source/docs/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_a.js b/practical_astronomy/source/docs/search/all_a.js new file mode 100644 index 0000000000000000000000000000000000000000..272ac4317d79e8ad6eba26080a0f8121ec01eede --- /dev/null +++ b/practical_astronomy/source/docs/search/all_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['jdc_5fday_85',['jdc_day',['../namespacepractical__astronomy_1_1pa__macro.html#ab2b1b3d413b7ac0b4046bf10a86e153c',1,'practical_astronomy::pa_macro']]], + ['jdc_5fmonth_86',['jdc_month',['../namespacepractical__astronomy_1_1pa__macro.html#af23f2b93521938aff5011cc98680b05a',1,'practical_astronomy::pa_macro']]], + ['jdc_5fyear_87',['jdc_year',['../namespacepractical__astronomy_1_1pa__macro.html#aa7c4db5c73214d4fe195e876fa541dcb',1,'practical_astronomy::pa_macro']]], + ['julian_5fdate_5fday_88',['julian_date_day',['../namespacepractical__astronomy_1_1pa__datetime.html#a6af5e356e7784f060e5c55e814581e05',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fmonth_89',['julian_date_month',['../namespacepractical__astronomy_1_1pa__datetime.html#af6c7751410aa70a76670b144f50dc619',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fto_5fgreenwich_5fdate_90',['julian_date_to_greenwich_date',['../namespacepractical__astronomy_1_1pa__datetime.html#a267f3d2010bdf763726f9da3612e4060',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fto_5fweekday_5fname_91',['julian_date_to_weekday_name',['../namespacepractical__astronomy_1_1pa__datetime.html#ab1a46eed14594880e25220f9a9675a37',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fyear_92',['julian_date_year',['../namespacepractical__astronomy_1_1pa__datetime.html#a67a531866a9dc81ad806d4a505a20c8a',1,'practical_astronomy::pa_datetime']]] +]; diff --git a/practical_astronomy/source/docs/search/all_b.html b/practical_astronomy/source/docs/search/all_b.html new file mode 100644 index 0000000000000000000000000000000000000000..130deb4ed9c64319a3caf4b11869bfe71bfef29f --- /dev/null +++ b/practical_astronomy/source/docs/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_b.js b/practical_astronomy/source/docs/search/all_b.js new file mode 100644 index 0000000000000000000000000000000000000000..a811d82cbd77015896164c938ae79148742ae5f3 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['km_5fto_5fmi_93',['km_to_mi',['../namespacepractical__astronomy_1_1pa__util.html#a29de8f0275076afc08b7f2ed98080bdb',1,'practical_astronomy::pa_util']]] +]; diff --git a/practical_astronomy/source/docs/search/all_c.html b/practical_astronomy/source/docs/search/all_c.html new file mode 100644 index 0000000000000000000000000000000000000000..3dd5af06d5623447d621f2d30745863b8d4df97e --- /dev/null +++ b/practical_astronomy/source/docs/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_c.js b/practical_astronomy/source/docs/search/all_c.js new file mode 100644 index 0000000000000000000000000000000000000000..70d777feaf6b19b842e0e6184c71f2c7af224dda --- /dev/null +++ b/practical_astronomy/source/docs/search/all_c.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['lct_5fgday_94',['lct_gday',['../namespacepractical__astronomy_1_1pa__macro.html#a46edb7e554811ce6321e7db418f80f7c',1,'practical_astronomy::pa_macro']]], + ['lct_5fgmonth_95',['lct_gmonth',['../namespacepractical__astronomy_1_1pa__macro.html#a105f28dd78c95603fffb2db1984fbe12',1,'practical_astronomy::pa_macro']]], + ['lct_5fgyear_96',['lct_gyear',['../namespacepractical__astronomy_1_1pa__macro.html#a5785e385bddfefe0b922b91cd0a0ec1a',1,'practical_astronomy::pa_macro']]], + ['lct_5fut_97',['lct_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a8262d7ce106918f0b279edbd4356a7d1',1,'practical_astronomy::pa_macro']]], + ['lint_98',['lint',['../namespacepractical__astronomy_1_1pa__macro.html#a91b8faef2e6bd134254cd5f596a162ed',1,'practical_astronomy::pa_macro']]], + ['local_5fcivil_5ftime_5fto_5funiversal_5ftime_99',['local_civil_time_to_universal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#aa48dfcf90dce9ac086b0b28bd2dbac7b',1,'practical_astronomy::pa_datetime']]], + ['local_5fsidereal_5ftime_5fto_5fgreenwich_5fsidereal_5ftime_100',['local_sidereal_time_to_greenwich_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a22b0001de8eb44f6ed02d4899d9d86b1',1,'practical_astronomy::pa_datetime']]], + ['lst_5fgst_101',['lst_gst',['../namespacepractical__astronomy_1_1pa__macro.html#a22c400268a08a350c72f2c0830d4e40b',1,'practical_astronomy::pa_macro']]], + ['lunar_5feclipse_5fcircumstances_102',['lunar_eclipse_circumstances',['../namespacepractical__astronomy_1_1pa__eclipses.html#a48d5a9475c1877f1268b4d063dd99f6b',1,'practical_astronomy::pa_eclipses']]], + ['lunar_5feclipse_5foccurrence_103',['lunar_eclipse_occurrence',['../namespacepractical__astronomy_1_1pa__eclipses.html#a0ac960734a008556789361349956209c',1,'practical_astronomy.pa_eclipses.lunar_eclipse_occurrence()'],['../namespacepractical__astronomy_1_1pa__macro.html#a40312f6ac912d41a907d2bc9bf323456',1,'practical_astronomy.pa_macro.lunar_eclipse_occurrence(DS, ZC, DY, MN, YR)']]], + ['lunar_5feclipse_5foccurrence_5fl6855_104',['lunar_eclipse_occurrence_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#a6d4798a56972a9b1bf4dd35496a66a18',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/all_d.html b/practical_astronomy/source/docs/search/all_d.html new file mode 100644 index 0000000000000000000000000000000000000000..af7f2f0f50f2b3fb904081f217c68ad652570c6c --- /dev/null +++ b/practical_astronomy/source/docs/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_d.js b/practical_astronomy/source/docs/search/all_d.js new file mode 100644 index 0000000000000000000000000000000000000000..0d1fffce4e2dd7207256f158eb304cdb63c93311 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_d.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['mag_5flunar_5feclipse_105',['mag_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a91044fea690474429ca7c3b9c8124b31',1,'practical_astronomy::pa_macro']]], + ['mag_5fsolar_5feclipse_106',['mag_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a7b33e18563369df1c45616322b7618f7',1,'practical_astronomy::pa_macro']]], + ['mag_5fsolar_5feclipse_5fl7390_107',['mag_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#abd91674b9bca5a624f756949dfb20a19',1,'practical_astronomy::pa_macro']]], + ['mean_5fobliquity_5fof_5fthe_5fecliptic_108',['mean_obliquity_of_the_ecliptic',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3b012c023b82b660c02c4b5de08474d2',1,'practical_astronomy::pa_coordinate']]], + ['mi_5fto_5fkm_109',['mi_to_km',['../namespacepractical__astronomy_1_1pa__util.html#a1aa17b78e46a1d549c7871de9797c9de',1,'practical_astronomy::pa_util']]], + ['moon_5fdist_110',['moon_dist',['../namespacepractical__astronomy_1_1pa__macro.html#ab22050aced35c0adce5617e66f18d2fd',1,'practical_astronomy::pa_macro']]], + ['moon_5fdist_5fang_5fdiam_5fhor_5fparallax_111',['moon_dist_ang_diam_hor_parallax',['../namespacepractical__astronomy_1_1pa__moon.html#aedd86f345903593ab5e8bda8548f5c13',1,'practical_astronomy::pa_moon']]], + ['moon_5fhp_112',['moon_hp',['../namespacepractical__astronomy_1_1pa__macro.html#aba7a5ece48ac48e22d661556d2cfaa14',1,'practical_astronomy::pa_macro']]], + ['moon_5flat_113',['moon_lat',['../namespacepractical__astronomy_1_1pa__macro.html#a9daed488b5de1cbfc98a7136e0bd1a05',1,'practical_astronomy::pa_macro']]], + ['moon_5flong_114',['moon_long',['../namespacepractical__astronomy_1_1pa__macro.html#a23d02d81556d7695f63cae4e3df19dbb',1,'practical_astronomy::pa_macro']]], + ['moon_5flong_5flat_5fhp_115',['moon_long_lat_hp',['../namespacepractical__astronomy_1_1pa__macro.html#af5b4537b14bb450a8f25e33101845a86',1,'practical_astronomy::pa_macro']]], + ['moon_5fmean_5fanomaly_116',['moon_mean_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#af70a4720345b0e73b857c91dd84df3da',1,'practical_astronomy::pa_macro']]], + ['moon_5fphase_117',['moon_phase',['../namespacepractical__astronomy_1_1pa__macro.html#aa5d6562291f66ac8fac04d89e3b90652',1,'practical_astronomy.pa_macro.moon_phase()'],['../namespacepractical__astronomy_1_1pa__moon.html#a0a21dc7776e79ad9d26f27d6da65139e',1,'practical_astronomy.pa_moon.moon_phase()']]], + ['moon_5frise_5faz_118',['moon_rise_az',['../namespacepractical__astronomy_1_1pa__macro.html#a5f043e44ceb70f32d3f255cd02ff53a4',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5faz_5fl6680_119',['moon_rise_az_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#ab9b8773345c7d4922ffb682ba9ea2b36',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5faz_5fl6700_120',['moon_rise_az_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ae864c757a1bd2961c994dc5c69369b38',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_121',['moon_rise_lc_dmy',['../namespacepractical__astronomy_1_1pa__macro.html#a2ffd81a6353e989306ce41e4dce90675',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_5fl6680_122',['moon_rise_lc_dmy_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a6409ca331112e19d32e71ce779d1f209',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_5fl6700_123',['moon_rise_lc_dmy_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#af464c217e6c13de9c5e1971272ec6049',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_124',['moon_rise_lct',['../namespacepractical__astronomy_1_1pa__macro.html#ac0ab9a097c01383f6d6cc07b90e034a1',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_5fl6680_125',['moon_rise_lct_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a8378463a64c32022f516594e0b152cb1',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_5fl6700_126',['moon_rise_lct_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#a745a450e3468bf4c214e902973a43c57',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_127',['moon_set_az',['../namespacepractical__astronomy_1_1pa__macro.html#a561759d6302e17ad046c1cf74a8fdb14',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_5fl6680_128',['moon_set_az_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a045fb010333f74a3359efd9dc69d626d',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_5fl6700_129',['moon_set_az_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#a49ce367bffc3b56a48eaa3bd1a03aefe',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_130',['moon_set_lc_dmy',['../namespacepractical__astronomy_1_1pa__macro.html#a881ded591e2b18b78a5b25d4e92b2d46',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_5fl6680_131',['moon_set_lc_dmy_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a2ff94df12871eb0c84974727ea3c8d31',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_5fl6700_132',['moon_set_lc_dmy_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ac8d49b52926ba75b6a77254e0507ee34',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_133',['moon_set_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a1fd51be6c6ceda184cf4c4489b540f03',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_5fl6680_134',['moon_set_lct_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#aeaacca1e8e60a5ed13a98ee07e6f0228',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_5fl6700_135',['moon_set_lct_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#aac6e50514786edd12ba3e9e8fbc9fcb1',1,'practical_astronomy::pa_macro']]], + ['moon_5fsize_136',['moon_size',['../namespacepractical__astronomy_1_1pa__macro.html#a27fdf19dffe998871f90355393cf502f',1,'practical_astronomy::pa_macro']]], + ['moonrise_5fand_5fmoonset_137',['moonrise_and_moonset',['../namespacepractical__astronomy_1_1pa__moon.html#a303811d67109d57d62bf8914de754cfe',1,'practical_astronomy::pa_moon']]], + ['morning_5fand_5fevening_5ftwilight_138',['morning_and_evening_twilight',['../namespacepractical__astronomy_1_1pa__sun.html#adfbd4639478f5952b5dffe334071fa26',1,'practical_astronomy::pa_sun']]] +]; diff --git a/practical_astronomy/source/docs/search/all_e.html b/practical_astronomy/source/docs/search/all_e.html new file mode 100644 index 0000000000000000000000000000000000000000..e25df423a9505a3b720407dd00eccfbcd2d2cd36 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_e.js b/practical_astronomy/source/docs/search/all_e.js new file mode 100644 index 0000000000000000000000000000000000000000..a880a3e0590b9e0871c49a702a9a43e2d3d38501 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['new_5fmoon_139',['new_moon',['../namespacepractical__astronomy_1_1pa__macro.html#acc8244f47cc29d7a0078a55df59c9c7c',1,'practical_astronomy::pa_macro']]], + ['new_5fmoon_5ffull_5fmoon_5fl6855_140',['new_moon_full_moon_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#ab80cabb007a1e6783a13506d4351908a',1,'practical_astronomy::pa_macro']]], + ['nutat_5flong_141',['nutat_long',['../namespacepractical__astronomy_1_1pa__macro.html#a681b21159361cc3479105fc31ef861fc',1,'practical_astronomy::pa_macro']]], + ['nutat_5fobl_142',['nutat_obl',['../namespacepractical__astronomy_1_1pa__macro.html#a84765422e7420803ede32148d0e014a7',1,'practical_astronomy::pa_macro']]], + ['nutation_5fin_5fecliptic_5flongitude_5fand_5fobliquity_143',['nutation_in_ecliptic_longitude_and_obliquity',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3a11b5ab0fe82c3966282455392d05fc',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/all_f.html b/practical_astronomy/source/docs/search/all_f.html new file mode 100644 index 0000000000000000000000000000000000000000..b23da6ce48b618d1fd461910f44b6a7b5f91b2e5 --- /dev/null +++ b/practical_astronomy/source/docs/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/all_f.js b/practical_astronomy/source/docs/search/all_f.js new file mode 100644 index 0000000000000000000000000000000000000000..fd7fed3dec4f9444965aa88cfdb973e3346203bc --- /dev/null +++ b/practical_astronomy/source/docs/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['obliq_144',['obliq',['../namespacepractical__astronomy_1_1pa__macro.html#a3716ff9bcaf920e2a9cfa2f0ada15f9c',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/close.svg b/practical_astronomy/source/docs/search/close.svg new file mode 100644 index 0000000000000000000000000000000000000000..a933eea1a26b0c7ada7cd0053522238923996df1 --- /dev/null +++ b/practical_astronomy/source/docs/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/practical_astronomy/source/docs/search/files_0.html b/practical_astronomy/source/docs/search/files_0.html new file mode 100644 index 0000000000000000000000000000000000000000..9498842a62658a696497b75d13f38e46e8d06776 --- /dev/null +++ b/practical_astronomy/source/docs/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/files_0.js b/practical_astronomy/source/docs/search/files_0.js new file mode 100644 index 0000000000000000000000000000000000000000..8d213f8adb621d4b239c0420b9279a045b23e8f6 --- /dev/null +++ b/practical_astronomy/source/docs/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_2epy_270',['__init__.py',['../____init_____8py.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/files_1.html b/practical_astronomy/source/docs/search/files_1.html new file mode 100644 index 0000000000000000000000000000000000000000..7050ef48aaee12f8bf1c05cf683493c06a56800d --- /dev/null +++ b/practical_astronomy/source/docs/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/files_1.js b/practical_astronomy/source/docs/search/files_1.js new file mode 100644 index 0000000000000000000000000000000000000000..5d8167126fc25db4d25631f5b967540d4e315e38 --- /dev/null +++ b/practical_astronomy/source/docs/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['glossary_2emd_271',['glossary.md',['../glossary_8md.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/files_2.html b/practical_astronomy/source/docs/search/files_2.html new file mode 100644 index 0000000000000000000000000000000000000000..497cdf5c76b892a65f1172bed2ca8c63445e1f0e --- /dev/null +++ b/practical_astronomy/source/docs/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/files_2.js b/practical_astronomy/source/docs/search/files_2.js new file mode 100644 index 0000000000000000000000000000000000000000..21580471262f6e4d2afdc404fc43edf91569590a --- /dev/null +++ b/practical_astronomy/source/docs/search/files_2.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['pa_5fbinary_2epy_272',['pa_binary.py',['../pa__binary_8py.html',1,'']]], + ['pa_5fbinary_5fdata_2epy_273',['pa_binary_data.py',['../pa__binary__data_8py.html',1,'']]], + ['pa_5fcomet_2epy_274',['pa_comet.py',['../pa__comet_8py.html',1,'']]], + ['pa_5fcomet_5fdata_2epy_275',['pa_comet_data.py',['../pa__comet__data_8py.html',1,'']]], + ['pa_5fcoordinate_2epy_276',['pa_coordinate.py',['../pa__coordinate_8py.html',1,'']]], + ['pa_5fdatetime_2epy_277',['pa_datetime.py',['../pa__datetime_8py.html',1,'']]], + ['pa_5feclipses_2epy_278',['pa_eclipses.py',['../pa__eclipses_8py.html',1,'']]], + ['pa_5fmacro_2epy_279',['pa_macro.py',['../pa__macro_8py.html',1,'']]], + ['pa_5fmoon_2epy_280',['pa_moon.py',['../pa__moon_8py.html',1,'']]], + ['pa_5fplanet_2epy_281',['pa_planet.py',['../pa__planet_8py.html',1,'']]], + ['pa_5fplanet_5fdata_2epy_282',['pa_planet_data.py',['../pa__planet__data_8py.html',1,'']]], + ['pa_5fsun_2epy_283',['pa_sun.py',['../pa__sun_8py.html',1,'']]], + ['pa_5futil_2epy_284',['pa_util.py',['../pa__util_8py.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/files_3.html b/practical_astronomy/source/docs/search/files_3.html new file mode 100644 index 0000000000000000000000000000000000000000..1ba106b2d5d199f8b3be46782e96d47554f4f7a9 --- /dev/null +++ b/practical_astronomy/source/docs/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/files_3.js b/practical_astronomy/source/docs/search/files_3.js new file mode 100644 index 0000000000000000000000000000000000000000..c77d90dc0a29e9b512a28233cacb703461e014ab --- /dev/null +++ b/practical_astronomy/source/docs/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['readme_2emd_285',['README.md',['../README_8md.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_0.html b/practical_astronomy/source/docs/search/functions_0.html new file mode 100644 index 0000000000000000000000000000000000000000..eb4c5014c401e4d277434803bd0322e70ca31cd8 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_0.js b/practical_astronomy/source/docs/search/functions_0.js new file mode 100644 index 0000000000000000000000000000000000000000..ad6e46582c71f96825d1b561dcc2a55f33ef2b24 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_0.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['angle_286',['angle',['../namespacepractical__astronomy_1_1pa__macro.html#aa89a8971eecab46c843d55b6b558baa5',1,'practical_astronomy::pa_macro']]], + ['angle_5fbetween_5ftwo_5fobjects_287',['angle_between_two_objects',['../namespacepractical__astronomy_1_1pa__coordinate.html#aeff3946906765330d3df8e9295c5636c',1,'practical_astronomy::pa_coordinate']]], + ['angle_5fto_5fdecimal_5fdegrees_288',['angle_to_decimal_degrees',['../namespacepractical__astronomy_1_1pa__coordinate.html#a987813f23727409ec84bf5b7758e4196',1,'practical_astronomy::pa_coordinate']]], + ['approximate_5fposition_5fof_5fmoon_289',['approximate_position_of_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a9d7c63bb40e4cceabce9850764b780b5',1,'practical_astronomy::pa_moon']]], + ['approximate_5fposition_5fof_5fplanet_290',['approximate_position_of_planet',['../namespacepractical__astronomy_1_1pa__planet.html#a1f4d8635886fb19f0be50ef1eb973ba0',1,'practical_astronomy::pa_planet']]], + ['approximate_5fposition_5fof_5fsun_291',['approximate_position_of_sun',['../namespacepractical__astronomy_1_1pa__sun.html#a45d2ca4ae26d8cded6b5f3eed8eca785',1,'practical_astronomy::pa_sun']]], + ['atan2_292',['atan2',['../namespacepractical__astronomy_1_1pa__macro.html#a46bf770e83278c32641d88a14afa4743',1,'practical_astronomy::pa_macro']]], + ['atmospheric_5frefraction_293',['atmospheric_refraction',['../namespacepractical__astronomy_1_1pa__coordinate.html#afca7093308d31a18052d1212a5532229',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_1.html b/practical_astronomy/source/docs/search/functions_1.html new file mode 100644 index 0000000000000000000000000000000000000000..ef4088b89bc97dd1008dff1e6e09638eec1400a2 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_1.js b/practical_astronomy/source/docs/search/functions_1.js new file mode 100644 index 0000000000000000000000000000000000000000..85979cbeea1f844adc9cc7b0526a5e9b534a1f98 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['binary_5fstar_5forbit_294',['binary_star_orbit',['../namespacepractical__astronomy_1_1pa__binary.html#ad64db60ed19e41d162237dc0b1a52a61',1,'practical_astronomy::pa_binary']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_10.html b/practical_astronomy/source/docs/search/functions_10.html new file mode 100644 index 0000000000000000000000000000000000000000..1bdc125722eab755167046893842220250ece100 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_10.js b/practical_astronomy/source/docs/search/functions_10.js new file mode 100644 index 0000000000000000000000000000000000000000..f77c1385858c2cf64ba61562341b0f60c13ccd66 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_10.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['ra_5fha_440',['ra_ha',['../namespacepractical__astronomy_1_1pa__macro.html#a7fa8b9715d61034fc8baa40a474fcff7',1,'practical_astronomy::pa_macro']]], + ['refract_441',['refract',['../namespacepractical__astronomy_1_1pa__macro.html#a5b7bb777e3f52ba07f7256a7e1df3965',1,'practical_astronomy::pa_macro']]], + ['refract_5fl3035_442',['refract_l3035',['../namespacepractical__astronomy_1_1pa__macro.html#abed8f9a046213013a6bcc1372a39ff3c',1,'practical_astronomy::pa_macro']]], + ['right_5fascension_5fto_5fhour_5fangle_443',['right_ascension_to_hour_angle',['../namespacepractical__astronomy_1_1pa__coordinate.html#a4dffecdd7b376164a88b03227776b67a',1,'practical_astronomy::pa_coordinate']]], + ['rise_5fset_5fazimuth_5frise_444',['rise_set_azimuth_rise',['../namespacepractical__astronomy_1_1pa__macro.html#a518d3ead799e5c593203e48f981fe11f',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5fazimuth_5fset_445',['rise_set_azimuth_set',['../namespacepractical__astronomy_1_1pa__macro.html#a5a33468388fa7aff143abc68c1628aeb',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5flocal_5fsidereal_5ftime_5frise_446',['rise_set_local_sidereal_time_rise',['../namespacepractical__astronomy_1_1pa__macro.html#ab9395fb16dedf1a5a756b857b0f78587',1,'practical_astronomy::pa_macro']]], + ['rise_5fset_5flocal_5fsidereal_5ftime_5fset_447',['rise_set_local_sidereal_time_set',['../namespacepractical__astronomy_1_1pa__macro.html#a4068b7600e8d1a43fb973369c96eaa04',1,'practical_astronomy::pa_macro']]], + ['rising_5fand_5fsetting_448',['rising_and_setting',['../namespacepractical__astronomy_1_1pa__coordinate.html#accf030a9add4b8f1a81ed808c3caf70a',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_11.html b/practical_astronomy/source/docs/search/functions_11.html new file mode 100644 index 0000000000000000000000000000000000000000..188076ef2893bd56deb43876f9eec402fb1d7beb --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_11.js b/practical_astronomy/source/docs/search/functions_11.js new file mode 100644 index 0000000000000000000000000000000000000000..748a8c5a776d6200aae4271a6ad488e9a671e0c6 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_11.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['selenographic_5fcoordinates_5f1_449',['selenographic_coordinates_1',['../namespacepractical__astronomy_1_1pa__coordinate.html#accf1d521e9fe1583201493f7c3c5aa3b',1,'practical_astronomy::pa_coordinate']]], + ['selenographic_5fcoordinates_5f2_450',['selenographic_coordinates_2',['../namespacepractical__astronomy_1_1pa__coordinate.html#a821e4558becfa11ef299894f12dc37f2',1,'practical_astronomy::pa_coordinate']]], + ['sgn_451',['sgn',['../namespacepractical__astronomy_1_1pa__macro.html#a87fc05d5af8b1cbc4d983a85aeb12283',1,'practical_astronomy::pa_macro']]], + ['solar_5feclipse_5fcircumstances_452',['solar_eclipse_circumstances',['../namespacepractical__astronomy_1_1pa__eclipses.html#aa5e0b860a6b90ed84dd91644a7db845e',1,'practical_astronomy::pa_eclipses']]], + ['solar_5feclipse_5foccurrence_453',['solar_eclipse_occurrence',['../namespacepractical__astronomy_1_1pa__eclipses.html#a419c3cdc66fdfadb685e0095404e0beb',1,'practical_astronomy.pa_eclipses.solar_eclipse_occurrence()'],['../namespacepractical__astronomy_1_1pa__macro.html#a64363c2534f9760556a100e707daf6ec',1,'practical_astronomy.pa_macro.solar_eclipse_occurrence(DS, ZC, DY, MN, YR)']]], + ['solar_5feclipse_5foccurrence_5fl6855_454',['solar_eclipse_occurrence_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#a7eeeb8f52fbd280a72946911feac1740',1,'practical_astronomy::pa_macro']]], + ['solar_5felongation_455',['solar_elongation',['../namespacepractical__astronomy_1_1pa__sun.html#ab4ff369aaa2e7ce1f93dae29e83c6c80',1,'practical_astronomy::pa_sun']]], + ['solve_5fcubic_456',['solve_cubic',['../namespacepractical__astronomy_1_1pa__macro.html#ac5dafeb29d3bca13621453cd7866c940',1,'practical_astronomy::pa_macro']]], + ['sun_5fdia_457',['sun_dia',['../namespacepractical__astronomy_1_1pa__macro.html#a7b72953a8ffc673dde9f45cfdb1db023',1,'practical_astronomy::pa_macro']]], + ['sun_5fdist_458',['sun_dist',['../namespacepractical__astronomy_1_1pa__macro.html#a63205ef979e0a315706eb0b3c60e4560',1,'practical_astronomy::pa_macro']]], + ['sun_5fdistance_5fand_5fangular_5fsize_459',['sun_distance_and_angular_size',['../namespacepractical__astronomy_1_1pa__sun.html#a5704841679b2d5ed8367298db7e406f3',1,'practical_astronomy::pa_sun']]], + ['sun_5fe_5flong_460',['sun_e_long',['../namespacepractical__astronomy_1_1pa__macro.html#af6721a46a0142cb48d596bb08a409023',1,'practical_astronomy::pa_macro']]], + ['sun_5fecc_461',['sun_ecc',['../namespacepractical__astronomy_1_1pa__macro.html#a8dddf7b4dbc52301122b4fe2c980c037',1,'practical_astronomy::pa_macro']]], + ['sun_5flong_462',['sun_long',['../namespacepractical__astronomy_1_1pa__macro.html#a9833772b0c9312c4973c770fc45ce825',1,'practical_astronomy::pa_macro']]], + ['sun_5fmean_5fanomaly_463',['sun_mean_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#aa335c9bd97815c75018151aff53c47f9',1,'practical_astronomy::pa_macro']]], + ['sun_5fperi_464',['sun_peri',['../namespacepractical__astronomy_1_1pa__macro.html#ab70147487826c19f7ce0e47fc2b6ce08',1,'practical_astronomy::pa_macro']]], + ['sun_5ftrue_5fanomaly_465',['sun_true_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#a1e330f4a543e6d40e3979bcef2fd27de',1,'practical_astronomy::pa_macro']]], + ['sunrise_5fand_5fsunset_466',['sunrise_and_sunset',['../namespacepractical__astronomy_1_1pa__sun.html#a6fc7c4ad24c37eabb246d4cb28adaccf',1,'practical_astronomy::pa_sun']]], + ['sunrise_5faz_467',['sunrise_az',['../namespacepractical__astronomy_1_1pa__macro.html#ae031ec483a748b030faf63aff4a05af5',1,'practical_astronomy::pa_macro']]], + ['sunrise_5faz_5fl3710_468',['sunrise_az_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aa5d13be74e51834eabb9b445d9ad301e',1,'practical_astronomy::pa_macro']]], + ['sunrise_5flct_469',['sunrise_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a318a23d1a928a0b53d4ce73888fc118c',1,'practical_astronomy::pa_macro']]], + ['sunrise_5flct_5fl3710_470',['sunrise_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a3dadd77c196d1a78b4c02ade839ab19c',1,'practical_astronomy::pa_macro']]], + ['sunset_5faz_471',['sunset_az',['../namespacepractical__astronomy_1_1pa__macro.html#a9f41dc6f857569eae75081be194c51a0',1,'practical_astronomy::pa_macro']]], + ['sunset_5faz_5fl3710_472',['sunset_az_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a85e47f2be8bd9e14228014a07c262638',1,'practical_astronomy::pa_macro']]], + ['sunset_5flct_473',['sunset_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a3e49a251ed884ffe18ddfc05d5dd275c',1,'practical_astronomy::pa_macro']]], + ['sunset_5flct_5fl3710_474',['sunset_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aff1c66bc72fd0b541eda355c3308d71a',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_12.html b/practical_astronomy/source/docs/search/functions_12.html new file mode 100644 index 0000000000000000000000000000000000000000..eb29d8f9a3f6482d6dcc3f2f46604dcb9e4ab1bc --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_12.js b/practical_astronomy/source/docs/search/functions_12.js new file mode 100644 index 0000000000000000000000000000000000000000..c2c06239cd2cc1a00d7c32bce7ba82de099f28b3 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['times_5fof_5fnew_5fmoon_5fand_5ffull_5fmoon_475',['times_of_new_moon_and_full_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a4243e54e26b84728838b58796f8e4cb9',1,'practical_astronomy::pa_moon']]], + ['true_5fanomaly_476',['true_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#a6a2e51256465c8a9ed7683f1058e71f3',1,'practical_astronomy::pa_macro']]], + ['twilight_5fam_5flct_477',['twilight_am_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a3b3c949a60b889c878cd6bd79790943a',1,'practical_astronomy::pa_macro']]], + ['twilight_5fam_5flct_5fl3710_478',['twilight_am_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#aacbb1c1872762d0f355a126d6e7c7c98',1,'practical_astronomy::pa_macro']]], + ['twilight_5fpm_5flct_479',['twilight_pm_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a210d9af39cca8495146cd91c1f6ef2b4',1,'practical_astronomy::pa_macro']]], + ['twilight_5fpm_5flct_5fl3710_480',['twilight_pm_lct_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#a82b2a832e3984d7980b1d92bf20e21f6',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_13.html b/practical_astronomy/source/docs/search/functions_13.html new file mode 100644 index 0000000000000000000000000000000000000000..3da2ea69cff047ab7dd4e2e0881ac7cadac721ca --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_13.js b/practical_astronomy/source/docs/search/functions_13.js new file mode 100644 index 0000000000000000000000000000000000000000..b818895560c053f17ba52b4562b8eb795ae62631 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_13.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['universal_5ftime_5fto_5fgreenwich_5fsidereal_5ftime_481',['universal_time_to_greenwich_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a55fda8f36a26dc8552cdc72a80d2ccd4',1,'practical_astronomy::pa_datetime']]], + ['universal_5ftime_5fto_5flocal_5fcivil_5ftime_482',['universal_time_to_local_civil_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a67d28e510b5411d435af43d3a105d313',1,'practical_astronomy::pa_datetime']]], + ['unwind_483',['unwind',['../namespacepractical__astronomy_1_1pa__macro.html#a85c5e18e296e6571a70ef3dbef5bb394',1,'practical_astronomy::pa_macro']]], + ['unwind_5fdeg_484',['unwind_deg',['../namespacepractical__astronomy_1_1pa__macro.html#a0fd38430a2b34a11124d7e58da7812f7',1,'practical_astronomy::pa_macro']]], + ['unwind_5frad_485',['unwind_rad',['../namespacepractical__astronomy_1_1pa__macro.html#a2cea96910cb7df148bcaa246eef0be15',1,'practical_astronomy::pa_macro']]], + ['ut_5fday_5fadjust_486',['ut_day_adjust',['../namespacepractical__astronomy_1_1pa__macro.html#aa1986a7814f603a649d46d6d994558ef',1,'practical_astronomy::pa_macro']]], + ['ut_5fend_5ftotal_5flunar_5feclipse_487',['ut_end_total_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#aab795045e326e5ebc39c994d97e12187',1,'practical_astronomy::pa_macro']]], + ['ut_5fend_5fumbra_5flunar_5feclipse_488',['ut_end_umbra_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a6ab1e97f378283e05efc3ff532798def',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5flunar_5feclipse_489',['ut_first_contact_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a904c7a5da1387c176fb3a7324a78088c',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5fsolar_5feclipse_490',['ut_first_contact_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a29a084742d81410764e27a9c72f567d7',1,'practical_astronomy::pa_macro']]], + ['ut_5ffirst_5fcontact_5fsolar_5feclipse_5fl7390_491',['ut_first_contact_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a45d2d62ed9a459b0209326da47785145',1,'practical_astronomy::pa_macro']]], + ['ut_5fgst_492',['ut_gst',['../namespacepractical__astronomy_1_1pa__macro.html#a325087e87c581b42487fa2de4aa5c282',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5flunar_5feclipse_493',['ut_last_contact_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a67f15513275d9300e3efef985f4d5291',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5fsolar_5feclipse_494',['ut_last_contact_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a1ee1b22776bf8592086a3ee158648693',1,'practical_astronomy::pa_macro']]], + ['ut_5flast_5fcontact_5fsolar_5feclipse_5fl7390_495',['ut_last_contact_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a7927cec9c423873d3ecca5c3c433b82c',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fday_496',['ut_lc_day',['../namespacepractical__astronomy_1_1pa__macro.html#a2ce7a80d4b9db334e3a9c11e3ad9c094',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fmonth_497',['ut_lc_month',['../namespacepractical__astronomy_1_1pa__macro.html#a678b8e7e23c97823649589a94b55c062',1,'practical_astronomy::pa_macro']]], + ['ut_5flc_5fyear_498',['ut_lc_year',['../namespacepractical__astronomy_1_1pa__macro.html#a8b857a7a6b35ef5e28f9f07441727680',1,'practical_astronomy::pa_macro']]], + ['ut_5flct_499',['ut_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a0c65bcdf6c40b6921c80f7df8b7ada4e',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5flunar_5feclipse_500',['ut_max_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#aa8228f5d17279c86196935d1d59da20a',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5fsolar_5feclipse_501',['ut_max_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a8890e77811d6930958f566ca9cabf370',1,'practical_astronomy::pa_macro']]], + ['ut_5fmax_5fsolar_5feclipse_5fl7390_502',['ut_max_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#a70ee926aa08528ed97ce26176364b92a',1,'practical_astronomy::pa_macro']]], + ['ut_5fstart_5ftotal_5flunar_5feclipse_503',['ut_start_total_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a15a292cef81b794f9f4b07fb48fbf471',1,'practical_astronomy::pa_macro']]], + ['ut_5fstart_5fumbra_5flunar_5feclipse_504',['ut_start_umbra_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#ac8234ad97d3fe0aebb7999f366ac41a4',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_14.html b/practical_astronomy/source/docs/search/functions_14.html new file mode 100644 index 0000000000000000000000000000000000000000..29237b44cd002c72dca3804340ebaa0576d2d223 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_14.js b/practical_astronomy/source/docs/search/functions_14.js new file mode 100644 index 0000000000000000000000000000000000000000..1abd37d950d827534f54a113a39bf6fcb5f2eeac --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['visual_5faspects_5fof_5fa_5fplanet_505',['visual_aspects_of_a_planet',['../namespacepractical__astronomy_1_1pa__planet.html#a653d491b54bd718f4ea7949fa69b9b4c',1,'practical_astronomy::pa_planet']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_2.html b/practical_astronomy/source/docs/search/functions_2.html new file mode 100644 index 0000000000000000000000000000000000000000..ca5aa10e6c8ead94c3807ef5fd994f91c652ba4a --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_2.js b/practical_astronomy/source/docs/search/functions_2.js new file mode 100644 index 0000000000000000000000000000000000000000..e976a3c5b0d3fca6ad52f6ebc1fd2fcee29f44ff --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_2.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['carrington_5frotation_5fnumber_295',['carrington_rotation_number',['../namespacepractical__astronomy_1_1pa__coordinate.html#aea2e9ebd99d887bc7919c516f515d837',1,'practical_astronomy::pa_coordinate']]], + ['cd_5fjd_296',['cd_jd',['../namespacepractical__astronomy_1_1pa__macro.html#ae45433a24f80898f5dd0191009f39184',1,'practical_astronomy::pa_macro']]], + ['civil_5fdate_5fto_5fday_5fnumber_297',['civil_date_to_day_number',['../namespacepractical__astronomy_1_1pa__datetime.html#a085ad36535d1f6b906ebbc502dd547a3',1,'practical_astronomy::pa_datetime']]], + ['civil_5ftime_5fto_5fdecimal_5fhours_298',['civil_time_to_decimal_hours',['../namespacepractical__astronomy_1_1pa__datetime.html#a87c359a968e2ffd19d5c7ee78006762e',1,'practical_astronomy::pa_datetime']]], + ['correct_5ffor_5faberration_299',['correct_for_aberration',['../namespacepractical__astronomy_1_1pa__coordinate.html#a71720f0e80328a252ba574452418ea92',1,'practical_astronomy::pa_coordinate']]], + ['correct_5ffor_5fprecession_300',['correct_for_precession',['../namespacepractical__astronomy_1_1pa__coordinate.html#ac6a88c0e59835e90c871361d73f90f50',1,'practical_astronomy::pa_coordinate']]], + ['corrections_5ffor_5fgeocentric_5fparallax_301',['corrections_for_geocentric_parallax',['../namespacepractical__astronomy_1_1pa__coordinate.html#a94efd7a45ec9cb98c702bcf61d89dd39',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_3.html b/practical_astronomy/source/docs/search/functions_3.html new file mode 100644 index 0000000000000000000000000000000000000000..d79f55b8e3bcb1c4ad202fb07074d0b6e1ff58f9 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_3.js b/practical_astronomy/source/docs/search/functions_3.js new file mode 100644 index 0000000000000000000000000000000000000000..14d487315037dc294e15e55bd6c4448642df78f3 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_3.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['dd_5fdeg_302',['dd_deg',['../namespacepractical__astronomy_1_1pa__macro.html#ae89f6bad38c25ff72cdf2efdbf21e276',1,'practical_astronomy::pa_macro']]], + ['dd_5fdh_303',['dd_dh',['../namespacepractical__astronomy_1_1pa__macro.html#ad8fa9325ef741ca5a547a0d633339b08',1,'practical_astronomy::pa_macro']]], + ['dd_5fmin_304',['dd_min',['../namespacepractical__astronomy_1_1pa__macro.html#aceded82212785c66809b7e51c7da3b4c',1,'practical_astronomy::pa_macro']]], + ['dd_5fsec_305',['dd_sec',['../namespacepractical__astronomy_1_1pa__macro.html#ab601b823d99167db79378cb81d6649e2',1,'practical_astronomy::pa_macro']]], + ['decimal_5fdegrees_5fto_5fangle_306',['decimal_degrees_to_angle',['../namespacepractical__astronomy_1_1pa__coordinate.html#af4b04e15f6470d4f704e1cab2d64fd55',1,'practical_astronomy::pa_coordinate']]], + ['decimal_5fhour_5fhour_307',['decimal_hour_hour',['../namespacepractical__astronomy_1_1pa__datetime.html#a7a505017515cdadb479fef83039bbad8',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhour_5fminutes_308',['decimal_hour_minutes',['../namespacepractical__astronomy_1_1pa__datetime.html#af03f0a34f5a3205abfced5fb458b99c8',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhour_5fseconds_309',['decimal_hour_seconds',['../namespacepractical__astronomy_1_1pa__datetime.html#a21452aca72d47207179838ce47fb27cf',1,'practical_astronomy::pa_datetime']]], + ['decimal_5fhours_5fto_5fcivil_5ftime_310',['decimal_hours_to_civil_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a2320446a7693e2baef32833e536e82de',1,'practical_astronomy::pa_datetime']]], + ['degrees_311',['degrees',['../namespacepractical__astronomy_1_1pa__macro.html#ab738df3cbff4099561c70a0531304be4',1,'practical_astronomy::pa_macro']]], + ['dh_5fdd_312',['dh_dd',['../namespacepractical__astronomy_1_1pa__macro.html#afa8571c6e8bb5c30819b9d872f207804',1,'practical_astronomy::pa_macro']]], + ['dh_5fhour_313',['dh_hour',['../namespacepractical__astronomy_1_1pa__macro.html#a3c41fb93171f8bf548854cbf934db548',1,'practical_astronomy::pa_macro']]], + ['dh_5fmin_314',['dh_min',['../namespacepractical__astronomy_1_1pa__macro.html#ad3636bd3842c441c464df67b3e8aad32',1,'practical_astronomy::pa_macro']]], + ['dh_5fsec_315',['dh_sec',['../namespacepractical__astronomy_1_1pa__macro.html#ada6b3b92a4562a158192e37d6f79e970',1,'practical_astronomy::pa_macro']]], + ['dms_5fdd_316',['dms_dd',['../namespacepractical__astronomy_1_1pa__macro.html#a1ffca3d689d511cf7d4ce2654a365443',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_4.html b/practical_astronomy/source/docs/search/functions_4.html new file mode 100644 index 0000000000000000000000000000000000000000..1657cad0d427ab6f795b38b3001667293fdbc7ad --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_4.js b/practical_astronomy/source/docs/search/functions_4.js new file mode 100644 index 0000000000000000000000000000000000000000..c2ba22646d902274707c97b96c275575ae3b7dd7 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_4.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['e_5fgst_5fut_317',['e_gst_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a668275aec60ac6e761aac0432596a0e2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_318',['e_moon_rise',['../namespacepractical__astronomy_1_1pa__macro.html#a6bb82ea03dc3e9ec38cd7ef8d87c1f52',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_5fl6680_319',['e_moon_rise_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a3051ddab364fdf57567c9b2ba94fa6b2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5frise_5fl6700_320',['e_moon_rise_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#abbaa30225d0eba14c6195ac77f0acb17',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_321',['e_moon_set',['../namespacepractical__astronomy_1_1pa__macro.html#a1c3f54d11f8b5b6c756bc14199ae3eb2',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_5fl6680_322',['e_moon_set_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a588713ac66d586999c3c3b6c002624b9',1,'practical_astronomy::pa_macro']]], + ['e_5fmoon_5fset_5fl6700_323',['e_moon_set_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ad7888da366adfedec9049cf416155290',1,'practical_astronomy::pa_macro']]], + ['e_5frs_324',['e_rs',['../namespacepractical__astronomy_1_1pa__macro.html#accf0f6640e9526ca6da169ddab0943bd',1,'practical_astronomy::pa_macro']]], + ['e_5fsun_5frs_325',['e_sun_rs',['../namespacepractical__astronomy_1_1pa__macro.html#aaabc9ca8d45932cf13283b18974d413b',1,'practical_astronomy::pa_macro']]], + ['e_5fsun_5frs_5fl3710_326',['e_sun_rs_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#ac51cc7d8d3a7fdbd4f362e50193de6a8',1,'practical_astronomy::pa_macro']]], + ['e_5ftwilight_327',['e_twilight',['../namespacepractical__astronomy_1_1pa__macro.html#a809f18de9f76acc73bee4458ee17f694',1,'practical_astronomy::pa_macro']]], + ['e_5ftwilight_5fl3710_328',['e_twilight_l3710',['../namespacepractical__astronomy_1_1pa__macro.html#ac591fd2559e07e0a401d2781c436123c',1,'practical_astronomy::pa_macro']]], + ['ec_5fdec_329',['ec_dec',['../namespacepractical__astronomy_1_1pa__macro.html#a846197591fb08834cd64d849e5c19cfc',1,'practical_astronomy::pa_macro']]], + ['ec_5fra_330',['ec_ra',['../namespacepractical__astronomy_1_1pa__macro.html#abdd55d706b911f4f0bec3b98621201d1',1,'practical_astronomy::pa_macro']]], + ['eccentric_5fanomaly_331',['eccentric_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#aaf5c6edff0cfea9bc1a4b2dcd10dce1c',1,'practical_astronomy::pa_macro']]], + ['ecliptic_5fcoordinate_5fto_5fequatorial_5fcoordinate_332',['ecliptic_coordinate_to_equatorial_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a8801b81ef0c47d1968da6dd29c3fa015',1,'practical_astronomy::pa_coordinate']]], + ['eq_5falt_333',['eq_alt',['../namespacepractical__astronomy_1_1pa__macro.html#a3d324c027667e86ca93eca1474f33c47',1,'practical_astronomy::pa_macro']]], + ['eq_5faz_334',['eq_az',['../namespacepractical__astronomy_1_1pa__macro.html#a891be99a888a57496066551877381f6a',1,'practical_astronomy::pa_macro']]], + ['eq_5fe_5flat_335',['eq_e_lat',['../namespacepractical__astronomy_1_1pa__macro.html#a246f46ef1cf7cd93d01ea23ed78ab727',1,'practical_astronomy::pa_macro']]], + ['eq_5fe_5flong_336',['eq_e_long',['../namespacepractical__astronomy_1_1pa__macro.html#aed12f47f471197809d5987c0bf2061ff',1,'practical_astronomy::pa_macro']]], + ['equation_5fof_5ftime_337',['equation_of_time',['../namespacepractical__astronomy_1_1pa__sun.html#a041439423740ffa2b4f6e9b567586a2d',1,'practical_astronomy::pa_sun']]], + ['equatorial_5fcoordinate_5fto_5fecliptic_5fcoordinate_338',['equatorial_coordinate_to_ecliptic_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a2be55120967a6500d6abf660d0c42009',1,'practical_astronomy::pa_coordinate']]], + ['equatorial_5fcoordinate_5fto_5fgalactic_5fcoordinate_339',['equatorial_coordinate_to_galactic_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a8214a5edcdda8da9372d59cd847a5f65',1,'practical_astronomy::pa_coordinate']]], + ['equatorial_5fcoordinates_5fto_5fhorizon_5fcoordinates_340',['equatorial_coordinates_to_horizon_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#a759d93a22e6eb1a5fe88a07dbf4f4fd2',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_5.html b/practical_astronomy/source/docs/search/functions_5.html new file mode 100644 index 0000000000000000000000000000000000000000..9301d6b9c17c9f52ec88694b78476454b66b678f --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_5.js b/practical_astronomy/source/docs/search/functions_5.js new file mode 100644 index 0000000000000000000000000000000000000000..da46c7bd48c150dc3d1582719924e9a50f1b49cb --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['f_5fdow_341',['f_dow',['../namespacepractical__astronomy_1_1pa__macro.html#a37e477f7b58d705a15f7ae3bdae41304',1,'practical_astronomy::pa_macro']]], + ['f_5fpart_342',['f_part',['../namespacepractical__astronomy_1_1pa__macro.html#a1919879b878ae9c8051083293912edc6',1,'practical_astronomy::pa_macro']]], + ['fract_343',['fract',['../namespacepractical__astronomy_1_1pa__macro.html#a9343576b800565b60f135f5f9510307c',1,'practical_astronomy::pa_macro']]], + ['full_5fmoon_344',['full_moon',['../namespacepractical__astronomy_1_1pa__macro.html#a56feb4f0dad22830627f57a288d20fae',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_6.html b/practical_astronomy/source/docs/search/functions_6.html new file mode 100644 index 0000000000000000000000000000000000000000..9c4f5fc6546daedae85419d2293d57d7bb4be005 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_6.js b/practical_astronomy/source/docs/search/functions_6.js new file mode 100644 index 0000000000000000000000000000000000000000..6f8b6aac2d2c242c6515d96cebd8c1bd3089db61 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_6.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['galactic_5fcoordinate_5fto_5fequatorial_5fcoordinate_345',['galactic_coordinate_to_equatorial_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3de24c7dd22235e3d8976333e0081a98',1,'practical_astronomy::pa_coordinate']]], + ['get_5fbinary_5fdata_346',['get_binary_data',['../namespacepractical__astronomy_1_1pa__binary__data.html#a665c50e5d40ad4b7e43079b2175d9e67',1,'practical_astronomy::pa_binary_data']]], + ['get_5fcomet_5fdata_5felliptical_347',['get_comet_data_elliptical',['../namespacepractical__astronomy_1_1pa__comet__data.html#a880f949265c37db03be8789361c533dc',1,'practical_astronomy::pa_comet_data']]], + ['get_5fcomet_5fdata_5fparabolic_348',['get_comet_data_parabolic',['../namespacepractical__astronomy_1_1pa__comet__data.html#a354296f92713da2121f7ff50fccc16d3',1,'practical_astronomy::pa_comet_data']]], + ['get_5fdate_5fof_5feaster_349',['get_date_of_easter',['../namespacepractical__astronomy_1_1pa__datetime.html#a2980ffc259f16fd25b37bc1cbb8b18d4',1,'practical_astronomy::pa_datetime']]], + ['get_5fplanet_5fdata_350',['get_planet_data',['../namespacepractical__astronomy_1_1pa__planet__data.html#a80b3d5ea375b6d3724171ba6f2cb4a2b',1,'practical_astronomy::pa_planet_data']]], + ['greenwich_5fdate_5fto_5fjulian_5fdate_351',['greenwich_date_to_julian_date',['../namespacepractical__astronomy_1_1pa__datetime.html#a2c3a8dc822708f5871b272048a50a2b5',1,'practical_astronomy::pa_datetime']]], + ['greenwich_5fsidereal_5ftime_5fto_5flocal_5fsidereal_5ftime_352',['greenwich_sidereal_time_to_local_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#ad329bcbb2bcaf6b6c3d6c0c918936ecf',1,'practical_astronomy::pa_datetime']]], + ['greenwich_5fsidereal_5ftime_5fto_5funiversal_5ftime_353',['greenwich_sidereal_time_to_universal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#ab03052b709178a939ecacd357a9b1730',1,'practical_astronomy::pa_datetime']]], + ['gst_5flst_354',['gst_lst',['../namespacepractical__astronomy_1_1pa__macro.html#ab231f1f9db003559dc64170365c8d133',1,'practical_astronomy::pa_macro']]], + ['gst_5fut_355',['gst_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a6d47a406e1b10a1fba09a76f8693dc80',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_7.html b/practical_astronomy/source/docs/search/functions_7.html new file mode 100644 index 0000000000000000000000000000000000000000..46b5c0f613ca6a7f1c08edf24b3a87881b351360 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_7.js b/practical_astronomy/source/docs/search/functions_7.js new file mode 100644 index 0000000000000000000000000000000000000000..8c8f7d3e3fb07beb4bdca80c42163b6e0b8f2793 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_7.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['ha_5fra_356',['ha_ra',['../namespacepractical__astronomy_1_1pa__macro.html#a06c8bb32b88eb03689ba130e17e5e69b',1,'practical_astronomy::pa_macro']]], + ['heliographic_5fcoordinates_357',['heliographic_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#af1747d784ba179c8ebc99fb761b337bb',1,'practical_astronomy::pa_coordinate']]], + ['hms_5fdh_358',['hms_dh',['../namespacepractical__astronomy_1_1pa__macro.html#a43a4596b8c96774b9f277dd2209cd06c',1,'practical_astronomy::pa_macro']]], + ['hor_5fdec_359',['hor_dec',['../namespacepractical__astronomy_1_1pa__macro.html#affd159e8e88b91904558baff5cfe538b',1,'practical_astronomy::pa_macro']]], + ['hor_5fha_360',['hor_ha',['../namespacepractical__astronomy_1_1pa__macro.html#aa45f444af815b93d1d5b88a5d4ed53b0',1,'practical_astronomy::pa_macro']]], + ['horizon_5fcoordinates_5fto_5fequatorial_5fcoordinates_361',['horizon_coordinates_to_equatorial_coordinates',['../namespacepractical__astronomy_1_1pa__coordinate.html#abcc4ce68e3508c7ed5443ce846531bb8',1,'practical_astronomy::pa_coordinate']]], + ['hour_5fangle_5fto_5fright_5fascension_362',['hour_angle_to_right_ascension',['../namespacepractical__astronomy_1_1pa__coordinate.html#a4703c296a201b48930292c17665c7dd2',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_8.html b/practical_astronomy/source/docs/search/functions_8.html new file mode 100644 index 0000000000000000000000000000000000000000..31a1d9503e343012956b8ab5c51768dac8453e6a --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_8.js b/practical_astronomy/source/docs/search/functions_8.js new file mode 100644 index 0000000000000000000000000000000000000000..471bd90167dd99aefedb920bcdb02b91158e2bed --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['iint_363',['iint',['../namespacepractical__astronomy_1_1pa__macro.html#a183688ea9868beb50f0227010d223f4d',1,'practical_astronomy::pa_macro']]], + ['is_5fleap_5fyear_364',['is_leap_year',['../namespacepractical__astronomy_1_1pa__util.html#a4bde6043f052777f35147c29658b728a',1,'practical_astronomy::pa_util']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_9.html b/practical_astronomy/source/docs/search/functions_9.html new file mode 100644 index 0000000000000000000000000000000000000000..9a8e4290c9a527b9b0d258731057bb2fc8230379 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_9.js b/practical_astronomy/source/docs/search/functions_9.js new file mode 100644 index 0000000000000000000000000000000000000000..0fa0fe5329e6fa7f8ce0730ec5e6f20032ec0abd --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_9.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['jdc_5fday_365',['jdc_day',['../namespacepractical__astronomy_1_1pa__macro.html#ab2b1b3d413b7ac0b4046bf10a86e153c',1,'practical_astronomy::pa_macro']]], + ['jdc_5fmonth_366',['jdc_month',['../namespacepractical__astronomy_1_1pa__macro.html#af23f2b93521938aff5011cc98680b05a',1,'practical_astronomy::pa_macro']]], + ['jdc_5fyear_367',['jdc_year',['../namespacepractical__astronomy_1_1pa__macro.html#aa7c4db5c73214d4fe195e876fa541dcb',1,'practical_astronomy::pa_macro']]], + ['julian_5fdate_5fday_368',['julian_date_day',['../namespacepractical__astronomy_1_1pa__datetime.html#a6af5e356e7784f060e5c55e814581e05',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fmonth_369',['julian_date_month',['../namespacepractical__astronomy_1_1pa__datetime.html#af6c7751410aa70a76670b144f50dc619',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fto_5fgreenwich_5fdate_370',['julian_date_to_greenwich_date',['../namespacepractical__astronomy_1_1pa__datetime.html#a267f3d2010bdf763726f9da3612e4060',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fto_5fweekday_5fname_371',['julian_date_to_weekday_name',['../namespacepractical__astronomy_1_1pa__datetime.html#ab1a46eed14594880e25220f9a9675a37',1,'practical_astronomy::pa_datetime']]], + ['julian_5fdate_5fyear_372',['julian_date_year',['../namespacepractical__astronomy_1_1pa__datetime.html#a67a531866a9dc81ad806d4a505a20c8a',1,'practical_astronomy::pa_datetime']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_a.html b/practical_astronomy/source/docs/search/functions_a.html new file mode 100644 index 0000000000000000000000000000000000000000..5ecc152cab43e601600e9bdcc2f1ae1f279f863c --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_a.js b/practical_astronomy/source/docs/search/functions_a.js new file mode 100644 index 0000000000000000000000000000000000000000..9f7b29a38e09bd199129294200a308532e873c8e --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['km_5fto_5fmi_373',['km_to_mi',['../namespacepractical__astronomy_1_1pa__util.html#a29de8f0275076afc08b7f2ed98080bdb',1,'practical_astronomy::pa_util']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_b.html b/practical_astronomy/source/docs/search/functions_b.html new file mode 100644 index 0000000000000000000000000000000000000000..e301fedd7d103532b152ca2329fb60ffaf5ff847 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_b.js b/practical_astronomy/source/docs/search/functions_b.js new file mode 100644 index 0000000000000000000000000000000000000000..f95fb3ac1baf76d1a88a53ff5631a807c50e98a8 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_b.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['lct_5fgday_374',['lct_gday',['../namespacepractical__astronomy_1_1pa__macro.html#a46edb7e554811ce6321e7db418f80f7c',1,'practical_astronomy::pa_macro']]], + ['lct_5fgmonth_375',['lct_gmonth',['../namespacepractical__astronomy_1_1pa__macro.html#a105f28dd78c95603fffb2db1984fbe12',1,'practical_astronomy::pa_macro']]], + ['lct_5fgyear_376',['lct_gyear',['../namespacepractical__astronomy_1_1pa__macro.html#a5785e385bddfefe0b922b91cd0a0ec1a',1,'practical_astronomy::pa_macro']]], + ['lct_5fut_377',['lct_ut',['../namespacepractical__astronomy_1_1pa__macro.html#a8262d7ce106918f0b279edbd4356a7d1',1,'practical_astronomy::pa_macro']]], + ['lint_378',['lint',['../namespacepractical__astronomy_1_1pa__macro.html#a91b8faef2e6bd134254cd5f596a162ed',1,'practical_astronomy::pa_macro']]], + ['local_5fcivil_5ftime_5fto_5funiversal_5ftime_379',['local_civil_time_to_universal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#aa48dfcf90dce9ac086b0b28bd2dbac7b',1,'practical_astronomy::pa_datetime']]], + ['local_5fsidereal_5ftime_5fto_5fgreenwich_5fsidereal_5ftime_380',['local_sidereal_time_to_greenwich_sidereal_time',['../namespacepractical__astronomy_1_1pa__datetime.html#a22b0001de8eb44f6ed02d4899d9d86b1',1,'practical_astronomy::pa_datetime']]], + ['lst_5fgst_381',['lst_gst',['../namespacepractical__astronomy_1_1pa__macro.html#a22c400268a08a350c72f2c0830d4e40b',1,'practical_astronomy::pa_macro']]], + ['lunar_5feclipse_5fcircumstances_382',['lunar_eclipse_circumstances',['../namespacepractical__astronomy_1_1pa__eclipses.html#a48d5a9475c1877f1268b4d063dd99f6b',1,'practical_astronomy::pa_eclipses']]], + ['lunar_5feclipse_5foccurrence_383',['lunar_eclipse_occurrence',['../namespacepractical__astronomy_1_1pa__eclipses.html#a0ac960734a008556789361349956209c',1,'practical_astronomy.pa_eclipses.lunar_eclipse_occurrence()'],['../namespacepractical__astronomy_1_1pa__macro.html#a40312f6ac912d41a907d2bc9bf323456',1,'practical_astronomy.pa_macro.lunar_eclipse_occurrence(DS, ZC, DY, MN, YR)']]], + ['lunar_5feclipse_5foccurrence_5fl6855_384',['lunar_eclipse_occurrence_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#a6d4798a56972a9b1bf4dd35496a66a18',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_c.html b/practical_astronomy/source/docs/search/functions_c.html new file mode 100644 index 0000000000000000000000000000000000000000..c4f32687708c3ba5bfd93176c8479250ea8f2702 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_c.js b/practical_astronomy/source/docs/search/functions_c.js new file mode 100644 index 0000000000000000000000000000000000000000..ce2cf4b8438ac1292d5ae90eb14ee526273f6405 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_c.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['mag_5flunar_5feclipse_385',['mag_lunar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a91044fea690474429ca7c3b9c8124b31',1,'practical_astronomy::pa_macro']]], + ['mag_5fsolar_5feclipse_386',['mag_solar_eclipse',['../namespacepractical__astronomy_1_1pa__macro.html#a7b33e18563369df1c45616322b7618f7',1,'practical_astronomy::pa_macro']]], + ['mag_5fsolar_5feclipse_5fl7390_387',['mag_solar_eclipse_l7390',['../namespacepractical__astronomy_1_1pa__macro.html#abd91674b9bca5a624f756949dfb20a19',1,'practical_astronomy::pa_macro']]], + ['mean_5fobliquity_5fof_5fthe_5fecliptic_388',['mean_obliquity_of_the_ecliptic',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3b012c023b82b660c02c4b5de08474d2',1,'practical_astronomy::pa_coordinate']]], + ['mi_5fto_5fkm_389',['mi_to_km',['../namespacepractical__astronomy_1_1pa__util.html#a1aa17b78e46a1d549c7871de9797c9de',1,'practical_astronomy::pa_util']]], + ['moon_5fdist_390',['moon_dist',['../namespacepractical__astronomy_1_1pa__macro.html#ab22050aced35c0adce5617e66f18d2fd',1,'practical_astronomy::pa_macro']]], + ['moon_5fdist_5fang_5fdiam_5fhor_5fparallax_391',['moon_dist_ang_diam_hor_parallax',['../namespacepractical__astronomy_1_1pa__moon.html#aedd86f345903593ab5e8bda8548f5c13',1,'practical_astronomy::pa_moon']]], + ['moon_5fhp_392',['moon_hp',['../namespacepractical__astronomy_1_1pa__macro.html#aba7a5ece48ac48e22d661556d2cfaa14',1,'practical_astronomy::pa_macro']]], + ['moon_5flat_393',['moon_lat',['../namespacepractical__astronomy_1_1pa__macro.html#a9daed488b5de1cbfc98a7136e0bd1a05',1,'practical_astronomy::pa_macro']]], + ['moon_5flong_394',['moon_long',['../namespacepractical__astronomy_1_1pa__macro.html#a23d02d81556d7695f63cae4e3df19dbb',1,'practical_astronomy::pa_macro']]], + ['moon_5flong_5flat_5fhp_395',['moon_long_lat_hp',['../namespacepractical__astronomy_1_1pa__macro.html#af5b4537b14bb450a8f25e33101845a86',1,'practical_astronomy::pa_macro']]], + ['moon_5fmean_5fanomaly_396',['moon_mean_anomaly',['../namespacepractical__astronomy_1_1pa__macro.html#af70a4720345b0e73b857c91dd84df3da',1,'practical_astronomy::pa_macro']]], + ['moon_5fphase_397',['moon_phase',['../namespacepractical__astronomy_1_1pa__macro.html#aa5d6562291f66ac8fac04d89e3b90652',1,'practical_astronomy.pa_macro.moon_phase()'],['../namespacepractical__astronomy_1_1pa__moon.html#a0a21dc7776e79ad9d26f27d6da65139e',1,'practical_astronomy.pa_moon.moon_phase()']]], + ['moon_5frise_5faz_398',['moon_rise_az',['../namespacepractical__astronomy_1_1pa__macro.html#a5f043e44ceb70f32d3f255cd02ff53a4',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5faz_5fl6680_399',['moon_rise_az_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#ab9b8773345c7d4922ffb682ba9ea2b36',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5faz_5fl6700_400',['moon_rise_az_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ae864c757a1bd2961c994dc5c69369b38',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_401',['moon_rise_lc_dmy',['../namespacepractical__astronomy_1_1pa__macro.html#a2ffd81a6353e989306ce41e4dce90675',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_5fl6680_402',['moon_rise_lc_dmy_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a6409ca331112e19d32e71ce779d1f209',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flc_5fdmy_5fl6700_403',['moon_rise_lc_dmy_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#af464c217e6c13de9c5e1971272ec6049',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_404',['moon_rise_lct',['../namespacepractical__astronomy_1_1pa__macro.html#ac0ab9a097c01383f6d6cc07b90e034a1',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_5fl6680_405',['moon_rise_lct_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a8378463a64c32022f516594e0b152cb1',1,'practical_astronomy::pa_macro']]], + ['moon_5frise_5flct_5fl6700_406',['moon_rise_lct_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#a745a450e3468bf4c214e902973a43c57',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_407',['moon_set_az',['../namespacepractical__astronomy_1_1pa__macro.html#a561759d6302e17ad046c1cf74a8fdb14',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_5fl6680_408',['moon_set_az_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a045fb010333f74a3359efd9dc69d626d',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5faz_5fl6700_409',['moon_set_az_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#a49ce367bffc3b56a48eaa3bd1a03aefe',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_410',['moon_set_lc_dmy',['../namespacepractical__astronomy_1_1pa__macro.html#a881ded591e2b18b78a5b25d4e92b2d46',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_5fl6680_411',['moon_set_lc_dmy_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#a2ff94df12871eb0c84974727ea3c8d31',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flc_5fdmy_5fl6700_412',['moon_set_lc_dmy_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#ac8d49b52926ba75b6a77254e0507ee34',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_413',['moon_set_lct',['../namespacepractical__astronomy_1_1pa__macro.html#a1fd51be6c6ceda184cf4c4489b540f03',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_5fl6680_414',['moon_set_lct_l6680',['../namespacepractical__astronomy_1_1pa__macro.html#aeaacca1e8e60a5ed13a98ee07e6f0228',1,'practical_astronomy::pa_macro']]], + ['moon_5fset_5flct_5fl6700_415',['moon_set_lct_l6700',['../namespacepractical__astronomy_1_1pa__macro.html#aac6e50514786edd12ba3e9e8fbc9fcb1',1,'practical_astronomy::pa_macro']]], + ['moon_5fsize_416',['moon_size',['../namespacepractical__astronomy_1_1pa__macro.html#a27fdf19dffe998871f90355393cf502f',1,'practical_astronomy::pa_macro']]], + ['moonrise_5fand_5fmoonset_417',['moonrise_and_moonset',['../namespacepractical__astronomy_1_1pa__moon.html#a303811d67109d57d62bf8914de754cfe',1,'practical_astronomy::pa_moon']]], + ['morning_5fand_5fevening_5ftwilight_418',['morning_and_evening_twilight',['../namespacepractical__astronomy_1_1pa__sun.html#adfbd4639478f5952b5dffe334071fa26',1,'practical_astronomy::pa_sun']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_d.html b/practical_astronomy/source/docs/search/functions_d.html new file mode 100644 index 0000000000000000000000000000000000000000..7a1ed065d71edcb05f9444d35ea53c173dd43f0f --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_d.js b/practical_astronomy/source/docs/search/functions_d.js new file mode 100644 index 0000000000000000000000000000000000000000..c5d7ba11878781eeac0ae188f76cddddcb5a7f0b --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['new_5fmoon_419',['new_moon',['../namespacepractical__astronomy_1_1pa__macro.html#acc8244f47cc29d7a0078a55df59c9c7c',1,'practical_astronomy::pa_macro']]], + ['new_5fmoon_5ffull_5fmoon_5fl6855_420',['new_moon_full_moon_l6855',['../namespacepractical__astronomy_1_1pa__macro.html#ab80cabb007a1e6783a13506d4351908a',1,'practical_astronomy::pa_macro']]], + ['nutat_5flong_421',['nutat_long',['../namespacepractical__astronomy_1_1pa__macro.html#a681b21159361cc3479105fc31ef861fc',1,'practical_astronomy::pa_macro']]], + ['nutat_5fobl_422',['nutat_obl',['../namespacepractical__astronomy_1_1pa__macro.html#a84765422e7420803ede32148d0e014a7',1,'practical_astronomy::pa_macro']]], + ['nutation_5fin_5fecliptic_5flongitude_5fand_5fobliquity_423',['nutation_in_ecliptic_longitude_and_obliquity',['../namespacepractical__astronomy_1_1pa__coordinate.html#a3a11b5ab0fe82c3966282455392d05fc',1,'practical_astronomy::pa_coordinate']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_e.html b/practical_astronomy/source/docs/search/functions_e.html new file mode 100644 index 0000000000000000000000000000000000000000..22d2a6bf5502588a5df5afaa23580997ac862e9d --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_e.js b/practical_astronomy/source/docs/search/functions_e.js new file mode 100644 index 0000000000000000000000000000000000000000..639023a5dca8bcfb9918ffea90a4acaf72136f2a --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['obliq_424',['obliq',['../namespacepractical__astronomy_1_1pa__macro.html#a3716ff9bcaf920e2a9cfa2f0ada15f9c',1,'practical_astronomy::pa_macro']]] +]; diff --git a/practical_astronomy/source/docs/search/functions_f.html b/practical_astronomy/source/docs/search/functions_f.html new file mode 100644 index 0000000000000000000000000000000000000000..54b7dee083adc185b7c61a81706cdec616c7a244 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/functions_f.js b/practical_astronomy/source/docs/search/functions_f.js new file mode 100644 index 0000000000000000000000000000000000000000..9bbba0118e2aab719a7257afacbf7659807f8692 --- /dev/null +++ b/practical_astronomy/source/docs/search/functions_f.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['p_5fcomet_5flong_5flat_5fdist_425',['p_comet_long_lat_dist',['../namespacepractical__astronomy_1_1pa__macro.html#a1b5eac8af576ccd6282b7b7a63c3e89a',1,'practical_astronomy::pa_macro']]], + ['parallax_5fdec_426',['parallax_dec',['../namespacepractical__astronomy_1_1pa__macro.html#a4d0959d2a036f25b36da7701f7d09315',1,'practical_astronomy::pa_macro']]], + ['parallax_5fdec_5fl2870_427',['parallax_dec_l2870',['../namespacepractical__astronomy_1_1pa__macro.html#a0f2f9fa28025bfd0727c883df3ce2ab0',1,'practical_astronomy::pa_macro']]], + ['parallax_5fha_428',['parallax_ha',['../namespacepractical__astronomy_1_1pa__macro.html#a6c896247bc90faedeedcf3c665b51a01',1,'practical_astronomy::pa_macro']]], + ['parallax_5fha_5fl2870_429',['parallax_ha_l2870',['../namespacepractical__astronomy_1_1pa__macro.html#a0aa85cbdf3b976861aa96408228319d3',1,'practical_astronomy::pa_macro']]], + ['planet_5fcoordinates_430',['planet_coordinates',['../namespacepractical__astronomy_1_1pa__macro.html#a8782f3703c6fe128bf2432bc34879a32',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4685_431',['planet_long_l4685',['../namespacepractical__astronomy_1_1pa__macro.html#ac92a92e61b4e46a4d808191e804ee1a5',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4735_432',['planet_long_l4735',['../namespacepractical__astronomy_1_1pa__macro.html#a58e6721f2901ab6341c5186fd16d212e',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4810_433',['planet_long_l4810',['../namespacepractical__astronomy_1_1pa__macro.html#a757dbf1cc823969685ac2365b5f83658',1,'practical_astronomy::pa_macro']]], + ['planet_5flong_5fl4945_434',['planet_long_l4945',['../namespacepractical__astronomy_1_1pa__macro.html#ae798655da82fabfa4704371a2119eba6',1,'practical_astronomy::pa_macro']]], + ['position_5fof_5felliptical_5fcomet_435',['position_of_elliptical_comet',['../namespacepractical__astronomy_1_1pa__comet.html#aa3d042bef43ebd6669b43eb87c5e515a',1,'practical_astronomy::pa_comet']]], + ['position_5fof_5fparabolic_5fcomet_436',['position_of_parabolic_comet',['../namespacepractical__astronomy_1_1pa__comet.html#aec2f1ca117599741cfb24e597c8f3ac6',1,'practical_astronomy::pa_comet']]], + ['precise_5fposition_5fof_5fmoon_437',['precise_position_of_moon',['../namespacepractical__astronomy_1_1pa__moon.html#a4a39acc6f3fcf1ecdda0e13ce5d870ce',1,'practical_astronomy::pa_moon']]], + ['precise_5fposition_5fof_5fplanet_438',['precise_position_of_planet',['../namespacepractical__astronomy_1_1pa__planet.html#aeb953f985c7f33b29ecea14f0bdfe255',1,'practical_astronomy::pa_planet']]], + ['precise_5fposition_5fof_5fsun_439',['precise_position_of_sun',['../namespacepractical__astronomy_1_1pa__sun.html#a6fbea6a71648f5f0d7b254743bcb5b44',1,'practical_astronomy::pa_sun']]] +]; diff --git a/practical_astronomy/source/docs/search/mag_sel.svg b/practical_astronomy/source/docs/search/mag_sel.svg new file mode 100644 index 0000000000000000000000000000000000000000..03626f64a02be69e427a4a9f29a99052ccd235a1 --- /dev/null +++ b/practical_astronomy/source/docs/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/practical_astronomy/source/docs/search/namespaces_0.html b/practical_astronomy/source/docs/search/namespaces_0.html new file mode 100644 index 0000000000000000000000000000000000000000..21db2c3a565afdd1d11ba5c712a97dd79a6bcef8 --- /dev/null +++ b/practical_astronomy/source/docs/search/namespaces_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/namespaces_0.js b/practical_astronomy/source/docs/search/namespaces_0.js new file mode 100644 index 0000000000000000000000000000000000000000..ee83e1080b3e40f307ce2db9d74b5f6d20ffb404 --- /dev/null +++ b/practical_astronomy/source/docs/search/namespaces_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['pa_5fbinary_256',['pa_binary',['../namespacepractical__astronomy_1_1pa__binary.html',1,'practical_astronomy']]], + ['pa_5fbinary_5fdata_257',['pa_binary_data',['../namespacepractical__astronomy_1_1pa__binary__data.html',1,'practical_astronomy']]], + ['pa_5fcomet_258',['pa_comet',['../namespacepractical__astronomy_1_1pa__comet.html',1,'practical_astronomy']]], + ['pa_5fcomet_5fdata_259',['pa_comet_data',['../namespacepractical__astronomy_1_1pa__comet__data.html',1,'practical_astronomy']]], + ['pa_5fcoordinate_260',['pa_coordinate',['../namespacepractical__astronomy_1_1pa__coordinate.html',1,'practical_astronomy']]], + ['pa_5fdatetime_261',['pa_datetime',['../namespacepractical__astronomy_1_1pa__datetime.html',1,'practical_astronomy']]], + ['pa_5feclipses_262',['pa_eclipses',['../namespacepractical__astronomy_1_1pa__eclipses.html',1,'practical_astronomy']]], + ['pa_5fmacro_263',['pa_macro',['../namespacepractical__astronomy_1_1pa__macro.html',1,'practical_astronomy']]], + ['pa_5fmoon_264',['pa_moon',['../namespacepractical__astronomy_1_1pa__moon.html',1,'practical_astronomy']]], + ['pa_5fplanet_265',['pa_planet',['../namespacepractical__astronomy_1_1pa__planet.html',1,'practical_astronomy']]], + ['pa_5fplanet_5fdata_266',['pa_planet_data',['../namespacepractical__astronomy_1_1pa__planet__data.html',1,'practical_astronomy']]], + ['pa_5fsun_267',['pa_sun',['../namespacepractical__astronomy_1_1pa__sun.html',1,'practical_astronomy']]], + ['pa_5futil_268',['pa_util',['../namespacepractical__astronomy_1_1pa__util.html',1,'practical_astronomy']]], + ['practical_5fastronomy_269',['practical_astronomy',['../namespacepractical__astronomy.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/nomatches.html b/practical_astronomy/source/docs/search/nomatches.html new file mode 100644 index 0000000000000000000000000000000000000000..2b9360b6bd700092477e10cf056de3f8967dd808 --- /dev/null +++ b/practical_astronomy/source/docs/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/practical_astronomy/source/docs/search/pages_0.html b/practical_astronomy/source/docs/search/pages_0.html new file mode 100644 index 0000000000000000000000000000000000000000..8517b48f05dc324c03ca98dfc7fa660d0c13c8dd --- /dev/null +++ b/practical_astronomy/source/docs/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/pages_0.js b/practical_astronomy/source/docs/search/pages_0.js new file mode 100644 index 0000000000000000000000000000000000000000..f1612bce7188f4a8c9f076fc7f066d435f4ec665 --- /dev/null +++ b/practical_astronomy/source/docs/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['glossary_20of_20terms_510',['Glossary of Terms',['../md_src_glossary.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/pages_1.html b/practical_astronomy/source/docs/search/pages_1.html new file mode 100644 index 0000000000000000000000000000000000000000..a0fb679631b1c26641bb0e608af27e6fba421ed2 --- /dev/null +++ b/practical_astronomy/source/docs/search/pages_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/pages_1.js b/practical_astronomy/source/docs/search/pages_1.js new file mode 100644 index 0000000000000000000000000000000000000000..bfbb3696cce9718bbc2685bfc7665d91dfe42c17 --- /dev/null +++ b/practical_astronomy/source/docs/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['practical_2dastronomy_2dpython_511',['practical-astronomy-python',['../index.html',1,'']]] +]; diff --git a/practical_astronomy/source/docs/search/search.css b/practical_astronomy/source/docs/search/search.css new file mode 100644 index 0000000000000000000000000000000000000000..9074198f81f13dedf965db7bf9ba591fe194eae3 --- /dev/null +++ b/practical_astronomy/source/docs/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/practical_astronomy/source/docs/search/search.js b/practical_astronomy/source/docs/search/search.js new file mode 100644 index 0000000000000000000000000000000000000000..fb226f734e6daca1cfb5a63012d8563e26677549 --- /dev/null +++ b/practical_astronomy/source/docs/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/variables_0.js b/practical_astronomy/source/docs/search/variables_0.js new file mode 100644 index 0000000000000000000000000000000000000000..2f7c0e8228a541c94c171167242423b911db1554 --- /dev/null +++ b/practical_astronomy/source/docs/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['binarydata_506',['BinaryData',['../namespacepractical__astronomy_1_1pa__binary__data.html#ac5703bf2a91c2d1da46f103d171388a8',1,'practical_astronomy::pa_binary_data']]] +]; diff --git a/practical_astronomy/source/docs/search/variables_1.html b/practical_astronomy/source/docs/search/variables_1.html new file mode 100644 index 0000000000000000000000000000000000000000..ea73d9a494f45f41551f3591bd58bcc086157fb5 --- /dev/null +++ b/practical_astronomy/source/docs/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/variables_1.js b/practical_astronomy/source/docs/search/variables_1.js new file mode 100644 index 0000000000000000000000000000000000000000..0dd962174b0eaf4eeb3774c464931bb20caf9b0c --- /dev/null +++ b/practical_astronomy/source/docs/search/variables_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['cometdataelliptical_507',['CometDataElliptical',['../namespacepractical__astronomy_1_1pa__comet__data.html#a5dfaac06954d07c606fa71e691aa89eb',1,'practical_astronomy::pa_comet_data']]], + ['cometdataparabolic_508',['CometDataParabolic',['../namespacepractical__astronomy_1_1pa__comet__data.html#a5a4863a7e81117de4279b5afea3b8be9',1,'practical_astronomy::pa_comet_data']]] +]; diff --git a/practical_astronomy/source/docs/search/variables_2.html b/practical_astronomy/source/docs/search/variables_2.html new file mode 100644 index 0000000000000000000000000000000000000000..0580462e9c83c4b2571ca2fd402b59122f739820 --- /dev/null +++ b/practical_astronomy/source/docs/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/practical_astronomy/source/docs/search/variables_2.js b/practical_astronomy/source/docs/search/variables_2.js new file mode 100644 index 0000000000000000000000000000000000000000..cc8a5f07b1df885df08093b5f7914fa197277c8c --- /dev/null +++ b/practical_astronomy/source/docs/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['planetdata_509',['PlanetData',['../namespacepractical__astronomy_1_1pa__planet__data.html#aafde02b5f4bc4c9f9be616ba43f50bf2',1,'practical_astronomy::pa_planet_data']]] +]; diff --git a/practical_astronomy/source/docs/splitbar.png b/practical_astronomy/source/docs/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e Binary files /dev/null and b/practical_astronomy/source/docs/splitbar.png differ diff --git a/practical_astronomy/source/docs/sync_off.png b/practical_astronomy/source/docs/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc Binary files /dev/null and b/practical_astronomy/source/docs/sync_off.png differ diff --git a/practical_astronomy/source/docs/sync_on.png b/practical_astronomy/source/docs/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 Binary files /dev/null and b/practical_astronomy/source/docs/sync_on.png differ diff --git a/practical_astronomy/source/docs/tab_a.png b/practical_astronomy/source/docs/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 Binary files /dev/null and b/practical_astronomy/source/docs/tab_a.png differ diff --git a/practical_astronomy/source/docs/tab_b.png b/practical_astronomy/source/docs/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 Binary files /dev/null and b/practical_astronomy/source/docs/tab_b.png differ diff --git a/practical_astronomy/source/docs/tab_h.png b/practical_astronomy/source/docs/tab_h.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5cb705488e60fcf30f56fcc951dee74f3b095b Binary files /dev/null and b/practical_astronomy/source/docs/tab_h.png differ diff --git a/practical_astronomy/source/docs/tab_s.png b/practical_astronomy/source/docs/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 Binary files /dev/null and b/practical_astronomy/source/docs/tab_s.png differ diff --git a/practical_astronomy/source/docs/tabs.css b/practical_astronomy/source/docs/tabs.css new file mode 100644 index 0000000000000000000000000000000000000000..7d45d36c1c7d9b590a1477fb219c91f8973228f0 --- /dev/null +++ b/practical_astronomy/source/docs/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/practical_astronomy/source/pyproject.toml b/practical_astronomy/source/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..73c5d23f3a1a817287275ef388b96b02ca1c4abf --- /dev/null +++ b/practical_astronomy/source/pyproject.toml @@ -0,0 +1,21 @@ +[project] +name = "practical-astronomy" +version = "1.0.2" +authors = [{ name = "Jim Carr", email = "jfcarr@gmail.com" }] +description = "Algorithms from Practical Astronomy, implemented in Python" +readme = "README.md" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] + +[project.urls] +Homepage = "https://github.com/jfcarr/practical-astronomy-python" +Issues = "https://github.com/jfcarr/practical-astronomy-python/issues" +Documentation = "https://jfcarr.github.io/practical-astronomy-python" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/practical_astronomy/source/src/__init__.py b/practical_astronomy/source/src/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e6e237ed8dcb6e6cc47eed4854b52979143e6191 --- /dev/null +++ b/practical_astronomy/source/src/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +""" +src Package Initialization File +""" diff --git a/practical_astronomy/source/src/__pycache__/__init__.cpython-310.pyc b/practical_astronomy/source/src/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf574b0e43c8832f16da4768e416cca7b2da0900 Binary files /dev/null and b/practical_astronomy/source/src/__pycache__/__init__.cpython-310.pyc differ diff --git a/practical_astronomy/source/src/practical_astronomy/__init__.py b/practical_astronomy/source/src/practical_astronomy/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/practical_astronomy/source/src/practical_astronomy/__pycache__/__init__.cpython-310.pyc b/practical_astronomy/source/src/practical_astronomy/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1da0c1d8c657ae375ff8fbca175ac373fdcbe45c Binary files /dev/null and b/practical_astronomy/source/src/practical_astronomy/__pycache__/__init__.cpython-310.pyc differ diff --git a/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary.cpython-310.pyc b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc5242737bb38d580199540cfc3576825732b9c3 Binary files /dev/null and b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary.cpython-310.pyc differ diff --git a/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary_data.cpython-310.pyc b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ee0bca0f0bc3966410e9cef238372211215b101 Binary files /dev/null and b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_binary_data.cpython-310.pyc differ diff --git a/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_coordinate.cpython-310.pyc b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_coordinate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fbc3d8b83655b4e921e87950cb3f956d604f889 Binary files /dev/null and b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_coordinate.cpython-310.pyc differ diff --git a/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_macro.cpython-310.pyc b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_macro.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f446d71fe2427bc2ad7cdbf757a641f8b0b969b6 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/__pycache__/pa_macro.cpython-310.pyc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c2d1c6085f932e7c9dc6545a67549b53631d5addd8cdbc9753d9c50d419021c +size 118097 diff --git a/practical_astronomy/source/src/practical_astronomy/pa_binary.py b/practical_astronomy/source/src/practical_astronomy/pa_binary.py new file mode 100644 index 0000000000000000000000000000000000000000..8d698306563028dafd655e2dcaa85c991e8f16f2 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_binary.py @@ -0,0 +1,37 @@ +from . import pa_binary_data as PBD +from . import pa_macro as PM +import math + +def binary_star_orbit(greenwich_date_day, greenwich_date_month, greenwich_date_year, binary_name): + """ + Calculate orbital data for binary star. + + Arguments: + greenwich_date_day -- Greenwich date (day) + greenwich_date_month -- Greenwich date (month) + greenwich_date_year -- Greenwich date (year) + binary_name -- Abbreviated name of binary + + Returns: + position_angle_deg -- Position angle (degrees) + separation_arcsec -- Separation of binary members (arcseconds) + """ + + y_years = (greenwich_date_year+(PM.cd_jd(greenwich_date_day,greenwich_date_month,greenwich_date_year)-PM.cd_jd(0,1,greenwich_date_year))/365.242191)-PBD.get_binary_data(binary_name)['EpochPeri'] + m_deg = 360*y_years / PBD.get_binary_data(binary_name)['Period'] + m_rad = math.radians(m_deg-360*math.floor(m_deg/360)) + eccentricity = PBD.get_binary_data(binary_name)['Ecc'] + true_anomaly_rad = PM.true_anomaly(m_rad,eccentricity) + r_arcsec = (1-eccentricity*math.cos(PM.eccentric_anomaly(m_rad,eccentricity)))*PBD.get_binary_data(binary_name)['Axis'] + ta_peri_rad = true_anomaly_rad+math.radians(PBD.get_binary_data(binary_name)['LongPeri']) + y = math.sin(ta_peri_rad)*math.cos(math.radians(PBD.get_binary_data(binary_name)['Incl'])) + x = math.cos(ta_peri_rad) + a_deg = PM.degrees(math.atan2(y,x)) + theta_deg1 = a_deg + PBD.get_binary_data(binary_name)['PANode'] + theta_deg2 = theta_deg1-360*math.floor(theta_deg1/360) + rho_arcsec = r_arcsec*math.cos(ta_peri_rad)/math.cos(math.radians(theta_deg2-PBD.get_binary_data(binary_name)['PANode'])) + + position_angle_deg = round(theta_deg2,1) + separation_arcsec = round(rho_arcsec,2) + + return position_angle_deg, separation_arcsec \ No newline at end of file diff --git a/practical_astronomy/source/src/practical_astronomy/pa_binary_data.py b/practical_astronomy/source/src/practical_astronomy/pa_binary_data.py new file mode 100644 index 0000000000000000000000000000000000000000..5bb289d00a24f2ed36535dc3b872969dea918ccf --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_binary_data.py @@ -0,0 +1,115 @@ +BinaryData = { + "eta-Cor": { + "Period": 41.623, + "EpochPeri": 1934.008, + "LongPeri": 219.907, + "Ecc": 0.2763, + "Axis": 0.907, + "Incl": 59.025, + "PANode": 23.717 + }, + "gamma-Vir": { + "Period": 171.37, + "EpochPeri": 1836.433, + "LongPeri": 252.88, + "Ecc": 0.8808, + "Axis": 3.746, + "Incl": 146.05, + "PANode": 31.78 + }, + "eta-Cas": { + "Period": 480, + "EpochPeri": 1889.6, + "LongPeri": 268.59, + "Ecc": 0.497, + "Axis": 11.9939, + "Incl": 34.76, + "PANode": 278.42 + }, + "zeta-Ori": { + "Period": 1508.6, + "EpochPeri": 2070.6, + "LongPeri": 47.3, + "Ecc": 0.07, + "Axis": 2.728, + "Incl": 72, + "PANode": 155.5 + }, + "alpha-CMa": { + "Period": 50.09, + "EpochPeri": 1894.13, + "LongPeri": 147.27, + "Ecc": 0.5923, + "Axis": 7.5, + "Incl": 136.53, + "PANode": 44.57 + }, + "delta-Gem": { + "Period": 1200, + "EpochPeri": 1437, + "LongPeri": 57.19, + "Ecc": 0.11, + "Axis": 6.9753, + "Incl": 63.28, + "PANode": 18.38 + }, + "alpha-Gem": { + "Period": 420.07, + "EpochPeri": 1965.3, + "LongPeri": 261.43, + "Ecc": 0.33, + "Axis": 6.295, + "Incl": 115.94, + "PANode": 40.47 + }, + "aplah-CMi": { + "Period": 40.65, + "EpochPeri": 1927.6, + "LongPeri": 269.8, + "Ecc": 0.4, + "Axis": 4.548, + "Incl": 35.7, + "PANode": 284.3 + }, + "alpha-Cen": { + "Period": 79.92, + "EpochPeri": 1955.56, + "LongPeri": 231.56, + "Ecc": 0.516, + "Axis": 17.583, + "Incl": 79.24, + "PANode": 204.868 + }, + "alpha Sco": { + "Period": 900, + "EpochPeri": 1889, + "LongPeri": 0, + "Ecc": 0, + "Axis": 3.21, + "Incl": 86.3, + "PANode": 273 + } +} + +def get_binary_data(binary_name): + ''' + Get data for binary star. + + Example, retrieving orbital inclination of eta-Cor: + get_binary_data("eta-Cor")['Incl'] + + Arguments: + binary_name -- Name of binary, e.g., "eta-Cor" + + Returns: + A dictionary object with the following elements: + + Period -- Period of the orbit. + EpochPeri -- Epoch of the perihelion. + LongPeri -- Longitude of the perihelion. + Ecc -- Eccentricity of the orbit. + Axis -- Semi-major axis of the orbit. + Incl -- Orbital inclination. + PANode -- Position angle of the ascending node. + ''' + return BinaryData.get(binary_name) diff --git a/practical_astronomy/source/src/practical_astronomy/pa_comet.py b/practical_astronomy/source/src/practical_astronomy/pa_comet.py new file mode 100644 index 0000000000000000000000000000000000000000..3237e64037baa76574433897b9d94b18cb7ba797 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_comet.py @@ -0,0 +1,123 @@ +import math +from . import pa_macro as PM +from . import pa_comet_data as PCD + +def position_of_elliptical_comet(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name): + """ + Calculate position of an elliptical comet. + + Arguments: + lct_hour -- Local civil time, hour part. + lct_min -- Local civil time, minutes part. + lct_sec -- Local civil time, seconds part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + comet_name -- Name of comet, e.g., "Halley" + + Returns: + comet_ra_hour -- Right ascension of comet (hour part) + comet_ra_min -- Right ascension of comet (minutes part) + comet_dec_deg -- Declination of comet (degrees part) + comet_dec_min -- Declination of comet (minutes part) + comet_dist_earth -- Comet's distance from Earth (AU) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + greenwich_date_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + greenwich_date_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + greenwich_date_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + time_since_epoch_years = (PM.cd_jd(greenwich_date_day,greenwich_date_month,greenwich_date_year)-PM.cd_jd(0,1,greenwich_date_year))/365.242191+greenwich_date_year-PCD.get_comet_data_elliptical("Halley")['Epoch'] + mc_deg = 360*time_since_epoch_years/PCD.get_comet_data_elliptical("Halley")['Period'] + mc_rad = math.radians(mc_deg-360*math.floor(mc_deg/360)) + eccentricity = PCD.get_comet_data_elliptical("Halley")['Ecc'] + true_anomaly_deg = PM.degrees(PM.true_anomaly(mc_rad,eccentricity)) + lc_deg = true_anomaly_deg + PCD.get_comet_data_elliptical("Halley")['Peri'] + r_au = PCD.get_comet_data_elliptical("Halley")['Axis'] * (1-eccentricity*eccentricity)/(1+eccentricity*math.cos(math.radians(true_anomaly_deg))) + lc_node_rad = math.radians(lc_deg - PCD.get_comet_data_elliptical("Halley")['Node']) + psi_rad = math.asin(math.sin(lc_node_rad)*math.sin(math.radians(PCD.get_comet_data_elliptical("Halley")['Incl']))) + + y = math.sin(lc_node_rad)*math.cos(math.radians(PCD.get_comet_data_elliptical("Halley")['Incl'])) + x = math.cos(lc_node_rad) + + ld_deg = PM.degrees(math.atan2(y,x)) + PCD.get_comet_data_elliptical("Halley")['Node'] + rd_au = r_au * math.cos(psi_rad) + + earth_longitude_le_deg = PM.sun_long(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + 180 + earth_radius_vector_au = PM.sun_dist(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + le_ld_rad = math.radians(earth_longitude_le_deg - ld_deg) + a_rad = math.atan2(rd_au*math.sin(le_ld_rad),earth_radius_vector_au-rd_au*math.cos(le_ld_rad)) if rd_au < earth_radius_vector_au else math.atan2(earth_radius_vector_au*math.sin(-le_ld_rad),rd_au-earth_radius_vector_au*math.cos(le_ld_rad)) + + comet_long_deg1 = 180 + earth_longitude_le_deg + PM.degrees(a_rad) if rd_au < earth_radius_vector_au else PM.degrees(a_rad) + ld_deg + comet_long_deg = comet_long_deg1 - 360 * math.floor(comet_long_deg1/360) + comet_lat_deg = PM.degrees(math.atan((rd_au*math.tan(psi_rad)*math.sin(math.radians(comet_long_deg1-ld_deg))/(earth_radius_vector_au*math.sin(-le_ld_rad))))) + comet_ra_hours1 = PM.dd_dh(PM.ec_ra(comet_long_deg,0,0,comet_lat_deg,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year)) + comet_dec_deg1 = PM.ec_dec(comet_long_deg,0,0,comet_lat_deg,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year) + comet_distance_au = math.sqrt(earth_radius_vector_au**2+r_au**2-2*earth_radius_vector_au*r_au*math.cos(math.radians(lc_deg-earth_longitude_le_deg))*math.cos(psi_rad)) + + comet_ra_hour = PM.dh_hour(comet_ra_hours1+0.008333) + comet_ra_min = PM.dh_min(comet_ra_hours1+0.008333) + comet_dec_deg = PM.dd_deg(comet_dec_deg1+0.008333) + comet_dec_min = PM.dd_min(comet_dec_deg1+0.008333) + comet_dist_earth = round(comet_distance_au,2) + + return comet_ra_hour, comet_ra_min, comet_dec_deg, comet_dec_min, comet_dist_earth + +def position_of_parabolic_comet(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, comet_name): + """ + Calculate position of a parabolic comet. + + Arguments: + lct_hour -- Local civil time, hour part. + lct_min -- Local civil time, minutes part. + lct_sec -- Local civil time, seconds part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + comet_name -- Name of comet, e.g., "Kohler" + + Returns: + comet_ra_hour -- Right ascension of comet (hour part) + comet_ra_min -- Right ascension of comet (minutes part) + comet_ra_sec -- Right ascension of comet (seconds part) + comet_dec_deg -- Declination of comet (degrees part) + comet_dec_min -- Declination of comet (minutes part) + comet_dec_sec -- Declination of comet (seconds part) + comet_dist_earth -- Comet's distance from Earth (AU) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + greenwich_date_day = PM.lct_gday(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + greenwich_date_month = PM.lct_gmonth(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + greenwich_date_year = PM.lct_gyear(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + + ut_hours = PM.lct_ut(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + + perihelion_epoch_day = PCD.get_comet_data_parabolic(comet_name)["EpochPeriDay"] + perihelion_epoch_month = PCD.get_comet_data_parabolic(comet_name)["EpochPeriMonth"] + perihelion_epoch_year = PCD.get_comet_data_parabolic(comet_name)["EpochPeriYear"] + q_au = PCD.get_comet_data_parabolic(comet_name)["PeriDist"] + inclination_deg = PCD.get_comet_data_parabolic(comet_name)["Incl"] + perihelion_deg = PCD.get_comet_data_parabolic(comet_name)["ArgPeri"] + node_deg = PCD.get_comet_data_parabolic(comet_name)["Node"] + + comet_long_deg, comet_lat_deg, comet_dist_au = PM.p_comet_long_lat_dist(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year,perihelion_epoch_day,perihelion_epoch_month,perihelion_epoch_year,q_au,inclination_deg,perihelion_deg,node_deg) + + comet_ra_hours = PM.dd_dh(PM.ec_ra(comet_long_deg,0,0,comet_lat_deg,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year)) + comet_dec_deg1 = PM.ec_dec(comet_long_deg,0,0,comet_lat_deg,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year) + + comet_ra_hour = PM.dh_hour(comet_ra_hours) + comet_ra_min = PM.dh_min(comet_ra_hours) + comet_ra_sec = PM.dh_sec(comet_ra_hours) + comet_dec_deg = PM.dd_deg(comet_dec_deg1) + comet_dec_min = PM.dd_min(comet_dec_deg1) + comet_dec_sec = PM.dd_sec(comet_dec_deg1) + comet_dist_earth = round(comet_dist_au,2) + + return comet_ra_hour, comet_ra_min, comet_ra_sec, comet_dec_deg, comet_dec_min, comet_dec_sec, comet_dist_earth \ No newline at end of file diff --git a/practical_astronomy/source/src/practical_astronomy/pa_comet_data.py b/practical_astronomy/source/src/practical_astronomy/pa_comet_data.py new file mode 100644 index 0000000000000000000000000000000000000000..28c956d27054dae9647814847e7528d9ce2178b8 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_comet_data.py @@ -0,0 +1,196 @@ + +CometDataElliptical = { + "Encke": { + "Epoch": 1974.32, + "Peri": 160.1, + "Node": 334.2, + "Period": 3.3, + "Axis": 2.21, + "Ecc": 0.85, + "Incl": 12 + }, + "Temple 2": { + "Epoch": 1972.87, + "Peri": 310.2, + "Node": 119.3, + "Period": 5.26, + "Axis": 3.02, + "Ecc": 0.55, + "Incl": 12.5 + }, + "Haneda-Campos": { + "Epoch": 1978.77, + "Peri": 12.02, + "Node": 131.7, + "Period": 5.37, + "Axis": 3.07, + "Ecc": 0.64, + "Incl": 5.81 + }, + "Schwassmann-Wachmann 2": { + "Epoch": 1974.7, + "Peri": 123.3, + "Node": 126, + "Period": 6.51, + "Axis": 3.49, + "Ecc": 0.39, + "Incl": 3.7 + }, + "Borrelly": { + "Epoch": 1974.36, + "Peri": 67.8, + "Node": 75.1, + "Period": 6.76, + "Axis": 3.58, + "Ecc": 0.63, + "Incl": 30.2 + }, + "Whipple": { + "Epoch": 1970.77, + "Peri": 18.2, + "Node": 188.4, + "Period": 7.47, + "Axis": 3.82, + "Ecc": 0.35, + "Incl": 10.2 + }, + "Oterma": { + "Epoch": 1958.44, + "Peri": 150, + "Node": 155.1, + "Period": 7.88, + "Axis": 3.96, + "Ecc": 0.14, + "Incl": 4 + }, + "Schaumasse": { + "Epoch": 1960.29, + "Peri": 138.1, + "Node": 86.2, + "Period": 8.18, + "Axis": 4.05, + "Ecc": 0.71, + "Incl": 12 + }, + "Comas Sola": { + "Epoch": 1969.83, + "Peri": 102.9, + "Node": 62.8, + "Period": 8.55, + "Axis": 4.18, + "Ecc": 0.58, + "Incl": 13.4 + }, + "Schwassmann-Wachmann 1": { + "Epoch": 1974.12, + "Peri": 334.1, + "Node": 319.6, + "Period": 15.03, + "Axis": 6.09, + "Ecc": 0.11, + "Incl": 9.7 + }, + "Neujmin 1": { + "Epoch": 1966.94, + "Peri": 334, + "Node": 347.2, + "Period": 17.93, + "Axis": 6.86, + "Ecc": 0.78, + "Incl": 15 + }, + "Crommelin": { + "Epoch": 1956.82, + "Peri": 86.4, + "Node": 250.4, + "Period": 27.89, + "Axis": 9.17, + "Ecc": 0.92, + "Incl": 28.9 + }, + "Olbers": { + "Epoch": 1956.46, + "Peri": 150, + "Node": 85.4, + "Period": 69.47, + "Axis": 16.84, + "Ecc": 0.93, + "Incl": 44.6 + }, + "Pons-Brooks": { + "Epoch": 1954.39, + "Peri": 94.2, + "Node": 255.2, + "Period": 70.98, + "Axis": 17.2, + "Ecc": 0.96, + "Incl": 74.2 + }, + "Halley": { + "Epoch": 1986.112, + "Peri": 170.011, + "Node": 58.154, + "Period": 76.0081, + "Axis": 17.9435, + "Ecc": 0.9673, + "Incl": 162.2384 + } +} + +CometDataParabolic = { + "Kohler": { + "EpochPeriDay": 10.5659, + "EpochPeriMonth": 11, + "EpochPeriYear": 1977, + "ArgPeri": 163.4799, + "Node": 181.8175, + "PeriDist": 0.990662, + "Incl": 48.7196 + } +} + +def get_comet_data_elliptical(comet_name): + """ + Get data for elliptical comet. + + Example, retrieving orbital period of Halley: + get_comet_data_elliptical("Halley")['Period'] + + Arguments: + comet_name -- Name of comet, e.g., "Halley" + + Returns: + A dictionary object with the following elements: + + Epoch -- Epoch of the perihelion. + Peri -- Longitude of the perihelion. + Node -- Longitude of the ascending node. + Period -- Period of the orbit. + Axis -- Semi-major axis of the orbit. + Ecc -- Eccentricity of the orbit. + Incl -- Orbital inclination. + """ + return CometDataElliptical.get(comet_name) + +def get_comet_data_parabolic(comet_name): + """ + Get data for parabolic comet. + + Example, retrieving longitude of the ascending node of Kohler: + get_comet_data_parabolic("Kohler")['Node'] + + Arguments: + comet_name -- Name of comet, e.g., "Kohler" + + Returns: + A dictionary object with the following elements: + + EpochPeriDay -- Epoch of the perihelion (day) + EpochPeriMonth -- Epoch of the perihelion (month) + EpochPeriYear -- Epoch of the perihelion (year) + ArgPeri -- Longitude of the perihelion (degrees) + Node -- Longitude of the ascending node (degrees) + PeriDist -- Distance at perihelion (AU) + Incl -- Orbital inclination (degrees) + """ + return CometDataParabolic.get(comet_name) \ No newline at end of file diff --git a/practical_astronomy/source/src/practical_astronomy/pa_coordinate.py b/practical_astronomy/source/src/practical_astronomy/pa_coordinate.py new file mode 100644 index 0000000000000000000000000000000000000000..cd1328b4e00705dde48a85c5420b5d9abfde1d20 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_coordinate.py @@ -0,0 +1,535 @@ +import math +from . import pa_macro as PM + +def angle_to_decimal_degrees(degrees, minutes, seconds): + """ Convert an Angle (degrees, minutes, and seconds) to Decimal Degrees """ + A = abs(seconds)/60 + B = (abs(minutes)+A)/60 + C = abs(degrees)+B + D = -(C) if degrees < 0 or minutes < 0 or seconds < 0 else C + + return D + +def decimal_degrees_to_angle(decimalDegrees): + """ + Convert Decimal Degrees to an Angle (degrees, minutes, and seconds) + + Returns: + degrees, minutes, seconds + """ + unsignedDecimal = abs(decimalDegrees) + totalSeconds = unsignedDecimal * 3600 + seconds2dp = round(totalSeconds % 60, 2) + correctedSeconds = 0 if seconds2dp == 60 else seconds2dp + correctedRemainder = totalSeconds + 60 if seconds2dp == 60 else totalSeconds + minutes = math.floor(correctedRemainder/60) % 60 + unsignedDegrees = math.floor(correctedRemainder / 3600) + signedDegrees = -1 * unsignedDegrees if decimalDegrees < 0 else unsignedDegrees + + return signedDegrees,minutes,math.floor(correctedSeconds) + +def right_ascension_to_hour_angle(ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, is_daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude): + """ Convert Right Ascension to Hour Angle """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + hour_angle = PM.ra_ha(ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude) + + hour_angle_hours = PM.dh_hour(hour_angle) + hour_angle_minutes = PM.dh_min(hour_angle) + hour_angle_seconds = PM.dh_sec(hour_angle) + + return hour_angle_hours,hour_angle_minutes,hour_angle_seconds + +def hour_angle_to_right_ascension(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,lct_hours,lct_minutes,lct_seconds,is_daylight_saving,zone_correction,local_day,local_month,local_year,geographical_longitude): + """ Convert Hour Angle to Right Ascension """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + right_ascension = PM.ha_ra(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year,geographical_longitude) + + right_ascension_hours = PM.dh_hour(right_ascension) + right_ascension_minutes = PM.dh_min(right_ascension) + right_ascension_seconds = PM.dh_sec(right_ascension) + + return right_ascension_hours,right_ascension_minutes,right_ascension_seconds + +def equatorial_coordinates_to_horizon_coordinates(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds,geographical_latitude): + """ Convert Equatorial Coordinates to Horizon Coordinates """ + azimuth_in_decimal_degrees = PM.eq_az(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds,geographical_latitude) + + altitude_in_decimal_degrees = PM.eq_alt(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds,geographical_latitude) + + azimuth_degrees = PM.dd_deg(azimuth_in_decimal_degrees) + azimuth_minutes = PM.dd_min(azimuth_in_decimal_degrees) + azimuth_seconds = PM.dd_sec(azimuth_in_decimal_degrees) + + altitude_degrees = PM.dd_deg(altitude_in_decimal_degrees) + altitude_minutes = PM.dd_min(altitude_in_decimal_degrees) + altitude_seconds = PM.dd_sec(altitude_in_decimal_degrees) + + return azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds + +def horizon_coordinates_to_equatorial_coordinates(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,geographical_latitude): + """ Convert Horizon Coordinates to Equatorial Coordinates """ + hour_angle_in_decimal_degrees = PM.hor_ha(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,geographical_latitude) + + declination_in_decimal_degrees = PM.hor_dec(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,geographical_latitude) + + hour_angle_hours = PM.dh_hour(hour_angle_in_decimal_degrees) + hour_angle_minutes = PM.dh_min(hour_angle_in_decimal_degrees) + hour_angle_seconds = PM.dh_sec(hour_angle_in_decimal_degrees) + + declination_degrees = PM.dd_deg(declination_in_decimal_degrees) + declination_minutes = PM.dd_min(declination_in_decimal_degrees) + declination_seconds = PM.dd_sec(declination_in_decimal_degrees) + + return hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds + +def mean_obliquity_of_the_ecliptic(greenwich_day,greenwich_month,greenwich_year): + """ Calculate Mean Obliquity of the Ecliptic for a Greenwich Date """ + JD = PM.cd_jd(greenwich_day,greenwich_month,greenwich_year) + MJD = JD - 2451545 + T = MJD / 36525 + DE1 = T * (46.815 + T * (0.0006 - (T * 0.00181))) + DE2 = DE1 / 3600 + + return 23.439292 - DE2 + +def ecliptic_coordinate_to_equatorial_coordinate(ecliptic_longitude_degrees,ecliptic_longitude_minutes,ecliptic_longitude_seconds,ecliptic_latitude_degrees,ecliptic_latitude_minutes,ecliptic_latitude_seconds,greenwich_day,greenwich_month,greenwich_year): + """ Convert Ecliptic Coordinates to Equatorial Coordinates """ + eclon_deg = PM.dms_dd(ecliptic_longitude_degrees,ecliptic_longitude_minutes,ecliptic_longitude_seconds) + eclat_deg = PM.dms_dd(ecliptic_latitude_degrees,ecliptic_latitude_minutes,ecliptic_latitude_seconds) + eclon_rad = math.radians(eclon_deg) + eclat_rad = math.radians(eclat_deg) + obliq_deg = PM.obliq(greenwich_day,greenwich_month,greenwich_year) + obliq_rad = math.radians(obliq_deg) + sin_dec = math.sin(eclat_rad) * math.cos(obliq_rad) + math.cos(eclat_rad) * math.sin(obliq_rad) * math.sin(eclon_rad) + dec_rad = math.asin(sin_dec) + dec_deg = PM.degrees(dec_rad) + y = math.sin(eclon_rad) * math.cos(obliq_rad) - math.tan(eclat_rad) * math.sin(obliq_rad) + x = math.cos(eclon_rad) + ra_rad = math.atan2(y,x) + ra_deg1 = PM.degrees(ra_rad) + ra_deg2 = ra_deg1 - 360 * math.floor(ra_deg1/360) + ra_hours = PM.dd_dh(ra_deg2) + + out_ra_hours = PM.dh_hour(ra_hours) + out_ra_minutes = PM.dh_min(ra_hours) + out_ra_seconds = PM.dh_sec(ra_hours) + out_dec_degrees = PM.dd_deg(dec_deg) + out_dec_minutes = PM.dd_min(dec_deg) + out_dec_seconds = PM.dd_sec(dec_deg) + + return out_ra_hours,out_ra_minutes,out_ra_seconds,out_dec_degrees,out_dec_minutes,out_dec_seconds + +def equatorial_coordinate_to_ecliptic_coordinate(ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds,gw_day,gw_month,gw_year): + """ Convert Equatorial Coordinates to Ecliptic Coordinates """ + ra_deg = PM.dh_dd(PM.hms_dh(ra_hours,ra_minutes,ra_seconds)) + dec_deg = PM.dms_dd(dec_degrees,dec_minutes,dec_seconds) + ra_rad = math.radians(ra_deg) + dec_rad = math.radians(dec_deg) + obliq_deg = PM.obliq(gw_day,gw_month,gw_year) + obliq_rad = math.radians(obliq_deg) + sin_ecl_lat = math.sin(dec_rad) * math.cos(obliq_rad) - math.cos(dec_rad) * math.sin(obliq_rad) * math.sin(ra_rad) + ecl_lat_rad = math.asin(sin_ecl_lat) + ecl_lat_deg = PM.degrees(ecl_lat_rad) + y = math.sin(ra_rad) * math.cos(obliq_rad) + math.tan(dec_rad) * math.sin(obliq_rad) + x = math.cos(ra_rad) + ecl_long_rad = math.atan2(y,x) + ecl_long_deg1 = PM.degrees(ecl_long_rad) + ecl_long_deg2 = ecl_long_deg1 - 360 * math.floor(ecl_long_deg1/360) + + out_ecl_long_deg = PM.dd_deg(ecl_long_deg2) + out_ecl_long_min = PM.dd_min(ecl_long_deg2) + out_ecl_long_sec = PM.dd_sec(ecl_long_deg2) + out_ecl_lat_deg = PM.dd_deg(ecl_lat_deg) + out_ecl_lat_min = PM.dd_min(ecl_lat_deg) + out_ecl_lat_sec = PM.dd_sec(ecl_lat_deg) + + return out_ecl_long_deg,out_ecl_long_min,out_ecl_long_sec,out_ecl_lat_deg,out_ecl_lat_min,out_ecl_lat_sec + +def equatorial_coordinate_to_galactic_coordinate(ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds): + """ Convert Equatorial Coordinates to Galactic Coordinates """ + ra_deg = PM.dh_dd(PM.hms_dh(ra_hours,ra_minutes,ra_seconds)) + dec_deg = PM.dms_dd(dec_degrees,dec_minutes,dec_seconds) + ra_rad = math.radians(ra_deg) + dec_rad = math.radians(dec_deg) + sin_b = math.cos(dec_rad) * math.cos(math.radians(27.4)) * math.cos(ra_rad - math.radians(192.25)) + math.sin(dec_rad) * math.sin(math.radians(27.4)) + b_radians = math.asin(sin_b) + b_deg = PM.degrees(b_radians) + y = math.sin(dec_rad) - sin_b * math.sin(math.radians(27.4)) + x = math.cos(dec_rad) * math.sin(ra_rad - math.radians(192.25)) * math.cos(math.radians(27.4)) + long_deg1 = PM.degrees(math.atan2(y,x)) + 33 + long_deg2 = long_deg1 - 360 * math.floor(long_deg1/360) + + gal_long_deg = PM.dd_deg(long_deg2) + gal_long_min = PM.dd_min(long_deg2) + gal_long_sec = PM.dd_sec(long_deg2) + gal_lat_deg = PM.dd_deg(b_deg) + gal_lat_min = PM.dd_min(b_deg) + gal_lat_sec = PM.dd_sec(b_deg) + + return gal_long_deg,gal_long_min,gal_long_sec,gal_lat_deg,gal_lat_min,gal_lat_sec + +def galactic_coordinate_to_equatorial_coordinate(gal_long_deg,gal_long_min,gal_long_sec,gal_lat_deg,gal_lat_min,gal_lat_sec): + """ Convert Galactic Coordinates to Equatorial Coordinates """ + glong_deg = PM.dms_dd(gal_long_deg,gal_long_min,gal_long_sec) + glat_deg = PM.dms_dd(gal_lat_deg,gal_lat_min,gal_lat_sec) + glong_rad = math.radians(glong_deg) + glat_rad = math.radians(glat_deg) + sin_dec = math.cos(glat_rad) * math.cos(math.radians(27.4)) * math.sin(glong_rad - math.radians(33)) + math.sin(glat_rad) * math.sin(math.radians(27.4)) + dec_radians = math.asin(sin_dec) + dec_deg = PM.degrees(dec_radians) + y = math.cos(glat_rad) *math.cos(glong_rad - math.radians(33)) + x = math.sin(glat_rad) * math.cos(math.radians(27.4)) - math.cos(glat_rad) * math.sin(math.radians(27.4)) * math.sin(glong_rad - math.radians(33)) + + ra_deg1 = PM.degrees(math.atan2(y,x)) + 192.25 + ra_deg2 = ra_deg1 - 360 * math.floor(ra_deg1/360) + ra_hours1 = PM.dd_dh(ra_deg2) + + ra_hours = PM.dh_hour(ra_hours1) + ra_minutes = PM.dh_min(ra_hours1) + ra_seconds = PM.dh_sec(ra_hours1) + dec_degrees = PM.dd_deg(dec_deg) + dec_minutes = PM.dd_min(dec_deg) + dec_seconds = PM.dd_sec(dec_deg) + + return ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds + +def angle_between_two_objects(ra_long_1_hour_deg,ra_long_1_min,ra_long_1_sec,dec_lat_1_deg,dec_lat_1_min,dec_lat_1_sec,ra_long_2_hour_deg,ra_long_2_min,ra_long_2_sec,dec_lat_2_deg,dec_lat_2_min,dec_lat_2_sec,hour_or_degree): + """ Calculate the angle between two celestial objects """ + ra_long_1_decimal = PM.hms_dh(ra_long_1_hour_deg,ra_long_1_min,ra_long_1_sec) if hour_or_degree == "H" else PM.dms_dd(ra_long_1_hour_deg,ra_long_1_min,ra_long_1_sec) + ra_long_1_deg = PM.dh_dd(ra_long_1_decimal) if hour_or_degree == "H" else ra_long_1_decimal + ra_long_1_rad = math.radians(ra_long_1_deg) + dec_lat_1_deg1 = PM.dms_dd(dec_lat_1_deg,dec_lat_1_min,dec_lat_1_sec) + dec_lat_1_rad = math.radians(dec_lat_1_deg1) + + ra_long_2_decimal = PM.hms_dh(ra_long_2_hour_deg,ra_long_2_min,ra_long_2_sec) if hour_or_degree == "H" else PM.dms_dd(ra_long_2_hour_deg,ra_long_2_min,ra_long_2_sec) + ra_long_2_deg = PM.dh_dd(ra_long_2_decimal) if hour_or_degree == "H" else ra_long_2_decimal + ra_long_2_rad = math.radians(ra_long_2_deg) + dec_lat_2_deg1 = PM.dms_dd(dec_lat_2_deg,dec_lat_2_min,dec_lat_2_sec) + dec_lat_2_rad = math.radians(dec_lat_2_deg1) + + cos_d = math.sin(dec_lat_1_rad) * math.sin(dec_lat_2_rad) + math.cos(dec_lat_1_rad) * math.cos(dec_lat_2_rad) * math.cos(ra_long_1_rad - ra_long_2_rad) + d_rad = math.acos(cos_d) + d_deg = PM.degrees(d_rad) + + angle_deg = PM.dd_deg(d_deg) + angle_min = PM.dd_min(d_deg) + angle_sec = PM.dd_sec(d_deg) + + return angle_deg,angle_min,angle_sec + +def rising_and_setting(ra_hours,ra_minutes,ra_seconds,dec_deg,dec_min,dec_sec,gw_date_day,gw_date_month,gw_date_year,geog_long_deg,geog_lat_deg,vert_shift_deg): + """ + Rising and setting times + + Arguments: + ra_hours -- Right Ascension, in hours. + ra_minutes -- Right Ascension, in minutes. + ra_seconds -- Right Ascension, in seconds. + dec_deg -- Declination, in degrees. + dec_min -- Declination, in minutes. + dec_sec -- Declination, in seconds. + gw_date_day -- Greenwich Date, day part. + gw_date_month -- Greenwich Date, month part. + gw_date_year -- Greenwich Date, year part. + geog_long_deg -- Geographical Longitude, in degrees. + geog_lat_deg -- Geographical Latitude, in degrees. + vert_shift_deg -- Vertical Shift, in degrees. + + Returns: + rise_set_status -- "Never Rises", "Circumpolar", or "OK". + ut_rise_hour -- Rise time, UT, hour part. + ut_rise_min -- Rise time, UT, minute part. + ut_set_hour -- Set time, UT, hour part. + ut_set_min -- Set time, UT, minute part. + az_rise -- Azimuth angle, at rise. + az_set -- Azimuth angle, at set. + """ + ra_hours1 = PM.hms_dh(ra_hours,ra_minutes,ra_seconds) + dec_rad = math.radians(PM.dms_dd(dec_deg,dec_min,dec_sec)) + vertical_displ_radians = math.radians(vert_shift_deg) + geo_lat_radians = math.radians(geog_lat_deg) + cos_h = -(math.sin(vertical_displ_radians) + math.sin(geo_lat_radians) * math.sin(dec_rad)) / (math.cos(geo_lat_radians) * math.cos(dec_rad)) + h_hours = PM.dd_dh(PM.degrees(math.acos(cos_h))) + lst_rise_hours = (ra_hours1-h_hours)-24*math.floor((ra_hours1-h_hours)/24) + lst_set_hours = (ra_hours1+h_hours)-24*math.floor((ra_hours1+h_hours)/24) + a_deg = PM.degrees(math.acos((math.sin(dec_rad)+math.sin(vertical_displ_radians)*math.sin(geo_lat_radians))/(math.cos(vertical_displ_radians)*math.cos(geo_lat_radians)))) + az_rise_deg = a_deg - 360 * math.floor(a_deg/360) + az_set_deg = (360-a_deg)-360*math.floor((360-a_deg)/360) + ut_rise_hours1 = PM.gst_ut(PM.lst_gst(lst_rise_hours,0,0,geog_long_deg),0,0,gw_date_day,gw_date_month,gw_date_year) + ut_set_hours1 = PM.gst_ut(PM.lst_gst(lst_set_hours,0,0,geog_long_deg),0,0,gw_date_day,gw_date_month,gw_date_year) + ut_rise_adjusted_hours = ut_rise_hours1 + 0.008333 + ut_set_adjusted_hours = ut_set_hours1 + 0.008333 + + rise_set_status = "never rises" if cos_h > 1 else "circumpolar" if cos_h < -1 else "OK" + ut_rise_hour = PM.dh_hour(ut_rise_adjusted_hours) if rise_set_status == "OK" else None + ut_rise_min = PM.dh_min(ut_rise_adjusted_hours) if rise_set_status == "OK" else None + ut_set_hour = PM.dh_hour(ut_set_adjusted_hours) if rise_set_status == "OK" else None + ut_set_min = PM.dh_min(ut_set_adjusted_hours) if rise_set_status == "OK" else None + az_rise = round(az_rise_deg,2) if rise_set_status == "OK" else None + az_set = round(az_set_deg,2) if rise_set_status == "OK" else None + + return rise_set_status,ut_rise_hour,ut_rise_min,ut_set_hour,ut_set_min,az_rise,az_set + +def correct_for_precession(ra_hour,ra_minutes,ra_seconds,dec_deg,dec_minutes,dec_seconds,epoch1_day,epoch1_month,epoch1_year,epoch2_day,epoch2_month,epoch2_year): + """ + Calculate precession (corrected coordinates between two epochs) + + Returns: + corrected RA hour + corrected RA minutes + corrected RA seconds + corrected Declination degrees + corrected Declination minutes + corrected Declination seconds + """ + ra_1_rad = math.radians(PM.dh_dd(PM.hms_dh(ra_hour,ra_minutes,ra_seconds))) + dec_1_rad = math.radians(PM.dms_dd(dec_deg,dec_minutes,dec_seconds)) + t_centuries = (PM.cd_jd(epoch1_day,epoch1_month,epoch1_year)-2415020)/36525 + m_sec = 3.07234+(0.00186*t_centuries) + n_arcsec = 20.0468-(0.0085*t_centuries) + n_years = (PM.cd_jd(epoch2_day,epoch2_month,epoch2_year)-PM.cd_jd(epoch1_day,epoch1_month,epoch1_year))/365.25 + s1_hours = ((m_sec+(n_arcsec*math.sin(ra_1_rad)*math.tan(dec_1_rad)/15))*n_years)/3600 + ra_2_hours = PM.hms_dh(ra_hour,ra_minutes,ra_seconds)+s1_hours + s2_deg = (n_arcsec*math.cos(ra_1_rad)*n_years)/3600 + dec_2_deg = PM.dms_dd(dec_deg,dec_minutes,dec_seconds)+s2_deg + + corrected_ra_hour = PM.dh_hour(ra_2_hours) + corrected_ra_minutes = PM.dh_min(ra_2_hours) + corrected_ra_seconds = PM.dh_sec(ra_2_hours) + corrected_dec_deg = PM.dd_deg(dec_2_deg) + corrected_dec_minutes = PM.dd_min(dec_2_deg) + corrected_dec_seconds = PM.dd_sec(dec_2_deg) + + return corrected_ra_hour,corrected_ra_minutes,corrected_ra_seconds,corrected_dec_deg,corrected_dec_minutes,corrected_dec_seconds + +def nutation_in_ecliptic_longitude_and_obliquity(greenwich_day, greenwich_month, greenwich_year): + """ + Calculate nutation for two values: ecliptic longitude and obliquity, for a Greenwich date. + + Returns: + nutation in ecliptic longitude (degrees) + nutation in obliquity (degrees) + """ + jd_days = PM.cd_jd(greenwich_day,greenwich_month,greenwich_year) + t_centuries = (jd_days - 2415020) /36525 + a_deg = 100.0021358 * t_centuries + l_1_deg = 279.6967 + (0.000303 * t_centuries * t_centuries) + l_deg1 = l_1_deg + 360 * (a_deg - math.floor(a_deg)) + l_deg2 = l_deg1 - 360 * math.floor(l_deg1/360) + l_rad = math.radians(l_deg2) + b_deg = 5.372617 * t_centuries + n_deg1 = 259.1833 - 360 * (b_deg - math.floor(b_deg)) + n_deg2 = n_deg1 - 360 * (math.floor(n_deg1/360)) + n_rad = math.radians(n_deg2) + nut_in_long_arcsec = -17.2 * math.sin(n_rad) - 1.3 * math.sin(2 * l_rad) + nut_in_obl_arcsec = 9.2 * math.cos(n_rad) + 0.5 * math.cos(2 * l_rad) + + nut_in_long_deg = nut_in_long_arcsec / 3600 + nut_in_obl_deg = nut_in_obl_arcsec / 3600 + + return nut_in_long_deg,nut_in_obl_deg + +def correct_for_aberration(ut_hour,ut_minutes,ut_seconds,gw_day,gw_month,gw_year,true_ecl_long_deg,true_ecl_long_min,true_ecl_long_sec,true_ecl_lat_deg,true_ecl_lat_min,true_ecl_lat_sec): + """ + Correct ecliptic coordinates for the effects of aberration. + + Returns: + apparent ecliptic longitude (degrees, minutes, seconds) + apparent ecliptic latitude (degrees, minutes, seconds) + """ + true_long_deg = PM.dms_dd(true_ecl_long_deg,true_ecl_long_min,true_ecl_long_sec) + true_lat_deg = PM.dms_dd(true_ecl_lat_deg,true_ecl_lat_min,true_ecl_lat_sec) + sun_true_long_deg = PM.sun_long(ut_hour,ut_minutes,ut_seconds,0,0,gw_day,gw_month,gw_year) + dlong_arcsec = -20.5 * math.cos(math.radians(sun_true_long_deg-true_long_deg))/math.cos(math.radians(true_lat_deg)) + dlat_arcsec = -20.5 * math.sin(math.radians(sun_true_long_deg-true_long_deg))*math.sin(math.radians(true_lat_deg)) + apparent_long_deg = true_long_deg + (dlong_arcsec/3600) + apparent_lat_deg = true_lat_deg + (dlat_arcsec / 3600) + + apparent_ecl_long_deg = PM.dd_deg(apparent_long_deg) + apparent_ecl_long_min = PM.dd_min(apparent_long_deg) + apparent_ecl_long_sec = PM.dd_sec(apparent_long_deg) + apparent_ecl_lat_deg = PM.dd_deg(apparent_lat_deg) + apparent_ecl_lat_min = PM.dd_min(apparent_lat_deg) + apparent_ecl_lat_sec = PM.dd_sec(apparent_lat_deg) + + return apparent_ecl_long_deg,apparent_ecl_long_min,apparent_ecl_long_sec,apparent_ecl_lat_deg,apparent_ecl_lat_min,apparent_ecl_lat_sec + +def atmospheric_refraction(true_ra_hour,true_ra_min,true_ra_sec,true_dec_deg,true_dec_min,true_dec_sec,coordinate_type,geog_long_deg,geog_lat_deg,daylight_saving_hours,timezone_hours,lcd_day,lcd_month,lcd_year,lct_hour,lct_min,lct_sec,atmospheric_pressure_mbar,atmospheric_temperature_celsius): + """ + Calculate corrected RA/Dec, accounting for atmospheric refraction. + + NOTE: Valid values for coordinate_type are "TRUE" and "APPARENT". + + Returns: + corrected RA hours,minutes,seconds + corrected Declination degrees,minutes,seconds + """ + ha_hour = PM.ra_ha(true_ra_hour,true_ra_min,true_ra_sec,lct_hour,lct_min,lct_sec,daylight_saving_hours,timezone_hours,lcd_day,lcd_month,lcd_year,geog_long_deg) + + azimuth_deg = PM.eq_az(ha_hour,0,0,true_dec_deg,true_dec_min,true_dec_sec,geog_lat_deg) + + altitude_deg = PM.eq_alt(ha_hour,0,0,true_dec_deg,true_dec_min,true_dec_sec,geog_lat_deg) + + corrected_altitude_deg = PM.refract(altitude_deg,coordinate_type,atmospheric_pressure_mbar,atmospheric_temperature_celsius) + + corrected_ha_hour = PM.hor_ha(azimuth_deg,0,0,corrected_altitude_deg,0,0,geog_lat_deg) + corrected_ra_hour1 = PM.ha_ra(corrected_ha_hour,0,0,lct_hour,lct_min,lct_sec,daylight_saving_hours,timezone_hours,lcd_day,lcd_month,lcd_year,geog_long_deg) + corrected_dec_deg1 = PM.hor_dec(azimuth_deg,0,0,corrected_altitude_deg,0,0,geog_lat_deg) + + corrected_ra_hour = PM.dh_hour(corrected_ra_hour1) + corrected_ra_min = PM.dh_min(corrected_ra_hour1) + corrected_ra_sec = PM.dh_sec(corrected_ra_hour1) + corrected_dec_deg = PM.dd_deg(corrected_dec_deg1) + corrected_dec_min = PM.dd_min(corrected_dec_deg1) + corrected_dec_sec = PM.dd_sec(corrected_dec_deg1) + + return corrected_ra_hour,corrected_ra_min,corrected_ra_sec,corrected_dec_deg,corrected_dec_min,corrected_dec_sec + +def corrections_for_geocentric_parallax(ra_hour,ra_min,ra_sec,dec_deg,dec_min,dec_sec,coordinate_type,equatorial_hor_parallax_deg,geog_long_deg,geog_lat_deg,height_m,daylight_saving,timezone_hours,lcd_day,lcd_month,lcd_year,lct_hour,lct_min,lct_sec): + """ + Calculate corrected RA/Dec, accounting for geocentric parallax. + + NOTE: Valid values for coordinate_type are "TRUE" and "APPARENT". + + Returns: + corrected RA hours,minutes,seconds + corrected Declination degrees,minutes,seconds + """ + ha_hours = PM.ra_ha(ra_hour,ra_min,ra_sec,lct_hour,lct_min,lct_sec,daylight_saving,timezone_hours,lcd_day,lcd_month,lcd_year,geog_long_deg) + + corrected_ha_hours = PM.parallax_ha(ha_hours,0,0,dec_deg,dec_min,dec_sec,coordinate_type,geog_lat_deg,height_m,equatorial_hor_parallax_deg) + + corrected_ra_hours = PM.ha_ra(corrected_ha_hours,0,0,lct_hour,lct_min,lct_sec,daylight_saving,timezone_hours,lcd_day,lcd_month,lcd_year,geog_long_deg) + + corrected_dec_deg1 = PM.parallax_dec(ha_hours,0,0,dec_deg,dec_min,dec_sec,coordinate_type,geog_lat_deg,height_m,equatorial_hor_parallax_deg) + + corrected_ra_hour = PM.dh_hour(corrected_ra_hours) + corrected_ra_min = PM.dh_min(corrected_ra_hours) + corrected_ra_sec = PM.dh_sec(corrected_ra_hours) + corrected_dec_deg = PM.dd_deg(corrected_dec_deg1) + corrected_dec_min = PM.dd_min(corrected_dec_deg1) + corrected_dec_sec = PM.dd_sec(corrected_dec_deg1) + + return corrected_ra_hour,corrected_ra_min,corrected_ra_sec,corrected_dec_deg,corrected_dec_min,corrected_dec_sec + +def heliographic_coordinates(helio_position_angle_deg,helio_displacement_arcmin,gwdate_day,gwdate_month,gwdate_year): + """ + Calculate heliographic coordinates for a given Greenwich date, with a given heliographic position angle and heliographic displacement in arc minutes. + + Returns: + heliographic longitude and heliographic latitude, in degrees + """ + julian_date_days = PM.cd_jd(gwdate_day,gwdate_month,gwdate_year) + t_centuries = (julian_date_days-2415020)/36525 + long_asc_node_deg = PM.dms_dd(74,22,0)+(84*t_centuries/60) + sun_long_deg = PM.sun_long(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + y = math.sin(math.radians(long_asc_node_deg-sun_long_deg))*math.cos(math.radians(PM.dms_dd(7,15,0))) + x = -math.cos(math.radians(long_asc_node_deg-sun_long_deg)) + a_deg = PM.degrees(math.atan2(y,x)) + m_deg1 = 360-(360*(julian_date_days-2398220)/25.38) + m_deg2 = m_deg1-360*math.floor(m_deg1/360) + l0_deg1 = m_deg2 + a_deg + l0_deg2 = l0_deg1-360*math.floor(l0_deg1/360) + b0_rad = math.asin(math.sin(math.radians(sun_long_deg-long_asc_node_deg))*math.sin(math.radians(PM.dms_dd(7,15,0)))) + theta1_rad = math.atan(-math.cos(math.radians(sun_long_deg))*math.tan(math.radians(PM.obliq(gwdate_day,gwdate_month,gwdate_year)))) + theta2_rad = math.atan(-math.cos(math.radians(long_asc_node_deg-sun_long_deg))*math.tan(math.radians(PM.dms_dd(7,15,0)))) + p_deg = PM.degrees(theta1_rad+theta2_rad) + rho1_deg = helio_displacement_arcmin/60 + rho_rad = math.asin(2*rho1_deg/PM.sun_dia(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year))-math.radians(rho1_deg) + b_rad = math.asin(math.sin(b0_rad)*math.cos(rho_rad)+math.cos(b0_rad)*math.sin(rho_rad)*math.cos(math.radians(p_deg-helio_position_angle_deg))) + b_deg = PM.degrees(b_rad) + l_deg1 = PM.degrees(math.asin(math.sin(rho_rad)*math.sin(math.radians(p_deg-helio_position_angle_deg))/math.cos(b_rad)))+l0_deg1 + l_deg2 = l_deg1-360*math.floor(l_deg1/360) + + helio_long_deg = round(l_deg2,2) + helio_lat_deg = round(b_deg,2) + + return helio_long_deg,helio_lat_deg + +def carrington_rotation_number(gwdate_day,gwdate_month,gwdate_year): + """ + Calculate carrington rotation number for a Greenwich date + + Returns: + carrington rotation number + """ + julian_date_days = PM.cd_jd(gwdate_day,gwdate_month,gwdate_year) + crn = 1690 + round((julian_date_days-2444235.34)/27.2753,0) + + return crn + +def selenographic_coordinates_1(gwdate_day,gwdate_month,gwdate_year): + """ + Calculate selenographic (lunar) coordinates (sub-Earth) + + Returns: + sub-earth longitude + sub-earth latitude + position angle of pole + """ + julian_date_days = PM.cd_jd(gwdate_day,gwdate_month,gwdate_year) + t_centuries = (julian_date_days-2451545)/36525 + long_asc_node_deg = 125.044522-1934.136261*t_centuries + F1 = 93.27191+483202.0175*t_centuries + F2 = F1-360*math.floor(F1/360) + geocentric_moon_long_deg = PM.moon_long(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + geocentric_moon_lat_rad = math.radians(PM.moon_lat(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year)) + inclination_rad = math.radians(PM.dms_dd(1,32,32.7)) + node_long_rad = math.radians(long_asc_node_deg-geocentric_moon_long_deg) + sin_be = -math.cos(inclination_rad)*math.sin(geocentric_moon_lat_rad)+math.sin(inclination_rad)*math.cos(geocentric_moon_lat_rad)*math.sin(node_long_rad) + sub_earth_lat_deg = PM.degrees(math.asin(sin_be)) + a_rad = math.atan2(-math.sin(geocentric_moon_lat_rad)*math.sin(inclination_rad)-math.cos(geocentric_moon_lat_rad)*math.cos(inclination_rad)*math.sin(node_long_rad),math.cos(geocentric_moon_lat_rad)*math.cos(node_long_rad)) + a_deg = PM.degrees(a_rad) + sub_earth_long_deg1 = a_deg - F2 + sub_earth_long_deg2 = sub_earth_long_deg1-360*math.floor(sub_earth_long_deg1/360) + sub_earth_long_deg3 = (sub_earth_long_deg2 - 360) if sub_earth_long_deg2 > 180 else sub_earth_long_deg2 + c1_rad = math.atan(math.cos(node_long_rad)*math.sin(inclination_rad)/(math.cos(geocentric_moon_lat_rad)*math.cos(inclination_rad)+math.sin(geocentric_moon_lat_rad)*math.sin(inclination_rad)*math.sin(node_long_rad))) + obliquity_rad = math.radians(PM.obliq(gwdate_day,gwdate_month,gwdate_year)) + c2_rad = math.atan(math.sin(obliquity_rad)*math.cos(math.radians(geocentric_moon_long_deg))/(math.sin(obliquity_rad)*math.sin(geocentric_moon_lat_rad)*math.sin(math.radians(geocentric_moon_long_deg))-math.cos(obliquity_rad)*math.cos(geocentric_moon_lat_rad))) + c_deg = PM.degrees(c1_rad+c2_rad) + + sub_earth_longitude = round(sub_earth_long_deg3,2) + sub_earth_latitude = round(sub_earth_lat_deg,2) + position_angle_of_pole = round(c_deg,2) + + return sub_earth_longitude,sub_earth_latitude,position_angle_of_pole + +def selenographic_coordinates_2(gwdate_day,gwdate_month,gwdate_year): + """ + Calculate selenographic (lunar) coordinates (sub-Solar) + + Returns: + sub-solar longitude + sub-solar colongitude + sub-solar latitude + """ + julian_date_days = PM.cd_jd(gwdate_day,gwdate_month,gwdate_year) + t_centuries = (julian_date_days-2451545)/36525 + long_asc_node_deg = 125.044522-1934.136261*t_centuries + F1 = 93.27191+483202.0175*t_centuries + F2 = F1-360*math.floor(F1/360) + sun_geocentric_long_deg = PM.sun_long(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + moon_equ_hor_parallax_arc_min = PM.moon_hp(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year)*60 + sun_earth_dist_au = PM.sun_dist(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + geocentric_moon_lat_rad = math.radians(PM.moon_lat(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year)) + geocentric_moon_long_deg = PM.moon_long(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + adjusted_moon_long_deg = sun_geocentric_long_deg+180+(26.4*math.cos(geocentric_moon_lat_rad)*math.sin(math.radians(sun_geocentric_long_deg-geocentric_moon_long_deg))/(moon_equ_hor_parallax_arc_min*sun_earth_dist_au)) + adjusted_moon_lat_rad = 0.14666*geocentric_moon_lat_rad/(moon_equ_hor_parallax_arc_min*sun_earth_dist_au) + inclination_rad = math.radians(PM.dms_dd(1,32,32.7)) + node_long_rad = math.radians(long_asc_node_deg-adjusted_moon_long_deg) + sin_bs = -math.cos(inclination_rad)*math.sin(adjusted_moon_lat_rad)+math.sin(inclination_rad)*math.cos(adjusted_moon_lat_rad)*math.sin(node_long_rad) + sub_solar_lat_deg = PM.degrees(math.asin(sin_bs)) + a_rad = math.atan2(-math.sin(adjusted_moon_lat_rad)*math.sin(inclination_rad)-math.cos(adjusted_moon_lat_rad)*math.cos(inclination_rad)*math.sin(node_long_rad),math.cos(adjusted_moon_lat_rad)*math.cos(node_long_rad)) + a_deg = PM.degrees(a_rad) + sub_solar_long_deg1 = a_deg - F2 + sub_solar_long_deg2 = sub_solar_long_deg1-360*math.floor(sub_solar_long_deg1/360) + sub_solar_long_deg3 = sub_solar_long_deg2 - 360 if sub_solar_long_deg2 > 180 else sub_solar_long_deg2 + sub_solar_colong_deg = 90 - sub_solar_long_deg3 + + sub_solar_longitude = round(sub_solar_long_deg3,2) + sub_solar_colongitude = round(sub_solar_colong_deg,2) + sub_solar_latitude = round(sub_solar_lat_deg,2) + + return sub_solar_longitude,sub_solar_colongitude,sub_solar_latitude diff --git a/practical_astronomy/source/src/practical_astronomy/pa_datetime.py b/practical_astronomy/source/src/practical_astronomy/pa_datetime.py new file mode 100644 index 0000000000000000000000000000000000000000..d47d3e613246960ad425504441b66e58f166e115 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_datetime.py @@ -0,0 +1,243 @@ +import math +from . import pa_util as PU +from . import pa_macro as PM + +def get_date_of_easter(year): + """ + Gets the date of Easter for the year specified. + + Arguments: + year: Year for which you'd like the date of Easter. + + Returns: + month + day + year + """ + a = year % 19 + b = math.floor(year/100) + c = year % 100 + d = math.floor(b/4) + e = b % 4 + f = math.floor((b+8)/25) + g = math.floor((b-f+1)/3) + h = ((19*a)+b-d-g+15) % 30 + i = math.floor(c/4) + k = c % 4 + l = (32 + 2 * (e + i) - h - k) % 7 + m = math.floor((a + (11 * h) + (22 * l)) / 451 ) + n = math.floor((h + l - (7 * m) + 114) / 31) + p = (h + l - (7 * m) + 114) % 31 + + day = p + 1 + month = n + + return month,day,year + +def civil_date_to_day_number(month, day, year): + """ Returns the day number for the date specified. """ + if month <= 2: + month = month - 1 + month = month * 62 if PU.is_leap_year(year) else month * 63 + month = math.floor(month / 2) + else: + month = math.floor((month + 1) * 30.6) + month = month - 62 if PU.is_leap_year(year) else month - 63 + + return month + day + +def greenwich_date_to_julian_date(day, month, year): + """ Convert a Greenwich Date/Civil Date (day,month,year) to Julian Date """ + return PM.cd_jd(day,month,year) + +def julian_date_to_greenwich_date(julianDate): + """ Convert a Julian Date to Greenwich Date/Civil Date (day,month,year) """ + returnDay = julian_date_day(julianDate) + returnMonth = julian_date_month(julianDate) + returnYear = julian_date_year(julianDate) + + return returnDay,returnMonth,returnYear + +def julian_date_day(julianDate): + """ Returns the day part of a Julian Date """ + return PM.jdc_day(julianDate) + +def julian_date_month(julianDate): + """ Returns the month part of a Julian Date """ + return PM.jdc_month(julianDate) + +def julian_date_year(julianDate): + """ Returns the year part of a Julian Date """ + return PM.jdc_year(julianDate) + +def julian_date_to_weekday_name(julianDate): + """ Convert a Julian Date to Day-of-Week (e.g., Sunday) """ + return PM.f_dow(julianDate) + +def civil_time_to_decimal_hours(hours,minutes,seconds): + """ Convert a Civil Time (hours,minutes,seconds) to Decimal Hours """ + return PM.hms_dh(hours,minutes,seconds) + +def decimal_hour_hour(decimalHours): + """ Return the hour part of a Decimal Hours """ + return PM.dh_hour(decimalHours) + +def decimal_hour_minutes(decimalHours): + """ Return the minutes part of a Decimal Hours """ + return PM.dh_min(decimalHours) + +def decimal_hour_seconds(decimalHours): + """ Return the seconds part of a Decimal Hours """ + return PM.dh_sec(decimalHours) + +def decimal_hours_to_civil_time(decimalHours): + """ Convert Decimal Hours to Civil Time """ + hours = PM.dh_hour(decimalHours) + minutes = PM.dh_min(decimalHours) + seconds = PM.dh_sec(decimalHours) + + return hours,minutes,seconds + +def local_civil_time_to_universal_time(lctHours,lctMinutes,lctSeconds,isDaylightSavings, zoneCorrection, localDay,localMonth,localYear): + """ + Convert local Civil Time to Universal Time + + Returns: + UT hours + UT mins + UT secs + GW day + GW month + GW year + """ + LCT = civil_time_to_decimal_hours(lctHours,lctMinutes,lctSeconds) + + daylightSavingsOffset = 1 if isDaylightSavings == True else 0 + UTinterim = LCT - daylightSavingsOffset - zoneCorrection + GDayInterim = localDay + (UTinterim / 24) + + JD = PM.cd_jd(GDayInterim,localMonth,localYear) + + GDay = julian_date_day(JD) + GMonth = julian_date_month(JD) + GYear = julian_date_year(JD) + + UT = 24 * (GDay - math.floor(GDay)) + + return decimal_hour_hour(UT),decimal_hour_minutes(UT),decimal_hour_seconds(UT),math.floor(GDay),GMonth,GYear + +def universal_time_to_local_civil_time(utHours,utMinutes,utSeconds,isDayLightSavings, zoneCorrection,gwDay,gwMonth,gwYear): + """ + Convert Universal Time to local Civil Time + + Returns: + LCT hours + LCT minutes + LCT seconds + day + month + year + """ + UT = civil_time_to_decimal_hours(utHours,utMinutes,utSeconds) + zoneTime = UT + zoneCorrection + localTime = zoneTime + (1 if isDayLightSavings == True else 0) + localJDPlusLocalTime = greenwich_date_to_julian_date(gwDay,gwMonth,gwYear) + (localTime/24) + localDay = julian_date_day(localJDPlusLocalTime) + integerDay = math.floor(localDay) + localMonth = julian_date_month(localJDPlusLocalTime) + localYear = julian_date_year(localJDPlusLocalTime) + LCT = 24 * (localDay - integerDay) + + return decimal_hour_hour(LCT),decimal_hour_minutes(LCT),decimal_hour_seconds(LCT),integerDay,localMonth,localYear + +def universal_time_to_greenwich_sidereal_time(utHours,utMinutes,utSeconds,gwDay,gwMonth,gwYear): + """ + Convert Universal Time to Greenwich Sidereal Time + + Returns: + GST hours + GST minutes + GST seconds + """ + JD = greenwich_date_to_julian_date(gwDay,gwMonth,gwYear) + S = JD - 2451545 + T = S / 36525 + T01 = 6.697374558+(2400.051336*T)+(0.000025862*T*T) + T02 = T01-(24*math.floor(T01/24)) + UT = civil_time_to_decimal_hours(utHours,utMinutes,utSeconds) + A = UT*1.002737909 + GST1 = T02 + A + GST2 = GST1 - (24*math.floor(GST1/24)) + + gstHours = decimal_hour_hour(GST2) + gstMinutes = decimal_hour_minutes(GST2) + gstSeconds = decimal_hour_seconds(GST2) + + return gstHours,gstMinutes,gstSeconds + +def greenwich_sidereal_time_to_universal_time(gstHours,gstMinutes,gstSeconds,gwDay,gwMonth,gwYear): + """ + Convert Greenwich Sidereal Time to Universal Time + + Returns: + UT hours + UT minutes + UT seconds + Warning Flag + """ + JD = greenwich_date_to_julian_date(gwDay,gwMonth,gwYear) + S = JD - 2451545 + T = S / 36525 + T01 = 6.697374558 + (2400.051336*T) + (0.000025862*T*T) + T02 = T01-(24*math.floor(T01/24)) + gstHours = civil_time_to_decimal_hours(gstHours,gstMinutes,gstSeconds) + A = gstHours-T02 + B = A-(24*math.floor(A/24)) + UT = B*0.9972695663 + + utHours = decimal_hour_hour(UT) + utMinutes = decimal_hour_minutes(UT) + utSeconds = decimal_hour_seconds(UT) + warningFlag = "Warning" if UT < 0.065574 else "OK" # TODO: Log this somewhere... + + return utHours,utMinutes,utSeconds,warningFlag + +def greenwich_sidereal_time_to_local_sidereal_time(gstHours,gstMinutes,gstSeconds,geographicalLongitude): + """ + Convert Greenwich Sidereal Time to Local Sidereal Time + + Returns: + LST hours + LST minutes + LST seconds + """ + GST = civil_time_to_decimal_hours(gstHours,gstMinutes,gstSeconds) + offset = geographicalLongitude / 15 + lstHours1 = GST + offset + lstHours2 = lstHours1-(24*math.floor(lstHours1/24)) + + lstHours = decimal_hour_hour(lstHours2) + lstMinutes = decimal_hour_minutes(lstHours2) + lstSeconds = decimal_hour_seconds(lstHours2) + + return lstHours,lstMinutes,lstSeconds + +def local_sidereal_time_to_greenwich_sidereal_time(lstHours,lstMinutes,lstSeconds,geographicalLongitude): + """ + Convert Local Sidereal Time to Greenwich Sidereal Time + + Returns: + GST hours + GST minutes + GST seconds + """ + GST = civil_time_to_decimal_hours(lstHours,lstMinutes,lstSeconds) + longHours = geographicalLongitude / 15 + GST1 = GST - longHours + GST2 = GST1 - (24*math.floor(GST1/24)) + + gstHours = decimal_hour_hour(GST2) + gstMinutes = decimal_hour_minutes(GST2) + gstSeconds = decimal_hour_seconds(GST2) + + return gstHours,gstMinutes,gstSeconds diff --git a/practical_astronomy/source/src/practical_astronomy/pa_eclipses.py b/practical_astronomy/source/src/practical_astronomy/pa_eclipses.py new file mode 100644 index 0000000000000000000000000000000000000000..ef6ac670a29e628bb661179e8c3653fcbec74a0f --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_eclipses.py @@ -0,0 +1,208 @@ +import math +from . import pa_macro as PM + +def lunar_eclipse_occurrence(local_date_day,local_date_month,local_date_year,is_daylight_saving,zone_correction_hours): + """ + Determine if a lunar eclipse is likely to occur. + + Arguments: + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + + Returns: + status -- One of "Lunar eclipse certain", "Lunar eclipse possible", or "No lunar eclipse". + event_date_day -- Date of eclipse event (day). + event_date_month -- Date of eclipse event (month). + event_date_year -- Date of eclipse event (year). + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + julian_date_of_full_moon = PM.full_moon(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + g_date_of_full_moon_day = PM.jdc_day(julian_date_of_full_moon) + integer_day = math.floor(g_date_of_full_moon_day) + g_date_of_full_moon_month = PM.jdc_month(julian_date_of_full_moon) + g_date_of_full_moon_year = PM.jdc_year(julian_date_of_full_moon) + ut_of_full_moon_hours = g_date_of_full_moon_day - integer_day + local_civil_time_hours = PM.ut_lct(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_day = PM.ut_lc_day(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_month = PM.ut_lc_month(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_year = PM.ut_lc_year(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + eclipse_occurrence = PM.lunar_eclipse_occurrence(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + + status = eclipse_occurrence + event_date_day = local_civil_date_day + event_date_month = local_civil_date_month + event_date_year = local_civil_date_year + + return status,event_date_day,event_date_month,event_date_year + +def lunar_eclipse_circumstances(local_date_day,local_date_month,local_date_year,is_daylight_saving,zone_correction_hours): + """ + Calculate the circumstances of a lunar eclipse. + + Arguments: + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + + Returns: + lunar_eclipse_certain_date_day -- Lunar eclipse date (day) + lunar_eclipse_certain_date_month -- Lunar eclipse date (month) + lunar_eclipse_certain_date_year -- Lunar eclipse date (year) + ut_start_pen_phase_hour -- Start of penumbral phase (hour) + ut_start_pen_phase_minutes -- Start of penumbral phase (minutes) + ut_start_umbral_phase_hour -- Start of umbral phase (hour) + ut_start_umbral_phase_minutes -- Start of umbral phase (minutes) + ut_start_total_phase_hour -- Start of total phase (hour) + ut_start_total_phase_minutes -- Start of total phase (minutes) + ut_mid_eclipse_hour -- Mid-eclipse (hour) + ut_mid_eclipse_minutes -- Mid-eclipse (minutes) + ut_end_total_phase_hour -- End of total phase (hour) + ut_end_total_phase_minutes -- End of total phase (minutes) + ut_end_umbral_phase_hour -- End of umbral phase (hour) + ut_end_umbral_phase_minutes -- End of umbral phase (minutes) + ut_end_pen_phase_hour -- End of penumbral phase (hour) + ut_end_pen_phase_minutes -- End of penumbral phase (minutes) + eclipse_magnitude -- Eclipse magnitude + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + julian_date_of_full_moon = PM.full_moon(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + g_date_of_full_moon_day = PM.jdc_day(julian_date_of_full_moon) + integer_day = math.floor(g_date_of_full_moon_day) + g_date_of_full_moon_month = PM.jdc_month(julian_date_of_full_moon) + g_date_of_full_moon_year = PM.jdc_year(julian_date_of_full_moon) + ut_of_full_moon_hours = g_date_of_full_moon_day - integer_day + local_civil_time_hours = PM.ut_lct(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_day = PM.ut_lc_day(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_month = PM.ut_lc_month(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + local_civil_date_year = PM.ut_lc_year(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_full_moon_month,g_date_of_full_moon_year) + eclipse_occurrence = PM.lunar_eclipse_occurrence(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + ut_max_eclipse = PM.ut_max_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_first_contact = PM.ut_first_contact_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_last_contact = PM.ut_last_contact_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_start_umbral_phase = PM.ut_start_umbra_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_end_umbral_phase = PM.ut_end_umbra_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_start_total_phase = PM.ut_start_total_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + ut_end_total_phase = PM.ut_end_total_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + eclipse_magnitude1 = PM.mag_lunar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours) + + lunar_eclipse_certain_date_day = local_civil_date_day + lunar_eclipse_certain_date_month = local_civil_date_month + lunar_eclipse_certain_date_year = local_civil_date_year + ut_start_pen_phase_hour = None if ut_first_contact == -99 else PM.dh_hour(ut_first_contact+0.008333) + ut_start_pen_phase_minutes = None if ut_first_contact == -99 else PM.dh_min(ut_first_contact+0.008333) + ut_start_umbral_phase_hour = None if ut_start_umbral_phase == -99 else PM.dh_hour(ut_start_umbral_phase+0.008333) + ut_start_umbral_phase_minutes = None if ut_start_umbral_phase == -99 else PM.dh_min(ut_start_umbral_phase+0.008333) + ut_start_total_phase_hour = None if ut_start_total_phase == -99 else PM.dh_hour(ut_start_total_phase+0.008333) + ut_start_total_phase_minutes = None if ut_start_total_phase == -99 else PM.dh_min(ut_start_total_phase+0.008333) + ut_mid_eclipse_hour = None if ut_max_eclipse == -99 else PM.dh_hour(ut_max_eclipse+0.008333) + ut_mid_eclipse_minutes = None if ut_max_eclipse == -99 else PM.dh_min(ut_max_eclipse+0.008333) + ut_end_total_phase_hour = None if ut_end_total_phase == -99 else PM.dh_hour(ut_end_total_phase+0.008333) + ut_end_total_phase_minutes = None if ut_end_total_phase == -99 else PM.dh_min(ut_end_total_phase+0.008333) + ut_end_umbral_phase_hour = None if ut_end_umbral_phase == -99 else PM.dh_hour(ut_end_umbral_phase+0.008333) + ut_end_umbral_phase_minutes = None if ut_end_umbral_phase == -99 else PM.dh_min(ut_end_umbral_phase+0.008333) + ut_end_pen_phase_hour = None if ut_last_contact == -99 else PM.dh_hour(ut_last_contact+0.008333) + ut_end_pen_phase_minutes = None if ut_last_contact == -99 else PM.dh_min(ut_last_contact+0.008333) + eclipse_magnitude = None if eclipse_magnitude1 == -99 else round(eclipse_magnitude1,2) + + return lunar_eclipse_certain_date_day, lunar_eclipse_certain_date_month, lunar_eclipse_certain_date_year, ut_start_pen_phase_hour, ut_start_pen_phase_minutes, ut_start_umbral_phase_hour, ut_start_umbral_phase_minutes, ut_start_total_phase_hour, ut_start_total_phase_minutes, ut_mid_eclipse_hour, ut_mid_eclipse_minutes, ut_end_total_phase_hour, ut_end_total_phase_minutes, ut_end_umbral_phase_hour, ut_end_umbral_phase_minutes, ut_end_pen_phase_hour, ut_end_pen_phase_minutes, eclipse_magnitude + +def solar_eclipse_occurrence(local_date_day,local_date_month,local_date_year,is_daylight_saving,zone_correction_hours): + """ + Determine if a solar eclipse is likely to occur. + + Arguments: + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + + Returns: + status -- One of "Solar eclipse certain", "Solar eclipse possible", or "No solar eclipse". + event_date_day -- Date of eclipse event (day). + event_date_month -- Date of eclipse event (month). + event_date_year -- Date of eclipse event (year). + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + julian_date_of_new_moon = PM.new_moon(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + g_date_of_new_moon_day = PM.jdc_day(julian_date_of_new_moon) + integer_day = math.floor(g_date_of_new_moon_day) + g_date_of_new_moon_month = PM.jdc_month(julian_date_of_new_moon) + g_date_of_new_moon_year = PM.jdc_year(julian_date_of_new_moon) + ut_of_new_moon_hours = g_date_of_new_moon_day - integer_day + local_civil_time_hours = PM.ut_lct(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_day = PM.ut_lc_day(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_month = PM.ut_lc_month(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_year = PM.ut_lc_year(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + eclipse_occurrence = PM.solar_eclipse_occurrence(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + + status = eclipse_occurrence + event_date_day = local_civil_date_day + event_date_month = local_civil_date_month + event_date_year = local_civil_date_year + + return status,event_date_day,event_date_month,event_date_year + +def solar_eclipse_circumstances(local_date_day,local_date_month,local_date_year,is_daylight_saving,zone_correction_hours, geog_longitude_deg, geog_latitude_deg): + """ + Calculate the circumstances of a lunar eclipse. + + Arguments: + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + geog_longitude_deg -- Geographical longitude of observer. + geog_latitude_deg -- Geographical latitude of observer. + + Returns: + solar_eclipse_certain_date_day -- Solar eclipse date (day) + solar_eclipse_certain_date_month -- Solar eclipse date (month) + solar_eclipse_certain_date_year -- Solar eclipse date (year) + ut_first_contact_hour -- First contact of shadow (hour) + ut_first_contact_minutes -- First contact of shadow (minutes) + ut_mid_eclipse_hour -- Mid-eclipse (hour) + ut_mid_eclipse_minutes -- Mid-eclipse (minutes) + ut_last_contact_hour -- Last contact of shadow (hour) + ut_last_contact_minutes -- Last contact of shadow (minutes) + eclipse_magnitude -- Eclipse magnitude + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + julian_date_of_new_moon = PM.new_moon(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + g_date_of_new_moon_day = PM.jdc_day(julian_date_of_new_moon) + integer_day = math.floor(g_date_of_new_moon_day) + g_date_of_new_moon_month = PM.jdc_month(julian_date_of_new_moon) + g_date_of_new_moon_year = PM.jdc_year(julian_date_of_new_moon) + ut_of_new_moon_hours = g_date_of_new_moon_day - integer_day + local_civil_time_hours = PM.ut_lct(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_day = PM.ut_lc_day(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_month = PM.ut_lc_month(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + local_civil_date_year = PM.ut_lc_year(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day,g_date_of_new_moon_month,g_date_of_new_moon_year) + eclipse_occurrence = PM.solar_eclipse_occurrence(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + ut_max_eclipse = PM.ut_max_solar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_longitude_deg,geog_latitude_deg) + ut_first_contact = PM.ut_first_contact_solar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_longitude_deg,geog_latitude_deg) + ut_last_contact = PM.ut_last_contact_solar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_longitude_deg,geog_latitude_deg) + magnitude = PM.mag_solar_eclipse(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_longitude_deg,geog_latitude_deg) + + solar_eclipse_certain_date_day = local_civil_date_day + solar_eclipse_certain_date_month = local_civil_date_month + solar_eclipse_certain_date_year = local_civil_date_year + ut_first_contact_hour = None if ut_first_contact == -99 else PM.dh_hour(ut_first_contact+0.008333) + ut_first_contact_minutes = None if ut_first_contact == -99 else PM.dh_min(ut_first_contact+0.008333) + ut_mid_eclipse_hour = None if ut_max_eclipse == -99 else PM.dh_hour(ut_max_eclipse+0.008333) + ut_mid_eclipse_minutes = None if ut_max_eclipse == -99 else PM.dh_min(ut_max_eclipse+0.008333) + ut_last_contact_hour = None if ut_last_contact == -99 else PM.dh_hour(ut_last_contact+0.008333) + ut_last_contact_minutes = None if ut_last_contact == -99 else PM.dh_min(ut_last_contact+0.008333) + eclipse_magnitude = None if magnitude == -99 else round(magnitude,3) + + return solar_eclipse_certain_date_day, solar_eclipse_certain_date_month, solar_eclipse_certain_date_year, ut_first_contact_hour, ut_first_contact_minutes, ut_mid_eclipse_hour, ut_mid_eclipse_minutes, ut_last_contact_hour, ut_last_contact_minutes, eclipse_magnitude diff --git a/practical_astronomy/source/src/practical_astronomy/pa_macro.py b/practical_astronomy/source/src/practical_astronomy/pa_macro.py new file mode 100644 index 0000000000000000000000000000000000000000..698fe738584038609453b6acee5022a3cc6742b1 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_macro.py @@ -0,0 +1,5365 @@ +import math +import numpy as np + +def cd_jd(day, month, year): + """ + Convert a Greenwich Date/Civil Date (day,month,year) to Julian Date + + Original macro name: CDJD + """ + Y = year - 1 if month < 3 else year + M = month + 12 if month < 3 else month + + if year > 1582: + A = math.floor(Y / 100) + B = 2 - A + math.floor(A / 4) + else: + if year == 1582 and month > 10: + A = math.floor(Y / 100) + B = 2 - A + math.floor(A / 4) + else: + if year == 1582 and month == 10 and day >= 15: + A = math.floor(Y / 100) + B = 2 - A + math.floor(A / 4) + else: + B = 0 + + C = math.floor((365.25 * Y) - 0.75) if Y < 0 else math.floor(365.25 * Y) + + D = math.floor(30.6001 * (M + 1)) + + return B + C + D + day + 1720994.5 + +def jdc_day(julianDate): + """ + Returns the day part of a Julian Date + + Original macro name: JDCDay + """ + I = math.floor(julianDate + 0.5) + F = julianDate + 0.5 - I + A = math.floor((I - 1867216.25) / 36524.25) + B = I + 1 + A - math.floor(A / 4) if I > 2299160 else I + C = B + 1524 + D = math.floor((C - 122.1) / 365.25) + E = math.floor(365.25 * D) + G = math.floor((C - E) / 30.6001) + + return C - E + F - math.floor(30.6001 * G) + +def jdc_month(julianDate): + """ + Returns the month part of a Julian Date + + Original macro name: JDCMonth + """ + I = math.floor(julianDate + 0.5) + F = julianDate + 0.5 - I + A = math.floor((I - 1867216.25) / 36524.25) + B = I + 1 + A - math.floor(A / 4) if I > 2299160 else I + C = B + 1524 + D = math.floor((C - 122.1) / 365.25) + E = math.floor(365.25 * D) + G = math.floor((C - E) / 30.6001) + + returnValue = G - 1 if G < 13.5 else G - 13 + return returnValue + +def jdc_year(julianDate): + """ + Returns the year part of a Julian Date + + Original macro name: JDCYear + """ + I = math.floor(julianDate + 0.5) + F = julianDate + 0.5 - I + A = math.floor((I - 1867216.25) / 36524.25) + B = I + 1 + A - math.floor(A / 4) if I > 2299160 else I + C = B + 1524 + D = math.floor((C - 122.1) / 365.25) + E = math.floor(365.25 * D) + G = math.floor((C - E) / 30.6001) + H = G - 1 if G < 13.5 else G - 13 + + returnValue = D - 4716 if H > 2.5 else D - 4715 + return returnValue + +def f_dow(julianDate): + """ + Convert a Julian Date to Day-of-Week (e.g., Sunday) + + Original macro name: FDOW + """ + J = math.floor(julianDate - 0.5) + 0.5 + N = (J + 1.5) % 7 + + if N == 0: return "Sunday" + if N == 1: return "Monday" + if N == 2: return "Tuesday" + if N == 3: return "Wednesday" + if N == 4: return "Thursday" + if N == 5: return "Friday" + if N == 6: return "Saturday" + + return "Unknown" + +def hms_dh(hours,minutes,seconds): + """ + Convert a Civil Time (hours,minutes,seconds) to Decimal Hours + + Original macro name: HMSDH + """ + A = abs(seconds) / 60 + B = (abs(minutes) + A) / 60 + C = abs(hours) + B + + return -C if ((hours < 0) or (minutes < 0) or (seconds < 0)) else C + +def dh_hour(decimalHours): + """ + Return the hour part of a Decimal Hours + + Original macro name: DHHour + """ + A = abs(decimalHours) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60), 2) + D = 0 if C == 60 else C + E = B + 60 if C == 60 else B + + return -(math.floor(E / 3600)) if decimalHours < 0 else math.floor(E / 3600) + +def dh_min(decimalHours): + """ + Return the minutes part of a Decimal Hours + + Original macro name: DHMin + """ + A = abs(decimalHours) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60), 2) + D = 0 if C == 60 else C + E = B + 60 if C == 60 else B + + return math.floor(E / 60) % 60 + +def dh_sec(decimalHours): + """ + Return the seconds part of a Decimal Hours + + Original macro name: DHSec + """ + A = abs(decimalHours) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60), 2) + D = 0 if C == 60 else C + + return D + +def lct_ut(lctHours,lctMinutes,lctSeconds,daylightSaving,zoneCorrection,localDay,localMonth,localYear): + """ + Convert Local Civil Time to Universal Time + + Original macro name: LctUT + """ + A = hms_dh(lctHours,lctMinutes,lctSeconds) + B = A - daylightSaving - zoneCorrection + C = localDay + (B/24) + D = cd_jd(C, localMonth, localYear) + E = jdc_day(D) + E1 = math.floor(E) + + return 24 * (E - E1) + +def ut_lct(uHours,uMinutes,uSeconds,daylightSaving,zoneCorrection,greenwichDay,greenwichMonth,greenwichYear): + """ + Convert Universal Time to Local Civil Time + + Original macro name: UTLct + """ + A = hms_dh(uHours,uMinutes,uSeconds) + B = A + zoneCorrection + C = B + daylightSaving + D = cd_jd(greenwichDay,greenwichMonth,greenwichYear) + (C / 24) + E = jdc_day(D) + E1 = math.floor(E) + + return 24 * (E - E1) + +def ut_lc_day(uHours,uMinutes,uSeconds,daylightSaving,zoneCorrection,greenwichDay,greenwichMonth,greenwichYear): + """ + Get Local Civil Day for Universal Time + + Original macro name: UTLcDay + """ + A = hms_dh(uHours,uMinutes,uSeconds) + B = A + zoneCorrection + C = B + daylightSaving + D = cd_jd(greenwichDay,greenwichMonth,greenwichYear) + (C / 24) + E = jdc_day(D) + E1 = math.floor(E) + + return E1 + +def ut_lc_month(uHours,uMinutes,uSeconds,daylightSaving,zoneCorrection,greenwichDay,greenwichMonth,greenwichYear): + """ + Get Local Civil Month for Universal Time + + Original macro name: UTLcMonth + """ + A = hms_dh(uHours,uMinutes,uSeconds) + B = A + zoneCorrection + C = B + daylightSaving + D = cd_jd(greenwichDay,greenwichMonth,greenwichYear) + (C / 24) + + return jdc_month(D) + +def ut_lc_year(uHours,uMinutes,uSeconds,daylightSaving,zoneCorrection,greenwichDay,greenwichMonth,greenwichYear): + """ + Get Local Civil Year for Universal Time + + Original macro name: UTLcYear + """ + A = hms_dh(uHours,uMinutes,uSeconds) + B = A + zoneCorrection + C = B + daylightSaving + D = cd_jd(greenwichDay,greenwichMonth,greenwichYear) + (C / 24) + + return jdc_year(D) + +def lct_gday(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year): + """ + Determine Greenwich Day for Local Time + + Original macro name: LctGDay + """ + A = hms_dh(lct_hours,lct_minutes,lct_seconds) + B = A - daylight_saving - zone_correction + C = local_day + (B/24) + D = cd_jd(C,local_month,local_year) + E = jdc_day(D) + + return math.floor(E) + +def lct_gmonth(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year): + """ + Determine Greenwich Month for Local Time + + Original macro name: LctGMonth + """ + A = hms_dh(lct_hours,lct_minutes,lct_seconds) + B = A - daylight_saving - zone_correction + C = local_day + (B/24) + D = cd_jd(C,local_month,local_year) + + return jdc_month(D) + +def lct_gyear(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year): + """ + Determine Greenwich Year for Local Time + + Original macro name: LctGYear + """ + A = hms_dh(lct_hours,lct_minutes,lct_seconds) + B = A - daylight_saving - zone_correction + C = local_day + (B/24) + D = cd_jd(C,local_month,local_year) + + return jdc_year(D) + +def ut_gst(u_hours,u_minutes,u_seconds,greenwich_day,greenwich_month,greenwich_year): + """ + Convert Universal Time to Greenwich Sidereal Time + + Original macro name: UTGST + """ + A = cd_jd(greenwich_day,greenwich_month,greenwich_year) + B = A - 2451545 + C = B / 36525 + D = 6.697374558 + (2400.051336 * C) + (0.000025862 * C * C) + E = D - (24 * math.floor(D / 24)) + F = hms_dh(u_hours,u_minutes,u_seconds) + G = F * 1.002737909 + H = E + G + + return H - (24 * math.floor(H / 24)) + +def gst_lst(greenwich_hours,greenwich_minutes,greenwich_seconds,geographical_longitude): + """ + Convert Greenwich Sidereal Time to Local Sidereal Time + + Original macro name: GSTLST + """ + A = hms_dh(greenwich_hours,greenwich_minutes,greenwich_seconds) + B = geographical_longitude / 15 + C = A + B + + return C - (24 * math.floor(C / 24)) + +def lst_gst(local_hours,local_minutes,local_seconds,longitude): + """ + Convert Local Sidereal Time to Greenwich Sidereal Time + + Original macro name: LSTGST + """ + A = hms_dh(local_hours,local_minutes,local_seconds) + B = longitude / 15 + C = A - B + + return C - (24 * math.floor(C / 24)) + +def gst_ut(greenwich_sidereal_hours,greenwich_sidereal_minutes,greenwich_sidereal_seconds,greenwich_day,greenwich_month,greenwich_year): + """ + Convert Greenwich Sidereal Time to Universal Time + + Original macro name: GSTUT + """ + A = cd_jd(greenwich_day,greenwich_month,greenwich_year) + B = A - 2451545 + C = B / 36525 + D = 6.697374558 + (2400.051336 * C) + (0.000025862 * C * C) + E = D - (24 * math.floor(D / 24)) + F = hms_dh(greenwich_sidereal_hours,greenwich_sidereal_minutes,greenwich_sidereal_seconds) + G = F - E + H = G - (24 * math.floor(G / 24)) + + return H * 0.9972695663 + +def e_gst_ut(GSH, GSM, GSS, GD, GM, GY): + """ + Status of conversion of Greenwich Sidereal Time to Universal Time. + + Original macro name: eGSTUT + """ + A = cd_jd(GD, GM, GY) + B = A - 2451545 + C = B / 36525 + D = 6.697374558 + (2400.051336 * C) + (0.000025862 * C * C) + E = D - (24 * math.floor(D / 24)) + F = hms_dh(GSH, GSM, GSS) + G = F - E + H = G - (24 * math.floor(G / 24)) + + return "Warning" if ((H * 0.9972695663) < (4 / 60)) else "OK" + +def ra_ha(ra_hours, ra_minutes, ra_seconds, lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year, geographical_longitude): + """ + Convert Right Ascension to Hour Angle + + Original macro name: RAHA + """ + A = lct_ut(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + B = lct_gday(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + C = lct_gmonth(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + D = lct_gyear(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + E = ut_gst(A, 0, 0, B, C, D) + F = gst_lst(E, 0, 0, geographical_longitude) + G = hms_dh(ra_hours, ra_minutes, ra_seconds) + H = F - G + + return 24 + H if H < 0 else H + +def ha_ra(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year,geographical_longitude): + """ + Convert Hour Angle to Right Ascension + + Original macro name: HARA + """ + A = lct_ut(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + B = lct_gday(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + C = lct_gmonth(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + D = lct_gyear(lct_hours, lct_minutes, lct_seconds, daylight_saving, zone_correction, local_day, local_month, local_year) + E = ut_gst(A, 0, 0, B, C, D) + F = gst_lst(E, 0, 0, geographical_longitude) + G = hms_dh(hour_angle_hours,hour_angle_minutes,hour_angle_seconds) + H = F - G + + return 24 + H if H < 0 else H + +def dms_dd(degrees,minutes,seconds): + """ + Convert Degrees Minutes Seconds to Decimal Degrees + + Original macro name: DMSDD + """ + A = abs(seconds) / 60 + B = (abs(minutes) + A) / 60 + C = abs(degrees) + B + + return -C if degrees < 0 or minutes < 0 or seconds < 0 else C + +def dd_deg(decimal_degrees): + """ + Return Degrees part of Decimal Degrees + + Original macro name: DDDeg + """ + A = abs(decimal_degrees) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60),2) + D = 0 if C == 60 else C + E = B = 60 if C == 60 else B + + return -math.floor(E/3600) if decimal_degrees < 0 else math.floor(E/3600) + +def dd_min(decimal_degrees): + """ + Return Minutes part of Decimal Degrees + + Original macro name: DDMin + """ + A = abs(decimal_degrees) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60),2) + D = 0 if C == 60 else C + E = B + 60 if C == 60 else B + + return math.floor(E/60) % 60 + +def dd_sec(decimal_degrees): + """ + Return Seconds part of Decimal Degrees + + Original macro name: DDSec + """ + A = abs(decimal_degrees) + B = A * 3600 + C = round(B - 60 * math.floor(B / 60),2) + D = 0 if C == 60 else C + + return D + +def dd_dh(decimal_degrees): + """ + Convert Decimal Degrees to Degree-Hours + + Original macro name: DDDH + """ + return decimal_degrees / 15 + +def dh_dd(degree_hours): + """ + Convert Degree-Hours to Decimal Degrees + + Original macro name: DHDD + """ + return degree_hours * 15 + +def degrees(W): + """ + Convert W to Degrees + + Original macro name: Degrees + """ + return W * 57.29577951 + +def atan2(X, Y): + """ + Custom ATAN2 function + + Original macro name: Atan2 + """ + B = 3.1415926535 + if abs(X) < 1e-20: + if Y < 0: + A = -B / 2 + else: + A = B / 2 + else: + A = math.atan(Y/X) + + if X < 0: + A = B + A + + if A < 0: + A = A + 2 * B + + return A + +def eq_az(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds,geographical_latitude): + """ + Convert Equatorial Coordinates to Azimuth (in decimal degrees) + + Original macro name: EQAz + """ + A = hms_dh(hour_angle_hours,hour_angle_minutes,hour_angle_seconds) + B = A * 15 + C = math.radians(B) + D = dms_dd(declination_degrees,declination_minutes,declination_seconds) + E = math.radians(D) + F = math.radians(geographical_latitude) + G = math.sin(E) * math.sin(F) + math.cos(E) * math.cos(F) * math.cos(C) + H = -math.cos(E) * math.cos(F) * math.sin(C) + I = math.sin(E) - (math.sin(F) * G) + J = degrees(math.atan2(H,I)) + + return J - 360 * math.floor(J / 360) + +def eq_alt(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds,geographical_latitude): + """ + Convert Equatorial Coordinates to Altitude (in decimal degrees) + + Original macro name: EQAlt + """ + A = hms_dh(hour_angle_hours,hour_angle_minutes,hour_angle_seconds) + B = A * 15 + C = math.radians(B) + D = dms_dd(declination_degrees,declination_minutes,declination_seconds) + E = math.radians(D) + F = math.radians(geographical_latitude) + G = math.sin(E) * math.sin(F) + math.cos(E) * math.cos(F) * math.cos(C) + + return degrees(math.asin(G)) + +def hor_dec(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,geographical_latitude): + """ + Convert Horizon Coordinates to Declination (in decimal degrees) + + Original macro name: HORDec + """ + A = dms_dd(azimuth_degrees,azimuth_minutes,azimuth_seconds) + B = dms_dd(altitude_degrees,altitude_minutes,altitude_seconds) + C = math.radians(A) + D = math.radians(B) + E = math.radians(geographical_latitude) + F = math.sin(D) * math.sin(E) + math.cos(D) * math.cos(E) * math.cos(C) + + return degrees(math.asin(F)) + +def hor_ha(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,geographical_latitude): + """ + Convert Horizon Coordinates to Hour Angle (in decimal degrees) + + Original macro name: HORHa + """ + A = dms_dd(azimuth_degrees,azimuth_minutes,azimuth_seconds) + B = dms_dd(altitude_degrees,altitude_minutes,altitude_seconds) + C = math.radians(A) + D = math.radians(B) + E = math.radians(geographical_latitude) + F = math.sin(D) * math.sin(E) + math.cos(D) * math.cos(E) * math.cos(C) + G = -math.cos(D) * math.cos(E) * math.sin(C) + H = math.sin(D) - math.sin(E) * F + I = dd_dh(degrees(math.atan2(G,H))) + + return I - 24 * math.floor(I / 24) + +def nutat_obl(greenwich_day,greenwich_month,greenwich_year): + """ + Nutation of Obliquity + + Original macro name: NutatObl + """ + DJ = cd_jd(greenwich_day,greenwich_month,greenwich_year) - 2415020 + T = DJ / 36525 + T2 = T * T + + A = 100.0021358 * T + B = 360 * (A - math.floor(A)) + + L1 = 279.6967 + 0.000303 * T2 + B + l2 = 2 * math.radians(L1) + + A = 1336.855231 * T + B = 360 * (A - math.floor(A)) + + D1 = 270.4342 - 0.001133 * T2 + B + D2 = 2 * math.radians(D1) + + A = 99.99736056 * T + B = 360 * (A - math.floor(A)) + + M1 = 358.4758 - 0.00015 * T2 + B + M1 = math.radians(M1) + + A = 1325.552359 * T + B = 360 * (A - math.floor(A)) + + M2 = 296.1046 + 0.009192 * T2 + B + M2 = math.radians(M2) + + A = 5.372616667 * T + B = 360 * (A - math.floor(A)) + + N1 = 259.1833 + 0.002078 * T2 - B + N1 = math.radians(N1) + + N2 = 2 * N1 + + DDO = (9.21 + 0.00091 * T) * math.cos(N1) + DDO = DDO + (0.5522 - 0.00029 * T) * math.cos(l2) - 0.0904 * math.cos(N2) + DDO = DDO + 0.0884 * math.cos(D2) + 0.0216 * math.cos(l2 + M1) + DDO = DDO + 0.0183 * math.cos(D2 - N1) + 0.0113 * math.cos(D2 + M2) + DDO = DDO - 0.0093 * math.cos(l2 - M1) - 0.0066 * math.cos(l2 - N1) + + return DDO / 3600 + +def obliq(greenwich_day,greenwich_month,greenwich_year): + """ + Obliquity of the Ecliptic for a Greenwich Date + + Original macro name: Obliq + """ + A = cd_jd(greenwich_day,greenwich_month,greenwich_year) + B = A - 2415020 + C = (B / 36525) - 1 + D = C * (46.815 + C * (0.0006 - (C * 0.00181))) + E = D / 3600 + + return 23.43929167 - E + nutat_obl(greenwich_day,greenwich_month,greenwich_year) + +def sun_long(LCH,LCM,LCS,DS,ZC,LD,LM,LY): + """ + Calculate Sun's ecliptic longitude + + Original macro name: SunLong + """ + AA = lct_gday(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + BB = lct_gmonth(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + CC = lct_gyear(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + UT = lct_ut(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + DJ = cd_jd(AA, BB, CC) - 2415020 + T = (DJ / 36525) + (UT / 876600) + T2 = T * T + A = 100.0021359 * T + B = 360 * (A - math.floor(A)) + + L = 279.69668 + 0.0003025 * T2 + B + A = 99.99736042 * T + B = 360 * (A - math.floor(A)) + + M1 = 358.47583 - (0.00015 + 0.0000033 * T) * T2 + B + EC = 0.01675104 - 0.0000418 * T - 0.000000126 * T2 + + AM = math.radians(M1) + AT = true_anomaly(AM, EC) + AE = eccentric_anomaly(AM, EC) + + A = 62.55209472 * T + B = 360 * (A - math.floor(A)) + + A1 = math.radians(153.23 + B) + A = 125.1041894 * T + B = 360 * (A - math.floor(A)) + + B1 = math.radians(216.57 + B) + A = 91.56766028 * T + B = 360 * (A - math.floor(A)) + + C1 = math.radians(312.69 + B) + A = 1236.853095 * T + B = 360 * (A - math.floor(A)) + + D1 = math.radians(350.74 - 0.00144 * T2 + B) + E1 = math.radians(231.19 + 20.2 * T) + A = 183.1353208 * T + B = 360 * (A - math.floor(A)) + H1 = math.radians(353.4 + B) + + D2 = 0.00134 * math.cos(A1) + 0.00154 * math.cos(B1) + 0.002 * math.cos(C1) + D2 = D2 + 0.00179 * math.sin(D1) + 0.00178 * math.sin(E1) + D3 = 0.00000543 * math.sin(A1) + 0.00001575 * math.sin(B1) + D3 = D3 + 0.00001627 * math.sin(C1) + 0.00003076 * math.cos(D1) + D3 = D3 + 0.00000927 * math.sin(H1) + + SR = AT + math.radians(L - M1 + D2) + TP = 6.283185308 + + SR = SR - TP * math.floor(SR / TP) + + return degrees(SR) + +def sun_dist(LCH,LCM,LCS,DS,ZC,LD,LM,LY): + """ + Calculate Sun's distance from the Earth in astronomical units + + Original macro name: SunDist + """ + AA = lct_gday(LCH,LCM,LCS,DS,ZC,LD,LM,LY) + BB = lct_gmonth(LCH,LCM,LCS,DS,ZC,LD,LM,LY) + CC = lct_gyear(LCH,LCM,LCS,DS,ZC,LD,LM,LY) + UT = lct_ut(LCH,LCM,LCS,DS,ZC,LD,LM,LY) + DJ = cd_jd(AA,BB,CC) - 2415020 + + T = (DJ / 36525) + (UT / 876600) + T2 = T * T + + A = 100.0021359 * T + B = 360 * (A - math.floor(A)) + L = 279.69668 + 0.0003025 * T2 + B + A = 99.99736042 * T + B = 360 * (A - math.floor(A)) + M1 = 358.47583 - (0.00015 + 0.0000033 * T) * T2 + B + EC = 0.01675104 - 0.0000418 * T - 0.000000126 * T2 + + AM = math.radians(M1) + AT = true_anomaly(AM,EC) + AE = eccentric_anomaly(AM, EC) + + A = 62.55209472 * T + B = 360 * (A - math.floor(A)) + A1 = math.radians(153.23 + B) + A = 125.1041894 * T + B = 360 * (A - math.floor(A)) + B1 = math.radians(216.57 + B) + A = 91.56766028 * T + B = 360 * (A - math.floor(A)) + C1 = math.radians(312.69 + B) + A = 1236.853095 * T + B = 360 * (A - math.floor(A)) + D1 = math.radians(350.74 - 0.00144 * T2 + B) + E1 = math.radians(231.19 + 20.2 * T) + A = 183.1353208 * T + B = 360 * (A - math.floor(A)) + H1 = math.radians(353.4 + B) + + D2 = 0.00134 * math.cos(A1) + 0.00154 * math.cos(B1) + 0.002 * math.cos(C1) + D2 = D2 + 0.00179 * math.sin(D1) + 0.00178 * math.sin(E1) + D3 = 0.00000543 * math.sin(A1) + 0.00001575 * math.sin(B1) + D3 = D3 + 0.00001627 * math.sin(C1) + 0.00003076 * math.cos(D1) + D3 = D3 + 0.00000927 * math.sin(H1) + + return 1.0000002 * (1 - EC * math.cos(AE)) + D3 + +def sun_dia(LCH,LCM,LCS,DS,ZC,LD,LM,LY): + """ + Calculate Sun's angular diameter in decimal degrees + + Original macro name: SunDia + """ + A = sun_dist(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + + return 0.533128 / A + +def true_anomaly(AM,EC): + """ + Solve Kepler's equation, and return value of the true anomaly in radians + + Original macro name: TrueAnomaly + """ + TP = 6.283185308 + M = AM - TP * math.floor(AM / TP) + AE = M + + while 1 == 1: + D = AE - (EC * math.sin(AE)) - M + if abs(D) < 0.000001: + break + D = D / (1 - (EC * math.cos(AE))) + AE = AE - D + + A = math.sqrt((1 + EC) / (1 - EC)) * math.tan(AE / 2) + AT = 2 * math.atan(A) + + return AT + +def eccentric_anomaly(AM,EC): + """ + Solve Kepler's equation, and return value of the eccentric anomaly in radians + + Original macro name: EccentricAnomaly + """ + TP = 6.283185308 + M = AM - TP * math.floor(AM / TP) + AE = M + + while 1 == 1: + D = AE - (EC * math.sin(AE)) - M + + if abs(D) < 0.000001: + break + + D = D / (1 - (EC * math.cos(AE))) + AE = AE - D + + return AE + +def refract(Y2,SW,PR,TR): + """ + Calculate effects of refraction + + Original macro name: Refract + """ + Y = math.radians(Y2) + + D = -1 if SW[0].lower() == "t" else 1 + + if D == -1: + Y3 = Y + Y1 = Y + R1 = 0 + + while 1 == 1: + Y = Y1 + R1 + Q = Y + + RF = refract_l3035(PR,TR,Y,D) + + if Y < -0.087: + return 0 + + R2 = RF + + if (R2 == 0) or (abs(R2 - R1) < 0.000001): + Q = Y3 + return degrees(Q + RF) + + R1 = R2 + + RF = refract_l3035(PR,TR,Y,D) + + if Y < -0.087: + return 0 + + Q = Y + + return degrees(Q + RF) + +def refract_l3035(PR,TR,Y,D): + """ Helper function for refract """ + if Y < 0.2617994: + if Y < -0.087: + return 0 + + YD = degrees(Y) + A = ((0.00002 * YD + 0.0196) * YD + 0.1594) * PR + B = (273 + TR) * ((0.0845 * YD + 0.505) * YD + 1) + + return math.radians(-(A / B) * D) + + return -D * 0.00007888888 * PR / ((273 + TR) * math.tan(Y)) + +def parallax_ha(HH,HM,HS,DD,DM,DS,SW,GP,HT,HP): + """ + Calculate corrected hour angle in decimal hours + + Original macro name: ParallaxHA + """ + A = math.radians(GP) + C1 = math.cos(A) + S1 = math.sin(A) + + U = math.atan(0.996647 * S1 / C1) + + C2 = math.cos(U) + S2 = math.sin(U) + B = HT / 6378160 + + RS = (0.996647 * S2) + (B * S1) + + RC = C2 + (B * C1) + TP = 6.283185308 + + RP = 1 / math.sin(math.radians(HP)) + + X = math.radians(dh_dd(hms_dh(HH, HM, HS))) + X1 = X + + Y = math.radians(dms_dd(DD, DM, DS)) + Y1 = Y + + D = 1 if SW[0].lower() == "t" else -1 + + if D == 1: + P,Q = parallax_ha_l2870(X,Y,RC,RP,RS,TP) + return dd_dh(degrees(P)) + + P1 = 0 + Q1 = 0 + while 1==1: + P,Q = parallax_ha_l2870(X,Y,RC,RP,RS,TP) + + P2 = P - X + Q2 = Q - Y + + AA = abs(P2 - P1) + BB = abs(Q2 - Q1) + + if (AA < 0.000001) and (BB < 0.000001): + P = X1 - P2 + Q = Y1 - Q2 + X = X1 + Y = Y1 + return dd_dh(degrees(P)) + + X = X1 - P2 + Y = Y1 - Q2 + P1 = P2 + Q1 = Q2 + +def parallax_ha_l2870(X,Y,RC,RP,RS,TP): + """ Helper function for parallax_ha """ + CX = math.cos(X) + SY = math.sin(Y) + CY = math.cos(Y) + + AA = (RC * math.sin(X)) / ((RP * CY) - (RC * CX)) + + DX = math.atan(AA) + P = X + DX + CP = math.cos(P) + + P = P - TP * math.floor(P / TP) + Q = math.atan(CP * (RP * SY - RS) / (RP * CY * CX - RC)) + + return P,Q + +def parallax_dec(HH,HM,HS,DD,DM,DS,SW,GP,HT,HP): + """ + Calculate corrected declination in decimal degrees + + Original macro name: ParallaxDec + """ + A = math.radians(GP) + C1 = math.cos(A) + S1 = math.sin(A) + + U = math.atan(0.996647 * S1 / C1) + + C2 = math.cos(U) + S2 = math.sin(U) + B = HT / 6378160 + RS = (0.996647 * S2) + (B * S1) + + RC = C2 + (B * C1) + TP = 6.283185308 + + RP = 1 / math.sin(math.radians(HP)) + + X = math.radians(dh_dd(hms_dh(HH, HM, HS))) + X1 = X + + Y = math.radians(dms_dd(DD, DM, DS)) + Y1 = Y + + D = 1 if SW[0].lower() == "t" else -1 + + if D == 1: + P,Q = parallax_dec_l2870(X,Y,RC,RP,RS,TP) + return degrees(Q) + + P1 = 0 + Q1 = 0 + + while 1 == 1: + P,Q = parallax_dec_l2870(X,Y,RC,RP,RS,TP) + + P2 = P - X + Q2 = Q - Y + + AA = abs(P2 - P1) + BB = abs(Q2 - Q1) + + if (AA < 0.000001) and (BB < 0.000001): + P = X1 - P2 + Q = Y1 - Q2 + X = X1 + Y = Y1 + return degrees(Q) + + X = X1 - P2 + Y = Y1 - Q2 + P1 = P2 + Q1 = Q2 + +def parallax_dec_l2870(X,Y,RC,RP,RS,TP): + """ Helper function for parallax_dec """ + CX = math.cos(X) + SY = math.sin(Y) + CY = math.cos(Y) + + AA = (RC * math.sin(X)) / ((RP * CY) - (RC * CX)) + + DX = math.atan(AA) + P = X + DX + CP = math.cos(P) + + P = P - TP * math.floor(P / TP) + Q = math.atan(CP * (RP * SY - RS) / (RP * CY * CX - RC)) + + return P,Q + +def unwind(W): + """ + Convert angle in radians to equivalent angle in degrees. + + Original macro name: Unwind + """ + return W - 6.283185308 * math.floor(W / 6.283185308) + +def unwind_deg(W): + """ + Convert angle in degrees to equivalent angle in the range 0 to 360 degrees. + + Original macro name: UnwindDeg + """ + return W - 360 * math.floor(W / 360) + +def unwind_rad(W): + """ + Convert angle in radians to equivalent angle in degrees. + + Original macro name: UnwindRad + """ + return W - 6.283185308 * math.floor(W / 6.283185308) + +def moon_long(LH,LM,LS,DS,ZC,DY,MN,YR): + """ + Calculate geocentric ecliptic longitude for the Moon + + Original macro name: MoonLong + """ + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + T = ((cd_jd(GD, GM, GY) - 2415020) / 36525) + (UT / 876600) + T2 = T * T + + M1 = 27.32158213 + M2 = 365.2596407 + M3 = 27.55455094 + M4 = 29.53058868 + M5 = 27.21222039 + M6 = 6798.363307 + Q = cd_jd(GD, GM, GY) - 2415020 + (UT / 24) + M1 = Q / M1 + M2 = Q / M2 + M3 = Q / M3 + M4 = Q / M4 + M5 = Q / M5 + M6 = Q / M6 + M1 = 360 * (M1 - math.floor(M1)) + M2 = 360 * (M2 - math.floor(M2)) + M3 = 360 * (M3 - math.floor(M3)) + M4 = 360 * (M4 - math.floor(M4)) + M5 = 360 * (M5 - math.floor(M5)) + M6 = 360 * (M6 - math.floor(M6)) + + ML = 270.434164 + M1 - (0.001133 - 0.0000019 * T) * T2 + MS = 358.475833 + M2 - (0.00015 + 0.0000033 * T) * T2 + MD = 296.104608 + M3 + (0.009192 + 0.0000144 * T) * T2 + ME1 = 350.737486 + M4 - (0.001436 - 0.0000019 * T) * T2 + MF = 11.250889 + M5 - (0.003211 + 0.0000003 * T) * T2 + NA = 259.183275 - M6 + (0.002078 + 0.0000022 * T) * T2 + A = math.radians(51.2 + 20.2 * T) + S1 = math.sin(A) + S2 = math.sin(math.radians(NA)) + B = 346.56 + (132.87 - 0.0091731 * T) * T + S3 = 0.003964 * math.sin(math.radians(B)) + C = math.radians(NA + 275.05 - 2.3 * T) + S4 = math.sin(C) + ML = ML + 0.000233 * S1 + S3 + 0.001964 * S2 + MS = MS - 0.001778 * S1 + MD = MD + 0.000817 * S1 + S3 + 0.002541 * S2 + MF = MF + S3 - 0.024691 * S2 - 0.004328 * S4 + ME1 = ME1 + 0.002011 * S1 + S3 + 0.001964 * S2 + E = 1 - (0.002495 + 0.00000752 * T) * T + E2 = E * E + ML = math.radians(ML) + MS = math.radians(MS) + NA = math.radians(NA) + ME1 = math.radians(ME1) + MF = math.radians(MF) + MD = math.radians(MD) + + L = 6.28875 * math.sin(MD) + 1.274018 * math.sin(2 * ME1 - MD) + L = L + 0.658309 * math.sin(2 * ME1) + 0.213616 * math.sin(2 * MD) + L = L - E * 0.185596 * math.sin(MS) - 0.114336 * math.sin(2 * MF) + L = L + 0.058793 * math.sin(2 * (ME1 - MD)) + L = L + 0.057212 * E * math.sin(2 * ME1 - MS - MD) + 0.05332 * math.sin(2 * ME1 + MD) + L = L + 0.045874 * E * math.sin(2 * ME1 - MS) + 0.041024 * E * math.sin(MD - MS) + L = L - 0.034718 * math.sin(ME1) - E * 0.030465 * math.sin(MS + MD) + L = L + 0.015326 * math.sin(2 * (ME1 - MF)) - 0.012528 * math.sin(2 * MF + MD) + L = L - 0.01098 * math.sin(2 * MF - MD) + 0.010674 * math.sin(4 * ME1 - MD) + L = L + 0.010034 * math.sin(3 * MD) + 0.008548 * math.sin(4 * ME1 - 2 * MD) + L = L - E * 0.00791 * math.sin(MS - MD + 2 * ME1) - E * 0.006783 * math.sin(2 * ME1 + MS) + L = L + 0.005162 * math.sin(MD - ME1) + E * 0.005 * math.sin(MS + ME1) + L = L + 0.003862 * math.sin(4 * ME1) + E * 0.004049 * math.sin(MD - MS + 2 * ME1) + L = L + 0.003996 * math.sin(2 * (MD + ME1)) + 0.003665 * math.sin(2 * ME1 - 3 * MD) + L = L + E * 0.002695 * math.sin(2 * MD - MS) + 0.002602 * math.sin(MD - 2 * (MF + ME1)) + L = L + E * 0.002396 * math.sin(2 * (ME1 - MD) - MS) - 0.002349 * math.sin(MD + ME1) + L = L + E2 * 0.002249 * math.sin(2 * (ME1 - MS)) - E * 0.002125 * math.sin(2 * MD + MS) + L = L - E2 * 0.002079 * math.sin(2 * MS) + E2 * 0.002059 * math.sin(2 * (ME1 - MS) - MD) + L = L - 0.001773 * math.sin(MD + 2 * (ME1 - MF)) - 0.001595 * math.sin(2 * (MF + ME1)) + L = L + E * 0.00122 * math.sin(4 * ME1 - MS - MD) - 0.00111 * math.sin(2 * (MD + MF)) + L = L + 0.000892 * math.sin(MD - 3 * ME1) - E * 0.000811 * math.sin(MS + MD + 2 * ME1) + L = L + E * 0.000761 * math.sin(4 * ME1 - MS - 2 * MD) + L = L + E2 * 0.000704 * math.sin(MD - 2 * (MS + ME1)) + L = L + E * 0.000693 * math.sin(MS - 2 * (MD - ME1)) + L = L + E * 0.000598 * math.sin(2 * (ME1 - MF) - MS) + L = L + 0.00055 * math.sin(MD + 4 * ME1) + 0.000538 * math.sin(4 * MD) + L = L + E * 0.000521 * math.sin(4 * ME1 - MS) + 0.000486 * math.sin(2 * MD - ME1) + L = L + E2 * 0.000717 * math.sin(MD - 2 * MS) + MM = unwind(ML + math.radians(L)) + + return degrees(MM) + +def moon_lat(LH,LM,LS,DS,ZC,DY,MN,YR): + """ + Calculate geocentric ecliptic latitude for the Moon + + Original macro name: MoonLat + """ + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + T = ((cd_jd(GD, GM, GY) - 2415020) / 36525) + (UT / 876600) + T2 = T * T + + M1 = 27.32158213 + M2 = 365.2596407 + M3 = 27.55455094 + M4 = 29.53058868 + M5 = 27.21222039 + M6 = 6798.363307 + Q = cd_jd(GD, GM, GY) - 2415020 + (UT / 24) + M1 = Q / M1 + M2 = Q / M2 + M3 = Q / M3 + M4 = Q / M4 + M5 = Q / M5 + M6 = Q / M6 + M1 = 360 * (M1 - math.floor(M1)) + M2 = 360 * (M2 - math.floor(M2)) + M3 = 360 * (M3 - math.floor(M3)) + M4 = 360 * (M4 - math.floor(M4)) + M5 = 360 * (M5 - math.floor(M5)) + M6 = 360 * (M6 - math.floor(M6)) + + ML = 270.434164 + M1 - (0.001133 - 0.0000019 * T) * T2 + MS = 358.475833 + M2 - (0.00015 + 0.0000033 * T) * T2 + MD = 296.104608 + M3 + (0.009192 + 0.0000144 * T) * T2 + ME1 = 350.737486 + M4 - (0.001436 - 0.0000019 * T) * T2 + MF = 11.250889 + M5 - (0.003211 + 0.0000003 * T) * T2 + NA = 259.183275 - M6 + (0.002078 + 0.0000022 * T) * T2 + A = math.radians(51.2 + 20.2 * T) + S1 = math.sin(A) + S2 = math.sin(math.radians(NA)) + B = 346.56 + (132.87 - 0.0091731 * T) * T + S3 = 0.003964 * math.sin(math.radians(B)) + C = math.radians(NA + 275.05 - 2.3 * T) + S4 = math.sin(C) + ML = ML + 0.000233 * S1 + S3 + 0.001964 * S2 + MS = MS - 0.001778 * S1 + MD = MD + 0.000817 * S1 + S3 + 0.002541 * S2 + MF = MF + S3 - 0.024691 * S2 - 0.004328 * S4 + ME1 = ME1 + 0.002011 * S1 + S3 + 0.001964 * S2 + E = 1 - (0.002495 + 0.00000752 * T) * T + E2 = E * E + ML = math.radians(ML) + MS = math.radians(MS) + NA = math.radians(NA) + ME1 = math.radians(ME1) + MF = math.radians(MF) + MD = math.radians(MD) + + G = 5.128189 * math.sin(MF) + 0.280606 * math.sin(MD + MF) + G = G + 0.277693 * math.sin(MD - MF) + 0.173238 * math.sin(2 * ME1 - MF) + G = G + 0.055413 * math.sin(2 * ME1 + MF - MD) + 0.046272 * math.sin(2 * ME1 - MF - MD) + G = G + 0.032573 * math.sin(2 * ME1 + MF) + 0.017198 * math.sin(2 * MD + MF) + G = G + 0.009267 * math.sin(2 * ME1 + MD - MF) + 0.008823 * math.sin(2 * MD - MF) + G = G + E * 0.008247 * math.sin(2 * ME1 - MS - MF) + 0.004323 * math.sin(2 * (ME1 - MD) - MF) + G = G + 0.0042 * math.sin(2 * ME1 + MF + MD) + E * 0.003372 * math.sin(MF - MS - 2 * ME1) + G = G + E * 0.002472 * math.sin(2 * ME1 + MF - MS - MD) + G = G + E * 0.002222 * math.sin(2 * ME1 + MF - MS) + G = G + E * 0.002072 * math.sin(2 * ME1 - MF - MS - MD) + G = G + E * 0.001877 * math.sin(MF - MS + MD) + 0.001828 * math.sin(4 * ME1 - MF - MD) + G = G - E * 0.001803 * math.sin(MF + MS) - 0.00175 * math.sin(3 * MF) + G = G + E * 0.00157 * math.sin(MD - MS - MF) - 0.001487 * math.sin(MF + ME1) + G = G - E * 0.001481 * math.sin(MF + MS + MD) + E * 0.001417 * math.sin(MF - MS - MD) + G = G + E * 0.00135 * math.sin(MF - MS) + 0.00133 * math.sin(MF - ME1) + G = G + 0.001106 * math.sin(MF + 3 * MD) + 0.00102 * math.sin(4 * ME1 - MF) + G = G + 0.000833 * math.sin(MF + 4 * ME1 - MD) + 0.000781 * math.sin(MD - 3 * MF) + G = G + 0.00067 * math.sin(MF + 4 * ME1 - 2 * MD) + 0.000606 * math.sin(2 * ME1 - 3 * MF) + G = G + 0.000597 * math.sin(2 * (ME1 + MD) - MF) + G = G + E * 0.000492 * math.sin(2 * ME1 + MD - MS - MF) + 0.00045 * math.sin(2 * (MD - ME1) - MF) + G = G + 0.000439 * math.sin(3 * MD - MF) + 0.000423 * math.sin(MF + 2 * (ME1 + MD)) + G = G + 0.000422 * math.sin(2 * ME1 - MF - 3 * MD) - E * 0.000367 * math.sin(MS + MF + 2 * ME1 - MD) + G = G - E * 0.000353 * math.sin(MS + MF + 2 * ME1) + 0.000331 * math.sin(MF + 4 * ME1) + G = G + E * 0.000317 * math.sin(2 * ME1 + MF - MS + MD) + G = G + E2 * 0.000306 * math.sin(2 * (ME1 - MS) - MF) - 0.000283 * math.sin(MD + 3 * MF) + W1 = 0.0004664 * math.cos(NA) + W2 = 0.0000754 * math.cos(C) + BM = math.radians(G) * (1 - W1 - W2) + + return degrees(BM) + +def moon_hp(LH,LM,LS,DS,ZC,DY,MN,YR): + """ + Calculate horizontal parallax for the Moon + + Original macro name: MoonHP + """ + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + T = ((cd_jd(GD, GM, GY) - 2415020) / 36525) + (UT / 876600) + T2 = T * T + + M1 = 27.32158213 + M2 = 365.2596407 + M3 = 27.55455094 + M4 = 29.53058868 + M5 = 27.21222039 + M6 = 6798.363307 + Q = cd_jd(GD, GM, GY) - 2415020 + (UT / 24) + M1 = Q / M1 + M2 = Q / M2 + M3 = Q / M3 + M4 = Q / M4 + M5 = Q / M5 + M6 = Q / M6 + M1 = 360 * (M1 - math.floor(M1)) + M2 = 360 * (M2 - math.floor(M2)) + M3 = 360 * (M3 - math.floor(M3)) + M4 = 360 * (M4 - math.floor(M4)) + M5 = 360 * (M5 - math.floor(M5)) + M6 = 360 * (M6 - math.floor(M6)) + + ML = 270.434164 + M1 - (0.001133 - 0.0000019 * T) * T2 + MS = 358.475833 + M2 - (0.00015 + 0.0000033 * T) * T2 + MD = 296.104608 + M3 + (0.009192 + 0.0000144 * T) * T2 + ME1 = 350.737486 + M4 - (0.001436 - 0.0000019 * T) * T2 + MF = 11.250889 + M5 - (0.003211 + 0.0000003 * T) * T2 + NA = 259.183275 - M6 + (0.002078 + 0.0000022 * T) * T2 + A = math.radians(51.2 + 20.2 * T) + S1 = math.sin(A) + S2 = math.sin(math.radians(NA)) + B = 346.56 + (132.87 - 0.0091731 * T) * T + S3 = 0.003964 * math.sin(math.radians(B)) + C = math.radians(NA + 275.05 - 2.3 * T) + S4 = math.sin(C) + ML = ML + 0.000233 * S1 + S3 + 0.001964 * S2 + MS = MS - 0.001778 * S1 + MD = MD + 0.000817 * S1 + S3 + 0.002541 * S2 + MF = MF + S3 - 0.024691 * S2 - 0.004328 * S4 + ME1 = ME1 + 0.002011 * S1 + S3 + 0.001964 * S2 + E = 1 - (0.002495 + 0.00000752 * T) * T + E2 = E * E + ML = math.radians(ML) + MS = math.radians(MS) + NA = math.radians(NA) + ME1 = math.radians(ME1) + MF = math.radians(MF) + MD = math.radians(MD) + + PM = 0.950724 + 0.051818 * math.cos(MD) + 0.009531 * math.cos(2 * ME1 - MD) + PM = PM + 0.007843 * math.cos(2 * ME1) + 0.002824 * math.cos(2 * MD) + PM = PM + 0.000857 * math.cos(2 * ME1 + MD) + E * 0.000533 * math.cos(2 * ME1 - MS) + PM = PM + E * 0.000401 * math.cos(2 * ME1 - MD - MS) + PM = PM + E * 0.00032 * math.cos(MD - MS) - 0.000271 * math.cos(ME1) + PM = PM - E * 0.000264 * math.cos(MS + MD) - 0.000198 * math.cos(2 * MF - MD) + PM = PM + 0.000173 * math.cos(3 * MD) + 0.000167 * math.cos(4 * ME1 - MD) + PM = PM - E * 0.000111 * math.cos(MS) + 0.000103 * math.cos(4 * ME1 - 2 * MD) + PM = PM - 0.000084 * math.cos(2 * MD - 2 * ME1) - E * 0.000083 * math.cos(2 * ME1 + MS) + PM = PM + 0.000079 * math.cos(2 * ME1 + 2 * MD) + 0.000072 * math.cos(4 * ME1) + PM = PM + E * 0.000064 * math.cos(2 * ME1 - MS + MD) - E * 0.000063 * math.cos(2 * ME1 + MS - MD) + PM = PM + E * 0.000041 * math.cos(MS + ME1) + E * 0.000035 * math.cos(2 * MD - MS) + PM = PM - 0.000033 * math.cos(3 * MD - 2 * ME1) - 0.00003 * math.cos(MD + ME1) + PM = PM - 0.000029 * math.cos(2 * (MF - ME1)) - E * 0.000029 * math.cos(2 * MD + MS) + PM = PM + E2 * 0.000026 * math.cos(2 * (ME1 - MS)) - 0.000023 * math.cos(2 * (MF - ME1) + MD) + PM = PM + E * 0.000019 * math.cos(4 * ME1 - MS - MD) + + return PM + +def moon_dist(LH, LM, LS, DS, ZC, DY, MN, YR): + """ + Calculate distance from the Earth to the Moon (km) + + Original macro name: MoonDist + """ + HP = math.radians(moon_hp(LH, LM, LS, DS, ZC, DY, MN, YR)) + R = 6378.14 / math.sin(HP) + + return R + +def moon_size(LH, LM, LS, DS, ZC, DY, MN, YR): + """ + Calculate the Moon's angular diameter (degrees) + + Original macro name: MoonSize + """ + HP = math.radians(moon_hp(LH, LM, LS, DS, ZC, DY, MN, YR)) + R = 6378.14 / math.sin(HP) + TH = 384401 * 0.5181 / R + + return TH + +def sun_e_long(GD,GM,GY): + """ + Mean ecliptic longitude of the Sun at the epoch + + Original macro name: SunElong + """ + T = (cd_jd(GD,GM,GY) - 2415020) / 36525 + T2 = T * T + X = 279.6966778 + 36000.76892 * T + 0.0003025 * T2 + + return X - 360 * math.floor(X / 360) + +def sun_peri(GD,GM,GY): + """ + Longitude of the Sun at perigee + + Original macro name: SunPeri + """ + T = (cd_jd(GD,GM,GY) - 2415020) / 36525 + T2 = T * T + X = 281.2208444 + 1.719175 * T + 0.000452778 * T2 + + return X - 360 * math.floor(X / 360) + +def sun_ecc(GD,GM,GY): + """ + Eccentricity of the Sun-Earth orbit + + Original macro name: SunEcc + """ + T = (cd_jd(GD,GM,GY) - 2415020) / 36525 + T2 = T * T + + return 0.01675104 - 0.0000418 * T - 0.000000126 * T2 + +def ec_dec(ELD,ELM,ELS,BD,BM,BS,GD,GM,GY): + """ + Ecliptic - Declination (degrees) + + Original macro name: ECDec + """ + A = math.radians(dms_dd(ELD, ELM, ELS)) + B = math.radians(dms_dd(BD, BM, BS)) + C = math.radians(obliq(GD, GM, GY)) + D = math.sin(B) * math.cos(C) + math.cos(B) * math.sin(C) * math.sin(A) + + return degrees(math.asin(D)) + +def ec_ra(ELD,ELM,ELS,BD,BM,BS,GD,GM,GY): + """ + Ecliptic - Right Ascension (degrees) + + Original macro name: ECRA + """ + A = math.radians(dms_dd(ELD, ELM, ELS)) + B = math.radians(dms_dd(BD, BM, BS)) + C = math.radians(obliq(GD, GM, GY)) + D = math.sin(A) * math.cos(C) - math.tan(B) * math.sin(C) + E = math.cos(A) + F = degrees(math.atan2(D,E)) + + return F - 360 * math.floor(F / 360) + +def sun_true_anomaly(LCH, LCM, LCS, DS, ZC, LD, LM, LY): + """ + Calculate Sun's true anomaly, i.e., how much its orbit deviates from a true circle to an ellipse. + + Original macro name: SunTrueAnomaly + """ + AA = lct_gday(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + BB = lct_gmonth(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + CC = lct_gyear(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + UT = lct_ut(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + DJ = cd_jd(AA, BB, CC) - 2415020 + + T = (DJ / 36525) + (UT / 876600) + T2 = T * T + + A = 100.0021359 * T + B = 360 * (A - math.floor(A)) + + L = 279.69668 + 0.0003025 * T2 + B + + A = 99.99736042 * T + B = 360 * (A - math.floor(A)) + + M1 = 358.47583 - (0.00015 + 0.0000033 * T) * T2 + B + EC = 0.01675104 - 0.0000418 * T - 0.000000126 * T2 + + AM = math.radians(M1) + + return degrees(true_anomaly(AM, EC)) + +def sun_mean_anomaly(LCH, LCM, LCS, DS, ZC, LD, LM, LY): + """ + Calculate the Sun's mean anomaly. + + Original macro name: SunMeanAnomaly + """ + AA = lct_gday(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + BB = lct_gmonth(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + CC = lct_gyear(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + UT = lct_ut(LCH, LCM, LCS, DS, ZC, LD, LM, LY) + DJ = cd_jd(AA, BB, CC) - 2415020 + T = (DJ / 36525) + (UT / 876600) + T2 = T * T + A = 100.0021359 * T + B = 360 * (A - math.floor(A)) + M1 = 358.47583 - (0.00015 + 0.0000033 * T) * T2 + B + AM = unwind(math.radians(M1)) + + return AM + +def sunrise_lct(LD, LM, LY, DS, ZC, GL, GP): + """ + Calculate local civil time of sunrise. + + Original macro name: SunriseLCT + """ + DI = 0.8333333 + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = sunrise_lct_l3710(GD,GM,GY,SR,DI,GP) + + if S != "OK": + XX = -99 + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + XX = -99 + else: + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + A,X,Y,LA,S = sunrise_lct_l3710(GD,GM,GY,SR,DI,GP) + + if S != "OK": + XX = -99 + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + XX = ut_lct(UT, 0, 0, DS, ZC, GD, GM, GY) + + return XX + +def sunrise_lct_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for sunrise_lct(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def sunrise_az(LD, LM, LY, DS, ZC, GL, GP): + """ + Calculate azimuth of sunrise. + + Original macro name: SunriseAz + """ + DI = 0.8333333 + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = sunrise_az_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + return -99 + + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + A,X,Y,LA,S = sunrise_az_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + return rise_set_azimuth_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + +def sunrise_az_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for sunrise_az(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def sunset_az(LD, LM, LY, DS, ZC, GL, GP): + """ + Calculate azimuth of sunset. + + Original macro name: SunsetAz + """ + DI = 0.8333333 + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = sunset_az_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + return -99 + + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + + A,X,Y,LA,S = sunset_az_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + return rise_set_azimuth_set(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + +def sunset_az_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for sunset_az(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_set(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def sunset_lct(LD, LM, LY, DS, ZC, GL, GP): + """ + Calculate local civil time of sunset. + + Original macro name: SunsetLCT + """ + DI = 0.8333333 + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = sunset_lct_l3710(GD,GM,GY,SR,DI,GP) + + if S != "OK": + XX = -99 + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + XX = -99 + else: + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + A,X,Y,LA,S = sunset_lct_l3710(GD,GM,GY,SR,DI,GP) + + if S != "OK": + XX = -99 + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + XX = ut_lct(UT, 0, 0, DS, ZC, GD, GM, GY) + + return XX + +def sunset_lct_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for sunset_lct(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_set(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def e_sun_rs(LD, LM, LY, DS, ZC, GL, GP): + """ + Sunrise/Sunset calculation status. + + Original macro name: eSunRS + """ + S = "" + DI = 0.8333333 + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = e_sun_rs_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return S + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + A,X,Y,LA,S = e_sun_rs_l3710(GD, GM, GY, SR, DI, GP) + if S != "OK": + return S + else: + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + S = S + " GST to UT conversion warning" + return S + + return S + +def e_sun_rs_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for e_sun_rs(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def angle(XX1, XM1, XS1, DD1, DM1, DS1, XX2, XM2, XS2, DD2, DM2, DS2, S): + """ + Calculate the angle between two celestial objects + + Original macro name: Angle + """ + A = dh_dd(hms_dh(XX1, XM1, XS1)) if (S in ["H","h"]) else dms_dd(XX1, XM1, XS1) + B = math.radians(A) + C = dms_dd(DD1, DM1, DS1) + D = math.radians(C) + E = dh_dd(hms_dh(XX2, XM2, XS2)) if (S in ["H","h"]) else dms_dd(XX2, XM2, XS2) + F = math.radians(E) + G = dms_dd(DD2, DM2, DS2) + H = math.radians(G) + I = math.acos(math.sin(D) * math.sin(H) + math.cos(D) * math.cos(H) * math.cos(B - F)) + + return degrees(I) + +def rise_set_local_sidereal_time_rise(RAH, RAM, RAS, DD, DM, DS, VD, G): + """ + Local sidereal time of rise, in hours. + + Original macro name: RSLSTR + """ + A = hms_dh(RAH, RAM, RAS) + B = math.radians(dh_dd(A)) + C = math.radians(dms_dd(DD, DM, DS)) + D = math.radians(VD) + E = math.radians(G) + F = -(math.sin(D) + math.sin(E) * math.sin(C)) / (math.cos(E) * math.cos(C)) + H = math.acos(F) if (abs(F) < 1) else 0 + I = dd_dh(degrees(B - H)) + + return I - 24 * math.floor(I / 24) + +def e_rs(RAH, RAM, RAS, DD, DM, DS, VD, G): + """ + Rise/Set status + + Possible values: "OK", "** never rises", "** circumpolar" + + Original macro name: eRS + """ + A = hms_dh(RAH, RAM, RAS) + B = math.radians(dh_dd(A)) + C = math.radians(dms_dd(DD, DM, DS)) + D = math.radians(VD) + E = math.radians(G) + F = -(math.sin(D) + math.sin(E) * math.sin(C)) / (math.cos(E) * math.cos(C)) + + returnValue = "OK" + if (F >= 1): + returnValue = "** never rises" + if (F <= -1): + returnValue = "** circumpolar" + + return returnValue + +def rise_set_local_sidereal_time_set(RAH, RAM, RAS, DD, DM, DS, VD, G): + """ + Local sidereal time of setting, in hours. + + Original macro name: RSLSTS + """ + A = hms_dh(RAH, RAM, RAS) + B = math.radians(dh_dd(A)) + C = math.radians(dms_dd(DD, DM, DS)) + D = math.radians(VD) + E = math.radians(G) + F = -(math.sin(D) + math.sin(E) * math.sin(C)) / (math.cos(E) * math.cos(C)) + H = math.acos(F) if (abs(F) < 1) else 0 + I = dd_dh(degrees(B + H)) + + return I - 24 * math.floor(I / 24) + +def rise_set_azimuth_rise(RAH, RAM, RAS, DD, DM, DS, VD, G): + """ + Azimuth of rising, in degrees. + + Original macro name: RSAZR + """ + A = hms_dh(RAH, RAM, RAS) + B = math.radians(dh_dd(A)) + C = math.radians(dms_dd(DD, DM, DS)) + D = math.radians(VD) + E = math.radians(G) + F = (math.sin(C) + math.sin(D) * math.sin(E)) / (math.cos(D) * math.cos(E)) + H = math.acos(F) if e_rs(RAH, RAM, RAS, DD, DM, DS, VD, G) == "OK" else 0 + I = degrees(H) + + return I - 360 * math.floor(I / 360) + +def rise_set_azimuth_set(RAH, RAM, RAS, DD, DM, DS, VD, G): + """ + Azimuth of setting, in degrees. + + Original macro name: RSAZS + """ + A = hms_dh(RAH, RAM, RAS) + B = math.radians(dh_dd(A)) + C = math.radians(dms_dd(DD, DM, DS)) + D = math.radians(VD) + E = math.radians(G) + F = (math.sin(C) + math.sin(D) * math.sin(E)) / (math.cos(D) * math.cos(E)) + H = math.acos(F) if e_rs(RAH, RAM, RAS, DD, DM, DS, VD, G) == "OK" else 0 + I = 360 - degrees(H) + + return I - 360 * math.floor(I / 360) + +def nutat_long(GD, GM, GY): + """ + Nutation amount to be added in ecliptic longitude, in degrees. + + Original macro name: NutatLong + """ + DJ = cd_jd(GD, GM, GY) - 2415020 + T = DJ / 36525 + T2 = T * T + + A = 100.0021358 * T + B = 360 * (A - math.floor(A)) + + L1 = 279.6967 + 0.000303 * T2 + B + l2 = 2 * math.radians(L1) + + A = 1336.855231 * T + B = 360 * (A - math.floor(A)) + + D1 = 270.4342 - 0.001133 * T2 + B + D2 = 2 * math.radians(D1) + + A = 99.99736056 * T + B = 360 * (A - math.floor(A)) + + M1 = 358.4758 - 0.00015 * T2 + B + M1 = math.radians(M1) + + A = 1325.552359 * T + B = 360 * (A - math.floor(A)) + + M2 = 296.1046 + 0.009192 * T2 + B + M2 = math.radians(M2) + + A = 5.372616667 * T + B = 360 * (A - math.floor(A)) + + N1 = 259.1833 + 0.002078 * T2 - B + N1 = math.radians(N1) + + N2 = 2 * N1 + + DP = (-17.2327 - 0.01737 * T) * math.sin(N1) + DP = DP + (-1.2729 - 0.00013 * T) * math.sin(l2) + 0.2088 * math.sin(N2) + DP = DP - 0.2037 * math.sin(D2) + (0.1261 - 0.00031 * T) * math.sin(M1) + DP = DP + 0.0675 * math.sin(M2) - (0.0497 - 0.00012 * T) * math.sin(l2 + M1) + DP = DP - 0.0342 * math.sin(D2 - N1) - 0.0261 * math.sin(D2 + M2) + DP = DP + 0.0214 * math.sin(l2 - M1) - 0.0149 * math.sin(l2 - D2 + M2) + DP = DP + 0.0124 * math.sin(l2 - N1) + 0.0114 * math.sin(D2 - M2) + + return DP / 3600 + +def twilight_am_lct(LD, LM, LY, DS, ZC, GL, GP, TT): + """ + Calculate morning twilight start, in local time. + + Twilight type (TT) can be one of "C" (civil), "N" (nautical), or "A" (astronomical) + + Original macro name: TwilightAMLCT + """ + DI = 18 + if TT in ["C","c"]: + DI = 6 + if TT in ["N","n"]: + DI = 12 + + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = twilight_am_lct_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + return -99 + + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + + A,X,Y,LA,S = twilight_am_lct_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return -99 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + XX = ut_lct(UT, 0, 0, DS, ZC, GD, GM, GY) + + return XX + +def twilight_am_lct_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for twilight_am_lct(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def twilight_pm_lct(LD, LM, LY, DS, ZC, GL, GP, TT): + """ + Calculate evening twilight end, in local time. + + Twilight type can be one of "C" (civil), "N" (nautical), or "A" (astronomical) + + Original macro name: TwilightPMLCT + """ + DI = 18 + if TT in ["C","c"]: + DI = 6 + if TT in ["N","n"]: + DI = 12 + + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = twilight_pm_lct_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return 0 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + return 0 + + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + + A,X,Y,LA,S = twilight_pm_lct_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return 0 + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + return ut_lct(UT, 0, 0, DS, ZC, GD, GM, GY) + +def twilight_pm_lct_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for twilight_pm_lct(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_set(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + return A,X,Y,LA,S + +def e_twilight(LD, LM, LY, DS, ZC, GL, GP, TT): + """ + Twilight calculation status. + + Twilight type can be one of "C" (civil), "N" (nautical), or "A" (astronomical) + + Original macro name: eTwilight + + Returns: + One of: "OK", "** lasts all night", or "** Sun too far below horizon" + """ + S = "" + + DI = 18 + if TT in ["C","c"]: + DI = 6 + if TT in ["N","n"]: + DI = 12 + + GD = lct_gday(12, 0, 0, DS, ZC, LD, LM, LY) + GM = lct_gmonth(12, 0, 0, DS, ZC, LD, LM, LY) + GY = lct_gyear(12, 0, 0, DS, ZC, LD, LM, LY) + SR = sun_long(12, 0, 0, DS, ZC, LD, LM, LY) + + A,X,Y,LA,S = e_twilight_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return S + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + SR = sun_long(UT, 0, 0, 0, 0, GD, GM, GY) + + A,X,Y,LA,S = e_twilight_l3710(GD, GM, GY, SR, DI, GP) + + if S != "OK": + return S + + X = lst_gst(LA, 0, 0, GL) + UT = gst_ut(X, 0, 0, GD, GM, GY) + + if e_gst_ut(X, 0, 0, GD, GM, GY) != "OK": + S = S + " GST to UT conversion warning" + return S + + return S + +def e_twilight_l3710(GD, GM, GY, SR, DI, GP): + """ Helper function for e_twilight(). """ + A = SR + nutat_long(GD, GM, GY) - 0.005694 + X = ec_ra(A, 0, 0, 0, 0, 0, GD, GM, GY) + Y = ec_dec(A, 0, 0, 0, 0, 0, GD, GM, GY) + LA = rise_set_local_sidereal_time_rise(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + S = e_rs(dd_dh(X), 0, 0, Y, 0, 0, DI, GP) + + if S.startswith("** c"): + S = "** lasts all night" + else: + if S.startswith("** n"): + S = "** Sun too far below horizon" + + return A,X,Y,LA,S + +def planet_coordinates(LH, LM, LS, DS, ZC, DY, MN, YR, S): + """ + Calculate several planetary properties. + + Original macro names: PlanetLong, PlanetLat, PlanetDist, PlanetHLong1, PlanetHLong2, PlanetHLat, PlanetRVect + + Arguments: + LH -- Local civil time, hour part. + LM -- Local civil time, minutes part. + LS -- Local civil time, seconds part. + DS -- Daylight Savings offset. + ZC -- Time zone correction, in hours. + DY -- Local date, day part. + MN -- Local date, month part. + YR -- Local date, year part. + S -- Planet name. + + Returns: + planet_longitude -- Ecliptic longitude, in degrees. + planet_latitude -- Ecliptic latitude, in degrees. + planet_distance_au -- Earth-planet distance, in AU. + planet_h_long1 -- Heliocentric orbital longitude, in degrees. + planet_h_long2 -- NOT USED + planet_h_lat -- NOT USED + planet_r_vect -- Sun-planet distance (length of radius vector), in AU. + """ + a11 = 178.179078 + a12 = 415.2057519 + a13 = 0.0003011 + a14 = 0 + a21 = 75.899697 + a22 = 1.5554889 + a23 = 0.0002947 + a24 = 0 + a31 = 0.20561421 + a32 = 0.00002046 + a33 = -0.00000003 + a34 = 0 + a41 = 7.002881 + a42 = 0.0018608 + a43 = -0.0000183 + a44 = 0 + a51 = 47.145944 + a52 = 1.1852083 + a53 = 0.0001739 + a54 = 0 + a61 = 0.3870986 + a62 = 6.74 + a63 = -0.42 + + b11 = 342.767053 + b12 = 162.5533664 + b13 = 0.0003097 + b14 = 0 + b21 = 130.163833 + b22 = 1.4080361 + b23 = -0.0009764 + b24 = 0 + b31 = 0.00682069 + b32 = -0.00004774 + b33 = 0.000000091 + b34 = 0 + b41 = 3.393631 + b42 = 0.0010058 + b43 = -0.000001 + b44 = 0 + b51 = 75.779647 + b52 = 0.89985 + b53 = 0.00041 + b54 = 0 + b61 = 0.7233316 + b62 = 16.92 + b63 = -4.4 + + c11 = 293.737334 + c12 = 53.17137642 + c13 = 0.0003107 + c14 = 0 + c21 = 334.218203 + c22 = 1.8407584 + c23 = 0.0001299 + c24 = -0.00000119 + c31 = 0.0933129 + c32 = 0.000092064 + c33 = -0.000000077 + c34 = 0 + c41 = 1.850333 + c42 = -0.000675 + c43 = 0.0000126 + c44 = 0 + c51 = 48.786442 + c52 = 0.7709917 + c53 = -0.0000014 + c54 = -0.00000533 + c61 = 1.5236883 + c62 = 9.36 + c63 = -1.52 + + d11 = 238.049257 + d12 = 8.434172183 + d13 = 0.0003347 + d14 = -0.00000165 + d21 = 12.720972 + d22 = 1.6099617 + d23 = 0.00105627 + d24 = -0.00000343 + d31 = 0.04833475 + d32 = 0.00016418 + d33 = -0.0000004676 + d34 = -0.0000000017 + d41 = 1.308736 + d42 = -0.0056961 + d43 = 0.0000039 + d44 = 0 + d51 = 99.443414 + d52 = 1.01053 + d53 = 0.00035222 + d54 = -0.00000851 + d61 = 5.202561 + d62 = 196.74 + d63 = -9.4 + + e11 = 266.564377 + e12 = 3.398638567 + e13 = 0.0003245 + e14 = -0.0000058 + e21 = 91.098214 + e22 = 1.9584158 + e23 = 0.00082636 + e24 = 0.00000461 + e31 = 0.05589232 + e32 = -0.0003455 + e33 = -0.000000728 + e34 = 0.00000000074 + e41 = 2.492519 + e42 = -0.0039189 + e43 = -0.00001549 + e44 = 0.00000004 + e51 = 112.790414 + e52 = 0.8731951 + e53 = -0.00015218 + e54 = -0.00000531 + e61 = 9.554747 + e62 = 165.6 + e63 = -8.88 + + f11 = 244.19747 + f12 = 1.194065406 + f13 = 0.000316 + f14 = -0.0000006 + f21 = 171.548692 + f22 = 1.4844328 + f23 = 0.0002372 + f24 = -0.00000061 + f31 = 0.0463444 + f32 = -0.00002658 + f33 = 0.000000077 + f34 = 0 + f41 = 0.772464 + f42 = 0.0006253 + f43 = 0.0000395 + f44 = 0 + f51 = 73.477111 + f52 = 0.4986678 + f53 = 0.0013117 + f54 = 0 + f61 = 19.21814 + f62 = 65.8 + f63 = -7.19 + + g11 = 84.457994 + g12 = 0.6107942056 + g13 = 0.0003205 + g14 = -0.0000006 + g21 = 46.727364 + g22 = 1.4245744 + g23 = 0.00039082 + g24 = -0.000000605 + g31 = 0.00899704 + g32 = 0.00000633 + g33 = -0.000000002 + g34 = 0 + g41 = 1.779242 + g42 = -0.0095436 + g43 = -0.0000091 + g44 = 0 + g51 = 130.681389 + g52 = 1.098935 + g53 = 0.00024987 + g54 = -0.000004718 + g61 = 30.10957 + g62 = 62.2 + g63 = -6.87 + + PL = np.empty([8,10]) + AP = np.empty(8) + + IP = 0 + B = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + A = cd_jd(GD, GM, GY) + T = ((A - 2415020) / 36525) + (B / 876600) + + u_s = S.lower() + + if u_s == "mercury": + IP = 1 + if u_s == "venus": + IP = 2 + if u_s == "mars": + IP = 3 + if u_s == "jupiter": + IP = 4 + if u_s == "saturn": + IP = 5 + if u_s == "uranus": + IP = 6 + if u_s == "neptune": + IP = 7 + if IP == 0: + return degrees(unwind(0)), degrees(unwind(0)), degrees(unwind(0)), degrees(unwind(0)), degrees(unwind(0)), degrees(unwind(0)), degrees(unwind(0)) + + I = int(1) + A0 = a11 + A1 = a12 + A2 = a13 + A3 = a14 + B0 = a21 + B1 = a22 + B2 = a23 + B3 = a24 + C0 = a31 + C1 = a32 + C2 = a33 + C3 = a34 + D0 = a41 + D1 = a42 + D2 = a43 + D3 = a44 + E0 = a51 + E1 = a52 + E2 = a53 + E3 = a54 + F = a61 + G = a62 + H = a63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 2 + A0 = b11 + A1 = b12 + A2 = b13 + A3 = b14 + B0 = b21 + B1 = b22 + B2 = b23 + B3 = b24 + C0 = b31 + C1 = b32 + C2 = b33 + C3 = b34 + D0 = b41 + D1 = b42 + D2 = b43 + D3 = b44 + E0 = b51 + E1 = b52 + E2 = b53 + E3 = b54 + F = b61 + G = b62 + H = b63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 3 + A0 = c11 + A1 = c12 + A2 = c13 + A3 = c14 + B0 = c21 + B1 = c22 + B2 = c23 + B3 = c24 + C0 = c31 + C1 = c32 + C2 = c33 + C3 = c34 + D0 = c41 + D1 = c42 + D2 = c43 + D3 = c44 + E0 = c51 + E1 = c52 + E2 = c53 + E3 = c54 + F = c61 + G = c62 + H = c63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 4 + A0 = d11 + A1 = d12 + A2 = d13 + A3 = d14 + B0 = d21 + B1 = d22 + B2 = d23 + B3 = d24 + C0 = d31 + C1 = d32 + C2 = d33 + C3 = d34 + D0 = d41 + D1 = d42 + D2 = d43 + D3 = d44 + E0 = d51 + E1 = d52 + E2 = d53 + E3 = d54 + F = d61 + G = d62 + H = d63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 5 + A0 = e11 + A1 = e12 + A2 = e13 + A3 = e14 + B0 = e21 + B1 = e22 + B2 = e23 + B3 = e24 + C0 = e31 + C1 = e32 + C2 = e33 + C3 = e34 + D0 = e41 + D1 = e42 + D2 = e43 + D3 = e44 + E0 = e51 + E1 = e52 + E2 = e53 + E3 = e54 + F = e61 + G = e62 + H = e63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 6 + A0 = f11 + A1 = f12 + A2 = f13 + A3 = f14 + B0 = f21 + B1 = f22 + B2 = f23 + B3 = f24 + C0 = f31 + C1 = f32 + C2 = f33 + C3 = f34 + D0 = f41 + D1 = f42 + D2 = f43 + D3 = f44 + E0 = f51 + E1 = f52 + E2 = f53 + E3 = f54 + F = f61 + G = f62 + H = f63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + I = 7 + A0 = g11 + A1 = g12 + A2 = g13 + A3 = g14 + B0 = g21 + B1 = g22 + B2 = g23 + B3 = g24 + C0 = g31 + C1 = g32 + C2 = g33 + C3 = g34 + D0 = g41 + D1 = g42 + D2 = g43 + D3 = g44 + E0 = g51 + E1 = g52 + E2 = g53 + E3 = g54 + F = g61 + G = g62 + H = g63 + + AA = A1 * T + B = 360 * (AA - math.floor(AA)) + C = A0 + B + (A3 * T + A2) * T * T + PL[I, 1] = C - 360 * math.floor(C / 360) + PL[I, 2] = (A1 * 0.009856263) + (A2 + A3) / 36525 + PL[I, 3] = ((B3 * T + B2) * T + B1) * T + B0 + PL[I, 4] = ((C3 * T + C2) * T + C1) * T + C0 + PL[I, 5] = ((D3 * T + D2) * T + D1) * T + D0 + PL[I, 6] = ((E3 * T + E2) * T + E1) * T + E0 + PL[I, 7] = F + PL[I, 8] = G + PL[I, 9] = H + + LI = 0 + TP = 2 * math.pi + MS = sun_mean_anomaly(LH, LM, LS, DS, ZC, DY, MN, YR) + SR = math.radians(sun_long(LH, LM, LS, DS, ZC, DY, MN, YR)) + RE = sun_dist(LH, LM, LS, DS, ZC, DY, MN, YR) + LG = SR + math.pi + + for K in range(1,3): + for J in range(1,8): + AP[J] = math.radians(PL[J, 1] - PL[J, 3] - LI * PL[J, 2]) + + QA = 0 + QB = 0 + QC = 0 + QD = 0 + QE = 0 + QF = 0 + QG = 0 + + if IP == 1: + QA,QB = planet_long_l4685(AP) + if IP == 2: + QA,QB,QC,QE = planet_long_l4735(AP,MS,T) + if IP == 3: + A,SA,CA,QC,QE,QA,QB = planet_long_l4810(AP,MS) + if IP in (4,5,6,7): + QA,QB,QC,QD,QE,QF,QG = planet_long_l4945(T,IP,PL) + + EC = PL[IP, 4] + QD + AM = AP[IP] + QE + AT = true_anomaly(AM, EC) + PVV = (PL[IP, 7] + QF) * (1 - EC * EC) / (1 + EC * math.cos(AT)) + LP = degrees(AT) + PL[IP, 3] + degrees(QC - QE) + LP = math.radians(LP) + OM = math.radians(PL[IP, 6]) + LO = LP - OM + SO = math.sin(LO) + CO = math.cos(LO) + INN = math.radians(PL[IP, 5]) + PVV = PVV + QB + SP = SO * math.sin(INN) + Y = SO * math.cos(INN) + PS = math.asin(SP) + QG + SP = math.sin(PS) + PD = math.atan2(Y, CO) + OM + math.radians(QA) + PD = unwind(PD) + CI = math.cos(PS) + RD = PVV * CI + LL = PD - LG + RH = RE * RE + PVV * PVV - 2 * RE * PVV * CI * math.cos(LL) + RH = math.sqrt(RH) + LI = RH * 0.005775518 + + if K == 1: + L0 = PD + V0 = RH + S0 = PS + P0 = PVV + VO = RH + LP1 = LP + + L1 = math.sin(LL) + l2 = math.cos(LL) + + if IP < 3: + EP = math.atan(-1 * RD * L1 / (RE - RD * l2)) + LG + math.pi + else: + EP = math.atan(RE * L1 / (RD - RE * l2)) + PD + + EP = unwind(EP) + BP = math.atan(RD * SP * math.sin(EP - PD) / (CI * RE * L1)) + + planet_longitude = degrees(unwind(EP)) + planet_latitude = degrees(unwind(BP)) + planet_distance_au = VO + planet_h_long1 = degrees(LP1) + planet_h_long2 = degrees(L0) + planet_h_lat = degrees(S0) + planet_r_vect = P0 + + return planet_longitude, planet_latitude, planet_distance_au, planet_h_long1, planet_h_long2, planet_h_lat, planet_r_vect + +def planet_long_l4685(AP): + """ Helper function for planet_long_lat() """ + QA = 0.00204 * math.cos(5 * AP[2] - 2 * AP[1] + 0.21328) + QA = QA + 0.00103 * math.cos(2 * AP[2] - AP[1] - 2.8046) + QA = QA + 0.00091 * math.cos(2 * AP[4] - AP[1] - 0.64582) + QA = QA + 0.00078 * math.cos(5 * AP[2] - 3 * AP[1] + 0.17692) + + QB = 0.000007525 * math.cos(2 * AP[4] - AP[1] + 0.925251) + QB = QB + 0.000006802 * math.cos(5 * AP[2] - 3 * AP[1] - 4.53642) + QB = QB + 0.000005457 * math.cos(2 * AP[2] - 2 * AP[1] - 1.24246) + QB = QB + 0.000003569 * math.cos(5 * AP[2] - AP[1] - 1.35699) + + return QA,QA + +def planet_long_l4735(AP,MS,T): + """ Helper function for planet_long_lat() """ + QC = 0.00077 * math.sin(4.1406 + T * 2.6227) + QC = math.radians(QC) + QE = QC + + QA = 0.00313 * math.cos(2 * MS - 2 * AP[2] - 2.587) + QA = QA + 0.00198 * math.cos(3 * MS - 3 * AP[2] + 0.044768) + QA = QA + 0.00136 * math.cos(MS - AP[2] - 2.0788) + QA = QA + 0.00096 * math.cos(3 * MS - 2 * AP[2] - 2.3721) + QA = QA + 0.00082 * math.cos(AP[4] - AP[2] - 3.6318) + + QB = 0.000022501 * math.cos(2 * MS - 2 * AP[2] - 1.01592) + QB = QB + 0.000019045 * math.cos(3 * MS - 3 * AP[2] + 1.61577) + QB = QB + 0.000006887 * math.cos(AP[4] - AP[2] - 2.06106) + QB = QB + 0.000005172 * math.cos(MS - AP[2] - 0.508065) + QB = QB + 0.00000362 * math.cos(5 * MS - 4 * AP[2] - 1.81877) + QB = QB + 0.000003283 * math.cos(4 * MS - 4 * AP[2] + 1.10851) + QB = QB + 0.000003074 * math.cos(2 * AP[4] - 2 * AP[2] - 0.962846) + + return QA,QB,QC,QE + +def planet_long_l4810(AP,MS): + """ Helper function for planet_long_lat() """ + A = 3 * AP[4] - 8 * AP[3] + 4 * MS + SA = math.sin(A) + CA = math.cos(A) + QC = -(0.01133 * SA + 0.00933 * CA) + QC = math.radians(QC) + QE = QC + + QA = 0.00705 * math.cos(AP[4] - AP[3] - 0.85448) + QA = QA + 0.00607 * math.cos(2 * AP[4] - AP[3] - 3.2873) + QA = QA + 0.00445 * math.cos(2 * AP[4] - 2 * AP[3] - 3.3492) + QA = QA + 0.00388 * math.cos(MS - 2 * AP[3] + 0.35771) + QA = QA + 0.00238 * math.cos(MS - AP[3] + 0.61256) + QA = QA + 0.00204 * math.cos(2 * MS - 3 * AP[3] + 2.7688) + QA = QA + 0.00177 * math.cos(3 * AP[3] - AP[2] - 1.0053) + QA = QA + 0.00136 * math.cos(2 * MS - 4 * AP[3] + 2.6894) + QA = QA + 0.00104 * math.cos(AP[4] + 0.30749) + + QB = 0.000053227 * math.cos(AP[4] - AP[3] + 0.717864) + QB = QB + 0.000050989 * math.cos(2 * AP[4] - 2 * AP[3] - 1.77997) + QB = QB + 0.000038278 * math.cos(2 * AP[4] - AP[3] - 1.71617) + QB = QB + 0.000015996 * math.cos(MS - AP[3] - 0.969618) + QB = QB + 0.000014764 * math.cos(2 * MS - 3 * AP[3] + 1.19768) + QB = QB + 0.000008966 * math.cos(AP[4] - 2 * AP[3] + 0.761225) + QB = QB + 0.000007914 * math.cos(3 * AP[4] - 2 * AP[3] - 2.43887) + QB = QB + 0.000007004 * math.cos(2 * AP[4] - 3 * AP[3] - 1.79573) + QB = QB + 0.00000662 * math.cos(MS - 2 * AP[3] + 1.97575) + QB = QB + 0.00000493 * math.cos(3 * AP[4] - 3 * AP[3] - 1.33069) + QB = QB + 0.000004693 * math.cos(3 * MS - 5 * AP[3] + 3.32665) + QB = QB + 0.000004571 * math.cos(2 * MS - 4 * AP[3] + 4.27086) + QB = QB + 0.000004409 * math.cos(3 * AP[4] - AP[3] - 2.02158) + + return A,SA,CA,QC,QE,QA,QB + +def planet_long_l4945(T,IP,PL): + """ Helper function for planet_long_lat() """ + QA = 0 + QB = 0 + QC = 0 + QD = 0 + QE = 0 + QF = 0 + QG = 0 + + J1 = T / 5 + 0.1 + J2 = unwind(4.14473 + 52.9691 * T) + J3 = unwind(4.641118 + 21.32991 * T) + J4 = unwind(4.250177 + 7.478172 * T) + J5 = 5 * J3 - 2 * J2 + J6 = 2 * J2 - 6 * J3 + 3 * J4 + + if IP in (1,2,3,8): + return QA,QB,QC,QD,QE,QF,QG + if IP in (4,5): + J7 = J3 - J2 + U1 = math.sin(J3) + U2 = math.cos(J3) + U3 = math.sin(2 * J3) + U4 = math.cos(2 * J3) + U5 = math.sin(J5) + U6 = math.cos(J5) + U7 = math.sin(2 * J5) + U8 = math.sin(J6) + U9 = math.sin(J7) + UA = math.cos(J7) + UB = math.sin(2 * J7) + UC = math.cos(2 * J7) + UD = math.sin(3 * J7) + UE = math.cos(3 * J7) + UF = math.sin(4 * J7) + UG = math.cos(4 * J7) + VH = math.cos(5 * J7) + + if IP == 5: + UI = math.sin(3 * J3) + UJ = math.cos(3 * J3) + UK = math.sin(4 * J3) + UL = math.cos(4 * J3) + VI = math.cos(2 * J5) + UN = math.sin(5 * J7) + J8 = J4 - J3 + UO = math.sin(2 * J8) + UP = math.cos(2 * J8) + UQ = math.sin(3 * J8) + UR = math.cos(3 * J8) + + QC = 0.007581 * U7 - 0.007986 * U8 - 0.148811 * U9 + QC = QC - (0.814181 - (0.01815 - 0.016714 * J1) * J1) * U5 + QC = QC - (0.010497 - (0.160906 - 0.0041 * J1) * J1) * U6 + QC = QC - 0.015208 * UD - 0.006339 * UF - 0.006244 * U1 + QC = QC - 0.0165 * UB * U1 - 0.040786 * UB + QC = QC + (0.008931 + 0.002728 * J1) * U9 * U1 - 0.005775 * UD * U1 + QC = QC + (0.081344 + 0.003206 * J1) * UA * U1 + 0.015019 * UC * U1 + QC = QC + (0.085581 + 0.002494 * J1) * U9 * U2 + 0.014394 * UC * U2 + QC = QC + (0.025328 - 0.003117 * J1) * UA * U2 + 0.006319 * UE * U2 + QC = QC + 0.006369 * U9 * U3 + 0.009156 * UB * U3 + 0.007525 * UQ * U3 + QC = QC - 0.005236 * UA * U4 - 0.007736 * UC * U4 - 0.007528 * UR * U4 + QC = math.radians(QC) + + QD = (-7927 + (2548 + 91 * J1) * J1) * U5 + QD = QD + (13381 + (1226 - 253 * J1) * J1) * U6 + (248 - 121 * J1) * U7 + QD = QD - (305 + 91 * J1) * VI + 412 * UB + 12415 * U1 + QD = QD + (390 - 617 * J1) * U9 * U1 + (165 - 204 * J1) * UB * U1 + QD = QD + 26599 * UA * U1 - 4687 * UC * U1 - 1870 * UE * U1 - 821 * UG * U1 + QD = QD - 377 * VH * U1 + 497 * UP * U1 + (163 - 611 * J1) * U2 + QD = QD - 12696 * U9 * U2 - 4200 * UB * U2 - 1503 * UD * U2 - 619 * UF * U2 + QD = QD - 268 * UN * U2 - (282 + 1306 * J1) * UA * U2 + QD = QD + (-86 + 230 * J1) * UC * U2 + 461 * UO * U2 - 350 * U3 + QD = QD + (2211 - 286 * J1) * U9 * U3 - 2208 * UB * U3 - 568 * UD * U3 + QD = QD - 346 * UF * U3 - (2780 + 222 * J1) * UA * U3 + QD = QD + (2022 + 263 * J1) * UC * U3 + 248 * UE * U3 + 242 * UQ * U3 + QD = QD + 467 * UR * U3 - 490 * U4 - (2842 + 279 * J1) * U9 * U4 + QD = QD + (128 + 226 * J1) * UB * U4 + 224 * UD * U4 + QD = QD + (-1594 + 282 * J1) * UA * U4 + (2162 - 207 * J1) * UC * U4 + QD = QD + 561 * UE * U4 + 343 * UG * U4 + 469 * UQ * U4 - 242 * UR * U4 + QD = QD - 205 * U9 * UI + 262 * UD * UI + 208 * UA * UJ - 271 * UE * UJ + QD = QD - 382 * UE * UK - 376 * UD * UL + QD = QD * 0.0000001 + + VK = (0.077108 + (0.007186 - 0.001533 * J1) * J1) * U5 + VK = VK - 0.007075 * U9 + VK = VK + (0.045803 - (0.014766 + 0.000536 * J1) * J1) * U6 + VK = VK - 0.072586 * U2 - 0.075825 * U9 * U1 - 0.024839 * UB * U1 + VK = VK - 0.008631 * UD * U1 - 0.150383 * UA * U2 + VK = VK + 0.026897 * UC * U2 + 0.010053 * UE * U2 + VK = VK - (0.013597 + 0.001719 * J1) * U9 * U3 + 0.011981 * UB * U4 + VK = VK - (0.007742 - 0.001517 * J1) * UA * U3 + VK = VK + (0.013586 - 0.001375 * J1) * UC * U3 + VK = VK - (0.013667 - 0.001239 * J1) * U9 * U4 + VK = VK + (0.014861 + 0.001136 * J1) * UA * U4 + VK = VK - (0.013064 + 0.001628 * J1) * UC * U4 + QE = QC - (math.radians(VK) / PL[IP, 4]) + + QF = 572 * U5 - 1590 * UB * U2 + 2933 * U6 - 647 * UD * U2 + QF = QF + 33629 * UA - 344 * UF * U2 - 3081 * UC + 2885 * UA * U2 + QF = QF - 1423 * UE + (2172 + 102 * J1) * UC * U2 - 671 * UG + QF = QF + 296 * UE * U2 - 320 * VH - 267 * UB * U3 + 1098 * U1 + QF = QF - 778 * UA * U3 - 2812 * U9 * U1 + 495 * UC * U3 + 688 * UB * U1 + QF = QF + 250 * UE * U3 - 393 * UD * U1 - 856 * U9 * U4 - 228 * UF * U1 + QF = QF + 441 * UB * U4 + 2138 * UA * U1 + 296 * UC * U4 - 999 * UC * U1 + QF = QF + 211 * UE * U4 - 642 * UE * U1 - 427 * U9 * UI - 325 * UG * U1 + QF = QF + 398 * UD * UI - 890 * U2 + 344 * UA * UJ + 2206 * U9 * U2 + QF = QF - 427 * UE * UJ + QF = QF * 0.000001 + + QG = 0.000747 * UA * U1 + 0.001069 * UA * U2 + 0.002108 * UB * U3 + QG = QG + 0.001261 * UC * U3 + 0.001236 * UB * U4 - 0.002075 * UC * U4 + QG = math.radians(QG) + + return QA,QB,QC,QD,QE,QF,QG + + QC = (0.331364 - (0.010281 + 0.004692 * J1) * J1) * U5 + QC = QC + (0.003228 - (0.064436 - 0.002075 * J1) * J1) * U6 + QC = QC - (0.003083 + (0.000275 - 0.000489 * J1) * J1) * U7 + QC = QC + 0.002472 * U8 + 0.013619 * U9 + 0.018472 * UB + QC = QC + 0.006717 * UD + 0.002775 * UF + 0.006417 * UB * U1 + QC = QC + (0.007275 - 0.001253 * J1) * U9 * U1 + 0.002439 * UD * U1 + QC = QC - (0.035681 + 0.001208 * J1) * U9 * U2 - 0.003767 * UC * U1 + QC = QC - (0.033839 + 0.001125 * J1) * UA * U1 - 0.004261 * UB * U2 + QC = QC + (0.001161 * J1 - 0.006333) * UA * U2 + 0.002178 * U2 + QC = QC - 0.006675 * UC * U2 - 0.002664 * UE * U2 - 0.002572 * U9 * U3 + QC = QC - 0.003567 * UB * U3 + 0.002094 * UA * U4 + 0.003342 * UC * U4 + QC = math.radians(QC) + + QD = (3606 + (130 - 43 * J1) * J1) * U5 + (1289 - 580 * J1) * U6 + QD = QD - 6764 * U9 * U1 - 1110 * UB * U1 - 224 * UD * U1 - 204 * U1 + QD = QD + (1284 + 116 * J1) * UA * U1 + 188 * UC * U1 + QD = QD + (1460 + 130 * J1) * U9 * U2 + 224 * UB * U2 - 817 * U2 + QD = QD + 6074 * U2 * UA + 992 * UC * U2 + 508 * UE * U2 + 230 * UG * U2 + QD = QD + 108 * VH * U2 - (956 + 73 * J1) * U9 * U3 + 448 * UB * U3 + QD = QD + 137 * UD * U3 + (108 * J1 - 997) * UA * U3 + 480 * UC * U3 + QD = QD + 148 * UE * U3 + (99 * J1 - 956) * U9 * U4 + 490 * UB * U4 + QD = QD + 158 * UD * U4 + 179 * U4 + (1024 + 75 * J1) * UA * U4 + QD = QD - 437 * UC * U4 - 132 * UE * U4 + QD = QD * 0.0000001 + + VK = (0.007192 - 0.003147 * J1) * U5 - 0.004344 * U1 + VK = VK + (J1 * (0.000197 * J1 - 0.000675) - 0.020428) * U6 + VK = VK + 0.034036 * UA * U1 + (0.007269 + 0.000672 * J1) * U9 * U1 + VK = VK + 0.005614 * UC * U1 + 0.002964 * UE * U1 + 0.037761 * U9 * U2 + VK = VK + 0.006158 * UB * U2 - 0.006603 * UA * U2 - 0.005356 * U9 * U3 + VK = VK + 0.002722 * UB * U3 + 0.004483 * UA * U3 + VK = VK - 0.002642 * UC * U3 + 0.004403 * U9 * U4 + VK = VK - 0.002536 * UB * U4 + 0.005547 * UA * U4 - 0.002689 * UC * U4 + QE = QC - (math.radians(VK) / PL[IP, 4]) + + QF = 205 * UA - 263 * U6 + 693 * UC + 312 * UE + 147 * UG + 299 * U9 * U1 + QF = QF + 181 * UC * U1 + 204 * UB * U2 + 111 * UD * U2 - 337 * UA * U2 + QF = QF - 111 * UC * U2 + QF = QF * 0.000001 + + return QA,QB,QC,QD,QE,QF,QG + + if IP in (6,7): + J8 = unwind(1.46205 + 3.81337 * T) + J9 = 2 * J8 - J4 + VJ = math.sin(J9) + UU = math.cos(J9) + UV = math.sin(2 * J9) + UW = math.cos(2 * J9) + + if IP == 7: + JA = J8 - J2 + JB = J8 - J3 + JC = J8 - J4 + QC = (0.001089 * J1 - 0.589833) * VJ + QC = QC + (0.004658 * J1 - 0.056094) * UU - 0.024286 * UV + QC = math.radians(QC) + + VK = 0.024039 * VJ - 0.025303 * UU + 0.006206 * UV + VK = VK - 0.005992 * UW + QE = QC - (math.radians(VK) / PL[IP, 4]) + + QD = 4389 * VJ + 1129 * UV + 4262 * UU + 1089 * UW + QD = QD * 0.0000001 + + QF = 8189 * UU - 817 * VJ + 781 * UW + QF = QF * 0.000001 + + VD = math.sin(2 * JC) + VE = math.cos(2 * JC) + VF = math.sin(J8) + VG = math.cos(J8) + QA = -0.009556 * math.sin(JA) - 0.005178 * math.sin(JB) + QA = QA + 0.002572 * VD - 0.002972 * VE * VF - 0.002833 * VD * VG + + QG = 0.000336 * VE * VF + 0.000364 * VD * VG + QG = math.radians(QG) + + QB = -40596 + 4992 * math.cos(JA) + 2744 * math.cos(JB) + QB = QB + 2044 * math.cos(JC) + 1051 * VE + QB = QB * 0.000001 + + return QA,QB,QC,QD,QE,QF,QG + + JA = J4 - J2 + JB = J4 - J3 + JC = J8 - J4 + QC = (0.864319 - 0.001583 * J1) * VJ + QC = QC + (0.082222 - 0.006833 * J1) * UU + 0.036017 * UV + QC = QC - 0.003019 * UW + 0.008122 * math.sin(J6) + QC = math.radians(QC) + + VK = 0.120303 * VJ + 0.006197 * UV + VK = VK + (0.019472 - 0.000947 * J1) * UU + QE = QC - (math.radians(VK) / PL[IP, 4]) + + QD = (163 * J1 - 3349) * VJ + 20981 * UU + 1311 * UW + QD = QD * 0.0000001 + + QF = -0.003825 * UU + + QA = (-0.038581 + (0.002031 - 0.00191 * J1) * J1) * math.cos(J4 + JB) + QA = QA + (0.010122 - 0.000988 * J1) * math.sin(J4 + JB) + A = (0.034964 - (0.001038 - 0.000868 * J1) * J1) * math.cos(2 * J4 + JB) + QA = A + QA + 0.005594 * math.sin(J4 + 3 * JC) - 0.014808 * math.sin(JA) + QA = QA - 0.005794 * math.sin(JB) + 0.002347 * math.cos(JB) + QA = QA + 0.009872 * math.sin(JC) + 0.008803 * math.sin(2 * JC) + QA = QA - 0.004308 * math.sin(3 * JC) + + UX = math.sin(JB) + UY = math.cos(JB) + UZ = math.sin(J4) + VA = math.cos(J4) + VB = math.sin(2 * J4) + VC = math.cos(2 * J4) + QG = (0.000458 * UX - 0.000642 * UY - 0.000517 * math.cos(4 * JC)) * UZ + QG = QG - (0.000347 * UX + 0.000853 * UY + 0.000517 * math.sin(4 * JB)) * VA + QG = QG + 0.000403 * (math.cos(2 * JC) * VB + math.sin(2 * JC) * VC) + QG = math.radians(QG) + + QB = -25948 + 4985 * math.cos(JA) - 1230 * VA + 3354 * UY + QB = QB + 904 * math.cos(2 * JC) + 894 * (math.cos(JC) - math.cos(3 * JC)) + QB = QB + (5795 * VA - 1165 * UZ + 1388 * VC) * UX + QB = QB + (1351 * VA + 5702 * UZ + 1388 * VB) * UY + QB = QB * 0.000001 + + return QA,QB,QC,QD,QE,QF,QG + +def solve_cubic(W): + """ + For W, in radians, return S, also in radians. + + Original macro name: SolveCubic + """ + S = W / 3 + + while 1 == 1: + S2 = S * S + D = (S2 + 3) * S - W + + if abs(D) < 0.000001: + return S + + S = ((2 * S * S2) + W) / (3 * (S2 + 1)) + +def p_comet_long_lat_dist(LH, LM, LS, DS, ZC, DY, MN, YR, TD, TM, TY, Q, I, P, N): + """ + Calculate longitude, latitude, and distance of parabolic-orbit comet. + + Original macro names: PcometLong, PcometLat, PcometDist + + Arguments: + LH -- Local civil time, hour part. + LM -- Local civil time, minutes part. + LS -- Local civil time, seconds part. + DS -- Daylight Savings offset. + ZC -- Time zone correction, in hours. + DY -- Local date, day part. + MN -- Local date, month part. + YR -- Local date, year part. + TD -- Perihelion epoch (day) + TM -- Perihelion epoch (month) + TY -- Perihelion epoch (year) + Q -- q (AU) + I -- Inclination (degrees) + P -- Perihelion (degrees) + N -- Node (degrees) + + Returns: + comet_long_deg -- Comet longitude (degrees) + comet_lat_deg -- Comet lat (degrees) + comet_dist_au -- Comet distance from Earth (AU) + """ + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + TPE = (UT / 365.242191) + cd_jd(GD, GM, GY) - cd_jd(TD, TM, TY) + LG = math.radians(sun_long(LH, LM, LS, DS, ZC, DY, MN, YR) + 180) + RE = sun_dist(LH, LM, LS, DS, ZC, DY, MN, YR) + + LI = 0 + for K in range(1,3): + S = solve_cubic(0.0364911624 * TPE / (Q * math.sqrt(Q))) + NU = 2 * math.atan(S) + R = Q * (1 + S * S) + L = NU + math.radians(P) + S1 = math.sin(L) + C1 = math.cos(L) + I1 = math.radians(I) + S2 = S1 * math.sin(I1) + PS = math.asin(S2) + Y = S1 * math.cos(I1) + LC = math.atan2(Y, C1) + math.radians(N) + C2 = math.cos(PS) + RD = R * C2 + LL = LC - LG + C3 = math.cos(LL) + S3 = math.sin(LL) + RH = math.sqrt((RE * RE) + (R * R) - (2 * RE * RD * C3 * math.cos(PS))) + if K == 1: + RH2 = math.sqrt((RE * RE) + (R * R) - (2 * RE * R * math.cos(PS) * math.cos(L + math.radians(N) - LG))) + + LI = RH * 0.005775518 + + if RD < RE: + EP = math.atan((-RD * S3) / (RE - (RD * C3))) + LG + 3.141592654 + else: + EP = math.atan((RE * S3) / (RD - (RE * C3))) + LC + + EP = unwind(EP) + TB = (RD * S2 * math.sin(EP - LC)) / (C2 * RE * S3) + BP = math.atan(TB) + + comet_long_deg = degrees(EP) + comet_lat_deg = degrees(BP) + comet_dist_au = RH2 + + return comet_long_deg, comet_lat_deg, comet_dist_au + +def moon_long_lat_hp(LH, LM, LS, DS, ZC, DY, MN, YR): + """ + Calculate longitude, latitude, and horizontal parallax of the Moon. + + Original macro names: MoonLong, MoonLat, MoonHP + + Arguments: + LH -- Local civil time, hour part. + LM -- Local civil time, minutes part. + LS -- Local civil time, seconds part. + DS -- Daylight Savings offset. + ZC -- Time zone correction, in hours. + DY -- Local date, day part. + MN -- Local date, month part. + YR -- Local date, year part. + + Returns: + moon_long_deg -- Moon longitude (degrees) + moon_lat_deg -- Moon latitude (degrees) + moon_hor_para -- Moon horizontal parallax (degrees) + """ + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + T = ((cd_jd(GD, GM, GY) - 2415020) / 36525) + (UT / 876600) + T2 = T * T + + M1 = 27.32158213 + M2 = 365.2596407 + M3 = 27.55455094 + M4 = 29.53058868 + M5 = 27.21222039 + M6 = 6798.363307 + Q = cd_jd(GD, GM, GY) - 2415020 + (UT / 24) + M1 = Q / M1 + M2 = Q / M2 + M3 = Q / M3 + M4 = Q / M4 + M5 = Q / M5 + M6 = Q / M6 + M1 = 360 * (M1 - math.floor(M1)) + M2 = 360 * (M2 - math.floor(M2)) + M3 = 360 * (M3 - math.floor(M3)) + M4 = 360 * (M4 - math.floor(M4)) + M5 = 360 * (M5 - math.floor(M5)) + M6 = 360 * (M6 - math.floor(M6)) + + ML = 270.434164 + M1 - (0.001133 - 0.0000019 * T) * T2 + MS = 358.475833 + M2 - (0.00015 + 0.0000033 * T) * T2 + MD = 296.104608 + M3 + (0.009192 + 0.0000144 * T) * T2 + ME1 = 350.737486 + M4 - (0.001436 - 0.0000019 * T) * T2 + MF = 11.250889 + M5 - (0.003211 + 0.0000003 * T) * T2 + NA = 259.183275 - M6 + (0.002078 + 0.0000022 * T) * T2 + A = math.radians(51.2 + 20.2 * T) + S1 = math.sin(A) + S2 = math.sin(math.radians(NA)) + B = 346.56 + (132.87 - 0.0091731 * T) * T + S3 = 0.003964 * math.sin(math.radians(B)) + C = math.radians(NA + 275.05 - 2.3 * T) + S4 = math.sin(C) + ML = ML + 0.000233 * S1 + S3 + 0.001964 * S2 + MS = MS - 0.001778 * S1 + MD = MD + 0.000817 * S1 + S3 + 0.002541 * S2 + MF = MF + S3 - 0.024691 * S2 - 0.004328 * S4 + ME1 = ME1 + 0.002011 * S1 + S3 + 0.001964 * S2 + E = 1 - (0.002495 + 0.00000752 * T) * T + E2 = E * E + ML = math.radians(ML) + MS = math.radians(MS) + NA = math.radians(NA) + ME1 = math.radians(ME1) + MF = math.radians(MF) + MD = math.radians(MD) + + # Longitude-specific + L = 6.28875 * math.sin(MD) + 1.274018 * math.sin(2 * ME1 - MD) + L = L + 0.658309 * math.sin(2 * ME1) + 0.213616 * math.sin(2 * MD) + L = L - E * 0.185596 * math.sin(MS) - 0.114336 * math.sin(2 * MF) + L = L + 0.058793 * math.sin(2 * (ME1 - MD)) + L = L + 0.057212 * E * math.sin(2 * ME1 - MS - MD) + 0.05332 * math.sin(2 * ME1 + MD) + L = L + 0.045874 * E * math.sin(2 * ME1 - MS) + 0.041024 * E * math.sin(MD - MS) + L = L - 0.034718 * math.sin(ME1) - E * 0.030465 * math.sin(MS + MD) + L = L + 0.015326 * math.sin(2 * (ME1 - MF)) - 0.012528 * math.sin(2 * MF + MD) + L = L - 0.01098 * math.sin(2 * MF - MD) + 0.010674 * math.sin(4 * ME1 - MD) + L = L + 0.010034 * math.sin(3 * MD) + 0.008548 * math.sin(4 * ME1 - 2 * MD) + L = L - E * 0.00791 * math.sin(MS - MD + 2 * ME1) - E * 0.006783 * math.sin(2 * ME1 + MS) + L = L + 0.005162 * math.sin(MD - ME1) + E * 0.005 * math.sin(MS + ME1) + L = L + 0.003862 * math.sin(4 * ME1) + E * 0.004049 * math.sin(MD - MS + 2 * ME1) + L = L + 0.003996 * math.sin(2 * (MD + ME1)) + 0.003665 * math.sin(2 * ME1 - 3 * MD) + L = L + E * 0.002695 * math.sin(2 * MD - MS) + 0.002602 * math.sin(MD - 2 * (MF + ME1)) + L = L + E * 0.002396 * math.sin(2 * (ME1 - MD) - MS) - 0.002349 * math.sin(MD + ME1) + L = L + E2 * 0.002249 * math.sin(2 * (ME1 - MS)) - E * 0.002125 * math.sin(2 * MD + MS) + L = L - E2 * 0.002079 * math.sin(2 * MS) + E2 * 0.002059 * math.sin(2 * (ME1 - MS) - MD) + L = L - 0.001773 * math.sin(MD + 2 * (ME1 - MF)) - 0.001595 * math.sin(2 * (MF + ME1)) + L = L + E * 0.00122 * math.sin(4 * ME1 - MS - MD) - 0.00111 * math.sin(2 * (MD + MF)) + L = L + 0.000892 * math.sin(MD - 3 * ME1) - E * 0.000811 * math.sin(MS + MD + 2 * ME1) + L = L + E * 0.000761 * math.sin(4 * ME1 - MS - 2 * MD) + L = L + E2 * 0.000704 * math.sin(MD - 2 * (MS + ME1)) + L = L + E * 0.000693 * math.sin(MS - 2 * (MD - ME1)) + L = L + E * 0.000598 * math.sin(2 * (ME1 - MF) - MS) + L = L + 0.00055 * math.sin(MD + 4 * ME1) + 0.000538 * math.sin(4 * MD) + L = L + E * 0.000521 * math.sin(4 * ME1 - MS) + 0.000486 * math.sin(2 * MD - ME1) + L = L + E2 * 0.000717 * math.sin(MD - 2 * MS) + MM = unwind(ML + math.radians(L)) + + # Latitude-specific + G = 5.128189 * math.sin(MF) + 0.280606 * math.sin(MD + MF) + G = G + 0.277693 * math.sin(MD - MF) + 0.173238 * math.sin(2 * ME1 - MF) + G = G + 0.055413 * math.sin(2 * ME1 + MF - MD) + 0.046272 * math.sin(2 * ME1 - MF - MD) + G = G + 0.032573 * math.sin(2 * ME1 + MF) + 0.017198 * math.sin(2 * MD + MF) + G = G + 0.009267 * math.sin(2 * ME1 + MD - MF) + 0.008823 * math.sin(2 * MD - MF) + G = G + E * 0.008247 * math.sin(2 * ME1 - MS - MF) + 0.004323 * math.sin(2 * (ME1 - MD) - MF) + G = G + 0.0042 * math.sin(2 * ME1 + MF + MD) + E * 0.003372 * math.sin(MF - MS - 2 * ME1) + G = G + E * 0.002472 * math.sin(2 * ME1 + MF - MS - MD) + G = G + E * 0.002222 * math.sin(2 * ME1 + MF - MS) + G = G + E * 0.002072 * math.sin(2 * ME1 - MF - MS - MD) + G = G + E * 0.001877 * math.sin(MF - MS + MD) + 0.001828 * math.sin(4 * ME1 - MF - MD) + G = G - E * 0.001803 * math.sin(MF + MS) - 0.00175 * math.sin(3 * MF) + G = G + E * 0.00157 * math.sin(MD - MS - MF) - 0.001487 * math.sin(MF + ME1) + G = G - E * 0.001481 * math.sin(MF + MS + MD) + E * 0.001417 * math.sin(MF - MS - MD) + G = G + E * 0.00135 * math.sin(MF - MS) + 0.00133 * math.sin(MF - ME1) + G = G + 0.001106 * math.sin(MF + 3 * MD) + 0.00102 * math.sin(4 * ME1 - MF) + G = G + 0.000833 * math.sin(MF + 4 * ME1 - MD) + 0.000781 * math.sin(MD - 3 * MF) + G = G + 0.00067 * math.sin(MF + 4 * ME1 - 2 * MD) + 0.000606 * math.sin(2 * ME1 - 3 * MF) + G = G + 0.000597 * math.sin(2 * (ME1 + MD) - MF) + G = G + E * 0.000492 * math.sin(2 * ME1 + MD - MS - MF) + 0.00045 * math.sin(2 * (MD - ME1) - MF) + G = G + 0.000439 * math.sin(3 * MD - MF) + 0.000423 * math.sin(MF + 2 * (ME1 + MD)) + G = G + 0.000422 * math.sin(2 * ME1 - MF - 3 * MD) - E * 0.000367 * math.sin(MS + MF + 2 * ME1 - MD) + G = G - E * 0.000353 * math.sin(MS + MF + 2 * ME1) + 0.000331 * math.sin(MF + 4 * ME1) + G = G + E * 0.000317 * math.sin(2 * ME1 + MF - MS + MD) + G = G + E2 * 0.000306 * math.sin(2 * (ME1 - MS) - MF) - 0.000283 * math.sin(MD + 3 * MF) + W1 = 0.0004664 * math.cos(NA) + W2 = 0.0000754 * math.cos(C) + BM = math.radians(G) * (1 - W1 - W2) + + # Horizontal parallax-specific + PM = 0.950724 + 0.051818 * math.cos(MD) + 0.009531 * math.cos(2 * ME1 - MD) + PM = PM + 0.007843 * math.cos(2 * ME1) + 0.002824 * math.cos(2 * MD) + PM = PM + 0.000857 * math.cos(2 * ME1 + MD) + E * 0.000533 * math.cos(2 * ME1 - MS) + PM = PM + E * 0.000401 * math.cos(2 * ME1 - MD - MS) + PM = PM + E * 0.00032 * math.cos(MD - MS) - 0.000271 * math.cos(ME1) + PM = PM - E * 0.000264 * math.cos(MS + MD) - 0.000198 * math.cos(2 * MF - MD) + PM = PM + 0.000173 * math.cos(3 * MD) + 0.000167 * math.cos(4 * ME1 - MD) + PM = PM - E * 0.000111 * math.cos(MS) + 0.000103 * math.cos(4 * ME1 - 2 * MD) + PM = PM - 0.000084 * math.cos(2 * MD - 2 * ME1) - E * 0.000083 * math.cos(2 * ME1 + MS) + PM = PM + 0.000079 * math.cos(2 * ME1 + 2 * MD) + 0.000072 * math.cos(4 * ME1) + PM = PM + E * 0.000064 * math.cos(2 * ME1 - MS + MD) - E * 0.000063 * math.cos(2 * ME1 + MS - MD) + PM = PM + E * 0.000041 * math.cos(MS + ME1) + E * 0.000035 * math.cos(2 * MD - MS) + PM = PM - 0.000033 * math.cos(3 * MD - 2 * ME1) - 0.00003 * math.cos(MD + ME1) + PM = PM - 0.000029 * math.cos(2 * (MF - ME1)) - E * 0.000029 * math.cos(2 * MD + MS) + PM = PM + E2 * 0.000026 * math.cos(2 * (ME1 - MS)) - 0.000023 * math.cos(2 * (MF - ME1) + MD) + PM = PM + E * 0.000019 * math.cos(4 * ME1 - MS - MD) + + moon_long_deg = degrees(MM) + moon_lat_deg = degrees(BM) + moon_hor_para = PM + + return moon_long_deg, moon_lat_deg, moon_hor_para + +def moon_phase(LH, LM, LS, DS, ZC, DY, MN, YR): + """ + Calculate current phase of Moon. + + Original macro name: MoonPhase + """ + moon_long_deg, moon_lat_deg, moon_hor_para = moon_long_lat_hp(LH, LM, LS, DS, ZC, DY, MN, YR) + + CD = math.cos(math.radians(moon_long_deg - sun_long(LH, LM, LS, DS, ZC, DY, MN, YR))) * math.cos(math.radians(moon_lat_deg)) + D = math.acos(CD) + SD = math.sin(D) + I = 0.1468 * SD * (1 - 0.0549 * math.sin(moon_mean_anomaly(LH, LM, LS, DS, ZC, DY, MN, YR))) + I = I / (1 - 0.0167 * math.sin(sun_mean_anomaly(LH, LM, LS, DS, ZC, DY, MN, YR))) + I = 3.141592654 - D - math.radians(I) + K = (1 + math.cos(I)) / 2 + + return round(K,2) + +def moon_mean_anomaly(LH, LM, LS, DS, ZC, DY, MN, YR): + """ + Calculate the Moon's mean anomaly. + + Original macro name: MoonMeanAnomaly + """ + UT = lct_ut(LH, LM, LS, DS, ZC, DY, MN, YR) + GD = lct_gday(LH, LM, LS, DS, ZC, DY, MN, YR) + GM = lct_gmonth(LH, LM, LS, DS, ZC, DY, MN, YR) + GY = lct_gyear(LH, LM, LS, DS, ZC, DY, MN, YR) + T = ((cd_jd(GD, GM, GY) - 2415020) / 36525) + (UT / 876600) + T2 = T * T + + M1 = 27.32158213 + M2 = 365.2596407 + M3 = 27.55455094 + M4 = 29.53058868 + M5 = 27.21222039 + M6 = 6798.363307 + Q = cd_jd(GD, GM, GY) - 2415020 + (UT / 24) + M1 = Q / M1 + M2 = Q / M2 + M3 = Q / M3 + M4 = Q / M4 + M5 = Q / M5 + M6 = Q / M6 + M1 = 360 * (M1 - math.floor(M1)) + M2 = 360 * (M2 - math.floor(M2)) + M3 = 360 * (M3 - math.floor(M3)) + M4 = 360 * (M4 - math.floor(M4)) + M5 = 360 * (M5 - math.floor(M5)) + M6 = 360 * (M6 - math.floor(M6)) + + ML = 270.434164 + M1 - (0.001133 - 0.0000019 * T) * T2 + MS = 358.475833 + M2 - (0.00015 + 0.0000033 * T) * T2 + MD = 296.104608 + M3 + (0.009192 + 0.0000144 * T) * T2 + ME1 = 350.737486 + M4 - (0.001436 - 0.0000019 * T) * T2 + MF = 11.250889 + M5 - (0.003211 + 0.0000003 * T) * T2 + NA = 259.183275 - M6 + (0.002078 + 0.0000022 * T) * T2 + A = math.radians(51.2 + 20.2 * T) + S1 = math.sin(A) + S2 = math.sin(math.radians(NA)) + B = 346.56 + (132.87 - 0.0091731 * T) * T + S3 = 0.003964 * math.sin(math.radians(B)) + C = math.radians(NA + 275.05 - 2.3 * T) + S4 = math.sin(C) + ML = ML + 0.000233 * S1 + S3 + 0.001964 * S2 + MS = MS - 0.001778 * S1 + MD = MD + 0.000817 * S1 + S3 + 0.002541 * S2 + + return math.radians(MD) + +def new_moon(DS, ZC, DY, MN, YR): + """ + Calculate Julian date of New Moon. + + Original macro name: NewMoon + + Arguments: + DS -- Daylight Savings offset. + ZC -- Time zone correction, in hours. + DY -- Local date, day part. + MN -- Local date, month part. + YR -- Local date, year part. + """ + D0 = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + M0 = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + Y0 = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + + if Y0 < 0: + Y0 = Y0 + 1 + + J0 = cd_jd(0, 1, Y0) - 2415020 + DJ = cd_jd(D0, M0, Y0) - 2415020 + K = lint(((Y0 - 1900 + ((DJ - J0) / 365)) * 12.3685) + 0.5) + TN = K / 1236.85 + TF = (K + 0.5) / 1236.85 + T = TN + A,B,F = new_moon_full_moon_l6855(K,T) + NI = A + NF = B + NB = F + T = TF + K = K + 0.5 + A,B,F = new_moon_full_moon_l6855(K,T) + FI = A + FF = B + FB = F + + return NI + 2415020 + NF + +def full_moon(DS, ZC, DY, MN, YR): + """ + Calculate Julian date of Full Moon. + + Original macro name: FullMoon + + Arguments: + DS -- Daylight Savings offset. + ZC -- Time zone correction, in hours. + DY -- Local date, day part. + MN -- Local date, month part. + YR -- Local date, year part. + """ + D0 = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + M0 = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + Y0 = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + + if Y0 < 0: + Y0 = Y0 + 1 + + J0 = cd_jd(0, 1, Y0) - 2415020 + DJ = cd_jd(D0, M0, Y0) - 2415020 + K = lint(((Y0 - 1900 + ((DJ - J0) / 365)) * 12.3685) + 0.5) + TN = K / 1236.85 + TF = (K + 0.5) / 1236.85 + T = TN + A,B,F = new_moon_full_moon_l6855(K,T) + NI = A + NF = B + NB = F + T = TF + K = K + 0.5 + A,B,F = new_moon_full_moon_l6855(K,T) + FI = A + FF = B + FB = F + + return FI + 2415020 + FF + +def new_moon_full_moon_l6855(K,T): + """ Helper function for new_moon() and full_moon() """ + T2 = T * T + E = 29.53 * K + C = 166.56 + (132.87 - 0.009173 * T) * T + C = math.radians(C) + B = 0.00058868 * K + (0.0001178 - 0.000000155 * T) * T2 + B = B + 0.00033 * math.sin(C) + 0.75933 + A = K / 12.36886 + A1 = 359.2242 + 360 * fract(A) - (0.0000333 + 0.00000347 * T) * T2 + A2 = 306.0253 + 360 * fract(K / 0.9330851) + A2 = A2 + (0.0107306 + 0.00001236 * T) * T2 + A = K / 0.9214926 + F = 21.2964 + 360 * fract(A) - (0.0016528 + 0.00000239 * T) * T2 + A1 = unwind_deg(A1) + A2 = unwind_deg(A2) + F = unwind_deg(F) + A1 = math.radians(A1) + A2 = math.radians(A2) + F = math.radians(F) + + DD = (0.1734 - 0.000393 * T) * math.sin(A1) + 0.0021 * math.sin(2 * A1) + DD = DD - 0.4068 * math.sin(A2) + 0.0161 * math.sin(2 * A2) - 0.0004 * math.sin(3 * A2) + DD = DD + 0.0104 * math.sin(2 * F) - 0.0051 * math.sin(A1 + A2) + DD = DD - 0.0074 * math.sin(A1 - A2) + 0.0004 * math.sin(2 * F + A1) + DD = DD - 0.0004 * math.sin(2 * F - A1) - 0.0006 * math.sin(2 * F + A2) + 0.001 * math.sin(2 * F - A2) + DD = DD + 0.0005 * math.sin(A1 + 2 * A2) + E1 = math.floor(E) + B = B + DD + (E - E1) + B1 = math.floor(B) + A = E1 + B1 + B = B - B1 + + return A,B,F + +def moon_rise_lct(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local time of moonrise. + + Original macro name: MoonRiseLCT + + Returns: + hours + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_rise_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_rise_lct_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_rise_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + + return LCT + +def moon_rise_lct_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_rise_lct """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_rise_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_rise_lct """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_rise(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + if e_rs(P, 0, 0, Q, 0, 0, degrees(DI), GLat) != "OK": + LCT = -99 + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT + +def e_moon_rise(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Moonrise calculation status. + + Original macro name: eMoonRise + """ + S4 = "OK" + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + + MM,BM,PM,DP,TH,DI,P,Q,LU,S1 = e_moon_rise_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + LA = LU + + if S1 != "OK": + S4 = S1 + return S4 + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + S3 = e_gst_ut(X, 0, 0, GDY, GMN, GYR) + + if S3 != "OK": + S4 = "GST conversion: " + S3 + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = e_moon_rise_l6680(S3,G1,UT,DS,ZC,GDY,GMN,GYR,DY1,MN1,YR1) + MM,BM,PM,DP,TH,DI,P,Q,LU,S1 = e_moon_rise_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + LA = LU + + if S1 != "OK": + S4 = S1 + return S4 + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + S3 = e_gst_ut(X, 0, 0, GDY, GMN, GYR) + + if S3 != "OK": + S4 = "GST conversion: " + S3 + + return S4 + +def e_moon_rise_l6680(S3,G1,UT,DS,ZC,GDY,GMN,GYR,DY1,MN1,YR1): + """ Helper function for e_moon_rise() """ + if S3 != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def e_moon_rise_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for e_moon_rise() """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_rise(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + S1 = e_rs(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,S1 + +def moon_rise_lc_dmy(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local date of moonrise. + + Original macro names: MoonRiseLcDay, MoonRiseLcMonth, MoonRiseLcYear + + Returns: + Local date (day) + Local date (month) + Local date (year) + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_rise_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT,LCT,LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_rise_lc_dmy_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_rise_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT,LCT,LCT + LA = LU + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + + return DY1,MN1,YR1 + +def moon_rise_lc_dmy_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_rise_lc_dmy """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_rise_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_rise_lc_dmy """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_rise(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT + +def moon_rise_az(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local azimuth of moonrise. + + Original macro name: MoonRiseAz + + Returns: + degrees + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU = moon_rise_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_rise_az_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU = moon_rise_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + AA = AU + + AU = AA + + return AU + +def moon_rise_az_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_rise_az """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_rise_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_rise_az """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_rise(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + AU = rise_set_azimuth_rise(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU + +def moon_set_lct(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local time of moonset. + + Original macro name: MoonSetLCT + + Returns: + hours + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_set_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_set_lct_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_set_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + + return LCT + +def moon_set_lct_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_set_lct """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_set_lct_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_set_lct """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_set(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + if e_rs(P, 0, 0, Q, 0, 0, degrees(DI), GLat) != "OK": + LCT = -99 + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT + +def e_moon_set(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Moonset calculation status. + + Original macro name: eMoonSet + """ + S4 = "OK" + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + + MM,BM,PM,DP,TH,DI,P,Q,LU,S1 = e_moon_set_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + LA = LU + + if S1 != "OK": + S4 = S1 + return S4 + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + S3 = e_gst_ut(X, 0, 0, GDY, GMN, GYR) + + if S3 != "OK": + S4 = "GST conversion: " + S3 + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = e_moon_set_l6680(X,S3,G1,UT,DS,ZC,GDY,GMN,GYR,DY1,MN1,YR1) + MM,BM,PM,DP,TH,DI,P,Q,LU,S1 = e_moon_set_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + LA = LU + + if S1 != "OK": + S4 = S1 + return S4 + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + S3 = e_gst_ut(X, 0, 0, GDY, GMN, GYR) + + if S3 != "OK": + S4 = "GST conversion: " + S3 + + return S4 + +def e_moon_set_l6680(X,S3,G1,UT,DS,ZC,GDY,GMN,GYR,DY1,MN1,YR1): + """ Helper function for e_moon_set() """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def e_moon_set_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for e_moon_set() """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_set(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + S1 = e_rs(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,S1 + +def moon_set_lc_dmy(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local date of moonset. + + Original macro names: MoonSetLcDay, MoonSetLcMonth, MoonSetLcYear + + Returns: + Local date (day) + Local date (month) + Local date (year) + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_set_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT,LCT,LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_set_lc_dmy_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT = moon_set_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT,LCT,LCT + LA = LU + + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + + return DY1,MN1,YR1 + +def moon_set_lc_dmy_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_set_lc_dmy """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_set_lc_dmy_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_set_lc_dmy """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_set(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT + +def moon_set_az(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Local azimuth of moonset. + + Original macro name: MoonSetAz + + Returns: + degrees + """ + GDY = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + GMN = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + GYR = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + LCT = 12 + DY1 = DY + MN1 = MN + YR1 = YR + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU = moon_set_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + + for K in range(1,9): + X = lst_gst(LA, 0, 0, GLong) + UT = gst_ut(X, 0, 0, GDY, GMN, GYR) + + G1 = UT if K == 1 else GU + + GU = UT + UT = GU + UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR = moon_set_az_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT) + MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU = moon_set_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat) + if LCT == -99: + return LCT + LA = LU + AA = AU + + AU = AA + + return AU + +def moon_set_az_l6680(X, DS, ZC, GDY, GMN, GYR, G1, UT): + """ Helper function for moon_set_az """ + if e_gst_ut(X, 0, 0, GDY, GMN, GYR) != "OK": + if abs(G1 - UT) > 0.5: + UT = UT + 23.93447 + + UT = ut_day_adjust(UT, G1) + LCT = ut_lct(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + DY1 = ut_lc_day(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + MN1 = ut_lc_month(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + YR1 = ut_lc_year(UT, 0, 0, DS, ZC, GDY, GMN, GYR) + GDY = lct_gday(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GMN = lct_gmonth(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + GYR = lct_gyear(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + UT = UT - 24 * math.floor(UT / 24) + + return UT,LCT,DY1,MN1,YR1,GDY,GMN,GYR + +def moon_set_az_l6700(LCT,DS,ZC,DY1,MN1,YR1,GDY,GMN,GYR,GLat): + """ Helper function for moon_set_az """ + MM = moon_long(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + BM = moon_lat(LCT, 0, 0, DS, ZC, DY1, MN1, YR1) + PM = math.radians(moon_hp(LCT, 0, 0, DS, ZC, DY1, MN1, YR1)) + DP = nutat_long(GDY, GMN, GYR) + TH = 0.27249 * math.sin(PM) + DI = TH + 0.0098902 - PM + P = dd_dh(ec_ra(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR)) + Q = ec_dec(MM + DP, 0, 0, BM, 0, 0, GDY, GMN, GYR) + LU = rise_set_local_sidereal_time_set(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + AU = rise_set_azimuth_set(P, 0, 0, Q, 0, 0, degrees(DI), GLat) + + return MM,BM,PM,DP,TH,DI,P,Q,LU,LCT,AU + +def lunar_eclipse_occurrence(DS, ZC, DY, MN, YR): + """ + Determine if a lunar eclipse is likely to occur. + + Original macro name: LEOccurrence + """ + D0 = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + M0 = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + Y0 = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + + if Y0 < 0: + Y0 = Y0 + 1 + + J0 = cd_jd(0, 1, Y0) + DJ = cd_jd(D0, M0, Y0) + K = ((Y0 - 1900 + ((DJ - J0) * 1 / 365)) * 12.3685) + K = lint(K + 0.5) + TN = K / 1236.85 + TF = (K + 0.5) / 1236.85 + T = TN + F,DD,E1,B,B1,A,B = lunar_eclipse_occurrence_l6855(T,K) + NI = A + NF = B + NB = F + T = TF + K = K + 0.5 + F,DD,E1,B,B1,A,B = lunar_eclipse_occurrence_l6855(T,K) + FI = A + FF = B + FB = F + + DF = abs(FB - 3.141592654 * lint(FB / 3.141592654)) + + if DF > 0.37: + DF = 3.141592654 - DF + + S = "Lunar eclipse certain" + if DF >= 0.242600766: + S = "Lunar eclipse possible" + if DF > 0.37: + S = "No lunar eclipse" + + return S + +def lunar_eclipse_occurrence_l6855(T,K): + """ Helper function for lunar_eclipse_occurrence """ + T2 = T * T + E = 29.53 * K + C = 166.56 + (132.87 - 0.009173 * T) * T + C = math.radians(C) + B = 0.00058868 * K + (0.0001178 - 0.000000155 * T) * T2 + B = B + 0.00033 * math.sin(C) + 0.75933 + A = K / 12.36886 + A1 = 359.2242 + 360 * f_part(A) - (0.0000333 + 0.00000347 * T) * T2 + A2 = 306.0253 + 360 * f_part(K / 0.9330851) + A2 = A2 + (0.0107306 + 0.00001236 * T) * T2 + A = K / 0.9214926 + F = 21.2964 + 360 * f_part(A) - (0.0016528 + 0.00000239 * T) * T2 + A1 = unwind_deg(A1) + A2 = unwind_deg(A2) + F = unwind_deg(F) + A1 = math.radians(A1) + A2 = math.radians(A2) + F = math.radians(F) + + DD = (0.1734 - 0.000393 * T) * math.sin(A1) + 0.0021 * math.sin(2 * A1) + DD = DD - 0.4068 * math.sin(A2) + 0.0161 * math.sin(2 * A2) - 0.0004 * math.sin(3 * A2) + DD = DD + 0.0104 * math.sin(2 * F) - 0.0051 * math.sin(A1 + A2) + DD = DD - 0.0074 * math.sin(A1 - A2) + 0.0004 * math.sin(2 * F + A1) + DD = DD - 0.0004 * math.sin(2 * F - A1) - 0.0006 * math.sin(2 * F + A2) + 0.001 * math.sin(2 * F - A2) + DD = DD + 0.0005 * math.sin(A1 + 2 * A2) + E1 = math.floor(E) + B = B + DD + (E - E1) + B1 = math.floor(B) + A = E1 + B1 + B = B - B1 + + return F,DD,E1,B,B1,A,B + +def mag_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate magnitude of lunar eclipse. + + Original macro name: MagLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + MG = -99# + return MG + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + MG = -99 + return MG + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + R = RM + RU + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RP - PJ) / (2 * RM) + + if DD < 0: + return MG + + ZD = math.sqrt(DD) + Z8 = Z1 - ZD + Z9 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z8 < 0: + Z8 = Z8 + 24 + + R = RU - RM + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RU - PJ) / (2 * RM) + + return MG + +def ut_end_total_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate end time of total phase of lunar eclipse (UT) + + Original macro name: UTEndTotalLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + R = RM + RU + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RP - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z8 = Z1 - ZD + Z9 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z8 < 0: + Z8 = Z8 + 24 + + R = RU - RM + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RU - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + ZB = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + return ZB + +def ut_end_umbra_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate end time of umbra phase of lunar eclipse (UT) + + Original macro name: UTEndUmbraLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + R = RM + RU + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RP - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z8 = Z1 - ZD + Z9 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + return Z9 + +def ut_first_contact_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate time of first shadow contact for lunar eclipse (UT) + + Original macro name: UTFirstContactLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + + if Z6 < 0: + Z6 = Z6 + 24 + + return Z6 + +def ut_last_contact_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate time of last shadow contact for lunar eclipse (UT) + + Original macro name: UTLastContactLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + return Z7 + +def ut_max_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate time of maximum shadow for lunar eclipse (UT) + + Original macro name: UTMaxLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + return Z1 + +def ut_start_total_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate start time of total phase of lunar eclipse (UT) + + Original macro name: UTStartTotalLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + R = RM + RU + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RP - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z8 = Z1 - ZD + Z9 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z8 < 0: + Z8 = Z8 + 24 + + R = RU - RM + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RU - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + ZCC = Z1 - ZD + ZB = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if ZCC < 0: + ZCC = ZC + 24 + + return ZCC + +def ut_start_umbra_lunar_eclipse(DY, MN, YR, DS, ZC): + """ + Calculate start time of umbra phase of lunar eclipse (UT) + + Original macro name: UTStartUmbraLunarEclipse + """ + TP = 2 * math.pi + + if (lunar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No lunar eclipse"): + return -99 + + DJ = full_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTFM = XI * 24 + UT = UTFM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTFM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTFM + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + SR = SR + math.pi - lint((SR + math.pi) / TP) * TP + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RP + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + R = RM + RU + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + MG = (RM + RP - PJ) / (2 * RM) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z8 = Z1 - ZD + Z9 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z8 < 0: + Z8 = Z8 + 24 + + return Z8 + +def solar_eclipse_occurrence(DS, ZC, DY, MN, YR): + """ + Determine if a solar eclipse is likely to occur. + + Original macro name: SEOccurrence + """ + D0 = lct_gday(12, 0, 0, DS, ZC, DY, MN, YR) + M0 = lct_gmonth(12, 0, 0, DS, ZC, DY, MN, YR) + Y0 = lct_gyear(12, 0, 0, DS, ZC, DY, MN, YR) + + if Y0 < 0: + Y0 = Y0 + 1 + + J0 = cd_jd(0, 1, Y0) + DJ = cd_jd(D0, M0, Y0) + K = ((Y0 - 1900 + ((DJ - J0) * 1 / 365)) * 12.3685) + K = lint(K + 0.5) + TN = K / 1236.85 + TF = (K + 0.5) / 1236.85 + T = TN + F,DD,E1,B,B1,A,B = solar_eclipse_occurrence_l6855(T,K) + NI = A + NF = B + NB = F + T = TF + K = K + 0.5 + F,DD,E1,B,B1,A,B = solar_eclipse_occurrence_l6855(T,K) + FI = A + FF = B + FB = F + + DF = abs(NB - 3.141592654 * lint(NB / 3.141592654)) + + if DF > 0.37: + DF = 3.141592654 - DF + + S = "Solar eclipse certain" + if DF >= 0.242600766: + S = "Solar eclipse possible" + if DF > 0.37: + S = "No solar eclipse" + + return S + +def solar_eclipse_occurrence_l6855(T,K): + """ Helper function for solar_eclipse_occurrence """ + T2 = T * T + E = 29.53 * K + C = 166.56 + (132.87 - 0.009173 * T) * T + C = math.radians(C) + B = 0.00058868 * K + (0.0001178 - 0.000000155 * T) * T2 + B = B + 0.00033 * math.sin(C) + 0.75933 + A = K / 12.36886 + A1 = 359.2242 + 360 * f_part(A) - (0.0000333 + 0.00000347 * T) * T2 + A2 = 306.0253 + 360 * f_part(K / 0.9330851) + A2 = A2 + (0.0107306 + 0.00001236 * T) * T2 + A = K / 0.9214926 + F = 21.2964 + 360 * f_part(A) - (0.0016528 + 0.00000239 * T) * T2 + A1 = unwind_deg(A1) + A2 = unwind_deg(A2) + F = unwind_deg(F) + A1 = math.radians(A1) + A2 = math.radians(A2) + F = math.radians(F) + + DD = (0.1734 - 0.000393 * T) * math.sin(A1) + 0.0021 * math.sin(2 * A1) + DD = DD - 0.4068 * math.sin(A2) + 0.0161 * math.sin(2 * A2) - 0.0004 * math.sin(3 * A2) + DD = DD + 0.0104 * math.sin(2 * F) - 0.0051 * math.sin(A1 + A2) + DD = DD - 0.0074 * math.sin(A1 - A2) + 0.0004 * math.sin(2 * F + A1) + DD = DD - 0.0004 * math.sin(2 * F - A1) - 0.0006 * math.sin(2 * F + A2) + 0.001 * math.sin(2 * F - A2) + DD = DD + 0.0005 * math.sin(A1 + 2 * A2) + E1 = math.floor(E) + B = B + DD + (E - E1) + B1 = math.floor(B) + A = E1 + B1 + B = B - B1 + + return F,DD,E1,B,B1,A,B + +def mag_solar_eclipse(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Calculate magnitude of solar eclipse. + + Original macro name: MagSolarEclipse + """ + TP = 2 * math.pi + + if solar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No solar eclipse": + return -99 + + DJ = new_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTNM = XI * 24 + UT = UTNM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTNM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTNM + X = MY + Y = BY + TM = XH - 1 + HP = HY + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = mag_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MY = P + BY = Q + X = MZ + Y = BZ + TM = XH + 1 + HP = HZ + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = mag_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MZ = P + BZ = Q + + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + X = SR + Y = 0 + TM = UT + HP = 0.00004263452 / RR + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = mag_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + SR = P + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RN + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + MG = (RM + RN - PJ) / (2 * RN) + + return MG + +def mag_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP): + """ Helper function for mag_solar_eclipse """ + PAA = ec_ra(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + QAA = ec_dec(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + XAA = ra_ha(dd_dh(PAA), 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + PBB = parallax_ha(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + QBB = parallax_dec(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + XBB = ha_ra(PBB, 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + P = math.radians(eq_e_long(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + Q = math.radians(eq_e_lat(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + + return PAA,QAA,XAA,PBB,QBB,XBB,P,Q + +def ut_first_contact_solar_eclipse(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Calculate time of first contact for solar eclipse (UT) + + Original macro name: UTFirstContactSolarEclipse + """ + TP = 2 * math.pi + + if solar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No solar eclipse": + return -99 + + DJ = new_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTNM = XI * 24 + UT = UTNM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTNM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTNM + X = MY + Y = BY + TM = XH - 1 + HP = HY + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_first_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MY = P + BY = Q + X = MZ + Y = BZ + TM = XH + 1 + HP = HZ + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_first_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MZ = P + BZ = Q + + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + X = SR + Y = 0 + TM = UT + HP = 0.00004263452 / RR + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_first_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + SR = P + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RN + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + MG = (RM + RN - PJ) / (2 * RN) + + return Z6 + +def ut_first_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP): + """ Helper function for ut_first_contact_solar_eclipse """ + PAA = ec_ra(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + QAA = ec_dec(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + XAA = ra_ha(dd_dh(PAA), 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + PBB = parallax_ha(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + QBB = parallax_dec(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + XBB = ha_ra(PBB, 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + P = math.radians(eq_e_long(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + Q = math.radians(eq_e_lat(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + + return PAA,QAA,XAA,PBB,QBB,XBB,P,Q + +def ut_last_contact_solar_eclipse(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Calculate time of last contact for solar eclipse (UT) + + Original macro name: UTLastContactSolarEclipse + """ + TP = 2 * math.pi + + if solar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No solar eclipse": + return -99 + + DJ = new_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTNM = XI * 24 + UT = UTNM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTNM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTNM + X = MY + Y = BY + TM = XH - 1 + HP = HY + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_last_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MY = P + BY = Q + X = MZ + Y = BZ + TM = XH + 1 + HP = HZ + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_last_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MZ = P + BZ = Q + + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + X = SR + Y = 0 + TM = UT + HP = 0.00004263452 / RR + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_last_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + SR = P + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RN + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + MG = (RM + RN - PJ) / (2 * RN) + + return Z7 + +def ut_last_contact_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP): + """ Helper function for ut_last_contact_solar_eclipse """ + PAA = ec_ra(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + QAA = ec_dec(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + XAA = ra_ha(dd_dh(PAA), 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + PBB = parallax_ha(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + QBB = parallax_dec(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + XBB = ha_ra(PBB, 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + P = math.radians(eq_e_long(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + Q = math.radians(eq_e_lat(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + + return PAA,QAA,XAA,PBB,QBB,XBB,P,Q + +def ut_max_solar_eclipse(DY, MN, YR, DS, ZC, GLong, GLat): + """ + Calculate time of maximum shadow for solar eclipse (UT) + + Original macro name: UTMaxSolarEclipse + """ + TP = 2 * math.pi + + if solar_eclipse_occurrence(DS, ZC, DY, MN, YR) == "No solar eclipse": + return -99 + + DJ = new_moon(DS, ZC, DY, MN, YR) + DP = 0 + GDay = jdc_day(DJ) + GMonth = jdc_month(DJ) + GYear = jdc_year(DJ) + IGDay = math.floor(GDay) + XI = GDay - IGDay + UTNM = XI * 24 + UT = UTNM - 1 + LY = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + MY = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BY = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HY = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + UT = UTNM + 1 + SB = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) - LY + MZ = math.radians(moon_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + BZ = math.radians(moon_lat(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + HZ = math.radians(moon_hp(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + + if SB < 0: + SB = SB + TP + + XH = UTNM + X = MY + Y = BY + TM = XH - 1 + HP = HY + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_max_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MY = P + BY = Q + X = MZ + Y = BZ + TM = XH + 1 + HP = HZ + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_max_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + MZ = P + BZ = Q + + X0 = XH + 1 - (2 * BZ / (BZ - BY)) + DM = MZ - MY + + if DM < 0: + DM = DM + TP + + LJ = (DM - SB) / 2 + Q = 0 + MR = MY + (DM * (X0 - XH + 1) / 2) + UT = X0 - 0.13851852 + RR = sun_dist(UT, 0, 0, 0, 0, IGDay, GMonth, GYear) + SR = math.radians(sun_long(UT, 0, 0, 0, 0, IGDay, GMonth, GYear)) + SR = SR + math.radians(nutat_long(IGDay, GMonth, GYear) - 0.00569) + X = SR + Y = 0 + TM = UT + HP = 0.00004263452 / RR + PAA,QAA,XAA,PBB,QBB,XBB,P,Q = ut_max_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP) + SR = P + BY = BY - Q + BZ = BZ - Q + P3 = 0.00004263 + ZH = (SR - MR) / LJ + TC = X0 + ZH + SH = (((BZ - BY) * (TC - XH - 1) / 2) + BZ) / LJ + S2 = SH * SH + Z2 = ZH * ZH + PS = P3 / (RR * LJ) + Z1 = (ZH * Z2 / (Z2 + S2)) + X0 + H0 = (HY + HZ) / (2 * LJ) + RM = 0.272446 * H0 + RN = 0.00465242 / (LJ * RR) + HD = H0 * 0.99834 + RU = (HD - RN + PS) * 1.02 + RP = (HD + RN + PS) * 1.02 + PJ = abs(SH * ZH / math.sqrt(S2 + Z2)) + R = RM + RN + DD = Z1 - X0 + DD = DD * DD - ((Z2 - (R * R)) * DD / ZH) + + if DD < 0: + return -99 + + ZD = math.sqrt(DD) + Z6 = Z1 - ZD + Z7 = Z1 + ZD - lint((Z1 + ZD) / 24) * 24 + + if Z6 < 0: + Z6 = Z6 + 24 + + MG = (RM + RN - PJ) / (2 * RN) + + return Z1 + +def ut_max_solar_eclipse_l7390(X,Y,IGDay,GMonth,GYear,TM,GLong,GLat,HP): + """ Helper function for ut_max_solar_eclipse """ + PAA = ec_ra(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + QAA = ec_dec(degrees(X), 0, 0, degrees(Y), 0, 0, IGDay, GMonth, GYear) + XAA = ra_ha(dd_dh(PAA), 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + PBB = parallax_ha(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + QBB = parallax_dec(XAA, 0, 0, QAA, 0, 0, "True", GLat, 0, degrees(HP)) + XBB = ha_ra(PBB, 0, 0, TM, 0, 0, 0, 0, IGDay, GMonth, GYear, GLong) + P = math.radians(eq_e_long(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + Q = math.radians(eq_e_lat(XBB, 0, 0, QBB, 0, 0, IGDay, GMonth, GYear)) + + return PAA,QAA,XAA,PBB,QBB,XBB,P,Q + +def fract(W): + """ + Original macro name: FRACT + """ + return W - lint(W) + +def lint(W): + """ + Original macro name: LINT + """ + return iint(W) + iint(((1 * sgn(W)) - 1) / 2) + +def iint(W): + """ + Original macro name: IINT + """ + return sgn(W) * math.floor(abs(W)) + +def sgn(number_to_check): + """ + Calculate sign of number. + + Arguments: + number_to_check -- Number to calculate the sign of. + + Returns: + sign_value -- Sign value: -1, 0, or 1 + """ + sign_value = 0 + + if number_to_check < 0: + sign_value = -1 + + if number_to_check > 0: + sign_value = 1 + + return sign_value + +def ut_day_adjust(UT, G1): + """ + Original macro name: UTDayAdjust + """ + return_value = UT + + if (UT - G1) < -6: + return_value = UT + 24 + + if (UT - G1) > 6: + return_value = UT - 24 + + return return_value + +def f_part(W): + """ + Original macro name: Fpart + """ + + return W - lint(W) + +def eq_e_lat(RAH, RAM, RAS, DD, DM, DS, GD, GM, GY): + """ + Original macro name: EQElat + """ + A = math.radians(dh_dd(hms_dh(RAH, RAM, RAS))) + B = math.radians(dms_dd(DD, DM, DS)) + C = math.radians(obliq(GD, GM, GY)) + D = math.sin(B) * math.cos(C) - math.cos(B) * math.sin(C) * math.sin(A) + + return degrees(math.asin(D)) + +def eq_e_long(RAH, RAM, RAS, DD, DM, DS, GD, GM, GY): + """ + Original macro name: EQElong + """ + A = math.radians(dh_dd(hms_dh(RAH, RAM, RAS))) + B = math.radians(dms_dd(DD, DM, DS)) + C = math.radians(obliq(GD, GM, GY)) + D = math.sin(A) * math.cos(C) + math.tan(B) * math.sin(C) + E = math.cos(A) + F = degrees(math.atan2(D, E)) + + return F - 360 * math.floor(F / 360) diff --git a/practical_astronomy/source/src/practical_astronomy/pa_moon.py b/practical_astronomy/source/src/practical_astronomy/pa_moon.py new file mode 100644 index 0000000000000000000000000000000000000000..0a28170087f495830e5dd53cf16432d2810a682a --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_moon.py @@ -0,0 +1,313 @@ +import math +from . import pa_macro as PM + +def approximate_position_of_moon(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year): + """ + Calculate approximate position of the Moon. + + Arguments: + lct_hour -- Local civil time, in hours. + lct_min -- Local civil time, in minutes. + lct_sec -- Local civil time, in seconds. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + + Returns: + moon_ra_hour -- Right ascension of Moon (hour part) + moon_ra_min -- Right ascension of Moon (minutes part) + moon_ra_sec -- Right ascension of Moon (seconds part) + moon_dec_deg -- Declination of Moon (degrees part) + moon_dec_min -- Declination of Moon (minutes part) + moon_dec_sec -- Declination of Moon (seconds part) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + l0 = 91.9293359879052 + p0 = 130.143076320618 + n0 = 291.682546643194 + i = 5.145396 + + gdate_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + ut_hours = PM.lct_ut(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + d_days = PM.cd_jd(gdate_day,gdate_month,gdate_year)-PM.cd_jd(0,1,2010)+ut_hours/24 + sun_long_deg = PM.sun_long(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + sun_mean_anomaly_rad = PM.sun_mean_anomaly(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + lm_deg = PM.unwind_deg(13.1763966*d_days+l0) + mm_deg = PM.unwind_deg(lm_deg-0.1114041*d_days-p0) + n_deg = PM.unwind_deg(n0-(0.0529539*d_days)) + ev_deg = 1.2739*math.sin(math.radians(2*(lm_deg-sun_long_deg)-mm_deg)) + ae_deg = 0.1858*math.sin(sun_mean_anomaly_rad) + a3_deg = 0.37*math.sin(sun_mean_anomaly_rad) + mmd_deg = mm_deg+ev_deg-ae_deg-a3_deg + ec_deg = 6.2886*math.sin(math.radians(mmd_deg)) + a4_deg = 0.214*math.sin(2*math.radians(mmd_deg)) + ld_deg = lm_deg+ev_deg+ec_deg-ae_deg+a4_deg + v_deg = 0.6583*math.sin(2*math.radians(ld_deg-sun_long_deg)) + ldd_deg = ld_deg + v_deg + nd_deg = n_deg-0.16*math.sin(sun_mean_anomaly_rad) + y = math.sin(math.radians(ldd_deg-nd_deg))*math.cos(math.radians(i)) + x = math.cos(math.radians(ldd_deg-nd_deg)) + + moon_long_deg = PM.unwind_deg(PM.degrees(math.atan2(y,x))+nd_deg) + moon_lat_deg = PM.degrees(math.asin(math.sin(math.radians(ldd_deg-nd_deg))*math.sin(math.radians(i)))) + moon_ra_hours1 = PM.dd_dh(PM.ec_ra(moon_long_deg,0,0,moon_lat_deg,0,0,gdate_day,gdate_month,gdate_year)) + moon_dec_deg1 = PM.ec_dec(moon_long_deg,0,0,moon_lat_deg,0,0,gdate_day,gdate_month,gdate_year) + + moon_ra_hour = PM.dh_hour(moon_ra_hours1) + moon_ra_min = PM.dh_min(moon_ra_hours1) + moon_ra_sec = PM.dh_sec(moon_ra_hours1) + moon_dec_deg = PM.dd_deg(moon_dec_deg1) + moon_dec_min = PM.dd_min(moon_dec_deg1) + moon_dec_sec = PM.dd_sec(moon_dec_deg1) + + return moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec + +def precise_position_of_moon(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year): + """ + Calculate approximate position of the Moon. + + Arguments: + lct_hour -- Local civil time, in hours. + lct_min -- Local civil time, in minutes. + lct_sec -- Local civil time, in seconds. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + + Returns: + moon_ra_hour -- Right ascension of Moon (hour part) + moon_ra_min -- Right ascension of Moon (minutes part) + moon_ra_sec -- Right ascension of Moon (seconds part) + moon_dec_deg -- Declination of Moon (degrees part) + moon_dec_min -- Declination of Moon (minutes part) + moon_dec_sec -- Declination of Moon (seconds part) + earth_moon_dist_km -- Distance from Earth to Moon (km) + moon_hor_parallax_deg -- Horizontal parallax of Moon (degrees) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + gdate_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + ut_hours = PM.lct_ut(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + moon_ecliptic_longitude_deg, moon_ecliptic_latitude_deg, moon_horizontal_parallax_deg = PM.moon_long_lat_hp(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + nutation_in_longitude_deg = PM.nutat_long(gdate_day,gdate_month,gdate_year) + corrected_long_deg = moon_ecliptic_longitude_deg + nutation_in_longitude_deg + earth_moon_distance_km = 6378.14/math.sin(math.radians(moon_horizontal_parallax_deg)) + moon_ra_hours_1 = PM.dd_dh(PM.ec_ra(corrected_long_deg,0,0,moon_ecliptic_latitude_deg,0,0,gdate_day,gdate_month,gdate_year)) + moon_dec_deg1 = PM.ec_dec(corrected_long_deg,0,0,moon_ecliptic_latitude_deg,0,0,gdate_day,gdate_month,gdate_year) + + moon_ra_hour = PM.dh_hour(moon_ra_hours_1) + moon_ra_min = PM.dh_min(moon_ra_hours_1) + moon_ra_sec = PM.dh_sec(moon_ra_hours_1) + moon_dec_deg = PM.dd_deg(moon_dec_deg1) + moon_dec_min = PM.dd_min(moon_dec_deg1) + moon_dec_sec = PM.dd_sec(moon_dec_deg1) + earth_moon_dist_km = round(earth_moon_distance_km,0) + moon_hor_parallax_deg = round(moon_horizontal_parallax_deg,6) + + return moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec, earth_moon_dist_km, moon_hor_parallax_deg + +def moon_phase(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, accuracy_level = "A"): + """ + Calculate Moon phase and position angle of bright limb. + + Arguments: + lct_hour -- Local civil time, in hours. + lct_min -- Local civil time, in minutes. + lct_sec -- Local civil time, in seconds. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + accuracy_level -- "A" (approximate) or "P" (precise) + + Returns: + moon_phase -- Phase of Moon, between 0 and 1, where 0 is New and 1 is Full. + pa_bright_limb_deg -- Position angle of the bright limb (degrees) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + gdate_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + sun_long_deg = PM.sun_long(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + moon_ecliptic_longitude_deg, moon_ecliptic_latitude_deg, moon_horizontal_parallax_deg = PM.moon_long_lat_hp(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + d_rad = math.radians(moon_ecliptic_longitude_deg - sun_long_deg) + + moon_phase1 = PM.moon_phase(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) if accuracy_level == "P" else (1-math.cos(d_rad))/2 + + sun_ra_rad = math.radians(PM.ec_ra(sun_long_deg,0,0,0,0,0,gdate_day,gdate_month,gdate_year)) + moon_ra_rad = math.radians(PM.ec_ra(moon_ecliptic_longitude_deg,0,0,moon_ecliptic_latitude_deg,0,0,gdate_day,gdate_month,gdate_year)) + sun_dec_rad = math.radians(PM.ec_dec(sun_long_deg,0,0,0,0,0,gdate_day,gdate_month,gdate_year)) + moon_dec_rad = math.radians(PM.ec_dec(moon_ecliptic_longitude_deg,0,0,moon_ecliptic_latitude_deg,0,0,gdate_day,gdate_month,gdate_year)) + + y = math.cos(sun_dec_rad)*math.sin(sun_ra_rad-moon_ra_rad) + x = math.cos(moon_dec_rad)*math.sin(sun_dec_rad)-math.sin(moon_dec_rad)*math.cos(sun_dec_rad)*math.cos(sun_ra_rad-moon_ra_rad) + + chi_deg = PM.degrees(math.atan2(y,x)) + + moon_phase = round(moon_phase1,2) + pa_bright_limb_deg = round(chi_deg,2) + + return moon_phase, pa_bright_limb_deg + +def times_of_new_moon_and_full_moon(is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year): + """ + Calculate new moon and full moon instances. + + Arguments: + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + + Returns: + nm_local_time_hour -- new Moon instant - local time (hour) + nm_local_time_min -- new Moon instant - local time (minutes) + nm_local_date_day -- new Moon instance - local date (day) + nm_local_date_month -- new Moon instance - local date (month) + nm_local_date_year -- new Moon instance - local date (year) + fm_local_time_hour -- full Moon instant - local time (hour) + fm_local_time_min -- full Moon instant - local time (minutes) + fm_local_date_day -- full Moon instance - local date (day) + fm_local_date_month -- full Moon instance - local date (month) + fm_local_date_year -- full Moon instance - local date (year) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + jd_of_new_moon_days = PM.new_moon(daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year) + jd_of_full_moon_days = PM.full_moon(3,zone_correction_hours,local_date_day,local_date_month,local_date_year) + + g_date_of_new_moon_day = PM.jdc_day(jd_of_new_moon_days) + integer_day1 = math.floor(g_date_of_new_moon_day) + g_date_of_new_moon_month = PM.jdc_month(jd_of_new_moon_days) + g_date_of_new_moon_year = PM.jdc_year(jd_of_new_moon_days) + + g_date_of_full_moon_day = PM.jdc_day(jd_of_full_moon_days) + integer_day2 = math.floor(g_date_of_full_moon_day) + g_date_of_full_moon_month = PM.jdc_month(jd_of_full_moon_days) + g_date_of_full_moon_year = PM.jdc_year(jd_of_full_moon_days) + + ut_of_new_moon_hours = 24*(g_date_of_new_moon_day-integer_day1) + ut_of_full_moon_hours = 24*(g_date_of_full_moon_day-integer_day2) + lct_of_new_moon_hours = PM.ut_lct(ut_of_new_moon_hours+0.008333,0,0,daylight_saving,zone_correction_hours,integer_day1,g_date_of_new_moon_month,g_date_of_new_moon_year) + lct_of_full_moon_hours = PM.ut_lct(ut_of_full_moon_hours+0.008333,0,0,daylight_saving,zone_correction_hours,integer_day2,g_date_of_full_moon_month,g_date_of_full_moon_year) + + nm_local_time_hour = PM.dh_hour(lct_of_new_moon_hours) + nm_local_time_min = PM.dh_min(lct_of_new_moon_hours) + nm_local_date_day = PM.ut_lc_day(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day1,g_date_of_new_moon_month,g_date_of_new_moon_year) + nm_local_date_month = PM.ut_lc_month(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day1,g_date_of_new_moon_month,g_date_of_new_moon_year) + nm_local_date_year = PM.ut_lc_year(ut_of_new_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day1,g_date_of_new_moon_month,g_date_of_new_moon_year) + fm_local_time_hour = PM.dh_hour(lct_of_full_moon_hours) + fm_local_time_min = PM.dh_min(lct_of_full_moon_hours) + fm_local_date_day = PM.ut_lc_day(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day2,g_date_of_full_moon_month,g_date_of_full_moon_year) + fm_local_date_month = PM.ut_lc_month(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day2,g_date_of_full_moon_month,g_date_of_full_moon_year) + fm_local_date_year = PM.ut_lc_year(ut_of_full_moon_hours,0,0,daylight_saving,zone_correction_hours,integer_day2,g_date_of_full_moon_month,g_date_of_full_moon_year) + + return nm_local_time_hour, nm_local_time_min, nm_local_date_day, nm_local_date_month, nm_local_date_year, fm_local_time_hour, fm_local_time_min, fm_local_date_day, fm_local_date_month, fm_local_date_year + +def moon_dist_ang_diam_hor_parallax(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year): + """ + Calculate Moon's distance, angular diameter, and horizontal parallax. + + Arguments: + lct_hour -- Local civil time, in hours. + lct_min -- Local civil time, in minutes. + lct_sec -- Local civil time, in seconds. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + + Returns: + earth_moon_dist -- Earth-Moon distance (km) + ang_diameter_deg -- Angular diameter (degrees part) + ang_diameter_min -- Angular diameter (minutes part) + hor_parallax_deg -- Horizontal parallax (degrees part) + hor_parallax_min -- Horizontal parallax (minutes part) + hor_parallax_sec -- Horizontal parallax (seconds part) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + moon_distance = PM.moon_dist(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + moon_angular_diameter = PM.moon_size(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + moon_horizontal_parallax = PM.moon_hp(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + earth_moon_dist = round(moon_distance,-1) + ang_diameter_deg = PM.dd_deg(moon_angular_diameter+0.008333) + ang_diameter_min = PM.dd_min(moon_angular_diameter+0.008333) + hor_parallax_deg = PM.dd_deg(moon_horizontal_parallax) + hor_parallax_min = PM.dd_min(moon_horizontal_parallax) + hor_parallax_sec = PM.dd_sec(moon_horizontal_parallax) + + return earth_moon_dist, ang_diameter_deg, ang_diameter_min, hor_parallax_deg, hor_parallax_min, hor_parallax_sec + +def moonrise_and_moonset(local_date_day, local_date_month, local_date_year, is_daylight_saving, zone_correction_hours, geog_long_deg, geog_lat_deg): + """ + Calculate date/time of local moonrise and moonset. + + Arguments: + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + geog_long_deg -- Geographical longitude, in degrees. + geog_lat_deg -- Geographical latitude, in degrees. + + Returns: + mr_lt_hour -- Moonrise, local time (hour part) + mr_lt_min -- Moonrise, local time (minutes part) + mr_local_date_day -- Moonrise, local date (day) + mr_local_date_month -- Moonrise, local date (month) + mr_local_date_year -- Moonrise, local date (year) + mr_azimuth_deg -- Moonrise, azimuth (degrees) + ms_lt_hour -- Moonset, local time (hour part) + ms_lt_min -- Moonset, local time (minutes part) + ms_local_date_day -- Moonset, local date (day) + ms_local_date_month -- Moonset, local date (month) + ms_local_date_year -- Moonset, local date (year) + ms_azimuth_deg -- Moonset, azimuth (degrees) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + local_time_of_moonrise_hours = PM.moon_rise_lct(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_moonrise_status1 = PM.e_moon_rise(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_date_of_moonrise_day,local_date_of_moonrise_month,local_date_of_moonrise_year = PM.moon_rise_lc_dmy(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_azimuth_deg1 = PM.moon_rise_az(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + + local_time_of_moonset_hours = PM.moon_set_lct(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_moonset_status1 = PM.e_moon_set(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_date_of_moonset_day,local_date_of_moonset_month,local_date_of_moonset_year = PM.moon_set_lc_dmy(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + local_azimuth_deg2 = PM.moon_set_az(local_date_day,local_date_month,local_date_year,daylight_saving,zone_correction_hours,geog_long_deg,geog_lat_deg) + + mr_lt_hour = PM.dh_hour(local_time_of_moonrise_hours + 0.008333) + mr_lt_min = PM.dh_min(local_time_of_moonrise_hours + 0.008333) + mr_local_date_day = local_date_of_moonrise_day + mr_local_date_month = local_date_of_moonrise_month + mr_local_date_year = local_date_of_moonrise_year + mr_azimuth_deg = round(local_azimuth_deg1,2) + ms_lt_hour = PM.dh_hour(local_time_of_moonset_hours + 0.008333) + ms_lt_min = PM.dh_min(local_time_of_moonset_hours + 0.008333) + ms_local_date_day = local_date_of_moonset_day + ms_local_date_month = local_date_of_moonset_month + ms_local_date_year = local_date_of_moonset_year + ms_azimuth_deg = round(local_azimuth_deg2,2) + + return mr_lt_hour, mr_lt_min, mr_local_date_day, mr_local_date_month, mr_local_date_year, mr_azimuth_deg, ms_lt_hour, ms_lt_min, ms_local_date_day, ms_local_date_month, ms_local_date_year, ms_azimuth_deg \ No newline at end of file diff --git a/practical_astronomy/source/src/practical_astronomy/pa_planet.py b/practical_astronomy/source/src/practical_astronomy/pa_planet.py new file mode 100644 index 0000000000000000000000000000000000000000..e21346484a3e7106dfe0bc4cee148db6484ec40f --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_planet.py @@ -0,0 +1,193 @@ +import math +from . import pa_macro as PM +from . import pa_planet_data as PPD + +def approximate_position_of_planet(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name): + """ + Calculate approximate position of a planet. + + Arguments: + lct_hour -- Local civil time, in hours. + lct_min -- Local civil time, in minutes. + lct_sec -- Local civil time, in seconds. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + planet_name -- Name of planet, e.g., "Jupiter" + + Returns: + planet_ra_hour -- Right ascension of planet (hour part) + planet_ra_min -- Right ascension of planet (minutes part) + planet_ra_sec -- Right ascension of planet (seconds part) + planet_dec_deg -- Declination of planet (degrees part) + planet_dec_min -- Declination of planet (minutes part) + planet_dec_sec -- Declination of planet (seconds part) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + planet_tp_from_table = PPD.get_planet_data(planet_name)['Tp'] + planet_long_from_table = PPD.get_planet_data(planet_name)['Long'] + planet_peri_from_table = PPD.get_planet_data(planet_name)['Peri'] + planet_ecc_from_table = PPD.get_planet_data(planet_name)['Ecc'] + planet_axis_from_table = PPD.get_planet_data(planet_name)['Axis'] + planet_incl_from_table = PPD.get_planet_data(planet_name)['Incl'] + planet_node_from_table = PPD.get_planet_data(planet_name)['Node'] + + gdate_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + ut_hours = PM.lct_ut(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + d_days = PM.cd_jd(gdate_day+(ut_hours/24),gdate_month,gdate_year) - PM.cd_jd(0,1,2010) + np_deg1 = 360 * d_days / (365.242191 * planet_tp_from_table) + np_deg2 = np_deg1 - 360 * math.floor(np_deg1/360) + mp_deg = np_deg2 + planet_long_from_table - planet_peri_from_table + lp_deg1 = np_deg2 + (360 * planet_ecc_from_table * math.sin(math.radians(mp_deg)) / math.pi) + planet_long_from_table + lp_deg2 = lp_deg1 - 360 * math.floor(lp_deg1/360) + planet_true_anomaly_deg = lp_deg2 - planet_peri_from_table + r_au = planet_axis_from_table * (1 - (planet_ecc_from_table)**2) / (1 + planet_ecc_from_table * math.cos(math.radians(planet_true_anomaly_deg))) + + earth_tp_from_table = PPD.get_planet_data("Earth")['Tp'] + earth_long_from_table = PPD.get_planet_data("Earth")['Long'] + earth_peri_from_table = PPD.get_planet_data("Earth")['Peri'] + earth_ecc_from_table = PPD.get_planet_data("Earth")['Ecc'] + earth_axis_from_table = PPD.get_planet_data("Earth")['Axis'] + + ne_deg1 = 360*d_days/(365.242191*earth_tp_from_table) + ne_deg2 = ne_deg1-360*math.floor(ne_deg1/360) + me_deg = ne_deg2+earth_long_from_table-earth_peri_from_table + le_deg1 = ne_deg2+earth_long_from_table+360*earth_ecc_from_table*math.sin(math.radians(me_deg))/math.pi + le_deg2 = le_deg1-360*math.floor(le_deg1/360) + earth_true_anomaly_deg = le_deg2-earth_peri_from_table + r_au2 = earth_axis_from_table*(1-(earth_ecc_from_table)**2)/(1+earth_ecc_from_table*math.cos(math.radians(earth_true_anomaly_deg))) + lp_node_rad = math.radians(lp_deg2-planet_node_from_table) + psi_rad = math.asin(math.sin(lp_node_rad)*math.sin(math.radians(planet_incl_from_table))) + y = math.sin(lp_node_rad)*math.cos(math.radians(planet_incl_from_table)) + x = math.cos(lp_node_rad) + ld_deg = PM.degrees(math.atan2(y,x))+planet_node_from_table + rd_au = r_au*math.cos(psi_rad) + le_ld_rad = math.radians(le_deg2-ld_deg) + atan2_type_1 = math.atan2(rd_au*math.sin(le_ld_rad),r_au2-rd_au*math.cos(le_ld_rad)) + atan2_type_2 = math.atan2(r_au2*math.sin(-le_ld_rad),rd_au-r_au2*math.cos(le_ld_rad)) + a_rad = atan2_type_1 if rd_au < 1 else atan2_type_2 + lamda_deg1 = 180 + le_deg2 + PM.degrees(a_rad) if rd_au < 1 else PM.degrees(a_rad) + ld_deg + lamda_deg2 = lamda_deg1-360*math.floor(lamda_deg1/360) + beta_deg = PM.degrees(math.atan(rd_au*math.tan(psi_rad)*math.sin(math.radians(lamda_deg2-ld_deg))/(r_au2*math.sin(-le_ld_rad)))) + ra_hours = PM.dd_dh(PM.ec_ra(lamda_deg2,0,0,beta_deg,0,0,gdate_day,gdate_month,gdate_year)) + dec_deg = PM.ec_dec(lamda_deg2,0,0,beta_deg,0,0,gdate_day,gdate_month,gdate_year) + + planet_ra_hour = PM.dh_hour(ra_hours) + planet_ra_min = PM.dh_min(ra_hours) + planet_ra_sec = PM.dh_sec(ra_hours) + planet_dec_deg = PM.dd_deg(dec_deg) + planet_dec_min = PM.dd_min(dec_deg) + planet_dec_sec = PM.dd_sec(dec_deg) + + return planet_ra_hour, planet_ra_min, planet_ra_sec, planet_dec_deg, planet_dec_min, planet_dec_sec + +def precise_position_of_planet(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name): + """ + Calculate precise position of a planet. + + Arguments: + lct_hour -- Local civil time, hour part. + lct_min -- Local civil time, minutes part. + lct_sec -- Local civil time, seconds part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + planet_name -- Name of planet, e.g., "Jupiter" + + Returns: + planet_ra_hour -- Right ascension of planet (hour part) + planet_ra_min -- Right ascension of planet (minutes part) + planet_ra_sec -- Right ascension of planet (seconds part) + planet_dec_deg -- Declination of planet (degrees part) + planet_dec_min -- Declination of planet (minutes part) + planet_dec_sec -- Declination of planet (seconds part) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + gdate_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + gdate_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + planet_ecl_long_deg,planet_ecl_lat_deg,planet_distance_au,planet_h_long1,planet_h_long2,planet_h_lat,planet_r_vect = PM.planet_coordinates(lct_hour,lct_min,lct_sec,daylight_saving,zone_correction_hours,local_date_day,local_date_month,local_date_year,planet_name) + + planet_ra_hours = PM.dd_dh(PM.ec_ra(planet_ecl_long_deg,0,0,planet_ecl_lat_deg,0,0,local_date_day,local_date_month,local_date_year)) + planet_dec_deg1 = PM.ec_dec(planet_ecl_long_deg,0,0,planet_ecl_lat_deg,0,0,local_date_day,local_date_month,local_date_year) + + planet_ra_hour = PM.dh_hour(planet_ra_hours) + planet_ra_min = PM.dh_min(planet_ra_hours) + planet_ra_sec = PM.dh_sec(planet_ra_hours) + planet_dec_deg = PM.dd_deg(planet_dec_deg1) + planet_dec_min = PM.dd_min(planet_dec_deg1) + planet_dec_sec = PM.dd_sec(planet_dec_deg1) + + return planet_ra_hour,planet_ra_min,planet_ra_sec,planet_dec_deg,planet_dec_min,planet_dec_sec + +def visual_aspects_of_a_planet(lct_hour, lct_min, lct_sec, is_daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name): + """ + Calculate several visual aspects of a planet. + + Arguments: + lct_hour -- Local civil time, hour part. + lct_min -- Local civil time, minutes part. + lct_sec -- Local civil time, seconds part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction_hours -- Time zone correction, in hours. + local_date_day -- Local date, day part. + local_date_month -- Local date, month part. + local_date_year -- Local date, year part. + planet_name -- Name of planet, e.g., "Jupiter" + + Returns: + distance_au -- Planet's distance from Earth, in AU. + ang_dia_arcsec -- Angular diameter of the planet. + phase -- Illuminated fraction of the planet. + light_time_hour -- Light travel time from planet to Earth, hour part. + light_time_minutes -- Light travel time from planet to Earth, minutes part. + light_time_seconds -- Light travel time from planet to Earth, seconds part. + pos_angle_bright_limb_deg -- Position-angle of the bright limb. + approximate_magnitude -- Apparent brightness of the planet. + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + greenwich_date_day = PM.lct_gday(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + greenwich_date_month = PM.lct_gmonth(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + greenwich_date_year = PM.lct_gyear(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + + planet_ecl_long_deg,planet_ecl_lat_deg,planet_dist_au,planet_h_long1,temp3,temp4,planet_r_vect = PM.planet_coordinates(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year, planet_name) + + planet_ra_rad = math.radians(PM.ec_ra(planet_ecl_long_deg,0,0,planet_ecl_lat_deg,0,0,local_date_day,local_date_month,local_date_year)) + planet_dec_rad = math.radians(PM.ec_dec(planet_ecl_long_deg,0,0,planet_ecl_lat_deg,0,0,local_date_day,local_date_month,local_date_year)) + + light_travel_time_hours = planet_dist_au*0.1386 + angular_diameter_arcsec = PPD.get_planet_data(planet_name)['Theta0'] / planet_dist_au + phase1 = 0.5*(1+math.cos(math.radians(planet_ecl_long_deg-planet_h_long1))) + + sun_ecl_long_deg = PM.sun_long(lct_hour, lct_min, lct_sec, daylight_saving, zone_correction_hours, local_date_day, local_date_month, local_date_year) + sun_ra_rad = math.radians(PM.ec_ra(sun_ecl_long_deg,0,0,0,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year)) + sun_dec_rad = math.radians(PM.ec_dec(sun_ecl_long_deg,0,0,0,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year)) + + y = math.cos(sun_dec_rad) * math.sin(sun_ra_rad-planet_ra_rad) + x = math.cos(planet_dec_rad) * math.sin(sun_dec_rad) - math.sin(planet_dec_rad) * math.cos(sun_dec_rad) * math.cos(sun_ra_rad-planet_ra_rad) + + chi_deg = PM.degrees(math.atan2(y,x)) + radius_vector_au = planet_r_vect + approximate_magnitude1 = 5 * math.log10(radius_vector_au*planet_dist_au/math.sqrt(phase1)) + PPD.get_planet_data(planet_name)['V0'] + + distance_au = round(planet_dist_au,5) + ang_dia_arcsec = round(angular_diameter_arcsec,1) + phase = round(phase1,2) + light_time_hour = PM.dh_hour(light_travel_time_hours) + light_time_minutes = PM.dh_min(light_travel_time_hours) + light_time_seconds = PM.dh_sec(light_travel_time_hours) + pos_angle_bright_limb_deg = round(chi_deg,1) + approximate_magnitude = round(approximate_magnitude1,1) + + return distance_au, ang_dia_arcsec, phase, light_time_hour, light_time_minutes, light_time_seconds, pos_angle_bright_limb_deg, approximate_magnitude diff --git a/practical_astronomy/source/src/practical_astronomy/pa_planet_data.py b/practical_astronomy/source/src/practical_astronomy/pa_planet_data.py new file mode 100644 index 0000000000000000000000000000000000000000..599b5f196bdcfa21331ec89f2c1fbc66ef175918 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_planet_data.py @@ -0,0 +1,111 @@ + +PlanetData = { + "Mercury": { + "Tp": 0.24085, + "Long": 75.5671, + "Peri": 77.612, + "Ecc": 0.205627, + "Axis": 0.387098, + "Incl": 7.0051, + "Node": 48.449, + "Theta0": 6.74, + "V0": -0.42 + }, + "Venus": { + "Tp": 0.615207, + "Long": 272.30044, + "Peri": 131.54, + "Ecc": 0.006812, + "Axis": 0.723329, + "Incl": 3.3947, + "Node": 76.769, + "Theta0": 16.92, + "V0": -4.4 + }, + "Earth": { + "Tp": 0.999996, + "Long": 99.556772, + "Peri": 103.2055, + "Ecc": 0.016671, + "Axis": 0.999985, + "Incl": None, + "Node": None, + "Theta0": None, + "V0": None + }, + "Mars": { + "Tp": 1.880765, + "Long": 109.09646, + "Peri": 336.217, + "Ecc": 0.093348, + "Axis": 1.523689, + "Incl": 1.8497, + "Node": 49.632, + "Theta0": 9.36, + "V0": -1.52 + }, + "Jupiter": { + "Tp": 11.857911, + "Long": 337.917132, + "Peri": 14.6633, + "Ecc": 0.048907, + "Axis": 5.20278, + "Incl": 1.3035, + "Node": 100.595, + "Theta0": 196.74, + "V0": -9.4 + }, + "Saturn": { + "Tp": 29.310579, + "Long": 172.398316, + "Peri": 89.567, + "Ecc": 0.053853, + "Axis": 9.51134, + "Incl": 2.4873, + "Node": 113.752, + "Theta0": 165.6, + "V0": -8.88 + }, + "Uranus": { + "Tp": 84.039492, + "Long": 356.135400, + "Peri": 172.884833, + "Ecc": 0.046321, + "Axis": 19.21814, + "Incl": 0.773059, + "Node": 73.926961, + "Theta0": 65.8, + "V0": -7.19 + }, + "Neptune": { + "Tp": 165.845392, + "Long": 326.895127, + "Peri": 23.07, + "Ecc": 0.010483, + "Axis": 30.1985, + "Incl": 1.7673, + "Node": 131.879, + "Theta0": 62.2, + "V0": -6.87 + } +} + +def get_planet_data(planet_name): + """ + Get planet data. + + Arguments: + planet_name -- Name of planet, e.g., "Jupiter" + + Returns a dictionary object with the following elements: + Tp -- Period of orbit. + Long -- Longitude at the epoch. + Peri -- Longitude of the perihelion. + Ecc -- Eccentricity of the orbit. + Axis -- Semi-major axis of the orbit. + Incl -- Orbital inclination. + Node -- Longitude of the ascending node. + Theta0 -- ? + V0 -- ? + """ + return PlanetData.get(planet_name) diff --git a/practical_astronomy/source/src/practical_astronomy/pa_sun.py b/practical_astronomy/source/src/practical_astronomy/pa_sun.py new file mode 100644 index 0000000000000000000000000000000000000000..64646adcd1fcdb788939895e4ca191e6172cfc1f --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_sun.py @@ -0,0 +1,268 @@ +import math +from . import pa_macro as PM + +def approximate_position_of_sun(lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction): + """ + Calculate approximate position of the sun for a local date and time. + + Arguments: + lct_hours -- Local civil time, in hours. + lct_minutes -- Local civil time, in minutes. + lct_seconds -- Local civil time, in seconds. + local_day -- Local date, day part. + local_month -- Local date, month part. + local_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction -- Time zone correction, in hours. + + Returns: + sun_ra_hour -- Right Ascension of Sun, hour part + sun_ra_min -- Right Ascension of Sun, minutes part + sun_ra_sec -- Right Ascension of Sun, seconds part + sun_dec_deg -- Declination of Sun, degrees part + sun_dec_min -- Declination of Sun, minutes part + sun_dec_sec -- Declination of Sun, seconds part + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + greenwich_date_day = PM.lct_gday(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + greenwich_date_month = PM.lct_gmonth(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + greenwich_date_year = PM.lct_gyear(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + ut_hours = PM.lct_ut(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + ut_days = ut_hours / 24 + jd_days = PM.cd_jd(greenwich_date_day,greenwich_date_month,greenwich_date_year) + ut_days + d_days = jd_days - PM.cd_jd(0,1,2010) + n_deg = 360 * d_days / 365.242191 + m_deg1 = n_deg + PM.sun_e_long(0,1,2010) - PM.sun_peri(0,1,2010) + m_deg2 = m_deg1 - 360 * math.floor(m_deg1/360) + e_c_deg = 360 * PM.sun_ecc(0,1,2010) * math.sin(math.radians(m_deg2)) / math.pi + l_s_deg1 = n_deg + e_c_deg + PM.sun_e_long(0,1,2010) + l_s_deg2 = l_s_deg1 - 360 * math.floor(l_s_deg1/360) + ra_deg = PM.ec_ra(l_s_deg2,0,0,0,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year) + ra_hours = PM.dd_dh(ra_deg) + dec_deg = PM.ec_dec(l_s_deg2,0,0,0,0,0,greenwich_date_day,greenwich_date_month,greenwich_date_year) + + sun_ra_hour = PM.dh_hour(ra_hours) + sun_ra_min = PM.dh_min(ra_hours) + sun_ra_sec = PM.dh_sec(ra_hours) + sun_dec_deg = PM.dd_deg(dec_deg) + sun_dec_min = PM.dd_min(dec_deg) + sun_dec_sec = PM.dd_sec(dec_deg) + + return sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec + +def precise_position_of_sun(lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction): + """ + Calculate precise position of the sun for a local date and time. + + Arguments: + lct_hours -- Local civil time, in hours. + lct_minutes -- Local civil time, in minutes. + lct_seconds -- Local civil time, in seconds. + local_day -- Local date, day part. + local_month -- Local date, month part. + local_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction -- Time zone correction, in hours. + + Returns: + sun_ra_hour -- Right Ascension of Sun, hour part + sun_ra_min -- Right Ascension of Sun, minutes part + sun_ra_sec -- Right Ascension of Sun, seconds part + sun_dec_deg -- Declination of Sun, degrees part + sun_dec_min -- Declination of Sun, minutes part + sun_dec_sec -- Declination of Sun, seconds part + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + g_day = PM.lct_gday(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + g_month = PM.lct_gmonth(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + g_year = PM.lct_gyear(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + sun_ecliptic_longitude_deg = PM.sun_long(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + ra_deg = PM.ec_ra(sun_ecliptic_longitude_deg,0,0,0,0,0,g_day,g_month,g_year) + ra_hours = PM.dd_dh(ra_deg) + dec_deg = PM.ec_dec(sun_ecliptic_longitude_deg,0,0,0,0,0,g_day,g_month,g_year) + + sun_ra_hour = PM.dh_hour(ra_hours) + sun_ra_min = PM.dh_min(ra_hours) + sun_ra_sec = PM.dh_sec(ra_hours) + sun_dec_deg = PM.dd_deg(dec_deg) + sun_dec_min = PM.dd_min(dec_deg) + sun_dec_sec = PM.dd_sec(dec_deg) + + return sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec + +def sun_distance_and_angular_size(lct_hours, lct_minutes, lct_seconds, local_day, local_month, local_year, is_daylight_saving, zone_correction): + """ + Calculate distance to the Sun (in km), and angular size. + + Arguments: + lct_hours -- Local civil time, in hours. + lct_minutes -- Local civil time, in minutes. + lct_seconds -- Local civil time, in seconds. + local_day -- Local date, day part. + local_month -- Local date, month part. + local_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction -- Time zone correction, in hours. + + Returns: + sun_dist_km -- Sun's distance, in kilometers + sun_ang_size_deg -- Sun's angular size (degrees part) + sun_ang_size_min -- Sun's angular size (minutes part) + sun_ang_size_sec -- Sun's angular size (seconds part) + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + g_day = PM.lct_gday(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + g_month = PM.lct_gmonth(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + g_year = PM.lct_gyear(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + true_anomaly_deg = PM.sun_true_anomaly(lct_hours,lct_minutes,lct_seconds,daylight_saving,zone_correction,local_day,local_month,local_year) + true_anomaly_rad = math.radians(true_anomaly_deg) + eccentricity = PM.sun_ecc(g_day,g_month,g_year) + f = (1 + eccentricity * math.cos(true_anomaly_rad)) / (1 - eccentricity * eccentricity) + r_km = 149598500 / f + theta_deg = f * 0.533128 + + sun_dist_km = round(r_km,-2) + sun_ang_size_deg = PM.dd_deg(theta_deg) + sun_ang_size_min = PM.dd_min(theta_deg) + sun_ang_size_sec = PM.dd_sec(theta_deg) + + return sun_dist_km,sun_ang_size_deg,sun_ang_size_min,sun_ang_size_sec + +def sunrise_and_sunset(local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg): + """ + Calculate local sunrise and sunset. + + Arguments: + local_day -- Local date, day part. + local_month -- Local date, month part. + local_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction -- Time zone correction, in hours. + geographical_long_deg -- Geographical longitude, in degrees. + geographical_lat_deg -- Geographical latitude, in degrees. + + Returns: + local_sunrise_hour -- Local sunrise, hour part + local_sunrise_minute -- Local sunrise, minutes part + local_sunset_hour -- Local sunset, hour part + local_sunset_minute -- Local sunset, minutes part + azimuth_of_sunrise_deg -- Azimuth (horizon direction) of sunrise, in degrees + azimuth_of_sunset_deg -- Azimuth (horizon direction) of sunset, in degrees + status -- Calculation status + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + local_sunrise_hours = PM.sunrise_lct(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg) + + local_sunset_hours = PM.sunset_lct(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg) + + sun_rise_set_status = PM.e_sun_rs(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg) + + adjusted_sunrise_hours = local_sunrise_hours + 0.008333 + adjusted_sunset_hours = local_sunset_hours + 0.008333 + azimuth_of_sunrise_deg1 = PM.sunrise_az(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg) + azimuth_of_sunset_deg1 = PM.sunset_az(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg) + + local_sunrise_hour = PM.dh_hour(adjusted_sunrise_hours) if sun_rise_set_status == "OK" else None + local_sunrise_minute = PM.dh_min(adjusted_sunrise_hours) if sun_rise_set_status == "OK" else None + local_sunset_hour = PM.dh_hour(adjusted_sunset_hours) if sun_rise_set_status == "OK" else None + local_sunset_minute = PM.dh_min(adjusted_sunset_hours) if sun_rise_set_status == "OK" else None + azimuth_of_sunrise_deg = round(azimuth_of_sunrise_deg1,2) if sun_rise_set_status == "OK" else None + azimuth_of_sunset_deg = round(azimuth_of_sunset_deg1,2) if sun_rise_set_status == "OK" else None + status = sun_rise_set_status + + return local_sunrise_hour,local_sunrise_minute,local_sunset_hour,local_sunset_minute,azimuth_of_sunrise_deg,azimuth_of_sunset_deg,status + +def morning_and_evening_twilight(local_day, local_month, local_year, is_daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type): + """ + Calculate times of morning and evening twilight. + + Arguments: + local_day -- Local date, day part. + local_month -- Local date, month part. + local_year -- Local date, year part. + is_daylight_saving -- Is daylight savings in effect? + zone_correction -- Time zone correction, in hours. + geographical_long_deg -- Geographical longitude, in degrees. + geographical_lat_deg -- Geographical latitude, in degrees. + twilight_type -- "C" (civil), "N" (nautical), or "A" (astronomical) + + Returns: + am_twilight_begins_hour -- Beginning of AM twilight (hour part) + am_twilight_begins_min -- Beginning of AM twilight (minutes part) + pm_twilight_ends_hour -- Ending of PM twilight (hour part) + pm_twilight_ends_min -- Ending of PM twilight (minutes part) + status -- Calculation status + """ + daylight_saving = 1 if is_daylight_saving == True else 0 + + start_of_am_twilight_hours = PM.twilight_am_lct(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type) + + end_of_pm_twilight_hours = PM.twilight_pm_lct(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type) + + twilight_status = PM.e_twilight(local_day, local_month, local_year, daylight_saving, zone_correction, geographical_long_deg, geographical_lat_deg, twilight_type) + + adjusted_am_start_time = start_of_am_twilight_hours + 0.008333 + adjusted_pm_start_time = end_of_pm_twilight_hours + 0.008333 + + am_twilight_begins_hour = PM.dh_hour(adjusted_am_start_time) if twilight_status == "OK" else None + am_twilight_begins_min = PM.dh_min(adjusted_am_start_time) if twilight_status == "OK" else None + pm_twilight_ends_hour = PM.dh_hour(adjusted_pm_start_time) if twilight_status == "OK" else None + pm_twilight_ends_min = PM.dh_min(adjusted_pm_start_time) if twilight_status == "OK" else None + status = twilight_status + + return am_twilight_begins_hour,am_twilight_begins_min,pm_twilight_ends_hour,pm_twilight_ends_min,status + +def equation_of_time(gwdate_day, gwdate_month, gwdate_year): + """ + Calculate the equation of time. (The difference between the real Sun time and the mean Sun time.) + + Arguments: + gwdate_day -- Greenwich date (day part) + gwdate_month -- Greenwich date (month part) + gwdate_year -- Greenwich date (year part) + + Returns: + equation_of_time_min -- equation of time (minute part) + equation_of_time_sec -- equation of time (seconds part) + """ + sun_longitude_deg = PM.sun_long(12,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + sun_ra_hours = PM.dd_dh(PM.ec_ra(sun_longitude_deg,0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year)) + equivalent_ut_hours = PM.gst_ut(sun_ra_hours,0,0,gwdate_day,gwdate_month,gwdate_year) + equation_of_time_hours = equivalent_ut_hours - 12 + + equation_of_time_min = PM.dh_min(equation_of_time_hours) + equation_of_time_sec = PM.dh_sec(equation_of_time_hours) + + return equation_of_time_min,equation_of_time_sec + +def solar_elongation(ra_hour, ra_min, ra_sec, dec_deg, dec_min, dec_sec, gwdate_day, gwdate_month, gwdate_year): + """ + Calculate solar elongation for a celestial body. + + Solar elongation is the angle between the lines of sight from the Earth to the Sun and from the Earth to the celestial body. + + Arguments: + ra_hour -- Right Ascension, hour part + ra_min -- Right Ascension, minutes part + ra_sec -- Right Ascension, seconds part + dec_deg -- Declination, degrees part + dec_min -- Declination, minutes part + dec_sec -- Declination, seconds part + gwdate_day -- Greenwich Date, day part + gwdate_month -- Greenwich Date, month part + gwdate_year -- Greenwich Date, year part + + Returns: + solar_elongation_deg -- Solar elongation, in degrees + """ + sun_longitude_deg = PM.sun_long(0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + sun_ra_hours = PM.dd_dh(PM.ec_ra(sun_longitude_deg,0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year)) + sun_dec_deg = PM.ec_dec(sun_longitude_deg,0,0,0,0,0,gwdate_day,gwdate_month,gwdate_year) + solar_elongation_deg = PM.angle(sun_ra_hours,0,0,sun_dec_deg,0,0,ra_hour,ra_min,ra_sec,dec_deg,dec_min,dec_sec,"H") + + return round(solar_elongation_deg,2) + \ No newline at end of file diff --git a/practical_astronomy/source/src/practical_astronomy/pa_util.py b/practical_astronomy/source/src/practical_astronomy/pa_util.py new file mode 100644 index 0000000000000000000000000000000000000000..167c3e7d7b52c56053ef28242292b22e4833f301 --- /dev/null +++ b/practical_astronomy/source/src/practical_astronomy/pa_util.py @@ -0,0 +1,17 @@ +def is_leap_year(year): + """ Returns True or False indicating if the specified year is a leap year. """ + if (year % 4) == 0: + if (year % 100) == 0: + return True if (year % 400) == 0 else False + else: + return True + else: + return False + +def mi_to_km(miles): + """ Convert miles to kilometers. """ + return miles * 1.609344 + +def km_to_mi(kilometers): + """ Convert kilometers to miles. """ + return kilometers * 0.6213712 diff --git a/practical_astronomy/source/test_coordinate.py b/practical_astronomy/source/test_coordinate.py new file mode 100644 index 0000000000000000000000000000000000000000..034fd69f24770b4a85ca3c8d923606efaac60e3c --- /dev/null +++ b/practical_astronomy/source/test_coordinate.py @@ -0,0 +1,438 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_coordinate as PC +import unittest as UT + +def get_decimal_degrees(degrees,minutes,seconds): + resultDecimalDegrees = round(PC.angle_to_decimal_degrees(degrees,minutes,seconds),7) + + return resultDecimalDegrees + +class test_angle_decimal_degrees(UT.TestCase): + def setUp(self): + self.degrees = 182 + self.minutes = 31 + self.seconds = 27 + + def test_angle_to_decimal_degrees(self): + resultDecimalDegrees = get_decimal_degrees(self.degrees,self.minutes,self.seconds) + + print(f"Angle to Decimal Degrees: [Angle] {self.degrees}d {self.minutes}m {self.seconds}s = [Decimal Degrees] {resultDecimalDegrees}") + + self.assertEqual(resultDecimalDegrees,182.5241667,"Decimal Degrees") + + def test_decimal_degrees_to_angle(self): + resultDecimalDegrees = get_decimal_degrees(self.degrees,self.minutes,self.seconds) + + revertDegrees,revertMinutes,revertSeconds = PC.decimal_degrees_to_angle(resultDecimalDegrees) + + print(f"Decimal Degrees to Angle: [Decimal Degrees] {resultDecimalDegrees} = [Angle] {revertDegrees}d {revertMinutes}m {revertSeconds}s") + + self.assertEqual(revertDegrees,182,"Angle Degrees") + self.assertEqual(revertMinutes,31,"Angle Minutes") + self.assertEqual(revertSeconds,27,"Angle Seconds") + +class test_right_ascension_hour_angle(UT.TestCase): + def setUp(self): + self.ra_hours = 18 + self.ra_minutes = 32 + self.ra_seconds = 21 + self.lct_hours = 14 + self.lct_minutes = 36 + self.lct_seconds = 51.67 + self.is_daylight_saving = False + self.zone_correction = -4 + self.local_day = 22 + self.local_month = 4 + self.local_year = 1980 + self.geographical_longitude = -64 + + def test_right_ascension_to_hour_angle(self): + hour_angle_hours,hour_angle_minutes,hour_angle_seconds = PC.right_ascension_to_hour_angle(self.ra_hours,self.ra_minutes,self.ra_seconds,self.lct_hours,self.lct_minutes,self.lct_seconds,self.is_daylight_saving,self.zone_correction,self.local_day,self.local_month,self.local_year,self.geographical_longitude) + + print(f"Right Ascension to Hour Angle: [RA] {self.ra_hours}:{self.ra_minutes}:{self.ra_seconds} [LCT] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [DS] {self.is_daylight_saving} [ZC] {self.zone_correction} [LD] {self.local_month}/{self.local_day}/{self.local_year} [LON] {self.geographical_longitude} = [HA] {hour_angle_hours}:{hour_angle_minutes}:{hour_angle_seconds}") + + self.assertEqual(hour_angle_hours,9,"Hour Angle Hours") + self.assertEqual(hour_angle_minutes,52,"Hour Angle Minutes") + self.assertEqual(hour_angle_seconds,23.66,"Hour Angle Seconds") + + def test_hour_angle_to_right_ascension(self): + hour_angle_hours,hour_angle_minutes,hour_angle_seconds = PC.right_ascension_to_hour_angle(self.ra_hours,self.ra_minutes,self.ra_seconds,self.lct_hours,self.lct_minutes,self.lct_seconds,self.is_daylight_saving,self.zone_correction,self.local_day,self.local_month,self.local_year,self.geographical_longitude) + + right_ascension_hours,right_ascension_minutes,right_ascension_seconds = PC.hour_angle_to_right_ascension(hour_angle_hours,hour_angle_minutes,hour_angle_seconds,self.lct_hours,self.lct_minutes,self.lct_seconds,self.is_daylight_saving,self.zone_correction,self.local_day,self.local_month,self.local_year,self.geographical_longitude) + + print(f"Hour Angle to Right Ascension: [HA] {hour_angle_hours}:{hour_angle_minutes}:{hour_angle_seconds} [LCT] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [DS] {self.is_daylight_saving} [ZC] {self.zone_correction} [LD] {self.local_month}/{self.local_day}/{self.local_year} [LON] {self.geographical_longitude} = [RA] {self.ra_hours}:{self.ra_minutes}:{self.ra_seconds}") + + self.assertEqual(right_ascension_hours,18,"Right Ascension Hours") + self.assertEqual(right_ascension_minutes,32,"Right Ascension Minutes") + self.assertEqual(right_ascension_seconds,21,"Right Ascension Seconds") + +class test_equatorial_coordinates_horizon_coordinates(UT.TestCase): + def setUp(self): + self.hour_angle_hours = 5 + self.hour_angle_minutes = 51 + self.hour_angle_seconds = 44 + self.declination_degrees = 23 + self.declination_minutes = 13 + self.declination_seconds = 10 + self.geographical_latitude = 52 + + def test_equatorial_coordinates_to_horizon_coordinates(self): + azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds = PC.equatorial_coordinates_to_horizon_coordinates(self.hour_angle_hours,self.hour_angle_minutes,self.hour_angle_seconds,self.declination_degrees,self.declination_minutes,self.declination_seconds,self.geographical_latitude) + + print(f"Equatorial Coordinates to Horizon Coordinates: [HA] {self.hour_angle_hours}:{self.hour_angle_minutes}:{self.hour_angle_seconds} [DEC] {self.declination_degrees}d {self.declination_minutes}m {self.declination_seconds}s [LAT] {self.geographical_latitude} = [AZ] {azimuth_degrees}d {azimuth_minutes}m {azimuth_seconds}s [ALT] {altitude_degrees}d {altitude_minutes}m {altitude_seconds}s") + + self.assertEqual(azimuth_degrees,283,"Azimuth Degrees") + self.assertEqual(azimuth_minutes,16,"Azimuth Minutes") + self.assertEqual(azimuth_seconds,15.7,"Azimuth Seconds") + self.assertEqual(altitude_degrees,19,"Altitude Degrees") + self.assertEqual(altitude_minutes,20,"Altitude Minutes") + self.assertEqual(altitude_seconds,3.64,"Altitude Seconds") + + def test_horizon_coordinates_to_equatorial_coordinates(self): + azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds = PC.equatorial_coordinates_to_horizon_coordinates(self.hour_angle_hours,self.hour_angle_minutes,self.hour_angle_seconds,self.declination_degrees,self.declination_minutes,self.declination_seconds,self.geographical_latitude) + + hour_angle_hours,hour_angle_minutes,hour_angle_seconds,declination_degrees,declination_minutes,declination_seconds = PC.horizon_coordinates_to_equatorial_coordinates(azimuth_degrees,azimuth_minutes,azimuth_seconds,altitude_degrees,altitude_minutes,altitude_seconds,self.geographical_latitude) + + print(f"Horizon Coordinates to Equatorial Coordinates: [AZ] {azimuth_degrees}d {azimuth_minutes}m {azimuth_seconds}s [ALT] {altitude_degrees}d {altitude_minutes}m {altitude_seconds}s [LAT] {self.geographical_latitude} = [HA] {hour_angle_hours}:{hour_angle_minutes}:{hour_angle_seconds} [DEC] {declination_degrees}d {declination_minutes}m {declination_seconds}s)") + + self.assertEqual(hour_angle_hours,5,"Hour Angle Hours") + self.assertEqual(hour_angle_minutes,51,"Hour Angle Minutes") + self.assertEqual(hour_angle_seconds,44,"Hour Angle Seconds") + self.assertEqual(declination_degrees,23,"Declination Degrees") + self.assertEqual(declination_minutes,13,"Declination Minutes") + self.assertEqual(declination_seconds,10,"Declination Seconds") + +class test_ecliptic(UT.TestCase): + def setUp(self): + self.ecliptic_longitude_degrees = 139 + self.ecliptic_longitude_minutes = 41 + self.ecliptic_longitude_seconds = 10 + self.ecliptic_latitude_degrees = 4 + self.ecliptic_latitude_minutes = 52 + self.ecliptic_latitude_seconds = 31 + self.greenwich_day = 6 + self.greenwich_month = 7 + self.greenwich_year = 2009 + + def test_mean_obliquity_of_the_ecliptic(self): + g_day = 6 + g_month = 7 + g_year = 2009 + + obliquity = PC.mean_obliquity_of_the_ecliptic(g_day,g_month,g_year) + obliquity = round(obliquity,8) + + print(f"Mean obliquity of the ecliptic: [Greenwich Date] {g_month}/{g_day}/{g_year} = [Obliquity] {obliquity}") + + self.assertEqual(obliquity,23.43805531,"Obliquity") + + def test_ecliptic_coordinate_to_equatorial_coordinate(self): + ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds = PC.ecliptic_coordinate_to_equatorial_coordinate(self.ecliptic_longitude_degrees,self.ecliptic_longitude_minutes,self.ecliptic_longitude_seconds,self.ecliptic_latitude_degrees,self.ecliptic_latitude_minutes,self.ecliptic_latitude_seconds,self.greenwich_day,self.greenwich_month,self.greenwich_year) + + print(f"Ecliptic Coordinates to Equatorial Coordinates: [LON] {self.ecliptic_longitude_degrees}d {self.ecliptic_longitude_minutes}m {self.ecliptic_longitude_seconds}s [LAT] {self.ecliptic_latitude_degrees}d {self.ecliptic_latitude_minutes}m {self.ecliptic_latitude_seconds}s [GD] {self.greenwich_month}/{self.greenwich_day}/{self.greenwich_year} = [RA] {ra_hours}:{ra_minutes}:{ra_seconds} [DEC] {dec_degrees}d {dec_minutes}m {dec_seconds}s") + + self.assertEqual(ra_hours,9,"RA Hours") + self.assertEqual(ra_minutes,34,"RA Minutes") + self.assertEqual(ra_seconds,53.4,"RA Seconds") + self.assertEqual(dec_degrees,19,"Dec Degrees") + self.assertEqual(dec_minutes,32,"Dec Minutes") + self.assertEqual(dec_seconds,8.52,"Dec Seconds") + + def test_equatorial_coordinate_to_ecliptic_coordinate(self): + ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds = PC.ecliptic_coordinate_to_equatorial_coordinate(self.ecliptic_longitude_degrees,self.ecliptic_longitude_minutes,self.ecliptic_longitude_seconds,self.ecliptic_latitude_degrees,self.ecliptic_latitude_minutes,self.ecliptic_latitude_seconds,self.greenwich_day,self.greenwich_month,self.greenwich_year) + + ecl_long_deg,ecl_long_min,ecl_long_sec,ecl_lat_deg,ecl_lat_min,ecl_lat_sec = PC.equatorial_coordinate_to_ecliptic_coordinate(ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds,self.greenwich_day,self.greenwich_month,self.greenwich_year) + + print(f"Equatorial Coordinates to Ecliptic Coordinates: [RA] {ra_hours}:{ra_minutes}:{ra_seconds} [DEC] {dec_degrees}d {dec_minutes}m {dec_seconds}s [GD] {self.greenwich_month}/{self.greenwich_day}/{self.greenwich_year} = [LON] {ecl_long_deg}d {ecl_long_min}m {ecl_long_sec}s [LAT] {ecl_lat_deg}d {ecl_lat_min}m {ecl_lat_sec}s") + + self.assertEqual(ecl_long_deg,139,"Ecliptic Longitude Degrees") + self.assertEqual(ecl_long_min,41,"Ecliptic Longitude Minutes") + self.assertEqual(ecl_long_sec,9.97,"Ecliptic Longitude Seconds") + self.assertEqual(ecl_lat_deg,4,"Ecliptic Latitude Degrees") + self.assertEqual(ecl_lat_min,52,"Ecliptic Latitude Minutes") + self.assertEqual(ecl_lat_sec,30.99,"Ecliptic Latitude Seconds") + +class test_galactic(UT.TestCase): + def setUp(self): + self.ra_hours = 10 + self.ra_minutes = 21 + self.ra_seconds = 0 + self.dec_degrees = 10 + self.dec_minutes = 3 + self.dec_seconds = 11 + + def test_equatorial_coordinate_to_galactic_coordinate(self): + gal_long_deg,gal_long_min,gal_long_sec,gal_lat_deg,gal_lat_min,gal_lat_sec = PC.equatorial_coordinate_to_galactic_coordinate(self.ra_hours,self.ra_minutes,self.ra_seconds,self.dec_degrees,self.dec_minutes,self.dec_seconds) + + print(f"Equatorial Coordinates to Galactic Coordinates: [EQ] [RA] {self.ra_hours}:{self.ra_minutes}:{self.ra_seconds} [DEC] {self.dec_degrees}d {self.dec_minutes}m {self.dec_seconds}s = [GAL] [LON] {gal_long_deg}d {gal_long_min}m {gal_long_sec}s [LAT] {gal_lat_deg}d {gal_lat_min}m {gal_lat_sec}s") + + self.assertEqual(gal_long_deg,232,"Galactic Longitude Degrees") + self.assertEqual(gal_long_min,14,"Galactic Longitude Minutes") + self.assertEqual(gal_long_sec,52.38,"Galactic Longitude Seconds") + self.assertEqual(gal_lat_deg,51,"Galactic Latitude Degrees") + self.assertEqual(gal_lat_min,7,"Galactic Latitude Minutes") + self.assertEqual(gal_lat_sec,20.16,"Galactic Latitude Seconds") + + def test_galactic_coordinate_to_equatorial_coordinate(self): + gal_long_deg,gal_long_min,gal_long_sec,gal_lat_deg,gal_lat_min,gal_lat_sec = PC.equatorial_coordinate_to_galactic_coordinate(self.ra_hours,self.ra_minutes,self.ra_seconds,self.dec_degrees,self.dec_minutes,self.dec_seconds) + + ra_hours,ra_minutes,ra_seconds,dec_degrees,dec_minutes,dec_seconds = PC.galactic_coordinate_to_equatorial_coordinate(gal_long_deg,gal_long_min,gal_long_sec,gal_lat_deg,gal_lat_min,gal_lat_sec) + + print(f"Galactic Coordinates to Equatorial Coordinates: [GAL] [LON] {gal_long_deg}d {gal_long_min}m {gal_long_sec}s [LAT] {gal_lat_deg}d {gal_lat_min}m {gal_lat_sec}s = [EQ] [RA] {ra_hours}:{ra_minutes}:{ra_seconds} [DEC] {dec_degrees}d {dec_minutes}m {dec_seconds}s") + + self.assertEqual(ra_hours,10,"Right Ascension Hours") + self.assertEqual(ra_minutes,21,"Right Ascension Minutes") + self.assertEqual(ra_seconds,0,"Right Ascension Seconds") + self.assertEqual(dec_degrees,10,"Declination Degrees") + self.assertEqual(dec_minutes,3,"Declination Degrees") + self.assertEqual(dec_seconds,11,"Declination Seconds") + +class test_object_angles(UT.TestCase): + def setUp(self): + self.ra_long_1_hour_deg = 5 + self.ra_long_1_min = 13 + self.ra_long_1_sec = 31.7 + self.dec_lat_1_deg = -8 + self.dec_lat_1_min = 13 + self.dec_lat_1_sec = 30 + self.ra_long_2_hour_deg = 6 + self.ra_long_2_min = 44 + self.ra_long_2_sec = 13.4 + self.dec_lat_2_deg = -16 + self.dec_lat_2_min = 41 + self.dec_lat_2_sec = 11 + self.hour_or_degree = "H" + + def test_angle_between_two_objects(self): + + angle_deg,angle_min,angle_sec = PC.angle_between_two_objects(self.ra_long_1_hour_deg,self.ra_long_1_min,self.ra_long_1_sec,self.dec_lat_1_deg,self.dec_lat_1_min,self.dec_lat_1_sec,self.ra_long_2_hour_deg,self.ra_long_2_min,self.ra_long_2_sec,self.dec_lat_2_deg,self.dec_lat_2_min,self.dec_lat_2_sec,self.hour_or_degree) + + print (f"Angle between two objects: [OBJ 1] [RA LON] {self.ra_long_1_hour_deg}h/d {self.ra_long_1_min}m {self.ra_long_1_sec}s [DEC LAT] {self.dec_lat_1_deg}d {self.dec_lat_1_min}m {self.dec_lat_1_sec}s [OBJ 2] [RA LON] {self.ra_long_2_hour_deg}h/d {self.ra_long_2_min}m {self.ra_long_2_sec}s [DEC LAT] {self.dec_lat_2_deg}d {self.dec_lat_2_min}m {self.dec_lat_2_sec}s [TYPE] {self.hour_or_degree} = [ANGLE] {angle_deg}d {angle_min}m {angle_sec}s") + + self.assertEqual(angle_deg,23,"Angle Degrees") + self.assertEqual(angle_min,40,"Angle Minutes") + self.assertEqual(angle_sec,25.86,"Angle Seconds") + +class test_rise_set(UT.TestCase): + def setUp(self): + self.ra_hours = 23 + self.ra_minutes = 39 + self.ra_seconds = 20 + self.dec_deg = 21 + self.dec_min = 42 + self.dec_sec = 0 + self.gw_date_day = 24 + self.gw_date_month = 8 + self.gw_date_year = 2010 + self.geog_long_deg = 64 + self.geog_lat_deg = 30 + self.vert_shift_deg = 0.5667 + + def test_rising_and_setting(self): + rise_set_status,ut_rise_hour,ut_rise_min,ut_set_hour,ut_set_min,az_rise,az_set = PC.rising_and_setting(self.ra_hours,self.ra_minutes,self.ra_seconds,self.dec_deg,self.dec_min,self.dec_sec,self.gw_date_day,self.gw_date_month,self.gw_date_year,self.geog_long_deg,self.geog_lat_deg,self.vert_shift_deg) + + print(f"Rising and setting times: [RA] {self.ra_hours}:{self.ra_minutes}:{self.ra_seconds} [DEC] {self.dec_deg}d {self.dec_min}m {self.dec_sec}s [GWD] {self.gw_date_month}/{self.gw_date_day}/{self.gw_date_year} [LON] {self.geog_long_deg} [LAT] {self.geog_lat_deg} [VS] {self.vert_shift_deg} = [STATUS] {rise_set_status} [UT] [RISE] {ut_rise_hour}:{ut_rise_min} [SET] {ut_set_hour}:{ut_set_min} [AZ] [RISE] {az_rise} [SET] {az_set}") + + self.assertEqual(rise_set_status,"OK","Rise/Set Status") + self.assertEqual(ut_rise_hour,14,"UT Rise Hour") + self.assertEqual(ut_rise_min,16,"UT Rise Minute") + self.assertEqual(ut_set_hour,4,"UT Set Hour") + self.assertEqual(ut_set_min,10,"UT Set Minute") + self.assertEqual(az_rise,64.36,"AZ Rise") + self.assertEqual(az_set,295.64,"AZ Set") + +class test_precession(UT.TestCase): + def setUp(self): + self.ra_hour = 9 + self.ra_minutes = 10 + self.ra_seconds = 43 + self.dec_deg = 14 + self.dec_minutes = 23 + self.dec_seconds = 25 + self.epoch1_day = 0.923 + self.epoch1_month = 1 + self.epoch1_year = 1950 + self.epoch2_day = 1 + self.epoch2_month = 6 + self.epoch2_year = 1979 + + def test_precession(self): + corrected_ra_hour,corrected_ra_minutes,corrected_ra_seconds,corrected_dec_deg,corrected_dec_minutes,corrected_dec_seconds = PC.correct_for_precession(self.ra_hour,self.ra_minutes,self.ra_seconds,self.dec_deg,self.dec_minutes,self.dec_seconds,self.epoch1_day,self.epoch1_month,self.epoch1_year,self.epoch2_day,self.epoch2_month,self.epoch2_year) + + print(f"Precession: [RA] {self.ra_hour}:{self.ra_minutes}:{self.ra_seconds} [DEC] {self.dec_deg}d {self.dec_minutes}m {self.dec_seconds}s [EPOCH 1] {self.epoch1_month}/{self.epoch1_day}/{self.epoch1_year} [EPOCH 2] {self.epoch2_month}/{self.epoch2_day}/{self.epoch2_year} = [Corrected] [RA] {corrected_ra_hour}:{corrected_ra_minutes}:{corrected_ra_seconds} [DEC] {corrected_dec_deg}d {corrected_dec_minutes}m {corrected_dec_seconds}s") + + self.assertEqual(corrected_ra_hour,9,"Corrected Right Ascension Hour") + self.assertEqual(corrected_ra_minutes,12,"Corrected Right Ascension Minutes") + self.assertEqual(corrected_ra_seconds,20.18,"Corrected Right Ascension Seconds") + self.assertEqual(corrected_dec_deg,14,"Corrected Declination Hour") + self.assertEqual(corrected_dec_minutes,16,"Corrected Declination Minutes") + self.assertEqual(corrected_dec_seconds,9.12,"Corrected Declination Seconds") + +class test_nutation(UT.TestCase): + def setUp(self): + self.greenwich_day = 1 + self.greenwich_month = 9 + self.greenwich_year = 1988 + + def test_nutation(self): + nut_in_long_deg,nut_in_obl_deg = PC.nutation_in_ecliptic_longitude_and_obliquity(self.greenwich_day,self.greenwich_month,self.greenwich_year) + + nut_in_long_deg = round(nut_in_long_deg,9) + nut_in_obl_deg = round(nut_in_obl_deg,7) + + print(f"Nutation: [GWDATE] {self.greenwich_month}/{self.greenwich_day}/{self.greenwich_year} = [NUTATION] [LON] {nut_in_long_deg} [OBL] {nut_in_obl_deg}") + + self.assertEqual(nut_in_long_deg,0.001525808,"Nutation in Longitude (degrees)") + self.assertEqual(nut_in_obl_deg,0.0025671,"Nutation in Obliquity (degrees)") + +class test_aberration(UT.TestCase): + def setUp(self): + self.ut_hour = 0 + self.ut_minutes = 0 + self.ut_seconds = 0 + self.gw_day = 8 + self.gw_month = 9 + self.gw_year = 1988 + self.true_ecl_long_deg = 352 + self.true_ecl_long_min = 37 + self.true_ecl_long_sec = 10.1 + self.true_ecl_lat_deg = -1 + self.true_ecl_lat_min = 32 + self.true_ecl_lat_sec = 56.4 + + def test_correct_for_aberration(self): + apparent_ecl_long_deg,apparent_ecl_long_min,apparent_ecl_long_sec,apparent_ecl_lat_deg,apparent_ecl_lat_min,apparent_ecl_lat_sec = PC.correct_for_aberration(self.ut_hour,self.ut_minutes,self.ut_seconds,self.gw_day,self.gw_month,self.gw_year,self.true_ecl_long_deg,self.true_ecl_long_min,self.true_ecl_long_sec,self.true_ecl_lat_deg,self.true_ecl_lat_min,self.true_ecl_lat_sec) + + print(f"Aberration: [UT] {self.ut_hour}:{self.ut_minutes}:{self.ut_seconds} [GWD] {self.gw_month}/{self.gw_day}/{self.gw_year} [ECL] [LON] {self.true_ecl_long_deg}d {self.true_ecl_long_min}m {self.true_ecl_long_sec}s [LAT] {self.true_ecl_lat_deg}d {self.true_ecl_lat_min}m {self.true_ecl_lat_sec}s = [Apparent ECL] [LON] {apparent_ecl_long_deg}d {apparent_ecl_long_min}m {apparent_ecl_long_sec}s [LAT] {apparent_ecl_lat_deg}d {apparent_ecl_lat_min}m {apparent_ecl_lat_sec}s") + + self.assertEqual(apparent_ecl_long_deg,352,"Apparent Ecliptic Longitude Degrees") + self.assertEqual(apparent_ecl_long_min,37,"Apparent Ecliptic Longitude Minutes") + self.assertEqual(apparent_ecl_long_sec,30.45,"Apparent Ecliptic Longitude Seconds") + self.assertEqual(apparent_ecl_lat_deg,-1,"Apparent Ecliptic Latitude Degrees") + self.assertEqual(apparent_ecl_lat_min,32,"Apparent Ecliptic Latitude Minutes") + self.assertEqual(apparent_ecl_lat_sec,56.33,"Apparent Ecliptic Latitude Seconds") + +class test_atmospheric_refraction(UT.TestCase): + def setUp(self): + self.true_ra_hour = 23 + self.true_ra_min = 14 + self.true_ra_sec = 0 + self.true_dec_deg = 40 + self.true_dec_min = 10 + self.true_dec_sec = 0 + self.coordinate_type = "TRUE" + self.geog_long_deg = 0.17 + self.geog_lat_deg = 51.2036110 + self.daylight_saving_hours = 0 + self.timezone_hours = 0 + self.lcd_day = 23 + self.lcd_month = 3 + self.lcd_year = 1987 + self.lct_hour = 1 + self.lct_min = 1 + self.lct_sec = 24 + self.atmospheric_pressure_mbar = 1012 + self.atmospheric_temperature_celsius = 21.7 + + def test_atmospheric_refraction(self): + corrected_ra_hour,corrected_ra_min,corrected_ra_sec,corrected_dec_deg,corrected_dec_min,corrected_dec_sec = PC.atmospheric_refraction(self.true_ra_hour,self.true_ra_min,self.true_ra_sec,self.true_dec_deg,self.true_dec_min,self.true_dec_sec,self.coordinate_type,self.geog_long_deg,self.geog_lat_deg,self.daylight_saving_hours,self.timezone_hours,self.lcd_day,self.lcd_month,self.lcd_year,self.lct_hour,self.lct_min,self.lct_sec,self.atmospheric_pressure_mbar,self.atmospheric_temperature_celsius) + + print(f"Refraction: [RA] {self.true_ra_hour}:{self.true_ra_min}:{self.true_ra_sec} [DEC] {self.true_dec_deg}d {self.true_dec_min}m {self.true_dec_sec}s [COORD TYPE] {self.coordinate_type} [GEOG LON/LAT] {self.geog_long_deg}d/{self.geog_lat_deg}d [DS HOURS] {self.daylight_saving_hours} [TZ HOURS] {self.timezone_hours} [LCD] {self.lcd_month}/{self.lcd_day}/{self.lcd_year} [LCT] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [ATM] [PRESS MBR] {self.atmospheric_pressure_mbar} [TEMP C] {self.atmospheric_temperature_celsius} = [CORRECTED] [RA] {corrected_ra_hour}:{corrected_ra_min}:{corrected_ra_sec} [DEC] {corrected_dec_deg}d {corrected_dec_min}m {corrected_dec_sec}s") + + self.assertEqual(corrected_ra_hour,23,"Corrected RA Hours") + self.assertEqual(corrected_ra_min,13,"Corrected RA Minutes") + self.assertEqual(corrected_ra_sec,44.74,"Corrected RA Seconds") + self.assertEqual(corrected_dec_deg,40,"Corrected Declination Degrees") + self.assertEqual(corrected_dec_min,19,"Corrected Declination Minutes") + self.assertEqual(corrected_dec_sec,45.76,"Corrected Declination Seconds") + +class test_geocentric_parallax(UT.TestCase): + def setUp(self): + self.ra_hour = 22 + self.ra_min = 35 + self.ra_sec = 19 + self.dec_deg = -7 + self.dec_min = 41 + self.dec_sec = 13 + self.coordinate_type = "TRUE" + self.equatorial_hor_parallax_deg = 1.019167 + self.geog_long_deg = -100 + self.geog_lat_deg = 50 + self.height_m = 60 + self.daylight_saving = 0 + self.timezone_hours = -6 + self.lcd_day = 26 + self.lcd_month = 2 + self.lcd_year = 1979 + self.lct_hour = 10 + self.lct_min = 45 + self.lct_sec = 0 + + def test_corrections_for_geocentric_parallax(self): + corrected_ra_hour,corrected_ra_min,corrected_ra_sec,corrected_dec_deg,corrected_dec_min,corrected_dec_sec = PC.corrections_for_geocentric_parallax(self.ra_hour,self.ra_min,self.ra_sec,self.dec_deg,self.dec_min,self.dec_sec,self.coordinate_type,self.equatorial_hor_parallax_deg,self.geog_long_deg,self.geog_lat_deg,self.height_m,self.daylight_saving,self.timezone_hours,self.lcd_day,self.lcd_month,self.lcd_year,self.lct_hour,self.lct_min,self.lct_sec) + + print(f"Geocentric parallax: [RA] {self.ra_hour}:{self.ra_min}:{self.ra_sec} [DEC] {self.dec_deg}d {self.dec_min}m {self.dec_sec}s [COORD TYPE] {self.coordinate_type} [EQ HOR PARA DEG] {self.equatorial_hor_parallax_deg} [GEOG] [LON] {self.geog_long_deg} [LAT] {self.geog_lat_deg} [HEIGHT] {self.height_m} [DS] {self.daylight_saving} [TZ] {self.timezone_hours} [LCD] {self.lcd_month}/{self.lcd_day}/{self.lcd_year} [LCT] {self.lct_hour}:{self.lct_min}:{self.lct_sec} = [CORRECTED] [RA] {corrected_ra_hour}:{corrected_ra_min}:{corrected_ra_sec} [DEC] {corrected_dec_deg}d {corrected_dec_min}m {corrected_dec_sec}s") + + self.assertEqual(corrected_ra_hour,22,"Corrected RA Hours") + self.assertEqual(corrected_ra_min,36,"Corrected RA Minutes") + self.assertEqual(corrected_ra_sec,43.22,"Corrected RA Seconds") + self.assertEqual(corrected_dec_deg,-8,"Corrected Declination Degrees") + self.assertEqual(corrected_dec_min,32,"Corrected Declination Minutes") + self.assertEqual(corrected_dec_sec,17.4,"Corrected Declination Seconds") + +class test_heliographic_coordinates(UT.TestCase): + def setUp(self): + self.helio_position_angle_deg = 220 + self.helio_displacement_arcmin = 10.5 + self.gwdate_day = 1 + self.gwdate_month = 5 + self.gwdate_year = 1988 + + def test_heliographic_coordinates(self): + helio_long_deg,helio_lat_deg = PC.heliographic_coordinates(self.helio_position_angle_deg,self.helio_displacement_arcmin,self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Heliographic coordinates: [helio] [pos angle] {self.helio_position_angle_deg} [displ arcmin] {self.helio_displacement_arcmin}, [GW Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [helio] [lon] {helio_long_deg}d [lat] {helio_lat_deg}d") + + self.assertEqual(helio_long_deg,142.59,"Heliographic Longitude - degrees") + self.assertEqual(helio_lat_deg,-19.94,"Heliographic Latitude - degrees") + +class test_carrington_rotation_number(UT.TestCase): + def setUp(self): + self.gwdate_day = 27 + self.gwdate_month = 1 + self.gwdate_year = 1975 + + def test_carrington_rotation_number(self): + crn = PC.carrington_rotation_number(self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Carrington Rotation Number: [GW Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [CRN] {crn}") + + self.assertEqual(crn,1624,"Carrington Rotation Number") + +class test_selenographic_coordinates(UT.TestCase): + def setUp(self): + self.gwdate_day = 1 + self.gwdate_month = 5 + self.gwdate_year = 1988 + + def test_selenographic_coordinates_1(self): + sub_earth_longitude,sub_earth_latitude,position_angle_of_pole = PC.selenographic_coordinates_1(self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Selenographic Coordinates 1: [GW Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Sub Earth] [LON] {sub_earth_longitude} [LAT] {sub_earth_latitude}, [POS ANGLE OF POLE] {position_angle_of_pole}") + + self.assertEqual(sub_earth_longitude,-4.88,"Sub-Earth Longitude") + self.assertEqual(sub_earth_latitude,4.04,"Sub-Earth Latitude") + self.assertEqual(position_angle_of_pole,19.78,"Position Angle of Pole") + + def test_selenographic_coordinates_2(self): + sub_solar_longitude,sub_solar_colongitude,sub_solar_latitude = PC.selenographic_coordinates_2(self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Selenographic Coordinates 2: [GW Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Sub Solar] [LON] {sub_solar_longitude} [COLN] {sub_solar_colongitude} [LAT] {sub_solar_latitude}") + + self.assertEqual(sub_solar_longitude,6.81,"Sub-Solar Longitude") + self.assertEqual(sub_solar_colongitude,83.19,"Sub-Solar Colongitude") + self.assertEqual(sub_solar_latitude,1.19,"Sub-Solar Latitude") + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_date_of_easter.py b/practical_astronomy/source/test_date_of_easter.py new file mode 100644 index 0000000000000000000000000000000000000000..8aa674a50d426a6a6469d483bc5c6fdbaaf7c46f --- /dev/null +++ b/practical_astronomy/source/test_date_of_easter.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import unittest as UT +import src.practical_astronomy.pa_datetime as DOE + +def test_input(isVerbose): + inputYear = 2009 + + easterMonth,easterDay,easterYear = DOE.get_date_of_easter(inputYear) + if isVerbose == True: + print("__Test Date of Easter functions__") + print(f"[Test Inputs] Given a year of {inputYear}, the date of Easter is {easterMonth}/{easterDay}/{easterYear}") + + return inputYear,easterMonth,easterDay,easterYear + +class test_doe(UT.TestCase): + @classmethod + def setUpClass(cls): + test_input(True) + + def setUp(self): + inputYear,easterMonth,easterDay,easterYear = test_input(False) + self.easterMonth = easterMonth + self.easterDay = easterDay + self.easterYear = easterYear + + def test_date_result(self): + self.assertEqual(self.easterMonth,4,"Incorrect month") + self.assertEqual(self.easterDay,12,"Incorrect day") + self.assertEqual(self.easterYear,2009,"Incorrect year") + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_day_number.py b/practical_astronomy/source/test_day_number.py new file mode 100644 index 0000000000000000000000000000000000000000..7c74c8b2495808b797e442d447734be32e1031ed --- /dev/null +++ b/practical_astronomy/source/test_day_number.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import unittest as UT +import src.practical_astronomy.pa_datetime as PD + +def test_gen(month,day,year): + dayNumber = PD.civil_date_to_day_number(month,day,year) + print(f"Test input: {month}/{day}/{year}, test output: {dayNumber}") + + return dayNumber + +class test_day_numbers(UT.TestCase): + def test_1_1_2000(self): + self.assertEqual(test_gen(1,1,2000),1) + + def test_3_1_2000(self): + self.assertEqual(test_gen(3,1,2000),61) + + def test_6_1_2003(self): + self.assertEqual(test_gen(6,1,2003),152) + + def test_11_27_2009(self): + self.assertEqual(test_gen(11,27,2009),331) + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_eclipses.py b/practical_astronomy/source/test_eclipses.py new file mode 100644 index 0000000000000000000000000000000000000000..0c9ddf6b0f20b94951930509c2a03b0134329812 --- /dev/null +++ b/practical_astronomy/source/test_eclipses.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_eclipses as PE +import unittest as UT + +class test_lunar_eclipse(UT.TestCase): + def setUp(self): + self.local_date_day = 1 + self.local_date_month = 4 + self.local_date_year = 2015 + self.is_daylight_saving = False + self.zone_correction_hours = 10 + + def test_lunar_eclipse_occurrence(self): + status,event_date_day,event_date_month,event_date_year = PE.lunar_eclipse_occurrence(self.local_date_day,self.local_date_month,self.local_date_year,self.is_daylight_saving,self.zone_correction_hours) + + print(f"Lunar eclipse occurrence: [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours}h = [Status] {status} [Event Date] {event_date_month}/{event_date_day}/{event_date_year}") + + self.assertEqual(status,"Lunar eclipse certain","Lunar eclipse status") + self.assertEqual(event_date_day,4,"Lunar eclipse event date (day)") + self.assertEqual(event_date_month,4,"Lunar eclipse event date (month)") + self.assertEqual(event_date_year,2015,"Lunar eclipse event date (year)") + + def test_lunar_eclipse_circumstances(self): + lunar_eclipse_certain_date_day, lunar_eclipse_certain_date_month, lunar_eclipse_certain_date_year, ut_start_pen_phase_hour, ut_start_pen_phase_minutes, ut_start_umbral_phase_hour, ut_start_umbral_phase_minutes, ut_start_total_phase_hour, ut_start_total_phase_minutes, ut_mid_eclipse_hour, ut_mid_eclipse_minutes, ut_end_total_phase_hour, ut_end_total_phase_minutes, ut_end_umbral_phase_hour, ut_end_umbral_phase_minutes, ut_end_pen_phase_hour, ut_end_pen_phase_minutes, eclipse_magnitude = PE.lunar_eclipse_circumstances(self.local_date_day,self.local_date_month,self.local_date_year,self.is_daylight_saving,self.zone_correction_hours) + + print(f"Lunar eclipse circumstances: [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} = [Eclipse Date] {lunar_eclipse_certain_date_month}/{lunar_eclipse_certain_date_day}/{lunar_eclipse_certain_date_year} [Start Penumbral Phase] {ut_start_pen_phase_hour}:{ut_start_pen_phase_minutes} [Start Umbral Phase] {ut_start_umbral_phase_hour}:{ut_start_umbral_phase_minutes} [Start Total Phase] {ut_start_total_phase_hour}:{ut_start_total_phase_minutes} [Mid Eclipse] {ut_mid_eclipse_hour}:{ut_mid_eclipse_minutes} [End Total Phase] {ut_end_total_phase_hour}:{ut_end_total_phase_minutes} [End Umbral Phase] {ut_end_umbral_phase_hour}:{ut_end_umbral_phase_minutes} [End Penumbral Phase] {ut_end_pen_phase_hour}:{ut_end_pen_phase_minutes} [Magnitude] {eclipse_magnitude}") + + self.assertEqual(lunar_eclipse_certain_date_day,4,"Eclipse Date (day)") + self.assertEqual(lunar_eclipse_certain_date_month,4,"Eclipse Date (month)") + self.assertEqual(lunar_eclipse_certain_date_year,2015,"Eclipse Date (year)") + self.assertEqual(ut_start_pen_phase_hour,9,"Start Penumbral Phase (hour)") + self.assertEqual(ut_start_pen_phase_minutes,0,"Start Penumbral Phase (minutes)") + self.assertEqual(ut_start_umbral_phase_hour,10,"Start Umbral Phase (hour)") + self.assertEqual(ut_start_umbral_phase_minutes,16,"Start Umbral Phase (minutes)") + self.assertEqual(ut_start_total_phase_hour,11,"Start Total Phase (hour)") + self.assertEqual(ut_start_total_phase_minutes,55,"Start Total Phase (minutes)") + self.assertEqual(ut_mid_eclipse_hour,12,"Mid Eclipse (hour)") + self.assertEqual(ut_mid_eclipse_minutes,1,"Mid Eclipse (minutes)") + self.assertEqual(ut_end_total_phase_hour,12,"End Total Phase (hour)") + self.assertEqual(ut_end_total_phase_minutes,7,"End Total Phase (minutes)") + self.assertEqual(ut_end_umbral_phase_hour,13,"End Umbral Phase (hour)") + self.assertEqual(ut_end_umbral_phase_minutes,46,"End Umbral Phase (minutes)") + self.assertEqual(ut_end_pen_phase_hour,15,"End Penumbral Phase (hour)") + self.assertEqual(ut_end_pen_phase_minutes,1,"End Penumbral Phase (minutes)") + self.assertEqual(eclipse_magnitude,1.01,"Eclipse Magnitude") + +class test_solar_eclipse_occurrence(UT.TestCase): + def setUp(self): + self.local_date_day = 1 + self.local_date_month = 4 + self.local_date_year = 2015 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + + def test_solar_eclipse_occurrence(self): + status,event_date_day,event_date_month,event_date_year = PE.solar_eclipse_occurrence(self.local_date_day,self.local_date_month,self.local_date_year,self.is_daylight_saving,self.zone_correction_hours) + + print(f"Solar eclipse occurrence: [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours}h = [Status] {status} [Event Date] {event_date_month}/{event_date_day}/{event_date_year}") + + self.assertEqual(status,"Solar eclipse certain","Lunar eclipse status") + self.assertEqual(event_date_day,20,"Solar eclipse event date (day)") + self.assertEqual(event_date_month,3,"Solar eclipse event date (month)") + self.assertEqual(event_date_year,2015,"Solar eclipse event date (year)") + +class test_solar_eclipse_circumstances(UT.TestCase): + def setUp(self): + self.local_date_day = 20 + self.local_date_month = 3 + self.local_date_year = 2015 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.geog_longitude_deg = 0 + self.geog_latitude_deg = 68.65 + + def test_solar_eclipse_circumstances(self): + solar_eclipse_certain_date_day, solar_eclipse_certain_date_month, solar_eclipse_certain_date_year, ut_first_contact_hour, ut_first_contact_minutes, ut_mid_eclipse_hour, ut_mid_eclipse_minutes, ut_last_contact_hour, ut_last_contact_minutes, eclipse_magnitude = PE.solar_eclipse_circumstances(self.local_date_day,self.local_date_month,self.local_date_year,self.is_daylight_saving,self.zone_correction_hours, self.geog_longitude_deg, self.geog_latitude_deg) + + print(f"Solar eclipse circumstances: [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Longitude] {self.geog_longitude_deg} degrees [Latitude] {self.geog_latitude_deg} degrees = [Eclipse Date] {solar_eclipse_certain_date_month}/{solar_eclipse_certain_date_day}/{solar_eclipse_certain_date_year} [First Contact] {ut_first_contact_hour}:{ut_first_contact_minutes} [Mid-Eclipse] {ut_mid_eclipse_hour}:{ut_mid_eclipse_minutes} [Last Contact] {ut_last_contact_hour}:{ut_last_contact_minutes} [Magnitude] {eclipse_magnitude}") + + self.assertEqual(solar_eclipse_certain_date_day,20,"Eclipse Date (day)") + self.assertEqual(solar_eclipse_certain_date_month,3,"Eclipse Date (month)") + self.assertEqual(solar_eclipse_certain_date_year,2015,"Eclipse Date (year)") + self.assertEqual(ut_first_contact_hour,8,"First Contact (hour)") + self.assertEqual(ut_first_contact_minutes,55,"First Contact (minutes)") + self.assertEqual(ut_mid_eclipse_hour,9,"Mid Eclipse (hour)") + self.assertEqual(ut_mid_eclipse_minutes,57,"Mid Eclipse (minutes)") + self.assertEqual(ut_last_contact_hour,10,"Last Contact (hour)") + self.assertEqual(ut_last_contact_minutes,58,"Last Contact (minutes)") + self.assertEqual(eclipse_magnitude,1.016,"Eclipse Magnitude") + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_julian.py b/practical_astronomy/source/test_julian.py new file mode 100644 index 0000000000000000000000000000000000000000..fbdb3b2da5fedb8aadee62615e728dd8056c8a71 --- /dev/null +++ b/practical_astronomy/source/test_julian.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_datetime as PD +import unittest as UT + +def get_julian_date(month,day,year): + return PD.greenwich_date_to_julian_date(day,month,year) + +class test_julian(UT.TestCase): + def setUp(self): + self.inputMonth = 6 + self.inputDay = 19.75 + self.inputYear = 2009 + + def test_greenwich_to_julian(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + print(f"Julian Date for {self.inputMonth}/{self.inputDay}/{self.inputYear} is {julianDate}") + + self.assertEqual(julianDate,2455002.25,"Conversion to Julian Date") + + def test_day_of_week(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + dayOfWeek = PD.julian_date_to_weekday_name(julianDate) + print(f"The day of the week for Julian Date {julianDate} is {dayOfWeek}") + + self.assertEqual(dayOfWeek,"Friday","Get Day of Week") + + def test_julian_to_greenwich(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + day,month,year = PD.julian_date_to_greenwich_date(julianDate) + print(f"Converting {julianDate} back to Greenwich Date gives {month}/{day}/{year}") + + self.assertEqual(month,6,"Month") + self.assertEqual(day,19.75,"Day") + self.assertEqual(year,2009,"Year") + + def test_day_part(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + dayPart=PD.julian_date_day(julianDate) + print(f"The day part of {julianDate} is {dayPart}") + + self.assertEqual(dayPart,19.75,"Day part") + + def test_month_part(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + monthPart=PD.julian_date_month(julianDate) + print(f"The month part of {julianDate} is {monthPart}") + + self.assertEqual(monthPart,6,"Month part") + + def test_year_part(self): + julianDate = get_julian_date(self.inputMonth,self.inputDay,self.inputYear) + yearPart=PD.julian_date_year(julianDate) + print(f"The year part of {julianDate} is {yearPart}") + + self.assertEqual(yearPart,2009,"Year part") + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_moon.py b/practical_astronomy/source/test_moon.py new file mode 100644 index 0000000000000000000000000000000000000000..dddb2bbf49442e34bbf5ce0222986738a10fbdeb --- /dev/null +++ b/practical_astronomy/source/test_moon.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_moon as PMO +import unittest as UT + +class test_moon_position_and_info(UT.TestCase): + def setUp(self): + self.lct_hour = 0 + self.lct_min = 0 + self.lct_sec = 0 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.local_date_day = 1 + self.local_date_month = 9 + self.local_date_year = 2003 + + def test_approximate_position_of_moon(self): + moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec = PMO.approximate_position_of_moon(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year) + + print(f"Approximate position of Moon: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} = [Right Ascension] {moon_ra_hour}h {moon_ra_min}m {moon_ra_sec}s [Declination] {moon_dec_deg}d {moon_dec_min}m {moon_dec_sec}s") + + self.assertEqual(moon_ra_hour,14,"Moon RA (hour)") + self.assertEqual(moon_ra_min,12,"Moon RA (minutes)") + self.assertEqual(moon_ra_sec,42.31,"Moon RA (seconds)") + self.assertEqual(moon_dec_deg,-11, "Moon Declination (degrees)") + self.assertEqual(moon_dec_min,31,"Moon Declination (minutes)") + self.assertEqual(moon_dec_sec,38.27,"Moon Declination (seconds)") + + def test_precise_position_of_moon(self): + moon_ra_hour, moon_ra_min, moon_ra_sec, moon_dec_deg, moon_dec_min, moon_dec_sec, earth_moon_dist_km, moon_hor_parallax_deg = PMO.precise_position_of_moon(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year) + + print(f"Precise position of Moon: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} = [Right Ascension] {moon_ra_hour}h {moon_ra_min}m {moon_ra_sec}s [Declination] {moon_dec_deg}d {moon_dec_min}m {moon_dec_sec}s [Earth-Moon distance] {earth_moon_dist_km} km [Horizontal Parallax] {moon_hor_parallax_deg} degrees") + + self.assertEqual(moon_ra_hour,14,"Moon RA (hour)") + self.assertEqual(moon_ra_min,12,"Moon RA (minutes)") + self.assertEqual(moon_ra_sec,10.21,"Moon RA (seconds)") + self.assertEqual(moon_dec_deg,-11, "Moon Declination (degrees)") + self.assertEqual(moon_dec_min,34,"Moon Declination (minutes)") + self.assertEqual(moon_dec_sec,57.83,"Moon Declination (seconds)") + self.assertEqual(earth_moon_dist_km,367964,"Earth-Moon distance (km)") + self.assertEqual(moon_hor_parallax_deg,0.993191,"Moon Horizontal Parallax (degrees)") + + def test_moon_phase(self): + moon_phase, pa_bright_limb_deg = PMO.moon_phase(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year) + + print(f"Moon phase: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} = [Phase] {moon_phase} [Position Angle of Bright Limb] {pa_bright_limb_deg}") + + self.assertEqual(moon_phase,0.22,"Moon Phase") + self.assertEqual(pa_bright_limb_deg,-71.58,"Position Angle of Bright Limb") + + def test_moon_dist_ang_diam_hor_parallax(self): + earth_moon_dist, ang_diameter_deg, ang_diameter_min, hor_parallax_deg, hor_parallax_min, hor_parallax_sec = PMO.moon_dist_ang_diam_hor_parallax(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year) + + print(f"Moon distance, angular diameter, and horizontal parallax: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} = [Earth-Moon Dist] {earth_moon_dist} km [Angular Diameter] {ang_diameter_deg}d {ang_diameter_min}m [Horizontal Parallax] {hor_parallax_deg}d {hor_parallax_min}m {hor_parallax_sec}s") + + self.assertEqual(earth_moon_dist,367960,"Earth-Moon distance (km)") + self.assertEqual(ang_diameter_deg,0,"Angular diameter (degrees part)") + self.assertEqual(ang_diameter_min,32,"Angular diameter (minutes part)") + self.assertEqual(hor_parallax_deg,0,"Horizontal parallax (degrees part)") + self.assertEqual(hor_parallax_min,59,"Horizontal parallax (minutes part)") + self.assertEqual(hor_parallax_sec,35.49,"Horizontal parallax (seconds part)") + +class test_new_moon_and_full_moon(UT.TestCase): + def setUp(self): + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.local_date_day = 1 + self.local_date_month = 9 + self.local_date_year = 2003 + + def test_times_of_new_moon_and_full_moon(self): + nm_local_time_hour, nm_local_time_min, nm_local_date_day, nm_local_date_month, nm_local_date_year, fm_local_time_hour, fm_local_time_min, fm_local_date_day, fm_local_date_month, fm_local_date_year = PMO.times_of_new_moon_and_full_moon(self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year) + + print(f"New moon and full moon: [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} = [New Moon] {nm_local_time_hour}:{nm_local_time_min} on {nm_local_date_month}/{nm_local_date_day}/{nm_local_date_year} [Full Moon] {fm_local_time_hour}:{fm_local_time_min} on {fm_local_date_month}/{fm_local_date_day}/{fm_local_date_year}") + + self.assertEqual(nm_local_time_hour,17,"new Moon instant - local time (hour)") + self.assertEqual(nm_local_time_min,27,"new Moon instant - local time (minutes)") + self.assertEqual(nm_local_date_day,27,"new Moon instance - local date (day)") + self.assertEqual(nm_local_date_month,8,"new Moon instance - local date (month)") + self.assertEqual(nm_local_date_year,2003,"new Moon instance - local date (year)") + self.assertEqual(fm_local_time_hour,16,"full Moon instant - local time (hour)") + self.assertEqual(fm_local_time_min,36,"full Moon instant - local time (minutes)") + self.assertEqual(fm_local_date_day,10,"full Moon instance - local date (day)") + self.assertEqual(fm_local_date_month,9,"full Moon instance - local date (month)") + self.assertEqual(fm_local_date_year,2003,"full Moon instance - local date (year)") + +class test_moonrise_moonset(UT.TestCase): + def setUp(self): + self.local_date_day = 6 + self.local_date_month = 3 + self.local_date_year = 1986 + self.is_daylight_saving = False + self.zone_correction_hours = -5 + self.geog_long_deg = -71.05 + self.geog_lat_deg = 42.3667 + + def test_moonrise_moonset(self): + mr_lt_hour, mr_lt_min, mr_local_date_day, mr_local_date_month, mr_local_date_year, mr_azimuth_deg, ms_lt_hour, ms_lt_min, ms_local_date_day, ms_local_date_month, ms_local_date_year, ms_azimuth_deg = PMO.moonrise_and_moonset(self.local_date_day,self.local_date_month,self.local_date_year,self.is_daylight_saving,self.zone_correction_hours,self.geog_long_deg,self.geog_lat_deg) + + print(f"Moonrise and moonset: [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Geographical Coordinates] [Longitude] {self.geog_long_deg} degrees [Latitude] {self.geog_lat_deg} degrees = [Moonrise] [Time] {mr_lt_hour}:{mr_lt_min} [Date] {mr_local_date_month}/{mr_local_date_day}/{mr_local_date_year} [Azimuth] {mr_azimuth_deg} degrees [Moonset] [Time] {ms_lt_hour}:{ms_lt_min} [Date] {ms_local_date_month}/{ms_local_date_day}/{ms_local_date_year} [Azimuth] {ms_azimuth_deg} degrees") + + self.assertEqual(mr_lt_hour,4,"Moonrise - Local Time (hours)") + self.assertEqual(mr_lt_min,21,"Moonrise - Local Time (minutes)") + self.assertEqual(mr_local_date_day,6,"Moonrise - Local Date (day)") + self.assertEqual(mr_local_date_month,3,"Moonrise - Local Date (month)") + self.assertEqual(mr_local_date_year,1986,"Moonrise - Local Date (year)") + self.assertEqual(mr_azimuth_deg,127.34,"Moonrise - Azimuth (degrees)") + self.assertEqual(ms_lt_hour,13,"Moonset - Local Time (hours)") + self.assertEqual(ms_lt_min,8,"Moonset - Local Time (minutes)") + self.assertEqual(ms_local_date_day,6,"Moonset - Local Date (day)") + self.assertEqual(ms_local_date_month,3,"Moonset - Local Date (month)") + self.assertEqual(ms_local_date_year,1986,"Moonset - Local Date (year)") + self.assertEqual(ms_azimuth_deg,234.05,"Moonset - Azimuth (degrees)") + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_planet_comet_binary.py b/practical_astronomy/source/test_planet_comet_binary.py new file mode 100644 index 0000000000000000000000000000000000000000..ccf644002a4d2ef2b9cb5c3fbebbb9d711bc2a22 --- /dev/null +++ b/practical_astronomy/source/test_planet_comet_binary.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_comet as PC +import src.practical_astronomy.pa_planet as PP +import src.practical_astronomy.pa_binary as PB +import unittest as UT + +class test_position_of_planet(UT.TestCase): + def setUp(self): + self.lct_hour = 0 + self.lct_min = 0 + self.lct_sec = 0 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.local_date_day = 22 + self.local_date_month = 11 + self.local_date_year = 2003 + self.planet_name = "Jupiter" + + def test_approximate_position_of_planet(self): + planet_ra_hour, planet_ra_min, planet_ra_sec, planet_dec_deg, planet_dec_min, planet_dec_sec = PP.approximate_position_of_planet(self.lct_hour,self.lct_min,self.lct_sec,self.is_daylight_saving,self.zone_correction_hours,self.local_date_day,self.local_date_month,self.local_date_year,self.planet_name) + + print(f"Approximate position of planet: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [Planet] {self.planet_name} = [Right Ascension] {planet_ra_hour}h {planet_ra_min}m {planet_ra_sec}s [Declination] {planet_dec_deg}d {planet_dec_min}m {planet_dec_sec}s") + + self.assertEqual(planet_ra_hour,11,"Planet Right Ascension (hour)") + self.assertEqual(planet_ra_min,11,"Planet Right Ascension (minutes)") + self.assertEqual(planet_ra_sec,13.8,"Planet Right Ascension (seconds)") + self.assertEqual(planet_dec_deg,6,"Planet Declination (degrees)") + self.assertEqual(planet_dec_min,21,"Planet Declination (minutes)") + self.assertEqual(planet_dec_sec,25.1,"Planet Declination (seconds)") + + def test_precise_position_of_planet(self): + planet_ra_hour, planet_ra_min, planet_ra_sec, planet_dec_deg, planet_dec_min, planet_dec_sec = PP.precise_position_of_planet(self.lct_hour,self.lct_min,self.lct_sec,self.is_daylight_saving,self.zone_correction_hours,self.local_date_day,self.local_date_month,self.local_date_year,self.planet_name) + + print(f"Precise position of planet: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [Planet] {self.planet_name} = [Right Ascension] {planet_ra_hour}h {planet_ra_min}m {planet_ra_sec}s [Declination] {planet_dec_deg}d {planet_dec_min}m {planet_dec_sec}s") + + self.assertEqual(planet_ra_hour,11,"Planet Right Ascension (hour)") + self.assertEqual(planet_ra_min,10,"Planet Right Ascension (minutes)") + self.assertEqual(planet_ra_sec,30.99,"Planet Right Ascension (seconds)") + self.assertEqual(planet_dec_deg,6,"Planet Declination (degrees)") + self.assertEqual(planet_dec_min,25,"Planet Declination (minutes)") + self.assertEqual(planet_dec_sec,49.46,"Planet Declination (seconds)") + + def test_visual_aspects_of_a_planet(self): + distance_au, ang_dia_arcsec, phase, light_time_hour, light_time_minutes, light_time_seconds, pos_angle_bright_limb_deg, approximate_magnitude = PP.visual_aspects_of_a_planet(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year, self.planet_name) + + print(f"Visual aspects of planet: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [Planet] {self.planet_name} = [Distance] {distance_au} au [Angular Diameter] {ang_dia_arcsec} arcsec [Phase] {phase} [Light Time] {light_time_hour}:{light_time_minutes}:{light_time_seconds} [Position Angle of Bright Limb] {pos_angle_bright_limb_deg}d [Magnitude] {approximate_magnitude}") + + self.assertEqual(distance_au,5.59829,"Distance - AU") + self.assertEqual(ang_dia_arcsec,35.1,"Angular Diameter - arcsec") + self.assertEqual(phase,0.99,"Phase") + self.assertEqual(light_time_hour,0,"Light Time - hour part") + self.assertEqual(light_time_minutes,46,"Light Time - minutes part") + self.assertEqual(light_time_seconds,33.32,"Light Time - seconds part") + self.assertEqual(pos_angle_bright_limb_deg,113.2,"Position Angle of Bright Limb - degrees") + self.assertEqual(approximate_magnitude,-2,"Approximate Magnitude") + +class test_position_of_elliptical_comet(UT.TestCase): + def setUp(self): + self.lct_hour = 0 + self.lct_min = 0 + self.lct_sec = 0 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.local_date_day = 1 + self.local_date_month = 1 + self.local_date_year = 1984 + self.comet_name = "Halley" + + def test_position_of_elliptical_comet(self): + comet_ra_hour, comet_ra_min, comet_dec_deg, comet_dec_min, comet_dist_earth = PC.position_of_elliptical_comet(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year, self.comet_name) + + print(f"Position of elliptical comet: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [Comet] {self.comet_name} = [RA] {comet_ra_hour}h {comet_ra_min}m [Declination] {comet_dec_deg}d {comet_dec_min}m [Distance] {comet_dist_earth} AU") + + self.assertEqual(comet_ra_hour,6,"Comet RA - hour") + self.assertEqual(comet_ra_min,29,"Comet RA - minutes") + self.assertEqual(comet_dec_deg,10,"Comet Declination - degrees") + self.assertEqual(comet_dec_min,13,"Comet Declination - minutes") + self.assertEqual(comet_dist_earth,8.13,"Comet Distance from Earth - AU") + +class test_position_of_parabolic_comet(UT.TestCase): + def setUp(self): + self.lct_hour = 0 + self.lct_min = 0 + self.lct_sec = 0 + self.is_daylight_saving = False + self.zone_correction_hours = 0 + self.local_date_day = 25 + self.local_date_month = 12 + self.local_date_year = 1977 + self.comet_name = "Kohler" + + def test_position_of_parabolic_comet(self): + comet_ra_hour, comet_ra_min, comet_ra_sec, comet_dec_deg, comet_dec_min, comet_dec_sec, comet_dist_earth = PC.position_of_parabolic_comet(self.lct_hour, self.lct_min, self.lct_sec, self.is_daylight_saving, self.zone_correction_hours, self.local_date_day, self.local_date_month, self.local_date_year, self.comet_name) + + print(f"Position of parabolic comet: [Local Time] {self.lct_hour}:{self.lct_min}:{self.lct_sec} [DST?] {self.is_daylight_saving} [Zone Correction] {self.zone_correction_hours} [Local Date] {self.local_date_month}/{self.local_date_day}/{self.local_date_year} [Comet] {self.comet_name} = [RA] {comet_ra_hour}h {comet_ra_min}m {comet_ra_sec}s [Declination] {comet_dec_deg}d {comet_dec_min}m {comet_dec_sec}s [Distance] {comet_dist_earth} AU") + + self.assertEqual(comet_ra_hour,23,"Comet RA - hour") + self.assertEqual(comet_ra_min,17,"Comet RA - minutes") + self.assertEqual(comet_ra_sec,11.53,"Comet RA - seconds") + self.assertEqual(comet_dec_deg,-33,"Comet Declination - degrees") + self.assertEqual(comet_dec_min,42,"Comet Declination - minutes") + self.assertEqual(comet_dec_sec,26.42,"Comet Declination - seconds") + self.assertEqual(comet_dist_earth,1.11,"Comet Distance from Earth - AU") + +class test_binary_star_orbit(UT.TestCase): + def setUp(self): + self.greenwich_date_day = 1 + self.greenwich_date_month = 1 + self.greenwich_date_year = 1980 + self.binary_name = "eta-Cor" + + def test_binary_star_orbit(self): + position_angle_deg, separation_arcsec = PB.binary_star_orbit(self.greenwich_date_day, self.greenwich_date_month, self.greenwich_date_year, self.binary_name) + + print(f"Binary star orbit: [Greenwich Date] {self.greenwich_date_month}/{self.greenwich_date_day}/{self.greenwich_date_year} [Binary] {self.binary_name} = [Position Angle] {position_angle_deg}d [Separation] {separation_arcsec} arcsec") + + self.assertEqual(position_angle_deg,318.5,"Position Angle (degrees)") + self.assertEqual(separation_arcsec,0.41,"Separation (arcseconds)") + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_sun.py b/practical_astronomy/source/test_sun.py new file mode 100644 index 0000000000000000000000000000000000000000..9bdede3e642a5409af5cf77a82a9f8e0bc01ed56 --- /dev/null +++ b/practical_astronomy/source/test_sun.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_sun as PS +import unittest as UT + +class test_approximate_position_of_sun(UT.TestCase): + def setUp(self): + self.lct_hours = 0 + self.lct_minutes = 0 + self.lct_seconds = 0 + self.local_day = 27 + self.local_month = 7 + self.local_year = 2003 + self.is_daylight_saving = False + self.zone_correction = 0 + + def test_approximate_position_of_sun(self): + sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec = PS.approximate_position_of_sun(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction) + + print(f"Approximate position of the sun: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [RA] {sun_ra_hour}:{sun_ra_min}:{sun_ra_sec} [Dec] {sun_dec_deg}d {sun_dec_min}m {sun_dec_sec}s") + + self.assertEqual(sun_ra_hour,8,"Sun RA Hour") + self.assertEqual(sun_ra_min,23,"Sun RA Minutes") + self.assertEqual(sun_ra_sec,33.73,"Sun RA Seconds") + self.assertEqual(sun_dec_deg,19,"Sun Dec Degrees") + self.assertEqual(sun_dec_min,21,"Sun Dec Minutes") + self.assertEqual(sun_dec_sec,14.33,"Sun Dec Seconds") + +class test_precise_position_of_sun(UT.TestCase): + def setUp(self): + self.lct_hours = 0 + self.lct_minutes = 0 + self.lct_seconds = 0 + self.local_day = 27 + self.local_month = 7 + self.local_year = 1988 + self.is_daylight_saving = False + self.zone_correction = 0 + + def test_precise_position_of_sun(self): + sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec = PS.precise_position_of_sun(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction) + + print(f"Precise position of the sun: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [RA] {sun_ra_hour}:{sun_ra_min}:{sun_ra_sec} [Dec] {sun_dec_deg}d {sun_dec_min}m {sun_dec_sec}s") + + self.assertEqual(sun_ra_hour,8,"Sun RA Hour") + self.assertEqual(sun_ra_min,26,"Sun RA Minutes") + self.assertEqual(sun_ra_sec,3.83,"Sun RA Seconds") + self.assertEqual(sun_dec_deg,19,"Sun Dec Degrees") + self.assertEqual(sun_dec_min,12,"Sun Dec Minutes") + self.assertEqual(sun_dec_sec,49.72,"Sun Dec Seconds") + +class test_sun_distance_and_angular_size(UT.TestCase): + def setUp(self): + self.lct_hours = 0 + self.lct_minutes = 0 + self.lct_seconds = 0 + self.local_day = 27 + self.local_month = 7 + self.local_year = 1988 + self.is_daylight_saving = False + self.zone_correction = 0 + + def test_sun_distance_and_angular_size(self): + sun_dist_km,sun_ang_size_deg,sun_ang_size_min,sun_ang_size_sec = PS.sun_distance_and_angular_size(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction) + + print(f"Sun's distance and angular size: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [Dist km] {sun_dist_km} [Angular size] {sun_ang_size_deg}d {sun_ang_size_min}m {sun_ang_size_sec}s") + + self.assertEqual(sun_dist_km,151920100,"Sun Distance in km") + self.assertEqual(sun_ang_size_deg,0,"Sun Angular Size Degrees") + self.assertEqual(sun_ang_size_min,31,"Sun Angular Size Minutes") + self.assertEqual(sun_ang_size_sec,29.93,"Sun Angular Size Seconds") + +class test_sunrise_and_sunset(UT.TestCase): + def setUp(self): + self.local_day = 10 + self.local_month = 3 + self.local_year = 1986 + self.is_daylight_saving = False + self.zone_correction = -5 + self.geographical_long_deg = -71.05 + self.geographical_lat_deg = 42.37 + + def test_sunrise_and_sunset(self): + local_sunrise_hour,local_sunrise_minute,local_sunset_hour,local_sunset_minute,azimuth_of_sunrise_deg,azimuth_of_sunset_deg,status = PS.sunrise_and_sunset(self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction, self.geographical_long_deg, self.geographical_lat_deg) + + print(f"Sunrise and sunset: [Local date] {self.local_month}/{self.local_day}/{self.local_year} [DST?] {self.is_daylight_saving} [TZ Correction] {self.zone_correction} [Lat/Long] {self.geographical_lat_deg}/{self.geographical_long_deg} = [Sunrise] [time] {local_sunrise_hour}:{local_sunrise_minute} [Azimuth] {azimuth_of_sunrise_deg}, [Sunset] [time] {local_sunset_hour}:{local_sunset_minute} [Azimuth] {azimuth_of_sunset_deg}, [Status] {status}") + + self.assertEqual(local_sunrise_hour,6,"Local Sunrise Hour") + self.assertEqual(local_sunrise_minute,5,"Local Sunrise Minute") + self.assertEqual(local_sunset_hour,17,"Local Sunset Hour") + self.assertEqual(local_sunset_minute,45,"Local Sunset Minute") + self.assertEqual(azimuth_of_sunrise_deg,94.83,"Azimuth of Sunrise (degrees)") + self.assertEqual(azimuth_of_sunset_deg,265.43,"Azimuth of Sunset (degrees)") + self.assertEqual(status,"OK","Status of Calculation") + +class test_morning_and_evening_twilight(UT.TestCase): + def setUp(self): + self.local_day = 7 + self.local_month = 9 + self.local_year = 1979 + self.is_daylight_saving = False + self.zone_correction = 0 + self.geographical_long_deg = 0 + self.geographical_lat_deg = 52 + self.twilight_type = "A" + + def test_morning_and_evening_twilight(self): + am_twilight_begins_hour,am_twilight_begins_min,pm_twilight_ends_hour,pm_twilight_ends_min,status = PS.morning_and_evening_twilight(self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction, self.geographical_long_deg, self.geographical_lat_deg, self.twilight_type) + + print(f"Morning and evening twilight: [Local date] {self.local_month}/{self.local_day}/{self.local_year} [DST?] {self.is_daylight_saving} [TZ Correction] {self.zone_correction} [Lat/Long] {self.geographical_lat_deg}/{self.geographical_long_deg} [Twilight Type] {self.twilight_type} = [AM Twilight Begins] {am_twilight_begins_hour}:{am_twilight_begins_min} [PM Twilight Ends] {pm_twilight_ends_hour}:{pm_twilight_ends_min}, [Status] {status}") + + self.assertEqual(am_twilight_begins_hour,3,"AM Twilight Begins (hour)") + self.assertEqual(am_twilight_begins_min,17,"AM Twilight Begins (minute)") + self.assertEqual(pm_twilight_ends_hour,20,"PM Twilight Ends (hour)") + self.assertEqual(pm_twilight_ends_min,37,"PM Twilight Ends (minute)") + self.assertEqual(status,"OK","Status of Calculation") + +class test_equation_of_time(UT.TestCase): + def setUp(self): + self.gwdate_day = 27 + self.gwdate_month = 7 + self.gwdate_year = 2010 + + def test_equation_of_time(self): + equation_of_time_min, equation_of_time_sec = PS.equation_of_time(self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Equation of Time: [Greenwich Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Equation of Time] {equation_of_time_min}:{equation_of_time_sec}") + + self.assertEqual(equation_of_time_min,6,"Equation of Time (min)") + self.assertEqual(equation_of_time_sec,31.52,"Equation of Time (sec)") + +class test_solar_elongation(UT.TestCase): + def setUp(self): + self.ra_hour = 10 + self.ra_min = 6 + self.ra_sec = 45 + self.dec_deg = 11 + self.dec_min = 57 + self.dec_sec = 27 + self.gwdate_day = 27.8333333 + self.gwdate_month = 7 + self.gwdate_year = 2010 + + def test_solar_elongation(self): + solar_elongation_deg = PS.solar_elongation(self.ra_hour,self.ra_min,self.ra_sec,self.dec_deg,self.dec_min,self.dec_sec,self.gwdate_day,self.gwdate_month,self.gwdate_year) + + print(f"Solar elongation: [Right Ascension] {self.ra_hour}:{self.ra_min}:{self.ra_sec} [Declination] {self.dec_deg}d {self.dec_min}m {self.dec_sec}s [Greenwich Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Solar Elongation (degrees)] {solar_elongation_deg}") + + self.assertEqual(solar_elongation_deg,24.78,"Solar Elongation (degrees)") + + +if __name__ == '__main__': + UT.main() diff --git a/practical_astronomy/source/test_time.py b/practical_astronomy/source/test_time.py new file mode 100644 index 0000000000000000000000000000000000000000..b143c3ac79a5a107aad83aedc843648fd51b2128 --- /dev/null +++ b/practical_astronomy/source/test_time.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 + +import src.practical_astronomy.pa_datetime as PD +import unittest as UT + +def get_civil_time(hours,minutes,seconds): + decimalHours = PD.civil_time_to_decimal_hours(hours,minutes,seconds) + + return round(decimalHours,8) + +class test_civil_time(UT.TestCase): + def setUp(self): + self.hours = 18 + self.minutes = 31 + self.seconds = 27 + self.decimalHours = get_civil_time(self.hours,self.minutes,self.seconds) + + def test_civil_time_to_decimal_hours(self): + print(f"Decimal hours for {self.hours}:{self.minutes}:{self.seconds} is {self.decimalHours}") + + self.assertEqual(self.decimalHours,18.52416667,"Decimal Hours") + + def test_decimal_hours_to_civil_time(self): + revertHours,revertMinutes,revertSeconds = PD.decimal_hours_to_civil_time(self.decimalHours) + print(f"Converting {self.decimalHours} back to Civil Time gives {revertHours}:{revertMinutes}:{revertSeconds}") + + self.assertEqual(revertHours,18,"Civil Time: Hours") + self.assertEqual(revertMinutes,31,"Civil Time: Minutes") + self.assertEqual(revertSeconds,27,"Civil Time: Seconds") + + def test_decimal_time_parts(self): + hourPart = PD.decimal_hour_hour(self.decimalHours) + minutesPart = PD.decimal_hour_minutes(self.decimalHours) + secondsPart = PD.decimal_hour_seconds(self.decimalHours) + + print(f"The hour part of {self.decimalHours} is {hourPart}") + print(f"The minutes part of {self.decimalHours} is {minutesPart}") + print(f"The seconds part of {self.decimalHours} is {secondsPart}") + + self.assertEqual(hourPart,18,"Hour Part") + self.assertEqual(minutesPart,31,"Minutes Part") + self.assertEqual(secondsPart,27,"Seconds Part") + +class test_local_civil_time(UT.TestCase): + def setUp(self): + self.hours = 3 + self.minutes = 37 + self.seconds = 0 + self.isDaylightSavings = True + self.zoneCorrection = 4 + self.day = 1 + self.month = 7 + self.year = 2013 + + def test_local_civil_time_to_universal_time(self): + utHours,utMinutes,utSeconds,gwDay,gwMonth,gwYear = PD.local_civil_time_to_universal_time(self.hours,self.minutes,self.seconds,self.isDaylightSavings,self.zoneCorrection,self.day,self.month,self.year) + + print(f"[LCT]{self.hours}:{self.minutes}:{self.seconds} [DS]{self.isDaylightSavings} [ZC]{self.zoneCorrection} [LD]{self.month}/{self.day}/{self.year} = [UT]{utHours}:{utMinutes}:{utSeconds} [GWD]{gwMonth}/{gwDay}/{gwYear}") + + self.assertEqual(utHours,22,"UT Hours") + self.assertEqual(utMinutes,37,"UT Minutes") + self.assertEqual(utSeconds,0,"UT Seconds") + self.assertEqual(gwDay,30,"Greenwich Day") + self.assertEqual(gwMonth,6,"Greenwich Month") + self.assertEqual(gwYear,2013,"Greenwich Year") + + def test_universal_time_to_local_civil_time(self): + utHours,utMinutes,utSeconds,gwDay,gwMonth,gwYear = PD.local_civil_time_to_universal_time(self.hours,self.minutes,self.seconds,self.isDaylightSavings,self.zoneCorrection,self.day,self.month,self.year) + + revertLCTHours,revertLCTMinutes,revertLCTSeconds,revertDay,revertMonth,revertYear = PD.universal_time_to_local_civil_time(utHours,utMinutes,utSeconds,self.isDaylightSavings,self.zoneCorrection,gwDay,gwMonth,gwYear) + + print(f"[UT]{utHours}:{utMinutes}:{utSeconds} [DS]{self.isDaylightSavings} [ZC]{self.zoneCorrection} [GWD]{gwMonth}/{gwDay}/{gwYear} = [LCT]{revertLCTHours}:{revertLCTMinutes}:{revertLCTSeconds} [LD]{self.month}/{self.day}/{self.year}") + + self.assertEqual(revertLCTHours,3,"LCT Hours") + self.assertEqual(revertLCTMinutes,37, "LCT Minutes") + self.assertEqual(revertLCTSeconds,0, "LCT Seconds") + self.assertEqual(revertDay,1,"Local Day") + self.assertEqual(revertMonth,7,"Local Month") + self.assertEqual(revertYear,2013,"Local Year") + +class test_sidereal_time_universal_time(UT.TestCase): + def setUp(self): + self.utHours = 14 + self.utMinutes = 36 + self.utSeconds = 51.67 + self.greenwichDay = 22 + self.greenwichMonth = 4 + self.greenwichYear = 1980 + + def test_universal_time_to_greenwich_sidereal_time(self): + gstHours,gstMinutes,gstSeconds = PD.universal_time_to_greenwich_sidereal_time(self.utHours,self.utMinutes,self.utSeconds,self.greenwichDay,self.greenwichMonth,self.greenwichYear) + + print(f"[UT] {self.utHours}:{self.utMinutes}:{self.utSeconds} {self.greenwichMonth}/{self.greenwichDay}/{self.greenwichYear} = [GST] {gstHours}:{gstMinutes}:{gstSeconds}") + + self.assertEqual(gstHours,4,"GST Hours") + self.assertEqual(gstMinutes,40,"GST Minutes") + self.assertEqual(gstSeconds,5.23,"GST Seconds") + + def test_greenwich_sidereal_time_to_universal_time(self): + gstHours,gstMinutes,gstSeconds = PD.universal_time_to_greenwich_sidereal_time(self.utHours,self.utMinutes,self.utSeconds,self.greenwichDay,self.greenwichMonth,self.greenwichYear) + + revertUTHours,revertUTMinutes,revertUTSeconds,statusMessage = PD.greenwich_sidereal_time_to_universal_time(gstHours,gstMinutes,gstSeconds,self.greenwichDay,self.greenwichMonth,self.greenwichYear) + + print(f"[GST] {gstHours}:{gstMinutes}:{gstSeconds} {self.greenwichMonth}/{self.greenwichDay}/{self.greenwichYear} = [UT] {revertUTHours}:{revertUTMinutes}:{revertUTSeconds} [Status] {statusMessage}") + + self.assertEqual(revertUTHours,14,"UT Hours") + self.assertEqual(revertUTMinutes,36,"UT Minutes") + self.assertEqual(revertUTSeconds,51.67,"UT Seconds") + self.assertIn(statusMessage,["OK","Warning"],"Status Message") + +class test_sidereal_time_local_time(UT.TestCase): + def setUp(self): + self.gstHours = 4 + self.gstMinutes = 40 + self.gstSeconds = 5.23 + self.geographicalLongitude = -64 + + def test_greenwich_sidereal_time_to_local_sidereal_time(self): + lstHours,lstMinutes,lstSeconds = PD.greenwich_sidereal_time_to_local_sidereal_time(self.gstHours,self.gstMinutes,self.gstSeconds,self.geographicalLongitude) + + print(f"[GST] {self.gstHours}:{self.gstMinutes}:{self.gstSeconds} [LON] {self.geographicalLongitude} = [LST] {lstHours}:{lstMinutes}:{lstSeconds}") + + self.assertEqual(lstHours,0,"LST Hours") + self.assertEqual(lstMinutes,24,"LST Minutes") + self.assertEqual(lstSeconds,5.23,"LST Seconds") + + def test_local_sidereal_time_to_greenwich_sidereal_time(self): + lstHours,lstMinutes,lstSeconds = PD.greenwich_sidereal_time_to_local_sidereal_time(self.gstHours,self.gstMinutes,self.gstSeconds,self.geographicalLongitude) + + revertGSTHours,revertGSTMinutes,revertGSTSeconds = PD.local_sidereal_time_to_greenwich_sidereal_time(lstHours,lstMinutes,lstSeconds,self.geographicalLongitude) + + print(f"[LST] {lstHours}:{lstMinutes}:{lstSeconds} [LON] {self.geographicalLongitude} = [GST] {revertGSTHours}:{revertGSTMinutes}:{revertGSTSeconds}") + + self.assertEqual(revertGSTHours,4,"GST Hours") + self.assertEqual(revertGSTMinutes,40,"GST Minutes") + self.assertEqual(revertGSTSeconds,5.23,"GST Seconds") + + +if __name__ == '__main__': + UT.main()