summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBXS5.f
blob: 2a2bf2450a9e3ffe90d2cce63e1dd78134455d6c (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
*DECK LIBXS5
      SUBROUTINE LIBXS5(IG,NGBIN,IPAP,NSIGF,TT,NTEMPS,TEMPS,DELTF,
     1 SIGTF,SIGAF,SIGFF,DELINF,SGTINF,SGAINF,SGFINF)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Temperature interpolation of autolib (bin cross sections) information.
*
*Copyright:
* Copyright (C) 2014 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
* IG      coarse energy group under consideration.
* NGBIN   number of coarse energy groups.
* IPAP    APOLIB-XSM pointer.
* NSIGF   number of fine energy groups.
* TT      temperature of isotope.
* NTEMPS  number of tabulated temperatures.
* TEMPS   tabulated temperatures.
*
*Parameters: output
* DELTF   fine group lethargy widths.
* SIGTF   fine group total x-s.
* SIGAF   fine group absorption x-s.
* SIGFF   fine group fission x-s.
* DELINF  calculated lethargy width for group IG.
* SGTINF  calculated infinite-dilution total x-s for group IG.
* SGAINF  calculated infinite-dilution absorption x-s for group IG.
* SGFINF  calculated infinite-dilution fission x-s for group IG.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPAP
      INTEGER IG,NGBIN,NSIGF,NTEMPS
      REAL TT,TEMPS(NTEMPS),DELTF(NSIGF),SIGTF(NSIGF),SIGAF(NSIGF),
     1 SIGFF(NSIGF),DELINF,SGTINF,SGAINF
*----
*  LOCAL VARIABLES
*----
      CHARACTER HSMG*131,TEXT12*12
      PARAMETER (NINT=2,DTMIN=1.0)
      DOUBLE PRECISION D1,D2,D3,D4
      LOGICAL LOK
      REAL, ALLOCATABLE, DIMENSION(:) :: DT,DA,DF,DD
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: SQRTEM,WEIJHT
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(WEIJHT(NTEMPS),SQRTEM(NTEMPS))
*----
*  COMPUTE THE WEIGHTS.
*----
      DO 10 I=1,NTEMPS
      SQRTEM(I)=SQRT(TEMPS(I))
   10 CONTINUE
      IF(NTEMPS.EQ.1) THEN
        IPROX=1
        IGTFIX=1
      ELSE
        STT=SQRT(TT)
        CALL LIBA28(STT,SQRTEM,NTEMPS,NINT,WEIJHT,IORD,IPROX,I0)
        IF(ABS(TT-TEMPS(IPROX)).LE.DTMIN) THEN
          IGTFIX=1
        ELSEIF((STT.LT.SQRTEM(1)).OR.(STT.GT.SQRTEM(NTEMPS))) THEN
          WRITE(HSMG,'(A,F8.2,A,F8.2,A,F8.2)')
     1    'LIBXS5: A TEMPERATURE', TT,'K IS NOT INCLUDED BETWEEN ',
     2    TEMPS(1),' AND ',TEMPS(NTEMPS)
          WRITE(6,'(/1X,A)') HSMG
          IGTFIX=2
        ELSE
          IGTFIX=0
        ENDIF
      ENDIF
*----
*  LOOP OVER TABULATED TEMPERATURES.
*----
      ALLOCATE(DT(NSIGF),DA(NSIGF),DF(NSIGF),DD(NSIGF))
      D1=0.0D0
      SIGTF(:NSIGF)=0.0
      SIGAF(:NSIGF)=0.0
      SIGFF(:NSIGF)=0.0
      DO 50 J=1,IORD
      IT=I0+J
      WRITE(TEXT12,'(6HNTEMPS,I6.6)') IT
      CALL LCMSIX(IPAP,TEXT12,1)
      CALL LCMLEN(IPAP,'DELTF',NV,ITYLCM)
      CALL LCMLEN(IPAP,'SIGFF',NF,ITYLCM)
      IF(NV.NE.NSIGF) CALL XABORT('LIBXS5: INVALID NSIGF.')
      CALL LCMGET(IPAP,'SIGTF',DT)
      CALL LCMGET(IPAP,'SIGAF',DA)
      IF(NF.EQ.NSIGF) CALL LCMGET(IPAP,'SIGFF',DF)
      CALL LCMGET(IPAP,'DELTF',DD)
      CALL LCMSIX(IPAP,' ',2)
      IS=(IT-1)*NGBIN+IG
      IF(IT.EQ.I0+1) THEN
         D1=0.0D0
         DO 20 I=1,NSIGF
         DELTF(I)=DD(I)
         D1=D1+DELTF(I)
   20    CONTINUE
      ELSE
         LOK=.TRUE.
         DO 30 I=1,NSIGF
         LOK=LOK.AND.(DELTF(I).EQ.DD(I))
   30    CONTINUE
         IF(.NOT.LOK) CALL XABORT('LIBXS5: INVALID AUTOLIB MESH.')
      ENDIF
      DO 40 I=1,NSIGF
      SIGTF(I)=SIGTF(I)+REAL(WEIJHT(J)*DT(I))
      SIGAF(I)=SIGAF(I)+REAL(WEIJHT(J)*DA(I))
      IF(NF.EQ.NSIGF) SIGFF(I)=SIGFF(I)+REAL(WEIJHT(J)*DF(I))
   40 CONTINUE
   50 CONTINUE
      D2=0.0D0
      D3=0.0D0
      D4=0.0D0
      DO 60 I=1,NSIGF
      SIGTF(I)=MAX(SIGTF(I),0.0)
      SIGAF(I)=MAX(SIGAF(I),0.0)
      SIGFF(I)=MAX(SIGFF(I),0.0)
      D2=D2+SIGTF(I)*DELTF(I)
      D3=D3+SIGAF(I)*DELTF(I)
      D4=D4+SIGFF(I)*DELTF(I)
   60 CONTINUE
      DELINF=REAL(D1)
      SGTINF=REAL(D2/D1)
      SGAINF=REAL(D3/D1)
      SGFINF=REAL(D4/D1)
      DEALLOCATE(DT,DA,DF,DD)
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(SQRTEM,WEIJHT)
      RETURN
      END