This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / ggdspe.F
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 GGDSPE (JVO, NPAR, PAR, NL, NDIV, ORIG, STEP)
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *    SUBR. GGDSPE (JVO,NPAR,PAR,NL*,NDIV*,ORIG*,STEP*)           *
17 C.    *                                                                *
18 C.    *   Computes the actual division parameters of the mother volume *
19 C.    *    at address JVO with actual parameters in NPAR, PAR          *
20 C.    *   Returns the division parameters NDIV, ORIG, STEP and the     *
21 C.    *    number of different division cells NL                       *
22 C.    *                                                                *
23 C.    *   Called by : GGDVLP                                           *
24 C.    *   Author    : S.Banerjee                                       *
25 C.    *               (Original algorithms of A.McPherson)             *
26 C.    *                                                                *
27 C.    ******************************************************************
28 C.
29 #include "geant321/gcbank.inc"
30 #include "geant321/gcflag.inc"
31 #include "geant321/gcunit.inc"
32 C.
33       PARAMETER (NPAMAX=50)
34 C.
35       DIMENSION PAR(*)
36 C.
37       REAL      PARM(NPAMAX)
38       INTEGER   IDTYP(12)
39       SAVE IDTYP
40       DATA      IDTYP / 1, 1, 1, 1, 2, 2, 3, 3, 4, 1, 6, 6/
41 C.
42 C.    ------------------------------------------------------------------
43 *
44 * *** Get the division parameters from JVOLUM structure and check if
45 *         these have to be developed
46 *
47       JIN   = LQ(JVO-1)
48       IAXIS = Q(JIN+1)
49       NDIV  = Q(JIN+3)
50       ORIG  = Q(JIN+4)
51       STEP  = Q(JIN+5)
52 *
53       ISHM  = Q(JVO+2)
54       IDTY  = IDTYP(ISHM)
55       NPARM = Q(JVO+5)
56       IF (NPARM.GT.0) THEN
57          CALL UCOPY (Q(JVO+7), PARM, NPARM)
58       ELSE
59          NPARM = NPAR
60          CALL VFILL (PARM, NPARM, -1.0)
61       ENDIF
62 *
63 * *** Find the actual division parameters
64 *
65       IF (IDTY.EQ.1) THEN
66 *
67 * BOX, TRD1, TRD2, TRAP, PARA
68 *
69          IF (ISHM.EQ.4) THEN
70             IPAR = 1
71          ELSE IF (ISHM.EQ.10) THEN
72             IPAR = IAXIS
73          ELSE
74             IPAR = IAXIS + ISHM - 1
75          ENDIF
76          IF (PARM(IPAR).LT.0.0) ORIG = -PAR(IPAR)
77          IF (STEP.LE.0.0) THEN
78             STEP = (PAR(IPAR) - ORIG) / NDIV
79          ELSE IF (NDIV.LE.0) THEN
80             NDIV = (PAR(IPAR) - ORIG + 0.001) / STEP
81          ENDIF
82          IF (PARM(IPAR).LT.0.0) ORIG = -0.5 * STEP * NDIV
83          IF (ISHM.EQ.1.OR.ISHM.EQ.10.OR.(ISHM.EQ.2.AND.IAXIS.EQ.2)) THEN
84             NL = 1
85          ELSE
86             NL = NDIV
87          ENDIF
88 *
89       ELSE IF (IDTY.EQ.4) THEN
90 *
91 * SPHE
92 *
93          IF (IAXIS.EQ.1.OR.IAXIS.EQ.2) THEN
94             IAX1 = 2*IAXIS - 1
95             IAX2 = IAX1 + 1
96             IF (PARM(IAX1).LT.0.0) ORIG = PAR(IAX1)
97             IF (STEP.LE.0.0) THEN
98                STEP = (PAR(IAX2) - ORIG) / NDIV
99             ELSE IF (NDIV.LE.0) THEN
100                NDIV = (PAR(IAX2) - ORIG + 0.001) / STEP
101             ENDIF
102             IF (PARM(IAX1).LT.0.0) ORIG = 0.5*(ORIG+PAR(IAX2)-STEP*NDIV)
103             NL = NDIV
104          ELSE
105             IF (STEP.LE.0.0.OR.NDIV.LE.0) THEN
106                DP = PAR(6) - PAR(5)
107                IF (DP.LT.0.0) DP = DP + 360.0
108                IF (ORIG.LT.PAR(5)) ORIG = ORIG + 360.0
109                IF (ORIG-PAR(5).GT.DP) THEN
110                   PMIN = PAR(5)
111                   GO TO 910
112                ENDIF
113                DP = PAR(6) - ORIG
114                IF (DP.LT.0.0) DP = DP + 360.0
115                IF (NDIV.LE.0) THEN
116                   NDIV = (DP + 0.001) /STEP
117                   IF (NDIV.LE.0) GO TO 920
118                ELSE
119                   STEP = DP / NDIV
120                ENDIF
121             ENDIF
122             NL = 1
123          ENDIF
124 *
125       ELSE IF (IDTY.EQ.2.OR.IDTY.EQ.3.OR.IDTY.EQ.6) THEN
126 *
127 * TUBE, TUBS, CONE, CONS, PGON, PCON
128 *
129          IF (IAXIS.EQ.3) THEN
130             IF (IDTY.NE.6) THEN
131                IF (IDTY.EQ.2) THEN
132                   IPAR = 3
133                ELSE
134                   IPAR = 1
135                ENDIF
136                IF (PARM(IPAR).LT.0.0) ORIG = -PAR(IPAR)
137                IF (STEP.LE.0.0) THEN
138                   STEP = (PAR(IPAR) - ORIG) / NDIV
139                ELSE IF (NDIV.LE.0) THEN
140                   NDIV = (PAR(IPAR) - ORIG + 0.001) / STEP
141                ENDIF
142                IF (PARM(IPAR).LT.0.0) ORIG = -0.5 * STEP * NDIV
143                IF (IDTY.EQ.2) THEN
144                   NL = 1
145                ELSE
146                   NL = NDIV
147                ENDIF
148             ELSE
149                IF (ISHM.EQ.11) THEN
150                   NZ = PAR(4)
151                ELSE
152                   NZ = PAR(3)
153                ENDIF
154                IF (NDIV.LE.0.OR.STEP.LE.0.0.OR.NZ.GT.0) GO TO 930
155                NL = NDIV
156             ENDIF
157 *
158          ELSE IF (IAXIS.EQ.2) THEN
159             IF (STEP.LE.0.0.OR.NDIV.LE.0) THEN
160                IF (ISHM.EQ.5.OR.ISHM.EQ.7) THEN
161                   PMIN = ORIG
162                   PMAX = ORIG + 360.0
163                   DP   = 360.0
164                ELSE IF (ISHM.EQ.6.OR.ISHM.EQ.8) THEN
165                   PMIN = PAR(NPAR-1)
166                   PMAX = PAR(NPAR)
167                   DP   = PMAX - PMIN
168                ELSE
169                   PMIN = PAR(1)
170                   DP   = PAR(2)
171                   PMAX = PMIN + DP
172                ENDIF
173                IF (DP.LT.0.0) DP = DP + 360.0
174                IF (ORIG.LT.PMIN) ORIG = ORIG + 360.0
175                IF (ORIG-PMIN.GT.DP) GO TO 910
176                DP = PMAX - ORIG
177                IF (DP.LT.0.0) DP = DP + 360.0
178                IF (NDIV.LE.0) THEN
179                   NDIV = (DP + 0.001) / STEP
180                   IF (NDIV.LE.0) GO TO 920
181                ELSE
182                   STEP = DP / NDIV
183                ENDIF
184             ENDIF
185             NL = 1
186 *
187          ELSE
188             IF (IDTY.NE.6) THEN
189                IF (IDTY.EQ.2) THEN
190                   IAX1 = 1
191                   IAX2 = 2
192                ELSE
193                   IAX1 = 2
194                   IAX2 = 3
195                ENDIF
196                IF (PARM(IAX1).LT.0.0) ORIG = PAR(IAX1)
197                IF (STEP.LE.0.0) THEN
198                   STEP = (PAR(IAX2) - ORIG) / NDIV
199                ELSE IF (NDIV.LE.0) THEN
200                   NDIV = (PAR(IAX2) - ORIG + 0.001) / STEP
201                ENDIF
202                IF (PARM(IAX1).LT.0.0)
203      +            ORIG = ORIG + 0.5 * (PAR(IAX2)-ORIG-STEP*NDIV)
204                NL = NDIV
205             ELSE
206                IF (STEP.LE.0.0.OR.NDIV.LE.0) THEN
207                   IF (ISHM.EQ.11) THEN
208                      NZ = PAR(4)
209                   ELSE
210                      NZ = PAR(3)
211                   ENDIF
212                   GO TO 930
213                ENDIF
214                NL = NDIV
215             ENDIF
216          ENDIF
217 *
218       ELSE
219          GO TO 900
220       ENDIF
221       GO TO 999
222 *
223   900 WRITE (CHMAIL, 1001) ISHM, IAXIS
224       GO TO 990
225 *
226   910 WRITE (CHMAIL, 1002) ISHM, IAXIS, PMIN, DP, ORIG
227       GO TO 990
228 *
229   920 WRITE (CHMAIL, 1003) ISHM, IAXIS, NDIV, DP, STEP
230       GO TO 990
231 *
232   930 WRITE (CHMAIL, 1004) ISHM, IAXIS, NDIV, NZ, STEP
233 *
234   990 CALL GMAIL (0, 0)
235       IEORUN = 1
236 *
237  1001 FORMAT (' GGDSPE : Invalid call ISHM,IAXIS=',2I5)
238  1002 FORMAT (' GGDSPE : Error ISHM,IAXIS,PMIN,DP,ORIG=',2I5,3G12.4)
239  1003 FORMAT (' GGDSPE : Error ISHM,IAXIS,NDIV,DP,STEP=',3I5,2G12.4)
240  1004 FORMAT (' GGDSPE : Error ISHM,IAXIS,NDIV,NZ,STEP=',4I5,G12.4)
241 *                                                             END GGDSPE
242   999 END