Merged branch xml into master.

This commit is contained in:
Paul Romano 2011-09-01 22:48:55 -04:00
parent b451da7b44
commit 865c3a4eb7
31 changed files with 3848 additions and 1109 deletions

View file

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<geometry>
<!--
==========================================
Description: Bare Pu-239 Jezebel Benchmark
Case: PU-MET-FAST-001
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<cell uid="1">
<universe>0</universe>
<material>1</material>
<surfaces>-1</surfaces>
</cell>
<surface uid="1">
<type>sphere</type>
<coeffs>0. 0. 0. 6.3849</coeffs>
<boundary>vacuum</boundary>
</surface>
</geometry>

View file

@ -0,0 +1,21 @@
<?xml version="1.0"?>
<materials>
<!--
==========================================
Description: Bare Pu-239 Jezebel Benchmark
Case: PU-MET-FAST-001
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<material uid="1">
<density value="0.04029014" units="atom/b-cm" />
<nuclide name="Pu-239" xs="03c" ao="0.037047" />
<nuclide name="Pu-240" xs="03c" ao="0.0017512" />
<nuclide name="Pu-241" xs="03c" ao="0.00011674" />
<nuclide name="Ga-nat" xs="03c" ao="0.0013752" />
</material>
</materials>

View file

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<settings>
<!--
==========================================
Description: Bare Pu-239 Jezebel Benchmark
Case: PU-MET-FAST-001
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<xslibrary path="/opt/serpent/xsdata/endfb7" />
<criticality>
<cycles>3000</cycles>
<inactive>20</inactive>
<particles>10000</particles>
</criticality>
<verbosity value="7" />
<source>
<type>box</type>
<coeffs>-1 -1 -1 1 1 1</coeffs>
</source>
</settings>

View file

@ -1,24 +0,0 @@
# ====================================================================
# Description: Bare Pu-239 Jezebel Benchmark
# Case: PU-MET-FAST-001
# Written By: Paul Romano
# Date: 3/30/2011
# ====================================================================
# cell no. universe material surfaces
cell 1 0 1 -1
surface 1 sph 0. 0. 0. 6.3849
bc 1 vacuum
source box -1 -1 -1 1 1 1
material 1 0.04029014 &
94239.03c 0.037047 &
94240.03c 0.0017512 &
94241.03c 0.00011674 &
31000.03c 0.0013752
xs_data /opt/serpent/xsdata/endfb7
criticality 3000 20 10000
verbosity 7

View file

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<geometry>
<!--
==========================================
Description: Bare Pu-240 Jezebel Benchmark
Case: PU-MET-FAST-002
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<cell uid="1">
<universe>0</universe>
<material>1</material>
<surfaces>-1</surfaces>
</cell>
<surface uid="1">
<type>sphere</type>
<coeffs>0. 0. 0. 6.6595</coeffs>
<boundary>vacuum</boundary>
</surface>
</geometry>

View file

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<materials>
<!--
==========================================
Description: Bare Pu-240 Jezebel Benchmark
Case: PU-MET-FAST-002
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<material uid="1">
<density value="0.04055292" units="atom/b-cm" />
<nuclide name="Pu-239" xs="03c" ao="0.029934" />
<nuclide name="Pu-240" xs="03c" ao="0.0078754" />
<nuclide name="Pu-241" xs="03c" ao="0.0012146" />
<nuclide name="Pu-242" xs="03c" ao="0.00015672" />
<nuclide name="Ga-nat" xs="03c" ao="0.0013722" />
</material>
</materials>

View file

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<settings>
<!--
==========================================
Description: Bare Pu-240 Jezebel Benchmark
Case: PU-MET-FAST-002
Written By: Paul Romano
Date: 9/1/2011
==========================================
-->
<xslibrary path="/opt/serpent/xsdata/endfb7" />
<criticality>
<cycles>3000</cycles>
<inactive>20</inactive>
<particles>10000</particles>
</criticality>
<verbosity value="7" />
<source>
<type>box</type>
<coeffs>-1 -1 -1 1 1 1</coeffs>
</source>
</settings>

View file

@ -1,25 +0,0 @@
# ====================================================================
# Description: Bare Pu-240 Jezebel Benchmark
# Case: PU-MET-FAST-002
# Written By: Paul Romano
# Date: 3/30/2011
# ====================================================================
# cell no. universe material surfaces
cell 1 0 1 -1
surface 1 sph 0. 0. 0. 6.6595
bc 1 vacuum
source box -1 -1 -1 1 1 1
material 1 0.04055292 &
94239.03c 0.029934 &
94240.03c 0.0078754 &
94241.03c 0.0012146 &
94242.03c 0.00015672 &
31000.03c 0.0013722
xs_data /opt/serpent/xsdata/endfb7
criticality 3000 20 10000
verbosity 7

View file

@ -0,0 +1,34 @@
<?xml version="1.0"?>
<geometry>
<!--
===============================================================
Description: Unmoderated Plutonium Metal Button Array Benchmark
Case: PU-MET-FAST-005
Written By: Paul Romano
Date: 9/1/2011
===============================================================
-->
<cell uid="1">
<universe>0</universe>
<material>1</material>
<surfaces>-1</surfaces>
</cell>
<cell uid="2">
<universe>0</universe>
<material>2</material>
<surfaces>1 -2</surfaces>
</cell>
<surface uid="1">
<type>sphere</type>
<coeffs>0. 0. 0. 5.0419</coeffs>
</surface>
<surface uid="2">
<type>sphere</type>
<coeffs>0. 0. 0. 9.7409</coeffs>
<boundary>vacuum</boundary>
</surface>
</geometry>

View file

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<materials>
<!--
===============================================================
Description: Unmoderated Plutonium Metal Button Array Benchmark
Case: PU-MET-FAST-005
Written By: Paul Romano
Date: 9/1/2011
===============================================================
-->
<material uid="1">
<density value="0.04070346" units="atom/b-cm" />
<nuclide name="Pu-239" xs="03c" ao="0.037291" />
<nuclide name="Pu-240" xs="03c" ao="0.0019277" />
<nuclide name="Pu-241" xs="03c" ao="0.00012196" />
<nuclide name="Ga-nat" xs="03c" ao="0.0013628" />
</material>
<material uid="2">
<density value="0.06605308" units="atom/b-cm" />
<nuclide name="74000" xs="03c" ao="0.051468" />
<nuclide name="28000" xs="03c" ao="0.0097124" />
<nuclide name="29000" xs="03c" ao="0.0040774" />
<nuclide name="40000" xs="03c" ao="0.00079528" />
</material>
</materials>

View file

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<settings>
<!--
===============================================================
Description: Unmoderated Plutonium Metal Button Array Benchmark
Case: PU-MET-FAST-005
Written By: Paul Romano
Date: 9/1/2011
===============================================================
-->
<xslibrary path="/opt/serpent/xsdata/endfb7" />
<criticality>
<cycles>3000</cycles>
<inactive>20</inactive>
<particles>10000</particles>
</criticality>
<verbosity value="7" />
<source>
<type>box</type>
<coeffs>-1 -1 -1 1 1 1</coeffs>
</source>
</settings>

View file

@ -1,32 +0,0 @@
# ====================================================================
# Description: Unmoderated Plutonium Metal Button Array Benchmark
# Case: PU-MET-FAST-005
# Written By: Paul Romano
# Date: 3/30/2011
# ====================================================================
# cell no. universe material surfaces
cell 1 0 1 -1
cell 2 0 2 1 -2
surface 1 sph 0. 0. 0. 5.0419
surface 2 sph 0. 0. 0. 9.7409
bc 2 vacuum
source box -1 -1 -1 1 1 1
material 1 0.04070346 &
94239.03c 0.037291 &
94240.03c 0.0019277 &
94241.03c 0.00012196 &
31000.03c 0.0013628
material 2 0.06605308 &
74000.03c 0.051468 &
28000.03c 0.0097124 &
29000.03c 0.0040774 &
40000.03c 0.00079528
xs_data /opt/serpent/xsdata/endfb7
criticality 3000 20 10000
verbosity 7

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<geometry>
<!-- Definition of Cells -->
<cell uid="1">
<universe>0</universe>
<fill>37</fill>
<surfaces>-2</surfaces>
</cell>
<cell uid="100">
<universe>37</universe>
<material>40</material>
<surfaces>-1</surfaces>
</cell>
<cell uid="101">
<universe>37</universe>
<material>41</material>
<surfaces>1</surfaces>
</cell>
<cell uid="2">
<universe>0</universe>
<material>41</material>
<surfaces>2 -3</surfaces>
</cell>
<!-- Defition of Surfaces -->
<surface uid="1">
<type>z-cylinder</type>
<coeffs>0 0 7</coeffs>
</surface>
<surface uid="2">
<type>z-cylinder</type>
<coeffs>0 0 9</coeffs>
</surface>
<surface uid="3">
<type>z-cylinder</type>
<coeffs>0 0 11</coeffs>
<boundary>vacuum</boundary>
</surface>
</geometry>

View file

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<materials>
<!-- Definition of materials -->
<material uid="40">
<density value="4.5" units="g/cc" />
<nuclide name="U-235" xs="03c" ao="1.0" />
</material>
<material uid="41">
<density value="1.0" units="g/cc" />
<nuclide name="H-1" xs="03c" ao="2.0" />
<nuclide name="O-16" xs="03c" ao="1.0" />
<sab uid="H-H2O" xs="10t" />
</material>
</materials>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<!-- Path for cross section library -->
<xslibrary path="/opt/serpent/xsdata/endfb7" />
<!-- Parameters for criticality calculation -->
<criticality>
<cycles>15</cycles>
<inactive>5</inactive>
<particles>10000</particles>
</criticality>
<!-- How verbose output should be -->
<verbosity value="7" />
<!-- Starting source -->
<source>
<type>box</type>
<coeffs>-4 -4 -4 4 4 4</coeffs>
</source>
</settings>

View file

@ -0,0 +1,18 @@
<?xml version="1.0"?>
<tallies>
<tally id="1">
<!-- this is where you specify filters -->
<filters>
<region>1</region>
<energy>0.0 0.625 20.0e6</energy>
</filters>
<!-- which reactions to score -->
<reactions>1 2 -4 -8</reactions>
<!-- which nuclides to score -->
<nuclides>U-238</nuclides>
</tally>
</tallies>

View file

@ -0,0 +1,58 @@
<?xml version="1.0"?>
<geometry>
<cell uid="1">
<universe>0</universe>
<fill>111</fill>
<surfaces>1 -2 3 -4</surfaces>
</cell>
<cell uid="100">
<universe>3</universe>
<material>40</material>
<surfaces>-5</surfaces>
</cell>
<cell uid="101">
<universe>3</universe>
<material>41</material>
<surfaces>5</surfaces>
</cell>
<lattice uid="111">
<type>rectangular</type>
<dimension>20 20</dimension>
<origin>-10.0 -10.0</origin>
<width>1.0 1.0</width>
<universes>
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
</universes>
</lattice>
<surface uid="1" type="x-plane" coeffs="-9.9" boundary="vacuum" />
<surface uid="2" type="x-plane" coeffs="9.9" boundary="vacuum" />
<surface uid="3" type="y-plane" coeffs="-9.9" boundary="vacuum" />
<surface uid="4" type="y-plane" coeffs="9.9" boundary="vacuum" />
<surface uid="5">
<type>z-cylinder</type>
<coeffs>0.0 0.0 0.4</coeffs>
</surface>
</geometry>

View file

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<materials>
<!-- Definition of materials -->
<material uid="40">
<density value="4.5" units="g/cc" />
<nuclide name="U-235" xs="03c" ao="1.0" />
</material>
<material uid="41">
<density value="1.0" units="g/cc" />
<nuclide name="H-1" xs="03c" ao="2.0" />
<nuclide name="O-16" xs="03c" ao="1.0" />
<sab uid="H-H2O" xs="10t" />
</material>
</materials>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<!-- Path for cross section library -->
<xslibrary path="/opt/serpent/xsdata/endfb7" />
<!-- Parameters for criticality calculation -->
<criticality>
<cycles>20</cycles>
<inactive>10</inactive>
<particles>10000</particles>
</criticality>
<!-- How verbose output should be -->
<verbosity value="7" />
<!-- Starting source -->
<source>
<type>box</type>
<coeffs>-4 -4 -4 4 4 4</coeffs>
</source>
</settings>

View file

@ -58,7 +58,7 @@ initialize.o: error.o
initialize.o: geometry.o
initialize.o: geometry_header.o
initialize.o: global.o
initialize.o: input_old.o
initialize.o: input_xml.o
initialize.o: logging.o
initialize.o: mcnp_random.o
initialize.o: mpi_routines.o
@ -67,15 +67,16 @@ initialize.o: source.o
initialize.o: string.o
initialize.o: timing.o
input_old.o: constants.o
input_old.o: datatypes.o
input_old.o: datatypes_header.o
input_old.o: geometry_header.o
input_old.o: global.o
input_old.o: error.o
input_old.o: fileio.o
input_old.o: output.o
input_old.o: string.o
input_xml.o: constants.o
input_xml.o: datatypes.o
input_xml.o: error.o
input_xml.o: geometry_header.o
input_xml.o: global.o
input_xml.o: string.o
input_xml.o: xml_geometry.o
input_xml.o: xml_material.o
input_xml.o: xml_settings.o
input_xml.o: xml_tallies.o
logging.o: constants.o
logging.o: global.o

View file

@ -13,7 +13,7 @@ geometry.o \
geometry_header.o \
global.o \
initialize.o \
input_old.o \
input_xml.o \
logging.o \
main.o \
material_header.o \
@ -28,4 +28,8 @@ source.o \
source_header.o \
string.o \
tally_header.o \
timing.o
timing.o \
xml_geometry.o \
xml_material.o \
xml_settings.o \
xml_tallies.o

View file

@ -162,7 +162,7 @@ module constants
! Versioning numbers
integer, parameter :: VERSION_MAJOR = 0
integer, parameter :: VERSION_MINOR = 3
integer, parameter :: VERSION_RELEASE = 0
integer, parameter :: VERSION_RELEASE = 1
! Maximum number of words in a single line, length of line, and length of
! single word

View file

@ -10,14 +10,14 @@ module initialize
use geometry, only: neighbor_lists
use geometry_header, only: Cell, Surface, Universe, Lattice, BASE_UNIVERSE
use global
use input_old, only: read_count, read_input, bc_dict
use input_xml, only: read_input_xml, cells_in_univ_dict
use logging, only: create_log
use mcnp_random, only: RN_init_problem
use mpi_routines, only: setup_mpi
use output, only: title, echo_input, message, print_summary, &
print_particle, header
use source, only: init_source
use string, only: int_to_str
use string, only: int_to_str, starts_with, ends_with
use timing, only: timer_start, timer_stop
contains
@ -57,11 +57,16 @@ contains
! Set default values for settings
call set_defaults()
! set up dictionaries
call create_dictionaries()
! Read input file -- make a first pass through the file to count
! cells, surfaces, etc in order to allocate arrays, then do a
! second pass to actually read values
call read_count(path_input)
call read_input(path_input)
call read_input_xml()
! Set up universe structures
call prepare_universes()
! Use dictionaries to redefine index pointers
call adjust_indices()
@ -113,35 +118,120 @@ contains
subroutine read_command_line()
integer :: argc ! number of command line arguments
logical :: file_exists ! does specified input file exist?
character(MAX_LINE_LEN) :: msg ! error message
character(7) :: readable ! is input file readable?
integer :: argc ! number of command line arguments
character(MAX_LINE_LEN) :: pwd ! present working directory
! Get working directory
call GET_ENVIRONMENT_VARIABLE("PWD", pwd)
! Check number of command line arguments
argc = COMMAND_ARGUMENT_COUNT()
! Determine directory where XML input files are
if (argc > 0) then
call GET_COMMAND_ARGUMENT(1, path_input)
! Need to add working directory if the given path is a relative
! path
if (.not. starts_with(path_input, "/")) then
path_input = trim(pwd) // "/" // trim(path_input)
end if
else
msg = "No input file specified!"
call fatal_error(msg)
path_input = pwd
end if
! Check if input file exists and is readable
inquire(FILE=path_input, EXIST=file_exists, READ=readable)
if (.not. file_exists) then
msg = "Input file '" // trim(path_input) // "' does not exist!"
call fatal_error(msg)
elseif (readable(1:3) == 'NO') then
! Need to explicitly check for a NO status -- Intel compiler looks at
! file attributes only if the file is open on a unit. Therefore, it will
! always return UNKNOWN
msg = "Input file '" // trim(path_input) // "' is not readable! &
&Change file permissions with chmod command."
call fatal_error(msg)
! Add slash at end of directory if it isn't there
if (.not. ends_with(path_input, "/")) then
path_input = trim(path_input) // "/"
end if
! TODO: Check that directory exists
end subroutine read_command_line
!===============================================================================
! CREATE_DICTIONARIES initializes the various dictionary variables. It would be
! nice to avoid this and just have a check at the beginning of
! dictionary_add_key.
!===============================================================================
subroutine create_dictionaries()
! Create cell dictionary
call dict_create(cell_dict)
call dict_create(universe_dict)
call dict_create(lattice_dict)
call dict_create(surface_dict)
call dict_create(material_dict)
call dict_create(tally_dict)
call dict_create(cells_in_univ_dict)
end subroutine create_dictionaries
!===============================================================================
! PREPARE_UNIVERSES allocates the universes array and determines the cells array
! for each universe.
!===============================================================================
subroutine prepare_universes()
integer :: i ! index in cells array
integer :: index ! index in universes array
integer :: count ! number of cells in a universe
integer, allocatable :: index_cell_in_univ(:) ! the index in the univ%cells
! array for each universe
type(ListKeyValueII), pointer :: key_list => null()
type(Universe), pointer :: univ => null()
type(Cell), pointer :: c => null()
allocate(universes(n_universes))
! We also need to allocate the cell count lists for each universe. The logic
! for this is a little more convoluted. In universe_dict, the (key,value)
! pairs are the uid of the universe and the index in the array. In
! ucount_dict, it's the uid of the universe and the number of cells.
key_list => dict_keys(universe_dict)
do while (associated(key_list))
! find index of universe in universes array
index = key_list%data%value
univ => universes(index)
univ % uid = key_list%data%key
! check for lowest level universe
if (univ % uid == 0) BASE_UNIVERSE = index
! find cell count for this universe
count = dict_get_key(cells_in_univ_dict, key_list%data%key)
! allocate cell list for universe
allocate(univ % cells(count))
univ % n_cells = count
! move to next universe
key_list => key_list%next
end do
! Also allocate a list for keeping track of where cells have been assigned
! in each universe
allocate(index_cell_in_univ(n_universes))
index_cell_in_univ = 0
do i = 1, n_cells
c => cells(i)
! get pointer to corresponding universe
index = dict_get_key(universe_dict, c % universe)
univ => universes(index)
! increment the index for the cells array within the Universe object and
! then store the index of the Cell object in that array
index_cell_in_univ(index) = index_cell_in_univ(index) + 1
univ % cells(index_cell_in_univ(index)) = i
end do
end subroutine prepare_universes
!===============================================================================
! ADJUST_INDICES changes the values for 'surfaces' for each cell and the
! material index assigned to each to the indices in the surfaces and material
@ -152,67 +242,91 @@ contains
subroutine adjust_indices()
integer :: i ! index in cells array
integer :: j ! index over surface list
integer :: index ! index in surfaces/materials array
integer :: surf_num ! user-specified surface number
integer :: bc ! boundary condition
character(MAX_LINE_LEN) :: msg ! output/error message
type(Cell), pointer :: c => null()
type(Surface), pointer :: surf => null()
type(ListKeyValueII), pointer :: key_list => null()
integer :: i ! index in cells array
integer :: j ! index over surface list
integer :: k
integer :: index ! index in surfaces/materials array
integer :: universe_num ! user-specified universe number
integer :: surf_num ! user-specified surface number
character(MAX_LINE_LEN) :: msg ! output/error message
type(Cell), pointer :: c => null()
type(Lattice), pointer :: l => null()
do i = 1, n_cells
! adjust boundary list
! =======================================================================
! ADJUST SURFACE LIST FOR EACH CELL
c => cells(i)
do j = 1, c%n_surfaces
surf_num = c%surfaces(j)
do j = 1, c % n_surfaces
surf_num = c % surfaces(j)
if (surf_num < OP_DIFFERENCE) then
index = dict_get_key(surface_dict, abs(surf_num))
if (index == DICT_NULL) then
surf_num = abs(surf_num)
msg = "Could not find surface " // trim(int_to_str(surf_num)) // &
& " specified on cell " // trim(int_to_str(c%uid))
& " specified on cell " // trim(int_to_str(c % uid))
call fatal_error(msg)
end if
c%surfaces(j) = sign(index, surf_num)
c % surfaces(j) = sign(index, surf_num)
end if
end do
! adjust material indices
if (c % type == CELL_NORMAL) then
index = dict_get_key(material_dict, c%material)
if (index == DICT_NULL) then
msg = "Could not find material " // trim(int_to_str(c%material)) // &
& " specified on cell " // trim(int_to_str(c%uid))
! =======================================================================
! ADJUST UNIVERSE INDEX FOR EACH CELL
if (dict_has_key(universe_dict, c % universe)) then
c % universe = dict_get_key(universe_dict, c % universe)
else
msg = "Could not find universe " // trim(int_to_str(c % universe)) // &
" specified on cell " // trim(int_to_str(c % uid))
call fatal_error(msg)
end if
! =======================================================================
! ADJUST MATERIAL/FILL POINTERS FOR EACH CELL
if (c % material /= 0) then
if (dict_has_key(material_dict, c % material)) then
c % type = CELL_NORMAL
c % material = dict_get_key(material_dict, c % material)
else
msg = "Could not find material " // trim(int_to_str(c % material)) // &
" specified on cell " // trim(int_to_str(c % uid))
call fatal_error(msg)
end if
else
universe_num = c % fill
if (dict_has_key(universe_dict, universe_num)) then
c % type = CELL_FILL
c % fill = dict_get_key(universe_dict, universe_num)
elseif (dict_has_key(lattice_dict, universe_num)) then
c % type = CELL_LATTICE
c % fill = dict_get_key(lattice_dict, universe_num)
else
msg = "Specified fill " // trim(int_to_str(c % fill)) // " on cell " // &
trim(int_to_str(c % uid)) // " is neither a universe nor a lattice."
call fatal_error(msg)
end if
c%material = index
end if
end do
! Check to make sure boundary conditions were specified
key_list => dict_keys(bc_dict)
if (.not. associated(key_list)) then
msg = "No boundary conditions specified!"
call fatal_error(msg)
end if
! ==========================================================================
! ADJUST UNIVERSE INDICES FOR EACH LATTICE
! Set boundary conditions for surfaces
do while (associated(key_list))
! find index of universe in universes array
surf_num = key_list%data%key
bc = key_list%data%value
! establish pointer to surface
index = dict_get_key(surface_dict, surf_num)
surf => surfaces(index)
! set boundary condition
surf % bc = bc
! move to next universe
key_list => key_list%next
do i = 1, n_lattices
l => lattices(i)
do j = 1, l % n_x
do k = 1, l % n_y
universe_num = l % element(j,k)
if (dict_has_key(universe_dict, universe_num)) then
l % element(j,k) = dict_get_key(universe_dict, universe_num)
else
msg = "Invalid universe number " // trim(int_to_str(universe_num)) &
// " specified on lattice " // trim(int_to_str(l % uid))
call fatal_error(msg)
end if
end do
end do
end do
end subroutine adjust_indices

View file

@ -1,873 +0,0 @@
module input_old
use constants
use datatypes, only: dict_create, dict_add_key, dict_get_key, &
dict_has_key, dict_keys
use datatypes_header, only: DictionaryII, ListKeyValueII, ListKeyValueCI
use geometry_header, only: Cell, Surface, Universe, BASE_UNIVERSE
use fileio, only: get_next_line
use global
use error, only: fatal_error
use output, only: message
use string, only: lower_case, is_number, str_to_int, int_to_str, &
str_to_real
implicit none
type(DictionaryII), pointer :: & ! used to count how many cells each
& ucount_dict => null(), & ! universe contains
& bc_dict => null() ! store boundary conditions
integer, allocatable :: index_cell_in_univ(:)
contains
!===============================================================================
! READ_COUNT makes a first pass through the input file to determine how many
! cells, universes, surfaces, materials, sources, etc there are in the problem.
!===============================================================================
subroutine read_count(filename)
character(*), intent(in) :: filename
integer :: in = 7 ! unit # for input file
integer :: index ! index in universes array
integer :: ioError ! error status for file access
integer :: n ! number of words on a line
integer :: count ! number of cells in a universe
integer :: universe_num ! user-specified universe #
character(MAX_LINE_LEN) :: msg ! output/error message
character(MAX_WORD_LEN) :: words(MAX_WORDS) ! words on a line
type(ListKeyValueII), pointer :: key_list => null()
type(Universe), pointer :: univ => null()
msg = "First pass through input file..."
call message(msg, 5)
n_cells = 0
n_universes = 0
n_surfaces = 0
n_materials = 0
n_tallies = 0
call dict_create(ucount_dict)
call dict_create(universe_dict)
call dict_create(lattice_dict)
open(FILE=filename, UNIT=in, STATUS='old', &
& ACTION='read', IOSTAT=ioError)
if (ioError /= 0) then
msg = "Error while opening file: " // filename
call fatal_error(msg)
end if
do
call get_next_line(in, words, n, ioError)
if (ioError /= 0) exit
if (n == 0) cycle
select case (trim(words(1)))
case ('cell')
n_cells = n_cells + 1
! For cells, we also need to check if there's a new universe -- also
! for every cell add 1 to the count of cells for the specified
! universe
universe_num = str_to_int(words(3))
if (.not. dict_has_key(ucount_dict, universe_num)) then
n_universes = n_universes + 1
count = 1
call dict_add_key(universe_dict, universe_num, n_universes)
else
count = 1 + dict_get_key(ucount_dict, universe_num)
end if
call dict_add_key(ucount_dict, universe_num, count)
case ('surface')
n_surfaces = n_surfaces + 1
case ('material')
n_materials = n_materials + 1
case ('tally')
n_tallies = n_tallies + 1
case ('lattice')
n_lattices = n_lattices + 1
! For lattices, we also need to check if there's a new universe --
! also for every cell add 1 to the count of cells for the specified
! universe
universe_num = str_to_int(words(2))
call dict_add_key(lattice_dict, universe_num, n_lattices)
end select
end do
! Check to make sure there are cells, surface, and materials defined for the
! problem
if (n_cells == 0) then
msg = "No cells specified!"
close(UNIT=in)
call fatal_error(msg)
elseif (n_surfaces == 0) then
msg = "No surfaces specified!"
close(UNIT=in)
call fatal_error(msg)
elseif (n_materials == 0) then
msg = "No materials specified!"
close(UNIT=in)
call fatal_error(msg)
end if
close(UNIT=in)
! Allocate arrays for cells, surfaces, etc.
allocate(cells(n_cells))
allocate(universes(n_universes))
allocate(lattices(n_lattices))
allocate(surfaces(n_surfaces))
allocate(materials(n_materials))
allocate(tallies(n_tallies))
! Also allocate a list for keeping track of where cells have been assigned
! in each universe
allocate(index_cell_in_univ(n_universes))
index_cell_in_univ = 0
! Set up dictionaries
call dict_create(cell_dict)
call dict_create(surface_dict)
call dict_create(bc_dict)
call dict_create(material_dict)
call dict_create(tally_dict)
! We also need to allocate the cell count lists for each universe. The logic
! for this is a little more convoluted. In universe_dict, the (key,value)
! pairs are the uid of the universe and the index in the array. In
! ucount_dict, it's the uid of the universe and the number of cells.
key_list => dict_keys(universe_dict)
do while (associated(key_list))
! find index of universe in universes array
index = key_list%data%value
univ => universes(index)
univ % uid = key_list%data%key
! check for lowest level universe
if (univ % uid == 0) BASE_UNIVERSE = index
! find cell count for this universe
count = dict_get_key(ucount_dict, key_list%data%key)
! allocate cell list for universe
allocate(univ % cells(count))
univ % n_cells = count
! move to next universe
key_list => key_list%next
end do
end subroutine read_count
!===============================================================================
! READ_INPUT takes a second pass through the input file and parses all the data
! on each line, calling the appropriate subroutine for each type of data item.
!===============================================================================
subroutine read_input(filename)
character(*), intent(in) :: filename
integer :: in = 7 ! unit # for input file
integer :: ioError ! error status for file access
integer :: n ! number of words on a line
integer :: index_cell ! index in cells array
integer :: index_universe ! index in universes array
integer :: index_surface ! index in surfaces array
integer :: index_lattice ! index in lattices array
integer :: index_material ! index in materials array
integer :: index_source ! index in source array (?)
integer :: index_tally ! index in tally array
character(MAX_LINE_LEN) :: msg ! output/error message
character(MAX_WORD_LEN) :: words(MAX_WORDS) ! words on a single line
msg = "Second pass through input file..."
call message(msg, 5)
index_cell = 0
index_universe = 0
index_surface = 0
index_lattice = 0
index_material = 0
index_tally = 0
index_source = 0
open(FILE=filename, UNIT=in, STATUS='old', &
& ACTION='read', IOSTAT=ioError)
if (ioError /= 0) then
msg = "Error while opening file: " // filename
call fatal_error(msg)
end if
do
call get_next_line(in, words, n, ioError)
if (ioError /= 0) exit
! skip comments
if (n==0 .or. words(1)(1:1) == '#') cycle
select case (trim(words(1)))
case ('cell')
! Read cell entry
index_cell = index_cell + 1
call read_cell(index_cell, words, n)
case ('surface')
! Read surface entry
index_surface = index_surface + 1
call read_surface(index_surface, words, n)
case ('bc')
! Read boundary condition entry
call read_bc(words, n)
case ('lattice')
! Read lattice entry
index_lattice = index_lattice + 1
call read_lattice(index_lattice, words, n)
case ('material')
! Read material entry
index_material = index_material + 1
call read_material(index_material, words, n)
case ('tally')
! Read tally entry
index_tally = index_tally + 1
call read_tally(index_tally, words, n)
case ('source')
call read_source(words, n)
case ('criticality')
call read_criticality(words, n)
case ('xs_data')
path_xsdata = words(2)
case ('verbosity')
verbosity = str_to_int(words(2))
if (verbosity == ERROR_INT) then
msg = "Invalid verbosity: " // trim(words(2))
call fatal_error(msg)
end if
case default
! do nothing
end select
end do
! deallocate array
deallocate(index_cell_in_univ)
close(UNIT=in)
end subroutine read_input
!===============================================================================
! READ_CELL parses the data on a cell card.
!===============================================================================
subroutine read_cell(index, words, n_words)
integer, intent(in) :: index ! index in cells array
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words on cell card entry
integer :: i ! index for surface list in a cell
integer :: universe_num ! user-specified universe number
integer :: n_surfaces ! number of surfaces in a cell
character(MAX_LINE_LEN) :: msg ! output/error message
character(MAX_WORD_LEN) :: word ! single word
type(Cell), pointer :: c => null()
c => cells(index)
! Read cell identifier
c % uid = str_to_int(words(2))
if (c % uid == ERROR_INT) then
msg = "Invalid cell name: " // trim(words(2))
call fatal_error(msg)
end if
call dict_add_key(cell_dict, c%uid, index)
! Read cell universe
universe_num = str_to_int(words(3))
if (universe_num == ERROR_INT) then
msg = "Invalid universe: " // trim(words(3))
call fatal_error(msg)
end if
c % universe = dict_get_key(universe_dict, universe_num)
! Read cell material
if (trim(words(4)) == 'fill') then
c % material = 0
n_surfaces = n_words - 5
! find universe
universe_num = str_to_int(words(5))
if (universe_num == ERROR_INT) then
msg = "Invalid universe fill: " // trim(words(5))
call fatal_error(msg)
end if
! check whether universe or lattice
if (dict_has_key(universe_dict, universe_num)) then
c % type = CELL_FILL
c % fill = dict_get_key(universe_dict, universe_num)
elseif (dict_has_key(lattice_dict, universe_num)) then
c % type = CELL_LATTICE
c % fill = dict_get_key(lattice_dict, universe_num)
end if
else
c % type = CELL_NORMAL
c % material = str_to_int(words(4))
c % fill = 0
if (c % material == ERROR_INT) then
msg = "Invalid material number: " // trim(words(4))
call fatal_error(msg)
end if
n_surfaces = n_words - 4
end if
! Assign number of items
c % n_surfaces = n_surfaces
! Read list of surfaces
allocate(c%surfaces(n_surfaces))
do i = 1, n_surfaces
word = words(i+n_words-n_surfaces)
if (word(1:1) == '(') then
c % surfaces(i) = OP_LEFT_PAREN
elseif (word(1:1) == ')') then
c % surfaces(i) = OP_RIGHT_PAREN
elseif (word(1:1) == ':') then
c % surfaces(i) = OP_UNION
elseif (word(1:1) == '#') then
c % surfaces(i) = OP_DIFFERENCE
else
c % surfaces(i) = str_to_int(word)
end if
end do
! Add cell to the cell list in the corresponding universe
i = c % universe
index_cell_in_univ(i) = index_cell_in_univ(i) + 1
universes(i) % cells(index_cell_in_univ(i)) = index
end subroutine read_cell
!===============================================================================
! READ_SURFACE parses the data on a surface card.
!===============================================================================
subroutine read_surface(index, words, n_words)
integer, intent(in) :: index ! index in surfaces array
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words in surface card entry
integer :: i ! index for surface coefficients
integer :: coeffs_reqd ! number of coefficients are required
character(MAX_LINE_LEN) :: msg ! output/error message
character(MAX_WORD_LEN) :: word ! single word
type(Surface), pointer :: surf => null()
surf => surfaces(index)
! Read surface identifier
surf % uid = str_to_int(words(2))
if (surf % uid == ERROR_INT) then
msg = "Invalid surface name: " // trim(words(2))
call fatal_error(msg)
end if
call dict_add_key(surface_dict, surf % uid, index)
! Read surface type
word = words(3)
call lower_case(word)
select case (trim(word))
case ('px')
surf % type = SURF_PX
coeffs_reqd = 1
case ('py')
surf % type = SURF_PY
coeffs_reqd = 1
case ('pz')
surf % type = SURF_PZ
coeffs_reqd = 1
case ('plane')
surf % type = SURF_PLANE
coeffs_reqd = 4
case ('cylx')
surf % type = SURF_CYL_X
coeffs_reqd = 3
case ('cyly')
surf % type = SURF_CYL_Y
coeffs_reqd = 3
case ('cylz')
surf % type = SURF_CYL_Z
coeffs_reqd = 3
case ('sph')
surf % type = SURF_SPHERE
coeffs_reqd = 4
case ('boxx')
surf % type = SURF_BOX_X
coeffs_reqd = 4
case ('boxy')
surf % type = SURF_BOX_Y
coeffs_reqd = 4
case ('boxz')
surf % type = SURF_BOX_Z
coeffs_reqd = 4
case ('box')
surf % type = SURF_BOX
coeffs_reqd = 6
case ('gq')
surf % type = SURF_GQ
coeffs_reqd = 10
case default
msg = "Invalid surface type: " // trim(words(3))
call fatal_error(msg)
end select
! Make sure there are enough coefficients for surface type
if (n_words-3 < coeffs_reqd) then
msg = "Not enough coefficients for surface: " // trim(words(2))
call fatal_error(msg)
end if
! Read list of surfaces
allocate(surf%coeffs(n_words-3))
do i = 1, n_words-3
surf % coeffs(i) = str_to_real(words(i+3))
end do
end subroutine read_surface
!===============================================================================
! READ_BC creates a dictionary whose (key,value) pairs are the uids of surfaces
! and specified boundary conditions, respectively. This is later used in
! adjust_indices to set the surface boundary conditions.
!===============================================================================
subroutine read_bc(words, n_words)
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words in bc entry
integer :: surface_uid ! User-specified uid of surface
integer :: bc ! Boundary condition
character(MAX_WORD_LEN) :: word ! Boundary condition (in input file)
character(MAX_LINE_LEN) :: msg ! Output/error message
! Read surface identifier
surface_uid = str_to_int(words(2))
if (surface_uid == ERROR_INT) then
msg = "Invalid surface name: " // trim(words(2))
call fatal_error(msg)
end if
! Read boundary condition
word = words(3)
call lower_case(word)
select case (trim(word))
case ('transmit')
bc = BC_TRANSMIT
case ('vacuum')
bc = BC_VACUUM
case ('reflect')
bc = BC_REFLECT
case default
msg = "Invalid boundary condition: " // trim(words(3))
call fatal_error(msg)
end select
! Add (uid, bc) to dictionary
call dict_add_key(bc_dict, surface_uid, bc)
end subroutine read_bc
!===============================================================================
! READ_LATTICE parses the data on a lattice entry.
!===============================================================================
subroutine read_lattice(index, words, n_words)
integer, intent(in) :: index ! index in lattices array
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words in lattice entry
integer :: universe_num ! user-specified universe number
integer :: n_x ! number of lattice cells in x direction
integer :: n_y ! number of lattice cells in y direction
integer :: i,j ! loop indices for Lattice % universes
integer :: index_word ! index in words array
character(MAX_LINE_LEN) :: msg ! output/error/message
character(MAX_WORD_LEN) :: word ! single word
type(Lattice), pointer :: lat => null()
lat => lattices(index)
! Read lattice universe
universe_num = str_to_int(words(2))
if (universe_num == ERROR_INT) then
msg = "Invalid universe: " // trim(words(2))
call fatal_error(msg)
end if
lat % uid = universe_num
! Read lattice type
word = words(3)
call lower_case(word)
select case(trim(word))
case ('rect')
lat % type = LATTICE_RECT
case ('hex')
lat % type = LATTICE_HEX
case default
msg = "Invalid lattice type: " // trim(words(3))
call fatal_error(msg)
end select
! Read number of lattice cells in each direction
n_x = str_to_int(words(4))
n_y = str_to_int(words(5))
if (n_x == ERROR_INT) then
msg = "Invalid number of lattice cells in x-direction: " // trim(words(4))
call fatal_error(msg)
elseif (n_y == ERROR_INT) then
msg = "Invalid number of lattice cells in y-direction: " // trim(words(5))
call fatal_error(msg)
end if
lat % n_x = n_x
lat % n_y = n_y
! Read lattice origin coordinates
lat % x0 = str_to_real(words(6))
lat % y0 = str_to_real(words(7))
! Read lattice cell widths
lat % width_x = str_to_real(words(8))
lat % width_y = str_to_real(words(9))
! Make sure enough lattice positions specified
if (n_words - 9 < n_x * n_y) then
print *, n_words, n_x, n_y
msg = "Not enough lattice positions specified."
call fatal_error(msg)
end if
! Read lattice positions
allocate(lat % element(n_x,n_y))
do j = 0, n_y - 1
do i = 1, n_x
index_word = 9 + j*n_x + i
universe_num = str_to_int(words(index_word))
if (universe_num == ERROR_INT) then
msg = "Invalid universe number: " // trim(words(index_word))
call fatal_error(msg)
end if
lat % element(i, n_y-j) = dict_get_key(universe_dict, universe_num)
end do
end do
end subroutine read_lattice
!===============================================================================
! READ_SOURCE parses the data on a source entry.
!===============================================================================
subroutine read_source(words, n_words)
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words on source entry
integer :: i ! index in values list
integer :: values_reqd ! # of values required to specify source
character(MAX_LINE_LEN) :: msg ! output/error message
character(MAX_WORD_LEN) :: word ! single word
! Read source type
word = words(2)
call lower_case(word)
select case (trim(word))
case ('box')
external_source % type = SRC_BOX
values_reqd = 6
case default
msg = "Invalid source type: " // trim(words(2))
call fatal_error(msg)
end select
! Make sure there are enough values for this source type
if (n_words-2 < values_reqd) then
msg = "Not enough values for source of type: " // trim(words(2))
call fatal_error(msg)
end if
! Read values
allocate(external_source%values(n_words-2))
do i = 1, n_words-2
external_source % values(i) = str_to_real(words(i+2))
end do
end subroutine read_source
!===============================================================================
! READ_TALLY
!===============================================================================
subroutine read_tally(index, words, n_words)
integer, intent(in) :: index ! index in materials array
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words on material entry
integer :: i ! index in words array
integer :: j
integer :: k
integer :: count
integer :: MT
integer :: cell_uid
integer :: r_bins, c_bins, e_bins
real(8) :: E
character(MAX_WORD_LEN) :: word
character(MAX_LINE_LEN) :: msg
type(Tally), pointer :: t => null()
t => tallies(index)
! Read tally identifier
t % uid = str_to_int(words(2))
if (t % uid == ERROR_INT) then
msg = "Invalid tally name: " // trim(words(2))
call fatal_error(msg)
end if
call dict_add_key(tally_dict, t % uid, index)
i = 3
do while (i <= n_words)
word = words(i)
call lower_case(word)
select case (trim(word))
case ('reaction')
! ====================================================================
! READ REACTION LIST
! Determine how many reactions are listed
do j = i+1, n_words
if (.not. is_number(words(j))) exit
end do
count = j - (i+1)
! Allocate space to store reactions
allocate(t % reactions(count))
! Read reaction MT values
do j = 1, count
MT = str_to_int(words(i+j))
if (MT == ERROR_INT) then
msg = "Invalid reaction MT on tally: " // int_to_str(t%uid)
call fatal_error(msg)
end if
t % reactions(j) = MT
end do
! Determine whether to sum reactions or individually bin
if (trim(words(i+count+1)) == 'sum') then
t % reaction_type = TALLY_SUM
r_bins = 1
else
t % reaction_type = TALLY_BINS
r_bins = count
end if
case ('cell')
! ====================================================================
! READ CELL LIST
! Determine how many reactions are listed
do j = i+1, n_words
if (.not. is_number(words(j))) exit
end do
count = j - (i+1)
! Allocate space to store reactions
allocate(t % cells(count))
! Read reaction MT values
do j = 1, count
cell_uid = str_to_int(words(i+j))
if (cell_uid == ERROR_INT) then
msg = "Invalid cell number on tally: " // int_to_str(t%uid)
call fatal_error(msg)
end if
t % cells(j) = cell_uid
end do
! Determine whether to sum reactions or individually bin
if (trim(words(i+count+1)) == 'sum') then
t % cell_type = TALLY_SUM
c_bins = 1
else
t % cell_type = TALLY_BINS
c_bins = count
end if
case ('energy')
! ====================================================================
! READ ENERGY LIST
! Determine how many energies are listed
do j = i+1, n_words
if (.not. is_number(words(j)(1:1))) exit
end do
count = j - (i+1)
! Allocate space to store energies
allocate(t % energies(count))
! Read reaction MT values
do j = 1, count
E = str_to_real(words(i+j))
if (E == ERROR_REAL) then
msg = "Invalid energy on tally: " // int_to_str(t % uid)
call fatal_error(msg)
end if
t % energies(j) = E
end do
e_bins = count - 1
case ('material')
! TODO: Add ability to read material lists
case ('universe')
! TODO: Add ability to read universe lists
case ('lattice')
! TODO: Add lattice tally ability
end select
! Move index in words forward
i = i + 1 + count
end do
! allocate tally scores
allocate(t % score(r_bins, c_bins, e_bins))
! initialize tallies
forall (i=1:r_bins, j=1:c_bins, k=1:e_bins)
t % score(i,j,k) % n_events = 0
t % score(i,j,k) % val = ZERO
t % score(i,j,k) % val_sq = ZERO
end forall
end subroutine read_tally
!===============================================================================
! READ_MATERIAL parses a material card. Note that atom percents and densities
! are normalized in a separate routine
!===============================================================================
subroutine read_material(index, words, n_words)
integer, intent(in) :: index ! index in materials array
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words on material entry
integer :: i ! index over nuclides
integer :: n_nuclides ! number of nuclides in material
character(MAX_LINE_LEN) :: msg ! output/error message
type(Material), pointer :: mat => null()
! Check for correct number of arguments
if (mod(n_words,2) == 0 .or. n_words < 5) then
msg = "Invalid number of arguments for material: " // trim(words(2))
call fatal_error(msg)
end if
! Determine and set number of nuclides
n_nuclides = (n_words-3)/2
mat => materials(index)
mat % n_nuclides = n_nuclides
! Read surface identifier
mat % uid = str_to_int(words(2))
if (mat % uid == ERROR_INT) then
msg = "Invalid surface name: " // trim(words(2))
call fatal_error(msg)
end if
call dict_add_key(material_dict, mat%uid, index)
! Read atom density
mat % atom_density = str_to_real(words(3))
! allocate isotope and density list
allocate(mat%names(n_nuclides))
allocate(mat%xsdata(n_nuclides))
allocate(mat%nuclide(n_nuclides))
allocate(mat%atom_percent(n_nuclides))
! read names and percentage
do i = 1, n_nuclides
mat % names(i) = words(2*i+2)
mat % atom_percent(i) = str_to_real(words(2*i+3))
end do
end subroutine read_material
!===============================================================================
! READ_CRITICALITY parses the data on a criticality card. This card specifies
! that the problem at hand is a criticality calculation and gives the number of
! cycles, inactive cycles, and particles per cycle.
!===============================================================================
subroutine read_criticality(words, n_words)
integer, intent(in) :: n_words ! number of words
character(*), intent(in) :: words(n_words) ! words on criticality card
character(MAX_LINE_LEN) :: msg ! output/error message
! Set problem type to criticality
problem_type = PROB_CRITICALITY
! Read number of cycles
n_cycles = str_to_int(words(2))
if (n_cycles == ERROR_INT) then
msg = "Invalid number of cycles: " // trim(words(2))
call fatal_error(msg)
end if
! Read number of inactive cycles
n_inactive = str_to_int(words(3))
if (n_inactive == ERROR_INT) then
msg = "Invalid number of inactive cycles: " // trim(words(2))
call fatal_error(msg)
end if
! Read number of particles
n_particles = str_to_int(words(4))
if (n_particles == ERROR_INT) then
msg = "Invalid number of particles: " // trim(words(2))
call fatal_error(msg)
end if
end subroutine read_criticality
end module input_old

View file

@ -1,27 +0,0 @@
# test input file
cell 1 0 fill 37 -2
cell 100 37 40 -1
cell 101 37 41 1
cell 2 0 41 2 -3
surface 1 cylz 0 0 7
surface 2 cylz 0 0 9
surface 3 cylz 0 0 11
bc 3 vacuum
material 40 -4.5 &
92235.03c 1.0
material 41 -1.0 &
1001.03c 2.0 &
8016.03c 1.0
source box -4 -4 -4 4 4 4
tally 1 reaction 2 cell 2 energy limits
xs_data /opt/serpent/xsdata/endfb7
criticality 15 5 10000
verbosity 7

475
src/input_xml.f90 Normal file
View file

@ -0,0 +1,475 @@
module input_xml
use constants
use datatypes, only: dict_create, dict_add_key, dict_has_key, &
dict_get_key
use error, only: fatal_error
use geometry_header, only: Cell, Surface, Lattice
use global
use string, only: lower_case, int_to_str
implicit none
type(DictionaryII), pointer :: & ! used to count how many cells each
& cells_in_univ_dict => null() ! universe contains
contains
!===============================================================================
! READ_INPUT_XML calls each of the separate subroutines for reading settings,
! geometry, materials, and tallies.
!===============================================================================
subroutine read_input_xml()
call read_settings_xml()
call read_geometry_xml()
call read_material_xml()
end subroutine read_input_xml
!===============================================================================
! READ_SETTINGS_XML reads data from a settings.xml file and parses it, checking
! for errors and placing properly-formatted data in the right data structures
!===============================================================================
subroutine read_settings_xml()
use xml_data_settings_t
integer :: n
integer :: coeffs_reqd
character(MAX_WORD_LEN) :: type
character(MAX_LINE_LEN) :: msg
character(MAX_LINE_LEN) :: filename
filename = trim(path_input) // "settings.xml"
call read_xml_file_settings_t(filename)
! Cross-section library path
path_xsdata = trim(xslibrary % path)
! Criticality information
if (criticality % cycles > 0) then
problem_type = PROB_CRITICALITY
n_particles = criticality % particles
n_cycles = criticality % cycles
n_inactive = criticality % inactive
end if
! Verbosity
verbosity = verbosity_
if (associated(source_ % coeffs)) then
! Determine external source type
type = source_ % type
call lower_case(type)
select case (trim(type))
case ('box')
external_source % type = SRC_BOX
coeffs_reqd = 6
case default
msg = "Invalid source type: " // trim(source_ % type)
call fatal_error(msg)
end select
! Coefficients for external surface
n = size(source_ % coeffs)
if (n < coeffs_reqd) then
msg = "Not enough coefficients specified for external source."
print *, n, coeffs_reqd
call fatal_error(msg)
elseif (n > coeffs_reqd) then
msg = "Too many coefficients specified for external source."
call fatal_error(msg)
else
allocate(external_source % values(n))
external_source % values = source_ % coeffs
end if
end if
end subroutine read_settings_xml
!===============================================================================
! READ_GEOMETRY_XML reads data from a geometry.xml file and parses it, checking
! for errors and placing properly-formatted data in the right data structures
!===============================================================================
subroutine read_geometry_xml()
use xml_data_geometry_t
integer :: i, j, k
integer :: n
integer :: n_x, n_y
integer :: universe_num
integer :: count
integer :: coeffs_reqd
character(MAX_LINE_LEN) :: filename
character(MAX_LINE_LEN) :: msg
character(MAX_WORD_LEN) :: word
type(Cell), pointer :: c => null()
type(Surface), pointer :: s => null()
type(Lattice), pointer :: l => null()
! ==========================================================================
! READ CELLS FROM GEOMETRY.XML
filename = trim(path_input) // "geometry.xml"
call read_xml_file_geometry_t(filename)
! Allocate cells array
n_cells = size(cell_)
allocate(cells(n_cells))
n_universes = 0
do i = 1, n_cells
c => cells(i)
! Copy data into cells
c % uid = cell_(i) % uid
c % universe = cell_(i) % universe
c % material = cell_(i) % material
c % fill = cell_(i) % fill
! Check to make sure that both material and fill haven't been
! specified simultaneously
if (c % material /= 0 .and. c % fill /= 0) then
msg = "Cannot specify material and fill simultaneously"
call fatal_error(msg)
end if
! Check to make sure that surfaces were specified
if (.not. associated(cell_(i) % surfaces)) then
msg = "No surfaces specified for cell " // trim(int_to_str(c % uid))
call fatal_error(msg)
end if
! Allocate array for surfaces and copy
n = size(cell_(i) % surfaces)
c % n_surfaces = n
allocate(c % surfaces(n))
c % surfaces = cell_(i) % surfaces
! Add cell to dictionary
call dict_add_key(cell_dict, c % uid, i)
! For cells, we also need to check if there's a new universe --
! also for every cell add 1 to the count of cells for the
! specified universe
universe_num = cell_(i) % universe
if (.not. dict_has_key(cells_in_univ_dict, universe_num)) then
n_universes = n_universes + 1
count = 1
call dict_add_key(universe_dict, universe_num, n_universes)
else
count = 1 + dict_get_key(cells_in_univ_dict, universe_num)
end if
call dict_add_key(cells_in_univ_dict, universe_num, count)
end do
! ==========================================================================
! READ SURFACES FROM GEOMETRY.XML
! Allocate cells array
n_surfaces = size(surface_)
allocate(surfaces(n_surfaces))
do i = 1, n_surfaces
s => surfaces(i)
! Copy data into cells
s % uid = surface_(i) % uid
! Copy and interpret surface type
word = surface_(i) % type
call lower_case(word)
select case(trim(word))
case ('x-plane')
s % type = SURF_PX
coeffs_reqd = 1
case ('y-plane')
s % type = SURF_PY
coeffs_reqd = 1
case ('z-plane')
s % type = SURF_PZ
coeffs_reqd = 1
case ('plane')
s % type = SURF_PLANE
coeffs_reqd = 4
case ('x-cylinder')
s % type = SURF_CYL_X
coeffs_reqd = 3
case ('y-cylinder')
s % type = SURF_CYL_Y
coeffs_reqd = 3
case ('z-cylinder')
s % type = SURF_CYL_Z
coeffs_reqd = 3
case ('sphere')
s % type = SURF_SPHERE
coeffs_reqd = 4
case ('box-x')
s % type = SURF_BOX_X
coeffs_reqd = 4
case ('box-y')
s % type = SURF_BOX_Y
coeffs_reqd = 4
case ('box-z')
s % type = SURF_BOX_Z
coeffs_reqd = 4
case ('box')
s % type = SURF_BOX
coeffs_reqd = 6
case ('quadratic')
s % type = SURF_GQ
coeffs_reqd = 10
case default
msg = "Invalid surface type: " // trim(surface_(i) % type)
call fatal_error(msg)
end select
! Check to make sure that the proper number of coefficients
! have been specified for the given type of surface. Then copy
! surface coordinates.
n = size(surface_(i) % coeffs)
if (n < coeffs_reqd) then
msg = "Not enough coefficients specified for surface: " // &
trim(int_to_str(s % uid))
print *, n, coeffs_reqd
call fatal_error(msg)
elseif (n > coeffs_reqd) then
msg = "Too many coefficients specified for surface: " // &
trim(int_to_str(s % uid))
call fatal_error(msg)
else
allocate(s % coeffs(n))
s % coeffs = surface_(i) % coeffs
end if
! Boundary conditions
word = surface_(i) % boundary
call lower_case(word)
select case (trim(word))
case ('transmission', 'transmit', '')
s % bc = BC_TRANSMIT
case ('vacuum')
s % bc = BC_VACUUM
case ('reflective', 'reflect', 'reflecting')
s % bc = BC_REFLECT
case ('periodic')
s % bc = BC_PERIODIC
case default
msg = "Unknown boundary condition '" // trim(word) // &
"' specified on surface " // trim(int_to_str(s % uid))
call fatal_error(msg)
end select
! Add surface to dictionary
call dict_add_key(surface_dict, s % uid, i)
end do
! ==========================================================================
! READ LATTICES FROM GEOMETRY.XML
! Allocate lattices array
n_lattices = size(lattice_)
allocate(lattices(n_lattices))
do i = 1, n_lattices
l => lattices(i)
! UID of lattice
l % uid = lattice_(i) % uid
! Read lattice type
word = lattice_(i) % type
call lower_case(word)
select case (trim(word))
case ('rect', 'rectangle', 'rectangular')
l % type = LATTICE_RECT
case ('hex', 'hexagon', 'hexagonal')
l % type = LATTICE_HEX
case default
msg = "Invalid lattice type: " // trim(lattice_(i) % type)
call fatal_error(msg)
end select
! Read number of lattice cells in each dimension
n = size(lattice_(i) % dimension)
if (n /= 2 .and. n /= 3) then
msg = "Lattice must be two or three dimensions."
call fatal_error(msg)
end if
n_x = lattice_(i) % dimension(1)
n_y = lattice_(i) % dimension(2)
l % n_x = n_x
l % n_y = n_y
! Read lattice origin location
if (size(lattice_(i) % dimension) /= size(lattice_(i) % origin)) then
msg = "Number of entries on <origin> must be the same as the " // &
"number of entries on <dimension>."
call fatal_error(msg)
end if
l % x0 = lattice_(i) % origin(1)
l % y0 = lattice_(i) % origin(2)
! Read lattice widths
if (size(lattice_(i) % width) /= size(lattice_(i) % origin)) then
msg = "Number of entries on <width> must be the same as the " // &
"number of entries on <origin>."
call fatal_error(msg)
end if
l % width_x = lattice_(i) % width(1)
l % width_y = lattice_(i) % width(2)
! Read universes
allocate(l % element(n_x, n_y))
do k = 0, n_y - 1
do j = 1, n_x
l % element(j, n_y - k) = lattice_(i) % universes(j + k*n_x)
end do
end do
! Add lattice to dictionary
call dict_add_key(lattice_dict, l % uid, i)
end do
end subroutine read_geometry_xml
!===============================================================================
! READ_MATERIAL_XML reads data from a material.xml file and parses it, checking
! for errors and placing properly-formatted data in the right data structures
!===============================================================================
subroutine read_material_xml
use xml_data_material_t
integer :: i, j
integer :: n
real(8) :: val
character(MAX_WORD_LEN) :: units
character(MAX_WORD_LEN) :: name
character(MAX_LINE_LEN) :: filename
character(MAX_LINE_LEN) :: msg
type(Material), pointer :: m => null()
type(nuclide_xml), pointer :: nuc => null()
filename = trim(path_input) // "material.xml"
call read_xml_file_material_t(filename)
! Allocate cells array
n_materials = size(material_)
allocate(materials(n_materials))
do i = 1, n_materials
m => materials(i)
! Copy material uid
m % uid = material_(i) % uid
! Copy density -- the default value for the units is given in the
! material_t.xml file and doesn't need to be specified here, hence case
! default results in an error.
val = material_(i) % density % value
units = material_(i) % density % units
call lower_case(units)
select case(trim(units))
case ('g/cc', 'g/cm3')
m % atom_density = -val
case ('kg/m3')
m % atom_density = -0.001 * val
case ('atom/b-cm')
m % atom_density = val
case ('atom/cm3', 'atom/cc')
m % atom_density = 1.0e-24 * val
case default
msg = "Unkwown units '" // trim(material_(i) % density % units) // &
"' specified on material " // trim(int_to_str(m % uid))
call fatal_error(msg)
end select
! Check to ensure material has at least one nuclide
if (.not. associated(material_(i) % nuclides)) then
msg = "No nuclides specified on material " // trim(int_to_str(m % uid))
call fatal_error(msg)
end if
! allocate arrays in Material object
n = size(material_(i) % nuclides)
m % n_nuclides = n
allocate(m % names(n))
allocate(m % nuclide(n))
allocate(m % xsdata(n))
allocate(m % atom_percent(n))
do j = 1, n
! Combine nuclide identifier and cross section and copy into names
nuc => material_(i) % nuclides(j)
name = trim(nuc % name) // "." // trim(nuc % xs)
m % names(j) = name
! Check if no atom/weight percents were specified or if both atom and
! weight percents were specified
if (nuc % ao == ZERO .and. nuc % wo == ZERO) then
msg = "No atom or weight percent specified for nuclide " // &
trim(name)
call fatal_error(msg)
elseif (nuc % ao /= ZERO .and. nuc % wo /= ZERO) then
msg = "Cannot specify both atom and weight percents for a nuclide: " &
// trim(name)
end if
! Copy atom/weight percents
if (nuc % ao /= ZERO) then
m % atom_percent(j) = nuc % ao
else
m % atom_percent(j) = -nuc % wo
end if
end do
! Add material to dictionary
call dict_add_key(material_dict, m % uid, i)
end do
end subroutine read_material_xml
!===============================================================================
! READ_TALLIES_XML reads data from a tallies.xml file and parses it, checking
! for errors and placing properly-formatted data in the right data structures
!===============================================================================
subroutine read_tallies_xml
use xml_data_tallies_t
integer :: i
character(MAX_LINE_LEN) :: filename
character(MAX_LINE_LEN) :: msg
type(Tally), pointer :: t => null()
filename = trim(path_input) // "tallies.xml"
call read_xml_file_tallies_t(filename)
! Allocate cells array
n_tallies = size(tally_)
allocate(tallies(n_tallies))
do i = 1, n_tallies
t => tallies(i)
! Copy material uid
t % uid = tally_(i) % id
end do
end subroutine read_tallies_xml
end module input_xml

View file

@ -1,51 +0,0 @@
# test lattice input file
cell 1 0 fill 111 1 -2 3 -4
cell 100 3 40 -5
cell 101 3 41 5
lattice 111 rect 20 20 -10.0 -10.0 1.0 1.0 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 &
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
surface 1 px -9.9
surface 2 px 9.9
surface 3 py -9.9
surface 4 py 9.9
surface 5 cylz 0 0 0.4
bc 1 vacuum
bc 2 vacuum
bc 3 vacuum
bc 4 vacuum
material 40 -4.5 &
92235.03c 1.0
material 41 -1.0 &
1001.03c 2.0 &
8016.03c 1.0
source box -4 -4 -4 4 4 4
xs_data /opt/serpent/xsdata/endfb7
criticality 20 10 10000
verbosity 7

737
src/xml_geometry.f90 Normal file
View file

@ -0,0 +1,737 @@
module xml_data_geometry_t
use READ_XML_PRIMITIVES
use WRITE_XML_PRIMITIVES
use XMLPARSE
implicit none
integer, private :: lurep_
logical, private :: strict_
type cell_xml
integer :: uid
integer :: universe
integer :: material
integer :: fill
integer, dimension(:), pointer :: surfaces => null()
end type cell_xml
type surface_xml
integer :: uid
character(len=15) :: type
real(kind=kind(1.0d0)), dimension(:), pointer :: coeffs => null()
character(len=12) :: boundary
end type surface_xml
type lattice_xml
integer :: uid
character(len=12) :: type
integer, dimension(:), pointer :: dimension => null()
real(kind=kind(1.0d0)), dimension(:), pointer :: origin => null()
real(kind=kind(1.0d0)), dimension(:), pointer :: width => null()
integer, dimension(:), pointer :: universes => null()
end type lattice_xml
type(cell_xml), dimension(:), pointer :: cell_ => null()
type(surface_xml), dimension(:), pointer :: surface_ => null()
type(lattice_xml), dimension(:), pointer :: lattice_ => null()
contains
subroutine read_xml_type_cell_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(cell_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(cell_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_cell_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_cell_xml_array
subroutine read_xml_type_cell_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(cell_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_uid
logical :: has_universe
logical :: has_material
logical :: has_fill
logical :: has_surfaces
has_uid = .false.
has_universe = .false.
has_material = .false.
has_fill = .false.
has_surfaces = .false.
call init_xml_type_cell_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('uid')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%uid, has_uid )
case('universe')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%universe, has_universe )
case('material')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%material, has_material )
case('fill')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%fill, has_fill )
case('surfaces')
call read_xml_integer_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%surfaces, has_surfaces )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_uid ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on uid')
endif
if ( .not. has_surfaces ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on surfaces')
endif
end subroutine read_xml_type_cell_xml
subroutine init_xml_type_cell_xml_array( dvar )
type(cell_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_cell_xml_array
subroutine init_xml_type_cell_xml(dvar)
type(cell_xml) :: dvar
dvar%universe = 0
dvar%material = 0
dvar%fill = 0
end subroutine init_xml_type_cell_xml
subroutine write_xml_type_cell_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(cell_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_cell_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_cell_xml_array
subroutine write_xml_type_cell_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(cell_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'uid', indent+3, dvar%uid)
call write_to_xml_integer( info, 'universe', indent+3, dvar%universe)
call write_to_xml_integer( info, 'material', indent+3, dvar%material)
call write_to_xml_integer( info, 'fill', indent+3, dvar%fill)
call write_to_xml_integer_array( info, 'surfaces', indent+3, dvar%surfaces)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_cell_xml
subroutine read_xml_type_surface_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(surface_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(surface_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_surface_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_surface_xml_array
subroutine read_xml_type_surface_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(surface_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_uid
logical :: has_type
logical :: has_coeffs
logical :: has_boundary
has_uid = .false.
has_type = .false.
has_coeffs = .false.
has_boundary = .false.
call init_xml_type_surface_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('uid')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%uid, has_uid )
case('type')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%type, has_type )
case('coeffs')
call read_xml_double_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%coeffs, has_coeffs )
case('boundary')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%boundary, has_boundary )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_uid ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on uid')
endif
if ( .not. has_type ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on type')
endif
if ( .not. has_coeffs ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on coeffs')
endif
end subroutine read_xml_type_surface_xml
subroutine init_xml_type_surface_xml_array( dvar )
type(surface_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_surface_xml_array
subroutine init_xml_type_surface_xml(dvar)
type(surface_xml) :: dvar
dvar%boundary = 'transmit'
end subroutine init_xml_type_surface_xml
subroutine write_xml_type_surface_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(surface_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_surface_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_surface_xml_array
subroutine write_xml_type_surface_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(surface_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'uid', indent+3, dvar%uid)
call write_to_xml_word( info, 'type', indent+3, dvar%type)
call write_to_xml_double_array( info, 'coeffs', indent+3, dvar%coeffs)
call write_to_xml_word( info, 'boundary', indent+3, dvar%boundary)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_surface_xml
subroutine read_xml_type_lattice_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(lattice_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(lattice_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_lattice_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_lattice_xml_array
subroutine read_xml_type_lattice_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(lattice_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_uid
logical :: has_type
logical :: has_dimension
logical :: has_origin
logical :: has_width
logical :: has_universes
has_uid = .false.
has_type = .false.
has_dimension = .false.
has_origin = .false.
has_width = .false.
has_universes = .false.
call init_xml_type_lattice_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('uid')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%uid, has_uid )
case('type')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%type, has_type )
case('dimension')
call read_xml_integer_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%dimension, has_dimension )
case('origin')
call read_xml_double_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%origin, has_origin )
case('width')
call read_xml_double_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%width, has_width )
case('universes')
call read_xml_integer_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%universes, has_universes )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_uid ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on uid')
endif
if ( .not. has_type ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on type')
endif
if ( .not. has_dimension ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on dimension')
endif
if ( .not. has_origin ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on origin')
endif
if ( .not. has_width ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on width')
endif
if ( .not. has_universes ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on universes')
endif
end subroutine read_xml_type_lattice_xml
subroutine init_xml_type_lattice_xml_array( dvar )
type(lattice_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_lattice_xml_array
subroutine init_xml_type_lattice_xml(dvar)
type(lattice_xml) :: dvar
end subroutine init_xml_type_lattice_xml
subroutine write_xml_type_lattice_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(lattice_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_lattice_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_lattice_xml_array
subroutine write_xml_type_lattice_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(lattice_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'uid', indent+3, dvar%uid)
call write_to_xml_word( info, 'type', indent+3, dvar%type)
call write_to_xml_integer_array( info, 'dimension', indent+3, dvar%dimension)
call write_to_xml_double_array( info, 'origin', indent+3, dvar%origin)
call write_to_xml_double_array( info, 'width', indent+3, dvar%width)
call write_to_xml_integer_array( info, 'universes', indent+3, dvar%universes)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_lattice_xml
subroutine read_xml_file_geometry_t(fname, lurep, errout)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
logical, intent(out), optional :: errout
type(XML_PARSE) :: info
logical :: error
character(len=80) :: tag
character(len=80) :: starttag
logical :: endtag
character(len=80), dimension(1:2,1:20) :: attribs
integer :: noattribs
character(len=200), dimension(1:100) :: data
integer :: nodata
logical :: has_cell_
logical :: has_surface_
logical :: has_lattice_
has_cell_ = .false.
allocate(cell_(0))
has_surface_ = .false.
allocate(surface_(0))
has_lattice_ = .false.
allocate(lattice_(0))
call init_xml_file_geometry_t
call xml_open( info, fname, .true. )
call xml_options( info, report_errors=.true., ignore_whitespace=.true.)
lurep_ = 0
if ( present(lurep) ) then
lurep_ = lurep
call xml_options( info, report_lun=lurep )
endif
do
call xml_get( info, starttag, endtag, attribs, noattribs, &
data, nodata)
if ( starttag /= '!--' ) exit
enddo
if ( starttag /= "geometry" ) then
call xml_report_errors( info, &
'XML-file should have root element "geometry"')
error = .true.
call xml_close(info)
return
endif
strict_ = .true.
error = .false.
do
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('cell')
call read_xml_type_cell_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
cell_, has_cell_ )
case('surface')
call read_xml_type_surface_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
surface_, has_surface_ )
case('lattice')
call read_xml_type_lattice_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
lattice_, has_lattice_ )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_cell_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on cell_')
endif
if ( .not. has_surface_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on surface_')
endif
if ( .not. has_lattice_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on lattice_')
endif
if ( present(errout) ) errout = error
end subroutine
subroutine write_xml_file_geometry_t(fname, lurep)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
type(XML_PARSE) :: info
integer :: indent = 0
call xml_open( info, fname, .false. )
call xml_options( info, report_errors=.true.)
if ( present(lurep) ) then
call xml_options( info, report_errors=.true.)
endif
write(info%lun,'(a)') &
'<geometry>'
call write_xml_type_cell_xml_array( info, 'cell', indent+3, cell_)
call write_xml_type_surface_xml_array( info, 'surface', indent+3, surface_)
call write_xml_type_lattice_xml_array( info, 'lattice', indent+3, lattice_)
write(info%lun,'(a)') '</geometry>'
call xml_close(info)
end subroutine
subroutine init_xml_file_geometry_t
end subroutine
end module

822
src/xml_material.f90 Normal file
View file

@ -0,0 +1,822 @@
module xml_data_material_t
use READ_XML_PRIMITIVES
use WRITE_XML_PRIMITIVES
use XMLPARSE
implicit none
integer, private :: lurep_
logical, private :: strict_
type density_xml
real(kind=kind(1.0d0)) :: value
character(len=10) :: units
end type density_xml
type nuclide_xml
character(len=10) :: name
character(len=3) :: xs
real(kind=kind(1.0d0)) :: ao
real(kind=kind(1.0d0)) :: wo
end type nuclide_xml
type sab_xml
character(len=10) :: name
character(len=3) :: xs
end type sab_xml
type material_xml
integer :: uid
type(density_xml) :: density
type(nuclide_xml), dimension(:), pointer :: nuclides => null()
type(sab_xml) :: sab
end type material_xml
type(material_xml), dimension(:), pointer :: material_ => null()
contains
subroutine read_xml_type_density_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(density_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(density_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_density_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_density_xml_array
subroutine read_xml_type_density_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(density_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_value
logical :: has_units
has_value = .false.
has_units = .false.
call init_xml_type_density_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('value')
call read_xml_double( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%value, has_value )
case('units')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%units, has_units )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_value ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on value')
endif
end subroutine read_xml_type_density_xml
subroutine init_xml_type_density_xml_array( dvar )
type(density_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_density_xml_array
subroutine init_xml_type_density_xml(dvar)
type(density_xml) :: dvar
dvar%units = 'atom/b-cm'
end subroutine init_xml_type_density_xml
subroutine write_xml_type_density_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(density_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_density_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_density_xml_array
subroutine write_xml_type_density_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(density_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_double( info, 'value', indent+3, dvar%value)
call write_to_xml_word( info, 'units', indent+3, dvar%units)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_density_xml
subroutine read_xml_type_nuclide_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(nuclide_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(nuclide_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_nuclide_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_nuclide_xml_array
subroutine read_xml_type_nuclide_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(nuclide_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_name
logical :: has_xs
logical :: has_ao
logical :: has_wo
has_name = .false.
has_xs = .false.
has_ao = .false.
has_wo = .false.
call init_xml_type_nuclide_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('name')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%name, has_name )
case('xs')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%xs, has_xs )
case('ao')
call read_xml_double( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%ao, has_ao )
case('wo')
call read_xml_double( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%wo, has_wo )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_name ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on name')
endif
if ( .not. has_xs ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on xs')
endif
end subroutine read_xml_type_nuclide_xml
subroutine init_xml_type_nuclide_xml_array( dvar )
type(nuclide_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_nuclide_xml_array
subroutine init_xml_type_nuclide_xml(dvar)
type(nuclide_xml) :: dvar
dvar%ao = 0.0
dvar%wo = 0.0
end subroutine init_xml_type_nuclide_xml
subroutine write_xml_type_nuclide_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(nuclide_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_nuclide_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_nuclide_xml_array
subroutine write_xml_type_nuclide_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(nuclide_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_word( info, 'name', indent+3, dvar%name)
call write_to_xml_word( info, 'xs', indent+3, dvar%xs)
call write_to_xml_double( info, 'ao', indent+3, dvar%ao)
call write_to_xml_double( info, 'wo', indent+3, dvar%wo)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_nuclide_xml
subroutine read_xml_type_sab_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(sab_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(sab_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_sab_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_sab_xml_array
subroutine read_xml_type_sab_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(sab_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_name
logical :: has_xs
has_name = .false.
has_xs = .false.
call init_xml_type_sab_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('name')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%name, has_name )
case('xs')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%xs, has_xs )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_name ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on name')
endif
if ( .not. has_xs ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on xs')
endif
end subroutine read_xml_type_sab_xml
subroutine init_xml_type_sab_xml_array( dvar )
type(sab_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_sab_xml_array
subroutine init_xml_type_sab_xml(dvar)
type(sab_xml) :: dvar
end subroutine init_xml_type_sab_xml
subroutine write_xml_type_sab_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(sab_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_sab_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_sab_xml_array
subroutine write_xml_type_sab_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(sab_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_word( info, 'name', indent+3, dvar%name)
call write_to_xml_word( info, 'xs', indent+3, dvar%xs)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_sab_xml
subroutine read_xml_type_material_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(material_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(material_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_material_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_material_xml_array
subroutine read_xml_type_material_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(material_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_uid
logical :: has_density
logical :: has_nuclides
logical :: has_sab
has_uid = .false.
has_density = .false.
has_nuclides = .false.
allocate(dvar%nuclides(0))
has_sab = .false.
call init_xml_type_material_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('uid')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%uid, has_uid )
case('density')
call read_xml_type_density_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%density, has_density )
case('nuclide')
call read_xml_type_nuclide_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%nuclides, has_nuclides )
case('sab')
call read_xml_type_sab_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%sab, has_sab )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_uid ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on uid')
endif
if ( .not. has_density ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on density')
endif
if ( .not. has_nuclides ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on nuclides')
endif
if ( .not. has_sab ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on sab')
endif
end subroutine read_xml_type_material_xml
subroutine init_xml_type_material_xml_array( dvar )
type(material_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_material_xml_array
subroutine init_xml_type_material_xml(dvar)
type(material_xml) :: dvar
end subroutine init_xml_type_material_xml
subroutine write_xml_type_material_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(material_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_material_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_material_xml_array
subroutine write_xml_type_material_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(material_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'uid', indent+3, dvar%uid)
call write_xml_type_density_xml( info, 'density', indent+3, dvar%density)
call write_xml_type_nuclide_xml_array( info, 'nuclide', indent+3, dvar%nuclides)
call write_xml_type_sab_xml( info, 'sab', indent+3, dvar%sab)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_material_xml
subroutine read_xml_file_material_t(fname, lurep, errout)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
logical, intent(out), optional :: errout
type(XML_PARSE) :: info
logical :: error
character(len=80) :: tag
character(len=80) :: starttag
logical :: endtag
character(len=80), dimension(1:2,1:20) :: attribs
integer :: noattribs
character(len=200), dimension(1:100) :: data
integer :: nodata
logical :: has_material_
has_material_ = .false.
allocate(material_(0))
call init_xml_file_material_t
call xml_open( info, fname, .true. )
call xml_options( info, report_errors=.true., ignore_whitespace=.true.)
lurep_ = 0
if ( present(lurep) ) then
lurep_ = lurep
call xml_options( info, report_lun=lurep )
endif
do
call xml_get( info, starttag, endtag, attribs, noattribs, &
data, nodata)
if ( starttag /= '!--' ) exit
enddo
if ( starttag /= "materials" ) then
call xml_report_errors( info, &
'XML-file should have root element "materials"')
error = .true.
call xml_close(info)
return
endif
strict_ = .false.
error = .false.
do
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('material')
call read_xml_type_material_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
material_, has_material_ )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_material_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on material_')
endif
if ( present(errout) ) errout = error
end subroutine
subroutine write_xml_file_material_t(fname, lurep)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
type(XML_PARSE) :: info
integer :: indent = 0
call xml_open( info, fname, .false. )
call xml_options( info, report_errors=.true.)
if ( present(lurep) ) then
call xml_options( info, report_errors=.true.)
endif
write(info%lun,'(a)') &
'<materials>'
call write_xml_type_material_xml_array( info, 'material', indent+3, material_)
write(info%lun,'(a)') '</materials>'
call xml_close(info)
end subroutine
subroutine init_xml_file_material_t
end subroutine
end module

650
src/xml_settings.f90 Normal file
View file

@ -0,0 +1,650 @@
module xml_data_settings_t
use READ_XML_PRIMITIVES
use WRITE_XML_PRIMITIVES
use XMLPARSE
implicit none
integer, private :: lurep_
logical, private :: strict_
type xslibrary_xml
character(len=250) :: path
end type xslibrary_xml
type criticality_xml
integer :: cycles
integer :: inactive
integer :: particles
end type criticality_xml
type source_xml
character(len=10) :: type
real(kind=kind(1.0d0)), dimension(:), pointer :: coeffs => null()
end type source_xml
type(xslibrary_xml) :: xslibrary
type(criticality_xml) :: criticality
integer :: verbosity_
type(source_xml) :: source_
contains
subroutine read_xml_type_xslibrary_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(xslibrary_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(xslibrary_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_xslibrary_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_xslibrary_xml_array
subroutine read_xml_type_xslibrary_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(xslibrary_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_path
has_path = .false.
call init_xml_type_xslibrary_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('path')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%path, has_path )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_path ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on path')
endif
end subroutine read_xml_type_xslibrary_xml
subroutine init_xml_type_xslibrary_xml_array( dvar )
type(xslibrary_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_xslibrary_xml_array
subroutine init_xml_type_xslibrary_xml(dvar)
type(xslibrary_xml) :: dvar
end subroutine init_xml_type_xslibrary_xml
subroutine write_xml_type_xslibrary_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(xslibrary_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_xslibrary_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_xslibrary_xml_array
subroutine write_xml_type_xslibrary_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(xslibrary_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_word( info, 'path', indent+3, dvar%path)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_xslibrary_xml
subroutine read_xml_type_criticality_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(criticality_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(criticality_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_criticality_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_criticality_xml_array
subroutine read_xml_type_criticality_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(criticality_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_cycles
logical :: has_inactive
logical :: has_particles
has_cycles = .false.
has_inactive = .false.
has_particles = .false.
call init_xml_type_criticality_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('cycles')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%cycles, has_cycles )
case('inactive')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%inactive, has_inactive )
case('particles')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%particles, has_particles )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_cycles ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on cycles')
endif
if ( .not. has_inactive ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on inactive')
endif
if ( .not. has_particles ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on particles')
endif
end subroutine read_xml_type_criticality_xml
subroutine init_xml_type_criticality_xml_array( dvar )
type(criticality_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_criticality_xml_array
subroutine init_xml_type_criticality_xml(dvar)
type(criticality_xml) :: dvar
end subroutine init_xml_type_criticality_xml
subroutine write_xml_type_criticality_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(criticality_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_criticality_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_criticality_xml_array
subroutine write_xml_type_criticality_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(criticality_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'cycles', indent+3, dvar%cycles)
call write_to_xml_integer( info, 'inactive', indent+3, dvar%inactive)
call write_to_xml_integer( info, 'particles', indent+3, dvar%particles)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_criticality_xml
subroutine read_xml_type_source_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(source_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(source_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_source_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_source_xml_array
subroutine read_xml_type_source_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(source_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_type
logical :: has_coeffs
has_type = .false.
has_coeffs = .false.
call init_xml_type_source_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('type')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%type, has_type )
case('coeffs')
call read_xml_double_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%coeffs, has_coeffs )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_type ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on type')
endif
if ( .not. has_coeffs ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on coeffs')
endif
end subroutine read_xml_type_source_xml
subroutine init_xml_type_source_xml_array( dvar )
type(source_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_source_xml_array
subroutine init_xml_type_source_xml(dvar)
type(source_xml) :: dvar
end subroutine init_xml_type_source_xml
subroutine write_xml_type_source_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(source_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_source_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_source_xml_array
subroutine write_xml_type_source_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(source_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_word( info, 'type', indent+3, dvar%type)
call write_to_xml_double_array( info, 'coeffs', indent+3, dvar%coeffs)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_source_xml
subroutine read_xml_file_settings_t(fname, lurep, errout)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
logical, intent(out), optional :: errout
type(XML_PARSE) :: info
logical :: error
character(len=80) :: tag
character(len=80) :: starttag
logical :: endtag
character(len=80), dimension(1:2,1:20) :: attribs
integer :: noattribs
character(len=200), dimension(1:100) :: data
integer :: nodata
logical :: has_xslibrary
logical :: has_criticality
logical :: has_verbosity_
logical :: has_source_
has_xslibrary = .false.
has_criticality = .false.
has_verbosity_ = .false.
has_source_ = .false.
call init_xml_file_settings_t
call xml_open( info, fname, .true. )
call xml_options( info, report_errors=.true., ignore_whitespace=.true.)
lurep_ = 0
if ( present(lurep) ) then
lurep_ = lurep
call xml_options( info, report_lun=lurep )
endif
do
call xml_get( info, starttag, endtag, attribs, noattribs, &
data, nodata)
if ( starttag /= '!--' ) exit
enddo
if ( starttag /= "settings" ) then
call xml_report_errors( info, &
'XML-file should have root element "settings"')
error = .true.
call xml_close(info)
return
endif
strict_ = .false.
error = .false.
do
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('xslibrary')
call read_xml_type_xslibrary_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
xslibrary, has_xslibrary )
case('criticality')
call read_xml_type_criticality_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
criticality, has_criticality )
case('verbosity')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
verbosity_, has_verbosity_ )
case('source')
call read_xml_type_source_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
source_, has_source_ )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_xslibrary ) then
error = .true.
call xml_report_errors(info, 'Missing data on xslibrary')
endif
if ( .not. has_criticality ) then
error = .true.
call xml_report_errors(info, 'Missing data on criticality')
endif
if ( .not. has_verbosity_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on verbosity_')
endif
if ( .not. has_source_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on source_')
endif
if ( present(errout) ) errout = error
end subroutine
subroutine write_xml_file_settings_t(fname, lurep)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
type(XML_PARSE) :: info
integer :: indent = 0
call xml_open( info, fname, .false. )
call xml_options( info, report_errors=.true.)
if ( present(lurep) ) then
call xml_options( info, report_errors=.true.)
endif
write(info%lun,'(a)') &
'<settings>'
call write_xml_type_xslibrary_xml( info, 'xslibrary', indent+3, xslibrary)
call write_xml_type_criticality_xml( info, 'criticality', indent+3, criticality)
call write_to_xml_integer( info, 'verbosity', indent+3, verbosity_)
call write_xml_type_source_xml( info, 'source', indent+3, source_)
write(info%lun,'(a)') '</settings>'
call xml_close(info)
end subroutine
subroutine init_xml_file_settings_t
end subroutine
end module

532
src/xml_tallies.f90 Normal file
View file

@ -0,0 +1,532 @@
module xml_data_tallies_t
use READ_XML_PRIMITIVES
use WRITE_XML_PRIMITIVES
use XMLPARSE
implicit none
integer, private :: lurep_
logical, private :: strict_
type filter_xml
character(len=250) :: region
character(len=250) :: bornin
character(len=250) :: energy
character(len=250) :: energyout
character(len=250) :: material
character(len=250) :: surface
character(len=250) :: mesh
end type filter_xml
type tally_xml
integer :: id
type(filter_xml) :: filters
character(len=250) :: reactions
character(len=250) :: nuclides
end type tally_xml
type(tally_xml), dimension(:), pointer :: tally_ => null()
contains
subroutine read_xml_type_filter_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(filter_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(filter_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_filter_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_filter_xml_array
subroutine read_xml_type_filter_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(filter_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_region
logical :: has_bornin
logical :: has_energy
logical :: has_energyout
logical :: has_material
logical :: has_surface
logical :: has_mesh
has_region = .false.
has_bornin = .false.
has_energy = .false.
has_energyout = .false.
has_material = .false.
has_surface = .false.
has_mesh = .false.
call init_xml_type_filter_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('region')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%region, has_region )
case('bornin')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%bornin, has_bornin )
case('energy')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%energy, has_energy )
case('energyout')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%energyout, has_energyout )
case('material')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%material, has_material )
case('surface')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%surface, has_surface )
case('mesh')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%mesh, has_mesh )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_region ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on region')
endif
if ( .not. has_bornin ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on bornin')
endif
if ( .not. has_energy ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on energy')
endif
if ( .not. has_energyout ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on energyout')
endif
if ( .not. has_material ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on material')
endif
if ( .not. has_surface ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on surface')
endif
if ( .not. has_mesh ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on mesh')
endif
end subroutine read_xml_type_filter_xml
subroutine init_xml_type_filter_xml_array( dvar )
type(filter_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_filter_xml_array
subroutine init_xml_type_filter_xml(dvar)
type(filter_xml) :: dvar
end subroutine init_xml_type_filter_xml
subroutine write_xml_type_filter_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(filter_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_filter_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_filter_xml_array
subroutine write_xml_type_filter_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(filter_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_word( info, 'region', indent+3, dvar%region)
call write_to_xml_word( info, 'bornin', indent+3, dvar%bornin)
call write_to_xml_word( info, 'energy', indent+3, dvar%energy)
call write_to_xml_word( info, 'energyout', indent+3, dvar%energyout)
call write_to_xml_word( info, 'material', indent+3, dvar%material)
call write_to_xml_word( info, 'surface', indent+3, dvar%surface)
call write_to_xml_word( info, 'mesh', indent+3, dvar%mesh)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_filter_xml
subroutine read_xml_type_tally_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(inout) :: tag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(tally_xml), dimension(:), pointer :: dvar
logical, intent(inout) :: has_dvar
integer :: newsize
type(tally_xml), dimension(:), pointer :: newvar
newsize = size(dvar) + 1
allocate( newvar(1:newsize) )
newvar(1:newsize-1) = dvar
deallocate( dvar )
dvar => newvar
call read_xml_type_tally_xml( info, tag, endtag, attribs, noattribs, data, nodata, &
dvar(newsize), has_dvar )
end subroutine read_xml_type_tally_xml_array
subroutine read_xml_type_tally_xml( info, starttag, endtag, attribs, noattribs, data, nodata, &
dvar, has_dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: starttag
logical, intent(inout) :: endtag
character(len=*), dimension(:,:), intent(inout) :: attribs
integer, intent(inout) :: noattribs
character(len=*), dimension(:), intent(inout) :: data
integer, intent(inout) :: nodata
type(tally_xml), intent(inout) :: dvar
logical, intent(inout) :: has_dvar
integer :: att_
integer :: noatt_
logical :: error
logical :: endtag_org
character(len=len(starttag)) :: tag
logical :: has_id
logical :: has_filters
logical :: has_reactions
logical :: has_nuclides
has_id = .false.
has_filters = .false.
has_reactions = .false.
has_nuclides = .false.
call init_xml_type_tally_xml(dvar)
has_dvar = .true.
error = .false.
att_ = 0
noatt_ = noattribs+1
endtag_org = endtag
do
if ( nodata /= 0 ) then
noattribs = 0
tag = starttag
elseif ( att_ < noatt_ .and. noatt_ > 1 ) then
att_ = att_ + 1
if ( att_ <= noatt_-1 ) then
tag = attribs(1,att_)
data(1) = attribs(2,att_)
noattribs = 0
nodata = 1
endtag = .false.
else
tag = starttag
noattribs = 0
nodata = 0
endtag = .true.
cycle
endif
else
if ( endtag_org ) then
return
else
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
endif
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('id')
call read_xml_integer( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%id, has_id )
case('filters')
call read_xml_type_filter_xml( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%filters, has_filters )
case('reactions')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%reactions, has_reactions )
case('nuclides')
call read_xml_word( &
info, tag, endtag, attribs, noattribs, data, nodata, &
dvar%nuclides, has_nuclides )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_id ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on id')
endif
if ( .not. has_filters ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on filters')
endif
if ( .not. has_reactions ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on reactions')
endif
if ( .not. has_nuclides ) then
has_dvar = .false.
call xml_report_errors(info, 'Missing data on nuclides')
endif
end subroutine read_xml_type_tally_xml
subroutine init_xml_type_tally_xml_array( dvar )
type(tally_xml), dimension(:), pointer :: dvar
if ( associated( dvar ) ) then
deallocate( dvar )
endif
allocate( dvar(0) )
end subroutine init_xml_type_tally_xml_array
subroutine init_xml_type_tally_xml(dvar)
type(tally_xml) :: dvar
end subroutine init_xml_type_tally_xml
subroutine write_xml_type_tally_xml_array( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(tally_xml), dimension(:) :: dvar
integer :: i
do i = 1,size(dvar)
call write_xml_type_tally_xml( info, tag, indent, dvar(i) )
enddo
end subroutine write_xml_type_tally_xml_array
subroutine write_xml_type_tally_xml( &
info, tag, indent, dvar )
type(XML_PARSE) :: info
character(len=*), intent(in) :: tag
integer :: indent
type(tally_xml) :: dvar
character(len=100) :: indentation
indentation = ' '
write(info%lun, '(4a)' ) indentation(1:min(indent,100)),&
'<',trim(tag), '>'
call write_to_xml_integer( info, 'id', indent+3, dvar%id)
call write_xml_type_filter_xml( info, 'filters', indent+3, dvar%filters)
call write_to_xml_word( info, 'reactions', indent+3, dvar%reactions)
call write_to_xml_word( info, 'nuclides', indent+3, dvar%nuclides)
write(info%lun,'(4a)') indentation(1:min(indent,100)), &
'</' //trim(tag) // '>'
end subroutine write_xml_type_tally_xml
subroutine read_xml_file_tallies_t(fname, lurep, errout)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
logical, intent(out), optional :: errout
type(XML_PARSE) :: info
logical :: error
character(len=80) :: tag
character(len=80) :: starttag
logical :: endtag
character(len=80), dimension(1:2,1:20) :: attribs
integer :: noattribs
character(len=200), dimension(1:100) :: data
integer :: nodata
logical :: has_tally_
has_tally_ = .false.
allocate(tally_(0))
call init_xml_file_tallies_t
call xml_open( info, fname, .true. )
call xml_options( info, report_errors=.true., ignore_whitespace=.true.)
lurep_ = 0
if ( present(lurep) ) then
lurep_ = lurep
call xml_options( info, report_lun=lurep )
endif
do
call xml_get( info, starttag, endtag, attribs, noattribs, &
data, nodata)
if ( starttag /= '!--' ) exit
enddo
if ( starttag /= "tallies" ) then
call xml_report_errors( info, &
'XML-file should have root element "tallies"')
error = .true.
call xml_close(info)
return
endif
strict_ = .false.
error = .false.
do
call xml_get( info, tag, endtag, attribs, noattribs, data, nodata )
if ( xml_error(info) ) then
write(lurep_,*) 'Error reading input file!'
error = .true.
return
endif
if ( endtag .and. tag == starttag ) then
exit
endif
if ( endtag .and. noattribs == 0 ) then
if ( xml_ok(info) ) then
cycle
else
exit
endif
endif
select case( tag )
case('tally')
call read_xml_type_tally_xml_array( &
info, tag, endtag, attribs, noattribs, data, nodata, &
tally_, has_tally_ )
case ('comment', '!--')
! Simply ignore
case default
if ( strict_ ) then
error = .true.
call xml_report_errors( info, &
'Unknown or wrongly placed tag: ' // trim(tag))
endif
end select
nodata = 0
if ( .not. xml_ok(info) ) exit
end do
if ( .not. has_tally_ ) then
error = .true.
call xml_report_errors(info, 'Missing data on tally_')
endif
if ( present(errout) ) errout = error
end subroutine
subroutine write_xml_file_tallies_t(fname, lurep)
character(len=*), intent(in) :: fname
integer, intent(in), optional :: lurep
type(XML_PARSE) :: info
integer :: indent = 0
call xml_open( info, fname, .false. )
call xml_options( info, report_errors=.true.)
if ( present(lurep) ) then
call xml_options( info, report_errors=.true.)
endif
write(info%lun,'(a)') &
'<tallies>'
call write_xml_type_tally_xml_array( info, 'tally', indent+3, tally_)
write(info%lun,'(a)') '</tallies>'
call xml_close(info)
end subroutine
subroutine init_xml_file_tallies_t
end subroutine
end module