summaryrefslogtreecommitdiff
path: root/Trivac/src/FLDDEF.f
blob: 84a87a01c10a40ffe84b73ef50b3d12682049878 (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
*DECK FLDDEF
      SUBROUTINE FLDDEF (MAX,IPTRK,IPSYS,LL4,ITY,NGRP,IMOD,LMOD,EVECT,
     1 ADECT,VEC,IADJ,VEA,VEB)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Multigroup Hotelling deflation procedure (1- multiplication of the
* 'A' matrix by a vector; 2- multiplication of a deflated 'B' matrix
* by the same vector).
*
*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
* MAX     first dimension of arrays EVECT, ADECT, VEC, VEA and VEB.
* IPTRK   L_TRACK pointer to the tracking information.
* IPSYS   L_SYSTEM pointer to system matrices.
* LL4     order of the system matrices.
* ITY     type of solution (2: classical Trivac; 3: Thomas-Raviart).
* NGRP    number of energy groups.
* IMOD    number of the harmonic to be deflated.
* LMOD    total number of harmonics.
* EVECT   direct eigenvector.
* ADECT   adjoint eigenvector.
* VEC     vector to be multiplied.
* IADJ    type of deflation:
*         =1 for a direct deflation; =2 for an adjoint deflation.
*
*Parameters: output
* VEA     result of the multiplication to the 'A' matrix.
* VEB     result of the multiplication to the 'B' matrix.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPSYS
      INTEGER MAX,LL4,ITY,NGRP,IMOD,LMOD,IADJ
      REAL EVECT(MAX,NGRP,LMOD),ADECT(MAX,NGRP,LMOD),VEC(MAX,NGRP),
     1 VEA(MAX,NGRP),VEB(MAX,NGRP)
*----
*  LOCAL VARIABLES
*----
      CHARACTER*12 TEXT12
      DOUBLE PRECISION DDELN1,DDELD1
      REAL, DIMENSION(:), ALLOCATABLE :: GAF,W
      REAL, DIMENSION(:), POINTER :: AGARM
      TYPE(C_PTR) AGARM_PTR
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(GAF(LL4))
*
      IF(IADJ.EQ.1) THEN
*        DIRECT CASE.
         DO 45 IGR=1,NGRP
         VEB(:LL4,IGR)=0.0
         DO 40 JGR=1,NGRP
         WRITE(TEXT12,'(1HB,2I3.3)') IGR,JGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 40
         CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
         CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
         DO 20 I=1,ILONG
         VEB(I,IGR)=VEB(I,IGR)+AGARM(I)*VEC(I,JGR)
   20    CONTINUE
   40    CONTINUE
   45    CONTINUE
         DO 132 JMOD=1,IMOD-1
         DDELN1=0.0D0
         DDELD1=0.0D0
         DO 125 IGR=1,NGRP
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
         CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,EVECT(1,IGR,JMOD),
     1   VEA(1,IGR))
         GAF(:LL4)=0.0
         DO 110 JGR=1,NGRP
         IF(JGR.EQ.IGR) GO TO 80
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 80
         IF(ITY.EQ.13) THEN
            ALLOCATE(W(LL4))
            CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,EVECT(1,JGR,JMOD),
     1      W(1))
            DO 50 I=1,LL4
            VEA(I,IGR)=VEA(I,IGR)-W(I)
   50       CONTINUE
            DEALLOCATE(W)
         ELSE
            CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
            CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
            DO 60 I=1,ILONG
            VEA(I,IGR)=VEA(I,IGR)-AGARM(I)*EVECT(I,JGR,JMOD)
   60       CONTINUE
         ENDIF
   80    WRITE(TEXT12,'(1HB,2I3.3)') JGR,IGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 110
         CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
         CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
         DO 90 I=1,ILONG
         GAF(I)=GAF(I)+AGARM(I)*ADECT(I,JGR,JMOD)
   90    CONTINUE
  110    CONTINUE
         DO 120 I=1,LL4
         DDELN1=DDELN1+GAF(I)*VEC(I,IGR)
         DDELD1=DDELD1+ADECT(I,IGR,JMOD)*VEA(I,IGR)
  120    CONTINUE
  125    CONTINUE
         DDELN1=DDELN1/DDELD1
         DO 131 IGR=1,NGRP
         DO 130 I=1,LL4
         VEB(I,IGR)=VEB(I,IGR)-VEA(I,IGR)*REAL(DDELN1)
  130    CONTINUE
  131    CONTINUE
  132    CONTINUE
         DO 165 IGR=1,NGRP
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
         CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,VEC(1,IGR),VEA(1,IGR))
         DO 160 JGR=1,NGRP
         IF(JGR.EQ.IGR) GO TO 160
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 160
         IF(ITY.EQ.13) THEN
            ALLOCATE(W(LL4))
            CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,VEC(1,JGR),W(1))
            DO 135 I=1,LL4
            VEA(I,IGR)=VEA(I,IGR)-W(I)
  135       CONTINUE
            DEALLOCATE(W)
         ELSE
            CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
            CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
            DO 140 I=1,ILONG
            VEA(I,IGR)=VEA(I,IGR)-AGARM(I)*VEC(I,JGR)
  140       CONTINUE
         ENDIF
  160    CONTINUE
  165    CONTINUE
      ELSE IF(IADJ.EQ.2) THEN
*        ADJOINT CASE.
         DO 205 IGR=1,NGRP
         VEB(:LL4,IGR)=0.0
         DO 200 JGR=1,NGRP
         WRITE(TEXT12,'(1HB,2I3.3)') JGR,IGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 200
         CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
         CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
         DO 180 I=1,ILONG
         VEB(I,IGR)=VEB(I,IGR)+AGARM(I)*VEC(I,JGR)
  180    CONTINUE
  200    CONTINUE
  205    CONTINUE
         DO 292 JMOD=1,IMOD-1
         DDELN1=0.0D0
         DDELD1=0.0D0
         DO 285 IGR=1,NGRP
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
         CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,ADECT(1,IGR,JMOD),
     1   VEA(1,IGR))
         GAF(:LL4)=0.0
         DO 270 JGR=1,NGRP
         IF(JGR.EQ.IGR) GO TO 240
         WRITE(TEXT12,'(1HA,2I3.3)') JGR,IGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 240
         IF(ITY.EQ.13) THEN
            ALLOCATE(W(LL4))
            CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,ADECT(1,JGR,JMOD),
     1      W(1))
            DO 210 I=1,LL4
            VEA(I,IGR)=VEA(I,IGR)-W(I)
  210       CONTINUE
            DEALLOCATE(W)
         ELSE
            CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
            CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
            DO 220 I=1,ILONG
            VEA(I,IGR)=VEA(I,IGR)-AGARM(I)*ADECT(I,JGR,JMOD)
  220       CONTINUE
         ENDIF
  240    WRITE(TEXT12,'(1HB,2I3.3)') IGR,JGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 270
         CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
         CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
         DO 250 I=1,ILONG
         GAF(I)=GAF(I)+AGARM(I)*EVECT(I,JGR,JMOD)
  250    CONTINUE
  270    CONTINUE
         DO 280 I=1,LL4
         DDELN1=DDELN1+GAF(I)*VEC(I,IGR)
         DDELD1=DDELD1+EVECT(I,IGR,JMOD)*VEA(I,IGR)
  280    CONTINUE
  285    CONTINUE
         DDELN1=DDELN1/DDELD1
         DO 291 IGR=1,NGRP
         DO 290 I=1,LL4
         VEB(I,IGR)=VEB(I,IGR)-VEA(I,IGR)*REAL(DDELN1)
  290    CONTINUE
  291    CONTINUE
  292    CONTINUE
         DO 325 IGR=1,NGRP
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
         CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,VEC(1,IGR),VEA(1,IGR))
         DO 320 JGR=1,NGRP
         IF(JGR.EQ.IGR) GO TO 320
         WRITE(TEXT12,'(1HA,2I3.3)') JGR,IGR
         CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
         IF(ILONG.EQ.0) GO TO 320
         IF(ITY.EQ.13) THEN
            ALLOCATE(W(LL4))
            CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,VEC(1,JGR),W(1))
            DO 295 I=1,LL4
            VEA(I,IGR)=VEA(I,IGR)-W(I)
  295       CONTINUE
            DEALLOCATE(W)
         ELSE
            CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR)
            CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /))
            DO 300 I=1,ILONG
            VEA(I,IGR)=VEA(I,IGR)-AGARM(I)*VEC(I,JGR)
  300       CONTINUE
         ENDIF
  320    CONTINUE
  325    CONTINUE
      ENDIF
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(GAF)
      RETURN
      END