https://mooseframework.inl.gov
ComputeNodalAuxVarsThread.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 
12 // MOOSE includes
13 #include "AuxiliarySystem.h"
14 #include "AuxKernel.h"
15 #include "FEProblem.h"
16 #include "MooseMesh.h"
17 
18 #include "libmesh/threads.h"
19 
20 template <typename AuxKernelType>
22 
23 template <typename AuxKernelType>
25  FEProblemBase & fe_problem, const MooseObjectWarehouse<AuxKernelType> & storage)
26  : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(fe_problem),
27  _aux_sys(fe_problem.getAuxiliarySystem()),
28  _storage(storage)
29 {
30 }
31 
32 // Splitting Constructor
33 template <typename AuxKernelType>
36  : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(x, split),
37  _aux_sys(x._aux_sys),
38  _storage(x._storage)
39 {
40 }
41 
42 template <typename AuxKernelType>
43 void
45 {
46  std::set<TagID> needed_vector_tags;
47  std::set<TagID> needed_matrix_tags;
48 
49  const auto & block_kernels = _storage.getActiveBlockObjects(_tid);
50 
51  for (const auto & block : _block_ids)
52  {
53  const auto iter = block_kernels.find(block);
54 
55  if (iter != block_kernels.end())
56  for (const auto & aux : iter->second)
57  {
58  auto & matrix_tags = aux->getFEVariableCoupleableMatrixTags();
59  needed_matrix_tags.insert(matrix_tags.begin(), matrix_tags.end());
60  auto & vector_tags = aux->getFEVariableCoupleableVectorTags();
61  needed_vector_tags.insert(vector_tags.begin(), vector_tags.end());
62  }
63  }
64 
65  _fe_problem.setActiveFEVariableCoupleableMatrixTags(needed_matrix_tags, _tid);
66  _fe_problem.setActiveFEVariableCoupleableVectorTags(needed_vector_tags, _tid);
67 }
68 
69 template <typename AuxKernelType>
70 void
72 {
73  const Node * node = *node_it;
74 
75  const auto & block_ids = _aux_sys.mesh().getNodeBlockIds(*node);
76 
77  if (_block_ids != block_ids)
78  {
79  _block_ids.clear();
80  _block_ids.insert(block_ids.begin(), block_ids.end());
81  subdomainChanged();
82  }
83 
84  _fe_problem.reinitNode(node, _tid);
85 
86  // Get a map of all active block restricted AuxKernel objects
87  const auto & block_kernels = _storage.getActiveBlockObjects(_tid);
88 
89  // Loop over all SubdomainIDs for the current node, if an AuxKernel is active on this block then
90  // compute it.
91  for (const auto & block : block_ids)
92  {
93  const auto iter = block_kernels.find(block);
94 
95  if (iter != block_kernels.end())
96  for (const auto & aux : iter->second)
97  {
98  aux->compute();
99  // This is the same conditional check that the aux kernel performs internally before calling
100  // computeValue and _var.setNodalValue. We don't want to attempt to insert into the solution
101  // if we don't actually have any dofs on this node
102  if (aux->variable().isNodalDefined())
103  aux->variable().insert(_aux_sys.solution());
104 
105  // update the aux solution vector if writable coupled variables are used
106  if (aux->hasWritableCoupledVariables())
107  {
108  for (auto * var : aux->getWritableCoupledVariables())
109  if (var->isNodalDefined())
110  // insert into the global solution vector
111  var->insert(_aux_sys.solution());
112 
113  // make solution values available for dependent AuxKernels
114  _fe_problem.reinitNode(node, _tid);
115  }
116  }
117  }
118 }
119 
120 template <typename AuxKernelType>
121 void
123 {
124  _fe_problem.clearActiveFEVariableCoupleableVectorTags(_tid);
125  _fe_problem.clearActiveFEVariableCoupleableMatrixTags(_tid);
126 }
127 
128 template <typename AuxKernelType>
129 void
131 {
132 }
133 
134 template <typename AuxKernelType>
135 void
137 {
138  if (!_fe_problem.shouldPrintExecution(_tid) || !_storage.hasActiveObjects())
139  return;
140 
141  const auto & console = _fe_problem.console();
142  const auto & execute_on = _fe_problem.getCurrentExecuteOnFlag();
143  console << "[DBG] Beginning nodal loop of nodal auxiliary kernels on " << execute_on << std::endl;
144  console << "[DBG] Ordering of the kernels on each block they are defined on:" << std::endl;
145  // TODO Check that all objects are active at this point
146  console << _storage.activeObjectsToFormattedString() << std::endl;
147 }
148 
void post() override
Called after the node range loop.
void join(const ComputeNodalAuxVarsThread &)
void onNode(ConstNodeRange::const_iterator &nd) override
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
ComputeNodalAuxVarsThread(FEProblemBase &fe_problem, const MooseObjectWarehouse< AuxKernelType > &storage)
tbb::split split
vec_type::const_iterator const_iterator
void printGeneralExecutionInformation() const override
Print information about the loop, mostly order of execution of objects.