www.mooseframework.org
ComputeNodalKernelJacobiansThread.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "Assembly.h"
14 #include "AuxiliarySystem.h"
15 #include "FEProblem.h"
16 #include "MooseMesh.h"
17 #include "MooseVariableFE.h"
18 #include "NodalKernelBase.h"
19 #include "NonlinearSystemBase.h"
20 
21 #include "libmesh/sparse_matrix.h"
22 
24  FEProblemBase & fe_problem,
27  const std::set<TagID> & tags)
28  : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(fe_problem),
29  _fe_problem(fe_problem),
30  _nl(nl),
31  _aux_sys(fe_problem.getAuxiliarySystem()),
32  _tags(tags),
33  _nodal_kernels(nodal_kernels),
34  _num_cached(0)
35 {
36 }
37 
38 // Splitting Constructor
40  ComputeNodalKernelJacobiansThread & x, Threads::split split)
41  : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(x, split),
42  _fe_problem(x._fe_problem),
43  _nl(x._nl),
44  _aux_sys(x._aux_sys),
45  _tags(x._tags),
46  _nodal_kernels(x._nodal_kernels),
47  _num_cached(0)
48 {
49 }
50 
51 void
53 {
54  _num_cached = 0;
55 
56  if (!_tags.size() || _tags.size() == _fe_problem.numMatrixTags())
58  else if (_tags.size() == 1)
60  else
62 }
63 
64 void
65 ComputeNodalKernelJacobiansThread::onNode(ConstNodeRange::const_iterator & node_it)
66 {
67  const Node * node = *node_it;
68 
69  auto & ce = _fe_problem.couplingEntries(_tid, _nl.number());
70  for (const auto & it : ce)
71  {
72  MooseVariableFEBase & ivariable = *(it.first);
73  MooseVariableFEBase & jvariable = *(it.second);
74 
75  unsigned int ivar = ivariable.number();
76  unsigned int jvar = jvariable.number();
77 
78  // The NodalKernels that are active and are coupled to the jvar in question
79  std::vector<std::shared_ptr<NodalKernelBase>> active_involved_kernels;
80 
81  const std::set<SubdomainID> & block_ids = _aux_sys.mesh().getNodeBlockIds(*node);
82  for (const auto & block : block_ids)
83  {
85  {
86  // Loop over each NodalKernel to see if it's involved with the jvar
87  const auto & objects = _nkernel_warehouse->getActiveBlockObjects(block, _tid);
88  for (const auto & nodal_kernel : objects)
89  {
90  if (nodal_kernel->variable().number() == ivar)
91  {
92  // If this NodalKernel is acting on the jvar add it to the list and short-circuit the
93  // loop
94  if (nodal_kernel->variable().number() == jvar)
95  {
96  active_involved_kernels.push_back(nodal_kernel);
97  continue;
98  }
99 
100  // See if this NodalKernel is coupled to the jvar
101  const std::vector<MooseVariableFEBase *> & coupled_vars =
102  nodal_kernel->getCoupledMooseVars();
103  for (const auto & var : coupled_vars)
104  if (var->number() == jvar)
105  {
106  active_involved_kernels.push_back(nodal_kernel);
107  break; // It only takes one
108  }
109  }
110  }
111  }
112  }
113 
114  // Did we find any NodalKernels coupled to this jvar?
115  if (!active_involved_kernels.empty())
116  {
117  // prepare variables
118  for (auto * var : _aux_sys._nodal_vars[_tid])
119  var->prepareAux();
120 
121  _fe_problem.reinitNode(node, _tid);
122 
123  for (const auto & nodal_kernel : active_involved_kernels)
124  nodal_kernel->computeOffDiagJacobian(jvar);
125 
126  _num_cached++;
127 
128  if (_num_cached == 20) // Cache 20 nodes worth before adding into the residual
129  {
130  _num_cached = 0;
131  // vectors are thread-safe, but matrices are not yet
132  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
134  }
135  }
136  }
137 }
138 
139 void
141 {
142 }
143 
144 void
146 {
148  return;
149 
150  const auto & console = _fe_problem.console();
151  const auto & execute_on = _fe_problem.getCurrentExecuteOnFlag();
152  console << "[DBG] Executing nodal kernels contribution to Jacobian on nodes on " << execute_on
153  << std::endl;
154  console << _nkernel_warehouse->activeObjectsToFormattedString() << std::endl;
155 }
std::string activeObjectsToFormattedString(THREAD_ID tid=0, const std::string &prefix="[DBG]") const
Output the active content of the warehouse to a string, meant to be output to the console...
MooseMesh & mesh()
Definition: SystemBase.h:100
std::vector< std::pair< MooseVariableFEBase *, MooseVariableFEBase * > > & couplingEntries(const THREAD_ID tid, const unsigned int nl_sys_num)
bool hasActiveBlockObjects(THREAD_ID tid=0) const
void join(const ComputeNodalKernelJacobiansThread &)
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getActiveBlockObjects(THREAD_ID tid=0) const
virtual void reinitNode(const Node *node, const THREAD_ID tid) override
virtual void onNode(ConstNodeRange::const_iterator &node_it) override
Called for each node.
unsigned int number() const
Get variable number coming from libMesh.
const ExecFlagType & getCurrentExecuteOnFlag() const
Return/set the current execution flag.
ComputeNodalKernelJacobiansThread(FEProblemBase &fe_problem, NonlinearSystemBase &nl, MooseObjectTagWarehouse< NodalKernelBase > &nodal_kernels, const std::set< TagID > &tags)
const std::set< SubdomainID > & getNodeBlockIds(const Node &node) const
Return list of blocks to which the given node belongs.
Definition: MooseMesh.C:1281
This class provides an interface for common operations on field variables of both FE and FV types wit...
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
MooseObjectWarehouse< NodalKernelBase > * _nkernel_warehouse
Nonlinear system to be solved.
bool shouldPrintExecution(const THREAD_ID tid) const
Check whether the problem should output execution orders at this time.
MooseObjectWarehouse< T > & getMatrixTagObjectWarehouse(TagID tag_id, THREAD_ID tid)
Retrieve a moose object warehouse in which every moose object has the given matrix tag...
StoredRange< MeshBase::const_node_iterator, const Node *> ConstNodeRange
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1132
void printGeneralExecutionInformation() const override
Print information about the loop, mostly order of execution of objects.
std::vector< std::vector< MooseVariableFEBase * > > _nodal_vars
virtual unsigned int numMatrixTags() const
The total number of tags.
Definition: SubProblem.h:220
tbb::split split
const ConsoleStream & console() const
Return console handle.
Definition: Problem.h:48
bool hasActiveObjects(THREAD_ID tid=0) const
MooseObjectWarehouse< T > & getMatrixTagsObjectWarehouse(const std::set< TagID > &tags, THREAD_ID tid)
Retrieve a moose object warehouse in which every moose object has one of the given matrix tags...
MooseObjectTagWarehouse< NodalKernelBase > & _nodal_kernels
virtual void pre() override
Called before the node range loop.
unsigned int _num_cached
Number of contributions cached up.
virtual void addCachedJacobian(const THREAD_ID tid) override