program Julia
  ! Il programma illustra l'insieme di Julia dell'iterazione 
  ! data dalla funzione z^2+c (dove c e` un parametro complesso)
  ! Valori notevoli (-0.75,0.0) Frattale di San Marco
  !                 (-0.123,0.745) Conglio di Douady
  !                 (0.0,1.0)   Dendrite
  !                 (-0.38,-0.58) Disco di Siegel
  implicit none
  
  real(8) :: x,y,centerX,centerY,length,h
  complex(8),parameter :: iunit=(0.d0,1.d0)
  complex(8) :: c,x0
  integer :: ios,np
  integer :: i,j,iter,rosso,verde,blu
  character(9) :: filename="julia.pnm"

  ! Procedura standard di apertura di un file
  open(unit=1,iostat=ios,file=filename,action="write")
  if (ios/=0) then
     write (*,'(a)') "Impossibile aprire il file"
     stop
  end if

  write (*,'(a)') "Inserisci parte reale e immaginaria di c (separate da uno spazio) "
  write(*,'(a)') "Esempi: -0.75 0.0 oppure  -0.123 0.745 / 0.0 1.0 / -0.38 -0.58"
  read (*,*) x,y
  c=x+iunit*y

  ! Fisso i parametri (che si possono modificare per effettuare uno zoom)
  ! centerX [centerY] = parte reale [immaginaria] del centro
  ! lenght = larghezza finestra; np = numero punti di risoluzione
  centerX=0.0;centerY=0.0;length=4;np=500;h=length/np

  ! Scrivo l'intestazione del file che conterra` l'immagine
  write(1,'(a)') "P3"
  write(1,*) np,np
  write(1,*) 255

  ! Ciclo che scorre tutti i punti dell'immagine e ne determina il colore
  crea_immagine: do i=0,np-1
     do j=0,np-1
        ! Calcolo le coordinate del punto i,j
        x=centerX-length/2+h*j
        y=centerY+length/2-h*i
        x0=x+iunit*y
        ! Calcolo il numero di iterazioni necessarie per la "convergenza a infinito"
        call iterazione (x0,c,iter)
        ! Scrivo nell'immagine le quantita` di rosso, verde e blu
        ! in questo caso metto una funzione lineare di rosso e blu, quindi l'immagine
        ! sara` viola chiaro per un alto numero di iterazioni e viola scuro altrimenti
        rosso=255/12*iter;verde=0;blu=255/12*iter
        write(1,*) rosso, verde, blu
     end do
  end do crea_immagine

  write (*,'(a)') "Ho creato il file ", filename

end program Julia

subroutine iterazione (x0,c,iter)
  ! Calcola il numero di iterazioni 
  implicit none

  complex(8) :: x0,c
  integer    :: iter,k,maxiter=50
  real(8)    :: M=1000.d0

  iter=0;k=1
  ciclo: do
     ! Calcolo il nuovo valore (x0 e` a ogni passo x_k)
     x0=x0**2+c
     ! Se il valore di xk e` grande dichiaro "convergenza a infinito"
     if (abs(x0)>M) then
        ! Se il numero di passi e` maggiore di 12 fisso comunque k=12
        ! 12 e` il numero di livelli di colore
        iter=min(k,12)
         exit
     end if
     ! Se esegue piu` di maxiter iterazioni allora dico che "non va a infinito"
     if (k>maxiter) exit
     k=k+1
  end do ciclo

end subroutine iterazione
