Files
sics/difrac/inchkl.f
2000-02-07 10:38:55 +00:00

82 lines
3.0 KiB
Fortran

C-----------------------------------------------------------------------
C Subroutine to increment the indices with the DH segment scheme.
C Incrementing is done up one row of h2 and down the next row of h2,
C on each level of h1.
C IUPDWN = 1 at the start of each level of h1
C ISEG = 0 if the next refln is OK, = 1 if the end of segment.
C-----------------------------------------------------------------------
SUBROUTINE INCHKL
INCLUDE 'COMDIF'
INTEGER IHSAVE,IKSAVE,ILSAVE
ISEG = 0
IH = IH + NDH(1,3)*IUPDWN
IK = IK + NDH(2,3)*IUPDWN
IL = IL + NDH(3,3)*IUPDWN
IX = IABS(IH)
IY = IABS(IK)
IZ = IABS(IL)
C-----------------------------------------------------------------------
C IUPDWN = 1 Increment h3 up towards IHMAX,IKMAX,ILMAX
C-----------------------------------------------------------------------
IF (IUPDWN .GT. 0) THEN
IF (IX.LT.IHMAX .AND. IY.LT.IKMAX .AND. IZ.LT.ILMAX) RETURN
C-----------------------------------------------------------------------
C H3 going up has run out. Prepare for going down
C-----------------------------------------------------------------------
IHSAVE = IH + NDH(1,2)
IKSAVE = IK + NDH(2,2)
ILSAVE = IL + NDH(3,2)
ELSE
C-----------------------------------------------------------------------
C IUPDWN = -1 Increment h3 down towards FSTHKL(I,2)
C-----------------------------------------------------------------------
IF (ISTOP .NE. 1) THEN
ISTOP = 0
IF (IH .NE. IFSHKL(1,2) .OR. IK .NE. IFSHKL(2,2) .OR.
$ IL .NE. IFSHKL(3,2)) RETURN
ISTOP = 1
RETURN
ENDIF
ISTOP = 0
C-----------------------------------------------------------------------
C H3 going down has run out. Prepare for going up.
C-----------------------------------------------------------------------
IHSAVE = IFSHKL(1,2) + NDH(1,2)
IKSAVE = IFSHKL(2,2) + NDH(2,2)
ILSAVE = IFSHKL(3,2) + NDH(3,2)
ENDIF
IUPDWN = -IUPDWN
DO 100 I = 1,3
IFSHKL(I,2) = IFSHKL(I,2) + NDH(I,2)
IFSHKL(I,3) = IFSHKL(I,2)
100 CONTINUE
IX = IABS(IFSHKL(1,3))
IY = IABS(IFSHKL(2,3))
IZ = IABS(IFSHKL(3,3))
C-----------------------------------------------------------------------
C Start of new level of h1. Set IUPDWN = 1
C-----------------------------------------------------------------------
IF (IX .GE. IHMAX .OR. IY .GE. IKMAX .OR. IZ .GE. ILMAX) THEN
IUPDWN = 1
DO 120 I = 1,3
IFSHKL(I,1) = IFSHKL(I,1) + NDH(I,1)
IFSHKL(I,2) = IFSHKL(I,1)
IFSHKL(I,3) = IFSHKL(I,2)
120 CONTINUE
IHSAVE = IFSHKL(1,3)
IKSAVE = IFSHKL(2,3)
ILSAVE = IFSHKL(3,3)
IX = IABS(IHSAVE)
IY = IABS(IKSAVE)
IZ = IABS(ILSAVE)
IF (IX .GE. IHMAX .OR. IY .GE. IKMAX .OR. IZ .GE. ILMAX) THEN
ISEG = 1
RETURN
ENDIF
ENDIF
IH = IHSAVE
IK = IKSAVE
IL = ILSAVE
RETURN
END