An open source method of characteristics neutron transport code.
GPUSolver Class Reference

This a subclass of the Solver class for NVIDIA Graphics Processing Units (GPUs). More...

#include "openmoc/src/dev/gpu/GPUSolver.h"

Public Member Functions

 GPUSolver (TrackGenerator *track_generator=NULL)
 
int getNumThreadBlocks ()
 
int getNumThreadsPerBlock ()
 Returns the number of threads per block to execute on the GPU. More...
 
FP_PRECISION getFSRSource (int fsr_id, int group)
 
FP_PRECISION getFlux (int fsr_id, int group)
 
void getFluxes (FP_PRECISION *out_fluxes, int num_fluxes)
 
void setNumThreadBlocks (int num_blocks)
 
void setNumThreadsPerBlock (int num_threads)
 
void setGeometry (Geometry *geometry)
 
void setTrackGenerator (TrackGenerator *track_generator)
 
void setFluxes (FP_PRECISION *in_fluxes, int num_fluxes)
 
void initializeExpEvaluator ()
 
void initializeMaterials (solverMode mode=ADJOINT)
 
void initializeFSRs ()
 Initializes the FSR volumes and Materials array. More...
 
void initializeTracks ()
 
void initializeFluxArrays ()
 Initializes Track boundary angular flux and leakage and FSR scalar flux arrays.
 
void initializeSourceArrays ()
 Allocates memory for FSR source arrays.
 
void initializeFixedSources ()
 Assigns fixed sources assigned by Cell, Material to FSRs.
 
void zeroTrackFluxes ()
 Zero each Track's boundary fluxes for each energy group and polar angle in the "forward" and "reverse" directions.
 
void flattenFSRFluxes (FP_PRECISION value)
 Set the scalar flux for each FSR and energy group to some value. More...
 
void storeFSRFluxes ()
 Stores the current scalar fluxes in the old scalar flux array.
 
void normalizeFluxes ()
 Normalizes all FSR scalar fluxes and Track boundary angular fluxes to the total fission source (times $ \nu $).
 
void computeFSRSources ()
 
void computeFSRFissionSources ()
 Computes the total fission source for each FSR and energy group.
 
void computeFSRScatterSources ()
 Computes the total scattering source for each FSR and energy group.
 
void transportSweep ()
 This method performs one transport sweep of all azimuthal angles, Tracks, segments, polar angles and energy groups.
 
void addSourceToScalarFlux ()
 Add the source term contribution in the transport equation to the FSR scalar flux.
 
void computeKeff ()
 Compute $ k_{eff} $ from total fission and absorption rates in each FSR and energy group.
 
double computeResidual (residualType res_type)
 Computes the residual between successive flux/source iterations. More...
 
void computeFSRFissionRates (double *fission_rates, int num_FSRs)
 
- Public Member Functions inherited from Solver
 Solver (TrackGenerator *track_generator=NULL)
 Constructor initializes an empty Solver class with array pointers set to NULL. More...
 
virtual ~Solver ()
 Destructor deletes arrays of boundary angular fluxes, scalar fluxes and sources for each FSR and energy group. More...
 
void setGeometry (Geometry *geometry)
 Sets the Geometry for the Solver. More...
 
GeometrygetGeometry ()
 Returns a pointer to the Geometry. More...
 
TrackGeneratorgetTrackGenerator ()
 Returns a pointer to the TrackGenerator. More...
 
FP_PRECISION getFSRVolume (long fsr_id)
 Returns the calculated volume for a flat source region. More...
 
int getNumPolarAngles ()
 Returns the number of angles used for the polar quadrature. More...
 
int getNumIterations ()
 Returns the number of source iterations to converge the source. More...
 
double getTotalTime ()
 Returns the total time to converge the source (seconds). More...
 
double getKeff ()
 Returns the converged eigenvalue $ k_{eff} $. More...
 
double getConvergenceThreshold ()
 Returns the threshold for source/flux convergence. More...
 
FP_PRECISION getMaxOpticalLength ()
 Get the maximum allowable optical length for a track segment. More...
 
bool isUsingDoublePrecision ()
 Returns whether the solver is using double floating point precision. More...
 
bool isUsingExponentialInterpolation ()
 Returns whether the Solver uses linear interpolation to compute exponentials. More...
 
bool is3D ()
 Returns whether the Solver is tackling a 3D problem. More...
 
void initializeSolver (solverMode solver_mode)
 Initializes most components of Solver. Mostly needed from the Python side.
 
void printFissionRates (std::string fname, int nx, int ny, int nz)
 Prints fission rates to a binary file. More...
 
virtual void printInputParamsSummary ()
 A function that prints a summary of the input parameters.
 
void setKeffFromNeutronBalance ()
 Sets computation method of k-eff from fission, absorption, and leakage rates rather than from fission rates. keff = fission/(absorption + leakage)
 
void setResidualByReference (std::string fname)
 Sets residuals to be computed a error relative to a reference. More...
 
void dumpFSRFluxes (std::string fname)
 Prints scalar fluxes to a binary file. More...
 
void loadInitialFSRFluxes (std::string fname)
 Load the initial scalar flux distribution from a binary file. More...
 
void loadFSRFluxes (std::string fname, bool assign_k_eff=false, double tolerance=0.01)
 Load scalar fluxes from a binary file. More...
 
double getFlux (long fsr_id, int group)
 Returns the scalar flux for some FSR and energy group. More...
 
double getFSRSource (long fsr_id, int group)
 Returns the source for some energy group for a flat source region. More...
 
void setTrackGenerator (TrackGenerator *track_generator)
 Sets the Solver's TrackGenerator with characteristic Tracks. More...
 
void setConvergenceThreshold (double threshold)
 Sets the threshold for source/flux convergence. More...
 
virtual void setFixedSourceByFSR (long fsr_id, int group, double source)
 Assign a fixed source for a flat source region and energy group. More...
 
void setFixedSourceByCell (Cell *cell, int group, double source)
 Assign a fixed source for a Cell and energy group. More...
 
void setFixedSourceByMaterial (Material *material, int group, double source)
 Assign a fixed source for a Material and energy group. More...
 
void setMaxOpticalLength (FP_PRECISION max_optical_length)
 Set the maximum allowable optical length for a track segment. More...
 
void setExpPrecision (double precision)
 Set the precision, or maximum allowable approximation error, of the the exponential interpolation table. More...
 
void useExponentialInterpolation ()
 Informs the Solver to use linear interpolation to compute the exponential in the transport equation.
 
void useExponentialIntrinsic ()
 Informs the Solver to use the exponential intrinsic exp(...) function to compute the exponential in the transport equation.
 
void setSolverMode (solverMode solver_mode)
 Choose between direct and adjoint mode. More...
 
void setRestartStatus (bool is_restart)
 Informs the Solver that this is a 'restart' calculation and therefore k_eff, track angular and region scalar fluxes should not be reset. More...
 
void allowNegativeFluxes (bool negative_fluxes_on)
 Informs the Solver that this calculation may involve negative fluxes for computing higher eigenmodes for example. More...
 
void correctXS ()
 Directs OpenMOC to correct unphysical cross-sections. More...
 
void stabilizeTransport (double stabilization_factor, stabilizationType stabilization_type=DIAGONAL)
 Directs OpenMOC to use the diagonal stabilizing correction to the source iteration transport sweep. More...
 
void setInitialSpectrumCalculation (double threshold)
 Instructs OpenMOC to perform an initial spectrum calculation. More...
 
void setCheckXSLogLevel (logLevel log_level)
 Determines which log level to set cross-section warnings. More...
 
void setChiSpectrumMaterial (Material *material)
 Sets the chi spectrum for use as an inital flux guess. More...
 
void resetMaterials (solverMode mode)
 Returns the Material data to its original state. More...
 
void fissionTransportSweep ()
 This method performs one transport sweep using the fission source. More...
 
void scatterTransportSweep ()
 This method performs one transport sweep using the scatter source. More...
 
void computeFlux (int max_iters=1000, bool only_fixed_source=true)
 Computes the scalar flux distribution by performing a series of transport sweeps. More...
 
void computeSource (int max_iters=1000, double k_eff=1.0, residualType res_type=TOTAL_SOURCE)
 Computes the total source distribution by performing a series of transport sweep and source updates. More...
 
void computeEigenvalue (int max_iters=1000, residualType res_type=FISSION_SOURCE)
 Computes keff by performing a series of transport sweep and source updates. More...
 
void printBGQMemory ()
 
virtual void computeFSRFissionRates (double *fission_rates, long num_FSRs, bool nu=false)=0
 Computes the volume-weighted, energy integrated fission rate in each FSR and stores them in an array indexed by FSR ID. More...
 
float * getBoundaryFlux (long track_id, bool fwd)
 Returns the boundary flux array at the requested indexes. More...
 
void setVerboseIterationReport ()
 Sets the solver to print extra information for each iteration.
 
void printTimerReport ()
 Prints a report of the timing statistics to the console.
 
FP_PRECISION * getFluxesArray ()
 A function that returns the array of scalar fluxes. More...
 
void limitXS ()
 Limits cross-sections so that there are no negative cross-sections. More...
 
void setLimitingXSMaterials (std::vector< int > material_ids, int reset_iteration)
 Instructs MOC to limit negative cross-sections for early iterations. More...
 
void checkLimitXS (int iteration)
 Checks to see if limited XS should be reset. More...
 
void setOTFTransport ()
 Activate On-The-Fly transport, to OTF ray-trace and propagate the track angular fluxes at the same time.
 

Additional Inherited Members

- Protected Member Functions inherited from Solver
virtual void initializeExpEvaluators ()
 Initializes new ExpEvaluator object to compute exponentials.
 
void initializeMaterials (solverMode mode)
 Initializes the Material's production matrices. More...
 
void countFissionableFSRs ()
 Counts the number of fissionable flat source regions. More...
 
void checkXS ()
 All material cross-sections in the geometry are checked for consistency. More...
 
virtual void initializeCmfd ()
 Initializes a Cmfd object for acceleration prior to source iteration. More...
 
void calculateInitialSpectrum (double threshold)
 Performs a spectrum calculation to update the scalar fluxes. More...
 
virtual void flattenFSRFluxesChiSpectrum ()=0
 Set the scalar flux for each FSR to a chi spectrum.
 
virtual void computeStabilizingFlux ()=0
 Computes the stabilizing flux for transport stabilization.
 
virtual void stabilizeFlux ()=0
 Adjusts the scalar flux for transport stabilization.
 
virtual void computeFSRSources (int iteration)=0
 Computes the total source (fission, scattering, fixed) for each FSR and energy group.
 
void clearTimerSplits ()
 Deletes the Timer's timing entries for each timed code section code in the source convergence loop. More...
 
- Protected Attributes inherited from Solver
int _num_azim
 
int _num_groups
 
long _num_FSRs
 
long _num_fissionable_FSRs
 
FP_PRECISION * _FSR_volumes
 
Material ** _FSR_materials
 
Material_chi_spectrum_material
 
TrackGenerator_track_generator
 
Geometry_geometry
 
int _num_materials
 
Quadrature_quad
 
int _num_polar
 
int _fluxes_per_track
 
Track ** _tracks
 
std::vector< int > _limit_xs_materials
 
int _reset_iteration
 
bool _limit_xs
 
std::map< int, Material * > _original_materials
 
std::map< int, Material * > _limit_materials
 
int *** _tracks_per_stack
 
bool _SOLVE_3D
 
solverMode _solver_mode
 
bool _is_restart
 
bool _user_fluxes
 
bool _fixed_sources_on
 
bool _correct_xs
 
bool _stabilize_transport
 
bool _verbose
 
bool _calculate_initial_spectrum
 
double _initial_spectrum_thresh
 
bool _load_initial_FSR_fluxes
 
bool _calculate_residuals_by_reference
 
bool _negative_fluxes_allowed
 
std::string _initial_FSR_fluxes_file
 
std::string _reference_file
 
logLevel _xs_log_level
 
segmentationType _segment_formation
 
long _tot_num_tracks
 
float * _boundary_flux
 
float * _start_flux
 
float * _boundary_leakage
 
FP_PRECISION * _scalar_flux
 
FP_PRECISION * _old_scalar_flux
 
FP_PRECISION * _reference_flux
 
FP_PRECISION * _stabilizing_flux
 
FP_PRECISION * _fixed_sources
 
std::vector< FP_PRECISION * > _groupwise_scratch
 
double * _regionwise_scratch
 
std::map< std::pair< int, int >, FP_PRECISION > _fix_src_FSR_map
 
std::map< std::pair< Cell *, int >, FP_PRECISION > _fix_src_cell_map
 
std::map< std::pair< Material *, int >, FP_PRECISION > _fix_src_material_map
 
FP_PRECISION * _reduced_sources
 
double _k_eff
 
bool _keff_from_fission_rates
 
int _num_iterations
 
double _converge_thresh
 
double _stabilization_factor
 
stabilizationType _stabilization_type
 
ExpEvaluator *** _exp_evaluators
 
int _num_exp_evaluators_azim
 
int _num_exp_evaluators_polar
 
Timer_timer
 
Cmfd_cmfd
 
std::string _source_type
 
bool _OTF_transport
 

Detailed Description

This a subclass of the Solver class for NVIDIA Graphics Processing Units (GPUs).

The source code for this class includes C++ coupled with compute intensive CUDA kernels for execution on the GPU.

Member Function Documentation

◆ computeResidual()

double GPUSolver::computeResidual ( residualType  res_type)
virtual

Computes the residual between successive flux/source iterations.

Parameters
res_typethe type of residual (FLUX, FISSIOn_SOURCE, TOTAL_SOURCE)
Returns
the total residual summed over FSRs and energy groups

Implements Solver.

◆ flattenFSRFluxes()

void GPUSolver::flattenFSRFluxes ( FP_PRECISION  value)
virtual

Set the scalar flux for each FSR and energy group to some value.

Parameters
valuethe value to assign to each FSR scalar flux

Implements Solver.

◆ getNumThreadsPerBlock()

int GPUSolver::getNumThreadsPerBlock ( )

Returns the number of threads per block to execute on the GPU.

Returns
the number of threads per block

◆ initializeFSRs()

void GPUSolver::initializeFSRs ( )
virtual

Initializes the FSR volumes and Materials array.

This method assigns each FSR a unique, monotonically increasing ID, sets the Material for each FSR, and assigns a volume based on the cumulative length of all of the segments inside the FSR.

Reimplemented from Solver.


The documentation for this class was generated from the following file: