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

This is a subclass of the CPUSolver class which uses memory-aligned data structures and Intel's auto-vectorization. More...

#include "src/VectorizedSolver.h"

Public Member Functions

 VectorizedSolver (TrackGenerator *track_generator=NULL)
 Constructor initializes NULL arrays for source, flux, etc. More...
 
virtual ~VectorizedSolver ()
 Destructor deletes Track boundary angular flux and and FSR scalar flux and source arrays.
 
int getNumVectorWidths ()
 Returns the number of vector lengths required to fit the number of energy groups. More...
 
void setFixedSourceByFSR (int fsr_id, int group, FP_PRECISION source)
 Assign a fixed source for a flat source region and energy group. More...
 
void setGeometry (Geometry *geometry)
 Sets the Geometry for the Solver and aligns all Material cross-section data for SIMD vector instructions. More...
 
- Public Member Functions inherited from CPUSolver
 CPUSolver (TrackGenerator *track_generator=NULL)
 Constructor initializes array pointers for Tracks and Materials. More...
 
virtual ~CPUSolver ()
 Destructor deletes array for OpenMP mutual exclusion locks for FSR scalar flux updates, and calls Solver parent class destructor to deletes arrays for fluxes and sources.
 
int getNumThreads ()
 Returns the number of shared memory OpenMP threads in use. More...
 
void setNumThreads (int num_threads)
 Sets the number of shared memory OpenMP threads to use (>0). More...
 
void setFluxes (FP_PRECISION *in_fluxes, int num_fluxes)
 Set the flux array for use in transport sweep source calculations. More...
 
void setFixedSourceByFSR (long fsr_id, int group, FP_PRECISION source)
 Assign a fixed source for a flat source region and energy group. More...
 
void computeFSRFissionRates (double *fission_rates, long num_FSRs, bool nu=false)
 Computes the volume-averaged, energy-integrated fission or nu-fission rate in each FSR and stores them in an array indexed by FSR ID. More...
 
void printInputParamsSummary ()
 A function that prints a summary of the input parameters.
 
void tallyScalarFlux (segment *curr_segment, int azim_index, int polar_index, FP_PRECISION *fsr_flux, float *track_flux)
 Computes the contribution to the FSR scalar flux from a Track segment. More...
 
void accumulateScalarFluxContribution (long fsr_id, FP_PRECISION weight, FP_PRECISION *fsr_flux)
 Move the segment(s)' contributions to the scalar flux from the buffer to the global scalar flux array. More...
 
void tallyCurrent (segment *curr_segment, int azim_index, int polar_index, float *track_flux, bool fwd)
 Tallies the current contribution from this segment across the the appropriate CMFD mesh cell surface. More...
 
void transferBoundaryFlux (Track *track, int azim_index, int polar_index, bool direction, float *track_flux)
 Updates the boundary flux for a Track given boundary conditions. More...
 
void getFluxes (FP_PRECISION *out_fluxes, int num_fluxes)
 Fills an array with the scalar fluxes. More...
 
void initializeFixedSources ()
 Populates array of fixed sources assigned by FSR.
 
void printFSRFluxes (std::vector< double > dim1, std::vector< double > dim2, double offset, const char *plane)
 A function that prints the source region fluxes on a 2D mesh grid. More...
 
void printFluxesTemp ()
 A function that prints fsr fluxes in xy plane at z=middle. More...
 
void printNegativeSources (int iteration, int num_x, int num_y, int num_z)
 A function that prints the number of FSRs with negative sources in the whole geometry subdivided by a 3D lattice. The number of negative sources per energy group is also printed out. More...
 
- 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...
 
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 ()
 
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.
 

Protected Member Functions

void initializeExpEvaluator ()
 Allocates memory for the exponential linear interpolation table.
 
void initializeFluxArrays ()
 Allocates memory for Track boundary angular flux and leakage and FSR scalar flux arrays. More...
 
void initializeSourceArrays ()
 Allocates memory for FSR source arrays. More...
 
void normalizeFluxes ()
 Normalizes all FSR scalar fluxes and Track boundary angular fluxes to the total fission source (times $ \nu $).
 
void computeFSRSources (int iteration)
 Computes the total source (fission, scattering, fixed) in each FSR. More...
 
void addSourceToScalarFlux ()
 Add the source term contribution in the transport equation to the FSR scalar flux.
 
void computeKeff ()
 Compute $ k_{eff} $ from the total, fission and scattering reaction rates and leakage. More...
 
void tallyScalarFlux (segment *curr_segment, int azim_index, FP_PRECISION *track_flux, FP_PRECISION *fsr_flux)
 Computes the contribution to the FSR scalar flux from a segment. More...
 
void transferBoundaryFlux (int track_id, int azim_index, bool direction, FP_PRECISION *track_flux)
 Updates the boundary flux for a Track given boundary conditions. More...
 
void computeExponentials (segment *curr_segment, FP_PRECISION *exponentials)
 Computes an array of the exponentials in the transport equation, $ exp(-\frac{\Sigma_t * l}{sin(\theta)}) $, for each energy group and polar angle for a given Track segment. More...
 
- Protected Member Functions inherited from CPUSolver
virtual void initializeFSRs ()
 Initializes the FSR volumes and Materials array. More...
 
void zeroTrackFluxes ()
 Zero each Track's boundary fluxes for each energy group (and polar angle in 2D) in the "forward" and "reverse" directions.
 
void copyBoundaryFluxes ()
 Copies values from the start flux into the boundary flux array for both the "forward" and "reverse" directions.
 
void tallyStartingCurrents ()
 Computes the total current impingent on boundary CMFD cells from starting angular fluxes.
 
virtual void flattenFSRFluxes (FP_PRECISION value)
 Set the scalar flux for each FSR and energy group to some value. More...
 
void flattenFSRFluxesChiSpectrum ()
 Set the scalar flux for each FSR to a chi spectrum.
 
void storeFSRFluxes ()
 Stores the FSR scalar fluxes in the old scalar flux array.
 
void computeFSRFissionSources ()
 Computes the total fission source in each FSR. More...
 
void computeFSRScatterSources ()
 Computes the total scattering source in each FSR. More...
 
void transportSweep ()
 This method performs one transport sweep of all azimuthal angles, Tracks, Track segments, polar angles and energy groups. More...
 
virtual void computeStabilizingFlux ()
 Computes the stabilizing flux for transport stabilization.
 
virtual void stabilizeFlux ()
 Adjusts the scalar flux for transport stabilization.
 
double computeResidual (residualType res_type)
 Computes the residual between source/flux iterations. More...
 
- 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...
 
void clearTimerSplits ()
 Deletes the Timer's timing entries for each timed code section code in the source convergence loop. More...
 

Protected Attributes

int _num_vector_lengths
 
FP_PRECISION * _delta_psi
 
FP_PRECISION * _thread_taus
 
FP_PRECISION * _thread_exponentials
 
- Protected Attributes inherited from CPUSolver
int _num_threads
 
omp_lock_t * _FSR_locks
 
- 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 is a subclass of the CPUSolver class which uses memory-aligned data structures and Intel's auto-vectorization.

Note
This class is only compiled if the Intel compiler is used when building OpenMOC. If building OpenMOC with the "--with-icpc" flag, then this class will be available in the "openmoc.intel.single" or "openmoc.intel.double" Python module.

Constructor & Destructor Documentation

◆ VectorizedSolver()

VectorizedSolver::VectorizedSolver ( TrackGenerator track_generator = NULL)

Constructor initializes NULL arrays for source, flux, etc.

Parameters
track_generatoran optional pointer to a TrackGenerator object

Member Function Documentation

◆ computeExponentials()

void VectorizedSolver::computeExponentials ( segment curr_segment,
FP_PRECISION *  exponentials 
)
protected

Computes an array of the exponentials in the transport equation, $ exp(-\frac{\Sigma_t * l}{sin(\theta)}) $, for each energy group and polar angle for a given Track segment.

Parameters
curr_segmentpointer to the Track segment of interest
exponentialsthe array to store the exponential values

◆ computeFSRSources()

void VectorizedSolver::computeFSRSources ( int  iteration)
protectedvirtual

Computes the total source (fission, scattering, fixed) in each FSR.

This method computes the total source in each FSR based on this iteration's current approximation to the scalar flux.

Reimplemented from CPUSolver.

◆ computeKeff()

void VectorizedSolver::computeKeff ( )
protectedvirtual

Compute $ k_{eff} $ from the total, fission and scattering reaction rates and leakage.

This method computes the current approximation to the multiplication factor on this iteration as follows: $ k_{eff} = \frac{\displaystyle\sum_{i \in I} \displaystyle\sum_{g \in G} \nu \Sigma^F_g \Phi V_{i}} {\displaystyle\sum_{i \in I} \displaystyle\sum_{g \in G} (\Sigma^T_g \Phi V_{i} - \Sigma^S_g \Phi V_{i} - L_{i,g})} $

Reduce leakage array across tracks, energy groups, polar angles

Reimplemented from CPUSolver.

◆ getNumVectorWidths()

int VectorizedSolver::getNumVectorWidths ( )

Returns the number of vector lengths required to fit the number of energy groups.

If the number of energy groups is 35 and the vector width is 4, this method will return 9 since 9*4 = 36 is the nearest integer greater than or equal to 35.

Returns
The number of vector widths

◆ initializeFluxArrays()

void VectorizedSolver::initializeFluxArrays ( )
protectedvirtual

Allocates memory for Track boundary angular flux and leakage and FSR scalar flux arrays.

Deletes memory for old flux arrays if they were allocated for a previous simulation.

Reimplemented from CPUSolver.

◆ initializeSourceArrays()

void VectorizedSolver::initializeSourceArrays ( )
protectedvirtual

Allocates memory for FSR source arrays.

Deletes memory for old source arrays if they were allocated for a previous simulation.

Reimplemented from CPUSolver.

◆ setFixedSourceByFSR()

void VectorizedSolver::setFixedSourceByFSR ( int  fsr_id,
int  group,
FP_PRECISION  source 
)

Assign a fixed source for a flat source region and energy group.

Fixed sources should be scaled to reflect the fact that OpenMOC normalizes the scalar flux such that the total energy- and volume-integrated production rate sums to 1.0.

Parameters
fsr_idthe flat source region ID
groupthe energy group
sourcethe volume-averaged source in this group

◆ setGeometry()

void VectorizedSolver::setGeometry ( Geometry geometry)

Sets the Geometry for the Solver and aligns all Material cross-section data for SIMD vector instructions.

Parameters
geometrya pointer to the Geometry

◆ tallyScalarFlux()

void VectorizedSolver::tallyScalarFlux ( segment curr_segment,
int  azim_index,
FP_PRECISION *  track_flux,
FP_PRECISION *  fsr_flux 
)
protected

Computes the contribution to the FSR scalar flux from a segment.

This method integrates the angular flux for a Track segment across energy groups and polar angles, and tallies it into the FSR scalar flux, and updates the Track's angular flux.

Parameters
curr_segmenta pointer to the Track segment of interest
azim_indexa pointer to the azimuthal angle index for this segment
track_fluxa pointer to the Track's angular flux
fsr_fluxa pointer to the temporary FSR flux buffer

◆ transferBoundaryFlux()

void VectorizedSolver::transferBoundaryFlux ( int  track_id,
int  azim_index,
bool  direction,
FP_PRECISION *  track_flux 
)
protected

Updates the boundary flux for a Track given boundary conditions.

For reflective boundary conditions, the outgoing boundary flux for the Track is given to the reflecting Track. For vacuum boundary conditions, the outgoing flux tallied as leakage.

Parameters
track_idthe ID number for the Track of interest
azim_indexa pointer to the azimuthal angle index for this segment
directionthe Track direction (forward - true, reverse - false)
track_fluxa pointer to the Track's outgoing angular flux

Member Data Documentation

◆ _delta_psi

FP_PRECISION* VectorizedSolver::_delta_psi
protected

The change in angular flux along a track segment for each energy group

◆ _num_vector_lengths

int VectorizedSolver::_num_vector_lengths
protected

Number of energy groups divided by vector widths (VEC_LENGTH)

◆ _thread_exponentials

FP_PRECISION* VectorizedSolver::_thread_exponentials
protected

An array for the exponential terms in the transport equation for * each thread in each energy group and polar angle

◆ _thread_taus

FP_PRECISION* VectorizedSolver::_thread_taus
protected

An array for the optical length for each thread in each energy group


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