MULT
, the units for system
input and output (5 and 6), the scratch unit used for
self-shielding data (20), the storage sizes (see Section V-C),
and the parameter N12
, which determines the maximum line
length for the printed output file.
IPRINT
,
NTABL
) or in the container array A
using a
pointer named by prefixing L to the name from the input
instructions [e.g., IMIX
values are stored at
A(LIMIX+1)
, A(LIMIX+2)
, etc.]. The exception is
the heterogeneity data IHET
, CHORD
, etc., which
are packed in the container array as they are read; the array
with pointer LIHET
locates the parameters for each region
in the big array.
Several additional arrays are defined using the input data.
LMCHK
points to an array used to check whether any
materials requested in the mix specifications were not found on
the library (sometimes this means that the name was misspelled).
LGTAB
points to an array containing the coarse-group
index for each fine group that is constructed from the slightly
different representation used for input. IMIXR
is the
``real mix'' index; it runs over the NMIXR
mix
specifications that are not flagged as constituent cross sections
with the labels ``CC
'' or ``RC
''. A related array is
ICONS
, which points to the ``real'' mix command for each
constituent mix command. The number and names of the unique
materials found in the mix specifications are also determined
(see NUNIQ
and the array HUNIQ
starting at
LHUNIQ+1
). The array JMIX
contains pointers
to the unique material for each mix specification (or
zero if the material is a constituent material), and the array
KMIX
contains a counter that distinguishes between
the subsequent occurrences of a unique material in the
mix specifications. Finally, MAXU
is the largest
number of times any unique material occurs. It is used later
for dimensioning the FGAM
and FFIS
arrays.
If a spatial collapse is indicated by the input mix commands, the
flag ISPC
is set. In addition, TRANSX computes the cell
volumes CVOL
from the region volumes RVOL
given
by the user. The ratios of the region volumes \pagebreak to the cell
volumes are used to correct the input densities for constituent
cross sections to the proper cell ``CC'' or region ``RC'' basis.
Several other flags are associated with the edit input.
KPOS
is set equal to the position to be occupied by the
fission $\chi$ data. Similarly, NPOS
is the position to
be occupied by the transport-for-diffusion cross section
TRD
. LOCG
is the first position of a range of
positions reserved for gamma source groups. See the special edit
input parameter GAM
. The flags LSNGAM
,
LLSFIS
, etc., which are stored in common ISOT
, are
used for CCCC ISOTXS output. They mark the positions used for
the edits that will end up as ISOTXS principal cross sections.
TRANSX stores some variables as integers, some as real, and some
as Hollerith strings. This can be done freely because the
variables A
, IA
, and HA
are all
equivalent. However, some care must be taken with Hollerith
variables for short-word machines because the first word of each
double-precision or 8-byte word must be at an odd memory
location. The equivalent TRANSX pointer must be even.
Therefore, TRANSX uses logic like this:
LMIXN=NEXT IF (2*(LMIXN/2).NE.LMIXN) LMIXN=LMIXN+1 LOCH=LMIXN/MULTThe pointer is guaranteed to be even, and
A(LMIXN+1)
points to the first half of the Hollerith variable denoted by
HA(LOCH+1)
.
When the reading of the user's input is complete, the flux
interface, if any, and the MATXS cross-section library are
initialized by reading the first few records from each file. The
group structures are checked against the input value for the
number of coarse groups (NGROUP
) and the number of fine
groups (NFINE
). With collapse, NFINE
can be a
number greater than or equal to NGROUP
. The number of
fine and coarse neutron groups is also extracted (NGNF
,
NGN
). The group bounds and average velocities are saved
(see LGRP
and LVEL
). MATXS libraries can have a
special velocity vector that is retrieved later, but in case it
does not show up, an estimate is made here using the given group
bounds. If the elastic scattering correction option has been
requested, the lethargy widths of the groups are computed and
saved at pointer LETH
, and space is reserved for the
correction coefficients to be defined later (IESC
,
LGAMMA
).
This version of TRANSX is capable of constructing extended
coupled sets with three or more particles in addition to the
normal neutron-photon coupled sets. The number of coupled
particles NCPL
is determined from the number of digits in
the input parameter ISET
. The NSHIFT
array is
constructed to contain the number of groups that must be shifted
in the coupled set to find the data for the nth particle. The
IRF
array is used later to flag when the weighting flux
for each particular particle has been read in.
At this point, memory is allocated for the flux arrays. The
Legendre components of the fine flux are stored as if they were
in an array FFLUX
(fine group, region, order). For no
collapse, this array starts at LFLUX+1
. If collapse is
requested, a coarse-flux array of the form CFLUX
(coarse
group, mix, order) starts at LFLUX+1
, and the fine-flux
array starts at the location
LFLUX+NGROUP*NMIX*(NLMAX+1).The use of
NLMAX+1
orders provides
for the flux moments needed for inflow transport corrections.
If an input flux file has been defined, it is read following the
comment ``READ FLUX FROM INTERFACE FILE.'' If there are fewer than
NREG
regions on the input file, the last region is used
to fill out the table. If there are not NL+1
orders on
the file, the last order is used to fill out the table.
If self-shielding has been requested, the appropriate background
cross sections and self-shielding factors are computed by calling
subroutine SIGZER
. This routine uses temporary storage
defined with respect to the pointer LC
. It writes its
results on the scratch tape NSS=NSCR
.
Next, storage is allocated for the scratch arrays.
LCNORM
points to the total fission neutron production
used to normalize chi; that is, the denominator of
Eq.~(\ref{eq221}). LPNU
points to the array of prompt
fission $\bar{\nu}$ values. LDNU
and LDCHI
point
to the delayed-fission data. LSFIS
is a pointer for the
microscopic infinitely dilute fission cross section of the
current material. LSGAM
is used for the microscopic
infinitely dilute capture cross section. LFFIS
and
LFGAM
are used to store the self-shielded cross sections
for fission and capture. LABSC
is a pointer to the array
used to accumulate the particle-balance absorption by the direct
method. And finally, LTERPT
locates the array of
interpolation factors used for temperature interpolation.
Next, the storage above LC
is allocated for the
cross-section table using different strategies for material and
group ordering, as described in the preceding section. The
maximum numbers of materials, orders, and groups that can fit
into memory at one time are NMMAX
, NLMAX
, and
NGMAX
. The parameters IMLO
, IMHI
,
ILLO
, ILHI
, JGLO
,
and JGHI
are
used throughout the code to decide which materials, orders, and
groups get loaded into the accumulating cross-section array.
RMATXS
. When
the subroutine returns control to the TRANSX level, the
accumulated cross sections for the current range of materials or
groups are ready to be printed out or written to the desired
output file.
All the material-ordered output options are given first inside a
loop over output mix and order (IMLO
to IMHI
,
ILLO
to ILHI
). The transport table in memory is
stored starting at LC
as if it were an array C(position,
order, material, group). The ``order'' and ``material'' indices
are often collapsed into the single variable JM
, which
takes on NJM=NLMAX*NMMAX
values. The logic required to
extract data from the table is clear from the coding for printed
output. The CARD, CLAW, FIDO, and ANISN output options use
simple subroutines to generate the appropriate output. The
design of the WISOT
routine is described in Section
IV-G. Note that TRANSX reacts to the specific edit names defined
for ISOTXS (e.g., SNGAM
, SFIS
, SN2N
,
etc.) only. The pointers LLSFIS
, LLSN2N
, etc.,
tell where the corresponding cross sections are located in TRANSX
memory. The scattering blocks are written using the same fixed
size for all materials; no attempt is made to squeeze out
additional zeroes. On the printed listing, the numbers are
arranged as N12
columns. A programmer can easily change
N12
to make the output look good on either a terminal or
a line printer.
The group-ordered output options are produced next inside a loop
over the range of groups in memory (JGLO
to
JGHI
). Only printed and GOXS outputs are provided
for group ordering, but
other output options could be added at this point. The tables in
memory have the form C(position, order, material, group) starting
at LC
. The logic needed to write the tables is fairly
clear from the coding for printed output. The GOXS output
routine WGOXS
writes out all the response edits specified
in the TRANSX input, but they are reordered so that the first
four vectors are always $\sigma_{\rm tot}$, $\sigma_a$,
$\bar{\nu}\sigma_f$, and $\chi$. The transport cross section for
diffusion TRD
is written next if available. The
scattering matrix is packed to minimize the number of zeroes
written to the output file.
After completing the output for this range of materials, orders,
and groups, TRANSX loops back to process the next set until all
the requested tables have been produced. Final messages are
printed (including the list of materials not found from
LMCHK
), files are closed, and the job terminates.
RMATXS
routine is entered, the accumulation
arrays are zeroed, and the material loop is begun. The code
checks whether each material on the MATXS library is needed; if
not, it skips it entirely. The LOCM
array and the random
access capabilities of REED
make this fairly efficient.
The MATXS material control record is read in to memory at pointer
L2
, and a new pointer L3
is defined. Note that
the material control data stays in memory while this material is
being processed. A loop over all
the submaterials for this material is executed; that is, a loop over data
type, temperature, and background $\sigma_0$. The first
submaterial in each data type is called the ``base material.''
By scanning up from each base material,
the list of NTEMP
temperatures TTEMP
for this
data type is obtained. On subsequent steps of the loop, the current type,
temperature, and background cross section are extracted
(ITYPE
, TMAT
, SMAT
). All background
cross sections except infinity (1.E10
) are skipped in
RMATXS
because the self-shielding calculation has already
been performed in SIGZER
.
With the data type identified, the
values that depend on data type are assigned. These
values include the identity of the
input particle and the number of input groups (JINP
,
NING
), the identity of the the output particle and the
number of output groups (JOUTP
, NOUTG
), and the
offsets for shifting the data block in a coupled set
(JC1
, JC2
).
With the temperature identified, the appropriate interpolation
weight for this submaterial is computed. This version of
TRANSX limits itself to linear interpolation. Because each
material may occur in several different mixtures or regions, the
interpolation weights are stored in an array TERPT
versus
mix specification index IMX
. If this particular
submaterial does not contribute to any mix or region, the
parameter ITERPT
has the value zero, and the
entire submaterial can be skipped. Otherwise, the submaterial
is processed by starting the code segment with the comment
``PROCESS THIS SUBMATERIAL.''
The vector reactions are processed first. The MATXS vector
control record is read into memory at pointer L3
, and a new
pointer L4
is defined for the blocks of vector cross-section
data. The general procedure is to loop over the complete
set of reactions needed for the transport tables and edits. For
each group, the selected cross sections are multiplied by
TERPT
and/or density and added into the appropriate
storage location. If necessary, self-shielded cross sections
from the NSS
scratch file are substituted for the cross
sections from the MATXS vector block. The additional factor
RVF
is used to correct constituent cross sections for the
definition of the density used on input; they can be either cell
densities or region densities. See the block of coding after
``GET GROUP CROSS SECTION.'' The model weight functions in the
cross-section block are treated specially. The data for each
particle are read into the WTM
array using the offset
JC1
, and the WTREAD
flag is set.
If an elastic scattering correction has been requested
(INITF<0
), the expansion coefficients representing the
smoothed fine-group flux are computed (X1
, X2
,
X3
) and used to
compute the value and slope of the the smoothed flux at the
bottom of each group. The coefficients used later for the
removal corrections are stored in the array ESCC
.
If self-shielded cross sections were prepared in SIGZER
,
an appropriate self-shielded model flux has already been prepared.
If there is no flux input file,
the FFLUX
and CFLUX
values are computed
using the model weight functions.
Note that only the base submaterial is processed for self-shielded
reactions in the non-thermal range because the self-shielded
cross section already includes the effects of temperature.
All submaterials for these reactions are processed in the
thermal range. All submaterials for non-shielded materials
are also processed. This allows the temperature effects to
be incorporated by using the TERPT
factors.
The block of coding that loads the $\sigma_a$, $\sigma_{tot}$, and $\sigma_{g{\leftarrow}g}$ positions is especially complex because of the transport correction options defined by Eqs.~(\ref{eq27}) through (\ref{eq213}). The P0 total is put into the $\sigma_a$ position, and the correction defined by Eq.~(\ref{eq223}) is subtracted later while the scattering matrices are being processed. The contributions of the P0 and P1 total cross sections to the total and in-group positions are made here also, and the matrix contributions needed for the transport correction, if any, are added later.
The block of coding after the comment ``FISSION CROSS SECTION''
only comes into play for data that have not been self-shielded
(normally the thermal data type). The variable FFIS
thus
includes the effect of temperature on $\bar{\nu}\sigma_f$.
The transport cross section for diffusion (TRD) is calculated next. The P1 total is added in here (or P0 if P1 is not available), and the total P1 scattering cross section is computed and subtracted later during matrix processing.
The thermal correction to the total cross section was described in Section II-J. Note that both the absorption and total positions are involved; if the reaction is elastic, the cross section is subtracted, and if the reaction is the coherent or incoherent one specified in the mix specifications, the cross section is added.
The final block of coding in the material loop adds in any contributions to the edit positions using the multiply-and-accumulate algorithm, which allows any linear combination to be calculated.
After the material loop is complete, the scratch cross sections
are saved. These are quantities characteristic of this
particular submaterial that will be needed later in the vector
loop for processing the scattering matrices, or for calculating
steady-state fission. SFIS
and SGAM
contain the
infinitely dilute fission and capture cross sections used in
computing $\bar{\nu}$ and the shielding factors for photon production.
The scratch data DNU
and DCHI
are the
delayed-neutron yield and spectrum, respectively. Finally,
GAMMA
is $\gamma_g$ used in the elastic scattering
correction defined by Eq.~(\ref{eq235}).
The reaction loop is continued until all the required vector
reactions for this submaterial have been processed. Then
the loop over the matrix reactions is started.
Each matrix block (reaction) can be divided up into a
number of subblocks. A subblock may be part of the main
matrix, in which case it contains data for a range of final
groups JL
to JU
that contains fewer than
MAXW
words. Or it may be a constant spectrum or
production cross-section subblock. The coding after the
comment ``SCATTERING SUB BLOCKS'' handles this loop over
subblocks.
If the current submaterial is needed for one of the accumulating
mixes, the code sets up a loop over final energy group (sink
group), initial energy group (source group), and Legendre order.
The group-to-group cross sections XSNOW
for each order
may contain a matrix part and/or a part computed from the
constant spectrum and production vectors. If the reaction is
elastic scattering, it may be replaced by a self-shielded cross
section. Next, the thermal correction is made, if desired (the
elastic scattering at low energies is replaced by the appropriate
incoherent and coherent thermal scattering). The resulting
group-to-group cross section is multiplied by the appropriate
factor from TERPT
to affect temperature interpolation,
and, optionally, an elastic removal correction factor is
applied.
Following the comment ``GET TRANSFER CROSS SECTION,'' this final
microscopic cross section XSNOW
is converted to a
macroscopic cross section (note the correction for cell or region
densities implicit in the factor RVF
) and multiplied by
the flux ratios needed for collapse and homogenization. In
addition, the neutron-photon matrices for capture and fission are
self-shielded using the data in the FGAM
and FFIS
arrays.
Separate blocks of coding are provided to accumulate the
transport matrix with truncation of the table, if necessary, to
compute a photon source in the edit positions (GAM
option), to finish the calculation of the particle-balance
absorption $\sigma_a$, and to complete the transport cross
section for diffusion. In the block labeled ``FISSION VECTORS,''
the fission matrix is multiplied by the flux \pagebreak and summed over
source groups to get the prompt part of the numerator in
Eq.~(\ref{eq221}). The same term is added to the array in
CNORM
to be used to normalize $\chi$ later.
The last step in the reaction loop adds the prompt component of
fission into the microscopic $\bar{\nu}\sigma_f$ in PNU
. When
the reaction loop finishes, the data in PNU
are promptly
converted to $\bar{\nu}$ by dividing by $\sigma_f$, which was
saved at LSFIS during the processing of the vector cross
sections.
After the end of the submaterial loop, all of the effects of
self-shielding and temperature have been included in the
cross sections. The contributions from this material to the
prompt or steady-state values of $\bar{\nu}\sigma_f$ are then
added into the transport table. Any delayed contributions
to CNORM
, the denominator of the expression for $\chi$,
are also added in here.
This process is continued until all materials have been
processed. The fission $\chi$ is then normalized using the data
in CNORM
. In addition, the particle-balance absorption
in the transport table is compared with the directly-computed
value in ABSC
. If the value in ABSC
is small
with respect to the transport cross section but still will have
a large effect on $\sigma_a$, it is used to replace the previous
value of $\sigma_a$. The tables are now complete for the ranges of
mixes, orders, and groups currently allowed in memory. RMATXS
returns to TRANSX, so they can be printed and/or written onto the
requested output interface file.
SIGZER
, and the resulting self-shielded cross sections
are written out onto the scratch file NSS
.
In order to allow for possible storage limitations, the
calculation is done by ``pages'' of MAXGRP
groups (see JGLO
and JGHI
). The input
MATXS file is read once for each page of groups.
The file data is already in place at pointer L1
, and
each pass starts by looping over all the ``real'' materials
needed from the MATXS library. The procedure is similar
to the one used in subroutine RMATXS
, except that
only the total, elastic, capture, fission, and elastic
downscatter cross sections are extracted. They are all
stored in the array
SIGS
(ISIGZ
,IX
,IMX
,IG
),
where the indices refer to the
background $\sigma_0$, the reaction type, the mix specification,
and the group index, respectively. Each cross section is
interpolated to the temperature appropriate to IMX
before being stored in SIGS
. The code allows for
up to 20 elastic scattering elements. For a P4 set,
this corresponds to the in-group element and 4 downscatter
terms.
Once all the cross sections for this range of groups have been
read in, the $\sigma_0$ values can be computed by iteration. The
code begins a loop over all the ``real'' materials in the mix
specifications. The current material IMX
lies in region
IRG
, which determines the heterogeneity parameters to be
used. The $\sigma_0$ values for each group is computed in two
parts. First, the mixture part is computed using
Eq.~(\ref{eq280}), where the sum runs over all the other materials
in IRG
. The code then begins to calculate the escape
part of $\sigma_0$.
For IHET
=1, the simple result of Eq.~(\ref{eq281}) is used
with an effective mean chord specified by the user.
For lattices of cylinders (IHET
=2 through 4), a
macroscopic cross section homogenized over the two regions
outside the fuel is required. Because the fuel is in the first
region, the loop sums the macroscopic cross section times volume
for the next two regions, obtaining the desired average in
SMOD
. The rest of the calculation of the escape cross section
is straightforward.
For the slab options (IHET
=5 through 8), the sweep
through the cell starts from IRG
and moves to the right,
summing the product of the macroscopic total cross section for
each region times the thickness of the region. The sweep
continues until a region containing the current material or the
edge of the cell is reached. If the edge of the cell is
reached, the sweep either jumps to the other end of the cell and
continues to the right (periodic cells) or reverses direction and
sweeps back to the left (reflective cells). When a region
containing the current materials is reached, the code repeats the
entire process sweeping to the left. The final results are
XXR
and XXL
, which can be used for $\lambda_R$
and $\lambda_L$ in Eqs.~(\ref{eq2132}) or (\ref{eq2133}). Note
that regions at periodic boundaries have their full thickness,
but only half the thickness is given for regions lying on
reflection planes. The calculation of the escape cross section
can now be completed using Eq.~(\ref{eq2134}).
Finally, the escape part is added into $\sigma_0$, the new
$\sigma_0$ is checked against the previous value, and the loop
over materials and groups is continued. If convergence to within
EPSZ
has been achieved for all groups and materials,
ISOK
will be one, and the loops will terminate.
The final steps after convergence are to print out the table of computed $\sigma_0$ values by material and group for this range of groups, to write out the results to the scratch file, and to continue the loop over pages of groups.
TRANSX HyperText Manual
TRANSX HyperText Help Package
T-2 Nuclear Information Service