https://mooseframework.inl.gov
ComputeLinearFVFaceThread.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "LinearSystem.h"
12 #include "LinearFVKernel.h"
13 #include "LinearFVFluxKernel.h"
14 #include "FEProblemBase.h"
15 
17  const unsigned int system_num,
19  const std::set<TagID> & vector_tags,
20  const std::set<TagID> & matrix_tags)
21  : _fe_problem(fe_problem),
22  _system_number(system_num),
23  _mode(mode),
24  _vector_tags(vector_tags),
25  _matrix_tags(matrix_tags),
26  _system_contrib_objects_ready(false)
27 {
28 }
29 
30 // Splitting Constructor
32  Threads::split /*split*/)
33  : _fe_problem(x._fe_problem),
34  _system_number(x._system_number),
35  _mode(x._mode),
36  _vector_tags(x._vector_tags),
37  _matrix_tags(x._matrix_tags),
38  _system_contrib_objects_ready(x._system_contrib_objects_ready)
39 {
40 }
41 
42 void
44 {
45  ParallelUniqueId puid;
46  _tid = puid.id;
47 
50 
53 
54  // Iterate over all the elements in the range
55  for (const auto & face_info : range)
56  {
57  _subdomain = face_info->elem().subdomain_id();
59  face_info->neighborPtr() ? face_info->neighbor().subdomain_id() : _subdomain;
61  {
64  }
65 
66  const Real face_area = face_info->faceArea() * face_info->faceCoord();
67 
68  // Time to execute the kernels that contribute to the matrix and
69  // right hand side
70  for (auto & kernel : _fv_flux_kernels)
71  {
72  kernel->setupFaceData(face_info);
73  kernel->setCurrentFaceArea(face_area);
74  kernel->addMatrixContribution();
75  kernel->addRightHandSideContribution();
76  }
77  }
78 }
79 
80 void
82 {
83 }
84 
85 void
87 {
88  // The reason why we need to grab vectors and matrices separately is that
89  // we want to grab a union instead of an intersection.
90  std::vector<LinearFVFluxKernel *> kernels_after_vectors;
92  .query()
93  .template condition<AttribSysNum>(_system_number)
94  .template condition<AttribSystem>("LinearFVFluxKernel")
95  .template condition<AttribThread>(_tid)
96  .template condition<AttribVectorTags>(_vector_tags)
97  .queryInto(kernels_after_vectors);
98 
99  std::vector<LinearFVFluxKernel *> kernels_after_matrices;
101  .query()
102  .template condition<AttribSysNum>(_system_number)
103  .template condition<AttribSystem>("LinearFVFluxKernel")
104  .template condition<AttribThread>(_tid)
105  .template condition<AttribMatrixTags>(_matrix_tags)
106  .queryInto(kernels_after_matrices);
107 
108  // We fetch the union of the available objects
109  std::vector<LinearFVFluxKernel *> kernels;
110  MooseUtils::getUnion(kernels_after_vectors, kernels_after_matrices, kernels);
111 
112  // As a last step, we make sure the kernels know which vectors/matrices they need to contribute to
113  for (auto & kernel : kernels)
114  kernel->linkTaggedVectorsAndMatrices(_vector_tags, _matrix_tags);
115 
117 }
118 
119 void
121 {
122  mooseAssert(_system_contrib_objects_ready,
123  "The system contribution objects need to be set up before we fetch the "
124  "block-restricted objects!");
125 
126  _fv_flux_kernels.clear();
127 
128  if (_subdomain != _old_subdomain)
129  {
130  // We just filter based on subdomain ID on top of everything else
131  std::vector<LinearFVFluxKernel *> kernels_after_vector;
133  .query()
134  .template condition<AttribSysNum>(_system_number)
135  .template condition<AttribSystem>("LinearFVFluxKernel")
136  .template condition<AttribThread>(_tid)
137  .template condition<AttribVectorTags>(_vector_tags)
138  .template condition<AttribSubdomains>(_subdomain)
139  .queryInto(kernels_after_vector);
140  std::vector<LinearFVFluxKernel *> kernels_after_matrix;
142  .query()
143  .template condition<AttribSysNum>(_system_number)
144  .template condition<AttribSystem>("LinearFVFluxKernel")
145  .template condition<AttribThread>(_tid)
146  .template condition<AttribMatrixTags>(_matrix_tags)
147  .template condition<AttribSubdomains>(_subdomain)
148  .queryInto(kernels_after_matrix);
149 
150  // We populate the list of kernels with the union of the two vectors
151  MooseUtils::getUnion(kernels_after_vector, kernels_after_matrix, _fv_flux_kernels_elem);
153  }
155 
157  {
158  // Here we just filter based on subdomain ID on top of everything else
159  std::vector<LinearFVFluxKernel *> kernels_after_vector;
161  .query()
162  .template condition<AttribSysNum>(_system_number)
163  .template condition<AttribSystem>("LinearFVFluxKernel")
164  .template condition<AttribThread>(_tid)
165  .template condition<AttribVectorTags>(_vector_tags)
166  .template condition<AttribSubdomains>(_neighbor_subdomain)
167  .queryInto(kernels_after_vector);
168  std::vector<LinearFVFluxKernel *> kernels_after_matrix;
170  .query()
171  .template condition<AttribSysNum>(_system_number)
172  .template condition<AttribSystem>("LinearFVFluxKernel")
173  .template condition<AttribThread>(_tid)
174  .template condition<AttribMatrixTags>(_matrix_tags)
175  .template condition<AttribSubdomains>(_neighbor_subdomain)
176  .queryInto(kernels_after_matrix);
177 
178  // We populate the list of kernels with the union of the two vectors
179  MooseUtils::getUnion(kernels_after_vector, kernels_after_matrix, _fv_flux_kernels_neighbor);
181  }
183 }
184 
185 void
187 {
189  return;
190  auto & console = _fe_problem.console();
191  auto execute_on = _fe_problem.getCurrentExecuteOnFlag();
192  console << "[DBG] Beginning linear finite volume flux objects loop on " << execute_on
193  << std::endl;
194  mooseDoOnce(console << "[DBG] Loop on faces (FaceInfo), objects ordered on each face: "
195  << std::endl;
196  console << "[DBG] - linear finite volume flux kernels" << std::endl);
197 }
198 
199 void
201 {
203  return;
204 
205  // Print the location of the execution
206  auto & console = _fe_problem.console();
207  console << "[DBG] Linear flux kernels on block "
210  console << " and neighbor " << _fe_problem.mesh().getSubdomainName(_neighbor_subdomain)
211  << std::endl;
212  else
213  console << " with no neighbor block" << std::endl;
214 
215  // Print the list of objects
216  std::vector<MooseObject *> kernels_to_print;
217  for (const auto & kernel : _fv_flux_kernels)
218  kernels_to_print.push_back(dynamic_cast<MooseObject *>(kernel));
220  "[DBG]")
221  << std::endl;
222 }
void operator()(const FaceInfoRange &range)
Operator which is used to execute the thread over a certain iterator range.
StoredRange< MooseMesh::const_face_info_iterator, const FaceInfo * > FaceInfoRange
std::string mooseObjectVectorToString(const std::vector< MooseObject *> &objs, const std::string &sep=" ")
Routine to output the name of MooseObjects in a string.
Definition: ConsoleUtils.C:598
SubdomainID _old_neighbor_subdomain
The subdomain for the last neighbor.
const unsigned int _system_number
The number of the linear system we are contributing to.
std::vector< LinearFVFluxKernel * > _fv_flux_kernels_elem
Kernels which will only contribute to a matrix from the element-side of the face. ...
LinearFVComputationMode
Definition: MathFVUtils.h:54
SubdomainID _old_subdomain
The subdomain for the last element.
void fetchBlockSystemContributionObjects()
Fetch LinearFVFluxKernels for a given block.
const ExecFlagType & getCurrentExecuteOnFlag() const
Return/set the current execution flag.
std::vector< T * > & queryInto(std::vector< T *> &results, Args &&... args)
queryInto executes the query and stores the results in the given vector.
Definition: TheWarehouse.h:311
ComputeLinearFVFaceThread(FEProblemBase &fe_problem, const unsigned int linear_system_num, const Moose::FV::LinearFVComputationMode mode, const std::set< TagID > &vector_tags, const std::set< TagID > &matrix_tags)
Class constructor.
void setupSystemContributionObjects()
Setup the contribution objects before we start the loop.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
const std::string & getSubdomainName(SubdomainID subdomain_id) const
Return the name of a block given an id.
Definition: MooseMesh.C:1758
const SubdomainID INVALID_BLOCK_ID
Definition: MooseTypes.C:20
bool shouldPrintExecution(const THREAD_ID tid) const
Check whether the problem should output execution orders at this time.
bool _system_contrib_objects_ready
Boolean that is used to check if the kernels are ready to start contributing to the system...
TheWarehouse & theWarehouse() const
std::string formatString(std::string message, const std::string &prefix)
Add new lines and prefixes to a string for pretty display in output NOTE: This makes a copy of the st...
Definition: ConsoleUtils.C:582
std::vector< LinearFVFluxKernel * > _fv_flux_kernels_neighbor
Kernels which will only contribute to a matrix from the neighbor-side of the face.
SubdomainID _subdomain
The subdomain for the current element.
FEProblemBase & _fe_problem
Reference to the problem.
void printBlockExecutionInformation() const
Print ordering of objects executed on each block.
const ConsoleStream & console() const
Return console handle.
Definition: Problem.h:48
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void getUnion(const std::vector< T > &vector1, const std::vector< T > &vector2, std::vector< T > &common)
Function which takes the union of vector1 and vector2 and copies them to common . ...
Definition: MooseUtils.h:645
void join(const ComputeLinearFVFaceThread &)
Join threads at the end of the execution.
std::set< LinearFVFluxKernel * > _fv_flux_kernels
Combined LinearFVFluxKernels which will be used to contribute to a system.
Query query()
query creates and returns an initialized a query object for querying objects from the warehouse...
Definition: TheWarehouse.h:466
virtual MooseMesh & mesh() override
SubdomainID _neighbor_subdomain
The subdomain for the current neighbor.
void printGeneralExecutionInformation() const
Print list of executed object types together with the execution order.
Adds contributions from face terms discretized using the finite volume method to the matrix and right...
const std::set< TagID > & _matrix_tags
The matrix tags this thread contributes to.
const std::set< TagID > & _vector_tags
The vector tags this thread contributes to.