5 * Revision 1.1.1.1 1995/10/24 10:20:50 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.28 by S.Giani
12 SUBROUTINE GGPERP (X,U,IERR)
14 C. ****************************************************************
16 C. * This routine solves the general problem of calculating the *
17 C. * unit vector normal to the surface of the current volume at *
18 C. * the point X. The result is returned in the array U. X is *
19 C. * assumed to be on or near a boundary of the current volume. *
20 C. * The current volume is indicated by the common /GCVOLU/. *
21 C. * U points from inside to outside in that neighbourhood. *
22 C. * If X is equidistant to more than one boundary (in a corner) *
23 C. * an arbitrary choice is made based upon the order of *
24 C. * precedence implied by the IF statements below. If the *
25 C. * routine fails to find the unit normal, it returns with *
26 C. * IERR=1, otherwise IERR=0. *
28 C. * Called by : GSURFP, GDSTEP *
29 C. * Authors : F.Carminati, R.Jones, F.Ohlsson-Malek *
31 C. ****************************************************************
32 #include "geant321/gcvolu.inc"
33 #include "geant321/gconsp.inc"
34 #include "geant321/gcbank.inc"
35 #include "geant321/gcshno.inc"
36 #include "geant321/gctmed.inc"
37 #include "geant321/gcunit.inc"
38 DIMENSION X(3),U(3),XL(3),UL(3),DXL(3),PAR(50),SPAR(50),ATT(20)
40 #if !defined(CERNLIB_SINGLE)
41 DOUBLE PRECISION PERP,PMIN0
42 DOUBLE PRECISION PAR,DXL,RHO,R,RINV,PHI,THE
43 DOUBLE PRECISION PHI1,PHI2,THE1,THE2,XWID
44 DOUBLE PRECISION GUARD,DPHI,PHI0,SPHI0,CPHI0
45 DOUBLE PRECISION FACT,CALPH,SALPH,TALPH
46 DOUBLE PRECISION RAT,RATL,RATH,H,BL,TL,DX,DY,DZ,DU
47 DOUBLE PRECISION UU0,VV0,UU,W1,W2,W3,W4
48 DOUBLE PRECISION SEW1,SEW2,SEW3,SEW4
49 DOUBLE PRECISION TAN1,TAN2,TAN3,TAN4
50 DOUBLE PRECISION SEC1,SEC2,SEC3,SEC4
51 DOUBLE PRECISION U0,V0,U1,U1L,U2,U2L
52 DOUBLE PRECISION ONE,TWO
53 DOUBLE PRECISION DSECT,ZERO,FULL,FULL10,DBY2
56 PARAMETER (ONE=1,TWO=2)
57 PARAMETER (ZERO=0.,DBY2=0.5,FULL=360.,FULL10=3600.)
59 C. ------------------------------------------------------------------
63 * *** Transform current point into local reference system
69 * *** Fetch the parameters of the current volume
70 JVO = LQ(JVOLUM-LVOLUM(NLEVEL))
73 JVOM = LQ(JVOLUM-LVOLUM(NLEVEL-1))
78 IF (NLEVEL.LT.NLDEV(NLEVEL)) THEN
81 * (case with structure JVOLUM locally developed)
82 JPAR = LQ(LQ(JVOLUM-LVOLUM(NLDEV(NLEVEL))))
83 IF (NLEVEL.EQ.NLDEV(NLEVEL)) GO TO 20
84 DO 10 ILEV = NLDEV(NLEVEL), NLEVEL-1
85 IF (IQ(JPAR+1).EQ.0) THEN
86 JPAR = LQ(JPAR-LINDEX(ILEV+1))
87 IF (JPAR.EQ.0) GO TO 20
88 ELSE IF (IQ(JPAR-3).GT.1) THEN
89 JPAR = LQ(JPAR-LINDEX(ILEV+1))
93 IF (ILEV.EQ.NLEVEL-1) THEN
96 CALL UCOPY (Q(JPAR+1), SPAR, NPAR)
106 CALL GFIPAR(JVO,JIN,IN,NPAR,NATT,SPAR,ATT)
112 * *** Case of the BOX:
113 IF (ISH.EQ.NSBOX) THEN
114 PERP(1) = ABS(ABS(DXL(1))-PAR(1))
115 PERP(2) = ABS(ABS(DXL(2))-PAR(2))
116 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
117 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
118 IF (PERP(1).EQ.PMIN0) THEN
119 UL(1) = SIGN(ONE,DXL(1))
122 ELSE IF (PERP(2).EQ.PMIN0) THEN
124 UL(2) = SIGN(ONE,DXL(2))
126 ELSE IF (PERP(3).EQ.PMIN0) THEN
129 UL(3) = SIGN(ONE,DXL(3))
134 * *** Case of the TUBE, TUBeSection:
135 ELSE IF (ISH.EQ.NSTUBE.OR.ISH.EQ.NSTUBS) THEN
136 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
137 PERP(1) = ABS(RHO-PAR(1))
138 PERP(2) = ABS(RHO-PAR(2))
139 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
140 IF (ISH.EQ.NSTUBE) THEN
141 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
143 PHI = ATAN2(DXL(2),DXL(1))
144 IF (PHI.LT.0.) PHI = PHI+TWOPI
145 PHI1 = MOD(PAR(4)+FULL10,FULL)*DEGRAD
146 PERP(4) = ABS(PHI-PHI1)
147 IF (PERP(4).GT.PI) PERP(4) = TWOPI-PERP(4)
148 PHI2 = MOD(PAR(5)+FULL10,FULL)*DEGRAD
149 PERP(5) = ABS(PHI-PHI2)
150 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
151 PERP(4) = PERP(4)*RHO
152 PERP(5) = PERP(5)*RHO
153 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
155 IF (PERP(1).EQ.PMIN0) THEN
159 ELSE IF (PERP(2).EQ.PMIN0) THEN
163 ELSE IF (PERP(3).EQ.PMIN0) THEN
166 UL(3) = SIGN(ONE,DXL(3))
167 ELSE IF (PERP(4).EQ.PMIN0) THEN
171 ELSE IF (PERP(5).EQ.PMIN0) THEN
179 * *** Case of the CONE, CONeSection:
180 ELSE IF (ISH.EQ.NSCONE.OR.ISH.EQ.NSCONS) THEN
181 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
182 TAN1 = (PAR(4)-PAR(2))/(TWO*PAR(1))
183 SEC1 = SQRT(ONE+TAN1**2)
185 U1L = PAR(4)-PAR(1)*TAN1
186 TAN2 = (PAR(5)-PAR(3))/(TWO*PAR(1))
187 SEC2 = SQRT(ONE+TAN2**2)
189 U2L = PAR(5)-PAR(1)*TAN2
190 PERP(1) = ABS(ABS(DXL(3))-PAR(1))
191 PERP(2) = ABS(U1-U1L)/SEC1
192 PERP(3) = ABS(U2-U2L)/SEC2
193 IF (ISH.EQ.NSCONE) THEN
194 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
196 PHI = ATAN2(DXL(2),DXL(1))
197 IF (PHI.LT.0.) PHI = PHI+TWOPI
198 PHI1 = MOD(PAR(6)+FULL10,FULL)*DEGRAD
199 PERP(4) = ABS(PHI-PHI1)
200 IF (PERP(4).GT.PI) PERP(4) = TWOPI-PERP(4)
201 PHI2 = MOD(PAR(7)+FULL10,FULL)*DEGRAD
202 PERP(5) = ABS(PHI-PHI2)
203 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
204 PERP(4) = PERP(4)*RHO
205 PERP(5) = PERP(5)*RHO
206 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
208 IF (PERP(1).EQ.PMIN0) THEN
211 UL(3) = SIGN(ONE,DXL(3))
212 ELSE IF (PERP(2).EQ.PMIN0) THEN
217 ELSE IF (PERP(3).EQ.PMIN0) THEN
222 ELSE IF (PERP(4).EQ.PMIN0) THEN
226 ELSE IF (PERP(5).EQ.PMIN0) THEN
234 * *** Case of the PolyCONe:
235 ELSE IF (ISH.EQ.NSPCON) THEN
236 PERP(1) = ABS(DXL(3)-PAR(4))
238 PERP(2) = ABS(DXL(3)-PAR(I))
239 IF (PERP(2).GT.PERP(1)) GOTO 401
245 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
246 DZ = PAR(I)-PAR(I-3)+1.e-10
247 TAN1 = (PAR(I+1)-PAR(I-2))/DZ
248 SEC1 = SQRT(ONE+TAN1**2)
250 U1L = PAR(I+1)-PAR(I)*TAN1
251 TAN2 = (PAR(I+2)-PAR(I-1))/DZ
252 SEC2 = SQRT(ONE+TAN2**2)
254 U2L = PAR(I+2)-PAR(I)*TAN2
255 GUARD = MAX(DXL(3)-PAR(I),ZERO)
256 PERP(3) = ABS(U1-U1L)/SEC1 + GUARD*SEC1
257 PERP(4) = ABS(U2-U2L)/SEC2 + GUARD*SEC2
262 IF (I.LT.NPAR-2) THEN
264 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
265 DZ = PAR(I+3)-PAR(I)+1.e-10
266 TAN3 = (PAR(I+4)-PAR(I+1))/DZ
267 SEC3 = SQRT(ONE+TAN3**2)
269 U1L = PAR(I+1)-PAR(I)*TAN3
270 TAN4 = (PAR(I+5)-PAR(I+2))/DZ
271 SEC4 = SQRT(ONE+TAN4**2)
273 U2L = PAR(I+2)-PAR(I)*TAN4
274 GUARD = MAX(PAR(I)-DXL(3),ZERO)
275 PERP(5) = ABS(U1-U1L)/SEC3 + GUARD*SEC3
276 PERP(6) = ABS(U2-U2L)/SEC4 + GUARD*SEC4
281 PHI = ATAN2(DXL(2),DXL(1))
282 IF (PHI.LT.0.) PHI = PHI+TWOPI
283 PHI1 = MOD(PAR(1)+FULL10,FULL)*DEGRAD
284 PERP(7) = ABS(PHI-PHI1)
285 IF (PERP(7).GT.PI) PERP(7) = TWOPI-PERP(7)
286 PHI2 = MOD(PAR(1)+PAR(2)+FULL10,FULL)*DEGRAD
287 PERP(8) = ABS(PHI-PHI2)
288 IF (PERP(8).GT.PI) PERP(8) = TWOPI-PERP(8)
289 PERP(7) = PERP(7)*RHO
290 PERP(8) = PERP(8)*RHO
291 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),
292 + PERP(5),PERP(6),PERP(7),PERP(8))
293 IF (PERP(1).EQ.PMIN0) THEN
297 ELSE IF (PERP(2).EQ.PMIN0) THEN
301 ELSE IF (PERP(3).EQ.PMIN0) THEN
306 ELSE IF (PERP(4).EQ.PMIN0) THEN
311 ELSE IF (PERP(5).EQ.PMIN0) THEN
316 ELSE IF (PERP(6).EQ.PMIN0) THEN
321 ELSE IF (PERP(7).EQ.PMIN0) THEN
325 ELSE IF (PERP(8).EQ.PMIN0) THEN
333 * *** Case of the PolyGON:
334 ELSE IF (ISH.EQ.NSPGON) THEN
335 RHO = SQRT(DXL(1)**2+DXL(2)**2)
336 PHI = ATAN2(DXL(2),DXL(1))
337 IF (PHI.LT.0.) PHI = PHI+TWOPI
338 DPHI = MOD(PHI*RADDEG-PAR(1)+FULL10,FULL)
340 DSECT = INT(DPHI/PDIV + ONE)
341 IF (DSECT.GT.PAR(3)) THEN
342 IF (DPHI.GT.(180.+PAR(2)*DBY2)) THEN
348 PHI0 = MOD(PAR(1)+(DSECT-DBY2)*PDIV+FULL10,FULL)*DEGRAD
351 U0 = DXL(1)*CPHI0 + DXL(2)*SPHI0
352 V0 = DXL(2)*CPHI0 - DXL(1)*SPHI0
353 PERP(1) = ABS(DXL(3)-PAR(5))
355 PERP(2) = ABS(DXL(3)-PAR(I))
356 IF (PERP(2).GT.PERP(1)) GOTO 501
362 DZ = PAR(I)-PAR(I-3)+1.e-10
363 TAN1 = (PAR(I+1)-PAR(I-2))/DZ
364 SEC1 = SQRT(ONE+TAN1**2)
366 U1L = PAR(I+1)-PAR(I)*TAN1
367 TAN2 = (PAR(I+2)-PAR(I-1))/DZ
368 SEC2 = SQRT(ONE+TAN2**2)
370 U2L = PAR(I+2)-PAR(I)*TAN2
371 GUARD = MAX(DXL(3)-PAR(I),ZERO)
372 PERP(3) = ABS(U1-U1L)/SEC1 + GUARD*SEC1
373 PERP(4) = ABS(U2-U2L)/SEC2 + GUARD*SEC2
378 IF (I.LT.NPAR-2) THEN
380 DZ = PAR(I+3)-PAR(I)+1.e-10
381 TAN3 = (PAR(I+4)-PAR(I+1))/DZ
382 SEC3 = SQRT(ONE+TAN3**2)
384 U1L = PAR(I+1)-PAR(I)*TAN3
385 TAN4 = (PAR(I+5)-PAR(I+2))/DZ
386 SEC4 = SQRT(ONE+TAN4**2)
388 U2L = PAR(I+2)-PAR(I)*TAN4
389 GUARD = MAX(PAR(I)-DXL(3),ZERO)
390 PERP(5) = ABS(U1-U1L)/SEC3 + GUARD*SEC3
391 PERP(6) = ABS(U2-U2L)/SEC4 + GUARD*SEC4
396 PHI1 = MOD(PAR(1)+FULL10,FULL)*DEGRAD
397 PERP(7) = ABS(PHI-PHI1)
398 IF (PERP(7).GT.PI) PERP(7) = TWOPI-PERP(7)
399 PHI2 = MOD(PAR(1)+PAR(2)+FULL10,FULL)*DEGRAD
400 PERP(8) = ABS(PHI-PHI2)
401 IF (PERP(8).GT.PI) PERP(8) = TWOPI-PERP(8)
402 PERP(7) = PERP(7)*RHO
403 PERP(8) = PERP(8)*RHO
404 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),
405 + PERP(5),PERP(6),PERP(7),PERP(8))
406 IF (PERP(1).EQ.PMIN0) THEN
410 ELSE IF (PERP(2).EQ.PMIN0) THEN
414 ELSE IF (PERP(3).EQ.PMIN0) THEN
419 ELSE IF (PERP(4).EQ.PMIN0) THEN
424 ELSE IF (PERP(5).EQ.PMIN0) THEN
429 ELSE IF (PERP(6).EQ.PMIN0) THEN
434 ELSE IF (PERP(7).EQ.PMIN0) THEN
438 ELSE IF (PERP(8).EQ.PMIN0) THEN
446 * *** Case of the SPHEre:
447 ELSE IF (ISH.EQ.NSSPHE) THEN
448 R = SQRT(DXL(1)**2+DXL(2)**2+DXL(3)**2)
449 RHO = SQRT(DXL(1)**2+DXL(2)**2)
450 THE = ATAN2(RHO,DXL(3))
451 PHI = ATAN2(DXL(2),DXL(1))
452 IF (PHI.LT.0.) PHI = PHI+TWOPI
453 THE1 = MOD(PAR(3)+FULL10,FULL)*DEGRAD
454 THE2 = MOD(PAR(4)+FULL10,FULL)*DEGRAD
455 PHI1 = MOD(PAR(5)+FULL10,FULL)*DEGRAD
456 PHI2 = MOD(PAR(6)+FULL10,FULL)*DEGRAD
457 PERP(1) = ABS(R-PAR(1))
458 PERP(2) = ABS(R-PAR(2))
459 PERP(3) = ABS(THE-THE1)*R
460 PERP(4) = ABS(THE-THE2)*R
461 PERP(5) = ABS(PHI-PHI1)
462 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
463 PERP(5) = PERP(5)*RHO
464 PERP(6) = ABS(PHI-PHI2)
465 IF (PERP(6).GT.PI) PERP(6) = TWOPI-PERP(6)
466 PERP(6) = PERP(6)*RHO
467 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5),PERP(6))
468 IF (PERP(1).EQ.PMIN0) THEN
473 ELSE IF (PERP(2).EQ.PMIN0) THEN
478 ELSE IF (PERP(3).EQ.PMIN0) THEN
479 UL(1) = -COS(THE1)*COS(PHI)
480 UL(2) = -COS(THE1)*SIN(PHI)
482 ELSE IF (PERP(4).EQ.PMIN0) THEN
483 UL(1) = +COS(THE2)*COS(PHI)
484 UL(2) = +COS(THE2)*SIN(PHI)
486 ELSE IF (PERP(5).EQ.PMIN0) THEN
490 ELSE IF (PERP(6).EQ.PMIN0) THEN
498 * *** Case of the PARAllelpiped:
499 ***************************************************************
500 * Warning: the parameters for this shape are NOT stored in *
501 * the data structure as the user supplies them. Rather, the *
502 * user supplies PAR(4)=alph, PAR(5)=the, PAR(6)=phi, and the *
503 * data structure contains PAR(4)=Tan(alph), PAR(5)=Tan(the)* *
504 * Cos(phi), PAR(6)=Tan(the)*Sin(phi). *
505 ***************************************************************
506 ELSE IF (ISH.EQ.NSPARA) THEN
509 U0 = DXL(1)-DX*DXL(3)
510 V0 = DXL(2)-DY*DXL(3)
511 CALPH = ONE/SQRT(ONE+PAR(4)**2)
512 SALPH = -CALPH*PAR(4)
513 U1 = U0*CALPH+V0*SALPH
515 PERP(1) = ABS(ABS(U1)-U1L)
516 PERP(2) = ABS(ABS(V0)-PAR(2))
517 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
518 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
519 IF (PERP(1).EQ.PMIN0) THEN
520 DU = DX*CALPH+DY*SALPH
521 FACT = SIGN(ONE/SQRT(ONE+DU**2),U1)
525 ELSE IF (PERP(2).EQ.PMIN0) THEN
526 FACT = SIGN(ONE/SQRT(ONE+DY**2),V0)
530 ELSE IF (PERP(3).EQ.PMIN0) THEN
533 UL(3) = SIGN(ONE,DXL(3))
538 * *** Case of the trapezoid TRD1
539 ELSE IF (ISH.EQ.NSTRD1) THEN
540 DZ = TWO*PAR(4)+1.e-10
541 TAN1 = (PAR(2)-PAR(1))/DZ
542 SEC1 = SQRT(ONE+TAN1**2)
543 U1 = ABS(DXL(1))-DXL(3)*TAN1
544 U1L = PAR(2)-PAR(4)*TAN1
545 PERP(1) = ABS(U1-U1L)/SEC1
546 PERP(2) = ABS(ABS(DXL(2))-PAR(3))
547 PERP(3) = ABS(ABS(DXL(3))-PAR(4))
548 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
549 IF (PERP(1).EQ.PMIN0) THEN
551 UL(1) = SIGN(FACT,DXL(1))
554 ELSE IF (PERP(2).EQ.PMIN0) THEN
556 UL(2) = SIGN(ONE,DXL(2))
558 ELSE IF (PERP(3).EQ.PMIN0) THEN
561 UL(3) = SIGN(ONE,DXL(3))
566 * *** Case of the trapezoid TRD2
567 ELSE IF (ISH.EQ.NSTRD2) THEN
568 DZ = TWO*PAR(5)+1.e-10
569 TAN1 = (PAR(2)-PAR(1))/DZ
570 SEC1 = SQRT(ONE+TAN1**2)
571 U1 = ABS(DXL(1))-DXL(3)*TAN1
572 U1L = PAR(2)-PAR(5)*TAN1
573 TAN2 = (PAR(4)-PAR(3))/DZ
574 SEC2 = SQRT(ONE+TAN2**2)
575 U2 = ABS(DXL(2))-DXL(3)*TAN2
576 U2L = PAR(4)-PAR(5)*TAN2
577 PERP(1) = ABS(U1-U1L)/SEC1
578 PERP(2) = ABS(U2-U2L)/SEC2
579 PERP(3) = ABS(ABS(DXL(3))-PAR(5))
580 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
581 IF (PERP(1).EQ.PMIN0) THEN
583 UL(1) = SIGN(FACT,DXL(1))
586 ELSE IF (PERP(2).EQ.PMIN0) THEN
589 UL(2) = SIGN(FACT,DXL(2))
591 ELSE IF (PERP(3).EQ.PMIN0) THEN
594 UL(3) = SIGN(ONE,DXL(3))
599 * *** Case of the TRAPezoid
600 ***************************************************************
601 * Warning: the parameters for this shape are NOT stored in *
602 * the data structure as the user supplies them. Rather, the *
603 * user supplies PAR(2)=thet, PAR(3)=phi, PAR(7)=alp1, and *
604 * PAR(11)=alp2, while the data structure contains PAR(2)= *
605 * Tan(thet)*Cos(phi), PAR(3)=Tan(thet)*Sin(phi), PAR(7)= *
606 * Tan(alp1), and PAR(11)=Tan(alp2). *
607 ***************************************************************
608 ELSE IF (ISH.EQ.NSTRAP) THEN
609 PERP(1) = ABS(ABS(DXL(3))-PAR(1))
619 H = PAR(4)*RATL+PAR(8)*RATH
620 BL = PAR(5)*RATL+PAR(9)*RATH
621 TL = PAR(6)*RATL+PAR(10)*RATH
622 TALPH = PAR(7)*RATL+PAR(11)*RATH
624 TAN1 = TALPH+(TL-BL)/(TWO*H)
625 SEC1 = SQRT(ONE+TAN1**2)
626 U1 = DXL(1)-DXL(2)*TAN1
627 U1L = U0+XWID-V0*TAN1
628 TAN2 = TAN1-TWO*TALPH
629 SEC2 = SQRT(ONE+TAN2**2)
630 U2 = DXL(1)+DXL(2)*TAN2
631 U2L = U0-XWID+V0*TAN2
632 IF (DXL(3).LT.0) THEN
633 DZ = PAR(1)-DXL(3)+1.e-10
634 UU = UU0+(PAR(9)+PAR(10))/TWO
635 W1 = (UU-VV0*TAN1-U1L)/DZ
637 W2 = (UU+VV0*TAN2-U2L)/DZ
639 DZ = -PAR(1)-DXL(3)+1.e-10
640 UU = -UU0+(PAR(5)+PAR(6))/TWO
641 W1 = (UU+VV0*TAN1-U1L)/DZ
643 W2 = (UU-VV0*TAN2-U2L)/DZ
645 W3 = DY+(PAR(8)-PAR(4))/(TWO*PAR(1))
647 SEW1 = SQRT(ONE+W1**2)
648 SEW2 = SQRT(ONE+W2**2)
649 SEW3 = SQRT(ONE+W3**2)
650 SEW4 = SQRT(ONE+W4**2)
651 PERP(2) = ABS(U1-U1L)/(SEC1*SEW1)
652 PERP(3) = ABS(U2-U2L)/(SEC2*SEW2)
653 PERP(4) = ABS(DXL(2)-V0-H)/SEW3
654 PERP(5) = ABS(DXL(2)-V0+H)/SEW4
655 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
656 IF (PERP(1).EQ.PMIN0) THEN
659 UL(3) = SIGN(ONE,DXL(3))
660 ELSE IF (PERP(2).EQ.PMIN0) THEN
661 FACT = ONE/(SEC1*SEW1)
665 ELSE IF (PERP(3).EQ.PMIN0) THEN
666 FACT = ONE/(SEC2*SEW2)
670 ELSE IF (PERP(4).EQ.PMIN0) THEN
675 ELSE IF (PERP(5).EQ.PMIN0) THEN
684 * *** everything else (currently NOT IMPLEMENTED)
686 WRITE(CHMAIL,10100) ISH
693 WRITE(CHMAIL,10000) ISH
697 * *** Transform back into the MCS
702 10000 FORMAT(' GGPERP - geometry check error for shape #',I2,'!')
703 10100 FORMAT(' GGPERP - non implemented for shape #',I2)