https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
20template <typename AuxKernelType>
22
23template <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
33template <typename AuxKernelType>
35 Threads::split split)
36 : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(x, split),
37 _aux_sys(x._aux_sys),
38 _storage(x._storage)
39{
40}
41
42template <typename AuxKernelType>
43void
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
69template <typename AuxKernelType>
70void
71ComputeNodalAuxVarsThread<AuxKernelType>::onNode(ConstNodeRange::const_iterator & node_it)
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
120template <typename AuxKernelType>
121void
123{
124 _fe_problem.clearActiveFEVariableCoupleableVectorTags(_tid);
125 _fe_problem.clearActiveFEVariableCoupleableMatrixTags(_tid);
126}
127
128template <typename AuxKernelType>
129void
133
134template <typename AuxKernelType>
135void
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 " << MooseUtils::prettyCppType<AuxKernelType>()
144 << " on " << execute_on << std::endl;
145 console << "[DBG] Ordering of the kernels on each block they are defined on:" << std::endl;
146 // TODO Check that all objects are active at this point
147 console << _storage.activeObjectsToFormattedString() << std::endl;
148}
149
ComputeNodalAuxVarsThread(FEProblemBase &fe_problem, const MooseObjectWarehouse< AuxKernelType > &storage)
void printGeneralExecutionInformation() const override
Print information about the loop, mostly order of execution of objects.
void join(const ComputeNodalAuxVarsThread &)
void onNode(ConstNodeRange::const_iterator &nd) override
void post() override
Called after the node range loop.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
A storage container for MooseObjects that inherit from SetupInterface.