def plotGroupXS(group_xs, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Plot Resonance Integrals fig = plt.figure() bins = group_xs.bin_edges plt.semilogx(bins[0:-1], group_xs.groupXS[:, :], drawstyle='steps-post') plt.xlabel('Energy [eV]') plt.ylabel('Group XS') plt.grid() if title is '': plt.title('Group XS') else: plt.title(title.title() + ' Group XS') if filename is '': filename = directory + '/group-xs.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-group-xs.png' plt.savefig(filename)
def plotRI(RI, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Plot Resonance Integrals fig = plt.figure() bins = RI.bin_edges plt.semilogx(bins[0:-1], RI.RIs, drawstyle='steps-post') plt.xlabel('Energy [eV]') plt.ylabel('RI') plt.grid() if title is '': plt.title('Resonance Integrals') else: plt.title(title.title() + ' Resonance Integrals') if filename is '': filename = directory + 'RI.png' else: filename = directory + filename.replace(' ', '-').lower() +'-RI.png' plt.savefig(filename) plt.close(fig)
def plotGroupXS(group_xs, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Plot Resonance Integrals fig = plt.figure() bins = group_xs.bin_edges plt.semilogx(bins[0:-1], group_xs.groupXS[:,:], drawstyle='steps-post') plt.xlabel('Energy [eV]') plt.ylabel('Group XS') plt.grid() if title is '': plt.title('Group XS') else: plt.title(title.title() + ' Group XS') if filename is '': filename = directory + '/group-xs.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-group-xs.png' plt.savefig(filename) plt.close(fig)
def plotRI(RI, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Plot Resonance Integrals fig = plt.figure() bins = RI.bin_edges plt.semilogx(bins[0:-1], RI.RIs, drawstyle='steps-post') plt.xlabel('Energy [eV]') plt.ylabel('RI') plt.grid() if title is '': plt.title('Resonance Integrals') else: plt.title(title.title() + ' Resonance Integrals') if filename is '': filename = directory + 'RI.png' else: filename = directory + filename.replace(' ', '-').lower() +'-RI.png' plt.savefig(filename)
def plotFlux(fluxes, loglog=True, uselegend=False, title='', filename=''): global flux_plot_num global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Make fluxes a list if it is not already if type(fluxes) is not list: fluxes = [fluxes] legend = [] fig = plt.figure() for flux in fluxes: if not flux.hasComputedBatchStatistics(): flux.computeBatchStatistics() num_bins = flux.getNumBins() flux_bin_centers = flux.retrieveTallyCenters(num_bins) flux_mu = flux.retrieveTallyMu(num_bins) # Plot the flux plt.plot(flux_bin_centers, flux_mu, lw=1) legend.append(flux.getTallyName()) plt.xlabel('Energy [eV]') plt.ylabel('Flux') plt.grid() if (loglog): plt.xscale('log') plt.yscale('log') if (uselegend): plt.legend(legend, loc='lower right', prop={'size':12}) if title is '': plt.title('Batch-Averaged Flux') else: plt.title(title.title()) if filename is '': filename = directory + '/' + 'flux-' + str(flux_plot_num) + '.png' flux_plot_num += 1 else: filename = directory + '/' + filename.replace(' ', '-') + '.png' fig.savefig(filename) plt.close(fig)
def plotFissionSourceDist(geometry, num_samples=1000, filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Error checking if not isinstance(geometry, Geometry): py_printf('ERROR', 'Unable to plot the fission source distribution ' + \ 'since the parameters did not include a geometry class object') if geometry.getSpatialType() != HETEROGENEOUS: py_printf('ERROR', 'Unable to plot the fission source distribution ' + \ 'since for a non HETEROGENEOUS type geometry') if not isinstance(num_samples, int): py_printf('ERROR', 'Unable to plot the fission source distribution ' + \ 'since a non-integer number of samples was input') if num_samples < 0: py_printf('ERROR', 'Unable to plot the fission source distribution ' + \ 'for %d number of particle since it is negative', num_samples) neutron = createNewNeutron() x = [] y = [] u = [] v = [] # Sample fission source neutrons and save their locations and velocity vectors for i in range(1000): geometry.initializeSourceNeutron(neutron) x.append(neutron._x) y.append(neutron._y) u.append(neutron._u) v.append(neutron._v) # Plot the vector field plt.figure() plt.quiver(x,y,u,v,angles='xy', color='r') plt.title('Fission Source Distribution') if filename is '': filename = directory + '/' + 'fission-site-dist.png' else: filename = directory + filename.replace(' ', '-').lower() + '-.png' plt.savefig(filename) plt.close(fig)
def plotMicroXS(isotope, rxns, loglog=True, uselegend=True, \ title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # make figure fig = plt.figure() # loop over rxns and plot num_energies = 0 # Loop over all reaction rate types for rxn in rxns: # retrieve xs and xsenergies num_energies = isotope.getNumXSEnergies(rxn) energies = isotope.retrieveXSEnergies(num_energies, rxn) xs = isotope.retrieveXS(num_energies, rxn) # plot xs plt.plot(energies, xs, lw=1) plt.xlabel('Energy [eV]') plt.ylabel('$\sigma$' +' [b]') plt.grid() if (uselegend): plt.legend(rxns, loc='lower left') if (loglog): plt.xscale('log') plt.yscale('log') plt.title(isotope.getIsotopeName() + ' Microscopic XS') if title is '': plt.title(isotope.getIsotopeName() + ' Microscopic XS') else: plt.title(title.title()) if filename is '': filename = directory + isotope.getIsotopeName() + '-micro-xs.png' else: filename = directory + filename.replace(' ', '-').lower() + '.png' fig.savefig(filename) plt.close(fig)
def plotFissionSpectrum(): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Generate fission CDF fissioner = Fissioner() fissioner.setNumBins(10000) fissioner.setEMax(20) fissioner.buildCDF() cdf = fissioner.retrieveCDF(fissioner.getNumBins()) cdf_energies = fissioner.retrieveCDFEnergies(fissioner.getNumBins()) # Plot fission CDF fig = plt.figure() plt.plot(cdf_energies, cdf) plt.xscale('log') plt.xlabel('Energy [MeV]') plt.ylabel('Cumulative Probability') plt.grid() plt.title('Watt Spectrum CDF') filename = directory + '/' + 'fission-spectrum-cdf.png' plt.savefig(filename) # Sample from fission CDF to get fission spectrum num_samples = 10000000 emitted_energies = np.zeros(num_samples) for i in range(num_samples): emitted_energies[i] = fissioner.emitNeutronMeV() # Bin the samples binned_samples, bin_edges = np.histogram(emitted_energies, bins=1000, density=True) bin_centers = np.zeros(bin_edges.size - 1) for i in range(bin_edges.size - 1): bin_centers[i] = (bin_edges[i] + bin_edges[i + 1]) / 2.0 # Plot fission spectrum fig = plt.figure() plt.plot(bin_centers, binned_samples) plt.xlabel('Energy [MeV]') plt.ylabel('Probability') plt.grid() plt.title('Watt Spectrum PDF') filename = directory + '/fission_spectrum_pdf.png' plt.savefig(filename)
def plotFissionSpectrum(): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Generate fission CDF fissioner = pinspec.Fissioner() fissioner.setNumBins(10000) fissioner.setEMax(20) fissioner.buildCDF() cdf = fissioner.retrieveCDF(fissioner.getNumBins()) cdf_energies = fissioner.retrieveCDFEnergies(fissioner.getNumBins()) # Plot fission CDF fig = plt.figure() plt.plot(cdf_energies, cdf) plt.xscale('log') plt.xlabel('Energy [MeV]') plt.ylabel('Cumulative Probability') plt.grid() plt.title('Watt Spectrum CDF') filename = directory + '/' + 'fission-spectrum-cdf.png' plt.savefig(filename) # Sample from fission CDF to get fission spectrum num_samples = 10000000 emitted_energies = np.zeros(num_samples) for i in range(num_samples): emitted_energies[i] = fissioner.emitNeutronMeV() # Bin the samples binned_samples, bin_edges = np.histogram(emitted_energies, bins=1000, density=True) bin_centers = np.zeros(bin_edges.size-1) for i in range(bin_edges.size-1): bin_centers[i] = (bin_edges[i] + bin_edges[i+1]) / 2.0 # Plot fission spectrum fig = plt.figure() plt.plot(bin_centers, binned_samples) plt.xlabel('Energy [MeV]') plt.ylabel('Probability') plt.grid() plt.title('Watt Spectrum PDF') filename = directory + '/fission_spectrum_pdf.png' plt.savefig(filename) plt.close(fig)
def plotMacroXS(material, rxns, loglog=True, \ uselegend=True, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # make figure fig = plt.figure() # loop over rxns and plot num_energies = 0 for rxn in rxns: # retrieve xs and xs energies num_energies = material.getNumXSEnergies(rxn) energies = material.retrieveXSEnergies(num_energies, rxn) xs = material.retrieveXS(num_energies, rxn) # plot xs plt.plot(energies, xs, lw=1) plt.xlabel('Energy [eV]') plt.ylabel('$\Sigma$'+' ['+'cm$^{-1}$'+']') plt.grid() if (uselegend): plt.legend(rxns, loc='lower left') if (loglog): plt.xscale('log') plt.yscale('log') if title is '': plt.title(material.getMaterialName() + ' Macroscopic XS') else: plt.title(title.title()) if filename is '': filename = directory + material.getMaterialName() + '-macro-xs.png' else: filename = directory + filename.replace(' ', '-') + '.png' fig.savefig(filename) plt.close(fig)
def trackANeutron(geometry, plane='XY', num_moves=100, loc=0.0, \ lim1=[-2., 2.], lim2=[-2., 2.], gridsize=100, filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Error checking if not isinstance(geometry, Geometry): py_printf('ERROR', 'Unable to track a neutron since input ' + \ 'did not contain a geometry class object') if geometry.getSpatialType() != HETEROGENEOUS: py_printf('ERROR', 'Unable to track a neutron since geometry is ' + \ 'not a HETEROGENEOUS type geometry') if not isinstance(num_moves, int): py_printf('ERROR', 'Unable to track a neutrons since the number ' + \ 'of moves input is %s which is not an integer', \ str(num_moves)) if (num_moves < 0): py_printf('ERROR', 'Unable to track a neutron since the number ' + \ 'of moves input is %d which is negative', num_moves) if not isinstance(plane, str): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', str(plane)) if plane.lower() != 'xy' and plane.lower() != 'xz' \ and plane.lower() != 'yz': print 'plane.lower = ' + str(plane.lower()) py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', plane) if len(lim1) is not 2: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the lim1 parameter is of length %d rather than 2', plane, len(lim1)) if len(lim2) is not 2: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the lim2 parameter is of length %d rather than 2', plane, len(lim2)) if not isinstance(lim1[0], float) or not isinstance(lim1[1], float): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since lim1 does not contain floating point values', plane) if not isinstance(lim2[0], float) or not isinstance(lim2[1], float): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since lim2 does not contain floating point values', plane) if lim1[0] >= lim1[1]: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the minimum lim1 value (%f) is greater than the ' + \ 'maximum lim1 value (%f)', plane, lim1[0], lim1[1]) if lim2[0] >= lim2[1]: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the minimum lim2 value (%f) is greater than the ' + \ 'maximum lim2 value (%f)', plane, lim2[0], lim2[1]) if not isinstance(gridsize, int): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the gridsize %s is not an integer', plane, str(gridsize)) if gridsize <= 0: py_printf('Error', 'Unable to track a neutron since for slice %s ' + \ 'for a negative gridsize (%d)', plane, gridsize) if not isinstance(loc, float): py_printf('Error', 'Unable to track a neutron for slice %s ' + \ 'since the input location of the slice is not a number', plane) # First plot the regions in the geometry as a backdrop for the # neutron's path # Initialize a numpy array for the surface colors surface = numpy.zeros((gridsize, gridsize), dtype=np.int32) # Initialize dim1 = np.linspace(lim1[0], lim1[1], gridsize) dim2 = np.linspace(lim2[0], lim2[1], gridsize) if plane.lower() == 'xy': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(dim1[i], dim2[j], loc): region = geometry.findContainingRegion(dim1[i], \ dim2[j], loc) surface[j][i] = region.getUid() if plane.lower() == 'xz': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(dim1[i], loc, dim2[j]): region = geometry.findContainingRegion( dim1[i], loc, dim2[j]) surface[j][i] = region.getUid() if plane.lower() == 'yz': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(loc, dim1[i], dim2[j]): region = geometry.findContainingRegion( loc, dim1[i], dim2[j]) surface[j][i] = region.getUid() # Plot the regions in the geometry fig = plt.figure() plt.pcolor(dim1, dim2, surface) plt.axis([lim1[0], lim1[1], lim2[0], lim2[1]]) # Create a neutron to track neutron = createNewNeutron() geometry.initializeSourceNeutron(neutron) # Initialize empty lists to track the neutron's location x = [] y = [] z = [] # Track the neutron for i in range(num_moves): # If the neutron was killed on the last collision, then break loop if not neutron._alive: break geometry.findContainingRegion(neutron) region = neutron._region region.collideNeutron(neutron) x.append(neutron._x) y.append(neutron._y) z.append(neutron._z) # Plot the neutron path throughout the geometry if plane.lower() == 'xy': plt.plot(x, y, 'b-') plt.plot(x, y, 'bo', markersize=7, markeredgecolor='w') elif plane.lower() == 'yz': plt.plot(y, z, 'b-') plt.plot(y, z, 'bo', markersize=7, markeredgecolor='w') else: plt.plot(x, z, 'b-') plt.plot(x, z, 'bo', markersize=7, markeredgecolor='w') plt.title('Tracking a Neutron in ' + plane.upper()) if filename is '': filename = directory + '/' + 'track-a-neutron-' + plane.lower( ) + '.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-' + plane.lower() + '-.png' plt.savefig(filename)
def plotSlice(space, plane='XY', loc=0.0, lim1=[-2., 2.], lim2=[-2., 2.], gridsize=100, filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Error checking if not isinstance(space, (BoundedModeratorRegion, BoundedFuelRegion, \ BoundedGeneralRegion, Geometry)): py_printf('ERROR', 'Unable to plot a %s slice since input ' + \ 'did not contain a region or geometry', plane) if not isinstance(plane, str): py_printf('ERROR', 'Unable to plot a %s slice for space %s.' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', str(plane), space.getName()) if plane.lower() != 'xy' and plane.lower() != 'xz' \ and plane.lower() != 'yz': print 'plane.lower = ' + str(plane.lower()) py_printf('ERROR', 'Unable to plot a %s slice for space %s.' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', plane, space.getName()) if len(lim1) is not 2: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the lim1 parameter is of length %d rather than 2', plane, space.getName(), len(lim1)) if len(lim2) is not 2: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the lim2 parameter is of length %d rather than 2', plane, space.getName(), len(lim2)) if not isinstance(lim1[0], float) or not isinstance(lim1[1], float): py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'lim1 does not contain floating point values', plane, space.getName()) if not isinstance(lim2[0], float) or not isinstance(lim2[1], float): py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'lim2 does not contain floating point values', plane, space.getName()) if lim1[0] >= lim1[1]: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the minimum lim1 value (%f) is greater than the ' + \ 'maximum lim1 value (%f)', space.getName(), plane, lim1[0], lim1[1]) if lim2[0] >= lim2[1]: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the minimum lim2 value (%f) is greater than the ' + \ 'maximum lim2 value (%f)', space.getName(), plane, lim2[0], lim2[1]) if not isinstance(gridsize, int): py_printf('ERROR', 'Unable to plot a %s slice for space %s ' + \ 'Since the gridsize %s is not an integer', plane, space.getName(), str(gridsize)) if gridsize <= 0: py_printf('Error', 'Unable to plot a %s slice for space %s ' + \ 'with a negative gridsize (%d)', plane, space.getName(), gridsize) if not isinstance(loc, float): py_printf('Error', 'Unable to plot a %s slice for space %s ' + \ 'since the input location of the slice is not a number', plane, space.getName()) # Initialize a numpy array for the surface colors surface = numpy.zeros((gridsize, gridsize), dtype=np.int32) dim1 = np.linspace(lim1[0], lim1[1], gridsize) dim2 = np.linspace(lim2[0], lim2[1], gridsize) if plane.lower() == 'xy': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], dim2[j], loc): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], dim2[j], loc): region = space.findContainingRegion(dim1[i], \ dim2[j], loc) surface[j][i] = region.getUid() if plane.lower() == 'xz': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], loc, dim2[j]): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], loc, dim2[j]): region = space.findContainingRegion( dim1[i], loc, dim2[j]) surface[j][i] = region.getUid() if plane.lower() == 'yz': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): # We are plotting a region for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(loc, dim1[i], dim2[j]): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(loc, dim1[i], dim2[j]): region = space.findContainingRegion( loc, dim1[i], dim2[j]) surface[j][i] = region.getUid() fig = plt.figure() plt.pcolor(dim1, dim2, surface) plt.axis([lim1[0], lim1[1], lim2[0], lim2[1]]) if plane.lower() == 'xy': plt.title('' + plane.upper() + ' Plane at z = ' + str(loc)) if plane.lower() == 'xz': plt.title('' + plane.upper() + ' Plane at y = ' + str(loc)) else: plt.title('' + plane.upper() + ' Plane at x = ' + str(loc)) if filename is '': filename = directory + '/' + plane.lower() + '-slice.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-' + plane.lower() + '-slice.png' plt.savefig(filename)
def plotThermalScattering(isotope, uselegend=True, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) num_bins = isotope.getNumThermalCDFBins() num_cdfs = isotope.getNumThermalCDFs() Eprime_to_E = isotope.retrieveEprimeToE(num_bins) E_to_kT = isotope.retrieveEtokT(num_cdfs) cdfs = isotope.retrieveThermalCDFs(num_cdfs * num_bins) cdfs = np.reshape(cdfs, [num_cdfs, num_bins]) # reshape 1D array to 2D dist = isotope.retrieveThermalPDFs(num_cdfs * num_bins) dist = np.reshape(dist, [num_cdfs, num_bins]) # reshape 1D array to 2D # Plot the PDFs fig = plt.figure() legend = [] for i in range(num_cdfs): plt.plot(Eprime_to_E, dist[i][:]) legend.append("%.2e" % E_to_kT[i] + ' kT') plt.ylabel('Probability') plt.xlabel('E' + "'" + '/ E') plt.grid() if (uselegend): plt.legend(legend, ncol=2, loc='upper right', prop={'size': 14}) if title is '': plt.title(isotope.getIsotopeName() + ' Thermal Scattering PDFs') else: plt.title(title.title() + ' Thermal Scattering PDFs') if filename is '': pdfsfilename = directory + isotope.getIsotopeName() + \ '-thermal-scattering-pdfs.png' else: pdfsfilename = directory + filename.replace(' ', '-').lower() + \ '-thermal-scattering-pdfs.png' plt.savefig(pdfsfilename) # Plot the CDFs fig = plt.figure() legend = [] for i in range(num_cdfs): plt.plot(Eprime_to_E, cdfs[i][:]) legend.append("%.2e" % E_to_kT[i] + ' kT') plt.ylabel('Cumulative Probability') plt.xlabel('E' + "'" + ' / E') plt.grid() if (uselegend): plt.legend(legend, ncol=2, loc='lower right', prop={'size': 12}) if title is '': plt.title(isotope.getIsotopeName() + ' Thermal Scattering CDFs') else: plt.title(title.title() + ' Thermal Scattering CDFs') if filename is '': cdfsfilename = directory + isotope.getIsotopeName() + \ '-thermal-scattering-cdfs.png' else: cdfsfilename = directory + filename.replace(' ', '-').lower() + \ '-thermal-scattering-cdfs.png' plt.savefig(cdfsfilename)
def trackANeutron(geometry, plane='XY', num_moves=100, loc=0.0, \ lim1=[-2., 2.], lim2=[-2., 2.], gridsize=100, filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Error checking if not isinstance(geometry, Geometry): py_printf('ERROR', 'Unable to track a neutron since input ' + \ 'did not contain a geometry class object') if geometry.getSpatialType() != HETEROGENEOUS: py_printf('ERROR', 'Unable to track a neutron since geometry is ' + \ 'not a HETEROGENEOUS type geometry') if not isinstance(num_moves, int): py_printf('ERROR', 'Unable to track a neutrons since the number ' + \ 'of moves input is %s which is not an integer', \ str(num_moves)) if (num_moves < 0): py_printf('ERROR', 'Unable to track a neutron since the number ' + \ 'of moves input is %d which is negative', num_moves) if not isinstance(plane, str): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', str(plane)) if plane.lower() != 'xy' and plane.lower() != 'xz' \ and plane.lower() != 'yz': print 'plane.lower = ' + str(plane.lower()) py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', plane) if len(lim1) is not 2: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the lim1 parameter is of length %d rather than 2', plane, len(lim1)) if len(lim2) is not 2: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the lim2 parameter is of length %d rather than 2', plane, len(lim2)) if not isinstance(lim1[0], float) or not isinstance(lim1[1], float): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since lim1 does not contain floating point values', plane) if not isinstance(lim2[0], float) or not isinstance(lim2[1], float): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since lim2 does not contain floating point values', plane) if lim1[0] >= lim1[1]: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the minimum lim1 value (%f) is greater than the ' + \ 'maximum lim1 value (%f)', plane, lim1[0], lim1[1]) if lim2[0] >= lim2[1]: py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the minimum lim2 value (%f) is greater than the ' + \ 'maximum lim2 value (%f)', plane, lim2[0], lim2[1]) if not isinstance(gridsize, int): py_printf('ERROR', 'Unable to track a neutron since for slice %s ' + \ 'since the gridsize %s is not an integer', plane, str(gridsize)) if gridsize <= 0: py_printf('Error', 'Unable to track a neutron since for slice %s ' + \ 'for a negative gridsize (%d)', plane, gridsize) if not isinstance(loc, float): py_printf('Error', 'Unable to track a neutron for slice %s ' + \ 'since the input location of the slice is not a number', plane) # First plot the regions in the geometry as a backdrop for the # neutron's path # Initialize a numpy array for the surface colors surface = numpy.zeros((gridsize, gridsize), dtype=np.int32) # Initialize dim1 = np.linspace(lim1[0], lim1[1], gridsize) dim2 = np.linspace(lim2[0], lim2[1], gridsize) if plane.lower() == 'xy': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(dim1[i], dim2[j], loc): region = geometry.findContainingRegion(dim1[i], \ dim2[j], loc) surface[j][i] = region.getUid() if plane.lower() == 'xz': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(dim1[i], loc, dim2[j]): region = geometry.findContainingRegion(dim1[i], loc, dim2[j]) surface[j][i] = region.getUid() if plane.lower() == 'yz': for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if geometry.contains(loc, dim1[i], dim2[j]): region = geometry.findContainingRegion(loc, dim1[i], dim2[j]) surface[j][i] = region.getUid() # Plot the regions in the geometry fig = plt.figure() plt.pcolor(dim1, dim2, surface) plt.axis([lim1[0], lim1[1], lim2[0], lim2[1]]) # Create a neutron to track neutron = createNewNeutron() geometry.initializeSourceNeutron(neutron) # Initialize empty lists to track the neutron's location x = [] y = [] z = [] # Track the neutron for i in range(num_moves): # If the neutron was killed on the last collision, then break loop if not neutron._alive: break geometry.findContainingRegion(neutron) region = neutron._region region.collideNeutron(neutron) x.append(neutron._x) y.append(neutron._y) z.append(neutron._z) # Plot the neutron path throughout the geometry if plane.lower() == 'xy': plt.plot(x,y,'b-') plt.plot(x,y,'bo', markersize=7, markeredgecolor='w') elif plane.lower() == 'yz': plt.plot(y,z,'b-') plt.plot(y,z,'bo', markersize=7, markeredgecolor='w') else: plt.plot(x,z,'b-') plt.plot(x,z,'bo', markersize=7, markeredgecolor='w') plt.title('Tracking a Neutron in ' + plane.upper()) if filename is '': filename = directory + '/' + 'track-a-neutron-' + plane.lower() + '.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-' + plane.lower() + '-.png' plt.savefig(filename) plt.close(fig)
def plotSlice(space, plane='XY', loc=0.0, lim1=[-2., 2.], lim2=[-2., 2.], gridsize=100, filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) # Error checking if not isinstance(space, (BoundedModeratorRegion, BoundedFuelRegion, \ BoundedGeneralRegion, Geometry)): py_printf('ERROR', 'Unable to plot a %s slice since input ' + \ 'did not contain a region or geometry', plane) if not isinstance(plane, str): py_printf('ERROR', 'Unable to plot a %s slice for space %s.' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', str(plane), space.getName()) if plane.lower() != 'xy' and plane.lower() != 'xz' \ and plane.lower() != 'yz': print 'plane.lower = ' + str(plane.lower()) py_printf('ERROR', 'Unable to plot a %s slice for space %s.' + \ 'PINSPEC only supports plots of XY, XZ and YZ slices.', plane, space.getName()) if len(lim1) is not 2: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the lim1 parameter is of length %d rather than 2', plane, space.getName(), len(lim1)) if len(lim2) is not 2: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the lim2 parameter is of length %d rather than 2', plane, space.getName(), len(lim2)) if not isinstance(lim1[0], float) or not isinstance(lim1[1], float): py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'lim1 does not contain floating point values', plane, space.getName()) if not isinstance(lim2[0], float) or not isinstance(lim2[1], float): py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'lim2 does not contain floating point values', plane, space.getName()) if lim1[0] >= lim1[1]: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the minimum lim1 value (%f) is greater than the ' + \ 'maximum lim1 value (%f)', space.getName(), plane, lim1[0], lim1[1]) if lim2[0] >= lim2[1]: py_printf('ERROR', 'Unable to plot a %s slice for space %s since ' + \ 'the minimum lim2 value (%f) is greater than the ' + \ 'maximum lim2 value (%f)', space.getName(), plane, lim2[0], lim2[1]) if not isinstance(gridsize, int): py_printf('ERROR', 'Unable to plot a %s slice for space %s ' + \ 'Since the gridsize %s is not an integer', plane, space.getName(), str(gridsize)) if gridsize <= 0: py_printf('Error', 'Unable to plot a %s slice for space %s ' + \ 'with a negative gridsize (%d)', plane, space.getName(), gridsize) if not isinstance(loc, float): py_printf('Error', 'Unable to plot a %s slice for space %s ' + \ 'since the input location of the slice is not a number', plane, space.getName()) # Initialize a numpy array for the surface colors surface = numpy.zeros((gridsize, gridsize), dtype=np.int32) dim1 = np.linspace(lim1[0], lim1[1], gridsize) dim2 = np.linspace(lim2[0], lim2[1], gridsize) if plane.lower() == 'xy': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], dim2[j], loc): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], dim2[j], loc): region = space.findContainingRegion(dim1[i], \ dim2[j], loc) surface[j][i] = region.getUid() if plane.lower() == 'xz': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], loc, dim2[j]): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(dim1[i], loc, dim2[j]): region = space.findContainingRegion(dim1[i], loc, dim2[j]) surface[j][i] = region.getUid() if plane.lower() == 'yz': # We are plotting a region if isinstance(space, (BoundedRegion, BoundedModeratorRegion, \ BoundedFuelRegion)): # We are plotting a region for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(loc, dim1[i], dim2[j]): surface[j][i] = 1.0 # We are plotting the geometry else: for i in range(len(dim1)): for j in range(len(dim2)): # Color space for points within the space if space.contains(loc, dim1[i], dim2[j]): region = space.findContainingRegion(loc, dim1[i], dim2[j]) surface[j][i] = region.getUid() fig = plt.figure() plt.pcolor(dim1, dim2, surface) plt.axis([lim1[0], lim1[1], lim2[0], lim2[1]]) if plane.lower() == 'xy': plt.title('' + plane.upper() + ' Plane at z = ' + str(loc)) if plane.lower() == 'xz': plt.title('' + plane.upper() + ' Plane at y = ' + str(loc)) else: plt.title('' + plane.upper() + ' Plane at x = ' + str(loc)) if filename is '': filename = directory + '/' + plane.lower() + '-slice.png' else: filename = directory + filename.replace(' ', '-').lower() + \ '-' + plane.lower() + '-slice.png' plt.savefig(filename) plt.close(fig)
def plotThermalScattering(isotope, uselegend=True, title='', filename=''): global subdirectory directory = pinspec.get_output_directory() + subdirectory # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) num_bins = isotope.getNumThermalCDFBins() num_cdfs = isotope.getNumThermalCDFs() Eprime_to_E = isotope.retrieveEprimeToE(num_bins) E_to_kT = isotope.retrieveEtokT(num_cdfs) cdfs = isotope.retrieveThermalCDFs(num_cdfs*num_bins) cdfs = np.reshape(cdfs, [num_cdfs, num_bins]) # reshape 1D array to 2D dist = isotope.retrieveThermalPDFs(num_cdfs*num_bins) dist = np.reshape(dist, [num_cdfs, num_bins]) # reshape 1D array to 2D # Plot the PDFs fig = plt.figure() legend = [] for i in range(num_cdfs): plt.plot(Eprime_to_E, dist[i][:]) legend.append("%.2e" % E_to_kT[i] + ' kT') plt.ylabel('Probability') plt.xlabel('E'+"'"+'/ E') plt.grid() if (uselegend): plt.legend(legend, ncol=2, loc='upper right', prop={'size':14}) if title is '': plt.title(isotope.getIsotopeName() + ' Thermal Scattering PDFs') else: plt.title(title.title() + ' Thermal Scattering PDFs') if filename is '': pdfsfilename = directory + isotope.getIsotopeName() + \ '-thermal-scattering-pdfs.png' else: pdfsfilename = directory + filename.replace(' ', '-').lower() + \ '-thermal-scattering-pdfs.png' plt.savefig(pdfsfilename) # Plot the CDFs fig = plt.figure() legend = [] for i in range(num_cdfs): plt.plot(Eprime_to_E, cdfs[i][:]) legend.append("%.2e" % E_to_kT[i] + ' kT') plt.ylabel('Cumulative Probability') plt.xlabel('E'+"'"+' / E') plt.grid() if (uselegend): plt.legend(legend, ncol=2, loc='lower right', prop={'size':12}) if title is '': plt.title(isotope.getIsotopeName() + ' Thermal Scattering CDFs') else: plt.title(title.title() + ' Thermal Scattering CDFs') if filename is '': cdfsfilename = directory + isotope.getIsotopeName() + \ '-thermal-scattering-cdfs.png' else: cdfsfilename = directory + filename.replace(' ', '-').lower() + \ '-thermal-scattering-cdfs.png' plt.savefig(cdfsfilename) plt.close(fig)