www.mooseframework.org
MaxQpsThread.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 
10 #include "MaxQpsThread.h"
11 #include "FEProblem.h"
12 #include "Assembly.h"
13 
14 #include "libmesh/fe.h"
15 #include "libmesh/threads.h"
16 #include LIBMESH_INCLUDE_UNORDERED_SET
17 LIBMESH_DEFINE_HASH_POINTERS
18 #include "libmesh/quadrature.h"
19 
20 MaxQpsThread::MaxQpsThread(FEProblemBase & fe_problem) : _fe_problem(fe_problem), _max(0) {}
21 
22 // Splitting Constructor
23 MaxQpsThread::MaxQpsThread(MaxQpsThread & x, Threads::split /*split*/)
24  : _fe_problem(x._fe_problem), _max(x._max)
25 {
26 }
27 
28 void
30 {
31  ParallelUniqueId puid;
32  _tid = puid.id;
33 
34  // Not actually using any pre-existing data so it shouldn't matter which assembly we use
35  auto & assem = _fe_problem.assembly(_tid, 0);
36 
37  // For short circuiting reinit. With potential block-specific qrules we
38  // need to track "seen" element types by their subdomains as well.
39  std::set<std::pair<ElemType, SubdomainID>> seen_it;
40 
41  for (const auto & elem : range)
42  {
43  // Only reinit if the element type has not previously been seen
44  if (!seen_it.insert(std::make_pair(elem->type(), elem->subdomain_id())).second)
45  continue;
46 
47  // This ensures we can access the correct qrules if any block-specific
48  // qrules have been created.
49  assem.setCurrentSubdomainID(elem->subdomain_id());
50  assem.setVolumeQRule(elem);
51 
52  auto & qrule = assem.writeableQRule();
53  qrule->init(elem->type(), elem->p_level());
54  if (qrule->n_points() > _max)
55  _max = qrule->n_points();
56 
57  if (elem->dim())
58  {
59  // We are assuming here that side 0 ends up with at least as many quadrature points as any
60  // other side
61  assem.setFaceQRule(elem, /*side=*/0);
62  auto & qrule_face = assem.writeableQRuleFace();
63  qrule_face->init(elem->side_type(0), elem->p_level());
64  if (qrule_face->n_points() > _max)
65  _max = qrule->n_points();
66  }
67 
68  // In initial conditions nodes are enumerated as pretend quadrature points
69  // using the _qp index to access coupled variables. In order to be able to
70  // use _zero (resized according to _max_qps) with _qp, we need to count nodes.
71  if (elem->n_nodes() > _max)
72  _max = elem->n_nodes();
73  }
74 
75  // Clear the cached quadrature rules because we may add FE objects in between now and simulation
76  // start and we only ensure we set all the FE quadrature rules if a quadrature rule is different
77  // from the cached quadrature rule
78  assem.clearCachedQRules();
79 }
80 
81 void
83 {
84  if (y._max > _max)
85  _max = y._max;
86 }
This class determines the maximum number of Quadrature Points and Shape Functions used for a given si...
Definition: MaxQpsThread.h:27
unsigned int _max
Maximum number of qps encountered.
Definition: MaxQpsThread.h:47
void join(const MaxQpsThread &y)
Definition: MaxQpsThread.C:82
void operator()(const ConstElemRange &range)
Definition: MaxQpsThread.C:29
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num) override
FEProblemBase & _fe_problem
Definition: MaxQpsThread.h:42
void setCurrentSubdomainID(SubdomainID i)
set the current subdomain ID
Definition: Assembly.h:377
MaxQpsThread(FEProblemBase &fe_problem)
Definition: MaxQpsThread.C:20
THREAD_ID _tid
Definition: MaxQpsThread.h:44