/** * @brief Updates the boundary flux for a Track given boundary conditions. * @details 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. * @param track_id the ID number for the Track of interest * @param azim_index a pointer to the azimuthal angle index for this segment * @param direction the Track direction (forward - true, reverse - false) * @param track_flux a pointer to the Track's outgoing angular flux */ void VectorizedSolver::transferBoundaryFlux(int track_id, int azim_index, bool direction, FP_PRECISION* track_flux) { int start; bool bc; FP_PRECISION* track_leakage; int track_out_id; /* Extract boundary conditions for this Track and the pointer to the * outgoing reflective Track, and index into the leakage array */ /* For the "forward" direction */ if (direction) { start = _tracks[track_id]->isReflOut() * _polar_times_groups; track_leakage = &_boundary_leakage(track_id,0); track_out_id = _tracks[track_id]->getTrackOut()->getUid(); bc = _tracks[track_id]->getBCOut(); } /* For the "reverse" direction */ else { start = _tracks[track_id]->isReflIn() * _polar_times_groups; track_leakage = &_boundary_leakage(track_id,_polar_times_groups); track_out_id = _tracks[track_id]->getTrackIn()->getUid(); bc = _tracks[track_id]->getBCIn(); } FP_PRECISION* track_out_flux = &_boundary_flux(track_out_id,0,0,start); /* Loop over polar angles and energy groups */ for (int p=0; p < _num_polar; p++) { /* Loop over each energy group vector length */ for (int v=0; v < _num_vector_lengths; v++) { /* Loop over energy groups within this vector */ #pragma simd vectorlength(VEC_LENGTH) for (int e=v*VEC_LENGTH; e < (v+1)*VEC_LENGTH; e++) { track_out_flux(p,e) = track_flux(p,e) * bc; track_leakage(p,e) = track_flux(p,e) * _polar_weights(azim_index,p) * (!bc); } } } }
/** * @brief Updates the boundary flux for a Track given boundary conditions. * @details 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. * @param track_id the ID number for the Track of interest * @param azim_index a pointer to the azimuthal angle index for this segment * @param direction the Track direction (forward - true, reverse - false) * @param track_flux a pointer to the Track's outgoing angular flux */ void CPUSolver::transferBoundaryFlux(int track_id, int azim_index, bool direction, FP_PRECISION* track_flux) { int start; int bc; FP_PRECISION* track_leakage; int track_out_id; /* Extract boundary conditions for this Track and the pointer to the * outgoing reflective Track, and index into the leakage array */ /* For the "forward" direction */ if (direction) { start = _tracks[track_id]->isReflOut() * _polar_times_groups; bc = (int)_tracks[track_id]->getBCOut(); track_leakage = &_boundary_leakage(track_id,0); track_out_id = _tracks[track_id]->getTrackOut()->getUid(); } /* For the "reverse" direction */ else { start = _tracks[track_id]->isReflIn() * _polar_times_groups; bc = (int)_tracks[track_id]->getBCIn(); track_leakage = &_boundary_leakage(track_id,_polar_times_groups); track_out_id = _tracks[track_id]->getTrackIn()->getUid(); } FP_PRECISION* track_out_flux = &_boundary_flux(track_out_id,0,0,start); /* Loop over polar angles and energy groups */ for (int e=0; e < _num_groups; e++) { for (int p=0; p < _num_polar; p++) { track_out_flux(p,e) = track_flux(p,e) * bc; track_leakage(p,e) = track_flux(p,e) * _polar_weights(azim_index,p) * (!bc); } } }