56 use sufr_kinds,
only: double, dbl
57 use sufr_constants,
only: as2r, au, km
58 use sufr_angles,
only: rev
60 use thesky_moondata,
only:
t,
nterm,
nrang,
pc1,
pc2,
pc3,
per1,
per2,
per3,
w,
ath,
a0
63 real(double),
intent(in) :: tjj
64 real(double),
intent(out) :: ll,bb,rr
66 integer :: iv,itab,nt,k,j
67 real(double) :: r(3),x,y, pa,t4,t8
87 do nt = 1,
nterm(iv,itab)
96 y = y +
pc1(k+2,nt)*
t(k)
99 j =
nrang(1,itab-1) + nt
109 y = y +
pc2(k+2,nt)*
t(k)
112 j =
nrang(2,itab-1) + nt
122 y = y +
pc3(k+2,nt)*
t(k)
125 j =
nrang(3,itab-1) + nt
131 if(itab.eq.3.or.itab.eq.5 .or. itab.eq.7.or.itab.eq.9) x = x*
t(1)
132 if(itab.eq.12) x = x*
t(2)
133 r(iv) = r(iv) + x*sin(y)
140 r(1) = r(1) * as2r +
w(1,0) +
w(1,1)*
t(1) +
w(1,2)*
t(2) +
w(1,3)*
t(3) +
w(1,4)*
t(4)
142 r(3) = r(3) *
a0 /
ath
152 pa = 2.438174835301452d-2 *
t(1) + 5.391128133938040d-6 *
t(2) + 3.733065344543427d-10 *
t(3) &
153 - 1.140766591650738d-10 * t4 - 8.753311012432670d-14 * t4*
t(1) + 8.460483549042511d-16 * t4*
t(2) &
154 + 6.348635154129373d-18 * t4*
t(3) + 1.175188363009515e-20 * t8 - 2.307228308400282d-22 * t8*
t(1) &
155 - 4.198486478408581d-25 * t8*
t(2)
189 use sufr_kinds,
only: double
190 use sufr_constants,
only: jd2000, au,km
191 use sufr_angles,
only: rev
195 real(double),
intent(in) :: jd
196 integer,
intent(in) :: mode
197 logical,
intent(in),
optional :: precess
198 real(double),
intent(out) :: lon,lat,rad
201 real(double) :: xyz(3),vxyz(3)
206 if(
present(precess)) lprecess = precess
211 rad = sqrt(sum(xyz**2))
212 lon = atan2(xyz(2),xyz(1))
213 lat = asin(xyz(3)/rad)
267 use sufr_kinds,
only: double
268 use sufr_constants,
only: r2as, jd2000
269 use sufr_system,
only: quit_program_error
270 use sufr_angles,
only: rev
273 use thesky_elp_mpp02_series,
only: cmpb,fmpb,nmpb, cper,fper,nper
274 use thesky_elp_mpp02_constants,
only: w, p1,p2,p3,p4,p5, q1,q2,q3,q4,q5
277 integer,
intent(in) :: mode
278 real(double),
intent(in) :: jd
279 integer,
intent(out) :: ierr
280 real(double),
intent(out) :: xyz(3),vxyz(3)
283 real(double),
parameter :: a405=384747.9613701725d0, aelp=384747.980674318d0, sc=36525.d0
285 integer :: it,iLine,iVar, k
286 real(double) :: rjd, t(-1:4),v(6)
287 real(double) :: cbeta,clamb,cw, ppw,ppw2,ppwqpw,ppwra,pw,pw2,pwqw,pwra, qpw,qpw2,qpwra,qw,qw2,qwra
288 real(double) :: ra,rap,sbeta,slamb,sw, x,x1,x2,x3, xp,xp1,xp2,xp3, y,yp
292 if(ierr.ne.0)
call quit_program_error(
'Could not read ELP-MPP02 files',0)
308 do iline=nmpb(ivar,2),nmpb(ivar,3)
314 y = y + fmpb(k,iline)*t(k)
315 yp = yp + k*fmpb(k,iline)*t(k-1)
318 v(ivar) = v(ivar) + x*sin(y)
319 v(ivar+3) = v(ivar+3) + x*yp*cos(y)
324 do iline=nper(ivar,it,2),nper(ivar,it,3)
329 if(it.ne.0) xp = it * x * t(it-1)
332 y = y + fper(k,iline)*t(k)
333 yp = yp + k*fper(k,iline)*t(k-1)
336 v(ivar) = v(ivar) + x * t(it) * sin(y)
337 v(ivar+3) = v(ivar+3) + xp*sin(y) + x*t(it)*yp*cos(y)
345 v(1) = v(1)/r2as + w(1,0) + w(1,1)*t(1) + w(1,2)*t(2) + w(1,3)*t(3) + w(1,4)*t(4)
348 v(3) = v(3) * a405 / aelp
376 pw = (p1 + p2*t(1) + p3*t(2) + p4*t(3) + p5*t(4)) * t(1)
377 qw = (q1 + q2*t(1) + q3*t(2) + q4*t(3) + q5*t(4)) * t(1)
379 ra = 2*sqrt(1.d0 - pw**2 - qw**2)
386 xyz(1) = pw2*x1 + pwqw*x2 + pwra*x3
387 xyz(2) = pwqw*x1 + qw2*x2 - qwra*x3
388 xyz(3) = -pwra*x1 + qwra*x2 + (pw2+qw2-1.d0)*x3
396 v(4) = v(4)/r2as + w(1,1) + 2*w(1,2)*t(1) + 3*w(1,3)*t(2) + 4*w(1,4)*t(3)
399 xp1 = (v(6)*cbeta - v(5)*sw)*clamb - v(4)*x2
400 xp2 = (v(6)*cbeta - v(5)*sw)*slamb + v(4)*x1
401 xp3 = v(6)*sbeta + v(5)*cw
403 ppw = p1 + (2*p2 + 3*p3*t(1) + 4*p4*t(2) + 5*p5*t(3)) * t(1)
404 qpw = q1 + (2*q2 + 3*q3*t(1) + 4*q4*t(2) + 5*q5*t(3)) * t(1)
407 ppwqpw = 2*(ppw*qw + pw*qpw)
409 ppwra = ppw*ra + pw*rap
410 qpwra = qpw*ra + qw*rap
412 vxyz(1) = (pw2*xp1 + pwqw*xp2 + pwra*xp3 + ppw2*x1 + ppwqpw*x2 + ppwra*x3) / sc
413 vxyz(2) = (pwqw*xp1 + qw2*xp2 - qwra*xp3 + ppwqpw*x1 + qpw2*x2 - qpwra*x3) / sc
414 vxyz(3) = (-pwra*xp1 + qwra*xp2 + (pw2+qw2-1.d0)*xp3 - ppwra*x1 + qpwra*x2 + (ppw2+qpw2)*x3) / sc
435 use sufr_kinds,
only: double
436 use sufr_constants,
only: au, pi,d2r, jd2000, pland,earthr
437 use sufr_angles,
only: rev, rev2
438 use sufr_system,
only: quit_program_warning
447 real(double),
intent(in) :: jd
448 integer,
intent(in) :: calc,nt
450 integer :: iLine,iArg, mal(4,60),mab(4,60)
451 real(double) :: jde,deltat, tjc,tjc2,tjc3,tjc4, l,b,r, lm,d,ms,mm,f,e,esl(60),esb(60),a1,a2,a3
452 real(double) :: ls,omg,ra,dec,eps,eps0,deps,gmst,agst,lst,dpsi,az,alt,hh, args(4),argl,argb
453 real(double) :: moondat(nPlanpos), hcl0,hcb0,hcr0, gcl,gcb,delta, elon,pa,illfr
455 if(sum(
moonla_lrb(1:2,1)) .ne. -14616581)
call quit_program_warning(
'moonpos_la(): moon_la.dat not read', 0)
458 jde = jd + deltat/86400.d0
460 tjc = (jde-jd2000)/36525.d0
466 lm = rev(3.8103408236d0 + 8399.7091116339958d0*tjc - 2.755176757d-5*tjc2 + 3.239043d-8*tjc3 - 2.6771d-10*tjc4)
475 d = rev(5.1984665298d0 + 7771.377144834d0*tjc - 3.2845d-5*tjc2 + 3.197347d-8*tjc3 - 1.5436512d-10*tjc4)
476 ms = rev(6.240060127d0 + 628.301955167d0*tjc - 2.681d-6*tjc2 + 7.1267017d-10*tjc3)
477 mm = rev(2.355555637d0 + 8328.691424759d0*tjc + 1.52566d-4*tjc2 + 2.5041d-7*tjc3 - 1.18633d-9*tjc4)
478 f = rev(1.627905158d0 + 8433.466158061d0*tjc - 6.3773d-5*tjc2 - 4.94988d-9*tjc3 + 2.02167d-11*tjc4)
481 e = 1.d0 - 0.002516d0*tjc - 0.0000074d0*tjc2
492 do iline=1,min(nt,60)
496 argl = argl + mal(iarg,iline)*args(iarg)
497 argb = argb + mab(iarg,iline)*args(iarg)
499 l = l + sin(argl) *
moonla_lrb(1,iline) * esl(iline)
500 r = r + cos(argl) *
moonla_lrb(2,iline) * esl(iline)
501 b = b + sin(argb) *
moonla_lrb(3,iline) * esb(iline)
507 a1 = rev(2.090032d0 + 2.301199d0 * tjc)
508 a2 = rev(0.926595d0 + 8364.7398477d0 * tjc)
509 a3 = rev(5.4707345d0 + 8399.6847253d0 * tjc)
512 l = l + 3958*sin(a1) + 1962*sin(lm-f) + 318*sin(a2)
513 b = b - 2235*sin(lm) + 382*sin(a3) + 175*sin(a1-f) + 175*sin(a1+f) + 127*sin(lm-mm) - 115*sin(lm+mm)
517 omg = 2.18243858558d0 - 33.7570459367d0*tjc + 3.6142278d-5*tjc2 + 3.87850944888d-8*tjc3
518 ls = 4.89506386655d0 + 62.84528862d0*tjc
519 dpsi = -8.338795d-5*sin(omg) - 6.39954d-6*sin(2*ls) - 1.115d-6*sin(2*lm) + 1.018d-6*sin(2*omg)
521 l = rev( dble(l) * 1.d-6*d2r + lm + dpsi)
522 b = rev2(dble(b) * 1.d-6*d2r)
523 r = (dble(r*100) + 3.8500056d10)/au
531 planpos(7) = 5.77551830441d-3 * r
542 eps0 = 0.409092804222d0 - 2.26965525d-4*tjc - 2.86d-9*tjc2 + 8.78967d-9*tjc3
543 deps = 4.468d-5*cos(omg) + 2.76d-6*cos(2*ls) + 4.848d-7*cos(2*lm) - 4.36d-7*cos(2*omg)
560 agst = rev(gmst + dpsi*cos(eps))
561 lst = rev(agst +
lon0)
570 call eq2horiz(ra,dec,agst, hh,az,alt)
593 elon = acos(cos(gcb)*cos(hcb0)*cos(gcl-rev(hcl0+pi)))
594 pa = atan2( hcr0*sin(elon) , delta - hcr0*cos(elon) )
595 illfr = 0.5d0*(1.d0 + cos(pa))
630 use sufr_kinds,
only: double
633 real(double),
intent(in) :: pa,delta
636 moonmagn = -12.73d0 + 1.489690267d0*abs(pa) + 0.04310727d0*pa**4
643 moonmagn =
moonmagn - 2.5*log10( (2.5696d-3/delta)**2 * max(1.d0, 1.35d0 - 2.864789d0*abs(pa) ) )
Procedures for coordinates.
subroutine eq2horiz(ra, dec, agst, hh, az, alt, lat, lon)
Convert spherical equatorial coordinates (RA, dec, agst) to spherical horizontal coordinates (hh,...
subroutine ecl_2_eq(l, b, eps, ra, dec)
Convert (geocentric) spherical ecliptical coordinates l,b (and eps) to spherical equatorial coordinat...
subroutine precess_ecl(jd1, jd2, l, b)
Compute the precession of the equinoxes in geocentric ecliptical coordinates.
Procedures to set constants and read data files.
subroutine elp_mpp02_initialise_and_read_files(mode, ierr)
Initialise ELP-MPP02 data and read the data files.
Date and time procedures.
real(double) function calc_gmst(jd, deltat)
Calculate Greenwich Mean Sidereal Time for any instant, in radians.
real(double) function calc_deltat(jd, force_recompute)
Compute DeltaT for a given JD.
Local parameters for libTheSky: location, date, time.
real(double) lon0
Longitude of the observer (rad)
real(double) lat0
Latitude of the observer (rad)
subroutine elp82b_lbr(tjj, ll, bb, rr)
Calculate the apparent geocentric ecliptical position of the Moon, using the Lunar Solution ELP 2000-...
real(double) function moonmagn(pa, delta)
Calculate the magnitude of the Moon.
subroutine elp_mpp02_lbr(jd, mode, lon, lat, rad, precess)
Compute the spherical lunar coordinates using the ELP2000/MPP02 lunar theory in the dynamical mean ec...
subroutine elp_mpp02_xyz(jd, mode, xyz, vxyz, ierr)
Compute the rectangular lunar coordinates using the ELP/MPP02 lunar theory in the dynamical mean ecli...
subroutine moonpos_la(jd, calc, nt)
Quick, lower-accuracy lunar coordinates; ~600x faster than ELP.
ELP 2000-82B Moon data, needed to compute Moon positions.
real(double), parameter a0
Constant for ELP 2000-82B theory (orbital separation?)
real(double), dimension(3, 0:4) w
Constants for mean longitude.
integer, dimension(3, 0:12) nrang
CHECK: Number of terms? in ELP 2000-82B data file.
real(double), dimension(6, 704) pc3
CHECK: Something in ELP 2000-82B theory.
real(double), dimension(6, 918) pc2
CHECK: Something in ELP 2000-82B theory.
real(double), dimension(6, 1023) pc1
CHECK: Something in ELP 2000-82B theory.
real(double), dimension(3, 19537) per1
CHECK: Something in ELP 2000-82B theory.
real(double), parameter ath
Constant for ELP 2000-82B theory (orbital separation?)
real(double), dimension(0:4) t
Array for time^0, ..., time^4.
integer, dimension(3, 12) nterm
CHECK: Number of terms? in ELP 2000-82B data file.
real(double), dimension(3, 6766) per2
CHECK: Something in ELP 2000-82B theory.
real(double), dimension(3, 8924) per3
CHECK: Something in ELP 2000-82B theory.
Planet data, needed to compute planet positions.
integer(long), dimension(3, 60) moonla_lrb
L,B,R data for the low-accuracy (la) Moon position.
integer, parameter nplanpos
Number of entries in the planpos array.
real(double), dimension(nplanpos) planpos
Planpos[] is an array with many different types of coordinates and related variables:
integer, dimension(8, 60) moonla_arg
Arguments for the low-accuracy (la) Moon position.
Low-accuracy procedures for the Sun.
subroutine sunpos_la(jd, calc, lat, lon)
Low-accuracy solar coordinates.