SUBROUTINE DRAW_TOWER_SYMMETRY(SET_NUMBER, SET_TYPE, & DRAW_SYMMETRY_VALUE, DRAW_SYMMETRY_OUT) C---------------------------------------------------------------------- C- C- Purpose and Methods : Find symmetry in a set of values and call a routine C- to print a description of this symmetry. C- C- Inputs : SET_NUMBER C- SET_TYPE Description of subrange within array. C- Interpretation dependent on array being C- searched. C- DRAW_SYMMETRY_VALUE The routine returning the values given C- coordinates. C- DRAW_SYMMETRY_OUT The routine which actually writes the C- information. C- Outputs : Screen output C- Controls: none C- C- Created 2-SEP-1992 Philippe Laurens, Steven Klocek C- Updated 3-SEP-1993 Philippe Laurens - MSU L1 Trigger C- add Large Tile (in fact update new argument C- in DRAW_REF_SYMMETRY_OUT.FOR), and change variable names C- em,hd_value to value_1,2 C- C---------------------------------------------------------------------- IMPLICIT NONE C INCLUDE 'LV1_MPOOL.PARAMS' C INTEGER SET_NUMBER, SET_TYPE EXTERNAL DRAW_SYMMETRY_VALUE, DRAW_SYMMETRY_OUT C LOGICAL SYMMETRIC_SIGN INTEGER SIGN, ETA, PHI INTEGER VALUE1A, VALUE1B, VALUE2A, VALUE2B INTEGER ETA_BEGIN, ETA_END INTEGER PHI_BEGIN, PHI_END INTEGER SIGN_BEGIN, SIGN_END INTEGER VALUE_1, VALUE_2 C C C Check for symmetry over SIGN_ETA C SYMMETRIC_SIGN = .TRUE. DO PHI = RS_PHI_MIN, RS_PHI_MAX DO ETA = RS_ETA_MIN, RS_ETA_MAX CALL DRAW_SYMMETRY_VALUE(RS_SIGN_PLUS, ETA, PHI, & SET_NUMBER, SET_TYPE, VALUE1A, VALUE2A) CALL DRAW_SYMMETRY_VALUE(RS_SIGN_MINUS, ETA, PHI, & SET_NUMBER, SET_TYPE, VALUE1B, VALUE2B) IF ((VALUE1A .NE. VALUE1B) .OR. (VALUE2A .NE. VALUE2B)) THEN SYMMETRIC_SIGN = .FALSE. GOTO 100 ENDIF END DO END DO 100 CONTINUE C C Will later change SIGN to minus and repeat following block, if there is C no symmetry over sign_eta C SIGN = RS_SIGN_PLUS C C Check the symmetry over ETA C DO WHILE (.TRUE.) C ETA_BEGIN = RS_ETA_MIN C DO WHILE (.TRUE.) DO ETA_END = ETA_BEGIN, RS_ETA_MAX -1 DO PHI = RS_PHI_MIN, RS_PHI_MAX CALL DRAW_SYMMETRY_VALUE(SIGN, ETA_END, PHI, & SET_NUMBER, SET_TYPE, VALUE1A, VALUE2A) CALL DRAW_SYMMETRY_VALUE(SIGN, ETA_END+1, PHI, & SET_NUMBER, SET_TYPE, VALUE1B, VALUE2B) IF ((VALUE1A .NE. VALUE1B) .OR. (VALUE2A .NE. VALUE2B)) & GOTO 200 END DO END DO C C We now have a symmetric range ETA_BEGIN to ETA_END C 200 CONTINUE C PHI_BEGIN = RS_PHI_MIN C DO WHILE (.TRUE.) DO PHI_END = PHI_BEGIN, RS_PHI_MAX-1 CALL DRAW_SYMMETRY_VALUE(SIGN, ETA_END, PHI_END, & SET_NUMBER, SET_TYPE, VALUE1A, VALUE2A) CALL DRAW_SYMMETRY_VALUE(SIGN, ETA_END, PHI_END+1, & SET_NUMBER, SET_TYPE, VALUE1B, VALUE2B) IF ((VALUE1A .NE. VALUE1B) .OR. (VALUE2A .NE. VALUE2B)) & GOTO 300 END DO C C Now have a range of phi from PHI_BEGIN to PHI_END C 300 CONTINUE IF (SYMMETRIC_SIGN .EQV. .TRUE.) THEN SIGN_BEGIN = RS_SIGN_PLUS SIGN_END = RS_SIGN_MINUS ELSE SIGN_BEGIN = SIGN SIGN_END = SIGN ENDIF C CALL DRAW_SYMMETRY_VALUE(SIGN_BEGIN, ETA_BEGIN, & PHI_BEGIN, SET_NUMBER, SET_TYPE, VALUE_1, VALUE_2) CALL DRAW_SYMMETRY_OUT(SIGN_BEGIN, SIGN_END, & ETA_BEGIN, ETA_END, & PHI_BEGIN, PHI_END, & SET_TYPE, & VALUE_1, VALUE_2) C C Advance the PHI range and check for more symmetries C IF (PHI_END .GE. RS_PHI_MAX) GOTO 400 PHI_BEGIN = PHI_END+1 END DO C C Advance the ETA range C 400 CONTINUE IF (ETA_END .LT. RS_ETA_MAX) THEN ETA_BEGIN = ETA_END + 1 ELSE GOTO 450 ENDIF END DO 450 CONTINUE IF ((SYMMETRIC_SIGN .EQV. .TRUE.) .OR. (SIGN .EQ. & RS_SIGN_MINUS)) THEN GOTO 500 ELSE SIGN = RS_SIGN_MINUS ENDIF END DO C 500 CONTINUE C---------------------------------------------------------------------- 999 RETURN END