summaryrefslogtreecommitdiff
path: root/Dragon/src/XCWSRT.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/XCWSRT.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/XCWSRT.f')
-rw-r--r--Dragon/src/XCWSRT.f154
1 files changed, 154 insertions, 0 deletions
diff --git a/Dragon/src/XCWSRT.f b/Dragon/src/XCWSRT.f
new file mode 100644
index 0000000..ad2b14c
--- /dev/null
+++ b/Dragon/src/XCWSRT.f
@@ -0,0 +1,154 @@
+*DECK XCWSRT
+ SUBROUTINE XCWSRT(IPRT,MXSEG,SEGLEN,NRSEG,NNSEG,NTSEG)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Sort region intersection by position.
+*
+*Copyright:
+* Copyright (C) 1994 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
+* IPRT print level.
+* MXSEG current maximum track length.
+*
+*Parameters: input/output
+* SEGLEN length of track.
+* NRSEG region crossed by track.
+* NNSEG region crossed by track (left).
+*
+*Parameters: output
+* NTSEG total number of segments.
+*
+*----------------------------------------------------------------------
+*
+ PARAMETER (IUNOUT=6)
+ INTEGER IPRT,MXSEG,NRSEG(*),NNSEG(*),NTSEG
+ DOUBLE PRECISION SEGLEN(*)
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER REFNR,REFNN
+ DOUBLE PRECISION REFSL
+*----
+* REMOVE TERM WITH NRSEG<=0
+*----
+ NTSEG=0
+ DO 100 IS=1,MXSEG-1
+ IF(NRSEG(IS).GT.0) THEN
+ NTSEG=NTSEG+1
+ NRSEG(NTSEG)=NRSEG(IS)
+ NNSEG(NTSEG)=NNSEG(IS)
+ SEGLEN(NTSEG)=SEGLEN(IS)
+ ENDIF
+ 100 CONTINUE
+ NSEG=NTSEG+1
+ NRSEG(NSEG)=NRSEG(MXSEG)
+ NNSEG(NSEG)=NNSEG(MXSEG)
+ SEGLEN(NSEG)=SEGLEN(MXSEG)
+ IF(IPRT.GE.200) THEN
+ WRITE(IUNOUT,6000)
+ WRITE(IUNOUT,6010) (IIJJ,SEGLEN(IIJJ),NNSEG(IIJJ),
+ > NRSEG(IIJJ),IIJJ=1,NSEG)
+ ENDIF
+*----
+* SORT FROM MINIMUM TO MAXIMUM
+*----
+ DO 110 IS=2,NSEG
+ REFSL=SEGLEN(IS)
+ REFNR=NRSEG(IS)
+ REFNN=NNSEG(IS)
+ DO 111 JS=IS-1,1,-1
+ KS=JS
+ IF(SEGLEN(JS).GT.REFSL) THEN
+ SEGLEN(JS+1)=SEGLEN(JS)
+ NRSEG(JS+1)=NRSEG(JS)
+ NNSEG(JS+1)=NNSEG(JS)
+ ELSE
+ GO TO 112
+ ENDIF
+ 111 CONTINUE
+ KS=0
+ 112 CONTINUE
+ SEGLEN(KS+1)=REFSL
+ NRSEG(KS+1)=REFNR
+ NNSEG(KS+1)=REFNN
+ 110 CONTINUE
+ IF(IPRT.GE.200) THEN
+ WRITE(IUNOUT,6001)
+ WRITE(IUNOUT,6010) (IIJJ,SEGLEN(IIJJ),NNSEG(IIJJ),
+ > NRSEG(IIJJ),IIJJ=1,NSEG)
+ ENDIF
+*----
+* CHECK FOR ROD INTERSECTION WITH ANNULUS OR
+* ANNULUS LOCATED BETWEEN ROD SETS
+*----
+ DO 120 IS=1,NSEG
+ NTB=NRSEG(IS)
+ NFB=NNSEG(IS)
+ IF(NTB.GT.0) THEN
+ IF(NTB.LT.NFB) THEN
+ DO 121 JS=IS+1,NSEG
+ NTE=NRSEG(JS)
+ NFE=NNSEG(JS)
+ IF((NTE.EQ.NFB).AND.(NFE.EQ.NTB)) GO TO 122
+ IF(NTE.GT.NTB) THEN
+ NRSEG(JS)=NTB
+ ENDIF
+ IF(ABS(NFE).GT.NTB) THEN
+ IF(NFE.LT.0) THEN
+ NNSEG(JS)=-NTB
+ ELSE
+ NNSEG(JS)=NTB
+ ENDIF
+ ENDIF
+ 121 CONTINUE
+ ENDIF
+ ENDIF
+ 122 CONTINUE
+ IF(NFB.GT.0) THEN
+ DO 123 JS=IS-1,1,-1
+ NTE=NRSEG(JS)
+ IF(NTE.GT.0) THEN
+ IF(NFB.NE.NTE) THEN
+ NRSEG(IS)=0
+ ENDIF
+ GO TO 124
+ ENDIF
+ 123 CONTINUE
+ ENDIF
+ 124 CONTINUE
+ 120 CONTINUE
+*----
+* REMOVE NEW TERMS WITH NRSEG<=0
+*----
+ NTSEG=0
+ DO 130 IS=1,NSEG-1
+ IF(NRSEG(IS).GT.0) THEN
+ NTSEG=NTSEG+1
+ NRSEG(NTSEG)=NRSEG(IS)
+ NNSEG(NTSEG)=NNSEG(IS)
+ SEGLEN(NTSEG)=SEGLEN(IS)
+ ENDIF
+ 130 CONTINUE
+ NSEG=NTSEG+1
+ NRSEG(NSEG)=NRSEG(MXSEG)
+ NNSEG(NSEG)=NNSEG(MXSEG)
+ SEGLEN(NSEG)=SEGLEN(MXSEG)
+ RETURN
+*----
+* FORMATS
+*----
+ 6000 FORMAT(' COMPRESSED TRACKING FILE'/
+ >5X,'NUMBER',7X,'POSITION',4X,'BEFORE',5X,'AFTER')
+ 6001 FORMAT(' SORTED TRACKING FILE'/
+ >5X,'NUMBER',7X,'POSITION',4X,'BEFORE',5X,'AFTER')
+ 6010 FORMAT((1X,I10,F15.7,2I10))
+ END