Chi-Tech
lbs_solver.h
Go to the documentation of this file.
1#ifndef CHITECH_LBS_SOLVER_H
2#define CHITECH_LBS_SOLVER_H
3
5
9#include "lbs_structs.h"
12
14
15#include <petscksp.h>
16
17namespace lbs
18{
19template <class MatType, class VecType, class SolverType>
20class AGSLinearSolver;
21template <class MatType, class VecType, class SolverType>
22class WGSLinearSolver;
23template <class MatType, class VecType, class SolverType>
24struct WGSContext;
25} // namespace lbs
26
27namespace chi
28{
29class ChiMPICommunicatorSet;
30}
31typedef std::shared_ptr<chi::ChiMPICommunicatorSet> MPILocalCommSetPtr;
32
33namespace chi_mesh
34{
35class GridFaceHistogram;
36}
37typedef std::shared_ptr<chi_mesh::GridFaceHistogram> GridFaceHistogramPtr;
38
39namespace chi_math
40{
41class TimeIntegration;
42}
43
44namespace lbs
45{
46
47// ################################################################### Class def
48/**Base class for all Linear Boltzmann Solvers.*/
50{
51public:
52 typedef std::shared_ptr<AGSLinearSolver<Mat, Vec, KSP>> AGSLinSolverPtr;
53 typedef std::shared_ptr<chi_math::LinearSolver<Mat, Vec, KSP>> LinSolvePtr;
54
55protected:
57
59 double last_restart_write_ = 0.0;
60
62 size_t num_moments_ = 0;
63 size_t num_groups_ = 0;
64 size_t num_precursors_ = 0;
66
67 std::vector<LBSGroup> groups_;
68 std::vector<LBSGroupset> groupsets_;
69 std::vector<PointSource> point_sources_;
70
71 std::map<int, XSPtr> matid_to_xs_map_;
72 std::map<int, IsotropicSrcPtr> matid_to_src_map_;
73
74 std::shared_ptr<chi_math::SpatialDiscretization> discretization_ = nullptr;
76
77 std::vector<CellFaceNodalMapping> grid_nodal_mappings_;
80
81 std::vector<UnitCellMatrices> unit_cell_matrices_;
82 std::map<uint64_t, UnitCellMatrices> unit_ghost_cell_matrices_;
83 std::vector<lbs::CellLBSView> cell_transport_views_;
84
85 std::map<uint64_t, BoundaryPreference> boundary_preferences_;
86 std::map<uint64_t, std::shared_ptr<SweepBndry>> sweep_boundaries_;
87
89
91 uint64_t local_node_count_ = 0;
92 uint64_t glob_node_count_ = 0;
93
95 std::vector<double> phi_new_local_, phi_old_local_;
96 std::vector<std::vector<double>> psi_new_local_;
97 std::vector<double> precursor_new_local_;
98
100
101 std::vector<AGSLinSolverPtr> ags_solvers_;
102 std::vector<LinSolvePtr> wgs_solvers_;
104
105 std::map<std::pair<size_t, size_t>, size_t> phi_field_functions_local_map_;
107
108 /**Time integration parameter meant to be set by an executor*/
109 std::shared_ptr<const chi_math::TimeIntegration> time_integration_ = nullptr;
110
111public:
113 explicit LBSSolver(const std::string& text_name);
114 explicit LBSSolver(const chi::InputParameters& params);
115
116 LBSSolver(const LBSSolver&) = delete;
117 LBSSolver& operator=(const LBSSolver&) = delete;
118
119 virtual ~LBSSolver() = default;
120
121 size_t GetSourceEventTag() const;
122
123 double LastRestartWrite() const;
124 double& LastRestartWrite();
125
127 const lbs::Options& Options() const;
128
131 void SetOptions(const chi::InputParameters& params);
132 void SetBoundaryOptions(const chi::InputParameters& params);
133
134 size_t NumMoments() const;
135 size_t NumGroups() const;
136 size_t NumPrecursors() const;
137
138 size_t GetMaxPrecursorsPerMaterial() const;
139
140 void AddGroup(int id);
141 const std::vector<LBSGroup>& Groups() const;
142
143 void AddGroupset();
144 std::vector<LBSGroupset>& Groupsets();
145 const std::vector<LBSGroupset>& Groupsets() const;
146
147 void AddPointSource(PointSource psrc);
148 void ClearPointSources();
149 const std::vector<PointSource>& PointSources() const;
150
151 const std::map<int, XSPtr>& GetMatID2XSMap() const;
152 const std::map<int, IsotropicSrcPtr>& GetMatID2IsoSrcMap() const;
153
155 const std::vector<UnitCellMatrices>& GetUnitCellMatrices() const;
156 const chi_mesh::MeshContinuum& Grid() const;
157
158 const std::vector<lbs::CellLBSView>& GetCellTransportViews() const;
159
160 std::map<uint64_t, BoundaryPreference>& BoundaryPreferences();
161
163
164 size_t LocalNodeCount() const;
165 size_t GlobalNodeCount() const;
166
167 std::vector<double>& QMomentsLocal();
168 const std::vector<double>& QMomentsLocal() const;
169 std::vector<double>& ExtSrcMomentsLocal();
170 const std::vector<double>& ExtSrcMomentsLocal() const;
171 std::vector<double>& PhiOldLocal();
172 const std::vector<double>& PhiOldLocal() const;
173 std::vector<double>& PhiNewLocal();
174 const std::vector<double>& PhiNewLocal() const;
175 std::vector<double>& PrecursorsNewLocal();
176 const std::vector<double>& PrecursorsNewLocal() const;
177 std::vector<VecDbl>& PsiNewLocal();
178 const std::vector<VecDbl>& PsiNewLocal() const;
179
180 /**Returns the sweep boundaries as a read only reference*/
181 const std::map<uint64_t, std::shared_ptr<SweepBndry>>&
182 SweepBoundaries() const;
183
185
187
188 std::vector<LinSolvePtr>& GetWGSSolvers();
189
191
192 virtual std::pair<size_t, size_t> GetNumPhiIterativeUnknowns();
193
194 /**Gets the local handle of a flux-moment based field function.*/
195 size_t MapPhiFieldFunction(size_t g, size_t m) const;
196
197 /**Returns the local handle to the power generation field function, if
198 * enabled.*/
199 size_t GetHandleToPowerGenFieldFunc() const;
200
201 // 01
202 void Initialize() override;
203
204protected:
205 // 01a
206 virtual void PerformInputChecks();
207 // 01b
208 void PrintSimHeader();
209
210public:
211 // 01c
212 void InitMaterials();
213
214protected:
215 // 01d
216 virtual void InitializeSpatialDiscretization();
218 // 01e
219 void InitializeGroupsets();
220 // 01f
222 // 01g
223 virtual void InitializeParrays();
224 // a
226 // 01h
228
229public:
230 // 01i
232
233protected:
234 // 01j
235 virtual void InitializeSolverSchemes();
236 virtual void InitializeWGSSolvers(){};
237
238 // 03d
239public:
240 void InitWGDSA(LBSGroupset& groupset, bool vaccum_bcs_are_dirichlet = true);
241 std::vector<double> WGSCopyOnlyPhi0(const LBSGroupset& groupset,
242 const std::vector<double>& phi_in);
243 void GSProjectBackPhi0(const LBSGroupset& groupset,
244 const std::vector<double>& input,
245 std::vector<double>& output);
246 // std::vector<double> WGDSAMake
247public:
248 void AssembleWGDSADeltaPhiVector(const LBSGroupset& groupset,
249 const std::vector<double>& phi_in,
250 std::vector<double>& delta_phi_local);
251
252 void
254 const std::vector<double>& delta_phi_local,
255 std::vector<double>& ref_phi_new);
256
257protected:
258 static void CleanUpWGDSA(LBSGroupset& groupset);
259
260 // 03e
261 void InitTGDSA(LBSGroupset& groupset);
262
263public:
264 void AssembleTGDSADeltaPhiVector(const LBSGroupset& groupset,
265 const std::vector<double>& phi_in,
266 std::vector<double>& delta_phi_local);
267 void
269 const std::vector<double>& delta_phi_local,
270 std::vector<double>& ref_phi_new);
271
272protected:
273 static void CleanUpTGDSA(LBSGroupset& groupset);
274 // 04 File IO
275public:
276 // 04a
277 void WriteRestartData(const std::string& folder_name,
278 const std::string& file_base);
279 void ReadRestartData(const std::string& folder_name,
280 const std::string& file_base);
281 // 04b
282 void WriteGroupsetAngularFluxes(const LBSGroupset& groupset,
283 const std::string& file_base);
285 const std::string& file_base);
286
287 // 04c
288 std::vector<double> MakeSourceMomentsFromPhi();
289 void WriteFluxMoments(const std::string& file_base,
290 const std::vector<double>& flux_moments);
291 void ReadFluxMoments(const std::string& file_base,
292 std::vector<double>& flux_moments,
293 bool single_file = false);
294
295 // 05a
298 const std::vector<size_t>& m_indices,
299 const std::vector<size_t>& g_indices);
300
301 // 06b
302public:
303 double ComputeFissionProduction(const std::vector<double>& phi);
304 double ComputeFissionRate(const std::vector<double>& phi);
305
306 // 06c
307public:
308 void ComputePrecursors();
309
310 // 07 Vector assembly
311public:
312 virtual void SetPhiVectorScalarValues(std::vector<double>& phi_vector,
313 double value);
314 virtual void ScalePhiVector(PhiSTLOption which_phi, double value);
315 virtual void SetGSPETScVecFromPrimarySTLvector(LBSGroupset& groupset,
316 Vec x,
317 PhiSTLOption which_phi);
318
319 virtual void SetPrimarySTLvectorFromGSPETScVec(LBSGroupset& groupset,
320 Vec x_src,
321 PhiSTLOption which_phi);
322
323 virtual void GSScopedCopyPrimarySTLvectors(LBSGroupset& groupset,
324 const std::vector<double>& x_src,
325 std::vector<double>& y);
326
327 virtual void GSScopedCopyPrimarySTLvectors(LBSGroupset& groupset,
328 PhiSTLOption from_which_phi,
329 PhiSTLOption to_which_phi);
330
332 int first_group_id, int last_group_id, Vec x, const std::vector<double>& y);
333
335 int first_group_id, int last_group_id, Vec x_src, std::vector<double>& y);
336
338 const std::vector<int>& gs_ids, Vec x, PhiSTLOption which_phi);
339
341 const std::vector<int>& gs_ids, Vec x_src, PhiSTLOption which_phi);
342};
343
344} // namespace lbs
345
346#endif // CHITECH_LBS_SOLVER_H
std::vector< double > precursor_new_local_
Definition: lbs_solver.h:97
AGSLinSolverPtr GetPrimaryAGSSolver()
std::vector< double > & PhiNewLocal()
void SetBoundaryOptions(const chi::InputParameters &params)
static chi::InputParameters GetInputParameters()
std::map< uint64_t, BoundaryPreference > & BoundaryPreferences()
virtual void PerformInputChecks()
void DisAssembleWGDSADeltaPhiVector(const LBSGroupset &groupset, const std::vector< double > &delta_phi_local, std::vector< double > &ref_phi_new)
static void CleanUpTGDSA(LBSGroupset &groupset)
std::vector< std::vector< double > > psi_new_local_
Definition: lbs_solver.h:96
std::vector< PointSource > point_sources_
Definition: lbs_solver.h:69
chi_mesh::MeshContinuumPtr grid_ptr_
Definition: lbs_solver.h:75
std::shared_ptr< chi_math::SpatialDiscretization > discretization_
Definition: lbs_solver.h:74
void SetPhiFromFieldFunctions(PhiSTLOption which_phi, const std::vector< size_t > &m_indices, const std::vector< size_t > &g_indices)
std::vector< lbs::CellLBSView > cell_transport_views_
Definition: lbs_solver.h:83
std::vector< AGSLinSolverPtr > ags_solvers_
Definition: lbs_solver.h:101
std::vector< UnitCellMatrices > unit_cell_matrices_
Definition: lbs_solver.h:81
void AssembleTGDSADeltaPhiVector(const LBSGroupset &groupset, const std::vector< double > &phi_in, std::vector< double > &delta_phi_local)
virtual std::pair< size_t, size_t > GetNumPhiIterativeUnknowns()
size_t MapPhiFieldFunction(size_t g, size_t m) const
std::vector< double > & QMomentsLocal()
std::vector< LBSGroupset > & Groupsets()
std::vector< double > MakeSourceMomentsFromPhi()
std::vector< double > & PrecursorsNewLocal()
double ComputeFissionProduction(const std::vector< double > &phi)
size_t GetHandleToPowerGenFieldFunc() const
const chi_math::SpatialDiscretization & SpatialDiscretization() const
std::shared_ptr< const chi_math::TimeIntegration > time_integration_
Definition: lbs_solver.h:109
GridFaceHistogramPtr grid_face_histogram_
Definition: lbs_solver.h:79
std::vector< double > phi_new_local_
Definition: lbs_solver.h:95
std::vector< LinSolvePtr > & GetWGSSolvers()
size_t NumGroups() const
std::vector< LBSGroup > groups_
Definition: lbs_solver.h:67
const std::vector< PointSource > & PointSources() const
std::map< uint64_t, std::shared_ptr< SweepBndry > > sweep_boundaries_
Definition: lbs_solver.h:86
void ReadGroupsetAngularFluxes(LBSGroupset &groupset, const std::string &file_base)
SetSourceFunction GetActiveSetSourceFunction() const
void DisAssembleTGDSADeltaPhiVector(const LBSGroupset &groupset, const std::vector< double > &delta_phi_local, std::vector< double > &ref_phi_new)
double last_restart_write_
Definition: lbs_solver.h:59
std::vector< double > WGSCopyOnlyPhi0(const LBSGroupset &groupset, const std::vector< double > &phi_in)
size_t LocalNodeCount() const
virtual void SetGSPETScVecFromPrimarySTLvector(LBSGroupset &groupset, Vec x, PhiSTLOption which_phi)
LBSSolver(const LBSSolver &)=delete
size_t num_precursors_
Definition: lbs_solver.h:64
chi_math::UnknownManager flux_moments_uk_man_
Definition: lbs_solver.h:88
const std::vector< lbs::CellLBSView > & GetCellTransportViews() const
void WriteGroupsetAngularFluxes(const LBSGroupset &groupset, const std::string &file_base)
std::map< uint64_t, BoundaryPreference > boundary_preferences_
Definition: lbs_solver.h:85
const std::vector< LBSGroup > & Groups() const
size_t power_gen_fieldfunc_local_handle_
Definition: lbs_solver.h:106
std::vector< VecDbl > & PsiNewLocal()
std::vector< double > & ExtSrcMomentsLocal()
virtual void SetMultiGSPETScVecFromPrimarySTLvector(const std::vector< int > &gs_ids, Vec x, PhiSTLOption which_phi)
size_t max_cell_dof_count_
Definition: lbs_solver.h:90
std::vector< double > q_moments_local_
Definition: lbs_solver.h:94
void InitWGDSA(LBSGroupset &groupset, bool vaccum_bcs_are_dirichlet=true)
const std::map< uint64_t, std::shared_ptr< SweepBndry > > & SweepBoundaries() const
size_t num_groups_
Definition: lbs_solver.h:63
uint64_t glob_node_count_
Definition: lbs_solver.h:92
virtual void SetPrimarySTLvectorFromMultiGSPETScVecFrom(const std::vector< int > &gs_ids, Vec x_src, PhiSTLOption which_phi)
chi_mesh::sweep_management::CellFaceNodalMapping CellFaceNodalMapping
Definition: lbs_solver.h:56
const chi_math::UnknownManager & UnknownManager() const
lbs::Options options_
Definition: lbs_solver.h:61
std::shared_ptr< chi_math::LinearSolver< Mat, Vec, KSP > > LinSolvePtr
Definition: lbs_solver.h:53
size_t GetMaxPrecursorsPerMaterial() const
double LastRestartWrite() const
void InitTGDSA(LBSGroupset &groupset)
std::vector< double > ext_src_moments_local_
Definition: lbs_solver.h:94
virtual void SetPhiVectorScalarValues(std::vector< double > &phi_vector, double value)
void WriteRestartData(const std::string &folder_name, const std::string &file_base)
std::vector< double > phi_old_local_
Definition: lbs_solver.h:95
virtual void SetPrimarySTLvectorFromGroupScopedPETScVec(int first_group_id, int last_group_id, Vec x_src, std::vector< double > &y)
std::map< std::pair< size_t, size_t >, size_t > phi_field_functions_local_map_
Definition: lbs_solver.h:105
const chi_mesh::MeshContinuum & Grid() const
std::map< int, IsotropicSrcPtr > matid_to_src_map_
Definition: lbs_solver.h:72
void AssembleWGDSADeltaPhiVector(const LBSGroupset &groupset, const std::vector< double > &phi_in, std::vector< double > &delta_phi_local)
size_t source_event_tag_
Definition: lbs_solver.h:58
virtual void InitializeSpatialDiscretization()
void Initialize() override
virtual void ScalePhiVector(PhiSTLOption which_phi, double value)
size_t NumMoments() const
std::vector< CellFaceNodalMapping > grid_nodal_mappings_
Definition: lbs_solver.h:77
const std::map< int, XSPtr > & GetMatID2XSMap() const
virtual ~LBSSolver()=default
const std::map< int, IsotropicSrcPtr > & GetMatID2IsoSrcMap() const
void ReadFluxMoments(const std::string &file_base, std::vector< double > &flux_moments, bool single_file=false)
WGSContext< Mat, Vec, KSP > & GetWGSContext(int groupset_id)
virtual void InitializeWGSSolvers()
Definition: lbs_solver.h:236
static void CleanUpWGDSA(LBSGroupset &groupset)
void AddGroup(int id)
std::vector< LBSGroupset > groupsets_
Definition: lbs_solver.h:68
size_t GlobalNodeCount() const
virtual void SetGroupScopedPETScVecFromPrimarySTLvector(int first_group_id, int last_group_id, Vec x, const std::vector< double > &y)
virtual void InitializeSolverSchemes()
void GSProjectBackPhi0(const LBSGroupset &groupset, const std::vector< double > &input, std::vector< double > &output)
std::map< uint64_t, UnitCellMatrices > unit_ghost_cell_matrices_
Definition: lbs_solver.h:82
const std::vector< UnitCellMatrices > & GetUnitCellMatrices() const
MPILocalCommSetPtr grid_local_comm_set_
Definition: lbs_solver.h:78
std::vector< LinSolvePtr > wgs_solvers_
Definition: lbs_solver.h:102
std::shared_ptr< AGSLinearSolver< Mat, Vec, KSP > > AGSLinSolverPtr
Definition: lbs_solver.h:52
AGSLinSolverPtr primary_ags_solver_
Definition: lbs_solver.h:103
static chi::InputParameters BoundaryOptionsBlock()
lbs::Options & Options()
void WriteFluxMoments(const std::string &file_base, const std::vector< double > &flux_moments)
virtual void InitializeParrays()
uint64_t local_node_count_
Definition: lbs_solver.h:91
size_t NumPrecursors() const
virtual void SetPrimarySTLvectorFromGSPETScVec(LBSGroupset &groupset, Vec x_src, PhiSTLOption which_phi)
double ComputeFissionRate(const std::vector< double > &phi)
std::vector< double > & PhiOldLocal()
std::map< int, XSPtr > matid_to_xs_map_
Definition: lbs_solver.h:71
void ReadRestartData(const std::string &folder_name, const std::string &file_base)
size_t max_precursors_per_material_
Definition: lbs_solver.h:65
LBSSolver & operator=(const LBSSolver &)=delete
SetSourceFunction active_set_source_function_
Definition: lbs_solver.h:99
void AddPointSource(PointSource psrc)
static chi::InputParameters OptionsBlock()
void SetOptions(const chi::InputParameters &params)
virtual void GSScopedCopyPrimarySTLvectors(LBSGroupset &groupset, const std::vector< double > &x_src, std::vector< double > &y)
size_t num_moments_
Definition: lbs_solver.h:62
LBSSolver(const std::string &text_name)
size_t GetSourceEventTag() const
std::shared_ptr< chi_mesh::GridFaceHistogram > GridFaceHistogramPtr
Definition: lbs_solver.h:37
std::shared_ptr< chi::ChiMPICommunicatorSet > MPILocalCommSetPtr
Definition: lbs_solver.h:31
std::vector< FaceNodalMapping > CellFaceNodalMapping
std::shared_ptr< MeshContinuum > MeshContinuumPtr
Definition: chi_mesh.h:44
PhiSTLOption
Definition: lbs_structs.h:105
std::function< void(LBSGroupset &groupset, std::vector< double > &destination_q, const std::vector< double > &phi, SourceFlags source_flags)> SetSourceFunction
Definition: lbs_structs.h:110
struct _p_Vec * Vec