DOLFINx 0.12.0.0
DOLFINx C++
Loading...
Searching...
No Matches
kernel.h
1// Copyright (C) 2025 Paul T. Kühner
2//
3// This file is part of DOLFINx (https://www.fenicsproject.org)
4//
5// SPDX-License-Identifier: LGPL-3.0-or-later
6
7#pragma once
8
9#include <dolfinx/common/defines.h>
10#include <dolfinx/common/types.h>
11#include <ufcx.h>
12
13namespace dolfinx::fem::impl
14{
18template <dolfinx::scalar T, std::floating_point U = scalar_value_t<T>>
19using kernelptr_t = void (*)(T*, const T*, const T*, const U*, const int*,
20 const std::uint8_t*, void*);
21
25template <dolfinx::scalar T, std::floating_point U = scalar_value_t<T>>
26using kernel_t = std::function<void(T*, const T*, const T*, const U*,
27 const int*, const std::uint8_t*, void*)>;
28
34template <dolfinx::scalar T, std::floating_point U = scalar_value_t<T>>
35constexpr kernel_t<T, U> extract_kernel(const ufcx_integral* integral)
36{
37 static_assert(std::is_same_v<U, scalar_value_t<T>>,
38 "UFCx kernels require geometry type U == scalar_value_t<T>.");
39
40 if constexpr (std::is_same_v<T, float>)
41 return integral->tabulate_tensor_float32;
42 else if constexpr (std::is_same_v<T, double>)
43 return integral->tabulate_tensor_float64;
44#ifndef DOLFINX_NO_STDC_COMPLEX_KERNELS
45 else if constexpr (std::is_same_v<T, std::complex<float>>
47 {
48 return reinterpret_cast<kernelptr_t<T, U>>(
49 integral->tabulate_tensor_complex64);
50 }
51 else if constexpr (std::is_same_v<T, std::complex<double>>
53 {
54 return reinterpret_cast<kernelptr_t<T, U>>(
55 integral->tabulate_tensor_complex128);
56 }
57#endif
58 else
59 throw std::runtime_error("Could not extract kernel from ufcx integral.");
60}
61
62} // namespace dolfinx::fem::impl
consteval bool has_complex_ufcx_kernels()
Definition defines.h:109