summaryrefslogtreecommitdiff
path: root/Dragon/src/XCWROD.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/XCWROD.f')
-rw-r--r--Dragon/src/XCWROD.f195
1 files changed, 195 insertions, 0 deletions
diff --git a/Dragon/src/XCWROD.f b/Dragon/src/XCWROD.f
new file mode 100644
index 0000000..258e725
--- /dev/null
+++ b/Dragon/src/XCWROD.f
@@ -0,0 +1,195 @@
+*DECK XCWROD
+ SUBROUTINE XCWROD(NRIN,NRODS,NRODR,RODR,RODP,RADC,NFSEG,NLSEG,
+ > SEGLEN,NRSEG,NNSEG)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Perform rod tracking for 2-D cluster geometry.
+*
+*Copyright:
+* Copyright (C) 1992 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
+* NRIN current region number.
+* NRODS integer description of rod type:
+* NRODS(1) = number of rod;
+* NRODS(2) = number of subrods in rod.
+* NRODR subrod region.
+* RODR subrod radius.
+* RODP rod position:
+* RODP(1,IRD) = X-position;
+* RODP(2,IRD) = Y-position.
+* RADC Y-position of track.
+*
+*Parameters: output
+* NFSEG initial segment position.
+* NLSEG final segment position.
+* SEGLEN length of track.
+* NRSEG region crossed by track.
+* NNSEG region crossed by track (left).
+*
+*----------------------------------------------------------------------
+*
+ INTEGER NRIN,NRODS(2),NRODR,NFSEG,NLSEG,NRSEG(*),NNSEG(*)
+ REAL RODR(*),RODP(2,*)
+ DOUBLE PRECISION SEGLEN(*),RADC,RADR,RADR2
+*----
+* FILL IN SEGLEN FROM THE END STARTING WITH ROD FURTHER FROM
+* TRACK STARTING POINT UNTIL CENTER OF TRACK REACHED
+*----
+ NPROD=(NRODS(1)+3)/2
+ NSBR=NRODS(2)
+ IF(RADC.GE.0.0D0) THEN
+ IPDEB=1
+ IPFIN=NPROD
+ IPSTP=1
+ IMDEB=NPROD
+ IMFIN=1
+ IMSTP=-1
+ ELSE
+ RADR=RODP(2,1)-RADC
+ IF(ABS(RADR).LT.RODR(NSBR)) THEN
+ IPDEB=NRODS(1)+1
+ IPFIN=MAX(2,NRODS(1)+1-NPROD)
+ ELSE
+ IPDEB=NRODS(1)
+ IPFIN=MAX(1,NRODS(1)-NPROD)
+ ENDIF
+ IPSTP=-1
+ IMDEB=IPFIN
+ IMFIN=IPDEB
+ IMSTP=1
+ ENDIF
+ NXSEG=NLSEG
+ DO 100 IRZ=IPDEB,IPFIN,IPSTP
+ IF(IRZ.EQ.NRODS(1)+1) THEN
+ IRD=1
+ ELSE
+ IRD=IRZ
+ ENDIF
+ RADR=RODP(2,IRD)-RADC
+ RADR2=RADR*RADR
+ NREG=NRIN
+ IF( ABS(RADR).LT.RODR(NSBR) ) THEN
+*----
+* ROD INTERCEPS
+*----
+ XTRA=SQRT(RODR(NSBR)*RODR(NSBR)-REAL(RADR2))
+ XLST=RODP(1,IRD)+XTRA
+ XFST=RODP(1,IRD)-XTRA
+ IF(XLST.LT.0.0) THEN
+*----
+* CENTER OF TRACK REACHED/EXIT
+*----
+ GO TO 1000
+ ELSE
+*----
+* SET POINTERS TO SEGLEN VECTOR W.R.T. LAST POSITION FREE
+*----
+ NFLSEG=NXSEG-2*NSBR
+ NLLSEG=NXSEG
+ NXSEG=NFLSEG
+ ENDIF
+ SEGLEN(NLLSEG)=XLST
+ NRSEG(NLLSEG)=NREG
+ NNSEG(NFLSEG+1)=-NREG
+ NLLSEG=NLLSEG-1
+ NREG=NRODR
+ NFLSEG=NFLSEG+1
+ SEGLEN(NFLSEG)=XFST
+ NRSEG(NFLSEG)=NREG
+ NNSEG(NLLSEG+1)=-NREG
+ DO 110 ISBR=NSBR-1,1,-1
+ IF( ABS(RADR).LT.RODR(ISBR) ) THEN
+*----
+* SUBROD INTERCEPS
+*----
+ XTRA=SQRT(RODR(ISBR)*RODR(ISBR)-REAL(RADR2))
+ SEGLEN(NLLSEG)=RODP(1,IRD)+XTRA
+ NRSEG(NLLSEG)=NREG
+ NNSEG(NFLSEG+1)=-NREG
+ NLLSEG=NLLSEG-1
+ NREG=NREG-1
+ NFLSEG=NFLSEG+1
+ SEGLEN(NFLSEG)=RODP(1,IRD)-XTRA
+ NRSEG(NFLSEG)=NREG
+ NNSEG(NLLSEG+1)=-NREG
+ ENDIF
+ 110 CONTINUE
+ ENDIF
+ 100 CONTINUE
+ 1000 CONTINUE
+ NLSEG=NXSEG
+*----
+* FILL IN SEGLEN FROM THE BEGINNING STARTING WITH ROD CLOSEST FROM
+* TRACK STARTING POINT UNTIL CENTER OF TRACK REACHED
+*----
+ NXSEG=NFSEG
+ DO 200 IRZ=IMDEB,IMFIN,IMSTP
+ IF(IRZ.EQ.NRODS(1)+1) THEN
+ IRD=1
+ ELSE
+ IRD=IRZ
+ ENDIF
+ RADR=RODP(2,IRD)-RADC
+ RADR2=RADR*RADR
+ NREG=NRIN
+ IF( ABS(RADR).LT.RODR(NSBR) ) THEN
+*----
+* ROD INTERCEPS
+*----
+ XTRA=SQRT(RODR(NSBR)*RODR(NSBR)-REAL(RADR2))
+ XLST=RODP(1,IRD)+XTRA
+ XFST=RODP(1,IRD)-XTRA
+ IF(XLST.LT.0.0) THEN
+*----
+* SET POINTERS TO SEGLEN VECTOR W.R.T. FIRST POSITION FREE
+*----
+ NLLSEG=NXSEG+2*NSBR
+ NFLSEG=NXSEG
+ NXSEG=NLLSEG
+ ELSE
+*----
+* CENTER OF TRACK REACHED/EXIT
+*----
+ GO TO 2000
+ ENDIF
+ SEGLEN(NLLSEG)=XLST
+ NRSEG(NLLSEG)=NREG
+ NNSEG(NFLSEG+1)=-NREG
+ NLLSEG=NLLSEG-1
+ NREG=NRODR
+ NFLSEG=NFLSEG+1
+ SEGLEN(NFLSEG)=XFST
+ NRSEG(NFLSEG)=NREG
+ NNSEG(NLLSEG+1)=-NREG
+ DO 210 ISBR=NSBR-1,1,-1
+ IF( ABS(RADR).LT.RODR(ISBR) ) THEN
+*----
+* SUBROD INTERCEPS
+*----
+ XTRA=SQRT(RODR(ISBR)*RODR(ISBR)-REAL(RADR2))
+ SEGLEN(NLLSEG)=RODP(1,IRD)+XTRA
+ NRSEG(NLLSEG)=NREG
+ NNSEG(NFLSEG+1)=-NREG
+ NLLSEG=NLLSEG-1
+ NREG=NREG-1
+ NFLSEG=NFLSEG+1
+ SEGLEN(NFLSEG)=RODP(1,IRD)-XTRA
+ NRSEG(NFLSEG)=NREG
+ NNSEG(NLLSEG+1)=-NREG
+ ENDIF
+ 210 CONTINUE
+ ENDIF
+ 200 CONTINUE
+ 2000 CONTINUE
+ NFSEG=NXSEG
+ RETURN
+ END