More on Kinetic Returns
Mark Pottenger
In the Sagittarius 1980 issue of The Mutable Dilemma I described the techniques for getting kinetic solar and lunar returns. I ended by saying I prefer to let a computer do it. I have decided to make that easier for any of our readers who already have computers by giving the algorithm I use in the CCRS horoscope program. I will give the two most important subroutines exactly as they are in the program and some additional explanations.
First, the program segments:
200 REM BASIC CYCLES
210 C1=365.24219879\C2=27.321582
220 REM CIRCLE,HALF
230 C=360\H1=180
1810 REM DAYS FROM 1900,OBLIQUITY
1820 DEF FNE(J)
1830 D1=J-2415020
1840 T=D1/36525\T2=T*T\T3=T2*T
1850 E=23.45229444-.0130125*T-.00000164*T2+.000000503*T3
1860 O0=FNC(E)\O1=FNS(E)
1870 RETURN E
1880 FNEND
2140 REM JULIAN DAY
2150 DEF FNJ(M,D,Y,H)
2160 U=Y\IFM<3THENU=U-1
2170 U0=U+4712
2180 U1=M+1\IFU1<4THENU1=U1+12
2190 J=INT(U0*365.25)+INT(30.6*U1)+D +H/24-63.5 \IFO7THEN2220
2200 J=J-(INT(ABS(U)/100)-INT(ABS(U) /400))*SGN(U)+2
2210 IFU<0ANDU/100=INT(U/100)ANDU/400 <>INT(U/400)THENJ=J-1
2220 E=FNE(J)
2230 RETURN J
2240 FNEND
2250 REM REVERSE JULIAN W4,5,6,7=MON,DAY,YR,TIME
2260 DEF FNJ2(J)
2270 U0=J+32082.5 \IFO7THEN2310
2280 U1=U0+INT(U0/36525)-INT(U0/146100)-38
2290 IFJ>=1830691.5THENU1=U1+1
2300 U0=U0+INT(U1/36525)-INT(U1/146100)-38
2310 U2=INT(U0+123)
2320 U3=INT((U2-122.2)/365.25)
2330 U4=INT((U2-INT(365.25*U3))/30.6001)
2340 W4=U4-1\IFW4>12THENW4=W4-12
2350 W5=U2-INT(365.25*U3)-INT(30.6001*U4)
2360 W6=U3+INT((U4-2)/12)-4800
2370 W7=(J-INT(J+.5)+.5)*24
2380 RETURN W7
2390 FNEND
6880 REM SUN MOON
10330 REM KINETIC SOLAR
10340 F=INT((J-J1)/(C1+1))
10350 J2=J1+F*(C1+1)
10360 J=J1+(J2-J1)/C1
10370 E=FNE(J)
10380 R9=1\GOSUB6890
10390 L0(1)=L(1)+L0(26)
10400 L0(25)=S5\L0(27)=V(1)/C1
10410 E=FNE(J2)
10420 GOSUB6890
10430 F=L0(1)-L(1)
10440 IFABS(F)>H1THENF=F-SGN(F)*C
10450 J2=J2+F/(V(1)-L0(27))
10460 IFABS(F)>.0003THEN10360
10470 J=J2\R9=0
10480 RETURN
10610 REM KINETIC LUNAR RETURN
10620 F=INT((J-J1)/27.396386)
10630 J2=J1+F*27.396386
10640 J=J1+(J2-J1)/C1
10650 E=FNE(J)
10660 R9=2\GOSUB6890
10670 L0(2)=L(2)+L0(26)
10680 L0(25)=S5\L0(27)=V(2)/C1
10690 E=FNE(J2)
10700 GOSUB 6890
10710 F=L0(2)-L(2)
10720 IFABS(F)>H1THENF=F-SGN(F)*C
10730 J2=J2+F/(V(2)-L0(27))
10740 IF ABS(F)>.001 THEN 10640
10750 J=J2
10760 R9=0
10770 RETURN
This is written in North Star BASIC. To convert to Microsoft BASIC or any of its variations, the multiple line functions at the beginning must be changed into subroutines. The backslash (\) is a statement separator like the colon (:). All work I do with current patterns is done in terms of the Julian Day Number (J), so I have included my calendar to JD and JD to calendar routines. (The variable O7 is a calendar flag: 0 for Gregorian, 1 for Julian.) For BASICs using less than the 14 digits we use, the routines should be changed to get time of day from the days from 1900 variable (D1)—otherwise accuracy is lost.
When the kinetic return routines are called, J is the current JD, J1 is the natal JD, L0(1) is the natal sun, L0(2) is the natal moon, L0(26) is the precession correction (0 for unprecessed returns, current SVP minus natal SVP for precessed returns), and C1 is a tropical year. The subroutine starting at 6890 (not included) is the sun-moon routine. It returns L(1), L(2), V(1), and V(2) as the sun’s and moon’s longitudes and velocities. R9 is a flag for this routine: if R9 is 1 it only gets the sun; if R9 is 2 it only gets the moon; if R9 is 0 it gets both. Calls to FNE set several variables that depend on the JD.
The kinetic solar routine works as follows: Lines 10340 and 10350 get the most recent return date before the current date asked for. A tropical year plus one day is the length of the “kinetic year”. Line 10340 gets the number of cycles elapsed. Line 10350 adds that many cycles times the cycle length to the natal JD to get a working JD. (J2). Line 10360 gets the JD for a secondary progression for the working JD just calculated. Line 10380 gets the progressed sun. Line 10390 saves the progressed sun plus precession correction (if any) as the longitude to return to. The precession correction must be added here inside the loop or the routine will always give a straight tropical (unprecessed) return. Line 10400 saves the progressed SVP and the velocity divided by one year. Line 10410 sets times back to the working JD. Line 10420 gets the transiting sun. Line 10430 gets the difference between progressed and transiting longitudes. Line 10440 corrects for any crossings of the Pisces-Aries border (which might otherwise send you jumping to a completely different year). Line 10450 corrects the working JD. The correction is ERROR/VELOCITY. Since the error is in degrees and the velocity is in degrees per day, the correction comes out in days. The velocity used is actually transiting velocity minus progressed velocity (the velocity difference). Line 10460 tests for convergence. If the error is greater than about one second of arc the routine is repeated from 10360 (progressed JD). Line 10470 sets the current JD to the working JD and restores the sun-moon routine flag.
The kinetic lunar return subroutine uses essentially the same logic, so I won’t go into it in detail. Conventional returns are, of course, much simpler. I didn’t include the code in this listing, but removing all the calculations of progressions from these routines produces a conventional return routine.
Enjoy!