Chi-Tech
source_function.cc
Go to the documentation of this file.
1#include "source_function.h"
2
5
6#include "chi_runtime.h"
7#include "chi_log.h"
8
9namespace lbs
10{
11
12//###################################################################
13/**Constructor.*/
15 lbs_solver_(lbs_solver)
16{}
17
18
19//###################################################################
20/**Sets the source moments for the groups in the current group set.
21 *
22 * \param groupset The groupset the under consideration.
23 * \param destination_q A vector to contribute the source to.
24 * \param phi_local The primary STL vector to operate off.
25 * \param source_flags Flags for adding specific terms into the
26 * destination vector. Available flags are for applying
27 * the material source, across/within-group scattering,
28 * and across/within-groups fission.
29 *
30 * */
32 std::vector<double> &destination_q,
33 const std::vector<double> &phi_local,
34 SourceFlags source_flags)
35{
36 if (source_flags & NO_FLAGS_SET) return;
37
38 const size_t source_event_tag = lbs_solver_.GetSourceEventTag();
40
41 apply_fixed_src_ = (source_flags & APPLY_FIXED_SOURCES);
47
48 //================================================== Get group setup
49 gs_i_ = static_cast<size_t>(groupset.groups_.front().id_);
50 gs_f_ = static_cast<size_t>(groupset.groups_.back().id_);
51
52 first_grp_ = static_cast<size_t>(lbs_solver_.Groups().front().id_);
53 last_grp_ = static_cast<size_t>(lbs_solver_.Groups().back().id_);
54
55 default_zero_src_.assign(lbs_solver_.Groups().size(), 0.0);
56
57 const auto& cell_transport_views = lbs_solver_.GetCellTransportViews();
58 const auto& matid_to_src_map = lbs_solver_.GetMatID2IsoSrcMap();
59
60 const size_t num_moments = lbs_solver_.NumMoments();
61 const auto& ext_src_moments_local = lbs_solver_.ExtSrcMomentsLocal();
62
63 const auto& m_to_ell_em_map =
64 groupset.quadrature_->GetMomentToHarmonicsIndexMap();
65
66 //================================================== Loop over local cells
67 const auto& grid = lbs_solver_.Grid();
68 // Apply all nodal sources
69 for (const auto& cell : grid.local_cells)
70 {
71 auto& transport_view = cell_transport_views[cell.local_id_];
72 cell_volume_ = transport_view.Volume();
73
74 //==================== Obtain xs
75 const auto& xs = transport_view.XS();
76
77 std::shared_ptr<chi_physics::IsotropicMultiGrpSource> P0_src = nullptr;
78 if (matid_to_src_map.count(cell.material_id_) > 0)
79 P0_src = matid_to_src_map.at(cell.material_id_);
80
81 const auto& S = xs.TransferMatrices();
82 const auto& F = xs.ProductionMatrix();
83 const auto& precursors = xs.Precursors();
84 const auto& nu_delayed_sigma_f = xs.NuDelayedSigmaF();
85
86 //======================================== Loop over nodes
87 const int num_nodes = transport_view.NumNodes();
88 for (int i = 0; i < num_nodes; ++i)
89 {
90 //=================================== Loop over moments
91 for (int m = 0; m < static_cast<int>(num_moments); ++m)
92 {
93 unsigned int ell = m_to_ell_em_map[m].ell;
94
95 size_t uk_map = transport_view.MapDOF(i, m, 0); //unknown map
96
97 const double* phi = &phi_local[uk_map];
98
99 //==================== Declare moment src
100 if (P0_src and ell == 0)
101 fixed_src_moments_ = P0_src->source_value_g_.data();
102 else
104
106 fixed_src_moments_ = &ext_src_moments_local[uk_map];
107
108 //============================= Loop over groupset groups
109 for (size_t g = gs_i_; g <= gs_f_; ++g)
110 {
111 g_ = g;
112
113 double rhs = 0.0;
114
115 //============================== Apply fixed sources
116 if (apply_fixed_src_) rhs += this->AddSourceMoments();
117
118 //============================== Apply scattering sources
119 if (ell < S.size())
120 {
121 const auto& S_ell = S[ell];
122 //==================== Add Across GroupSet Scattering (AGS)
124 for (const auto& [_, gp, sigma_sm] : S_ell.Row(g))
125 if (gp < gs_i_ or gp > gs_f_)
126 rhs += sigma_sm * phi[gp];
127
128 //==================== Add Within GroupSet Scattering (WGS)
130 for (const auto& [_, gp, sigma_sm] : S_ell.Row(g))
131 if (gp >= gs_i_ and gp <= gs_f_)
132 {
133 if (suppress_wg_scatter_src_ and g_ == gp) continue;
134 rhs += sigma_sm * phi[gp];
135 }
136 }
137
138 //============================== Apply fission sources
139 const bool fission_avail = ell == 0 and xs.IsFissionable();
140
141 if (fission_avail)
142 {
143 const auto& F_g = F[g];
145 for (size_t gp = first_grp_; gp <= last_grp_; ++gp)
146 if (gp < gs_i_ or gp > gs_f_)
147 rhs += F_g[gp] * phi[gp];
148
150 for (size_t gp = gs_i_; gp <= gs_f_; ++gp)
151 rhs += F_g[gp] * phi[gp];
152
154 rhs += this->AddDelayedFission(
155 precursors, nu_delayed_sigma_f, &phi_local[uk_map]);
156 }
157
158 //============================== Add to destination vector
159 destination_q[uk_map + g] += rhs;
160
161 }//for g
162 }//for m
163 }//for dof i
164 }//for cell
165
166 AddAdditionalSources(groupset, destination_q, phi_local, source_flags);
167
169}
170
172{
173 return fixed_src_moments_[g_];
174}
175
176
177//###################################################################
178/**Adds delayed particle precursor sources.*/
180 AddDelayedFission(const PrecursorList &precursors,
181 const std::vector<double> &nu_delayed_sigma_f,
182 const double *phi) const
183{
184 double value = 0.0;
186 for (size_t gp = first_grp_; gp <= last_grp_; ++gp)
187 if (gp < gs_i_ or gp > gs_f_)
188 for (const auto& precursor : precursors)
189 value += precursor.emission_spectrum[g_] *
190 precursor.fractional_yield *
191 nu_delayed_sigma_f[gp] * phi[gp];
192
194 for (size_t gp = gs_i_; gp <= gs_f_; ++gp)
195 for (const auto& precursor : precursors)
196 value += precursor.emission_spectrum[g_] *
197 precursor.fractional_yield *
198 nu_delayed_sigma_f[gp] * phi[gp];
199
200 return value;
201}
202
203
204//###################################################################
205/**Adds point sources to the source moments.*/
208 std::vector<double> &destination_q,
209 const std::vector<double>&,
210 SourceFlags source_flags)
211{
212 const bool apply_fixed_src = (source_flags & APPLY_FIXED_SOURCES);
213
214 const auto& cell_transport_views = lbs_solver_.GetCellTransportViews();
215
216 const auto gs_i = static_cast<size_t>(groupset.groups_.front().id_);
217 const auto gs_f = static_cast<size_t>(groupset.groups_.back().id_);
218
219 //================================================== Apply point sources
220 if (not lbs_solver_.Options().use_src_moments and apply_fixed_src)
221 for (const auto& point_source : lbs_solver_.PointSources())
222 {
223 const auto& info_list = point_source.ContainingCellsInfo();
224 for (const auto& info : info_list)
225 {
226 auto& transport_view = cell_transport_views[info.cell_local_id];
227
228 const auto& strength = point_source.Strength();
229 const auto& node_weights = info.node_weights;
230 const double vol_w = info.volume_weight;
231
232 const int num_nodes = transport_view.NumNodes();
233 for (int i = 0; i < num_nodes; ++i)
234 {
235 const size_t uk_map = transport_view.MapDOF(i, /*moment=*/0, /*grp=*/0);
236 for (size_t g = gs_i; g <= gs_f; ++g)
237 destination_q[uk_map + g] += strength[g] * node_weights[i] * vol_w;
238 }//for node i
239 }//for cell
240 }//for point source
241}
242
243}//namespace lbs
static chi::ChiLog & log
Definition: chi_runtime.h:81
@ EVENT_BEGIN
Signals the begin of an event.
@ EVENT_END
Signals the end of an event.
void LogEvent(size_t ev_tag, EventType ev_type, const std::shared_ptr< EventInfo > &ev_info)
Definition: chi_log.cc:204
std::shared_ptr< chi_math::AngularQuadrature > quadrature_
Definition: lbs_groupset.h:42
std::vector< LBSGroup > groups_
Definition: lbs_groupset.h:41
const std::vector< PointSource > & PointSources() const
const std::vector< lbs::CellLBSView > & GetCellTransportViews() const
const std::vector< LBSGroup > & Groups() const
std::vector< double > & ExtSrcMomentsLocal()
const chi_mesh::MeshContinuum & Grid() const
size_t NumMoments() const
const std::map< int, IsotropicSrcPtr > & GetMatID2IsoSrcMap() const
lbs::Options & Options()
size_t GetSourceEventTag() const
std::vector< chi_physics::MultiGroupXS::Precursor > PrecursorList
virtual double AddDelayedFission(const PrecursorList &precursors, const std::vector< double > &nu_delayed_sigma_f, const double *phi) const
const LBSSolver & lbs_solver_
SourceFunction(const LBSSolver &lbs_solver)
virtual void operator()(LBSGroupset &groupset, std::vector< double > &destination_q, const std::vector< double > &phi, SourceFlags source_flags)
const double * fixed_src_moments_
virtual double AddSourceMoments() const
std::vector< double > default_zero_src_
virtual void AddAdditionalSources(LBSGroupset &groupset, std::vector< double > &destination_q, const std::vector< double > &phi, SourceFlags source_flags)
void AddPointSources(LBSGroupset &groupset, std::vector< double > &destination_q, const std::vector< double > &phi, SourceFlags source_flags)
SourceFlags
Definition: lbs_structs.h:88
@ APPLY_AGS_FISSION_SOURCES
Definition: lbs_structs.h:94
@ NO_FLAGS_SET
Definition: lbs_structs.h:89
@ APPLY_WGS_FISSION_SOURCES
Definition: lbs_structs.h:93
@ APPLY_FIXED_SOURCES
Definition: lbs_structs.h:90
@ SUPPRESS_WG_SCATTER
Definition: lbs_structs.h:95
@ APPLY_WGS_SCATTER_SOURCES
Definition: lbs_structs.h:91
@ APPLY_AGS_SCATTER_SOURCES
Definition: lbs_structs.h:92
bool use_src_moments
Definition: lbs_structs.h:139
bool use_precursors
Definition: lbs_structs.h:138