@@ -3,11 +3,11 @@ module ace
33 use ace_header, only: Nuclide, Reaction, SAlphaBeta, XsListing, &
44 DistEnergy
55 use constants
6- use endf, only: reaction_name
6+ use endf, only: reaction_name, is_fission, is_disappearance
77 use error, only: fatal_error, warning
88 use fission, only: nu_total
99 use global
10- use list_header, only: ListElemInt
10+ use list_header, only: ListElemInt, ListInt
1111 use material_header, only: Material
1212 use output, only: write_message
1313 use set_header, only: SetChar
@@ -610,6 +610,7 @@ subroutine read_reactions(nuc)
610610 integer :: IE ! reaction's starting index on energy grid
611611 integer :: NE ! number of energies for reaction
612612 type (Reaction), pointer :: rxn = > null ()
613+ type (ListInt) :: MTs
613614
614615 LMT = JXS(3 )
615616 JXS4 = JXS(4 )
@@ -682,17 +683,37 @@ subroutine read_reactions(nuc)
682683 allocate (rxn % sigma(NE))
683684 XSS_index = JXS7 + LOCA + 1
684685 rxn % sigma = get_real(NE)
686+ end do
687+
688+ ! Create set of MT values
689+ do i = 1 , size (nuc % reactions)
690+ call MTs % append (nuc % reactions(i) % MT)
691+ end do
685692
686- ! Skip redundant reactions -- this includes total inelastic level
687- ! scattering, gas production cross sections (MT=200+), and (n,p), (n,d),
688- ! etc. reactions leaving the nucleus in an excited state
689- if (rxn % MT == N_LEVEL .or. rxn % MT > N_DA) cycle
693+ ! Create total, absorption, and fission cross sections
694+ do i = 2 , size (nuc % reactions)
695+ rxn = > nuc % reactions(i)
696+ IE = rxn % threshold
697+ NE = size (rxn % sigma)
698+
699+ ! Skip total inelastic level scattering, gas production cross sections
700+ ! (MT=200+), etc.
701+ if (rxn % MT == N_LEVEL) cycle
702+ if (rxn % MT > N_5N2P .and. rxn % MT < N_P0) cycle
703+
704+ ! Skip level cross sections if total is available
705+ if (rxn % MT >= N_P0 .and. rxn % MT <= N_PC .and. MTs % contains (N_P)) cycle
706+ if (rxn % MT >= N_D0 .and. rxn % MT <= N_DC .and. MTs % contains (N_D)) cycle
707+ if (rxn % MT >= N_T0 .and. rxn % MT <= N_TC .and. MTs % contains (N_T)) cycle
708+ if (rxn % MT >= N_3HE0 .and. rxn % MT <= N_3HEC .and. MTs % contains (N_3HE)) cycle
709+ if (rxn % MT >= N_A0 .and. rxn % MT <= N_AC .and. MTs % contains (N_A)) cycle
710+ if (rxn % MT >= N_2N0 .and. rxn % MT <= N_2NC .and. MTs % contains (N_2N)) cycle
690711
691712 ! Add contribution to total cross section
692713 nuc % total(IE:IE+ NE-1 ) = nuc % total(IE:IE+ NE-1 ) + rxn % sigma
693714
694715 ! Add contribution to absorption cross section
695- if (rxn % MT > = N_GAMMA .and. rxn % MT < = N_DA ) then
716+ if (is_disappearance( rxn % MT) ) then
696717 nuc % absorption(IE:IE+ NE-1 ) = nuc % absorption(IE:IE+ NE-1 ) + rxn % sigma
697718 end if
698719
@@ -705,8 +726,7 @@ subroutine read_reactions(nuc)
705726 end if
706727
707728 ! Add contribution to fission cross section
708- if (rxn % MT == N_FISSION .or. rxn % MT == N_F .or. rxn % MT == N_NF &
709- .or. rxn % MT == N_2NF .or. rxn % MT == N_3NF) then
729+ if (is_fission(rxn % MT)) then
710730 nuc % fissionable = .true.
711731 nuc % fission(IE:IE+ NE-1 ) = nuc % fission(IE:IE+ NE-1 ) + rxn % sigma
712732
@@ -719,11 +739,14 @@ subroutine read_reactions(nuc)
719739
720740 ! Keep track of this reaction for easy searching later
721741 i_fission = i_fission + 1
722- nuc % index_fission(i_fission) = i + 1
742+ nuc % index_fission(i_fission) = i
723743 nuc % n_fission = nuc % n_fission + 1
724744 end if
725745 end do
726746
747+ ! Clear MTs set
748+ call MTs % clear()
749+
727750 end subroutine read_reactions
728751
729752! ===============================================================================
0 commit comments