Added scattering moment and scattering production macro tallies.

This commit is contained in:
Paul Romano 2011-10-12 14:44:07 -04:00
parent 3a14e80fb0
commit 1fb0e4fe99
5 changed files with 63 additions and 16 deletions

View file

@ -152,13 +152,18 @@ module constants
N_DA = 117
! Tally macro reactions
integer, parameter :: N_MACRO_TYPES = 10
integer, parameter :: &
MACRO_FLUX = -1, & ! flux
MACRO_TOTAL = -2, & ! total reaction rate
MACRO_SCATTER = -3, & ! total scattering rate
MACRO_ABSORPTION = -4, & ! total absorption rate
MACRO_FISSION = -5, & ! total fission rate
MACRO_NU_FISSION = -6 ! total neutron production rate
MACRO_FLUX = -1, & ! flux
MACRO_TOTAL = -2, & ! total reaction rate
MACRO_SCATTER = -3, & ! scattering rate
MACRO_NU_SCATTER = -4, & ! scattering production rate
MACRO_SCATTER_1 = -5, & ! first scattering moment
MACRO_SCATTER_2 = -6, & ! second scattering moment
MACRO_SCATTER_3 = -7, & ! third scattering moment
MACRO_ABSORPTION = -8, & ! absorption rate
MACRO_FISSION = -9, & ! fission rate
MACRO_NU_FISSION = -10 ! neutron production rate
! Tally map bin finding
integer, parameter :: NO_BIN_FOUND = -1

View file

@ -748,6 +748,14 @@ contains
t % macro_bins(j) % scalar = MACRO_TOTAL
case ('scatter')
t % macro_bins(j) % scalar = MACRO_SCATTER
case ('nu-scatter')
t % macro_bins(j) % scalar = MACRO_NU_SCATTER
case ('scatter-1')
t % macro_bins(j) % scalar = MACRO_SCATTER_1
case ('scatter-2')
t % macro_bins(j) % scalar = MACRO_SCATTER_2
case ('scatter-3')
t % macro_bins(j) % scalar = MACRO_SCATTER_3
case ('absorption')
t % macro_bins(j) % scalar = MACRO_ABSORPTION
case ('fission')

View file

@ -20,6 +20,7 @@ module particle_header
real(8) :: uvw(3) ! directional cosines
real(8) :: wgt ! particle weight
real(8) :: E ! energy
real(8) :: mu ! angle of scatter
logical :: alive ! is particle alive?
! Pre-collision physical data

View file

@ -574,11 +574,15 @@ contains
E = vx*vx + vy*vy + vz*vz
vel = sqrt(E)
! Set energy and direction of particle in LAB frame
p % E = E
p % uvw(1) = vx/vel
p % uvw(2) = vy/vel
p % uvw(3) = vz/vel
! Copy scattering cosine for tallies
p % mu = mu
end subroutine elastic_scatter
!===============================================================================
@ -836,6 +840,9 @@ contains
! change energy of particle
p % E = E
! Copy scattering cosine for tallies
p % mu = mu
! change weight of particle based on multiplicity
n_secondary = abs(rxn % TY)
p % wgt = n_secondary * p % wgt

View file

@ -269,17 +269,21 @@ contains
integer :: n
integer :: bins(TALLY_TYPES)
integer :: score_index
integer :: macro_bin
real(8) :: score
real(8) :: last_wgt
real(8) :: wgt
real(8) :: mu
logical :: in_mesh
logical :: has_outgoing_energy
logical :: has_outgoing_angle
type(TallyObject), pointer :: t
type(StructuredMesh), pointer :: m
! Copy particle's pre- and post-collision weight
! Copy particle's pre- and post-collision weight and angle
last_wgt = p % last_wgt
wgt = p % wgt
mu = p % mu
! A loop over all tallies is necessary because we need to simultaneously
! determine different filter bins for the same tally in order to score to it
@ -378,7 +382,16 @@ contains
! Determine score for each bin
do j = 1, t % n_macro_bins
if (has_outgoing_energy) then
! determine what type of macro bin
macro_bin = t % macro_bins(j) % scalar
! determine if we need outgoing angle
has_outgoing_angle = (macro_bin == MACRO_NU_SCATTER .or. &
macro_bin == MACRO_SCATTER_1 .or. &
macro_bin == MACRO_SCATTER_2 .or. &
macro_bin == MACRO_SCATTER_3)
if (has_outgoing_energy .or. has_outgoing_angle) then
! If this tally has an outgoing energy filter, the only supported
! reaction is scattering. For all other reactions, about
@ -388,16 +401,25 @@ contains
! occured, we do not need to multiply by the scattering cross
! section
if (t % macro_bins(j) % scalar == MACRO_SCATTER) then
select case (macro_bin)
case (MACRO_SCATTER)
score = last_wgt
else
case (MACRO_NU_SCATTER)
score = wgt
case (MACRO_SCATTER_1)
score = last_wgt * mu
case (MACRO_SCATTER_2)
score = last_wgt * 0.5*(3.0*mu*mu - ONE)
case (MACRO_SCATTER_3)
score = last_wgt * 0.5*(5.0*mu*mu*mu - 3.0*mu)
case default
! call fatal_error
end if
end select
else
! For tallies with no outgoing energy filter, the score is
! calculated normally depending on the quantity specified
select case(t % macro_bins(j) % scalar)
select case (macro_bin)
case (MACRO_FLUX)
score = last_wgt / material_xs % total
case (MACRO_TOTAL)
@ -558,10 +580,10 @@ contains
integer :: score_index ! index in scores array for filters
logical :: file_exists ! does tallies.out file already exists?
logical :: has_filter(TALLY_TYPES) ! does tally have this filter?
character(MAX_LINE_LEN) :: filename ! name of output file
character(15) :: filter_name(TALLY_TYPES) ! names of tally filters
character(20) :: macro_name(6) ! names of macro scores
character(80) :: space = " " ! spaces
character(MAX_LINE_LEN) :: filename ! name of output file
character(15) :: filter_name(TALLY_TYPES) ! names of tally filters
character(27) :: macro_name(N_MACRO_TYPES) ! names of macro scores
character(80) :: space = " " ! spaces
type(TallyObject), pointer :: t
! Skip if there are no tallies
@ -581,6 +603,10 @@ contains
macro_name(abs(MACRO_FLUX)) = "Flux"
macro_name(abs(MACRO_TOTAL)) = "Total Reaction Rate"
macro_name(abs(MACRO_SCATTER)) = "Scattering Rate"
macro_name(abs(MACRO_NU_SCATTER)) = "Scattering Production Rate"
macro_name(abs(MACRO_SCATTER_1)) = "First Scattering Moment"
macro_name(abs(MACRO_SCATTER_2)) = "Second Scattering Moment"
macro_name(abs(MACRO_SCATTER_3)) = "Third Scattering Moment"
macro_name(abs(MACRO_ABSORPTION)) = "Absorption Rate"
macro_name(abs(MACRO_FISSION)) = "Fission Rate"
macro_name(abs(MACRO_NU_FISSION)) = "Nu-Fission Rate"