https://mooseframework.inl.gov
KokkosTimeDerivative.h
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 
10 #pragma once
11 
12 #include "KokkosTimeKernelValue.h"
13 
15 {
16 public:
18 
20 
21  template <typename Derived>
22  KOKKOS_FUNCTION void computeJacobianInternal(const Derived & kernel, AssemblyDatum & datum) const;
23 
24  template <typename Derived>
25  KOKKOS_FUNCTION Real precomputeQpResidual(const unsigned int qp, AssemblyDatum & datum) const;
26  template <typename Derived>
27  KOKKOS_FUNCTION Real precomputeQpJacobian(const unsigned int j,
28  const unsigned int qp,
29  AssemblyDatum & datum) const;
30 
31 protected:
32  const bool _lumping;
33 };
34 
35 template <typename Derived>
36 KOKKOS_FUNCTION void
37 KokkosTimeDerivative::computeJacobianInternal(const Derived & kernel, AssemblyDatum & datum) const
38 {
40 
41  Real local_ke[MAX_CACHED_DOF];
42 
43  for (unsigned int j = datum.local_thread_id(); j < datum.n_jdofs();
44  j += datum.num_local_threads())
45  {
46  unsigned int num_batches = datum.n_idofs() / MAX_CACHED_DOF;
47 
48  if (datum.n_idofs() % MAX_CACHED_DOF)
49  ++num_batches;
50 
51  for (unsigned int batch = 0; batch < num_batches; ++batch)
52  {
53  unsigned int ib = batch * MAX_CACHED_DOF;
54  unsigned int ie = ::Kokkos::min(ib + MAX_CACHED_DOF, datum.n_idofs());
55 
56  for (unsigned int i = ib; i < ie; ++i)
57  local_ke[i - ib] = 0;
58 
59  for (unsigned int qp = 0; qp < datum.n_qps(); ++qp)
60  {
61  Real value = datum.JxW(qp) * kernel.template precomputeQpJacobian<Derived>(j, qp, datum);
62 
63  for (unsigned int i = ib; i < ie; ++i)
64  local_ke[i - ib] += value * _test(datum, i, qp);
65  }
66 
67  for (unsigned int i = ib; i < ie; ++i)
69  local_ke[i - ib], datum.elem().id, i, _lumping ? i : j, datum.jvar());
70  }
71  }
72 }
73 
74 template <typename Derived>
75 KOKKOS_FUNCTION Real
76 KokkosTimeDerivative::precomputeQpResidual(const unsigned int qp, AssemblyDatum & datum) const
77 {
78  return _u_dot(datum, qp);
79 }
80 
81 template <typename Derived>
82 KOKKOS_FUNCTION Real
84  const unsigned int qp,
85  AssemblyDatum & datum) const
86 {
87  return _phi(datum, j, qp) * _du_dot_du;
88 }
KOKKOS_FUNCTION unsigned int num_local_threads() const
Get the number of local threads.
Definition: KokkosDatum.h:384
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
const VariableTestValue _test
Current test function.
Definition: KokkosKernel.h:173
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const Scalar< const Real > _du_dot_du
Derivative of u_dot with respect to u.
KOKKOS_FUNCTION unsigned int jvar() const
Get the coupled variable number.
Definition: KokkosDatum.h:651
KOKKOS_FUNCTION unsigned int n_jdofs() const
Get the number of local DOFs for the coupled variable.
Definition: KokkosDatum.h:631
KOKKOS_FUNCTION Real precomputeQpResidual(const unsigned int qp, AssemblyDatum &datum) const
The base class for Kokkos time kernels whose test function can be factored out.
KokkosTimeDerivative(const InputParameters &parameters)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
KOKKOS_FUNCTION void accumulateTaggedElementalMatrix(const Real local_ke, const ContiguousElementID elem, const unsigned int i, const unsigned int j, const unsigned int jvar, const unsigned int comp=0) const
Accumulate local elemental Jacobian contribution to tagged matrices.
KOKKOS_FUNCTION Real precomputeQpJacobian(const unsigned int j, const unsigned int qp, AssemblyDatum &datum) const
KOKKOS_FUNCTION unsigned int n_idofs() const
Get the number of local DOFs.
Definition: KokkosDatum.h:626
KOKKOS_FUNCTION unsigned int n_qps() const
Get the number of local quadrature points.
Definition: KokkosDatum.h:303
KOKKOS_FUNCTION unsigned int local_thread_id() const
Get the current local thread ID.
Definition: KokkosDatum.h:379
KOKKOS_FUNCTION void computeJacobianInternal(const Derived &kernel, AssemblyDatum &datum) const
constexpr unsigned int MAX_CACHED_DOF
Maximum number of DOFs to cache during residual and Jacobian computation.
Definition: KokkosHeader.h:83
const VariableValue _u_dot
Time derivative of the current solution at quadrature points.
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
The Kokkos object that holds thread-private data in the parallel operations of Kokkos kernels...
Definition: KokkosDatum.h:559
KOKKOS_FUNCTION Real JxW(const unsigned int qp)
Get the transformed Jacobian weight.
Definition: KokkosDatum.h:506
KOKKOS_FUNCTION const ElementInfo & elem() const
Get the element information object.
Definition: KokkosDatum.h:46
const VariablePhiValue _phi
Current shape function.
Definition: KokkosKernel.h:181
auto min(const L &left, const R &right)
ContiguousElementID id
Contiguous element ID.
Definition: KokkosMesh.h:42