1 *
2 * \$Id\$
3 *
4 * \$Log\$
5 * Revision 1.1.1.1  1995/10/24 10:20:49  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.28  by  S.Giani
11 *-- Author :
12       SUBROUTINE GGNLEV
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *    SUBR. GGNLEV                                                *
17 C.    *                                                                *
18 C.    *   Scans the JVOLUM structure to find the maximum Number of     *
19 C.    *   LEVels and maximum number of volumes in each level.top       *
20 C.    *   Stores corresponding information in bank next to JVOLUM      *
21 C.    *   mother bank.                                                 *
22 C.    *                                                                *
23 C.    *   Called by : GGCLOS                                           *
24 C.    *   Author    : S.Banerjee                                       *
25 C.    *                                                                *
26 C.    ******************************************************************
27 C.
28 #include "geant321/gcbank.inc"
29       PARAMETER (NLVMAX=15)
31       INTEGER NDVLP(NLVMAX), MAXVO(NLVMAX)
32 C.
33 C.    ------------------------------------------------------------------
34 *
35       CALL VZERO (MAXVO, NLVMAX)
36       NLEV = 1
37       NLVT = NLEV
38       LJVOM(NLEV) = LQ(JVOLUM-1)
40       MAXVO(NLEV) = 1
41 *
42 * *** Loop over volumes going down the tree
43 *
44    10 IF (NLEV.GT.NLVT) NLVT = NLEV
45 *
46 *  ** Check if current volume is a source of local development
47 *
48       IF (LQ(LJVOM(NLEV)).GT.0) THEN
49          NDVLP(NLEV) = NLEV
50       ELSE IF (NLEV.GT.1) THEN
51          NDVLP(NLEV) = NDVLP(NLEV-1)
52       ELSE
53          NDVLP(NLEV) = NLVMAX
54       ENDIF
55       NIN = Q(LJVOM(NLEV)+3)
56       IF (NIN.GT.0) THEN
57 *
58 *   *    Current volume has contents defined by position
59 *
61          IF (NIN.GT.MAXVO(NLEV+1)) MAXVO(NLEV+1) = NIN
62          IF (NLINK(NLEV).EQ.0) GO TO 30
64          NLINK(NLEV) = IN - 1
65          JIN  = LQ(LJVOM(NLEV)-IN)
66          IVOT = Q(JIN+2)
67          NLEV = NLEV + 1
68          LJVOM(NLEV) = LQ(JVOLUM-IVOT)
70          GO TO 10
71 *
72       ELSE IF (NIN.LT.0) THEN
73 *
74 *   *    Current volume is divided
75 *
76          JDIV = LQ(LJVOM(NLEV)-1)
77          IVOT = Q(JDIV+2)
78          IF (NLEV.GT.NDVLP(NLEV)) THEN
79             JPAR = LQ(LJVOM(NDVLP(NLEV)))
80             DO 15 ILEV = NDVLP(NLEV), NLEV-1
81                IF (IQ(JPAR+1).EQ.0) THEN
83                   IF (JPAR.EQ.0) GO TO 20
84                ELSE
85                   JPAR = LQ(JPAR-1)
86                ENDIF
87                IF (ILEV.EQ.NLEV-1) THEN
88                   NDIV = IQ(JPAR+1)
89                   GO TO 25
90                ENDIF
91    15       CONTINUE
92          ENDIF
93    20    NDIV = Q(JDIV+3)
94          IF (NDIV.LT.0) NDIV = -NDIV
96          IF (NDIV.GT.MAXVO(NLEV+1)) MAXVO(NLEV+1) = NDIV
97          NLEV = NLEV + 1
98          LJVOM(NLEV) = LQ(JVOLUM-IVOT)
100          GO TO 10
101       ENDIF
102 *
103 *  ** No more content in this volume
104 *   * Go up the tree
105 *
106    30 NLEV = NLEV - 1
107       IF (NLEV.GT.0) THEN
108          IF (NLINK(NLEV).EQ.0) GO TO 30
110          NLINK(NLEV) = IN - 1
111          JIN  = LQ(LJVOM(NLEV)-IN)
112          IVOT = Q(JIN+2)
113          NLEV = NLEV + 1
114          LJVOM(NLEV) = LQ(JVOLUM-IVOT)
116          GO TO 10
117       ENDIF
118 *
119 * *** Scan is complete; now store the information in next-of-same-type
120 *  ** link of JVOLUM
121 *
122       JVOLX = LQ(JVOLUM)
123       IF (JVOLX.GT.0) CALL MZDROP (IXCONS, JVOLX, ' ')
124       CALL MZBOOK (IXCONS, JVOLX, JVOLUM, 0, 'NLEV', 0, 0, NLVT, 2, 0)
125       CALL UCOPY (MAXVO, IQ(JVOLX+1), NLVT)
126 #if defined(CERNLIB_DEBUGG)
127       IF (IDEBUG.NE.0) THEN
128          WRITE (CHMAIL, 2001) NLVT
129          CALL GMAIL (1, 0)
130          IF (NLVT.GT.0) THEN
131             WRITE (CHMAIL, 2002) (MAXVO(I), I = 1, NLVT)
132             CALL GMAIL (0, 0)
133          ENDIF
134       ENDIF
135  2001 FORMAT (' GGNLEV : Maximum number of levels = ',I4,
136      +        ' -- maximum number of volumes in each level')
137  2002 FORMAT (5X,20I6)
138 #endif
139 *                                                             END GGNLEV
140       END