summaryrefslogtreecommitdiff
path: root/Dragon/src/XCWSRT.f
blob: ad2b14c6dd19841cd39301c41b0e239f3ba47e2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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