Description of TRANSX

TRANSX begins by initializing 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.

User Input

After printing a heading, TRANSX begins to read the user's input. Most values are stored in variables with the name given in the input instructions (e.g., 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/MULT
The 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.

Main Processing Loop

The code is now ready to begin a pass through the MATXS library accumulating the appropriate cross sections into the transport table. This is done by calling subroutine 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.

Reading the MATXS file

When the 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.

Self-Shielded Cross Sections

The effects of self-shielding are computed in subroutine 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