https://mooseframework.inl.gov
Loading...
Searching...
No Matches
KokkosIntegratedBC.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
13
14namespace Moose::Kokkos
15{
16
40{
41public:
43
44 // This object supports computeQpOffDiagJacobianScalar()
45 static constexpr bool supports_scalar_jacobian = true;
46
51
55 virtual void computeResidual() override;
59 virtual void computeJacobian() override;
60
66
75 template <typename Derived>
76 KOKKOS_FUNCTION Real computeQpJacobian(const unsigned int /* i */,
77 const unsigned int /* j */,
78 const unsigned int /* qp */,
79 AssemblyDatum & /* datum */) const
80 {
81 ::Kokkos::abort("Default computeQpJacobian() should never be called. Make sure you properly "
82 "redefined this method in your class without typos.");
83
84 return 0;
85 }
96 template <typename Derived>
97 KOKKOS_FUNCTION Real computeQpOffDiagJacobian(const unsigned int /* i */,
98 const unsigned int /* j */,
99 const unsigned int /* jvar */,
100 const unsigned int /* qp */,
101 AssemblyDatum & /* datum */) const
102 {
103 ::Kokkos::abort(
104 "Default computeQpOffDiagJacobian() should never be called. Make sure you properly "
105 "redefined this method in your class without typos.");
106
107 return 0;
108 }
119 template <typename Derived>
120 KOKKOS_FUNCTION Real computeQpOffDiagJacobianScalar(const unsigned int /* i */,
121 const unsigned int /* j */,
122 const unsigned int /* jvar */,
123 const unsigned int /* qp */,
124 AssemblyDatum & /* datum */) const
125 {
126 ::Kokkos::abort(
127 "Default computeQpOffDiagJacobianScalar() should never be called. Make sure you properly "
128 "redefined this method in your class without typos.");
129
130 return 0;
131 }
133
140 template <typename Derived>
141 static auto defaultJacobian()
142 {
143 return &IntegratedBC::computeQpJacobian<Derived>;
144 }
145 template <typename Derived>
147 {
148 return &IntegratedBC::computeQpOffDiagJacobian<Derived>;
149 }
150 template <typename Derived>
152 {
153 return &IntegratedBC::computeQpOffDiagJacobianScalar<Derived>;
154 }
156
161 template <typename Derived>
162 KOKKOS_FUNCTION void operator()(ResidualLoop, const ThreadID tid, const Derived & bc) const;
163 template <typename Derived>
164 KOKKOS_FUNCTION void operator()(JacobianLoop, const ThreadID tid, const Derived & bc) const;
165 template <typename Derived>
166 KOKKOS_FUNCTION void
167 operator()(OffDiagJacobianLoop, const ThreadID tid, const Derived & bc) const;
168 template <typename Derived>
169 KOKKOS_FUNCTION void
170 operator()(OffDiagJacobianScalarLoop, const ThreadID tid, const Derived & bc) const;
172
179
184 template <typename Derived>
185 KOKKOS_FUNCTION void computeResidualInternal(const Derived & bc, AssemblyDatum & datum) const;
191 template <typename Derived>
192 KOKKOS_FUNCTION void computeJacobianInternal(const Derived & bc, AssemblyDatum & datum) const;
198 template <typename Derived>
199 KOKKOS_FUNCTION void computeOffDiagJacobianInternal(const Derived & bc,
200 AssemblyDatum & datum) const;
206 template <typename Derived>
207 KOKKOS_FUNCTION void computeOffDiagJacobianScalarInternal(const Derived & bc,
208 AssemblyDatum & datum) const;
210
211protected:
236};
237
238template <typename Derived>
239KOKKOS_FUNCTION void
240IntegratedBC::operator()(ResidualLoop, const ThreadID tid, const Derived & bc) const
241{
242 auto [elem, side] = kokkosBoundaryElementSideID(_thread(tid, 1));
243
244 AssemblyDatum datum(
245 elem, side, kokkosAssembly(), kokkosSystems(), _kokkos_var, _kokkos_var.var());
246
247 datum.set_local_parallel(_thread(tid, 0), _thread.size(0));
248
249 bc.computeResidualInternal(bc, datum);
250}
251
252template <typename Derived>
253KOKKOS_FUNCTION void
254IntegratedBC::operator()(JacobianLoop, const ThreadID tid, const Derived & bc) const
255{
256 auto [elem, side] = kokkosBoundaryElementSideID(_thread(tid, 1));
257
258 AssemblyDatum datum(
259 elem, side, kokkosAssembly(), kokkosSystems(), _kokkos_var, _kokkos_var.var());
260
261 datum.set_local_parallel(_thread(tid, 0), _thread.size(0));
262
263 bc.computeJacobianInternal(bc, datum);
264}
265
266template <typename Derived>
267KOKKOS_FUNCTION void
268IntegratedBC::operator()(OffDiagJacobianLoop, const ThreadID tid, const Derived & bc) const
269{
270 auto [elem, side] = kokkosBoundaryElementSideID(_thread(tid, 2));
271
272 auto & sys = kokkosSystem(_kokkos_var.sys());
273 auto jvar = sys.getFieldCoupling(_kokkos_var.var())[_thread(tid, 1)];
274
275 if (!sys.isVariableActive(jvar, kokkosMesh().getElementInfo(elem).subdomain))
276 return;
277
278 AssemblyDatum datum(elem, side, kokkosAssembly(), kokkosSystems(), _kokkos_var, jvar);
279
280 datum.set_local_parallel(_thread(tid, 0), _thread.size(0));
281
282 bc.computeOffDiagJacobianInternal(bc, datum);
283}
284
285template <typename Derived>
286KOKKOS_FUNCTION void
288{
289 auto [elem, side] = kokkosBoundaryElementSideID(_thread(tid, 1));
290
291 auto & sys = kokkosSystem(_kokkos_var.sys());
292 auto jvar = sys.getScalarCoupling(_kokkos_var.var())[_thread(tid, 0)];
293
294 if (!sys.isVariableActive(jvar, kokkosMesh().getElementInfo(elem).subdomain))
295 return;
296
297 AssemblyDatum datum(elem, side, kokkosAssembly(), kokkosSystems(), _kokkos_var, jvar);
298
299 bc.computeOffDiagJacobianScalarInternal(bc, datum);
300}
301
302template <typename Derived>
303KOKKOS_FUNCTION void
304IntegratedBC::computeResidualInternal(const Derived & bc, AssemblyDatum & datum) const
305{
307 datum,
308 [&](Real * local_re, const unsigned int ib, const unsigned int ie)
309 {
310 for (unsigned int qp = 0; qp < datum.n_qps(); ++qp)
311 for (unsigned int i = ib; i < ie; ++i)
312 local_re[i] += datum.JxW(qp) * bc.template computeQpResidual<Derived>(i, qp, datum);
313 });
314}
315
316template <typename Derived>
317KOKKOS_FUNCTION void
318IntegratedBC::computeJacobianInternal(const Derived & bc, AssemblyDatum & datum) const
319{
321 datum,
322 [&](Real * local_ke, const unsigned int ib, const unsigned int ie, const unsigned int j)
323 {
324 for (unsigned int qp = 0; qp < datum.n_qps(); ++qp)
325 for (unsigned int i = ib; i < ie; ++i)
326 local_ke[i] += datum.JxW(qp) * bc.template computeQpJacobian<Derived>(i, j, qp, datum);
327 });
328}
329
330template <typename Derived>
331KOKKOS_FUNCTION void
333{
335 datum,
336 [&](Real * local_ke, const unsigned int ib, const unsigned int ie, const unsigned int j)
337 {
338 for (unsigned int qp = 0; qp < datum.n_qps(); ++qp)
339 for (unsigned int i = ib; i < ie; ++i)
340 local_ke[i] += datum.JxW(qp) * bc.template computeQpOffDiagJacobian<Derived>(
341 i, j, datum.jvar(), qp, datum);
342 });
343}
344
345template <typename Derived>
346KOKKOS_FUNCTION void
348{
350 datum,
351 [&](Real * local_ke, const unsigned int ib, const unsigned int ie, const unsigned int j)
352 {
353 for (unsigned int qp = 0; qp < datum.n_qps(); ++qp)
354 for (unsigned int i = ib; i < ie; ++i)
355 local_ke[i] += datum.JxW(qp) * bc.template computeQpOffDiagJacobianScalar<Derived>(
356 i, j, datum.jvar(), qp, datum);
357 });
358}
359
360} // namespace Moose::Kokkos
KOKKOS_FUNCTION auto kokkosBoundaryElementSideID(Moose::Kokkos::ThreadID tid) const
Get the contiguous element ID - side index pair this Kokkos thread is operating on.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
const InputParameters & parameters() const
Get the parameters of the object.
Definition MooseBase.h:131
The Kokkos object that holds thread-private data in the parallel operations of Kokkos kernels.
KOKKOS_FUNCTION unsigned int jvar() const
Get the coupled variable number.
KOKKOS_FUNCTION const Assembly & kokkosAssembly() const
Get the const reference of the Kokkos assembly.
KOKKOS_FUNCTION Real JxW(const unsigned int qp)
Get the transformed Jacobian weight.
KOKKOS_FUNCTION void set_local_parallel(const unsigned int local_thread_id, const unsigned int num_local_threads)
Set local parallelization option.
KOKKOS_FUNCTION unsigned int n_qps() const
Get the number of local quadrature points.
The base class for Kokkos integrated boundary conditions.
The base class for a user to derive their own Kokkos integrated boundary conditions.
const VariablePhiValue _phi
Current shape function.
KOKKOS_FUNCTION Real computeQpJacobian(const unsigned int, const unsigned int, const unsigned int, AssemblyDatum &) const
Default methods to prevent compile errors even when these methods were not defined in the derived cla...
static auto defaultJacobian()
Functions used to check if users have overriden the hook methods, whose calculations can be skipped w...
static InputParameters validParams()
KOKKOS_FUNCTION Real computeQpOffDiagJacobianScalar(const unsigned int, const unsigned int, const unsigned int, const unsigned int, AssemblyDatum &) const
Compute scalar off-diagonal Jacobian contribution on a quadrature point.
KOKKOS_FUNCTION Real computeQpOffDiagJacobian(const unsigned int, const unsigned int, const unsigned int, const unsigned int, AssemblyDatum &) const
Compute off-diagonal Jacobian contribution on a quadrature point.
KOKKOS_FUNCTION void computeResidualInternal(const Derived &bc, AssemblyDatum &datum) const
The parallel computation bodies that can be customized in the derived class by defining them in the d...
IntegratedBC(const InputParameters &parameters)
Constructor.
static constexpr bool supports_scalar_jacobian
KOKKOS_FUNCTION void operator()(ResidualLoop, const ThreadID tid, const Derived &bc) const
The parallel computation entry functions called by Kokkos.
const VariableGradient _grad_u
Gradient of the current solution at quadrature points.
const VariableValue _u
Current solution at quadrature points.
const VariableTestGradient _grad_test
Gradient of the current test function.
const VariablePhiGradient _grad_phi
Gradient of the current shape function.
KOKKOS_FUNCTION void computeJacobianInternal(const Derived &bc, AssemblyDatum &datum) const
Compute diagonal Jacobian.
const VariableTestValue _test
Current test function.
virtual void computeJacobian() override
Dispatch diagonal and off-diagonal Jacobian calculation.
KOKKOS_FUNCTION void computeOffDiagJacobianScalarInternal(const Derived &bc, AssemblyDatum &datum) const
Compute scalar off-diagonal Jacobian.
KOKKOS_FUNCTION void computeOffDiagJacobianInternal(const Derived &bc, AssemblyDatum &datum) const
Compute off-diagonal Jacobian.
virtual void computeResidual() override
Dispatch residual calculation.
KOKKOS_FUNCTION const Mesh & kokkosMesh() const
Get the const reference of the Kokkos mesh.
Definition KokkosMesh.h:651
Variable _kokkos_var
Kokkos variable.
Thread _thread
Kokkos thread object.
KOKKOS_FUNCTION void computeJacobianInternal(AssemblyDatum &datum, function body) const
The common loop structure template for computing elemental Jacobian.
KOKKOS_FUNCTION void computeResidualInternal(AssemblyDatum &datum, function body) const
The common loop structure template for computing elemental residual.
KOKKOS_FUNCTION thread_id_type size() const
Get the total thread pool size.
The Kokkos wrapper classes for MOOSE-like shape function access.
The Kokkos wrapper classes for MOOSE-like variable value access.
KOKKOS_FUNCTION unsigned int var(unsigned int comp=0) const
Get the variable number of a component.
KOKKOS_FUNCTION unsigned int sys(unsigned int comp=0) const
Get the system number of a component.
MOOSE_KOKKOS_INDEX_TYPE ThreadID