module fonctions

  ! module principal contenant les sous-routines de ce tp  
  implicit none
  
  ! parametres du probleme
  ! constante G de gravitation
  real*8, parameter :: G = 2.95912208286D-04
  ! masse des corps consideres
  real*8, parameter, dimension(6) :: masse = (/0.000954786104043D0, &
       0.000285583733151D0,  0.0000437273164546D0, &
       0.0000517759138449D0, 1.0D0/(1.3D8), 1.00000597682D0 /)
  
  ! nombre de corps
  integer, parameter :: nb_corps = 6
  
contains
  
  ! calcul des forces 
  subroutine fonct(X, FX)
    implicit none
    real*8, intent(in), dimension (:) :: X
    real*8, intent(out), dimension (:) :: FX
    real*8  :: Dist
    
    !----------------
    !   A COMPLETER !
    !----------------
    
    
  end subroutine fonct
  
  
  
  
  ! calcul de x^n+1 en fonction de x^n
  ! m : taille des vecteurs x^n, x^n+1
  ! X^n : vecteur x^n (x au temps t^n)
  ! X_next : vecteur x^n+1 (resultat)
  ! dt : pas de temps
  subroutine Euler(m, X, X_next, dt)

    implicit none
    
    integer, intent(in) :: m
    real*8, intent(in), dimension(m) :: X
    real*8, intent(out), dimension(m) :: X_next
    real*8 :: dt
    
    !----------------
    !   A COMPLETER !
    !----------------
    
  end subroutine Euler
  
  
end module fonctions




!  Programme principal

program TestFortran
  
  use fonctions
  
  implicit none
  
  real*8, dimension (6*nb_corps) :: X, X_next
  real*8 :: dt, tmax
  integer :: nb_iter,i
  
  
  write(*,*) 'Entrez le temps final'
  read(*,*) tmax
  write(*,*) 'Entrez dt'
  read(*,*) dt
  
  nb_iter = ceiling(tmax/dt)
  
  ! ouverture d'un fichier P1.txt, qui va contenir les positions de la premiere planete à chaque dt
  open(unit = 11, file = 'P1.txt', form = 'formatted', status = 'unknown', action = 'write')
  
  
  ! Initialisation (pour le soleil notamment) :
  X = 0.0D0
  X_next = 0.0D0
  
  !Jupiter
  X(1:6) = (/-3.5023653D0, -3.8169847D0, -1.5507963D0, &
       0.00565429D0, -0.00412490D0, -0.00190589D0 /)
  
  !Saturne
  X(7:12) = (/9.0755314D0, -3.0458353D0, -1.6483708D0, &
       0.00168318D0, 0.00483525D0, 0.00192462D0 /)
  
  !Uranus 
  X(13:18) = (/8.3101420D0, -16.2901086D0, -7.2521278D0, &
       0.00354178D0, 0.00137102D0, 0.00055029D0 /)
  
  !Neptune 
  X(19:24) = (/ 11.4707666D0, -25.7294829D0, -10.8169456D0, &
       0.00288930D0, 0.00114527D0, 0.00039677D0 /) 

  ! Pluton 
  X(25:30) = (/ -15.5387357D0, -25.2225594D0, -3.1902382D0, &
       & 0.00276725D0, -0.00170702D0, -0.00136504D0 /)
  
  ! boucle temporelle principale
  do i = 1, nb_iter
     
     
     !--------------
     ! 
     ! A COMPLETER
     ! 
     !--------------
     
     !écriture dans le fichier 
     write(11,*) X(1), X(2), X(3)
     
  end do
  
  !fermeture
  close(11)  
  
end program

