2265 lines
84 KiB
Fortran
2265 lines
84 KiB
Fortran
C%CREATE MCV3
|
|
CC
|
|
CC MONTE-CARLO RECHNUNG:
|
|
CC DURCHGANG VON SCHWEREN TEILCHEN DURCH MATERIE
|
|
CC
|
|
CC REV.: ELOSS2 ANSTELLE VON RGEFIN EINBAUT.
|
|
CC REV.: UND DOPPELTGENAUE RGE-E-TABELLEN
|
|
CC REV.: Einführung eines Parameters für den Befehl 'BUILD_TAB', mit dem die
|
|
CC Variable "PREC" und damit die relative Genauigkeit der Interpolation
|
|
CC beim Erstellen der Reichweite-Energie-Tabelle bestimmt werden kann.
|
|
CC Damit lassen sich zum Programmabbruch führende Fehler in der Routine
|
|
CC SPLIN3 vermeiden, die zuvor bei gewissen Materialien wie z. B. reinem
|
|
CC Aluminium auftraten. Zusätzlich gibt es hier und in UPLIBK.FOR einige
|
|
CC weitere kleine Änderungen. KT 10-JAN-95
|
|
CC REV.: Eine und damit vielleicht bereits die alleinige Ursache für Programm-
|
|
CC abstürze, die besonders bei hohen Teilchenzahlen auftraten, ist gefun-
|
|
CC den und beseitigt. Die Energie-Reichweite-Tabelle wird von einem kubi-
|
|
CC schen Spline-Polynom angenähert, das sich aufgrund von Rundungsfehlern
|
|
CC unter Umständen numerisch nicht korrekt lösen läßt. In der Funktion
|
|
CC ELOSS2 in UPLIBK.FOR wurde bislang in diesem Fall kommentarlos eine
|
|
CC Stop-Anweisung ausgeführt. Jetzt wird das betreffende Teilchen aus der
|
|
CC weiteren Rechnung genommen und dies in einem Hinweis in der Standard-
|
|
CC Ausgabedatei vermerkt. Bei der anzunehmenden Rate von einem bis zwei
|
|
CC Teilchen pro 100,000 wird dies den Aussagewert der Rechnungen nicht
|
|
CC einschränken. In der Funktion ELOSS2 wurde ferner die Genauigkeit der
|
|
CC Konstanten 4*PI/3 und 2*PI/3 von 8 auf 16 Stellen verbessert, wodurch
|
|
CC eine Reihe von Fehlberechnungen bereits vermieden wurde. Allen weiter-
|
|
CC en Stop-Anweisungen, die zu einem ähnlich unerklärten Programmende
|
|
CC führten, wurde die Ausgabe eines Hinweises über die Ursachen des Ab-
|
|
CC bruchs und deren mögliche Behebung vorangestellt.
|
|
CC In der Standard-Ausgabedatei werden jetzt Datum und Uhrzeit vom Start
|
|
CC und Ende des Programms sowie die Dauer der Rechnung festgehalten.
|
|
CC KT 30-JAN-95
|
|
CC REV.: Der Fehler in der Zeitausgabe bei einer Rechnung über Mitternacht ist
|
|
CC korrigiert. Vier neue Eingabedatei-Befehle sind implementiert.
|
|
CC Die beiden Befehle IMPULS und WINKEL haben eine analoge Struktur. Sie
|
|
CC bewirken die Ausgabe der Impulsbeträge [MeV/c] bzw. des Streuwinkels
|
|
CC zur Z-Achse [rad] der Teilchen in die durch den Parameter festgelegte
|
|
CC Unit vor bzw. hinter einem Bauteil, das durch die Position des Befehls
|
|
CC in der Eingabedatei festgelegt ist. In den Vektor IMPOUT bzw. THEOUT
|
|
CC mit jeweils der Länge 201 wird an die Position der Nummer des nachfol-
|
|
CC genden Bauteiles die Nummer der Ausgabe-Unit geschrieben. In der Rou-
|
|
CC tine COMPUT erfolgt später genau dann eine Ausgabe, wenn der zu dem
|
|
CC nachfolgenden Bauteil gehörende Wert des Vektors von Null verschieden
|
|
CC ist. Um bei Verwendung des Befehls SKIP keine unerwünschte Ausgabe zu
|
|
CC erhalten, sollten 'IMPULS' und 'WINKEL' vor 'GEOMETRY' stehen.
|
|
CC Auch der Befehl STOPPED hat die Nummer der Ausgabe-Unit als Parameter
|
|
CC mit demselben Prinzip. Er bewirkt die Ausgabe der Stoppverteilung in
|
|
CC dem zuletzt definierten Bauteil in Form einer Datei, die soviele Werte
|
|
CC enthält wie das Bauteil in Einzellagen aufgeteilt ist.
|
|
CC Mit dem Befehl FOCUS läßt sich schließlich der Strahl der einkommenden
|
|
CC Teilchen fokussieren. Der erste Parameter gibt die Z-Position [cm] der
|
|
CC x=0 Fokusgeraden an, der zweite die Z-Position der y=0 Fokusgeraden,
|
|
CC die, keine Ablenkung durch Streuung vorausgesetzt, alle Teilchenbahnen
|
|
CC schneiden. Erlaubt sind Eingaben von -1000 bis +1000; ein negativer
|
|
CC Wert bewirkt eine Defokussierung, Null beläßt den Strahl parallel.
|
|
CC KT 16-FEB-95
|
|
CC REV.: Implementierung eines neuen Eingabedatei-Befehls zue Ausgabe der X,Y-
|
|
CC Koordinaten ('WHERE_XY'). Die Bearbeitung erfolgt völlig analog zu
|
|
CC den Befehlen IMPULS und WINKEL. Ferner die endgültige Lösung des
|
|
CC Mitternacht-Problems. KT 21-FEB-95
|
|
CC REV.: Änderung der Zuweisungen von Ein- und Ausgabeunits, um den Code auch
|
|
CC für AXP-Rechner verwenden zu können. KT 5-MAR-95
|
|
CC REV.: Implementierung eines homogenen Magnetfeldes parallel zu Z, Befehl
|
|
CC MAGNETIC. Parameter: 1. Z-Koordinate des Anfangs, 2. Stärke in Gauß,
|
|
CC wobei das Vorzeichen die Richtung in Bezug auf Z angibt. Ein neuer
|
|
CC Befehl für die X,Y-Ausgabe, der nicht nur die Teilchen erfaßt, die
|
|
CC das Bauteil treffen: ALL_XY.
|
|
CC
|
|
CC Alle Änderungen sind mit "c-kt" kommentiert.
|
|
cc
|
|
cc
|
|
cc
|
|
CC REV.: Changed the BEAM_XY command a little; now the Beam parameter
|
|
cc is also required as input parameter: "1" means isotropic circular
|
|
cc "2" gaussian
|
|
cc "3" isotropic rectangular
|
|
cc TP, 1-jun-1995
|
|
CC
|
|
CC
|
|
cc REV.: New command INIT_OUT to write the start values of location
|
|
cc momentum, energy and time to file; usage as the new commands
|
|
cc by kt. Also changed the formatted output from the OUTPUT command
|
|
cc
|
|
cc TP, 1-jun-1995
|
|
cc
|
|
cc REV.: Option for unformatted output: new command FORMATTED and UFORMATTED;
|
|
cc If FORMATTED
|
|
cc is set, then formatted output will be made for the 'in front of
|
|
cc data', the 'Behind' and the 'init' data, TP, 2-jun-1995
|
|
cc
|
|
cc
|
|
cc TP, 17-Dec-1996: Aenderungen in MCV3K_SUB.FOR um Programm auch auf Alpha
|
|
cc Maschinen laufen zu lassen (z.B. neue SPLINE Routine,
|
|
cc diverse REAL*8 Deklarationen).
|
|
cc AH hat noch einige ueberfluessige Variablendekla.
|
|
cc gefunden, die ebenfalls herauskommentiert wurden
|
|
cc
|
|
cc TP, 12-Sep-2000: some changes to get it run in Windows NT and Unix
|
|
cc exchanged SYSOUT and SYSIN, SYSOUT was set
|
|
cc to 5 and
|
|
cc SYSIN to 6 ? Commented out str$upcase.
|
|
cc commented out open and close of
|
|
cc open(SYSOUT,...,FILE='SYS$OUTPUT'...)
|
|
cc
|
|
cc----------------------------------------------------------------------------
|
|
cc
|
|
cc
|
|
BLOCK DATA
|
|
COMMON / ATOMIC / RADLEN(92)
|
|
C RADIATION LENGTH IN G/CM**2
|
|
DATA RADLEN /63.0470,94.3221,82.7559,65.1899,52.6868,
|
|
1 42.6983,37.9879,34.2381,32.9303,28.9367,27.7362,
|
|
2 25.0387,24.0111,21.8234,21.2053,19.4953,19.2783,
|
|
3 19.5489,17.3167,16.1442,16.5455,16.1745,15.8425,
|
|
4 14.9444,14.6398,13.8389,13.6174,12.6820,12.8616,
|
|
5 12.4269,12.4734,12.2459,11.9401,11.9082,11.4230,
|
|
6 11.3722,11.0272,10.7623,10.4101,10.1949,9.9225,
|
|
7 9.8029,9.6881,9.4825,9.2654,9.2025,8.9701,8.9945,
|
|
8 8.8491,8.8170,8.7244,8.8267,8.4803,8.4819,8.3052,
|
|
9 8.3073,8.1381,7.9557,7.7579,7.7051,7.5193,7.5727,
|
|
1 7.4377,7.4830,7.3563,7.3199,7.2332,7.1448,7.0318,
|
|
2 7.0214,6.9237,6.8907,6.8177,6.7630,6.6897,6.6763,
|
|
3 6.5936,6.5433,6.4608,6.4368,6.4176,6.3688,6.2899,
|
|
4 6.1907,6.0651,6.2833,6.1868,6.1477,6.0560,6.0726,
|
|
5 5.9319,5.9990/
|
|
END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C H A U P T P R O G R A M M
|
|
C ----------------------------------------------------------------------
|
|
|
|
CHARACTER*10 CMD, CMDTAB(33), GEOTYP(2), OUTTYP(7), BEAMTY(3)
|
|
CHARACTER*20 COMENT
|
|
c-kt Uhrzeit, Datum und Systemzeit bei Programmbeginn und -ende sowie
|
|
c-kt die Zählvariable für die aus der Rechnung genommenen Teilchen
|
|
CHARACTER*8 startzeit, endezeit
|
|
CHARACTER*9 startdatum, endedatum
|
|
REAL*4 startsec, dauer
|
|
INTEGER*4 h, m, s, fehler
|
|
c-kt Ende
|
|
c-kt Variablen für MAGNETIC: Beginn und Stärke des Magnetfeldes [cm], [Gauss]
|
|
REAL*4 MSTART, MGAUSS
|
|
REAL*8 RGDATA
|
|
INTEGER*4 SEEDS
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY und ALL_XY:
|
|
INTEGER*2 IMPOUT, THEOUT, STPOUT, XYOUT, XYALL, LUNINIT
|
|
c-kt Deklaration neuer Bezeichner für Ein- und Ausgabeunit: SYSOUT, SYSIN
|
|
INTEGER*2 SYSOUT, SYSIN
|
|
LOGICAL TEST, RULER, LAYON, LAYGEO, BEAMP,
|
|
1 BEAMXY, SEEDOK, MASSOK, TABOK, SCATTR, STRAGG,
|
|
2 SKIP, form
|
|
|
|
COMMON
|
|
1 / EXECFL / SCATTR, STRAGG, RELSTR
|
|
COMMON
|
|
1 / ATOMIC / RADLEN(92)
|
|
COMMON
|
|
1 / RETAB / NRGMAX, NRGCUR, RGDATA (5,3000)
|
|
2 / LAYER / NLAY, ILAYS(200), ILAYE(200),
|
|
3 THICK(200), RTHICK(200), RO(200),
|
|
4 ZMEAN(200), AMEAN(200), RMEAN(200),
|
|
5 ZKOO(200), IGEOT(200), PGEOT(5,200)
|
|
6 / LAYERG / NGRP, IGRPS(200), IGRPE(200)
|
|
7 / LAYERC / COMENT(200)
|
|
8 / PARTIC / BMASS, BMASS2, EKMIN, EKMAX, IBFLAG, IBUNIT
|
|
9 / BEAM / PMEAN, PFWHM, PLOW, PHIGH, XFWHM, YFWHM,
|
|
1 RMAX,
|
|
2 IBTYP, XBEAM, YBEAM, PSIGMA, RMAX2
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
3 , XFOCUS, YFOCUS
|
|
c-kt Beginn und Stärke des Magnetfeldes
|
|
4 , MSTART, MGAUSS
|
|
COMMON
|
|
1 / KINEMA / ID, XX, YY, ZZ,
|
|
2 PX, PY, PZ, PTOTAL,
|
|
c-kt Einführen der Variable TTHETA für den Tangens des Streuwinkels:
|
|
3 THETA, PHI, STHETA, CTHETA, TTHETA,
|
|
4 SPHI, CPHI,
|
|
5 TTOTAL, TLAST,
|
|
6 ELOSS
|
|
7 / OUTPUT / NLIMIT(200), NCOUNT(200), IOTYPE(200),
|
|
8 NLUNIT(200), ELIMIT(200)
|
|
9 / COMPON / NZCOMP(20), ACOMP(20), NATOM(20), NELEM, NELEMC
|
|
1 / SEEDCO / SEEDS (6)
|
|
COMMON
|
|
c-kt Deklaration neuer Bezeichner für Ein- und Ausgabeunit: SYSOUT, SYSIN
|
|
1 / STATUS / SYSOUT, SYSIN, TEST
|
|
3 / INPUT / WPARM(6)
|
|
c-kt Zählvariable für die aus der Rechnung genommenen Teilchen:
|
|
COMMON
|
|
1 / COUNT / fehler
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY und ALL_XY:
|
|
COMMON
|
|
1 / SGLOUT / IMPOUT(201), THEOUT(201), STPOUT(200), XYOUT(201),
|
|
2 XYALL(201), LUNINIT
|
|
|
|
DATA GEOTYP / 'CIRCLE ','RECTANGLE '/
|
|
DATA OUTTYP / 'NOTHING ','IN FRONT ','STOPPED ',
|
|
1 'BEHIND ','STP,BEHIND','IN FR.,STP',
|
|
2 'ALL '/
|
|
DATA BEAMTY / 'ISOTROPIC ','GAUSSIAN ', 'RECTANGULA' /
|
|
|
|
C ----------------------------------------------------------------------
|
|
C TABELLE DER GUELTIGEN KOMMANDOS
|
|
C ----------------------------------------------------------------------
|
|
DATA CMDTAB(1)/'BEAM_P '/
|
|
DATA CMDTAB(2)/'LAYER '/
|
|
DATA CMDTAB(3)/'GEOMETRY '/
|
|
DATA CMDTAB(4)/'COMPONENT '/
|
|
DATA CMDTAB(5)/'BUILD_TAB '/
|
|
DATA CMDTAB(6)/'HOLE '/
|
|
DATA CMDTAB(7)/'OUTPUT '/
|
|
DATA CMDTAB(8)/'COMPUTE '/
|
|
DATA CMDTAB(9)/'EXIT '/
|
|
DATA CMDTAB(10)/'RULER '/
|
|
DATA CMDTAB(11)/'NORULER '/
|
|
DATA CMDTAB(12)/'TEST '/
|
|
DATA CMDTAB(13)/'NOTEST '/
|
|
DATA CMDTAB(14)/'SEEDS '/
|
|
DATA CMDTAB(15)/'PARTICLE '/
|
|
DATA CMDTAB(16)/'BEAM_XY '/
|
|
DATA CMDTAB(17)/'OLD_LAYER '/
|
|
DATA CMDTAB(18)/'STRAG_ON '/
|
|
DATA CMDTAB(19)/'STRAG_OFF '/
|
|
DATA CMDTAB(20)/'SCATT_ON '/
|
|
DATA CMDTAB(21)/'SCATT_OFF '/
|
|
DATA CMDTAB(22)/'SUMMARY '/
|
|
DATA CMDTAB(23)/'SKIP '/
|
|
c-kt Die neuen Befehle IMPULS, WINKEL, STOPPED, WHERE_XY, ALL_XY, FOCUS
|
|
c-kt und MAGNETIC
|
|
DATA CMDTAB(24)/'IMPULS '/
|
|
DATA CMDTAB(25)/'WINKEL '/
|
|
DATA CMDTAB(26)/'STOPPED '/
|
|
DATA CMDTAB(27)/'FOCUS '/
|
|
DATA CMDTAB(28)/'WHERE_XY '/
|
|
DATA CMDTAB(29)/'MAGNETIC '/
|
|
DATA CMDTAB(30)/'ALL_XY '/
|
|
c
|
|
DATA CMDTAB(31)/'INIT_OUT '/
|
|
DATA CMDTAB(32)/'FORMATTED '/
|
|
DATA CMDTAB(33)/'UFORMATTED'/
|
|
DATA NNAME/33/
|
|
c-kt Ende
|
|
|
|
C ----------------------------------------------------------------------
|
|
C INITIALISIERUNG ALLER VARIABLEN
|
|
C ----------------------------------------------------------------------
|
|
c-kt den Zeitpunkt des Programmbeginns festhalten
|
|
CALL DATE(startdatum)
|
|
CALL TIME(startzeit)
|
|
startsec = SECNDS(0.0)
|
|
c-kt Initialisieren des Zählers für die aus der Rechnung genommenen Teilchen
|
|
fehler = 0
|
|
c-kt Ende
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
XFOCUS = 0.0
|
|
YFOCUS = 0.0
|
|
c-kt Ende
|
|
ZKOMAX = 0.0
|
|
NREP = 0
|
|
NRGMAX = 3000
|
|
NRGCUR = 0
|
|
NGRP = 0
|
|
IKARD = 0
|
|
SYSOUT = 6
|
|
SYSIN = 5
|
|
NLAY = 0
|
|
NELEM = 0
|
|
SCATTR = .TRUE.
|
|
STRAGG = .TRUE.
|
|
RULER = .FALSE.
|
|
TEST = .FALSE.
|
|
LAYON = .FALSE.
|
|
LAYGEO = .FALSE.
|
|
TABOK = .FALSE.
|
|
BEAMP = .FALSE.
|
|
BEAMXY = .FALSE.
|
|
SEEDOK = .FALSE.
|
|
MASSOK = .FALSE.
|
|
SKIP = .FALSE.
|
|
FORM = .FALSE.
|
|
DO 10 I=1,200
|
|
IOTYPE(I) = 1
|
|
NLIMIT(I) = 0
|
|
NLUNIT(I) = 6
|
|
c-kt Integer-Array für die Unit-Nummern zu dem Befehl STOPPED:
|
|
STPOUT(I) = 0
|
|
10 CONTINUE
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt WHERE_XY und ALL_XY
|
|
DO 11 I=1,201
|
|
IMPOUT(I) = 0
|
|
THEOUT(I) = 0
|
|
XYOUT(I) = 0
|
|
XYALL(I) = 0
|
|
11 CONTINUE
|
|
LUNINIT = 0
|
|
c-kt Ende
|
|
c
|
|
c-kt Zuweisen des logischen Namens SYS$OUTPUT an die Unit SYSOUT:
|
|
c OPEN(UNIT=SYSOUT,FILE='SYS$OUTPUT',STATUS='NEW')
|
|
c-kt Zuweisen des logischen Namens SYS$INPUT an die Unit SYSIN:
|
|
c OPEN(UNIT=SYSIN,FILE='SYS$INPUT',READONLY,STATUS='OLD')
|
|
c
|
|
C ----------------------------------------------------------------------
|
|
C LESE DAS NAECHSTE KOMMANDO EIN
|
|
C ----------------------------------------------------------------------
|
|
50 IKARD = IKARD + 1
|
|
C LESE NAECHSTES CMD
|
|
IF ( RULER ) WRITE (SYSOUT,5017)
|
|
5017 FORMAT (' NEXT COMMAND...'/' ....;....1....;....2....;....3....;'
|
|
1 ,'....4....;....5....;....6....;....7....;')
|
|
READ(SYSIN,5000) CMD, WPARM
|
|
5000 FORMAT (A10, 6F10.0)
|
|
c
|
|
c-tp write string in upper case
|
|
c
|
|
c call str$upcase(cmd,cmd)
|
|
IF ( CMD .EQ. ' ' ) GOTO 50
|
|
if(cmd(1:1) .eq. '*') goto 50 ! '*' means comment in Input file
|
|
C ANZAHL DER ARG. ?
|
|
K = 1
|
|
DO 60 I= 1, 6
|
|
IF (WPARM(I)) 58,60,58
|
|
58 K = I
|
|
60 CONTINUE
|
|
C PROTOKOLLIERE
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5001) IKARD, CMD, ( WPARM(I), I=1, K )
|
|
5001 FORMAT (' ',10('*')/' ** ',I3,' **',A10,7F15.5)
|
|
WRITE (SYSOUT,5004)
|
|
5004 FORMAT (' **********')
|
|
ENDIF
|
|
C SUCHE KOMMANDO
|
|
DO 80 I= 1, NNAME
|
|
IF ( CMD .EQ. CMDTAB(I) ) GO TO 90
|
|
80 CONTINUE
|
|
C KOMMANDO NICHT GEF.
|
|
WRITE (SYSOUT,5006)
|
|
5006 FORMAT ('+',10X,'(COMMAND IGNORED)')
|
|
GO TO 50
|
|
|
|
c-kt erweiterte Tabelle
|
|
CC 1 2 3 4 5 6 7 8 9 10
|
|
90 GO TO ( 100, 200, 300, 400, 500, 600, 700, 800, 900,1000,
|
|
1 1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,
|
|
2 2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,
|
|
3 3100,3200,3300 ), I
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "BEAM_P" IMPULSVERTEILUNG DES STRAHLS
|
|
C ----------------------------------------------------------------------
|
|
100 IF ( BEAMP ) THEN
|
|
WRITE (SYSOUT,5010)
|
|
5010 FORMAT(' MOMENTUM DISTRIBUTION OF BEAM ALREADY DEFINED.')
|
|
STOP 12
|
|
ENDIF
|
|
|
|
PMEAN = ABS( WPARM(1) )
|
|
RPFWHM = ABS( WPARM(2) )
|
|
PFWHM = PMEAN * RPFWHM
|
|
PLOW = ABS( WPARM(3) )
|
|
PHIGH = ABS( WPARM(4) )
|
|
|
|
c CALL TBOUND ('R4','P_MEAN ',PMEAN, 1.0, 5000. , 'IN')
|
|
c
|
|
CALL TBOUND ('R4','P_MEAN ',PMEAN, 0.7, 5000. , 'IN')
|
|
CALL TBOUND ('R4','P_FWHM ',PFWHM, 0.0, 5.*PMEAN, 'IN')
|
|
CALL TBOUND ('R4','P_LOW ',PLOW , 1.E-1, PMEAN , 'IN')
|
|
CALL TBOUND ('R4','P_HIGH ',PHIGH, PMEAN, 5000. , 'IN')
|
|
|
|
PSIGMA = PFWHM * 0.4246609
|
|
BEAMP = .TRUE.
|
|
|
|
IF ( MASSOK ) THEN
|
|
DUMMY = STRAG1( PMEAN, BMASS )
|
|
WRITE(SYSOUT,5012) PMEAN, DUMMY
|
|
5012 FORMAT(' RELATIVE STRAGGLING FOR ',1PE12.5,' MEV/C = ',1PE12.5)
|
|
ENDIF
|
|
|
|
IF ( TEST ) THEN
|
|
WRITE(SYSOUT,5011) PMEAN,PFWHM,RPFWHM,PLOW,PHIGH
|
|
5011 FORMAT(' ','BEAM PARAMETER'/
|
|
1 6X,'MEAN MOMENTUM IN MEV/C',T60,1PE12.5/
|
|
2 6X,'ABSOLUTE FWHM OF THE MOMENTUM DISTRIBUTION',T60,1PE12.5/
|
|
3 6X,'RELATIVE FWHM OF THE MOMENTUM DISTRIBUTION',T60,1PE12.5/
|
|
4 6X,'LOWEST MOMENTUM IN MEV/C',T60,1PE12.5/
|
|
5 6X,'HIGHEST MOMENTUM IN MEV/C',T60,1PE12.5)
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "LAYER" DATEN FUER DIE BESCHAFFENHEIT EINER SCHICHT
|
|
C ----------------------------------------------------------------------
|
|
200 IF ( LAYON ) THEN
|
|
WRITE (SYSOUT,5021)
|
|
5021 FORMAT(' PREVIOUS LAYER OR HOLE-COMMAND STILL ACTIVE.')
|
|
STOP 12
|
|
ENDIF
|
|
NLAY = NLAY + 1
|
|
NGRP = NGRP + 1
|
|
CALL TBOUND ('I4','#LAYER ',NLAY ,1,200,'IN ')
|
|
CALL TBOUND ('I4','#GROUP ',NGRP ,1,200,'IN ')
|
|
|
|
NELEM = IFIX( WPARM(1) + 0.5 )
|
|
RO (NLAY) = WPARM (2)
|
|
THICK (NLAY) = WPARM (3)
|
|
NDIV = MAX0( IFIX( WPARM(4) + 0.5 ), 1 )
|
|
RPDIST = ABS( WPARM(5) )
|
|
NREP = NDIV - 1
|
|
THICK (NLAY) = THICK (NLAY) / FLOAT(NDIV)
|
|
READ (SYSIN,5171) COMENT(NGRP)
|
|
|
|
CALL TBOUND ('I4','#COMPONENT',NELEM,1,20,'IN ')
|
|
CALL TBOUND ('R4','DENSITY ',RO(NLAY),1.E-08,100.,'IN')
|
|
CALL TBOUND ('R4','THICKNESS ',THICK(NLAY),1.E-08,1.E08,'IN')
|
|
CALL TBOUND ('I4','REPETITION',NREP,0,(200-NLAY),'IN ')
|
|
CALL TBOUND ('R4','DISTANCE ',RPDIST,0.0, 1.E06,'IN')
|
|
|
|
RTHICK(NLAY) = RO(NLAY) * THICK(NLAY)
|
|
NELEMC = 0
|
|
LAYON = .TRUE.
|
|
LAYGEO = .FALSE.
|
|
TABOK = .FALSE.
|
|
NLAYXX = NLAY + NREP
|
|
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5022) NLAY, NLAYXX, COMENT(NLAY), NELEM, RO(NLAY),
|
|
1 THICK(NLAY), RTHICK(NLAY), NREP, RPDIST
|
|
5022 FORMAT (' ','LAYER#',I3,'-',I3,' / ',A20/
|
|
1 ' ',5X,'NO OF ELEMENTS',T45,I12/
|
|
2 ' ',5X,'DENSITY IN G/CM**3',T45,1PE12.5/
|
|
3 ' ',5X,'THICKNESS IN CM',T45,1PE12.5/
|
|
4 ' ',5X,'THICKNESS IN G/CM**2',T45,1PE12.5/
|
|
5 ' ',5X,'NUMBER OF ADDITIONAL LAYERS',T45,I12/
|
|
6 ' ',5X,'DISTANCE IN CM',T45,1PE12.5)
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "GEOMETRY" ALLE GEOMETRIEDATEN EINER SCHICHT
|
|
C ----------------------------------------------------------------------
|
|
300 IF ( LAYGEO .OR. .NOT.LAYON ) THEN
|
|
WRITE (SYSOUT,5031)
|
|
5031 FORMAT(' GEOMETRY-DATA ALREADY DEFINED OR NO LAYER-COMMAND',
|
|
1 ' ACTIVE.')
|
|
STOP 12
|
|
ENDIF
|
|
LAYGEO = .TRUE.
|
|
|
|
ZKOO (NLAY) = ABS (WPARM (1))
|
|
IGEOT(NLAY) = IFIX ( WPARM(2) + 0.5 )
|
|
PGEOT(1,NLAY) = WPARM(3)
|
|
|
|
CALL TBOUND ('R4','Z-COORD ',ZKOO(NLAY),ZKOMAX,5.E05,'IN ')
|
|
CALL TBOUND ('I4','GEO-TYPE ',IGEOT(NLAY),1,2,'IN ')
|
|
|
|
ZKOMAX = ZKOO(NLAY) + THICK(NLAY)
|
|
|
|
IF ( IGEOT(NLAY) .EQ. 2 ) THEN
|
|
|
|
DO 310 LL=2,4
|
|
PGEOT(LL,NLAY) = WPARM(LL+2)
|
|
310 CONTINUE
|
|
CALL TBOUND ('R4','X-SIZE ',(PGEOT(2,NLAY)-PGEOT(1,NLAY)),
|
|
1 1.E-05,500.0,'IN ')
|
|
CALL TBOUND ('R4','Y-SIZE ',(PGEOT(4,NLAY)-PGEOT(3,NLAY)),
|
|
1 1.E-05,500.0,'IN ')
|
|
ELSE
|
|
PGEOT(2,NLAY) = PGEOT(1,NLAY)**2
|
|
CALL TBOUND ('R4','RADIUS ',PGEOT(1,NLAY),1.E-05,500.0,'IN ')
|
|
ENDIF
|
|
|
|
IGRPS(NGRP) = NLAY
|
|
IGRPE(NGRP) = NLAY + NREP
|
|
|
|
IF ( .NOT. SKIP .AND. TEST ) THEN
|
|
WRITE (SYSOUT,5032) NLAY, NLAYXX, GEOTYP(IGEOT(NLAY)),
|
|
1 IGEOT(NLAY), ZKOO(NLAY)
|
|
5032 FORMAT (' ','SHAPE OF LAYER#',I3,'-',I3/
|
|
1 ' ',5X,'TYPE',T45,A10,'(',I1,')'/
|
|
2 ' ',5X,'Z-COORDINATE',T45,1PG12.5,' CM')
|
|
IF ( IGEOT(NLAY) .EQ. 1 ) THEN
|
|
WRITE (SYSOUT,5033) PGEOT(1,NLAY)
|
|
5033 FORMAT(' ',5X,'RADIUS',T45,1PG12.5,' CM')
|
|
ELSE
|
|
WRITE (SYSOUT,5034) (PGEOT(LL,NLAY),LL=1,4)
|
|
5034 FORMAT(' ',5X,'X-LEFT',T45,1PG12.5,' CM'/
|
|
1 ' ',5X,'X-RIGHT',T45,1PG12.5,' CM'/
|
|
2 ' ',5X,'Y-BOTTOM',T45,1PG12.5,' CM'/
|
|
3 ' ',5X,'Y-TOP',T45,1PG12.5,' CM')
|
|
ENDIF
|
|
ENDIF
|
|
IF ( .NOT. TABOK ) GOTO 50
|
|
C LAYER-DATA NOW COMPLETE
|
|
350 TABOK = .FALSE.
|
|
LAYON = .FALSE.
|
|
LAYGEO = .FALSE.
|
|
SKIP = .FALSE.
|
|
IF ( NREP .LE. 0 ) GOTO 50
|
|
C WIEDERHOLE "NREP" - MAL
|
|
IS = NLAY + 1
|
|
IE = NLAY + NREP
|
|
DO 360 IREP=IS,IE
|
|
ILAYS(IREP) = ILAYS(NLAY)
|
|
ILAYE(IREP) = ILAYE(NLAY)
|
|
RO(IREP) = RO(NLAY)
|
|
THICK(IREP) = THICK(NLAY)
|
|
RTHICK(IREP) = RTHICK(NLAY)
|
|
ZKOO(IREP) = ZKOO(IREP-1) + THICK(IREP-1) + RPDIST
|
|
IGEOT(IREP) = IGEOT(NLAY)
|
|
PGEOT(1,IREP) = PGEOT(1,NLAY)
|
|
PGEOT(2,IREP) = PGEOT(2,NLAY)
|
|
PGEOT(3,IREP) = PGEOT(3,NLAY)
|
|
PGEOT(4,IREP) = PGEOT(4,NLAY)
|
|
PGEOT(5,IREP) = PGEOT(5,NLAY)
|
|
ZMEAN(IREP) = ZMEAN(NLAY)
|
|
AMEAN(IREP) = AMEAN(NLAY)
|
|
RMEAN(IREP) = RMEAN(NLAY)
|
|
NLIMIT(IREP) = NLIMIT(NLAY)
|
|
NLUNIT(IREP) = NLUNIT(NLAY)
|
|
IOTYPE(IREP) = IOTYPE(NLAY)
|
|
360 CONTINUE
|
|
ZDUMMY = ZKOO(IE) - ZKOO(NLAY)
|
|
NLAY = IE
|
|
ZKOMAX = ZKOO(NLAY) + THICK(NLAY)
|
|
WRITE(SYSOUT,5035) NREP,ZDUMMY
|
|
5035 FORMAT(' LAYER ',I3,' TIME(S) REPEATED.'/' ',5X,
|
|
1 'TOTAL LENGTH IN CM',T45,1PE12.5)
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "COMPONENT" ALLE DATEN EINER SCHICHTKOMPONENTE
|
|
C ----------------------------------------------------------------------
|
|
400 IF ( SKIP ) GOTO 50
|
|
NELEMC = NELEMC + 1
|
|
CALL TBOUND ('I4','#ELEMENTS ',NELEMC,1,NELEM,'IN ')
|
|
|
|
NZCOMP(NELEMC) = IFIX ( WPARM(1) + 0.5 )
|
|
ACOMP(NELEMC) = ABS(WPARM(2))
|
|
NATOM (NELEMC) = IFIX ( WPARM(3) + 0.5 )
|
|
|
|
CALL TBOUND ('I4','Z ',NZCOMP(NELEMC),1,92,'IN ')
|
|
CALL TBOUND ('R4','AWT ',ACOMP(NELEMC), 1.0,240.0,'IN ')
|
|
CALL TBOUND ('I4','# OF ATOMS',NATOM (NELEMC),1,1000,'IN ')
|
|
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5041) NLAY, NLAYXX, NELEMC, NZCOMP(NELEMC),
|
|
1 ACOMP(NELEMC), NATOM(NELEMC)
|
|
5041 FORMAT(' ','LAYER#',I3,'-',I3,', COMPONENT#',I3/
|
|
1 ' ',5X,'Z = ',I3,', A = ',F10.3,', #ATOMS = ',I3)
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "BUILD_TAB" ERSTELLE DIE REICHWEITE-ENERGIE TABELLE
|
|
C ----------------------------------------------------------------------
|
|
500 IF ( SKIP ) GOTO 590
|
|
IF ( LAYON .AND. .NOT. TABOK .AND. ( NELEMC .EQ. NELEM )
|
|
1 .AND. MASSOK )
|
|
1THEN
|
|
c-kt Beginn der Änderung zur Parameterübergabe
|
|
PREC = ABS( WPARM(1) )
|
|
IF ( PREC .EQ. 0.0 ) THEN
|
|
PREC = 1.0E-04
|
|
ELSE
|
|
CALL TBOUND ('R4','PRECISION ',PREC,1.E-8,1.E-4,'IN')
|
|
ENDIF
|
|
c-kt Ende
|
|
SUMZ = 0.
|
|
SUMA = 0.
|
|
SUMR = 0.
|
|
NSUM = 0
|
|
DO 510 LL=1,NELEM
|
|
NSUM = NSUM + NATOM(LL)
|
|
SUMZ = SUMZ + ( NATOM(LL) *
|
|
1 FLOAT(NZCOMP(LL)) * FLOAT(NZCOMP(LL)+1) )
|
|
SUMA = SUMA + ( NATOM(LL) * ACOMP(LL) )
|
|
SUMR = SUMR + ( NATOM(LL) / RADLEN(NZCOMP(LL)) )
|
|
510 CONTINUE
|
|
ZMEAN (NLAY) = SQRT( SUMZ / FLOAT(NSUM) )
|
|
AMEAN (NLAY) = SUMA / FLOAT(NSUM)
|
|
RMEAN (NLAY) = FLOAT(NSUM) / SUMR
|
|
|
|
NRGSTA = NRGCUR + 1
|
|
NRG = NRGMAX - NRGCUR
|
|
c-kt Herauskommentieren des vorgefundenen Wertes:
|
|
c-kt PREC = 1.0E-04
|
|
CALL DGETAB ( BMASS, EKMIN, EKMAX, PREC,
|
|
1 NZCOMP, ACOMP, NATOM, NELEM,
|
|
2 RGDATA(1,NRGSTA), NRG, IFLAG )
|
|
IF ( IFLAG .NE. 0 ) THEN
|
|
c-kt Ein Hinweis auf den Grund des Absturzes ist immer angenehm ...
|
|
IF ( IFLAG .EQ. 5 ) THEN
|
|
c-kt Fortsetzung eines Hinweises, der von DGETAB bei IFLAG=5 gegeben wird:
|
|
WRITE (SYSOUT,5555) NLAY
|
|
5555 FORMAT(' Nummer ',I3)
|
|
ELSE IF ( IFLAG .EQ. 1 ) THEN
|
|
c-kt Hilfe bei der Fehlersuche:
|
|
WRITE (SYSOUT,5556)
|
|
5556 FORMAT(' Zu wenig Einträge in der '//
|
|
1 'Energie-Reichweite-Tabelle.'
|
|
2 /' Wahrscheinlich muß entweder für diese Schicht mit dem '//
|
|
3 'Befehl'
|
|
4 /'''BUILD_TAB'' ein Parameter kleiner 1.E-4 übergeben '//
|
|
5 'oder der '
|
|
6 /' 3. Parameter von ''PARTICLE'' vergrößert werden.')
|
|
ELSE
|
|
c-kt für die anderen Fälle habe ich keine Informationen bereit:
|
|
WRITE (SYSOUT,5557) IFLAG
|
|
5557 FORMAT(' ROUTINE ''DGETAB'' mit Fehler ',I1,' verlassen.')
|
|
ENDIF
|
|
c-kt Ende
|
|
STOP 12
|
|
ENDIF
|
|
ILAYS (NLAY) = NRGSTA
|
|
ILAYE (NLAY) = NRG
|
|
NRGCUR = NRGCUR + NRG
|
|
ELSE
|
|
WRITE(SYSOUT,5051)
|
|
5051 FORMAT(' PARTICLE, LAYER OR COMPONENT ARE INCOMPLETE.')
|
|
STOP 12
|
|
ENDIF
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5052) NLAY, NLAYXX, ILAYS(NLAY), ILAYE(NLAY),
|
|
1 NRGCUR, ZMEAN(NLAY), AMEAN(NLAY),
|
|
2 RMEAN(NLAY)
|
|
5052 FORMAT(' ','LAYER#',I3,'-',I3/
|
|
1 ' ',5X,'INDEX OF FIRST POINT IN (R,E)-TABLE',T45,I12/
|
|
2 ' ',5X,'NUMBER OF POINTS IN (R,E)-TABLE',T45,I12/
|
|
3 ' ',5X,'TOTAL NUMBER OF POINTS USED',T45,I12/
|
|
4 ' ',5X,'MEAN Z',T45,1PG12.5/
|
|
5 ' ',5X,'MEAN ATOMIC WEIGHT',T45,1PG12.5/
|
|
6 ' ',5X,'MEAN RADIATION LENGTH (G/CM**2)',T45,1PG12.5)
|
|
ENDIF
|
|
590 IF ( LAYGEO ) GOTO 350
|
|
TABOK = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "HOLE" DATEN FUER EIN STRAHLLOCH ODER EINE STRAHLBLENDE
|
|
C ----------------------------------------------------------------------
|
|
600 IF ( LAYON ) THEN
|
|
WRITE (SYSOUT,5061)
|
|
5061 FORMAT(' PREVIOUS LAYER OR HOLE-COMMAND STILL ACTIVE.')
|
|
STOP 12
|
|
ENDIF
|
|
|
|
NLAY = NLAY + 1
|
|
NGRP = NGRP + 1
|
|
CALL TBOUND ('I4','#LAYER ',NLAY ,1,200,'IN ')
|
|
CALL TBOUND ('I4','#GROUP ',NGRP ,1,200,'IN ')
|
|
THICK (NLAY) = WPARM (1)
|
|
CALL TBOUND ('R4','THICKNESS ',THICK(NLAY),1.E-08,1.E08,'IN')
|
|
|
|
NELEM = 0
|
|
RO (NLAY) = 0.0
|
|
RTHICK(NLAY) = 0.0
|
|
ILAYS(NLAY) = 0
|
|
ILAYE(NLAY) = 0
|
|
NREP = 0
|
|
RPDIST = 0.0
|
|
READ (SYSIN, 5171) COMENT(NGRP)
|
|
|
|
LAYON = .TRUE.
|
|
LAYGEO = .FALSE.
|
|
TABOK = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "OUTPUT" ALLE PARAMETER FUER DIE AUSGABE
|
|
C ----------------------------------------------------------------------
|
|
700 IF ( SKIP ) GOTO 50
|
|
IF ( NLAY .GE. 1 ) THEN
|
|
NLUNIT (NLAY) = IFIX ( WPARM(1) + 0.5 )
|
|
IOTYPE (NLAY) = IFIX ( WPARM(2) + 0.5 )
|
|
NLIMIT (NLAY) = IABS ( IFIX ( WPARM(3) + 0.5 ) )
|
|
ELIMIT (NLAY) = ABS ( WPARM(4) )
|
|
IF ( ELIMIT(NLAY) .LE. 0.0 ) ELIMIT(NLAY) = 1.0E37
|
|
|
|
CALL TBOUND ('I4','LOG UNIT# ',NLUNIT(NLAY) ,1,100,'IN ')
|
|
CALL TBOUND ('I4','OUT-TYPE ',IOTYPE(NLAY) ,1,7,'IN ')
|
|
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5071) NLAY, NLAYXX, NLUNIT(NLAY),
|
|
1 OUTTYP(IOTYPE(NLAY)),
|
|
2 IOTYPE(NLAY), NLIMIT(NLAY), ELIMIT(NLAY)
|
|
5071 FORMAT(' ','LAYER#',I3,'-',I3/
|
|
1 6X,'OUTPUT IS DIRECTED TO UNIT#',T45,I3/
|
|
2 6X,'OUTPUT-TYPE',T45,A10,'(',I1,')'/
|
|
3 6X,'MAXIMUM NUMBER OF EVENTS',T45,I12/
|
|
4 6X,'MAXIMUM ENERGY',T45,E12.5)
|
|
ENDIF
|
|
ELSE
|
|
WRITE (SYSOUT,5072)
|
|
5072 FORMAT(' NO LAYER OR HOLE-COMMAND ACTIVE OR GIVEN.')
|
|
STOP 12
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "COMPUTE" STARTE DIE EIGENTLICHE RECHNUNG
|
|
C ----------------------------------------------------------------------
|
|
800 IF ( .NOT.LAYON .AND. BEAMP .AND. SEEDOK .AND. (NLAY .GE. 1)
|
|
1 .AND. MASSOK .AND. BEAMXY )
|
|
2THEN
|
|
NEVCNT = IABS ( IFIX ( WPARM(1) + 0.5 ) )
|
|
NSVMAX = IABS ( IFIX ( WPARM(2) + 0.5 ) )
|
|
CALL TBOUND ('I4','#EVENTS ',NEVCNT ,1,50000000,'IN ')
|
|
CALL TBOUND ('I4','#THROUGH ',NSVMAX ,1,50000000,'IN ')
|
|
IZL=IZL+1
|
|
c CALL COMPUT (NEVCNT, NSVMAX, IZL, FORM)
|
|
CALL COMPUT (NEVCNT, NSVMAX, FORM) ! IZL removed, AH, 17-dec-1996
|
|
CALL COMSUM
|
|
ELSE
|
|
WRITE (SYSOUT,5081)
|
|
5081 FORMAT(' ','MASS, BEAM, LAYER OR SEED INCOMPLETE OR MISSING.')
|
|
STOP 12
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "EXIT" BEENDE DAS PROGRAMM
|
|
C ----------------------------------------------------------------------
|
|
c-kt Erweitert um die Ausgabe der Zeitpunkte des Programmstarts und -endes,
|
|
c-kt der Dauer der Rechnung und ggf. der Zahl der aus der Rechnung genommenen
|
|
c-kt Teilchen:
|
|
|
|
900 CALL TIME(endezeit)
|
|
CALL DATE(endedatum)
|
|
dauer = SECNDS(startsec)
|
|
|
|
IF ( fehler .GT. 0 ) THEN
|
|
WRITE (SYSOUT,901) fehler
|
|
901 FORMAT(' ',59('='),/T5,'Zahl der aus der Rechnung genommenen'//
|
|
1 ' Teilchen:',I6,/' ',59('='))
|
|
ENDIF
|
|
|
|
h = INT(dauer/3600.)
|
|
dauer = MOD(dauer,3600.)
|
|
m = INT(dauer/60.)
|
|
dauer = MOD(dauer,60.)
|
|
s = INT (dauer)
|
|
WRITE (SYSOUT,902) startzeit,startdatum,endezeit,endedatum
|
|
902 FORMAT(' ',//T5,'Programmstart:',3X,A8,2X,A9,/T5,
|
|
1 'Programmende:',4X,A8,2X,A9)
|
|
WRITE (SYSOUT,903) h,m,s
|
|
903 FORMAT(' ',/T5,'Zeitdifferenz:',3X,I2.2,':',I2.2,':',I2.2,/)
|
|
|
|
c-kt Ende
|
|
|
|
c-kt Schließen der Standard-Ausgabedatei
|
|
c CLOSE(SYSOUT)
|
|
c-kt Schließen der Standard-Eingabedatei
|
|
c CLOSE(SYSIN)
|
|
|
|
GOTO 9999
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "RULER" SCHALTET DEN RULER EIN
|
|
C ----------------------------------------------------------------------
|
|
1000 RULER = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "NORULER" SCHALTET DEN RULER AUS
|
|
C ----------------------------------------------------------------------
|
|
1100 RULER = .FALSE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "TEST" SCHALTET DEN TEST EIN
|
|
C ----------------------------------------------------------------------
|
|
1200 TEST = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "NOTEST" SCHALTET DEN TEST AB
|
|
C ----------------------------------------------------------------------
|
|
1300 TEST = .FALSE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "SEEDS" LIEST DIE STARTWERTE DER ZUFALLSZAHLEN EIN
|
|
C ----------------------------------------------------------------------
|
|
1400 DO 1410 LL=1,6
|
|
SEEDS (LL) = WPARM (LL)
|
|
1410 CONTINUE
|
|
SEEDOK = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "PARTICLE" MASSE UND ENERGIE-BEREICH DES TEILCHENS
|
|
C ----------------------------------------------------------------------
|
|
1500 BMASS = ABS( WPARM(1) )
|
|
EKMIN = ABS( WPARM(2) )
|
|
EKMAX = ABS( WPARM(3) )
|
|
|
|
CALL TBOUND ('R4','MASS/MEV ',BMASS, 50., 10000., 'IN ')
|
|
BMASS2 = BMASS * BMASS
|
|
CALL TBOUND ('R4','EK_MIN/MEV',EKMIN, 1.0E-04, 0.1, 'IN ')
|
|
CALL TBOUND ('R4','EK_MAX/MEV',EKMAX, 1., 10000.,'IN ')
|
|
MASSOK = .TRUE.
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5151) BMASS, EKMIN, EKMAX
|
|
5151 FORMAT(' ','PARTICLE PARAMETER'/
|
|
1 ' ',5X,'MASS IN MEV/C**2',T45,1PG12.5/
|
|
2 ' ',5X,'MINIMUM ENERGY IN MEV',T45,1PG12.5/
|
|
3 ' ',5X,'MAXIMUM ENERGY IN MEV',T45,1PG12.5)
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "BEAM_XY" RAEUMLICHE STRUKTUR DES STRAHLS
|
|
C ----------------------------------------------------------------------
|
|
1600 IF ( BEAMXY ) THEN
|
|
WRITE (SYSOUT,5160)
|
|
5160 FORMAT(' SPATIAL DISTRIBUTION OF BEAM ALREADY DEFINED.')
|
|
STOP 12
|
|
ENDIF
|
|
|
|
XFWHM = ABS( WPARM(1) )
|
|
YFWHM = ABS( WPARM(2) )
|
|
RMAX = ABS( WPARM(3) )
|
|
ibtyp = ifix( wparm(4) + 0.5 ) ! require ibtyp as input, tp
|
|
RMAX2 = RMAX * RMAX
|
|
|
|
CALL TBOUND ('R4','X_FWHM ',XFWHM, 0.0, 1000., 'IN')
|
|
CALL TBOUND ('R4','Y-FWHM ',YFWHM, 0.0, 1000., 'IN')
|
|
CALL TBOUND ('R4','R_MAX ',RMAX, 0.0, 1000., 'IN')
|
|
call tbound ('I4','BEAM-PARA ',ibtyp, 1, 3, 'IN')
|
|
|
|
c-tp IF ( XFWHM .EQ. 0.0 .OR. YFWHM .EQ. 0.0 ) THEN
|
|
c-tp IBTYP = 1
|
|
c-tp XBEAM = 0.0
|
|
c-tp YBEAM = 0.0
|
|
c-tp ELSE
|
|
c-tp IBTYP = 2
|
|
c-tp XBEAM = XFWHM * 0.4246609
|
|
c-tp YBEAM = YFWHM * 0.4246609
|
|
c-tp ENDIF
|
|
if ( ibtyp .eq. 1 ) then
|
|
XBEAM = 0.0
|
|
YBEAM = 0.0
|
|
else if ( ibtyp .eq. 2 ) then
|
|
XBEAM = XFWHM * 0.4246609
|
|
YBEAM = YFWHM * 0.4246609
|
|
else if (ibtyp .eq. 3 ) then ! new option, TP, 1-jun-95
|
|
XBEAM = XFWHM
|
|
YBEAM = YFWHM
|
|
endif
|
|
c
|
|
BEAMXY = .TRUE.
|
|
c
|
|
IF ( TEST ) THEN
|
|
WRITE(SYSOUT,5161) BEAMTY(IBTYP),XFWHM,YFWHM,RMAX
|
|
5161 FORMAT(' ','BEAM SPATIAL DISTRIBUTION PARAMETER'/
|
|
1 6X,'BEAM-SPOT DISTRIBUTION',T47,A10/
|
|
2 6X,'X-FWHM OF THE BEAMSPOT IN CM',T45,1PE12.5/
|
|
3 6X,'Y-FWHM OF THE BEAMSPOT IN CM',T45,1PE12.5/
|
|
4 6X,'MAXIMUM RADIUS OF BEAMSPOT IN CM',T45,1PE12.5)
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "OLD_LAYER" DATEN EINER SCHICHT SCHON VORHANDEN
|
|
C ----------------------------------------------------------------------
|
|
1700 IF ( LAYON ) THEN
|
|
WRITE (SYSOUT,5021)
|
|
STOP 12
|
|
ENDIF
|
|
NLAY = NLAY + 1
|
|
NGRP = NGRP + 1
|
|
CALL TBOUND ('I4','#LAYER ',NLAY ,1,200,'IN ')
|
|
CALL TBOUND ('I4','#GROUP ',NGRP ,1,200,'IN ')
|
|
|
|
NLOLDG = IFIX ( WPARM (1) + 0.5 )
|
|
CALL TBOUND ('I4','#OLD_GROUP',NLOLDG ,1,(NGRP-1),'IN ')
|
|
NLOLD = IGRPS(NLOLDG)
|
|
CALL TBOUND ('I4','TAB_START ',ILAYS(NLOLD) ,1,NRGMAX,'IN ')
|
|
CALL TBOUND ('I4','TAB_LENGTH',ILAYE(NLOLD) ,1,NRGMAX,'IN ')
|
|
|
|
RO (NLAY) = WPARM (2)
|
|
THICK (NLAY) = WPARM (3)
|
|
NDIV = MAX0( IFIX( WPARM(4) + 0.5 ), 1 )
|
|
RPDIST = ABS( WPARM(5) )
|
|
NREP = NDIV - 1
|
|
THICK (NLAY) = THICK (NLAY) / FLOAT(NDIV)
|
|
READ (SYSIN,5171) COMENT(NGRP)
|
|
5171 FORMAT(A20)
|
|
|
|
CALL TBOUND ('R4','DENSITY ',RO(NLAY),1.E-08,100.,'IN')
|
|
CALL TBOUND ('R4','THICKNESS ',THICK(NLAY),1.E-08,1.E08,'IN')
|
|
CALL TBOUND ('I4','REPETITION',NREP,0,(200-NLAY),'IN ')
|
|
CALL TBOUND ('R4','DISTANCE ',RPDIST,0.0, 1.E06,'IN')
|
|
|
|
RTHICK(NLAY) = RO(NLAY) * THICK(NLAY)
|
|
NLAYXX = NLAY + NREP
|
|
|
|
IF ( TEST ) THEN
|
|
WRITE (SYSOUT,5170) NLAY, NLAYXX, COMENT(NLAY), NLOLD, RO(NLAY),
|
|
1 THICK(NLAY), RTHICK(NLAY), NREP, RPDIST
|
|
5170 FORMAT (' ','LAYER#',I3,'-',I3,' / ',A20/
|
|
1 ' ',5X,'ATOMIC COMPONENTS COPIED FROM LAYER NO',T45,I12/
|
|
2 ' ',5X,'DENSITY IN G/CM**3',T45,1PE12.5/
|
|
3 ' ',5X,'THICKNESS IN CM',T45,1PE12.5/
|
|
4 ' ',5X,'THICKNESS IN G/CM**2',T45,1PE12.5/
|
|
5 ' ',5X,'NUMBER OF ADDITIONAL LAYERS',T45,I12/
|
|
6 ' ',5X,'DISTANCE IN CM',T45,1PE12.5)
|
|
ENDIF
|
|
|
|
ILAYS(NLAY) = ILAYS(NLOLD)
|
|
ILAYE(NLAY) = ILAYE(NLOLD)
|
|
ZMEAN(NLAY) = ZMEAN(NLOLD)
|
|
AMEAN(NLAY) = AMEAN(NLOLD)
|
|
RMEAN(NLAY) = RMEAN(NLOLD)
|
|
TABOK = .TRUE.
|
|
LAYGEO = .FALSE.
|
|
LAYON = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "STRAG_ON" RANGE STRAGGLING EINSCHALTEN
|
|
C ----------------------------------------------------------------------
|
|
1800 STRAGG = .TRUE.
|
|
RELSTR = ABS( WPARM(1) )
|
|
CALL TBOUND ('R4','REL_STRAGG',RELSTR,0.0, 1.0,'IN')
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "STRAG_OFF" RANGE STRAGGLING AUSSCHALTEN
|
|
C ----------------------------------------------------------------------
|
|
1900 STRAGG = .FALSE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "SCATT_ON" MULTIPLE SCATTERING EINSCHALTEN
|
|
C ----------------------------------------------------------------------
|
|
2000 SCATTR = .TRUE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "SCATT_OFF" MULTIPLE SCATTERING AUSSCHALTEN
|
|
C ----------------------------------------------------------------------
|
|
2100 SCATTR = .FALSE.
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "SUMMARY" GEBE SUMMARY AUF EIN HILFSFILE AUS
|
|
C ----------------------------------------------------------------------
|
|
2200 ISUNIT = IFIX( WPARM(1) + 0.5 )
|
|
CALL SUMOUT (ISUNIT)
|
|
GOTO 50
|
|
|
|
C ----------------------------------------------------------------------
|
|
C "SKIP" UEBERSPRINGE DIE FOLGENDE GRUPPE
|
|
C ----------------------------------------------------------------------
|
|
2300 IF ( LAYON ) THEN
|
|
WRITE (SYSOUT,5021)
|
|
STOP 12
|
|
ENDIF
|
|
SKIP = .TRUE.
|
|
NLAY = NLAY + 1
|
|
NGRP = NGRP + 1
|
|
CALL TBOUND ('I4','#LAYER ',NLAY ,1,200,'IN ')
|
|
CALL TBOUND ('I4','#GROUP ',NGRP ,1,200,'IN ')
|
|
ILAYS(NLAY) = -1
|
|
NREP = 0
|
|
READ (SYSIN,5171) COMENT(NGRP)
|
|
|
|
LAYON = .TRUE.
|
|
LAYGEO = .FALSE.
|
|
TABOK = .TRUE.
|
|
GOTO 50
|
|
|
|
c-kt Anfang
|
|
c ----------------------------------------------------------------------
|
|
c "IMPULS" AUSGABEANWEISUNG FÜR DEN AKTUELLEN IMPULS
|
|
c ----------------------------------------------------------------------
|
|
2400 IF ( .NOT. SKIP ) THEN
|
|
IMPOUT(NLAY+1) = IFIX ( WPARM(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',IMPOUT(NLAY+1) ,1,99,'IN ')
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "WINKEL" AUSGABEANWEISUNG FÜR DEN AKTUELLEN STREUWINKEL
|
|
c ----------------------------------------------------------------------
|
|
2500 IF ( .NOT. SKIP ) THEN
|
|
THEOUT(NLAY+1) = IFIX ( WPARM(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',THEOUT(NLAY+1) ,1,99,'IN ')
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "STOPPED" AUSGABEANWEISUNG FÜR DIE STOPPVERTEILUNG IN DER SCHICHT
|
|
c ----------------------------------------------------------------------
|
|
2600 IF ( .NOT. SKIP ) THEN
|
|
STPOUT(NGRP) = IFIX ( WPARM(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',STPOUT(NGRP) ,1,99,'IN ')
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "FOCUS" ANGABEN ÜBER DIE FOKUSSIERUNG DES EINGANGSSTRAHLS
|
|
c ----------------------------------------------------------------------
|
|
2700 XFOCUS = WPARM(1)
|
|
YFOCUS = WPARM(2)
|
|
CALL TBOUND ('R4','X-FOCUS/CM ',ABS(XFOCUS), 0., 1000., 'IN ')
|
|
CALL TBOUND ('R4','Y-FOCUS/CM ',ABS(YFOCUS), 0., 1000., 'IN ')
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "WHERE_XY" AUSGABEANWEISUNG FÜR DIE X-Y-KOORDINATEN VOR DER SCHICHT
|
|
c ----------------------------------------------------------------------
|
|
2800 IF ( .NOT. SKIP ) THEN
|
|
XYOUT(NLAY+1) = IFIX ( WPARM(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',XYOUT(NLAY+1) ,1,99,'IN ')
|
|
ENDIF
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "MAGNETIC" Einschalten des Magnetfeldes
|
|
c ----------------------------------------------------------------------
|
|
2900 MSTART = WPARM(1)
|
|
MGAUSS = WPARM(2)
|
|
CALL TBOUND ('R4','START B-FELD / CM ',MSTART, 0., 120., 'IN ')
|
|
CALL TBOUND ('R4','STÄRKE B-FELD / GAUSS ',
|
|
1 MGAUSS, -1.0E+05, 1.0E+05, 'IN ')
|
|
GOTO 50
|
|
|
|
c ----------------------------------------------------------------------
|
|
c "ALL_XY" AUSGABEANWEISUNG FÜR DIE X-Y-KOORDINATEN VOR DER SCHICHT
|
|
c ----------------------------------------------------------------------
|
|
3000 IF ( .NOT. SKIP ) THEN
|
|
XYALL(NLAY+1) = IFIX ( WPARM(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',XYALL(NLAY+1) ,1,99,'IN ')
|
|
ENDIF
|
|
GOTO 50
|
|
c
|
|
c-kt Ende
|
|
c
|
|
c ----------------------------------------------------------------------
|
|
c "INIT_OUT" AUSGABEANWEISUNG FUER DIE STARTWERTE
|
|
c ----------------------------------------------------------------------
|
|
3100 IF ( .NOT. SKIP ) then
|
|
luninit = ifix ( wparm(1) + 0.5 )
|
|
CALL TBOUND ('I4','LOG UNIT# ',LUNINIT ,1,99,'IN ')
|
|
endif
|
|
goto 50
|
|
c ----------------------------------------------------------------------
|
|
c "FORMATTED" SET FLAG FOR FORMATTED OUTPUT
|
|
c-----------------------------------------------------------------------
|
|
3200 form = .true.
|
|
write(sysout,'(/,'' OUTPUT will be formatted !!!'',/)')
|
|
goto 50
|
|
c
|
|
c ----------------------------------------------------------------------
|
|
c "UFORMATTED" SET FLAG FOR UNFORMATTED OUTPUT
|
|
c-----------------------------------------------------------------------
|
|
3300 form = .false.
|
|
write(sysout,'(/,'' OUTPUT will be un-formatted !!!'',/)')
|
|
goto 50
|
|
c
|
|
c ======================================================================
|
|
c H I E R E N D E T D A S H A U P T P R O G R A M M
|
|
c ======================================================================
|
|
9999 END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C NAME: COMPUT
|
|
C
|
|
C FUNKTION: BERECHNET DIE TRAJEKTORIEN DER TEILCHEN
|
|
C
|
|
C NMAX I*4 MAXIMALE ANZAHL VON START-TEILCHEN
|
|
C NSVMAX I*4 MAXIMALE ANZAHL VON DURCHLAUFENDEN T.
|
|
C
|
|
C ----------------------------------------------------------------------
|
|
c SUBROUTINE COMPUT (NMAX,NSVMAX,IZL,FORM)
|
|
SUBROUTINE COMPUT (NMAX,NSVMAX,FORM) ! IZL removed
|
|
CHARACTER*1 ICHAR, BACKSC, STOPPD
|
|
CHARACTER*20 COMENT
|
|
c-kt Hilfsvariable für die Berechnung der Fokussierung
|
|
REAL*4 xxf, yyf, temp
|
|
c-kt Variablen für MAGNETIC: Beginn und Stärke des Magnetfeldes [cm], [Gauss]
|
|
REAL*4 MSTART, MGAUSS
|
|
c-kt Hilfsvariable für die Berechnung der Bahn im Magnetfeld:
|
|
REAL*4 PXPY, radius, MZDIST, TMFLUG, omega, rotats, PHIXY,
|
|
1 XHELIX, YHELIX, PHIHELIXA, PHIHELIXB, PHIHMP,
|
|
2 DELTA, DIFA, DIFB, MAXRAD
|
|
REAL*8 RGDATA, D1, D2, D3
|
|
INTEGER*4 SEEDS
|
|
c-kt Zählvariable für die aus der Rechnung genommenen Teilchen:
|
|
INTEGER*4 fehler
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY und ALL_XY:
|
|
INTEGER*2 IMPOUT, THEOUT, STPOUT, XYOUT, XYALL, LUNINIT
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
INTEGER*2 SYSOUT, SYSIN
|
|
INTEGER*4 TEST
|
|
LOGICAL SCATTR, STRAGG, STRAG2, FORM
|
|
COMMON
|
|
1 / EXECFL / SCATTR, STRAGG, RELSTR
|
|
COMMON
|
|
1 / ATOMIC / RADLEN(92)
|
|
COMMON
|
|
1 / RETAB / NRGMAX, NRGCUR, RGDATA (5,3000)
|
|
2 / LAYER / NLAY, ILAYS(200), ILAYE(200),
|
|
3 THICK(200), RTHICK(200), RO(200),
|
|
4 ZMEAN(200), AMEAN(200), RMEAN(200),
|
|
5 ZKOO(200), IGEOT(200), PGEOT(5,200)
|
|
6 / LAYERG / NGRP, IGRPS(200), IGRPE(200)
|
|
6 / LAYERC / COMENT(200)
|
|
7 / PARTIC / BMASS, BMASS2, EKMIN, EKMAX, IBFLAG, IBUNIT
|
|
9 / BEAM / PMEAN, PFWHM, PLOW, PHIGH, XFWHM, YFWHM,
|
|
1 RMAX,
|
|
2 IBTYP, XBEAM, YBEAM, PSIGMA, RMAX2
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
3 , XFOCUS, YFOCUS
|
|
c-kt Beginn und Stärke des Magnetfeldes
|
|
4 , MSTART, MGAUSS
|
|
9 / KINEMA / ID, X, Y, Z,
|
|
1 PX, PY, PZ, PTOTAL,
|
|
c-kt Einführen der Variable TTHETA für den Tangens des Streuwinkels:
|
|
2 THETA, PHI, STHETA, CTHETA, TTHETA,
|
|
3 SPHI, CPHI,
|
|
4 TTOTAL, TLAST,
|
|
5 ELOSS
|
|
COMMON
|
|
2 / ZUFALL / R(6)
|
|
COMMON
|
|
1 / OUTPUT / NLIMIT(200), NCOUNT(200), IOTYPE(200),
|
|
8 NLUNIT(200), ELIMIT(200)
|
|
3 / COMPON / NZCOMP(20), ACOMP(20), NATOM(20), NELEM, NELEMC
|
|
4 / SEEDCO / SEEDS (6)
|
|
5 / INFOCO / NPARTI, NTHROU, NSTOP(200), NSTRVO(200),
|
|
6 NSTRIN(200), NRUECK(200), NSTRGE(200), NMLRE(200)
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
COMMON
|
|
1 / STATUS / SYSOUT, SYSIN, TEST
|
|
c 1 / STATUS / SYSOUT
|
|
c-kt Zählvariable für die aus der Rechnung genommenen Teilchen:
|
|
COMMON
|
|
1 / COUNT / fehler
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY, ALL_XY und INIT_OUT:
|
|
COMMON
|
|
1 / SGLOUT / IMPOUT(201), THEOUT(201), STPOUT(200), XYOUT(201),
|
|
2 XYALL(201), LUNINIT
|
|
|
|
c DATA ZWEIPI /6.283185/, VLIGHT /29.997924/, SQDREI/1.732051/,
|
|
c 1 PIHALB /1.570796/
|
|
c
|
|
c PIHALB is not used, commented out, AH 17-dec-1996
|
|
c
|
|
DATA ZWEIPI /6.283185/, VLIGHT /29.997924/, SQDREI/1.732051/
|
|
DATA BACKSC /'B'/, STOPPD /'S'/
|
|
|
|
|
|
c do i = 1, 1000
|
|
c write(sysout,'(5f10.4)') rgdata(1,i),rgdata(2,i),rgdata(3,i),
|
|
c 1 rgdata(4,i),rgdata(5,i)
|
|
c
|
|
c enddo
|
|
D2 = BMASS
|
|
D3 = D2 * D2
|
|
|
|
NPARTI = 0
|
|
NTHROU = 0
|
|
DO 5 I=1,200
|
|
NCOUNT(I) = 0
|
|
NSTOP(I) = 0
|
|
NSTRVO(I) = 0
|
|
NSTRIN(I) = 0
|
|
NRUECK(I) = 0
|
|
NSTRGE(I) = 0
|
|
NMLRE (I) = 0
|
|
5 CONTINUE
|
|
|
|
DO 6 I=1,NLAY
|
|
IF ( ILAYS(I) .GT. 0 ) GOTO 7
|
|
6 CONTINUE
|
|
STRAGG = .FALSE.
|
|
7 NFIRST = I
|
|
|
|
WRITE(SYSOUT,2204) SEEDS(1)
|
|
2204 FORMAT(' START VALUE OF RANDOM NUMBER = ',I16)
|
|
WRITE(SYSOUT,1800)
|
|
1800 FORMAT(' CALCULATION STARTED')
|
|
|
|
IF ( STRAGG ) THEN
|
|
WRITE(SYSOUT,1801) RELSTR
|
|
1801 FORMAT(' ',5X,'RANGE STRAGGLING ENABLED (',1PE12.5,')')
|
|
IF ( RELSTR .EQ. 0.0 ) THEN
|
|
STRAG2 = .TRUE.
|
|
ELSE
|
|
STRAG2 = .FALSE.
|
|
c-kt IRELST ist nur für die Ausgabe mit I3 in 'OUTPUT' definiert;
|
|
c-kt es scheint mir sinnvoller, dort RELSTR direkt mit (E10.4) auszugeben.
|
|
c-kt IRELST = IFIX( RELSTR * 1000. )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( SCATTR ) THEN
|
|
WRITE(SYSOUT,1802)
|
|
1802 FORMAT(' ',5X,'MULTIPLE SCATTERING ENABLED.')
|
|
ENDIF
|
|
|
|
NSV = 0
|
|
ID = 0
|
|
DO 100 I=1,NMAX
|
|
|
|
C WUERFLE STRAHL-TEILCHEN
|
|
CALL BEAMIN (NSV)
|
|
EBEGIN = SQRT( PTOTAL*PTOTAL + BMASS2 ) - BMASS
|
|
IF ( STRAGG ) THEN
|
|
|
|
C MERKE ANFANGSENERGIE UND -REICHW.
|
|
|
|
RBEGIN = DRANGE ( EBEGIN, RGDATA(1,ILAYS(NFIRST)),
|
|
1 ILAYE(NFIRST) )
|
|
|
|
c-kt Wenn 'DRANGE' einen negativen Wert übergibt, hatte ein Teilchen einen
|
|
c-kt höheren Wert für die kinetische Energie als der größte tabellierte
|
|
c-kt Energiewert:
|
|
IF (RBEGIN .LT. 0.0) THEN
|
|
WRITE (SYSOUT,181) NSV
|
|
181 FORMAT(' ',T5,'Startnummer des Teilchens',T50,I22,/T5,
|
|
1 'Der 3. Parameter des Befehls PARTICLE muß vergrößert '//
|
|
2 'werden.')
|
|
STOP 12
|
|
ENDIF
|
|
|
|
c-kt Ende
|
|
|
|
IF ( STRAG2) THEN
|
|
RELSTR = STRAG1( PTOTAL, BMASS )
|
|
c-kt IRELST ist nur für die Ausgabe mit I3 in 'OUTPUT' definiert;
|
|
c-kt es scheint mir sinnvoller, dort RELSTR direkt mit (E10.4) auszugeben.
|
|
c-kt IRELST = IFIX( RELSTR * 1000. )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
c-kt Wenn mindestens eine FOCUS-Konstante ungleich Null ist, fokussiere
|
|
c-kt den Strahl, sonst setze die üblichen Anfangswerte
|
|
IF ( XFOCUS .NE. 0.0 .OR. YFOCUS .NE. 0.0 ) THEN
|
|
IF ( XFOCUS .NE. 0.0 ) THEN
|
|
xxf = X / XFOCUS
|
|
ELSE
|
|
xxf = 0.0
|
|
ENDIF
|
|
IF ( YFOCUS .NE. 0.0 ) THEN
|
|
yyf = Y / YFOCUS
|
|
ELSE
|
|
yyf = 0.0
|
|
ENDIF
|
|
temp = xxf**2 + yyf**2
|
|
CTHETA = 1.0 / SQRT( 1.0 + temp )
|
|
STHETA = SQRT( temp / ( 1.0 + temp ) )
|
|
TTHETA = SQRT( temp )
|
|
THETA = ATAN( TTHETA )
|
|
IF ( yyf .NE. 0.0 .OR. xxf .NE. 0.0) THEN
|
|
PHI = ATAN2( -yyf, -xxf )
|
|
ELSE
|
|
PHI = 0.0
|
|
ENDIF
|
|
CPHI = COS( PHI )
|
|
SPHI = SIN( PHI )
|
|
PZ = PTOTAL * CTHETA
|
|
PX = - PZ * xxf
|
|
PY = - PZ * yyf
|
|
ELSE
|
|
PHI = 0.0
|
|
THETA = 0.0
|
|
CTHETA = 1.0
|
|
STHETA = 0.0
|
|
TTHETA = 0.0
|
|
CPHI = 1.0
|
|
SPHI = 0.0
|
|
PZ = PTOTAL
|
|
PX = 0.0
|
|
PY = 0.0
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
TTOTAL = 0.0
|
|
ID = ID + 1
|
|
c
|
|
c-tp write initial values to file if desired
|
|
c
|
|
il = 0
|
|
if ( luninit .gt. 0 ) then
|
|
if ( form ) then
|
|
write(luninit,'(I6,2x,I3,10f10.3)') id,il,x,y,z,px,py,pz,
|
|
1 ebegin,theta,phi,ttotal
|
|
else
|
|
c
|
|
c-tp unformatted output
|
|
c
|
|
write(luninit) id,il,x,y,z,px,py,pz,ebegin,theta,phi,ttotal
|
|
c
|
|
endif
|
|
endif
|
|
c
|
|
C ----------------------------------------------------------------------
|
|
C TRACK THROUGH LAYERS AND HOLES
|
|
C ----------------------------------------------------------------------
|
|
DO 200 IL=1,NLAY
|
|
IF ( ILAYS(IL) .LT. 0 ) GOTO 200
|
|
c-kt (zur Erklärung dieser Zeile: ILAYS ist genau dann negativ, wenn die
|
|
c-kt betreffende Schicht mit SKIP aus der Rechnung genommen wurde.)
|
|
|
|
c-kt Gegebenenfalls Speichern des Impulsbetrages oder des Streuwinkels
|
|
IF ( IMPOUT(IL) .NE. 0 ) THEN
|
|
WRITE (IMPOUT(IL),201) PTOTAL
|
|
201 FORMAT(' ',E13.7)
|
|
ENDIF
|
|
IF ( THEOUT(IL) .NE. 0 ) THEN
|
|
WRITE (THEOUT(IL),202) THETA
|
|
202 FORMAT(' ',F13.7)
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
C BERECHNE EINTRITTSPUNKT
|
|
ZDIST = ZKOO(IL) - Z
|
|
|
|
IF ( ZDIST .GT. 0.01 ) THEN
|
|
|
|
c-kt Wenn der Befehl MAGNETIC gegeben wurde, definiere ein Magnetfeld
|
|
c-kt ================================================================
|
|
IF ( ( ABS(MGAUSS) .GT. 0.0 ) .AND.
|
|
1 ( ZKOO(IL) .GT. MSTART ) ) THEN
|
|
|
|
c-kt Die Magnetfeldlinien zeigen bei positivem MGAUSS in Strahlrichtung, bei
|
|
c-kt negativem entgegen der Strahlrichtung. Demnach ist die Bahn der mu+ eine
|
|
c-kt links- bzw. rechtsdrehende Helix.
|
|
c-kt Phi wird von der positiven X-Achse aus nach links und rechts positiv bzw.
|
|
c-kt negativ gezählt. Falls zwischen PHI und PHINEU die negative X-Achse über-
|
|
c-kt quert wurde, fand ein Vorzeichenwechsel statt.
|
|
|
|
c-kt Wenn das Magnetfeld erst nach dem vorigen Bauteil begonnen hat, dann be-
|
|
c-kt rechne die X,Y-Koordinaten und ihre geometr. Summme zu Beginn des Feldes
|
|
IF ( Z .LT. MSTART ) THEN
|
|
XYPROJ = TTHETA * ( MSTART - Z )
|
|
X = CPHI * XYPROJ + X
|
|
Y = SPHI * XYPROJ + Y
|
|
ENDIF
|
|
|
|
c-kt Gyrationsradius im Magnetfeld [cm]:
|
|
PXPY = SQRT( PX**2 + PY**2 )
|
|
radius = PXPY * 3335.668 / ABS( MGAUSS )
|
|
|
|
c-kt Im Magnetfeld zurückgelegte Strecke [cm]:
|
|
MZDIST = ZKOO(IL) - AMAX1( Z, MSTART )
|
|
|
|
c-kt Flugzeit im Magnetfeld [s]:
|
|
TMFLUG = MZDIST * SQRT( PZ*PZ + BMASS2 ) /
|
|
1 ( PZ * 0.29979246E+11 )
|
|
|
|
c-kt Winkelgeschwindigkeit [1/s]:
|
|
omega = ABS(MGAUSS) * 0.89874789E+07 / BMASS
|
|
|
|
c-kt Zahl der bis zum Ort ZKOO(IL) erfolgten Rotationen:
|
|
rotats = omega * TMFLUG / 6.2831853
|
|
|
|
|
|
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
|
|
|
WRITE(IL+20,4321) radius, rotats
|
|
4321 FORMAT(' ',E13.7,1X,E13.7)
|
|
|
|
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
|
|
|
|
|
c-kt Richtungswinkel von X,Y zur Helixmittelachse
|
|
PHIXY = PHI + SIGN( 1.0, MGAUSS ) * 1.5707963
|
|
IF ( PHIXY .GT. 3.1415927 ) PHIXY = PHIXY - 6.2831853
|
|
IF ( PHIXY .LT. -3.1415927 ) PHIXY = PHIXY + 6.2831853
|
|
|
|
c-kt Berechnung der X,Y-Koordinaten der Mittelachse der Helix
|
|
XHELIX = X + radius * COS(PHIXY)
|
|
YHELIX = Y + radius * SIN(PHIXY)
|
|
|
|
c-kt Richtungswinkel von der Helixmittelachse zu X,Y
|
|
PHIHELIXA = PHIXY + 3.1415927
|
|
IF ( PHIHELIXA .GT. 3.1415927 )
|
|
1 PHIHELIXA = PHIHELIXA - 6.2831853
|
|
|
|
c-kt Bei ZKOO(IL) angekommen beträgt der Winkel vom Helixmittelpunkt zum
|
|
c-kt Ort des Teilchens PHIHELIXB (Vollständige Rotationen sind belanglos):
|
|
PHIHELIXB = PHIHELIXA + SIGN( 1.0, MGAUSS ) *
|
|
1 AMOD( rotats, 1.0 ) * 6.28318531
|
|
IF ( PHIHELIXB .GT. 3.1415927 )
|
|
1 PHIHELIXB = PHIHELIXB - 6.2831853
|
|
IF ( PHIHELIXB .LT. -3.1415927 )
|
|
1 PHIHELIXB = PHIHELIXB + 6.2831853
|
|
|
|
c-kt Berechnung der X,Y-Koordinate an ZKOO(IL)
|
|
X = XHELIX + radius * COS( PHIHELIXB )
|
|
Y = YHELIX + radius * SIN( PHIHELIXB )
|
|
|
|
c-kt Berechnung von XYPROJ
|
|
XYPROJ = SQRT( X**2 + Y**2 )
|
|
|
|
c-kt Zuweisung von Z:
|
|
Z = ZKOO(IL)
|
|
|
|
c-kt Berechnung des neuen Phasenwinkels Phi an ZKOO(IL)
|
|
IF ( Y .NE. 0.0 .OR. X .NE. 0.0) THEN
|
|
PHI = ATAN2( Y, X )
|
|
ELSE
|
|
PHI = 0.0
|
|
ENDIF
|
|
|
|
c-kt Berechnung der Sinus- und Cosinuswerte
|
|
CPHI = COS(PHI)
|
|
SPHI = SIN(PHI)
|
|
|
|
c-kt Damit ergeben sich auch PX und PY neu:
|
|
PX = PXPY * CPHI
|
|
PY = PXPY * SPHI
|
|
|
|
c-kt Ende der Berechnung des Magnetfeldes.
|
|
c-kt =====================================
|
|
ELSE
|
|
|
|
c-kt Variable für TAN(THETA) an die Stelle von STHETA/CTHETA gesetzt:
|
|
XYPROJ = TTHETA * ZDIST
|
|
X = CPHI * XYPROJ + X
|
|
Y = SPHI * XYPROJ + Y
|
|
Z = ZKOO(IL)
|
|
ENDIF
|
|
|
|
|
|
C BERECHNE FLUGZEIT
|
|
BETAZ = PZ / SQRT( PZ*PZ + BMASS2 )
|
|
TLAST = ZDIST / (BETAZ * VLIGHT)
|
|
TTOTAL = TTOTAL + TLAST
|
|
|
|
ENDIF ! Dieses ENDIF gehört zu der Z-Distanz<0.01cm-Abfrage
|
|
|
|
|
|
ELOSS = 0.0
|
|
|
|
|
|
c-kt Gegebenenfalls Speichern der X-Y-Koordinaten (aller Teilchen)
|
|
IF ( XYALL(IL) .NE. 0 ) THEN
|
|
WRITE (XYALL(IL),'(2I6,2F10.5)') ID, IL, X, Y
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
|
|
C BERECHNE, OB TEILCHEN TRIFFT
|
|
|
|
c-kt Berechnung, ob die ermittelten X,Y-Koordinaten in den Grenzen des
|
|
c-kt Bauteiles liegen:
|
|
|
|
GOTO ( 210, 220 ), IGEOT(IL)
|
|
C RUNDE SCHICHT
|
|
210 IF ( (X*X+Y*Y) .GT. PGEOT(2,IL) ) GOTO 350
|
|
GOTO 230
|
|
C RECHTECK
|
|
220 IF ( X .LT. PGEOT(1,IL) .OR. X .GT. PGEOT(2,IL) ) GOTO 350
|
|
IF ( Y .LT. PGEOT(3,IL) .OR. Y .GT. PGEOT(4,IL) ) GOTO 350
|
|
|
|
230 CONTINUE
|
|
|
|
|
|
c-kt Wenn die Rechnung mit einem Magnetfeld durchgeführt wird, muß der
|
|
c-kt Versatz in der X,Y-Ebene durch die Helixbahn berücksichtigt werden.
|
|
IF ( ( ABS(MGAUSS) .GT. 0.0 ) .AND.
|
|
1 ( ZKOO(IL) .GT. MSTART ) .AND.
|
|
2 ( ZDIST .GT. 0.01 ) ) THEN
|
|
|
|
c-kt Hat das Teilchen auf der Helixbahn das Strahlrohr berührt?
|
|
c-kt ==========================================================
|
|
|
|
c-kt Berechnung des Winkels von der X,Y=0-Achse zur Helixmittelachse. Die
|
|
c-kt Helixbahn hat in diesem Winkel den größten Abstand zur X,Y=0-Achse
|
|
IF ( YHELIX .NE. 0.0 .OR. XHELIX .NE. 0.0) THEN
|
|
PHIHMP = ATAN2( YHELIX, XHELIX )
|
|
c-kt Sollte die Helixmittelachse wirklich auf X,Y=0 liegen, ist auch der
|
|
c-kt Radius der Teilchenbahn konstant.
|
|
ELSE
|
|
GOTO 234
|
|
ENDIF
|
|
|
|
c-kt Welcher der beim Flug des Teilchens auf dem Segment der Helixbahn
|
|
c-kt überstrichenen Winkel kommt PHIHMP am nächsten und bezeichnet somit
|
|
c-kt den am weitesten von der X,Y=0-Achse entfernten Punkt?
|
|
c-kt Berechnung der Differenz DELTA dieses Winkels zu PHIHMP
|
|
|
|
c-kt 1. Es gab mindestens eine vollständige Umdrehung
|
|
IF ( rotats .GE. 1.0 ) THEN
|
|
DELTA = 0.0
|
|
|
|
c-kt 2. Es gab keine vollständige Umdrehung
|
|
ELSE
|
|
|
|
c-kt a) Kein Vorzeichenwechsel zwischen PHIHELIXA und PHIHELIXB
|
|
IF ( SIGN(1.0,MGAUSS)*PHIHELIXB .GT.
|
|
1 SIGN(1.0,MGAUSS)*PHIHELIXA ) THEN
|
|
|
|
c-kt In dem durchflogenen Helixsegment wurde PHIHMP überstrichen
|
|
IF ( SIGN(1.0,MGAUSS)*PHIHELIXB .GE.
|
|
1 SIGN(1.0,MGAUSS)*PHIHMP .AND.
|
|
2 SIGN(1.0,MGAUSS)*PHIHMP .GE.
|
|
3 SIGN(1.0,MGAUSS)*PHIHELIXA ) THEN
|
|
DELTA = 0.0
|
|
|
|
c-kt PHIHMP wurde nicht überstrichen
|
|
ELSE
|
|
|
|
c-kt Welcher der beiden Winkel PHIHELIXA und PHIHELIXB ist PHIHMP näher?
|
|
DIFA = ABS( PHIHELIXA - PHIHMP )
|
|
IF ( DIFA .GT. 3.14159265 )
|
|
1 DIFA = 6.28318531 - DIFA
|
|
DIFB = ABS( PHIHELIXB - PHIHMP )
|
|
IF ( DIFB .GT. 3.14159265 )
|
|
1 DIFB = 6.28318531 - DIFB
|
|
IF ( DIFA .LT. DIFB ) THEN
|
|
DELTA = DIFA
|
|
ELSE
|
|
DELTA = DIFB
|
|
ENDIF
|
|
|
|
ENDIF ! PHIHMP überstrichen?
|
|
|
|
c-kt b) Vorzeichenwechsel zwischen PHIHELIXA und PHIHELIXB
|
|
ELSE
|
|
|
|
c-kt In dem durchflogenen Helixsegment wurde PHIHMP überstrichen
|
|
IF ( SIGN(1.0,MGAUSS)*PHIHMP .GE.
|
|
1 SIGN(1.0,MGAUSS)*PHIHELIXA .OR.
|
|
2 SIGN(1.0,MGAUSS)*PHIHMP .LE.
|
|
3 SIGN(1.0,MGAUSS)*PHIHELIXB ) THEN
|
|
DELTA = 0.0
|
|
|
|
c-kt PHIHMP wurde nicht überstrichen
|
|
ELSE
|
|
|
|
c-kt Welcher der beiden Winkel PHIHELIXA und PHIHELIXB ist PHIHMP näher?
|
|
DIFA = ABS( PHIHELIXA - PHIHMP )
|
|
IF ( DIFA .GT. 3.14159265 )
|
|
1 DIFA = 6.28318531 - DIFA
|
|
DIFB = ABS( PHIHELIXB - PHIHMP )
|
|
IF ( DIFB .GT. 3.14159265 )
|
|
1 DIFB = 6.28318531 - DIFB
|
|
IF ( DIFA .LT. DIFB ) THEN
|
|
DELTA = DIFA
|
|
ELSE
|
|
DELTA = DIFB
|
|
ENDIF
|
|
|
|
ENDIF ! PHIHMP überstrichen?
|
|
|
|
ENDIF ! Vorzeichenwechsel von PHIHELIXA auf PHIHELIXB?
|
|
|
|
ENDIF ! Anzahl Rotationen > 1 ?
|
|
|
|
c-kt Auswertung: wenn der maximal erreichte Abstand von der X,Y=0-Achse den
|
|
c-kt Innenradius des Strahlrohres übersteigt, denn zähle das Teilchen als
|
|
c-kt herausgestreut.
|
|
IF ( Z .LT. 140.0 ) THEN
|
|
MAXRAD = 40.768225
|
|
ELSE
|
|
MAXRAD = 33.64
|
|
ENDIF
|
|
|
|
IF ( ( SQRT(XHELIX**2+YHELIX**2)
|
|
1 + radius * COS( DELTA ) )**2 +
|
|
2 ( radius * SIN(DELTA) )**2 .GE. MAXRAD )
|
|
2 GOTO 350
|
|
|
|
ENDIF ! Ist ein Magnetfeld eingeschaltet?
|
|
|
|
c-kt Ende Berechnung, ob das Teilchen duch das Magnetfeld abgelenkt wird
|
|
c-kt ===================================================================
|
|
|
|
|
|
C TEILCHEN KOMMT DURCH
|
|
|
|
234 CONTINUE
|
|
|
|
c-kt Gegebenenfalls Speichern der X-Y-Koordinaten (nur von nicht weggestreuten
|
|
c-kt Teilchen)
|
|
IF ( XYOUT(IL) .NE. 0 ) THEN
|
|
WRITE (XYOUT(IL),'(2I6,2F10.5)') ID, IL,X, Y
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
GOTO ( 250, 240, 250, 250, 250, 240, 240 ), IOTYPE(IL)
|
|
|
|
C DRUCKE 'IN FRONT'-DATEN AUS
|
|
240 IF ( EKOUT .GT. ELIMIT(IL) ) GOTO 250
|
|
IUNIT = NLUNIT(IL)
|
|
c-kt RELSTR wird anstelle von IRELST (=RELSTR*1000) ausgegeben
|
|
c WRITE (IUNIT,2100) ID,IL,SCATTR,STRAGG,STRAG2,RELSTR,NLAY,
|
|
c 1 EBEGIN,BMASS,X,Y,Z, PX,PY,PZ,THETA,PHI,
|
|
c 2 TTOTAL, TLAST, ELOSS
|
|
c 2100 FORMAT(' V',I10,2X,I3,2X,3L1,2X,E10.4,1X,I4,1X,1PE12.5 /
|
|
c 1 4X,6(1PE12.5) / 4X,6(1PE12.5) )
|
|
c
|
|
c new output, TP, 1-jun-95
|
|
c
|
|
e_current = sqrt( px**2 + py**2 + pz**2 + bmass2 ) - bmass
|
|
if ( form ) then
|
|
write(iunit,'(I6,2x,I3,10f10.3)') id,il,x,y,z,px,py,pz,
|
|
1 e_current,theta,phi,ttotal
|
|
else
|
|
c
|
|
c-tp unformatted output
|
|
c
|
|
write(iunit) id,il,x,y,z,px,py,pz,e_current,theta,phi,
|
|
1 ttotal
|
|
c
|
|
endif
|
|
NCOUNT(IL) = NCOUNT(IL) + 1
|
|
IF ( NCOUNT(IL) .GE. NLIMIT(IL) ) GOTO 420
|
|
|
|
C SCHICHT ODER LOCH ?
|
|
250 IF ( ILAYS(IL) .EQ. 0 ) THEN
|
|
|
|
c-kt Variable für TAN(THETA) an die Stelle von STHETA/CTHETA gesetzt:
|
|
XYPROJ = TTHETA * THICK(IL)
|
|
X = CPHI * XYPROJ + X
|
|
Y = SPHI * XYPROJ + Y
|
|
Z = THICK(IL) + Z
|
|
|
|
C BERECHNE FLUGZEIT
|
|
BETAZ = PZ / SQRT( PZ*PZ + BMASS2 )
|
|
TLAST = ZDIST / (BETAZ * VLIGHT)
|
|
TTOTAL = TTOTAL + TLAST
|
|
ELSE
|
|
|
|
C SCHICHTDICKE / COS(THETA)
|
|
CRANGE = RTHICK (IL) / CTHETA
|
|
CTHICK = THICK (IL) / CTHETA
|
|
|
|
C ENDENERGIE DES TEILCHENS
|
|
D1 = PTOTAL
|
|
EKIN = DSQRT ( D1 * D1 + D3 ) - D2
|
|
|
|
ELOSS = ELOSS2 ( EKIN, CRANGE, RGDATA(1,ILAYS(IL)),
|
|
1 ILAYE(IL) )
|
|
|
|
c-kt Wenn ELOSS2 einen negativen Wert übergibt ist einer von drei möglichen
|
|
c-kt Fehlern aufgetreten, die hier unterschieden werden:
|
|
|
|
IF ( ELOSS .LT. 0.0 ) THEN
|
|
|
|
WRITE (SYSOUT,251) NSV
|
|
251 FORMAT(' ',T5,'Startnummer des Teilchens',T50,I22)
|
|
|
|
IF ( ELOSS .LT. -2.5 ) THEN
|
|
c-kt Durch Rundungsfehler wurde keine korrekte Lösung des kubischen
|
|
c-kt Spline-Polynoms gefunden:
|
|
fehler = fehler + 1
|
|
c-kt zu welcher Gruppe gehört die Schicht?
|
|
DO 252 LGRP=1,NGRP
|
|
IF ( IL .LE. IGRPE(LGRP) ) GOTO 253
|
|
252 CONTINUE
|
|
253 WRITE (SYSOUT,254) IL, LGRP, COMENT(LGRP)
|
|
254 FORMAT(' ',T5,'Nummer der Schicht',T50,I22,/T5,
|
|
1 'Nummer der Schichtgruppe',T50,I22,/T5,
|
|
2 'Bezeichnung der Schichtgruppe',T52,A20,/T5,
|
|
3 'Das Teilchen wurde in der angegebenen Schicht'//
|
|
4 ' aus der Rechnung genommen.')
|
|
GOTO 100
|
|
|
|
ELSEIF ( ELOSS .LT. -1.5 ) THEN
|
|
c-kt Ein Teilchen hatte einen kleineren Wert für die verbleibende Reichweite
|
|
c-kt als der kleinste tabellierte Reichweiten-Wert:
|
|
WRITE (SYSOUT,255)
|
|
255 FORMAT(' ',T5,'Der 2. Parameter des Befehls PARTICLE '//
|
|
1 ' muß verkleinert werden.')
|
|
STOP 11
|
|
|
|
ELSE
|
|
c-kt Ein Teilchen hatte einen höheren Wert für die kinetische Energie
|
|
c-kt als der größte tabellierte Energiewert:
|
|
WRITE (SYSOUT,256)
|
|
256 FORMAT(' ',T5,'Der 3. Parameter des Befehls PARTICLE '//
|
|
1 ' muß vergrößert werden.')
|
|
STOP 12
|
|
|
|
ENDIF
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
EKOUT = EKIN - ELOSS
|
|
|
|
IF ( STRAGG ) THEN
|
|
|
|
C BERECHNE STRAGGLING
|
|
RSTRAG = RELSTR * SQRT( ELOSS / EBEGIN )
|
|
CALL GGNML ( SEEDS, 1, R(4) )
|
|
ERANGE = CRANGE + ( RSTRAG * R(4) * RBEGIN )
|
|
IF ( ERANGE .LE. 0.0 ) THEN
|
|
EKOUT = EKIN
|
|
ELOSS = 0.0
|
|
POUT = PTOTAL
|
|
NSTRGE(IL) = NSTRGE(IL) + 1
|
|
ELSE
|
|
ELOSS = ELOSS2 ( EKIN, ERANGE, RGDATA(1,ILAYS(IL)),
|
|
1 ILAYE(IL) )
|
|
EKOUT = EKIN - ELOSS
|
|
IF ( EKOUT .LE. 0.0 ) GOTO 400
|
|
POUT = EKOUT * SQRT( 1.0 + (2.0*BMASS/EKOUT) )
|
|
ENDIF
|
|
ELSE
|
|
IF ( EKOUT .LE. 0.0 ) GOTO 400
|
|
POUT = EKOUT * SQRT( 1.0 + (2.0*BMASS/EKOUT) )
|
|
ENDIF
|
|
|
|
C AUSTRITTSKOORD. OHNE STREUUNG
|
|
c-kt Variable für TAN(THETA) an die Stelle von STHETA/CTHETA gesetzt:
|
|
XYPROJ = TTHETA * THICK(IL)
|
|
XAUS = CPHI * XYPROJ + X
|
|
YAUS = SPHI * XYPROJ + Y
|
|
ZAUS = ZKOO(IL) + THICK(IL)
|
|
|
|
IF ( SCATTR ) THEN
|
|
|
|
IF ( (ELOSS/EKIN) .GE. 0.10 ) NMLRE(IL) = NMLRE(IL) + 1
|
|
|
|
C BERECHNE STREUWINKEL THETA
|
|
|
|
CALL MLR ( ZMEAN(IL), AMEAN(IL), RO(IL), CTHICK,
|
|
1 PTOTAL, BMASS, 1.0, THETAS )
|
|
|
|
C WUERFLE PHI 0-2PI
|
|
CALL GGUBS (SEEDS,1,R)
|
|
PHIS = R(1) * ZWEIPI
|
|
C BERECHNE SIN/COS-WERTE
|
|
STHETS = SIN( THETAS )
|
|
CTHETS = COS( THETAS )
|
|
SPHIS = SIN( PHIS )
|
|
CPHIS = COS( PHIS )
|
|
C (XAUS,YAUS)-VERSCHIEBUNG
|
|
C (SIN(X) = BOGENMASS !)
|
|
DXYPRJ = THETAS * CRANGE / SQDREI
|
|
X = CPHIS * DXYPRJ + XAUS
|
|
Y = SPHIS * DXYPRJ + YAUS
|
|
Z = ZAUS
|
|
ELSE
|
|
X = XAUS
|
|
Y = YAUS
|
|
Z = ZAUS
|
|
STHETS = 0.0
|
|
CTHETS = 1.0
|
|
SPHIS = 0.0
|
|
CPHIS = 1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
C BERECHNE, OB TEILCHEN TRIFFT
|
|
GOTO ( 270, 280 ), IGEOT(IL)
|
|
C RUNDE SCHICHT
|
|
270 IF ( (X*X+Y*Y) .GT. PGEOT(2,IL) ) GOTO 360
|
|
GOTO 290
|
|
C RECHTECK
|
|
280 IF ( X .LT. PGEOT(1,IL) .OR. X .GT. PGEOT(2,IL) ) GOTO 360
|
|
IF ( Y .LT. PGEOT(3,IL) .OR. Y .GT. PGEOT(4,IL) ) GOTO 360
|
|
|
|
C IMPULSKOMPONENTEN BZGL DES EIGENKOORDINATENSYSTEMS
|
|
290 IF ( ILAYS(IL) .EQ. 0 ) GOTO 200
|
|
|
|
PTOTAL = POUT
|
|
PXEI = PTOTAL * CPHIS * STHETS
|
|
PYEI = PTOTAL * SPHIS * STHETS
|
|
PZEI = PTOTAL * CTHETS
|
|
|
|
C TRANSFORMIERE INS LABORSYSTEM
|
|
PX = PXEI*CPHI*CTHETA - PYEI*SPHI + PZEI*CPHI*STHETA
|
|
PY = PXEI*SPHI*CTHETA + PYEI*CPHI + PZEI*SPHI*STHETA
|
|
PZ = -PXEI*STHETA + PZEI *CTHETA
|
|
c-kt PTOTAL = SQRT(PX*PX + PY*PY + PZ*PZ) !ADDED 22.1.87 HJM, KAW!!!
|
|
c-kt Geändert zu höherer Genauigkeit bei der späteren Winkelberechnung
|
|
temp = PX*PX + PY*PY + PZ*PZ
|
|
PTOTAL = SQRT( temp )
|
|
IF ( PZ .LE. 0.0 ) GOTO 370
|
|
|
|
C BERECHNE NEUE RICHTUNGSWINKEL
|
|
IF ( SCATTR ) THEN
|
|
CTHETA = PZ / PTOTAL
|
|
|
|
c-lz 6-dec-91 changed the following sentence to avoid any negative sqrt
|
|
c-lz original STHETA = SQRT( 1.0 - CTHETA*CTHETA )
|
|
c-kt STHETA = SQRT(amax1(0.0,(1.0 - CTHETA*CTHETA )))
|
|
c-kt Geändert zu höherer Genauigkeit bei der Berechnung:
|
|
STHETA = SQRT( ( PX*PX + PY*PY ) / temp )
|
|
c-kt Berechnung der neu eingeführten Variable für TAN(THETA):
|
|
TTHETA = SQRT( ( PX*PX + PY*PY ) / (PZ*PZ) )
|
|
THETA = ASIN( STHETA )
|
|
|
|
c-kt Zugegeben ein unwahrscheinlicher Fall, aber dennoch korrekterweise:
|
|
IF ( PY .NE. 0.0 .OR. PX .NE. 0.0) THEN
|
|
PHI = ATAN2( PY, PX )
|
|
ELSE
|
|
PHI = 0.0
|
|
ENDIF
|
|
CPHI = COS( PHI )
|
|
SPHI = SIN( PHI )
|
|
ENDIF
|
|
|
|
GOTO ( 200, 200, 200, 300, 300, 200, 300 ), IOTYPE(IL)
|
|
|
|
C DRUCKE 'BEHIND'-DATEN AUS
|
|
300 IF ( EKOUT .GT. ELIMIT(IL) ) GOTO 200
|
|
IUNIT = NLUNIT(IL)
|
|
c-kt RELSTR wird anstelle von IRELST (=RELSTR*1000) ausgegeben
|
|
c WRITE (IUNIT,2101) ID,IL,SCATTR,STRAGG,STRAG2,RELSTR,NLAY,
|
|
c 1 EBEGIN,BMASS,X,Y,Z, PX,PY,PZ,THETA,PHI,
|
|
c 2 TTOTAL, TLAST, ELOSS
|
|
c 2101 FORMAT(' N',I10,2X,I3,2X,3L1,2X,E10.4,1X,I4,1X,1PE12.5 /
|
|
c 1 4X,6(1PE12.5) / 4X,6(1PE12.5) )
|
|
c
|
|
c new output, TP, 1-jun-95
|
|
c
|
|
e_current = sqrt( px**2 + py**2 + pz**2 + bmass2 ) - bmass
|
|
if ( form ) then
|
|
write(iunit,'(I6,2x,I3,10f10.3)') id,il,x,y,z,px,py,pz,
|
|
1 e_current,theta,phi,ttotal
|
|
else
|
|
c
|
|
c-tp unformatted output
|
|
c
|
|
write(iunit) id,il,x,y,z,px,py,pz,e_current,theta,phi,
|
|
1 ttotal
|
|
c
|
|
endif
|
|
NCOUNT(IL) = NCOUNT(IL) + 1
|
|
IF ( NCOUNT(IL) .GE. NLIMIT(IL) ) GOTO 420
|
|
200 CONTINUE
|
|
|
|
c-kt Gegebenenfalls Speichern des Impulsbetrages oder des Streuwinkels
|
|
c-kt nach der letzten Schicht
|
|
IF ( IMPOUT(NLAY+1) .NE. 0 ) THEN
|
|
WRITE (IMPOUT(NLAY+1),207) PTOTAL
|
|
207 FORMAT(' ',E13.7)
|
|
ENDIF
|
|
IF ( THEOUT(NLAY+1) .NE. 0 ) THEN
|
|
WRITE (THEOUT(NLAY+1),208) THETA
|
|
208 FORMAT(' ',E13.7)
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
C T. DURCHGEKOMMEN
|
|
NTHROU = NTHROU + 1
|
|
IF ( NTHROU .GE. NSVMAX ) GOTO 440
|
|
GOTO 100
|
|
C T. HERAUSGESTREUT VOR DER SCH.
|
|
350 NSTRVO(IL) = NSTRVO(IL) + 1
|
|
GOTO 100
|
|
C T. HERAUSGESTREUT IN DER SCH.
|
|
360 NSTRIN(IL) = NSTRIN(IL) + 1
|
|
GOTO 100
|
|
C GESTOPPT DURCH RUECKSTREUUNG
|
|
370 NRUECK(IL) = NRUECK(IL) + 1
|
|
ICHAR = BACKSC
|
|
GOTO 405
|
|
C GESTOPPT IN DER SCHICHT
|
|
400 NSTOP(IL) = NSTOP(IL) + 1
|
|
ICHAR = STOPPD
|
|
|
|
405 GOTO ( 100, 100, 410, 100, 410, 410, 410 ), IOTYPE(IL)
|
|
|
|
C DRUCKE 'STOPPED'-DATEN AUS
|
|
410 IUNIT = NLUNIT(IL)
|
|
c-kt RELSTR wird anstelle von IRELST (=RELSTR*1000) ausgegeben
|
|
WRITE (IUNIT,2102) ICHAR,ID,IL,SCATTR,STRAGG,STRAG2,RELSTR,
|
|
1 NLAY,EBEGIN,BMASS,X,Y,Z, PX,PY,PZ,THETA,
|
|
2 PHI,TTOTAL, TLAST, ELOSS
|
|
2102 FORMAT(' ',A1,I10,2X,I3,2X,3L1,2X,E10.4,1X,I4,1X,1PE12.5 /
|
|
1 4X,6(1PE12.5) / 4X,6(1PE12.5) )
|
|
NCOUNT(IL) = NCOUNT(IL) + 1
|
|
IF ( NCOUNT(IL) .GE. NLIMIT(IL) ) GOTO 420
|
|
100 CONTINUE
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
WRITE (SYSOUT,2103) NMAX
|
|
2103 FORMAT(//' MAXIMUM NUMBER OF PARTICLES (',I7,') REACHED.')
|
|
GOTO 500
|
|
C LIMIT IN EINER SCHICHT ERREICHT
|
|
420 WRITE (SYSOUT,2104) NLIMIT(IL), IL
|
|
2104 FORMAT(' MAXIMUM NUMBER OF OUTPUT-RECORDS (',I7,') IN LAYER#',I3,
|
|
1 ' REACHED.')
|
|
GOTO 500
|
|
C LIMIT AN START-VERSUCHEN ERREICHT
|
|
440 WRITE (SYSOUT,2105) NSVMAX
|
|
2105 FORMAT(' MAXIMUM NUMBER OF PASSING PARTICLES (',I7,') REACHED.')
|
|
|
|
500 NPARTI = ID
|
|
WRITE(SYSOUT,2205) SEEDS(1)
|
|
2205 FORMAT(' STOP VALUE OF RANDOM NUMBER = ',I16)
|
|
RETURN
|
|
END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C NAME: BEAMIN
|
|
C
|
|
C FUNKTION: BERECHNET DEN IMPULS- UND DIE ORTSKOORDINATEN
|
|
C
|
|
C ----------------------------------------------------------------------
|
|
SUBROUTINE BEAMIN (NSV)
|
|
REAL R(3)
|
|
INTEGER*4 SEEDS
|
|
COMMON
|
|
1 / SEEDCO / SEEDS(6)
|
|
2 / BEAM / PMEAN, PFWHM, PLOW, PHIGH, XFWHM, YFWHM,
|
|
3 RMAX,
|
|
4 IBTYP, XBEAM, YBEAM, PSIGMA, RMAX2
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
5 , XFOCUS, YFOCUS
|
|
c-kt Beginn und Stärke des Magnetfeldes
|
|
6 , MSTART, MGAUSS
|
|
COMMON
|
|
1 / KINEMA / ID, X, Y, Z,
|
|
2 PX, PY, PZ, PTOTAL,
|
|
c-kt Einführen der Variable TTHETA für den Tangens des Streuwinkels:
|
|
3 THETA, PHI, STHETA, CTHETA, TTHETA,
|
|
4 SPHI, CPHI,
|
|
5 TTOTAL, TLAST, ELOSS
|
|
C ERSTELLE GAUSS-ZUFALLSZAHLEN
|
|
GOTO ( 100, 200, 300 ), IBTYP
|
|
C ISOTROPIC DISTRIBUTION
|
|
100 CALL GGUBS (SEEDS,2,R)
|
|
NSV = NSV + 1
|
|
X = ( R(1) - 0.500 ) * RMAX * 2.0
|
|
Y = ( R(2) - 0.500 ) * RMAX * 2.0
|
|
IF ( (X*X+Y*Y) .GT. RMAX2 ) GOTO 100
|
|
GOTO 500
|
|
C GAUSSIAN DISTRIBUTION
|
|
200 CALL GGNML (SEEDS,2,R)
|
|
NSV = NSV + 1
|
|
X = XBEAM * R(1)
|
|
Y = YBEAM * R(2)
|
|
IF ( (X*X+Y*Y) .GT. RMAX2 ) GO TO 200
|
|
GOTO 500
|
|
c
|
|
c isotropic rectangular distribution, TP, 1-jun-1995
|
|
c
|
|
300 call ggubs(seeds,2,r)
|
|
nsv = nsv + 1
|
|
x = ( R(1) - 0.500 ) * XBEAM
|
|
y = ( R(2) - 0.500 ) * YBEAM
|
|
c
|
|
500 Z = 0.0
|
|
C IMPULSVERTEILUNG
|
|
600 CALL GGNML (SEEDS,1,R(3))
|
|
IF ( PFWHM .GT. 0.0 ) THEN
|
|
PTOTAL = PMEAN + ( PSIGMA * R(3) )
|
|
ELSE
|
|
PTOTAL = PLOW + ( R(3) * (PHIGH-PLOW) )
|
|
ENDIF
|
|
IF ( PTOTAL .LT. PLOW .OR. PTOTAL .GT. PHIGH ) GOTO 600
|
|
RETURN
|
|
END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C NAME: COMSUM
|
|
C
|
|
C FUNKTION: DRUCKT DIE STATISTIK AUS
|
|
C
|
|
C ----------------------------------------------------------------------
|
|
SUBROUTINE COMSUM
|
|
CHARACTER*10 BEAMTY(3)
|
|
CHARACTER*20 COMENT,COMT
|
|
REAL*8 RGDATA
|
|
INTEGER*4 SEEDS, TEST
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY und ALL_XY:
|
|
INTEGER*2 IMPOUT, THEOUT, STPOUT, XYOUT, XYALL, LUNINIT
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
INTEGER*2 SYSOUT, SYSIN
|
|
COMMON
|
|
1 / OUTPUT / NLIMIT(200), NCOUNT(200), IOTYPE(200),
|
|
2 NLUNIT(200), ELIMIT(200)
|
|
3 / COMPON / NZCOMP(20), ACOMP(20), NATOM(20), NELEM, NELEMC
|
|
4 / INFOCO / NPARTI, NTHROU, NSTOP(200), NSTRVO(200),
|
|
5 NSTRIN(200), NRUECK(200), NSTRGE(200), NMLRE(200)
|
|
COMMON
|
|
1 / RETAB / NRGMAX, NRGCUR, RGDATA (5,3000)
|
|
2 / LAYER / NLAY, ILAYS(200), ILAYE(200),
|
|
3 THICK(200), RTHICK(200), RO(200),
|
|
4 ZMEAN(200), AMEAN(200), RMEAN(200),
|
|
5 ZKOO(200), IGEOT(200), PGEOT(5,200)
|
|
6 / LAYERG / NGRP, IGRPS(200), IGRPE(200)
|
|
7 / LAYERC / COMENT(200)
|
|
8 / PARTIC / BMASS, BMASS2, EKMIN, EKMAX, IBFLAG, IBUNIT
|
|
9 / BEAM / PMEAN, PFWHM, PLOW, PHIGH, XFWHM, YFWHM,
|
|
1 RMAX,
|
|
2 IBTYP, XBEAM, YBEAM, PSIGMA, RMAX2
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
3 , XFOCUS, YFOCUS
|
|
c-kt Beginn und Stärke des Magnetfeldes
|
|
4 , MSTART, MGAUSS
|
|
3 / SEEDCO / SEEDS(6)
|
|
c-kt Integer-Arrays für die Unit-Nummern zu den Befehlen IMPULS, WINKEL,
|
|
c-kt STOPPED, WHERE_XY und ALL_XY:
|
|
COMMON
|
|
1 / SGLOUT / IMPOUT(201), THEOUT(201), STPOUT(200), XYOUT(201),
|
|
2 XYALL(201), LUNINIT
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
COMMON
|
|
1 / STATUS / SYSOUT, SYSIN, TEST
|
|
|
|
DATA BEAMTY / 'ISOTROPIC ','GAUSSIAN ', 'RECTANGULA' /
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
WRITE (SYSOUT,2200) BMASS, EKMIN, EKMAX
|
|
2200 FORMAT('0','PARTICLE PARAMETER'/
|
|
1 ' ',5X,'MASS IN MEV/C**2',T45,1PG12.5/
|
|
2 ' ',5X,'MINIMUM ENERGY IN MEV',T45,1PG12.5/
|
|
3 ' ',5X,'MAXIMUM ENERGY IN MEV',T45,1PG12.5)
|
|
RPFWHM = PFWHM / PMEAN
|
|
WRITE(SYSOUT,2201) PMEAN,PFWHM,RPFWHM,PLOW,PHIGH
|
|
2201 FORMAT('0','BEAM MOMENTUM DISTRIBUTION PARAMETER'/
|
|
1 6X,'MEAN MOMENTUM IN MEV/C',T60,1PE12.5/
|
|
2 6X,'ABSOLUTE FWHM OF THE MOMENTUM DISTRIBUTION',T60,1PE12.5/
|
|
3 6X,'RELATIVE FWHM OF THE MOMENTUM DISTRIBUTION',T60,1PE12.5/
|
|
4 6X,'LOWEST MOMENTUM IN MEV/C',T60,1PE12.5/
|
|
5 6X,'HIGHEST MOMENTUM IN MEV/C',T60,1PE12.5)
|
|
WRITE(SYSOUT,2202) BEAMTY(IBTYP),XFWHM,YFWHM,RMAX
|
|
2202 FORMAT('0','BEAM SPATIAL DISTRIBUTION PARAMETER'/
|
|
1 6X,'BEAM-SPOT DISTRIBUTION',T47,A10/
|
|
2 6X,'X-FWHM OF THE BEAMSPOT IN CM',T45,1PE12.5/
|
|
3 6X,'Y-FWHM OF THE BEAMSPOT IN CM',T45,1PE12.5/
|
|
4 6X,'MAXIMUM RADIUS OF BEAMSPOT IN CM',T45,1PE12.5)
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
MSTOP = 0
|
|
MRUECK = 0
|
|
MSTRIN = 0
|
|
MSTRVO = 0
|
|
MCOUNT = 0
|
|
MSTRGE = 0
|
|
MMLRE = 0
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
DO 10 I=1,NLAY
|
|
MSTOP = MSTOP + NSTOP(I)
|
|
MRUECK = MRUECK + NRUECK(I)
|
|
MSTRIN = MSTRIN + NSTRIN(I)
|
|
MSTRVO = MSTRVO + NSTRVO(I)
|
|
MCOUNT = MCOUNT + NCOUNT(I)
|
|
MSTRGE = MSTRGE + NSTRGE(I)
|
|
MMLRE = MMLRE + NMLRE (I)
|
|
10 CONTINUE
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
WRITE(SYSOUT,1900) NPARTI,NTHROU
|
|
1900 FORMAT('0',20X,'S U M M A R Y '//
|
|
1 '0','PARTICLES STARTET FROM Z=0',T45,I12/
|
|
2 '0','PARTICLES THROUGH ALL AREAS',T45,I12//
|
|
3 '0',20X,'LAYER STATISTIC'//
|
|
4 '0','GRP/LAY/LUN',1X,'COMMENT',14X,
|
|
5 ' STOPPED',1X,'BACK-SCAT',1X,
|
|
6 'SCAT_BEF.',1X,'SCAT_INS.',1X,
|
|
7 ' STRG_ERR',1X,' MLR_ERR',1X,
|
|
8 ' RECORDS'//)
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
DO 30 LGRP=1,NGRP
|
|
KSTOP = 0
|
|
KRUECK = 0
|
|
KSTRIN = 0
|
|
KSTRVO = 0
|
|
KCOUNT = 0
|
|
KSTRGE = 0
|
|
KMLRE = 0
|
|
WRITE(SYSOUT,1904)
|
|
1904 FORMAT(' ',102('-'))
|
|
IFROM = IGRPS(LGRP)
|
|
ITO = IGRPE(LGRP)
|
|
COMT = COMENT(LGRP)
|
|
DO 20 I=IFROM,ITO
|
|
WRITE(SYSOUT,1902) LGRP,I,NLUNIT(I),COMT,NSTOP(I),NRUECK(I),
|
|
1 NSTRVO(I),NSTRIN(I),
|
|
2 NSTRGE(I),NMLRE(I),NCOUNT(I)
|
|
1902 FORMAT(' ',I3,'/',I3,'/',I3,1X,A20,7(1X,I9))
|
|
|
|
c-kt Ausgabe der Stop-Daten des Targets: aufeinanderfolgend in jeder
|
|
c-kt Zeile die Anzahl der in der Lage gestoppten Teilchen
|
|
IF ( STPOUT(LGRP) .NE. 0 ) THEN
|
|
WRITE (STPOUT(LGRP),1909) NSTOP(I)
|
|
1909 FORMAT(' ',I6)
|
|
ENDIF
|
|
c-kt Ende
|
|
|
|
KSTOP = KSTOP + NSTOP(I)
|
|
KRUECK = KRUECK + NRUECK(I)
|
|
KSTRIN = KSTRIN + NSTRIN(I)
|
|
KSTRVO = KSTRVO + NSTRVO(I)
|
|
KCOUNT = KCOUNT + NCOUNT(I)
|
|
KSTRGE = KSTRGE + NSTRGE(I)
|
|
KMLRE = KMLRE + NMLRE (I)
|
|
20 CONTINUE
|
|
IF ( IFROM .GE. ITO ) GOTO 30
|
|
WRITE(SYSOUT,1904)
|
|
WRITE(SYSOUT,1905) LGRP, NLUNIT(I), KSTOP, KRUECK, KSTRVO,
|
|
1 KSTRIN, KSTRGE, KMLRE, KCOUNT
|
|
1905 FORMAT(' ',I3,'/SUM/',I3,21X,7(1X,I9))
|
|
30 CONTINUE
|
|
|
|
C-----------------------------------------------------------------------
|
|
|
|
WRITE(SYSOUT,1904)
|
|
WRITE(SYSOUT,1903) MSTOP, MRUECK, MSTRVO, MSTRIN, MSTRGE, MMLRE,
|
|
1 MCOUNT
|
|
1903 FORMAT(' ','TOTAL SUM ',21X,7(1X,I9)//)
|
|
RETURN
|
|
END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C NAME: SUMOUT
|
|
C
|
|
C FUNKTION: GIBT DIE STATISTIK AUF EINEM HILFSFILE AUS
|
|
C (ZUR WEITERVERARBEITUNG MIT SAS)
|
|
C
|
|
C ----------------------------------------------------------------------
|
|
SUBROUTINE SUMOUT(ILUNIT)
|
|
CHARACTER*20 COMENT
|
|
REAL*8 RGDATA
|
|
COMMON
|
|
1 / OUTPUT / NLIMIT(200), NCOUNT(200), IOTYPE(200),
|
|
2 NLUNIT(200), ELIMIT(200)
|
|
3 / COMPON / NZCOMP(20), ACOMP(20), NATOM(20), NELEM, NELEMC
|
|
4 / INFOCO / NPARTI, NTHROU, NSTOP(200), NSTRVO(200),
|
|
5 NSTRIN(200), NRUECK(200), NSTRGE(200), NMLRE(200)
|
|
COMMON
|
|
1 / RETAB / NRGMAX, NRGCUR, RGDATA (5,3000)
|
|
2 / LAYER / NLAY, ILAYS(200), ILAYE(200),
|
|
3 THICK(200), RTHICK(200), RO(200),
|
|
4 ZMEAN(200), AMEAN(200), RMEAN(200),
|
|
5 ZKOO(200), IGEOT(200), PGEOT(5,200)
|
|
6 / LAYERG / NGRP, IGRPS(200), IGRPE(200)
|
|
7 / LAYERC / COMENT(200)
|
|
8 / PARTIC / BMASS, BMASS2, EKMIN, EKMAX, IBFLAG, IBUNIT
|
|
9 / BEAM / PMEAN, PFWHM, PLOW, PHIGH, XFWHM, YFWHM,
|
|
1 RMAX,
|
|
2 IBTYP, XBEAM, YBEAM, PSIGMA, RMAX2
|
|
c-kt Z-Komponente von X- und Y-Strahlfoci für den Befehl FOCUS
|
|
3 , XFOCUS, YFOCUS
|
|
c-kt Beginn und Stärke des Magnetfeldes
|
|
4 , MSTART, MGAUSS
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
MSTOP = 0
|
|
MRUECK = 0
|
|
MSTRIN = 0
|
|
MSTRVO = 0
|
|
MCOUNT = 0
|
|
MSTRGE = 0
|
|
MMLRE = 0
|
|
WRITE(ILUNIT,1900) NPARTI, NTHROU
|
|
1900 FORMAT(' ','000/000/000',2(1X,I9))
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
DO 10 I=1,NLAY
|
|
MSTOP = MSTOP + NSTOP(I)
|
|
MRUECK = MRUECK + NRUECK(I)
|
|
MSTRIN = MSTRIN + NSTRIN(I)
|
|
MSTRVO = MSTRVO + NSTRVO(I)
|
|
MCOUNT = MCOUNT + NCOUNT(I)
|
|
MSTRGE = MSTRGE + NSTRGE(I)
|
|
MMLRE = MMLRE + NMLRE (I)
|
|
10 CONTINUE
|
|
DO 30 LGRP=1,NGRP
|
|
IFROM = IGRPS(LGRP)
|
|
ITO = IGRPE(LGRP)
|
|
DO 20 I=IFROM,ITO
|
|
WRITE(ILUNIT,1902) LGRP,I,NLUNIT(I),NSTOP(I),NRUECK(I),
|
|
1 NSTRVO(I),NSTRIN(I),
|
|
2 NSTRGE(I),NMLRE(I),NCOUNT(I)
|
|
1902 FORMAT(' ',I3,'/',I3,'/',I3,7(1X,I9))
|
|
20 CONTINUE
|
|
30 CONTINUE
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
WRITE(ILUNIT,1903) MSTOP, MRUECK, MSTRVO, MSTRIN, MSTRGE,
|
|
1 MMLRE, MCOUNT
|
|
1903 FORMAT(' ','999/000/000',7(1X,I9))
|
|
RETURN
|
|
END
|
|
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C NAME: TBOUND
|
|
C
|
|
C FUNKTION: PRUEFT ZAHLEN AUF GUELTIGKEIT
|
|
C
|
|
C ----------------------------------------------------------------------
|
|
SUBROUTINE TBOUND (TYPE, TEXT, VAR, LEFT, RIGHT, INOUT)
|
|
CHARACTER*2 TYPE,INOUT
|
|
CHARACTER*10 TEXT
|
|
REAL*4 VAR, LEFT, RIGHT
|
|
INTEGER*4 IVAR, ILEFT, IRIGHT, TEST
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
INTEGER*2 SYSOUT, SYSIN
|
|
REAL*4 RVAR, RLEFT, RRIGHT
|
|
EQUIVALENCE ( RVAR,IVAR ), ( RLEFT,ILEFT ), ( RRIGHT,IRIGHT )
|
|
c-kt Deklaration eines neuen Bezeichners für die Ausgabeunit: SYSOUT
|
|
COMMON
|
|
1 / STATUS / SYSOUT, SYSIN, TEST
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
RVAR = VAR
|
|
RLEFT = LEFT
|
|
RRIGHT = RIGHT
|
|
|
|
C ----------------------------------------------------------------------
|
|
|
|
IF ( TYPE .EQ. 'I4' ) THEN
|
|
IF ( INOUT .EQ. 'IN' ) THEN
|
|
IF ( IVAR .LT. ILEFT .OR. IVAR .GT. IRIGHT ) THEN
|
|
WRITE(SYSOUT,1800) TEXT,IVAR,ILEFT,IRIGHT
|
|
1800 FORMAT(' ',A10,'(',I12,') NOT IN (',I10,'/',I10,')')
|
|
STOP 8
|
|
ENDIF
|
|
ELSE
|
|
IF ( IVAR .GE. ILEFT .AND. IVAR .LE. IRIGHT ) THEN
|
|
WRITE(SYSOUT,1801) TEXT,IVAR,ILEFT,IRIGHT
|
|
1801 FORMAT(' ',A10,'(',I12,') IN (',I10,'/',I10,')')
|
|
STOP 8
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ( INOUT .EQ. 'IN' ) THEN
|
|
IF ( RVAR .LT. RLEFT .OR. RVAR .GT. RRIGHT ) THEN
|
|
WRITE(SYSOUT,1802) TEXT,RVAR,RLEFT,RRIGHT
|
|
1802 FORMAT(' ',A10,'(',1PG12.5,') NOT IN (',1PG12.5,
|
|
1 '/',1PG12.5,')')
|
|
STOP 8
|
|
ENDIF
|
|
ELSE
|
|
IF ( RVAR .GE. RLEFT .AND. RVAR .LE. RRIGHT ) THEN
|
|
WRITE(SYSOUT,1803) TEXT,RVAR,RLEFT,RRIGHT
|
|
1803 FORMAT(' ',A10,'(',1PG12.5,') IN (',1PG12.5,
|
|
1 '/',1PG12.5,')')
|
|
STOP 8
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN
|
|
END
|