Find next Mars/Jupiter/Saturn retrograde
This Stellarium script will find the next time Mars, Jupiter, and Saturn all retrograde at the same time.
// ******************************************************************************************
// Stellarium script to quickly determine when Mars is retrograding between Jupiter and
// Saturn, while they, themselves, are retrograding. It is brain-dead boring tedium,
// watching the screen for long periods to 'notice' this event. Stellarium's scripting
// takes the tedium out of the effort.
//
// Created by David O'Neil, Aug, 2019. Released to the public domain, for anyone interested.
// Just leave this 'created by' (or 'originally created by') verbage in the derived work.
//
// To use:
// * set the date via Stellarium's user interface
// * set the 'daysToAdvance' variable to whatever day step you want. Too big of a step may
// cause you to miss the retrograde event.
// * You might want to change the 'core.wait(0.03);' line to another number, based on your
// computer's capabilities. You will know quickly enough, because no matter what start
// date you set, the script will never advance more than one step because Stellarium is
// retrieving the old values in it's 'getObjectInfo' routines.
// ******************************************************************************************
//Setup and global variables:
core.selectObjectByName("Mars", false);
//core.selectObjectByName("Saturn", false);
StelMovementMgr.setFlagTracking(true);
daysToAdvance = -5; //Can be positive or negative. Change to your purposes.
daysToAdvanceString = ""; //Stellarium doesn't re-zero things on subsequent runs.
if (daysToAdvance > 0) daysToAdvanceString = "+";
//else daysToAdvanceString = "-"; //not needed. Script core keeps as '-5'
daysToAdvanceString = daysToAdvanceString + daysToAdvance + " days";
//core.debug(daysToAdvanceString);
saturnRA = core.getObjectInfo("Saturn").ra;
jupiterRA = core.getObjectInfo("Jupiter").ra;
marsRA = core.getObjectInfo("Mars").ra;
if (daysToAdvance > 0) {
saturnDirection = 1.0;
jupiterDirection = 1.0;
marsDirection = 1.0;
}
else {
saturnDirection = -1.0;
jupiterDirection = -1.0;
marsDirection = -1.0;
}
core.setGuiVisible (false);
findNextPushingPillarsEvent();
// ******************************************************************************************
//That is the end of this script.
// ******************************************************************************************
//The following are the functions used in this script:
function findNextPushingPillarsEvent() {
if (daysToAdvance > 0) moveForward();
else moveBackward();
}
function moveForward() {
allThreeMovingBackWithMarsBetween = false;
marsIsGreatestDiff = false;
while (!allThreeMovingBackWithMarsBetween) {
core.setDate(daysToAdvanceString);
core.wait(0.03);
newSaturnRA = core.getObjectInfo("Saturn").ra;
saturnDirection = newSaturnRA - saturnRA;
if (saturnDirection < -350) {
saturnDirection = 360 - saturnDirection;
}
newJupiterRA = core.getObjectInfo("Jupiter").ra;
jupiterDirection = newJupiterRA - jupiterRA;
if (jupiterDirection < -350) {
jupiterDirection = 360 - jupiterDirection;
}
newMarsRA = core.getObjectInfo("Mars").ra;
marsDirection = newMarsRA - marsRA;
if (marsDirection < -350) {
marsDirection = 360 - marsDirection;
}
saturnRA = newSaturnRA;
jupiterRA = newJupiterRA;
marsRA = newMarsRA;
//core.debug("S: " + saturnDirection);
//core.debug("J: " + jupiterDirection);
//core.debug("M: " + marsDirection);
if (marsDirection < 0.0 && saturnDirection < 0.0 && jupiterDirection < 0.0) {
allThreeMovingBackWithMarsBetween = true;
}
if (allThreeMovingBackWithMarsBetween) {
jupSatDiff = Math.abs(newSaturnRA - newJupiterRA);
if (jupSatDiff > 180) jupSatDiff = 360 - jupSatDiff;
//core.debug(jupSatDiff);
marsSatDiff = Math.abs(newSaturnRA - newMarsRA);
if (marsSatDiff > 180) marsSatDiff = 360 - marsSatDiff;
//core.debug(marsSatDiff);
marsJupDiff = Math.abs(newJupiterRA - newMarsRA);
if (marsJupDiff > 180) marsJupDiff = 360 - marsJupDiff;
//core.debug(marsJupDiff);
if ((marsJupDiff > jupSatDiff) || (marsSatDiff > jupSatDiff)) {
//core.debug("Entered!");
marsIsGreatestDiff = true;
allThreeMovingBackWithMarsBetween = false;
}
}
}
}
function moveBackward() {
allThreeMovingForwardWithMarsBetween = false;
marsIsGreatestDiff = false;
while (!allThreeMovingForwardWithMarsBetween) {
core.setDate(daysToAdvanceString);
core.wait(0.03);
newSaturnRA = core.getObjectInfo("Saturn").ra;
saturnDirection = newSaturnRA - saturnRA;
if (saturnDirection > 350) {
saturnDirection = 360 - saturnDirection;
}
newJupiterRA = core.getObjectInfo("Jupiter").ra;
jupiterDirection = newJupiterRA - jupiterRA;
if (jupiterDirection > 350) {
jupiterDirection = 360 - jupiterDirection;
}
newMarsRA = core.getObjectInfo("Mars").ra;
marsDirection = newMarsRA - marsRA;
if (marsDirection > 350) {
marsDirection = 360 - marsDirection;
}
saturnRA = newSaturnRA;
jupiterRA = newJupiterRA;
marsRA = newMarsRA;
// core.debug("saturnRA: " + saturnRA);
// core.debug("newSaturnRA: " + newSaturnRA);
//core.debug("saturnDirection: " + saturnDirection);
if (marsDirection > 0.0 && saturnDirection > 0.0 && jupiterDirection > 0.0) {
allThreeMovingForwardWithMarsBetween = true;
}
if (allThreeMovingForwardWithMarsBetween) {
jupSatDiff = Math.abs(newSaturnRA - newJupiterRA);
if (jupSatDiff > 180) jupSatDiff = 360 - jupSatDiff;
//core.debug(jupSatDiff);
marsSatDiff = Math.abs(newSaturnRA - newMarsRA);
if (marsSatDiff > 180) marsSatDiff = 360 - marsSatDiff;
//core.debug(marsSatDiff);
marsJupDiff = Math.abs(newJupiterRA - newMarsRA);
if (marsJupDiff > 180) marsJupDiff = 360 - marsJupDiff;
//core.debug(marsJupDiff);
if ((marsJupDiff > jupSatDiff) || (marsSatDiff > jupSatDiff)) {
//core.debug("Entered!");
marsIsGreatestDiff = true;
allThreeMovingForwardWithMarsBetween = false;
}
}
}
}