Chi-Tech
lbs_curvilinear_sweepchunk_pwl.cc
Go to the documentation of this file.
2
5
7
8namespace lbs
9{
10
11// ##################################################################
12/**Constructor.*/
14 const chi_mesh::MeshContinuum& grid,
15 const chi_math::SpatialDiscretization& discretization_primary,
16 const std::vector<lbs::UnitCellMatrices>& unit_cell_matrices,
17 const std::vector<lbs::UnitCellMatrices>& secondary_unit_cell_matrices,
18 std::vector<lbs::CellLBSView>& cell_transport_views,
19 std::vector<double>& destination_phi,
20 std::vector<double>& destination_psi,
21 const std::vector<double>& source_moments,
22 lbs::LBSGroupset& groupset,
23 const std::map<int, lbs::XSPtr>& xs,
24 int num_moments,
25 int max_num_cell_dofs)
26 : AAH_SweepChunk(grid,
27 discretization_primary,
28 unit_cell_matrices,
29 cell_transport_views,
30 destination_phi,
31 destination_psi,
32 source_moments,
33 groupset,
34 xs,
35 num_moments,
36 max_num_cell_dofs),
37 secondary_unit_cell_matrices_(secondary_unit_cell_matrices),
38 unknown_manager_(),
39 psi_sweep_(),
40 normal_vector_boundary_()
41{
42 const auto curvilinear_product_quadrature =
43 std::dynamic_pointer_cast<chi_math::CurvilinearAngularQuadrature>(
45
46 if (!curvilinear_product_quadrature)
47 throw std::invalid_argument(
48 "D_DO_RZ_SteadyState::SweepChunkPWL::SweepChunkPWL : "
49 "invalid angular quadrature");
50
51 // configure unknown manager for quantities that depend on polar level
52 const size_t dir_map_size =
53 curvilinear_product_quadrature->GetDirectionMap().size();
54 for (size_t m = 0; m < dir_map_size; ++m)
56 groupset_.groups_.size());
57
58 // allocate storage for sweeping dependency
59 const unsigned int n_dof =
60 discretization_primary.GetNumLocalDOFs(unknown_manager_);
61 psi_sweep_.resize(n_dof);
62
63 // initialise mappings from direction linear index
64 for (const auto& dir_set : curvilinear_product_quadrature->GetDirectionMap())
65 for (const auto& dir_idx : dir_set.second)
66 map_polar_level_.emplace(dir_idx, dir_set.first);
67
68 // set normal vector for symmetric boundary condition
69 const int d = (grid_.Attributes() & chi_mesh::DIMENSION_1) ? 2 : 0;
72
73 RegisterKernel("FEMRZVolumetricGradTerm",
75 RegisterKernel("FEMRZUpwindSurfaceIntegrals",
77
78 // ================================== Setup callbacks
79 cell_data_callbacks_.push_back(
80 std::bind(&SweepChunkPWLRZ::CellDataCallback, this));
81
84 Kernel("FEMRZVolumetricGradTerm")};
85
86 surface_integral_kernels_ = {Kernel("FEMUpwindSurfaceIntegrals")};
87
88 mass_term_kernels_ = {Kernel("FEMSSTDMassTerms")};
89
90 // flux_update_kernels_ unchanged
91
94}
95
96// ##################################################################
97/**Cell data callback.*/
99{
100 const auto& fe_intgrl_values_secondary =
102
103 Maux_ = &fe_intgrl_values_secondary.M_matrix;
104}
105
106// ##################################################################
107/**Direction data callback.*/
109{
111 const auto curvilinear_product_quadrature =
112 std::dynamic_pointer_cast<chi_math::CurvilinearAngularQuadrature>(
114
115 ChiLogicalErrorIf(not curvilinear_product_quadrature,
116 "Failure to cast angular quadrature to "
117 "chi_math::CurvilinearAngularQuadrature");
118
119 fac_diamond_difference_ = curvilinear_product_quadrature
120 ->GetDiamondDifferenceFactor()[direction_num_];
121 fac_streaming_operator_ = curvilinear_product_quadrature
122 ->GetStreamingOperatorFactor()[direction_num_];
123}
124
125// ##################################################################
126/**Applies diamond differencing on azimuthal directions.*/
128{
129 const auto f0 = 1 / fac_diamond_difference_;
130 const auto f1 = f0 - 1;
131 for (size_t i = 0; i < cell_num_nodes_; ++i)
132 {
133 const auto ir = grid_fe_view_.MapDOFLocal(
135 for (int gsg = 0; gsg < gs_ss_size_; ++gsg)
136 psi_sweep_[ir + gsg] = f0 * b_[gsg][i] - f1 * psi_sweep_[ir + gsg];
137 }
138}
139
140// ##################################################################
141/**Assembles the volumetric gradient term.*/
143{
144 const auto& G = *G_;
145 const auto& Maux = *Maux_;
146
147 for (int i = 0; i < cell_num_nodes_; ++i)
148 for (int j = 0; j < cell_num_nodes_; ++j)
149 {
150 Amat_[i][j] = omega_.Dot(G[i][j]) + fac_streaming_operator_ * Maux[i][j];
151 const auto jr = grid_fe_view_.MapDOFLocal(
153 for (int gsg = 0; gsg < gs_ss_size_; ++gsg)
154 b_[gsg][i] +=
155 fac_streaming_operator_ * Maux[i][j] * psi_sweep_[jr + gsg];
156 }
157}
158
159// ##################################################################
160/**Performs the integral over the surface of a face.*/
162{
165 {
166 const auto& face_normal = cell_->faces_[f].normal_;
167 //------------------------------------------------------------------
168 // determine whether incoming direction is incident on the point
169 // of symmetry or on the axis of symmetry
170 // N.B.: a face is considered to be on the point/axis of symmetry
171 // if all are true:
172 // 1. the face normal is antiparallel to $\vec{e}_{d}$
173 // 2. all vertices of the face exhibit $v_{d} = 0$
174 // with $d = 2$ for 1D geometries and $d = 0$ for 2D geometries.
175 // Thanks to the verifications performed during initialisation,
176 // at this point it is necessary to confirm only the orientation.
177 const bool incident_on_symmetric_boundary =
178 (face_normal.Dot(normal_vector_boundary_) < -0.999999);
179 if (incident_on_symmetric_boundary) return;
180 }
181
182 const auto& M_surf_f = (*M_surf_)[f];
183 const double mu = face_mu_values_[f];
184 const size_t num_face_nodes = cell_mapping_->NumFaceNodes(f);
185 for (int fi = 0; fi < num_face_nodes; ++fi)
186 {
187 const int i = cell_mapping_->MapFaceNode(f, fi);
188 for (int fj = 0; fj < num_face_nodes; ++fj)
189 {
190 const int j = cell_mapping_->MapFaceNode(f, fj);
191
192 const double* psi = sweep_dependency_interface_.GetUpwindPsi(fj);
193
194 const double mu_Nij = -mu * M_surf_f[i][j];
195 Amat_[i][j] += mu_Nij;
196 for (int gsg = 0; gsg < gs_ss_size_; ++gsg)
197 b_[gsg][i] += psi[gsg] * mu_Nij;
198 } // for face node j
199 } // for face node i
200}
201
202} // namespace lbs
#define ChiLogicalErrorIf(condition, message)
int MapFaceNode(size_t face_index, size_t face_node_index) const
Definition: CellMapping.cc:53
size_t NumFaceNodes(size_t face_index) const
Definition: CellMapping.cc:36
size_t GetNumLocalDOFs(const UnknownManager &unknown_manager) const
virtual int64_t MapDOFLocal(const chi_mesh::Cell &cell, unsigned int node, const UnknownManager &unknown_manager, unsigned int unknown_id, unsigned int component) const =0
unsigned int AddUnknown(UnknownType unk_type, unsigned int dimension=0)
std::vector< CellFace > faces_
Definition: cell.h:82
MeshAttributes Attributes() const
std::shared_ptr< chi_math::AngularQuadrature > quadrature_
Definition: lbs_groupset.h:42
std::vector< LBSGroup > groups_
Definition: lbs_groupset.h:41
std::vector< CallbackFunction > surface_integral_kernels_
Definition: SweepChunk.h:136
chi_mesh::Vector3 omega_
Definition: SweepChunk.h:129
size_t direction_num_
Definition: SweepChunk.h:128
void RegisterKernel(const std::string &name, CallbackFunction function)
Definition: SweepChunk.cc:57
std::vector< double > face_mu_values_
Definition: SweepChunk.h:127
uint64_t cell_local_id_
Definition: SweepChunk.h:113
std::vector< CallbackFunction > mass_term_kernels_
Definition: SweepChunk.h:143
const LBSGroupset & groupset_
Definition: SweepChunk.h:91
std::vector< CallbackFunction > direction_data_callbacks_and_kernels_
Definition: SweepChunk.h:133
const chi_math::SpatialDiscretization & grid_fe_view_
Definition: SweepChunk.h:87
CallbackFunction Kernel(const std::string &name) const
Definition: SweepChunk.cc:69
SweepDependencyInterface & sweep_dependency_interface_
Definition: SweepChunk.h:97
size_t cell_num_nodes_
Definition: SweepChunk.h:118
size_t gs_ss_size_
Definition: SweepChunk.h:103
const chi_mesh::Cell * cell_
Definition: SweepChunk.h:114
std::vector< std::vector< double > > b_
Definition: SweepChunk.h:110
std::vector< std::vector< double > > Amat_
Definition: SweepChunk.h:107
std::vector< CallbackFunction > post_cell_dir_sweep_callbacks_
Definition: SweepChunk.h:149
const MatVec3 * G_
Definition: SweepChunk.h:119
std::vector< CallbackFunction > cell_data_callbacks_
Definition: SweepChunk.h:125
const chi_mesh::MeshContinuum & grid_
Definition: SweepChunk.h:86
const chi_math::CellMapping * cell_mapping_
Definition: SweepChunk.h:115
SweepChunkPWLRZ(const chi_mesh::MeshContinuum &grid, const chi_math::SpatialDiscretization &discretization_primary, const std::vector< lbs::UnitCellMatrices > &unit_cell_matrices, const std::vector< lbs::UnitCellMatrices > &secondary_unit_cell_matrices, std::vector< lbs::CellLBSView > &cell_transport_views, std::vector< double > &destination_phi, std::vector< double > &destination_psi, const std::vector< double > &source_moments, lbs::LBSGroupset &groupset, const std::map< int, lbs::XSPtr > &xs, int num_moments, int max_num_cell_dofs)
chi_math::UnknownManager unknown_manager_
const std::vector< lbs::UnitCellMatrices > & secondary_unit_cell_matrices_
std::map< unsigned int, unsigned int > map_polar_level_
VectorN< 3 > Vector3
@ DIMENSION_1
Definition: chi_mesh.h:72
Vector3 Dot(const chi_mesh::TensorRank2Dim3 &that) const
virtual const double * GetUpwindPsi(int face_node_local_idx) const =0