summaryrefslogtreecommitdiff
path: root/Dragon/src/XELCRN.f
blob: 0c7fa547aa7fb5c6f229e62673d5fcc34d4f4228 (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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
*DECK XELCRN
      SUBROUTINE XELCRN(IPRINT,RANN2,NRSPX,NRSPY,SPAT,AREAI)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Find 2-D surface of intersection between annular region and 
* Cartesian plane.
*
*Copyright:
* Copyright (C) 1997 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
* IPRINT  print level (active if >=10).
* RANN2   annular region  radius**2.
* NRSPX   number of mesh in x- direction.
* NRSPY   number of mesh in x- direction.
* SPAT    spatial mesh x-direction:
*         SPAT(1,1)       = lower X - position;
*         SPAT(NRSPX+1,1) = upper X - position;
*         SPAT(1,2)       = lower Y - position;
*         SPAT(NRSPY+1,2) = upper Y - position.
*
*Parameters: output
* AREAI   area of intersection.
*
*--------------------------    XELCRN    -------------------------------
*
      IMPLICIT          NONE
      INTEGER           IPRINT,NRSPX,NRSPY
      DOUBLE PRECISION  RANN2,SPAT(NRSPX+1,NRSPY+1),
     >                  AREAI(NRSPX,NRSPY)
*----
*  INTERNAL PARAMETERS
*----
      INTEGER      IOUT
      CHARACTER    NAMSBR*6
      PARAMETER   (IOUT=6,NAMSBR='XELCRN')
      DOUBLE PRECISION   PI,DZERO
      PARAMETER   (PI=3.14159265358979323846D0,DZERO=0.0D0)
*----
*  LOCAL VARIABLES
*----
      INTEGER          IRP(2,2),IX,NMX,IY,NMY
      DOUBLE PRECISION XELPSC,XELPSI,XYPOS(2,2),XYPOS2(2,2),
     >                 SPXY(2,2),SIXY(2,2),RANN,SURANN 
*----
*  COMPUTE GENERAL ANNULAR REGION INFORMATIONS
*    RANN   = ANNULAR REGION RADIUS
*    SURANN = ANNULAR SURFACE
*  COMPUTE CARTESIAN PARAMETERS
*    NMX =NRSPX+1
*    NMY =NRSPY+1
*  INITIALIZE AREAI TO 0.0D0
*----
      RANN=SQRT(RANN2)
      SURANN=PI*RANN2
      NMX=NRSPX+1
      NMY=NRSPY+1
      AREAI(:NRSPX,:NRSPY)=DZERO
      IRP(:2,:2)=0
*----
*  PRINT INITIAL MESH IF REQUIRED
*-----
      IF(IPRINT .GE. 10) THEN
        WRITE(IOUT,6000)
        WRITE(IOUT,6002) 'ANNULAR RADIUS  '
        WRITE(IOUT,6003) RANN
        WRITE(IOUT,6002) 'ANNULAR SURFACE '
        WRITE(IOUT,6003) SURANN
        WRITE(IOUT,6002) 'X-DIRECTED MESH '
        WRITE(IOUT,6003) (SPAT(IX,1),IX=1,NRSPX+1)
        WRITE(IOUT,6002) 'Y-DIRECTED MESH '
        WRITE(IOUT,6003) (SPAT(IY,2),IY=1,NRSPY+1)
        WRITE(IOUT,6002) 'X-Y SURFACES    '
        WRITE(IOUT,6003) (( (SPAT(IX+1,1)-SPAT(IX,1))
     >                     *(SPAT(IY+1,2)-SPAT(IY,2)),
     >                     IX=1,NRSPX),IY=1,NRSPY)
      ENDIF
*----
*  CYCLE OVER CARTESIAN Y-DIRECTIONS STARTING FROM THE END
*  AND LOCATE Y-MESH POSITION WITH RESPECT TO ANNULUS CENTER
*----
      SPXY(2,2)=DZERO
      DO 110 IY=NMY,1,-1
        XYPOS(2,1)=SPAT(IY,2)
        XYPOS2(2,1)=XYPOS(2,1)*XYPOS(2,1)
*----
*  FIND IF ANNULUS ABOVE, BELOW OR INTERSECT CURRENT Y-PLANE
*  AND COMPUTE
*    SPXY = ANNULAR SURFACE BELOW CURRENT PLANE
*  IF ANNULUS BELOW CURRENT PLANE (XYPOS(2,1)>= RANN)
*    IRPY(2,1)=-1
*    SPXY(2,1)=SURANN
*  IF ANNULUS ABOVE CURRENT PLANE (XYPOS(2,1)<= -RANN)
*    IRPY(2,1)= 1
*    SPXY(2,1)=0.0
*  IF ANNULUS INTERSECT CURRENT ( -RANN < XYPOS(2,1) < RANN)
*    IRPY(2,1)= 0
*    SPXY=XELPSC(RANN,XYPOS(2,1))
*----
        IF(XYPOS(2,1) .GE. RANN) THEN
          IRP(2,1)=-1
          SPXY(2,1)=SURANN
        ELSE IF(XYPOS(2,1) .LE. -RANN) THEN
          IRP(2,1)=1
          SPXY(2,1)=DZERO
        ELSE
          IRP(2,1)=0
          SPXY(2,1)=XELPSC(RANN,XYPOS(2,1))
        ENDIF
*----
*  FOR LAST PLANE IN Y DIRECTION OR
*  Y-PLANE ABOVE ANNULAR VOLUME
*  GO TO LABEL 111
*----
        IF(IY .EQ. NMY .OR. IRP(2,1) .EQ. -1) GO TO 111
*----
*  CYCLE OVER CARTESIAN X-DIRECTIONS STARTING FROM THE END
*  AND LOCATE X-MESH POSITION WITH RESPECT TO ANN CENTER
*----
        SPXY(1,2)=DZERO
        SIXY(2,1)=DZERO
        SIXY(2,2)=DZERO
        DO 120 IX=NMX,1,-1
          XYPOS(1,1)=SPAT(IX,1)
          XYPOS2(1,1)=XYPOS(1,1)*XYPOS(1,1)
*----
*  FIND IF ANNULUS LEFT, RIGHT OR INTERSECT CURRENT X-PLANE
*  AND COMPUTE
*    SPXY      THE  ANNULAR SURFACE LEFT OF CURRENT PLANE
*    SIXY(1,1) THE INTERSECTION BETWEEN THE PART OF THE ANNULUS
*              THE LEFT OF X-PLANE
*              AND THE PART OF THE ANNULUS AT
*              THE BOTTOM OF CURRENT Y-PLANE
*    SIXY(1,2) THE INTERSECTION BETWEEN THE PART OF THE ANNULUS
*              THE LEFT OF X-PLANE
*              AND THE PART OF THE ANNULUS AT
*              THE TOP OF PREVIOUS Y-PLANE
*  IF ANNULUS TO THE LEFT OF CURRENT PLANE (XYPOS(1,1)>= RANN)
*    IRPY(1,1)=-1
*    SPXY(1,1)=SURANN
*    SIXY(1,1)=SPXY(2,1)
*    SIXY(1,2)=SPXY(2,2)
*  IF ANNULUS TO THE RIGHT OF CURRENT (XYPOS(1,1)<= -RANN)
*    IRPY(1,1)= 1
*    SPXY(1,1)=0.0
*    SIXY(1,1)=0.0
*    SIXY(1,2)=0.0
*  IF ANNULUS INTERSECT CURRENT PLANE ( -RANN < XYPOS(1,1) < RANN)
*    IRPY(1,1)= 0
*    SPXY=XELPSC(RANN,XYPOS(1,1))
*    SIXY(1,1)=GEOPSI(1,RANN2,XYPOS,XYPOS2,SPXY)
*    SIXY(1,2)=GEOPSI(2,RANN2,XYPOS,XYPOS2,SPXY)
*----
          SPXY(1,1)=DZERO
          SIXY(1,1)=DZERO
          SIXY(1,2)=DZERO
          IF(XYPOS(1,1) .GE. RANN) THEN
            IRP(1,1)=-1
            SPXY(1,1)=SURANN
            SIXY(1,1)=SPXY(2,1)
            SIXY(1,2)=SPXY(2,2)
          ELSE IF(XYPOS(1,1) .LE. -RANN) THEN
            IRP(1,1)=1
          ELSE
            IRP(1,1)=0
            SPXY(1,1)=XELPSC(RANN,XYPOS(1,1))
            IF(IRP(2,1) .EQ. 0)
     >        SIXY(1,1)=XELPSI(1,RANN2,XYPOS,XYPOS2,SPXY)
            IF(IRP(2,2) .EQ. 0)
     >        SIXY(1,2)=XELPSI(2,RANN2,XYPOS,XYPOS2,SPXY)
          ENDIF
*----
*  FOR LAST PLANE IN X DIRECTION OR
*  X-PLANE TO THE RIGHT OF ANNULAR VOLUME
*  GO TO LABEL 121
*----
          IF(IX .EQ. NMX .OR. IRP(1,1) .EQ. -1) GO TO 121
*----
*  GET SURFACE INTERSECTION BETWEEN ANNULUS AND CARTESIAN REGION
*  LOCATED BETWEEN X-PLANES (IX-> IX+1) AND Y-PLANES (IX -> IY+1)
*  AND STORE IN AREAI(IX,IY)
*----
            AREAI(IX,IY)=SURANN
     >       -SPXY(1,1)-SPXY(1,2)-SPXY(2,1)-SPXY(2,2)
     >       +SIXY(1,1)+SIXY(2,1)+SIXY(1,2)+SIXY(2,2)
*----
*  WHEN ANNULUS ALL LOCATED TO THE RIGHT OF CURRENT X-PLANE
*  EXIT FROM IX LOOP BY GOING TO LABLE 122
*---
          IF(IRP(1,1) .EQ. 1) GO TO 122
 121      CONTINUE
*----
*  RESET IN LOCATION 2 VALUES COMPUTED WITH LOCATION 1
*  WITH ADEQUATE CHANGE OF SIGN FOR SURFACE DIRECTION
*  NAMELY SURFACES LOCATED ON THE LEFT OF X-PLANE BECOME SURFACES
*  LOCATED ON THE RIGHT OF X-PLANE
*----
          SIXY(2,1)=SPXY(2,1)-SIXY(1,1)
          SIXY(2,2)=SPXY(2,2)-SIXY(1,2)
          XYPOS(1,2)=XYPOS(1,1)
          XYPOS2(1,2)=XYPOS2(1,1)
          IRP(1,2)=-IRP(1,1)
          SPXY(1,2)=SURANN-SPXY(1,1)
 120    CONTINUE
 122    CONTINUE
*----
*  WHEN ANNULUS ALL LOCATED ABOVE CURRENT Y-PLANE
*  EXIT FROM IY LOOP BY GOING TO LABLE 112
*---
        IF(IRP(2,1) .EQ. 1) GO TO 112
 111    CONTINUE
*----
*  RESET IN LOCATION 2 VALUES COMPUTED WITH LOCATION 1
*  WITH ADEQUATE CHANGE OF SIGN FOR SURFACE DIRECTION
*  NAMELY SURFACES LOCATED ON THE BELOW Y-PLANE BECOME SURFACES
*  LOCATED ABOVE Y-PLANE
*----
        XYPOS(2,2)=XYPOS(2,1)
        XYPOS2(2,2)=XYPOS2(2,1)
        IRP(2,2)=-IRP(2,1)
        SPXY(2,2)=SURANN-SPXY(2,1)
 110  CONTINUE
 112  CONTINUE
*----
*  PRINT SURFACE INTERSECTIONS IF REQUIRED
*-----
      IF(IPRINT.GE.10) THEN
        WRITE(IOUT,6002) 'CART-ANN AREA   '
        WRITE(IOUT,6003) ((AREAI(IX,IY),IX=1,NRSPX),IY=1,NRSPY)
        WRITE(IOUT,6001)
      ENDIF
*----
*  RETURN
*----
      RETURN
*----
*  PRINT FORMAT
*----
 6000 FORMAT(/5X,'------ OUTPUT FROM XELCRN ------ ')
 6001 FORMAT(5X,' -------------------------------- '/)
 6002 FORMAT(5X,A16)
 6003 FORMAT(1P,5E16.6)
      END