summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBMIX.f
blob: 1a800bc7337667ff75fa736449abd64954168591 (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
*DECK LIBMIX
      SUBROUTINE LIBMIX(IPLIB,NBMIX,NGROUP,NBISO,ISONAM,MIX,DEN,MASK,
     1 MASKL,ITSTMP,TMPDAY)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Transformation of the isotope ordered microscopic cross sections to
* group ordered macroscopic cross sections (part 1).
*
*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
* IPLIB   pointer to the lattice microscopic cross section library
*         (L_LIBRARY signature).
* NBMIX   number of material mixtures.
* NGROUP  number of energy groups.
* NBISO   number of isotopes present in the calculation domain.
* ISONAM  names of microlib isotopes.
* MIX     mixture number of each isotope (can be zero).
* DEN     density of each isotope.
* MASK    mixture mask (=.true. if a mixture is to be made).
* MASKL   group mask (=.true. if an energy group is to be treated).
* ITSTMP  type of cross section perturbation (=0 perturbation
*         forbidden; =1 perturbation not used even if present;
*         =2 perturbation used if present).
* TMPDAY  time stamp in day/burnup/irradiation.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPLIB
      INTEGER NBMIX,NGROUP,NBISO,ISONAM(3,NBISO),MIX(NBISO),ITSTMP
      REAL DEN(NBISO),TMPDAY(3)
      LOGICAL MASK(NBMIX),MASKL(NGROUP)
*----
*  LOCAL VARIABLES
*----
      INTEGER NBLK,NSTATE
      PARAMETER (NBLK=50,NSTATE=40)
      LOGICAL LSAME,LSTOPW
      INTEGER ISTATE(NSTATE),I,IPROB,ITRANC,LENGTH,ITYLCM,MAXNFI,NBESP,
     1 NDEL,NED,NESP,NFISSI,NL,NPART,STERN
      CHARACTER TEXT12*12,HPRT1*1
      REAL OLDTIM(3)
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: JNED
      TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPISO
*----
*  RECOVER SOME LIBRARY PARAMETERS.
*----
      CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE)
      NL=ISTATE(4)
      ITRANC=ISTATE(5)
      IPROB=ISTATE(6)
      NED=ISTATE(13)
      NBESP=ISTATE(16)
      NDEL=ISTATE(19)
      NPART=ISTATE(26)
      STERN=ISTATE(27)
      ALLOCATE(JNED(2*NED))
      IF(NED.GT.0) CALL LCMGET(IPLIB,'ADDXSNAME-P0',JNED)
*----
*  LOOK FOR OLD LIBRARY DATA
*----
      CALL LCMLEN(IPLIB,'MACROLIB',LENGTH,ITYLCM)
      IF(LENGTH.EQ.-1) THEN
        CALL LCMSIX(IPLIB,'MACROLIB',1)
        CALL LCMGTC(IPLIB,'SIGNATURE',12,TEXT12)
        IF(TEXT12.NE.'L_MACROLIB') THEN
          CALL XABORT('LIBMIX: INVALID SIGNATURE ON THE MACROLIB.')
        ENDIF
        CALL LCMLEN(IPLIB,'TIMESTAMP',LENGTH,ITYLCM)
        IF((LENGTH.GT.0).AND.(LENGTH.LE.3)) THEN
          CALL LCMGET(IPLIB,'TIMESTAMP',OLDTIM)
          IF(ITSTMP.EQ.0) THEN
            TMPDAY(1)=OLDTIM(1)
            TMPDAY(2)=OLDTIM(2)
            TMPDAY(3)=OLDTIM(3)
          ENDIF
        ENDIF
        CALL LCMSIX(IPLIB,' ',2)
      ENDIF
*----
*  SET THE LCM MICROLIB ISOTOPEWISE DIRECTORIES.
*----
      ALLOCATE(IPISO(NBISO))
      CALL LIBIPS(IPLIB,NBISO,IPISO)
*----
*  TRANSPOSE THE MICROSCOPIC CROSS SECTIONS TO ADJOINT ORDERING.
*----
      IF(IPROB.EQ.1) THEN
         CALL LIBADJ (IPLIB,NGROUP,NBISO,NL,NDEL,NBESP,IPISO,NED,JNED)
      ENDIF
*----
*  SET MULTIPLE FISSION SPECTRA INFORMATION.
*----
      IF(NBESP.EQ.0) THEN
        NESP=1
      ELSE
        NESP=NBESP
      ENDIF
*----
*  COMPUTE THE MAXIMUM NUMBER OF FISSIONABLE ISOTOPES IN A MIXTURE.
*----
      DO 20 I=1,NBISO
      IF(MIX(I).GT.NBMIX) CALL XABORT('LIBMIX: NBMIX OVERFLOW.')
   20 CONTINUE
      MAXNFI=MIN(NBISO,200)
      CALL LIBNFI (IPLIB,NGROUP,NBISO,NBMIX,NDEL,NESP,IPISO,MIX,MAXNFI,
     1 NFISSI,LSAME)
*----
*  BUILD THE MACROSCOPIC CROSS SECTIONS.
*----
      CALL LIBDEN (IPLIB,NGROUP,NBISO,NBMIX,NL,NDEL,NESP,ISONAM,IPISO,
     1 MIX,DEN,MASK,MASKL,NED,JNED,ITRANC,NFISSI,NPART,LSAME,ITSTMP,
     2 TMPDAY,STERN)
*----
* RECOVER STOPPING POWERS.
*----
      LSTOPW=.FALSE.
      CALL LCMLEN(IPLIB,'PARTICLE',LENGTH,ITYLCM)
      IF(LENGTH.GT.0) THEN
         CALL LCMGTC(IPLIB,'PARTICLE',1,HPRT1)
         LSTOPW=((HPRT1.EQ.'B').OR.(HPRT1.EQ.'C'))
      ENDIF
      IF(LSTOPW) THEN
         CALL LIBEST (IPLIB,NGROUP,NBISO,NBMIX,IPISO,MIX,DEN,MASK,MASKL,
     1   NED,JNED,ITSTMP,TMPDAY,STERN)
      ENDIF
*----
*  TRANSPOSE THE MICROSCOPIC CROSS SECTIONS BACK TO FORWARD ORDERING.
*----
      IF(IPROB.EQ.1) THEN
         CALL LIBADJ (IPLIB,NGROUP,NBISO,NL,NDEL,NBESP,IPISO,NED,JNED)
      ENDIF
      DEALLOCATE(IPISO,JNED)
      RETURN
      END