Bloch wave dynamical programs.
Clear reviews of the Bloch-wave theory of dynamical electron diffraction can be found in
Hirsch, Howie et al. (1977), Howie (1971), Humphreys (1979, Metherall (1975) and Reimer
(1984), as discussed in chapter 3. The exact incorporation of HOLZ reflections in this approach
is described in Lewis, Villagrana et al. (1978). A recent review which emphasises Bloch waves in
real space and the atomic string approach can be found in Bird (1989) , where the use of
perturbation methods for the HOLZ is also reviewed . The papers by Ishizuka and Uyeda (1977)
and Goodman and Moodie (1974) discuss the relationship between the various algorithms and
the Schrodinger equation. Methods for computing CBED patterns from quasicrystals are
discussed in Cheng and Wang (1989).
The development of computer algorithms based on these expressions is reviewed in the
books Krakow and O'Keefe (1989) and Buseck, Cowley et al. (1989). Many FORTRAN source
programs useful for electron microscopy can obtained at no charge by telephone (using a
computer modem) from the Argonne Public domain software library (Bitnet address
ZALUZEC@ANLMST, Username EMMPDL, Password EMMPDL . Telephone USA 312-972-
7919. 800 or 1200 Baud, 8 data, 1 stop bit, no parity. See also EMSA Bulletin Vol 16, No 1, p.42
. A popular suite of programs, (EMS) which compute both lattice images (multislice) and CBED
patterns (Bloch-wave) are described in the chapter by Stadelmann in Krakow and O'Keefe
(1989), and in Stadelmann (1987). This program is installed in many laboratories around the
world, operating on many computers including the Silicon Graphics and Vax types. Another
popular commercial suite of programs for many types of diffraction calculations and atomic
modelling is the Cerius Crystals Module (from Cambridge Molecular Design, St John's Center,
Cowley Rd., Cambridge, CB4 4WS, U.K.). The Refine/CB program discussed in section 4.2 for
automated structure factor refinement is available from the authors (c/o Department of Physics,
Arizona State University, Tempe, Az, 85287, USA), and is further discussed in Zuo and Spence
(1991).
A listing of our Bloch-wave Fortran program TCBED follows, with sample input and
output. An earlier version of this was listed in full in Zuo, Gjonnes et al. (1989), and is available
at no charge from the Argonne Publicv domain library by modem. New programs may be tested
against the output given in figure A5.1, or against the data shown in figure 5.2, which agrees well
with experiment at two thicknesses.
The TCBED program listed below uses the subroutines for automatic beam generation
and crystallographic computations which have been listed in the previous section. The program
also requires subroutines for the diagonalization of a complex general matrix. These can be
found in the EISPACK package Smith (1976). These subroutines may be obtained from a public
domain library at the electronic mail address [email protected]. For a listing of
programs in this library (and for help), send a message to above address with the words 'send
index'.
PROGRAM TCBED
************************************************************************
* A FORTRAN PROGRAM FOR SIMULATING TRANSMISSION CONVERGENT BEAM *
* ELECTRON DIFFRACTION PATTERNS WITH ABSORPTION BY BLOCH WAVE METHOD *
* VERSION 2 *
* *
* THIS PROGRAM HAS THE FOLLOWING SPECIAL FEATURES: *
* 1) HOLZ INTERACTIONS ARE INCLUDED *
* 2) ABSORPTION IS INCLUDED BY DIAGONALIZING A GENERAL COMPLEX MATRIX *
* 3) THE DEFAULT ABSORPTION POTENTIAL IS CALCULATED BY "ATOM" PROGRAM *
* 4) INDIVIDUAL STRUCTURE FACTORS AND ABSORPTION PARAMETERS CAN BE *
* ADJUSTED *
* 5) AUTOMATIC GENERATION OF BEAMS FOR SIMULATION *
* *
* THIS PROGRAM ASSUMES THE FOLLOWING CONVENTIONS *
* 1) THE CRYSTALLOGRAPHIC SIGN CONVENTION EXP(-IKR) FOR PLANE WAVE *
* 2) ISOTROPIC DEBYE-WALLER FACTOR FOR EACH ATOM IN THE UNIT CELL *
* 3) ANSTROM AS THE UNIT OF LENGTH *
* 4) INCIDENT BEAM DIRECTION SPECIFIED BY THE CENTER OF LAUE CIRCLE *
* 5) Z AXIS IS ALONG THE ZONE AXIS DIRECTION, Z=0 FOR ENTRANCE *
* SURFACE AND Z=-t FOR EXIT SURFACE *
* *
* OUTPUT FILE *
* OUTPUT DATA FILE IS UNFORMATED, TO READ THE FILE, USE *
* READ (UNIT) NP,(BINT(I),I=1,NP) *
* NY=BINT(NP) !NUMBER OF POINT IN Y-DIRECTION *
* NX=BINT(NP-1) !NUMBER OF POINT IN X-DIRECTION *
* ND=BINT(NP-2) !NUMBER OF THICKNESS *
* NB=BINT(NP-3) !NUMBER OF OUTPUT BEAMS *
* TO GET CBED INTENSITY FOR THE I1 REFLECTION, I2 THICKNESS, USE *
* DO J=1,NY *
* DO I=1,NX *
* IPOS=(J-1)*NX*ND*NB+(I-1)*ND*NB+(I1-1)*NB+I2 *
* CBED(I,J)=BINT(IPOS) *
* END DO *
* END DO *
* *
* J.M. ZUO, NOV. 1989 *
************************************************************************
CHARACTER TEXT*80,STATUS*4
PARAMETER (NM=300)
INTEGER HKL(3,NM),HKLOUT(3,NM),HKLSR(3,NM),ID(NM)
REAL UGHR(NM,NM),UGHI(NM,NM),CCR(NM,NM),CCI(NM,NM),
* VR(NM),VI(NM),BINT(60000),UGSR(NM),UGSI(NM),
* ABSPR(NM),ABSPI(NM)
COMPLEX CVT(NM,NM),CINV(NM)
PARAMETER (NJ=10)
CHARACTER*4 LABEL(NJ)
REAL ZT(NJ),CX(NJ),AX(4,NJ),BX(4,NJ),AF(NJ),AFI(NJ)
PARAMETER (NK=500)
DIMENSION ITYPE(NK),XP(3,NK),DW(NK)
REAL*8 GMX(3,3),GMXR(3,3)
COMMON/METRIC/ GMX,GMXR
CHARACTER*2 ELNAME
DOUBLE PRECISION MATM,SATM,KVATM,FEATM,FAATM
INTEGER STATM
CHARACTER*2 ABSCTL
REAL KV,CELL(6),TILT0(3,3),ZONE(3),GH(3),GG(3)
REAL TILTX(3),TILTY(3),TILT(3),BIGK,DEPTH(5000)
INTEGER INDZ(3),GX(3),GY(3),GZ(3),NET(2,10000)
REAL*8 PI,TWOPI,TEMP,CN,SN,SFRE,SFIM,S2
COMPLEX ZERO,ONE,C1,C2,C3
DATA PI/3.14159254/,TWOPI/6.283185307/,
* NR,NW,IW/10,12,14/,
* DELTA/1.0E-7/
100 FORMAT (80A)
110 FORMAT (A4)
120 FORMAT (/,' OUTPUT LISTING OF TCBED PROGRAM BY J. M. ZUO, V2.0',
* /,X,80A)
140 FORMAT (/,' INCIDENT ELECTRON BEAM HIGH VOLTAGE ',F12.5,' KV',
* /,' WAVELENGTH ',F12.6,' A')
160 FORMAT (/,' NEAREST ZONE AXIS ',3I4)
180 FORMAT (/,' 3 POINTS DEFINE A PARALLEL BOX CBED REGION',
* /,' POINT 1, THE ORIGIN ',3F10.5,
* /,' POINT 2, THE X-AXIS ',3F10.5,
* /,' POINT 3, THE Y-AXIS ',3F10.5,
* /,' NUMBER OF SAMPLING POINTS IN X-DIR ',I4,
* /,' IN Y-DIR ',I4)
200 FORMAT (/,' BASE G VECTOR ALONG X DIRECTION ',3I4,
* /,' Y DIRECTION ',3I4,
* /,' Z DIRECTION ',3I4)
220 FORMAT (/,' THE UNIT CELL IS DEFINED BY a = ',F9.5,' Angstrom',
* /,' b = ',F9.5,' Angstrom',
* /,' c = ',F9.5,' Angstrom',
* /,' alpha = ',F9.5,' Degree',
* /,' beta = ',F9.5,' Degree',
* /,' gamma = ',F9.5,' Degree')
240 FORMAT (/,' THERE ARE TOTAL',I4,' ATOMS AND',I3,' SPECIES')
260 FORMAT (/,' THE ATOMS, THEIR X-RAY SCATTERING FACTOR PARAMETERS'
* /,' AND THEIR DEBYE-WALLER FACTOR')
280 FORMAT (/,X,I2,2X,A4,' Z=',F6.2,/,9F8.4)
300 FORMAT (/,' THE ATOMS TYPE, THEIR COORDINATES AND D-W FACTOR')
320 FORMAT (2(X,I2,3F9.5,F6.3))
340 FORMAT (/,' STATUS = AUTO , BEAM INDEX (HKL) ARE GENERATED BY'
* ' PROGRAM BEAM_SETUP',
* /,' UP TO HOLZ ',I1,' AND MAXIMUM EXCITATION ERROR ',F5.2)
360 FORMAT (/,' NUMBER OF BEAMS EXCEEDS THE CAPACITY OF THIS PROGRAM')
380 FORMAT (/,' TOTAL',I4,' BEAMS ARE INCLUDED, THEY ARE')
400 FORMAT (5(X,3I4,','))
420 FORMAT (/,' BEAM INTENSITIES ARE CALCULATED FOR ',I3,' DIFFERENT'
* ' THICKNESSES, THEY ARE')
440 FORMAT (10(X,F8.3))
450 FORMAT (/,' BEAM INTENSITIES ARE CALCULATED FOR ',I3,' DIFFERENT'
* ' THICKNESSES WITH A INCREMENT',F10.5)
460 FORMAT (/,' STRUCTURE FACTOR AND ABSORPTION COEFFICIENTS IN Ugh',
* ' MATRIX',
* /,4X,'i',3X,'j',6X,'H',3X,'K',3X,'L',7X,'|Ugh|',3X,'AND',
* 2X,'PHASE',9X,'|U''gh|',2X,'PHASE')
480 FORMAT (1X,2I4,' (',3I4,')',E15.5,F13.6,E15.5,F10.3)
500 FORMAT (/,' NUMBER OF BEAMS OUTPUTED ARE',I4,' THEY ARE')
520 FORMAT (/,' NUMBER OF REFINED REFLECTIONS ARE',I4,' THEY ARE')
540 FORMAT (' (',3I4,')',E15.5,F13.6,E15.5,F13.6)
560 FORMAT (/,' THE MEAN CRYSTAL ABSORPTION POTENTIAL IS ',F13.6)
580 FORMAT (/,' THE MEAN CRYSTAL POTENTIAL IS ',F13.6)
600 FORMAT (/,' WARNING!!!, ERROR IN APSORPTION CAL. FOR ATOM ',A4,
* ' REFLECTION ',3I4)
ZERO=CMPLX(0.0,0.0)
ONE=CMPLX(1.0,0.0)
C
C START INPUT FROM CHANNEL 10 AND LISTING TO CHANNEL 12
C
C TEXT: 80 CHARACTER TITLE
C
READ (NR,100) TEXT
WRITE (NW,120) TEXT
C
C KV INCIDENT ELECTRON ENERGY IN UNIT OF KeV
C INDZ(3) NEAREST ZONE AXIS INDEX
C TILT0(3,3) 3 INCIDENT BEAM DIRECTIONS, TOGETHER THEY DEFINES A PARALLEL
C BOX REGION OF CBED. THE 1ST IS THE ORIGIN, THE 1ST AND 2ND IS
C THE X SIDE AND 1ST AND 3RD IS THE Y SIDE OF THE
C PARALLELOGRAM
C THE INCIDENT BEAM DIRECTION IS DEFINED BY THE COORDINATES
C OF THE LAUE CIRCLE IN UNITS OF CRYSTAL RECIPROCAL LATTICE
C NX,NY NUMBER OF SAMPLING POINTS IN X AND Y DIRECTIONS
C
READ (NR,*) KV,INDZ,((TILT0(I,J),J=1,3),I=1,3),NX,NY
KVATM=KV
WAVEL=0.3878314/SQRT(KV*(1.0+0.97846707E-03*KV))
WRITE (NW,140) KV,WAVEL
WRITE (NW,160) INDZ
WRITE (NW,180) ((TILT0(I,J),J=1,3),I=1,3),NX,NY
C
C CELL(6) CRYSTAL UNIT CELL PARAMETERS IN THE ORDER OF
C a, b, c, alpha, beta, and gamma
C
READ (NR,*) CELL
WRITE (NW,220) CELL
DO I=4,6
CELL(I)=COS(PI*CELL(I)/180.0)
END DO
CALL METRIC(CELL)
DO I=1,3
ZONE(I)=FLOAT(INDZ(I))
END DO
CALL SCALE(0,ZONE,TEMP1)
DO I=1,3
ZONE(I)=ZONE(I)/TEMP1
END DO
C
C NATOMS NUMBER OF ATOMS IN THE UNIT CELL
C NTYPE NUMBER OF TYPES OF ATOMS IN THE UNIT CELL
C
READ (NR,*) NATOMS,NTYPE
WRITE (NW,240) NATOMS,NTYPE
WRITE (NW,260)
DO I=1,NTYPE
C
C LABEL ATOMIC SYMBOL
C
READ (NR,110) LABEL(I)
C
C ZT ATOMIC NUMBER
C AX,BX,CX 9 GAUSSIAN FITTING PARAMETERS OF ATOMIC X-RAY SCATTERING
C FACTORS
C
READ (NR,*) ZT(I),(AX(J,I),BX(J,I),J=1,4),CX(I)
IF (ZT(I).EQ.0) THEN
ZT(I)=CX(I)
DO J=1,4
ZT(I)=AX(J,I)+ZT(I)
END DO
END IF
WRITE (NW,280) I,LABEL(I),ZT(I),(AX(J,I),BX(J,I),J=1,4),
* CX(I)
END DO
C
C ITYPE THE SEQUENTIAL NUMBER ASSIGNED TO THE ATOMS IN PREVIOUS
C X-RAY SCATTERING FACTOR INPUT
C XP(3) FRACTIONAL ATOMIC COORDINATES
C DW DEBYE-WALLER FACTOR OF THE ATOM
C
READ (NR,*) (ITYPE(I),(XP(J,I),J=1,3),DW(I),I=1,NATOMS)
WRITE (NW,300)
WRITE (NW,320) (ITYPE(I),(XP(J,I),J=1,3),DW(I),I=1,NATOMS)
C
C STATUS A PROGRAM FLOW CONTROL PARAMETER, IF STATUS =
C 'AUTO' THEN
C THE PROGRAM GENERATES THE REFLECTIONS NEEDED IN
C THIS SIMULATION,
C ELSE
C USER ENTERS THE REFLECTIONS
C
READ (NR,100) STATUS
IF (STATUS(1:4).EQ.'AUTO'.OR.STATUS(1:4).EQ.'auto') THEN
C
C GX(3),GY(3),GZ(3) THREE INDEPENDENT BASE G VECTORS FOR GENERATING
C THE ENTIRE G VECTORS IN THE ZONE AXIS
C GX AND GY FOR THE ZOLZ
C GZ FOR THE HOLZ
C
READ (NR,*) GX,GY,GZ
WRITE (NW,200) GX,GY,GZ
C
C IHOLZ NUMBER OF HOLZ RINGS TO BE INCLUDED
C SGMAX THE MAXIMUM EXCITATION ERRORS TO BE CONSIDERED
C THIS PARAMETER DETERMINES WHICH REFLECTION SHOULD BE
C INCLUDED, AND WHICH SHOULD NOT
C
READ (NR,*) IHOLZ,SGMAX
WRITE (NW,340) IHOLZ-1,SGMAX
DO I=1,3
TILT(I)=TILT0(1,I)+0.5*TILT0(2,I)+0.5*TILT0(3,I)
END DO
CALL BEAM_SETUP(NPEAMS,HKL,GX,GY,GZ,ZONE,IHOLZ,TILT,SGMAX,
* WAVEL,1)
READ (NR,*) NBEAMS
NPEAMS=NPEAMS-NBEAMS
ELSE
C
C NBEAMS NUMBER OF REFLECTIONS TO BE INCLUDED
C HKL(3,I) H, K, L OF THE REFLECTION
C
READ (NR,*) NPEAMS
READ (NR,*) ((HKL(J,I),J=1,3),I=1,NPEAMS)
READ (NR,*) NBEAMS
NPEAMS=NPEAMS-NBEAMS
END IF
WRITE (NW,380) NBEAMS+NPEAMS
WRITE (NW,400) ((HKL(J,I),J=1,3),I=1,NBEAMS+NPEAMS)
IF (NBEAMS+NPEAMS.GT.NM) THEN
WRITE (NW,360)
STOP
END IF
WRITE (NW,402) NPEAMS
402 FORMAT (/,I5,' BEAMS ARE TREATED BY PERTURBATION')
C
C STATUS A PROGRAM FLOW CONTROL PARAMETER, IF STATUS =
C 'STOP' THEN
C STOP
C IF STATUS =
C 'AUTO' THEN
C PROGRAM GENERATES THE THICKNESS
C ELSE
C USER ENTERS THE THICKNESS
C
READ (NR,100) STATUS
IF (STATUS(1:4).EQ.'STOP'.OR.STATUS(1:4).EQ.'stop') STOP
C
C THICKNESS SETUP
C
IF (STATUS(1:4).EQ.'AUTO'.OR.STATUS(1:4).EQ.'auto') THEN
C
C NDEPTH NUMBER OF THICKNESSES TO BE CALCULATED
C TSTEP THE THICKNESS STEP
C
READ (NR,*) NDEPTH,TSTEP
DO I=1,NDEPTH
DEPTH(I)=I*TSTEP
END DO
WRITE (NW,450) NDEPTH,TSTEP
ELSE
C
C DEPTH THE THICKNESS TO BE CALCULATED
C
READ (NR,*) NDEPTH,(DEPTH(I),I=1,NDEPTH)
WRITE (NW,420) NDEPTH
WRITE (NW,440) (DEPTH(I),I=1,NDEPTH)
END IF
C
C NOUT THE NUMBER OF REFLECTIONS WHOSE INTENSITY TO BE CALCULATED
C IF NOUT = 0, CALCULATES FOR ALL REFLECTIONS
C
READ (NR,*) NOUT
IF (NOUT.EQ.0) THEN
NOUT=NBEAMS
DO I=1,NBEAMS
ID(I)=I
DO J=1,3
HKLOUT(J,I)=HKL(J,I)
END DO
END DO
GOTO 1000
END IF
C
C HKLOUT(3,I) THE H, K, L INDEX OF THE ith REFLECTION TO BE CALCULATED
C
IF (NOUT.GT.0) THEN
READ (NR,*) ((HKLOUT(J,I),J=1,3),I=1,NOUT)
END IF
DO I=1,NOUT
DO K=1,NBEAMS
DO J=1,3
IF (HKL(J,K).NE.HKLOUT(J,I)) GOTO 900
END DO
ID(I)=K
GOTO 950
900 CONTINUE
END DO
950 CONTINUE
END DO
1000 WRITE (NW,500) NOUT
WRITE (NW,400) ((HKLOUT(J,I),J=1,3),I=1,NOUT)
C
C NRF THE NUMBER OF REFLECTIONS WHOSE STRUCTURE FACTORS ARE TO BE
C ADJUSTED
C HKLSR THE INDEX OF ADJUSTED REFLECTIONS
C TEMP1,TEMP2 THE AMPLITUDE (ANGSTROM**-2) AND PHASE (IN RADIANS) OF
C ADJUSTED STRUCTURE FACTOR
C ABSPR,ABSPI THE ABSORPTION COEFFICIENT RATIO (|Ug'/Ug|) AND PHASE
C DIFFERENCE BETWEEN Ug' AND Ug (IN RADIANS) OF THE
C ADJUSTED ABSORPTION PARAMETER
C
READ (NR,*) NRF
WRITE (NW,520) NRF
IF (NRF.EQ.0) GOTO 1500
DO I=1,NRF
READ (NR,*) (HKLSR(J,I),J=1,3),UGSR(I),UGSI(I),ABSPR(I),ABSPI(I)
WRITE (NW,540) (HKLSR(J,I),J=1,3),UGSR(I),UGSI(I),ABSPR(I),ABSPI(I)
END DO
C
C ABM THE MEAN ABSORPTION
C
1500 READ (NR,*) ABM
WRITE (NW,560) ABM
C
C OPTIONAL CONTROL PARAMETER:
C ABSCTL = 'NO' NO DEFAULT ABSORPTION. IF ZERO DEBYE-WALLER
C FACTOR IS ENTERED, TO AVOID ERROR, ENTER 'NO'
C LISCTL = 'YES' INTENSITY LISTING, DEFAULT NO
C
READ (NR,100) ABSCTL
IF (ABSCTL(1:2).EQ.' ') ABSCTL(1:2)='YE'
C
C * END OF INPUT *
C
VOL=1.0-CELL(4)*CELL(4)-CELL(5)*CELL(5)-CELL(6)*CELL(6)+
* 2.0*CELL(4)*CELL(5)*CELL(6)
VOL=SQRT(VOL)*CELL(1)*CELL(2)*CELL(3)
RATIO=(1+1.9569341E-03*KV)/(PI*VOL)
C
C GET U(000) AND K HERE
C
DO I=1,NTYPE
AF(I)=0.0
DO J=1,4
AF(I)=AF(I)+AX(J,I)*BX(J,I)
END DO
AF(I)=0.023933754*AF(I)
END DO
U0=0.0
DO I=1,NATOMS
J=ITYPE(I)
U0=U0+AF(J)
END DO
U0=U0*RATIO
WRITE (NW,580) U0
BIGK=SQRT(1.0/(WAVEL*WAVEL)+U0)
C
C GET U(G,H) MATRIX HERE
C
WRITE (NW,460)
DO I=2,NBEAMS+NPEAMS
L=I-1
IF (L.GT.NBEAMS) L=NBEAMS
DO J=1,L,1
DO K=1,3
GH(K)=HKL(K,I)-HKL(K,J)
END DO
S2=0.25*SUM(GMXR,GH,GH)
SATM=DSQRT(S2)
IF (S2.LT.DELTA) THEN
WRITE(NW,*) 'ERROR!, SAME REFLECTION IS ENTERED TWICE FOR',I,J
STOP
END IF
N=0
DO K=1,NRF
IF (GH(1).EQ.HKLSR(1,K).AND.GH(2).EQ.HKLSR(2,K).AND.
* GH(3).EQ.HKLSR(3,K)) THEN
SFRE=UGSR(K)*COS(UGSI(K))
SFIM=UGSR(K)*SIN(UGSI(K))
AFRE=ABSPR(K)*UGSR(K)*COS(ABSPI(I))
AFIM=ABSPR(K)*UGSR(K)*SIN(ABSPI(I))
GOTO 1700
END IF
IF (GH(1).EQ.-HKLSR(1,K).AND.GH(2).EQ.-HKLSR(2,K).AND.
* GH(3).EQ.-HKLSR(3,K)) THEN
SFRE=UGSR(K)*COS(UGSI(I))
SFIM=-UGSI(K)*SIN(UGSI(I))
AFRE=ABSPR(K)*UGSR(K)*COS(ABSPI(I))
AFIM=-ABSPR(K)*UGSR(K)*SIN(ABSPI(I))
GOTO 1700
END IF
END DO
DO K=1,NTYPE
AF(K)=CX(K)
DO M=1,4
AF(K)=AF(K)+AX(M,K)*EXP(-BX(M,K)*S2)
END DO
AF(K)=0.023933754*(ZT(K)-AF(K))/S2
END DO
SFRE=0.0
SFIM=0.0
AFRE=0.0
AFIM=0.0
DO M=1,NATOMS
TEMP=TWOPI*(GH(1)*XP(1,M)+GH(2)*XP(2,M)+GH(3)*XP(3,M))
CN=DCOS(TEMP)
SN=DSIN(TEMP)
TEMP=EXP(-DW(M)*S2)
SFRE=SFRE+CN*AF(ITYPE(M))*TEMP
SFIM=SFIM+SN*AF(ITYPE(M))*TEMP
IF (ABSCTL(1:2).EQ.'YE'.AND.I.LE.NBEAMS) THEN
C
C CALL ATOM SUBROUTINE FOR CALCULATION OF ABSORPTION POTENTIAL
C
ELNAME(1:2)=LABEL(ITYPE(M))(1:2)
MATM=DW(M)
CALL ATOM(ELNAME,MATM,SATM,KVATM,FEATM,FAATM,STATM)
IF (STATM.LT.0.0) THEN
WRITE (NW,600) LABEL(ITYPE(M)),GH
END IF
AFRE=AFRE+CN*FAATM*TEMP
AFIM=AFIM+SN*FAATM*TEMP
END IF
END DO
SFRE=SFRE*RATIO
SFIM=SFIM*RATIO
AFRE=AFRE*RATIO
AFIM=AFIM*RATIO
1700 UGHR(I,J)=SFRE-AFIM
UGHI(I,J)=SFIM+AFRE
UGHR(J,I)=SFRE+AFIM
UGHI(J,I)=-SFIM+AFRE
C
C STRUCTURE FACTOR LISTING HERE
C
IF (J.EQ.1) THEN
TEMP1=SFRE
TEMP2=SFIM
TEMP1=SQRT(TEMP1*TEMP1+TEMP2*TEMP2)
TEMP2=180.0*ASIN(TEMP2/TEMP1)/PI
IF (SFRE.LT.0) TEMP2=SIGN(180.0-ABS(TEMP2),TEMP2)
SFRE=TEMP1
SFIM=TEMP2
TEMP1=AFRE
TEMP2=AFIM
TEMP1=SQRT(TEMP1*TEMP1+TEMP2*TEMP2)
IF (TEMP1.GT.DELTA) THEN
TEMP2=180.0*ASIN(TEMP2/TEMP1)/PI
IF (AFRE.LT.0) TEMP2=SIGN(180.0-ABS(TEMP2),TEMP2)
ELSE
TEMP2=0.0
END IF
WRITE (NW,480) I,J,(IFIX(GH(M)),M=1,3),SFRE,SFIM,TEMP1,TEMP2
END IF
END DO
END DO
OPEN (UNIT=7,FILE='BLOCH.TMP',STATUS='NEW',FORM='UNFORMATTED')
DO J=1,NBEAMS
WRITE (7) (UGHR(I,J),UGHI(I,J),I=1,NBEAMS)
END DO
CLOSE (UNIT=7)
C
C SET UP BEAM DIRECTION HERE
C
IF (NX.GT.1) THEN
DO I=1,3
TILTX(I)=(TILT0(2,I)-TILT0(1,I))/FLOAT(NX-1)
END DO
END IF
IF (NY.GT.1) THEN
DO I=1,3
TILTY(I)=(TILT0(3,I)-TILT0(1,I))/FLOAT(NY-1)
END DO
END IF
I1=0
DO J=1,NY
DO I=1,NX
I1=I1+1
NET(1,I1)=I-1
NET(2,I1)=J-1
END DO
END DO
NTILT=I1
C
C DO LOOP FOR CBED
C
DO I1=1,NTILT
DO I=1,3
TILT(I)=NET(1,I1)*TILTX(I)+NET(2,I1)*TILTY(I)+TILT0(1,I)
END DO
IF (I1.GT.1) THEN
OPEN (UNIT=7,FILE='BLOCH.TMP',FORM='UNFORMATTED',STATUS='OLD')
DO J=1,NBEAMS
READ (7) (UGHR(I,J),UGHI(I,J),I=1,NBEAMS)
END DO
CLOSE (UNIT=7)
END IF
UGHR(1,1)=0.0
UGHI(1,1)=ABM*U0
C
C EXCITATION ERROR
C
TEMP1=SUM(GMXR,TILT,TILT)
BIGKZ=SQRT(BIGK*BIGK-TEMP1)
DO I=2,NBEAMS+NPEAMS
DO J=1,3
GG(J)=HKL(J,I)
GH(J)=2.0*TILT(J)+GG(J)
END DO
SG=SUM(GMXR,GH,GG)
SG=2.0*BIGKZ*(ZONE(1)*GG(1)+ZONE(2)*GG(2)+ZONE(3)*GG(3))-SG
UGHR(I,I)=SG
UGHI(I,I)=ABM*U0
END DO
C
C CALCULATES THE BETHE PERTURBATION POTENTIAL
C
DO I=1,NBEAMS
DO J=1,I-1,1
TEMP1=0.0
TEMP2=0.0
DO K=NBEAMS+1,NBEAMS+NPEAMS
TEMP1=TEMP1+(UGHR(I,K)*UGHR(K,J)-UGHI(I,K)*UGHI(K,J))/UGHR(K,K)
TEMP2=TEMP2+(UGHR(I,K)*UGHI(K,J)+UGHI(I,K)*UGHR(K,J))/UGHR(K,K)
END DO
UGHR(I,J)=UGHR(I,J)-TEMP1
UGHI(I,J)=UGHI(I,J)-TEMP2
UGHR(J,I)=UGHR(J,I)-TEMP1
UGHI(J,I)=UGHI(J,I)+TEMP2
END DO
END DO
DO I=1,NBEAMS
TEMP1=0.0
DO K=NBEAMS+1,NBEAMS+NPEAMS
TEMP1=TEMP1+(UGHR(I,K)**2+UGHI(I,K)**2)/UGHR(K,K)
END DO
UGHR(I,I)=UGHR(I,I)-TEMP1
END DO
CALL EISPACK(NM,NBEAMS,UGHR,UGHI,VR,VI,CCR,CCI,IERR)
IF (IERR.NE.0) THEN
WRITE (NW,*) 'EISPACK FAILS'
STOP
END IF
C
C OBTAIN THE FIRST COLUMN OF C-INVERSE MATRIX
C
DO J=1,NBEAMS
DO I=1,NBEAMS
CVT(I,J)=CMPLX(CCR(I,J),CCI(I,J))
END DO
END DO
CALL INVERSE(NM,NBEAMS,CVT,CINV,IERR)
IF (IERR.EQ.0) THEN
WRITE (NW,*) 'INVERSE FAILS'
STOP
END IF
C
C CALCULATE THE BEAM INTENSITY AND OUTPUT
C
DO I=1,NDEPTH
DO M=1,NOUT
J=ID(M)
SFRE=0.0
SFIM=0.0
DO K=1,NBEAMS
C1=CMPLX(CCR(J,K),CCI(J,K))
C BIGKZ SHOULD BE NEGATIVE (ALONG NEGATIVE SURFACE NORMAL)
TEMP=-PI*VR(K)*DEPTH(I)/BIGKZ
CN1=DCOS(TEMP)
SN1=DSIN(TEMP)
C2=CMPLX(CN1,SN1)
TEMP1=PI*VI(K)*DEPTH(I)/BIGKZ
DECAY=EXP(-TEMP1)
C1=C1*C2*CINV(K)*DECAY
SFRE=SFRE+REAL(C1)
SFIM=SFIM+AIMAG(C1)
END DO
IPOS=(I1-1)*NDEPTH*NOUT+(I-1)*NOUT+M
BINT(IPOS)=SFRE*SFRE+SFIM*SFIM
END DO
END DO
END DO
C
C OUPUT INTENSITY
C
NP=NTILT*NDEPTH*NOUT+4
BINT(NP-3)=NOUT
BINT(NP-2)=NDEPTH
BINT(NP-1)=NX
BINT(NP)=NY
WRITE (IW) NP,(BINT(J),J=1,NP)
END
SUBROUTINE INVERSE(NM,N,A,B,IERR)
C
C TO CALCULATE THE FIRST ROW OF C-INVERSE BY GAUSSIAN ELIMINATION
C AND BACK SUBSTITUTION
C BY J.M. ZUO OCT. 1987
C
COMPLEX A(NM,N),T,ZERO,B(N)
INTEGER IPVT(100),KP1,JPVT,IERR,NM1
IERR=100
ZERO=CMPLX(0.0,0.0)
IF (N.EQ.1) GOTO 35
AMX=0.0
C
C PIVOTING FOR THE FIRST ROW
C
DO 5 J=1,N
IF (CABS(A(1,J)).GT.AMX) THEN
AMX=CABS(A(1,J))
JPVT=J
ELSE
END IF
5 CONTINUE
DO 10 I=1,N
T=A(I,JPVT)
A(I,JPVT)=A(I,N)
A(I,N)=T
10 CONTINUE
C
C INTERCHANGE FIRT ROW AND LAST ROW
C
DO 12 I=1,N
T=A(1,I)
A(1,I)=A(N,I)
A(N,I)=T
12 CONTINUE
C
C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
C
NM1=N-1
DO 35 K=1,NM1
KP1=K+1
M=K
IF (KP1.EQ.NM1.OR.K.EQ.NM1) THEN
DO 15 I=KP1,NM1
IF(CABS(A(I,K)).GT.CABS(A(M,K))) M=I
15 CONTINUE
ENDIF
IPVT(K)=M
T=A(M,K)
A(M,K)=A(K,K)
A(K,K)=T
IF (CABS(T).LE.1.0E-07) GOTO 35
DO 20 I=KP1,N
A(I,K)=-A(I,K)/T
20 CONTINUE
DO 30 J=KP1,N
T=A(M,J)
A(M,J)=A(K,J)
A(K,J)=T
IF (T.EQ.ZERO) GOTO 30
DO 25 I=KP1,N
A(I,J)=A(I,J)+A(I,K)*T
25 CONTINUE
30 CONTINUE
35 CONTINUE
IF (CABS(A(N,N)).LE.1.0E-07) IERR=0
C
C BACK SUBSTITUTION TO GET X
C
B(N)=1.0/A(N,N)
DO 50 KB=2,N
K=N-KB+1
KP1=K+1
B(K)=ZERO
DO 40 J=KP1,N
40 B(K)=B(K)-A(K,J)*B(J)
B(K)=B(K)/A(K,K)
50 CONTINUE
T=B(JPVT)
B(JPVT)=B(N)
B(N)=T
RETURN
END
SUBROUTINE EISPACK(NM,N,AR,AI,WR,WI,VR,VI,IERR)
C
C EIGENVALUES AND EIGENVECTORS OF A COMPLEX GENERAL MATRIX
C CALLING EISPACK SUBROUTINE (B. T. SMITH, LECTURE NOTES IN COMPUTER
C SCIENCE, VOL 6, SPRINGER-VERLAG 1976)
C SUBROUTINES CBAL, CORTH, COMQR2, CBABK2 AND RELATED SUBROUTINES
C ARE COPIED FROM [email protected]
C
C NM ROW DIMENSION OF THW TWO-DIMENSIONAL MATRIX, MAXIMUM SET AT 300
C N ORDER OF THE MATRIX
C AR,AI REAL AND IMAGINARY PART OF THE MATRIX TO BE DIAGONALIZED
C AR,AI DESTROYED AFTER THE CALL
C WR,WI RETURNED REAL AND IMAGINARY PART OF THE EIGENVALUES
C VR,VI RETURNED REAL AND IMAGINARY PART OF THE EIGENVECTOR MATRIX
C IERR ERROR FLAG, 0 SUCCESS, I HAS PROBLEM WITH ITH EIGENVALUES
C
INTEGER NM,N,IS1,IS2
REAL AR(NM,N),AI(NM,N),WR(N),WI(N),VR(NM,N),VI(NM,N),FV1(300)
REAL FV2(300),FV3(300)
C
CALL CBAL(NM,N,AR,AI,IS1,IS2,FV1)
CALL CORTH(NM,N,IS1,IS2,AR,AI,FV2,FV3)
CALL COMQR2(NM,N,IS1,IS2,FV2,FV3,AR,AI,WR,WI,VR,VI,IERR)
IF (IERR.NE.0) RETURN
CALL CBABK2(NM,N,IS1,IS2,FV1,N,VR,VI)
RETURN
END
c
c example input data
c
A TEST DATA
200.0
0 1 2
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
1 1
6.08112 6.08112 6.08112 90.0 90.0 90.0
8 2
ZN
0 14.0743 3.2655 7.0318 0.2333 5.1652 10.3163 2.4100 58.7097 1.3041
TE
0 19.9644 4.81742 19.0138 0.420885 6.14487 28.5284 2.5239 70.8403 4.3520
1 0.0 0.0 0.0 0.0
1 0.0 0.50 0.50 0.0
1 0.50 0.0 0.50 0.0
1 0.50 0.50 0.0 0.0
2 0.25 0.25 0.25 0.0
2 0.25 0.75 0.75 0.0
2 0.75 0.25 0.75 0.0
2 0.75 0.75 0.25 0.0
AUTO
2 0 0
0 4 -2
1 -1 1
1 8.0
23
AUTO
500 2.15
4
0 0 0, 2 0 0, -2 0 0, 0 4 -2
0
0.0
NO