summaryrefslogtreecommitdiff
path: root/Trivac/src/TRICHP.f
blob: b518acfa72762b3975aaf00d1c18a9fdf3eb1027 (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
*DECK TRICHP
      SUBROUTINE TRICHP(IEL,LX,LY,LZ,L4,MAT,KN,MUX,MUY,MUZ,IPY,IPZ,
     1 IMPX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Primal finite element unknown numbering for ADI solution in a 3D
* domain. Compute the storage info for ADI matrices in compressed
* diagona storage mode. Compute the ADI permutation vectors.
*
*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
* IMPX    print parameter.
* LX      number of elements along the X axis.
* LY      number of elements along the Y axis.
* LZ      number of elements along the Z axis.
* IEL     degree of the Lagrangian finite elements. =1 (linear);
*         =2 (parabolic); =3 (cubic); =4 (quartic).
* L4      total number of unknown (variational coefficients) per
*         energy group (order of system matrices).
* MAT     mixture index assigned to each element.
* KN      element-ordered unknown list.
*
*Parameters: output
* MUX     X-directed compressed diagonal storage mode indices.
* MUY     Y-directed compressed diagonal storage mode indices.
* MUZ     Z-directed compressed diagonal storage mode indices.
* IPY     Y-directed permutation vectors.
* IPZ     Z-directed permutation vectors.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER IEL,LX,LY,LZ,L4,MAT(LX*LY*LZ),KN(LX*LY*LZ*(IEL+1)**3),
     1 MUX(L4),MUY(L4),MUZ(L4),IPY(L4),IPZ(L4),IMPX
*----
*  LOCAL VARIABLES
*----
      INTEGER IJ1(125),IJ2(125),IJ3(125)
      INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: IWRK
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(IWRK(LX*IEL+1,LY*IEL+1,LZ*IEL+1))
*
      LC=IEL+1
      LL=LC*LC*LC
      DO 5 L=1,LL
      L1=1+MOD(L-1,LC)
      L2=1+(L-L1)/LC
      L3=1+MOD(L2-1,LC)
      IJ1(L)=L1
      IJ2(L)=L3
      IJ3(L)=1+(L2-L3)/LC
    5 CONTINUE
*----
*  JUXTAPOSITION OF A CHECKERBOARD OVER A PLANE IN THE REACTOR
*----
      L2M=0
      LZTOT=LZ*(LC-1)+1
      LYTOT=LY*(LC-1)+1
      LXTOT=LX*(LC-1)+1
      DO 12 K=1,LZTOT
      DO 11 J=1,LYTOT
      DO 10 I=1,LXTOT
      IWRK(I,J,K)=0
   10 CONTINUE
   11 CONTINUE
   12 CONTINUE
      NUM1=0
      KEL=0
      DO 32 K0=1,LZ
      LK0=(K0-1)*(LC-1)
      DO 31 K1=1,LY
      LK1=(K1-1)*(LC-1)
      DO 30 K2=1,LX
      KEL=KEL+1
      IF(MAT(KEL).EQ.0) GO TO 30
      L2M=L2M+1
      LK2=(K2-1)*(LC-1)
      L=0
      DO 22 IK0=LK0+1,LK0+LC
      DO 21 IK1=LK1+1,LK1+LC
      DO 20 IK2=LK2+1,LK2+LC
      L=L+1
      IND1=KN(NUM1+L)
      IF(IND1.EQ.0) GO TO 20
      IF(IWRK(IK2,IK1,IK0).EQ.0) THEN
         IWRK(IK2,IK1,IK0)=IND1
      ELSE IF(IWRK(IK2,IK1,IK0).NE.IND1) THEN
         CALL XABORT('TRICHP: FAILURE OF THE RENUMBERING ALGORITHM(1).')
      ENDIF
   20 CONTINUE
   21 CONTINUE
   22 CONTINUE
      NUM1=NUM1+LL
   30 CONTINUE
   31 CONTINUE
   32 CONTINUE
*----
*  CALCULATION OF PERMUTATION VECTORS IPY AND IPZ
*----
      DO 40 I=1,L4
      IPY(I)=0
      IPZ(I)=0
   40 CONTINUE
      INEW=0
      DO 52 K0=1,LZTOT
      DO 51 K2=1,LXTOT
      IF(IWRK(K2,1,K0).EQ.IWRK(K2,LC,K0)) THEN
         K1MIN=1+LC/2
      ELSE
         K1MIN=1
      ENDIF
      DO 50 K1=K1MIN,LYTOT
      I=IWRK(K2,K1,K0)
      IF(I.EQ.0) GO TO 50
      IF(IPY(I).EQ.0) THEN
         INEW=INEW+1
         IPY(I)=INEW
      ENDIF
   50 CONTINUE
   51 CONTINUE
   52 CONTINUE
      IF(INEW.NE.L4) THEN
         CALL XABORT('TRICHP: FAILURE OF THE RENUMBERING ALGORITHM(2).')
      ENDIF
      INEW=0
      DO 72 K1=1,LYTOT
      DO 71 K2=1,LXTOT
      IF(IWRK(K2,K1,1).EQ.IWRK(K2,K1,LC)) THEN
         K0MIN=1+LC/2
      ELSE
         K0MIN=1
      ENDIF
      DO 70 K0=K0MIN,LZTOT
      I=IWRK(K2,K1,K0)
      IF(I.EQ.0) GO TO 70
      IF(IPZ(I).EQ.0) THEN
         INEW=INEW+1
         IPZ(I)=INEW
      ENDIF
   70 CONTINUE
   71 CONTINUE
   72 CONTINUE
      IF(INEW.NE.L4) THEN
         CALL XABORT('TRICHP: FAILURE OF THE RENUMBERING ALGORITHM(3).')
      ENDIF
*----
*  CALCULATION OF VECTORS MUX, MUY AND MUZ
*----
      DO 100 I=1,L4
      MUX(I)=1
      MUY(I)=1
      MUZ(I)=1
  100 CONTINUE
      NUM1=0
      DO 130 K=1,L2M
      DO 120 I=1,LL
      INX1=KN(NUM1+I)
      IF(INX1.EQ.0) GO TO 120
      INY1=IPY(INX1)
      INZ1=IPZ(INX1)
      DO 110 J=1,LL
      INX2=KN(NUM1+J)
      IF(INX2.EQ.0) GO TO 110
      INY2=IPY(INX2)
      INZ2=IPZ(INX2)
      IF((IJ2(I).EQ.IJ2(J)).AND.(IJ3(I).EQ.IJ3(J)).AND.(INX2.LT.INX1))
     1 THEN
         MUX(INX1)=MAX0(MUX(INX1),INX1-INX2+1)
      ELSE IF((IJ1(I).EQ.IJ1(J)).AND.(IJ3(I).EQ.IJ3(J)).AND.
     1 (INY2.LT.INY1)) THEN
         MUY(INY1)=MAX0(MUY(INY1),INY1-INY2+1)
      ELSE IF((IJ1(I).EQ.IJ1(J)).AND.(IJ2(I).EQ.IJ2(J)).AND.
     1 (INZ2.LT.INZ1)) THEN
         MUZ(INZ1)=MAX0(MUZ(INZ1),INZ1-INZ2+1)
      ENDIF
  110 CONTINUE
  120 CONTINUE
      NUM1=NUM1+LL
  130 CONTINUE
*
      MUXMAX=0
      MUYMAX=0
      MUZMAX=0
      IIMAXX=0
      IIMAXY=0
      IIMAXZ=0
      DO 140 I=1,L4
      MUXMAX=MAX(MUXMAX,MUX(I))
      MUYMAX=MAX(MUYMAX,MUY(I))
      MUZMAX=MAX(MUZMAX,MUZ(I))
      IIMAXX=IIMAXX+MUX(I)
      MUX(I)=IIMAXX
      IIMAXY=IIMAXY+MUY(I)
      MUY(I)=IIMAXY
      IIMAXZ=IIMAXZ+MUZ(I)
      MUZ(I)=IIMAXZ
  140 CONTINUE
      IF(IMPX.GT.0) WRITE (6,500) MUXMAX,MUYMAX,MUZMAX
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(IWRK)
      RETURN
*
  500 FORMAT(/52H TRICHP: MAXIMUM BANDWIDTH FOR X-ORIENTED MATRICES =,
     1 I4/27X,25HFOR Y-ORIENTED MATRICES =,I4/27X,16HFOR Z-ORIENTED M,
     2 9HATRICES =,I4)
      END