From c639961c9fa1b1a8527c30dc7085b9744433ffd5 Mon Sep 17 00:00:00 2001 From: Nick Horelik Date: Fri, 9 Mar 2012 15:20:23 -0500 Subject: [PATCH] Reorganized plotting so colors are stored in Plot objects rather than Cells/Materials, added ability to specify background color, added ability to specify plotting of only a subset of cells --- src/geometry_header.F90 | 1 - src/input_xml.F90 | 93 +++++++++++++++++---------- src/material_header.F90 | 2 - src/output.F90 | 4 +- src/plot.F90 | 24 +++---- src/plot_header.F90 | 14 +++- src/xml-fortran/templates/plots_t.xml | 7 ++ 7 files changed, 93 insertions(+), 52 deletions(-) diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index aa1fcca5f6..fbcf0353a9 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -64,7 +64,6 @@ module geometry_header & surfaces(:) ! List of surfaces bounding cell -- note that ! parentheses, union, etc operators will be listed ! here too - integer, allocatable :: rgb(:) ! plotting color end type Cell ! array index of universe 0 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 9b806ade83..36ff24fd36 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -261,14 +261,6 @@ contains c % material = cell_(i) % material c % fill = cell_(i) % fill - ! Set plot color - if (plotting) then - allocate(c % rgb(3)) - c % rgb(1) = prn()*255 - c % rgb(2) = prn()*255 - c % rgb(3) = prn()*255 - end if - ! Check to make sure that either material or fill was specified if (c % material == 0 .and. c % fill == 0) then message = "Neither material nor fill was specified for cell " // & @@ -539,14 +531,6 @@ contains ! Copy material id m % id = material_(i) % id - ! Set plot color - if (plotting) then - allocate(m % rgb(3)) - m % rgb(1) = prn()*255 - m % rgb(2) = prn()*255 - m % rgb(3) = prn()*255 - end if - ! 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. @@ -1143,6 +1127,7 @@ contains pl % id = plot_(i) % id pl % aspect = plot_(i) % aspect + ! Copy plot pixel size if (size(plot_(i) % pixels) == 2) then pl % pixels = plot_(i) % pixels else @@ -1150,17 +1135,18 @@ contains call fatal_error() end if - select case (plot_(i) % color) - case ("cell") - pl % color = PLOT_COLOR_CELLS - case ("mat") - pl % color = PLOT_COLOR_MATS - case default - message = "Unsupported plot color '" // plot_(i) % color & - // "' in plot " // trim(to_str(pl % id)) + ! Copy plot background color + if (size(plot_(i) % background) == 3) then + pl % not_found % rgb = plot_(i) % background + else if (size(plot_(i) % background) == 0) then + pl % not_found % rgb = (/ 0, 0, 0 /) + else + message = "Bad background RGB " & + // "in plot " // trim(to_str(pl % id)) call fatal_error() - end select + end if + ! Copy plot type select case (plot_(i) % type) case ("slice") pl % type = PLOT_TYPE_SLICE @@ -1172,6 +1158,7 @@ contains call fatal_error() end select + ! Copy plot basis select case (plot_(i) % basis) case ("xy") pl % basis = PLOT_BASIS_XY @@ -1206,6 +1193,34 @@ contains call fatal_error() end if + ! Copy plot color type and initialize all colors randomly + select case (plot_(i) % color) + case ("cell") + + pl % color_by = PLOT_COLOR_CELLS + allocate(pl % colors(n_cells)) + do j = 1, n_cells + pl % colors(j) % rgb(1) = prn()*255 + pl % colors(j) % rgb(2) = prn()*255 + pl % colors(j) % rgb(3) = prn()*255 + end do + + case ("mat") + + pl % color_by = PLOT_COLOR_MATS + allocate(pl % colors(n_materials)) + do j = 1, n_materials + pl % colors(j) % rgb(1) = prn()*255 + pl % colors(j) % rgb(2) = prn()*255 + pl % colors(j) % rgb(3) = prn()*255 + end do + + case default + message = "Unsupported plot color type '" // plot_(i) % color & + // "' in plot " // trim(to_str(pl % id)) + call fatal_error() + end select + ! Copy user specified colors n_cols = size(plot_(i) % col_spec_) do j = 1, n_cols @@ -1217,24 +1232,20 @@ contains col_id = plot_(i) % col_spec_(j) % id - if (pl % color == PLOT_COLOR_CELLS) then + if (pl % color_by == PLOT_COLOR_CELLS) then if (dict_has_key(cell_dict, col_id)) then - cells(col_id) % rgb(1) = plot_(i) % col_spec_(j) % rgb(1) - cells(col_id) % rgb(2) = plot_(i) % col_spec_(j) % rgb(2) - cells(col_id) % rgb(3) = plot_(i) % col_spec_(j) % rgb(3) + pl % colors(col_id) % rgb = plot_(i) % col_spec_(j) % rgb else message = "Could not find cell " // trim(to_str(col_id)) // & " specified in plot " // trim(to_str(pl % id)) call fatal_error() end if - else if (pl % color == PLOT_COLOR_MATS) then + else if (pl % color_by == PLOT_COLOR_MATS) then if (dict_has_key(material_dict, col_id)) then - materials(col_id) % rgb(1) = plot_(i) % col_spec_(j) % rgb(1) - materials(col_id) % rgb(2) = plot_(i) % col_spec_(j) % rgb(2) - materials(col_id) % rgb(3) = plot_(i) % col_spec_(j) % rgb(3) + pl % colors(col_id) % rgb = plot_(i) % col_spec_(j) % rgb else message = "Could not find material " // trim(to_str(col_id)) // & " specified in plot " // trim(to_str(pl % id)) @@ -1245,6 +1256,22 @@ contains end do + ! Alter colors based on mask information + if (size(plot_(i) % mask_) /= 1) then + message = "Mutliple masks" // & + " specified in plot " // trim(to_str(pl % id)) + call fatal_error() + else + do j=1,size(pl % colors) + if (.not. any(j .eq. plot_(i) % mask_(1) % components)) then + pl % colors(j) % rgb = plot_(i) % mask_(1) % background + end if + end do + end if + + + + end do end subroutine read_plots_xml diff --git a/src/material_header.F90 b/src/material_header.F90 index d8e9ca4ea2..916578923b 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -21,8 +21,6 @@ module material_header character(12) :: sab_name ! name of S(a,b) table integer :: sab_table = 0 ! index in sab_tables integer :: sab_nuclide = 0 ! index of nuclide which has S(a,b) table - - integer, allocatable :: rgb(:) ! plotting color end type Material end module material_header diff --git a/src/output.F90 b/src/output.F90 index c4209ace13..0876d266c2 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -914,7 +914,7 @@ contains write(ou,100) "Width:", trim(to_str(pl % width(1))) // & " " // trim(to_str(pl % width(2))) - write(ou,100) "Coloring:", trim(to_str(pl % color)) + write(ou,100) "Coloring:", trim(to_str(pl % color_by)) write(ou,100) "Basis:", trim(to_str(pl % basis)) write(ou,100) "Pixels:", trim(to_str(pl % pixels(1))) // " " // & trim(to_str(pl % pixels(2))) @@ -924,7 +924,7 @@ contains write(ou,100) "Width:", trim(to_str(pl % width(1))) // & " " // trim(to_str(pl % width(2))) // " " & // trim(to_str(pl % width(3))) - write(ou,100) "Coloring:", trim(to_str(pl % color)) + write(ou,100) "Coloring:", trim(to_str(pl % color_by)) write(ou,100) "Ray Spacing:", trim(to_str(pl % aspect)) end if diff --git a/src/plot.F90 b/src/plot.F90 index 2f82b9dd8f..ef93fecf4f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -106,19 +106,19 @@ contains call find_cell(found_cell) if (.not. found_cell) then - r = 255 - g = 255 - b = 255 + r = pl % not_found % rgb(1) + g = pl % not_found % rgb(2) + b = pl % not_found % rgb(3) else - c => cells(p % coord % cell) - if (pl % color == PLOT_COLOR_MATS) then - r = materials(c % material) % rgb(1) - g = materials(c % material) % rgb(2) - b = materials(c % material) % rgb(3) - else if (pl % color == PLOT_COLOR_CELLS) then - r = c % rgb(1) - g = c % rgb(2) - b = c % rgb(3) + if (pl % color_by == PLOT_COLOR_MATS) then + 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) + else if (pl % color_by == PLOT_COLOR_CELLS) then + r = pl % colors(p % coord % cell) % rgb(1) + g = pl % colors(p % coord % cell) % rgb(2) + b = pl % colors(p % coord % cell) % rgb(3) else r = 0 g = 0 diff --git a/src/plot_header.F90 b/src/plot_header.F90 index bfe6f9b071..b2f849ea99 100644 --- a/src/plot_header.F90 +++ b/src/plot_header.F90 @@ -3,18 +3,28 @@ module plot_header implicit none !=============================================================================== -! PLOT hold plot information +! ObjectColor holds color information for plotted objects +!=============================================================================== + + type ObjectColor + integer :: rgb(3) + end type ObjectColor + +!=============================================================================== +! PLOT holds plot information !=============================================================================== type Plot integer :: id ! Unique ID integer :: type ! Type - integer :: color ! quantity to color regions by + integer :: color_by ! quantity to color regions by real(8) :: origin(3) ! xyz center of plot location real(8) :: aspect ! spacing between rays in raytracer real(8) :: width(3) ! xyz widths of plot integer :: basis ! direction of plot slice integer :: pixels(2) ! pixel width/height of plot slice + type(ObjectColor) :: not_found ! color for positions where no cell found + type(ObjectColor),allocatable :: colors(:) ! colors of cells/mats end type Plot integer :: PLOT_TYPE_SLICE = 1 diff --git a/src/xml-fortran/templates/plots_t.xml b/src/xml-fortran/templates/plots_t.xml index f372411922..e3f6903fe6 100644 --- a/src/xml-fortran/templates/plots_t.xml +++ b/src/xml-fortran/templates/plots_t.xml @@ -8,6 +8,11 @@ + + + + + @@ -17,7 +22,9 @@ + +