options /extend_source program MAKE_E0_LIST c ==================== implicit none c=============================================================================== c Dieses Fortran-Programm erstellt Files 'E0-Intervalls.input_', die durch c Editieren (falls noetig) und Umbenennen in 'E0-Intervalls.input' (ohne c '_' am Ende) als entsprechende Eingabefiles fuer ACCEL verwendet werden c koennen. Der Inhalt dieser Datei umfasst die Definition von Startenergie- c intervallen, fuer die ACCEL-Simulationen durchgefuehrt werden sollen. c c Hierbei geht es um die Bereitstellung der fuer die Anpassung der Austritts- c energie der langsamen MYonen benoetigten Simulationen. c c Der untere Wert des ersten Startenergieintervalles, die Breite des ersten c Intervalles, und die Zunahme der Intervallbreite von einem zum naechsten c Intervall sowie die Anzahl der so zu erstellenden Intervalle werden zunaechst c eingelesen und die entsprechenden Daten in das Ausgabefile geschrieben. c c Um weiter Intervalle mit anderen Intervallbreiten-Incrementen anhaengen zu c koennen, wird dann wiederum die Breite des ersten hinzuzufuegenden Intervalles c sowie das neue Increment und die Anzahl damit anzuhaengender Intervalle c eingelesen. Das wiederholt sich dann so lange, bis eine negative Zahl c eingegeben wird. Dann wird das File geschlossen und das Programm beendet. c c Das File wird in 'ACCEL$READdirectory' erstellt c c Anselm Hofer c=============================================================================== integer lunOUT parameter (lunOUT = 10) integer E0 /0/ ,E0Binwidth /2/ ,BinwidthIncr /0/ integer E0_ ,E0Binwidth_ ,BinwidthIncr_ integer nBins /20/, nBins_, i, lun, indx /1/, indx_ character*10 answer c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c Oeffnen des Files: open (lunOUT,file='E0-Intervalls.input_',status='new', + defaultFile='ACCEL$READdirectory') write(lunOUT,*) '*===============================================================================' write(lunOUT,*) '* In dieser Datei koennen (aneinandergrenzende) E0-Intervalle fuer ACCEL' write(lunOUT,*) '* vorgegeben werden! Die Intervalle laufen dabei von der Angabe der i. bis' write(lunOUT,*) '* zur Angabe der i+1. Datenzeile. Die DATENzeilen 2 bis n-1 geben also' write(lunOUT,*) '* jeweils das Ende des einen sowie gleichzeitig den Anfang des anderen' write(lunOUT,*) '* Intervalls an.' write(lunOUT,*) '*' write(lunOUT,*) '* Die E0-Angaben erfolgen in keV-Einheiten!' write(lunOUT,*) '*' write(lunOUT,*) '* Beispiel:' write(lunOUT,*) '* Die Datenzeilen' write(lunOUT,*) '*' write(lunOUT,*) '* 0.010' write(lunOUT,*) '* 0.040' write(lunOUT,*) '* 0.100' write(lunOUT,*) '*' write(lunOUT,*) '* geben zwei E0-Intervalle an: von 10 eV bis 40 eV und von 40 eV bis 100 eV.' write(lunOUT,*) '*' write(lunOUT,*) '* eine Zeile mit mindestens 5 aufeinanderfolgenden x (''xxxxx'') markiert ge-' write(lunOUT,*) '* gebenenfalls das Ende der Datenzeilen. Nachfolgende Zeilen werden ignoriert.' write(lunOUT,*) '*' write(lunOUT,*) '* Der Inhalt dieser Datei wird mit ''E0InterFromFile = .true.'' in ACCEL.INPUT' write(lunOUT,*) '* aktiviert.' write(lunOUT,*) '*===============================================================================' 1000 format ($,x,A,:' (.LT.0 => finish) [',I4,'] > ') 1001 format ($,x,A,:' [',I4,'] > ') write(*,*) write(*,*) 'alle Eingaben in eV!' write(*,*) write(*,1001) ' lower E0 ',E0 read(*,'(A)') answer if (answer.NE.' ') read(answer,*) E0 write(lunOUT,'(x,F8.3)') real(E0) / 1000. c Einlesen und Ausgeben ...: 10 write(*,*) write(*,1000) ' first E0-Binwidth ',E0Binwidth read(*,'(A)') answer if (answer.NE.' ') read(answer,*) E0Binwidth if (E0Binwidth.LE.0) goto 100 write(*,1000) ' Binwidth-increment ',BinwidthIncr read(*,'(A)') answer if (answer.NE.' ') read(answer,*) BinwidthIncr if (BinwidthIncr.LT.0) goto 100 write(*,1000) ' number of bins to add ', nBins read(*,'(A)') answer if (answer.NE.' ') read(answer,*) nBins if (nBins.LE.0) goto 100 E0_ = E0 E0Binwidth_ = E0Binwidth BinwidthIncr_ = BinwidthIncr nBins_ = nBins indx_ = indx lun = 6 write(*,*) write(*,*) ' so, next intervalls would be: (number, lowerE0, upperE0, binWidth)' write(*,*) write(*,2000) indx,E0, E0 + E0BinWidth,E0BinWidth 2000 format (x,I3,': ',I5,'-',I5, 4x,'(',I4,')') 50 do i = 1, nBins indx = indx + 1 E0 = E0 + E0BinWidth if (lun.EQ.6) then if (i.NE.nBins) write(*,2000) indx,E0, E0+E0BinWidth+BinwidthIncr,E0BinWidth+BinwidthIncr else write(lun,'(x,F8.3)') real(E0) / 1000. endif E0BinWidth = E0BinWidth + BinwidthIncr enddo if (lun.EQ.6) then write(*,*) write(*,1001) ' add them to file ? > ' read(*,'(A)') answer call str$upcase(answer,answer) E0 = E0_ E0Binwidth = E0Binwidth_ BinwidthIncr = BinwidthIncr_ nBins = nBins_ indx = indx_ if (index(answer,'Y').NE.0 .OR. index(answer,'J').NE.0) then lun = lunOUT goto 50 else write(*,*) '=> cancel' endif endif goto 10 c Schliessen des Ausgabefiles: 100 close (lunOUT) write(*,*) write(*,*) ' -> created file ''accel$READdirectory:E0-Intervalls.input_''' write(*,*) END