diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/XCWHEX.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/XCWHEX.f')
| -rw-r--r-- | Dragon/src/XCWHEX.f | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/Dragon/src/XCWHEX.f b/Dragon/src/XCWHEX.f new file mode 100644 index 0000000..25572ec --- /dev/null +++ b/Dragon/src/XCWHEX.f @@ -0,0 +1,229 @@ +*DECK XCWHEX + SUBROUTINE XCWHEX(ANGD,RADC,SIDE,LINTER,XPOS,INDS,IMS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Track outer hexagone for 2-D cluster geometry. +* +*Copyright: +* Copyright (C) 1991 Ecole Polytechnique de Montreal +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version +* +*Author(s): G.Marleau +* +*Parameters: input +* ANGD track angle. +* RADC Y-position of track > 0. +* SIDE side of hexagone. +* IMS surface merge. +* +*Parameters: output +* LINTER intersection logical. +* XPOS points of intersection. +* INDS surface of intersection. +* +*Comments: +* Equations for sides of hexagone YR(XR) +* SIDE 1: YR=-SQ3*XR+SQ3*SIDE ( 0 <=YR<= SQ3*SIDE/2) +* ( SIDE/2 <=XR<= SIDE ) +* SIDE 2: YR= SQ3*SIDE/2 ( -SIDE/2 <=XR<= SIDE/2 ) +* SIDE 3: YR= SQ3*XR+SQ3*SIDE ( 0 <=YR<= SQ3*SIDE/2) +* ( -SIDE <=XR<= -SIDE/2 ) +* SIDE 4: YR=-SQ3*XR-SQ3*SIDE (-SQ3*SIDE/2 <=YR<= 0 ) +* ( -SIDE <=XR<= -SIDE/2 ) +* SIDE 5: YR=-SQ3*SIDE/2 ( -SIDE/2 <=XR<= SIDE/2 ) +* SIDE 6: YR= SQ3*XR-SQ3*SIDE (-SQ3*SIDE/2 <=YR<= 0 ) +* ( SIDE/2 <=XR<= SIDE ) +* Equations for sides of hexagone XR(YR) +* SIDE 1: XR=-OSQ3*YR+SIDE ( 0 <=YR<= SQ3*SIDE/2) +* ( SIDE/2 <=XR<= SIDE ) +* SIDE 3: XR= OSQ3*YR-SIDE ( 0 <=YR<= SQ3*SIDE/2) +* ( -SIDE <=XR<= -SIDE/2 ) +* SIDE 4: XR=-OSQ3*YR-SIDE (-SQ3*SIDE/2 <=YR<= 0 ) +* ( -SIDE <=XR<= -SIDE/2 ) +* SIDE 6: XR= OSQ3*YR+SIDE (-SQ3*SIDE/2 <=YR<= 0 ) +* ( SIDE/2 <=XR<= SIDE ) +* TRACK EQUATION: +* YR= SQ3*(SLOPEY*XR+RINTY) +* OR XR= OSQ3*SLOPEX*YR-RINTX +* +*---------------------------------------------------------------------- +* + PARAMETER (SQ3=1.73205080756887729,OSQ3=0.577350269189625795) + INTEGER IMS(6),INDS(2) + LOGICAL LINTER + REAL ANGD,RADC,SIDE,XPOS(2) +*---- + YRINT=SQ3*SIDE + YLIM=0.5*YRINT + XLIM=0.5*SIDE + SINA=SIN(ANGD) + COSA=COS(ANGD) + LINTER=.FALSE. + IF(COSA.EQ.0.0) THEN +*---- +* TRACK PARALLEL TO Y +*---- + IF( RADC.LT. XLIM ) THEN +*---- +* TRACK INTERCEPT SURFACE 5 AND 2 +*---- + IF(SINA.LT.0.0) THEN + INDS(2)=IMS(5) + INDS(1)=IMS(2) + ELSE + INDS(2)=IMS(2) + INDS(1)=IMS(5) + ENDIF + XPOS(2)=YLIM + XPOS(1)=-XPOS(2) + LINTER=.TRUE. + ELSE IF(RADC.LE.SIDE) THEN +*---- +* TRACK INTERCEPT SURFACE 3 AND 4 OR 6 AND 1 +*---- + IF(SINA.LT.0.0) THEN + INDS(2)=IMS(3) + INDS(1)=IMS(4) + ELSE + INDS(2)=IMS(6) + INDS(1)=IMS(1) + ENDIF + XPOS(2)=YRINT-SQ3*RADC + XPOS(1)=-XPOS(2) + LINTER=.TRUE. + ENDIF + ELSE IF(SINA.EQ.0.0) THEN +*---- +* TRACK PARALLEL TO X +*---- + IF(RADC.LE.YLIM ) THEN +*---- +* TRACK INTERCEPT SURFACE 6 AND 4 +*---- + INDS(2)=IMS(4) + INDS(1)=IMS(6) + XPOS(2)= OSQ3*RADC+SIDE + XPOS(1)=-XPOS(2) + LINTER=.TRUE. + ENDIF + ELSE + NSEG=0 + COSAI=1.0/COSA + SINAI=1.0/SINA + SLOPEY=OSQ3*SINA*COSAI + SLOPEX=SQ3*COSA*SINAI + RINTY=OSQ3*RADC*COSAI + RINTX=RADC*SINAI + XREF=RADC*COSAI*SINA + OPSY=1.0/(1+SLOPEY) + OMSY=1.0/(1-SLOPEY) + XLSX=SLOPEX*XLIM + SPRY=SIDE+RINTY + SMRY=SIDE-RINTY +*---- +* SURFACE 1: XR=(SIDE-RINTY)/(1+SLOPEY) +* (SIDE/2 <=XR<= SIDE) +*---- + XR=SMRY*OPSY + IF( (XLIM.LE.XR) .AND. (XR.LE.SIDE) ) THEN +*---- +* TRACK INTERSEPT SURFACE 1 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(1) + XPOS(NSEG)=XR + ENDIF +*---- +* SURFACE 2: XR= SLOPEX*SIDE/2-RINTX +* (-SIDE/2 <=XR<= SIDE/2) +*---- + XR=XLSX-RINTX + IF( ABS(XR).LE.XLIM ) THEN +*---- +* TRACK INTERSEPT SURFACE 2 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(2) + XPOS(NSEG)=XR + IF(NSEG.EQ.2) GO TO 100 + ENDIF +*---- +* SURFACE 3: XR=-(SIDE-RINTY)/(1-SLOPEY) +* (-SIDE <=XR<= -SIDE/2) +*---- + XR=-SMRY*OMSY + IF( (-SIDE.LE.XR) .AND. (XR.LE.-XLIM) )THEN +*---- +* TRACK INTERSEPT SURFACE 3 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(3) + XPOS(NSEG)=XR + IF(NSEG.EQ.2) GO TO 100 + ENDIF +*---- +* SURFACE 4: XR=-(SIDE+RINTY)/(1+SLOPEY) +* (-SIDE <=XR<= -SIDE/2) +*---- + XR=-SPRY*OPSY + IF( (-SIDE.LE.XR) .AND. (XR.LE.-XLIM) ) THEN +*---- +* TRACK INTERSEPT SURFACE 4 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(4) + XPOS(NSEG)=XR + IF(NSEG.EQ.2) GO TO 100 + ENDIF +*---- +* SURFACE 5: XR=-SLOPEX*SIDE/2-RINTX +* (-SIDE/2 <=XR<= SIDE/2) +*---- + XR=-XLSX-RINTX + IF( ABS(XR).LE.XLIM ) THEN +*---- +* TRACK INTERSEPT SURFACE 5 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(5) + XPOS(NSEG)=XR + IF(NSEG.EQ.2) GO TO 100 + ENDIF +*---- +* SURFACE 6: XR=(RINTY+SIDE)/(1-SLOPEY) +* (SIDE/2 <=XR<= SIDE) +*---- + XR=SPRY*OMSY + IF( (XLIM.LE.XR) .AND. (XR.LE.SIDE) ) THEN +*---- +* TRACK INTERSEPT SURFACE 6 +*---- + NSEG=NSEG+1 + INDS(NSEG)=IMS(6) + XPOS(NSEG)=XR + ENDIF + 100 CONTINUE + IF(NSEG.EQ.2) THEN + LINTER=.TRUE. +*---- +* ROTATE HEXAGONE BY -ANGD +*---- + XPOS(1)=XREF+XPOS(1)*COSAI + XPOS(2)=XREF+XPOS(2)*COSAI + IF( XPOS(1).GT.XPOS(2) ) THEN + INDT=INDS(2) + INDS(2)=INDS(1) + INDS(1)=INDT + XPOST=XPOS(2) + XPOS(2)=XPOS(1) + XPOS(1)=XPOST + ENDIF + ENDIF + ENDIF + RETURN + END |
