Chi-Tech
lbs_07_vectorassembly.cc
Go to the documentation of this file.
1#include "lbs_solver.h"
3
5
6//###################################################################
7/**Sets a value to the zeroth (scalar) moment of the vector.*/
8void lbs::LBSSolver::SetPhiVectorScalarValues(std::vector<double> &phi_vector,
9 double value)
10{
11 const size_t first_grp = groups_.front().id_;
12 const size_t final_grp = groups_.back().id_;
13
14 const auto& sdm = *discretization_;
15
16 typedef const int64_t cint64_t;
17 for (const auto& cell : grid_ptr_->local_cells)
18 {
19 const auto& cell_mapping = sdm.GetCellMapping(cell);
20 const size_t num_nodes = cell_mapping.NumNodes();
21
22 for (size_t i=0; i<num_nodes; ++i)
23 {
24 cint64_t dof_map = sdm.MapDOFLocal(cell, i, flux_moments_uk_man_,
25 /*m*/0, /*g*/0);
26
27 double* phi = &phi_vector[dof_map];
28
29 for (size_t g=first_grp; g<=final_grp; ++g)
30 phi[g] = value;
31 }//for node i
32 }//for cell
33}
34
35//###################################################################
36/**Scales a flux moment vector. For sweep methods the delayed angular
37 * fluxes will also be scaled.*/
39 double value)
40{
41 std::vector<double>* y_ptr;
42 switch (which_phi)
43 {
44 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
45 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
46 default:
47 throw std::logic_error("SetGSPETScVecFromPrimarySTLvector");
48 }
49
50 chi_math::Scale(*y_ptr, value);
51}
52
53//###################################################################
54/**Assembles a vector for a given groupset from a source vector.*/
57 PhiSTLOption which_phi)
58{
59 const std::vector<double>* y_ptr;
60 switch (which_phi)
61 {
62 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
63 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
64 default:
65 throw std::logic_error("SetGSPETScVecFromPrimarySTLvector");
66 }
67
68 double* x_ref;
69 VecGetArray(x,&x_ref);
70
71 int gsi = groupset.groups_.front().id_;
72 int gsf = groupset.groups_.back().id_;
73 int gss = gsf-gsi+1;
74
75 int64_t index = -1;
76 for (const auto& cell : grid_ptr_->local_cells)
77 {
78 auto& transport_view = cell_transport_views_[cell.local_id_];
79
80 for (int i=0; i < cell.vertex_ids_.size(); i++)
81 {
82 for (int m=0; m < num_moments_; m++)
83 {
84 size_t mapping = transport_view.MapDOF(i,m,gsi);
85 for (int g=0; g<gss; g++)
86 {
87 index++;
88 x_ref[index] = (*y_ptr)[mapping+g]; //Offset on purpose
89 }//for g
90 }//for moment
91 }//for dof
92 }//for cell
93
94 VecRestoreArray(x,&x_ref);
95}
96
97//###################################################################
98/**Assembles a vector for a given groupset from a source vector.*/
101 PhiSTLOption which_phi)
102{
103 std::vector<double>* y_ptr;
104 switch (which_phi)
105 {
106 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
107 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
108 default:
109 throw std::logic_error("SetPrimarySTLvectorFromGSPETScVec");
110 }
111
112 const double* x_ref;
113 VecGetArrayRead(x_src,&x_ref);
114
115 int gsi = groupset.groups_.front().id_;
116 int gsf = groupset.groups_.back().id_;
117 int gss = gsf-gsi+1;
118
119 int64_t index = -1;
120 for (const auto& cell : grid_ptr_->local_cells)
121 {
122 auto& transport_view = cell_transport_views_[cell.local_id_];
123
124 for (int i=0; i < cell.vertex_ids_.size(); i++)
125 {
126 for (int m=0; m < num_moments_; m++)
127 {
128 size_t mapping = transport_view.MapDOF(i,m,gsi);
129 for (int g=0; g<gss; g++)
130 {
131 index++;
132 (*y_ptr)[mapping+g] = x_ref[index];
133 }//for g
134 }//for moment
135 }//for dof
136 }//for cell
137
138 VecRestoreArrayRead(x_src,&x_ref);
139}
140
141//###################################################################
142/**Assembles a vector for a given groupset from a source vector.*/
145 const std::vector<double>& x_src,
146 std::vector<double>& y)
147{
148 int gsi = groupset.groups_.front().id_;
149 size_t gss = groupset.groups_.size();
150
151 for (const auto& cell : grid_ptr_->local_cells)
152 {
153 auto& transport_view = cell_transport_views_[cell.local_id_];
154
155 for (int i=0; i < cell.vertex_ids_.size(); i++)
156 {
157 for (int m=0; m < num_moments_; m++)
158 {
159 size_t mapping = transport_view.MapDOF(i,m,gsi);
160 for (int g=0; g<gss; g++)
161 {
162 y[mapping+g] = x_src[mapping+g];
163 }//for g
164 }//for moment
165 }//for dof
166 }//for cell
167}
168
169//###################################################################
170/**Assembles a vector for a given groupset from a source vector.*/
173 PhiSTLOption from_which_phi,
174 PhiSTLOption to_which_phi)
175{
176 std::vector<double>* y_ptr;
177 switch (to_which_phi)
178 {
179 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
180 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
181 default:
182 throw std::logic_error("GSScopedCopyPrimarySTLvectors");
183 }
184
185 std::vector<double>* x_src_ptr;
186 switch (from_which_phi)
187 {
188 case PhiSTLOption::PHI_NEW: x_src_ptr = &phi_new_local_; break;
189 case PhiSTLOption::PHI_OLD: x_src_ptr = &phi_old_local_; break;
190 default:
191 throw std::logic_error("GSScopedCopyPrimarySTLvectors");
192 }
193
194 int gsi = groupset.groups_.front().id_;
195 size_t gss = groupset.groups_.size();
196
197 for (const auto& cell : grid_ptr_->local_cells)
198 {
199 auto& transport_view = cell_transport_views_[cell.local_id_];
200
201 for (int i=0; i < cell.vertex_ids_.size(); i++)
202 {
203 for (int m=0; m < num_moments_; m++)
204 {
205 size_t mapping = transport_view.MapDOF(i,m,gsi);
206 for (int g=0; g<gss; g++)
207 {
208 (*y_ptr)[mapping+g] = (*x_src_ptr)[mapping+g];
209 }//for g
210 }//for moment
211 }//for dof
212 }//for cell
213}
214
215//###################################################################
216/**Assembles a vector for a given group span from a source vector.*/
219 int last_group_id, Vec x,
220 const std::vector<double>& y)
221{
222 double* x_ref;
223 VecGetArray(x,&x_ref);
224
225 int gsi = first_group_id;
226 int gsf = last_group_id;
227 int gss = gsf-gsi+1;
228
229 int64_t index = -1;
230 for (const auto& cell : grid_ptr_->local_cells)
231 {
232 auto& transport_view = cell_transport_views_[cell.local_id_];
233
234 for (int i=0; i < cell.vertex_ids_.size(); i++)
235 {
236 for (int m=0; m < num_moments_; m++)
237 {
238 size_t mapping = transport_view.MapDOF(i,m,gsi);
239 for (int g=0; g<gss; g++)
240 {
241 index++;
242 x_ref[index] = y[mapping+g]; //Offset on purpose
243 }//for g
244 }//for moment
245 }//for dof
246 }//for cell
247
248 VecRestoreArray(x,&x_ref);
249}
250
251//###################################################################
252/**Assembles a vector for a given groupset from a source vector.*/
255 int first_group_id,
256 int last_group_id, Vec x_src,
257 std::vector<double>& y)
258{
259 const double* x_ref;
260 VecGetArrayRead(x_src,&x_ref);
261
262 int gsi = first_group_id;
263 int gsf = last_group_id;
264 int gss = gsf-gsi+1;
265
266 int64_t index = -1;
267 for (const auto& cell : grid_ptr_->local_cells)
268 {
269 auto& transport_view = cell_transport_views_[cell.local_id_];
270
271 for (int i=0; i < cell.vertex_ids_.size(); i++)
272 {
273 for (int m=0; m < num_moments_; m++)
274 {
275 size_t mapping = transport_view.MapDOF(i,m,gsi);
276 for (int g=0; g<gss; g++)
277 {
278 index++;
279 y[mapping+g] = x_ref[index];
280 }//for g
281 }//for moment
282 }//for dof
283 }//for cell
284
285 VecRestoreArrayRead(x_src,&x_ref);
286}
287
288//###################################################################
289/**Assembles a PETSc vector from multiple groupsets.*/
291 SetMultiGSPETScVecFromPrimarySTLvector(const std::vector<int> &gs_ids,
292 Vec x, PhiSTLOption which_phi)
293{
294 const std::vector<double>* y_ptr;
295 switch (which_phi)
296 {
297 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
298 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
299 default:
300 throw std::logic_error("SetMultiGSPETScVecFromPrimarySTLvector");
301 }
302
303 double* x_ref;
304 VecGetArray(x,&x_ref);
305
306 int64_t index = -1;
307 for (int gs_id : gs_ids)
308 {
309 const auto& groupset = groupsets_.at(gs_id);
310
311 int gsi = groupset.groups_.front().id_;
312 int gsf = groupset.groups_.back().id_;
313 int gss = gsf-gsi+1;
314
315 for (const auto& cell : grid_ptr_->local_cells)
316 {
317 auto& transport_view = cell_transport_views_[cell.local_id_];
318
319 for (int i=0; i < cell.vertex_ids_.size(); i++)
320 {
321 for (int m=0; m < num_moments_; m++)
322 {
323 size_t mapping = transport_view.MapDOF(i,m,gsi);
324 for (int g=0; g<gss; g++)
325 {
326 index++;
327 x_ref[index] = (*y_ptr)[mapping+g]; //Offset on purpose
328 }//for g
329 }//for moment
330 }//for dof
331 }//for cell
332 }//for groupset id
333
334 VecRestoreArray(x,&x_ref);
335}
336
337//###################################################################
338/**Disassembles a multiple Groupset PETSc vector STL vectors.*/
340 SetPrimarySTLvectorFromMultiGSPETScVecFrom(const std::vector<int> &gs_ids,
341 Vec x_src,
342 PhiSTLOption which_phi)
343{
344 std::vector<double>* y_ptr;
345 switch (which_phi)
346 {
347 case PhiSTLOption::PHI_NEW: y_ptr = &phi_new_local_; break;
348 case PhiSTLOption::PHI_OLD: y_ptr = &phi_old_local_; break;
349 default:
350 throw std::logic_error("SetPrimarySTLvectorFromMultiGSPETScVecFrom");
351 }
352
353 const double* x_ref;
354 VecGetArrayRead(x_src,&x_ref);
355
356 int64_t index = -1;
357 for (int gs_id : gs_ids)
358 {
359 const auto& groupset = groupsets_.at(gs_id);
360
361 int gsi = groupset.groups_.front().id_;
362 int gsf = groupset.groups_.back().id_;
363 int gss = gsf-gsi+1;
364
365 for (const auto& cell : grid_ptr_->local_cells)
366 {
367 auto& transport_view = cell_transport_views_[cell.local_id_];
368
369 for (int i=0; i < cell.vertex_ids_.size(); i++)
370 {
371 for (int m=0; m < num_moments_; m++)
372 {
373 size_t mapping = transport_view.MapDOF(i,m,gsi);
374 for (int g=0; g<gss; g++)
375 {
376 index++;
377 (*y_ptr)[mapping+g] = x_ref[index];
378 }//for g
379 }//for moment
380 }//for dof
381 }//for cell
382 }//for groupset id
383
384 VecRestoreArrayRead(x_src,&x_ref);
385}
std::vector< LBSGroup > groups_
Definition: lbs_groupset.h:41
chi_mesh::MeshContinuumPtr grid_ptr_
Definition: lbs_solver.h:75
std::shared_ptr< chi_math::SpatialDiscretization > discretization_
Definition: lbs_solver.h:74
std::vector< LBSGroup > groups_
Definition: lbs_solver.h:67
virtual void SetGSPETScVecFromPrimarySTLvector(LBSGroupset &groupset, Vec x, PhiSTLOption which_phi)
chi_math::UnknownManager flux_moments_uk_man_
Definition: lbs_solver.h:88
virtual void SetMultiGSPETScVecFromPrimarySTLvector(const std::vector< int > &gs_ids, Vec x, PhiSTLOption which_phi)
virtual void SetPrimarySTLvectorFromMultiGSPETScVecFrom(const std::vector< int > &gs_ids, Vec x_src, PhiSTLOption which_phi)
virtual void SetPhiVectorScalarValues(std::vector< double > &phi_vector, double value)
virtual void SetPrimarySTLvectorFromGroupScopedPETScVec(int first_group_id, int last_group_id, Vec x_src, std::vector< double > &y)
virtual void ScalePhiVector(PhiSTLOption which_phi, double value)
virtual void SetGroupScopedPETScVecFromPrimarySTLvector(int first_group_id, int last_group_id, Vec x, const std::vector< double > &y)
virtual void SetPrimarySTLvectorFromGSPETScVec(LBSGroupset &groupset, Vec x_src, PhiSTLOption which_phi)
virtual void GSScopedCopyPrimarySTLvectors(LBSGroupset &groupset, const std::vector< double > &x_src, std::vector< double > &y)
void Scale(VecDbl &x, const double &val)
PhiSTLOption
Definition: lbs_structs.h:105
struct _p_Vec * Vec