!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  PROGRAM PPFolge;
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  (c) 2005, Christian B. Lang, Mathematische Methoden in der Physik
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  Die Partialsummen S_n werden graphisch dargestellt. Der Wert
!  des Folgenglieds wird in der Funktion fg(n) berechnet. 
!  Der Wert der Partialsummen wird in den File ppfolge_plot.dat
!  geschrieen, der als Grundlage zum Plotten dient.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PROGRAM PPFolge

   implicit none
   integer::n,nmax
   real::ahigh,alow,S,fg
   character (len=256)::gnudat,gnucmd

   print *,'Ich berechne als Folgenglied die Partialsumme S_n von n=1 bis n=nmax.'
   write(*,*) 'nmax = '
   read(*,*) nmax

!  Ich verwende gnuplot, um die Daten zu plotten.
!  Wenn gnuplot nicht installiert ist, so koennen die Daten im File
!  folgen_plot.dat' mit einem anderen Plottingprogramm dargestellt
!  werden.

   gnudat='ppfolge_plot.dat'
   gnucmd='ppfolge_plot.cmd'

   print *,'Ich erzeuge zwei Files:'
   print *,trim(gnudat)
   print *,trim(gnucmd)
   print *,'Falls diese Files schon existieren, erfolgt eine Fehlermeldung.'
   open(unit=10,file=trim(gnudat),status='new')
   open(unit=11,file=trim(gnucmd),status='new')
   write(11,'(a)') 'set title "Partialsummen-Folge"'
   write(11,'(a)') 'set xlabel "n"'
   write(11,'(a)') 'set ylabel "S_n"'
   write(11,'(a)') 'plot "'//trim(gnudat)//'" using 1:2 with linespoints'
   write(11,'(a)') 'pause -1'
   write(11,'(a)') 'quit'
   close(11)

   S=0
   do n = 1,nmax
     S = S + fg(n)
     write(10,*)n,S
   end do
   close(10)
   
!  Wenn das Unterprogramm "system" nicht verfuegbar ist, so kommentieren
!  Sie die folgende Zeile aus. Dann muessen Sie die Grafik selbst mittels
!  "gnuplot ppfolge_plot.cmd" aufreufen.

   call system(trim('gnuplot '//trim(gnucmd)))
   print *,'Ende des Programms'

END PROGRAM PPFolge

REAL FUNCTION fg(n)

   implicit none

    integer::n

   if(mod(n,2).eq.0) then
     fg=1.0/n
   else
     fg=-1.0/n
   endif
   
!  zur Berechnung des Folgenglieds (-1)^n/n fuer
!  die alternierend harmonische Reihe

END FUNCTION fg
