summaryrefslogtreecommitdiff
path: root/Dragon/src/SYB4VO.f
blob: e92c3d4dd6a8482b58e0a982a4cf6f1f067b0b9d (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
*DECK SYB4VO
      SUBROUTINE SYB4VO(NSECT,NR,DX,DY,RAD,VOLINT)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute the volumes of a Cartesian sectorized cell.
*
*Copyright:
* Copyright (C) 2002 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): A. Hebert
*
*Parameters: input
* NSECT   number of sectors (multiple of 4).
* NR      one plus the number of tubes.
* DX      X-oriented side.
* DY      Y-oriented side.
* RAD     radius of the tubes.
*
*Parameters: output
* VOLINT  volumes.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER   NSECT,NR
      REAL      DX,DY,RAD(NR-1),VOLINT(NSECT,NR)
*
      IF(MOD(4+NSECT,4).NE.0) CALL XABORT('SYB4VO: INVALID NSECT.')
      DDX = DX / 2.
      DDY = DY / 2.
      RADDD = SQRT(DDX*DDX + DDY*DDY)
      TETA0 = 3.14159265358979 * 2. / REAL(NSECT)
*----
*  ITER=1 IS FOR (0, PI/4) AND ITER=2 IS FOR (PI/2, PI/4)
*----
      DO 15 IR=1,NR
      DO 10 IS=1,NSECT
      VOLINT(IS,IR)=0.0
   10 CONTINUE
   15 CONTINUE
      DO 60 ITER=1,2
      IF(ITER.EQ.1) THEN
         ISA = 1
         ISB = 0
         DDXY=DDX
      ELSE
         ISA = - 1
         ISB = NSECT/4 + 1
         DDXY=DDY
      ENDIF
*
      TETAC = ACOS(DDXY / RADDD)
      TETA2   = 0.
      DO 20 IR = 1, NR-1
      IF (RAD(IR) .GT. DDXY) THEN
         IRNEXT = IR
         GOTO 30
      ENDIF
   20 CONTINUE
      IRNEXT = NR
*----
*  IRNEXT : NEXT RADIUS INTERCEPTING A SIDE
*  DDY2   : LAST PROCESSED COORDINATE
*  ISNEXT : NEXT SECTOR
*----
   30 DDY2   = 0.
      ISNEXT = 1
*----
*  NEXT SECTOR
*----
   40 IS = ISNEXT
      IF (IS .NE. 0) THEN
         ISV   = ISA * IS + ISB
         IR0   = IRNEXT
         DDY1  = DDY2
         TETA1 = TETA2
         TETA2 = IS * TETA0
*
*        THE ANGLE IS LIMITED BY THE DIAGONAL.
         IF (TETA2 .GE. (TETAC - 1.E-6)) THEN
            ISNEXT = 0
            TETA2  = TETAC
            RAD2 = RADDD
         ELSE
            ISNEXT = IS + 1
            RAD2 = DDXY / COS(TETA2)
         ENDIF
*
*        THE NEXT RADIUS IS INTERCEPTING THE SECTOR.
         IF (IR0 .LT. NR) THEN
            RADIR = RAD(IR0)
            IF (RADIR .LT. (RAD2 * (1. - 1.E-6))) THEN
               RAD2 = RADIR
               TETA2 = ACOS(DDXY / RAD2)
               IRNEXT = IR0 + 1
               ISNEXT = IS
            ELSE IF (RADIR .LE. (RAD2 * (1. + 1.E-6))) THEN
*              THE NEXT RADIUS IS EQUAL TO THE SECTOR.
               IRNEXT = IR0 + 1
            ENDIF
         ENDIF
*
*        DDY2 IS THE NEXT COORDINATE AND DT IS HALF THE ANGLE
*        INCREMENT FOR THE SECTOR.
         DDY2 = RAD2 * SIN(TETA2)
         DT = (TETA2 - TETA1) * 0.5
*
*        COMPLETE TUBES.
         R1 = 0.
         DO 50 IR = 1, IR0 - 1
         R0 = R1
         R1 = RAD(IR)
         DR = (R1 - R0) * (R1 + R0)
         VOLINT(ISV, IR) = VOLINT(ISV, IR) + DT * DR
   50    CONTINUE
*
*        LAST SIDE-INTERCEPTED TUBE.
         VOLMAX = DDXY * 0.5 * (DDY2 - DDY1)
         VOLMAX = VOLMAX - DT * R1 * R1
         VOLINT(ISV, IR0) = VOLINT(ISV, IR0) + VOLMAX
         GOTO 40
      ENDIF
   60 CONTINUE
*
      DO 90 IR=1,NR
      DO 70 IS=NSECT/4+1,NSECT/2
      VOLINT(IS,IR)=VOLINT(NSECT/2-IS+1,IR)
   70 CONTINUE
      DO 80 IS=NSECT/2+1,NSECT
      VOLINT(IS,IR)=VOLINT(NSECT-IS+1,IR)
   80 CONTINUE
   90 CONTINUE
      RETURN
      END