https://mooseframework.inl.gov
KokkosDirichletBCBase.h
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 #pragma once
11 
12 #include "KokkosNodalBC.h"
13 #include "KokkosADNodalBC.h"
14 
15 namespace Moose::Kokkos
16 {
17 
21 template <bool is_ad>
22 class DirichletBCBaseTempl : public std::conditional_t<is_ad, ADNodalBC, NodalBC>
23 {
24  using real_type = std::conditional_t<is_ad, ADReal, Real>;
25 
26 public:
28 
32  DirichletBCBaseTempl(const InputParameters & parameters);
33 
38  virtual bool preset() const override { return _preset; }
39 
44  virtual void presetSolution(TagID tag) override;
45 
49  struct PresetLoop
50  {
51  };
52 
56  template <typename Derived>
57  KOKKOS_FUNCTION void operator()(PresetLoop, const ThreadID tid, const Derived & bc) const;
58 
59  template <typename Derived>
60  KOKKOS_FUNCTION auto computeQpResidual(const unsigned int qp, AssemblyDatum & datum) const;
61 
62  using Base = std::conditional_t<is_ad, ADNodalBC, NodalBC>;
63  using Base::operator();
64 
65 protected:
66  using Base::_kokkos_var;
67  using Base::_u;
68  using Base::kokkosAssembly;
69  using Base::kokkosBoundaryNodeID;
70  using Base::kokkosSystem;
71  using Base::kokkosSystems;
72  using Base::numKokkosBoundaryNodes;
73 
74 private:
78  const bool _preset;
83 };
84 
85 template <bool is_ad>
86 template <typename Derived>
87 KOKKOS_FUNCTION void
88 DirichletBCBaseTempl<is_ad>::operator()(PresetLoop, const ThreadID tid, const Derived & bc) const
89 {
90  auto node = kokkosBoundaryNodeID(tid);
91  auto & sys = kokkosSystem(_kokkos_var.sys());
92  auto dof = sys.getNodeLocalDofIndex(node, 0, _kokkos_var.var());
93 
95  return;
96 
97  AssemblyDatum datum(node, kokkosAssembly(), kokkosSystems(), _kokkos_var, _kokkos_var.var());
98 
99  sys.getVectorDofValue(dof, _solution_tag) = bc.computeValue(0, datum);
100 }
101 
102 template <bool is_ad>
103 template <typename Derived>
104 KOKKOS_FUNCTION auto
106 {
107  auto bc = static_cast<const Derived *>(this);
108 
109  return _u(datum, qp) - real_type(bc->computeValue(qp, datum));
110 }
111 
114 
115 } // namespace Moose::Kokkos
116 
117 #define registerKokkosDirichletBC(app, classname) \
118  registerKokkosResidualObject(app, classname); \
119  registerKokkosAdditionalOperation(classname, PresetLoop)
120 
121 #define registerKokkosADDirichletBC(app, classname) \
122  registerKokkosADResidualObject(app, classname); \
123  registerKokkosAdditionalOperation(classname, PresetLoop)
virtual bool preset() const override
Get whether the value is to be preset.
The base Kokkos boundary condition of a Dirichlet type.
unsigned int TagID
Definition: MooseTypes.h:238
KOKKOS_FUNCTION void operator()(PresetLoop, const ThreadID tid, const Derived &bc) const
The preset function called by Kokkos.
DirichletBCBaseTempl(const InputParameters &parameters)
Constructor.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::conditional_t< is_ad, ADNodalBC, NodalBC > Base
TagID _solution_tag
Tag associated with the solution vector to be preset.
virtual void presetSolution(TagID tag) override
Dispatch solution vector preset.
KOKKOS_FUNCTION auto computeQpResidual(const unsigned int qp, AssemblyDatum &datum) const
static InputParameters validParams()
static constexpr dof_id_type invalid_id
std::conditional_t< is_ad, ADReal, Real > real_type
The Kokkos object that holds thread-private data in the parallel operations of Kokkos kernels...
Definition: KokkosDatum.h:364
const bool _preset
Flag whether the value is to be preset.
DirichletBCBaseTempl< true > ADDirichletBCBase
dof_id_type ThreadID
Definition: KokkosThread.h:22
DirichletBCBaseTempl< false > DirichletBCBase