Files
TRIMSP/fortran/trimspNL.F
T

5572 lines
202 KiB
FortranFixed

C Created June 2000
C
C Expanded to heterostructures with N Layer and MAXEL elements
C Zaher Salman <zaher.salman@psi.ch>
C
C Copyright W. Eckstein, IPP GARCHING, FRG
C Copyright Z. Salman and the LEM group PSI
C if you use this code please cite
C
C Eckstein, W. Computer Simulation of Ion-Solid Interactions;
C Springer Series in Materials Science;
C Springer-Verlag: Berlin Heidelberg, 1991.
C
C Historical overview:
C PROGRAM TRVMC95 VERSION AT IPP GARCHING NOVEMBER 1995
C MOMENTS OF DISTRIBUTIONS (RANGE, ENERGY AND
C ANGLE OF BACKSCATTERED AND SPUTTERED ATOMS)
C INTRODUCTION OF TAUPSI, TAUPSIR
C
C (PROGRAM TRVMC VERSION AT IPP GARCHING MARCH 1993)
C
C VECTORIZED TRIM FOR SPUTTERING, MULTI-COMPONENT TARGET
C 3 LAYERS A 5 COMPONENTS
C BACKWARD AND TRANSMISSION SPUTTERING
C
C W.ECKSTEIN IPP/PWW GARCHING CRAY-XMP
C WORKSTATIONS
C
C BASED ON TRSP1CN, TRIMSP3D (W.ECKSTEIN AND J.P.BIERSACK)
C VECTORIZATION BASED ON TRIM.VEC (M.BASKES SANDIA LIVERMORE)
C
C BACKSCATTERING AND TRANSMISSION OF PROJECTILES
C BACKWARD AND TRANSMISSION SPUTTERING
C ENERGY DISTRIBUTIONS IN SPECIFIC DIRECTIONS
C ENERGY DISTRIBUTIONS IN 100 STEPS UP TO INCIDENT ENERGY
C ANGULAR DISTRIBUTIONS IN STEPS OF COS = 0.05 (CONST. SOLID ANGLE)
C
c-------------------------------------------
c check OS
c
#if defined( _WIN32 )
#define OS_WIN
#else
#define OS_UNIX
#endif
IMPLICIT NONE
C=======================================================================
C DECLARATIONS AND GLOBAL STORAGE
C=======================================================================
CHARACTER*16 TRIMSP_VERSION
C These parameters are related to the maximum number of layers MAXNL
C and maximum number of points in the depth distribution MAXD
INTEGER MAXD,MAXD1,MAXD2,MAXD5,MAXDNL5,MAXD2p2,MAXD2meagb
& ,MAXD2meab,MAXEL
INTEGER MAXNL,MAXNL5,MAXNLp25,MAXNL5p2,MAXNLm15
C This is the only point where the number of layers and depth
C profile are changed. All other parameters should be changed
C accordingly.
PARAMETER (MAXD=500)
PARAMETER (MAXNL=60)
C Maximum number of elements in each layer, was limited to 5.
PARAMETER (MAXEL=12)
PARAMETER (MAXD1=MAXD+1)
PARAMETER (MAXD2=MAXD+2)
PARAMETER (MAXD5=MAXD*MAXEL)
PARAMETER (MAXD2p2=MAXD2*MAXD2)
PARAMETER (MAXD2meagb=MAXD2*36*22)
PARAMETER (MAXD2meab=MAXD2*22)
PARAMETER (MAXNL5=MAXNL*MAXEL)
PARAMETER (MAXNLp25=MAXNL*MAXNL5)
PARAMETER (MAXDNL5=MAXNL*MAXD5)
PARAMETER (MAXNL5p2=MAXNL5*MAXNL5*MAXD)
PARAMETER (MAXNLm15=(MAXNL-1)*MAXEL)
PARAMETER (TRIMSP_VERSION='1.3.2')
C
C Named integer options used by the old input format. The input
C file still contains the numeric values; these PARAMETER names make
C comparisons and output descriptions easier to read.
C
INTEGER POT_KRC,POT_MOLIERE,POT_ZBL
INTEGER STOP_LS,STOP_OR,STOP_MIXED,STOP_ICRU49,STOP_ZIEGLER
INTEGER IRL_OFF
PARAMETER (POT_KRC=1,POT_MOLIERE=2,POT_ZBL=3)
PARAMETER (STOP_LS=1,STOP_OR=2,STOP_MIXED=3)
PARAMETER (STOP_ICRU49=4,STOP_ZIEGLER=5)
PARAMETER (IRL_OFF=0)
LOGICAL TEST(64),TESTR(2000),TEST1(2000)
LOGICAL EQUAL
INTEGER*4 ISRCHFGT,ISRCHFGE,ILLZ
INTEGER N,L,LL,NH,NUM,KK
INTEGER I,J,IV
INTEGER tryE,negE
INTEGER depth_interval_flag
INTEGER*4 seconds_start_total,seconds_stop_total
INTEGER*4 NREC1,NREC2,NE1,K,NGIK,ICW
INTEGER*4 ISEED,ISEED2,ISEED3
INTEGER*4 JJR(2000,2),INOUT(2000,2),LRR(2000,2)
INTEGER*4 IDMAX(2000),IKR(2000)
INTEGER*4 number_in_layer(MAXNL),laufzahl
INTEGER*4 IRP(0:MAXD1),IPL(MAXD),IPLB(MAXD),IPLT(MAXD)
INTEGER*4 ICD(MAXD,MAXNL5),ICDT(MAXD),ICDJT(MAXNL5)
& ,ICDIRJ(MAXNL5,MAXNL5),ICDR(MAXD,MAXNL5),ICDTR(MAXD)
& ,ICDJTR(MAXNL5),ICDIRI(MAXD,MAXNL5,MAXNL5)
& ,ICDIRN(MAXD,MAXNL5),ICDITR(MAXNL5)
INTEGER*4 KADB(20),KADT(20),KADS(20),KADST(20) ,KADRIP(20,MAXNLm15
& ),KADRIS(20,MAXNLm15),KADROP(20,MAXNLm15),KADROS(20,MAXNLm15)
& ,KADSJ(20,MAXNLm15),KADSL(20,6),KDSTJ(20,MAXNLm15),KDSTL(20,6
& )
INTEGER*4 IBSP(MAXNL5),ISPAL(MAXNL),IBSPL(MAXNL5),ISPIP(MAXNL5)
& ,ISPIS(MAXNL5),ISPOP(MAXNL5),ISPOS(MAXNL5)
INTEGER*4 ITSP(MAXNL5),ISPALT(MAXNL)
& ,ISPIPT(MAXNL5),ISPIST(MAXNL5),ISPOPT(MAXNL5),ISPOST(MAXNL5)
INTEGER*4 KO(600,MAXNL5,2)
INTEGER*4 MEAB(MAXD2,22),MAGB(62,22),MEAGB(MAXD2,36,22)
& ,MEABL(75,21),MEPB(MAXD2,MAXD2)
INTEGER*4 MEAT(MAXD2,22),MAGT(62,22),MEAGT(MAXD2,36,22),
& MEATL(75,21),MEPT(MAXD2,MAXD2)
INTEGER*4 MEAS(MAXD2,22,MAXNLm15),MAGS(62,22,MAXNLm15),MAGSA(62,32
& ,MAXNLm15),MEAGS(MAXD2,12,22,MAXNLm15) ,MEASL(75,21,MAXNLm15)
INTEGER*4 MEAST(MAXD2,22,MAXNLm15),MAGST(62,22,MAXNLm15),MEASTL(75
& ,21,MAXNLm15)
C NJ(I) is the number of elements in layer I
INTEGER*4 NJ(MAXNL),JT(MAXNL),ILD(MAXNL),NJJ
INTEGER*4 LLL(64),JJJ(64),IK(64)
INTEGER*4 me(5000),nli(0:MAXNL),irpl(MAXNL)
INTEGER*4 IT,NPROJ
INTEGER*4 IB,IBL
INTEGER*4 IIRP,IIPL,ICDTT,ICDTTR
INTEGER*4 ICSUM,ICSUMS,ICDI,ISPA,ISPAT
INTEGER*4 KK0,KK0R,KK2,KKR,KDEE1,KDEE2
INTEGER*4 NE,NA,NG,NA1,NG1
INTEGER*4 JMAX,LJ,INEL,IH,IH1,IY,IY2,IY3
INTEGER*4 JL,KK1,IVMIN,IVMAX,NPA,IREC1,IREC,MAXA,NALL,NSA,KIS
INTEGER*4 IA,IAG,IAGS,IG,IESP,IESLOG
INTEGER*4 IPOT,IPOTR,IRL,ICDIR,ICSBR,ICSUMR,KOI,IGG,KIST
INTEGER*4 JRT,IESPT,IP,I1,IPB
INTEGER*4 IPB1,KIB,IPT,IE,IERLOG,IAGB,KIT,IMA,IIM
INTEGER*4 im1,im2,im3,IG2,ies,ias
INTEGER*4 JE,JA,JG,JTJ,JTK,JTL
INTEGER*4 NLayers
C REAL Variables
REAL*8 CVMGT
REAL*8 X(64),Y(64),Z(64),E(64),PL(64) ,COSX(64),COSY(64),COSZ(64)
& ,SINE(64)
REAL*8 EPS(64),DEN(64),DEE(64),DENS(64),DEES(64) ,CX(64),CY(64)
& ,CZ(64),SX(64),X1(64),ASIGT(64),EM(64)
REAL*8 EX1(64),EX2(64),EX3(64),P(64),TAU(64),EX4(64) ,B(64),R(64)
& ,C2(64),S2(64),CT(64),ST(64),V(64),V1(64) ,CPHI(64),SPHI(64)
& ,CPSI(64),SPSI(64),TAUPSI(64) ,ENUCL(64),EINEL(64),ENUCL2(64)
& ,EINEL2(64)
REAL*8 ER(2000,2),XR(2000,2),YR(2000,2),ZR(2000,2) ,CSXR(2000,2)
& ,CSYR(2000,2),CSZR(2000,2),TAUR(2000) ,SNXR(2000,2)
& ,CPSIR(2000,2),SPSIR(2000,2),CPHIR(2000,2) ,SPHIR(2000,2)
& ,TAUPSR(2000,2)
REAL*8 EPSR(2000),T(2000),TS(2000),DEER(2000),DEERS(2000)
& ,PR(2000),BR(2000),EX1R(2000),EX2R(2000),EX3R(2000),CTR(2000)
& ,STR(2000),ASIGTR(2000),EX4R(2000) ,X2(2000),RR(2000)
& ,VR(2000) ,V1R(2000),CXR(2000),CYR(2000),CZR(2000) ,SXR(2000)
& ,C2R(2000),S2R(2000),CUR(2000)
REAL*8 RIRP(0:MAXD1),CASMOT(MAXD),PHON(MAXD),DENT(MAXD),ION(MAXD)
& ,DMGN(MAXD),CASMOTR(MAXD),PHONR(MAXD),DENTR(MAXD),IONR(MAXD)
& ,DMGNR(MAXD),ELGD(MAXD),ELGDR(MAXD)
REAL*8 ELE(MAXD,MAXNL5),ELI(MAXD,MAXNL5),ELP(MAXD,MAXNL5)
& ,ELD(MAXD,MAXNL5) ,ELET(MAXNL5),ELIT(MAXNL5),ELPT(MAXNL5)
& ,ELDT(MAXNL5),ELER(MAXD,MAXNL5),ELIR(MAXD,MAXNL5),ELPR(MAXD
& ,MAXNL5),ELDR(MAXD,MAXNL5) ,ELETR(MAXNL5),ELITR(MAXNL5)
& ,ELPTR(MAXNL5),ELDTR(MAXNL5)
REAL*8 AI(20),RKADB(20),RKADT(20) ,RKADS(20),RKADST(20)
& ,RKADSJ(20,MAXNLm15),RKADSL(20,MAXNL),RKDSTJ(20,MAXNLm15)
& ,RKDSTL(20,MAXNL)
REAL*8 EBSP(MAXNL5),ESPAL(MAXNL) ,SPY(MAXNL5),SPE(MAXNL5)
& ,REY(MAXNL5),EMSP(MAXNL5),ESPIP(MAXNL5),ESPIS(MAXNL5)
& ,ESPOP(MAXNL5),ESPOS(MAXNL5) ,RIP(MAXNL5),RIS(MAXNL5)
& ,ROP(MAXNL5),ROS(MAXNL5) ,REIP(MAXNL5),REIS(MAXNL5)
& ,REOP(MAXNL5),REOS(MAXNL5),ESPMIP(MAXNL5),ESPMIS(MAXNL5)
& ,ESPMOP(MAXNL5),ESPMOS(MAXNL5) ,RIPJ(MAXNL5),RISJ(MAXNL5)
& ,ROPJ(MAXNL5),ROSJ(MAXNL5) ,REIPJ(MAXNL5),REISJ(MAXNL5)
& ,REOPJ(MAXNL5),REOSJ(MAXNL5)
REAL*8 ETSP(MAXNL5),ESPALT(MAXNL) ,SPYT(MAXNL5),SPET(MAXNL5)
& ,REYT(MAXNL5),EMSPT(MAXNL5),ESPIPT(MAXNL5),ESPIST(MAXNL5)
& ,ESPOPT(MAXNL5),ESPOST(MAXNL5),RIPT(MAXNL5),RIST(MAXNL5)
& ,ROPT(MAXNL5),ROST(MAXNL5) ,REIPT(MAXNL5),REIST(MAXNL5)
& ,REOPT(MAXNL5),REOST(MAXNL5) ,ESPMIPT(MAXNL5),ESPMIST(MAXNL5)
& ,ESPMOPT(MAXNL5),ESPMOST(MAXNL5)
REAL*8 SPEM(MAXNL5),SPE2S(MAXNL5),SPE3S(MAXNL5),SPE4S(MAXNL5)
& ,SPE5S(MAXNL5) ,SPE6S(MAXNL5),VSPE(MAXNL5),SSPE(MAXNL5)
& ,GSPE(MAXNL5),BSPE(MAXNL5)
REAL*8 SPE1SL(MAXNL5),SPE2SL(MAXNL5),SPE3SL(MAXNL5),SPE4SL(MAXNL5)
& ,SPE5SL(MAXNL5),SPE6SL(MAXNL5)
REAL*8 ELOG(75),EMA(62,22),EABL(75)
REAL*8 EMAT(62,22),EATL(75),EASL(75,MAXNLm15),EASTL(75,MAXNLm15)
REAL*8 FG(128),FFG(64)
REAL*8 XX(MAXNL),DX(MAXNL),RHO(MAXNL)
REAL*8 Z2(MAXNL),M2(MAXNL),LM(MAXNL)
REAL*8 PDMAX(MAXNL),ARHO(MAXNL),AM(MAXNL)
REAL*8 FM(MAXNL),EPS0(MAXNL),ASIG(MAXNL)
REAL*8 K2(MAXNL),CK(MAXNL),KLM1(MAXNL)
REAL*8 SB(MAXNL),DLI(MAXNL)
REAL*8 UpTiefe,LowTiefe
C ZT - atomin numbers, MT - mass numbers (amu), CO - concentration (stoichiometry)
C SBE - surface binding energy, ED - displacement energy, BE - bulk binding energy
C COM - ??
REAL*8 ZT(MAXNL,MAXEL),MT(MAXNL,MAXEL),CO(MAXNL,MAXEL)
& ,SBE(MAXNL,MAXEL),ED(MAXNL,MAXEL),BE(MAXNL,MAXEL),
& COM(MAXEL,MAXNL)
REAL*8 MU(MAXNL5,MAXNL5),EC(MAXNL5,MAXNL5),A(MAXNL5,MAXNL5)
& ,F(MAXNL5,MAXNL5) ,KL(MAXNL5,MAXNL5),KOR(MAXNL5,MAXNL5)
& ,KLM(MAXNL,MAXNL5)
REAL*8 MU1(MAXNL5),EC1(MAXNL5),A1(MAXNL5),F1(MAXNL5),KL1(MAXNL5)
& ,KOR1(MAXNL5) ,DI(MAXNL5),EP(MAXNL5),ZZ(MAXNL5),TM(MAXNL5)
C CH1,2,3,4,5 are values of A-1,2,3,4,5 of the Ziegler tables
REAL*8 CH1(MAXNL,MAXEL),CH2(MAXNL,MAXEL),CH3(MAXNL,MAXEL)
& ,CH4(MAXNL,MAXEL),CH5(MAXNL,MAXEL)
REAL*8 CHM1(MAXNL)
REAL*8 SM(64),SH(64,MAXEL)
REAL*8 FIESB(MAXNLm15),SEESB(MAXNLm15),THESB(MAXNLm15)
& ,FOESB(MAXNLm15) ,SGMESB(MAXNLm15),DFIESB(MAXNLm15)
& ,DSEESB(MAXNLm15),DTHESB(MAXNLm15)
REAL*8 pi,c,E0,de,alfa,z1,rtheta,cu,enot,esb,est,esp
REAL*8 E2,AB,FP,AN
REAL*8 Esig,Epar
REAL*8 E0keV,EsigkeV
c for part. reflec. coeff. calculation
REAL*8 epsilon, prcoeff,PRC(6)
REAL*8 cossin,rphi,vanlb,vailb,vanlt,vailt,phip,ta,ta2
REAL*8 exir,phipr,u,rq,es,vanli,vaili
REAL*8 M1,MOT
REAL*8 ET,PLST,PL2ST,PL3ST
REAL*8 PL4ST,PL5ST,PL6ST
REAL*8 SEM,TDMENR
REAL*8 TION,TIONR,TDENT,TDENTR
REAL*8 TELGD,TPHON,TCASMO,TELGDR
REAL*8 TPHONR,TRIRP,TDMGN,TDMGNR
REAL*8 ET2SUM,ET3SUM,ET4SUM,ET5SUM,ET6SUM
REAL*8 EB2SUM,EB3SUM,EB4SUM,EB5SUM,EB6SUM,EB
REAL*8 EB1SUL,EB2SUL,EB3SUL,EB4SUL,EB5SUL,EB6SUL
REAL*8 EINELB,EIL2B
REAL*8 EXI,exi1s,exi2s,exi3s,exi4s,exi5s,exi6s,exiq,exic
REAL*8 cossq,cosst,coss1s,coss2s,coss3s,coss4s,coss5s,coss6s
REAL*8 X2SUM,X3SUM,X4SUM,X5SUM,X6SUM,XSUM
REAL*8 R2SUM,R3SUM,R4SUM,R5SUM,R6SUM,RSUM
REAL*8 PL2SUM,PL3SUM,PL4SUM,PL5SUM,PL6SUM,PLSUM
REAL*8 ENL2B,ENUCLB,EINELI,EIL2I
REAL*8 ENUCLI,ENL2I
REAL*8 PLSB,PL2SB,PL3SB,PL4SB,PL5SB,PL6SB
REAL*8 EELWC,EELWC2,EELWC3,EELWC4,EELWC5,EELWC6
REAL*8 EIL,EIL2,EIL3,EIL4,EIL5,EIL6
REAL*8 EPL,EPL2,EPL3,EPL4,EPL5,EPL6
REAL*8 EEL,EEL2,EEL3,EEL4,EEL5,EEL6
REAL*8 EN2LT
REAL*8 EMX,ESPAT,ESPA
REAL*8 ALPHA,ALPHASIG,ALPHAPAR
REAL*8 EF,SHEATH,ERC,RI,RI2,RI3,X0,RD,CW,CA
REAL*8 DA,DG,DGI,BW,DAW,DGW,E0DE,DGIK,PI2,ABC
REAL*8 TT,HLM,HLMT
REAL*8 SU1,SU2,SUR,SU,SUT1,SUT2,SUTR,SUT
REAL*8 CALFA,SALFA,SFE,XC,RT,TI,SINA
REAL*8 ZARG,VELC,RA,RR1,FR,FR1,Q,FE(64)
REAL*8 ROCINV,SQE,CC,AA,FF,DELTA,DEEOR,DEEORR,DELR,FHE,DEL
REAL*8 G,DEN2,DEN3,DEE2,DEE3,DEWC,DEWC2,DEWC3
REAL*8 TAR,TAR2,RRR1,T1,TEL,TR,TR1,EI,ENOR,ACS,AC
REAL*8 SPE2,SPE3,SPE2L,SPE3L
REAL*8 ENORT,ESPT,EXIRT,EINELT,EIL2T
REAL*8 PL2,PL3,XQ,XQ3,RQW,RQ3,ENO,ESQ,ES3
REAL*8 ESQL,ES3L,PLQB,PL3B,PLQT,PL3T
REAL*8 ETQ,ET3,ENUCLT,ENL2T
REAL*8 RA1,ALPHAM,EMV,EIM
REAL*8 CSUM,CSUMS,CSUMR,AVCSUM,AVCSMS,AVCDIS
REAL*8 AVNLI,SIGNLI,DFINLI,SIGILI,DFIILI,AVILI
REAL*8 TIT,TE,TMEANR,EMEANT,AVNLT,SIGNLT,DFINLT,AVILT
REAL*8 TN,SIGILT,DFIILT
REAL*8 FIX0,SEX,THX,FOX,FIX,SIX,SIGMAX,DFIX0,DSEX,DTHX
REAL*8 FIR0,SER,THR,FOR,FIR,SIR,SIGMAR,DFIR0,DSER,DTHR
REAL*8 FIP0,SEP,THP,FOP,FIP,SIP,SIGMAP,DFIP0,DSEP,DTHP
REAL*8 FIE0,SEE,THE,FOE,FIE,SIE,SIGMAE,DFIE0,DSEE,DTHE
REAL*8 FIW0,SEW,THW,FOW,FIW,SIW,SIGMAW,DFIW0,DSEW,DTHW
REAL*8 FII0,SEI,THI,FOI,FII,SII,SIGMAI,DFII0,DSEI,DTHI
REAL*8 FIS0,SES,THS,FOS,FIS,SIS,SIGMAS,DFIS0,DSES,DTHS
REAL*8 FIB0,SEB,THB,FOB,FIB,SIB,SIGMAB,DFIB0,DSEB,DTHB
REAL*8 FIPB0,SEPB,THPB,FOPB,FIPB,SIPB,SIGMPB,DFIPB0,DSEPB,DTHPB
REAL*8 FIT0,SET,THT,FOT,FIT,SIT,SIGMAT,DFIT0,DSET,DTHT
REAL*8 FIPT0,SEPT,THPT,FOPT,FIPT,SIPT,SIGMPT,DFIPT0,DSEPT,DTHPT
REAL*8 FIES0,SEES,THES,FOES,FIES,SIES,SIGMES,DFIES0,DSEES,DTHES
REAL*8 FIES0L,SEESL,THESL,FOESL,FIESL,SIESL,SIGMSL,DFIESL,DSEESL
& ,DTHESL
REAL*8 X1SD,X2SD,X3SD,X4SD,X5SD,X6SD
REAL*8 ACSUMR,ACDISR,ACSBER,ACSUR,ACDIR,ACSBR
REAL*8 ACDR11,ACDR12,ACDR21,ACDR22
REAL*8 D1,D2,Dmid,RN,RE,EMEANR,EMEAN,AVEB,AVNLB,SIGNLB
REAL*8 DFINLB,AVILB,SIGILB,DFIILB,TEMP,TEMPNH
REAL*8 EB1B,EB2B,EB3B,EB4B,EB5B,EB6B
REAL*8 EB1BL,EB2BL,EB3BL,EB4BL,EB5BL,EB6BL
REAL*8 EBSP1,EBSP2,EBSP3,EBSP4,EBSP5,EBSP6
REAL*8 EBSP1L,EBSP2L,EBSP3L,EBSP4L,EBSP5L,EBSP6L
REAL*8 PL1S,PL2S,PL3S,PL4S,PL5S,PL6S
REAL*8 YH,HN,CST,BI,BIL,YSP,YSPL,EEE
REAL*4 random(1),ran2(2)
C CHARACTER Variables
CHARACTER*18 DPOT,DPOTR,DKDEE1,DKDEE2
CHARACTER*60 filein,fileout
CHARACTER*64 innam,outnam,rgenam,errnam,seqnam
CHARACTER*4 inext,outext,rgeext,errext,seqext
CHARACTER errcom*72
CHARACTER month_start*4,month_stop*4,day_start*2,day_stop*2
CHARACTER year_start*4,year_stop*4,hour_start*2,hour_stop*2
CHARACTER min_start*2,min_stop*2,sec_start*2,sec_stop*2
CHARACTER*50 chem(MAXNL)
COMMON /A/ M1,VELC,ZARG
COMMON /B/ TI,SHEATH,CALFA
C=======================================================================
C STATIC INITIALISATION
C=======================================================================
DATA PI/3.14159265358979D0/, ICW/100/, E2/14.399651D0/
DATA AB/0.52917725D0/, FP/0.885341377D0/, AN/0.60221367D0/
DATA inext/'.inp'/,outext/'.out'/,rgeext/'.rge'/
DATA errext/'.err'/,seqext/'.seq'/
DATA ET/0.D0/,PLST/0.D0/,PL2ST/0.D0/,PL3ST/0.D0/
DATA PL4ST/0.D0/,PL5ST/0.D0/,PL6ST/0.D0/
DATA KIT/0/,KIS/0/,KIST/0/,NALL/0/,NPA/0/,NSA/0/,KIB/0/,MAXA/0/
DATA SEM/0.D0/,IT/0/,NPROJ/0/,NREC1/0/,NREC2/0/
DATA NH/0/,IB/0/,IBL/0/,NJ/MAXNL*0/,NLI/0,MAXNL*0/
DATA DLI/MAXNL*0.D0/
DATA tryE/0/,negE/0/
DATA IIRP/0/,IIPL/0/,ICDTT/0/,ICDTTR/0/,TDMENR/0.D0/
DATA TION/0.D0/,TIONR/0.D0/,TDENT/0.D0/,TDENTR/0.D0/
DATA TELGD/0.D0/,TPHON/0.D0/,TCASMO/0.D0/,TELGDR/0.D0/
DATA TPHONR/0.D0/,TDMENR/0.D0/,TRIRP/0.D0/,TDMGN/0.D0/
DATA TDMGNR/0.D0/
DATA ET2SUM/0.D0/,ET3SUM/0.D0/,ET4SUM/0.D0/,ET5SUM/0.D0/
DATA ET6SUM/0.D0/
DATA EB2SUM/0.D0/,EB3SUM/0.D0/,EB4SUM/0.D0/,EB5SUM/0.D0/
DATA EB6SUM/0.D0/,EB/0.D0/
DATA EB1SUL/0.D0/,EB2SUL/0.D0/,EB2SUL/0.D0/,EB3SUL/0.D0/
DATA EB4SUL/0.D0/,EB5SUL/0.D0/,EB6SUL/0.D0/
DATA EINELB/0.D0/,EIL2B/0.D0/
DATA exi1s/0.D0/,exi2s/0.D0/,exi3s/0.D0/,exi4s/0.D0/
DATA exi5s/0.D0/,exi6s/0.D0/
DATA KADB/20*0/
DATA coss1s/0.D0/,coss2s/0.D0/,coss3s/0.D0/,coss4s/0.D0/
DATA coss5s/0.D0/,coss6s/0.D0/
DATA MEAB/MAXD2meab*0/,MEABL/1575*0/,MAGB/1364*0/
DATA MEPB/MAXD2p2*0/,MEAGB/MAXD2meagb*0/,EMA/1364*0.D0/
DATA X2SUM/0.D0/,X3SUM/0.D0/,X4SUM/0.D0/,X5SUM/0.D0/
DATA X6SUM/0.D0/,XSUM/0.D0/
DATA R2SUM/0.D0/,R3SUM/0.D0/,R4SUM/0.D0/,R5SUM/0.D0/
DATA R6SUM/0.D0/,RSUM/0.D0/
DATA PL2SUM/0.D0/,PL3SUM/0.D0/,PL4SUM/0.D0/,PL5SUM/0.D0/
DATA PL6SUM/0.D0/,PLSUM/0.D0/
DATA ENL2B/0.D0/,ENUCLB/0.D0/,EINELI/0.D0/,EIL2I/0.D0/
DATA ENUCLI/0.D0/,ENL2I/0.D0/
C BUGFIX: transmitted projectile loss accumulators were read before
C guaranteed assignment when at least one projectile transmits.
DATA ENUCLT/0.D0/,ENL2T/0.D0/,EINELT/0.D0/,EIL2T/0.D0/
DATA PLSB/0.D0/,PL2SB/0.D0/,PL3SB/0.D0/,PL4SB/0.D0/
DATA PL5SB/0.D0/,PL6SB/0.D0/
DATA EELWC/0.D0/,EELWC2/0.D0/,EELWC3/0.D0/,EELWC4/0.D0/
DATA EELWC5/0.D0/,EELWC6/0.D0/
DATA EIL/0.D0/,EIL2/0.D0/,EIL3/0.D0/,EIL4/0.D0/
DATA EIL5/0.D0/,EIL6/0.D0/
DATA EPL/0.D0/,EPL2/0.D0/,EPL3/0.D0/,EPL4/0.D0/
DATA EPL5/0.D0/,EPL6/0.D0/
DATA EEL/0.D0/,EEL2/0.D0/,EEL3/0.D0/,EEL4/0.D0/
DATA EEL5/0.D0/,EEL6/0.D0/
DATA ENUCL/64*0.D0/,EN2LT/0.D0/,TAUPSI/64*0.D0/
DATA EINEL/64*0.D0/,CASMOT/MAXD*0.D0/,DENT/MAXD*0.D0/
DATA DMGN/MAXD*0.D0/,ION/MAXD*0.D0/,PHON/MAXD*0.D0/
DATA PHONR/MAXD*0.D0/
DATA ELGD/MAXD*0.D0/,ELGDR/MAXD*0.D0/
DATA ICDT/MAXD*0/,ICDTR/MAXD*0/
DATA ICDR/MAXDNL5*0/,ICDIRN/MAXDNL5*0/,IONR/MAXD*0.D0/
DATA DENTR/MAXD*0.D0/,DMGNR/MAXD*0.D0/
DATA IPL/MAXD*0/,IPLB/MAXD*0/,IPLT/MAXD*0/,IRP/MAXD2*0/
DATA IRPL/MAXNL*0/
DATA ICDJT/MAXNL5*0/,ICDJTR/MAXNL5*0/,ICDITR/MAXNL5*0/
DATA ICD/MAXDNL5*0/,ELP/MAXDNL5*0.D0/,ELD/MAXDNL5*0.D0/
DATA ELE/MAXDNL5*0.D0/,ELI/MAXDNL5*0.D0/
DATA ICDIRI/MAXNL5p2*0/
DATA ICSUM/0/,ICSUMS/0/,ICDI/0/,ISPA/0/,ISPAT/0/
C BUGFIX: recoil counters are used in IRL output and incremented
C later; they must not start from compiler-dependent garbage.
DATA ICDIR/0/,ICSBR/0/,ICSUMR/0/
DATA Z2/MAXNL*0.D0/,M2/MAXNL*0.D0/
DATA KLM1/MAXNL*0.D0/,CHM1/MAXNL*0.D0/
DATA SB/MAXNL*0.D0/,KLM/MAXNLp25*0.D0/
DATA ME/5000*0/,EMX/0.D0/,ESPAT/0.D0/,ESPA/0.D0/
DATA IBSP/MAXNL5*0/,IBSPL/MAXNL5*0/,EBSP/MAXNL5*0.D0/
DATA ISPAL/MAXNL*0/
DATA ITSP/MAXNL5*0/,ETSP/MAXNL5*0.D0/
DATA ESPAL/MAXNL*0.D0/,ESPALT/MAXNL*0.D0/
DATA ISPALT/MAXNL*0/
DATA SPE2S/MAXNL5*0.D0/,SPE3S/MAXNL5*0.D0/,SPE4S/MAXNL5*0.D0/
DATA SPE5S/MAXNL5*0.D0/,SPE6S/MAXNL5*0.D0/
DATA SPE1SL/MAXNL5*0.D0/,SPE2SL/MAXNL5*0.D0/,SPE3SL/MAXNL5*0.D0/
DATA SPE4SL/MAXNL5*0.D0/,SPE5SL/MAXNL5*0.D0/,SPE6SL/MAXNL5*0.D0/
DATA ELET/MAXNL5*0.D0/,ELPT/MAXNL5*0.D0/,ELDT/MAXNL5*0.D0/
DATA ELIT/MAXNL5*0.D0/
DATA ELETR/MAXNL5*0.D0/,ELITR/MAXNL5*0.D0/,ELPTR/MAXNL5*0.D0/
DATA ELDTR/MAXNL5*0.D0/
DATA Epar/0.D0/
C part. refl. coeff. from Thomas et al.
DATA PRC/0.825D0,21.41D0,8.606D0,0.6425D0,1.907D0,1.927D0/
DATA number_in_layer/MAXNL*0/
C=======================================================================
C Variable dictionary (comment-only, fixed-form Fortran)
C
C Indices and counters
C
C I layer index unless used as a local loop counter
C J element index inside layer I
C K global element/species index over all layers
C IV active primary-projectile slot, 1..64
C IREC recoil-particle slot, 1..2000
C IP/IPB/IPT depth-bin indices for general/back/transmission use
C IE,IA,IG energy, polar-angle and azimuth-angle histogram indices
C
C Main dimensions
C
C MAXD number of depth bins
C MAXNL maximum number of target layers
C MAXEL maximum number of elements in one layer
C MAXNL5 maximum total layer-specific species, MAXNL*MAXEL
C
C Main run controls
C
C NH number of incident projectiles to simulate
C E0 initial projectile energy
C ESIG initial energy spread
C ALPHA incident angle
C X0 initial depth/start position
C CW depth-bin width
C L number of target layers used in this run
C
C Projectile
C
C Z1 projectile atomic number
C M1 projectile mass
C E(IV) current projectile energy
C X,Y,Z current projectile position components
C PL(IV) current projectile path length
C COSX,COSY,COSZ current projectile direction cosines
C
C Recoils
C
C ER recoil energy
C XR,YR,ZR recoil position components
C CSXR,CSYR,CSZR recoil direction cosines
C JJR recoil species index information
C LRR recoil layer index information
C INOUT recoil status / surface-crossing bookkeeping
C
C Target geometry and composition
C
C CHEM(I) layer name or chemical formula read from input
C DX(I) thickness of layer I
C RHO(I) mass density of layer I
C NJ(I) number of elements in layer I
C JT(I) cumulative species index up to layer I
C ZT(I,J) atomic number of element J in layer I
C MT(I,J) mass of element J in layer I
C CO(I,J) concentration fraction of element J in layer I
C Z2,M2 concentration-weighted layer atomic number and mass
C
C Binding, displacement and stopping input
C
C SBE(I,J) surface binding energy
C ED(I,J) displacement energy
C BE(I,J) bulk binding energy
C CH1-CH5 Ziegler stopping coefficients for each element
C CHM1(I) layer-level stopping coefficient helper
C
C Layer-specific species tables
C
C ZZ(K) atomic number for global species K
C TM(K) mass for global species K
C DI(K) density/concentration helper for species K
C EP(K) energy parameter for species K
C MU,EC,A,F,KL,KOR pair tables for projectile/target species
C MU1,EC1,A1,F1,KL1,KOR1 pair tables for incident projectile
C
C Energy loss and damage profiles
C
C ENUCL,EINEL projectile nuclear and electronic losses
C ENUCL2,EINEL2 squared-loss accumulators
C CASMOT,DENT,ION,PHON,DMGN depth-resolved projectile damage
C CASMOTR,DENTR,IONR,PHONR,DMGNR recoil-resolved damage
C ELE,ELI,ELP,ELD projectile energy-loss profiles by species
C ELER,ELIR,ELPR,ELDR recoil energy-loss profiles by species
C
C Range, reflection and transmission statistics
C
C IRP,RIRP implanted-projectile range histograms
C IPL,IPLB,IPLT path-length histograms
C IB,IT numbers of backscattered and transmitted projectiles
C ET sum of transmitted projectile energies
C EB sum of backscattered projectile energies
C
C Sputtering and recoil statistics
C
C IBSP,ITSP sputtered species counters, backward/transmission
C EBSP,ETSP sputtered species energy sums
C SPY,SPYT sputter yields per species
C REY,REYT recoil emission yields per species
C KADS/KADST sputtered angular counters
C KDSTJ/KDSTL transmitted sputtering angular counters
C
C Histogram arrays used in output
C
C MEAB,MEAT energy spectra for backscattered/transmitted ions
C MAGB,MAGT angular spectra for backscattered/transmitted ions
C MEAS,MEAST energy spectra for sputtered species
C MAGS,MAGST angular spectra for sputtered species
C EMA,EMAT accumulated energies in angular-energy bins
C
C File names and extensions
C
C FILEIN run basename supplied on the command line
C INNAM input file name, FILEIN//'.inp'
C OUTNAM main output file name, FILEIN//'.out'
C RGENAM range output file name, FILEIN//'.rge'
C ERRNAM error/log file name, FILEIN//'.err'
C=======================================================================
C=======================================================================
C COMMAND LINE AND FILE NAMES
C=======================================================================
CALL getarg(1, filein)
C Require an explicit run basename for input/output naming.
if (filein.eq.'') then
WRITE(*,*) 'Usage: trimspNL <run_basename>'
STOP 1
endif
fileout = filein
innam=trim(filein)//inext
outnam=trim(fileout)//outext
rgenam=trim(fileout)//rgeext
errnam=trim(fileout)//errext
seqnam=trim(fileout)//seqext
write (*,*) innam
C LMAX is maximum number of layers and JMAX is maximum number of
C elements per layer.
JMAX=MAXEL
C=======================================================================
C READ GUI-GENERATED INPUT FILE
C=======================================================================
C This part reads the input file (new format).
C The JavaScript/Electron frontend writes this sequential block layout,
C so the READ order below must stay in sync with CreateInpFile().
C Input reading has been moved to READ_GUI_INPUT so the
C GUI file layout is isolated from the transport code.
CALL READ_GUI_INPUT(INNAM,ERRNAM,Z1,M1,E0,ESIG,ALPHA,ALPHASIG,EF,
& ESB,SHEATH,ERC,NH,RI,RI2,RI3,X0,RD,CW,CA,KK0,KK0R,KDEE1,
& KDEE2,IPOT,IPOTR,IRL,NLayers,CHEM,DX,RHO,CK,NJ,ZT,MT,CO,SBE,
& ED,BE,CH1,CH2,CH3,CH4,CH5)
C=======================================================================
C OPEN OUTPUT FILES AND START CLOCK
C=======================================================================
C open statement for output files, removed from line 2449 ff to here
OPEN(UNIT=21,FILE=outnam)
6001 OPEN(UNIT=22,FILE=rgenam,STATUS='replace')
WRITE(21,1000) TRIMSP_VERSION
1000 FORMAT(1H1/,6X,'* TrimSPNL v',A,' *')
C Get simulation start time
CALL TimeStamp(day_start,month_start,year_start,hour_start
& ,min_start,sec_start,seconds_start_total)
WRITE(21,*)
WRITE(21,1050)day_start,month_start,year_start,hour_start
& ,min_start,sec_start
WRITE(*,1001) TRIMSP_VERSION
1001 FORMAT(1X,'Version ',A)
WRITE(*,1050)day_start,month_start,year_start,hour_start
& ,min_start,sec_start
1050 FORMAT(1x,' Start: ',A2,'.',A4,1x,A4,1x,A2
& ,':',A2,':',A2)
C=======================================================================
C OUTPUT BINNING CONSTANTS
C=======================================================================
C SET INTERVAL CONSTANTS FOR OUTPUT
DE = 1.D0
DA = 3.D0
DG = 3.D0
DGI = 15.D0
NE = IDINT(100.D0/DE + 2.00001D0)
NA = IDINT(90.D0/DA + 2.00001D0)
NG = IDINT(180.D0/DG + 2.00001D0)
NG = NA +NA -2
NGIK = IDINT(180.D0/DGI+ 0.001D0)
NE1 = NE -1
NA1 = NA -1
NG1 = NG -1
IF(E0.LT.0.) then
E0DE = 10.0D0/(DABS(E0)*DE)
else
E0DE = 100.0D0/(E0*DE)
endif
BW = 180.D0/PI
DAW = BW/DA
DGW = BW/DG
DGIK = BW/DGI
C=======================================================================
C TARGET SETUP AND PRECOMPUTED TABLES
C=======================================================================
C CALCULATION OF CHARGE AND MASS DEPENDENT CONSTANTS
PI2=2.D0*PI
ABC=AB*FP
L=NLayers
C Checks wether depth interval is an integer denominator of layer thickness or not.
C If not, the calculated number of implanted particles in each layer from bin width
C is wrong. Calculation form layer thickness should be correct.
C The rge files (stopping profiles) and summary files should be fine.
C CW is depth increment and DX(K) is the thickness of layer K
depth_interval_flag = 1
C DO K=1,L-1
C IF(.NOT.EQUAL(DX(K)/CW-DBLE(IDINT(DX(K)/CW)),0.D0)) THEN
C If the thickness of layer K is not an integer multiples of depth increment
C depth_interval_flag = 0
C GO TO 44
C ENDIF
C ENDDO
C 44 CONTINUE
JT(1) = 0
JT(2) = NJ(1)
LJ= NJ(1)+NJ(2)
XX(1)=DX(1)
NJJ=0
C Loop over all defined layers
DO I=1,L
C BUGFIX: this loop iterates with I; using K here read an
C uninitialised/stale index and could test the wrong layer.
if(.not.EQUAL(DX(I)/CW-DBLE(IDINT(DX(I)/CW)),0.D0)) then
depth_interval_flag = 0
endif
if (I.ge.2) XX(I)=XX(I-1)+DX(I)
if (I.ge.3) then
JT(I)=JT(I-1)+NJ(I-1)
LJ=LJ+NJ(I)
endif
DO J=1,NJ(I)
Z2(I)=Z2(I)+CO(I,J)*ZT(I,J)
M2(I)=M2(I)+CO(I,J)*MT(I,J)
ENDDO
ARHO(I) = RHO(I)*AN/M2(I)
LM(I) = ARHO(I)**(-1.D0/3.D0)
ASIG(I) = LM(I)*ARHO(I)
PDMAX(I) = LM(I)/DSQRT(PI)
K2(I) = .133743D0*Z2(I)**(2.D0/3.D0)/DSQRT(M2(I))
AM(I) = CA*ABC*(Z2(I)**(-1.D0/3.D0))
FM(I) = AM(I)*M2(I)/(Z1*Z2(I)*E2*(M1+M2(I)))
EPS0(I) = FM(I)*E0
C For each layer calculate the following
do J=1,NJ(I)
ZZ(NJJ+J) = ZT(I,J)
TM(NJJ+J) = MT(I,J)
DI(NJJ+J) = ED(I,J)
EP(NJJ+J) = BE(I,J)
enddo
NJJ=NJJ+NJ(I)
COM(1,I) = CO(I,1)
DO J=1,NJ(I)-1
COM(J+1,I) = COM(J,I)+CO(I,J+1)
ENDDO
ENDDO
DO J = 1,LJ
MU1(J) = M1/TM(J)
EC1(J) = 4.D0*MU1(J)/((1.D0+MU1(J))*(1.D0+MU1(J)))
C KR-C (IPOT=1), MOLIERE (IPOT=2), ZBL POTENTIAL (IPOT=3)
A1(J) = CVMGT(CA*ABC*(ZZ(J)**(-1.D0/3.D0)),CA*ABC/(Z1**0.23D0
& +ZZ(J)**0.23D0),IPOT.LT.POT_ZBL)
F1(J) = A1(J)*TM(J)/(Z1*ZZ(J)*E2*(M1+TM(J)))
KL1(J) = 1.212D0*Z1**(7.D0/6.D0)*ZZ(J)/ ((Z1**(2.D0/3.D0)+ZZ(J)
& **(2.D0/3.D0))**1.5D0*DSQRT(M1))
ENDDO
IF(IPOT.EQ.POT_KRC) THEN
C KR-C POTENTIAL (IPOT=1)
DO J=1,LJ
KOR1(J) = 0.0389205D0*KL1(J)/(PI*A1(J)*A1(J))
ENDDO
ELSEIF (IPOT.EQ.POT_MOLIERE) THEN
C MOLIERE POTENTIAL (IPOT=2)
DO J=1,LJ
KOR1(J) = 0.045D0*KL1(J)/(PI*A1(J)*A1(J))
ENDDO
ELSEIF (IPOT.EQ.POT_ZBL) THEN
C ZBL POTENTIAL
DO J=1,LJ
KOR1(J) = 0.0203253D0*KL1(J)/(PI*A1(J)*A1(J))
ENDDO
ENDIF
DO I = 1,LJ
DO J = 1,LJ
MU(I,J) = TM(I)/TM(J)
EC(I,J) = 4.D0*MU(I,J)/((1.D0+MU(I,J))*(1.D0+MU(I,J)))
C KR-C , MOLIERE , ZBL POTENTIAL
A(I,J)= CVMGT(CA*ABC/(DSQRT(ZZ(I))+DSQRT(ZZ(J)))**(2.D0/3.D0
& ),CA*ABC/(ZZ(I)**0.23D0+ZZ(J)**0.23D0),
& IPOTR.LT.POT_ZBL)
C ZBL POTENTIAL
F(I,J) = A(I,J)*TM(J)/(ZZ(I)*ZZ(J)*E2*(TM(I)+TM(J)))
KL(I,J) = 1.212D0*ZZ(I)**(7.D0/6.D0)*ZZ(J)/ ((ZZ(I)**(2.D0
& /3.D0)+ZZ(J)**(2.D0/3.D0))**1.5D0*DSQRT(TM(I)))
ENDDO
ENDDO
IF (IPOTR.EQ.POT_KRC) THEN
C KR-C POTENTIAL (IPOTR=1)
DO I = 1,LJ
DO J = 1,LJ
KOR(I,J) = 0.0389205D0*KL(I,J)/(PI*A(I,J)*A(I,J))
ENDDO
ENDDO
ELSEIF (IPOTR.EQ.POT_MOLIERE) THEN
C MOLIERE POTENTIAL (IPOTR=2)
DO I = 1,LJ
DO J = 1,LJ
KOR(I,J) = 0.045D0*KL(I,J)/(PI*A(I,J)*A(I,J))
ENDDO
ENDDO
ELSEIF (IPOTR.EQ.POT_ZBL) THEN
C ZBL POTENTIAL (IPOTR=3)
DO I = 1,LJ
DO J = 1,LJ
KOR(I,J) = 0.0203253D0*KL(I,J)/(PI*A(I,J)*A(I,J))
ENDDO
ENDDO
ENDIF
DO LL=1,L
DO J=1,NJ(LL)
KLM1(LL) = KLM1(LL)+CO(LL,J)*KL1(J+JT(LL))*CK(LL)
CHM1(LL) = CHM1(LL)+CO(LL,J)*CH1(LL,J)
SB(LL) = SB(LL)+CO(LL,J)*SBE(LL,J)
ENDDO
ENDDO
DO I=1,LJ
DO LL = 1,L
DO J=1,NJ(LL)
KLM(LL,I) = KLM(LL,I)+CO(LL,J)*KL(I,J+JT(LL))
ENDDO
ENDDO
ENDDO
ALPHA = CVMGT( .001D0, ALPHA, EQUAL(ALPHA,0.D0))
ALPHA = CVMGT( 179.999D0, ALPHA, EQUAL(ALPHA,180.D0))
IF(ALPHA.GE.90.0.AND.X0.LE.0.0) GO TO 8881
GO TO 8882
8881 WRITE(6,8883)
8883 FORMAT(1X,'ERROR : IF ALPHA.GE.90. THEN IT MUST BE X0.LE.0.')
GO TO 8000
8882 CONTINUE
C SET CONSTANT DISTANCES
TT = XX(L)
INEL = 0
HLM = CVMGT( 0.D0, -.5D0*LM(1), INEL.EQ.0)
HLMT = CVMGT( TT, TT+.5D0*LM(L), INEL.EQ.0)
SU1 = PDMAX(1) + PDMAX(1)
SU2 = PDMAX(1)*(1.D0+KK0)
SUR = PDMAX(1)*(1.D0+KK0R)
SU = DMAX1(SUR,DMAX1(SU1,SU2))
SUT1 = TT + PDMAX(L) + PDMAX(L)
SUT2 = TT + PDMAX(L)*(1.D0+KK0)
SUTR = TT + PDMAX(L)*(1.D0+KK0R)
SUT = DMAX1(SUTR,DMAX1(SUT1,SUT2))
XC = CVMGT( X0, -SU, X0.GT.0.D0)
RT = TT-RD
IF(E0.GE.0.D0) GO TO 51
C
C=======================================================================
C INITIAL PROJECTILE BATCH
C=======================================================================
C SET CONSTANTS FOR MAXWELLIAN DISTRIBUTION
C
TI = -1.D0*E0
ZARG = DSQRT(TI/(M1*2.D0))
VELC = SHEATH/M1
C
C NUMBERS FOR VECTORIZED LOOPS
C
51 NUM = MIN( 64, NH)
IH = NUM
IH1 = NUM
C
C RANDOM START CONDITIONS
C
IY = IDINT(RI)
IY2 = IDINT(RI2)
IY3 = IDINT(RI3)
ISEED = IY
ISEED2 = IY2
ISEED3 = IY3
IF ( E0.GT.0.D0 ) GO TO 47
IF ( ALPHA.GE.0.D0 ) THEN
C MAXWELLIAN VELOCITY DISTRIBUTION
CALL VELOCV(FG,FFG,E,COSX,COSY,COSZ,SINE,NUM)
DO IV=1,NUM
EMX = EMX+E(IV)
ne = IDINT(DMIN1(5000.D0,e(iv)+1.D0))
C me(ne) is undefined here!
write (*,*) 'me=',me(ne)
me(ne) = me(ne)+1
ENDDO
GO TO 56
ELSE
CALL ENERGV(FE,E,COSX,COSY,COSZ,SINE,NUM)
DO IV=1,NUM
EMX = EMX+E(IV)
ENDDO
GO TO 56
ENDIF
47 CONTINUE
IF(EQUAL(Esig,0.D0)) THEN
C FIXED PROJECTILE ENERGY
DO IV=1,NUM
E(IV) = E0
ENDDO
ELSE
C GAUSSIAN ENERGY DISTRIBUTION
DO IV=1,NUM
5200 CALL ENERGGAUSS(ISEED2,Esig,Epar,E0)
tryE = tryE+1
IF(Epar.LE.0.0D0) THEN
negE = negE+1
GO TO 5200
ENDIF
E(IV)=Epar
ENDDO
ENDIF
SFE = DMIN1(SB(1),SB(L))
IF ( ALPHA.GE.0.D0 ) THEN
IF(EQUAL(ALPHASIG,0.D0))THEN
C
C FIXED PROJECTILE ANGLE
C
ALFA = ALPHA /BW
CALFA = DCOS(ALFA)
SALFA = DSIN(ALFA)
DO IV=1,NUM
COSX(IV) = CALFA
COSY(IV) = SALFA
COSZ(IV) = 0.D0
SINE(IV) = COSY(IV)
ENDDO
ELSE
C
C 1-D GAUSSIAN DISTRIBUTION OF ANGLE
C
DO IV=1,NUM
CALL ALPHAGAUSS(ISEED3,ALPHASIG,ALPHA,ALFA,ALPHApar,
& CALFA,SALFA,BW)
COSX(IV) = CALFA
COSY(IV) = SALFA
COSZ(IV) = 0.D0
SINE(IV) = COSY(IV)
ENDDO
ENDIF
ELSEIF (EQUAL(ALPHA,-2.D0)) THEN
C
C COSINE ANGLE DISTRIBUTION (THREE-DIMENSIONAL)
C
DO IV=1,NUM
call ranlux(ran2,2)
RPHI = PI2*DBLE(ran2(1))
RTHETA = DBLE(ran2(2))
COSX(IV) = DSQRT(RTHETA)
SINE(IV) = DSQRT(1.D0-RTHETA)
COSY(IV) = SINE(IV)*DCOS(RPHI)
COSZ(IV) = SINE(IV)*DSIN(RPHI)
ENDDO
ELSEIF (EQUAL(ALPHA,-1.D0).AND.X0.GT.0.D0) THEN
C
C RANDOM DISTRIBUTION
C
DO IV=1,NUM
call ranlux(ran2,2)
RPHI = PI2*DBLE(ran2(1))
RTHETA = DBLE(ran2(2))
COSX(IV) = 1.D0 -2.D0*RTHETA
SINE(IV) = DSQRT( 1.D0 -COSX(IV)*COSX(IV))
COSY(IV) = SINE(IV) *DSIN(RPHI)
COSZ(IV) = SINE(IV) *DCOS(RPHI)
ENDDO
ELSEIF (EQUAL(ALPHA,-1.D0).AND.X0.LE.0.D0) THEN
DO IV=1,NUM
call ranlux(ran2,2)
RPHI = PI2*DBLE(ran2(1))
RTHETA = DBLE(ran2(2))
COSX(IV) = 1.D0 -RTHETA
SINE(IV) = DSQRT( 1.D0 -COSX(IV)*COSX(IV))
COSY(IV) = SINE(IV) *DSIN(RPHI)
COSZ(IV) = SINE(IV) *DCOS(RPHI)
ENDDO
ENDIF
56 IF ( X0.GT.0.D0 ) GO TO 59
C
C EXTERNAL START
C
DO IV=1,NUM
SINA = SINE(IV)
COSX(IV) = DSQRT( ( E(IV)*COSX(IV)*COSX(IV)+ESB)/(E(IV)+ESB))
SINE(IV) = DSQRT( 1.D0 -COSX(IV)*COSX(IV))
COSY(IV) = COSY(IV) *SINE(IV) /SINA
COSZ(IV) = COSZ(IV) *SINE(IV) /SINA
E(IV) = E(IV) + ESB
ENDDO
C
C LOCUS OF FIRST COLLISION
C
59 JL = ISRCHFGT(L,XX(1),1,X0)
DO IV=1,NUM
call ranlux(random, 1)
RA = CVMGT(DBLE(random(1)),1.D0,X0.LE.0.0D0)
X(IV) = XC + LM(JL) *RA *COSX(IV)
Y(IV) = LM(JL) *RA *COSY(IV)
Z(IV) = LM(JL) *RA *COSZ(IV)
PL(IV) = CVMGT(0.D0,LM(JL)*RA,X0.LE.0.0)
LLL(IV) = JL
ENDDO
C
C=======================================================================
C PRIMARY PROJECTILE TRANSPORT LOOP
C=======================================================================
C PROJECTILE LOOP
C Each pass transports one projectile history. The state vectors
C X/Y/Z, E, direction cosines, current layer index, etc. are updated
C in-place until the particle stops, backscatters or transmits.
C
1 CONTINUE
NPROJ=NPROJ+1
DO IV=1,IH1
CX(IV)=COSX(IV)
CY(IV)=COSY(IV)
CZ(IV)=COSZ(IV)
SX(IV)=SINE(IV)
DEES(IV)=0.D0
DENS(IV)=0.D0
DEN(IV)=0.D0
ENDDO
KK1=KK0
C
C=======================================================================
C PROJECTILE COLLISION CALCULATION
C=======================================================================
C COLLISION LOOP (INCLUDES WEAK SIMULTANEOUS COLL. FOR KK1.LT.4)
C KK controls the treatment of weak simultaneous collisions.
C For every active projectile we choose a collision partner, sample an
C impact parameter, solve the scattering geometry for the selected
C interatomic potential and then update the projectile state.
C
DO 245 KK=KK1,0,-1
C
C CHOICE OF COLLISION PARTNERS
C
DO IV=1,IH1
call ranlux(random, 1)
JJJ(IV) = ISRCHFGE(NJ(LLL(IV)),COM(1,LLL(IV)),1,
& DBLE(random(1)))+JT(LLL(IV))
EPS(IV)=E(IV)*F1(JJJ(IV))
ENDDO
DO IV=1,IH1
C
C RANDOM AZIMUTHAL ANGLE AND IMPACT PARAMETER
C
call ranlux(ran2, 2)
PHIP=PI2*DBLE(ran2(1))
CPHI(IV)=DCOS(PHIP)
SPHI(IV)=DSIN(PHIP)
P(IV)=PDMAX(LLL(IV))*DSQRT(DBLE(ran2(2))+KK)
C
C POSITION OF TARGET ATOM
C
X1(IV)=X(IV)-P(IV)*CPHI(IV)*SX(IV)
P(IV)=CVMGT(1.D10,P(IV),X1(IV).LT.0.D0.OR.X1(IV).GT.TT)
B(IV)=P(IV)/A1(JJJ(IV))
ENDDO
CALL SCOPY(IH1,B,1,R,1)
IVMIN=1
IVMAX=IH1
C
C MAGIC (DETERMINATION OF SCATTERING ANGLE : KRYPTON-CARBON POT.)
C
IF(IPOT.NE.POT_KRC) GO TO 4101
C KRYPTON-CARBON POTENTIAL
104 DO IV=IVMIN,IVMAX
IF(R(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 104 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
R(IV)=0.00001D0
ENDIF
EX1(IV)=DEXP(-.278544D0*R(IV))
EX2(IV)=DEXP(-.637174D0*R(IV))
EX3(IV)=DEXP(-1.919249D0*R(IV))
RR1=1.D0/R(IV)
V(IV)=(.190945D0*EX1(IV)+.473674D0*EX2(IV)+.335381D0*EX3(IV))
& *RR1
FR=B(IV)*B(IV)*RR1+V(IV)*R(IV)/EPS(IV)-R(IV)
V1(IV)=-(V(IV)+.05318658408D0*EX1(IV)+.301812757276D0*EX2(IV)+
& .643679648869D0*EX3(IV))*RR1
FR1=-B(IV)*B(IV)*RR1*RR1+(V(IV)+V1(IV)*R(IV))/EPS(IV)-1.D0
Q=FR/FR1
R(IV)=R(IV)-Q
TEST(IV)=DABS(Q/R(IV)).GT.0.001D0
ENDDO
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 106
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 106
GO TO 104
106 DO IV=1,IH1
ROCINV=-0.5D0*V1(IV)/(EPS(IV)-V(IV))
SQE=DSQRT(DABS(EPS(IV)))
CC=(.235809D0+SQE)/(.126000D0+SQE)
AA=2.D0*EPS(IV)*(1.D0+(1.0144D0/SQE))*B(IV)**CC
FF=(DSQRT(AA*AA+1.)-AA)*((69350.D0+EPS(IV))/(83550.D0+EPS(IV)))
DELTA=(R(IV)-B(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(B(IV)+DELTA)+1.D0)/(ROCINV*R(IV)+1.D0)
C2(IV)=DMIN1(1.0D0,C*C)
S2(IV)=1.D0-(1.D0*C2(IV))
ENDDO
GO TO 4103
4101 IF(IPOT.NE.POT_MOLIERE) GO TO 4102
C MOLIERE POTENTIAL
C CALL MAGICMOL(C2(1),S2(1),B(1),R(1),EPS(1),IH1)
4104 DO IV=IVMIN,IVMAX
IF(R(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 4104 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
R(IV)=0.00001D0
ENDIF
EX1(IV)=DEXP(-.3D0*R(IV))
EX2(IV)=DEXP(-1.2D0*R(IV))
EX3(IV)=DEXP(-6.0D0*R(IV))
RR1=1.D0/R(IV)
V(IV)=(.35D0*EX1(IV)+.55D0*EX2(IV)+.10D0*EX3(IV))*RR1
FR=B(IV)*B(IV)*RR1+V(IV)*R(IV)/EPS(IV)-R(IV)
V1(IV)=-(V(IV)+.105D0*EX1(IV)+.66D0*EX2(IV)+.6D0*EX3(IV))*RR1
FR1=-B(IV)*B(IV)*RR1*RR1+(V(IV)+V1(IV)*R(IV))/EPS(IV)-1.D0
Q=FR/FR1
R(IV)=R(IV)-Q
TEST(IV)=DABS(Q/R(IV)).GT.0.001D0
ENDDO
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 4106
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 4106
GO TO 4104
4106 DO IV=1,IH1
ROCINV=-0.5D0*V1(IV)/(EPS(IV)-V(IV))
SQE=DSQRT(EPS(IV))
CC=(.009611D0+SQE)/(.005175D0+SQE)
AA=2.D0*EPS(IV)*(1.D0+(0.6743D0/SQE))*B(IV)**CC
FF=(DSQRT(AA*AA+1.D0)-AA)*((6.314D0+EPS(IV))/(10.D0+EPS(IV)))
DELTA=(R(IV)-B(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(B(IV)+DELTA)+1.D0)/(ROCINV*R(IV)+1.D0)
C2(IV)=DMIN1(1.0D0,C*C)
S2(IV)=1.D0-(1.D0*C2(IV))
ENDDO
GO TO 4103
4102 IF(IPOT.NE.POT_ZBL) GO TO 4103
C ZBL POTENTIAL
C CALL MAGICZBL(C2(1),S2(1),B(1),R(1),EPS(1),IH1)
5104 DO IV=IVMIN,IVMAX
IF(R(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 5104 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
R(IV)=0.00001D0
ENDIF
EX1(IV)=DEXP(-.20162D0*R(IV))
EX2(IV)=DEXP(-.4029D0*R(IV))
EX3(IV)=DEXP(-.94229D0*R(IV))
EX4(IV)=DEXP(-3.1998D0*R(IV))
RR1=1.D0/R(IV)
V(IV)=(.02817D0*EX1(IV)+.28022D0*EX2(IV)+.50986D0*EX3(IV)+
& .18175D0*EX4(IV))*RR1
FR=B(IV)*B(IV)*RR1+V(IV)*R(IV)/EPS(IV)-R(IV)
V1(IV)=-(V(IV)+.0056796354D0*EX1(IV)+.112900638D0*EX2(IV)+
& .4804359794D0*EX3(IV)+.58156365D0*EX4(IV))*RR1
FR1=-B(IV)*B(IV)*RR1*RR1+(V(IV)+V1(IV)*R(IV))/EPS(IV)-1.D0
Q=FR/FR1
R(IV)=R(IV)-Q
TEST(IV)=DABS(Q/R(IV)).GT.0.001D0
ENDDO
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 5106
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 5106
GO TO 5104
5106 DO IV=1,IH1
IF((EPS(IV)-V(IV)).EQ.0.D0)WRITE(99,'(A50)')' nach Label 5106 '
ROCINV=-0.5D0*V1(IV)/(EPS(IV)-V(IV))
SQE=DSQRT(EPS(IV))
CC=(.011615D0+SQE)/(.0071222D0+SQE)
AA=2.D0*EPS(IV)*(1.D0+(0.99229D0/SQE))*B(IV)**CC
FF=(DSQRT(AA*AA+1.D0)-AA)*((9.3066D0+EPS(IV))/(14.813D0+EPS(IV)
& ))
DELTA=(R(IV)-B(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(B(IV)+DELTA)+1.D0)/(ROCINV*R(IV)+1.D0)
C2(IV)=DMIN1(1.0D0,C*C)
S2(IV)=1.D0-(1.D0*C2(IV))
ENDDO
4103 CONTINUE
C
C END OF MAGIC
C
DO IV=1,IH1
DEN(IV)=EC1(JJJ(IV))*E(IV)*S2(IV)
IF(C2(IV).LT.1.D-10) THEN
WRITE(99,'(A50)')' C2 < 10^-10, C2,S2,DEN resettet '
C2(IV)=1.D-10
S2(IV)=1.D0-(1.D0*C2(IV))
DEN(IV)=EC1(JJJ(IV))*E(IV)*S2(IV)
ENDIF
TAU(IV)=CVMGT(P(IV)*DSQRT(DABS(S2(IV)/C2(IV))),0.D0,KK.EQ.0)
TAU(IV)=DMIN1(TAU(IV),LM(LLL(IV)))
CT(IV)=C2(IV)+C2(IV)-1.D0
ST(IV)=DSQRT(DABS(1.D0-CT(IV)*CT(IV)))
CU=CT(IV)+MU1(JJJ(IV))
CU=CVMGT(CU,1.0D-8,DABS(CU).GE.1.0D-8)
TA=ST(IV)/CU
TA2=1.D0/DSQRT(DABS(1.D0+TA*TA))
CPSI(IV)=CVMGT(TA2,-TA2,CU.GT.0.D0)
SPSI(IV)=DABS(TA)*TA2
DEEOR=CVMGT(KOR1(JJJ(IV))*DSQRT(DABS(E(IV)))*EX1(IV),0.D0,
& KDEE1.EQ.STOP_OR.OR.KDEE1.EQ.STOP_MIXED)
DENS(IV)=DENS(IV)+DEN(IV)
DEES(IV)=DEES(IV)+DEEOR
ENDDO
C
C DETERMINATION OF NEW FLIGHT DIRECTIONS
C
CALL DIRCOS(COSX(1),COSY(1),COSZ(1),SINE(1),CPSI(1),SPSI(1)
& ,CPHI(1),SPHI(1),IH1)
245 CONTINUE
C
C END OF COLLISION LOOP
C
C=======================================================================
C PROJECTILE ENERGY LOSS AND DAMAGE ACCUMULATION
C=======================================================================
C INELASTIC ENERGY LOSS( 5 POSSIBILITIES)
C
DO IV=1,IH1
ASIGT(IV)=(LM(LLL(IV))-TAU(IV)+TAUPSI(IV))*ARHO(LLL(IV))
TAUPSI(IV)=TAU(IV)*DABS(CPSI(IV))
ENDDO
C KDEE1 uses STOP_LS, STOP_OR, STOP_MIXED, STOP_ICRU49,
C and STOP_ZIEGLER in this order.
GO TO(15,16,17,18,19),KDEE1
15 DO IV=1,IH1
DEE(IV)=CVMGT(0.D0,KLM1(LLL(IV))*ASIGT(IV)*DSQRT(E(IV)),X(IV)
& .LT.HLM.OR.X(IV).GT.HLMT)
ENDDO
GO TO 40
16 DO IV=1,IH1
DEE(IV)=DEES(IV)
ENDDO
GO TO 40
17 DO IV=1,IH1
DEE(IV)=CVMGT(DEES(IV),0.5D0*(KLM1(LLL(IV))*ASIGT(IV)
& * DSQRT(E(IV))+DEES(IV)),X(IV).LT.HLM.OR.X(IV).GT.HLMT)
ENDDO
GO TO 40
18 DO IV=1,IH1
SM(IV)=0.D0
EM(IV)=E(IV)*0.001D0/M1
ENDDO
DO IV=1,IH1
DO J=1,NJ(LLL(IV))
SH(IV,J)=CVMGT(CH1(LLL(IV),J)*DSQRT(EM(IV)) ,CH2(LLL(IV),J)
& *EM(IV)**0.45D0*(CH3(LLL(IV),J)/EM(IV)) *DLOG(DABS(1.D0
& +(CH4(LLL(IV),J)/ EM(IV))+CH5(LLL(IV),J)*EM(IV)))
& /(CH2(LLL(IV),J)*EM(IV)**0.45D0+(CH3(LLL(IV),J)/EM(IV))
& *DLOG(DABS(1.D0+(CH4(LLL(IV),J)/ EM(IV))+CH5(LLL(IV),J)
& *EM(IV)))) ,EM(IV).LT.10.D0)
ENDDO
ENDDO
DO IV=1,IH1
DO J=1,NJ(LLL(IV))
SM(IV)=SM(IV)+SH(IV,J)*CO(LLL(IV),J)
ENDDO
ENDDO
DO IV=1,IH1
DEE(IV)=CVMGT(CHM1(LLL(IV))*DSQRT(EM(IV)),SM(IV),EM(IV).LE.10
& .D0)
ENDDO
DO IV=1,IH1
DEE(IV)=10.D0*ASIGT(IV)*CVMGT(0.D0,DEE(IV),X(IV).LT.HLM.OR
& .X(IV).GT.HLMT)
ENDDO
GO TO 40
19 FHE=CVMGT(1.3333D0,1.D0,M1.LT.4.00D0)
DO IV=1,IH1
SM(IV)=0.D0
EM(IV)=E(IV)*0.001D0*FHE
ENDDO
DO IV=1,IH1
DO J=1,NJ(LLL(IV))
SH(IV,J)=CH1(LLL(IV),J)*EM(IV)**CH2(LLL(IV),J)* (CH3(LLL(IV)
& ,J)/(EM(IV)*0.001D0)) *DLOG(DABS(1.D0+(CH4(LLL(IV),J)
& /(EM(IV)*0.001D0))+ CH5(LLL(IV),J)*EM(IV)*0.001D0))
& /(CH1(LLL(IV),J)*EM(IV)**CH2(LLL(IV),J)+ (CH3(LLL(IV),J
& )/(EM(IV)*0.001D0)) *DLOG(DABS(1.D0+(CH4(LLL(IV),J)
& /(EM(IV)*0.001D0))+ CH5(LLL(IV),J)*EM(IV)*0.001D0)))
ENDDO
ENDDO
DO IV=1,IH1
DO J=1,NJ(LLL(IV))
SM(IV)=SM(IV)+SH(IV,J)*CO(LLL(IV),J)
ENDDO
ENDDO
DO IV=1,IH1
DEE(IV)=10.D0*ASIGT(IV)* CVMGT(0.D0,SM(IV),X(IV).LT.HLM.OR.X(IV
& ).GT.HLMT)
ENDDO
40 CONTINUE
C
DO IV=1,IH1
DEL=DMAX1(1.0D-20,DENS(IV)+DEE(IV))
DENS(IV)=CVMGT(E(IV)*DENS(IV)/DEL,DENS(IV),DEL.GT.E(IV))
DEE(IV)=CVMGT(E(IV)*DEE(IV)/DEL,DEE(IV),DEL.GT.E(IV))
ENDDO
C
C INCREMENT OF DAMAGE, CASCADE AND PHONON ENERGY
C
DO 70 IV=1,IH1
I=MAX0(MIN0(IDINT(X1(IV)/CW+1.D0),100),1)
DENT(I)=DENT(I)+DENS(IV)
DMGN(I)=DMGN(I)+DEN(IV)
ION(I)=ION(I)+DEE(IV)
ELE(I,JJJ(IV))=ELE(I,JJJ(IV))+DEN(IV)
ELI(I,JJJ(IV))=ELI(I,JJJ(IV))+DEE(IV)
IF(DEN(IV).LE.DI(JJJ(IV))) GO TO 28
EPS(IV)=F1(JJJ(IV))*DEN(IV)
G=EPS(IV)+.40244D0*EPS(IV)**.75D0+3.4008D0*EPS(IV)**.16667D0
MOT=DEN(IV)/(1.D0+K2(LLL(IV))*G)
CASMOT(I)=CASMOT(I)+MOT
ELGD(I)=ELGD(I)+DEN(IV)
ELD(I,JJJ(IV))=ELD(I,JJJ(IV))+DEN(IV)
ICD(I,JJJ(IV))=ICD(I,JJJ(IV))+1
GO TO 70
28 PHON(I)=PHON(I)+DEN(IV)
ELP(I,JJJ(IV))=ELP(I,JJJ(IV))+DEN(IV)
70 CONTINUE
DO IV=1,IH1
ICDI=ICDI+IDINT(CVMGT(1.D0,0.D0,DEN(IV).GT.DI(JJJ(IV))))
ICSUMS=ICSUMS+IDINT(CVMGT(1.D0,0.D0,DEN(IV).GT.SB(1)))
ICSUM=ICSUM+IDINT(CVMGT(1.D0,0.D0,DENS(IV).GT.0.D0))
DEN2=DEN(IV)*DEN(IV)
DEN3=DEN2*DEN(IV)
EEL=EEL+DEN(IV)
EEL2=EEL2+DEN2
EEL3=EEL3+DEN3
EEL4=EEL4+DEN2*DEN2
EEL5=EEL5+DEN3*DEN2
EEL6=EEL6+DEN3*DEN3
DEE2=DEE(IV)*DEE(IV)
DEE3=DEE2*DEE(IV)
EIL=EIL+DEE(IV)
EIL2=EIL2+DEE2
EIL3=EIL3+DEE3
EIL4=EIL4+DEE2*DEE2
EIL5=EIL5+DEE3*DEE2
EIL6=EIL6+DEE3*DEE3
EPL=EPL+CVMGT(DEN(IV),0.D0,DEN(IV).LT.DI(JJJ(IV)))
EPL2=EPL2+CVMGT(DEN2,0.D0,DEN(IV).LT.DI(JJJ(IV)))
EPL3=EPL3+CVMGT(DEN3,0.D0,DEN(IV).LT.DI(JJJ(IV)))
EPL4=EPL4+CVMGT(DEN2*DEN2,0.D0,DEN(IV).LT.DI(JJJ(IV)))
EPL5=EPL5+CVMGT(DEN3*DEN2,0.D0,DEN(IV).LT.DI(JJJ(IV)))
EPL6=EPL6+CVMGT(DEN3*DEN3,0.D0,DEN(IV).LT.DI(JJJ(IV)))
ENUCL(IV)=ENUCL(IV)+DENS(IV)
EINEL(IV)=EINEL(IV)+DEE(IV)
ENDDO
IF(KK0.EQ.0) GO TO 89
DO IV=1,IH1
DEWC=DENS(IV)-DEN(IV)
DEWC2=DEWC*DEWC
DEWC3=DEWC2*DEWC
EELWC=EELWC+DEWC
EELWC2=EELWC2+DEWC2
EELWC3=EELWC3+DEWC3
EELWC4=EELWC4+DEWC2*DEWC2
EELWC5=EELWC5+DEWC3*DEWC2
EELWC6=EELWC6+DEWC3*DEWC3
ENDDO
89 CONTINUE
IF(IRL.EQ.IRL_OFF) GO TO 27
C
C=======================================================================
C RECOIL GENERATION AND TRANSPORT
C=======================================================================
C VECTORIZED RECOIL LOOP
C
C TARGET RECOIL ATOM SECTION
C
C PRIMARY KNOCK-ON ATOMS
C
DO 6 IV=1,IH1
IF(DEN(IV).LE.ERC) GO TO 6
IF(X1(IV).GT.RD.AND.X1(IV).LT.RT) GO TO 6
NREC1=NREC1+1
ER(NREC1,1)=DEN(IV)-EP(JJJ(IV))
XR(NREC1,1)=X1(IV)
YR(NREC1,1)=Y(IV)-P(IV)*(SPHI(IV)*CZ(IV)-CPHI(IV)*CY(IV)*CX(IV)
& )/SX(IV)
ZR(NREC1,1)=Z(IV)+P(IV)*(SPHI(IV)*CY(IV)+CPHI(IV)*CX(IV)*CZ(IV)
& )/SX(IV)
CSXR(NREC1,1)=CX(IV)
CSYR(NREC1,1)=CY(IV)
CSZR(NREC1,1)=CZ(IV)
SNXR(NREC1,1)=SX(IV)
CPHIR(NREC1,1)=-CPHI(IV)
SPHIR(NREC1,1)=-SPHI(IV)
CT(IV)=DMIN1(CT(IV),.99999999D0)
TAR=ST(IV)/(1.D0-CT(IV))
TAR2=1./DSQRT(1.D0+TAR*TAR)
CPSIR(NREC1,1)=TAR2
SPSIR(NREC1,1)=TAR*TAR2
TAUPSR(NREC1,1)=0.D0
JJR(NREC1,1)=JJJ(IV)
KO(NREC1,JJR(NREC1,1),1)=1
INOUT(NREC1,1)=SIGN(1.D0,CX(IV))
NPA=NPA+1
6 CONTINUE
C
IF(NREC1.LT.NUM) GO TO 27
C
C START PROCESSING THE TARGET RECOIL ATOMS
C
83 CONTINUE
C
CALL DIRCOS(CSXR(1,1),CSYR(1,1),CSZR(1,1),SNXR(1,1)
1 ,CPSIR(1,1),SPSIR(1,1),CPHIR(1,1),SPHIR(1,1),NREC1)
C
C MOVE TARGET RECOIL ATOMS TO LIST 2
DO IREC1=1,NREC1
IREC=IREC1+NREC2
ER(IREC,2)=ER(IREC1,1)
XR(IREC,2)=XR(IREC1,1)
YR(IREC,2)=YR(IREC1,1)
ZR(IREC,2)=ZR(IREC1,1)
CSXR(IREC,2)=CSXR(IREC1,1)
CSYR(IREC,2)=CSYR(IREC1,1)
CSZR(IREC,2)=CSZR(IREC1,1)
SNXR(IREC,2)=SNXR(IREC1,1)
TAUPSR(IREC,2)=TAUPSR(IREC1,1)
CPSIR(IREC,2)=CPSIR(IREC1,1)
JJR(IREC,2)=JJR(IREC1,1)
KO(IREC,JJR(IREC,2),2)=KO(IREC1,JJR(IREC1,1),1)
INOUT(IREC,2)=INOUT(IREC1,1)
ENDDO
C
NREC2=NREC2+NREC1
MAXA=MAX0(MAXA,NREC2)
NALL=NALL+NREC2
NREC1=0
IF(NREC2.GT.2000) GO TO 8885
GO TO 8886
8885 WRITE(6,8887)
8887 FORMAT(1X,'ERROR : DIMENSION IN THE RECOIL LOOP ',
& 'MUST BE INCREASED')
8886 CONTINUE
C
C PROCESS THE PARTICLES IN LIST 2
C
C FIND LAYER
C
DO IREC1=1,NREC2
LRR(IREC1,2)=MIN0(ISRCHFGT(L,XX(1),1,XR(IREC1,2)),L)
ENDDO
C
C MOVE PARTICLES
C
DO IREC1=1,NREC2
XR(IREC1,2)=XR(IREC1,2)+(LM(LRR(IREC1,2)) +TAUPSR(IREC1,2))
& *CSXR(IREC1,2)
YR(IREC1,2)=YR(IREC1,2)+(LM(LRR(IREC1,2)) +TAUPSR(IREC1,2))
& *CSYR(IREC1,2)
ZR(IREC1,2)=ZR(IREC1,2)+(LM(LRR(IREC1,2)) +TAUPSR(IREC1,2))
& *CSZR(IREC1,2)
CXR(IREC1)=CSXR(IREC1,2)
CYR(IREC1)=CSYR(IREC1,2)
CZR(IREC1)=CSZR(IREC1,2)
SXR(IREC1)=SNXR(IREC1,2)
DEERS(IREC1)=0.D0
TS(IREC1)=0.D0
ENDDO
KK2=KK0R
DO KKR=KK2,0,-1
C
C CHOICE OF COLLISION PARTNERS
C
DO IREC1=1,NREC2
call ranlux(random, 1)
JJR(IREC1,1) = ISRCHFGE(NJ(LRR(IREC1,2)),COM(1,LRR(IREC1,2))
& ,1,DBLE(random(1)))+JT(LRR(IREC1,2))
ENDDO
DO IREC1=1,NREC2
call ranlux(ran2, 2)
PHIPR=PI2*DBLE(ran2(1))
CPHIR(IREC1,2)=DCOS(PHIPR)
SPHIR(IREC1,2)=DSIN(PHIPR)
PR(IREC1)=PDMAX(LRR(IREC1,2))*DSQRT(DBLE(ran2(2))+KKR)
X2(IREC1)=XR(IREC1,2)-PR(IREC1)*CPHIR(IREC1,2)*SXR(IREC1)
PR(IREC1)=CVMGT(1.D10,PR(IREC1),X2(IREC1).LT.0.0D0 .OR
& .X2(IREC1).GT.TT)
BR(IREC1)=PR(IREC1)/A(JJR(IREC1,2),JJR(IREC1,1))
EPSR(IREC1)=F(JJR(IREC1,2),JJR(IREC1,1))*ER(IREC1,2)
ENDDO
CALL SCOPY(NREC2,BR,1,RR,1)
IVMIN=1
IVMAX=NREC2
C
C MAGIC (DETERMINATION OF SCATTERING ANGLE : KRYPTON-CARBON POT.)
C
IF(IPOTR.NE.POT_KRC) GO TO 4201
C KR-C POTENTIAL
C CALL MAGICKRC(C2R(1),S2R(1),BR(1),RR(1),EPSR(1),NREC2)
205 DO IV=IVMIN,IVMAX
IF(RR(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 205 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
RR(IV)=0.00001D0
ENDIF
EX1R(IV)=DEXP(-.278544D0*RR(IV))
EX2R(IV)=DEXP(-.637174D0*RR(IV))
EX3R(IV)=DEXP(-1.919249D0*RR(IV))
RRR1=1./RR(IV)
VR(IV)=(.190945D0*EX1R(IV)+.473674D0*EX2R(IV)+.335381D0
& *EX3R(IV))*RRR1
FR=BR(IV)*BR(IV)*RRR1+VR(IV)*RR(IV)/EPSR(IV)-RR(IV)
V1R(IV)=-(VR(IV)+.053186584080D0*EX1R(IV)+.301812757276D0
& *EX2R(IV)+.643679648869D0*EX3R(IV))*RRR1
FR1=-BR(IV)*BR(IV)*RRR1*RRR1+(VR(IV)+V1R(IV)*RR(IV))/EPSR(IV
& )-1.D0
Q=FR/FR1
RR(IV)=RR(IV)-Q
TEST1(IV)=DABS(Q/RR(IV)).GT.0.001D0
ENDDO
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 207
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 207
GO TO 205
207 DO IV=1,NREC2
ROCINV=-.5D0*V1R(IV)/(EPSR(IV)-VR(IV))
SQE=DSQRT(EPSR(IV))
CC=(.235800D0+SQE)/(.126000D0+SQE)
AA=2.D0*EPSR(IV)*(1.D0+(1.0144D0/SQE))*BR(IV)**CC
FF=(DSQRT(AA*AA+1.D0)-AA)*((69350.D0+EPSR(IV)) /(83550.D0
& +EPSR(IV)))
DELTA=(RR(IV)-BR(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(BR(IV)+DELTA)+1.D0)/(ROCINV*RR(IV)+1.D0)
C2R(IV)=DMIN1(1.0D0,C*C)
S2R(IV)=1.D0-C2R(IV)
ENDDO
GO TO 4203
4201 IF(IPOTR.NE.POT_MOLIERE) GO TO 4202
C MOLIERE POTENTIAL
C CALL MAGICMOL(C2R(1),S2R(1),BR(1),RR(1),EPSR(1),NREC2)
4205 DO IV=IVMIN,IVMAX
IF(RR(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 4205 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
RR(IV)=0.00001D0
ENDIF
EX1R(IV)=DEXP(-.3D0*RR(IV))
EX2R(IV)=DEXP(-1.2D0*RR(IV))
EX3R(IV)=DEXP(-6.0D0*RR(IV))
RRR1=1.D0/RR(IV)
VR(IV)=(.35D0*EX1R(IV)+.55D0*EX2R(IV)+.10D0*EX3R(IV))*RRR1
FR=BR(IV)*BR(IV)*RRR1+VR(IV)*RR(IV)/EPSR(IV)-RR(IV)
V1R(IV)=-(VR(IV)+.105D0*EX1R(IV)+ .66D0*EX2R(IV)+.6D0
& *EX3R(IV))*RRR1
FR1=-BR(IV)*BR(IV)*RRR1*RRR1+(VR(IV)+V1R(IV)*RR(IV))/
& EPSR(IV)-1.D0
Q=FR/FR1
RR(IV)=RR(IV)-Q
TEST1(IV)=DABS(Q/RR(IV)).GT.0.001D0
ENDDO
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 4207
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 4207
GO TO 4205
4207 DO IV=1,NREC2
ROCINV=-.5D0*V1R(IV)/(EPSR(IV)-VR(IV))
SQE=DSQRT(EPSR(IV))
CC=(.009611D0+SQE)/(.005175D0+SQE)
AA=2.D0*EPSR(IV)*(1.D0+(0.6743D0/SQE))*BR(IV)**CC
FF=(DSQRT(AA*AA+1.D0)-AA)*((6.314D0+EPSR(IV))/(10.+EPSR(IV))
& )
DELTA=(RR(IV)-BR(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(BR(IV)+DELTA)+1.D0)/(ROCINV*RR(IV)+1.D0)
C2R(IV)=DMIN1(1.0D0,C*C)
S2R(IV)=1.D0-C2R(IV)
ENDDO
GO TO 4203
4202 IF(IPOTR.NE.POT_ZBL) GO TO 4203
C ZBL POTENTIAL
C CALL MAGICZBL(C2R(1),S2R(1),BR(1),RR(1),EPSR(1),NREC2)
5205 DO 5206 IV=IVMIN,IVMAX
IF(RR(IV).LT.1.D-20)THEN
WRITE(99,'(A70)'
& )'in DO 5205 R(IV)<1.D-20 -> 0.00001D0 gesetzt'
RR(IV)=0.00001D0
ENDIF
EX1R(IV)=DEXP(-.20162D0*RR(IV))
EX2R(IV)=DEXP(-.40290D0*RR(IV))
EX3R(IV)=DEXP(-.94229D0*RR(IV))
EX4R(IV)=DEXP(-3.1998D0*RR(IV))
RRR1=1./RR(IV)
VR(IV)=(.02817D0*EX1R(IV)+.28022D0*EX2R(IV)+.50986D0*EX3R(IV
& )+.18175D0*EX4R(IV))*RRR1
FR=BR(IV)*BR(IV)*RRR1+VR(IV)*RR(IV)/EPSR(IV)-RR(IV)
V1R(IV)=-(VR(IV)+.0056796354D0*EX1R(IV)+.112900638D0*EX2R(IV
& )+.4804359794D0*EX3R(IV)+.581563650D0*EX4R(IV))*RRR1
FR1=-BR(IV)*BR(IV)*RRR1*RRR1+(VR(IV)+V1R(IV)*RR(IV))/
& EPSR(IV)-1.D0
Q=FR/FR1
RR(IV)=RR(IV)-Q
TEST1(IV)=DABS(Q/RR(IV)).GT.0.001D0
5206 CONTINUE
C GET MAX AND MIN INDEX OF TEST FAILURES
IVMIN=IVMIN+ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),1)
IF(IVMIN.GT.IVMAX) GO TO 5207
IVMAX=IVMAX-ILLZ(IVMAX-IVMIN+1,TEST1(IVMIN),-1)
IF(IVMIN.GT.IVMAX) GO TO 5207
GO TO 5205
5207 DO IV=1,NREC2
ROCINV=-.5D0*V1R(IV)/(EPSR(IV)-VR(IV))
SQE=DSQRT(EPSR(IV))
CC=(.011615D0+SQE)/(.0071222D0+SQE)
AA=2.*EPSR(IV)*(1.D0+(0.99229D0/SQE))*BR(IV)**CC
FF=(DSQRT(AA*AA+1.D0)-AA)*((9.3066D0+EPSR(IV)) /(14.813D0
& +EPSR(IV)))
DELTA=(RR(IV)-BR(IV))*AA*FF/(FF+1.D0)
C=(ROCINV*(BR(IV)+DELTA)+1.D0)/(ROCINV*RR(IV)+1.D0)
C2R(IV)=DMIN1(1.0D0,C*C)
S2R(IV)=1.D0-C2R(IV)
ENDDO
4203 CONTINUE
C
DO IREC1=1,NREC2
T(IREC1)=ER(IREC1,2)*S2R(IREC1)*EC(JJR(IREC1,2),JJR(IREC1,1)
& )
TS(IREC1)=TS(IREC1)+T(IREC1)
T1=CVMGT(T(IREC1),0.D0,KKR.EQ.3)
TR1=TR1+T1
DEEORR=CVMGT(0.D0,KOR(JJR(IREC1,2),JJR(IREC1,1))
& * DSQRT(ER(IREC1,2))*EX1R(IREC1),KDEE2.EQ.STOP_LS)
DEERS(IREC1)=DEERS(IREC1)+DEEORR
TAUR(IREC1)=CVMGT(PR(IREC1)*DSQRT(S2R(IREC1)/C2R(IREC1)),0
& .D0,KKR.EQ.0)
TAUR(IREC1)=DMIN1(TAUR(IREC1),LM(LRR(IREC1,2)))
CTR(IREC1)=C2R(IREC1)+C2R(IREC1)-1.D0
STR(IREC1)=DSQRT(1.D0-CTR(IREC1)*CTR(IREC1))
CUR(IREC1) = CTR(IREC1)+MU(JJR(IREC1,2),JJR(IREC1,1))
CUR(IREC1) = CVMGT(CUR(IREC1),1.0D-8,DABS(CUR(IREC1)).GE.1
& .0D-8)
TAR=STR(IREC1)/CUR(IREC1)
TAR2=1./DSQRT(1.D0+TAR*TAR)
CPSIR(IREC1,2)=TAR2
SPSIR(IREC1,2)=TAR*TAR2
ENDDO
CALL DIRCOS(CSXR(1,2),CSYR(1,2),CSZR(1,2),SNXR(1,2), CPSIR(1,2)
& ,SPSIR(1,2),CPHIR(1,2),SPHIR(1,2),NREC2)
ENDDO
C
C CREATE SECONDARY KNOCK-ON ATOMS
C
DO 246 IREC1=1,NREC2
IF(T(IREC1).LE.ERC) GO TO 246
IF(X2(IREC1).GT.RD.AND.X2(IREC1).LT.RT) GO TO 246
NREC1=NREC1+1
ER(NREC1,1)=T(IREC1)-EP(JJR(IREC1,1))
XR(NREC1,1)=X2(IREC1)
YR(NREC1,1)=YR(IREC1,2)-PR(IREC1)*(SPHIR(IREC1,2)*CZR(IREC1)-
& CPHIR(IREC1,2)*CYR(IREC1)*CXR(IREC1))/SXR(IREC1)
ZR(NREC1,1)=ZR(IREC1,2)+PR(IREC1)*(SPHIR(IREC1,2)*CYR(IREC1)+
& CPHIR(IREC1,2)*CXR(IREC1)*CZR(IREC1))/SXR(IREC1)
CSXR(NREC1,1)=CXR(IREC1)
CSYR(NREC1,1)=CYR(IREC1)
CSZR(NREC1,1)=CZR(IREC1)
SNXR(NREC1,1)=SXR(IREC1)
CPHIR(NREC1,1)=-CPHIR(IREC1,2)
SPHIR(NREC1,1)=-SPHIR(IREC1,2)
CTR(NREC1)=DMIN1(CTR(IREC1),.99999999D0)
TAR=STR(IREC1)/(1.D0-CTR(NREC1))
TAR2=1./DSQRT(1.D0+TAR*TAR)
CPSIR(NREC1,1)=TAR2
SPSIR(NREC1,1)=TAR*TAR2
TAUPSR(NREC1,1)=0.D0
KO(NREC1,JJR(IREC1,1),1)=0
INOUT(NREC1,1)=INOUT(IREC1,2)
JJR(NREC1,1)=JJR(IREC1,1)
NSA=NSA+1
246 CONTINUE
C
C INELASTIC ENERGY LOSS
C
DO IREC1=1,NREC2
ASIGTR(IREC1)=(LM(LRR(IREC1,2))-TAUR(IREC1)+ TAUPSR(IREC1,2))
& *ARHO(LRR(IREC1,2))
TAUPSR(IREC1,2)=TAUR(IREC1)*DABS(CPSIR(IREC1,2))
ENDDO
C KDEE2 uses STOP_LS, STOP_OR, and STOP_MIXED in this order.
GO TO(115,116,117),KDEE2
115 DO IREC1=1,NREC2
DEER(IREC1)=CVMGT(0.D0,KLM(LRR(IREC1,2), JJR(IREC1,2))
& *ASIGTR(IREC1)*DSQRT(ER(IREC1,2)), XR(IREC1,2).LT.HLM.OR
& .XR(IREC1,2).GT.HLMT)
ENDDO
GO TO 242
116 DO IREC1=1,NREC2
DEER(IREC1)=DEERS(IREC1)
ENDDO
GO TO 242
117 DO IREC1=1,NREC2
DEER(IREC1)=CVMGT(DEERS(IREC1),.5*(KLM(LRR(IREC1,2),JJR(IREC1,2
& ))*ASIGTR(IREC1)*DSQRT(ER(IREC1,2))+DEERS(IREC1)),XR(IREC1
& ,2).LT.HLM.OR.XR(IREC1,2).GT.HLMT)
ENDDO
242 CONTINUE
C
DO IREC1=1,NREC2
DELR=DMAX1(1.0D-20,TS(IREC1)+DEER(IREC1))
TS(IREC1)=CVMGT(ER(IREC1,2)*TS(IREC1)/DELR,TS(IREC1) ,DELR.GT
& .ER(IREC1,2))
DEER(IREC1)=CVMGT(ER(IREC1,2)*DEER(IREC1)/DELR,DEER(IREC1)
& ,DELR.GT.ER(IREC1,2))
ENDDO
DO 252 IREC1=1,NREC2
I=MAX0(MIN0(IDINT(X2(IREC1)/CW+1.D0),100),1)
DENTR(I)=DENTR(I)+TS(IREC1)
DMGNR(I)=DMGNR(I)+T(IREC1)
IONR(I)=IONR(I)+DEER(IREC1)
IF(T(IREC1).LE.DI(JJR(IREC1,1))) GO TO 84
ELGDR(I)=ELGDR(I)+T(IREC1)
ICDR(I,JJR(IREC1,2))=ICDR(I,JJR(IREC1,2))+1
ICDIRI(I,JJR(IREC1,2),JJR(IREC1,1))= ICDIRI(I,JJR(IREC1,2)
& ,JJR(IREC1,1))+1
GO TO 252
84 PHONR(I)=PHONR(I)+T(IREC1)
252 CONTINUE
DO IREC1=1,NREC2
ICDIR=ICDIR+IDINT(CVMGT(1.D0,0.D0,T(IREC1).GT.DI(JJR(IREC1,1)))
& )
ICSBR=ICSBR+IDINT(CVMGT(1.D0,0.D0,T(IREC1).GT.SB(1)))
ICSUMR=ICSUMR+IDINT(CVMGT(1.D0,0.D0,TS(IREC1).GT.0.D0))
ICDIRJ(JJR(IREC1,2),JJR(IREC1,1))= ICDIRJ(JJR(IREC1,2)
& ,JJR(IREC1,1)) +IDINT(CVMGT(1.D0,0.D0,T(IREC1).GT
& .DI(JJR(IREC1,1))))
TEL=TEL+TS(IREC1)
TR=TR+T(IREC1)
EI=EI+DEER(IREC1)
ER(IREC1,2)=ER(IREC1,2)-DEER(IREC1)-TS(IREC1)+1.0D-10
XR(IREC1,2)=XR(IREC1,2)-TAUR(IREC1)*CXR(IREC1)
YR(IREC1,2)=YR(IREC1,2)-TAUR(IREC1)*CYR(IREC1)
ZR(IREC1,2)=ZR(IREC1,2)-TAUR(IREC1)*CZR(IREC1)
TESTR(IREC1)=ER(IREC1,2).LE.SFE.OR.XR(IREC1,2).LT.(-SU) .OR
& .XR(IREC1,2).GT.SUT .OR.(XR(IREC1,2).GT.RD.AND.XR(IREC1,2)
& .LT.RT)
ENDDO
C
C CHECK TO SEE IF ANY RECOIL ATOM IS SPUTTERED OR
C IF THE ENERGY OF ANY RECOIL ATOM IS TOO LOW
C
IVMIN=1+ILLZ(NREC2,TESTR,1)
IF(IVMIN.GT.NREC2) GO TO 247
IVMAX=NREC2-ILLZ(NREC2,TESTR,-1)
C
DO 248 IREC1=IVMIN,IVMAX
249 IF(IREC1.GT.NREC2) GO TO 247
IF(XR(IREC1,2).LT.(-SU)) GO TO 251
IF(XR(IREC1,2).GT.SUT) GO TO 250
IF(ER(IREC1,2).LE.ERC) GO TO 255
IF(XR(IREC1,2).GT.RD.AND.XR(IREC1,2).LT.RT) GO TO 255
GO TO 248
251 ENOR=ER(IREC1,2)*CXR(IREC1)*CXR(IREC1)
IF(ENOR.GT.SB(1)) GO TO 254
C
C RECOIL ATOM IS REFLECTED BACK INTO THE SOLID BY THE
C POTENTIAL BARRIER
C
XR(IREC1,2)=-1.D0*SU
CSXR(IREC1,2)=-1.D0*CSXR(IREC1,2)
KIS=KIS+1
GO TO 248
C
C RECOIL ATOM IS SPUTTERED (BACKWARD)
C
254 ESP=ER(IREC1,2)-SB(1)
CC254 ESP=ER(IREC1,2)-SB(LRR(IREC1,2))
C
C NUMBER, ENERGY AND MOMENTS OF ALL SPUTTERED PARTICLES
C
IBSP(JJR(IREC1,2))=IBSP(JJR(IREC1,2))+1
EBSP(JJR(IREC1,2))=EBSP(JJR(IREC1,2))+ESP
SPE2=ESP*ESP
SPE3=SPE2*ESP
SPE2S(JJR(IREC1,2))=SPE2S(JJR(IREC1,2))+SPE2
SPE3S(JJR(IREC1,2))=SPE3S(JJR(IREC1,2))+SPE3
SPE4S(JJR(IREC1,2))=SPE4S(JJR(IREC1,2))+SPE2*SPE2
SPE5S(JJR(IREC1,2))=SPE5S(JJR(IREC1,2))+SPE3*SPE2
SPE6S(JJR(IREC1,2))=SPE6S(JJR(IREC1,2))+SPE3*SPE3
IF(ESP.LT.0.1) GO TO 256
IBSPL(JJR(IREC1,2))=IBSPL(JJR(IREC1,2))+1
SPE1SL(JJR(IREC1,2))=SPE1SL(JJR(IREC1,2))+DLOG10(DABS(ESP))
SPE2L=(DLOG10(DABS(ESP)))**2.D0
SPE3L=SPE2L*DLOG10(DABS(ESP))
SPE2SL(JJR(IREC1,2))=SPE2SL(JJR(IREC1,2))+SPE2L
SPE3SL(JJR(IREC1,2))=SPE3SL(JJR(IREC1,2))+SPE3L
SPE4SL(JJR(IREC1,2))=SPE4SL(JJR(IREC1,2))+SPE2L*SPE2L
SPE5SL(JJR(IREC1,2))=SPE5SL(JJR(IREC1,2))+SPE3L*SPE2L
SPE6SL(JJR(IREC1,2))=SPE6SL(JJR(IREC1,2))+SPE3L*SPE3L
256 CONTINUE
C
C SURFACE REFRACTION
C
EXIR=DSQRT((ENOR-SB(1))/ESP)
IF ( EXIR .GE. 1.D0 ) EXIR = .999999D0
C
C TOTAL ANGULAR DISTRIBUTIONS
C
IAG=IDINT(EXIR*20.D0+1.D0)
KADS(IAG)=KADS(IAG)+1
KADSJ(IAG,JJR(IREC1,2))=KADSJ(IAG,JJR(IREC1,2))+1
C
C 4 GROUPS:ION IN , PKA ;ION IN , SKA ;ION OUT, PKA ;ION OUT, SKA
C
KOI=KO(IREC1,JJR(IREC1,2),2)
IF(INOUT(IREC1,2).EQ.-1) GO TO 61
IF(KOI.EQ.0) GO TO 62
ISPIP(JJR(IREC1,2))=ISPIP(JJR(IREC1,2))+1
ESPIP(JJR(IREC1,2))=ESPIP(JJR(IREC1,2))+ESP
KADRIP(IAG,JJR(IREC1,2))=KADRIP(IAG,JJR(IREC1,2))+1
GO TO 164
62 ISPIS(JJR(IREC1,2))=ISPIS(JJR(IREC1,2))+1
ESPIS(JJR(IREC1,2))=ESPIS(JJR(IREC1,2))+ESP
KADRIS(IAG,JJR(IREC1,2))=KADRIS(IAG,JJR(IREC1,2))+1
GO TO 164
61 IF(KOI.EQ.0) GO TO 163
ISPOP(JJR(IREC1,2))=ISPOP(JJR(IREC1,2))+1
ESPOP(JJR(IREC1,2))=ESPOP(JJR(IREC1,2))+ESP
KADROP(IAG,JJR(IREC1,2))=KADROP(IAG,JJR(IREC1,2))+1
GO TO 164
163 ISPOS(JJR(IREC1,2))=ISPOS(JJR(IREC1,2))+1
ESPOS(JJR(IREC1,2))=ESPOS(JJR(IREC1,2))+ESP
KADROS(IAG,JJR(IREC1,2))=KADROS(IAG,JJR(IREC1,2))+1
164 CONTINUE
C
C OUTPUT MATRICES OF BACKWARD SPUTTERED ATOMS
C
IF(JJR(IREC1,2).GT.JT(3)) GO TO 255
IESP = IDINT(ESP*E0DE+2.0D0)
IESP = MIN0(101,IESP)
IESLOG=2
IF(ESP.LE.0.1D0) GO TO 75
IESLOG=IDINT(12.D0*DLOG10(DABS(10.D0*ESP))+3.D0)
IESLOG=MIN0(IESLOG,75)
75 CONTINUE
IF(EXIR.GT.1.0D0)WRITE(99,'(A50)')' EXIR nach Label 75'
IA=IDINT(DAW*DACOS(EXIR)+2.D0)
IAGS = IAG+1
IG=2
SXR(IREC1)=DMAX1(SXR(IREC1),1.0D-12)
U=CYR(IREC1)/SXR(IREC1)
IF(DABS(U).GT.1.D0) U = SIGN(1.D0,U)
IF(U.GT.1.0D0)WRITE(99,'(A50)')' U vor Label 182 CON..'
ACS=DACOS(U)
IG=IDINT(DGW*ACS+2.D0)
IGG=IDINT(DGIK*ACS+1.D0)
IGG=MAX0(MIN0(NGIK,IGG),1)
MAGS(IG,IAGS,JJR(IREC1,2))=MAGS(IG,IAGS,JJR(IREC1,2))+1
MAGS(IG,22,JJR(IREC1,2))=MAGS(IG,22,JJR(IREC1,2))+1
MAGS(NG,IAGS,JJR(IREC1,2))=MAGS(NG,IAGS,JJR(IREC1,2))+1
MAGS(NG,22,JJR(IREC1,2))=MAGS(NG,22,JJR(IREC1,2))+1
MEAS(IESP,IAGS,JJR(IREC1,2))=MEAS(IESP,IAGS,JJR(IREC1,2))+1
MEAS(102,IAGS,JJR(IREC1,2))=MEAS(102,IAGS,JJR(IREC1,2))+1
MEAS(IESP,22,JJR(IREC1,2))=MEAS(IESP,22,JJR(IREC1,2))+1
MEAS(102,22,JJR(IREC1,2))=MEAS(102,22,JJR(IREC1,2))+1
MEASL(IESLOG,IAG,JJR(IREC1,2))=MEASL(IESLOG,IAG,JJR(IREC1,2))+1
MEASL(IESLOG,21,JJR(IREC1,2))=MEASL(IESLOG,21,JJR(IREC1,2))+1
MEASL(75,IAG,JJR(IREC1,2))=MEASL(75,IAG,JJR(IREC1,2))+1
MEASL(75,21,JJR(IREC1,2))=MEASL(75,21,JJR(IREC1,2))+1
IF(ALPHA.LT.1.0) GO TO 181
MEAGS(IESP,IGG,IAGS,JJR(IREC1,2)) = MEAGS(IESP,IGG,IAGS
& ,JJR(IREC1,2))+1
MEAGS(102,IGG,IAGS,JJR(IREC1,2)) = MEAGS(102,IGG,IAGS
& ,JJR(IREC1,2))+1
MEAGS(IESP,IGG,22,JJR(IREC1,2)) = MEAGS(IESP,IGG,22,JJR(IREC1
& ,2))+1
MEAGS(102,IGG,22,JJR(IREC1,2)) = MEAGS(102,IGG,22,JJR(IREC1
& ,2))+1
MAGSA(IG,IA,JJR(IREC1,2)) = MAGSA(IG,IA,JJR(IREC1,2))+1
MAGSA(IG,32,JJR(IREC1,2)) = MAGSA(IG,32,JJR(IREC1,2))+1
MAGSA(NG,IA,JJR(IREC1,2)) = MAGSA(NG,IA,JJR(IREC1,2))+1
MAGSA(NG,32,JJR(IREC1,2)) = MAGSA(NG,32,JJR(IREC1,2))+1
181 CONTINUE
GO TO 255
C
250 ENORT=ER(IREC1,2)*CXR(IREC1)*CXR(IREC1)
IF(ENORT.GT.SB(L)) GO TO 257
C
C RECOIL ATOM IS REFLECTED BACK INTO THE SOLID BY THE
C POTENTIAL BARRIER
C
XR(IREC1,2)=SUT
CSXR(IREC1,2)=-1.D0*CSXR(IREC1,2)
KIST=KIST+1
GO TO 248
C
C RECOIL ATOM IS SPUTTERED (TRANSMISSION)
C
257 ESPT=ER(IREC1,2)-SB(L)
C
C NUMBER AND ENERGY OF ALL SPUTTERED PARTICLES
C
ITSP(JJR(IREC1,2))=ITSP(JJR(IREC1,2))+1
ETSP(JJR(IREC1,2))=ETSP(JJR(IREC1,2))+ESPT
C
C SURFACE REFRACTION
C
EXIRT=DSQRT((ENORT-SB(L))/ESPT)
IF ( EXIRT .GE. 1.D0 ) EXIRT = .999999D0
C
C TOTAL ANGULAR DISTRIBUTIONS
C
IAG=IDINT(EXIRT*20.D0+1.D0)
KADST(IAG)=KADST(IAG)+1
KDSTJ(IAG,JJR(IREC1,2))=KDSTJ(IAG,JJR(IREC1,2))+1
C BUGFIX: transmission-sputter matrices below use IG.
C Compute it here instead of reusing a stale value.
IG=2
SXR(IREC1)=DMAX1(SXR(IREC1),1.0D-12)
U=CYR(IREC1)/SXR(IREC1)
IF(DABS(U).GT.1.D0) U = SIGN(1.D0,U)
ACS=DACOS(U)
IG=IDINT(DGW*ACS+2.D0)
C
C 4 GROUPS:ION IN , PKA ;ION IN , SKA ;ION OUT, PKA ;ION OUT, SKA
C
KOI=KO(IREC1,JJR(IREC1,2),2)
IF(INOUT(IREC1,2).EQ.-1) GO TO 85
IF(KOI.EQ.0) GO TO 86
ISPIPT(JJR(IREC1,2))=ISPIPT(JJR(IREC1,2))+1
ESPIPT(JJR(IREC1,2))=ESPIPT(JJR(IREC1,2))+ESPT
GO TO 88
86 ISPIST(JJR(IREC1,2))=ISPIST(JJR(IREC1,2))+1
ESPIST(JJR(IREC1,2))=ESPIST(JJR(IREC1,2))+ESPT
GO TO 88
85 IF(KOI.EQ.0) GO TO 87
ISPOPT(JJR(IREC1,2))=ISPOPT(JJR(IREC1,2))+1
ESPOPT(JJR(IREC1,2))=ESPOPT(JJR(IREC1,2))+ESPT
GO TO 88
87 ISPOST(JJR(IREC1,2))=ISPOST(JJR(IREC1,2))+1
ESPOST(JJR(IREC1,2))=ESPOST(JJR(IREC1,2))+ESPT
88 CONTINUE
C
C OUTPUT MATRICES OF FORWARD SPUTTERED ATOMS
C
JRT=JJR(IREC1,2)
IF(L.EQ.3) JRT=JJR(IREC1,2)-NJ(1)
IF(JRT.LT.1) GO TO 255
IESPT = IDINT(ESPT*E0DE+2.0D0)
IESPT = MIN0(101,IESPT)
IESLOG=2
IF(ESPT.LE.0.1D0) GO TO 76
IESLOG=IDINT(12.D0*DLOG10(DABS(10.D0*ESPT))+3.D0)
IESLOG=MIN0(IESLOG,75)
76 CONTINUE
IAGS = IAG+1
MAGST(IG,IAGS,JRT) = MAGST(IG,IAGS,JRT)+1
MAGST(IG,22,JRT) = MAGST(IG,22,JRT)+1
MAGST(NG,IAGS,JRT) = MAGST(NG,IAGS,JRT)+1
MAGST(NG,22,JRT) = MAGST(NG,22,JRT)+1
MEAST(IESPT,IAGS,JRT) = MEAST(IESPT,IAGS,JRT)+1
MEAST(102,IAGS,JRT) = MEAST(102,IAGS,JRT)+1
MEAST(IESPT,22,JRT) = MEAST(IESPT,22,JRT)+1
MEAST(102,22,JRT) = MEAST(102,22,JRT)+1
MEASTL(IESLOG,IAG,JRT) = MEASTL(IESLOG,IAG,JRT)+1
MEASTL(IESLOG,21,JRT) = MEASTL(IESLOG,21,JRT)+1
MEASTL(75,IAG,JRT) = MEASTL(75,IAG,JRT)+1
MEASTL(75,21,JRT) = MEASTL(75,21,JRT)+1
C
C REARRANGEMENT OF PARTICLES IN LIST 2
C
255 ER(IREC1,2)=ER(NREC2,2)
XR(IREC1,2)=XR(NREC2,2)
YR(IREC1,2)=YR(NREC2,2)
ZR(IREC1,2)=ZR(NREC2,2)
CSXR(IREC1,2)=CSXR(NREC2,2)
CSYR(IREC1,2)=CSYR(NREC2,2)
CSZR(IREC1,2)=CSZR(NREC2,2)
SNXR(IREC1,2)=SNXR(NREC2,2)
CPHIR(IREC1,2)=CPHIR(NREC2,2)
SPHIR(IREC1,2)=SPHIR(NREC2,2)
CPSIR(IREC1,2)=CPSIR(NREC2,2)
SPSIR(IREC1,2)=SPSIR(NREC2,2)
TAUPSR(IREC1,2)=TAUPSR(NREC2,2)
JJR(IREC1,2)=JJR(NREC2,2)
KO(IREC1,JJR(IREC1,2),2)=KO(NREC2,JJR(NREC2,2),2)
INOUT(IREC1,2)=INOUT(NREC2,2)
NREC2=NREC2-1
C
IF(IREC1.EQ.NREC2+1) GO TO 247
C THE NREC2 PARTICLE FAILS THE TEST
IF(NREC2+1.GT.IVMAX) GO TO 248
GO TO 249
248 CONTINUE
247 CONTINUE
IF(NREC1+NREC2.EQ.0) GO TO 27
IF(NREC2.GE.NUM.OR.IH1.EQ.0) GO TO 83
C
C END OF RECOIL ATOM SECTION
C
27 CONTINUE
IF(IH1.EQ.0.AND.IH.EQ.NH) GO TO 140
C
C=======================================================================
C PROJECTILE STOP, BACKSCATTER AND TRANSMISSION TESTS
C=======================================================================
C PROJECTILE CANDIDATE FOR REFLECTION
C
DO IV=1,IH1
E(IV)=E(IV)-DEE(IV)-DENS(IV)+1.0D-10
X(IV)=X(IV)-TAU(IV)*CX(IV)
Y(IV)=Y(IV)-TAU(IV)*CY(IV)
Z(IV)=Z(IV)-TAU(IV)*CZ(IV)
PL(IV)=PL(IV)-TAU(IV)
TEST(IV)=E(IV).LE.EF.OR.X(IV).LT.-1.D0*SU.OR.X(IV).GT.SUT
ENDDO
IVMIN=1+ILLZ(IH1,TEST,1)
IF(IVMIN.GT.IH1) THEN
C BUGFIX: no projectile needs special handling; ensure IVMAX
C is defined before the shared label-90 bookkeeping.
IVMAX=0
GO TO 90
ENDIF
IVMAX=IH1-ILLZ(IH1,TEST,-1)
DO 120 IV=IVMIN,IVMAX
160 IF(IV.GT.IH1) GO TO 90
IF(X(IV).LT.-SU) GO TO 8
IF(X(IV).GT.SUT) GO TO 9
IF(E(IV).GT.EF) GO TO 125
IF(E(IV).GT.ESB.AND.X(IV).LT.0.D0) GO TO 125
IF(E(IV).GT.ESB.AND.X(IV).GT.TT) GO TO 125
C
C PROJECTILE HAS STOPPED (PATHLENGTH,RANGE,SPREAD AND MOMENTS)
C
IP = MAX0( MIN0( IDINT(PL(IV)/CW+1.D0), MAXD), 1)
IPL(IP)=IPL(IP)+1
I1 = MAX0( MIN0( IDINT(X(IV)/CW+1.D0), MAXD1), 0)
IRP(I1)=IRP(I1)+1
C
C Calculate the stopped particles in each layer
C
LowTiefe = 0.D0
UpTiefe = DX(1)
DO laufzahl=1,l
IF(X(IV).GT.LowTiefe.AND.X(IV).LE.UpTiefe) THEN
Number_in_Layer(laufzahl)=Number_in_Layer(laufzahl)+1
ENDIF
LowTiefe = UpTiefe
UpTiefe = UpTiefe+DX(laufzahl+1)
ENDDO
PL2=PL(IV)*PL(IV)
PL3=PL2*PL(IV)
PLSUM=PLSUM+PL(IV)
PL2SUM=PL2SUM+PL2
PL3SUM=PL3SUM+PL3
PL4SUM=PL4SUM+PL2*PL2
PL5SUM=PL5SUM+PL3*PL2
PL6SUM=PL6SUM+PL3*PL3
IF(X(IV).LT.0.D0.OR.X(IV).GT.TT) GO TO 111
XQ=X(IV)*X(IV)
XQ3=XQ*X(IV)
XSUM=XSUM+X(IV)
X2SUM=X2SUM+XQ
X3SUM=X3SUM+XQ3
X4SUM=X4SUM+XQ*XQ
X5SUM=X5SUM+XQ3*XQ
X6SUM=X6SUM+XQ3*XQ3
RQ=Y(IV)*Y(IV)+Z(IV)*Z(IV)
RQW=DSQRT(RQ)
RQ3=RQ*RQW
RSUM=RSUM+RQW
R2SUM=R2SUM+RQ
R3SUM=R3SUM+RQ3
R4SUM=R4SUM+RQ*RQ
R5SUM=R5SUM+RQ3*RQ
R6SUM=R6SUM+RQ3*RQ3
111 CONTINUE
ENUCLI=ENUCLI+ENUCL(IV)
ENL2I=ENL2I+ENUCL(IV)*ENUCL(IV)
ENUCL(IV)=0.D0
EINELI=EINELI+EINEL(IV)
EIL2I=EIL2I+EINEL(IV)*EINEL(IV)
EINEL(IV)=0.D0
GO TO 110
8 ENO=E(IV)*CX(IV)*CX(IV)
IF(ENO.LE.ESB) GO TO 24
C
C PROJECTILE IS BACKSCATTERED
C
IB=IB+1
ES=E(IV)-ESB
ESQ=ES*ES
ES3=ESQ*ES
EB=EB+ES
EB2SUM=EB2SUM+ESQ
EB3SUM=EB3SUM+ES3
EB4SUM=EB4SUM+ESQ*ESQ
EB5SUM=EB5SUM+ES3*ESQ
EB6SUM=EB6SUM+ES3*ES3
IF(ES.LT.0.1D0) GO TO 112
IBL=IBL+1
ESQL=(DLOG10(DABS(ES)))**2.D0
ES3L=ESQL*DLOG10(DABS(ES))
EB1SUL=EB1SUL+DLOG10(DABS(ES))
EB2SUL=EB2SUL+ESQL
EB3SUL=EB3SUL+ES3L
EB4SUL=EB4SUL+ESQL*ESQL
EB5SUL=EB5SUL+ES3L*ESQL
EB6SUL=EB6SUL+ES3L*ES3L
112 CONTINUE
IPB = MAX0( MIN0( IDINT(PL(IV)/CW+1.D0), 100), 1)
IPLB(IPB)=IPLB(IPB)+1
PLQB=PL(IV)*PL(IV)
PL3B=PLQB*PL(IV)
PLSB=PLSB+PL(IV)
PL2SB=PL2SB+PLQB
PL3SB=PL3SB+PL3B
PL4SB=PL4SB+PLQB*PLQB
PL5SB=PL5SB+PL3B*PLQB
PL6SB=PL6SB+PL3B*PL3B
ENUCLB=ENUCLB+ENUCL(IV)
ENL2B=ENL2B+ENUCL(IV)*ENUCL(IV)
ENUCL(IV)=0.D0
EINELB=EINELB+EINEL(IV)
EIL2B=EIL2B+EINEL(IV)*EINEL(IV)
EINEL(IV)=0.D0
C
C SURFACE REFRACTION
C
EXI=DSQRT((ENO-ESB)/ES)
exi1s=exi1s+exi
exiq=exi*exi
exic=exiq*exi
exi2s=exi2s+exiq
exi3s=exi3s+exic
exi4s=exi4s+exiq*exiq
exi5s=exi5s+exic*exiq
exi6s=exi6s+exic*exic
C
C DIVISIONS FOR VECTORS AND MATRICES
C
IE = IDINT(E0DE*ES+2.D0)
IE = MAX0( MIN0( IE,NE1), 2)
IERLOG = 2
IF(ES.LE.0.1D0) GO TO 4
IERLOG = IDINT(12.D0*DLOG10(DABS(10.D0*ES))+3.D0)
IERLOG=MIN0(IERLOG,75)
4 CONTINUE
IAG=IDINT(EXI*20.D0+1.D0)
IAG = MIN0( IAG, 20)
IAGB = IAG+1
KADB(IAG)=KADB(IAG)+1
IG=2
COSSIN=CY(IV)/SX(IV)
COSSIN=DMIN1(COSSIN,1.D0)
COSSIN=DMAX1(COSSIN,-1.D0)
coss1s=coss1s+cossin
cossq=cossin*cossin
cosst=cossq*cossin
coss2s=coss2s+cossq
coss3s=coss3s+cosst
coss4s=coss4s+cossq*cossq
coss5s=coss5s+cosst*cossq
coss6s=coss6s+cosst*cosst
IF(COSSIN.GT.1.0D0)WRITE(99,'(A50)')' nach coss6s'
AC=DACOS(COSSIN)
IG=IDINT(DAW*AC+2.D0)
IGG=IDINT(DGIK*AC+1.D0)
IF(IGG.GT.NGIK) IGG=NGIK
IPB1=IPB+1
MEABL(IERLOG,IAG) = MEABL(IERLOG,IAG)+1
MEABL(IERLOG,21) = MEABL(IERLOG,21)+1
MEABL(75,IAG) = MEABL(75,IAG)+1
MAGB(IG,IAGB) = MAGB(IG,IAGB)+1
MAGB(NG,IAGB) = MAGB(NG,IAGB)+1
MAGB(IG,22) = MAGB(IG,22)+1
MEAB(IE,IAGB) = MEAB(IE,IAGB)+1
MEAB(NE,IAGB) = MEAB(NE,IAGB)+1
MEAB(IE,22) = MEAB(IE,22)+1
MEAGB(IE,IGG,IAGB) = MEAGB(IE,IGG,IAGB)+1
MEAGB(102,IGG,IAGB) = MEAGB(102,IGG,IAGB)+1
MEAGB(IE,IGG,22) = MEAGB(IE,IGG,22)+1
MEAGB(102,IGG,22) = MEAGB(102,IGG,22)+1
MEPB(IE,IPB1) = MEPB(IE,IPB1)+1
MEPB(NE,IPB1) = MEPB(NE,IPB1)+1
MEPB(IE,102) = MEPB(IE,102)+1
EMA(IG,IAGB) = EMA(IG,IAGB)+ES
EMA(IG,22) = EMA(IG,22)+ES
EMA(NG,IAGB) = EMA(NG,IAGB)+ES
GO TO 110
C
C PROJECTILE IS REFLECTED BACK INTO THE TARGET BY THE SURF. BARRIER
C
24 X(IV)=-1.D0*SU
COSX(IV)=-1.D0*COSX(IV)
KIB=KIB+1
GO TO 125
C
C PROJECTILE IS TRANSMITTED
C
9 ENOT=E(IV)*CX(IV)*CX(IV)
IF(ENOT.LE.ESB) GO TO 517
IT=IT+1
EST=E(IV)-ESB
ET=ET+EST
ETQ=EST*EST
ET3=ETQ*EST
ET2SUM=ET2SUM+ETQ
ET3SUM=ET3SUM+ET3
ET4SUM=ET4SUM+ETQ*ETQ
ET5SUM=ET5SUM+ET3*ETQ
ET6SUM=ET6SUM+ET3*ET3
IPT = MAX0( MIN0( IDINT(PL(IV)/CW+1.D0), 100), 1)
C BUGFIX: IPT is computed for transmitted projectiles here.
C IP belongs to different logic and may be uninitialised/stale.
IPLT(IPT)=IPLT(IPT)+1
PLQT=PL(IV)*PL(IV)
PL3T=PLQT*PL(IV)
PLST=PLST+PL(IV)
PL2ST=PL2ST+PLQT
PL3ST=PL3ST+PL3T
PL4ST=PL4ST+PLQT*PLQT
PL5ST=PL5ST+PL3T*PLQT
PL6ST=PL6ST+PL3T*PL3T
ENUCLT=ENUCLT+ENUCL(IV)
ENL2T=ENL2T+ENUCL(IV)*ENUCL(IV)
ENUCL(IV)=0.D0
EINELT=EINELT+EINEL(IV)
EIL2T=EIL2T+EINEL(IV)*EINEL(IV)
EINEL(IV)=0.D0
C
C SURFACE REFRACTION
C
EXI=DSQRT((ENOT-ESB)/EST)
C
C DIVISIONS FOR VECTORS AND MATRICES
C
IE=IDINT(E0DE*EST+2.D0)
IERLOG = 2
IF(EST.LE.0.1D0) GO TO 5
IERLOG = IDINT(12.D0*DLOG10(DABS(10.D0*EST))+3.D0)
IERLOG=MIN0(IERLOG,75)
5 CONTINUE
IAG=IDINT(EXI*20.D0+1.D0)
IAG = MIN0( IAG, 20)
IAGB = IAG+1
KADT(IAG)=KADT(IAG)+1
IG=2
COSSIN=CY(IV)/SX(IV)
COSSIN=DMIN1(COSSIN,1.D0)
COSSIN=DMAX1(COSSIN,-1.D0)
IF(COSSIN.GT.1.0D0) WRITE(99,'(A50)')' nach COSSIN'
AC=DACOS(COSSIN)
IG=IDINT(DAW*AC+2.D0)
IGG=IDINT(DGIK*AC+1.D0)
IF(IGG.GT.NGIK) IGG=NGIK
MEATL(IERLOG,IAG) = MEATL(IERLOG,IAG)+1
MEATL(IERLOG,21) = MEATL(IERLOG,21)+1
MEATL(75,IAG) = MEATL(75,IAG)+1
MAGT(IG,IAGB) = MAGT(IG,IAGB)+1
MAGT(NG,IAGB) = MAGT(NG,IAGB)+1
MAGT(IG,22) = MAGT(IG,22)+1
MEAT(IE,IAGB) = MEAT(IE,IAGB)+1
MEAT(NE,IAGB) = MEAT(NE,IAGB)+1
MEAT(IE,22) = MEAT(IE,22)+1
MEAGT(IE,IGG,IAGB) = MEAGT(IE,IGG,IAGB)+1
MEAGT(102,IGG,IAGB) = MEAGT(102,IGG,IAGB)+1
MEAGT(IE,IGG,22) = MEAGT(IE,IGG,22)+1
MEAGT(102,IGG,22) = MEAGT(102,IGG,22)+1
MEPT(IE,IPT) = MEPT(IE,IPT)+1
MEPT(NE,IPT) = MEPT(NE,IPT)+1
MEPT(IE,102) = MEPT(IE,102)+1
C BUGFIX: this is the transmission branch; use EST, not ES
C from the backscattering branch.
EMAT(IG,IAGB) = EMAT(IG,IAGB)+EST
EMAT(IG,22) = EMAT(IG,22)+EST
EMAT(NG,IAGB) = EMAT(NG,IAGB)+EST
GO TO 110
C
C PROJECTILE IS REFLECTED BACK INTO THE TARGET BY THE SURF. BARRIER
C
517 X(IV)=SUT
COSX(IV)=-1.D0*COSX(IV)
KIT=KIT+1
GO TO 125
110 IF(IH.EQ.NH) GO TO 130
IH=IH+1
IF(E0.GE.0.D0) GO TO 702
IF(ALPHA.LT.0.D0) GO TO 703
C
C MAXWELLIAN VELOCITY DISTRIBUTION
C
CALL VELOC(E(IV),COSX(IV),COSY(IV),COSZ(IV),SINE(IV))
EMX = EMX+E(IV)
ne = IDINT(DMIN1(5000.D0,e(iv)+1.D0))
me(ne) = me(ne)+1
GO TO 707
C
C MAXWELLIAN ENERGY DISTRIBUTION
C
703 CALL ENERG(E(IV),COSX(IV),COSY(IV),COSZ(IV),SINE(IV))
EMX = EMX+E(IV)
GO TO 707
702 IF (EQUAL(Esig,0.D0)) THEN
C FIXED PROJECTILE ENERGY
E(IV)=E0
C GAUSSIAN ENERGY DISTRIBUTION
ELSE
7020 CALL ENERGGAUSS(ISEED2,Esig,Epar,E0)
tryE = tryE+1
IF (Epar.LE.0.D0) THEN
negE = negE+1
GO TO 7020
ENDIF
E(IV)=Epar
ENDIF
TAUPSI(IV)=0.D0
IF(EQUAL(ALPHA,-2.D0)) GO TO 705
IF(EQUAL(ALPHA,-1.D0)) GO TO 706
IF(EQUAL(ALPHASIG,0.D0))THEN
C FIXED PROJECTILE ANGLE
COSX(IV)=CALFA
COSY(IV)=SALFA
COSZ(IV)=0.D0
SINE(IV)=COSY(IV)
ELSE
C
C 1D-GAUSSIAN DISTRIBUTION PROJECTILE ANGLE
C
CALL ALPHAGAUSS(ISEED3,ALPHASIG,ALPHA,ALFA,ALPHApar, CALFA
& ,SALFA,BW)
COSX(IV) = CALFA
COSY(IV) = SALFA
COSZ(IV) = 0.D0
SINE(IV) = COSY(IV)
ENDIF
GO TO 707
C
C COSINE ANGLE DISTRIBUTION
C
705 call ranlux(ran2, 2)
RPHI=PI2*DBLE(ran2(1))
RTHETA=DBLE(ran2(1))
COSX(IV)=DSQRT(RTHETA)
SINE(IV)=DSQRT(1.D0-RTHETA)
COSY(IV)=SINE(IV)*DCOS(RPHI)
COSZ(IV)=SINE(IV)*DSIN(RPHI)
GO TO 707
C
C RANDOM DISTRIBUTION
C
706 IF(X0.GT.0.D0) GO TO 709
call ranlux(ran2, 2)
RPHI=PI2*DBLE(ran2(1))
RTHETA=DBLE(ran2(2))
COSX(IV)=1.D0-RTHETA
SINE(IV)=DSQRT(1.D0-COSX(IV)*COSX(IV))
COSY(IV)=SINE(IV)*DSIN(RPHI)
COSZ(IV)=SINE(IV)*DCOS(RPHI)
GO TO 707
709 call ranlux(ran2, 2)
RPHI=PI2*DBLE(ran2(1))
RTHETA=DBLE(ran2(2))
COSX(IV)=1.D0-2.D0*RTHETA
SINE(IV)=DSQRT(1.D0-COSX(IV)*COSX(IV))
COSY(IV)=SINE(IV)*DSIN(RPHI)
COSZ(IV)=SINE(IV)*DCOS(RPHI)
GO TO 708
707 IF(X0.GT.0.D0) GO TO 708
C
C EXTERNAL START
C
SINA=SINE(IV)
COSX(IV)=DSQRT((E(IV)*COSX(IV)*COSX(IV)+ESB)/(E(IV)+ESB))
SINE(IV)=DSQRT(1.D0-COSX(IV)*COSX(IV))
COSY(IV)=COSY(IV)*SINE(IV)/SINA
COSZ(IV)=COSZ(IV)*SINE(IV)/SINA
E(IV)=E(IV)+ESB
C
C LOCUS OF FIRST COLLISION
C
708 LLL(IV)=ISRCHFGT(L,XX(1),1,X0)
call ranlux(random, 1)
RA1=CVMGT(DBLE(random(1)),1.D0,X0.LE.0.D0)
X(IV)=XC+LM(LLL(IV))*RA1*COSX(IV)
Y(IV)=LM(LLL(IV))*RA1*COSY(IV)
Z(IV)=LM(LLL(IV))*RA1*COSZ(IV)
PL(IV)=CVMGT(0.D0,LM(LLL(IV))*RA1,X0.LE.0.D0)
GO TO 120
C
C COUNTING DOWN IH1 , ONLY LESS THAN (NH-IH) HAVE TO BE PROCESSED
C
130 CONTINUE
E(IV)=E(IH1)
COSX(IV)=COSX(IH1)
COSY(IV)=COSY(IH1)
COSZ(IV)=COSZ(IH1)
SINE(IV)=SINE(IH1)
X(IV)=X(IH1)
Y(IV)=Y(IH1)
Z(IV)=Z(IH1)
PL(IV)=PL(IH1)
TAU(IV)=TAU(IH1)
TAUPSI(IV)=TAUPSI(IH1)
CPSI(IV)=CPSI(IH1)
ENUCL(IV)=ENUCL(IH1)
EINEL(IV)=EINEL(IH1)
IH1=IH1-1
IF(IV.EQ.IH1+1) GO TO 90
IF(IH1+1.GT.IVMAX) GO TO 125
GO TO 160
125 CONTINUE
X(IV)=X(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSX(IV)
Y(IV)=Y(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSY(IV)
Z(IV)=Z(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSZ(IV)
PL(IV)=CVMGT(PL(IV),PL(IV)+LM(LLL(IV))+TAUPSI(IV) ,X(IV).LE.0
& .D0)
LLL(IV)=MIN0(ISRCHFGT(L,XX(1),1,X(IV)),L)
120 CONTINUE
90 CONTINUE
C
C INCREMENT OF PROJECTILE ENERGY AND POSITION
C OF PARTICLES NOT HANDLED IN LOOP 120
C
DO 128 IV=1,IVMIN-1
LLL(IV) = MIN0(ISRCHFGT(L,XX(1),1,X(IV)),L)
128 CONTINUE
DO IV=1,IVMIN-1
X(IV)=X(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSX(IV)
Y(IV)=Y(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSY(IV)
Z(IV)=Z(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSZ(IV)
PL(IV)=CVMGT(PL(IV),PL(IV)+LM(LLL(IV))+TAUPSI(IV) ,X(IV).LE.0
& .D0)
ENDDO
134 CONTINUE
C
C BUGFIX: if no projectile satisfied TEST, IVMIN is IH1+1 and
C IVMAX was not set in this block. All particles were already
C advanced by the loop above, so skip the trailing range.
IF(IVMIN.GT.IH1) GO TO 132
IF(IVMAX.LT.IVMIN) GO TO 132
DO IV=IVMAX+1,IH1
LLL(IV) = MIN0(ISRCHFGT(L,XX(1),1,X(IV)),L)
X(IV)=X(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSX(IV)
Y(IV)=Y(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSY(IV)
Z(IV)=Z(IV)+(LM(LLL(IV))+TAUPSI(IV))*COSZ(IV)
PL(IV)=CVMGT(PL(IV),PL(IV)+LM(LLL(IV))+TAUPSI(IV) ,X(IV).LE.0
& .D0)
ENDDO
132 CONTINUE
GO TO 1
140 IF(NREC1+NREC2.GT.0) GO TO 83
C
C
C=======================================================================
C WRITE MAIN OUTPUT REPORT
C=======================================================================
C PRINTOUT
C
C
do ima = 5000,1,-1
if(me(ima).ne.0) goto 1010
enddo
ima = 1
1010 ima = MIN0(ima+2,5000)
C I am not sure what is this file for?!
C open(20,file='edist')
C do ne=1,ima
C write(20,1020) ne,me(ne)
C enddo
C 1020 format(1x,2i6)
C close(20)
C
C Calculate the part. reflec. coeff. according to Thomas et al.
C
E0keV=E0/1.D3
EsigkeV=Esig/1.D3
C BUGFIX: single-element target should be decided from NJ(1).
C ZT(1,2) is not read for NJ(1)=1 and may be uninitialised.
IF(NJ(1).EQ.1) THEN
epsilon = 32.55D0*(MT(1,1)/M1)/(1.D0+(MT(1,1)/M1))* 1.D0/(Z1
& *ZT(1,1)*DSQRT(Z1**(2.D0/3.D0)+ZT(1,1)**(2.D0/3.D0)))
& * E0keV
prcoeff = prc(1)*DLOG(prc(2)*epsilon+DEXP(1.D0))/ (1.D0+(PRC(3)
& *epsilon**PRC(4))+(PRC(5)*epsilon**PRC(6)))
ELSE
epsilon = 0.D0
prcoeff = 0.D0
ENDIF
C 2nd CALL DATE_AND_TIME
C
C Write input and beam summary to the main output file.
C
call writeInputSummary(innam,outnam,rgenam,Z1,M1,E0,Esig,
& ALPHA,ALPHASIG,EF,ESB,SHEATH,ERC,NH,RI,RI2,RI3,X0,RD,
& CW,CA,KK0,KK0R,KDEE1,KDEE2,IPOT,IPOTR,IRL,L,DX,RHO,
& CK,NJ,ZT,MT,CO,SBE,ED,BE,CH1,CH2,CH3,CH4,CH5,TI,
& ZARG,VELC,EMX,MAXNL,MAXEL,seconds_start_total)
call writeTargetSetupSummary(HLM,HLMT,SU,SUT,XC,RT,SFE,INEL,
& L,LJ,NPROJ,KIB,KIT,MAXA,NALL,NPA,NSA,KIS,KIST,EPS0,Z2,
& M2,ARHO,LM,PDMAX,ASIG,SB,XX,NJ,A1,KOR1,A,KOR,MAXNL,
& MAXNL5)
C
C INTEGRAL IMPLANTATION , SPUTTERING , BACKSCATTERING , TRANSMISSION
C
IIM=NH-IB-IT
YH=DBLE(IIM)
HN=DBLE(NH)
EMV=CVMGT(EMX/HN,E0,E0.LE.0.D0)
EIM=DBLE(IIM)*EMV
DO J=1,LJ
ISPA = ISPA+IBSP(J)
ESPA = ESPA+EBSP(J)
ISPAT = ISPAT+ITSP(J)
ESPAT = ESPAT+ETSP(J)
ENDDO
CSUM=ICSUM
CSUMS=ICSUMS
AVCSUM=CSUM/HN
AVCSMS=CSUMS/HN
AVCDIS=DBLE(ICDI)/HN
CST=DBLE(ICSUM-ICDI)
call writeIntegralSummary(IIM,EIM,IB,EB,IT,ET,ISPA,ESPA,
& ISPAT,ESPAT,tryE,negE,epsilon,prcoeff,L,XX,CW,IRP,
& IRPL,NLI,number_in_layer,depth_interval_flag,AVCSUM,
& AVCDIS,AVCSMS,MAXNL,MAXD)
IF(YH.LE.1.D0) GO TO 1502
AVNLI=ENUCLI/YH
VANLI=ENL2I/YH-AVNLI*AVNLI
SIGNLI=DSQRT(VANLI)
DFINLI=SIGNLI/YH
AVILI=EINELI/YH
VAILI=EIL2I/YH-AVILI*AVILI
SIGILI=DSQRT(VAILI)
DFIILI=SIGILI/YH
CALL MOMENTS(FIX0,SEX,THX,FOX,FIX,SIX,SIGMAX,DFIX0,DSEX,DTHX, XSUM
& ,X2SUM,X3SUM,X4SUM,X5SUM,X6SUM,YH)
CALL MOMENTS(FIR0,SER,THR,FOR,FIR,SIR,SIGMAR,DFIR0,DSER,DTHR, RSUM
& ,R2SUM,R3SUM,R4SUM,R5SUM,R6SUM,YH)
CALL MOMENTS(FIP0,SEP,THP,FOP,FIP,SIP,SIGMAP,DFIP0,DSEP,DTHP,
& PLSUM,PL2SUM,PL3SUM,PL4SUM,PL5SUM,PL6SUM,YH)
CALL MOMENTS(FIE0,SEE,THE,FOE,FIE,SIE,SIGMAE,DFIE0,DSEE,DTHE, EEL
& ,EEL2,EEL3,EEL4,EEL5,EEL6,CSUM)
CALL MOMENTS(FIW0,SEW,THW,FOW,FIW,SIW,SIGMAW,DFIW0,DSEW,DTHW,
& EELWC,EELWC2,EELWC3,EELWC4,EELWC5,EELWC6,CSUM)
CALL MOMENTS(FII0,SEI,THI,FOI,FII,SII,SIGMAI,DFII0,DSEI,DTHI, EIL
& ,EIL2,EIL3,EIL4,EIL5,EIL6,CSUM)
CALL MOMENTS(FIS0,SES,THS,FOS,FIS,SIS,SIGMAS,DFIS0,DSES,DTHS, EPL
& ,EPL2,EPL3,EPL4,EPL5,EPL6,CST)
WRITE(21,7117)
7117 FORMAT(/20X,' MEAN ',4X,' VARIANCE ',4X,' SKEWNESS ',4X,
& ' KURTOSIS ',5X,' SIGMA ',3X,' ERROR 1.M ',3X
& ,' ERROR 2.M ', 3X,' ERROR 3.M ')
WRITE(21,7227) FIX0,SEX,THX,FOX,SIGMAX,DFIX0,DSEX,DTHX
7227 FORMAT(1X,' PENETRATION',5X,1P1E12.4,7E14.4)
WRITE(21,7228) FIR0,SER,THR,FOR,SIGMAR,DFIR0,DSER,DTHR
7228 FORMAT(1X,' SPREAD',5X,1P1E12.4,7E14.4)
WRITE(21,7229) FIP0,SEP,THP,FOP,SIGMAP,DFIP0,DSEP,DTHP
7229 FORMAT(1X,' PATHLENGTH',5X,1P1E12.4,7E14.4)
WRITE(21,7237) AVNLI,VANLI,SIGNLI,DFINLI
7237 FORMAT(1X,'ELASTIC LOSS',5X,1P1E12.4,1E14.4,28X,2E14.4)
WRITE(21,7238) AVILI,VAILI,SIGILI,DFIILI
7238 FORMAT(1X,' INEL. LOSS',5X,1P1E12.4,1E14.4,28X,2E14.4)
WRITE(21,7117)
WRITE(21,7231) FIE0,SEE,THE,FOE,SIGMAE,DFIE0,DSEE,DTHE
7231 FORMAT(1X,' ELAST.LOSS',5X,1P1E12.4,7E14.4)
WRITE(21,7232) FIW0,SEW,THW,FOW,SIGMAW,DFIW0,DSEW,DTHW
7232 FORMAT(1X,'WEAK EL.LOSS',5X,1P1E12.4,7E14.4)
WRITE(21,7233) FII0,SEI,THI,FOI,SIGMAI,DFII0,DSEI,DTHI
7233 FORMAT(1X,'INELAST.LOSS',5X,1P1E12.4,7E14.4)
WRITE(21,7234) FIS0,SES,THS,FOS,SIGMAS,DFIS0,DSES,DTHS
7234 FORMAT(1X,' SUBTHR.LOSS',5X,1P1E12.4,7E14.4)
1502 CONTINUE
IF(YH.LT.1.D0) GO TO 7235
CALL MOMENT(X1SD,X2SD,X3SD,X4SD,X5SD,X6SD ,XSUM,X2SUM,X3SUM,X4SUM
& ,X5SUM,X6SUM,YH)
WRITE(21,7118)
WRITE(21,1513) X1SD,X2SD,X3SD,X4SD,X5SD,X6SD
1513 FORMAT(1X,' PENETRATION',5X,1P1E12.4,5E14.4)
7235 continue
if(irl.eq.0) goto 1453
CSUMR=DBLE(ICSUMR)
ACSUMR=CSUMR/HN
ACDISR=DBLE(ICDIR)/HN
ACSBER=DBLE(ICSBR)/HN
WRITE(21,1599) ACSUMR,ACDISR,ACSBER
1599 FORMAT(///2X,'RECOILES (PER PROJ.) : ',
& 'MEAN NUMBER OF ELASTIC COLLISIONS = ',1F8.1,3X,
& 'MEAN NUMBER OF EL.COLL.(E > EDISPL.) = ',F10.3/76X,
& 'MEAN NUMBER OF EL.COLL.(E > SB(1)) = ',F10.3)
IF(NPA+NSA.EQ.0) GO TO 1453
ACSUR=CSUMR/(DBLE(NPA+NSA))
ACDIR=DBLE(ICDIR)/(NPA+NSA)
ACSBR=DBLE(ICSBR)/(NPA+NSA)
WRITE(21,1598) ACSUR,ACDIR,ACSBR
1598 FORMAT(/2X,'RECOILES (PER KNOCKON) : ',
& 'MEAN NUMBER OF ELASTIC COLLISIONS = ',1F8.3,3X,
& 'MEAN NUMBER OF EL.COLL.(E > EDISPL.) = ',F10.3/,76X,
& 'MEAN NUMBER OF EL.COLL.(E > SB(1)) = ',F10.3/)
IF(NJ(1).LT.2) GO TO 1453
ACDR11=DBLE(ICDIRJ(1,1))/(NPA+NSA)
ACDR12=DBLE(ICDIRJ(1,2))/(NPA+NSA)
ACDR21=DBLE(ICDIRJ(2,1))/(NPA+NSA)
ACDR22=DBLE(ICDIRJ(2,2))/(NPA+NSA)
WRITE(21,1451) ACDR11,ACDR12,ACDR21,ACDR22
1451 FORMAT(76X,'MEAN NR OF EL.COLL.(E > EDISPL.) 1-1 = ',F10.3/
& ,76X,'MEAN NR OF EL.COLL.(E > EDISPL.) 1-2 = ',F10.3/
& ,76X,'MEAN NR OF EL.COLL.(E > EDISPL.) 2-1 = ',F10.3/
& ,76X,'MEAN NR OF EL.COLL.(E > EDISPL.) 2-2 = ',F10.3)
1453 CONTINUE
call writeImplantationProfile(depth_interval_flag,YH,MAXD,
& MAXD1,LJ,NJ,L,XX,CW,IRL,IRP,RIRP,IPL,ION,DENT,DMGN,
& ELGD,PHON,CASMOT,ICD,ICDT,ICDR,ICDTR,ICDIRI,ICDIRN,
& IIRP,TRIRP,IIPL,TION,TDENT,TDMGN,TELGD,TPHON,TCASMO,
& ICDTT,TIONR,TDENTR,TELGDR,TDMGNR,TPHONR,ICDTTR,ELE,
& ELI,ELP,ELD,ELET,ELIT,ELPT,ELDT,ICDJT,ICDJTR,ICDITR,
& ILD,DLI,IONR,DENTR,DMGNR,ELGDR,PHONR,MAXNL,MAXNL5)
C
C BACKSCATTERING
C
call writeBackscatterSummary(IB,IBL,HN,EB,EMV,ENUCLB,
& ENL2B,EINELB,EIL2B,EB2SUM,EB3SUM,EB4SUM,EB5SUM,
& EB6SUM,EB1SUL,EB2SUL,EB3SUL,EB4SUL,EB5SUL,
& EB6SUL,PLSB,PL2SB,PL3SB,PL4SB,PL5SB,PL6SB,
& KADB,AI,RKADB,FIB0,SIGMAB)
C
C TRANSMISSION
C
call writeTransmissionSummary(IT,HN,ET,E0,ENUCLT,ENL2T,
& EINELT,EIL2T,ET2SUM,ET3SUM,ET4SUM,ET5SUM,ET6SUM,
& PLST,PL2ST,PL3ST,PL4ST,PL5ST,PL6ST,KADT,AI,RKADT,
& FIT0,SIGMAT)
1518 FORMAT(5X,20F6.2//,5X,20I6/5X,20F6.3)
C
C BACKWARD SPUTTERING : YIELDS AND ENERGIES
C
call writeBackwardSputterYieldSummary(ISPA,L,NJ,JT,LJ,HN,EMV,
& IBSP,IBSPL,EBSP,ISPAL,ESPAL,ESPA,ISPIP,ISPIS,ISPOP,
& ISPOS,ESPIP,ESPIS,ESPOP,ESPOS,RIP,RIS,ROP,ROS,REIP,
& REIS,REOP,REOS,RIPJ,RISJ,ROPJ,ROSJ,REIPJ,REISJ,
& REOPJ,REOSJ,ESPMIP,ESPMIS,ESPMOP,ESPMOS,SPY,SPE,
& REY,EMSP,SPE2S,SPE3S,SPE4S,SPE5S,SPE6S,SPE1SL,
& SPE2SL,SPE3SL,SPE4SL,SPE5SL,SPE6SL,FIESB,SEESB,
& THESB,FOESB,SGMESB,DFIESB,DSEESB,DTHESB,MAXNL,
& MAXNL5,MAXNLm15)
IF(ISPA.EQ.0) GO TO 1700
1564 FORMAT(9X,'SPUTTERED PARTICLES(',I1,') = ',I7,5X,
& 'SPUTTERED ENERGY(',I1,') = ',E10.4,' EV')
1577 FORMAT(/)
1582 FORMAT(5X,'SPUTTERING YIELD(',I1,') = ',1PE10.3,
& ' SPUTTERED ENERGY(',I1,') = ',1E10.3,
& ' REL.MEAN ENERGY(',I1,') = ',1E10.3,
& ' MEAN ENERGY(',I1,') = ',1E10.3)
7118 FORMAT(/20X,' 1.MOMENT ',4X,' 2.MOMENT ',4X,' 3.MOMENT ',
& 4X,' 4.MOMENT ',4X,' 5.MOMENT ',4X,' 6.MOMENT ')
C
C BACKWARD SPUTTERING : ANGULAR DISTRIBUTIONS
C
call writeBackwardSputterAngularSummary(ISPA,L,NJ,JT,IBSP,
& ISPAL,KADS,KADSJ,KADSL,RKADS,RKADSJ,RKADSL,AI,MAXNL,
& MAXNLm15)
C
C TRANSMISSION SPUTTERING : YIELDS AND ENERGIES
C
1700 IF(ISPAT.EQ.0) GO TO 1800
call writeTransmissionSputterYieldSummary(ISPAT,L,NJ,JT,LJ,NH,
& E0,ESPAT,ITSP,ETSP,ISPALT,ESPALT,ISPIPT,ISPIST,ISPOPT,
& ISPOST,ESPIPT,ESPIST,ESPOPT,ESPOST,RIPT,RIST,ROPT,ROST,
& REIPT,REIST,REOPT,REOST,ESPMIPT,ESPMIST,ESPMOPT,
& ESPMOST,SPYT,SPET,REYT,EMSPT,MAXNL,MAXNL5)
C
C TRANSMISSION SPUTTERING : ANGULAR DISTRIBUTIONS
C
call writeTransmissionSputterAngularSummary(ISPAT,L,NJ,JT,LJ,
& ISPAL,ISPALT,ITSP,KADST,KDSTJ,KDSTL,RKADST,RKDSTJ,
& RKDSTL,AI,MAXNL,MAXNL5,MAXNLm15)
1800 CONTINUE
C
C The per-run summary file (*.seq) is written by writeSequenceSummary.
C
C The *.seq file is the compact per-run summary consumed by the GUI for
C scan plots (fractions stopped in each layer, backscattering,
C transmission, mean depth, etc.). Each run writes its own summary file.
C=======================================================================
C WRITE SEQUENCE SUMMARY FILE
C=======================================================================
call writeSequenceSummary(seqnam,chem,NLayers,E0keV,EsigkeV,
& ALPHA,ALPHASIG,NH,IIM,IB,IT,tryE,negE,FIX0,SIGMAX,FIB0,
& SIGMAB,FIT0,SIGMAT,epsilon,prcoeff,number_in_layer,MAXNL)
C
C End of per-run summary file
C
C TOP AND FRONT LINES FOR MATRICES
C
call setupMatrixTableAxes(DE,DA,DG,NH,NG1,NA1,NGIK,MAXD1,
& JT,MEAB,MAGB,EMA,MEAT,MAGT,EMAT,MEPB,MEPT,MAGS,
& MAGST,MAGSA,MEAS,MEAST,MEASL,MEASTL,MEAGS,MEAGB,
& MEAGT,ELOG,TEMPNH,MAXNL,MAXD2,MAXNLm15)
C
C BACKWARD SPUTTERING : MATRICES , ENERGY - ANGLE CORRELATIONS
C
call writeBackwardSputterMatrixSummary(ISPA,NH,JT,NJ,EASL,
& MEASL,TEMPNH,ELOG,MEAS,MAXD1,ALPHA,NGIK,DGI,MEAGS,
& MAGSA,MAGS,L,ISPAL,MAXNL,MAXD2,MAXNLm15)
C
C Shared matrix output formats used by the remaining inline matrix
C output sections. Copies are kept inside the extracted subroutine.
C
1858 FORMAT(1X,1E12.4,20I5,I6,1E12.4)
1886 FORMAT(1X,I3,20I6,I8)
C
C FORWARD SPUTTERING : MATRICES , ENERGY - ANGLE CORRELATIONS
C
IF(ISPAT.LT.10000) GO TO 2000
JTJ=JT(3)
IF(L.EQ.3) JTJ=LJ-NJ(1)
DO J=1,JTJ
EASTL(2,J)=DBLE(MEASTL(2,21,J))/(DBLE(NH)*0.1D0)
DO IESLOG=3,74
EASTL(IESLOG,J)=DBLE(MEASTL(IESLOG,21,J))/(TEMPNH*10.D0
& **((IESLOG-1)/12.D0))
ENDDO
ENDDO
IF(L.EQ.3) GO TO 1953
DO 1952 J=1,NJ(1)
WRITE(21,1954) J
1954 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(FORWARD SPUTTERED PARTICLES) ',
& ', 1. LAYER , SPECIES',I2/)
do ima = 74,2,-1
if(meastl(ima,21,j).ne.0) goto 1955
enddo
ima = 1
1955 ima = min(ima+2,74)
do ies = 1, ima
write (6, 1858) elog(ies), (meastl(ies,ias,j),ias=1,21),
& eastl(ies,j)
enddo
write (6, 1858) elog(75), (meastl(75,ias,j),ias=1,21),eastl(75,j)
WRITE(21,1984) J
1984 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) ',
& '(FORWARD SPUTTERED PARTICLES) , 1.LAYER , SPECIES',I2/)
do ima = MAXD1,1,-1
if(meast(ima,22,j).ne.0) goto 1983
enddo
ima = 1
1983 ima = min(ima+2,MAXD1)
write (6, 1886) ((meast(iesp,iags,j),iags=1,22),iesp=1,ima)
write (6, 1886) (meast(102,iags,j),iags=1,22)
WRITE(21,1988) J
1988 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) ',
& ' (FORWARD SPUTTERED PARTICLES) , 1.LAYER , SPECIES',I2/)
WRITE(21,1886) ((MAGST(IG,IAGS,J),IAGS=1,22),IG=1,62)
1952 CONTINUE
1953 CONTINUE
IF(L.EQ.1) GO TO 2000
IF(L.EQ.3) GO TO 1961
JTK=NJ(1)+1
JTL=JT(3)
GO TO 1963
1961 JTK=1
JTL=NJ(2)
1963 DO 1962 J=JTK,JTL
WRITE(21,1964) J-JTK+1
1964 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(FORWARD SPUTTERED PARTICLES) ,',
& ' 2. LAYER , SPECIES',I2/)
do ima = 74,1,-1
if(meastl(ima,21,j).ne.0) goto 1965
enddo
ima = 1
1965 ima = min(ima+2,74)
do ies = 1, ima
write (6, 1858) elog(ies), (meastl(ies,ias,j),ias=1,21),
& eastl(ies,j)
enddo
write (6, 1858) elog(75), (meastl(75,ias,j),ias=1,21) ,
& eastl(75,j)
WRITE(21,1994) J-JTK+1
1994 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (FORWARD SPUTTERED PARTICLES) , 2.LAYER , SPECIES',I2/)
do ima = MAXD1,1,-1
if(meast(ima,22,j).ne.0) goto 1995
enddo
ima = 1
1995 ima = min(ima+2,MAXD1)
WRITE(21,1886)((meast(iesp,iags,j),iags=1,22),iesp=1,ima)
WRITE(21,1886)(meast(102,iags,j),iags=1,22)
WRITE(21,1998) J-JTK+1
1998 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (FORWARD SPUTTERED PARTICLES) , 2.LAYER , SPECIES',I2/)
WRITE(21,1886) ((MAGST(IG,IAGS,J),IAGS=1,22),IG=1,62)
1962 CONTINUE
IF(L.LT.3) GO TO 2000
DO 1972 J=NJ(2)+1,LJ-NJ(1)
WRITE(21,1974) J-NJ(2)
1974 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(FORWARD SPUTTERED PARTICLES) , 3. LAYER , SPECIES',I2/)
do ima = 74,1,-1
if(meastl(ima,21,j).ne.0) goto 1973
enddo
ima = 1
1973 ima = min(ima+2,74)
do ies = 1, ima
write (6, 1858) elog(ies), (meastl(ies,ias,j),ias=1,21) ,
& eastl(ies,j)
end do
write (6, 1858) elog(75), (meastl(75,ias,j),ias=1,21) ,
& eastl(75,j)
WRITE(21,1975) J-NJ(2)
1975 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (FORWARD SPUTTERED PARTICLES) , 3.LAYER , SPECIES',I2/)
do ima = MAXD1,1,-1
if(meast(ima,22,j).ne.0) goto 1977
enddo
ima = 1
1977 ima = min(ima+2,MAXD1)
WRITE(21,1886)((meast(iesp,iags,j),iags=1,22),iesp=1,ima)
WRITE(21,1886)(meast(102,iags,j),iags=1,22)
WRITE(21,1978) J-NJ(2)
1978 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (FORWARD SPUTTERED PARTICLES) , 3.LAYER , SPECIES',I2/)
WRITE(21,1886) ((MAGST(IG,IAGS,J),IAGS=1,22),IG=1,62)
1972 CONTINUE
2000 CONTINUE
C
C BACKSCATTERING : MATRICES , ENERGY - ANGULAR CORRELATIONS
C
IF(IB.LT.10000) GO TO 2100
DO J=1,20
MEABL(1,J)=J
ENDDO
EABL(2)=DBLE(MEABL(2,21))/(DBLE(NH)*0.1D0)
DO IERLOG=3,74
EABL(IERLOG)=DBLE(MEABL(IERLOG,21))/(TEMPNH*10.D0**((IERLOG-1)
& /12.D0))
ENDDO
WRITE(21,2006)
2006 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(BACKSCATTERED PROJECTILES)'/)
do ima = 74,1,-1
if(meabl(ima,21).ne.0) goto 2005
enddo
ima = 1
2005 ima = min(ima+2,74)
do ies = 1, ima
WRITE(21,1858)elog(ies),(meabl(ies,iag),iag=1,21),eabl(ies)
end do
WRITE(21,1858)elog(75),(meabl(75,iag),iag=1,21),eabl(75)
IF(ALPHA.LT.1.) GO TO 2010
DO IG2=1,NGIK,1
EEE = IG2*DGI
WRITE(21,2014) EEE
2014 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) AT AZIMUTHAL ANGLE =',F5.1,
& ' (BACKSCATTERED PROJECTILES)'/)
do ima = MAXD1,1,-1
if(meagb(ima,ig2,22).ne.0) goto 2015
enddo
ima = 1
2015 ima = min(ima+2,MAXD1)
write (6, 1886) ((meagb(ie,ig2,iagb),iagb=1,22),ie=1,ima)
write (6, 1886) (meagb(102,ig2,iagb),iagb=1,22)
ENDDO
2010 CONTINUE
IF(E0.LT.0.) GO TO 2052
WRITE(21,2016)
2016 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (BACKSCATTERED PROJECTILES)'/)
GO TO 2054
2052 WRITE(21,2056)
2056 FORMAT(//,' ENERGY(E IN 0.1*TI) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (BACKSCATTERED PROJECTILES)'/)
do ima = MAXD1,1,-1
if(meab(ima,22).ne.0) goto 2017
enddo
ima = 1
2017 ima = min(ima+2,MAXD1)
write (6, 1886) ((meab(ie,iagb),iagb=1,22),ie=1,ima)
write (6, 1886) (meab(102,iagb),iagb=1,22)
2054 continue
WRITE(21,2018)
2018 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (BACKSCATTERED PROJECTILES)'/)
WRITE(21,1886) ((MAGB(IG,IAGB),IAGB=1,22),IG=1,62)
WRITE(21,2022)
2022 FORMAT(//,' AZIMUTH.ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (BACKSCATTERED ENERGY)'/)
WRITE(21,2027) (EMA(01,IAGB),IAGB=1,11)
WRITE(21,2025) ((EMA(IG,IAGB),IAGB=1,11),IG=2,NG)
WRITE(21,2028)
WRITE(21,2031) EMA(1,1),(EMA(1,IAGB),IAGB=12,22)
DO IG=2,NG
WRITE(21,2026) EMA(IG,1),(EMA(IG,IAGB),IAGB=12,22)
ENDDO
2025 FORMAT(1X,1F5.0,10E11.4)
2026 FORMAT(1X,1F5.0,11E11.4)
2027 FORMAT(1X,1F5.0,10F11.0)
2028 FORMAT(/)
2031 FORMAT(1H1,1X,1F5.0,11F11.0)
2036 FORMAT(1X,26I4)
2038 FORMAT(1X,26I4,I6)
2100 CONTINUE
C
C TRANSMISSION : MATRICES , ENERGY - ANGULAR CORRELATIONS
C
IF(IT.LT.10000) GO TO 9000
DO J=1,20
MEATL(1,J)=J
ENDDO
EATL(2)=DBLE(MEATL(2,21))/(DBLE(NH)*0.1D0)
DO IERLOG=3,74
EATL(IERLOG)=DBLE(MEATL(IERLOG,21))/(TEMPNH* 10.D0**((IERLOG-1)
& /12.D0))
ENDDO
WRITE(21,2106)
2106 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(TRANSMITTED PROJECTILES)'/)
do ima = 74,1,-1
if(meatl(ima,21).ne.0) goto 2105
enddo
ima = 1
2105 ima = min(ima+2,74)
do ies = 1, ima
WRITE(21,1858)elog(ies),(meatl(ies,iag),iag=1,21),eatl(ies)
enddo
WRITE(21,1858)elog(75),(meatl(75,iag),iag=1,21),eatl(75)
IF(ALPHA.LT.1.) GO TO 2110
DO IG2=1,NGIK,1
EEE = IG2*DGI
WRITE(21,2114) EEE
2114 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) AT AZIMUTHAL ANGLE =',F5.1,
& ' (TRANSMITTED PROJECTILES)'/)
do ima = MAXD1,1,-1
if(meagt(ima,ig2,22).ne.0) goto 2115
enddo
ima = 1
2115 ima = min(ima+2,MAXD1)
write (21,1886) ((meagt(ie,ig2,iagb),iagb=1,22),ie=1,ima)
write (21,1886) (meagt(102,ig2,iagb),iagb=1,22)
ENDDO
2110 CONTINUE
WRITE(21,2116)
2116 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (TRANSMITTED PROJECTILES)'/)
do ima = MAXD1,1,-1
if(meat(ima,22).ne.0) goto 2117
enddo
ima = 1
2117 ima = min(ima+2,MAXD1)
write (6, 1886) ((meat(ie,iagb),iagb=1,22),ie=1,ima)
write (6, 1886) (meat(102,iagb),iagb=1,22)
WRITE(21,2118)
2118 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (TRANSMITTED PROJECTILES)'/)
WRITE(21,1886) ((MAGT(IG,IAGB),IAGB=1,22),IG=1,62)
WRITE(21,2122)
2122 FORMAT(//,' AZIMUTH.ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (TRANSMITTED ENERGY)'/)
WRITE(21,2127) (EMAT(01,IAGB),IAGB=1,11)
WRITE(21,2125) ((EMAT(IG,IAGB),IAGB=1,11),IG=2,NG)
WRITE(21,2028)
WRITE(21,2131) EMAT(1,1),(EMAT(1,IAGB),IAGB=12,22)
DO IG=2,NG
WRITE(21,2126) EMAT(IG,1),(EMAT(IG,IAGB),IAGB=12,22)
ENDDO
2125 FORMAT(1X,1F5.0,10E11.4)
2126 FORMAT(1X,1F5.0,11E11.4)
2127 FORMAT(1X,1F5.0,10F11.0)
2131 FORMAT(1H1,1X,1F5.0,11F11.0)
9000 CONTINUE
CLOSE(UNIT=21)
CLOSE(UNIT=22)
CLOSE(UNIT=99)
8000 CONTINUE
END
C=======================================================================
C OUTPUT WRITER SUBROUTINES
C=======================================================================
C
C Write backward sputtering matrix and energy-angle correlation tables.
C
subroutine writeBackwardSputterMatrixSummary(ISPA,NH,JT,NJ,
& EASL,MEASL,TEMPNH,ELOG,MEAS,MAXD1,ALPHA,NGIK,DGI,
& MEAGS,MAGSA,MAGS,L,ISPAL,MAXNL,MAXD2,MAXNLm15)
implicit none
integer*4 ISPA,NH,MAXD1,NGIK,L,MAXNL,MAXD2,MAXNLm15
integer*4 J,IESLOG,IMA,IES,IAS,IESP,IAGS,IG2,IG,IA
integer*4 JT(MAXNL),NJ(MAXNL),ISPAL(MAXNL)
integer*4 MEASL(75,21,MAXNLm15),MEAS(MAXD2,22,MAXNLm15)
integer*4 MEAGS(MAXD2,12,22,MAXNLm15)
integer*4 MAGSA(62,32,MAXNLm15),MAGS(62,22,MAXNLm15)
real*8 EASL(75,MAXNLm15),TEMPNH,ELOG(75),ALPHA,DGI,EEE
IF(ISPA.LT.10000) GO TO 1900
DO J=1,JT(3)
EASL(2,J)=DBLE(MEASL(2,21,J))/(DBLE(NH)*0.1)
DO IESLOG=3,74
EASL(IESLOG,J)=DBLE(MEASL(IESLOG,21,J))/(TEMPNH*10.D0
& **((IESLOG-1)/12.D0))
ENDDO
ENDDO
DO 1852 J=1,NJ(1)
WRITE(21,1854) J
1854 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) (BAC
&KWARD SPUTTERED PARTICLES) ; 1. LAYER ; SPECIES',I2/)
do ima = 74,2,-1
if(measl(ima,21,j).ne.0) goto 1855
enddo
ima = 1
1855 ima = min(ima+2,74)
do ies = 1, ima
write (6, 1858) elog(ies), (measl(ies,ias,j),ias=1,21),
& easl(ies,j)
enddo
write (6, 1858) elog(75), (measl(75,ias,j),ias=1,21),easl(75,j)
1858 FORMAT(1X,1E12.4,20I5,I6,1E12.4)
WRITE(21,1884) J
1884 FORMAT(//,' ENERGY(E/E0 IN %) - ',
& 'POLAR ANGLE IN COS-INTERVALS (0.05) ',
& '(BACKWARD SPUTTERED PARTICLES) , 1.LAYER , SPECIES',I2/)
do ima = MAXD1,1,-1
if(meas(ima,22,j).ne.0) goto 1883
enddo
ima = 1
1883 ima = min(ima+2,MAXD1)
write (6, 1886) ((meas(iesp,iags,j),iags=1,22),iesp=1,ima)
write (6, 1886) (meas(102,iags,j),iags=1,22)
1886 FORMAT(1X,I3,20I6,I8)
IF(ALPHA.LT.1.) GO TO 1878
DO 1870 IG2=1,NGIK,1
EEE = IG2*DGI
WRITE(21,1872) EEE,J
1872 FORMAT(//,' ENERGY(E/E0 IN %) - ',
& 'POLAR ANGLE IN COS-INTERVALS (0.05) ',
& 'AT AZIMUTHAL ANGLE =',F5.1,
& ' (BACKWARD SPUTTERED ATOMS) , 1.LAYER , SPECIES',I2/)
do ima = MAXD1,1,-1
if(meags(ima,ig2,22,j).ne.0) goto 1885
enddo
ima = 1
1885 ima = min(ima+2,MAXD1)
do iesp = 1, ima
write (6, 1886) (meags(iesp,ig2,iags,j),iags=1,22)
end do
write (6, 1886) (meags(102,ig2,iags,j),iags=1,22)
1870 CONTINUE
WRITE(21,1889) J
1889 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN DEGREES ',
& '(BACKWARD SPUTTERED PARTICLES) , 1.LAYER , SPECIES',I2/)
WRITE(21,1887) ((MAGSA(IG,IA,J),IA=1,32),IG=1,62)
1887 FORMAT(1X,31I4,I6)
1878 CONTINUE
WRITE(21,1888) J
1888 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) ',
& ' (BACKWARD SPUTTERED PARTICLES) , 1.LAYER , SPECIES',I2/)
WRITE(21,1886) ((MAGS(IG,IAGS,J),IAGS=1,22),IG=1,62)
1852 CONTINUE
IF(L.EQ.1) GO TO 1900
if(ispal(2).eq.0) goto 1900
DO 1862 J=NJ(1)+1,JT(3)
WRITE(21,1864) J-NJ(1)
1864 FORMAT(//,' LOG ENERGY - COS OF EMISSION ANGLE (0.05 STEPS) ',
& '(BACKWARD SPUTTERED PARTICLES) , 2. LAYER , SPECIES',I2/)
do ima = 74,1,-1
if(measl(ima,21,j).ne.0) goto 1865
enddo
ima = 1
1865 ima = min(ima+2,74)
do ies = 1, ima
write (6, 1858) elog(ies),(measl(ies,ias,j),ias=1,21),
& easl(ies,j)
enddo
write (6, 1858) elog(75),(measl(75,ias,j),ias=1,21),easl(75,j)
WRITE(21,1894) J-NJ(1)
1894 FORMAT(//,' ENERGY(E/E0 IN %) - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) (BACKWARD SPUTTERED PARTICLES) , 2.LAYER , SPECIES',
& I2/)
do ima = MAXD1,1,-1
if(meas(ima,22,j).ne.0) goto 1895
enddo
ima = 1
1895 ima = min(ima+2,MAXD1)
WRITE(21,1886)((meas(iesp,iags,j),iags=1,22),iesp=1,ima)
WRITE(21,1886)(meas(102,iags,j),iags=1,22)
WRITE(21,1898) J-NJ(1)
1898 FORMAT(//,' AZIMUTHAL ANGLE - POLAR ANGLE IN COS-INTERVALS ',
& '(0.05) ',
1 ' (BACKWARD SPUTTERED PARTICLES) , 2.LAYER , SPECIES',I2/)
WRITE(21,1886) ((MAGS(IG,IAGS,J),IAGS=1,22),IG=1,62)
1862 CONTINUE
1900 CONTINUE
return
end
C
C Write angular distributions for transmission sputtered particles.
C
subroutine writeTransmissionSputterAngularSummary(ispat,nLayers,
& nj,jt,nSpecies,ispal,ispalt,itsp,kadst,kdstj,kdstl,
& rkadst,rkdstj,rkdstl,angleBins,maxNl,maxNl5,maxNlm15)
implicit none
integer maxNl,maxNl5,maxNlm15
integer ispat,nLayers,nSpecies
integer i,j
integer*4 nj(maxNl),jt(maxNl)
integer*4 ispal(maxNl),ispalt(maxNl),itsp(maxNl5)
integer*4 kadst(20),kdstj(20,maxNlm15),kdstl(20,6)
real*8 rkadst(20),rkdstj(20,maxNlm15),rkdstl(20,maxNl)
real*8 angleBins(20)
write(21,1760)
1760 format(///5X,'POLAR ANGULAR DISTRIBUTION OF ALL TRANSMISSION '//
& 'SPUTTERED PARTICLES'//)
do i=1,20
rkadst(i)=kadst(i)*20.D0/ispat
enddo
write(21,1518) (angleBins(i),i=1,20),(kadst(i),i=1,20),
& (rkadst(i),i=1,20)
if(nLayers.EQ.3) go to 1764
do i=1,20
do j=1,nj(1)
kdstl(i,1)=kdstl(i,1)+kdstj(i,j)
enddo
enddo
do i=1,20
do j=nj(1)+1,jt(3)
kdstl(i,2)=kdstl(i,2)+kdstj(i,j)
enddo
enddo
1766 continue
do j=1,2
if(ispal(j).EQ.0) go to 1754
do i=1,20
rkdstl(i,j)=kdstl(i,j)*20.D0/ispal(j)
enddo
1754 continue
enddo
do j=1,jt(3)
if(itsp(j).EQ.0) go to 1756
do i=1,20
rkdstj(i,j)=kdstj(i,j)*20.D0/itsp(j)
enddo
1756 continue
enddo
write(21,1776)
1776 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 1'//)
write(21,1518) (angleBins(i),i=1,20),(kdstl(i,1),i=1,20)
& ,(rkdstl(i,1),i=1,20)
if(nj(1).EQ.1) go to 1778
do 1780 j=1,nj(1)
if(itsp(j).EQ.0) go to 1780
write(21,1782) j
1782 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 1 , SPECIES ',I1//)
write(21,1518) (angleBins(i),i=1,20),(kdstj(i,j),i=1,20)
& ,(rkdstj(i,j),i=1,20)
1780 continue
1778 if(nLayers.EQ.1) go to 1800
write(21,1786)
1786 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2'//)
write(21,1518) (angleBins(i),i=1,20),(kdstl(i,2),i=1,20)
& ,(rkdstl(i,2),i=1,20)
if(nj(2).EQ.1) go to 1800
do j=nj(1)+1,jt(3)
write(21,1790) j-nj(1)
1790 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2 , SPECIES ',I1//)
write(21,1518) (angleBins(i),i=1,20),(kdstj(i,j),i=1,20)
& ,(rkdstj(i,j),i=1,20)
enddo
go to 1800
1764 do i=1,20
do j=1,nj(2)
kdstl(i,1)=kdstl(i,1)+kdstj(i,j)
enddo
do j=nj(2)+1,nSpecies-nj(1)
kdstl(i,2)=kdstl(i,2)+kdstj(i,j)
enddo
enddo
do 1799 j=1,2
if(ispalt(j+1).EQ.0) go to 1799
do i=1,20
rkdstl(i,j)=kdstl(i,j)*20.D0/ispalt(j+1)
enddo
1799 continue
do 1797 j=1,nSpecies-nj(1)
if(itsp(j+nj(1)).EQ.0) go to 1797
do i=1,20
rkdstj(i,j)=kdstj(i,j)*20.D0/itsp(j+nj(1))
enddo
1797 continue
write(21,1771)
1771 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2'//)
write(21,1518) (angleBins(i),i=1,20),(kdstl(i,1),i=1,20)
& ,(rkdstl(i,1),i=1,20)
if(nj(2).EQ.1) go to 1773
do 1775 j=1,nj(2)
if(itsp(j+nj(1)).EQ.0) go to 1775
write(21,1777) j
1777 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2 ; SPECIES ',I1//)
write(21,1518) (angleBins(i),i=1,20),(kdstj(i,j),i=1,20)
& ,(rkdstj(i,j),i=1,20)
1775 continue
1773 continue
write(21,1779)
1779 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 3'//)
write(21,1518) (angleBins(i),i=1,20),(kdstl(i,2),i=1,20)
& ,(rkdstl(i,2),i=1,20)
if(nj(2).EQ.1) go to 1800
do j=nj(2)+1,nSpecies-nj(1)
write(21,1783) j-nj(2)
1783 format(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 3 ; SPECIES ',I1//)
write(21,1518) (angleBins(i),i=1,20),(kdstj(i,j),i=1,20)
& ,(rkdstj(i,j),i=1,20)
enddo
1800 continue
return
1518 format(5X,20F6.2//,5X,20I6/5X,20F6.3)
end
C
C Write transmission sputtering yields and energy summaries.
C
subroutine writeTransmissionSputterYieldSummary(ispat,nLayers,
& nj,jt,nSpecies,nProjectiles,initialEnergy,totalEnergy,
& itsp,etsp,ispalt,espalt,ispipt,ispist,ispopt,ispost,
& espipt,espist,espopt,espost,ript,rist,ropt,rost,reipt,
& reist,reopt,reost,espmipt,espmist,espmopt,espmost,spyt,
& spet,reyt,emspt,maxNl,maxNl5)
implicit none
integer maxNl,maxNl5
integer ispat,nLayers,nSpecies,nProjectiles
integer j
integer*4 nj(maxNl),jt(maxNl)
integer*4 itsp(maxNl5),ispalt(maxNl)
integer*4 ispipt(maxNl5),ispist(maxNl5)
integer*4 ispopt(maxNl5),ispost(maxNl5)
real*8 initialEnergy,totalEnergy
real*8 etsp(maxNl5),espalt(maxNl)
real*8 ript(maxNl5),rist(maxNl5),ropt(maxNl5),rost(maxNl5)
real*8 reipt(maxNl5),reist(maxNl5),reopt(maxNl5)
real*8 reost(maxNl5)
real*8 espipt(maxNl5),espist(maxNl5),espopt(maxNl5)
real*8 espost(maxNl5)
real*8 espmipt(maxNl5),espmist(maxNl5),espmopt(maxNl5)
real*8 espmost(maxNl5)
real*8 spyt(maxNl5),spet(maxNl5),reyt(maxNl5),emspt(maxNl5)
logical equal
external equal
if(ispat.eq.0) return
write(21,1704)
1704 format(1H1,5X,'TRANSMISSION SPUTTERING')
do j=1,nj(1)
ispalt(1) = ispalt(1)+itsp(j)
espalt(1) = espalt(1)+etsp(j)
enddo
do j=nj(1)+1,jt(3)
ispalt(2) = ispalt(2)+itsp(j)
espalt(2) = espalt(2)+etsp(j)
enddo
do j=jt(3)+1,nSpecies
ispalt(3) = ispalt(3)+itsp(j)
espalt(3) = espalt(3)+etsp(j)
enddo
write(21,1712) ispat,totalEnergy
1712 format(///,8X,'ALL SPUTTERED PARTICLES = ',I7,3X,
& 'TOTAL SPUTTERED ENERGY = ',E10.4,3H EV//)
do j=1,nLayers
write(21,1713) j,ispalt(j),espalt(j)
1713 format(8X,'SPUTTERED PARTICLES (LAYER ',I3,') = ',I7,
& 3X,'SPUTTERED ENERGY = ',E10.4,3H EV)
enddo
do j=1,nSpecies
ript(j)=dble(ispipt(j))/dble(ispat)
rist(j)=dble(ispist(j))/dble(ispat)
ropt(j)=dble(ispopt(j))/dble(ispat)
rost(j)=dble(ispost(j))/dble(ispat)
reipt(j)=espipt(j)/totalEnergy
reist(j)=espist(j)/totalEnergy
reopt(j)=espopt(j)/totalEnergy
reost(j)=espost(j)/totalEnergy
enddo
1715 continue
do 1717 j=1,nSpecies
if(ispipt(j).eq.0) go to 4571
espmipt(j)=espipt(j)/dble(ispipt(j))
4571 if(ispist(j).eq.0) go to 4572
espmist(j)=espist(j)/dble(ispist(j))
4572 if(ispopt(j).eq.0) go to 4573
espmopt(j)=espopt(j)/dble(ispopt(j))
4573 if(ispost(j).eq.0) go to 1717
espmost(j)=espost(j)/dble(ispost(j))
1717 continue
do j=1,nSpecies
spyt(j)=dble(itsp(j))/dble(nProjectiles)
spet(j)=etsp(j)/(nProjectiles*initialEnergy)
enddo
do 1737 j=1,nSpecies
if (equal(spyt(j),0.0D0))go to 1737
reyt(j)=spet(j)/spyt(j)
emspt(j)=reyt(j)*initialEnergy
1737 continue
if(ispalt(1).eq.0) go to 1719
write(21,1714)
1714 format(//1X,'1.LAYER')
do j=1,nj(1)
write(21,1564) j,itsp(j),j,etsp(j)
enddo
do 1734 j=1,nj(1)
write(21,1581) j,ispipt(j),ript(j),espipt(j),reipt(j),
& espmipt(j),j,ispist(j),rist(j),espist(j),reist(j),
& espmist(j),j,ispopt(j),ropt(j),espopt(j),reopt(j),
& espmopt(j),j,ispost(j),rost(j),espost(j),reost(j),
& espmost(j)
1734 continue
1581 format(/9X,'ION IN , PRIMARY KO(',I1,') = ',I7,1F9.4,
& 4X,'ENERGY = ',E10.4,' EV',1F9.4,4X,
& 'MEAN ENERGY = ',E10.4/
& 9X,'ION IN , SECOND. KO(',I1,') = ',I7,1F9.4,
& 4X,'ENERGY = ',E10.4,' EV',1F9.4,4X,
& 'MEAN ENERGY = ',E10.4/
& 8X,'ION OUT , PRIMARY KO(',I1,') = ',I7,1F9.4,
& 4X,'ENERGY = ',E10.4,' EV',1F9.4,4X,
& 'MEAN ENERGY = ',E10.4/
& 8X,'ION OUT , SECOND. KO(',I1,') = ',I7,1F9.4,
& 4X,'ENERGY = ',E10.4,' EV',1F9.4,4X,
& 'MEAN ENERGY = ',E10.4)
write(21,1577)
do j=1,nj(1)
write(21,1582) j,spyt(j),j,spet(j),j,reyt(j),j,emspt(j)
enddo
1719 if(nLayers.eq.1) go to 1749
if(ispalt(2).eq.0) go to 1744
write(21,1720)
1720 format(/1X,'2.LAYER')
do j=nj(1)+1,jt(3)
write(21,1564) j-nj(1),itsp(j),j-nj(1),etsp(j)
enddo
do j=nj(1)+1,jt(3)
write(21,1581) j-nj(1),ispipt(j),ript(j),espipt(j),
& reipt(j),espmipt(j),j-nj(1),ispist(j),rist(j),
& espist(j),reist(j),espmist(j),j-nj(1),ispopt(j),
& ropt(j),espopt(j),reopt(j),espmopt(j),j-nj(1),
& ispost(j),rost(j),espost(j),reost(j),espmost(j)
enddo
write(21,1577)
do j=nj(1)+1,jt(3)
write(21,1582) j-nj(1),spyt(j),j-nj(1),spet(j),
& j-nj(1),reyt(j),j-nj(1),emspt(j)
enddo
1744 if(nLayers.eq.2) go to 1749
if(ispalt(3).eq.0) go to 1749
write(21,1726)
1726 format(/1X,'3.LAYER')
do j=jt(3)+1,nSpecies
write(21,1564) j-jt(3),itsp(j),j-jt(3),etsp(j)
enddo
do j=jt(3)+1,nSpecies
write(21,1581) j-jt(3),ispipt(j),ript(j),espipt(j),
& reipt(j),espmipt(j),j-jt(3),ispist(j),rist(j),
& espist(j),reist(j),espmist(j),j-jt(3),ispopt(j),
& ropt(j),espopt(j),reopt(j),espmopt(j),j-jt(3),
& ispost(j),rost(j),espost(j),reost(j),espmost(j)
enddo
write(21,1577)
do j=jt(3)+1,nSpecies
write(21,1582) j-jt(3),spyt(j),j-jt(3),spet(j),
& j-jt(3),reyt(j),j-jt(3),emspt(j)
enddo
1749 continue
return
1564 format(9X,'SPUTTERED PARTICLES(',I1,') = ',I7,5X,
& 'SPUTTERED ENERGY(',I1,') = ',E10.4,' EV')
1577 format(/)
1582 format(5X,'SPUTTERING YIELD(',I1,') = ',1PE10.3,
& ' SPUTTERED ENERGY(',I1,') = ',1E10.3,
& ' REL.MEAN ENERGY(',I1,') = ',1E10.3,
& ' MEAN ENERGY(',I1,') = ',1E10.3)
end
C=======================================================================
C=======================================================================
C WRITE BACKWARD SPUTTERING ANGULAR SUMMARY
C=======================================================================
subroutine writeBackwardSputterAngularSummary(ISPA,L,NJ,JT,IBSP,
& ISPAL,KADS,KADSJ,KADSL,RKADS,RKADSJ,RKADSL,AI,MAXNL,
& MAXNLm15)
implicit none
integer ISPA,L,MAXNL,MAXNLm15
integer NJ(MAXNL),JT(MAXNL)
integer IBSP(*),ISPAL(MAXNL)
integer KADS(20),KADSJ(20,MAXNLm15),KADSL(20,6)
integer I,J
real*8 AI(20),RKADS(20),RKADSJ(20,MAXNLm15)
real*8 RKADSL(20,MAXNL)
C
WRITE(21,1601)
1601 FORMAT(///5X,'POLAR ANGULAR DISTRIBUTION OF ALL BACKWARD ',
& 'SPUTTERED PARTICLES'//)
DO I=1,20
RKADS(I)=KADS(I)*20.D0/ISPA
ENDDO
WRITE(21,1518) (AI(I),I=1,20),(KADS(I),I=1,20),
& (RKADS(I),I=1,20)
DO I=1,20
DO J=1,NJ(1)
KADSL(I,1)=KADSL(I,1)+KADSJ(I,J)
ENDDO
ENDDO
DO I=1,20
DO J=NJ(1)+1,JT(3)
KADSL(I,2)=KADSL(I,2)+KADSJ(I,J)
ENDDO
ENDDO
IF(ISPAL(1).EQ.0) GO TO 1614
IF(NJ(1).EQ.1) GO TO 1614
WRITE(21,1606)
1606 FORMAT(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 1'//)
DO I=1,20
RKADSL(I,1)=KADSL(I,1)*20.D0/ISPAL(1)
ENDDO
WRITE(21,1518) (AI(I),I=1,20),(KADSL(I,1),I=1,20),
& (RKADSL(I,1),I=1,20)
DO 1618 J=1,NJ(1)
IF(IBSP(J).EQ.0) GO TO 1618
WRITE(21,1616) J
1616 FORMAT(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 1 ; SPECIES ',I1//)
DO I=1,20
RKADSJ(I,J)=KADSJ(I,J)*20.D0/IBSP(J)
ENDDO
WRITE(21,1518) (AI(I),I=1,20),(KADSJ(I,J),I=1,20),
& (RKADSJ(I,J),I=1,20)
1618 CONTINUE
1614 IF(L.EQ.1) GO TO 1622
IF(ISPAL(2).EQ.0) GO TO 1622
WRITE(21,1610)
1610 FORMAT(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2'//)
DO I=1,20
RKADSL(I,2)=KADSL(I,2)*20.D0/ISPAL(2)
ENDDO
WRITE(21,1518) (AI(I),I=1,20),(KADSL(I,2),I=1,20),
& (RKADSL(I,2),I=1,20)
IF(NJ(2).EQ.1) GO TO 1622
DO 1624 J=NJ(1)+1,JT(3)
IF(IBSP(J).EQ.0) GO TO 1624
WRITE(21,1626) J-NJ(1)
1626 FORMAT(///5X,'POLAR ANGULAR DISTRIBUTION OF SPUTTERED ',
& 'PARTICLES ; LAYER 2 ; SPECIES ',I1//)
DO I=1,20
RKADSJ(I,J)=KADSJ(I,J)*20.D0/IBSP(J)
ENDDO
WRITE(21,1518) (AI(I),I=1,20),(KADSJ(I,J),I=1,20),
& (RKADSJ(I,J),I=1,20)
1624 CONTINUE
1622 CONTINUE
1518 FORMAT(5X,20F6.2//,5X,20I6/5X,20F6.3)
return
end
C=======================================================================
C WRITE BACKWARD SPUTTERING YIELD SUMMARY
C=======================================================================
subroutine writeBackwardSputterYieldSummary(ISPA,L,NJ,JT,LJ,HN,
& EMV,IBSP,IBSPL,EBSP,ISPAL,ESPAL,ESPA,ISPIP,ISPIS,ISPOP,
& ISPOS,ESPIP,ESPIS,ESPOP,ESPOS,RIP,RIS,ROP,ROS,REIP,
& REIS,REOP,REOS,RIPJ,RISJ,ROPJ,ROSJ,REIPJ,REISJ,
& REOPJ,REOSJ,ESPMIP,ESPMIS,ESPMOP,ESPMOS,SPY,SPE,
& REY,EMSP,SPE2S,SPE3S,SPE4S,SPE5S,SPE6S,SPE1SL,
& SPE2SL,SPE3SL,SPE4SL,SPE5SL,SPE6SL,FIESB,SEESB,
& THESB,FOESB,SGMESB,DFIESB,DSEESB,DTHESB,MAXNL,
& MAXNL5,MAXNLm15)
implicit none
integer ISPA,L,LJ,MAXNL,MAXNL5,MAXNLm15
integer NJ(MAXNL),JT(MAXNL)
integer IBSP(MAXNL5),IBSPL(MAXNL5),ISPAL(MAXNL)
integer ISPIP(MAXNL5),ISPIS(MAXNL5),ISPOP(MAXNL5)
integer ISPOS(MAXNL5)
integer J
real*8 HN,EMV,ESPA
real*8 EBSP(MAXNL5),ESPAL(MAXNL)
real*8 ESPIP(MAXNL5),ESPIS(MAXNL5),ESPOP(MAXNL5)
real*8 ESPOS(MAXNL5)
real*8 RIP(MAXNL5),RIS(MAXNL5),ROP(MAXNL5),ROS(MAXNL5)
real*8 REIP(MAXNL5),REIS(MAXNL5),REOP(MAXNL5),REOS(MAXNL5)
real*8 RIPJ(MAXNL5),RISJ(MAXNL5),ROPJ(MAXNL5),ROSJ(MAXNL5)
real*8 REIPJ(MAXNL5),REISJ(MAXNL5),REOPJ(MAXNL5)
real*8 REOSJ(MAXNL5)
real*8 ESPMIP(MAXNL5),ESPMIS(MAXNL5),ESPMOP(MAXNL5)
real*8 ESPMOS(MAXNL5)
real*8 SPY(MAXNL5),SPE(MAXNL5),REY(MAXNL5),EMSP(MAXNL5)
real*8 SPE2S(MAXNL5),SPE3S(MAXNL5),SPE4S(MAXNL5)
real*8 SPE5S(MAXNL5),SPE6S(MAXNL5)
real*8 SPE1SL(MAXNL5),SPE2SL(MAXNL5),SPE3SL(MAXNL5)
real*8 SPE4SL(MAXNL5),SPE5SL(MAXNL5),SPE6SL(MAXNL5)
real*8 FIESB(MAXNLm15),SEESB(MAXNLm15),THESB(MAXNLm15)
real*8 FOESB(MAXNLm15),SGMESB(MAXNLm15),DFIESB(MAXNLm15)
real*8 DSEESB(MAXNLm15),DTHESB(MAXNLm15)
real*8 FIES0,SEES,THES,FOES,FIES,SIES,SIGMES
real*8 DFIES0,DSEES,DTHES
real*8 FIES0L,SEESL,THESL,FOESL,FIESL,SIESL,SIGMSL
real*8 DFIESL,DSEESL,DTHESL
real*8 EBSP1,EBSP2,EBSP3,EBSP4,EBSP5,EBSP6
real*8 EBSP1L,EBSP2L,EBSP3L,EBSP4L,EBSP5L,EBSP6L
real*8 YSP,YSPL
logical equal
if(ISPA.eq.0) return
write(21,1548)
1548 format(1H1,5X,'BACKWARD SPUTTERING')
do J=1,NJ(1)
ISPAL(1) = ISPAL(1)+IBSP(J)
ESPAL(1) = ESPAL(1)+EBSP(J)
enddo
do J=NJ(1)+1,JT(3)
ISPAL(2) = ISPAL(2)+IBSP(J)
ESPAL(2) = ESPAL(2)+EBSP(J)
enddo
do J=JT(3)+1,LJ
ISPAL(3) = ISPAL(3)+IBSP(J)
ESPAL(3) = ESPAL(3)+EBSP(J)
enddo
write(21,1558) ISPA,ESPA
1558 format(///,8X,'ALL SPUTTERED PARTICLES = ',I7,3X,
& 'TOTAL SPUTTERED ENERGY = ',E10.4,3H EV//)
do 1557 J=1,L
write(21,1559) J,ISPAL(J),ESPAL(J)
1559 format(8X,'SPUTTERED PARTICLES (',I3,'.LAYER) = ',I7,3X,
& 'SPUTTERED ENERGY = ',E10.4,3H EV)
1557 continue
write(21,1560)
1560 format(//1X,'1.LAYER')
do 1562 J=1,NJ(1)
write(21,1564) J,IBSP(J),J,EBSP(J)
1564 format(9X,'SPUTTERED PARTICLES(',I1,') = ',I7,5X,
& 'SPUTTERED ENERGY(',I1,') = ',E10.4,' EV')
1562 continue
if(ISPA.eq.0) return
do J=1,LJ
RIP(J)=dble(ISPIP(J))/dble(ISPA)
RIS(J)=dble(ISPIS(J))/dble(ISPA)
ROP(J)=dble(ISPOP(J))/dble(ISPA)
ROS(J)=dble(ISPOS(J))/dble(ISPA)
REIP(J)=ESPIP(J)/ESPA
REIS(J)=ESPIS(J)/ESPA
REOP(J)=ESPOP(J)/ESPA
REOS(J)=ESPOS(J)/ESPA
enddo
do 1584 J=1,LJ
if(IBSP(J).eq.0) go to 1584
RIPJ(J)=dble(ISPIP(J))/dble(IBSP(J))
RISJ(J)=dble(ISPIS(J))/dble(IBSP(J))
ROPJ(J)=dble(ISPOP(J))/dble(IBSP(J))
ROSJ(J)=dble(ISPOS(J))/dble(IBSP(J))
REIPJ(J)=ESPIP(J)/EBSP(J)
REISJ(J)=ESPIS(J)/EBSP(J)
REOPJ(J)=ESPOP(J)/EBSP(J)
REOSJ(J)=ESPOS(J)/EBSP(J)
1584 continue
do 1571 J=1,LJ
if(ISPIP(J).eq.0) go to 3571
ESPMIP(J)=ESPIP(J)/dble(ISPIP(J))
3571 if(ISPIS(J).eq.0) go to 3572
ESPMIS(J)=ESPIS(J)/dble(ISPIS(J))
3572 if(ISPOP(J).eq.0) go to 3573
ESPMOP(J)=ESPOP(J)/dble(ISPOP(J))
3573 if(ISPOS(J).eq.0) go to 1571
ESPMOS(J)=ESPOS(J)/dble(ISPOS(J))
1571 continue
1573 continue
do J=1,LJ
SPY(J)=dble(IBSP(J))/HN
SPE(J)=EBSP(J)/(HN*EMV)
enddo
do 1579 J=1,LJ
if (equal(SPY(J),0.0D0)) go to 1579
REY(J)=SPE(J)/SPY(J)
EMSP(J)=EBSP(J)/IBSP(J)
1579 continue
if(ISPAL(1).eq.0) go to 1575
do J=1,NJ(1)
write(21,1576) J,ISPIP(J),RIP(J),RIPJ(J),ESPIP(J),REIP(J),
& REIPJ(J),ESPMIP(J),J,ISPIS(J),RIS(J),RISJ(J),ESPIS(J),
& REIS(J),REISJ(J),ESPMIS(J),J,ISPOP(J),ROP(J),ROPJ(J),
& ESPOP(J),REOP(J),REOPJ(J),ESPMOP(J),J,ISPOS(J),ROS(J),
& ROSJ(J),ESPOS(J),REOS(J),REOSJ(J),ESPMOS(J)
1576 format(/9X,'ION IN , PRIMARY KO(',I1,') = ',I7,2F9.4,4X,
& 'ENERGY = ',E10.4,' EV',2F9.4,4X,'MEAN ENERGY = ',E10.4/
& 9X,'ION IN , SECOND. KO(',I1,') = ',I7,2F9.4,4X,
& 'ENERGY = ',E10.4,' EV',2F9.4,4X,'MEAN ENERGY = ',E10.4/
& 8X,'ION OUT , PRIMARY KO(',I1,') = ',I7,2F9.4,4X,
& 'ENERGY = ',E10.4,' EV',2F9.4,4X,'MEAN ENERGY = ',E10.4/
& 8X,'ION OUT , SECOND. KO(',I1,') = ',I7,2F9.4,4X,
& 'ENERGY = ',E10.4,' EV',2F9.4,4X,'MEAN ENERGY = ',E10.4)
enddo
1575 continue
write(21,1577)
1577 format(/)
do 1580 J=1,NJ(1)
write(21,1582) J,SPY(J),J,SPE(J),J,REY(J),J,EMSP(J)
1582 format(5X,'SPUTTERING YIELD(',I1,') = ',1PE10.3,
& ' SPUTTERED ENERGY(',I1,') = ',1E10.3,
& ' REL.MEAN ENERGY(',I1,') = ',1E10.3,
& ' MEAN ENERGY(',I1,') = ',1E10.3)
1580 continue
do 7260 J=1,NJ(1)
if(IBSP(J).le.1) go to 7260
YSP=IBSP(J)
YSPL=IBSPL(J)
call MOMENTN(FIES0,SEES,THES,FOES,FIES,SIES,SIGMES,
& DFIES0,DSEES,DTHES,EBSP1,EBSP2,EBSP3,EBSP4,EBSP5,
& EBSP6,EBSP(J),SPE2S(J),SPE3S(J),SPE4S(J),SPE5S(J),
& SPE6S(J),YSP)
call MOMENTN(FIES0L,SEESL,THESL,FOESL,FIESL,SIESL,
& SIGMSL,DFIESL,DSEESL,DTHESL,EBSP1L,EBSP2L,EBSP3L,
& EBSP4L,EBSP5L,EBSP6L,SPE1SL(J),SPE2SL(J),SPE3SL(J),
& SPE4SL(J),SPE5SL(J),SPE6SL(J),YSPL)
write(21,7117)
write(21,7261) J,FIES0,SEES,THES,FOES,SIGMES,DFIES0,
& DSEES,DTHES
7261 format(1X,' ENERGY(',I1,')',5X,1P1E12.4,7E14.4)
write(21,7263) J,FIES0L,SEESL,THESL,FOESL,SIGMSL,
& DFIESL,DSEESL,DTHESL
7263 format(1X,'LOGENERGY(',I1,')',5X,1P1E12.4,7E14.4)
write(21,7118)
7118 format(/20X,' 1.MOMENT ',4X,' 2.MOMENT ',4X,' 3.MOMENT ',
& 4X,' 4.MOMENT ',4X,' 5.MOMENT ',4X,' 6.MOMENT ')
write(21,7265) J,EBSP1,EBSP2,EBSP3,EBSP4,EBSP5,EBSP6
7265 format(1X,' ENERGY(',I1,')',5X,1P1E12.4,5E14.4)
write(21,7267) J,EBSP1L,EBSP2L,EBSP3L,EBSP4L,EBSP5L,
& EBSP6L
7267 format(1X,'LOGENERGY(',I1,')',5X,1P1E12.4,5E14.4)
FIESB(J)=FIES0
SEESB(J)=SEES
THESB(J)=THES
FOESB(J)=FOES
SGMESB(J)=SIGMES
DFIESB(J)=DFIES0
DSEESB(J)=DSEES
DTHESB(J)=DTHES
7260 continue
if(L.eq.1) go to 1593
if(ISPAL(2).eq.0) go to 1593
write(21,1566)
1566 format(//1X,'2.LAYER')
do 1568 J=NJ(1)+1,JT(3)
write(21,1570) J-NJ(1),IBSP(J),J-NJ(1),EBSP(J)
1570 format(9X,'SPUTTERED PARTICLES(',I1,') = ',I7,5X,
& 'SPUTTERED ENERGY(',I1,') = ',E10.4,' EV')
1568 continue
do 1586 J=NJ(1)+1,JT(3)
write(21,1576) J-NJ(1),ISPIP(J),RIP(J),RIPJ(J),ESPIP(J),
& REIP(J),REIPJ(J),ESPMIP(J),J-NJ(1),ISPIS(J),RIS(J),
& RISJ(J),ESPIS(J),REIS(J),REISJ(J),ESPMIS(J),J-NJ(1),
& ISPOP(J),ROP(J),ROPJ(J),ESPOP(J),REOP(J),REOPJ(J),
& ESPMOP(J),J-NJ(1),ISPOS(J),ROS(J),ROSJ(J),ESPOS(J),
& REOS(J),REOSJ(J),ESPMOS(J)
1586 continue
write(21,1577)
do J=NJ(1)+1,JT(3)
write(21,1582) J-NJ(1),SPY(J),J,SPE(J),J,REY(J),J,EMSP(J)
enddo
1593 continue
do 7262 J=NJ(1)+1,JT(3)
if(IBSP(J).le.1) go to 7262
YSP=IBSP(J)
call MOMENTS(FIES0,SEES,THES,FOES,FIES,SIES,SIGMES,
& DFIES0,DSEES,DTHES,EBSP(J),SPE2S(J),SPE3S(J),
& SPE4S(J),SPE5S(J),SPE6S(J),YSP)
write(21,7117)
write(21,7261) J,FIES0,SEES,THES,FOES,SIGMES,DFIES0,
& DSEES,DTHES
FIESB(J)=FIES0
SEESB(J)=SEES
THESB(J)=THES
FOESB(J)=FOES
SGMESB(J)=SIGMES
DFIESB(J)=DFIES0
DSEESB(J)=DSEES
DTHESB(J)=DTHES
7262 continue
if(L.eq.2) go to 1532
if(ISPAL(3).eq.0) go to 1532
write(21,1534)
1534 format(//1X,'3.LAYER')
do 1536 J=JT(3)+1,LJ
write(21,1538) J-JT(3),IBSP(J),J-JT(3),EBSP(J)
1538 format(10X,'SPUTTERED PARTICLES(',I1,') = ',I7,6X,
& 'SPUTTERED ENERGY(',I1,') = ',E10.4,' EV')
1536 continue
do J=JT(3)+1,LJ
write(21,1576) J-JT(3),ISPIP(J),RIP(J),RIPJ(J),ESPIP(J),
& REIP(J),REIPJ(J),ESPMIP(J),J-JT(3),ISPIS(J),RIS(J),
& RISJ(J),ESPIS(J),REIS(J),REISJ(J),ESPMIS(J),J-JT(3),
& ISPOP(J),ROP(J),ROPJ(J),ESPOP(J),REOP(J),REOPJ(J),
& ESPMOP(J),J-JT(3),ISPOS(J),ROS(J),ROSJ(J),ESPOS(J),
& REOS(J),REOSJ(J),ESPMOS(J)
enddo
write(21,1577)
do J=JT(3)+1,LJ
write(21,1582) J-JT(3),SPY(J),J-JT(3),SPE(J),
& J-JT(3),REY(J),J-JT(3),EMSP(J)
enddo
1532 continue
return
7117 format(/20X,' MEAN ',4X,' VARIANCE ',4X,' SKEWNESS ',
& 4X,' KURTOSIS ',5X,' SIGMA ',3X,' ERROR 1.M ',
& 3X,' ERROR 2.M ',3X,' ERROR 3.M ')
end
C WRITE TRANSMISSION SUMMARY
C=======================================================================
subroutine writeTransmissionSummary(nTrans,nPrimary,transEnergy,
& initialEnergy,elasticLossSum,elasticLossSquare,
& inElasticLossSum,inElasticLossSquare,energyMoment2,
& energyMoment3,energyMoment4,energyMoment5,energyMoment6,
& pathMoment1,pathMoment2,pathMoment3,pathMoment4,
& pathMoment5,pathMoment6,angleBins,angleX,
& angleDistribution,meanTransEnergy,transEnergySigma)
implicit none
integer nTrans
integer angleBins(20)
integer i
real*8 nPrimary,transEnergy,initialEnergy
real*8 elasticLossSum,elasticLossSquare
real*8 inElasticLossSum,inElasticLossSquare
real*8 energyMoment2,energyMoment3,energyMoment4
real*8 energyMoment5,energyMoment6
real*8 pathMoment1,pathMoment2,pathMoment3
real*8 pathMoment4,pathMoment5,pathMoment6
real*8 angleX(20),angleDistribution(20)
real*8 meanTransEnergy,transEnergySigma
real*8 transCount,particleTransmission,energyTransmission
real*8 relativeMeanEnergy,meanEnergy
real*8 meanElasticLoss,varElasticLoss,sigmaElasticLoss
real*8 errorElasticLoss
real*8 meanInElasticLoss,varInElasticLoss,sigmaInElasticLoss
real*8 errorInElasticLoss
real*8 energyVariance,energySkew,energyKurtosis
real*8 energyFifth,energySixth
real*8 energyError1,energyError2,energyError3
real*8 pathMean,pathVariance,pathSkew,pathKurtosis
real*8 pathFifth,pathSixth,pathSigma
real*8 pathError1,pathError2,pathError3
logical equal
if(nTrans.eq.0) return
write(21,1529)
1529 format(///5X,' TRANSMISSION OF PROJECTILES'/)
transCount=dble(nTrans)
particleTransmission=transCount/nPrimary
energyTransmission=transEnergy/(nPrimary*initialEnergy)
relativeMeanEnergy=energyTransmission/particleTransmission
meanEnergy=relativeMeanEnergy*initialEnergy
meanTransEnergy=meanEnergy
meanElasticLoss=0.0d0
varElasticLoss=0.0d0
sigmaElasticLoss=0.0d0
errorElasticLoss=0.0d0
meanInElasticLoss=0.0d0
varInElasticLoss=0.0d0
sigmaInElasticLoss=0.0d0
errorInElasticLoss=0.0d0
if (equal(transCount,1.0d0)) go to 1520
meanElasticLoss=elasticLossSum/transCount
varElasticLoss=elasticLossSquare/transCount
& -meanElasticLoss*meanElasticLoss
sigmaElasticLoss=dsqrt(varElasticLoss)
errorElasticLoss=sigmaElasticLoss/transCount
meanInElasticLoss=inElasticLossSum/transCount
varInElasticLoss=inElasticLossSquare/transCount
& -meanInElasticLoss*meanInElasticLoss
sigmaInElasticLoss=dsqrt(varInElasticLoss)
errorInElasticLoss=sigmaInElasticLoss/transCount
1520 write(21,1522) particleTransmission,energyTransmission,
& relativeMeanEnergy,meanEnergy
1522 format(//5X,'PART.TRANSM.COEF.=',1PE11.4,
& ' ENERGY TRANSM.COEF.=',1E11.4,
& ' REL.MEAN ENERGY =',1E11.4,
& ' MEAN ENERGY =',1E11.4)
call MOMENTS(meanTransEnergy,energyVariance,energySkew,
& energyKurtosis,energyFifth,energySixth,transEnergySigma,
& energyError1,energyError2,energyError3,transEnergy,
& energyMoment2,energyMoment3,energyMoment4,energyMoment5,
& energyMoment6,transCount)
call MOMENTS(pathMean,pathVariance,pathSkew,pathKurtosis,
& pathFifth,pathSixth,pathSigma,pathError1,pathError2,
& pathError3,pathMoment1,pathMoment2,pathMoment3,pathMoment4,
& pathMoment5,pathMoment6,transCount)
write(21,7117)
write(21,7241) meanTransEnergy,energyVariance,energySkew,
& energyKurtosis,transEnergySigma,energyError1,
& energyError2,energyError3
7241 format(1X,' ENERGY',5X,1P1E12.4,7E14.4)
write(21,7242) pathMean,pathVariance,pathSkew,pathKurtosis,
& pathSigma,pathError1,pathError2,pathError3
7242 format(1X,' PATHLENGTH',5X,1P1E12.4,7E14.4)
write(21,7237) meanElasticLoss,varElasticLoss,sigmaElasticLoss,
& errorElasticLoss
write(21,7238) meanInElasticLoss,varInElasticLoss,
& sigmaInElasticLoss,errorInElasticLoss
write(21,1526)
1526 format(//5X,'POLAR ANGULAR DISTRIBUTION OF TRANSMITTED ',
& 'PARTICLES'//)
do i=1,20
angleDistribution(i)=dble(angleBins(i))*20.d0/dble(nTrans)
enddo
write(21,1530) (angleX(i),i=1,20),(angleBins(i),i=1,20),
& (angleDistribution(i),i=1,20)
1530 format(5X,20F6.2//,5X,20I6/5X,20F6.3)
return
7117 format(/20X,' MEAN ',4X,' VARIANCE ',4X,' SKEWNESS ',
& 4X,' KURTOSIS ',5X,' SIGMA ',3X,' ERROR 1.M ',
& 3X,' ERROR 2.M ',3X,' ERROR 3.M ')
7237 format(1X,'ELASTIC LOSS',5X,1P1E12.4,1E14.4,28X,
& 2E14.4)
7238 format(1X,' INEL. LOSS',5X,1P1E12.4,1E14.4,28X,
& 2E14.4)
end
C=======================================================================
C WRITE BACKSCATTERING SUMMARY
C=======================================================================
subroutine writeBackscatterSummary(nBackscatter,nBackLayer,
& nPrimary,backEnergySum,energyUnit,elasticLossSum,
& elasticLossSquare,inElasticLossSum,inElasticLossSquare,
& energyMoment2,energyMoment3,energyMoment4,energyMoment5,
& energyMoment6,logEnergyMoment1,logEnergyMoment2,
& logEnergyMoment3,logEnergyMoment4,logEnergyMoment5,
& logEnergyMoment6,pathMoment1,pathMoment2,pathMoment3,
& pathMoment4,pathMoment5,pathMoment6,angleBins,angleX,
& angleDistribution,meanBackEnergy,backEnergySigma)
implicit none
integer nBackscatter,nBackLayer
integer angleBins(20)
integer i
real*8 nPrimary,backEnergySum,energyUnit
real*8 elasticLossSum,elasticLossSquare
real*8 inElasticLossSum,inElasticLossSquare
real*8 energyMoment2,energyMoment3,energyMoment4
real*8 energyMoment5,energyMoment6
real*8 logEnergyMoment1,logEnergyMoment2,logEnergyMoment3
real*8 logEnergyMoment4,logEnergyMoment5,logEnergyMoment6
real*8 pathMoment1,pathMoment2,pathMoment3
real*8 pathMoment4,pathMoment5,pathMoment6
real*8 angleX(20),angleDistribution(20)
real*8 meanBackEnergy,backEnergySigma
real*8 bi,bil,particleReflection,energyReflection
real*8 relativeMeanEnergy,meanEnergy
real*8 meanElasticLoss,varElasticLoss,sigmaElasticLoss
real*8 errorElasticLoss
real*8 meanInElasticLoss,varInElasticLoss,sigmaInElasticLoss
real*8 errorInElasticLoss
real*8 energyVariance,energySkew,energyKurtosis
real*8 energyFifth,energySixth
real*8 energyError1,energyError2,energyError3
real*8 pathMean,pathVariance,pathSkew,pathKurtosis
real*8 pathFifth,pathSixth,pathSigma
real*8 pathError1,pathError2,pathError3
real*8 energyMoment1Out,energyMoment2Out,energyMoment3Out
real*8 energyMoment4Out,energyMoment5Out,energyMoment6Out
real*8 logMoment1Out,logMoment2Out,logMoment3Out
real*8 logMoment4Out,logMoment5Out,logMoment6Out
real*8 pathMoment1Out,pathMoment2Out,pathMoment3Out
real*8 pathMoment4Out,pathMoment5Out,pathMoment6Out
logical equal
if(nBackscatter.eq.0) return
write(21,1527)
1527 format(1H1,//5X,'BACKSCATTERING OF PROJECTILES'/)
bi=dble(nBackscatter)
bil=dble(nBackLayer)
particleReflection=bi/nPrimary
energyReflection=backEnergySum/(nPrimary*energyUnit)
relativeMeanEnergy=energyReflection/particleReflection
meanEnergy=backEnergySum/bi
meanBackEnergy=meanEnergy
if (equal(bi,1.0d0)) go to 1506
meanElasticLoss=elasticLossSum/bi
varElasticLoss=elasticLossSquare/bi
& -meanElasticLoss*meanElasticLoss
sigmaElasticLoss=dsqrt(varElasticLoss)
errorElasticLoss=sigmaElasticLoss/bi
meanInElasticLoss=inElasticLossSum/bi
varInElasticLoss=inElasticLossSquare/bi
& -meanInElasticLoss*meanInElasticLoss
sigmaInElasticLoss=dsqrt(varInElasticLoss)
errorInElasticLoss=sigmaInElasticLoss/bi
1506 write(21,1508) particleReflection,energyReflection,
& relativeMeanEnergy,meanEnergy
1508 format(/5X,'PART.REFL.COEF.=',1PE11.4,
& ' ENERGY REFL.COEF.=',1E11.4,
& ' REL.MEAN ENERGY =',1E11.4,
& ' MEAN ENERGY =',1E11.4)
call MOMENT(energyMoment1Out,energyMoment2Out,energyMoment3Out,
& energyMoment4Out,energyMoment5Out,energyMoment6Out,
& backEnergySum,energyMoment2,energyMoment3,energyMoment4,
& energyMoment5,energyMoment6,bi)
call MOMENT(logMoment1Out,logMoment2Out,logMoment3Out,
& logMoment4Out,logMoment5Out,logMoment6Out,
& logEnergyMoment1,logEnergyMoment2,logEnergyMoment3,
& logEnergyMoment4,logEnergyMoment5,logEnergyMoment6,bil)
call MOMENTS(meanBackEnergy,energyVariance,energySkew,
& energyKurtosis,energyFifth,energySixth,backEnergySigma,
& energyError1,energyError2,energyError3,backEnergySum,
& energyMoment2,energyMoment3,energyMoment4,energyMoment5,
& energyMoment6,bi)
call MOMENT(pathMoment1Out,pathMoment2Out,pathMoment3Out,
& pathMoment4Out,pathMoment5Out,pathMoment6Out,pathMoment1,
& pathMoment2,pathMoment3,pathMoment4,pathMoment5,
& pathMoment6,bi)
call MOMENTS(pathMean,pathVariance,pathSkew,pathKurtosis,
& pathFifth,pathSixth,pathSigma,pathError1,pathError2,
& pathError3,pathMoment1,pathMoment2,pathMoment3,pathMoment4,
& pathMoment5,pathMoment6,bi)
write(21,7117)
write(21,7241) meanBackEnergy,energyVariance,energySkew,
& energyKurtosis,backEnergySigma,energyError1,energyError2,
& energyError3
7241 format(1X,' ENERGY',5X,1P1E12.4,7E14.4)
write(21,7242) pathMean,pathVariance,pathSkew,pathKurtosis,
& pathSigma,pathError1,pathError2,pathError3
7242 format(1X,' PATHLENGTH',5X,1P1E12.4,7E14.4)
write(21,7237) meanElasticLoss,varElasticLoss,sigmaElasticLoss,
& errorElasticLoss
write(21,7238) meanInElasticLoss,varInElasticLoss,
& sigmaInElasticLoss,errorInElasticLoss
write(21,7118)
write(21,1541) energyMoment1Out,energyMoment2Out,
& energyMoment3Out,energyMoment4Out,energyMoment5Out,
& energyMoment6Out
1541 format(1X,' ENERGY',5X,1P1E12.4,5E14.4)
write(21,1543) logMoment1Out,logMoment2Out,logMoment3Out,
& logMoment4Out,logMoment5Out,logMoment6Out
1543 format(1X,' LOGENERGY',5X,1P1E12.4,5E14.4)
write(21,1545) pathMoment1Out,pathMoment2Out,pathMoment3Out,
& pathMoment4Out,pathMoment5Out,pathMoment6Out
1545 format(1X,' PATHLENGTH',5X,1P1E12.4,7E14.4)
do i=1,20
angleX(i)=0.05d0*dble(i)
enddo
write(21,1514)
1514 format(//5X,'POLAR ANGULAR DISTRIBUTION OF BACKSCATTERED ',
& 'PROJECTILES'//)
do i=1,20
angleDistribution(i)=dble(angleBins(i))*20.d0
& /dble(nBackscatter)
enddo
write(21,1518)(angleX(i),i=1,20),(angleBins(i),i=1,20),
& (angleDistribution(i),i=1,20)
1518 format(5X,20F6.2//,5X,20I6/5X,20F6.3)
return
7117 format(/20X,' MEAN ',4X,' VARIANCE ',4X,' SKEWNESS ',
& 4X,' KURTOSIS ',5X,' SIGMA ',3X,' ERROR 1.M ',
& 3X,' ERROR 2.M ',3X,' ERROR 3.M ')
7118 format(/20X,' 1.MOMENT ',4X,' 2.MOMENT ',4X,' 3.MOMENT ',
& 4X,' 4.MOMENT ',4X,' 5.MOMENT ',4X,' 6.MOMENT ')
7237 format(1X,'ELASTIC LOSS',5X,1P1E12.4,1E14.4,28X,
& 2E14.4)
7238 format(1X,' INEL. LOSS',5X,1P1E12.4,1E14.4,28X,
& 2E14.4)
end
C=======================================================================
C WRITE IMPLANTATION PROFILE AND RECOIL DEPTH TABLES
C=======================================================================
subroutine writeImplantationProfile(depth_interval_flag,YH,
& MAXD,MAXD1,LJ,NJ,L,XX,CW,IRL,IRP,RIRP,IPL,ION,DENT,
& DMGN,ELGD,PHON,CASMOT,ICD,ICDT,ICDR,ICDTR,ICDIRI,
& ICDIRN,IIRP,TRIRP,IIPL,TION,TDENT,TDMGN,TELGD,TPHON,
& TCASMO,ICDTT,TIONR,TDENTR,TELGDR,TDMGNR,TPHONR,ICDTTR,
& ELE,ELI,ELP,ELD,ELET,ELIT,ELPT,ELDT,ICDJT,ICDJTR,
& ICDITR,ILD,DLI,IONR,DENTR,DMGNR,ELGDR,PHONR,MAXNL,
& MAXNL5)
implicit none
integer MAXD,MAXD1,LJ,L,IRL,MAXNL,MAXNL5
integer depth_interval_flag
integer NJ(MAXNL),IRP(0:MAXD1),IPL(MAXD)
integer ICD(MAXD,MAXNL5),ICDT(MAXD),ICDR(MAXD,MAXNL5)
integer ICDTR(MAXD),ICDIRI(MAXD,MAXNL5,MAXNL5)
integer ICDIRN(MAXD,MAXNL5),ICDJT(MAXNL5),ICDJTR(MAXNL5)
integer ICDITR(MAXNL5),ILD(MAXNL)
integer IIRP,IIPL,ICDTT,ICDTTR
integer I,J,K,im1,im2,im3
real*8 YH,CW,XX(MAXNL)
real*8 RIRP(0:MAXD1),ION(MAXD),DENT(MAXD),DMGN(MAXD)
real*8 ELGD(MAXD),PHON(MAXD),CASMOT(MAXD)
real*8 TION,TDENT,TDMGN,TELGD,TPHON,TCASMO,TRIRP
real*8 IONR(MAXD),DENTR(MAXD),DMGNR(MAXD),ELGDR(MAXD)
real*8 PHONR(MAXD),TIONR,TDENTR,TDMGNR,TELGDR,TPHONR
real*8 ELE(MAXD,MAXNL5),ELI(MAXD,MAXNL5)
real*8 ELP(MAXD,MAXNL5),ELD(MAXD,MAXNL5)
real*8 ELET(MAXNL5),ELIT(MAXNL5),ELPT(MAXNL5),ELDT(MAXNL5)
real*8 DLI(MAXNL)
real*8 D1,D2,Dmid
logical EQUAL
590 WRITE(21,600)
600 FORMAT(1H1,///,5X,8HDEPTH(A),2X,9HPARTICLES,2X,10HNORM.DEPTH,1X,
& 10HPATHLENGTH,3X,10HINLOSS(EV),2X,10HTELOSS(EV),2X
& ,10HELLOSS(EV), 2X,10HDAMAGE(EV),2X,10HPHONON(EV),2X
& ,10HCASCAD(EV),5X,3HDPA/)
IF(depth_interval_flag.EQ.0) THEN
C WRITE(22,*)' CALCULATED IMPLANTATION PROFILE DID NOT ',
C & 'AGREE WITH LAYER THICKNESS'
WRITE(21,*)' CALCULATED IMPLANTATION PROFILE DID NOT ',
& 'AGREE WITH LAYER THICKNESS'
ENDIF
#if defined (OS_WIN)
WRITE(22,6002)
6002 FORMAT(1H1,///,5X,8HDEPTH(A),2X,9HPARTICLES)
#else
write(22,'(a)') ' DEPTH PARTICLES'
#endif
IF(YH.LT.1.D0) GO TO 603
DO I=0,MAXD1
C This normalization of the implantation profile is wrong if the
C simulation does not account for all implanted projectiles,
C e.g. when the number of points in the profile is not enough to
C reach the maximum implantation depth.
RIRP(I) = DBLE(IRP(I))/YH
C To resolve this issue we need to check whether we reached maximum
C implantation or not. If not rerun calculation with larger step
C size!
ENDDO
603 D1=0.
D2=CW
WRITE(21,601) D1,IRP(0),RIRP(0)
601 FORMAT(4X,3H-SU,1H-,F6.0,I10,E12.4)
DO J=1,LJ
DO I=1,MAXD
ICDT(I)=ICDT(I)+ICD(I,J)
ICDTR(I)=ICDTR(I)+ICDR(I,J)
ENDDO
ENDDO
DO K=1,NJ(1)
DO J=1,NJ(1)
DO I=1,MAXD
ICDIRN(I,J)=ICDIRN(I,J)+ICDIRI(I,K,J)
ENDDO
ENDDO
ENDDO
DO I=0,MAXD1
IIRP=IIRP+IRP(I)
TRIRP=TRIRP+RIRP(I)
ENDDO
DO I=1,MAXD
IIPL=IIPL+IPL(I)
TION=TION+ION(I)
TDENT=TDENT+DENT(I)
TDMGN=TDMGN+DMGN(I)
TELGD=TELGD+ELGD(I)
TPHON=TPHON+PHON(I)
TCASMO=TCASMO+CASMOT(I)
ICDTT=ICDTT+ICDT(I)
TIONR=TIONR+IONR(I)
TDENTR=TDENTR+DENTR(I)
TELGDR=TELGDR+ELGDR(I)
TDMGNR=TDMGNR+DMGNR(I)
TPHONR=TPHONR+PHONR(I)
ICDTTR=ICDTTR+ICDTR(I)
ENDDO
do im1=MAXD,1,-1
if(ipl(im1).ne.0.or.(.NOT.EQUAL(ion(im1),0.D0))) goto 20
enddo
im1=1
20 im1=min0(im1+2,MAXD)
DO I=1,im1
WRITE(21,700) D1,D2,IRP(I),RIRP(I),IPL(I),ION(I),DENT(I),
& DMGN(I),ELGD(I),PHON(I),CASMOT(I),ICDT(I)
Dmid=(D2-D1)/2+D1
WRITE(22,701) Dmid,IRP(I)
700 FORMAT(1X,F6.0,1H-,F6.0,I10,E12.4,I10,1P1E14.4,5E12.4,I8)
701 FORMAT(1X, F16.4, 2X, I10)
D1=D2
D2=D2+CW
ENDDO
WRITE(21,604) D2-CW,IRP(MAXD1),RIRP(MAXD1)
604 FORMAT(1X,F6.0,1H-,3X,3HSUT,I10,E12.4)
WRITE(21,710) IIRP,TRIRP,IIPL,TION,TDENT,TDMGN,TELGD,TPHON,TCASMO
& ,ICDTT
710 FORMAT(/14X,I10,1P1E12.4,I10,1E14.4,5E12.4,I8)
DO J=1,NJ(1)
DO I=1,MAXD
ELET(J)=ELET(J)+ELE(I,J)
ELIT(J)=ELIT(J)+ELI(I,J)
ELPT(J)=ELPT(J)+ELP(I,J)
ELDT(J)=ELDT(J)+ELD(I,J)
ICDJT(J)=ICDJT(J)+ICD(I,J)
ICDJTR(J)=ICDJTR(J)+ICDR(I,J)
ICDITR(J)=ICDITR(J)+ICDIRN(I,J)
ENDDO
ENDDO
WRITE(21,1521)
1521 FORMAT(1H1,4X,'DEPTH(A)'
& ,3X,' INLOSS(1)',3X,'ELLOSS(1)',3X,'DAMAGE(1)',3X,'PHONON(1)'
& ,2X,' INLOSS(2)',3X,'ELLOSS(2)',3X,'DAMAGE(2)',3X,'PHONON(2)'
& ,2X,'DPA(1)',2X,'DPA(2)'/)
D1=0.
D2=CW
do im2=MAXD,1,-1
if(.NOT.EQUAL(eli(im2,1),0.D0).or.(.NOT.EQUAL(eli(im2,2),0.D0))
& ) goto 30
enddo
im2=1
30 im2=MIN0(im2+2,MAXD)
DO 1525 I=1,im2
WRITE(21,1523) D1,D2,ELI(I,1),ELE(I,1),ELD(I,1),ELP(I,1),
& ELI(I,2),ELE(I,2),ELD(I,2),ELP(I,2),ICD(I,1),ICD(I,2)
1523 FORMAT(1X,F6.0,1H-,F6.0,1P8E12.4,2I8)
D1=D2
D2=D2+CW
1525 CONTINUE
WRITE(21,1533) ELIT(1),ELET(1),ELDT(1),ELPT(1),ELIT(2),ELET(2)
& ,ELDT(2),ELPT(2),ICDJT(1),ICDJT(2)
1533 FORMAT(/14X,1P8E12.4,2I8///)
DO I=1,L-1
ILD(I)=IDINT(XX(I)/CW+0.01D0)
IF(ILD(I).GT.MAXD) ILD(I)=MAXD
DO J=1,ILD(I)
DLI(I)=DLI(I)+DMGN(J)
ENDDO
ENDDO
DLI(L)=TDMGN
DO 1493 I=L,2,-1
DLI(I)=DLI(I)-DLI(I-1)
1493 CONTINUE
DO 1494 I=1,L
WRITE(21,1495) I,DLI(I)
1495 FORMAT(/5X,'DAMAGE IN LAYER ',I3,' : ',1P1E12.4)
1494 CONTINUE
1455 CONTINUE
if(irl.eq.0) goto 1497
WRITE(21,1496)
1496 FORMAT(1H1,/,5X,'RECOILS')
WRITE(21,1597)
1597 FORMAT(///,5X,8HDEPTH(A), 5X,10HINLOSS(EV),3X,10HTELOSS(EV),3X
& ,10HELLOSS(EV), 3X,10HDAMAGE(EV),3X,10HPHONON(EV),5X,3HDPA,
& 2X,6HDPA(1),2X,6HDPA(2), 1X,5H(1-1),1X,5H(1-2),1X,5H(2-1),1X
& ,5H(2-2)/)
D1=0.D0
D2=CW
do im3=MAXD,1,-1
if (.not.equal(ionr(im3),0.D0)) go to 31
enddo
im3=1
31 im3=MIN0(im3+2,MAXD)
DO I=1,im3
WRITE(21,1595) D1,D2,IONR(I),DENTR(I),DMGNR(I),ELGDR(I),
& PHONR(I),ICDTR(I),ICDIRN(I,1),ICDIRN(I,2)
& ,ICDIRI(I,1,1),ICDIRI(I,1,2),ICDIRI(I,2,1),ICDIRI(I,2,2)
1595 FORMAT(1X,F6.0,1H-,F6.0,1P1E14.4,4E13.4,3I8,4I6)
D1=D2
D2=D2+CW
ENDDO
WRITE(21,1596) TIONR,TDENTR,TDMGNR,TELGDR,TPHONR
& ,ICDTTR,ICDITR(1),ICDITR(2)
1596 FORMAT(/14X,1P1E14.4,4E13.4,3I8)
1497 continue
return
end
C=======================================================================
C WRITE INPUT AND BEAM SUMMARY
C=======================================================================
subroutine writeInputSummary(inputName,outputName,rangeName,
& zProjectile,massProjectile,energy0,energySigma,alpha,
& alphaSigma,finalEnergy,surfaceEnergy,sheath,recoilCutoff,
& nProjectiles,ri,ri2,ri3,xStart,rd,depthBin,ca,kk0,kk0r,
& stoppingPrimary,stoppingRecoil,potentialPrimary,
& potentialRecoil,recoilMode,nLayers,layerThickness,density,
& correction,nElements,zTarget,massTarget,concentration,
& surfaceBinding,displacementEnergy,bulkBinding,ch1,ch2,ch3,
& ch4,ch5,ti,zArg,velc,emx,maxNl,maxEl,secondsStartTotal)
implicit none
integer nProjectiles,kk0,kk0r,stoppingPrimary,stoppingRecoil
integer potentialPrimary,potentialRecoil,recoilMode,nLayers
integer maxNl,maxEl,secondsStartTotal,secondsStopTotal
integer nElements(maxNl)
integer potKrc,potMoliere,potZbl
integer stopLs,stopOr,stopMixed,stopIcru49,stopZiegler
integer i,j
real*8 zProjectile,massProjectile,energy0,energySigma,alpha
real*8 alphaSigma,finalEnergy,surfaceEnergy
& ,sheath,recoilCutoff
real*8 ri,ri2,ri3,xStart,rd,depthBin,ca
real*8 layerThickness(maxNl),density(maxNl),correction(maxNl)
real*8 zTarget(maxNl,maxEl),massTarget(maxNl,maxEl)
real*8 concentration(maxNl,maxEl)
real*8 surfaceBinding(maxNl,maxEl)
real*8 displacementEnergy(maxNl,maxEl)
real*8 bulkBinding(maxNl,maxEl)
real*8 ch1(maxNl,maxEl),ch2(maxNl,maxEl)
real*8 ch3(maxNl,maxEl),ch4(maxNl,maxEl),ch5(maxNl,maxEl)
real*8 ti,zArg,velc,emx
character*(*) inputName,outputName,rangeName
character*18 potentialName,potentialRecoilName
character*18 stoppingName,stoppingRecoilName
character monthStop*4,dayStop*2,yearStop*4,hourStop*2
character minStop*2,secStop*2
logical EQUAL
parameter (potKrc=1,potMoliere=2,potZbl=3)
parameter (stopLs=1,stopOr=2,stopMixed=3)
parameter (stopIcru49=4,stopZiegler=5)
C How many seconds are needed for the simulation ??
CALL TimeStamp(dayStop,monthStop,yearStop,hourStop,minStop,
& secStop,secondsStopTotal)
WRITE(21,*)
WRITE(21,10051)dayStop,monthStop,yearStop,hourStop,minStop,
& secStop
WRITE(*,10051)dayStop,monthStop,yearStop,hourStop,minStop,
& secStop
10051 FORMAT(1x,' End: ',A2,'.',A4,1x,A4,1x,A2,':',A2,':',A2)
WRITE(21,*)
WRITE(21,10052)nProjectiles,(secondsStopTotal-secondsStartTotal)
10052 FORMAT(1x,' Simulation needed for ',I7,' projectiles ',I7,
& ' seconds')
WRITE(21,1402)inputName
1402 FORMAT(//30X,'* INPUT DATA *',5X,A12)
WRITE(21,1404) zProjectile,massProjectile,energy0,
& energySigma,alpha,alphaSigma,finalEnergy,surfaceEnergy,
& sheath,recoilCutoff
1404 FORMAT(//,7X,2HZ1,8X,2HM1,10X,2HE0,6X,4HEsig,7X,5HALPHA,7X
& ,8HALPHASIG,7X,2HEF,7X ,3HESB,6X,6HSHEATH,5X,3HERC/2F10.2
& ,1F13.2,7F10.2)
WRITE(21,1406) nProjectiles,ri,ri2,ri3,xStart,rd,depthBin,ca,
& kk0,kk0r,stoppingPrimary,stoppingRecoil,potentialPrimary,
& potentialRecoil,recoilMode
1406 FORMAT(/7X,2HNH,8X,2HRI,5X,3HRI2,5X,3HRI3,11X,2HX0,8X,2HRD,8X,2HCW
& ,8X,2HCA ,7X,3HKK0,3X,4HKK0R,3X,5HKDEE1,2X,5HKDEE2,2X,4HIPOT
& ,3X,5HIPOTR ,3X,3HIRL/I10,3F10.2,1F13.2,3F10.2,1X,7I7)
WRITE(21,1408)
1408 FORMAT(//13X,2HDX,6X,3HRHO,4X,2HCK,2X
& ,5HZ(,1),1X,5HZ(,2),1X,5HZ(,3),1X,5HZ(,4),1X,5HZ(,5),2X
& ,5HM(,1),2X,5HM(,2),2X,5HM(,3),2X,5HM(,4),2X,5HM(,5),1X
& ,5HC(,1),1X,5HC(,2),1X,5HC(,3),1X,5HC(,4),1X,5HC(,5))
DO I=1,nLayers
WRITE(21,1412) I,layerThickness(I),density(I),correction(I),
& (zTarget(I,J),J=1,5),(massTarget(I,J),J=1,5),
& (concentration(I,J),J=1,5)
IF(nElements(I).GT.5) THEN
WRITE(21,5113)
DO J=6,nElements(I)
WRITE(21,5111) J,zTarget(I,J),massTarget(I,J),
& concentration(I,J)
ENDDO
ENDIF
1412 FORMAT(/1X,I3,6H.LAYER,1X,1F8.2,2F7.2,5F6.0,5F7.2,5F6.3)
5113 FORMAT(6X,'ADDITIONAL ELEMENTS: J Z M C')
5111 FORMAT(6X,23X,I3,1X,F6.0,1X,F7.2,1X,F8.5)
5114 FORMAT(6X,'ADDITIONAL ELEMENTS: J SBE ED BE')
5115 FORMAT(6X,23X,I3,1X,F6.2,1X,F7.2,1X,F8.2)
ENDDO
WRITE(21,1414)
1414 FORMAT(//27X,'***',2X,'SBE(LAYER,ELEMENT)',2X,'***',5X
& ,'***',5X,'ED(LAYER,ELEMENT)',5X,'***',5X
& ,'***',3X,'BE(LAYER,ELEMENT)',2X,'***')
DO 1416 I=1,nLayers
WRITE(21,1418) I,(surfaceBinding(I,J),J=1,5),
& (displacementEnergy(I,J),J=1,5),(bulkBinding(I,J),J=1,5)
IF(nElements(I).GT.5) THEN
WRITE(21,5114)
DO J=6,nElements(I)
WRITE(21,5115) J,surfaceBinding(I,J),
& displacementEnergy(I,J),bulkBinding(I,J)
ENDDO
ENDIF
1418 FORMAT(/1X,I3,6H.LAYER,17X,5F6.2,3X,5F7.2,3X,5F6.2)
1416 CONTINUE
IF(stoppingPrimary.LT.stopIcru49) GO TO 1421
WRITE(21,1419)
1419 FORMAT(//30X,'CH1',10X,'CH2',10X,'CH3',10X,'CH4',10X,'CH5')
DO 1417 I=1,nLayers
DO J=1,nElements(I)
IF(J.EQ.1) THEN
WRITE(21,1415) I,ch1(I,J),ch2(I,J),ch3(I,J),
& ch4(I,J),ch5(I,J)
ELSE
WRITE(21,1423) ch1(I,J),ch2(I,J),ch3(I,J),
& ch4(I,J),ch5(I,J)
ENDIF
ENDDO
1417 CONTINUE
1415 FORMAT(/1X,I3,6H.LAYER,17X,5F13.6)
1423 FORMAT(/25X,5F13.6)
1421 CONTINUE
IF(potentialPrimary.EQ.potKrc) potentialName='KR-C POTENTIAL'
IF(potentialPrimary.EQ.potMoliere) potentialName='mod. MOLIERE '
IF(potentialPrimary.EQ.potZbl) potentialName='ZBL POTENTIAL'
IF(potentialRecoil.EQ.potKrc) potentialRecoilName='KR-C POTENTIAL'
IF(potentialRecoil.EQ.potMoliere) potentialRecoilName=
& 'MOLIERE POTENTIAL'
IF(potentialRecoil.EQ.potZbl) potentialRecoilName='ZBL POTENTIAL'
WRITE(21,1411) potentialName,potentialRecoilName
1411 FORMAT(//7X,'INTERACTION POTENTIAL : PROJECTILE-TARGET : ',A18
& ,' TARGET-TARGET : ',A18)
IF(stoppingPrimary.EQ.stopLs) stoppingName='LINDHARD-SCHARFF'
IF(stoppingPrimary.EQ.stopOr) stoppingName='OEN-ROBINSON'
IF(stoppingPrimary.EQ.stopMixed) stoppingName='50% LS 50% OR'
IF(stoppingPrimary.EQ.stopIcru49) stoppingName='AZ nach ICRU49'
IF(stoppingPrimary.EQ.stopZiegler) stoppingName='ZIEGLER'
IF(stoppingRecoil.EQ.stopLs) stoppingRecoilName='LINDHARD-SCHARFF'
IF(stoppingRecoil.EQ.stopOr) stoppingRecoilName='OEN-ROBINSON'
IF(stoppingRecoil.EQ.stopMixed) stoppingRecoilName='50% LS 50% OR'
WRITE(21,1413) stoppingName,stoppingRecoilName
1413 FORMAT(//7X,'INELASTIC LOSS MODEL : PROJECTILE-TARGET : ',A18
& ,' TARGET-TARGET : ',A18)
IF(energy0.GT.0.D0) GO TO 1420
IF(alpha.LT.0.D0) GO TO 1405
WRITE(21,1422) ti,zArg,velc,emx
1422 FORMAT(//6X,'MAXWELLIAN DISTRIBUTION',7X,2HTI,5X,4HZARG,5X ,4HVELC
& ,8X,3HEMX/29X,1F10.2,2F9.4,1E14.6)
GO TO 1427
1405 continue
WRITE(21,1407) ti,sheath,-alpha,emx
1407 FORMAT(//6X,'MAXWELLIAN DISTRIBUTION (ENERGY)',7X,'TI',5X
& ,'SHEATH',5X,'ALPHAM',8X,'EMX'/38X,3F10.2,2X,1E14.6)
GO TO 1427
1420 IF(alpha.EQ.-1.) WRITE(21,1424)
1424 FORMAT(//6X,'RANDOM DISTRIBUTION'/)
IF(alpha.EQ.-2.) WRITE(21,1426)
1426 FORMAT(//6X,'COSINE DISTRIBUTION'/)
1427 CONTINUE
IF(EQUAL(energySigma,0.D0)) THEN
WRITE(21,14271)
14271 FORMAT(//6X,'fixed PROJECTILE ENERGY'/)
ELSE
WRITE(21,14272)
14272 FORMAT(//6X,'PROJECTILE ENERGY has GAUSSIAN DISTRIBUTION '/)
ENDIF
IF(EQUAL(alphaSigma,0.D0)) THEN
WRITE(21,14273)
14273 FORMAT(//6X,'fixed PROJECTILE ANGLE'/)
ELSE
WRITE(21,14274)
14274 FORMAT(//6X,'PROJECTILE ANGLE has 1D GAUSSIAN DISTRIBUTION '/)
ENDIF
WRITE(21,1428)outputName
1428 FORMAT(1H1,//30X,'* OUTPUT DATA *',5X,A12)
#if defined (OS_WIN)
WRITE(22,14280)rangeName
14280 FORMAT(1H1,//30X,'* RANGE DATA *',5X,A12)
#endif
RETURN
END
C=======================================================================
C WRITE TARGET SETUP AND PRECOMPUTED TABLES
C=======================================================================
subroutine writeTargetSetupSummary(hlm,hlmt,su,sut,xc,rt,sfe,
& inelasticMode,nLayers,nSpecies,nProj,kib,kit,maxActive,nAll,
& nPrimary,nSecondary,kis,kist,layerEps0,layerZ,layerMass,
& layerArealDensity,layerLm,layerPdMax,layerASig,layerBinding,
& layerBoundary,nElements,a1,kor1,a,kor,maxNl,maxSpecies)
implicit none
integer maxNl,maxSpecies
integer*4 inelasticMode,nLayers,nSpecies,nProj,kib,kit
integer*4 maxActive,nAll,nPrimary,nSecondary,kis,kist
integer*4 nElements(maxNl)
integer i,j
real*8 hlm,hlmt,su,sut,xc,rt,sfe
real*8 layerEps0(maxNl),layerZ(maxNl),layerMass(maxNl)
real*8 layerArealDensity(maxNl),layerLm(maxNl)
real*8 layerPdMax(maxNl),layerASig(maxNl)
real*8 layerBinding(maxNl),layerBoundary(maxNl)
real*8 a1(maxSpecies),kor1(maxSpecies)
real*8 a(maxSpecies,maxSpecies),kor(maxSpecies,maxSpecies)
C
C This block reports the layer setup and precomputed pair tables used
C by the transport calculation. It is output-only and must not change
C the simulation state.
C
write(21,1430) hlm,hlmt,su,sut,xc,rt,sfe,inelasticMode,
& nLayers,nSpecies
1430 format(//17X,'HLM',7X,'HLMT',8X,'SU',7X,'SUT',8X,'XC',8X,
& 'RT',7X,'SFE',6X,'INEL',9X,'L',8X,'LJ'/10X,1F11.4,
& 1F10.3,1F10.4,1F10.3,1F10.4,1F10.3,1F10.2,3I10)
write(21,1432) nProj,kib,kit,maxActive,nAll,nPrimary,
& nSecondary,kis,kist
1432 format(//16X,'NPROJ',7X,'KIB',7X,'KIT',6X,'MAXA',6X,
& 'NALL',7X,'NPA',7X,'NSA',7X,'KIS',6X,'KIST'/11X,9I10)
write(21,470)
470 format(//12X,'EPS0(I)',7X,'Z2(I)',7X,'M2(I)',5X,
& 'ARHO(I)' ,7X,'LM(I)',5X,'PDMAX(I)',5X,'ASIG(I)',7X,
& 'SB(I)',7X,'XX(I)' ,8X,'NJ(I)')
do i=1,nLayers
write(21,473) i,layerEps0(i),layerZ(i),layerMass(i),
& layerArealDensity(i),layerLm(i),layerPdMax(i),
& layerASig(i),layerBinding(i),layerBoundary(i),
& nElements(i)
473 format(/1X,I3,6H.LAYER,1X,9E12.4,I10)
enddo
write(21,474)
474 format(//13X,
& 'A1(1)',3X,'A1(2)',3X,'A1(3)',3X,'A1(4)',3X,
& 'A1(5)',3X,'A1(6)',3X,'A1(7)',3X,'A1(8)',3X,
& 'A1(9)',2X,'A1(10)',2X,'A1(11)',2X,'A1(12)',2X,
& 'A1(13)',2X,'A1(14)',2X,'A1(15)',2X,'A1(16)',2X,
& 'A1(17)',2X,'A1(18)',2X,'A1(19)',2X,'A1(20)',2X,
& 'A1(21)',2X,'A1(22)',2X,'A1(23)',2X,'A1(24)',2X,
& 'A1(25)',2X,'A1(26)',2X,'A1(27)',2X,'A1(28)',2X,
& 'A1(29)',2X,'A1(30)',2X,'A1(31)',2X,'A1(32)',2X,
& 'A1(33)',2X,'A1(34)',2X,'A1(35)')
do 475 i=1,nSpecies
write(21,471) a1(i)
471 format(/1X,9X,35F8.5)
475 continue
write(21,484)
484 format(//11X,
& 'KOR1(1)',1X,'KOR1(2)',1X,'KOR1(3)',1X,'KOR1(4)',1X,
& 'KOR1(5)',1X,'KOR1(6)',1X,'KOR1(7)',1X,'KOR1(8)',1X,
& 'KOR1(9)',1X,'KOR1(A)',1X,'KOR1(B)',1X,'KOR1(C)',1X,
& 'KOR1(D)',1X,'KOR1(E)',1X,'KOR1(F)',1X,'KOR1(G)',1X,
& 'KOR1(H)',1X,'KOR1(I)',1X,'KOR1(J)',1X,'KOR1(K)',1X,
& 'KOR1(L)',1X,'KOR1(M)',1X,'KOR1(N)',1X,'KOR1(O)',1X,
& 'KOR1(P)',1X,'KOR1(Q)',1X,'KOR1(R)',1X,'KOR1(S)',1X,
& 'KOR1(T)',1X,'KOR1(U)',1X,'KOR1(V)',1X,'KOR1(W)',1X,
& 'KOR1(X)',1X,'KOR1(Y)',1X,'KOR1(Z)')
do 486 i=1,nSpecies
write(21,489) kor1(i)
489 format(/1X,9X,35F8.5)
486 continue
write(21,476)
476 format(//12X,
& 'A(I,1)',2X,'A(I,2)',2X,'A(I,3)',2X,'A(I,4)',2X,
& 'A(I,5)',2X,'A(I,6)',2X,'A(I,7)',2X,'A(I,8)',2X,
& 'A(I,9)',1X,'A(I,10)',1X,'A(I,11)',1X,'A(I,12)',1X,
& 'A(I,13)',1X,'A(I,14)',1X,'A(I,15)',1X,'A(I,16)',1X,
& 'A(I,17)',1X,'A(I,18)',1X,'A(I,19)',1X,'A(I,20)',1X,
& 'A(I,21)',1X,'A(I,22)',1X,'A(I,23)',1X,'A(I,24)',1X,
& 'A(I,25)',1X,'A(I,26)',1X,'A(I,27)',1X,'A(I,28)',1X,
& 'A(I,29)',1X,'A(I,30)',1X,'A(I,31)',1X,'A(I,32)',1X,
& 'A(I,33)',1X,'A(I,34)',1X,'A(I,35)')
do i=1,nSpecies
write(21,477) (a(i,j),j=1,nSpecies)
477 format(/1X,9X,35F8.5)
enddo
write(21,490)
490 format(//11X,
& 'KOR(,1)',1X,'KOR(,2)',1X,'KOR(,3)',1X,'KOR(,4)',1X,
& 'KOR(,5)',1X,'KOR(,6)',1X,'KOR(,7)',1X,'KOR(,8)',1X,
& 'KOR(,9)',1X,'KOR(,A)',1X,'KOR(,B)',1X,'KOR(,C)',1X,
& 'KOR(,D)',1X,'KOR(,E)',1X,'KOR(,F)',1X,'KOR(,G)',1X,
& 'KOR(,H)',1X,'KOR(,I)',1X,'KOR(,J)',1X,'KOR(,K)',1X,
& 'KOR(,L)',1X,'KOR(,M)',1X,'KOR(,N)',1X,'KOR(,O)',1X,
& 'KOR(,P)',1X,'KOR(,Q)',1X,'KOR(,R)',1X,'KOR(,S)',1X,
& 'KOR(,T)',1X,'KOR(,U)',1X,'KOR(,V)',1X,'KOR(,W)',1X,
& 'KOR(,X)',1X,'KOR(,Y)',1X,'KOR(,Z)')
do i=1,nSpecies
write(21,492) (kor(i,j),j=1,nSpecies)
492 format(/1X,9X,35F8.5)
enddo
return
end
C=======================================================================
C WRITE INTEGRAL PARTICLE SUMMARY
C=======================================================================
subroutine writeIntegralSummary(nImplanted,implantedEnergy,
& nBackscatter,backEnergy,nTransmitted,transEnergy,
& nBackSputter,backSputterEnergy,nTransSputter,
& transSputterEnergy,tryEnergy,negativeEnergy,reducedEnergy,
& reflectionCoeff,nLayers,layerBoundary,binWidth,
& implantedProfile,implantedLayerBins,layerBinEnd,
& numberInLayer,depthIntervalFlag,meanElasticCollisions,
& meanDisplacingCollisions,meanSurfaceCollisions,maxNl,
& maxD)
implicit none
integer nImplanted,nBackscatter,nTransmitted,nBackSputter
integer nTransSputter,tryEnergy,negativeEnergy,nLayers
integer depthIntervalFlag,maxNl,maxD,i,j
integer implantedProfile(0:maxD-1),implantedLayerBins(maxNl)
integer layerBinEnd(0:maxNl),numberInLayer(maxNl)
real*8 implantedEnergy,backEnergy,transEnergy,backSputterEnergy
real*8 transSputterEnergy,reducedEnergy,reflectionCoeff
real*8 layerBoundary(maxNl),binWidth
real*8 meanElasticCollisions,meanDisplacingCollisions
real*8 meanSurfaceCollisions
C
C Main integral counts and energies for implanted, backscattered,
C transmitted, and sputtered particles.
C
write(21,1500) nImplanted,implantedEnergy,nBackscatter,
& backEnergy,nTransmitted,transEnergy,nBackSputter,
& backSputterEnergy,nTransSputter,transSputterEnergy,
& tryEnergy,negativeEnergy,reducedEnergy,reflectionCoeff
1500 format(1H1,//11X,20HIMPLANTED PARTICLES=,I7,5X,7HENERGY=,
& E10.4,3H EV/7X,24HBACKSCATTERED PARTICLES=,I7,5X,
& 7HENERGY=,E10.4,3H EV/9X,22HTRANSMITTED PARTICLES=,
& I7,5X,7HENERGY=,E10.4,3H EV/7X,
& 24HBACKSPUTTERED PARTICLES=,I7,5X,7HENERGY=,E10.4,
& 3H EV/6X,'TRANSM. SPUTT. PARTICLES=',I7,5X,
& 7HENERGY=,E10.4,3H EV/15X,16HTRIED PARTICLES=,I7/
& 9X,22HPARTICLES with neg. E=,I7/6X,
& 25HTHOMAS FERMI RED. ENERGY=,2X,E10.4/6X,
& 25HSCALED PART. REFL. COEFF=,2x,E10.4)
if(nLayers.gt.1) then
do i=1,nLayers
layerBinEnd(i)=IDINT(layerBoundary(i)/binWidth+0.01)
enddo
do i=1,nLayers
do j=layerBinEnd(i-1)+1,layerBinEnd(i)
implantedLayerBins(i)=implantedLayerBins(i)
& + implantedProfile(j)
enddo
enddo
write(21,15001)
15001 format(/33x,'FROM BIN WIDTH',2x,'FROM LAYER THICKNESS')
if(depthIntervalFlag.eq.0) write(21,'(36x,5HWRONG)')
do i=1,nLayers
write(21,1501) i,implantedLayerBins(i),numberInLayer(i)
enddo
1501 format(/1x,'IMPLANTED PARTICLES (LAYER ',i1,')=',i16,
& 2x,i16)
endif
write(21,1511) meanElasticCollisions,meanDisplacingCollisions,
& meanSurfaceCollisions
1511 format(//2X,'PROJECTILES : ',
& 'MEAN NUMBER OF ELASTIC COLLISIONS = ',1F8.1,3X,
& 'MEAN NUMBER OF EL.COLL.(E > EDISPL.) = ',F8.3/65X,
& 'MEAN NUMBER OF EL.COLL.(E > SB(1)) = ',F8.3)
return
end
C=======================================================================
C SET UP MATRIX TABLE AXES
C=======================================================================
subroutine setupMatrixTableAxes(energyBinWidth,angleBinWidth,
& polarBinWidth,nProjectiles,nPolarBinsMinusOne,
& nAngleBinsMinusOne,nAzimuthBins,maxDepthBin,jt,meab,magb,
& ema,meat,magt,emat,mepb,mept,mags,magst,magsa,meas,
& meast,measl,meastl,meags,meagb,meagt,energyLog,
& tempNh,maxNl,maxD2,maxSpeciesMinusFirstLayer)
implicit none
integer nProjectiles,nPolarBinsMinusOne,nAngleBinsMinusOne
integer nAzimuthBins,maxDepthBin,maxNl,maxD2
integer maxSpeciesMinusFirstLayer
integer j,k,azimuthBin
integer jt(maxNl)
integer meab(maxD2,22),magb(62,22),meagb(maxD2,36,22)
integer meat(maxD2,22),magt(62,22),meagt(maxD2,36,22)
integer mepb(maxD2,maxD2),mept(maxD2,maxD2)
integer meas(maxD2,22,maxSpeciesMinusFirstLayer)
integer meast(maxD2,22,maxSpeciesMinusFirstLayer)
integer mags(62,22,maxSpeciesMinusFirstLayer)
integer magst(62,22,maxSpeciesMinusFirstLayer)
integer magsa(62,32,maxSpeciesMinusFirstLayer)
integer measl(75,21,maxSpeciesMinusFirstLayer)
integer meastl(75,21,maxSpeciesMinusFirstLayer)
integer meags(maxD2,12,22,maxSpeciesMinusFirstLayer)
real*8 energyBinWidth,angleBinWidth,polarBinWidth
real*8 ema(62,22),emat(62,22),energyLog(75),tempNh
real*8 logBinWidth
C
C Fill the first row/column labels used by the matrix-style output
C tables. The simulation accumulates matrix entries during transport;
C this routine only sets the printable axes before those tables are
C written.
C
do j=2,nPolarBinsMinusOne
magb(j,1) = (j-1)*polarBinWidth
magt(j,1) = (j-1)*polarBinWidth
ema(j,1)=DBLE(j-1)*polarBinWidth
emat(j,1)=DBLE(j-1)*polarBinWidth
enddo
do j=2,21
meab(1,j) = j-1
meat(1,j) = j-1
magb(1,j) = j-1
magt(1,j) = j-1
ema(1,j) = j-1
emat(1,j) = j-1
enddo
do j=2,maxDepthBin
meab(j,1) = j-1
meat(j,1) = j-1
mepb(j,1) = j-1
mepb(1,j) = j-1
mept(j,1) = j-1
mept(1,j) = j-1
enddo
do k=1,jt(3)
do j=2,nPolarBinsMinusOne
mags(j,1,k) = (j-1)*polarBinWidth
magst(j,1,k) = (j-1)*polarBinWidth
magsa(j,1,k) = (j-1)*polarBinWidth
enddo
do j=2,nAngleBinsMinusOne
magsa(1,j,k) = (j-1)*angleBinWidth
enddo
do j=2,21
meas(1,j,k) = j-1
meast(1,j,k) = j-1
mags(1,j,k) = j-1
magst(1,j,k) = j-1
enddo
do j=2,maxDepthBin
meas(j,1,k) = j-1
meast(j,1,k) = j-1
enddo
do j=1,20
measl(1,j,k)=j
meastl(1,j,k)=j
enddo
do azimuthBin=1,nAzimuthBins,1
do j=2,21
meags(1,azimuthBin,j,k) = j-1
enddo
do j=2,maxDepthBin
meags(j,azimuthBin,1,k) = j-1
enddo
enddo
enddo
do azimuthBin=1,nAzimuthBins,1
do j=2,21
meagb(1,azimuthBin,j) = j-1
meagt(1,azimuthBin,j) = j-1
enddo
do j=2,maxDepthBin
meagb(j,azimuthBin,1) = j-1
meagt(j,azimuthBin,1) = j-1
enddo
enddo
do j=2,74
energyLog(j)=10.D0**(j/12.D0)*10.D0**(-7.D0/6.D0)
enddo
logBinWidth=(10.D0**(1.D0/12.D0)-1.D0)*10.D0**(-7.D0/6.D0)
tempNh=logBinWidth*DBLE(nProjectiles)
return
end
C=======================================================================
C WRITE GUI SEQUENCE SUMMARY FILE
C=======================================================================
subroutine writeSequenceSummary(seqNam,chem,nLayers,e0KeV,
& esigKeV,alpha,alphaSig,nProjectiles,nImplanted,
& nBackscatter,nTransmitted,tryEnergy,negativeEnergy,
& meanRange,rangeSigma,meanBackEnergy,backEnergySigma,
& meanTransEnergy,transEnergySigma,reducedEnergy,
& reflectionCoeff,numberInLayer,maxNl)
implicit none
integer maxNl,nLayers,nProjectiles,nImplanted,nBackscatter
integer nTransmitted,tryEnergy,negativeEnergy,k
integer numberInLayer(maxNl)
real*8 e0KeV,esigKeV,alpha,alphaSig
real*8 meanRange,rangeSigma,meanBackEnergy,backEnergySigma
real*8 meanTransEnergy,transEnergySigma,reducedEnergy
real*8 reflectionCoeff
character*64 seqNam
character*50 chem(maxNl)
C
C The *.seq file is the compact per-run summary consumed by the GUI.
C Keep this writer separate from the long human-readable output report.
C
open(unit=33,file=seqNam,status='replace')
write(33,7802) (chem(k),k=1,nLayers)
write(33,7801) e0KeV,esigKeV,alpha,alphaSig,nProjectiles,
& nImplanted,nBackscatter,nTransmitted,tryEnergy,
& negativeEnergy,meanRange,rangeSigma,meanBackEnergy,
& backEnergySigma,meanTransEnergy,transEnergySigma,
& reducedEnergy,reflectionCoeff,
& (numberInLayer(k),k=1,nLayers)
close(33)
return
7802 format(6x,'Energy',4x,'SigmaE',5x,'Alpha',2x,'SigAlpha',
& 4x,'ntot',5x,'imp',2x,'backsc',3x,'trans',3x,
& 'tried',4x,'negE',3x,'range',6x,'straggeling',2x,
& 'Eback',7x,'sigEback',4x,'Etrans',6x,'SigEtrans',3x,
& 'red._E',6x,'PRC',3x,999(A20,1x))
7801 format(F12.2,3(1x,F9.2),1x,6(I7,1x),6(E12.4),
& 2(E12.4),999(I7,1x))
end
C=======================================================================
C READ GUI-GENERATED INPUT FILE
C=======================================================================
SUBROUTINE READ_GUI_INPUT(INNAM,ERRNAM,Z1,M1,E0,ESIG,ALPHA,
& ALPHASIG,EF,ESB,SHEATH,ERC,NH,RI,RI2,RI3,X0,RD,CW,CA,KK0,
& KK0R,KDEE1,KDEE2,IPOT,IPOTR,IRL,NLayers,CHEM,DX,RHO,CK,NJ,ZT,
& MT,CO,SBE,ED,BE,CH1,CH2,CH3,CH4,CH5)
IMPLICIT NONE
INTEGER MAXNL,MAXEL
PARAMETER (MAXNL=60)
PARAMETER (MAXEL=12)
CHARACTER*(*) INNAM,ERRNAM
CHARACTER*50 CHEM(MAXNL)
INTEGER I,J,NLAYERS,NH
INTEGER*4 KK0,KK0R,KDEE1,KDEE2,IPOT,IPOTR,IRL
INTEGER*4 NJ(MAXNL)
REAL*8 Z1,M1,E0,ESIG,ALPHA,ALPHASIG
REAL*8 EF,ESB,SHEATH,ERC
REAL*8 RI,RI2,RI3,X0,RD,CW,CA
REAL*8 DX(MAXNL),RHO(MAXNL),CK(MAXNL)
REAL*8 ZT(MAXNL,MAXEL),MT(MAXNL,MAXEL)
REAL*8 CO(MAXNL,MAXEL),SBE(MAXNL,MAXEL)
REAL*8 ED(MAXNL,MAXEL),BE(MAXNL,MAXEL)
REAL*8 CH1(MAXNL,MAXEL),CH2(MAXNL,MAXEL)
REAL*8 CH3(MAXNL,MAXEL),CH4(MAXNL,MAXEL)
REAL*8 CH5(MAXNL,MAXEL)
OPEN(UNIT=99,file=errnam,STATUS='replace')
OPEN(UNIT=11,file=innam,STATUS='unknown',ERR=1359)
C First line: properties of projectile
C Ordered as: Z, mass number (amu), imp. energy, dist. of imp. energy, angle, dist. angles,
READ(11,*) Z1,M1,E0,Esig,ALPHA,ALPHASIG,EF,ESB,SHEATH,ERC
C Second line: simulation related parameters
C Ordered as: Number of particles, seed, seed, seed, initial depth, RD, depth increment, CA, KK0, KDEE1,KDEE2,IPOT
READ(11,*) NH,RI,RI2,RI3,X0,RD,CW,CA,KK0,KK0R,KDEE1,KDEE2,IPOT
& ,IPOTR,IRL
C Third line: Number of layers
read(11,66) NLayers
66 format(9x,I4)
IF(NLayers.LT.1.OR.NLayers.GT.MAXNL) THEN
WRITE(99,*) 'ERROR: number of layers out of range: ',NLayers
WRITE(99,*) 'Valid range is 1..',MAXNL
WRITE(*,*) 'ERROR: number of layers out of range: ',NLayers
STOP
ENDIF
C Here we read the NLayers structure
DO I=1,NLayers
C Chemical formula (chem), Thickness (DX), density (RHO), and correction factor
C (CK, it is always 1.0??), number of elements (nel)
C Possibly add the number of elements in the layer
READ(11,*) chem(I),DX(I),RHO(I),CK(I),NJ(I)
IF(NJ(I).LT.1.OR.NJ(I).GT.MAXEL) THEN
WRITE(99,*) 'ERROR: elements in layer out of range'
WRITE(99,*) 'Layer, NJ, MAXEL = ',I,NJ(I),MAXEL
WRITE(*,*) 'ERROR: elements in layer out of range'
WRITE(*,*) 'Layer, NJ, MAXEL = ',I,NJ(I),MAXEL
STOP
ENDIF
C Replace the following lines with read(11,*) (a(i,j), j = 1, 5)
C Atomic numbers
read(11,*) (ZT(I,j), j = 1, NJ(I))
C Mass numbers (amu)
read(11,*) (MT(I,j), j = 1, NJ(I))
C Concentration (stoichiometry)
read(11,*) (CO(I,j), j = 1, NJ(I))
C Surface binding energy
read(11,*) (SBE(I,j), j = 1, NJ(I))
C Displacement energy, always 30 eV??
read(11,*) (ED(I,j), j = 1, NJ(I))
C Bulk binding energy, usually zero
read(11,*) (BE(I,j), j = 1, NJ(I))
C value A-1 of the ziegler tables
read(11,*) (CH1(I,j), j = 1, NJ(I))
C value A-2 of the ziegler tables
read(11,*) (CH2(I,j), j = 1, NJ(I))
C value A-3 of the ziegler tables
read(11,*) (CH3(I,j), j = 1, NJ(I))
C value A-4 of the ziegler tables
read(11,*) (CH4(I,j), j = 1, NJ(I))
C value A-5 of the ziegler tables
read(11,*) (CH5(I,j), j = 1, NJ(I))
ENDDO
1359 CLOSE(UNIT=11)
RETURN
END
C=======================================================================
C UTILITY SUBROUTINES AND FUNCTIONS
C=======================================================================
SUBROUTINE MOMENTS(FIM0,SEM,THM,FOM,FIM,SIM,SIGMA,DFIM0,DSEM,DTHM,
# X1S,X2S,X3S,X4S,X5S,X6S,Y)
IMPLICIT NONE
REAL*8 FIM0,SEM,THM,FOM,FIM,SIM,SIGMA,DFIM0,DSEM,DTHM,
# X1S,X2S,X3S,X4S,X5S,X6S,Y
REAL*8 U,U2,U3,U4,SIGMA3
REAL*8 X3SP,X4SP,X5SP,X6SP
LOGICAL EQUAL
IF(EQUAL(Y,0.D0))GOTO 10
IF(EQUAL(Y,1.D0))GOTO 10
FIM0=X1S/Y
SEM=X2S/Y-FIM0*FIM0
SIGMA=DSQRT(SEM)
SIGMA3=SEM*SIGMA
U=FIM0/SIGMA
U2=U*U
U3=U2*U
U4=U3*U
X3SP=X3S/(Y*SIGMA3)
X4SP=X4S/(Y*SEM*SEM)
X5SP=X5S/(Y*SEM*SIGMA3)
X6SP=X6S/(Y*SIGMA3*SIGMA3)
THM=X3SP-U*(3.D0+U2)
FOM=X4SP-4.D0*U*X3SP+3.D0*U2*(2.D0+U2)
FIM=X5SP-5.D0*U*X4SP+10.D0*U2*X3SP-2.D0*U3*(5.D0+3.D0*U2)
SIM=X6SP-6.D0*U*X5SP+15.D0*U2*X4SP-20.D0*U3*X3SP+ 5.D0*U4*(3.D0+2
& .D0*U2)
DFIM0=SIGMA/DSQRT(Y)
DSEM=SEM*DSQRT(DMAX1(1.D-20,FOM-1.D0)/(Y))
DTHM=DSQRT(DMAX1(1.D-20, (9.D0+8.75D0*THM*THM+2.25D0*THM*THM*FOM-
& 6.D0*FOM-3.D0*THM*FIM+SIM))/Y)
10 CONTINUE
RETURN
END
SUBROUTINE MOMENTN(FIM0,SEM,THM,FOM,FIM,SIM,SIGMA,DFIM0,DSEM,DTHM,
& X1SY,X2SY,X3SY,X4SY,X5SY,X6SY,X1S,X2S,X3S,X4S,X5S,X6S,Y)
IMPLICIT NONE
REAL*8 FIM0,SEM,THM,FOM,FIM,SIM,SIGMA,DFIM0,DSEM,DTHM, X1SY,X2SY
& ,X3SY,X4SY,X5SY,X6SY,X1S,X2S,X3S,X4S,X5S,X6S,Y
REAL*8 X3SP,X4SP,X5SP,X6SP
REAL*8 U,U2,U3,U4,SIGMA3
LOGICAL EQUAL
IF(EQUAL(Y,0.D0))GOTO 10
IF(EQUAL(Y,1.D0))GOTO 10
X1SY=X1S/Y
X2SY=X2S/Y
X3SY=X3S/Y
X4SY=X4S/Y
X5SY=X5S/Y
X6SY=X6S/Y
FIM0=X1SY
SEM=X2SY-X1SY*X1SY
SIGMA=DSQRT(SEM)
SIGMA3=SEM*SIGMA
U=X1SY/SIGMA
U2=U*U
U3=U2*U
U4=U3*U
X3SP=X3SY/SIGMA3
X4SP=X4SY/(SEM*SEM)
X5SP=X5SY/(SEM*SIGMA3)
X6SP=X6SY/(SIGMA3*SIGMA3)
THM=X3SP-U*(3.D0+U2)
FOM=X4SP-4.D0*U*X3SP+3.D0*U2*(2.D0+U2)
FIM=X5SP-5.D0*U*X4SP+10.D0*U2*X3SP-2.D0*U3*(5.D0+3.D0*U2)
SIM=X6SP-6.D0*U*X5SP+15.D0*U2*X4SP-20.D0*U3*X3SP+ 5.D0*U4*(3.D0+2
& .D0*U2)
DFIM0=SIGMA/DSQRT(Y)
DSEM=SEM*DSQRT(DMAX1(1.D-20,FOM-1.D0)/(Y))
DTHM=DSQRT(DMAX1(1.D-20, (9.D0+8.75D0*THM*THM+2.25D0*THM*THM*FOM-
& 6.D0*FOM-3.D0*THM*FIM+SIM))/Y)
10 CONTINUE
RETURN
END
SUBROUTINE MOMENT(X1SY,X2SY,X3SY,X4SY,X5SY,X6SY ,X1S,X2S,X3S,X4S
& ,X5S,X6S,Y)
IMPLICIT NONE
REAL*8 X1SY,X2SY,X3SY,X4SY,X5SY,X6SY,X1S,X2S,X3S,X4S,X5S,X6S,Y
LOGICAL EQUAL
C Convert accumulated raw sums into per-particle moments by dividing
C through the population size Y. The higher-level MOMENTS/MOMENTN
C routines use these normalized values to build means, spreads and
C uncertainties for the reported observables.
IF(EQUAL(Y,0.D0))GOTO 10
X1SY=X1S/Y
X2SY=X2S/Y
X3SY=X3S/Y
X4SY=X4S/Y
X5SY=X5S/Y
X6SY=X6S/Y
10 RETURN
END
SUBROUTINE DIRCOS(COSX,COSY,COSZ,SINE,CPSI,SPSI,CPHI,SPHI,N)
IMPLICIT NONE
INTEGER N,IV
REAL*8 COSX(N),COSY(N),COSZ(N),SINE(N),CPSI(N),SPSI(N) ,CPHI(N)
& ,SPHI(N)
REAL*8 SRAT,CX2,CY2,CZ2,UNIT
C Rotate the current direction cosines by the sampled scattering
C angles (psi,phi). The output direction is explicitly renormalized
C because repeated collisions amplify small floating-point drift.
DO IV=1,N
SRAT=SPSI(IV)/SINE(IV)
CX2=CPSI(IV)*COSX(IV)+SPSI(IV)*SINE(IV)*CPHI(IV)
CY2=CPSI(IV)*COSY(IV)-SRAT*(COSY(IV)*COSX(IV)*CPHI(IV)-COSZ(IV)
& *SPHI(IV))
CZ2=CPSI(IV)*COSZ(IV)-SRAT*(COSZ(IV)*COSX(IV)*CPHI(IV)+COSY(IV)
& *SPHI(IV))
UNIT = 1.0D0/DSQRT(CX2**2+CY2**2+CZ2**2)
COSX(IV)=CX2*UNIT
COSY(IV)=CY2*UNIT
C MAKE SURE COSZ.NE.0.
COSZ(IV)=DSIGN(DABS(CZ2*UNIT)+1.D-12,CZ2)
SINE(IV)=DSQRT(COSY(IV)*COSY(IV)+COSZ(IV)*COSZ(IV))
ENDDO
RETURN
END
SUBROUTINE VELOCV(FG,FFG,E,COSX,COSY,COSZ,SINE,N)
IMPLICIT NONE
INTEGER n,I
C
C FETCH A NEW VELOCITY FROM A MAXWELLIAN FLUX AT A SURFACE
C Vectorized version used when multiple projectiles are initialized
C together with thermal surface velocities.
C
REAL*8 FG(2*N),FFG(N),E(N),COSX(N),COSY(N),COSZ(N),SINE(N)
C DIMENSIOM E(N),COSX(N),COSY(N),COSZ(N),SINE(N)
REAL*8 M1,VELC,ZARG
REAL*8 VELX,VELY,VELZ,VELQ,VEL
COMMON/A/ M1,VELC,ZARG
CALL FGAUSS(FG,2*N,N,FFG,N)
DO I=1,N
VELX=DSQRT((FFG(I)*ZARG)**2+VELC)
VELY=FG(I)*ZARG
VELZ=FG(I+N)*ZARG
VELQ=VELX*VELX+VELY*VELY+VELZ*VELZ
VEL=DSQRT(VELQ)
COSX(I)=VELX/VEL
COSY(I)=VELY/VEL
COSZ(I)=VELZ/VEL
SINE(I)=DSQRT(1.D0-COSX(I)*COSX(I))
E(I)=M1*VELQ
ENDDO
RETURN
END
SUBROUTINE VELOC(E,COSX,COSY,COSZ,SINE)
C
C FETCH A NEW VELOCITY FROM A MAXWELLIAN FLUX AT A SURFACE
C Scalar version that reuses Gaussian deviates generated by FGAUSS.
C
IMPLICIT NONE
INTEGER INIV1,INIV3
REAL*8 FG(128),FFG(64)
C BUGFIX: VELOC reuses buffered Gaussian deviates between calls.
C The buffer indices and arrays must be saved and initialized.
SAVE INIV1,INIV3,FG,FFG
DATA INIV1/0/,INIV3/0/
REAL*8 COSX,COSY,COSZ,SINE
REAL*8 M1,VELC,ZARG
REAL*8 VELX,VELY,VELZ,VELQ,VEL,E
COMMON/A/ M1,VELC,ZARG
IF (INIV1.EQ.0) CALL FGAUSS(FG,INIV1,64,FFG,INIV3)
VELX=FFG(INIV3)*ZARG
VELY=FG(INIV1)*ZARG
VELZ=FG(INIV1-1)*ZARG
IF (VELC.GT.0.) THEN
VELX=DSQRT(VELC+VELX**2)
ENDIF
INIV1=INIV1-2
INIV3=INIV3-1
VELQ=VELX*VELX+VELY*VELY+VELZ*VELZ
VEL=DSQRT(VELQ)
COSX=VELX/VEL
COSY=VELY/VEL
COSZ=VELZ/VEL
SINE=DSQRT(1.D0-COSX*COSX)
E=M1*VELQ
RETURN
END
SUBROUTINE FGAUSS (FG,IND,IANZ,FFG,IND2)
C
C RETURN IANZ PAIRS OF RANDOM NUMBER FROM A GAUSSIAN, I.E. IANZ*2
C NUMBERS, AND RETURN THEM IN THE ARRAY FG
C
C THIS FUNCTION SAMPLES FROM A GAUSSIAN OF THE
C FORM DEXP(-(X-ZA)**2/(2.*ZS**2))/(ZS*DSQRT(2*PI))
C ZA=0.
C ZS=1.
C
C IT IS THE BOX-MUELLER METHOD
C FG returns symmetric normal deviates, while FFG stores the positive
C half-space distribution used for Maxwellian flux sampling.
C
IMPLICIT NONE
INTEGER IND,IND2,IANZ,JJ
INTEGER*4 ISEED
REAL*8 PI2,ZZ,ZSIN,ZCOS,AR,ZT
REAL*8 FG(1),FFG(1)
real*4 random(1), ran2(2)
DATA PI2/6.28318530717598D0/
IND=IANZ+IANZ
DO JJ=1,IANZ
C 1. COMPUTE THE SINE AND COSINE OF 2*PI*RAN(1)
C
call ranlux(ran2, 2)
ZZ=PI2*DBLE(ran2(1))
ZSIN=DSIN(ZZ)
ZCOS=DCOS(ZZ)
AR=DLOG(DBLE(ran2(2)))
ZT=DSQRT(-1.0D0*(AR+AR))
FG(JJ+IANZ)=ZT*ZSIN
FG(JJ)=ZT*ZCOS
ENDDO
C
C RETURN IANZ RANDOM NUMBERS FROM A GAUSSIAN FLUX IN THE ARRAY FFG
C
IND2=IANZ
DO JJ=1,IANZ
call ranlux(random, 1)
AR=DLOG(DBLE(random(1)))
FFG(JJ)=DSQRT(-1.D0*(AR+AR))
ENDDO
RETURN
END
SUBROUTINE ENERGV(FE,E,COSX,COSY,COSZ,SINE,N)
C
C FETCH A NEW ENERGY FROM A MAXWELLIAN FLUX AT A SURFACE
C
IMPLICIT NONE
INTEGER N,I
REAL*8 FE(N),E(N),COSX(N),COSY(N),COSZ(N),SINE(N)
REAL*8 M1,EMT
REAL*8 TI,SHEATH,CALFA
COMMON/B/ TI,SHEATH,CALFA
CALL EMAXW(FE,N)
DO I=1,N
EMT=TI*FE(I)**2
COSX(I) = DSQRT((EMT*CALFA*CALFA +SHEATH)/(EMT +SHEATH))
SINE(I) = DSQRT( 1.D0 -COSX(I)*COSX(I))
COSY(I) = SINE(I)
COSZ(I) = 0.D0
E(I) = EMT + SHEATH
ENDDO
RETURN
END
SUBROUTINE ENERG(E,COSX,COSY,COSZ,SINE)
C
C FETCH A NEW ENERGY FROM A MAXWELLIAN FLUX AT A SURFACE
C
IMPLICIT NONE
REAL*8 FE(16)
REAL*8 M1,COSX,SINE,COSY,COSZ,E,EMT
REAL*8 TI,SHEATH,CALFA
COMMON/B/ TI,SHEATH,CALFA
CALL EMAXW(FE,16)
EMT=TI*FE(9)**2
COSX = DSQRT((EMT*CALFA*CALFA +SHEATH)/(EMT +SHEATH))
SINE = DSQRT( 1.D0 -COSX*COSX)
COSY = SINE
COSZ = 0.D0
E = EMT + SHEATH
RETURN
END
SUBROUTINE EMAXW (FE,NUMB)
C
C THIS FUNCTION SAMPLES FROM A MAXWELLIAN (ENERGY) OF THE
C FORM X**2*DEXP(-X**2)*4/DSQRT(PI))
C
C MONTE CARLO SAMPLER C29 (EVERETT, CASHWELL)
C
implicit none
INTEGER NUMB,I
INTEGER*4 ISEED
REAL*8 FE(1)
REAL*8 PI,AR1,AR2
real*4 random(3)
DATA PI/3.14159265358979D0/
DO I=1,NUMB
call ranlux(random, 3)
AR1=DLOG(DBLE(random(1)))
AR2=DLOG(DBLE(random(2)))*(DCOS(PI*0.5*DBLE(random(3))))**2
FE(I)=DSQRT(-1.D0*(AR1+AR2))
ENDDO
RETURN
END
REAL*8 FUNCTION CVMGT(A, B, C)
C this function returns A if C is tuer and B otherwise
C why is it needed??
IMPLICIT NONE
REAL*8 A,B
LOGICAL C
CVMGT = B
IF ( C ) CVMGT = A
RETURN
END
SUBROUTINE SCOPY(IM,A,INCA,B,INCB)
IMPLICIT NONE
INTEGER*4 INCA,INCB,IM,JA,JB
INTEGER J
REAL*8 A(*),B(*)
JA = IM * IABS(INCA)
IF (INCA .GT. 0) JA = 1
JB = IM * IABS(INCB)
IF (INCB .GT. 0) JB = 1
DO J = 1,IM
B(JB) = A(JA)
JA = JA + INCA
JB = JB + INCB
ENDDO
RETURN
END
FUNCTION ILLZ(N,A,K)
IMPLICIT NONE
LOGICAL A(*)
INTEGER K,L,N,I
INTEGER*4 ILLZ
IF(K.GT.0) THEN
L=N+1
DO I=N,1,-1
IF(A(I)) L=I
ENDDO
ELSE
L=0
DO I=1,N
IF(A(I)) L=I
ENDDO
L=N+1-L
ENDIF
ILLZ=L-1
RETURN
END
INTEGER FUNCTION ISRCHFGE(N,ARRAY,INC,TARGT)
IMPLICIT NONE
INTEGER I,N,J,INC
REAL*8 ARRAY(N),TARGT
J=1
IF(INC.LT.0) J=N*(-INC)
DO I=1,N
IF(ARRAY(J).GE.TARGT) GO TO 200
J=J+INC
ENDDO
200 ISRCHFGE=I
RETURN
END
INTEGER FUNCTION ISRCHFGT(N,ARRAY,INC,TARGT)
IMPLICIT NONE
INTEGER I,N,J,INC
REAL*8 ARRAY(N),TARGT
C Return the first index whose value is strictly greater than TARGT.
C This is used to map a continuous coordinate/depth onto the current
C layer or histogram bin in monotonic arrays.
J=1
IF(INC.LT.0) J=N*(-INC)
DO I=1,N
IF(ARRAY(J).GT.TARGT) GO TO 200
J=J+INC
ENDDO
200 ISRCHFGT=I
RETURN
END
SUBROUTINE ENERGGAUSS(ISEED2,Esig,Epar,E0)
IMPLICIT NONE
INTEGER*4 ISEED2
REAL*8 E0,Esig,Epar
REAL*8 p1,p2,p3,pi
real*4 random(2)
DATA pi/3.14159265358979D0/
C Sample a Gaussian-distributed incident energy around E0 using a
C Box-Mueller transform. Epar is the per-projectile starting energy.
call ranlux(random, 2)
p1 = Esig*DSQRT(-2.D0*DLOG(1.D0-DBLE(random(1))))
p2 = 2.D0*pi*DBLE(random(2))
p3 = p1*DCOS(p2)
Epar= E0-p3
RETURN
END
SUBROUTINE ALPHAGAUSS(ISEED3,ALPHASIG,ALPHA,ALFA,ALPHApar, CALFA
& ,SALFA,BW)
IMPLICIT NONE
INTEGER*4 ISEED3
REAL*8 ALPHA,ALPHASIG,ALPHApar
REAL*8 BW,ALFA,CALFA,SALFA
REAL*8 p1,p2,p3,pi
real*4 random(2)
DATA pi/3.14159265358979D0/
C Sample a Gaussian-distributed incidence angle around ALPHA and
C return both the angle in radians (ALFA) and its sine/cosine.
call ranlux(random, 2)
p1 = ALPHASIG*DSQRT(-2.D0*DLOG(1.D0-DBLE(random(1))))
p2 = 2.D0*pi*DBLE(random(2))
p3 = p1*DCOS(p2)
ALPHApar= ALPHA-p3
IF(ALPHApar.LT.0.D0) THEN
ALPHApar=DABS(ALPHApar)
ENDIF
ALFA = ALPHApar/BW
CALFA = DCOS(ALFA)
SALFA = DSIN(ALFA)
RETURN
END
LOGICAL FUNCTION EQUAL(F1,F2)
IMPLICIT NONE
REAL*8 F1,F2
REAL*8 TINY
PARAMETER (TINY = 1.0D-10)
C Centralized floating-point comparison used throughout the transport
C code to avoid exact equality checks on derived real-valued quantities.
IF (DABS(F1-F2).LE.TINY) THEN
EQUAL = .TRUE.
ELSE
EQUAL = .FALSE.
ENDIF
RETURN
END
SUBROUTINE TimeStamp(day,month,year,hour,min,sec,seconds_total)
C Subroutine to return date and time for start/stop of simulation
IMPLICIT NONE
INTEGER Date_Time(8)
INTEGER*4 days_total
INTEGER*4 seconds_total
CHARACTER Real_Clock(3)*12
CHARACTER month*4,day*2
CHARACTER year*4,hour*2
CHARACTER min*2,sec*2
CALL DATE_AND_TIME(Real_Clock(1),Real_Clock(2),Real_Clock(3),
& Date_Time)
IF(Date_Time(2).EQ.1) THEN
month='Jan.'
days_total=Date_Time(3)
ELSEIF(Date_Time(2).EQ.2) THEN
month='Feb.'
days_total=31+Date_Time(3)
ELSEIF(Date_Time(2).EQ.3) THEN
month='Mar.'
days_total=31+28+Date_Time(3)
ELSEIF(Date_Time(2).EQ.4) THEN
month='Apr.'
days_total=31+28+31+Date_Time(3)
ELSEIF(Date_Time(2).EQ.5) THEN
month='May '
days_total=31+28+31+30+Date_Time(3)
ELSEIF(Date_Time(2).EQ.6) THEN
month='Jun.'
days_total=31+28+31+30+31+Date_Time(3)
ELSEIF(Date_Time(2).EQ.7) THEN
month='Jul.'
days_total=31+28+31+30+31+30+Date_Time(3)
ELSEIF(Date_Time(2).EQ.8) THEN
month='Aug.'
days_total=31+28+31+30+31+30+31+Date_Time(3)
ELSEIF(Date_Time(2).EQ.9) THEN
month='Sep.'
days_total=31+28+31+30+31+30+31+31+Date_Time(3)
ELSEIF(Date_Time(2).EQ.10) THEN
month='Oct.'
days_total=31+28+31+30+31+30+31+31+30+Date_Time(3)
ELSEIF(Date_Time(2).EQ.11) THEN
month='Nov.'
days_total=31+28+31+30+31+30+31+31+30+31+Date_Time(3)
ELSE
month='Dec.'
days_total=31+28+31+30+31+30+31+31+30+31+30+Date_Time(3)
ENDIF
C in seconds from beginning of year
seconds_total=Date_Time(7)+(Date_Time(6)*60)+(Date_Time(5) *3600)
& +(days_total-1)*86400
READ(Real_Clock(1)(1:4),'(A4)')year
READ(Real_Clock(1)(7:8),'(A2)')day
READ(Real_Clock(2)(1:2),'(A2)')hour
READ(Real_Clock(2)(3:4),'(A2)')min
READ(Real_Clock(2)(5:6),'(A2)')sec
RETURN
END
C=======================================================================
C RANDOM NUMBER GENERATOR
C=======================================================================
SUBROUTINE RANLUX(RVEC,LENV)
C Subtract-and-borrow random number generator proposed by
C Marsaglia and Zaman, implemented by F. James with the name
C RCARRY in 1991, and later improved by Martin Luescher
C in 1993 to produce "Luxury Pseudorandom Numbers".
C Fortran 77 coded by F. James, 1993
C
C LUXURY LEVELS.
C ------ ------ The available luxury levels are:
C
C level 0 (p=24): equivalent to the original RCARRY of Marsaglia
C and Zaman, very long period, but fails many tests.
C level 1 (p=48): considerable improvement in quality over level 0,
C now passes the gap test, but still fails spectral test.
C level 2 (p=97): passes all known tests, but theoretically still
C defective.
C level 3 (p=223): DEFAULT VALUE. Any theoretically possible
C correlations have very small chance of being observed.
C level 4 (p=389): highest possible luxury, all 24 bits chaotic.
C
C!!! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C!!! Calling sequences for RANLUX: ++
C!!! CALL RANLUX (RVEC, LEN) returns a vector RVEC of LEN ++
C!!! 32-bit random floating point numbers between ++
C!!! zero (not included) and one (also not incl.). ++
C!!! CALL RLUXGO(LUX,INT,K1,K2) initializes the generator from ++
C!!! one 32-bit integer INT and sets Luxury Level LUX ++
C!!! which is integer between zero and MAXLEV, or if ++
C!!! LUX .GT. 24, it sets p=LUX directly. K1 and K2 ++
C!!! should be set to zero unless restarting at a break++
C!!! point given by output of RLUXAT (see RLUXAT). ++
C!!! CALL RLUXAT(LUX,INT,K1,K2) gets the values of four integers++
C!!! which can be used to restart the RANLUX generator ++
C!!! at the current point by calling RLUXGO. K1 and K2++
C!!! specify how many numbers were generated since the ++
C!!! initialization with LUX and INT. The restarting ++
C!!! skips over K1+K2*E9 numbers, so it can be long.++
C!!! A more efficient but less convenient way of restarting is by: ++
C!!! CALL RLUXIN(ISVEC) restarts the generator from vector ++
C!!! ISVEC of 25 32-bit integers (see RLUXUT) ++
C!!! CALL RLUXUT(ISVEC) outputs the current values of the 25 ++
C!!! 32-bit integer seeds, to be used for restarting ++
C!!! ISVEC must be dimensioned 25 in the calling program ++
C!!! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DIMENSION RVEC(LENV)
DIMENSION SEEDS(24), ISEEDS(24), ISDEXT(25)
PARAMETER (MAXLEV=4, LXDFLT=3)
DIMENSION NDSKIP(0:MAXLEV)
DIMENSION NEXT(24)
PARAMETER (TWOP12=4096., IGIGA=1000000000,JSDFLT=314159265)
PARAMETER (ITWO24=2**24, ICONS=2147483563)
SAVE NOTYET, I24, J24, CARRY, SEEDS, TWOM24, TWOM12, LUXLEV
SAVE NSKIP, NDSKIP, IN24, NEXT, KOUNT, MKOUNT, INSEED
INTEGER LUXLEV
LOGICAL NOTYET
DATA NOTYET, LUXLEV, IN24, KOUNT, MKOUNT /.TRUE., LXDFLT, 0,0,0/
DATA I24,J24,CARRY/24,10,0./
C default
C Luxury Level 0 1 2 *3* 4
DATA NDSKIP/0, 24, 73, 199, 365 /
Corresponds to p=24 48 97 223 389
C time factor 1 2 3 6 10 on slow workstation
C 1 1.5 2 3 5 on fast mainframe
C
C NOTYET is .TRUE. if no initialization has been performed yet.
C Default Initialization by Multiplicative Congruential
IF (NOTYET) THEN
NOTYET = .FALSE.
JSEED = JSDFLT
INSEED = JSEED
LUXLEV = LXDFLT
NSKIP = NDSKIP(LUXLEV)
LP = NSKIP + 24
IN24 = 0
KOUNT = 0
MKOUNT = 0
TWOM24 = 1.
DO 25 I= 1, 24
TWOM24 = TWOM24 * 0.5
K = JSEED/53668
JSEED = 40014*(JSEED-K*53668) -K*12211
IF (JSEED .LT. 0) JSEED = JSEED+ICONS
ISEEDS(I) = MOD(JSEED,ITWO24)
25 CONTINUE
TWOM12 = TWOM24 * 4096.
DO 50 I= 1,24
SEEDS(I) = REAL(ISEEDS(I))*TWOM24
NEXT(I) = I-1
50 CONTINUE
NEXT(1) = 24
I24 = 24
J24 = 10
CARRY = 0.
IF (SEEDS(24) .EQ. 0.) CARRY = TWOM24
ENDIF
C
C The Generator proper: "Subtract-with-borrow",
C as proposed by Marsaglia and Zaman,
C Florida State University, March, 1989
C
DO 100 IVEC= 1, LENV
UNI = SEEDS(J24) - SEEDS(I24) - CARRY
IF (UNI .LT. 0.) THEN
UNI = UNI + 1.0
CARRY = TWOM24
ELSE
CARRY = 0.
ENDIF
SEEDS(I24) = UNI
I24 = NEXT(I24)
J24 = NEXT(J24)
RVEC(IVEC) = UNI
C small numbers (with less than 12 "significant" bits) are "padded".
IF (UNI .LT. TWOM12) THEN
RVEC(IVEC) = RVEC(IVEC) + TWOM24*SEEDS(J24)
C and zero is forbidden in case someone takes a logarithm
IF (RVEC(IVEC) .EQ. 0.) RVEC(IVEC) = TWOM24*TWOM24
ENDIF
C Skipping to luxury. As proposed by Martin Luscher.
IN24 = IN24 + 1
IF (IN24 .EQ. 24) THEN
IN24 = 0
KOUNT = KOUNT + NSKIP
DO 90 ISK= 1, NSKIP
UNI = SEEDS(J24) - SEEDS(I24) - CARRY
IF (UNI .LT. 0.) THEN
UNI = UNI + 1.0
CARRY = TWOM24
ELSE
CARRY = 0.
ENDIF
SEEDS(I24) = UNI
I24 = NEXT(I24)
J24 = NEXT(J24)
90 CONTINUE
ENDIF
100 CONTINUE
KOUNT = KOUNT + LENV
IF (KOUNT .GE. IGIGA) THEN
MKOUNT = MKOUNT + 1
KOUNT = KOUNT - IGIGA
ENDIF
RETURN
C
C Entry to input and float integer seeds from previous run
ENTRY RLUXIN(ISDEXT)
NOTYET = .FALSE.
TWOM24 = 1.
DO I= 1, 24
NEXT(I) = I-1
TWOM24 = TWOM24 * 0.5
ENDDO
NEXT(1) = 24
TWOM12 = TWOM24 * 4096.
WRITE(6,'(A)') ' FULL INITIALIZATION OF RANLUX WITH 25 INTEGERS:'
WRITE(6,'(5X,5I12)') ISDEXT
DO 200 I= 1, 24
SEEDS(I) = REAL(ISDEXT(I))*TWOM24
200 CONTINUE
CARRY = 0.
IF (ISDEXT(25) .LT. 0) CARRY = TWOM24
ISD = IABS(ISDEXT(25))
I24 = MOD(ISD,100)
ISD = ISD/100
J24 = MOD(ISD,100)
ISD = ISD/100
IN24 = MOD(ISD,100)
ISD = ISD/100
LUXLEV = ISD
IF (LUXLEV .LE. MAXLEV) THEN
NSKIP = NDSKIP(LUXLEV)
WRITE (6,'(A,I2)') ' RANLUX LUXURY LEVEL SET BY RLUXIN TO: ',
+ LUXLEV
ELSE IF (LUXLEV .GE. 24) THEN
NSKIP = LUXLEV - 24
WRITE (6,'(A,I5)') ' RANLUX P-VALUE SET BY RLUXIN TO:',LUXLEV
ELSE
NSKIP = NDSKIP(MAXLEV)
WRITE (6,'(A,I5)') ' RANLUX ILLEGAL LUXURY RLUXIN: ',LUXLEV
LUXLEV = MAXLEV
ENDIF
INSEED = -1
RETURN
C
C Entry to ouput seeds as integers
ENTRY RLUXUT(ISDEXT)
DO 300 I= 1, 24
ISDEXT(I) = INT(SEEDS(I)*TWOP12*TWOP12)
300 CONTINUE
ISDEXT(25) = I24 + 100*J24 + 10000*IN24 + 1000000*LUXLEV
IF (CARRY .GT. 0.) ISDEXT(25) = -ISDEXT(25)
RETURN
C
C Entry to output the "convenient" restart point
ENTRY RLUXAT(LOUT,INOUT,K1,K2)
LOUT = LUXLEV
INOUT = INSEED
K1 = KOUNT
K2 = MKOUNT
RETURN
C
C Entry to initialize from one or three integers
ENTRY RLUXGO(LUX,INS,K1,K2)
IF (LUX .LT. 0) THEN
LUXLEV = LXDFLT
ELSE IF (LUX .LE. MAXLEV) THEN
LUXLEV = LUX
ELSE IF (LUX .LT. 24 .OR. LUX .GT. 2000) THEN
LUXLEV = MAXLEV
WRITE (6,'(A,I7)') ' RANLUX ILLEGAL LUXURY RLUXGO: ',LUX
ELSE
LUXLEV = LUX
DO 310 ILX= 0, MAXLEV
IF (LUX .EQ. NDSKIP(ILX)+24) LUXLEV = ILX
310 CONTINUE
ENDIF
IF (LUXLEV .LE. MAXLEV) THEN
NSKIP = NDSKIP(LUXLEV)
WRITE(6,'(A,I2,A,I4)') ' RANLUX LUXURY LEVEL SET BY RLUXGO :',
+ LUXLEV,' P=', NSKIP+24
ELSE
NSKIP = LUXLEV - 24
WRITE (6,'(A,I5)') ' RANLUX P-VALUE SET BY RLUXGO TO:',LUXLEV
ENDIF
IN24 = 0
IF (INS .LT. 0) WRITE (6,'(A)')
+ ' Illegal initialization by RLUXGO, negative input seed'
IF (INS .GT. 0) THEN
JSEED = INS
WRITE(6,'(A,3I12)') ' RANLUX INITIALIZED BY RLUXGO FROM SEEDS',
+ JSEED, K1,K2
ELSE
JSEED = JSDFLT
WRITE(6,'(A)')' RANLUX INITIALIZED BY RLUXGO FROM DEFAULT SEED'
ENDIF
INSEED = JSEED
NOTYET = .FALSE.
TWOM24 = 1.
DO 325 I= 1, 24
TWOM24 = TWOM24 * 0.5
K = JSEED/53668
JSEED = 40014*(JSEED-K*53668) -K*12211
IF (JSEED .LT. 0) JSEED = JSEED+ICONS
ISEEDS(I) = MOD(JSEED,ITWO24)
325 CONTINUE
TWOM12 = TWOM24 * 4096.
DO 350 I= 1,24
SEEDS(I) = REAL(ISEEDS(I))*TWOM24
NEXT(I) = I-1
350 CONTINUE
NEXT(1) = 24
I24 = 24
J24 = 10
CARRY = 0.
IF (SEEDS(24) .EQ. 0.) CARRY = TWOM24
C If restarting at a break point, skip K1 + IGIGA*K2
C Note that this is the number of numbers delivered to
C the user PLUS the number skipped (if luxury .GT. 0).
KOUNT = K1
MKOUNT = K2
IF (K1+K2 .NE. 0) THEN
DO 500 IOUTER= 1, K2+1
INNER = IGIGA
IF (IOUTER .EQ. K2+1) INNER = K1
DO 450 ISK= 1, INNER
UNI = SEEDS(J24) - SEEDS(I24) - CARRY
IF (UNI .LT. 0.) THEN
UNI = UNI + 1.0
CARRY = TWOM24
ELSE
CARRY = 0.
ENDIF
SEEDS(I24) = UNI
I24 = NEXT(I24)
J24 = NEXT(J24)
450 CONTINUE
500 CONTINUE
C Get the right value of IN24 by direct calculation
IN24 = MOD(KOUNT, NSKIP+24)
IF (MKOUNT .GT. 0) THEN
IZIP = MOD(IGIGA, NSKIP+24)
IZIP2 = MKOUNT*IZIP + IN24
IN24 = MOD(IZIP2, NSKIP+24)
ENDIF
C Now IN24 had better be between zero and 23 inclusive
IF (IN24 .GT. 23) THEN
WRITE (6,'(A/A,3I11,A,I5)')
+ ' Error in RESTARTING with RLUXGO:',' The values', INS,
+ K1, K2, ' cannot occur at luxury level', LUXLEV
IN24 = 0
ENDIF
ENDIF
RETURN
END