Chi-Tech
angleaggregation.cc
Go to the documentation of this file.
1#include "angleaggregation.h"
2
4
5#include "chi_runtime.h"
6#include "chi_log.h"
7#include "chi_mpi.h"
8
9#define ExceptionReflectedAngleError \
10 std::logic_error( \
11 fname + "Reflected angle not found for angle " + std::to_string(n) + \
12 " with direction " + quadrature->omegas_[n].PrintStr() + \
13 ". This can happen for two reasons: i) A quadrature is used" \
14 " that is not symmetric about the axis associated with the " \
15 "reflected boundary, or ii) the reflecting boundary is not " \
16 "aligned with any reflecting axis of the quadrature.")
17
18// ###################################################################
19/** Sets up the angle-aggregation object. */
21 const std::map<uint64_t, SweepBndryPtr>& in_sim_boundaries,
22 size_t in_number_of_groups,
23 size_t in_number_of_group_subsets,
24 std::shared_ptr<chi_math::AngularQuadrature>& in_quadrature,
26{
27 sim_boundaries = in_sim_boundaries;
28 number_of_groups = in_number_of_groups;
29 number_of_group_subsets = in_number_of_group_subsets;
30 quadrature = in_quadrature;
31 grid = in_grid;
32
33 for (auto& bndry_id_cond : sim_boundaries)
34 bndry_id_cond.second->Setup(*grid, *quadrature);
35
36 is_setup = true;
37}
38
39// ###################################################################
40/** Resets all the outgoing intra-location and inter-location
41 * cyclic interfaces.*/
43{
44 for (auto& angsetgrp : angle_set_groups)
45 for (auto& angset : angsetgrp.AngleSets())
46 for (auto& delayed_data : angset->GetFLUDS().DelayedPrelocIOutgoingPsi())
47 chi_math::Set(delayed_data, 0.0);
48
49 for (auto& angsetgrp : angle_set_groups)
50 for (auto& angset : angsetgrp.AngleSets())
51 chi_math::Set(angset->GetFLUDS().DelayedLocalPsi(), 0.0);
52}
53
54// ###################################################################
55/** Resets all the incoming intra-location and inter-location
56 * cyclic interfaces.*/
58{
59 //======================================== Opposing reflecting bndries
60 for (const auto& [bid, bndry] : sim_boundaries)
61 {
62 if (bndry->IsReflecting())
63 {
64 auto& rbndry = (BoundaryReflecting&)(*bndry);
65
66 if (rbndry.IsOpposingReflected())
67 for (auto& angle : rbndry.GetHeteroBoundaryFluxOld())
68 for (auto& cellvec : angle)
69 for (auto& facevec : cellvec)
70 for (auto& dofvec : facevec)
71 for (auto& val : dofvec)
72 val = 0.0;
73
74 } // if reflecting
75 } // for bndry
76
77 //======================================== Intra-cell cycles
78 for (auto& as_group : angle_set_groups)
79 for (auto& angle_set : as_group.AngleSets())
80 chi_math::Set(angle_set->GetFLUDS().DelayedLocalPsiOld(), 0.0);
81
82 //======================================== Inter location cycles
83 for (auto& as_group : angle_set_groups)
84 for (auto& angle_set : as_group.AngleSets())
85 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld())
86 chi_math::Set(loc_vector, 0.0);
87}
88
89// ###################################################################
90/** Initializes reflecting boundary conditions. */
92{
93 const std::string fname = "chi_mesh::sweep_management::AngleAggregation";
94 const double epsilon = 1.0e-8;
95
96 bool reflecting_bcs_initialized = false;
97
98 const chi_mesh::Vector3 ihat(1.0, 0.0, 0.0);
99 const chi_mesh::Vector3 jhat(0.0, 1.0, 0.0);
100
101 for (auto& [bid, bndry] : sim_boundaries)
102 {
103 if (bndry->IsReflecting())
104 {
105 size_t tot_num_angles = quadrature->abscissae_.size();
106 size_t num_local_cells = grid->local_cells.size();
107 auto& rbndry = (BoundaryReflecting&)(*bndry);
108
109 const auto& normal = rbndry.Normal();
110
111 rbndry.GetReflectedAngleIndexMap().resize(tot_num_angles, -1);
112 rbndry.GetAngleReadyFlags().resize(
113 tot_num_angles, std::vector<bool>(number_of_group_subsets, false));
114
115 //========================================= Determine reflected angle
116 // and check that it is within
117 // the quadrature
118 typedef chi_mesh::Vector3 Vec3;
119 for (int n = 0; n < tot_num_angles; ++n)
120 {
121 const Vec3& omega_n = quadrature->omegas_[n];
122 Vec3 omega_reflected;
123
124 switch (rbndry.CoordType())
125 {
127 omega_reflected = -1.0 * omega_n;
128 break;
130 {
131 // left, top and bottom is regular reflecting
132 if (std::fabs(normal.Dot(jhat)) > 0.999999 or
133 normal.Dot(ihat) < -0.999999)
134 omega_reflected = omega_n - 2.0 * normal * omega_n.Dot(normal);
135 // right derive their normal from omega_n
136 else if (normal.Dot(ihat) > 0.999999)
137 {
138 Vec3 normal_star;
139 if (omega_n.Dot(normal) > 0.0)
140 normal_star = Vec3(omega_n.x, 0.0, omega_n.z).Normalized();
141 else
142 normal_star = Vec3(-omega_n.x, 0.0, -omega_n.y).Normalized();
143
144 omega_reflected =
145 omega_n - 2.0 * normal_star * omega_n.Dot(normal_star);
146 }
147 }
148 break;
150 default:
151 omega_reflected = omega_n - 2.0 * normal * omega_n.Dot(normal);
152 break;
153 }
154
155 auto& index_map = rbndry.GetReflectedAngleIndexMap();
156 for (int nstar = 0; nstar < tot_num_angles; ++nstar)
157 if (omega_reflected.Dot(quadrature->omegas_[nstar]) > (1.0 - epsilon))
158 {
159 index_map[n] = nstar;
160 break;
161 }
162
163 if (index_map[n] < 0) throw ExceptionReflectedAngleError;
164 }
165
166 //========================================= Initialize storage for all
167 // outbound directions
168 auto& heteroflux_new = rbndry.GetHeteroBoundaryFluxNew();
169 auto& heteroflux_old = rbndry.GetHeteroBoundaryFluxOld();
170 heteroflux_new.clear();
171 heteroflux_old.clear();
172 heteroflux_new.resize(tot_num_angles);
173 for (int n = 0; n < tot_num_angles; ++n)
174 {
175 // Only continue if omega is outgoing
176 if (quadrature->omegas_[n].Dot(rbndry.Normal()) < 0.0) continue;
177
178 //================================== For cells
179 auto& cell_vec = heteroflux_new[n];
180 cell_vec.resize(num_local_cells);
181 for (const auto& cell : grid->local_cells)
182 {
183 const uint64_t c = cell.local_id_;
184
185 //=========================== Check cell on ref bndry
186 bool on_ref_bndry = false;
187 for (const auto& face : cell.faces_)
188 {
189 if ((not face.has_neighbor_) and
190 (face.normal_.Dot(rbndry.Normal()) > 0.999999))
191 {
192 on_ref_bndry = true;
193 break;
194 }
195 }
196 if (not on_ref_bndry) continue;
197
198 //=========================== If cell on ref bndry
199 cell_vec[c].resize(cell.faces_.size());
200 int f = 0;
201 for (const auto& face : cell.faces_)
202 {
203 if ((not face.has_neighbor_) and
204 (face.normal_.Dot(rbndry.Normal()) > 0.999999))
205 {
206 cell_vec[c][f].clear();
207 cell_vec[c][f].resize(face.vertex_ids_.size(),
208 std::vector<double>(number_of_groups, 0.0));
209 }
210 ++f;
211 }
212 } // for cells
213 } // for angles
214
215 //========================================= Determine if boundary is
216 // opposing reflecting
217 // The boundary with the smallest bid will
218 // be marked as "opposing-reflecting" while
219 // the other one will be just a regular
220 // reflecting boundary
221 for (const auto& [otherbid, otherbndry] : sim_boundaries)
222 {
223 if (bid == otherbid) continue;
224 if (not otherbndry->IsReflecting()) continue;
225
226 const auto& otherRbndry =
227 dynamic_cast<const BoundaryReflecting&>(*otherbndry);
228
229 if (rbndry.Normal().Dot(otherRbndry.Normal()) < (0.0 - epsilon))
230 if (bid < otherbid) rbndry.SetOpposingReflected(true);
231 }
232
233 if (rbndry.IsOpposingReflected())
234 rbndry.GetHeteroBoundaryFluxOld() = rbndry.GetHeteroBoundaryFluxNew();
235
236 reflecting_bcs_initialized = true;
237 } // if reflecting
238 } // for bndry
239
240 if (reflecting_bcs_initialized)
241 Chi::log.Log0Verbose1() << "Reflecting boundary conditions initialized.";
242}
243
244// ###################################################################
245/** Returns a pair of numbers containing the number of
246 * delayed angular unknowns both locally and globally, respectively. */
247std::pair<size_t, size_t>
249{
250 //======================================== Check if this is already developed
251 if (num_ang_unknowns_avail) return number_angular_unknowns;
252
253 //======================================== If not developed
254 size_t local_ang_unknowns = 0;
255
256 //======================================== Opposing reflecting bndries
257 for (auto& [bid, bndry] : sim_boundaries)
258 {
259 if (bndry->IsReflecting())
260 {
261 auto& rbndry = (BoundaryReflecting&)(*bndry);
262
263 if (rbndry.IsOpposingReflected())
264 for (auto& angle : rbndry.GetHeteroBoundaryFluxNew())
265 for (auto& cellvec : angle)
266 for (auto& facevec : cellvec)
267 for (auto& dofvec : facevec)
268 local_ang_unknowns += dofvec.size();
269
270 } // if reflecting
271 } // for bndry
272
273 //======================================== Intra-cell cycles
274 for (auto& as_group : angle_set_groups)
275 for (auto& angle_set : as_group.AngleSets())
276 local_ang_unknowns += angle_set->GetFLUDS().DelayedLocalPsi().size();
277
278 //======================================== Inter location cycles
279 for (auto& as_group : angle_set_groups)
280 for (auto& angle_set : as_group.AngleSets())
281 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi())
282 local_ang_unknowns += loc_vector.size();
283
284 size_t global_ang_unknowns = 0;
285 MPI_Allreduce(&local_ang_unknowns,
286 &global_ang_unknowns,
287 1,
288 MPI_UNSIGNED_LONG_LONG,
289 MPI_SUM,
290 Chi::mpi.comm);
291
292 number_angular_unknowns = {local_ang_unknowns, global_ang_unknowns};
293
294 num_ang_unknowns_avail = true;
295 return number_angular_unknowns;
296}
297
298// ###################################################################
299/** Assembles angular unknowns into the reference vector. */
301 AppendNewDelayedAngularDOFsToArray(int64_t& index, double* x_ref)
302{
303 //======================================== Opposing reflecting bndries
304 for (auto& [bid, bndry] : sim_boundaries)
305 {
306 if (bndry->IsReflecting())
307 {
308 auto& rbndry = (BoundaryReflecting&)(*bndry);
309
310 if (rbndry.IsOpposingReflected())
311 for (auto& angle : rbndry.GetHeteroBoundaryFluxNew())
312 for (auto& cellvec : angle)
313 for (auto& facevec : cellvec)
314 for (auto& dofvec : facevec)
315 for (auto val : dofvec)
316 {
317 index++;
318 x_ref[index] = val;
319 }
320
321 } // if reflecting
322 } // for bndry
323
324 //======================================== Intra-cell cycles
325 for (auto& as_group : angle_set_groups)
326 for (auto& angle_set : as_group.AngleSets())
327 for (auto val : angle_set->GetFLUDS().DelayedLocalPsi())
328 {
329 index++;
330 x_ref[index] = val;
331 }
332
333 //======================================== Inter location cycles
334 for (auto& as_group : angle_set_groups)
335 for (auto& angle_set : as_group.AngleSets())
336 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi())
337 for (auto val : loc_vector)
338 {
339 index++;
340 x_ref[index] = val;
341 }
342}
343
344// ###################################################################
345/** Assembles angular unknowns into the reference vector. */
347 AppendOldDelayedAngularDOFsToArray(int64_t& index, double* x_ref)
348{
349 //======================================== Opposing reflecting bndries
350 for (auto& [bid, bndry] : sim_boundaries)
351 {
352 if (bndry->IsReflecting())
353 {
354 auto& rbndry = (BoundaryReflecting&)(*bndry);
355
356 if (rbndry.IsOpposingReflected())
357 for (auto& angle : rbndry.GetHeteroBoundaryFluxOld())
358 for (auto& cellvec : angle)
359 for (auto& facevec : cellvec)
360 for (auto& dofvec : facevec)
361 for (auto val : dofvec)
362 {
363 index++;
364 x_ref[index] = val;
365 }
366
367 } // if reflecting
368 } // for bndry
369
370 //======================================== Intra-cell cycles
371 for (auto& as_group : angle_set_groups)
372 for (auto& angle_set : as_group.AngleSets())
373 for (auto val : angle_set->GetFLUDS().DelayedLocalPsiOld())
374 {
375 index++;
376 x_ref[index] = val;
377 }
378
379 //======================================== Inter location cycles
380 for (auto& as_group : angle_set_groups)
381 for (auto& angle_set : as_group.AngleSets())
382 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld())
383 for (auto val : loc_vector)
384 {
385 index++;
386 x_ref[index] = val;
387 }
388}
389
390// ###################################################################
391/** Assembles angular unknowns into the reference vector. */
393 SetOldDelayedAngularDOFsFromArray(int64_t& index, const double* x_ref)
394{
395 //======================================== Opposing reflecting bndries
396 for (auto& [bid, bndry] : sim_boundaries)
397 {
398 if (bndry->IsReflecting())
399 {
400 auto& rbndry = (BoundaryReflecting&)(*bndry);
401
402 if (rbndry.IsOpposingReflected())
403 for (auto& angle : rbndry.GetHeteroBoundaryFluxOld())
404 for (auto& cellvec : angle)
405 for (auto& facevec : cellvec)
406 for (auto& dofvec : facevec)
407 for (auto& val : dofvec)
408 {
409 index++;
410 val = x_ref[index];
411 }
412
413 } // if reflecting
414 } // for bndry
415
416 //======================================== Intra-cell cycles
417 for (auto& as_group : angle_set_groups)
418 for (auto& angle_set : as_group.AngleSets())
419 for (auto& val : angle_set->GetFLUDS().DelayedLocalPsiOld())
420 {
421 index++;
422 val = x_ref[index];
423 }
424
425 //======================================== Inter location cycles
426 for (auto& as_group : angle_set_groups)
427 for (auto& angle_set : as_group.AngleSets())
428 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld())
429 for (auto& val : loc_vector)
430 {
431 index++;
432 val = x_ref[index];
433 }
434}
435
436// ###################################################################
437/** Assembles angular unknowns into the reference vector. */
439 SetNewDelayedAngularDOFsFromArray(int64_t& index, const double* x_ref)
440{
441 //======================================== Opposing reflecting bndries
442 for (auto& [bid, bndry] : sim_boundaries)
443 {
444 if (bndry->IsReflecting())
445 {
446 auto& rbndry = (BoundaryReflecting&)(*bndry);
447
448 if (rbndry.IsOpposingReflected())
449 for (auto& angle : rbndry.GetHeteroBoundaryFluxNew())
450 for (auto& cellvec : angle)
451 for (auto& facevec : cellvec)
452 for (auto& dofvec : facevec)
453 for (auto& val : dofvec)
454 {
455 index++;
456 val = x_ref[index];
457 }
458
459 } // if reflecting
460 } // for bndry
461
462 //======================================== Intra-cell cycles
463 for (auto& as_group : angle_set_groups)
464 for (auto& angle_set : as_group.AngleSets())
465 for (auto& val : angle_set->GetFLUDS().DelayedLocalPsi())
466 {
467 index++;
468 val = x_ref[index];
469 }
470
471 //======================================== Inter location cycles
472 for (auto& as_group : angle_set_groups)
473 for (auto& angle_set : as_group.AngleSets())
474 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi())
475 for (auto& val : loc_vector)
476 {
477 index++;
478 val = x_ref[index];
479 }
480}
481
482// ###################################################################
483/**Gets the current values of the angular unknowns as an STL vector.*/
486{
487 std::vector<double> psi_vector;
488
489 auto psi_size = GetNumDelayedAngularDOFs();
490 psi_vector.reserve(psi_size.first);
491
492 //======================================== Opposing reflecting bndries
493 for (auto& [bid, bndry] : sim_boundaries)
494 {
495 if (bndry->IsReflecting())
496 {
497 auto& rbndry = (BoundaryReflecting&)(*bndry);
498
499 if (rbndry.IsOpposingReflected())
500 for (auto& angle : rbndry.GetHeteroBoundaryFluxNew())
501 for (auto& cellvec : angle)
502 for (auto& facevec : cellvec)
503 for (auto& dofvec : facevec)
504 for (auto val : dofvec)
505 psi_vector.push_back(val);
506
507 } // if reflecting
508 } // for bndry
509
510 //======================================== Intra-cell cycles
511 for (auto& as_group : angle_set_groups)
512 for (auto& angle_set : as_group.AngleSets())
513 for (auto val : angle_set->GetFLUDS().DelayedLocalPsi())
514 psi_vector.push_back(val);
515
516 //======================================== Inter location cycles
517 for (auto& as_group : angle_set_groups)
518 for (auto& angle_set : as_group.AngleSets())
519 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi())
520 for (auto val : loc_vector)
521 psi_vector.push_back(val);
522
523 return psi_vector;
524}
525
526// ###################################################################
527/**Gets the current values of the angular unknowns as an STL vector.*/
529 SetNewDelayedAngularDOFsFromSTLVector(const std::vector<double>& stl_vector)
530{
531 auto psi_size = GetNumDelayedAngularDOFs();
532 size_t stl_size = stl_vector.size();
533 if (stl_size != psi_size.first)
534 throw std::logic_error(
535 std::string(__FUNCTION__) +
536 ": STL-vector size "
537 "is incompatible with number angular unknowns stored "
538 "in the angle-aggregation object.");
539
540 size_t index = 0;
541 //======================================== Opposing reflecting bndries
542 for (auto& [bid, bndry] : sim_boundaries)
543 {
544 if (bndry->IsReflecting())
545 {
546 auto& rbndry = (BoundaryReflecting&)(*bndry);
547
548 if (rbndry.IsOpposingReflected())
549 for (auto& angle : rbndry.GetHeteroBoundaryFluxNew())
550 for (auto& cellvec : angle)
551 for (auto& facevec : cellvec)
552 for (auto& dofvec : facevec)
553 for (auto& val : dofvec)
554 val = stl_vector[index++];
555
556 } // if reflecting
557 } // for bndry
558
559 //======================================== Intra-cell cycles
560 for (auto& as_group : angle_set_groups)
561 for (auto& angle_set : as_group.AngleSets())
562 for (auto& val : angle_set->GetFLUDS().DelayedLocalPsi())
563 val = stl_vector[index++];
564
565 //======================================== Inter location cycles
566 for (auto& as_group : angle_set_groups)
567 for (auto& angle_set : as_group.AngleSets())
568 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi())
569 for (auto& val : loc_vector)
570 val = stl_vector[index++];
571}
572
573// ###################################################################
574/**Gets the current values of the angular unknowns as an STL vector.*/
577{
578 std::vector<double> psi_vector;
579
580 auto psi_size = GetNumDelayedAngularDOFs();
581 psi_vector.reserve(psi_size.first);
582
583 //======================================== Opposing reflecting bndries
584 for (auto& [bid, bndry] : sim_boundaries)
585 {
586 if (bndry->IsReflecting())
587 {
588 auto& rbndry = (BoundaryReflecting&)(*bndry);
589
590 if (rbndry.IsOpposingReflected())
591 for (auto& angle : rbndry.GetHeteroBoundaryFluxOld())
592 for (auto& cellvec : angle)
593 for (auto& facevec : cellvec)
594 for (auto& dofvec : facevec)
595 for (auto val : dofvec)
596 psi_vector.push_back(val);
597
598 } // if reflecting
599 } // for bndry
600
601 //======================================== Intra-cell cycles
602 for (auto& as_group : angle_set_groups)
603 for (auto& angle_set : as_group.AngleSets())
604 for (auto val : angle_set->GetFLUDS().DelayedLocalPsiOld())
605 psi_vector.push_back(val);
606
607 //======================================== Inter location cycles
608 for (auto& as_group : angle_set_groups)
609 for (auto& angle_set : as_group.AngleSets())
610 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld())
611 for (auto val : loc_vector)
612 psi_vector.push_back(val);
613
614 return psi_vector;
615}
616
617// ###################################################################
618/**Gets the current values of the angular unknowns as an STL vector.*/
620 SetOldDelayedAngularDOFsFromSTLVector(const std::vector<double>& stl_vector)
621{
622 auto psi_size = GetNumDelayedAngularDOFs();
623 size_t stl_size = stl_vector.size();
624 if (stl_size != psi_size.first)
625 throw std::logic_error(
626 std::string(__FUNCTION__) +
627 ": STL-vector size "
628 "is incompatible with number angular unknowns stored "
629 "in the angle-aggregation object.");
630
631 size_t index = 0;
632 //======================================== Opposing reflecting bndries
633 for (auto& [bid, bndry] : sim_boundaries)
634 {
635 if (bndry->IsReflecting())
636 {
637 auto& rbndry = (BoundaryReflecting&)(*bndry);
638
639 if (rbndry.IsOpposingReflected())
640 for (auto& angle : rbndry.GetHeteroBoundaryFluxOld())
641 for (auto& cellvec : angle)
642 for (auto& facevec : cellvec)
643 for (auto& dofvec : facevec)
644 for (auto& val : dofvec)
645 val = stl_vector[index++];
646
647 } // if reflecting
648 } // for bndry
649
650 //======================================== Intra-cell cycles
651 for (auto& as_group : angle_set_groups)
652 for (auto& angle_set : as_group.AngleSets())
653 for (auto& val : angle_set->GetFLUDS().DelayedLocalPsiOld())
654 val = stl_vector[index++];
655
656 //======================================== Inter location cycles
657 for (auto& as_group : angle_set_groups)
658 for (auto& angle_set : as_group.AngleSets())
659 for (auto& loc_vector : angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld())
660 for (auto& val : loc_vector)
661 val = stl_vector[index++];
662}
663
664// ###################################################################
665/**Copies the old delayed angular fluxes to the new.*/
667{
668 //======================================== Opposing reflecting bndries
669 for (auto& [bid, bndry] : sim_boundaries)
670 {
671 if (bndry->IsReflecting())
672 {
673 auto& rbndry = (BoundaryReflecting&)(*bndry);
674
675 if (rbndry.IsOpposingReflected())
676 rbndry.GetHeteroBoundaryFluxNew() = rbndry.GetHeteroBoundaryFluxOld();
677
678 } // if reflecting
679 } // for bndry
680
681 //======================================== Intra-cell cycles
682 for (auto& as_group : angle_set_groups)
683 for (auto& angle_set : as_group.AngleSets())
684 angle_set->GetFLUDS().DelayedLocalPsi() =
685 angle_set->GetFLUDS().DelayedLocalPsiOld();
686
687 //======================================== Inter location cycles
688 for (auto& as_group : angle_set_groups)
689 for (auto& angle_set : as_group.AngleSets())
690 angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi() =
691 angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld();
692}
693
694// ###################################################################
695/**Copies the new delayed angular fluxes to the old.*/
697{
698 //======================================== Opposing reflecting bndries
699 for (auto& [bid, bndry] : sim_boundaries)
700 {
701 if (bndry->IsReflecting())
702 {
703 auto& rbndry = (BoundaryReflecting&)(*bndry);
704
705 if (rbndry.IsOpposingReflected())
706 rbndry.GetHeteroBoundaryFluxOld() = rbndry.GetHeteroBoundaryFluxNew();
707
708 } // if reflecting
709 } // for bndry
710
711 //======================================== Intra-cell cycles
712 for (auto& as_group : angle_set_groups)
713 for (auto& angle_set : as_group.AngleSets())
714 angle_set->GetFLUDS().DelayedLocalPsiOld() =
715 angle_set->GetFLUDS().DelayedLocalPsi();
716
717 //======================================== Inter location cycles
718 for (auto& as_group : angle_set_groups)
719 for (auto& angle_set : as_group.AngleSets())
720 angle_set->GetFLUDS().DelayedPrelocIOutgoingPsiOld() =
721 angle_set->GetFLUDS().DelayedPrelocIOutgoingPsi();
722}
#define ExceptionReflectedAngleError
static chi::ChiLog & log
Definition: chi_runtime.h:81
static chi::MPI_Info & mpi
Definition: chi_runtime.h:78
LogStream Log0Verbose1()
Definition: chi_log.h:234
std::vector< double > GetOldDelayedAngularDOFsAsSTLVector()
void SetOldDelayedAngularDOFsFromArray(int64_t &index, const double *x_ref)
void SetOldDelayedAngularDOFsFromSTLVector(const std::vector< double > &stl_vector)
std::shared_ptr< chi_math::AngularQuadrature > quadrature
void AppendOldDelayedAngularDOFsToArray(int64_t &index, double *x_ref)
std::vector< double > GetNewDelayedAngularDOFsAsSTLVector()
void SetNewDelayedAngularDOFsFromSTLVector(const std::vector< double > &stl_vector)
std::map< uint64_t, SweepBndryPtr > sim_boundaries
void AppendNewDelayedAngularDOFsToArray(int64_t &index, double *x_ref)
void SetNewDelayedAngularDOFsFromArray(int64_t &index, const double *x_ref)
AngleAggregation(const std::map< uint64_t, SweepBndryPtr > &in_sim_boundaries, size_t in_number_of_groups, size_t in_number_of_group_subsets, std::shared_ptr< chi_math::AngularQuadrature > &in_quadrature, chi_mesh::MeshContinuumPtr &in_grid)
std::pair< size_t, size_t > GetNumDelayedAngularDOFs()
void Set(VecDbl &x, const double &val)
std::shared_ptr< MeshContinuum > MeshContinuumPtr
Definition: chi_mesh.h:44