5 * Revision 1.1.1.1 1995/10/24 10:20:50 cernlib
9 #include "geant321/pilot.h"
10 *FCA : 05/01/99 09:58:02 by Federico Carminati
11 * Effectively print the message when a shape is
13 *CMZ : 3.21/02 29/03/94 15.41.28 by S.Giani
15 SUBROUTINE GGPERP (X,U,IERR)
17 C. ****************************************************************
19 C. * This routine solves the general problem of calculating the *
20 C. * unit vector normal to the surface of the current volume at *
21 C. * the point X. The result is returned in the array U. X is *
22 C. * assumed to be on or near a boundary of the current volume. *
23 C. * The current volume is indicated by the common /GCVOLU/. *
24 C. * U points from inside to outside in that neighbourhood. *
25 C. * If X is equidistant to more than one boundary (in a corner) *
26 C. * an arbitrary choice is made based upon the order of *
27 C. * precedence implied by the IF statements below. If the *
28 C. * routine fails to find the unit normal, it returns with *
29 C. * IERR=1, otherwise IERR=0. *
31 C. * Called by : GSURFP, GDSTEP *
32 C. * Authors : F.Carminati, R.Jones, F.Ohlsson-Malek *
34 C. ****************************************************************
35 #include "geant321/gcvolu.inc"
36 #include "geant321/gconsp.inc"
37 #include "geant321/gcbank.inc"
38 #include "geant321/gcshno.inc"
39 #include "geant321/gctmed.inc"
40 #include "geant321/gcunit.inc"
41 DIMENSION X(3),U(3),XL(3),UL(3),DXL(3),PAR(50),SPAR(50),ATT(20)
43 #if !defined(CERNLIB_SINGLE)
44 DOUBLE PRECISION PERP,PMIN0
45 DOUBLE PRECISION PAR,DXL,RHO,R,RINV,PHI,THE
46 DOUBLE PRECISION PHI1,PHI2,THE1,THE2,XWID
47 DOUBLE PRECISION GUARD,DPHI,PHI0,SPHI0,CPHI0
48 DOUBLE PRECISION FACT,CALPH,SALPH,TALPH
49 DOUBLE PRECISION RAT,RATL,RATH,H,BL,TL,DX,DY,DZ,DU
50 DOUBLE PRECISION UU0,VV0,UU,W1,W2,W3,W4
51 DOUBLE PRECISION SEW1,SEW2,SEW3,SEW4
52 DOUBLE PRECISION TAN1,TAN2,TAN3,TAN4
53 DOUBLE PRECISION SEC1,SEC2,SEC3,SEC4
54 DOUBLE PRECISION U0,V0,U1,U1L,U2,U2L
55 DOUBLE PRECISION ONE,TWO
56 DOUBLE PRECISION DSECT,ZERO,FULL,FULL10,DBY2
59 PARAMETER (ONE=1,TWO=2)
60 PARAMETER (ZERO=0.,DBY2=0.5,FULL=360.,FULL10=3600.)
62 C. ------------------------------------------------------------------
66 * *** Transform current point into local reference system
72 * *** Fetch the parameters of the current volume
73 JVO = LQ(JVOLUM-LVOLUM(NLEVEL))
76 JVOM = LQ(JVOLUM-LVOLUM(NLEVEL-1))
81 IF (NLEVEL.LT.NLDEV(NLEVEL)) THEN
84 * (case with structure JVOLUM locally developed)
85 JPAR = LQ(LQ(JVOLUM-LVOLUM(NLDEV(NLEVEL))))
86 IF (NLEVEL.EQ.NLDEV(NLEVEL)) GO TO 20
87 DO 10 ILEV = NLDEV(NLEVEL), NLEVEL-1
88 IF (IQ(JPAR+1).EQ.0) THEN
89 JPAR = LQ(JPAR-LINDEX(ILEV+1))
90 IF (JPAR.EQ.0) GO TO 20
91 ELSE IF (IQ(JPAR-3).GT.1) THEN
92 JPAR = LQ(JPAR-LINDEX(ILEV+1))
96 IF (ILEV.EQ.NLEVEL-1) THEN
99 CALL UCOPY (Q(JPAR+1), SPAR, NPAR)
109 CALL GFIPAR(JVO,JIN,IN,NPAR,NATT,SPAR,ATT)
115 * *** Case of the BOX:
116 IF (ISH.EQ.NSBOX) THEN
117 PERP(1) = ABS(ABS(DXL(1))-PAR(1))
118 PERP(2) = ABS(ABS(DXL(2))-PAR(2))
119 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
120 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
121 IF (PERP(1).EQ.PMIN0) THEN
122 UL(1) = SIGN(ONE,DXL(1))
125 ELSE IF (PERP(2).EQ.PMIN0) THEN
127 UL(2) = SIGN(ONE,DXL(2))
129 ELSE IF (PERP(3).EQ.PMIN0) THEN
132 UL(3) = SIGN(ONE,DXL(3))
137 * *** Case of the TUBE, TUBeSection:
138 ELSE IF (ISH.EQ.NSTUBE.OR.ISH.EQ.NSTUBS) THEN
139 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
140 PERP(1) = ABS(RHO-PAR(1))
141 PERP(2) = ABS(RHO-PAR(2))
142 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
143 IF (ISH.EQ.NSTUBE) THEN
144 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
146 PHI = ATAN2(DXL(2),DXL(1))
147 IF (PHI.LT.0.) PHI = PHI+TWOPI
148 PHI1 = MOD(PAR(4)+FULL10,FULL)*DEGRAD
149 PERP(4) = ABS(PHI-PHI1)
150 IF (PERP(4).GT.PI) PERP(4) = TWOPI-PERP(4)
151 PHI2 = MOD(PAR(5)+FULL10,FULL)*DEGRAD
152 PERP(5) = ABS(PHI-PHI2)
153 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
154 PERP(4) = PERP(4)*RHO
155 PERP(5) = PERP(5)*RHO
156 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
158 IF (PERP(1).EQ.PMIN0) THEN
162 ELSE IF (PERP(2).EQ.PMIN0) THEN
166 ELSE IF (PERP(3).EQ.PMIN0) THEN
169 UL(3) = SIGN(ONE,DXL(3))
170 ELSE IF (PERP(4).EQ.PMIN0) THEN
174 ELSE IF (PERP(5).EQ.PMIN0) THEN
182 * *** Case of the CONE, CONeSection:
183 ELSE IF (ISH.EQ.NSCONE.OR.ISH.EQ.NSCONS) THEN
184 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
185 TAN1 = (PAR(4)-PAR(2))/(TWO*PAR(1))
186 SEC1 = SQRT(ONE+TAN1**2)
188 U1L = PAR(4)-PAR(1)*TAN1
189 TAN2 = (PAR(5)-PAR(3))/(TWO*PAR(1))
190 SEC2 = SQRT(ONE+TAN2**2)
192 U2L = PAR(5)-PAR(1)*TAN2
193 PERP(1) = ABS(ABS(DXL(3))-PAR(1))
194 PERP(2) = ABS(U1-U1L)/SEC1
195 PERP(3) = ABS(U2-U2L)/SEC2
196 IF (ISH.EQ.NSCONE) THEN
197 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
199 PHI = ATAN2(DXL(2),DXL(1))
200 IF (PHI.LT.0.) PHI = PHI+TWOPI
201 PHI1 = MOD(PAR(6)+FULL10,FULL)*DEGRAD
202 PERP(4) = ABS(PHI-PHI1)
203 IF (PERP(4).GT.PI) PERP(4) = TWOPI-PERP(4)
204 PHI2 = MOD(PAR(7)+FULL10,FULL)*DEGRAD
205 PERP(5) = ABS(PHI-PHI2)
206 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
207 PERP(4) = PERP(4)*RHO
208 PERP(5) = PERP(5)*RHO
209 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
211 IF (PERP(1).EQ.PMIN0) THEN
214 UL(3) = SIGN(ONE,DXL(3))
215 ELSE IF (PERP(2).EQ.PMIN0) THEN
220 ELSE IF (PERP(3).EQ.PMIN0) THEN
225 ELSE IF (PERP(4).EQ.PMIN0) THEN
229 ELSE IF (PERP(5).EQ.PMIN0) THEN
237 * *** Case of the PolyCONe:
238 ELSE IF (ISH.EQ.NSPCON) THEN
239 PERP(1) = ABS(DXL(3)-PAR(4))
241 PERP(2) = ABS(DXL(3)-PAR(I))
242 IF (PERP(2).GT.PERP(1)) GOTO 401
248 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
249 DZ = PAR(I)-PAR(I-3)+1.e-10
250 TAN1 = (PAR(I+1)-PAR(I-2))/DZ
251 SEC1 = SQRT(ONE+TAN1**2)
253 U1L = PAR(I+1)-PAR(I)*TAN1
254 TAN2 = (PAR(I+2)-PAR(I-1))/DZ
255 SEC2 = SQRT(ONE+TAN2**2)
257 U2L = PAR(I+2)-PAR(I)*TAN2
258 GUARD = MAX(DXL(3)-PAR(I),ZERO)
259 PERP(3) = ABS(U1-U1L)/SEC1 + GUARD*SEC1
260 PERP(4) = ABS(U2-U2L)/SEC2 + GUARD*SEC2
265 IF (I.LT.NPAR-2) THEN
267 RHO = SQRT(DXL(1)**2 + DXL(2)**2)
268 DZ = PAR(I+3)-PAR(I)+1.e-10
269 TAN3 = (PAR(I+4)-PAR(I+1))/DZ
270 SEC3 = SQRT(ONE+TAN3**2)
272 U1L = PAR(I+1)-PAR(I)*TAN3
273 TAN4 = (PAR(I+5)-PAR(I+2))/DZ
274 SEC4 = SQRT(ONE+TAN4**2)
276 U2L = PAR(I+2)-PAR(I)*TAN4
277 GUARD = MAX(PAR(I)-DXL(3),ZERO)
278 PERP(5) = ABS(U1-U1L)/SEC3 + GUARD*SEC3
279 PERP(6) = ABS(U2-U2L)/SEC4 + GUARD*SEC4
284 PHI = ATAN2(DXL(2),DXL(1))
285 IF (PHI.LT.0.) PHI = PHI+TWOPI
286 PHI1 = MOD(PAR(1)+FULL10,FULL)*DEGRAD
287 PERP(7) = ABS(PHI-PHI1)
288 IF (PERP(7).GT.PI) PERP(7) = TWOPI-PERP(7)
289 PHI2 = MOD(PAR(1)+PAR(2)+FULL10,FULL)*DEGRAD
290 PERP(8) = ABS(PHI-PHI2)
291 IF (PERP(8).GT.PI) PERP(8) = TWOPI-PERP(8)
292 PERP(7) = PERP(7)*RHO
293 PERP(8) = PERP(8)*RHO
294 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),
295 + PERP(5),PERP(6),PERP(7),PERP(8))
296 IF (PERP(1).EQ.PMIN0) THEN
300 ELSE IF (PERP(2).EQ.PMIN0) THEN
304 ELSE IF (PERP(3).EQ.PMIN0) THEN
309 ELSE IF (PERP(4).EQ.PMIN0) THEN
314 ELSE IF (PERP(5).EQ.PMIN0) THEN
319 ELSE IF (PERP(6).EQ.PMIN0) THEN
324 ELSE IF (PERP(7).EQ.PMIN0) THEN
328 ELSE IF (PERP(8).EQ.PMIN0) THEN
336 * *** Case of the PolyGON:
337 ELSE IF (ISH.EQ.NSPGON) THEN
338 RHO = SQRT(DXL(1)**2+DXL(2)**2)
339 PHI = ATAN2(DXL(2),DXL(1))
340 IF (PHI.LT.0.) PHI = PHI+TWOPI
341 DPHI = MOD(PHI*RADDEG-PAR(1)+FULL10,FULL)
343 DSECT = INT(DPHI/PDIV + ONE)
344 IF (DSECT.GT.PAR(3)) THEN
345 IF (DPHI.GT.(180.+PAR(2)*DBY2)) THEN
351 PHI0 = MOD(PAR(1)+(DSECT-DBY2)*PDIV+FULL10,FULL)*DEGRAD
354 U0 = DXL(1)*CPHI0 + DXL(2)*SPHI0
355 V0 = DXL(2)*CPHI0 - DXL(1)*SPHI0
356 PERP(1) = ABS(DXL(3)-PAR(5))
358 PERP(2) = ABS(DXL(3)-PAR(I))
359 IF (PERP(2).GT.PERP(1)) GOTO 501
365 DZ = PAR(I)-PAR(I-3)+1.e-10
366 TAN1 = (PAR(I+1)-PAR(I-2))/DZ
367 SEC1 = SQRT(ONE+TAN1**2)
369 U1L = PAR(I+1)-PAR(I)*TAN1
370 TAN2 = (PAR(I+2)-PAR(I-1))/DZ
371 SEC2 = SQRT(ONE+TAN2**2)
373 U2L = PAR(I+2)-PAR(I)*TAN2
374 GUARD = MAX(DXL(3)-PAR(I),ZERO)
375 PERP(3) = ABS(U1-U1L)/SEC1 + GUARD*SEC1
376 PERP(4) = ABS(U2-U2L)/SEC2 + GUARD*SEC2
381 IF (I.LT.NPAR-2) THEN
383 DZ = PAR(I+3)-PAR(I)+1.e-10
384 TAN3 = (PAR(I+4)-PAR(I+1))/DZ
385 SEC3 = SQRT(ONE+TAN3**2)
387 U1L = PAR(I+1)-PAR(I)*TAN3
388 TAN4 = (PAR(I+5)-PAR(I+2))/DZ
389 SEC4 = SQRT(ONE+TAN4**2)
391 U2L = PAR(I+2)-PAR(I)*TAN4
392 GUARD = MAX(PAR(I)-DXL(3),ZERO)
393 PERP(5) = ABS(U1-U1L)/SEC3 + GUARD*SEC3
394 PERP(6) = ABS(U2-U2L)/SEC4 + GUARD*SEC4
399 PHI1 = MOD(PAR(1)+FULL10,FULL)*DEGRAD
400 PERP(7) = ABS(PHI-PHI1)
401 IF (PERP(7).GT.PI) PERP(7) = TWOPI-PERP(7)
402 PHI2 = MOD(PAR(1)+PAR(2)+FULL10,FULL)*DEGRAD
403 PERP(8) = ABS(PHI-PHI2)
404 IF (PERP(8).GT.PI) PERP(8) = TWOPI-PERP(8)
405 PERP(7) = PERP(7)*RHO
406 PERP(8) = PERP(8)*RHO
407 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),
408 + PERP(5),PERP(6),PERP(7),PERP(8))
409 IF (PERP(1).EQ.PMIN0) THEN
413 ELSE IF (PERP(2).EQ.PMIN0) THEN
417 ELSE IF (PERP(3).EQ.PMIN0) THEN
422 ELSE IF (PERP(4).EQ.PMIN0) THEN
427 ELSE IF (PERP(5).EQ.PMIN0) THEN
432 ELSE IF (PERP(6).EQ.PMIN0) THEN
437 ELSE IF (PERP(7).EQ.PMIN0) THEN
441 ELSE IF (PERP(8).EQ.PMIN0) THEN
449 * *** Case of the SPHEre:
450 ELSE IF (ISH.EQ.NSSPHE) THEN
451 R = SQRT(DXL(1)**2+DXL(2)**2+DXL(3)**2)
452 RHO = SQRT(DXL(1)**2+DXL(2)**2)
453 THE = ATAN2(RHO,DXL(3))
454 PHI = ATAN2(DXL(2),DXL(1))
455 IF (PHI.LT.0.) PHI = PHI+TWOPI
456 THE1 = MOD(PAR(3)+FULL10,FULL)*DEGRAD
457 THE2 = MOD(PAR(4)+FULL10,FULL)*DEGRAD
458 PHI1 = MOD(PAR(5)+FULL10,FULL)*DEGRAD
459 PHI2 = MOD(PAR(6)+FULL10,FULL)*DEGRAD
460 PERP(1) = ABS(R-PAR(1))
461 PERP(2) = ABS(R-PAR(2))
462 PERP(3) = ABS(THE-THE1)*R
463 PERP(4) = ABS(THE-THE2)*R
464 PERP(5) = ABS(PHI-PHI1)
465 IF (PERP(5).GT.PI) PERP(5) = TWOPI-PERP(5)
466 PERP(5) = PERP(5)*RHO
467 PERP(6) = ABS(PHI-PHI2)
468 IF (PERP(6).GT.PI) PERP(6) = TWOPI-PERP(6)
469 PERP(6) = PERP(6)*RHO
470 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5),PERP(6))
471 IF (PERP(1).EQ.PMIN0) THEN
476 ELSE IF (PERP(2).EQ.PMIN0) THEN
481 ELSE IF (PERP(3).EQ.PMIN0) THEN
482 UL(1) = -COS(THE1)*COS(PHI)
483 UL(2) = -COS(THE1)*SIN(PHI)
485 ELSE IF (PERP(4).EQ.PMIN0) THEN
486 UL(1) = +COS(THE2)*COS(PHI)
487 UL(2) = +COS(THE2)*SIN(PHI)
489 ELSE IF (PERP(5).EQ.PMIN0) THEN
493 ELSE IF (PERP(6).EQ.PMIN0) THEN
501 * *** Case of the PARAllelpiped:
502 ***************************************************************
503 * Warning: the parameters for this shape are NOT stored in *
504 * the data structure as the user supplies them. Rather, the *
505 * user supplies PAR(4)=alph, PAR(5)=the, PAR(6)=phi, and the *
506 * data structure contains PAR(4)=Tan(alph), PAR(5)=Tan(the)* *
507 * Cos(phi), PAR(6)=Tan(the)*Sin(phi). *
508 ***************************************************************
509 ELSE IF (ISH.EQ.NSPARA) THEN
512 U0 = DXL(1)-DX*DXL(3)
513 V0 = DXL(2)-DY*DXL(3)
514 CALPH = ONE/SQRT(ONE+PAR(4)**2)
515 SALPH = -CALPH*PAR(4)
516 U1 = U0*CALPH+V0*SALPH
518 PERP(1) = ABS(ABS(U1)-U1L)
519 PERP(2) = ABS(ABS(V0)-PAR(2))
520 PERP(3) = ABS(ABS(DXL(3))-PAR(3))
521 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
522 IF (PERP(1).EQ.PMIN0) THEN
523 DU = DX*CALPH+DY*SALPH
524 FACT = SIGN(ONE/SQRT(ONE+DU**2),U1)
528 ELSE IF (PERP(2).EQ.PMIN0) THEN
529 FACT = SIGN(ONE/SQRT(ONE+DY**2),V0)
533 ELSE IF (PERP(3).EQ.PMIN0) THEN
536 UL(3) = SIGN(ONE,DXL(3))
541 * *** Case of the trapezoid TRD1
542 ELSE IF (ISH.EQ.NSTRD1) THEN
543 DZ = TWO*PAR(4)+1.e-10
544 TAN1 = (PAR(2)-PAR(1))/DZ
545 SEC1 = SQRT(ONE+TAN1**2)
546 U1 = ABS(DXL(1))-DXL(3)*TAN1
547 U1L = PAR(2)-PAR(4)*TAN1
548 PERP(1) = ABS(U1-U1L)/SEC1
549 PERP(2) = ABS(ABS(DXL(2))-PAR(3))
550 PERP(3) = ABS(ABS(DXL(3))-PAR(4))
551 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
552 IF (PERP(1).EQ.PMIN0) THEN
554 UL(1) = SIGN(FACT,DXL(1))
557 ELSE IF (PERP(2).EQ.PMIN0) THEN
559 UL(2) = SIGN(ONE,DXL(2))
561 ELSE IF (PERP(3).EQ.PMIN0) THEN
564 UL(3) = SIGN(ONE,DXL(3))
569 * *** Case of the trapezoid TRD2
570 ELSE IF (ISH.EQ.NSTRD2) THEN
571 DZ = TWO*PAR(5)+1.e-10
572 TAN1 = (PAR(2)-PAR(1))/DZ
573 SEC1 = SQRT(ONE+TAN1**2)
574 U1 = ABS(DXL(1))-DXL(3)*TAN1
575 U1L = PAR(2)-PAR(5)*TAN1
576 TAN2 = (PAR(4)-PAR(3))/DZ
577 SEC2 = SQRT(ONE+TAN2**2)
578 U2 = ABS(DXL(2))-DXL(3)*TAN2
579 U2L = PAR(4)-PAR(5)*TAN2
580 PERP(1) = ABS(U1-U1L)/SEC1
581 PERP(2) = ABS(U2-U2L)/SEC2
582 PERP(3) = ABS(ABS(DXL(3))-PAR(5))
583 PMIN0 = MIN(PERP(1),PERP(2),PERP(3))
584 IF (PERP(1).EQ.PMIN0) THEN
586 UL(1) = SIGN(FACT,DXL(1))
589 ELSE IF (PERP(2).EQ.PMIN0) THEN
592 UL(2) = SIGN(FACT,DXL(2))
594 ELSE IF (PERP(3).EQ.PMIN0) THEN
597 UL(3) = SIGN(ONE,DXL(3))
602 * *** Case of the TRAPezoid
603 ***************************************************************
604 * Warning: the parameters for this shape are NOT stored in *
605 * the data structure as the user supplies them. Rather, the *
606 * user supplies PAR(2)=thet, PAR(3)=phi, PAR(7)=alp1, and *
607 * PAR(11)=alp2, while the data structure contains PAR(2)= *
608 * Tan(thet)*Cos(phi), PAR(3)=Tan(thet)*Sin(phi), PAR(7)= *
609 * Tan(alp1), and PAR(11)=Tan(alp2). *
610 ***************************************************************
611 ELSE IF (ISH.EQ.NSTRAP) THEN
612 PERP(1) = ABS(ABS(DXL(3))-PAR(1))
622 H = PAR(4)*RATL+PAR(8)*RATH
623 BL = PAR(5)*RATL+PAR(9)*RATH
624 TL = PAR(6)*RATL+PAR(10)*RATH
625 TALPH = PAR(7)*RATL+PAR(11)*RATH
627 TAN1 = TALPH+(TL-BL)/(TWO*H)
628 SEC1 = SQRT(ONE+TAN1**2)
629 U1 = DXL(1)-DXL(2)*TAN1
630 U1L = U0+XWID-V0*TAN1
631 TAN2 = TAN1-TWO*TALPH
632 SEC2 = SQRT(ONE+TAN2**2)
633 U2 = DXL(1)+DXL(2)*TAN2
634 U2L = U0-XWID+V0*TAN2
635 IF (DXL(3).LT.0) THEN
636 DZ = PAR(1)-DXL(3)+1.e-10
637 UU = UU0+(PAR(9)+PAR(10))/TWO
638 W1 = (UU-VV0*TAN1-U1L)/DZ
640 W2 = (UU+VV0*TAN2-U2L)/DZ
642 DZ = -PAR(1)-DXL(3)+1.e-10
643 UU = -UU0+(PAR(5)+PAR(6))/TWO
644 W1 = (UU+VV0*TAN1-U1L)/DZ
646 W2 = (UU-VV0*TAN2-U2L)/DZ
648 W3 = DY+(PAR(8)-PAR(4))/(TWO*PAR(1))
650 SEW1 = SQRT(ONE+W1**2)
651 SEW2 = SQRT(ONE+W2**2)
652 SEW3 = SQRT(ONE+W3**2)
653 SEW4 = SQRT(ONE+W4**2)
654 PERP(2) = ABS(U1-U1L)/(SEC1*SEW1)
655 PERP(3) = ABS(U2-U2L)/(SEC2*SEW2)
656 PERP(4) = ABS(DXL(2)-V0-H)/SEW3
657 PERP(5) = ABS(DXL(2)-V0+H)/SEW4
658 PMIN0 = MIN(PERP(1),PERP(2),PERP(3),PERP(4),PERP(5))
659 IF (PERP(1).EQ.PMIN0) THEN
662 UL(3) = SIGN(ONE,DXL(3))
663 ELSE IF (PERP(2).EQ.PMIN0) THEN
664 FACT = ONE/(SEC1*SEW1)
668 ELSE IF (PERP(3).EQ.PMIN0) THEN
669 FACT = ONE/(SEC2*SEW2)
673 ELSE IF (PERP(4).EQ.PMIN0) THEN
678 ELSE IF (PERP(5).EQ.PMIN0) THEN
687 * *** everything else (currently NOT IMPLEMENTED)
689 WRITE(CHMAIL,10100) ISH
696 WRITE(CHMAIL,10000) ISH
701 * *** Transform back into the MCS
706 10000 FORMAT(' GGPERP - geometry check error for shape #',I2,'!')
707 10100 FORMAT(' GGPERP - non implemented for shape #',I2)