symba5_helio_getacch.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. c*************************************************************************
  2. c SYMBA5_HELIO_GETACCH.F
  3. c*************************************************************************
  4. c This subroutine calculates the acceleration on the massive particles
  5. c in the HELIOCENTRIC frame.
  6. c Input:
  7. c iflg ==> =0 calculate forces (int scalor)
  8. c =1 don't
  9. c nbod ==> number of massive bodies (int scalor)
  10. c nbodm ==> The last massive particle
  11. c (int scalor)
  12. c mass ==> mass of bodies (real array)
  13. c j2rp2,j4rp4 ==> J2*radii_pl^2 and J4*radii_pl^4
  14. c (real scalars)
  15. c xh,yh,zh ==> position in heliocentric coord (real arrays)
  16. c Output:
  17. c axh,ayh,azh ==> acceleration in helio coord (real arrays)
  18. c
  19. c Remarks Based on helio_getacch.f
  20. c Author: Hal Levison
  21. c Date: 9/12/99
  22. c Last revision: 11/08/13
  23. subroutine symba5_helio_getacch(iflg,nbod,nbodm,mass,
  24. & j2rp2,j4rp4,xh,yh,zh,axh,ayh,azh)
  25. include '../swift.inc'
  26. c... Inputs:
  27. integer nbod,nbodm,iflg
  28. real*8 mass(nbod),j2rp2,j4rp4
  29. real*8 xh(nbod),yh(nbod),zh(nbod)
  30. c... Outputs:
  31. real*8 axh(nbod),ayh(nbod),azh(nbod)
  32. c... Internals:
  33. integer i,j
  34. real*8 aoblx(NTPMAX),aobly(NTPMAX),aoblz(NTPMAX)
  35. real*8 axhl(NTPMAX),ayhl(NTPMAX),azhl(NTPMAX)
  36. real*8 ir3h(NTPMAX),irh(NTPMAX)
  37. real*8 dx,dy,dz,rji2,faci,facj,irij3
  38. save axhl,ayhl,azhl ! Note this !!
  39. c----
  40. c... Executable code
  41. if(iflg.eq.0) then
  42. do i=1,nbod
  43. axhl(i) = 0.0
  44. ayhl(i) = 0.0
  45. azhl(i) = 0.0
  46. enddo
  47. c... now the third terms
  48. do i=2,nbodm
  49. do j=i+1,nbod
  50. dx = xh(j) - xh(i)
  51. dy = yh(j) - yh(i)
  52. dz = zh(j) - zh(i)
  53. rji2 = dx*dx + dy*dy + dz*dz
  54. irij3 = 1.0d0/(rji2*sqrt(rji2))
  55. faci = mass(i)*irij3
  56. facj = mass(j)*irij3
  57. axhl(j) = axhl(j) - faci*dx
  58. ayhl(j) = ayhl(j) - faci*dy
  59. azhl(j) = azhl(j) - faci*dz
  60. axhl(i) = axhl(i) + facj*dx
  61. ayhl(i) = ayhl(i) + facj*dy
  62. azhl(i) = azhl(i) + facj*dz
  63. enddo
  64. enddo
  65. endif
  66. c... Now do j2 and j4 stuff
  67. if(j2rp2.ne.0.0d0) then
  68. call getacch_ir3(nbod,2,xh,yh,zh,ir3h,irh)
  69. call obl_acc(nbod,mass,j2rp2,j4rp4,xh,yh,zh,irh,
  70. & aoblx,aobly,aoblz)
  71. do i = 2,nbod
  72. axh(i) = axhl(i) + aoblx(i)
  73. ayh(i) = ayhl(i) + aobly(i)
  74. azh(i) = azhl(i) + aoblz(i)
  75. enddo
  76. else
  77. do i = 2,nbod
  78. axh(i) = axhl(i)
  79. ayh(i) = ayhl(i)
  80. azh(i) = azhl(i)
  81. enddo
  82. endif
  83. return
  84. end ! symba5_helio_getacch
  85. c---------------------------------------------------------------------