! programa para dibujar las curvas de velocidad cero
! en el plano (X-Y) en el problema restringido de
! los tres cuerpos
!
! como el programa utiliza la conocida tecnica cientifica
! de la "fuerza bruta", es necesario ingresar los valores
! limite para las coordenadas X e Y que fijan los rangos
! de coordenadas para encontrar las curvas. Es suficiente
! ingresar el modulo de ese valor.
!
! la salida se hace en un archivo HILL.OUT donde se guardan
! las coordenadas donde se produce un cambio de signo en 
! 2U-C
!
! rgh - septiembre 2008
!
!

program hill
implicit none
  real::dx=0.0005,dy=0.0005
  real ::x,y,r1,r2,mu,c,u
  real ::x1,x2,li,ddx,ddy
  integer::ifg

  write(*,'(a)',advance='no')'ingrese C:'
  read(*,*)c
  write(*,'(a)',advance='no')'ingrese mu:'
  read(*,*)mu
  write(*,'(a)',advance='no')'ingrese limite coord.:'
  read(*,*)li

! posicion de los cuerpos masivos
!
  x1=-mu
  x2=1.-mu

  ddx=dy
  ddy=dy
  ifg=1
  open(7,file='hill.out')

! inicia busqueda
!
  x=li
  do
    y=li
    do
      r1=sqrt((x-x1)**2+y**2)
      r2=sqrt((x-x2)**2+y**2)
      u=x**2+y**2+2.*(1.-mu)/r1+2.*mu/r2-c

! busca un cambio de positivo a negativo
!     
      if((ifg == 1).and.(u < 0.))then
        if(dy > 0.00001)then
          y=y+dy
          dy=dy/2.
        else

! encuentra el valor y lo guarda
!
          write(7,*)x,y,u

! sigue la busqueda, vuelve al incremento
! original, y baja el flag para indicar 
! que ahora busca un cambio de negativo a
! positivo
!
          dy=ddy
          ifg=0
        endif  

! busca un cambio de negativo a positivo
!
      else if((ifg == 0).and.(u > 0.))then
        if(dy > 0.00001)then
          y=y+dy
          dy=dy/2.
        else

! encuentra el valor y lo guarda
!
          write(7,*)x,y,u

! sigue la busqueda, vuelve al incremento
! original, y sube el flag para indicar 
! que ahora busca un cambio de positivo a
! negativo
!
          dy=ddy
          ifg=1
        endif  
      endif
      y=y-dy
      if(y < -li)exit
    enddo
    x=x-dx
    if(x < -li)exit
  enddo
  close(7)
  
end program hill
