diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst
index 05e227c1b..3a1e37676 100644
--- a/docs/source/usersguide/input.rst
+++ b/docs/source/usersguide/input.rst
@@ -938,6 +938,13 @@ sub-elements:
Specifies the custom color for the cell or material. Should be 3 integers separated
by spaces.
+ As an example, if your plot is colored by material and you want material 23
+ to be blue, the corresponding ``col_spec`` element would look like:
+
+ .. code-block:: xml
+
+
+
*Default*: None
:mask:
diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst
index c9bc1df87..337868e94 100644
--- a/docs/source/usersguide/install.rst
+++ b/docs/source/usersguide/install.rst
@@ -179,3 +179,27 @@ Alternatively, you could run from any directory:
Note that in the latter case, any output files will be placed in the present
working directory which may be different from ``/home/username/somemodel``.
+
+-----------------------------------------------------
+Configuring Input Validation with GNU Emacs nXML mode
+-----------------------------------------------------
+
+The `GNU Emacs`_ text editor has a built-in mode that extends functionality for
+editing XML files. One of the features in nXML mode is the ability to perform
+real-time `validation`_ of XML files against a `RELAX NG`_ schema. The OpenMC
+source contains RELAX NG schemas for each type of user input file. In order for
+nXML mode to know about these schemas, you need to tell emacs where to find a
+"locating files" description. Adding the following lines to your ``~/.emacs``
+file will enable real-time validation of XML input files:
+
+.. code-block:: common-lisp
+
+ (require 'rng-loc)
+ (add-to-list 'rng-schema-locating-files "~/openmc/schemas.xml")
+
+Make sure to replace the last string on the second line with the path to the
+schemas.xml file in your own OpenMC source directory.
+
+.. _GNU Emacs: http://www.gnu.org/software/emacs/
+.. _validation: http://en.wikipedia.org/wiki/XML_validation
+.. _RELAX NG: http://relaxng.org/
diff --git a/schemas.xml b/schemas.xml
new file mode 100644
index 000000000..9a881bb6f
--- /dev/null
+++ b/schemas.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/ace.F90 b/src/ace.F90
index 01449b34b..da7322b66 100644
--- a/src/ace.F90
+++ b/src/ace.F90
@@ -217,10 +217,14 @@ contains
! Read XSS array
read(UNIT=in, FMT='(4E20.0)') XSS
+ ! Close ACE file
+ close(UNIT=in)
+
elseif (filetype == BINARY) then
! =======================================================================
! READ ACE TABLE IN BINARY FORMAT
+ ! Open ACE file
open(UNIT=in, FILE=filename, STATUS='old', ACTION='read', &
ACCESS='direct', RECL=record_length)
@@ -238,6 +242,9 @@ contains
j2 = min(length, j1 + entries - 1)
read(UNIT=IN, REC=location + i) (XSS(j), j=j1,j2)
end do
+
+ ! Close ACE file
+ close(UNIT=in)
end if
! ==========================================================================
@@ -287,8 +294,6 @@ contains
if(associated(nuc)) nullify(nuc)
if(associated(sab)) nullify(sab)
- close(UNIT=in)
-
end subroutine read_ace_table
!===============================================================================
diff --git a/src/datatypes.F90 b/src/datatypes.F90
index 855b91c14..dca607caf 100644
--- a/src/datatypes.F90
+++ b/src/datatypes.F90
@@ -156,12 +156,14 @@ contains
type(ListInt), pointer :: current
type(ListInt), pointer :: next
- current => list
- do while (associated(current%next))
- next => current%next
- deallocate(current)
- current => next
- enddo
+ if (associated(list)) then
+ current => list
+ do while (associated(current%next))
+ next => current%next
+ deallocate(current)
+ current => next
+ end do
+ end if
end subroutine list_int_delete
@@ -175,12 +177,14 @@ contains
type(ListReal), pointer :: current
type(ListReal), pointer :: next
- current => list
- do while (associated(current%next))
- next => current%next
- deallocate(current)
- current => next
- enddo
+ if (associated(list)) then
+ current => list
+ do while (associated(current%next))
+ next => current%next
+ deallocate(current)
+ current => next
+ end do
+ end if
end subroutine list_real_delete
@@ -194,12 +198,14 @@ contains
type(ListKeyValueCI), pointer :: current
type(ListKeyValueCI), pointer :: next
- current => list
- do while (associated(current%next))
- next => current%next
- deallocate(current)
- current => next
- enddo
+ if (associated(list)) then
+ current => list
+ do while (associated(current%next))
+ next => current%next
+ deallocate(current)
+ current => next
+ end do
+ end if
end subroutine list_kvci_delete
@@ -213,12 +219,14 @@ contains
type(ListKeyValueII), pointer :: current
type(ListKeyValueII), pointer :: next
- current => list
- do while (associated(current%next))
- next => current%next
- deallocate(current)
- current => next
- enddo
+ if (associated(list)) then
+ current => list
+ do while (associated(current%next))
+ next => current%next
+ deallocate(current)
+ current => next
+ end do
+ end if
end subroutine list_kvii_delete
diff --git a/src/fixed_source.F90 b/src/fixed_source.F90
index af3b96cc4..5cde3cfa3 100644
--- a/src/fixed_source.F90
+++ b/src/fixed_source.F90
@@ -117,18 +117,16 @@ contains
call timer_stop(time_ic_tallies)
! Write out state point if it's been specified for this batch
- if (master) then
- do i = 1, n_state_points
- if (current_batch == statepoint_batch(i)) then
+ do i = 1, n_state_points
+ if (current_batch == statepoint_batch(i)) then
#ifdef HDF5
- call hdf5_write_state_point()
+ call hdf5_write_state_point()
#else
- call write_state_point()
+ call write_state_point()
#endif
- exit
- end if
- end do
- end if
+ exit
+ end if
+ end do
end subroutine finalize_batch
diff --git a/src/plot.F90 b/src/plot.F90
index 758213045..d6a949233 100644
--- a/src/plot.F90
+++ b/src/plot.F90
@@ -115,9 +115,16 @@ contains
if (pl % color_by == PLOT_COLOR_MATS) then
! Assign color based on material
c => cells(p % coord % cell)
- r = pl % colors(c % material) % rgb(1)
- g = pl % colors(c % material) % rgb(2)
- b = pl % colors(c % material) % rgb(3)
+ if (c % material == MATERIAL_VOID) then
+ ! By default, color void cells white
+ r = 255
+ g = 255
+ b = 255
+ else
+ r = pl % colors(c % material) % rgb(1)
+ g = pl % colors(c % material) % rgb(2)
+ b = pl % colors(c % material) % rgb(3)
+ end if
else if (pl % color_by == PLOT_COLOR_CELLS) then
! Assign color based on cell
r = pl % colors(p % coord % cell) % rgb(1)
diff --git a/src/templates/cross_sections.rnc b/src/templates/cross_sections.rnc
new file mode 100644
index 000000000..e82bb986f
--- /dev/null
+++ b/src/templates/cross_sections.rnc
@@ -0,0 +1,23 @@
+element cross_sections {
+ element ace_table {
+ (element name { xsd:string { maxLength = "15" } } |
+ attribute name { xsd:string { maxLength = "15" } }) &
+ (element alias { xsd:string { maxLength = "15" } } |
+ attribute alias { xsd:string { maxLength = "15" } })? &
+ (element zaid { xsd:int } | attribute zaid { xsd:int }) &
+ (element metastable { xsd:int } | attribute metastable { xsd:int })? &
+ (element awr { xsd:double } | attribute awr { xsd:double }) &
+ (element temperature { xsd:double } | attribute temperature { xsd:double }) &
+ (element path { xsd:string { maxLength = "255" } } |
+ attribute path { xsd:string { maxLength = "255" } }) &
+ (element location { xsd:int } | attribute location { xsd:int })?
+ }* &
+
+ element directory { xsd:string { maxLength = "255" } }? &
+
+ element filetype { ( "ascii" | "binary" ) } &
+
+ element record_length { xsd:int }? &
+
+ element entries { xsd:int }?
+}
\ No newline at end of file
diff --git a/src/templates/geometry.rnc b/src/templates/geometry.rnc
new file mode 100644
index 000000000..04d07444a
--- /dev/null
+++ b/src/templates/geometry.rnc
@@ -0,0 +1,32 @@
+element geometry {
+ element cell {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element universe { xsd:int } | attribute universe { xsd:int })? &
+ (
+ (element fill { xsd:int } | attribute fill { xsd:int }) |
+ (element material { xsd:int } | attribute material { xsd:int })
+ ) &
+ (element surfaces { list { xsd:int+ } } | attribute surfaces { list { xsd:int+ } }) &
+ (element rotation { list { xsd:double+ } } | attribute rotation { list { xsd:double+ } })? &
+ (element translation { list { xsd:double+ } } | attribute translation { list { xsd:double+ } })?
+ }*
+
+ & element surface {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element type { xsd:string { maxLength = "15" } } |
+ attribute type { xsd:string { maxLength = "15" } }) &
+ (element coeffs { list { xsd:double+ } } | attribute coeffs { list { xsd:double+ } }) &
+ (element boundary { ( "transmit" | "reflective" | "vacuum" ) } |
+ attribute boundary { ( "transmit" | "reflective" | "vacuum" ) })?
+ }*
+
+ & element lattice {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element type { ( "rectangular" | "hexagonal" ) } |
+ attribute type { ( "rectangular" | "hexagonal" ) })? &
+ (element dimension { list { xsd:int+ } } | attribute dimension { list { xsd:int+ } }) &
+ (element lower_left { list { xsd:double+ } } | attribute lower_left { list { xsd:double+ } }) &
+ (element width { list { xsd:double+ } } | attribute width { list { xsd:double+ } }) &
+ (element universes { list { xsd:int+ } } | attribute universes { list { xsd:int+ } })
+ }*
+}
diff --git a/src/templates/materials.rnc b/src/templates/materials.rnc
new file mode 100644
index 000000000..196562af6
--- /dev/null
+++ b/src/templates/materials.rnc
@@ -0,0 +1,31 @@
+element materials {
+ element material {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+
+ element density {
+ (element value { xsd:double } | attribute value { xsd:double })? &
+ (element units { xsd:string { maxLength = "10" } } |
+ attribute units { xsd:string { maxLength = "10" } })
+ } &
+
+ element nuclide {
+ (element name { xsd:string { maxLength = "7" } } |
+ attribute name { xsd:string { maxLength = "7" } }) &
+ (element xs { xsd:string { maxLength = "3" } } |
+ attribute xs { xsd:string { maxLength = "3" } })? &
+ (
+ (element ao { xsd:double } | attribute ao { xsd:double }) |
+ (element wo { xsd:double } | attribute wo { xsd:double })
+ )
+ }* &
+
+ element sab {
+ (element name { xsd:string { maxLength = "7" } } |
+ attribute name { xsd:string { maxLength = "7" } }) &
+ (element xs { xsd:string { maxLength = "3" } } |
+ attribute xs { xsd:string { maxLength = "3" } })?
+ }*
+ }+ &
+
+ element default_xs { xsd:string { maxLength = "3" } }
+}
diff --git a/src/templates/plots.rnc b/src/templates/plots.rnc
new file mode 100644
index 000000000..3c29ba4e0
--- /dev/null
+++ b/src/templates/plots.rnc
@@ -0,0 +1,31 @@
+element plots {
+ element plot {
+ (element id { xsd:int } | attribute id { xsd:int })? &
+ (element filename { xsd:string { maxLength = "50" } } |
+ attribute filename { xsd:string { maxLength = "50" } })? &
+ (element type { "slice" } | attribute type { "slice" })? &
+ (element color { ( "cell" | "mat" | "material" ) } |
+ attribute color { ( "cell" | "mat" | "material" ) })? &
+ (element origin { list { xsd:double+ } } |
+ attribute origin { list { xsd:double+ } })? &
+ (element width { list { xsd:double+ } } |
+ attribute width { list { xsd:double+ } })? &
+ (element basis { ( "xy" | "yz" | "xz" ) } |
+ attribute basis { ( "xy" | "yz" | "xz" ) })? &
+ (element pixels { list { xsd:int+ } } |
+ attribute pixels { list { xsd:int+ } })? &
+ (element background { list { xsd:int+ } } |
+ attribute background { list { xsd:int+ } })? &
+ element col_spec {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element rgb { list { xsd:int+ } } |
+ attribute rgb { list { xsd:int+ } })
+ }* &
+ element mask {
+ (element components { list { xsd:int+ } } |
+ attribute components { list { xsd:int+ } }) &
+ (element background { list { xsd:int+ } } |
+ attribute background { list { xsd:int+ } })
+ }*
+ }*
+}
diff --git a/src/templates/settings.rnc b/src/templates/settings.rnc
new file mode 100644
index 000000000..207653f99
--- /dev/null
+++ b/src/templates/settings.rnc
@@ -0,0 +1,99 @@
+element settings {
+ element confidence_intervals { ( "on" | "off" ) }? &
+
+ (
+ element criticality {
+ (element batches { xsd:int } | attribute batches { xsd:int }) &
+ (element inactive { xsd:int } | attribute inactive { xsd:int }) &
+ (element particles { xsd:int } | attribute particles { xsd:int }) &
+ (element generations_per_batch { xsd:int } | attribute generations_per_batch { xsd:int })?
+ } |
+ element fixed_source {
+ (element batches { xsd:int } | attribute batches { xsd:int }) &
+ (element particles { xsd:int } | attribute particles { xsd:int })
+ }
+ ) &
+
+ element cross_sections { xsd:string { maxLength = "255" } }? &
+
+ element cutoff {
+ (element weight { xsd:double } | attribute weight { xsd:double })? &
+ (element weight_avg { xsd:double } | attribute weight_avg { xsd:double })?
+ }? &
+
+ element energy_grid { xsd:string { maxLength = "7" } }? &
+
+ element entropy {
+ (element dimension { list { xsd:int+ } } |
+ attribute dimension { list { xsd:int+ } })? &
+ (element lower_left { list { xsd:double+ } } |
+ attribute lower_left { list { xsd:double+ } }) &
+ (element upper_right { list { xsd:double+ } } |
+ attribute upper_right { list { xsd:double+ } })
+ }? &
+
+ element no_reduce { ( "off" | "on" ) }? &
+
+ element output { list {
+ ( "summary" | "cross_sections" | "tallies" )+ } }? &
+
+ element ptables { ( "off" | "on" ) }? &
+
+ element seed { xsd:integer }? &
+
+ element source {
+ element file { xsd:string { maxLength = "255" } }? &
+ element space {
+ (element type { xsd:string { maxLength = "10" } } |
+ attribute type { xsd:string { maxLength = "10" } }) &
+ (element length { xsd:int } | attribute length { xsd:int })? &
+ (element interpolation { xsd:string { maxLength = "10" } } |
+ attribute interplation { xsd:string { maxLength = "10" } })? &
+ (element parameters { list { xsd:double+ } } |
+ attribute parameters { list { xsd:double+ } })?
+ }? &
+ element angle {
+ (element type { xsd:string { maxLength = "10" } } |
+ attribute type { xsd:string { maxLength = "10" } }) &
+ (element length { xsd:int } | attribute length { xsd:int })? &
+ (element interpolation { xsd:string { maxLength = "10" } } |
+ attribute interplation { xsd:string { maxLength = "10" } })? &
+ (element parameters { list { xsd:double+ } } |
+ attribute parameters { list { xsd:double+ } })?
+ }? &
+ element energy {
+ (element type { xsd:string { maxLength = "10" } } |
+ attribute type { xsd:string { maxLength = "10" } }) &
+ (element length { xsd:int } | attribute length { xsd:int })? &
+ (element interpolation { xsd:string { maxLength = "10" } } |
+ attribute interplation { xsd:string { maxLength = "10" } })? &
+ (element parameters { list { xsd:double+ } } |
+ attribute parameters { list { xsd:double+ } })?
+ }?
+ }? &
+
+ element state_point {
+ (
+ (element batches { list { xsd:int } } |
+ attribute batches { list { xsd:int } }) |
+ (element interval { xsd:int} | attribute interval { xsd:int })
+ ) &
+ (element source_separate { ( "off" | "on" ) } |
+ attribute source_separate { ( "off" | "on" ) })?
+ }? &
+
+ element survival_biasing { ( "off" | "on" ) }? &
+
+ element trace { list { xsd:int } }? &
+
+ element verbosity { xsd:int }? &
+
+ element uniform_fs{
+ (element dimension { list { xsd:int+ } } |
+ attribute dimension { list { xsd:int+ } }) &
+ (element lower_left { list { xsd:double+ } } |
+ attribute lower_left { list { xsd:double+ } }) &
+ (element upper_right { list { xsd:double+ } } |
+ attribute upper_right { list { xsd:double+ } })
+ }?
+}
diff --git a/src/templates/tallies.rnc b/src/templates/tallies.rnc
new file mode 100644
index 000000000..081fdd179
--- /dev/null
+++ b/src/templates/tallies.rnc
@@ -0,0 +1,50 @@
+element tallies {
+ element mesh {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element type { ( "rectangular" | "hexagonal" ) } |
+ attribute type { ( "rectangular" | "hexagonal" ) }) &
+ (element dimension { list { xsd:int+ } } |
+ attribute dimension { list { xsd:int+ } }) &
+ (element lower_left { list { xsd:double+ } } |
+ attribute lower_left { list { xsd:double+ } }) &
+ (
+ (element upper_right { list { xsd:double+ } } |
+ attribute upper_right { list { xsd:double+ } }) |
+ (element width { list { xsd:double+ } } |
+ attribute width { list { xsd:double+ } })
+ )
+ }* &
+
+ element tally {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element label { xsd:string { maxLength="52" } } |
+ attribute label { xsd:string { maxLength="52" } })? &
+ (element estimator { ( "analog" | "tracklength" ) } |
+ attribute estimator { ( "analog" | "tracklength" ) })? &
+ element filters {
+ (element cell { list { xsd:string { maxLength = "20" } } } |
+ attribute cell { list { xsd:string { maxLength = "20" } } })? &
+ (element surface { list { xsd:string { maxLength = "20" } } } |
+ attribute surface { list { xsd:string { maxLength = "20" } } })? &
+ (element universe { list { xsd:string { maxLength = "20" } } } |
+ attribute universe { list { xsd:string { maxLength = "20" } } })? &
+ (element material { list { xsd:string { maxLength = "20" } } } |
+ attribute material { list { xsd:string { maxLength = "20" } } })? &
+ (element mesh { xsd:int } | attribute mesh { xsd:int })? &
+ (element cellborn { list { xsd:string { maxLength = "20" } } } |
+ attribute cellborn { list { xsd:string { maxLength = "20" } } })? &
+ (element energy { list { xsd:double+ } } |
+ attribute energy { list { xsd:double+ } })? &
+ (element energyout { list { xsd:double+ } } |
+ attribute energyout { list { xsd:double+ } })?
+ }? &
+ element nuclides {
+ list { xsd:string { maxLength = "20" }+ }
+ }? &
+ element scores {
+ list { xsd:string { maxLength = "12" }+ }
+ }
+ }* &
+
+ element assume_separate { ( "off" | "on" ) }?
+}