summaryrefslogtreecommitdiff
path: root/Dragon/src/XCGROD.f
blob: 8ee931a497e953452aa8c43801c2fab567beb185 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
*DECK XCGROD
      SUBROUTINE XCGROD(NRT,MSROD,NRODS,RODS,MATROD,RODR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Check geometry and reorder rod clusters if necessary.
*
*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
* NRT     number of rod types.
* MSROD   maximum number of subrods per rods.
*
*Parameters: input/output
* NRODS   integer description of rod of a given type:
*         NRODS(1,IRT) = number of rod;
*         NRODS(2,IRT) = number of subrods in rod;
*         NRODS(3,IRT) = first concentric region.
* RODS    real description of rod of a given type:
*         RODS(1,IRT) = rod center radius;
*         RODS(2,IRT) = angular position of first rod.
* MATROD  type of material for each subrod.
* RODR    subrod radius.
*
*----------------------------------------------------------------------
*
      INTEGER    IOUT
      REAL       PI
      PARAMETER (IOUT=6,PI=3.1415926535898)
      INTEGER    NRT,NRODS(3,NRT),MATROD(MSROD,NRT)
      REAL       RODS(2,NRT),RODR(MSROD,NRT)
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IORD
*----
*  SCRATCH STORAGE ALLOCATION
*   IORD    : NEW ROD CLUSTER ORDER                       I(NRT)
*----
      ALLOCATE(IORD(NRT))
*----
*  CLASSIFY ROD CLUSTER BY INCREASING DISTANCE OF CENTER AND ANGLE
*----
      DO 100 IRT=1,NRT
        IORD(IRT)=IRT
 100  CONTINUE
      DO 110 IRT=2,NRT
        REFR=RODS(1,IRT)
        REFA=RODS(2,IRT)
        IPOS=IORD(IRT)
        DO 111 JRT=IRT-1,1,-1
          KRT=JRT
          IF(RODS(1,JRT).GT.REFR) THEN
            RODS(1,JRT+1)=RODS(1,JRT)
            RODS(2,JRT+1)=RODS(2,JRT)
            IORD(JRT+1)=IORD(JRT)
          ELSE IF(RODS(1,JRT).EQ.REFR) THEN
            IPOS=-IPOS
            GO TO 112
          ELSE
            GO TO 112
          ENDIF
 111    CONTINUE
        KRT=0
 112    CONTINUE
        RODS(1,KRT+1)=REFR
        RODS(2,KRT+1)=REFA
        IORD(KRT+1)=IPOS
        IF(IPOS.LT.0) THEN
          DO 113 JRT=KRT,1,-1
            LRT=JRT
            IF((RODS(2,JRT).GT.REFA).AND.
     >         (RODS(1,JRT).EQ.REFR)) THEN
              RODS(1,JRT+1)=RODS(1,JRT)
              RODS(2,JRT+1)=RODS(2,JRT)
              IORD(JRT+1)=IORD(JRT)
            ELSE
              GO TO 114
            ENDIF
 113      CONTINUE
          LRT=0
 114      CONTINUE
          RODS(1,LRT+1)=REFR
          RODS(2,LRT+1)=REFA
          IORD(LRT+1)=-IPOS
        ENDIF
 110  CONTINUE
*----
*  REORDER REMAINING VECTORS NRODS,MATROD,RODR
*----
      DO 140 IRT=1,NRT
        JRT=IORD(IRT)
        IF(JRT.NE.IRT) THEN
          DO 141 IX=1,3
            NNR=NRODS(IX,IRT)
            NRODS(IX,IRT)=NRODS(IX,JRT)
            NRODS(IX,JRT)=NNR
 141      CONTINUE
          DO 142 IS=1,MSROD
            MATT=MATROD(IS,IRT)
            MATROD(IS,IRT)=MATROD(IS,JRT)
            MATROD(IS,JRT)=MATT
            RROD=RODR(IS,IRT)
            RODR(IS,IRT)=RODR(IS,JRT)
            RODR(IS,JRT)=RROD
 142      CONTINUE
          DO 143 KRT=IRT+1,NRT
            IF(IORD(KRT).EQ.IRT) THEN
              IORD(KRT)=JRT
              IORD(IRT)=IRT
              GO TO 144
            ENDIF
 143      CONTINUE
 144      CONTINUE
        ENDIF
 140  CONTINUE
*----
*  FIND IF ROD OVERLAPP
*----
      DO 150 IRT=1,NRT
        NRDB=NRODS(1,IRT)
        NSBRB=NRODS(2,IRT)
        RODRB=RODR(NSBRB,IRT)
        RODRB2=RODRB*RODRB
        RDPB=RODS(1,IRT)
        XBOT=RDPB-RODRB
        DANGB=2.*PI/FLOAT(NRDB)
        ANGB=RODS(2,IRT)
*----
*  CHECK FOR ROD OVERLAPP INSIDE EACH CLUSTER
*----
        IF(NRDB.GT.1) THEN
          IF(RODRB.GT.RDPB) THEN
            WRITE(IOUT,'(1X,24HROD OVERLAP IN CLUSTER =,I10)') IRT
            CALL XABORT('XCGROD: ROD OVERLAP IN A CLUSTER')
          ELSE
            ANGMIN=2.*ASIN(RODRB/RDPB)
            IF(DANGB.LE.ANGMIN) THEN
              WRITE(IOUT,'(1X,24HROD OVERLAP IN CLUSTER =,I10)') IRT
              CALL XABORT('XCGROD: ROD OVERLAP IN A CLUSTER')
            ENDIF
          ENDIF
        ENDIF
*----
*  CHECK FOR ROD OVERLAPP BETWEEN DIFFERENT CLUSTERS
*----
        DO 151 JRT=IRT-1,1,-1
          NRDT=NRODS(1,JRT)
          NSBRT=NRODS(2,JRT)
          RODRT=RODR(NSBRT,JRT)
          RODRT2=RODRT*RODRT
          RDPT=RODS(1,JRT)
          XTOP=RDPT+RODRT
          DANGT=2.*PI/FLOAT(NRDT)
          ANGT=RODS(2,JRT)
*----
*  NO OVERLAPP
*----
          IF(XTOP.LT.XBOT) GO TO 152
*----
*  SOME OVERLAPP POSSIBLE TEST FOR INTERSECTION
*----
          ANG1=ANGB
          DO 160 IA1=1,NRDB
*----
*  FIND POSITION OF ROD (X0,Y0)
*----
            X01=RDPB*COS(ANG1)
            Y01=RDPB*SIN(ANG1)
            RRX=RODRB2-X01*X01
            RRY=RODRB2-Y01*Y01
            XY=X01*Y01
            RR1=(RRX-Y01*Y01)
            ANG2=ANGT
            DO 161 IA2=1,NRDT
              X02=RDPT*COS(ANG2)
              Y02=RDPT*SIN(ANG2)
              RR2=(RODRT2-X02*X02-Y02*Y02)
*----
*  CHECK FOR ROD INSIDE ROD
*----
              DELX=X02-X01
              DELY=Y02-Y01
              DIST=SQRT(DELX**2+DELY**2)
              IF(DIST.LT.RODRT+RODRB) THEN
                WRITE(IOUT,'(1X,25HROD OVERLAP IN CLUSTERS =,2I10)')
     >                 IRT,JRT
                CALL XABORT('XCGROD: ROD OVERLAP IN 2 CLUSTERS')
              ENDIF
*----
*  FIND IF CIRCLES
*  (X-X01)**2+(Y-Y01)**2=RODRB*2
*  (X-X02)**2+(Y-Y02)**2=RODRT*2
*  INTERSECT
*----
              IF(X02.NE.X01) THEN
                CCR=1./DELX
                BBR=-DELY*CCR
                AAR=0.5*CCR*(RR1-RR2)
                ARGSQ=AAR*(2.*X01-2.*BBR*Y01-AAR)
     >               +BBR*(BBR*RRY+2.*XY)+RRX
              ELSE
                CCR=1./DELY
                BBR=-DELX*CCR
                AAR=0.5*CCR*(RR1-RR2)
                ARGSQ=AAR*(2.*Y01-2.*BBR*X01-AAR)
     >               +BBR*(BBR*RRX+2.*XY)+RRY
              ENDIF
              IF(ARGSQ.GE.0.0) THEN
                WRITE(IOUT,'(1X,25HROD OVERLAP IN CLUSTERS =,2I10)')
     >                   IRT,JRT
                CALL XABORT('XCGROD: ROD OVERLAP IN 2 CLUSTERS')
              ENDIF
              ANG2=ANG2+DANGT
 161        CONTINUE
            ANG1=ANG1+DANGB
 160      CONTINUE
 151    CONTINUE
 152    CONTINUE
 150  CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(IORD)
*----
*  RETURN
*----
      RETURN
      END