summaryrefslogtreecommitdiff
path: root/Dragon/src/CPOLGX.f
blob: ac5e44bae3aecedab79e068641da5cad920e7c44 (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
*DECK CPOLGX
      SUBROUTINE CPOLGX(IPLIB ,IGS   ,IPRINT,IORD  ,NGROUP,INDPRO,
     >                  XSREC ,ITYPRO)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Get/save standard vectorial cross section data from/on IPLIB.
*
*Copyright:
* Copyright (C) 2007 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): G. Marleau
*
*Parameters: input
* IPLIB   pointer to the internal library.
* IGS     get or save flag:
*         >0 save;
*         <0 get.
* IPRINT  Print level (cross sections printed if IPRINT>99).
* IORD    cross section order:
*         =1 constant;
*         =2 linear;
*         =3 quadratic.
* NGROUP  number of energy groups.
* INDPRO  vector for cross section to process:
*         =0 do not process;
*         >0 process.
*
*Parameters: input/output
* XSREC   cross section table.
*
*Parameters: output
* ITYPRO  vector for cross section processed indices:
*         =0 absent  (not processed);
*         >0 present (processed).
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER          NDPROC
      PARAMETER       (NDPROC=20)
      TYPE(C_PTR)      IPLIB
      INTEGER          IGS,IPRINT,IORD,NGROUP,INDPRO(NDPROC),
     >                 ITYPRO(NDPROC)
      REAL             XSREC(NGROUP,NDPROC)
*----
*  LOCAL PARAMETERS
*  NDPROC = NUMBER OF DEFAULT CROSS SECTIONS = 20
*  NAMDXS = NAME OF NDPROC DEFAULT XS
*----
      INTEGER          IOUT
      PARAMETER       (IOUT=6)
      CHARACTER        NAMDXS(NDPROC)*6,NORD*6,TEXT6*6,TEXT12*12,NAMT*12
      INTEGER          IODIV,LONG,ITYP,IXSR,IXSTN,IG,JG
      SAVE             NAMDXS
      DATA    NAMDXS  /'NTOT0 ','TRANC ','NUSIGF','NFTOT ','CHI   ',
     >                 'NU    ','NG    ','NHEAT ','N2N   ','N3N   ',
     >                 'N4N   ','NP    ','NA    ','GOLD  ','ABS   ',
     >                 'NWT0  ','STRD  ','STRD X','STRD Y','STRD Z'/
      IODIV=0
      IF(IORD.EQ.1) THEN
        NORD='      '
        IODIV=1
      ELSE IF(IORD.EQ.2) THEN
        NORD='   LIN'
        IODIV=2
      ELSE IF(IORD.EQ.3) THEN
        NORD='   QUA'
        IODIV=4
      ENDIF
*----
*  READ/INITIALIZE STATE VECTOR
*----
      CALL LCMLEN(IPLIB,'XS-SAVED',LONG,ITYP)
      IF(LONG.EQ.NDPROC) THEN
        CALL LCMGET(IPLIB,'XS-SAVED',ITYPRO)
      ELSE IF(LONG.EQ.0) THEN
        ITYPRO(:NDPROC)=0
        NAMT=' '
        CALL LCMNXT(IPLIB,NAMT)
        TEXT12=NAMT
   80   CALL LCMLEN(IPLIB,NAMT,LONG,ITYP)
        IF(ITYP.EQ.2) THEN
           DO 90 IXSR=1,NDPROC
           IF(NAMT(:6).EQ.NAMDXS(IXSR)) ITYPRO(IXSR)=1
   90      CONTINUE
        ENDIF
        CALL LCMNXT(IPLIB,NAMT)
        IF(NAMT.NE.TEXT12) GO TO 80
      ELSE
        WRITE(IOUT,9000) NDPROC,LONG
        CALL XABORT('CPOLGX: INVALID VALUE FOR NDPROC')
      ENDIF
      IF(IGS.GT.0) THEN
*----
*  SAVE LOCAL DEFAULT XS IF REQUIRED
*----
        IF(IGS.EQ.1) THEN
          DO 100 IXSR=1,NDPROC
            TEXT6=NAMDXS(IXSR)
            IF(IXSR.EQ.1) TEXT6='TOTAL'
            IF(INDPRO(IXSR).EQ.1) THEN
              IXSTN=MOD(ITYPRO(IXSR)/IODIV,2)
*----
*  FIND IF XS NOT ALL 0.0
*----
              DO 110 IG=1,NGROUP
                IF(XSREC(IG,IXSR).NE.0.0) THEN
                  IF(IXSTN.EQ.0) THEN
                    ITYPRO(IXSR)=ITYPRO(IXSR)+IODIV
                    IXSTN=1
                  ENDIF
                  GO TO 115
                ENDIF
 110          CONTINUE
 115          CONTINUE
              IF((IXSTN.NE.0).OR.(IXSR.EQ.2)) THEN
                CALL LCMPUT(IPLIB,TEXT6//NORD,NGROUP,2,XSREC(1,IXSR))
              ENDIF
            ENDIF
 100      CONTINUE
        ENDIF
        CALL LCMPUT(IPLIB,'XS-SAVED',NDPROC,1,ITYPRO)
      ELSE
*----
*  GET LOCAL DEFAULT XS IF REQUIRED
*----
        IF(IGS.EQ.-1) THEN
          DO 200 IXSR=1,NDPROC
            TEXT6=NAMDXS(IXSR)
            IF(IXSR.EQ.1) TEXT6='NTOT0'
            IF(INDPRO(IXSR).EQ.1) THEN
              IXSTN=MOD(ITYPRO(IXSR)/IODIV,2)
*----
*  READ IF IXSTN = 1
*  INITIALIZE TO 0.0 IF IXSTN = 0
*----
              IF(IXSTN.EQ.1) THEN
                CALL LCMLEN(IPLIB,TEXT6//NORD,LONG,ITYP)
                IF(LONG .EQ. 0) THEN 
                  XSREC(:NGROUP,IXSR)=0.0
                ELSE
                  CALL LCMGET(IPLIB,TEXT6//NORD,XSREC(1,IXSR))
                ENDIF
              ELSE
                XSREC(:NGROUP,IXSR)=0.0
              ENDIF
            ENDIF
 200      CONTINUE
        ENDIF
      ENDIF
      IF(IPRINT .GE. 100) THEN
*----
*  Print XS
*----
        DO IXSR=1,NDPROC
          IF(INDPRO(IXSR).EQ.1) THEN
            IXSTN=MOD(ITYPRO(IXSR)/IODIV,2)
            IF(IXSTN.NE.0) THEN
              DO IG=1,NGROUP
                IF(XSREC(IG,IXSR).NE.0.0) THEN
                  WRITE(IOUT,6000) NAMDXS(IXSR)//NORD
                  WRITE(IOUT,6010) (XSREC(JG,IXSR),JG=1,NGROUP)
                  GO TO 210
                ENDIF
              ENDDO
            ENDIF
 210        CONTINUE
          ENDIF
        ENDDO
      ENDIF
      RETURN
*----
*  ABORT FORMAT
*----
 9000 FORMAT(' CPOLGX: ****** ABORT ******'/
     >       ' INVALID LENGTH OF RECORD XS-SAVED '/
     >       ' STORAGE SPACE NDPROC   = ',I10/
     >       ' LENGTH OF RECORD LONG  = ',I10/
     >       ' ***************************')
 6000 FORMAT(/' CROSS SECTION TYPE    = ',A12)
 6010 FORMAT(1P,5E16.7)
      END