summaryrefslogtreecommitdiff
path: root/Trivac/src/FLDARN.f
blob: 471e250c9d792e6da3ed95d4ad595b755433f23f (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
*DECK FLDARN
      SUBROUTINE FLDARN (FLDATV,IPTRK,IPSYS,IPFLUX,LL4,NUN,NGRP,LMOD,
     1 IBLSZ,ADJ,IMPX,EPSOUT,MAXOUT,EVECT,FKEFFV)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Solution of a multigroup eigenvalue system for the calculation of the
* LMOD first orthogonal harmonics of the diffusion or SPN equation.
* Use the implicit restarted Arnoldi method (IRAM).
*
*Copyright:
* Copyright (C) 2020 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
* FLDATV  function pointer for the multiplication of A^(-1)B times the
*         harmonic flux
* IPTRK   L_TRACK pointer to the BIVAC tracking information.
* IPSYS   L_SYSTEM pointer to system matrices.
* IPFLUX  L_FLUX pointer to the solution.
* LL4     order of the system matrices.
* NUN     number of unknowns in each energy group.
* NGRP    number of energy groups.
* LMOD    number of orthogonal harmonics to compute.
* IBLSZ   block size of the Arnoldi Hessenberg matrix.
* ADJ     adjoint calculation flag.
* IMPX    print parameter: =0: no print; =1: minimum printing.
* EPSOUT  convergence criteria for the flux.
* MAXOUT  maximum number of outer iterations.
* EVECT   initial estimate of the unknown vector.
*
*Parameters: output
* EVECT   converged unknown vector.
* FKEFFV  effective multiplication factor of each harmonic.
*
*Reference:
* J. BAGLAMA, "Augmented Block Householder Arnoldi Method,"
* Linear Algebra Appl., 429, Issue 10, 2315-2334 (2008).
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPSYS,IPFLUX
      INTEGER LL4,NUN,NGRP,LMOD,IBLSZ,IMPX,MAXOUT
      LOGICAL ADJ
      REAL EPSOUT
      COMPLEX EVECT(NUN,NGRP,LMOD),FKEFFV(LMOD)
*----
*  LOCAL VARIABLES
*----
      INTERFACE
        FUNCTION FLDATV(F,N,IBLSZ,ITER,IPTRK,IPSYS,IPFLUX) RESULT(X)
          USE GANLIB
          INTEGER, INTENT(IN) :: N,IBLSZ,ITER
          REAL(KIND=8), DIMENSION(N,IBLSZ), INTENT(IN) :: F
          REAL(KIND=8), DIMENSION(N,IBLSZ) :: X
          TYPE(C_PTR) IPTRK,IPSYS,IPFLUX
        END FUNCTION FLDATV
      END INTERFACE
      REAL TIME(2)
      REAL(KIND=8) DEPSOUT
      CHARACTER(LEN=8) TEXT8
      TYPE(C_PTR) JPFLUX,KPFLUX,MPFLUX
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, ALLOCATABLE, DIMENSION(:) :: GAR
      COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:,:) :: V, D
*----
*  SCRATCH STORAGE ALLOCATION
*----
      N=LL4*NGRP
      ALLOCATE(V(N,LMOD),D(LMOD,LMOD),GAR(NUN))
*----
*  SET TIMER
*----
*     TIME(1) : CPU TIME FOR THE SOLUTION OF LINEAR SYSTEMS.
*     TIME(2) : CPU TIME FOR BILINEAR PRODUCT EVALUATIONS.
      TIME(1)=0.0
      TIME(2)=0.0
      CALL LCMPUT(IPFLUX,'CPU-TIME',2,2,TIME)
*----
*  FLUX INITIALIZATION
*----
      DO IMOD=1,LMOD
        V(:N,IMOD)=1.0D0
        V(1:MIN(IBLSZ,IMOD)-1,IMOD)=0.0D0
      ENDDO
      CALL LCMLEN(IPFLUX,'MODE',ILONG,ITYLCM)
      IF(ILONG.GT.0) THEN
        DO IMOD=1,LMOD
          JPFLUX=LCMGID(IPFLUX,'MODE')
          CALL LCMLEL(JPFLUX,IMOD,ILONG,ITYLCM)
          IF(ILONG.EQ.0) CYCLE
          KPFLUX=LCMGIL(JPFLUX,IMOD)
          IF(ADJ) THEN
            CALL LCMLEN(KPFLUX,'AFLUX',LENA,ITYLCM)
            IF(LENA.EQ.0) CYCLE
            MPFLUX=LCMGID(KPFLUX,'AFLUX')
            DO IGR=1,NGRP
              IF(ITYLCM.EQ.2) THEN
                CALL LCMGDL(MPFLUX,IGR,GAR)
                EVECT(:NUN,IGR,IMOD)=GAR(:NUN)
              ELSE IF(ITYLCM.EQ.6) THEN
                CALL LCMGDL(MPFLUX,IGR,EVECT(1,IGR,IMOD))
              ENDIF
            ENDDO
          ELSE
            CALL LCMLEN(KPFLUX,'FLUX',LEND,ITYLCM)
            IF(LEND.EQ.0) CYCLE
            MPFLUX=LCMGID(KPFLUX,'FLUX')
            DO IGR=1,NGRP
              IF(ITYLCM.EQ.2) THEN
                CALL LCMGDL(MPFLUX,IGR,GAR)
                EVECT(:NUN,IGR,IMOD)=GAR(:NUN)
              ELSE IF(ITYLCM.EQ.6) THEN
                CALL LCMGDL(MPFLUX,IGR,EVECT(1,IGR,IMOD))
              ENDIF
            ENDDO
          ENDIF
          DO IGR=1,NGRP
            DO IUN=1,LL4
              IOF=(IGR-1)*LL4+IUN
              V(IOF,IMOD)=EVECT(IUN,IGR,IMOD)
            ENDDO
          ENDDO
        ENDDO
      ENDIF
*----
*  CALL IRAM SOLVER
*----
      DEPSOUT=EPSOUT
      CALL ALBEIGS(FLDATV,N,IBLSZ,LMOD,MAXOUT,DEPSOUT,IMPX,ITER,V,D,
     1 IPTRK,IPSYS,IPFLUX)
      DO IMOD=1,LMOD
        FKEFFV(IMOD)=CMPLX(D(IMOD,IMOD),KIND=4)
        DO IGR=1,NGRP
          DO IUN=1,LL4
            IOF=(IGR-1)*LL4+IUN
            EVECT(IUN,IGR,IMOD)=CMPLX(V(IOF,IMOD),KIND=4)
          ENDDO
        ENDDO
      ENDDO
*----
*  PRINTOUTS
*----
      IF(IMPX.GE.1) THEN
        CALL LCMGET(IPFLUX,'CPU-TIME',TIME)
        WRITE (6,650) ITER,TIME(1),TIME(2),TIME(1)+TIME(2)
        WRITE (6,670) (FKEFFV(IMOD),IMOD=1,LMOD)
      ENDIF
      IF(IMPX.GE.3) THEN
        TEXT8=' DIRECT'
        IF(ADJ) TEXT8=' ADJOINT'
        DO IMOD=1,LMOD
          WRITE (6,'(/A8,13H HARMONIC NB.,I3/)') TEXT8,IMOD
          DO IGR=1,NGRP
            WRITE (6,680) IGR,(REAL(EVECT(I,IGR,IMOD)),I=1,LL4)
          ENDDO
        ENDDO
      ENDIF
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(GAR,D,V)
      RETURN
*
  650 FORMAT(/31H FLDARN: CONVERGENCE OF IRAM IN,I5,11H ITERATIONS/
     1 9X,54HCPU TIME USED TO SOLVE THE TRIANGULAR LINEAR SYSTEMS =,
     2 F10.3/23X,34HTO COMPUTE THE BILINEAR PRODUCTS =,F10.3,20X,
     3 16HTOTAL CPU TIME =,F10.3)
  670 FORMAT(//21H FLDARN: EIGENVALUES:/(5X,1P,E17.10,3H + ,E17.10,1Hi))
  680 FORMAT(43H FLDARN: EIGENVECTOR CORRESPONDING TO GROUP,I4//
     1 (5X,1P,8E14.5))
      END