From 19b1a67ea2632a03da9c82b2ab2bd48a6afba163 Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 16:17:12 -0600 Subject: [PATCH 1/8] Add Kokkos numerics core support --- include/base/libmesh_common.h | 70 ++++++++++---------- include/base/libmesh_device.h | 74 +++++++++++++++++++++ include/include_HEADERS | 2 +- include/libmesh/Makefile.am | 9 ++- include/libmesh_config.h.in | 6 +- include/numerics/tensor_tools.h | 36 +++++------ include/numerics/tensor_value.h | 24 ++++--- include/numerics/type_tensor.h | 110 +++++++++++++++++++------------- include/numerics/type_vector.h | 89 ++++++++++++++++---------- include/numerics/vector_value.h | 16 +++-- 10 files changed, 276 insertions(+), 160 deletions(-) create mode 100644 include/base/libmesh_device.h diff --git a/include/base/libmesh_common.h b/include/base/libmesh_common.h index d907f4a5fe3..77dfbb69f08 100644 --- a/include/base/libmesh_common.h +++ b/include/base/libmesh_common.h @@ -30,6 +30,10 @@ // The library configuration options #include "libmesh/libmesh_config.h" +// Device compilation support — must be included before assert macros +// so that LIBMESH_DEVICE_ASSERT is available for the Kokkos path. +#include "libmesh/libmesh_device.h" + // Use actual timestamps or constant dummies (to aid ccache) #ifdef LIBMESH_ENABLE_TIMESTAMPS # define LIBMESH_TIME __TIME__ @@ -183,33 +187,33 @@ typedef std::complex COMPLEX; // Helper functions for complex/real numbers // to clean up #ifdef LIBMESH_USE_COMPLEX_NUMBERS elsewhere -template inline T libmesh_real(T a) { return a; } -template inline T libmesh_imag(T /*a*/) { return 0; } -template inline T libmesh_conj(T a) { return a; } +template LIBMESH_DEVICE_INLINE T libmesh_real(T a) { return a; } +template LIBMESH_DEVICE_INLINE T libmesh_imag(T /*a*/) { return 0; } +template LIBMESH_DEVICE_INLINE T libmesh_conj(T a) { return a; } template -inline T libmesh_real(std::complex a) { return std::real(a); } +LIBMESH_DEVICE_INLINE T libmesh_real(std::complex a) { return std::real(a); } template -inline T libmesh_imag(std::complex a) { return std::imag(a); } +LIBMESH_DEVICE_INLINE T libmesh_imag(std::complex a) { return std::imag(a); } template -inline std::complex libmesh_conj(std::complex a) { return std::conj(a); } +LIBMESH_DEVICE_INLINE std::complex libmesh_conj(std::complex a) { return std::conj(a); } // std::isnan() is in as of C++11. template -inline bool libmesh_isnan(T x) { return std::isnan(x); } +LIBMESH_DEVICE_INLINE bool libmesh_isnan(T x) { return std::isnan(x); } template -inline bool libmesh_isnan(std::complex a) +LIBMESH_DEVICE_INLINE bool libmesh_isnan(std::complex a) { return (std::isnan(std::real(a)) || std::isnan(std::imag(a))); } // std::isinf() is in as of C++11. template -inline bool libmesh_isinf(T x) { return std::isinf(x); } +LIBMESH_DEVICE_INLINE bool libmesh_isinf(T x) { return std::isinf(x); } template -inline bool libmesh_isinf(std::complex a) +LIBMESH_DEVICE_INLINE bool libmesh_isinf(std::complex a) { return (std::isinf(std::real(a)) || std::isinf(std::imag(a))); } // Define the value type for unknowns in simulations. @@ -287,7 +291,13 @@ extern bool warned_about_auto_ptr; #endif // The libmesh_assert() macro acts like C's assert(), but throws a -// libmesh_error() (including stack trace, etc) instead of just exiting +// libmesh_error() (including stack trace, etc) instead of just exiting. +// +// In .K translation units (LIBMESH_KOKKOS_COMPILATION defined), +// LIBMESH_DEVICE_ASSERT is provided by libmesh_device.h using +// printf + Kokkos::abort() — device-safe across CUDA/HIP/SYCL. +// The assert macros delegate to it so that both host and device +// code in the same file get assertion checking. #ifdef NDEBUG #define libmesh_assert_msg(asserted, msg) ((void) 0) @@ -299,6 +309,18 @@ extern bool warned_about_auto_ptr; #define libmesh_assert_less_equal_msg(expr1,expr2, msg) ((void) 0) #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) ((void) 0) +#elif defined(LIBMESH_DEVICE_ASSERT) + +// Kokkos compilation: use the device-safe assert from libmesh_device.h. +#define libmesh_assert_msg(asserted, msg) LIBMESH_DEVICE_ASSERT(asserted) +#define libmesh_exceptionless_assert_msg(asserted, msg) LIBMESH_DEVICE_ASSERT(asserted) +#define libmesh_assert_equal_to_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) == (expr2)) +#define libmesh_assert_not_equal_to_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) != (expr2)) +#define libmesh_assert_less_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) < (expr2)) +#define libmesh_assert_greater_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) > (expr2)) +#define libmesh_assert_less_equal_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) <= (expr2)) +#define libmesh_assert_greater_equal_msg(expr1,expr2, msg) LIBMESH_DEVICE_ASSERT((expr1) >= (expr2)) + #else #define libmesh_assertion_types(expr1,expr2) \ @@ -649,32 +671,6 @@ inline Tnew libmesh_cast_int (Told oldvar) return cast_int(oldvar); } - -/** - * restrict_int checks that the value of the castee is within the - * bounds which are exactly representable by the output type, even in - * optimized modes. - * - * Use this cast when you suspect that the input may not succeed in - * correct code (e.g. when an input file is being read from a format - * that may allow wider integer types than the current libMesh - * configuration). - */ -template -inline Tnew restrict_int (Told oldvar) -{ - if constexpr (!std::is_same_v) - { - const Tnew returnval = static_cast(oldvar); - - libmesh_error_msg_if (oldvar != static_cast(returnval), - "restrict_int failed: " << oldvar << " does not fit in type " << typeid(returnval).name()); - } - - return oldvar; -} - - /** * This is a helper variable template for cases when we want to use a default compile-time * error with constexpr-based if conditions. The templating delays the triggering diff --git a/include/base/libmesh_device.h b/include/base/libmesh_device.h new file mode 100644 index 00000000000..f41d4c70b01 --- /dev/null +++ b/include/base/libmesh_device.h @@ -0,0 +1,74 @@ +// The libMesh Finite Element Library. +// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner + +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#ifndef LIBMESH_LIBMESH_DEVICE_H +#define LIBMESH_LIBMESH_DEVICE_H + +// Defines LIBMESH_DEVICE_INLINE, mirroring MetaPhysicL's METAPHYSICL_INLINE +// pattern (metaphysicl_device.h / METAPHYSICL_KOKKOS_COMPILATION). +// +// When compiling a .K translation unit (LIBMESH_KOKKOS_COMPILATION is defined +// by kokkos.mk), this expands to KOKKOS_INLINE_FUNCTION so that annotated +// methods are callable from both host and device code. In all other +// translation units it expands to plain `inline`. +#ifdef LIBMESH_KOKKOS_COMPILATION +# include +# include +# define LIBMESH_DEVICE_INLINE KOKKOS_INLINE_FUNCTION + +// Backend-neutral device-code detection for Kokkos .K translation units. +// This lets error/exception plumbing share a single predicate instead of +// hardcoding per-backend checks in multiple headers. +# if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) || defined(__SYCL_DEVICE_ONLY__) +# define LIBMESH_IN_DEVICE_CODE 1 +# else +# define LIBMESH_IN_DEVICE_CODE 0 +# endif + +// Device-safe assert: uses printf (supported on CUDA/HIP) and +// Kokkos::abort() for backend-portable device termination. +// Defined here (not in libmesh_common.h) because Kokkos headers +// are only available in .K translation units. +# ifndef NDEBUG +# define LIBMESH_DEVICE_ASSERT(asserted) \ + do { if (!(asserted)) { \ + printf("libMesh assert failed: %s, file %s, line %d\n", \ + #asserted, __FILE__, __LINE__); \ + ::Kokkos::abort("libmesh_assert failed"); \ + } } while (0) +# else +# define LIBMESH_DEVICE_ASSERT(asserted) ((void) 0) +# endif + +# define LIBMESH_DEVICE_ERROR_MSG(msg) \ + do { \ + printf("libMesh error: %s, file %s, line %d\n", \ + msg, __FILE__, __LINE__); \ + ::Kokkos::abort(msg); \ + } while (0) + +# define LIBMESH_DEVICE_ERROR_MSG_IF(cond, msg) \ + do { if (cond) { LIBMESH_DEVICE_ERROR_MSG(msg); } } while (0) + +#else +# define LIBMESH_DEVICE_INLINE inline +# define LIBMESH_IN_DEVICE_CODE 0 +# define LIBMESH_DEVICE_ERROR_MSG(msg) libmesh_error_msg(msg) +# define LIBMESH_DEVICE_ERROR_MSG_IF(cond, msg) libmesh_error_msg_if(cond, msg) +#endif + +#endif // LIBMESH_LIBMESH_DEVICE_H diff --git a/include/include_HEADERS b/include/include_HEADERS index 115b473ba2e..8d980280d31 100644 --- a/include/include_HEADERS +++ b/include/include_HEADERS @@ -28,6 +28,7 @@ include_HEADERS = \ base/libmesh_abort.h \ base/libmesh_base.h \ base/libmesh_common.h \ + base/libmesh_device.h \ base/libmesh_documentation.h \ base/libmesh_exceptions.h \ base/libmesh_logging.h \ @@ -322,7 +323,6 @@ include_HEADERS = \ parallel/threads_allocators.h \ parallel/threads_none.h \ parallel/threads_pthread.h \ - parallel/threads_spin_mutex_forward.h \ parallel/threads_tbb.h \ partitioning/centroid_partitioner.h \ partitioning/hilbert_sfc_partitioner.h \ diff --git a/include/libmesh/Makefile.am b/include/libmesh/Makefile.am index 7b8880c3a42..f6010488ff0 100644 --- a/include/libmesh/Makefile.am +++ b/include/libmesh/Makefile.am @@ -19,6 +19,7 @@ BUILT_SOURCES = \ libmesh_augment_std_namespace.h \ libmesh_base.h \ libmesh_common.h \ + libmesh_device.h \ libmesh_documentation.h \ libmesh_exceptions.h \ libmesh_logging.h \ @@ -317,7 +318,6 @@ BUILT_SOURCES = \ threads_allocators.h \ threads_none.h \ threads_pthread.h \ - threads_spin_mutex_forward.h \ threads_tbb.h \ centroid_partitioner.h \ hilbert_sfc_partitioner.h \ @@ -657,6 +657,9 @@ libmesh_base.h: $(top_srcdir)/include/base/libmesh_base.h libmesh_common.h: $(top_srcdir)/include/base/libmesh_common.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ +libmesh_device.h: $(top_srcdir)/include/base/libmesh_device.h + $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ + libmesh_documentation.h: $(top_srcdir)/include/base/libmesh_documentation.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ @@ -1551,9 +1554,6 @@ threads_none.h: $(top_srcdir)/include/parallel/threads_none.h threads_pthread.h: $(top_srcdir)/include/parallel/threads_pthread.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ -threads_spin_mutex_forward.h: $(top_srcdir)/include/parallel/threads_spin_mutex_forward.h - $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ - threads_tbb.h: $(top_srcdir)/include/parallel/threads_tbb.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ @@ -2138,4 +2138,3 @@ xdr_cxx.h: $(top_srcdir)/include/utils/xdr_cxx.h parallel_communicator_specializations: $(top_srcdir)/include/timpi_shims/parallel_communicator_specializations $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ - diff --git a/include/libmesh_config.h.in b/include/libmesh_config.h.in index 9adaa9efe05..62256949fed 100644 --- a/include/libmesh_config.h.in +++ b/include/libmesh_config.h.in @@ -434,6 +434,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define if Kokkos support is enabled in libMesh */ +#undef HAVE_KOKKOS + /* Flag indicating whether the library will be compiled with LASPACK support */ #undef HAVE_LASPACK @@ -485,9 +488,6 @@ annotations */ #undef HAVE_NVTX_API -/* Defined if the installed TBB is oneTBB (>= 2021) */ -#undef HAVE_ONETBB - /* Define if OpenMP is enabled */ #undef HAVE_OPENMP diff --git a/include/numerics/tensor_tools.h b/include/numerics/tensor_tools.h index 7617116f10d..f183380a84d 100644 --- a/include/numerics/tensor_tools.h +++ b/include/numerics/tensor_tools.h @@ -45,92 +45,92 @@ namespace TensorTools // Vector specializations will follow. template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if::value && ScalarTraits::value, typename CompareTypes::supertype>::type inner_product(const T & a, const T2& b) { return a * b; } template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype inner_product(const TypeVector & a, const TypeVector & b) { return a * b; } template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype inner_product(const TypeTensor & a, const TypeTensor & b) { return a.contract(b); } template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype inner_product(const TypeNTensor & a, const TypeNTensor & b) { return a.contract(b); } template -inline +LIBMESH_DEVICE_INLINE auto norm(const T & a) { using std::abs; return abs(a); } template -inline +LIBMESH_DEVICE_INLINE T norm(std::complex a) { using std::abs; return abs(a); } template -inline +LIBMESH_DEVICE_INLINE auto norm(const TypeVector & a) -> decltype(TensorTools::norm(T())) {using std::sqrt; return sqrt(a.norm_sq());} template -inline +LIBMESH_DEVICE_INLINE auto norm(const VectorValue & a) -> decltype(TensorTools::norm(T())) {using std::sqrt; return sqrt(a.norm_sq());} template -inline +LIBMESH_DEVICE_INLINE auto norm(const TypeTensor & a) -> decltype(TensorTools::norm(T())) {using std::sqrt; return sqrt(a.norm_sq());} template -inline +LIBMESH_DEVICE_INLINE auto norm(const TensorValue & a) -> decltype(TensorTools::norm(T())) {using std::sqrt; return sqrt(a.norm_sq());} template -inline +LIBMESH_DEVICE_INLINE auto norm_sq(const T & a) -{ using std::norm; return norm(a); } +{ return a * libmesh_conj(a); } template -inline +LIBMESH_DEVICE_INLINE T norm_sq(std::complex a) { using std::norm; return norm(a); } template -inline +LIBMESH_DEVICE_INLINE auto norm_sq(const TypeVector & a) {return a.norm_sq();} template -inline +LIBMESH_DEVICE_INLINE auto norm_sq(const VectorValue & a) {return a.norm_sq();} template -inline +LIBMESH_DEVICE_INLINE auto norm_sq(const TypeTensor & a) {return a.norm_sq();} template -inline +LIBMESH_DEVICE_INLINE auto norm_sq(const TensorValue & a) {return a.norm_sq();} template -inline +LIBMESH_DEVICE_INLINE bool is_zero(const T & a){ return a.is_zero();} // Any tensor-rank-independent code will need to include diff --git a/include/numerics/tensor_value.h b/include/numerics/tensor_value.h index 3a0d680476d..c99e0cac003 100644 --- a/include/numerics/tensor_value.h +++ b/include/numerics/tensor_value.h @@ -22,6 +22,7 @@ // Local includes #include "libmesh/type_tensor.h" +#include "libmesh/libmesh_device.h" #include "libmesh/libmesh.h" // for pi #ifdef LIBMESH_HAVE_METAPHYSICL @@ -93,12 +94,14 @@ class TensorValue : public TypeTensor * Constructor. Takes 1 row vector for LIBMESH_DIM=1 */ template + LIBMESH_DEVICE_INLINE TensorValue (const TypeVector & vx); /** * Constructor. Takes 2 row vectors for LIBMESH_DIM=2 */ template + LIBMESH_DEVICE_INLINE TensorValue (const TypeVector & vx, const TypeVector & vy); @@ -106,6 +109,7 @@ class TensorValue : public TypeTensor * Constructor. Takes 3 row vectors for LIBMESH_DIM=3 */ template + LIBMESH_DEVICE_INLINE TensorValue (const TypeVector & vx, const TypeVector & vy, const TypeVector & vz); @@ -134,11 +138,11 @@ class TensorValue : public TypeTensor const TypeTensor & p_im); #endif - /** * Assignment-from-scalar operator. Used only to zero out tensors. */ template + LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TensorValue &>::type @@ -211,7 +215,7 @@ typedef NumberTensorValue Tensor; //------------------------------------------------------ // Inline functions template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue () : TypeTensor () { @@ -220,7 +224,7 @@ TensorValue::TensorValue () : template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const T & xx, const T & xy, const T & xz, @@ -237,7 +241,7 @@ TensorValue::TensorValue (const T & xx, template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const Scalar & xx, const Scalar & xy, const Scalar & xz, @@ -257,7 +261,7 @@ TensorValue::TensorValue (const Scalar & xx, template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TensorValue & p) : TypeTensor (p) { @@ -267,7 +271,7 @@ TensorValue::TensorValue (const TensorValue & p) : template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TypeVector & vx) : TypeTensor (vx) { @@ -277,7 +281,7 @@ TensorValue::TensorValue (const TypeVector & vx) : template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TypeVector & vx, const TypeVector & vy) : TypeTensor (vx, vy) @@ -288,7 +292,7 @@ TensorValue::TensorValue (const TypeVector & vx, template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TypeVector & vx, const TypeVector & vy, const TypeVector & vz) : @@ -300,7 +304,7 @@ TensorValue::TensorValue (const TypeVector & vx, template template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TypeTensor & p) : TypeTensor (p) { @@ -309,7 +313,7 @@ TensorValue::TensorValue (const TypeTensor & p) : #ifdef LIBMESH_USE_COMPLEX_NUMBERS template -inline +LIBMESH_DEVICE_INLINE TensorValue::TensorValue (const TypeTensor & p_re, const TypeTensor & p_im) : TypeTensor (Complex (p_re(0,0), p_im(0,0)), diff --git a/include/numerics/type_tensor.h b/include/numerics/type_tensor.h index 470b745f120..ac6dc145428 100644 --- a/include/numerics/type_tensor.h +++ b/include/numerics/type_tensor.h @@ -22,6 +22,7 @@ // Local includes #include "libmesh/libmesh_common.h" +#include "libmesh/libmesh_device.h" #include "libmesh/type_vector.h" // C++ includes @@ -101,13 +102,16 @@ class TypeTensor * many vectors are needed. */ template + LIBMESH_DEVICE_INLINE TypeTensor(const TypeVector & vx); template + LIBMESH_DEVICE_INLINE TypeTensor(const TypeVector & vx, const TypeVector & vy); template + LIBMESH_DEVICE_INLINE TypeTensor(const TypeVector & vx, const TypeVector & vy, const TypeVector & vz); @@ -133,12 +137,14 @@ class TypeTensor /** * Destructor. */ + LIBMESH_DEVICE_INLINE ~TypeTensor(); /** * Assign to this tensor without creating a temporary. */ template + LIBMESH_DEVICE_INLINE void assign (const TypeTensor &); /** @@ -147,6 +153,7 @@ class TypeTensor * \returns A reference to *this. */ template + LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeTensor &>::type @@ -166,11 +173,13 @@ class TypeTensor /** * \returns A proxy for the \f$ i^{th} \f$ column of the tensor. */ + LIBMESH_DEVICE_INLINE ConstTypeTensorColumn slice (const unsigned int i) const; /** * \returns A writable proxy for the \f$ i^{th} \f$ column of the tensor. */ + LIBMESH_DEVICE_INLINE TypeTensorColumn slice (const unsigned int i); /** @@ -181,6 +190,7 @@ class TypeTensor /** * \returns A copy of one column of the tensor as a TypeVector. */ + LIBMESH_DEVICE_INLINE TypeVector column(const unsigned int r) const; /** @@ -210,6 +220,7 @@ class TypeTensor * Add a scaled tensor to this tensor without creating a temporary. */ template + LIBMESH_DEVICE_INLINE void add_scaled (const TypeTensor &, const T &); /** @@ -240,6 +251,7 @@ class TypeTensor * temporary. */ template + LIBMESH_DEVICE_INLINE void subtract_scaled (const TypeTensor &, const T &); /** @@ -265,6 +277,7 @@ class TypeTensor */ template ::value, int>::type = 0> + LIBMESH_DEVICE_INLINE const TypeTensor & operator *= (const Scalar & factor) { for (unsigned int i=0; i + LIBMESH_DEVICE_INLINE typename CompareTypes::supertype contract (const TypeTensor &) const; @@ -339,6 +353,7 @@ class TypeTensor * \returns A copy of the result vector, this tensor is unchanged. */ template + LIBMESH_DEVICE_INLINE TypeVector::supertype> left_multiply (const TypeVector & p) const; @@ -358,6 +373,7 @@ class TypeTensor * * \returns The solution in the \p x vector. */ + LIBMESH_DEVICE_INLINE void solve(const TypeVector & b, TypeVector & x) const; /** @@ -375,6 +391,7 @@ class TypeTensor /** * \returns True if all values in the tensor are zero */ + LIBMESH_DEVICE_INLINE bool is_zero() const; /** @@ -393,11 +410,13 @@ class TypeTensor /** * Set all entries of the tensor to 0. */ + LIBMESH_DEVICE_INLINE void zero(); /** * \returns \p true if two tensors are equal, \p false otherwise. */ + LIBMESH_DEVICE_INLINE bool operator == (const TypeTensor & rhs) const; /** @@ -513,7 +532,7 @@ class ConstTypeTensorColumn //------------------------------------------------------ // Inline functions template -inline +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor () { _coords[0] = {}; @@ -536,7 +555,7 @@ TypeTensor::TypeTensor () template -inline +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor (const T & xx, const T & xy, const T & xz, @@ -582,7 +601,7 @@ TypeTensor::TypeTensor (const T & xx, template template -inline +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor (const Scalar & xx, const Scalar & xy, const Scalar & xz, @@ -631,7 +650,7 @@ TypeTensor::TypeTensor (const Scalar & xx, template template -inline +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor (const TypeTensor & p) { // copy the nodes from vector p to me @@ -642,6 +661,7 @@ TypeTensor::TypeTensor (const TypeTensor & p) template template +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor(const TypeVector & vx) { libmesh_assert_equal_to (LIBMESH_DIM, 1); @@ -650,6 +670,7 @@ TypeTensor::TypeTensor(const TypeVector & vx) template template +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor(const TypeVector & vx, const TypeVector & vy) { @@ -666,6 +687,7 @@ TypeTensor::TypeTensor(const TypeVector & vx, template template +LIBMESH_DEVICE_INLINE TypeTensor::TypeTensor(const TypeVector & vx, const TypeVector & vy, const TypeVector & vz) @@ -690,7 +712,7 @@ TypeTensor::TypeTensor(const TypeVector & vx, template -inline +LIBMESH_DEVICE_INLINE TypeTensor::~TypeTensor () { } @@ -699,7 +721,7 @@ TypeTensor::~TypeTensor () template template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::assign (const TypeTensor & p) { for (unsigned int i=0; i::assign (const TypeTensor & p) template -inline +LIBMESH_DEVICE_INLINE const T & TypeTensor::operator () (const unsigned int i, const unsigned int j) const { @@ -728,14 +750,14 @@ const T & TypeTensor::operator () (const unsigned int i, template -inline +LIBMESH_DEVICE_INLINE T & TypeTensor::operator () (const unsigned int i, const unsigned int j) { #if LIBMESH_DIM < 3 - libmesh_error_msg_if(i >= LIBMESH_DIM || j >= LIBMESH_DIM, - "ERROR: You are assigning to a tensor component that is out of range for the compiled LIBMESH_DIM!"); + LIBMESH_DEVICE_ERROR_MSG_IF(i >= LIBMESH_DIM || j >= LIBMESH_DIM, + "ERROR: You are assigning to a tensor component that is out of range for the compiled LIBMESH_DIM!"); #endif @@ -747,7 +769,7 @@ T & TypeTensor::operator () (const unsigned int i, template -inline +LIBMESH_DEVICE_INLINE ConstTypeTensorColumn TypeTensor::slice (const unsigned int i) const { @@ -757,7 +779,7 @@ TypeTensor::slice (const unsigned int i) const template -inline +LIBMESH_DEVICE_INLINE TypeTensorColumn TypeTensor::slice (const unsigned int i) { @@ -767,7 +789,7 @@ TypeTensor::slice (const unsigned int i) template -inline +LIBMESH_DEVICE_INLINE TypeVector TypeTensor::row(const unsigned int r) const { @@ -781,7 +803,7 @@ TypeTensor::row(const unsigned int r) const template -inline +LIBMESH_DEVICE_INLINE TypeVector TypeTensor::column(const unsigned int r) const { @@ -796,7 +818,7 @@ TypeTensor::column(const unsigned int r) const template template -inline +LIBMESH_DEVICE_INLINE TypeTensor::supertype> TypeTensor::operator + (const TypeTensor & p) const { @@ -831,7 +853,7 @@ TypeTensor::operator + (const TypeTensor & p) const template template -inline +LIBMESH_DEVICE_INLINE const TypeTensor & TypeTensor::operator += (const TypeTensor & p) { this->add (p); @@ -843,7 +865,7 @@ const TypeTensor & TypeTensor::operator += (const TypeTensor & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::add (const TypeTensor & p) { for (unsigned int i=0; i::add (const TypeTensor & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::add_scaled (const TypeTensor & p, const T & factor) { for (unsigned int i=0; i::add_scaled (const TypeTensor & p, const T & factor) template template -inline +LIBMESH_DEVICE_INLINE TypeTensor::supertype> TypeTensor::operator - (const TypeTensor & p) const { @@ -901,7 +923,7 @@ TypeTensor::operator - (const TypeTensor & p) const template template -inline +LIBMESH_DEVICE_INLINE const TypeTensor & TypeTensor::operator -= (const TypeTensor & p) { this->subtract (p); @@ -913,7 +935,7 @@ const TypeTensor & TypeTensor::operator -= (const TypeTensor & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::subtract (const TypeTensor & p) { for (unsigned int i=0; i::subtract (const TypeTensor & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::subtract_scaled (const TypeTensor & p, const T & factor) { for (unsigned int i=0; i::subtract_scaled (const TypeTensor & p, const T & factor) template -inline +LIBMESH_DEVICE_INLINE TypeTensor TypeTensor::operator - () const { @@ -967,7 +989,7 @@ TypeTensor TypeTensor::operator - () const template template -inline +LIBMESH_DEVICE_INLINE auto TypeTensor::operator * (const Scalar & factor) const -> typename std::enable_if< ScalarTraits::value, @@ -1003,7 +1025,7 @@ TypeTensor::operator * (const Scalar & factor) const -> typename std::enable_ template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeTensor::supertype>>::type @@ -1015,7 +1037,7 @@ operator * (const Scalar & factor, template template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeTensor::supertype>>::type @@ -1053,7 +1075,7 @@ TypeTensor::operator / (const Scalar & factor) const template -inline +LIBMESH_DEVICE_INLINE TypeTensor TypeTensor::transpose() const { #if LIBMESH_DIM == 1 @@ -1083,7 +1105,7 @@ TypeTensor TypeTensor::transpose() const template -inline +LIBMESH_DEVICE_INLINE TypeTensor TypeTensor::inverse() const { #if LIBMESH_DIM == 1 @@ -1132,7 +1154,7 @@ TypeTensor TypeTensor::inverse() const template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::solve(const TypeVector & b, TypeVector & x) const { #if LIBMESH_DIM == 1 @@ -1183,7 +1205,7 @@ void TypeTensor::solve(const TypeVector & b, TypeVector & x) const template -inline +LIBMESH_DEVICE_INLINE const TypeTensor & TypeTensor::operator /= (const T & factor) { libmesh_assert_not_equal_to (factor, static_cast(0.)); @@ -1199,7 +1221,7 @@ const TypeTensor & TypeTensor::operator /= (const T & factor) template template -inline +LIBMESH_DEVICE_INLINE TypeVector::supertype> TypeTensor::operator * (const TypeVector & p) const { @@ -1213,7 +1235,7 @@ TypeTensor::operator * (const TypeVector & p) const template template -inline +LIBMESH_DEVICE_INLINE TypeVector::supertype> TypeTensor::left_multiply (const TypeVector & p) const { @@ -1226,7 +1248,7 @@ TypeTensor::left_multiply (const TypeVector & p) const } template -inline +LIBMESH_DEVICE_INLINE TypeVector::supertype> operator * (const TypeVector & a, const TypeTensor & b) { @@ -1235,7 +1257,7 @@ operator * (const TypeVector & a, const TypeTensor & b) template template -inline +LIBMESH_DEVICE_INLINE TypeTensor::supertype> TypeTensor::operator * (const TypeTensor & p) const { @@ -1250,7 +1272,7 @@ TypeTensor::operator * (const TypeTensor & p) const template template -inline +LIBMESH_DEVICE_INLINE const TypeTensor & TypeTensor::operator *= (const TypeTensor & p) { TypeTensor temp; @@ -1270,7 +1292,7 @@ const TypeTensor & TypeTensor::operator *= (const TypeTensor & p) */ template template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype TypeTensor::contract (const TypeTensor & t) const { @@ -1283,7 +1305,7 @@ TypeTensor::contract (const TypeTensor & t) const template -inline +LIBMESH_DEVICE_INLINE auto TypeTensor::norm() const { using std::sqrt; @@ -1292,7 +1314,7 @@ auto TypeTensor::norm() const template -inline +LIBMESH_DEVICE_INLINE bool TypeTensor::is_zero() const { for (const auto & val : _coords) @@ -1302,7 +1324,7 @@ bool TypeTensor::is_zero() const } template -inline +LIBMESH_DEVICE_INLINE T TypeTensor::det() const { #if LIBMESH_DIM == 1 @@ -1325,7 +1347,7 @@ T TypeTensor::det() const } template -inline +LIBMESH_DEVICE_INLINE T TypeTensor::tr() const { #if LIBMESH_DIM == 1 @@ -1342,7 +1364,7 @@ T TypeTensor::tr() const } template -inline +LIBMESH_DEVICE_INLINE void TypeTensor::zero() { for (unsigned int i=0; i::zero() template -inline +LIBMESH_DEVICE_INLINE auto TypeTensor::norm_sq () const { Real sum = 0.; @@ -1364,7 +1386,7 @@ auto TypeTensor::norm_sq () const template -inline +LIBMESH_DEVICE_INLINE bool TypeTensor::operator == (const TypeTensor & rhs) const { #if LIBMESH_DIM == 1 @@ -1436,7 +1458,7 @@ void TypeTensor::print(std::ostream & os) const } template -inline +LIBMESH_DEVICE_INLINE TypeTensor::supertype> outer_product(const TypeVector & a, const TypeVector & b) { diff --git a/include/numerics/type_vector.h b/include/numerics/type_vector.h index aaf79a9fd22..a9ae1bb2518 100644 --- a/include/numerics/type_vector.h +++ b/include/numerics/type_vector.h @@ -22,6 +22,7 @@ // Local includes #include "libmesh/libmesh_common.h" +#include "libmesh/libmesh_device.h" #include "libmesh/compare_types.h" #include "libmesh/tensor_tools.h" #include "libmesh/int_range.h" @@ -141,12 +142,14 @@ class TypeVector * Assign to this vector without creating a temporary. */ template + LIBMESH_DEVICE_INLINE void assign (const TypeVector &); /** * Assignment-from-scalar operator. Used only to zero out vectors. */ template + LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeVector &>::type @@ -157,12 +160,14 @@ class TypeVector * \returns A const reference to the \f$ i^{th} \f$ entry of the vector. */ const T & operator () (const unsigned int i) const; + LIBMESH_DEVICE_INLINE const T & slice (const unsigned int i) const { return (*this)(i); } /** * \returns A writable reference to the \f$ i^{th} \f$ entry of the vector. */ T & operator () (const unsigned int i); + LIBMESH_DEVICE_INLINE T & slice (const unsigned int i) { return (*this)(i); } /** @@ -192,6 +197,7 @@ class TypeVector * Add a scaled value to this vector without creating a temporary. */ template + LIBMESH_DEVICE_INLINE void add_scaled (const TypeVector &, const T &); /** @@ -222,6 +228,7 @@ class TypeVector * temporary. */ template + LIBMESH_DEVICE_INLINE void subtract_scaled (const TypeVector &, const T &); /** @@ -279,6 +286,7 @@ class TypeVector * \returns The result of TypeVector::operator*(). */ template + LIBMESH_DEVICE_INLINE typename CompareTypes::supertype contract (const TypeVector &) const; @@ -292,6 +300,7 @@ class TypeVector /** * \returns A unit vector in the direction of *this. */ + LIBMESH_DEVICE_INLINE TypeVector unit() const; /** @@ -309,16 +318,19 @@ class TypeVector /** * \returns The L1 norm of the vector */ + LIBMESH_DEVICE_INLINE auto l1_norm() const; /** * \returns True if all values in the vector are zero */ + LIBMESH_DEVICE_INLINE bool is_zero() const; /** * Set all entries of the vector to 0. */ + LIBMESH_DEVICE_INLINE void zero(); /** @@ -342,11 +354,13 @@ class TypeVector * \note For floating point types T, the function \p absolute_fuzzy_equals() * may be a more appropriate choice. */ + LIBMESH_DEVICE_INLINE bool operator == (const TypeVector & rhs) const; /** * \returns !(*this == rhs) */ + LIBMESH_DEVICE_INLINE bool operator != (const TypeVector & rhs) const; /** @@ -425,7 +439,7 @@ class TypeVector // Inline functions template -inline +LIBMESH_DEVICE_INLINE TypeVector::TypeVector () { _coords[0] = {}; @@ -442,7 +456,7 @@ TypeVector::TypeVector () template -inline +LIBMESH_DEVICE_INLINE TypeVector::TypeVector (const T & x, const T & y, const T & z) @@ -467,7 +481,7 @@ TypeVector::TypeVector (const T & x, template template -inline +LIBMESH_DEVICE_INLINE TypeVector::TypeVector (typename std::enable_if::value, const Scalar1>::type & x, @@ -497,7 +511,7 @@ TypeVector::TypeVector (typename template template -inline +LIBMESH_DEVICE_INLINE TypeVector::TypeVector (const Scalar & x, typename std::enable_if::value, @@ -518,7 +532,7 @@ TypeVector::TypeVector (const Scalar & x, template template -inline +LIBMESH_DEVICE_INLINE TypeVector::TypeVector (const TypeVector & p) { // copy the nodes from vector p to me @@ -530,7 +544,7 @@ TypeVector::TypeVector (const TypeVector & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeVector::assign (const TypeVector & p) { for (unsigned int i=0; i::assign (const TypeVector & p) template -inline +LIBMESH_DEVICE_INLINE const T & TypeVector::operator () (const unsigned int i) const { libmesh_assert_less (i, LIBMESH_DIM); @@ -551,7 +565,7 @@ const T & TypeVector::operator () (const unsigned int i) const template -inline +LIBMESH_DEVICE_INLINE T & TypeVector::operator () (const unsigned int i) { libmesh_assert_less (i, LIBMESH_DIM); @@ -563,7 +577,7 @@ T & TypeVector::operator () (const unsigned int i) template template -inline +LIBMESH_DEVICE_INLINE TypeVector::supertype> TypeVector::operator + (const TypeVector & p) const { @@ -589,7 +603,7 @@ TypeVector::operator + (const TypeVector & p) const template template -inline +LIBMESH_DEVICE_INLINE const TypeVector & TypeVector::operator += (const TypeVector & p) { this->add (p); @@ -601,7 +615,7 @@ const TypeVector & TypeVector::operator += (const TypeVector & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeVector::add (const TypeVector & p) { #if LIBMESH_DIM == 1 @@ -625,7 +639,7 @@ void TypeVector::add (const TypeVector & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeVector::add_scaled (const TypeVector & p, const T & factor) { #if LIBMESH_DIM == 1 @@ -649,7 +663,7 @@ void TypeVector::add_scaled (const TypeVector & p, const T & factor) template template -inline +LIBMESH_DEVICE_INLINE TypeVector::supertype> TypeVector::operator - (const TypeVector & p) const { @@ -676,7 +690,7 @@ TypeVector::operator - (const TypeVector & p) const template template -inline +LIBMESH_DEVICE_INLINE const TypeVector & TypeVector::operator -= (const TypeVector & p) { this->subtract (p); @@ -688,7 +702,7 @@ const TypeVector & TypeVector::operator -= (const TypeVector & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeVector::subtract (const TypeVector & p) { for (unsigned int i=0; i::subtract (const TypeVector & p) template template -inline +LIBMESH_DEVICE_INLINE void TypeVector::subtract_scaled (const TypeVector & p, const T & factor) { for (unsigned int i=0; i::subtract_scaled (const TypeVector & p, const T & factor) template -inline +LIBMESH_DEVICE_INLINE TypeVector TypeVector::operator - () const { @@ -734,7 +748,7 @@ TypeVector TypeVector::operator - () const template template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeVector::supertype>>::type @@ -761,7 +775,7 @@ TypeVector::operator * (const Scalar & factor) const template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeVector::supertype>>::type @@ -774,7 +788,7 @@ operator * (const Scalar & factor, template -inline +LIBMESH_DEVICE_INLINE const TypeVector & TypeVector::operator *= (const T & factor) { #if LIBMESH_DIM == 1 @@ -799,7 +813,7 @@ const TypeVector & TypeVector::operator *= (const T & factor) template template -inline +LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, TypeVector::supertype>>::type @@ -830,7 +844,7 @@ TypeVector::operator / (const Scalar & factor) const template -inline +LIBMESH_DEVICE_INLINE const TypeVector & TypeVector::operator /= (const T & factor) { @@ -847,7 +861,7 @@ TypeVector::operator /= (const T & factor) template template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype TypeVector::operator * (const TypeVector & p) const { @@ -869,7 +883,7 @@ TypeVector::operator * (const TypeVector & p) const template template -inline +LIBMESH_DEVICE_INLINE typename CompareTypes::supertype TypeVector::contract(const TypeVector & p) const { @@ -880,6 +894,7 @@ TypeVector::contract(const TypeVector & p) const template template +LIBMESH_DEVICE_INLINE TypeVector::supertype> TypeVector::cross(const TypeVector & p) const { @@ -903,7 +918,7 @@ TypeVector::cross(const TypeVector & p) const template -inline +LIBMESH_DEVICE_INLINE auto TypeVector::norm() const { using std::sqrt; @@ -913,7 +928,7 @@ auto TypeVector::norm() const template -inline +LIBMESH_DEVICE_INLINE void TypeVector::zero() { for (unsigned int i=0; i::zero() template -inline +LIBMESH_DEVICE_INLINE auto TypeVector::norm_sq() const { #if LIBMESH_DIM == 1 @@ -944,7 +959,7 @@ auto TypeVector::norm_sq() const template -inline +LIBMESH_DEVICE_INLINE bool TypeVector::is_zero() const { for (const auto & val : _coords) @@ -958,6 +973,7 @@ auto TypeVector::l1_norm() const; template +LIBMESH_DEVICE_INLINE auto TypeVector::l1_norm() const { @@ -988,7 +1004,7 @@ bool TypeVector::relative_fuzzy_equals(const TypeVector & rhs, Real tol) c template -inline +LIBMESH_DEVICE_INLINE bool TypeVector::operator == (const TypeVector & rhs) const { #if LIBMESH_DIM == 1 @@ -1010,7 +1026,7 @@ bool TypeVector::operator == (const TypeVector & rhs) const template -inline +LIBMESH_DEVICE_INLINE bool TypeVector::operator != (const TypeVector & rhs) const { return (!(*this == rhs)); @@ -1027,7 +1043,7 @@ bool TypeVector::operator != (const TypeVector & rhs) const // [b0, b1, b2] // [c0, c1, c2] template -inline +LIBMESH_DEVICE_INLINE T triple_product(const TypeVector & a, const TypeVector & b, const TypeVector & c) @@ -1049,7 +1065,7 @@ T triple_product(const TypeVector & a, // to be positive if the vectors are obey the right-hand rule, or // negative for a left-hand orientation. template -inline +LIBMESH_DEVICE_INLINE T solid_angle(const TypeVector & v01, const TypeVector & v02, const TypeVector & v03) @@ -1075,7 +1091,7 @@ T solid_angle(const TypeVector & v01, * calling b.cross(c).norm_sq(). */ template -inline +LIBMESH_DEVICE_INLINE T cross_norm_sq(const TypeVector & b, const TypeVector & c) { @@ -1096,7 +1112,7 @@ T cross_norm_sq(const TypeVector & b, * Calls cross_norm_sq() and takes the square root of the result. */ template -inline +LIBMESH_DEVICE_INLINE T cross_norm(const TypeVector & b, const TypeVector & c) { @@ -1105,7 +1121,7 @@ T cross_norm(const TypeVector & b, } template -inline +LIBMESH_DEVICE_INLINE TypeVector TypeVector::unit() const { @@ -1167,6 +1183,7 @@ struct CompareTypes, TypeVector> }; template ::value, int>::type = 0> +LIBMESH_DEVICE_INLINE TypeVector::supertype> outer_product(const T & a, const TypeVector & b) { @@ -1178,6 +1195,7 @@ outer_product(const T & a, const TypeVector & b) } template ::value, int>::type = 0> +LIBMESH_DEVICE_INLINE TypeVector::supertype> outer_product(const TypeVector & a, const T2 & b) { @@ -1208,6 +1226,7 @@ l1_norm_diff(const TypeVector & vec1, const TypeVector & vec2) namespace std { template +LIBMESH_DEVICE_INLINE auto norm(const libMesh::TypeVector & vector) -> decltype(std::norm(T())) { // Yea I agree it's dumb that the standard returns the square of the Euclidean norm diff --git a/include/numerics/vector_value.h b/include/numerics/vector_value.h index c93f17313dc..45116e1a737 100644 --- a/include/numerics/vector_value.h +++ b/include/numerics/vector_value.h @@ -22,6 +22,7 @@ // Local includes #include "libmesh/type_vector.h" +#include "libmesh/libmesh_device.h" #include "libmesh/compare_types.h" #ifdef LIBMESH_HAVE_METAPHYSICL @@ -124,6 +125,7 @@ class VectorValue : public TypeVector * Assignment-from-scalar operator. Used only to zero out vectors. */ template + LIBMESH_DEVICE_INLINE typename std::enable_if< ScalarTraits::value, VectorValue &>::type @@ -146,7 +148,7 @@ typedef NumberVectorValue Gradient; // Inline functions template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue () : TypeVector () { @@ -154,7 +156,7 @@ VectorValue::VectorValue () : template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (const T & x, const T & y, const T & z) : @@ -166,7 +168,7 @@ VectorValue::VectorValue (const T & x, template template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (typename std::enable_if::value, const Scalar1>::type & x, @@ -183,7 +185,7 @@ VectorValue::VectorValue (typename template template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (const Scalar & x, typename std::enable_if::value, @@ -194,7 +196,7 @@ VectorValue::VectorValue (const Scalar & x, template template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (const VectorValue & p) : TypeVector (p) { @@ -204,7 +206,7 @@ VectorValue::VectorValue (const VectorValue & p) : template template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (const TypeVector & p) : TypeVector (p) { @@ -212,7 +214,7 @@ VectorValue::VectorValue (const TypeVector & p) : #ifdef LIBMESH_USE_COMPLEX_NUMBERS template -inline +LIBMESH_DEVICE_INLINE VectorValue::VectorValue (const TypeVector & p_re, const TypeVector & p_im) : TypeVector (Complex (p_re(0), p_im(0)), From 37c9464ff1d6e7f6886cbf236d0bd236e127832f Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 16:17:12 -0600 Subject: [PATCH 2/8] Fix Kokkos backend device and link support --- include/base/libmesh_exceptions.h | 7 ++ m4/libmesh_optional_packages.m4 | 128 ++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/include/base/libmesh_exceptions.h b/include/base/libmesh_exceptions.h index 6ca79b7b269..65237e1478f 100644 --- a/include/base/libmesh_exceptions.h +++ b/include/base/libmesh_exceptions.h @@ -23,6 +23,7 @@ #include "libmesh/libmesh_config.h" #include "libmesh/libmesh_abort.h" +#include "libmesh/libmesh_device.h" #include #include @@ -212,7 +213,13 @@ class TerminationException #ifdef LIBMESH_ENABLE_EXCEPTIONS #define libmesh_noexcept noexcept +#if LIBMESH_IN_DEVICE_CODE +// Kokkos device code does not support C++ exceptions. +#define LIBMESH_THROW(e) do { LIBMESH_DEVICE_ERROR_MSG((e).what()); } while (0) +#else #define LIBMESH_THROW(e) do { throw e; } while (0) +#endif + #define libmesh_rethrow throw #define libmesh_try try #define libmesh_catch(e) catch(e) diff --git a/m4/libmesh_optional_packages.m4 b/m4/libmesh_optional_packages.m4 index 2c569d088c0..9fb641d1945 100644 --- a/m4/libmesh_optional_packages.m4 +++ b/m4/libmesh_optional_packages.m4 @@ -861,6 +861,134 @@ AM_CONDITIONAL(LIBMESH_ENABLE_METAPHYSICL, test x$enablemetaphysicl = xyes) +# ------------------------------------------------------------- +# Kokkos -- optional, enables the native Kokkos FE math path +# ------------------------------------------------------------- +AC_ARG_WITH([kokkos], + AS_HELP_STRING([--with-kokkos=DIR], + [Enable Kokkos support using the installation at DIR]), + [KOKKOS_DIR="$withval"], + [KOKKOS_DIR="no"]) + +AC_ARG_WITH([kokkos-backend], + AS_HELP_STRING([--with-kokkos-backend=BACKEND], + [cuda|hip|sycl|openmp|serial (default: auto-detect from KokkosCore_config.h)]), + [KOKKOS_BACKEND="$withval"], [KOKKOS_BACKEND="auto"]) + +dnl Allow the caller (e.g. MOOSE's configure_libmesh.sh) to pre-set the +dnl Kokkos compiler and flags via environment variables. If KOKKOS_CXX is +dnl already set, we skip auto-detection entirely — the caller knows best. +dnl We use AC_SUBST (not AC_ARG_VAR) so these flags stay scoped to .K +dnl compilation rules and don't leak into the main CPPFLAGS/CXXFLAGS. + +AS_IF([test "x$KOKKOS_DIR" != "xno"], + [ + AC_CHECK_FILE([$KOKKOS_DIR/include/Kokkos_Core.hpp], + [ + enablekokkos=yes + libmesh_optional_INCLUDES="$libmesh_optional_INCLUDES -I$KOKKOS_DIR/include" + libmesh_optional_LIBS="$libmesh_optional_LIBS -L$KOKKOS_DIR/lib -lkokkoscore" + + dnl Only auto-detect if KOKKOS_CXX was not pre-set by the caller + AS_IF([test "x$KOKKOS_CXX" = "x"], + [ + KOKKOS_CFG="$KOKKOS_DIR/include/KokkosCore_config.h" + + dnl Auto-detect backend + AS_IF([test "x$KOKKOS_BACKEND" = "xauto"], + [ + AS_IF([test -r "$KOKKOS_CFG"], + [ + AS_IF([grep -q 'KOKKOS_ENABLE_CUDA' "$KOKKOS_CFG"], + [KOKKOS_BACKEND=cuda], + [AS_IF([grep -q 'KOKKOS_ENABLE_HIP' "$KOKKOS_CFG"], + [KOKKOS_BACKEND=hip], + [AS_IF([grep -q 'KOKKOS_ENABLE_SYCL' "$KOKKOS_CFG"], + [KOKKOS_BACKEND=sycl], + [AS_IF([grep -q 'KOKKOS_ENABLE_OPENMP' "$KOKKOS_CFG"], + [KOKKOS_BACKEND=openmp], + [KOKKOS_BACKEND=serial])])])]) + ], + [KOKKOS_BACKEND=serial]) + ]) + + AC_MSG_RESULT([Kokkos backend: $KOKKOS_BACKEND]) + + dnl Check if Kokkos was built with OpenMP + have_kokkos_openmp=no + AS_IF([test -r "$KOKKOS_CFG"], + [AS_IF([grep -q 'KOKKOS_ENABLE_OPENMP' "$KOKKOS_CFG"], + [have_kokkos_openmp=yes])]) + + case "$KOKKOS_BACKEND" in + cuda) + AC_PATH_PROG([NVCC],[nvcc],[no],[$PATH]) + AS_IF([test "x$NVCC" = "xno"], + [AC_MSG_ERROR([nvcc not found but Kokkos CUDA backend requested])]) + KOKKOS_CXX="$NVCC" + KOKKOS_CXXFLAGS="--forward-unknown-to-host-compiler --extended-lambda --disable-warnings -x cu -ccbin $CXX" + KOKKOS_LDFLAGS="--forward-unknown-to-host-compiler -L$KOKKOS_DIR/lib" + AS_IF([test "x$have_kokkos_openmp" = "xyes"], + [ + KOKKOS_CXXFLAGS="$KOKKOS_CXXFLAGS -fopenmp" + KOKKOS_LDFLAGS="$KOKKOS_LDFLAGS -fopenmp" + ]) + ;; + hip) + AC_PATH_PROG([HIPCC],[hipcc],[no],[$PATH]) + AS_IF([test "x$HIPCC" = "xno"], + [AC_MSG_ERROR([hipcc not found but Kokkos HIP backend requested])]) + KOKKOS_CXX="$HIPCC" + KOKKOS_LDFLAGS="-L$KOKKOS_DIR/lib" + ;; + sycl) + AC_PATH_PROG([ICPX],[icpx],[no],[$PATH]) + AS_IF([test "x$ICPX" = "xno"], + [AC_MSG_ERROR([icpx not found but Kokkos SYCL backend requested])]) + KOKKOS_CXX="$ICPX" + KOKKOS_CXXFLAGS="-fsycl" + KOKKOS_LDFLAGS="-fsycl -L$KOKKOS_DIR/lib" + ;; + openmp) + KOKKOS_CXX="${CXX}" + KOKKOS_CXXFLAGS="-fopenmp -x c++" + KOKKOS_LDFLAGS="-fopenmp -L$KOKKOS_DIR/lib" + ;; + serial|*) + KOKKOS_CXX="${CXX}" + KOKKOS_CXXFLAGS="-x c++" + KOKKOS_LDFLAGS="-L$KOKKOS_DIR/lib" + ;; + esac + ], + [AC_MSG_RESULT([Using caller-provided KOKKOS_CXX=$KOKKOS_CXX])]) + + dnl Set defaults for any variables not provided by caller or auto-detect + KOKKOS_CPPFLAGS="${KOKKOS_CPPFLAGS:--DLIBMESH_KOKKOS_COMPILATION -I$KOKKOS_DIR/include}" + KOKKOS_LDFLAGS="${KOKKOS_LDFLAGS:--L$KOKKOS_DIR/lib}" + KOKKOS_LIBS="${KOKKOS_LIBS:--lkokkoscore}" + + AC_DEFINE([HAVE_KOKKOS], [1], + [Define if Kokkos support is enabled in libMesh]) + AC_MSG_RESULT(<<< Configuring library with Kokkos support >>>) + ], + [ + AC_MSG_WARN([Kokkos not found at $KOKKOS_DIR -- disabling Kokkos FE support]) + enablekokkos=no + ]) + ], + [enablekokkos=no]) + +AC_SUBST([KOKKOS_CXX]) +AC_SUBST([KOKKOS_CPPFLAGS]) +AC_SUBST([KOKKOS_CXXFLAGS]) +AC_SUBST([KOKKOS_LDFLAGS]) +AC_SUBST([KOKKOS_LIBS]) +AM_CONDITIONAL(LIBMESH_ENABLE_KOKKOS, test x$enablekokkos = xyes) +# ------------------------------------------------------------- + + + AS_IF([test "$enableoptional" != no], [ AC_MSG_RESULT(----------------------------------------------) From 1d82eb8a60e43ca78bd878a17da4d6299347b663 Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 16:17:19 -0600 Subject: [PATCH 3/8] Add Kokkos numerics oracle tests --- include/gpu/kokkos_storage.h | 60 ++ tests/Makefile.am | 41 +- .../numerics/kokkos_tensor_ops_oracle_test.K | 588 ++++++++++++++++++ .../numerics/kokkos_vector_ops_oracle_test.K | 442 +++++++++++++ 4 files changed, 1130 insertions(+), 1 deletion(-) create mode 100644 include/gpu/kokkos_storage.h create mode 100644 tests/numerics/kokkos_tensor_ops_oracle_test.K create mode 100644 tests/numerics/kokkos_vector_ops_oracle_test.K diff --git a/include/gpu/kokkos_storage.h b/include/gpu/kokkos_storage.h new file mode 100644 index 00000000000..819aa1fdaa4 --- /dev/null +++ b/include/gpu/kokkos_storage.h @@ -0,0 +1,60 @@ +// libMesh Kokkos storage helpers for dimension-aware vector/tensor views. + +#ifndef LIBMESH_KOKKOS_STORAGE_H +#define LIBMESH_KOKKOS_STORAGE_H + +#include "libmesh/libmesh_common.h" +#include "libmesh/libmesh_device.h" +#include "libmesh/type_tensor.h" +#include "libmesh/type_vector.h" + +namespace libMesh::Kokkos +{ + +template +LIBMESH_DEVICE_INLINE +VectorType load_vector(const ViewType & view, const unsigned int i) +{ + VectorType v; + v.zero(); + + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + v(d) = view(i, d); + + return v; +} + +template +LIBMESH_DEVICE_INLINE +void store_vector(const ViewType & view, const unsigned int i, const VectorType & v) +{ + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + view(i, d) = v(d); +} + +template +LIBMESH_DEVICE_INLINE +TensorType load_tensor(const ViewType & view, const unsigned int i) +{ + TensorType T; + T.zero(); + + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + T(row, col) = view(i, row, col); + + return T; +} + +template +LIBMESH_DEVICE_INLINE +void store_tensor(const ViewType & view, const unsigned int i, const TensorType & T) +{ + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + view(i, row, col) = T(row, col); +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_STORAGE_H diff --git a/tests/Makefile.am b/tests/Makefile.am index bb12f424833..6efb6d23e88 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -7,6 +7,7 @@ AM_CPPFLAGS = $(libmesh_optional_INCLUDES) -I$(top_builddir)/include \ -DLIBMESH_IS_UNIT_TESTING AM_LDFLAGS = $(libmesh_LDFLAGS) $(libmesh_contrib_LDFLAGS) LIBS = $(libmesh_optional_LIBS) $(CPPUNIT_LIBS) +KOKKOS_TEST_CPPFLAGS = # We might have turned on -Werror and/or paranoid warnings CXXFLAGS_DBG += $(ACSM_ANY_WERROR_FLAG) $(ACSM_ANY_PARANOID_FLAGS) @@ -248,6 +249,26 @@ if LIBMESH_ENABLE_FPARSER endif check_PROGRAMS = # empty, append below +TESTS = + +if LIBMESH_ENABLE_KOKKOS + KOKKOS_TEST_CPPFLAGS += -I$(top_srcdir)/include $(KOKKOS_CPPFLAGS) + + check_PROGRAMS += kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit + TESTS += kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit + + kokkos_vector_ops_oracle_unit_SOURCES = numerics/kokkos_vector_ops_oracle_test.K + kokkos_vector_ops_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_vector_ops_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_vector_ops_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_vector_ops_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_tensor_ops_oracle_unit_SOURCES = numerics/kokkos_tensor_ops_oracle_test.K + kokkos_tensor_ops_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_tensor_ops_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_tensor_ops_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_tensor_ops_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) +endif # our GLIBC debugging preprocessor flags seem to potentially conflict # with libcppunit binaries. Some cppunit versions work fine for us, @@ -358,9 +379,27 @@ $(top_builddir)/libmesh_oprof.la: FORCE if LIBMESH_ENABLE_CPPUNIT -TESTS = run_unit_tests.sh +TESTS += run_unit_tests.sh endif +# Compile .K translation units with the Kokkos device compiler. +# $(MPI_INCLUDES) is needed because KOKKOS_CXX may be nvcc/hipcc +# instead of the MPI compiler wrapper, so mpi.h won't be found implicitly. +.K.o: + $(KOKKOS_CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(MPI_INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(KOKKOS_CXXFLAGS) \ + -c $< -o $@ + +# Custom link rules so the Kokkos compiler drives the final link step. +kokkos_vector_ops_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_vector_ops_oracle_unit_LDFLAGS) -o $@ + +kokkos_tensor_ops_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_tensor_ops_oracle_unit_LDFLAGS) -o $@ + CLEANFILES = cube_mesh.xda \ slit_mesh.xda \ slit_solution.xda \ diff --git a/tests/numerics/kokkos_tensor_ops_oracle_test.K b/tests/numerics/kokkos_tensor_ops_oracle_test.K new file mode 100644 index 00000000000..917a99aba23 --- /dev/null +++ b/tests/numerics/kokkos_tensor_ops_oracle_test.K @@ -0,0 +1,588 @@ +// Kokkos kernel oracle tests for libMesh tensor algebra used by Kokkos kernels. +// +// Compares device-side tensor/vector +// operations against host libMesh TypeTensor / TypeVector oracles built from +// direct hand-written fixtures. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "libmesh/libmesh.h" +#include "libmesh/point.h" +#include "libmesh/tensor_value.h" +#include "libmesh/type_n_tensor.h" +#include "libmesh/vector_value.h" +#include "gpu/kokkos_storage.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include +#include +#include +#include +#include + +using libMesh::Real; + +static constexpr double tol = 2.0e-13; + +using kernel_vector = libMesh::TypeVector; +using kernel_tensor = libMesh::TypeTensor; + +namespace +{ + +using vector_storage_view = Kokkos::View; +using tensor_storage_view = Kokkos::View; + +inline int +compare_device_scalars(const Kokkos::View & d_values, + const std::vector & ref_values, + const double local_tol = tol) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + if (std::fabs(h_values(i) - ref_values[i]) > local_tol) + ++fail; + + return fail; +} + +template +inline Kokkos::View +upload_objects(const std::vector & values, const char * label) +{ + Kokkos::View d(std::string(label), values.size()); + auto h = Kokkos::create_mirror_view(d); + for (std::size_t i = 0; i < values.size(); ++i) + h(i) = values[i]; + Kokkos::deep_copy(d, h); + return d; +} + +inline int +compare_device_vectors(const vector_storage_view & d_values, + const std::vector & ref_values, + const double local_tol = tol) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + if (std::fabs(h_values(i, d) - ref_values[i](d)) > local_tol) + ++fail; + + return fail; +} + +inline int +compare_device_tensors(const tensor_storage_view & d_values, + const std::vector & ref_values, + const double local_tol = tol) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + if (std::fabs(h_values(i, row, col) - ref_values[i](row, col)) > local_tol) + ++fail; + + return fail; +} + +inline vector_storage_view +upload_vectors(const std::vector & values, const char * label) +{ + vector_storage_view d(std::string(label), values.size()); + auto h = Kokkos::create_mirror_view(d); + + for (std::size_t i = 0; i < values.size(); ++i) + for (unsigned int component = 0; component < LIBMESH_DIM; ++component) + h(i, component) = values[i](component); + + Kokkos::deep_copy(d, h); + return d; +} + +inline tensor_storage_view +upload_tensors(const std::vector & values, const char * label) +{ + tensor_storage_view d(std::string(label), values.size()); + auto h = Kokkos::create_mirror_view(d); + + for (std::size_t i = 0; i < values.size(); ++i) + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + h(i, row, col) = values[i](row, col); + + Kokkos::deep_copy(d, h); + return d; +} + +inline libMesh::TypeVector +make_host_vector(const Real x, const Real y = 0, const Real z = 0) +{ + libMesh::TypeVector v; + v.zero(); + v(0) = x; +#if LIBMESH_DIM > 1 + v(1) = y; +#endif +#if LIBMESH_DIM > 2 + v(2) = z; +#endif + return v; +} + +inline libMesh::TypeTensor +make_host_tensor(const Real xx, + const Real xy = 0, + const Real xz = 0, + const Real yx = 0, + const Real yy = 0, + const Real yz = 0, + const Real zx = 0, + const Real zy = 0, + const Real zz = 0) +{ + libMesh::TypeTensor T; + T.zero(); + T(0, 0) = xx; +#if LIBMESH_DIM > 1 + T(0, 1) = xy; + T(1, 0) = yx; + T(1, 1) = yy; +#endif +#if LIBMESH_DIM > 2 + T(0, 2) = xz; + T(1, 2) = yz; + T(2, 0) = zx; + T(2, 1) = zy; + T(2, 2) = zz; +#endif + return T; +} + +struct tensor_dim_case +{ + libMesh::TypeTensor J; + unsigned int dim; + const char * name; +}; + +static const tensor_dim_case dim_cases[] = { + { make_host_tensor(1.7, -0.2, 0.5, + 0.3, 1.1, -0.4, + -0.6, 0.8, 0.9), + 1, + "leading_1d" }, +#if LIBMESH_DIM > 1 + { make_host_tensor(2.5, -0.75, 0.4, + 1.2, 1.8, -0.6, + -0.3, 0.9, 1.4), + 2, + "leading_2d" }, +#endif +#if LIBMESH_DIM > 2 + { make_host_tensor(9.08973348886179e-01, 3.36455579239923e-01, 5.16389236893863e-01, + 9.44156071777472e-01, 1.35610910092516e-01, 1.49881119060538e-02, + 1.15988384086146e-01, 6.79845197685518e-03, 3.77028969454745e-01), + 3, + "leading_3d" } +#endif +}; + +inline libMesh::TypeTensor +host_identity(const unsigned int dim) +{ + libMesh::TypeTensor I; + I.zero(); + for (unsigned int i = 0; i < dim; ++i) + I(i, i) = Real(1); + return I; +} + +inline Real +host_leading_determinant(const libMesh::TypeTensor & J, const unsigned int dim) +{ + if (dim == 0) + return Real(1); + if (dim == 1) + return J(0, 0); + if (dim == 2) + return J(0, 0) * J(1, 1) - J(0, 1) * J(1, 0); +#if LIBMESH_DIM > 2 + return J.det(); +#else + return Real(0); +#endif +} + +inline libMesh::TypeTensor +host_leading_inverse(const libMesh::TypeTensor & J, const unsigned int dim) +{ + libMesh::TypeTensor inv; + inv.zero(); + + if (dim == 1) + { + inv(0, 0) = Real(1) / J(0, 0); + return inv; + } + + if (dim == 2) + { + const Real det = host_leading_determinant(J, dim); + inv(0, 0) = J(1, 1) / det; + inv(0, 1) = -J(0, 1) / det; + inv(1, 0) = -J(1, 0) / det; + inv(1, 1) = J(0, 0) / det; + return inv; + } + +#if LIBMESH_DIM > 2 + return libMesh::TypeTensor(J.inverse()); +#else + return inv; +#endif +} + +LIBMESH_DEVICE_INLINE +kernel_vector +zero_kernel_vector() +{ + kernel_vector v; + v.zero(); + return v; +} + +LIBMESH_DEVICE_INLINE +kernel_tensor +zero_kernel_tensor() +{ + kernel_tensor T; + T.zero(); + return T; +} + +LIBMESH_DEVICE_INLINE +kernel_tensor +kernel_leading_identity(const unsigned int dim) +{ + kernel_tensor I = zero_kernel_tensor(); + for (unsigned int i = 0; i < dim; ++i) + I(i, i) = Real(1); + return I; +} + +LIBMESH_DEVICE_INLINE +Real +kernel_leading_determinant(const kernel_tensor & J, const unsigned int dim) +{ + if (dim == 0) + return Real(1); + if (dim == 1) + return J(0, 0); + if (dim == 2) + return J(0, 0) * J(1, 1) - J(0, 1) * J(1, 0); +#if LIBMESH_DIM > 2 + return J.det(); +#else + return Real(0); +#endif +} + +LIBMESH_DEVICE_INLINE +kernel_tensor +kernel_leading_inverse(const kernel_tensor & J, const unsigned int dim) +{ + kernel_tensor inv = zero_kernel_tensor(); + + if (dim == 1) + { + inv(0, 0) = Real(1) / J(0, 0); + return inv; + } + + if (dim == 2) + { + const Real det = kernel_leading_determinant(J, dim); + inv(0, 0) = J(1, 1) / det; + inv(0, 1) = -J(0, 1) / det; + inv(1, 0) = -J(1, 0) / det; + inv(1, 1) = J(0, 0) / det; + return inv; + } + +#if LIBMESH_DIM > 2 + return J.inverse(); +#else + return inv; +#endif +} + +static int +test_dim_ops() +{ + const unsigned int ncases = sizeof(dim_cases) / sizeof(dim_cases[0]); + + std::vector J_values(ncases); + std::vector dims(ncases); + std::vector ref_det(ncases); + std::vector ref_inv(ncases); + std::vector ref_I(ncases); + std::vector ref_prod_left(ncases); + std::vector ref_prod_right(ncases); + + for (unsigned int c = 0; c < ncases; ++c) + { + const auto & info = dim_cases[c]; + J_values[c] = info.J; + dims[c] = info.dim; + + ref_det[c] = host_leading_determinant(info.J, info.dim); + ref_inv[c] = host_leading_inverse(info.J, info.dim); + ref_I[c] = host_identity(info.dim); + ref_prod_left[c] = info.J * ref_inv[c]; + ref_prod_right[c] = ref_inv[c] * info.J; + } + + auto d_J = upload_tensors(J_values, "tensor_dim_ops_J"); + auto d_dims = upload_objects(dims, "tensor_dim_ops_dim"); + Kokkos::View d_det("tensor_dim_ops_det", ncases); + tensor_storage_view d_inv("tensor_dim_ops_inv", ncases); + tensor_storage_view d_I("tensor_dim_ops_I", ncases); + tensor_storage_view d_prod_left("tensor_dim_ops_prod_left", ncases); + tensor_storage_view d_prod_right("tensor_dim_ops_prod_right", ncases); + + Kokkos::parallel_for( + static_cast(ncases), + KOKKOS_LAMBDA(int c) { + const auto J = libMesh::Kokkos::load_tensor(d_J, c); + const unsigned int dim = d_dims(c); + const Real det = kernel_leading_determinant(J, dim); + const auto inv = kernel_leading_inverse(J, dim); + const auto I = kernel_leading_identity(dim); + const auto prod_left = J * inv; + const auto prod_right = inv * J; + + d_det(c) = det; + libMesh::Kokkos::store_tensor(d_inv, c, inv); + libMesh::Kokkos::store_tensor(d_I, c, I); + libMesh::Kokkos::store_tensor(d_prod_left, c, prod_left); + libMesh::Kokkos::store_tensor(d_prod_right, c, prod_right); + }); + Kokkos::fence(); + + return compare_device_scalars(d_det, ref_det) + + compare_device_tensors(d_inv, ref_inv) + + compare_device_tensors(d_I, ref_I) + + compare_device_tensors(d_prod_left, ref_prod_left) + + compare_device_tensors(d_prod_right, ref_prod_right); +} + +static int +test_tensor_ops() +{ + const auto A = make_host_tensor(1.1, -0.4, 0.7, + 0.3, 1.9, -1.2, + -0.8, 0.5, 2.2); + const auto a = make_host_vector(2.0, 3.0, 4.0); + const auto b = make_host_vector(5.0, -6.0, 7.0); + const auto c = make_host_vector(1.25, -0.5, 2.0); + + const auto outer = libMesh::outer_product(a, b); + const auto transpose = A.transpose(); + const auto mix = 1.5 * A - 0.25 * outer; + const auto right = A * c; + const auto left = c * A; + const Real contract = A.contract(outer); + const Real norm = A.norm(); + const auto zero = zero_kernel_tensor(); + + std::vector ref_outer(1, outer); + std::vector ref_transpose(1, transpose); + std::vector ref_mix(1, mix); + std::vector ref_rows(LIBMESH_DIM); + std::vector ref_columns(LIBMESH_DIM); + for (unsigned int i = 0; i < LIBMESH_DIM; ++i) + { + ref_rows[i] = A.row(i); + ref_columns[i] = A.column(i); + } + std::vector ref_right(1, right); + std::vector ref_left(1, left); + std::vector ref_scalars = {contract, norm, zero.is_zero() ? 1.0 : 0.0, A.is_zero() ? 1.0 : 0.0}; + + auto d_A = upload_tensors(std::vector{A}, "tensor_ops_A"); + auto d_a = upload_vectors(std::vector{a}, "tensor_ops_a"); + auto d_b = upload_vectors(std::vector{b}, "tensor_ops_b"); + auto d_c = upload_vectors(std::vector{c}, "tensor_ops_c"); + tensor_storage_view d_outer("tensor_ops_outer", 1); + tensor_storage_view d_transpose("tensor_ops_transpose", 1); + tensor_storage_view d_mix("tensor_ops_mix", 1); + vector_storage_view d_rows("tensor_ops_rows", LIBMESH_DIM); + vector_storage_view d_columns("tensor_ops_columns", LIBMESH_DIM); + vector_storage_view d_right("tensor_ops_right", 1); + vector_storage_view d_left("tensor_ops_left", 1); + Kokkos::View d_scalars("tensor_ops_scalars", 4); + + Kokkos::parallel_for( + 1, + KOKKOS_LAMBDA(int) { + const auto A_d = libMesh::Kokkos::load_tensor(d_A, 0); + const auto a_d = libMesh::Kokkos::load_vector(d_a, 0); + const auto b_d = libMesh::Kokkos::load_vector(d_b, 0); + const auto c_d = libMesh::Kokkos::load_vector(d_c, 0); + const auto outer_d = libMesh::outer_product(a_d, b_d); + const auto transpose_d = A_d.transpose(); + const auto mix_d = 1.5 * A_d - 0.25 * outer_d; + const auto right_d = A_d * c_d; + const auto left_d = c_d * A_d; + const Real contract_d = A_d.contract(outer_d); + const Real norm_d = A_d.norm(); + const bool zero_is_zero_d = zero_kernel_tensor().is_zero(); + const bool A_is_zero_d = A_d.is_zero(); + + for (unsigned int i = 0; i < LIBMESH_DIM; ++i) + { + libMesh::Kokkos::store_vector(d_rows, i, A_d.row(i)); + libMesh::Kokkos::store_vector(d_columns, i, A_d.column(i)); + } + + libMesh::Kokkos::store_tensor(d_outer, 0, outer_d); + libMesh::Kokkos::store_tensor(d_transpose, 0, transpose_d); + libMesh::Kokkos::store_tensor(d_mix, 0, mix_d); + libMesh::Kokkos::store_vector(d_right, 0, right_d); + libMesh::Kokkos::store_vector(d_left, 0, left_d); + d_scalars(0) = contract_d; + d_scalars(1) = norm_d; + d_scalars(2) = zero_is_zero_d ? 1.0 : 0.0; + d_scalars(3) = A_is_zero_d ? 1.0 : 0.0; + }); + Kokkos::fence(); + + return compare_device_tensors(d_outer, ref_outer) + + compare_device_tensors(d_transpose, ref_transpose) + + compare_device_tensors(d_mix, ref_mix) + + compare_device_vectors(d_rows, ref_rows) + + compare_device_vectors(d_columns, ref_columns) + + compare_device_vectors(d_right, ref_right) + + compare_device_vectors(d_left, ref_left) + + compare_device_scalars(d_scalars, ref_scalars); +} + +static int +test_tensor_host_only_ops() +{ + int fail = 0; + +#if LIBMESH_DIM > 2 + { + libMesh::TensorValue tensor(2., 1., 0., + 1., 2., 1., + 0., 1., 2.); + fail += tensor.is_hpd(/*rel_tol=*/0.) ? 0 : 1; + } + + { + libMesh::TensorValue tensor(1., 0., 0., + 0., 0., 1., + 0., 1., 0.); + fail += tensor.is_hpd() ? 1 : 0; + } + + { + const libMesh::Point x(1., 0., 0.); + const auto R = libMesh::RealTensorValue::extrinsic_rotation_matrix(90., 0., 0.); + const auto rotated = R * x; + fail += (std::fabs(rotated(0)) <= tol) ? 0 : 1; + fail += (std::fabs(rotated(1) - 1.) <= tol) ? 0 : 1; + fail += (std::fabs(rotated(2)) <= tol) ? 0 : 1; + + const auto invR = libMesh::RealTensorValue::inverse_extrinsic_rotation_matrix(90., 0., 0.); + const auto unrotated = invR * rotated; + fail += (std::fabs(unrotated(0) - 1.) <= tol) ? 0 : 1; + fail += (std::fabs(unrotated(1)) <= tol) ? 0 : 1; + fail += (std::fabs(unrotated(2)) <= tol) ? 0 : 1; + } + + { + const libMesh::Point x(1., 1., 1.); + const auto R = libMesh::RealTensorValue::extrinsic_rotation_matrix(90., 90., 90.); + const auto rotated = R * x; + fail += (std::fabs(rotated(0) - 1.) <= tol) ? 0 : 1; + fail += (std::fabs(rotated(1) + 1.) <= tol) ? 0 : 1; + fail += (std::fabs(rotated(2) - 1.) <= tol) ? 0 : 1; + + const auto invR = libMesh::RealTensorValue::inverse_extrinsic_rotation_matrix(90., 90., 90.); + const auto unrotated = invR * rotated; + fail += (std::fabs(unrotated(0) - 1.) <= tol) ? 0 : 1; + fail += (std::fabs(unrotated(1) - 1.) <= tol) ? 0 : 1; + fail += (std::fabs(unrotated(2) - 1.) <= tol) ? 0 : 1; + } +#endif + +#ifdef LIBMESH_HAVE_METAPHYSICL + typedef typename MetaPhysicL::ReplaceAlgebraicType< + std::vector>, + typename libMesh::TensorTools::IncrementRank< + typename MetaPhysicL::ValueType>>::type>::type>::type + ReplacedType; + constexpr bool assertion = + std::is_same>>::value; + fail += assertion ? 0 : 1; +#endif + + return fail; +} + +} // anonymous namespace + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + const int dim_fail = test_dim_ops(); + std::printf("[tensor_dim_kernel_oracle] %s (%d failures)\n", + dim_fail ? "FAIL" : "PASS", + dim_fail); + total_fail += dim_fail; + + const int tensor_fail = test_tensor_ops(); + std::printf("[tensor_ops_kernel_oracle] %s (%d failures)\n", + tensor_fail ? "FAIL" : "PASS", + tensor_fail); + total_fail += tensor_fail; + + const int host_fail = test_tensor_host_only_ops(); + std::printf("[tensor_host_ops_oracle] %s (%d failures)\n", + host_fail ? "FAIL" : "PASS", + host_fail); + total_fail += host_fail; + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/numerics/kokkos_vector_ops_oracle_test.K b/tests/numerics/kokkos_vector_ops_oracle_test.K new file mode 100644 index 00000000000..ff91e65fe0c --- /dev/null +++ b/tests/numerics/kokkos_vector_ops_oracle_test.K @@ -0,0 +1,442 @@ +// Kokkos kernel oracle tests for libMesh::TypeVector / VectorValue numerics. +// +// Compares device-side vector algebra +// against host libMesh TypeVector oracles built from direct hand-written +// fixtures. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "libmesh/libmesh.h" +#include "libmesh/tensor_value.h" +#include "libmesh/type_vector.h" +#include "libmesh/vector_value.h" +#include "gpu/kokkos_storage.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include +#include +#include +#include +#include + +using libMesh::Real; + +static constexpr double tol = 2.0e-13; +static constexpr double unit_tol = 1.0e-14; +static constexpr Real golden_ratio = 1.6180339887498948482; +static constexpr unsigned int solid_angle_results = + 1 + ((LIBMESH_DIM > 1) ? 2u : 0u) + ((LIBMESH_DIM > 2) ? 4u : 0u); +static constexpr unsigned int vector_results = + 11 + ((LIBMESH_DIM > 2) ? 2u : 0u); +static constexpr unsigned int scalar_results = 11 + solid_angle_results; + +namespace +{ + +using vector_storage_view = Kokkos::View; + +inline int +compare_device_scalars(const Kokkos::View & d_values, + const std::vector & ref_values, + const double local_tol = tol) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + if (std::fabs(h_values(i) - ref_values[i]) > local_tol) + ++fail; + + return fail; +} + +template +inline vector_storage_view +upload_vectors(const std::vector & values, const char * label) +{ + vector_storage_view d(std::string(label), values.size()); + auto h = Kokkos::create_mirror_view(d); + for (std::size_t i = 0; i < values.size(); ++i) + for (unsigned int component = 0; component < LIBMESH_DIM; ++component) + h(i, component) = values[i](component); + Kokkos::deep_copy(d, h); + return d; +} + +template +inline int +compare_device_vectors(const vector_storage_view & d_values, + const std::vector & ref_values, + const double local_tol = tol) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + if (std::fabs(h_values(i, d) - ref_values[i](d)) > local_tol) + ++fail; + + return fail; +} + +template +LIBMESH_DEVICE_INLINE +Vec +make_vector(const Real x, const Real y = 0, const Real z = 0) +{ + Vec v; + v.zero(); + v(0) = x; +#if LIBMESH_DIM > 1 + v(1) = y; +#endif +#if LIBMESH_DIM > 2 + v(2) = z; +#endif + return v; +} + +template +struct vector_oracle +{ + std::vector vectors; + std::vector scalars; +}; + +struct vector_kernel_case +{ + const char * name; + Real ax, ay, az; + Real bx, by, bz; + Real cx, cy, cz; +}; + +static const vector_kernel_case cases[] = { +#if LIBMESH_DIM >= 1 + { "line_case_a", 2.0, 0.0, 0.0, -3.0, 0.0, 0.0, 0.5, 0.0, 0.0 }, + { "line_case_b", -1.25, 0.0, 0.0, 4.5, 0.0, 0.0, -2.0, 0.0, 0.0 }, +#endif +#if LIBMESH_DIM >= 2 + { "plane_case_a", 2.0, 3.0, 0.0, 5.0, -6.0, 0.0, 1.25, -0.5, 0.0 }, + { "plane_case_b", -1.0, 4.0, 0.0, 0.5, 2.5, 0.0, -3.0, 1.5, 0.0 }, +#endif +#if LIBMESH_DIM >= 3 + { "space_case_a", 2.0, 3.0, 4.0, 5.0, -6.0, 7.0, 1.25, -0.5, 2.0 }, + { "space_case_b", -1.0, 4.0, 0.75, 0.5, 2.5, -3.5, -3.0, 1.5, 2.25 }, +#endif +}; + +template +inline vector_oracle +make_manual_oracle(const Vec & a, const Vec & b, const Vec & c) +{ + vector_oracle oracle; + oracle.vectors.reserve(vector_results); + oracle.scalars.reserve(scalar_results); + + const auto copied = a; + + Vec mix = a + b; + mix -= c; + + Vec scaled = 1.25 * a; + scaled += (-0.5) * b; + scaled += (0.25) * c; + + Vec plus_assign = a; + plus_assign += b; + + Vec minus_assign = a; + minus_assign -= b; + + Vec accum; + accum.zero(); + accum.add_scaled(a, 1.25); + accum.add_scaled(b, -0.5); + accum.subtract_scaled(c, -0.25); + + const auto divided = a / 5.0; + const auto outer_right = libMesh::outer_product(a, 5.0); + const auto outer_left = libMesh::outer_product(5.0, a); + + Vec mult_assign = a; + mult_assign *= 5.0; + + Vec div_assign = a; + div_assign /= 5.0; + + Vec assign_zero = a; + assign_zero = 0.0; + + oracle.vectors.push_back(copied); + oracle.vectors.push_back(mix); + oracle.vectors.push_back(scaled); + oracle.vectors.push_back(accum); + oracle.vectors.push_back(plus_assign); + oracle.vectors.push_back(minus_assign); + oracle.vectors.push_back(divided); + oracle.vectors.push_back(outer_right); + oracle.vectors.push_back(outer_left); + oracle.vectors.push_back(mult_assign); + oracle.vectors.push_back(div_assign); + + oracle.scalars.push_back(a * b); + oracle.scalars.push_back(a.contract(b)); + oracle.scalars.push_back(mix.norm()); + oracle.scalars.push_back(mix.norm_sq()); + oracle.scalars.push_back(make_vector(0.0, 0.0, 0.0).is_zero() ? 1.0 : 0.0); + oracle.scalars.push_back(mix.is_zero() ? 1.0 : 0.0); + oracle.scalars.push_back((a == a) ? 1.0 : 0.0); + oracle.scalars.push_back((a == b) ? 1.0 : 0.0); + oracle.scalars.push_back((a != a) ? 1.0 : 0.0); + oracle.scalars.push_back((a != b) ? 1.0 : 0.0); + oracle.scalars.push_back(assign_zero.is_zero() ? 1.0 : 0.0); + + const auto xvec = make_vector(1.3); + oracle.scalars.push_back(solid_angle(xvec, xvec, xvec)); + +#if LIBMESH_DIM > 1 + const auto yvec = make_vector(0.0, 2.7); + const auto xydiag = make_vector(3.1, 3.1); + oracle.scalars.push_back(solid_angle(xvec, xvec, yvec)); + oracle.scalars.push_back(solid_angle(xvec, yvec, xydiag)); +#endif + +#if LIBMESH_DIM > 2 + const auto xypdiag = make_vector(0.8, -0.8); + const auto zvec = make_vector(0.0, 0.0, 1.1); + const auto xzdiag = make_vector(0.0, 0.7, 0.7); + const auto icosa1 = make_vector(1.0, golden_ratio, 0.0); + const auto icosa2 = make_vector(-1.0, golden_ratio, 0.0); + const auto icosa3 = make_vector(0.0, 1.0, golden_ratio); + oracle.scalars.push_back(solid_angle(xydiag, yvec, zvec)); + oracle.scalars.push_back(solid_angle(xvec, yvec, xzdiag)); + oracle.scalars.push_back(solid_angle(xypdiag, xydiag, zvec)); + oracle.scalars.push_back(solid_angle(icosa1, icosa2, icosa3)); +#endif + +#if LIBMESH_DIM > 2 + const auto cross = a.cross(b); + auto unit_cross = cross; + if (cross.norm() > unit_tol) + unit_cross = cross.unit(); + + oracle.vectors.push_back(cross); + oracle.vectors.push_back(unit_cross); +#endif + + libmesh_assert_equal_to(oracle.vectors.size(), vector_results); + libmesh_assert_equal_to(oracle.scalars.size(), scalar_results); + + return oracle; +} + +template +static int +test_vector_ops_case(const vector_kernel_case & info) +{ + const auto a = make_vector(info.ax, info.ay, info.az); + const auto b = make_vector(info.bx, info.by, info.bz); + const auto c = make_vector(info.cx, info.cy, info.cz); + + const auto oracle = make_manual_oracle(a, b, c); + + auto d_a = upload_vectors(std::vector{a}, "vector_ops_a"); + auto d_b = upload_vectors(std::vector{b}, "vector_ops_b"); + auto d_c = upload_vectors(std::vector{c}, "vector_ops_c"); + vector_storage_view d_vectors("vector_ops_vectors", vector_results); + Kokkos::View d_scalars("vector_ops_scalars", scalar_results); + + Kokkos::parallel_for( + 1, + KOKKOS_LAMBDA(int) { + const Vec a_d = libMesh::Kokkos::load_vector(d_a, 0); + const Vec b_d = libMesh::Kokkos::load_vector(d_b, 0); + const Vec c_d = libMesh::Kokkos::load_vector(d_c, 0); + + const Vec copied = a_d; + + Vec mix = a_d + b_d; + mix -= c_d; + + Vec scaled = 1.25 * a_d; + scaled += (-0.5) * b_d; + scaled += (0.25) * c_d; + + Vec plus_assign = a_d; + plus_assign += b_d; + + Vec minus_assign = a_d; + minus_assign -= b_d; + + Vec accum; + accum.zero(); + accum.add_scaled(a_d, 1.25); + accum.add_scaled(b_d, -0.5); + accum.subtract_scaled(c_d, -0.25); + + const Vec divided = a_d / 5.0; + const Vec outer_right = libMesh::outer_product(a_d, 5.0); + const Vec outer_left = libMesh::outer_product(5.0, a_d); + + Vec mult_assign = a_d; + mult_assign *= 5.0; + + Vec div_assign = a_d; + div_assign /= 5.0; + + Vec assign_zero = a_d; + assign_zero = 0.0; + + const Real dot = a_d * b_d; + const Real contract = a_d.contract(b_d); + const Real norm = mix.norm(); + const Real norm_sq = mix.norm_sq(); + const Vec zero = make_vector(0.0, 0.0, 0.0); + + unsigned int vector_offset = 0; + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, copied); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, mix); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, scaled); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, accum); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, plus_assign); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, minus_assign); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, divided); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, outer_right); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, outer_left); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, mult_assign); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, div_assign); + + unsigned int scalar_offset = 0; + d_scalars(scalar_offset++) = dot; + d_scalars(scalar_offset++) = contract; + d_scalars(scalar_offset++) = norm; + d_scalars(scalar_offset++) = norm_sq; + d_scalars(scalar_offset++) = zero.is_zero() ? 1.0 : 0.0; + d_scalars(scalar_offset++) = mix.is_zero() ? 1.0 : 0.0; + d_scalars(scalar_offset++) = (a_d == a_d) ? 1.0 : 0.0; + d_scalars(scalar_offset++) = (a_d == b_d) ? 1.0 : 0.0; + d_scalars(scalar_offset++) = (a_d != a_d) ? 1.0 : 0.0; + d_scalars(scalar_offset++) = (a_d != b_d) ? 1.0 : 0.0; + d_scalars(scalar_offset++) = assign_zero.is_zero() ? 1.0 : 0.0; + + const Vec xvec = make_vector(1.3); + d_scalars(scalar_offset++) = solid_angle(xvec, xvec, xvec); + +#if LIBMESH_DIM > 1 + const Vec yvec = make_vector(0.0, 2.7); + const Vec xydiag = make_vector(3.1, 3.1); + d_scalars(scalar_offset++) = solid_angle(xvec, xvec, yvec); + d_scalars(scalar_offset++) = solid_angle(xvec, yvec, xydiag); +#endif + +#if LIBMESH_DIM > 2 + const Vec xypdiag = make_vector(0.8, -0.8); + const Vec zvec = make_vector(0.0, 0.0, 1.1); + const Vec xzdiag = make_vector(0.0, 0.7, 0.7); + const Vec icosa1 = make_vector(1.0, golden_ratio, 0.0); + const Vec icosa2 = make_vector(-1.0, golden_ratio, 0.0); + const Vec icosa3 = make_vector(0.0, 1.0, golden_ratio); + d_scalars(scalar_offset++) = solid_angle(xydiag, yvec, zvec); + d_scalars(scalar_offset++) = solid_angle(xvec, yvec, xzdiag); + d_scalars(scalar_offset++) = solid_angle(xypdiag, xydiag, zvec); + d_scalars(scalar_offset++) = solid_angle(icosa1, icosa2, icosa3); +#endif + +#if LIBMESH_DIM > 2 + const Vec cross = a_d.cross(b_d); + Vec unit_cross = cross; + if (cross.norm() > unit_tol) + unit_cross = cross.unit(); + + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, cross); + libMesh::Kokkos::store_vector(d_vectors, vector_offset++, unit_cross); +#endif + + libmesh_assert_equal_to(vector_offset, vector_results); + libmesh_assert_equal_to(scalar_offset, scalar_results); + }); + Kokkos::fence(); + + return compare_device_vectors(d_vectors, oracle.vectors) + + compare_device_scalars(d_scalars, oracle.scalars); +} + +static int +test_vector_host_only_traits() +{ + int fail = 0; + +#ifdef LIBMESH_HAVE_METAPHYSICL + typedef typename MetaPhysicL::ReplaceAlgebraicType< + std::vector>, + typename libMesh::TensorTools::IncrementRank< + typename MetaPhysicL::ValueType>>::type>::type>::type + ReplacedType; + constexpr bool typevector_assertion = + std::is_same>>::value; + fail += typevector_assertion ? 0 : 1; + + typedef typename MetaPhysicL::ReplaceAlgebraicType< + std::vector>, + typename libMesh::TensorTools::IncrementRank< + typename MetaPhysicL::ValueType>>::type>::type>::type + ReplacedValueType; + constexpr bool vectorvalue_assertion = + std::is_same>>::value; + fail += vectorvalue_assertion ? 0 : 1; +#endif + + return fail; +} + +} // anonymous namespace + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + for (const auto & info : cases) + { + const int f = test_vector_ops_case>(info); + std::printf("[typevector_kernel_oracle] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + for (const auto & info : cases) + { + const int f = test_vector_ops_case>(info); + std::printf("[vectorvalue_kernel_oracle] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + const int host_fail = test_vector_host_only_traits(); + std::printf("[vector_host_traits_oracle] %s (%d failures)\n", + host_fail ? "FAIL" : "PASS", + host_fail); + total_fail += host_fail; + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} From 2ddeb118f545f72d65ce4a81f83d84179e24d2e4 Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 16:17:57 -0600 Subject: [PATCH 4/8] Regenerate configure and Makefile.in files --- Makefile.in | 8 + configure | 418 ++++++++++++++++-- contrib/Makefile.in | 8 + contrib/capnproto/Makefile.in | 8 + contrib/eigen/gitshim/Makefile.in | 8 + contrib/exodusii/5.22b/exodus/Makefile.in | 8 + contrib/exodusii/5.22b/nemesis/Makefile.in | 8 + contrib/exodusii/Lib/Makefile.in | 8 + contrib/exodusii/v8.11/exodus/Makefile.in | 8 + contrib/exodusii/v8.11/nemesis/Makefile.in | 8 + contrib/fparser/Makefile.in | 8 + contrib/fparser/extrasrc/Makefile.in | 8 + contrib/gmv/Makefile.in | 8 + contrib/gzstream/Makefile.in | 8 + contrib/laspack/Makefile.in | 8 + contrib/libHilbert/Makefile.in | 8 + contrib/metis/Makefile.in | 8 + contrib/nanoflann/Makefile.in | 8 + contrib/nemesis/Lib/Makefile.in | 8 + contrib/netgen/Makefile.in | 401 +---------------- contrib/parmetis/Makefile.in | 8 + contrib/poly2tri/modified/Makefile.in | 8 + contrib/qhull/2012.1/Makefile.in | 8 + contrib/sfcurves/Makefile.in | 8 + contrib/tecplot/binary/Makefile.in | 8 + contrib/tecplot/tecio/Makefile.in | 8 + contrib/tetgen/Makefile.in | 8 + contrib/triangle/Makefile.in | 8 + doc/Makefile.in | 8 + doc/html/Makefile.in | 8 + examples/Makefile.in | 8 + .../adaptivity/adaptivity_ex1/Makefile.in | 8 + .../adaptivity/adaptivity_ex2/Makefile.in | 8 + .../adaptivity/adaptivity_ex3/Makefile.in | 8 + .../adaptivity/adaptivity_ex4/Makefile.in | 8 + .../adaptivity/adaptivity_ex5/Makefile.in | 8 + examples/adjoints/adjoints_ex1/Makefile.in | 8 + examples/adjoints/adjoints_ex2/Makefile.in | 8 + examples/adjoints/adjoints_ex3/Makefile.in | 8 + examples/adjoints/adjoints_ex4/Makefile.in | 8 + examples/adjoints/adjoints_ex5/Makefile.in | 8 + examples/adjoints/adjoints_ex6/Makefile.in | 8 + examples/adjoints/adjoints_ex7/Makefile.in | 8 + .../eigenproblems_ex1/Makefile.in | 8 + .../eigenproblems_ex2/Makefile.in | 8 + .../eigenproblems_ex3/Makefile.in | 8 + .../eigenproblems_ex4/Makefile.in | 8 + .../fem_system/fem_system_ex1/Makefile.in | 8 + .../fem_system/fem_system_ex2/Makefile.in | 8 + .../fem_system/fem_system_ex3/Makefile.in | 8 + .../fem_system/fem_system_ex4/Makefile.in | 8 + .../fem_system/fem_system_ex5/Makefile.in | 8 + .../introduction/introduction_ex1/Makefile.in | 8 + .../introduction/introduction_ex2/Makefile.in | 8 + .../introduction/introduction_ex3/Makefile.in | 8 + .../introduction/introduction_ex4/Makefile.in | 8 + .../introduction/introduction_ex5/Makefile.in | 8 + .../miscellaneous_ex1/Makefile.in | 8 + .../miscellaneous_ex10/Makefile.in | 8 + .../miscellaneous_ex11/Makefile.in | 8 + .../miscellaneous_ex12/Makefile.in | 8 + .../miscellaneous_ex13/Makefile.in | 8 + .../miscellaneous_ex14/Makefile.in | 8 + .../miscellaneous_ex15/Makefile.in | 8 + .../miscellaneous_ex16/Makefile.in | 8 + .../miscellaneous_ex17/Makefile.in | 8 + .../miscellaneous_ex2/Makefile.in | 8 + .../miscellaneous_ex3/Makefile.in | 8 + .../miscellaneous_ex4/Makefile.in | 8 + .../miscellaneous_ex5/Makefile.in | 8 + .../miscellaneous_ex6/Makefile.in | 8 + .../miscellaneous_ex7/Makefile.in | 8 + .../miscellaneous_ex8/Makefile.in | 8 + .../miscellaneous_ex9/Makefile.in | 8 + .../optimization/optimization_ex1/Makefile.in | 8 + .../optimization/optimization_ex2/Makefile.in | 8 + .../reduced_basis_ex1/Makefile.in | 8 + .../reduced_basis_ex2/Makefile.in | 8 + .../reduced_basis_ex3/Makefile.in | 8 + .../reduced_basis_ex4/Makefile.in | 8 + .../reduced_basis_ex5/Makefile.in | 8 + .../reduced_basis_ex6/Makefile.in | 8 + .../reduced_basis_ex7/Makefile.in | 8 + .../solution_transfer_ex1/Makefile.in | 8 + .../subdomains/subdomains_ex1/Makefile.in | 8 + .../subdomains/subdomains_ex2/Makefile.in | 8 + .../subdomains/subdomains_ex3/Makefile.in | 8 + .../systems_of_equations_ex1/Makefile.in | 8 + .../systems_of_equations_ex2/Makefile.in | 8 + .../systems_of_equations_ex3/Makefile.in | 8 + .../systems_of_equations_ex4/Makefile.in | 8 + .../systems_of_equations_ex5/Makefile.in | 8 + .../systems_of_equations_ex6/Makefile.in | 8 + .../systems_of_equations_ex7/Makefile.in | 8 + .../systems_of_equations_ex8/Makefile.in | 8 + .../systems_of_equations_ex9/Makefile.in | 8 + examples/transient/transient_ex1/Makefile.in | 8 + examples/transient/transient_ex2/Makefile.in | 8 + examples/transient/transient_ex3/Makefile.in | 8 + examples/vector_fe/vector_fe_ex1/Makefile.in | 8 + examples/vector_fe/vector_fe_ex10/Makefile.in | 8 + examples/vector_fe/vector_fe_ex2/Makefile.in | 8 + examples/vector_fe/vector_fe_ex3/Makefile.in | 8 + examples/vector_fe/vector_fe_ex4/Makefile.in | 8 + examples/vector_fe/vector_fe_ex5/Makefile.in | 8 + examples/vector_fe/vector_fe_ex6/Makefile.in | 8 + examples/vector_fe/vector_fe_ex7/Makefile.in | 8 + examples/vector_fe/vector_fe_ex8/Makefile.in | 8 + examples/vector_fe/vector_fe_ex9/Makefile.in | 8 + include/Makefile.in | 10 +- include/libmesh/Makefile.in | 37 +- tests/Makefile.in | 136 ++++-- 112 files changed, 1387 insertions(+), 471 deletions(-) diff --git a/Makefile.in b/Makefile.in index cec62a434fa..186be47b152 100644 --- a/Makefile.in +++ b/Makefile.in @@ -7517,11 +7517,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -7569,6 +7576,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/configure b/configure index 33ff470d60a..5c6abbddb9c 100755 --- a/configure +++ b/configure @@ -672,6 +672,16 @@ libmesh_contrib_LDFLAGS libmesh_contrib_INCLUDES libmesh_optional_LIBS libmesh_optional_INCLUDES +LIBMESH_ENABLE_KOKKOS_FALSE +LIBMESH_ENABLE_KOKKOS_TRUE +KOKKOS_LIBS +KOKKOS_LDFLAGS +KOKKOS_CXXFLAGS +KOKKOS_CPPFLAGS +KOKKOS_CXX +ICPX +HIPCC +NVCC LIBMESH_ENABLE_METAPHYSICL_FALSE LIBMESH_ENABLE_METAPHYSICL_TRUE METAPHYSICL_INCLUDE @@ -1347,6 +1357,8 @@ enable_metaphysicl with_metaphysicl with_metaphysicl_include enable_metaphysicl_required +with_kokkos +with_kokkos_backend ' ac_precious_vars='build_alias host_alias @@ -2273,6 +2285,10 @@ Optional Packages: internal: build from contrib --with-metaphysicl-include= + --with-kokkos=DIR Enable Kokkos support using the installation at DIR + --with-kokkos-backend=BACKEND + cuda|hip|sycl|openmp|serial (default: auto-detect + from KokkosCore_config.h) Some influential environment variables: PETSC_DIR path to PETSc installation @@ -57353,22 +57369,11 @@ then : then : withtbb=/usr fi - - case $withtbb in - "~/"*) withtbb=$HOME${withtbb#"~"} ;; - esac - - tbb_is_onetbb=no - if test -r $withtbb/include/tbb/version.h -then : - TBB_INCLUDE_PATH=$withtbb/include - tbb_is_onetbb=yes -else case e in #( - e) if test -r $withtbb/include/tbb/tbb_stddef.h + as_ac_Header=`printf "%s\n" "ac_cv_header_$withtbb/include/tbb/task_scheduler_init.h" | sed "$as_sed_sh"` +ac_fn_cxx_check_header_compile "$LINENO" "$withtbb/include/tbb/task_scheduler_init.h" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes" then : TBB_INCLUDE_PATH=$withtbb/include -fi ;; -esac fi if test "x$withtbblib" != "x" @@ -57381,7 +57386,7 @@ fi fi - if test "x$TBB_INCLUDE_PATH" != "x" + if test -r $TBB_INCLUDE_PATH/tbb/task_scheduler_init.h then : TBB_LIBRARY="-L$TBB_LIBS -ltbb -ltbbmalloc" @@ -57392,15 +57397,8 @@ then : TBB_LIBRARY="${RPATHFLAG}${TBB_LIBS} $TBB_LIBRARY" fi - if test "x$tbb_is_onetbb" = "xyes" -then : - tbbverfile=$TBB_INCLUDE_PATH/tbb/version.h -else case e in #( - e) tbbverfile=$TBB_INCLUDE_PATH/tbb/tbb_stddef.h ;; -esac -fi - tbbmajor=`grep "define TBB_VERSION_MAJOR" $tbbverfile | sed -e "s/#define TBB_VERSION_MAJOR[ ]*//g"` - tbbminor=`grep "define TBB_VERSION_MINOR" $tbbverfile | sed -e "s/#define TBB_VERSION_MINOR[ ]*//g"` + tbbmajor=`grep "define TBB_VERSION_MAJOR" $TBB_INCLUDE_PATH/tbb/tbb_stddef.h | sed -e "s/#define TBB_VERSION_MAJOR[ ]*//g"` + tbbminor=`grep "define TBB_VERSION_MINOR" $TBB_INCLUDE_PATH/tbb/tbb_stddef.h | sed -e "s/#define TBB_VERSION_MINOR[ ]*//g"` else case e in #( e) enabletbb=no ;; @@ -57410,8 +57408,8 @@ fi if test "x$enabletbb" != "xno" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TBB support" >&5 -printf %s "checking for TBB support... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb::tbb_thread support" >&5 +printf %s "checking for tbb::tbb_thread support... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57419,20 +57417,20 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - saveCXXFLAGS="$CXXFLAGS" + saveCXXFLAGS="$CXXFLAGS" CXXFLAGS="$saveCXXFLAGS $TBB_INCLUDE" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include + #include int main (void) { - tbb::blocked_range r(0, 1); - (void)r.size(); + tbb::tbb_thread t; + t.join(); ; return 0; @@ -57455,7 +57453,8 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CXXFLAGS=$saveCXXFLAGS + CXXFLAGS=$saveCXXFLAGS + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57475,13 +57474,6 @@ printf "%s\n" "#define DETECTED_TBB_VERSION_MAJOR $tbbmajor" >>confdefs.h printf "%s\n" "#define DETECTED_TBB_VERSION_MINOR $tbbminor" >>confdefs.h - if test "x$tbb_is_onetbb" = "xyes" -then : - -printf "%s\n" "#define HAVE_ONETBB 1" >>confdefs.h - -fi - @@ -63913,6 +63905,352 @@ fi +# ------------------------------------------------------------- +# Kokkos -- optional, enables the native Kokkos FE math path +# ------------------------------------------------------------- + +# Check whether --with-kokkos was given. +if test ${with_kokkos+y} +then : + withval=$with_kokkos; KOKKOS_DIR="$withval" +else case e in #( + e) KOKKOS_DIR="no" ;; +esac +fi + + + +# Check whether --with-kokkos-backend was given. +if test ${with_kokkos_backend+y} +then : + withval=$with_kokkos_backend; KOKKOS_BACKEND="$withval" +else case e in #( + e) KOKKOS_BACKEND="auto" ;; +esac +fi + + + +if test "x$KOKKOS_DIR" != "xno" +then : + + as_ac_File=`printf "%s\n" "ac_cv_file_$KOKKOS_DIR/include/Kokkos_Core.hpp" | sed "$as_sed_sh"` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $KOKKOS_DIR/include/Kokkos_Core.hpp" >&5 +printf %s "checking for $KOKKOS_DIR/include/Kokkos_Core.hpp... " >&6; } +if eval test \${$as_ac_File+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "$KOKKOS_DIR/include/Kokkos_Core.hpp"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi ;; +esac +fi +eval ac_res=\$$as_ac_File + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_File"\" = x"yes" +then : + + enablekokkos=yes + libmesh_optional_INCLUDES="$libmesh_optional_INCLUDES -I$KOKKOS_DIR/include" + libmesh_optional_LIBS="$libmesh_optional_LIBS -L$KOKKOS_DIR/lib -lkokkoscore" + + if test "x$KOKKOS_CXX" = "x" +then : + + KOKKOS_CFG="$KOKKOS_DIR/include/KokkosCore_config.h" + + if test "x$KOKKOS_BACKEND" = "xauto" +then : + + if test -r "$KOKKOS_CFG" +then : + + if grep -q 'KOKKOS_ENABLE_CUDA' "$KOKKOS_CFG" +then : + KOKKOS_BACKEND=cuda +else case e in #( + e) if grep -q 'KOKKOS_ENABLE_HIP' "$KOKKOS_CFG" +then : + KOKKOS_BACKEND=hip +else case e in #( + e) if grep -q 'KOKKOS_ENABLE_SYCL' "$KOKKOS_CFG" +then : + KOKKOS_BACKEND=sycl +else case e in #( + e) if grep -q 'KOKKOS_ENABLE_OPENMP' "$KOKKOS_CFG" +then : + KOKKOS_BACKEND=openmp +else case e in #( + e) KOKKOS_BACKEND=serial ;; +esac +fi ;; +esac +fi ;; +esac +fi ;; +esac +fi + +else case e in #( + e) KOKKOS_BACKEND=serial ;; +esac +fi + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Kokkos backend: $KOKKOS_BACKEND" >&5 +printf "%s\n" "Kokkos backend: $KOKKOS_BACKEND" >&6; } + + have_kokkos_openmp=no + if test -r "$KOKKOS_CFG" +then : + if grep -q 'KOKKOS_ENABLE_OPENMP' "$KOKKOS_CFG" +then : + have_kokkos_openmp=yes +fi +fi + + case "$KOKKOS_BACKEND" in + cuda) + # Extract the first word of "nvcc", so it can be a program name with args. +set dummy nvcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_NVCC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $NVCC in + [\\/]* | ?:[\\/]*) + ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_NVCC="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="no" + ;; +esac ;; +esac +fi +NVCC=$ac_cv_path_NVCC +if test -n "$NVCC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 +printf "%s\n" "$NVCC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$NVCC" = "xno" +then : + as_fn_error $? "nvcc not found but Kokkos CUDA backend requested" "$LINENO" 5 +fi + KOKKOS_CXX="$NVCC" + KOKKOS_CXXFLAGS="--forward-unknown-to-host-compiler --extended-lambda --disable-warnings -x cu -ccbin $CXX" + KOKKOS_LDFLAGS="--forward-unknown-to-host-compiler -L$KOKKOS_DIR/lib" + if test "x$have_kokkos_openmp" = "xyes" +then : + + KOKKOS_CXXFLAGS="$KOKKOS_CXXFLAGS -fopenmp" + KOKKOS_LDFLAGS="$KOKKOS_LDFLAGS -fopenmp" + +fi + ;; + hip) + # Extract the first word of "hipcc", so it can be a program name with args. +set dummy hipcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_HIPCC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $HIPCC in + [\\/]* | ?:[\\/]*) + ac_cv_path_HIPCC="$HIPCC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_HIPCC="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_HIPCC" && ac_cv_path_HIPCC="no" + ;; +esac ;; +esac +fi +HIPCC=$ac_cv_path_HIPCC +if test -n "$HIPCC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HIPCC" >&5 +printf "%s\n" "$HIPCC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$HIPCC" = "xno" +then : + as_fn_error $? "hipcc not found but Kokkos HIP backend requested" "$LINENO" 5 +fi + KOKKOS_CXX="$HIPCC" + KOKKOS_LDFLAGS="-L$KOKKOS_DIR/lib" + ;; + sycl) + # Extract the first word of "icpx", so it can be a program name with args. +set dummy icpx; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ICPX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $ICPX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ICPX="$ICPX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ICPX="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ICPX" && ac_cv_path_ICPX="no" + ;; +esac ;; +esac +fi +ICPX=$ac_cv_path_ICPX +if test -n "$ICPX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ICPX" >&5 +printf "%s\n" "$ICPX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$ICPX" = "xno" +then : + as_fn_error $? "icpx not found but Kokkos SYCL backend requested" "$LINENO" 5 +fi + KOKKOS_CXX="$ICPX" + KOKKOS_CXXFLAGS="-fsycl" + KOKKOS_LDFLAGS="-fsycl -L$KOKKOS_DIR/lib" + ;; + openmp) + KOKKOS_CXX="${CXX}" + KOKKOS_CXXFLAGS="-fopenmp -x c++" + KOKKOS_LDFLAGS="-fopenmp -L$KOKKOS_DIR/lib" + ;; + serial|*) + KOKKOS_CXX="${CXX}" + KOKKOS_CXXFLAGS="-x c++" + KOKKOS_LDFLAGS="-L$KOKKOS_DIR/lib" + ;; + esac + +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Using caller-provided KOKKOS_CXX=$KOKKOS_CXX" >&5 +printf "%s\n" "Using caller-provided KOKKOS_CXX=$KOKKOS_CXX" >&6; } ;; +esac +fi + + KOKKOS_CPPFLAGS="${KOKKOS_CPPFLAGS:--DLIBMESH_KOKKOS_COMPILATION -I$KOKKOS_DIR/include}" + KOKKOS_LDFLAGS="${KOKKOS_LDFLAGS:--L$KOKKOS_DIR/lib}" + KOKKOS_LIBS="${KOKKOS_LIBS:--lkokkoscore}" + + +printf "%s\n" "#define HAVE_KOKKOS 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: <<< Configuring library with Kokkos support >>>" >&5 +printf "%s\n" "<<< Configuring library with Kokkos support >>>" >&6; } + +else case e in #( + e) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Kokkos not found at $KOKKOS_DIR -- disabling Kokkos FE support" >&5 +printf "%s\n" "$as_me: WARNING: Kokkos not found at $KOKKOS_DIR -- disabling Kokkos FE support" >&2;} + enablekokkos=no + ;; +esac +fi + + +else case e in #( + e) enablekokkos=no ;; +esac +fi + + + + + + + if test x$enablekokkos = xyes; then + LIBMESH_ENABLE_KOKKOS_TRUE= + LIBMESH_ENABLE_KOKKOS_FALSE='#' +else + LIBMESH_ENABLE_KOKKOS_TRUE='#' + LIBMESH_ENABLE_KOKKOS_FALSE= +fi + +# ------------------------------------------------------------- + + + if test "$enableoptional" != no then : @@ -65182,6 +65520,10 @@ if test -z "${LIBMESH_ENABLE_METAPHYSICL_TRUE}" && test -z "${LIBMESH_ENABLE_MET as_fn_error $? "conditional \"LIBMESH_ENABLE_METAPHYSICL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${LIBMESH_ENABLE_KOKKOS_TRUE}" && test -z "${LIBMESH_ENABLE_KOKKOS_FALSE}"; then + as_fn_error $? "conditional \"LIBMESH_ENABLE_KOKKOS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${GIT_CHECKOUT_TRUE}" && test -z "${GIT_CHECKOUT_FALSE}"; then as_fn_error $? "conditional \"GIT_CHECKOUT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/contrib/Makefile.in b/contrib/Makefile.in index 6c8d8649cdc..668594d8c04 100644 --- a/contrib/Makefile.in +++ b/contrib/Makefile.in @@ -604,11 +604,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -656,6 +663,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/capnproto/Makefile.in b/contrib/capnproto/Makefile.in index 43bfdcb44d5..56c7844f40d 100644 --- a/contrib/capnproto/Makefile.in +++ b/contrib/capnproto/Makefile.in @@ -453,11 +453,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -505,6 +512,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/eigen/gitshim/Makefile.in b/contrib/eigen/gitshim/Makefile.in index cd83617aabb..bab4d953ac5 100644 --- a/contrib/eigen/gitshim/Makefile.in +++ b/contrib/eigen/gitshim/Makefile.in @@ -337,11 +337,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -389,6 +396,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/exodusii/5.22b/exodus/Makefile.in b/contrib/exodusii/5.22b/exodus/Makefile.in index d6f576d1a90..66a5e6a0357 100644 --- a/contrib/exodusii/5.22b/exodus/Makefile.in +++ b/contrib/exodusii/5.22b/exodus/Makefile.in @@ -3320,11 +3320,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -3372,6 +3379,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/exodusii/5.22b/nemesis/Makefile.in b/contrib/exodusii/5.22b/nemesis/Makefile.in index 8538cdc184f..17636fa0144 100644 --- a/contrib/exodusii/5.22b/nemesis/Makefile.in +++ b/contrib/exodusii/5.22b/nemesis/Makefile.in @@ -399,11 +399,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -451,6 +458,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/exodusii/Lib/Makefile.in b/contrib/exodusii/Lib/Makefile.in index 4c6ef829ed5..59c360d8928 100644 --- a/contrib/exodusii/Lib/Makefile.in +++ b/contrib/exodusii/Lib/Makefile.in @@ -1955,11 +1955,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -2007,6 +2014,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/exodusii/v8.11/exodus/Makefile.in b/contrib/exodusii/v8.11/exodus/Makefile.in index 826c62c23e0..6c21419de79 100644 --- a/contrib/exodusii/v8.11/exodus/Makefile.in +++ b/contrib/exodusii/v8.11/exodus/Makefile.in @@ -4248,11 +4248,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -4300,6 +4307,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/exodusii/v8.11/nemesis/Makefile.in b/contrib/exodusii/v8.11/nemesis/Makefile.in index d1909c9f1d5..715ed90b4fe 100644 --- a/contrib/exodusii/v8.11/nemesis/Makefile.in +++ b/contrib/exodusii/v8.11/nemesis/Makefile.in @@ -409,11 +409,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -461,6 +468,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/fparser/Makefile.in b/contrib/fparser/Makefile.in index a9a20542d31..dd6e31b0e76 100644 --- a/contrib/fparser/Makefile.in +++ b/contrib/fparser/Makefile.in @@ -867,11 +867,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -919,6 +926,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/fparser/extrasrc/Makefile.in b/contrib/fparser/extrasrc/Makefile.in index f257d59051c..3eafacaf7a0 100644 --- a/contrib/fparser/extrasrc/Makefile.in +++ b/contrib/fparser/extrasrc/Makefile.in @@ -339,11 +339,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -391,6 +398,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/gmv/Makefile.in b/contrib/gmv/Makefile.in index 1043f694cf0..249f658088a 100644 --- a/contrib/gmv/Makefile.in +++ b/contrib/gmv/Makefile.in @@ -394,11 +394,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -446,6 +453,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/gzstream/Makefile.in b/contrib/gzstream/Makefile.in index 26d9c6a99cd..d7694ab76c8 100644 --- a/contrib/gzstream/Makefile.in +++ b/contrib/gzstream/Makefile.in @@ -446,11 +446,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -498,6 +505,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/laspack/Makefile.in b/contrib/laspack/Makefile.in index a921519ee01..125376d4347 100644 --- a/contrib/laspack/Makefile.in +++ b/contrib/laspack/Makefile.in @@ -504,11 +504,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -556,6 +563,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/libHilbert/Makefile.in b/contrib/libHilbert/Makefile.in index 92b7a8a5c6e..35d049071ec 100644 --- a/contrib/libHilbert/Makefile.in +++ b/contrib/libHilbert/Makefile.in @@ -477,11 +477,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -529,6 +536,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/metis/Makefile.in b/contrib/metis/Makefile.in index 2167e22fd72..5e8047805b9 100644 --- a/contrib/metis/Makefile.in +++ b/contrib/metis/Makefile.in @@ -1021,11 +1021,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -1073,6 +1080,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/nanoflann/Makefile.in b/contrib/nanoflann/Makefile.in index cb6fb5b1e25..94694c9b03c 100644 --- a/contrib/nanoflann/Makefile.in +++ b/contrib/nanoflann/Makefile.in @@ -443,11 +443,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -495,6 +502,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/nemesis/Lib/Makefile.in b/contrib/nemesis/Lib/Makefile.in index 30e196af739..722bf4b86f0 100644 --- a/contrib/nemesis/Lib/Makefile.in +++ b/contrib/nemesis/Lib/Makefile.in @@ -789,11 +789,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -841,6 +848,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/netgen/Makefile.in b/contrib/netgen/Makefile.in index f7db0d91967..21c0f0247b3 100644 --- a/contrib/netgen/Makefile.in +++ b/contrib/netgen/Makefile.in @@ -231,7 +231,7 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/netgen_SOURCES +am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACSM_ANY_PARANOID_FLAGS = @ACSM_ANY_PARANOID_FLAGS@ @@ -341,11 +341,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -393,6 +400,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ @@ -555,387 +563,6 @@ top_srcdir = @top_srcdir@ vtkbuild = @vtkbuild@ vtkmajor = @vtkmajor@ vtkversion = @vtkversion@ - -# Do not edit - automatically generated from ./rebuild_netgen_SOURCES.sh -@LIBMESH_ENABLE_NETGEN_TRUE@netgen_SOURCE_FILES = \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/_get_glibcxx_use_cxx11_abi.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/_get_gxx_abi.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/archive.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/archive.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/array.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/autodiff.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/autodiffdiff.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/bitarray.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/bitarray.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/concurrentqueue.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/exception.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/exception.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/flags.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/flags.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/hashtable.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/localheap.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/localheap.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/logging.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/logging.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/memtracer.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/mpi4py_pycapi.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/mpi_wrapper.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi_generated_declarations.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi_generated_dummy_init.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi_generated_init.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi_native.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ng_mpi_wrapper.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ngcore.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ngcore_api.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ngstream.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/paje_trace.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/paje_trace.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/profiler.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/profiler.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/python_ngcore.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/python_ngcore.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/python_ngcore_export.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/ranges.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/register_archive.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/signal.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd_arm64.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd_avx.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd_avx512.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd_generic.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/simd_sse.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/symboltable.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/table.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/table.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/taskmanager.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/taskmanager.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/type_traits.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/utils.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/utils.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/version.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/version.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/core/xbool.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/algprim.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/algprim.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/brick.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/brick.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/bspline2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csg.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csgeom.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csgparser.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csgparser.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/csgpkg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/curve2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/curve2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/edgeflw.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/edgeflw.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/explicitcurve2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/explicitcurve2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/extrusion.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/extrusion.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/gencyl.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/gencyl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/genmesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/geoml.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/identify.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/identify.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/manifold.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/manifold.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/meshsurf.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/meshsurf.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/polyhedra.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/polyhedra.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/python_csg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/revolution.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/revolution.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/singularref.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/singularref.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/solid.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/solid.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/specpoin.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/specpoin.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/spline3d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/spline3d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/splinesurface.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/splinesurface.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/surface.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/surface.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/triapprox.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/triapprox.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/vscsg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/vscsg.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/csg/zrefine.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/autodiff.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/autoptr.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/dynamicmem.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/dynamicmem.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/gzstream.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/gzstream.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/hashtabl.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/hashtabl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/myadt.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/mystring.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/mystring.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/netgenout.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/ngarray.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/ngarray.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/ngbitarray.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/ngbitarray.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/ngpython.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/optmem.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/optmem.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/parthreads.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/parthreads.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/seti.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/seti.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/sort.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/sort.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/spbita2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/spbita2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/stack.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/table.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/table.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/general/template.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/csg2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/csg2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/genmesh2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/geom2dpkg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/geometry2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/geometry2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/python_geom2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/spline2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/vsgeom2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/geom2d/vsgeom2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/adtree.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/adtree.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geom2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geom2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geom3d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geom3d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomfuncs.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomfuncs.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomobjects.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomops.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomtest3d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/geomtest3d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/gprim.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/spline.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/spline.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/splinegeometry.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/splinegeometry.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/transform3d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/gprim/transform3d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/acisgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/csg.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/geometry2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/gprim.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/incopengl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/inctcl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/incvis.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/linalg.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/meshing.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/myadt.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/mydefs.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/mystdlib.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/nginterface.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/nginterface_v2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/nginterface_v2_impl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/ngsimd.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/occgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/opti.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/parallel.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/stlgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/include/visual.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/nginterface.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/nginterface_v2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/read_fnf_mesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/readtetmesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/readuser.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/rw_cgns.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/rw_medit.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/rw_medit.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writeOpenFOAM15x.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writeabaqus.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writediffpack.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writedolfin.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writeelmer.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writefeap.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writefluent.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writegmsh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writegmsh2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writejcm.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writepermas.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writetecplot.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writetet.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writetochnog.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writeuser.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/writeuser.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/interface/wuchemnitz.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/bfgs.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/densemat.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/densemat.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/linalg.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/linopt.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/linsearch.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/opti.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/polynomial.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/polynomial.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/linalg/vector.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/adfront2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/adfront2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/adfront3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/adfront3.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/basegeom.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/basegeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/bcfunctions.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/bcfunctions.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/bisect.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/bisect.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/boundarylayer.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/boundarylayer.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/boundarylayer2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/classifyhpel.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/clusters.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/clusters.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/curvedelems.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/curvedelems.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/debugging.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/debugging.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/delaunay.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/delaunay2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/delaunay2d.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/fieldlines.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/fieldlines.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/findip.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/findip2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/geomsearch.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/geomsearch.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/global.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/global.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_hex.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_prism.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_pyramid.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_quad.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_segm.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_tet.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hpref_trig.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hprefinement.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/hprefinement.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/improve2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/improve2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/improve2gen.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/improve3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/improve3.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/localh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/localh.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshclass.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshclass.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshfunc.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshfunc.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshfunc2d.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshing.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshing2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshing2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshing3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshing3.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshtool.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshtool.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshtype.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/meshtype.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/msghandler.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/msghandler.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/netrule2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/netrule3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/parallelmesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/paralleltop.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/paralleltop.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/parser2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/parser3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/python_mesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/python_mesh.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/refine.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/ruler2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/ruler2.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/ruler3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/ruler3.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/secondorder.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/smoothing2.5.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/smoothing2.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/smoothing3.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/soldata.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/specials.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/specials.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/surfacegeom.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/surfacegeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/topology.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/topology.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/validate.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/validate.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/visual_interface.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/meshing/visual_interface.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_edge.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_edge.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_face.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_face.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_solid.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_utils.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_utils.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_vertex.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occ_vertex.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occconstruction.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occgenmesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occgeom.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occmeshsurf.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occmeshsurf.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/occpkg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/python_occ.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/python_occ_basic.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/python_occ_shapes.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/utilities.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/vsocc.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/occ/vsocc.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/meshstlsurface.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/meshstlsurface.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/python_stl.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlgeom.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlgeom.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlgeomchart.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlgeommesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlline.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlline.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stlpkg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stltool.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stltool.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stltopology.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/stltopology.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/vsstl.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/stlgeom/vsstl.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/importsolution.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/meshdoc.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/meshdoc.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/mvdraw.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/mvdraw.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/vispar.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/visual.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/visual_api.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/visualpkg.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/vsfieldlines.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/vsmesh.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/vssolution.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/libsrc/visualization/vssolution.hpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/ng_occ.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/ng_stl.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/ng_vol.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/nglib.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/nglib.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/nglib_occ.cpp \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/nglib_occ.h \ -@LIBMESH_ENABLE_NETGEN_TRUE@ netgen/nglib/parallelfunc.cpp - @LIBMESH_ENABLE_NETGEN_TRUE@netgenincludedir = $(includedir)/netgen @LIBMESH_ENABLE_NETGEN_TRUE@nglibincludedir = $(includedir)/netgen/nglib @LIBMESH_ENABLE_NETGEN_TRUE@netgenlibdir = $(libdir) @@ -954,7 +581,7 @@ all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/netgen_SOURCES $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -974,7 +601,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; -$(srcdir)/netgen_SOURCES $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -1297,14 +923,9 @@ uninstall-am: uninstall-netgenincludeHEADERS uninstall-netgenlibDATA \ .PRECIOUS: Makefile -# Try to include Netgen files as depndencies; otherwise we can get -# errors if we recompile from an existing libMesh build dir after a -# Netgen header has changed or if we link from one after a Netgen ABI -# has changed. - # Use a stamp file to make sure we don't have multiple sub-$(MAKE) # going at once; cmake gets horribly confused if that happens. -@LIBMESH_ENABLE_NETGEN_TRUE@.buildstamp: $(netgen_SOURCE_FILES) +@LIBMESH_ENABLE_NETGEN_TRUE@.buildstamp: @LIBMESH_ENABLE_NETGEN_TRUE@ $(MAKE) -C build $(AM_MAKEFLAGS) @LIBMESH_ENABLE_NETGEN_TRUE@ touch .buildstamp diff --git a/contrib/parmetis/Makefile.in b/contrib/parmetis/Makefile.in index 70875e6ff39..cde4b12aab9 100644 --- a/contrib/parmetis/Makefile.in +++ b/contrib/parmetis/Makefile.in @@ -855,11 +855,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -907,6 +914,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/poly2tri/modified/Makefile.in b/contrib/poly2tri/modified/Makefile.in index abb0c8cffa6..514fd6a38a6 100644 --- a/contrib/poly2tri/modified/Makefile.in +++ b/contrib/poly2tri/modified/Makefile.in @@ -541,11 +541,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -593,6 +600,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/qhull/2012.1/Makefile.in b/contrib/qhull/2012.1/Makefile.in index d9910cea212..03f2cbcb819 100644 --- a/contrib/qhull/2012.1/Makefile.in +++ b/contrib/qhull/2012.1/Makefile.in @@ -1164,11 +1164,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -1216,6 +1223,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/sfcurves/Makefile.in b/contrib/sfcurves/Makefile.in index 453e333f449..18be38e4660 100644 --- a/contrib/sfcurves/Makefile.in +++ b/contrib/sfcurves/Makefile.in @@ -414,11 +414,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -466,6 +473,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/tecplot/binary/Makefile.in b/contrib/tecplot/binary/Makefile.in index 9c918125c59..9a13af38818 100644 --- a/contrib/tecplot/binary/Makefile.in +++ b/contrib/tecplot/binary/Makefile.in @@ -384,11 +384,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -436,6 +443,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/tecplot/tecio/Makefile.in b/contrib/tecplot/tecio/Makefile.in index 0ca8d9faaf2..f937b27b6db 100644 --- a/contrib/tecplot/tecio/Makefile.in +++ b/contrib/tecplot/tecio/Makefile.in @@ -623,11 +623,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -675,6 +682,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/tetgen/Makefile.in b/contrib/tetgen/Makefile.in index b3035e72b2b..725d7a30d36 100644 --- a/contrib/tetgen/Makefile.in +++ b/contrib/tetgen/Makefile.in @@ -429,11 +429,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -481,6 +488,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/contrib/triangle/Makefile.in b/contrib/triangle/Makefile.in index a63cb31454c..f87cb42296f 100644 --- a/contrib/triangle/Makefile.in +++ b/contrib/triangle/Makefile.in @@ -424,11 +424,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -476,6 +483,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/doc/Makefile.in b/doc/Makefile.in index 42ba76ef15b..812994568fe 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -347,11 +347,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -399,6 +406,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/doc/html/Makefile.in b/doc/html/Makefile.in index ea0e18aacb4..d3e9103668c 100644 --- a/doc/html/Makefile.in +++ b/doc/html/Makefile.in @@ -307,11 +307,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -359,6 +366,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/Makefile.in b/examples/Makefile.in index d16d580d3a2..27a8db4d760 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -375,11 +375,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -427,6 +434,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adaptivity/adaptivity_ex1/Makefile.in b/examples/adaptivity/adaptivity_ex1/Makefile.in index 156523e9faa..3dc4c77a9dd 100644 --- a/examples/adaptivity/adaptivity_ex1/Makefile.in +++ b/examples/adaptivity/adaptivity_ex1/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adaptivity/adaptivity_ex2/Makefile.in b/examples/adaptivity/adaptivity_ex2/Makefile.in index be5308ddd74..04c82fb9137 100644 --- a/examples/adaptivity/adaptivity_ex2/Makefile.in +++ b/examples/adaptivity/adaptivity_ex2/Makefile.in @@ -484,11 +484,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -536,6 +543,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adaptivity/adaptivity_ex3/Makefile.in b/examples/adaptivity/adaptivity_ex3/Makefile.in index 0a64440aa41..7e31802fa14 100644 --- a/examples/adaptivity/adaptivity_ex3/Makefile.in +++ b/examples/adaptivity/adaptivity_ex3/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adaptivity/adaptivity_ex4/Makefile.in b/examples/adaptivity/adaptivity_ex4/Makefile.in index b25aca31264..e155bc31268 100644 --- a/examples/adaptivity/adaptivity_ex4/Makefile.in +++ b/examples/adaptivity/adaptivity_ex4/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adaptivity/adaptivity_ex5/Makefile.in b/examples/adaptivity/adaptivity_ex5/Makefile.in index b419dc98312..50cfa24eefd 100644 --- a/examples/adaptivity/adaptivity_ex5/Makefile.in +++ b/examples/adaptivity/adaptivity_ex5/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex1/Makefile.in b/examples/adjoints/adjoints_ex1/Makefile.in index a174eb3b2fe..f658f98c231 100644 --- a/examples/adjoints/adjoints_ex1/Makefile.in +++ b/examples/adjoints/adjoints_ex1/Makefile.in @@ -559,11 +559,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -611,6 +618,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex2/Makefile.in b/examples/adjoints/adjoints_ex2/Makefile.in index d0ac7f06aeb..1583e06ba69 100644 --- a/examples/adjoints/adjoints_ex2/Makefile.in +++ b/examples/adjoints/adjoints_ex2/Makefile.in @@ -527,11 +527,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -579,6 +586,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex3/Makefile.in b/examples/adjoints/adjoints_ex3/Makefile.in index af52a508f53..8e744ca96ee 100644 --- a/examples/adjoints/adjoints_ex3/Makefile.in +++ b/examples/adjoints/adjoints_ex3/Makefile.in @@ -562,11 +562,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -614,6 +621,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex4/Makefile.in b/examples/adjoints/adjoints_ex4/Makefile.in index 6721b984eb7..8ff3dceb0f3 100644 --- a/examples/adjoints/adjoints_ex4/Makefile.in +++ b/examples/adjoints/adjoints_ex4/Makefile.in @@ -562,11 +562,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -614,6 +621,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex5/Makefile.in b/examples/adjoints/adjoints_ex5/Makefile.in index 5dcc545ab49..f4bdc7d11ae 100644 --- a/examples/adjoints/adjoints_ex5/Makefile.in +++ b/examples/adjoints/adjoints_ex5/Makefile.in @@ -562,11 +562,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -614,6 +621,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex6/Makefile.in b/examples/adjoints/adjoints_ex6/Makefile.in index f8568140952..43ada1d6034 100644 --- a/examples/adjoints/adjoints_ex6/Makefile.in +++ b/examples/adjoints/adjoints_ex6/Makefile.in @@ -527,11 +527,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -579,6 +586,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/adjoints/adjoints_ex7/Makefile.in b/examples/adjoints/adjoints_ex7/Makefile.in index 793d69f1149..c807bd13682 100644 --- a/examples/adjoints/adjoints_ex7/Makefile.in +++ b/examples/adjoints/adjoints_ex7/Makefile.in @@ -577,11 +577,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -629,6 +636,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/eigenproblems/eigenproblems_ex1/Makefile.in b/examples/eigenproblems/eigenproblems_ex1/Makefile.in index a23b7ec4684..b2aeeba0c70 100644 --- a/examples/eigenproblems/eigenproblems_ex1/Makefile.in +++ b/examples/eigenproblems/eigenproblems_ex1/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/eigenproblems/eigenproblems_ex2/Makefile.in b/examples/eigenproblems/eigenproblems_ex2/Makefile.in index 5ef2c3bc3ec..e4584dfbd8f 100644 --- a/examples/eigenproblems/eigenproblems_ex2/Makefile.in +++ b/examples/eigenproblems/eigenproblems_ex2/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/eigenproblems/eigenproblems_ex3/Makefile.in b/examples/eigenproblems/eigenproblems_ex3/Makefile.in index 4a060dc7358..1bb7ca59f97 100644 --- a/examples/eigenproblems/eigenproblems_ex3/Makefile.in +++ b/examples/eigenproblems/eigenproblems_ex3/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/eigenproblems/eigenproblems_ex4/Makefile.in b/examples/eigenproblems/eigenproblems_ex4/Makefile.in index eb92f3d91f8..becef7ee553 100644 --- a/examples/eigenproblems/eigenproblems_ex4/Makefile.in +++ b/examples/eigenproblems/eigenproblems_ex4/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/fem_system/fem_system_ex1/Makefile.in b/examples/fem_system/fem_system_ex1/Makefile.in index 47f9d7e206f..ab49a448096 100644 --- a/examples/fem_system/fem_system_ex1/Makefile.in +++ b/examples/fem_system/fem_system_ex1/Makefile.in @@ -499,11 +499,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -551,6 +558,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/fem_system/fem_system_ex2/Makefile.in b/examples/fem_system/fem_system_ex2/Makefile.in index d1357da5ca8..5990a9ddcc7 100644 --- a/examples/fem_system/fem_system_ex2/Makefile.in +++ b/examples/fem_system/fem_system_ex2/Makefile.in @@ -514,11 +514,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -566,6 +573,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/fem_system/fem_system_ex3/Makefile.in b/examples/fem_system/fem_system_ex3/Makefile.in index 6783edf17bd..614048a0e48 100644 --- a/examples/fem_system/fem_system_ex3/Makefile.in +++ b/examples/fem_system/fem_system_ex3/Makefile.in @@ -499,11 +499,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -551,6 +558,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/fem_system/fem_system_ex4/Makefile.in b/examples/fem_system/fem_system_ex4/Makefile.in index 8e6296abb4e..1a31f0ddab4 100644 --- a/examples/fem_system/fem_system_ex4/Makefile.in +++ b/examples/fem_system/fem_system_ex4/Makefile.in @@ -499,11 +499,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -551,6 +558,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/fem_system/fem_system_ex5/Makefile.in b/examples/fem_system/fem_system_ex5/Makefile.in index 00224c8d1c2..2526a04fe16 100644 --- a/examples/fem_system/fem_system_ex5/Makefile.in +++ b/examples/fem_system/fem_system_ex5/Makefile.in @@ -514,11 +514,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -566,6 +573,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/introduction/introduction_ex1/Makefile.in b/examples/introduction/introduction_ex1/Makefile.in index 59920135dfb..13087163eff 100644 --- a/examples/introduction/introduction_ex1/Makefile.in +++ b/examples/introduction/introduction_ex1/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/introduction/introduction_ex2/Makefile.in b/examples/introduction/introduction_ex2/Makefile.in index 4168b619aa4..5e11b336ef9 100644 --- a/examples/introduction/introduction_ex2/Makefile.in +++ b/examples/introduction/introduction_ex2/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/introduction/introduction_ex3/Makefile.in b/examples/introduction/introduction_ex3/Makefile.in index 859921ed0fa..bb24117c806 100644 --- a/examples/introduction/introduction_ex3/Makefile.in +++ b/examples/introduction/introduction_ex3/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/introduction/introduction_ex4/Makefile.in b/examples/introduction/introduction_ex4/Makefile.in index 3572fea8ef5..efdd5b9b127 100644 --- a/examples/introduction/introduction_ex4/Makefile.in +++ b/examples/introduction/introduction_ex4/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/introduction/introduction_ex5/Makefile.in b/examples/introduction/introduction_ex5/Makefile.in index 3ae3f4020fe..b08a51822e9 100644 --- a/examples/introduction/introduction_ex5/Makefile.in +++ b/examples/introduction/introduction_ex5/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex1/Makefile.in b/examples/miscellaneous/miscellaneous_ex1/Makefile.in index d0de4bad619..fa1d6604c10 100644 --- a/examples/miscellaneous/miscellaneous_ex1/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex1/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex10/Makefile.in b/examples/miscellaneous/miscellaneous_ex10/Makefile.in index 1afb2f88961..4ceaf8ccf94 100644 --- a/examples/miscellaneous/miscellaneous_ex10/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex10/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex11/Makefile.in b/examples/miscellaneous/miscellaneous_ex11/Makefile.in index de80da2aab8..e36b21636b2 100644 --- a/examples/miscellaneous/miscellaneous_ex11/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex11/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex12/Makefile.in b/examples/miscellaneous/miscellaneous_ex12/Makefile.in index 99775b9b0b9..2c4c4fc193d 100644 --- a/examples/miscellaneous/miscellaneous_ex12/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex12/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex13/Makefile.in b/examples/miscellaneous/miscellaneous_ex13/Makefile.in index d6f6a103170..4f0080367ed 100644 --- a/examples/miscellaneous/miscellaneous_ex13/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex13/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex14/Makefile.in b/examples/miscellaneous/miscellaneous_ex14/Makefile.in index feb36eea1f3..768948775af 100644 --- a/examples/miscellaneous/miscellaneous_ex14/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex14/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex15/Makefile.in b/examples/miscellaneous/miscellaneous_ex15/Makefile.in index 504236ef024..438762128b7 100644 --- a/examples/miscellaneous/miscellaneous_ex15/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex15/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex16/Makefile.in b/examples/miscellaneous/miscellaneous_ex16/Makefile.in index 816dc5777b4..acaecda9d82 100644 --- a/examples/miscellaneous/miscellaneous_ex16/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex16/Makefile.in @@ -481,11 +481,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -533,6 +540,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex17/Makefile.in b/examples/miscellaneous/miscellaneous_ex17/Makefile.in index d7264bce057..8ab2dc797f8 100644 --- a/examples/miscellaneous/miscellaneous_ex17/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex17/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex2/Makefile.in b/examples/miscellaneous/miscellaneous_ex2/Makefile.in index bc5b0d64089..5e2d6279049 100644 --- a/examples/miscellaneous/miscellaneous_ex2/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex2/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex3/Makefile.in b/examples/miscellaneous/miscellaneous_ex3/Makefile.in index 2f5e956a6ae..d58bfb75a85 100644 --- a/examples/miscellaneous/miscellaneous_ex3/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex3/Makefile.in @@ -470,11 +470,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -522,6 +529,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex4/Makefile.in b/examples/miscellaneous/miscellaneous_ex4/Makefile.in index d9d6f954cbc..f35a439ba5f 100644 --- a/examples/miscellaneous/miscellaneous_ex4/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex4/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex5/Makefile.in b/examples/miscellaneous/miscellaneous_ex5/Makefile.in index 719d522a31a..dc7dbeeef7b 100644 --- a/examples/miscellaneous/miscellaneous_ex5/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex5/Makefile.in @@ -479,11 +479,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -531,6 +538,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex6/Makefile.in b/examples/miscellaneous/miscellaneous_ex6/Makefile.in index a5a756000c3..a985950b56d 100644 --- a/examples/miscellaneous/miscellaneous_ex6/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex6/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex7/Makefile.in b/examples/miscellaneous/miscellaneous_ex7/Makefile.in index d0115c3cac9..e3515b9f785 100644 --- a/examples/miscellaneous/miscellaneous_ex7/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex7/Makefile.in @@ -508,11 +508,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -560,6 +567,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex8/Makefile.in b/examples/miscellaneous/miscellaneous_ex8/Makefile.in index 270aa93b899..d990641f148 100644 --- a/examples/miscellaneous/miscellaneous_ex8/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex8/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/miscellaneous/miscellaneous_ex9/Makefile.in b/examples/miscellaneous/miscellaneous_ex9/Makefile.in index 46f5b5339d5..3860b7d8388 100644 --- a/examples/miscellaneous/miscellaneous_ex9/Makefile.in +++ b/examples/miscellaneous/miscellaneous_ex9/Makefile.in @@ -505,11 +505,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -557,6 +564,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/optimization/optimization_ex1/Makefile.in b/examples/optimization/optimization_ex1/Makefile.in index cf5012ab431..fb3baf00e2d 100644 --- a/examples/optimization/optimization_ex1/Makefile.in +++ b/examples/optimization/optimization_ex1/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/optimization/optimization_ex2/Makefile.in b/examples/optimization/optimization_ex2/Makefile.in index f3065b739c7..c7816e72654 100644 --- a/examples/optimization/optimization_ex2/Makefile.in +++ b/examples/optimization/optimization_ex2/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex1/Makefile.in b/examples/reduced_basis/reduced_basis_ex1/Makefile.in index 0879171980e..fa1d195a31a 100644 --- a/examples/reduced_basis/reduced_basis_ex1/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex1/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex2/Makefile.in b/examples/reduced_basis/reduced_basis_ex2/Makefile.in index 986069c3c25..2c34d349aeb 100644 --- a/examples/reduced_basis/reduced_basis_ex2/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex2/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex3/Makefile.in b/examples/reduced_basis/reduced_basis_ex3/Makefile.in index f68264db04e..41d6871eef3 100644 --- a/examples/reduced_basis/reduced_basis_ex3/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex3/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex4/Makefile.in b/examples/reduced_basis/reduced_basis_ex4/Makefile.in index 2c3343c83e8..a7bd31cb843 100644 --- a/examples/reduced_basis/reduced_basis_ex4/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex4/Makefile.in @@ -494,11 +494,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -546,6 +553,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex5/Makefile.in b/examples/reduced_basis/reduced_basis_ex5/Makefile.in index 238b469fe39..82b5b2fbc05 100644 --- a/examples/reduced_basis/reduced_basis_ex5/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex5/Makefile.in @@ -504,11 +504,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -556,6 +563,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex6/Makefile.in b/examples/reduced_basis/reduced_basis_ex6/Makefile.in index 50076f35515..dbc24072e30 100644 --- a/examples/reduced_basis/reduced_basis_ex6/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex6/Makefile.in @@ -494,11 +494,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -546,6 +553,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/reduced_basis/reduced_basis_ex7/Makefile.in b/examples/reduced_basis/reduced_basis_ex7/Makefile.in index 3817bee46df..a8446610838 100644 --- a/examples/reduced_basis/reduced_basis_ex7/Makefile.in +++ b/examples/reduced_basis/reduced_basis_ex7/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/solution_transfer/solution_transfer_ex1/Makefile.in b/examples/solution_transfer/solution_transfer_ex1/Makefile.in index cd7613f44f7..5a0d14c6136 100644 --- a/examples/solution_transfer/solution_transfer_ex1/Makefile.in +++ b/examples/solution_transfer/solution_transfer_ex1/Makefile.in @@ -465,11 +465,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -517,6 +524,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/subdomains/subdomains_ex1/Makefile.in b/examples/subdomains/subdomains_ex1/Makefile.in index f6238ba3205..52deb3d0ade 100644 --- a/examples/subdomains/subdomains_ex1/Makefile.in +++ b/examples/subdomains/subdomains_ex1/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/subdomains/subdomains_ex2/Makefile.in b/examples/subdomains/subdomains_ex2/Makefile.in index 5c20167218c..b32dcd0e3c9 100644 --- a/examples/subdomains/subdomains_ex2/Makefile.in +++ b/examples/subdomains/subdomains_ex2/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/subdomains/subdomains_ex3/Makefile.in b/examples/subdomains/subdomains_ex3/Makefile.in index 3a83f502b61..a3d5c4a101d 100644 --- a/examples/subdomains/subdomains_ex3/Makefile.in +++ b/examples/subdomains/subdomains_ex3/Makefile.in @@ -474,11 +474,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -526,6 +533,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex1/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex1/Makefile.in index 3add79bf28a..c0fc74e97bf 100644 --- a/examples/systems_of_equations/systems_of_equations_ex1/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex1/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex2/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex2/Makefile.in index cd44f4a5603..a89c3ec3026 100644 --- a/examples/systems_of_equations/systems_of_equations_ex2/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex2/Makefile.in @@ -471,11 +471,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -523,6 +530,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex3/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex3/Makefile.in index f5c4ff69de1..f0afcad3be3 100644 --- a/examples/systems_of_equations/systems_of_equations_ex3/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex3/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex4/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex4/Makefile.in index 0fbdb133bf1..dcdbbe495d2 100644 --- a/examples/systems_of_equations/systems_of_equations_ex4/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex4/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex5/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex5/Makefile.in index d1f25e7dc8b..ff6e7676c11 100644 --- a/examples/systems_of_equations/systems_of_equations_ex5/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex5/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex6/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex6/Makefile.in index 5712834b887..da837f22e98 100644 --- a/examples/systems_of_equations/systems_of_equations_ex6/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex6/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex7/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex7/Makefile.in index 15445020704..4ef11376ea4 100644 --- a/examples/systems_of_equations/systems_of_equations_ex7/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex7/Makefile.in @@ -472,11 +472,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -524,6 +531,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex8/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex8/Makefile.in index abcd909b40d..e5c7279beb3 100644 --- a/examples/systems_of_equations/systems_of_equations_ex8/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex8/Makefile.in @@ -510,11 +510,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -562,6 +569,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/systems_of_equations/systems_of_equations_ex9/Makefile.in b/examples/systems_of_equations/systems_of_equations_ex9/Makefile.in index a497c06f581..495f1b401f7 100644 --- a/examples/systems_of_equations/systems_of_equations_ex9/Makefile.in +++ b/examples/systems_of_equations/systems_of_equations_ex9/Makefile.in @@ -472,11 +472,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -524,6 +531,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/transient/transient_ex1/Makefile.in b/examples/transient/transient_ex1/Makefile.in index 288208b4c6c..cb1f7123cd7 100644 --- a/examples/transient/transient_ex1/Makefile.in +++ b/examples/transient/transient_ex1/Makefile.in @@ -480,11 +480,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -532,6 +539,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/transient/transient_ex2/Makefile.in b/examples/transient/transient_ex2/Makefile.in index bae2b2fcc21..3a5648a9715 100644 --- a/examples/transient/transient_ex2/Makefile.in +++ b/examples/transient/transient_ex2/Makefile.in @@ -466,11 +466,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -518,6 +525,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/transient/transient_ex3/Makefile.in b/examples/transient/transient_ex3/Makefile.in index 031ab6ae7a6..418ce7dfed8 100644 --- a/examples/transient/transient_ex3/Makefile.in +++ b/examples/transient/transient_ex3/Makefile.in @@ -514,11 +514,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -566,6 +573,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex1/Makefile.in b/examples/vector_fe/vector_fe_ex1/Makefile.in index c474401c7ad..66462dd6f04 100644 --- a/examples/vector_fe/vector_fe_ex1/Makefile.in +++ b/examples/vector_fe/vector_fe_ex1/Makefile.in @@ -478,11 +478,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -530,6 +537,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex10/Makefile.in b/examples/vector_fe/vector_fe_ex10/Makefile.in index c2a3aa0dd15..97e297f7568 100644 --- a/examples/vector_fe/vector_fe_ex10/Makefile.in +++ b/examples/vector_fe/vector_fe_ex10/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex2/Makefile.in b/examples/vector_fe/vector_fe_ex2/Makefile.in index 1aca800f63c..ad09c3743fa 100644 --- a/examples/vector_fe/vector_fe_ex2/Makefile.in +++ b/examples/vector_fe/vector_fe_ex2/Makefile.in @@ -504,11 +504,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -556,6 +563,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex3/Makefile.in b/examples/vector_fe/vector_fe_ex3/Makefile.in index b033d436f7d..5994d90a2bf 100644 --- a/examples/vector_fe/vector_fe_ex3/Makefile.in +++ b/examples/vector_fe/vector_fe_ex3/Makefile.in @@ -504,11 +504,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -556,6 +563,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex4/Makefile.in b/examples/vector_fe/vector_fe_ex4/Makefile.in index b2320fc3c58..91be49794d4 100644 --- a/examples/vector_fe/vector_fe_ex4/Makefile.in +++ b/examples/vector_fe/vector_fe_ex4/Makefile.in @@ -504,11 +504,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -556,6 +563,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex5/Makefile.in b/examples/vector_fe/vector_fe_ex5/Makefile.in index 21a71638e6e..62b45033645 100644 --- a/examples/vector_fe/vector_fe_ex5/Makefile.in +++ b/examples/vector_fe/vector_fe_ex5/Makefile.in @@ -491,11 +491,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -543,6 +550,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex6/Makefile.in b/examples/vector_fe/vector_fe_ex6/Makefile.in index cb550f280e4..d092712abe2 100644 --- a/examples/vector_fe/vector_fe_ex6/Makefile.in +++ b/examples/vector_fe/vector_fe_ex6/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex7/Makefile.in b/examples/vector_fe/vector_fe_ex7/Makefile.in index 6ae32888b36..65dce847a17 100644 --- a/examples/vector_fe/vector_fe_ex7/Makefile.in +++ b/examples/vector_fe/vector_fe_ex7/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex8/Makefile.in b/examples/vector_fe/vector_fe_ex8/Makefile.in index fe881610825..d5c542a648e 100644 --- a/examples/vector_fe/vector_fe_ex8/Makefile.in +++ b/examples/vector_fe/vector_fe_ex8/Makefile.in @@ -489,11 +489,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -541,6 +548,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/examples/vector_fe/vector_fe_ex9/Makefile.in b/examples/vector_fe/vector_fe_ex9/Makefile.in index 34e5092c976..0e362c7a3f8 100644 --- a/examples/vector_fe/vector_fe_ex9/Makefile.in +++ b/examples/vector_fe/vector_fe_ex9/Makefile.in @@ -499,11 +499,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -551,6 +558,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ diff --git a/include/Makefile.in b/include/Makefile.in index 15e2ded0d9e..e55732f1235 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -380,11 +380,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -432,6 +439,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ @@ -635,6 +643,7 @@ include_HEADERS = \ base/libmesh_abort.h \ base/libmesh_base.h \ base/libmesh_common.h \ + base/libmesh_device.h \ base/libmesh_documentation.h \ base/libmesh_exceptions.h \ base/libmesh_logging.h \ @@ -929,7 +938,6 @@ include_HEADERS = \ parallel/threads_allocators.h \ parallel/threads_none.h \ parallel/threads_pthread.h \ - parallel/threads_spin_mutex_forward.h \ parallel/threads_tbb.h \ partitioning/centroid_partitioner.h \ partitioning/hilbert_sfc_partitioner.h \ diff --git a/include/libmesh/Makefile.in b/include/libmesh/Makefile.in index 0e95a2a8ef6..5c5b77c25db 100644 --- a/include/libmesh/Makefile.in +++ b/include/libmesh/Makefile.in @@ -309,11 +309,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -361,6 +368,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ @@ -530,10 +538,11 @@ EXTRA_DIST = rebuild_makefile.sh BUILT_SOURCES = dirichlet_boundaries.h dof_map.h dof_map_base.h \ dof_object.h factory.h float128_shims.h getpot.h id_types.h \ libmesh.h libmesh_abort.h libmesh_augment_std_namespace.h \ - libmesh_base.h libmesh_common.h libmesh_documentation.h \ - libmesh_exceptions.h libmesh_logging.h libmesh_singleton.h \ - libmesh_version.h multi_predicates.h periodic_boundaries.h \ - periodic_boundary.h periodic_boundary_base.h print_trace.h \ + libmesh_base.h libmesh_common.h libmesh_device.h \ + libmesh_documentation.h libmesh_exceptions.h libmesh_logging.h \ + libmesh_singleton.h libmesh_version.h multi_predicates.h \ + periodic_boundaries.h periodic_boundary.h \ + periodic_boundary_base.h print_trace.h \ reference_counted_object.h reference_counter.h \ single_predicates.h sparsity_pattern.h variable.h \ variant_filter_iterator.h enum_convergence_flags.h \ @@ -629,13 +638,13 @@ BUILT_SOURCES = dirichlet_boundaries.h dof_map.h dof_map_base.h \ parallel_ghost_sync.h parallel_hilbert.h parallel_histogram.h \ parallel_node.h parallel_object.h parallel_only.h \ parallel_sort.h threads.h threads_allocators.h threads_none.h \ - threads_pthread.h threads_spin_mutex_forward.h threads_tbb.h \ - centroid_partitioner.h hilbert_sfc_partitioner.h \ - linear_partitioner.h mapped_subdomain_partitioner.h \ - metis_csr_graph.h metis_partitioner.h morton_sfc_partitioner.h \ - parmetis_helper.h parmetis_partitioner.h partitioner.h \ - sfc_partitioner.h subdomain_partitioner.h diff_physics.h \ - diff_qoi.h fem_physics.h quadrature.h quadrature_clough.h \ + threads_pthread.h threads_tbb.h centroid_partitioner.h \ + hilbert_sfc_partitioner.h linear_partitioner.h \ + mapped_subdomain_partitioner.h metis_csr_graph.h \ + metis_partitioner.h morton_sfc_partitioner.h parmetis_helper.h \ + parmetis_partitioner.h partitioner.h sfc_partitioner.h \ + subdomain_partitioner.h diff_physics.h diff_qoi.h \ + fem_physics.h quadrature.h quadrature_clough.h \ quadrature_composite.h quadrature_conical.h quadrature_gauss.h \ quadrature_gauss_lobatto.h quadrature_gm.h quadrature_grid.h \ quadrature_jacobi.h quadrature_monomial.h quadrature_nodal.h \ @@ -992,6 +1001,9 @@ libmesh_base.h: $(top_srcdir)/include/base/libmesh_base.h libmesh_common.h: $(top_srcdir)/include/base/libmesh_common.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ +libmesh_device.h: $(top_srcdir)/include/base/libmesh_device.h + $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ + libmesh_documentation.h: $(top_srcdir)/include/base/libmesh_documentation.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ @@ -1886,9 +1898,6 @@ threads_none.h: $(top_srcdir)/include/parallel/threads_none.h threads_pthread.h: $(top_srcdir)/include/parallel/threads_pthread.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ -threads_spin_mutex_forward.h: $(top_srcdir)/include/parallel/threads_spin_mutex_forward.h - $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ - threads_tbb.h: $(top_srcdir)/include/parallel/threads_tbb.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ diff --git a/tests/Makefile.in b/tests/Makefile.in index 59ed2e7641e..d94f4b9384d 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -95,25 +95,31 @@ target_triplet = @target@ @LIBMESH_ENABLE_FPARSER_TRUE@ fparser/autodiff.C check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ - $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) + $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ + $(am__EXEEXT_7) +TESTS = $(am__EXEEXT_1) $(am__append_11) +@LIBMESH_ENABLE_KOKKOS_TRUE@am__append_2 = -I$(top_srcdir)/include $(KOKKOS_CPPFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@am__append_3 = kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit +@LIBMESH_ENABLE_KOKKOS_TRUE@am__append_4 = kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit # our GLIBC debugging preprocessor flags seem to potentially conflict # with libcppunit binaries. Some cppunit versions work fine for us, # others segfault and/or hang. By default we will not run # GLIBCXX-debugging builds with cppunit unless specifically # configured to. -@ACSM_ENABLE_GLIBCXX_DEBUGGING_CPPUNIT_TRUE@@ACSM_ENABLE_GLIBCXX_DEBUGGING_TRUE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_2 = unit_tests-dbg -@ACSM_ENABLE_GLIBCXX_DEBUGGING_FALSE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_3 = unit_tests-dbg -@LIBMESH_DEVEL_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_4 = unit_tests-devel -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_PROF_MODE_TRUE@am__append_5 = unit_tests-prof -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPROF_MODE_TRUE@am__append_6 = unit_tests-oprof -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@am__append_7 = unit_tests-opt -@LIBMESH_VPATH_BUILD_TRUE@am__append_8 = .linkstamp +@ACSM_ENABLE_GLIBCXX_DEBUGGING_CPPUNIT_TRUE@@ACSM_ENABLE_GLIBCXX_DEBUGGING_TRUE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_5 = unit_tests-dbg +@ACSM_ENABLE_GLIBCXX_DEBUGGING_FALSE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_6 = unit_tests-dbg +@LIBMESH_DEVEL_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_7 = unit_tests-devel +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_PROF_MODE_TRUE@am__append_8 = unit_tests-prof +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPROF_MODE_TRUE@am__append_9 = unit_tests-oprof +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@am__append_10 = unit_tests-opt +@LIBMESH_ENABLE_CPPUNIT_TRUE@am__append_11 = run_unit_tests.sh +@LIBMESH_VPATH_BUILD_TRUE@am__append_12 = .linkstamp ###################################################################### # # Don't leave code coverage outputs lying around -@CODE_COVERAGE_ENABLED_TRUE@am__append_9 = */*.gcda */*.gcno +@CODE_COVERAGE_ENABLED_TRUE@am__append_13 = */*.gcda */*.gcno subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ @@ -182,12 +188,34 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/libmesh_config.h.tmp CONFIG_CLEAN_FILES = run_unit_tests.sh CONFIG_CLEAN_VPATH_FILES = -@ACSM_ENABLE_GLIBCXX_DEBUGGING_CPPUNIT_TRUE@@ACSM_ENABLE_GLIBCXX_DEBUGGING_TRUE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_1 = unit_tests-dbg$(EXEEXT) -@ACSM_ENABLE_GLIBCXX_DEBUGGING_FALSE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_2 = unit_tests-dbg$(EXEEXT) -@LIBMESH_DEVEL_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_3 = unit_tests-devel$(EXEEXT) -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_PROF_MODE_TRUE@am__EXEEXT_4 = unit_tests-prof$(EXEEXT) -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPROF_MODE_TRUE@am__EXEEXT_5 = unit_tests-oprof$(EXEEXT) -@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@am__EXEEXT_6 = unit_tests-opt$(EXEEXT) +@LIBMESH_ENABLE_KOKKOS_TRUE@am__EXEEXT_1 = kokkos_vector_ops_oracle_unit$(EXEEXT) \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ kokkos_tensor_ops_oracle_unit$(EXEEXT) +@ACSM_ENABLE_GLIBCXX_DEBUGGING_CPPUNIT_TRUE@@ACSM_ENABLE_GLIBCXX_DEBUGGING_TRUE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_2 = unit_tests-dbg$(EXEEXT) +@ACSM_ENABLE_GLIBCXX_DEBUGGING_FALSE@@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_3 = unit_tests-dbg$(EXEEXT) +@LIBMESH_DEVEL_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@am__EXEEXT_4 = unit_tests-devel$(EXEEXT) +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_PROF_MODE_TRUE@am__EXEEXT_5 = unit_tests-prof$(EXEEXT) +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPROF_MODE_TRUE@am__EXEEXT_6 = unit_tests-oprof$(EXEEXT) +@LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@am__EXEEXT_7 = unit_tests-opt$(EXEEXT) +am__kokkos_tensor_ops_oracle_unit_SOURCES_DIST = \ + numerics/kokkos_tensor_ops_oracle_test.K +am__dirstamp = $(am__leading_dot)dirstamp +@LIBMESH_ENABLE_KOKKOS_TRUE@am_kokkos_tensor_ops_oracle_unit_OBJECTS = numerics/kokkos_tensor_ops_oracle_test.$(OBJEXT) +kokkos_tensor_ops_oracle_unit_OBJECTS = \ + $(am_kokkos_tensor_ops_oracle_unit_OBJECTS) +am__DEPENDENCIES_1 = +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_DEPENDENCIES = \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(top_builddir)/libmesh_opt.la \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(am__DEPENDENCIES_1) \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(am__DEPENDENCIES_1) +am__kokkos_vector_ops_oracle_unit_SOURCES_DIST = \ + numerics/kokkos_vector_ops_oracle_test.K +@LIBMESH_ENABLE_KOKKOS_TRUE@am_kokkos_vector_ops_oracle_unit_OBJECTS = numerics/kokkos_vector_ops_oracle_test.$(OBJEXT) +kokkos_vector_ops_oracle_unit_OBJECTS = \ + $(am_kokkos_vector_ops_oracle_unit_OBJECTS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_DEPENDENCIES = \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(top_builddir)/libmesh_opt.la \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(am__DEPENDENCIES_1) \ +@LIBMESH_ENABLE_KOKKOS_TRUE@ $(am__DEPENDENCIES_1) am__unit_tests_dbg_SOURCES_DIST = driver.C libmesh_cppunit.h \ stream_redirector.h test_comm.h base/dof_object_test.h \ base/dof_map_test.C base/default_coupling_test.C \ @@ -262,7 +290,6 @@ am__unit_tests_dbg_SOURCES_DIST = driver.C libmesh_cppunit.h \ utils/parameters_test.C utils/point_locator_test.C \ utils/rb_parameters_test.C utils/transparent_comparator.C \ utils/vectormap_test.C utils/xdr_test.C fparser/autodiff.C -am__dirstamp = $(am__leading_dot)dirstamp @LIBMESH_ENABLE_FPARSER_TRUE@am__objects_1 = fparser/unit_tests_dbg-autodiff.$(OBJEXT) am__objects_2 = unit_tests_dbg-driver.$(OBJEXT) \ base/unit_tests_dbg-dof_map_test.$(OBJEXT) \ @@ -1860,10 +1887,14 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(unit_tests_dbg_SOURCES) $(unit_tests_devel_SOURCES) \ +SOURCES = $(kokkos_tensor_ops_oracle_unit_SOURCES) \ + $(kokkos_vector_ops_oracle_unit_SOURCES) \ + $(unit_tests_dbg_SOURCES) $(unit_tests_devel_SOURCES) \ $(unit_tests_oprof_SOURCES) $(unit_tests_opt_SOURCES) \ $(unit_tests_prof_SOURCES) -DIST_SOURCES = $(am__unit_tests_dbg_SOURCES_DIST) \ +DIST_SOURCES = $(am__kokkos_tensor_ops_oracle_unit_SOURCES_DIST) \ + $(am__kokkos_vector_ops_oracle_unit_SOURCES_DIST) \ + $(am__unit_tests_dbg_SOURCES_DIST) \ $(am__unit_tests_devel_SOURCES_DIST) \ $(am__unit_tests_oprof_SOURCES_DIST) \ $(am__unit_tests_opt_SOURCES_DIST) \ @@ -2064,11 +2095,18 @@ HDF5_DIR = @HDF5_DIR@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_PREFIX = @HDF5_PREFIX@ +HIPCC = @HIPCC@ +ICPX = @ICPX@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KOKKOS_CPPFLAGS = @KOKKOS_CPPFLAGS@ +KOKKOS_CXX = @KOKKOS_CXX@ +KOKKOS_CXXFLAGS = @KOKKOS_CXXFLAGS@ +KOKKOS_LDFLAGS = @KOKKOS_LDFLAGS@ +KOKKOS_LIBS = @KOKKOS_LIBS@ LASPACK_INCLUDE = @LASPACK_INCLUDE@ LASPACK_LIB = @LASPACK_LIB@ LD = @LD@ @@ -2116,6 +2154,7 @@ NODEPRECATEDFLAG = @NODEPRECATEDFLAG@ NOX_INCLUDES = @NOX_INCLUDES@ NOX_LIBS = @NOX_LIBS@ NOX_MAKEFILE_EXPORT = @NOX_MAKEFILE_EXPORT@ +NVCC = @NVCC@ NVTX_INCLUDE = @NVTX_INCLUDE@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ @@ -2288,6 +2327,7 @@ AM_CPPFLAGS = $(libmesh_optional_INCLUDES) -I$(top_builddir)/include \ -DLIBMESH_IS_UNIT_TESTING AM_LDFLAGS = $(libmesh_LDFLAGS) $(libmesh_contrib_LDFLAGS) +KOKKOS_TEST_CPPFLAGS = $(am__append_2) unit_tests_sources = driver.C libmesh_cppunit.h stream_redirector.h \ test_comm.h base/dof_object_test.h base/dof_map_test.C \ base/default_coupling_test.C base/getpot_test.C \ @@ -2450,6 +2490,16 @@ unit_tests_data = $(data) # Why isn't this working automatically? EXTRA_DIST = $(data) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_SOURCES = numerics/kokkos_vector_ops_oracle_test.K +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_vector_ops_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_SOURCES = numerics/kokkos_tensor_ops_oracle_test.K +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) +@LIBMESH_ENABLE_KOKKOS_TRUE@kokkos_tensor_ops_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) @LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@unit_tests_dbg_SOURCES = $(unit_tests_sources) @LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@unit_tests_dbg_CPPFLAGS = $(CPPFLAGS_DBG) $(AM_CPPFLAGS) @LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@unit_tests_dbg_CXXFLAGS = $(CXXFLAGS_DBG) @@ -2480,7 +2530,16 @@ EXTRA_DIST = $(data) @LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@unit_tests_opt_LDADD = $(top_builddir)/libmesh_opt.la @LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@unit_tests_optdir = $(datadir) @LIBMESH_ENABLE_CPPUNIT_TRUE@@LIBMESH_OPT_MODE_TRUE@unit_tests_opt_DATA = $(data) -@LIBMESH_ENABLE_CPPUNIT_TRUE@TESTS = run_unit_tests.sh + +# Custom link rules so the Kokkos compiler drives the final link step. +kokkos_vector_ops_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_vector_ops_oracle_unit_LDFLAGS) -o $@ + +kokkos_tensor_ops_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_tensor_ops_oracle_unit_LDFLAGS) -o $@ + CLEANFILES = cube_mesh.xda slit_mesh.xda slit_solution.xda out.e \ mesh_with_soln.e elemental_from_nodal.e write_elemset_data.e \ write_sideset_data.e write_nodeset_data.e write_edgeset_data.e \ @@ -2514,8 +2573,8 @@ CLEANFILES = cube_mesh.xda slit_mesh.xda slit_solution.xda out.e \ write_exodus_QUADSHELL9.e write_exodus_TET10.e \ write_exodus_TET14.e write_exodus_TET4.e write_exodus_TRI3.e \ write_exodus_TRI6.e write_exodus_TRI7.e \ - write_exodus_TRISHELL3.e smoother.out $(am__append_8) \ - $(am__append_9) + write_exodus_TRISHELL3.e smoother.out $(am__append_12) \ + $(am__append_13) # need to link any data files for VPATH builds @LIBMESH_VPATH_BUILD_TRUE@BUILT_SOURCES = .linkstamp @@ -2523,7 +2582,7 @@ all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .C .lo .o .obj +.SUFFIXES: .C .K .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -2559,6 +2618,24 @@ run_unit_tests.sh: $(top_builddir)/config.status $(srcdir)/run_unit_tests.sh.in clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) +numerics/$(am__dirstamp): + @$(MKDIR_P) numerics + @: >>numerics/$(am__dirstamp) +numerics/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) numerics/$(DEPDIR) + @: >>numerics/$(DEPDIR)/$(am__dirstamp) +numerics/kokkos_tensor_ops_oracle_test.$(OBJEXT): \ + numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) + +kokkos_tensor_ops_oracle_unit$(EXEEXT): $(kokkos_tensor_ops_oracle_unit_OBJECTS) $(kokkos_tensor_ops_oracle_unit_DEPENDENCIES) $(EXTRA_kokkos_tensor_ops_oracle_unit_DEPENDENCIES) + @rm -f kokkos_tensor_ops_oracle_unit$(EXEEXT) + $(AM_V_GEN)$(kokkos_tensor_ops_oracle_unit_LINK) $(kokkos_tensor_ops_oracle_unit_OBJECTS) $(kokkos_tensor_ops_oracle_unit_LDADD) $(LIBS) +numerics/kokkos_vector_ops_oracle_test.$(OBJEXT): \ + numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) + +kokkos_vector_ops_oracle_unit$(EXEEXT): $(kokkos_vector_ops_oracle_unit_OBJECTS) $(kokkos_vector_ops_oracle_unit_DEPENDENCIES) $(EXTRA_kokkos_vector_ops_oracle_unit_DEPENDENCIES) + @rm -f kokkos_vector_ops_oracle_unit$(EXEEXT) + $(AM_V_GEN)$(kokkos_vector_ops_oracle_unit_LINK) $(kokkos_vector_ops_oracle_unit_OBJECTS) $(kokkos_vector_ops_oracle_unit_LDADD) $(LIBS) base/$(am__dirstamp): @$(MKDIR_P) base @: >>base/$(am__dirstamp) @@ -2727,12 +2804,6 @@ mesh/unit_tests_dbg-project_solution_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_dbg-xdrio_test.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) -numerics/$(am__dirstamp): - @$(MKDIR_P) numerics - @: >>numerics/$(am__dirstamp) -numerics/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) numerics/$(DEPDIR) - @: >>numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_dbg-composite_function_test.$(OBJEXT): \ numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_dbg-coupling_matrix_test.$(OBJEXT): \ @@ -14717,6 +14788,15 @@ $(top_builddir)/libmesh_prof.la: FORCE $(top_builddir)/libmesh_oprof.la: FORCE (cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) libmesh_oprof.la) +# Compile .K translation units with the Kokkos device compiler. +# $(MPI_INCLUDES) is needed because KOKKOS_CXX may be nvcc/hipcc +# instead of the MPI compiler wrapper, so mpi.h won't be found implicitly. +.K.o: + $(KOKKOS_CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(MPI_INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(KOKKOS_CXXFLAGS) \ + -c $< -o $@ + @LIBMESH_VPATH_BUILD_TRUE@.linkstamp: @LIBMESH_VPATH_BUILD_TRUE@ -rm -f solutions && $(LN_S) -f $(srcdir)/solutions . @LIBMESH_VPATH_BUILD_TRUE@ -rm -f meshes && $(LN_S) -f $(srcdir)/meshes . From a326237d8faf97f364ab447e9d13883fd74f63cc Mon Sep 17 00:00:00 2001 From: rochi00 Date: Tue, 5 May 2026 10:28:23 -0600 Subject: [PATCH 5/8] Add Kokkos FE implementation headers --- include/Makefile.am | 18 + include/enums/enum_fe_elem_class.h | 50 ++ include/gpu/kokkos_fe_base.h | 43 ++ include/gpu/kokkos_fe_evaluator.h | 368 +++++++++++ include/gpu/kokkos_fe_face_map.h | 160 +++++ include/gpu/kokkos_fe_lagrange_1d.h | 92 +++ include/gpu/kokkos_fe_lagrange_2d.h | 253 +++++++ include/gpu/kokkos_fe_lagrange_3d.h | 367 +++++++++++ include/gpu/kokkos_fe_map.h | 235 +++++++ include/gpu/kokkos_fe_monomial.h | 941 +++++++++++++++++++++++++++ include/gpu/kokkos_fe_types.h | 681 +++++++++++++++++++ include/gpu/kokkos_quadrature.h | 652 +++++++++++++++++++ include/gpu/kokkos_scalar_types.h | 118 ++++ src/quadrature/quadrature_gauss_3D.C | 2 - 14 files changed, 3978 insertions(+), 2 deletions(-) create mode 100644 include/enums/enum_fe_elem_class.h create mode 100644 include/gpu/kokkos_fe_base.h create mode 100644 include/gpu/kokkos_fe_evaluator.h create mode 100644 include/gpu/kokkos_fe_face_map.h create mode 100644 include/gpu/kokkos_fe_lagrange_1d.h create mode 100644 include/gpu/kokkos_fe_lagrange_2d.h create mode 100644 include/gpu/kokkos_fe_lagrange_3d.h create mode 100644 include/gpu/kokkos_fe_map.h create mode 100644 include/gpu/kokkos_fe_monomial.h create mode 100644 include/gpu/kokkos_fe_types.h create mode 100644 include/gpu/kokkos_quadrature.h create mode 100644 include/gpu/kokkos_scalar_types.h diff --git a/include/Makefile.am b/include/Makefile.am index a8ace90467c..1eb5f275748 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,5 +1,23 @@ SUBDIRS = libmesh +# GPU (Kokkos) FE math headers — installed preserving the gpu/ subdirectory so +# downstream code can use #include "libmesh/gpu/kokkos_fe_types.h" etc. +# nobase_ is used instead of the standard flat install to keep the namespace. +if LIBMESH_ENABLE_KOKKOS +nobase_include_HEADERS = \ + gpu/kokkos_scalar_types.h \ + gpu/kokkos_fe_types.h \ + gpu/kokkos_fe_base.h \ + gpu/kokkos_fe_evaluator.h \ + gpu/kokkos_fe_lagrange_1d.h \ + gpu/kokkos_fe_lagrange_2d.h \ + gpu/kokkos_fe_lagrange_3d.h \ + gpu/kokkos_fe_monomial.h \ + gpu/kokkos_fe_face_map.h \ + gpu/kokkos_fe_map.h \ + gpu/kokkos_quadrature.h +endif + # special handholding for prefix_config.m4 generated files # so that 'make clean ; make' works as does 'make distcheck' # libmesh_config.h is made by ./configure, so it should get diff --git a/include/enums/enum_fe_elem_class.h b/include/enums/enum_fe_elem_class.h new file mode 100644 index 00000000000..2b1b2e96d12 --- /dev/null +++ b/include/enums/enum_fe_elem_class.h @@ -0,0 +1,50 @@ +// The libMesh Finite Element Library. +// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner + +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + +#ifndef LIBMESH_ENUM_FE_ELEM_CLASS_H +#define LIBMESH_ENUM_FE_ELEM_CLASS_H + +namespace libMesh { + +/** + * \enum libMesh::FEElemClass groups element types by topological class, + * independent of polynomial order. + * + * e.g. QUAD4, QUAD8, QUAD9 all map to QUAD; TRI3, TRI6, TRI7 all map to TRI. + * Used together with FEFamily and polynomial order to uniquely identify a + * physics finite element space. + * + * The fixed type allows forward declaration as: + * enum class FEElemClass : unsigned int; + */ +enum class FEElemClass : unsigned int +{ + EDGE = 0, + TRI = 1, + QUAD = 2, + TET = 3, + HEX = 4, + PRISM = 5, + PYRAMID = 6, + N_CLASSES +}; + +} // namespace libMesh + +#endif // LIBMESH_ENUM_FE_ELEM_CLASS_H diff --git a/include/gpu/kokkos_fe_base.h b/include/gpu/kokkos_fe_base.h new file mode 100644 index 00000000000..07664e627eb --- /dev/null +++ b/include/gpu/kokkos_fe_base.h @@ -0,0 +1,43 @@ +// Primary FEEvaluator template for Kokkos device-compatible shape functions. +// +// Uses libMesh's own ElemType and FEFamily enums as non-type template +// parameters — no separate tag structs are needed. +// +// All uses must be explicit specializations defined in the kokkos_fe_lagrange_*.h +// and kokkos_fe_monomial.h headers. Every specialization must provide: +// +// static constexpr unsigned int n_dofs() +// +// LIBMESH_DEVICE_INLINE +// static Real shape(unsigned int i, Real xi, Real eta, Real zeta) +// +// LIBMESH_DEVICE_INLINE +// static RealVector grad_shape(unsigned int i, Real xi, Real eta, Real zeta) +// +// Reference-element coordinate conventions (matching libMesh): +// Edge: xi in [-1, 1] +// Quad: (xi, eta) in [-1,1]^2 +// Hex: (xi, eta, zeta) in [-1,1]^3 +// Tri: (xi, eta) in unit triangle, xi >= 0, eta >= 0, xi+eta <= 1 +// Tet: (xi, eta, zeta) in unit tetrahedron +// +// Unused coordinate arguments (e.g. zeta on a 2D element) are accepted but +// ignored, so call sites can always pass all three without special-casing. +// +#ifndef LIBMESH_KOKKOS_FE_BASE_H +#define LIBMESH_KOKKOS_FE_BASE_H + +#include "gpu/kokkos_scalar_types.h" +#include "libmesh/libmesh_device.h" +#include "libmesh/enum_elem_type.h" +#include "libmesh/enum_fe_family.h" + +namespace libMesh::Kokkos +{ + +template +struct FEEvaluator; // forward declaration only; instantiation requires a specialization + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_BASE_H diff --git a/include/gpu/kokkos_fe_evaluator.h b/include/gpu/kokkos_fe_evaluator.h new file mode 100644 index 00000000000..118880c614d --- /dev/null +++ b/include/gpu/kokkos_fe_evaluator.h @@ -0,0 +1,368 @@ +// Kokkos on-device FE shape function dispatch (fe_evaluator.h). +// +// Provides: +// map_shape — isoparametric Lagrange shape (topology-based) +// grad_map_shape — isoparametric Lagrange gradient (topology-based) +// shape — physics FE shape (FEShapeKey-based) +// grad_shape — physics FE gradient (FEShapeKey-based) +// +// All functions are LIBMESH_DEVICE_INLINE and dispatch via switch statements +// that compile to fast GPU branch logic. +// +// These helpers are intended for Kokkos-enabled code paths. Device execution +// happens from .K translation units, but the header is also parsed by host code. + +#ifndef LIBMESH_KOKKOS_FE_EVALUATOR_H +#define LIBMESH_KOKKOS_FE_EVALUATOR_H + +#include "gpu/kokkos_fe_base.h" +#include "gpu/kokkos_fe_types.h" +#include "gpu/kokkos_fe_lagrange_1d.h" +#include "gpu/kokkos_fe_lagrange_2d.h" +#include "gpu/kokkos_fe_lagrange_3d.h" +#include "gpu/kokkos_fe_monomial.h" +#include "libmesh/enum_elem_type.h" +#include "libmesh/enum_fe_family.h" + +namespace libMesh::Kokkos +{ + +// ── On-device helpers: element class -> spatial dimension ───────────────────── + +LIBMESH_DEVICE_INLINE unsigned int +dim_from_class(FEElemClass cls) +{ + switch (cls) + { + case FEElemClass::EDGE: + return 1; + case FEElemClass::TRI: + case FEElemClass::QUAD: + return 2; + case FEElemClass::TET: + case FEElemClass::HEX: + case FEElemClass::PRISM: + case FEElemClass::PYRAMID: + return 3; + default: + detail::abort_unsupported("dim_from_class(): unsupported element class"); + return 0; + } +} + +LIBMESH_DEVICE_INLINE unsigned int +dim_from_topology(libMesh::ElemType topo) +{ + return dim_from_class(class_from_topology(topo)); +} + +// ── On-device helper: exact libMesh Lagrange key -> evaluator topology ───────── + +LIBMESH_DEVICE_INLINE libMesh::ElemType +lagrange_shape_topology_for_key(FEShapeKey key) +{ + const libMesh::ElemType topo = lagrange_shape_topology_or_invalid(key); + + if (topo == libMesh::INVALID_ELEM) + { + detail::abort_unsupported("lagrange_shape_topology_for_key(): unsupported LAGRANGE key for current Kokkos evaluator support boundary"); + return libMesh::INVALID_ELEM; + } + + return topo; +} + +LIBMESH_DEVICE_INLINE Real +eval_lagrange_shape(libMesh::ElemType topo, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + switch (topo) + { + case libMesh::EDGE2: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::EDGE3: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::TRI3: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::TRI6: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::QUAD4: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::QUAD8: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::QUAD9: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::TET4: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::TET10: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::HEX8: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::HEX20: + return FEEvaluator::shape(i, xi, eta, zeta); + case libMesh::HEX27: + return FEEvaluator::shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("eval_lagrange_shape(): unsupported evaluator topology"); + return Real(0); + } +} + +LIBMESH_DEVICE_INLINE RealVector +eval_lagrange_grad_shape(libMesh::ElemType topo, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + switch (topo) + { + case libMesh::EDGE2: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::EDGE3: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::TRI3: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::TRI6: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::QUAD4: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::QUAD8: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::QUAD9: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::TET4: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::TET10: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::HEX8: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::HEX20: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + case libMesh::HEX27: + return FEEvaluator::grad_shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("eval_lagrange_grad_shape(): unsupported evaluator topology"); + return zero_vector(); + } +} + +// ── Geometry-only shape dispatch (mapping-type + topology) ──────────────────── +// +// Used by map_face_qp_to_parent() for the isoparametric mapping from face reference +// coordinates to parent reference coordinates. +// +// The mapping_type parameter selects the geometric map family. Currently only +// LAGRANGE_MAP is supported; RATIONAL_BERNSTEIN_MAP requires additional +// rational-weight data that is not yet threaded through the device path. + +// ── Compile-time topology versions (preferred for GPU) ─────────────────── +// Template on FEFamily and ElemType so gpu compiler only instantiates the specific +// FEEvaluator specialization. No topology switch means no stack pressure. + +/// Compile-time map shape evaluation. +template +LIBMESH_DEVICE_INLINE Real +map_shape(unsigned int i, Real xi, Real eta, Real zeta) +{ + return FEEvaluator::shape(i, xi, eta, zeta); +} + +/// Compile-time map gradient evaluation. +template +LIBMESH_DEVICE_INLINE RealVector +grad_map_shape(unsigned int i, Real xi, Real eta, Real zeta) +{ + return FEEvaluator::grad_shape(i, xi, eta, zeta); +} + +// ── Runtime topology versions (larger GPU stack usage) ─────────────────── + +/// Evaluate the i-th geometric map shape function at (xi, eta, zeta). +LIBMESH_DEVICE_INLINE Real +map_shape(libMesh::ElemMappingType mapping_type, + libMesh::ElemType topo, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + switch (mapping_type) + { + case libMesh::LAGRANGE_MAP: + return eval_lagrange_shape(topo, i, xi, eta, zeta); + default: + detail::abort_unsupported("map_shape(): only LAGRANGE_MAP is implemented"); + return Real(0); + } +} + +/// Evaluate the reference-space gradient of the i-th geometric map shape function. +LIBMESH_DEVICE_INLINE RealVector +grad_map_shape(libMesh::ElemMappingType mapping_type, + libMesh::ElemType topo, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + switch (mapping_type) + { + case libMesh::LAGRANGE_MAP: + return eval_lagrange_grad_shape(topo, i, xi, eta, zeta); + default: + detail::abort_unsupported("grad_map_shape(): only LAGRANGE_MAP is implemented"); + return zero_vector(); + } +} + +// ── Physics shape dispatch (FEShapeKey-based) ───────────────────────────────── + +/// Evaluate the i-th physics shape function at (xi, eta, zeta). +LIBMESH_DEVICE_INLINE Real +shape(FEShapeKey key, unsigned int i, Real xi, Real eta, Real zeta) +{ + if (!supports_shape(key)) + { + detail::abort_unsupported("shape(): unsupported FE key for current Kokkos evaluator support boundary"); + return Real(0); + } + + switch (key.family) + { + case libMesh::LAGRANGE: + return eval_lagrange_shape(lagrange_shape_topology_for_key(key), i, xi, eta, zeta); + + case libMesh::MONOMIAL: + { + switch (monomial_evaluator_dim_or_zero(key.elem_type)) + { + case 1: + switch (key.order) + { + case 0: return MonomialImpl1D<0>::shape(i, xi, eta, zeta); + case 1: return MonomialImpl1D<1>::shape(i, xi, eta, zeta); + case 2: return MonomialImpl1D<2>::shape(i, xi, eta, zeta); + case 3: return MonomialImpl1D<3>::shape(i, xi, eta, zeta); + case 4: return MonomialImpl1D<4>::shape(i, xi, eta, zeta); + case 5: return MonomialImpl1D<5>::shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("shape(): unsupported 1D MONOMIAL order"); + return Real(0); + } + case 2: + switch (key.order) + { + case 0: return MonomialImpl2D<0>::shape(i, xi, eta, zeta); + case 1: return MonomialImpl2D<1>::shape(i, xi, eta, zeta); + case 2: return MonomialImpl2D<2>::shape(i, xi, eta, zeta); + case 3: return MonomialImpl2D<3>::shape(i, xi, eta, zeta); + case 4: return MonomialImpl2D<4>::shape(i, xi, eta, zeta); + case 5: return MonomialImpl2D<5>::shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("shape(): unsupported 2D MONOMIAL order"); + return Real(0); + } + case 3: + switch (key.order) + { + case 0: return MonomialImpl3D<0>::shape(i, xi, eta, zeta); + case 1: return MonomialImpl3D<1>::shape(i, xi, eta, zeta); + case 2: return MonomialImpl3D<2>::shape(i, xi, eta, zeta); + case 3: return MonomialImpl3D<3>::shape(i, xi, eta, zeta); + case 4: return MonomialImpl3D<4>::shape(i, xi, eta, zeta); + case 5: return MonomialImpl3D<5>::shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("shape(): unsupported 3D MONOMIAL order"); + return Real(0); + } + default: + detail::abort_unsupported("shape(): unsupported MONOMIAL element topology"); + return Real(0); + } + } + + default: + detail::abort_unsupported("shape(): unsupported FE family"); + return Real(0); + } +} + +/// Evaluate the reference-space gradient of the i-th physics shape function. +/// With J from jacobian(), rows are reference derivatives, so +/// grad_ref = J * grad_phys and grad_phys = J.inverse(dim) * grad_ref. +LIBMESH_DEVICE_INLINE RealVector +grad_shape(FEShapeKey key, unsigned int i, Real xi, Real eta, Real zeta) +{ + if (!supports_grad_shape(key)) + { + detail::abort_unsupported("grad_shape(): unsupported FE key for current Kokkos evaluator support boundary"); + return zero_vector(); + } + + switch (key.family) + { + case libMesh::LAGRANGE: + return eval_lagrange_grad_shape(lagrange_shape_topology_for_key(key), i, xi, eta, zeta); + + case libMesh::MONOMIAL: + { + switch (monomial_evaluator_dim_or_zero(key.elem_type)) + { + case 1: + switch (key.order) + { + case 0: return MonomialImpl1D<0>::grad_shape(i, xi, eta, zeta); + case 1: return MonomialImpl1D<1>::grad_shape(i, xi, eta, zeta); + case 2: return MonomialImpl1D<2>::grad_shape(i, xi, eta, zeta); + case 3: return MonomialImpl1D<3>::grad_shape(i, xi, eta, zeta); + case 4: return MonomialImpl1D<4>::grad_shape(i, xi, eta, zeta); + case 5: return MonomialImpl1D<5>::grad_shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("grad_shape(): unsupported 1D MONOMIAL order"); + return zero_vector(); + } + case 2: + switch (key.order) + { + case 0: return MonomialImpl2D<0>::grad_shape(i, xi, eta, zeta); + case 1: return MonomialImpl2D<1>::grad_shape(i, xi, eta, zeta); + case 2: return MonomialImpl2D<2>::grad_shape(i, xi, eta, zeta); + case 3: return MonomialImpl2D<3>::grad_shape(i, xi, eta, zeta); + case 4: return MonomialImpl2D<4>::grad_shape(i, xi, eta, zeta); + case 5: return MonomialImpl2D<5>::grad_shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("grad_shape(): unsupported 2D MONOMIAL order"); + return zero_vector(); + } + case 3: + switch (key.order) + { + case 0: return MonomialImpl3D<0>::grad_shape(i, xi, eta, zeta); + case 1: return MonomialImpl3D<1>::grad_shape(i, xi, eta, zeta); + case 2: return MonomialImpl3D<2>::grad_shape(i, xi, eta, zeta); + case 3: return MonomialImpl3D<3>::grad_shape(i, xi, eta, zeta); + case 4: return MonomialImpl3D<4>::grad_shape(i, xi, eta, zeta); + case 5: return MonomialImpl3D<5>::grad_shape(i, xi, eta, zeta); + default: + detail::abort_unsupported("grad_shape(): unsupported 3D MONOMIAL order"); + return zero_vector(); + } + default: + detail::abort_unsupported("grad_shape(): unsupported MONOMIAL element topology"); + return zero_vector(); + } + } + + default: + detail::abort_unsupported("grad_shape(): unsupported FE family"); + return zero_vector(); + } +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_EVALUATOR_H diff --git a/include/gpu/kokkos_fe_face_map.h b/include/gpu/kokkos_fe_face_map.h new file mode 100644 index 00000000000..822ce4da406 --- /dev/null +++ b/include/gpu/kokkos_fe_face_map.h @@ -0,0 +1,160 @@ +#ifndef LIBMESH_KOKKOS_FE_FACE_MAP_H +#define LIBMESH_KOKKOS_FE_FACE_MAP_H + +#ifdef LIBMESH_HAVE_KOKKOS + +#include "gpu/kokkos_fe_evaluator.h" +#include "libmesh/elem.h" + +namespace libMesh::Kokkos +{ + +LIBMESH_DEVICE_INLINE +RealVector point_to_real_vector(const libMesh::Point & pt) +{ +#if LIBMESH_DIM == 1 + return make_vector(pt(0)); +#elif LIBMESH_DIM == 2 + return make_vector(pt(0), pt(1)); +#else + return make_vector(pt(0), pt(1), pt(2)); +#endif +} + +inline unsigned int +recover_parent_side(const libMesh::Elem & parent, + const libMesh::Elem & side_in_parent) +{ + for (unsigned int side = 0; side < parent.n_sides(); ++side) + { + auto candidate = parent.build_side_ptr(side); + + if (candidate->type() != side_in_parent.type() || + candidate->n_nodes() != side_in_parent.n_nodes()) + continue; + + bool same_side = true; + for (unsigned int k = 0; k < candidate->n_nodes(); ++k) + if (candidate->node_ptr(k) != side_in_parent.node_ptr(k)) + { + same_side = false; + break; + } + + if (same_side) + return side; + } + + return libMesh::invalid_uint; +} + +inline libMesh::Point +parent_refspace_node(const libMesh::Elem & parent, unsigned int node) +{ + switch (parent.type()) + { + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + switch (node) + { + case 9: + return libMesh::Point(-0.5, -0.5, 0.5); + case 10: + return libMesh::Point(0.5, -0.5, 0.5); + case 11: + return libMesh::Point(0.5, 0.5, 0.5); + case 12: + return libMesh::Point(-0.5, 0.5, 0.5); + default: + return parent.master_point(node); + } + + case libMesh::PYRAMID18: + switch (node) + { + case 9: + return libMesh::Point(-0.5, -0.5, 0.5); + case 10: + return libMesh::Point(0.5, -0.5, 0.5); + case 11: + return libMesh::Point(0.5, 0.5, 0.5); + case 12: + return libMesh::Point(-0.5, 0.5, 0.5); + case 14: + return libMesh::Point(-2. / 3., 0.0, 1. / 3.); + case 15: + return libMesh::Point(0.0, 2. / 3., 1. / 3.); + case 16: + return libMesh::Point(2. / 3., 0.0, 1. / 3.); + case 17: + return libMesh::Point(0.0, -2. / 3., 1. / 3.); + default: + return parent.master_point(node); + } + + default: + return parent.master_point(node); + } +} + +/** + * Map a face quadrature point from the side element's reference coordinate system + * to the parent element's reference coordinate system. + * + * side_in_parent must be obtained via build_side_ptr() (not side_ptr()), so that + * second-order sides carry their midpoint nodes. Parent reference coordinates + * are reconstructed from the FE reference-space node convention used by + * FE::side_map(), not from side_in_parent.point(k), which lives in physical + * space, and not from Elem::master_point() on pyramids, where those node + * coordinates differ. + * + * @param side_in_parent The side element as embedded in the parent (from build_side_ptr()) + * @param mapping_type Geometric mapping type (LAGRANGE_MAP, RATIONAL_BERNSTEIN_MAP) + * @param side_topo Topology of the side element (libMesh::ElemType) + * @param face_qpt Quadrature point in the side element's reference coordinates + * @returns Corresponding point in the parent element's reference coordinates + */ +inline RealVector +map_face_qp_to_parent(const libMesh::Elem & side_in_parent, + libMesh::ElemMappingType mapping_type, + libMesh::ElemType side_topo, + RealVector face_qpt) +{ + const libMesh::Elem * parent = side_in_parent.interior_parent(); + libmesh_error_msg_if(!parent, + "map_face_qp_to_parent(): side element must carry an interior_parent() from build_side_ptr()"); + + const unsigned int side = recover_parent_side(*parent, side_in_parent); + libmesh_error_msg_if(side == libMesh::invalid_uint, + "map_face_qp_to_parent(): could not recover parent side for the provided side element"); + + const unsigned int n = side_in_parent.n_nodes(); + RealVector parent_pt = zero_vector(); + + // 1-D elements: the "side" is a single vertex node. There is only one + // point-side reference coordinate, (0,0,0), so we map directly to the + // corresponding parent vertex in the parent reference element. + if (n == 1) + { + const libMesh::Point pt = parent_refspace_node(*parent, parent->local_side_node(side, 0)); + return point_to_real_vector(pt); + } + + for (unsigned int k = 0; k < n; ++k) + { + const Real s = face_qpt(0); + const Real t = face_qpt(1); + const Real psi = map_shape(mapping_type, side_topo, k, s, t, 0.0); + + const libMesh::Point pt = parent_refspace_node(*parent, parent->local_side_node(side, k)); + parent_pt.add_scaled(point_to_real_vector(pt), psi); + } + + return parent_pt; +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_HAVE_KOKKOS + +#endif // LIBMESH_KOKKOS_FE_FACE_MAP_H diff --git a/include/gpu/kokkos_fe_lagrange_1d.h b/include/gpu/kokkos_fe_lagrange_1d.h new file mode 100644 index 00000000000..72e78692882 --- /dev/null +++ b/include/gpu/kokkos_fe_lagrange_1d.h @@ -0,0 +1,92 @@ +// Kokkos FEEvaluator specializations for 1-D Lagrange elements. +// +// Covers EDGE2 (linear) and EDGE3 (quadratic). +// Reference-element coordinate convention (libMesh-compatible): +// EDGE2/EDGE3: xi in [-1, 1] +// +// EDGE3 node ordering (libMesh non-sequential): +// index 0 -> xi = -1 (left node) +// index 1 -> xi = +1 (right node) +// index 2 -> xi = 0 (midpoint) + +#ifndef LIBMESH_KOKKOS_FE_LAGRANGE_1D_H +#define LIBMESH_KOKKOS_FE_LAGRANGE_1D_H + +#include "gpu/kokkos_fe_base.h" + +namespace libMesh::Kokkos +{ + +// ── EDGE2 (linear edge, 2 nodes) ───────────────────────────────────────────── + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 2; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 0.5 * (1.0 - xi); + case 1: return 0.5 * (1.0 + xi); + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(-0.5, 0.0, 0.0); + case 1: return make_vector( 0.5, 0.0, 0.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── EDGE3 (quadratic edge, 3 nodes) ────────────────────────────────────────── +// Node ordering matches libMesh: 0->left(-1), 1->right(+1), 2->mid(0) +// L_0(xi) = 0.5*xi*(xi-1) dL_0/dxi = xi - 0.5 +// L_1(xi) = 0.5*xi*(xi+1) dL_1/dxi = xi + 0.5 +// L_2(xi) = 1 - xi² dL_2/dxi = -2*xi + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 3; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 0.5 * xi * (xi - 1.0); + case 1: return 0.5 * xi * (xi + 1.0); + case 2: return 1.0 - xi * xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(xi - 0.5, 0.0, 0.0); + case 1: return make_vector(xi + 0.5, 0.0, 0.0); + case 2: return make_vector(-2.0 * xi, 0.0, 0.0); + default: return zero_vector(); + } + } +#endif +}; + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_LAGRANGE_1D_H diff --git a/include/gpu/kokkos_fe_lagrange_2d.h b/include/gpu/kokkos_fe_lagrange_2d.h new file mode 100644 index 00000000000..08d1e2f5ba6 --- /dev/null +++ b/include/gpu/kokkos_fe_lagrange_2d.h @@ -0,0 +1,253 @@ +// Kokkos FEEvaluator specializations for 2-D Lagrange elements. +// +// Covers TRI3, TRI6, QUAD4, QUAD8, QUAD9. +// Reference-element coordinate conventions (libMesh-compatible): +// Tri: xi >= 0, eta >= 0, xi+eta <= 1 (unit triangle) +// Quad: (xi, eta) in [-1,1]² + +#ifndef LIBMESH_KOKKOS_FE_LAGRANGE_2D_H +#define LIBMESH_KOKKOS_FE_LAGRANGE_2D_H + +#include "gpu/kokkos_fe_base.h" + +namespace libMesh::Kokkos +{ + +// ── TRI3 (linear triangle, 3 nodes) ────────────────────────────────────────── +// Barycentric: zeta0 = 1-xi-eta, zeta1 = xi, zeta2 = eta + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 3; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0 - xi - eta; + case 1: return xi; + case 2: return eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(-1.0, -1.0, 0.0); + case 1: return make_vector( 1.0, 0.0, 0.0); + case 2: return make_vector( 0.0, 1.0, 0.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── TRI6 (quadratic triangle, 6 nodes) ─────────────────────────────────────── +// Barycentric: z0=1-xi-eta, z1=xi, z2=eta +// phi_0 = z0*(2*z0-1) = (1-xi-eta)*(1-2*xi-2*eta) +// phi_1 = z1*(2*z1-1) = xi*(2*xi-1) +// phi_2 = z2*(2*z2-1) = eta*(2*eta-1) +// phi_3 = 4*z0*z1 = 4*(1-xi-eta)*xi +// phi_4 = 4*z1*z2 = 4*xi*eta +// phi_5 = 4*z2*z0 = 4*eta*(1-xi-eta) + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 6; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + const Real z0 = 1.0 - xi - eta; + switch (i) + { + case 0: return z0 * (2.0 * z0 - 1.0); + case 1: return xi * (2.0 * xi - 1.0); + case 2: return eta * (2.0 * eta - 1.0); + case 3: return 4.0 * z0 * xi; + case 4: return 4.0 * xi * eta; + case 5: return 4.0 * eta * z0; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(4.0*xi + 4.0*eta - 3.0, 4.0*xi + 4.0*eta - 3.0, 0.0); + case 1: return make_vector(4.0*xi - 1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 4.0*eta - 1.0, 0.0); + case 3: return make_vector(4.0*(1.0 - 2.0*xi - eta), -4.0*xi, 0.0); + case 4: return make_vector(4.0*eta, 4.0*xi, 0.0); + case 5: return make_vector(-4.0*eta, 4.0*(1.0 - xi - 2.0*eta), 0.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── QUAD4 (bilinear quadrilateral, 4 nodes) ─────────────────────────────────── +// Tensor product of two EDGE2 bases. libMesh node ordering: +// node 0: (-1,-1) node 1: (+1,-1) +// node 2: (+1,+1) node 3: (-1,+1) + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 4; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 0.25 * (1.0 - xi) * (1.0 - eta); + case 1: return 0.25 * (1.0 + xi) * (1.0 - eta); + case 2: return 0.25 * (1.0 + xi) * (1.0 + eta); + case 3: return 0.25 * (1.0 - xi) * (1.0 + eta); + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(-0.25*(1.0-eta), -0.25*(1.0-xi), 0.0); + case 1: return make_vector( 0.25*(1.0-eta), -0.25*(1.0+xi), 0.0); + case 2: return make_vector( 0.25*(1.0+eta), 0.25*(1.0+xi), 0.0); + case 3: return make_vector(-0.25*(1.0+eta), 0.25*(1.0-xi), 0.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── QUAD8 (serendipity quadrilateral, 8 nodes) ──────────────────────────────── +// Node ordering: +// 0: (-1,-1) 1: (+1,-1) 2: (+1,+1) 3: (-1,+1) +// 4: ( 0,-1) 5: (+1, 0) 6: ( 0,+1) 7: (-1, 0) + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 8; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 0.25 * (1.0-xi) * (1.0-eta) * (-1.0-xi-eta); + case 1: return 0.25 * (1.0+xi) * (1.0-eta) * (-1.0+xi-eta); + case 2: return 0.25 * (1.0+xi) * (1.0+eta) * (-1.0+xi+eta); + case 3: return 0.25 * (1.0-xi) * (1.0+eta) * (-1.0-xi+eta); + case 4: return 0.5 * (1.0-xi*xi) * (1.0-eta); + case 5: return 0.5 * (1.0+xi) * (1.0-eta*eta); + case 6: return 0.5 * (1.0-xi*xi) * (1.0+eta); + case 7: return 0.5 * (1.0-xi) * (1.0-eta*eta); + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(0.25*(1.0-eta)*(2.0*xi+eta), + 0.25*(1.0-xi)*(xi+2.0*eta), + 0.0); + case 1: return make_vector(0.25*(1.0-eta)*(2.0*xi-eta), + 0.25*(1.0+xi)*(2.0*eta-xi), + 0.0); + case 2: return make_vector(0.25*(1.0+eta)*(2.0*xi+eta), + 0.25*(1.0+xi)*(xi+2.0*eta), + 0.0); + case 3: return make_vector(0.25*(1.0+eta)*(2.0*xi-eta), + 0.25*(1.0-xi)*(2.0*eta-xi), + 0.0); + case 4: return make_vector(-xi*(1.0-eta), -0.5*(1.0-xi*xi), 0.0); + case 5: return make_vector(0.5*(1.0-eta*eta), -eta*(1.0+xi), 0.0); + case 6: return make_vector(-xi*(1.0+eta), 0.5*(1.0-xi*xi), 0.0); + case 7: return make_vector(-0.5*(1.0-eta*eta), -eta*(1.0-xi), 0.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── QUAD9 (biquadratic quadrilateral, 9 nodes) ──────────────────────────────── +// Tensor product of two EDGE3 bases. libMesh node ordering: +// i0[] = {0,1,1,0, 2,1,2,0, 2} +// i1[] = {0,0,1,1, 0,2,1,2, 2} +// +// 1D basis (libMesh non-sequential ordering): +// L_0(t) = 0.5*t*(t-1) dL_0/dt = t - 0.5 +// L_1(t) = 0.5*t*(t+1) dL_1/dt = t + 0.5 +// L_2(t) = 1 - t² dL_2/dt = -2*t + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 9; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real L(unsigned int k, Real t) + { + switch (k) + { + case 0: return 0.5 * t * (t - 1.0); + case 1: return 0.5 * t * (t + 1.0); + case 2: return 1.0 - t * t; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static Real dL(unsigned int k, Real t) + { + switch (k) + { + case 0: return t - 0.5; + case 1: return t + 0.5; + case 2: return -2.0 * t; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2}; + static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2}; + return L(i0[i], xi) * L(i1[i], eta); + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2}; + static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2}; + const Real dxi = dL(i0[i], xi) * L(i1[i], eta); + const Real deta = L(i0[i], xi) * dL(i1[i], eta); + return make_vector(dxi, deta, 0.0); + } +#endif +}; + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_LAGRANGE_2D_H diff --git a/include/gpu/kokkos_fe_lagrange_3d.h b/include/gpu/kokkos_fe_lagrange_3d.h new file mode 100644 index 00000000000..5f2fbb203c3 --- /dev/null +++ b/include/gpu/kokkos_fe_lagrange_3d.h @@ -0,0 +1,367 @@ +// Kokkos FEEvaluator specializations for 3-D Lagrange elements. +// +// Covers TET4, TET10, HEX8, HEX20, HEX27. +// Reference-element coordinate conventions (libMesh-compatible): +// Tet: xi >= 0, eta >= 0, zeta >= 0, xi+eta+zeta <= 1 (unit tetrahedron) +// Hex: (xi, eta, zeta) in [-1,1]³ + +#ifndef LIBMESH_KOKKOS_FE_LAGRANGE_3D_H +#define LIBMESH_KOKKOS_FE_LAGRANGE_3D_H + +#include "gpu/kokkos_fe_base.h" + +namespace libMesh::Kokkos +{ + +// ── TET4 (linear tetrahedron, 4 nodes) ─────────────────────────────────────── +// Barycentric: z0=1-xi-eta-zeta, z1=xi, z2=eta, z3=zeta + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 4; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0 - xi - eta - zeta; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return make_vector(-1.0, -1.0, -1.0); + case 1: return make_vector( 1.0, 0.0, 0.0); + case 2: return make_vector( 0.0, 1.0, 0.0); + case 3: return make_vector( 0.0, 0.0, 1.0); + default: return zero_vector(); + } + } +#endif +}; + +// ── TET10 (quadratic tetrahedron, 10 nodes) ─────────────────────────────────── +// Barycentric: z0=1-xi-eta-zeta, z1=xi, z2=eta, z3=zeta +// phi_0 = z0*(2*z0-1) +// phi_1 = z1*(2*z1-1) = xi*(2*xi-1) +// phi_2 = z2*(2*z2-1) = eta*(2*eta-1) +// phi_3 = z3*(2*z3-1) = zeta*(2*zeta-1) +// phi_4 = 4*z0*z1 = 4*(1-xi-eta-zeta)*xi +// phi_5 = 4*z1*z2 = 4*xi*eta +// phi_6 = 4*z2*z0 = 4*eta*(1-xi-eta-zeta) +// phi_7 = 4*z0*z3 = 4*(1-xi-eta-zeta)*zeta +// phi_8 = 4*z1*z3 = 4*xi*zeta +// phi_9 = 4*z2*z3 = 4*eta*zeta + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 10; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + const Real z0 = 1.0 - xi - eta - zeta; + switch (i) + { + case 0: return z0 * (2.0*z0 - 1.0); + case 1: return xi * (2.0*xi - 1.0); + case 2: return eta * (2.0*eta - 1.0); + case 3: return zeta* (2.0*zeta - 1.0); + case 4: return 4.0 * z0 * xi; + case 5: return 4.0 * xi * eta; + case 6: return 4.0 * eta * z0; + case 7: return 4.0 * z0 * zeta; + case 8: return 4.0 * xi * zeta; + case 9: return 4.0 * eta * zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: + { + const Real v = 4.0*(xi + eta + zeta) - 3.0; + return make_vector(v, v, v); + } + case 1: return make_vector(4.0*xi - 1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 4.0*eta - 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 4.0*zeta - 1.0); + case 4: return make_vector( 4.0*(1.0-2.0*xi-eta-zeta), -4.0*xi, -4.0*xi); + case 5: return make_vector( 4.0*eta, 4.0*xi, 0.0); + case 6: return make_vector(-4.0*eta, 4.0*(1.0-xi-2.0*eta-zeta), -4.0*eta); + case 7: return make_vector(-4.0*zeta, -4.0*zeta, 4.0*(1.0-xi-eta-2.0*zeta)); + case 8: return make_vector(4.0*zeta, 0.0, 4.0*xi); + case 9: return make_vector(0.0, 4.0*zeta, 4.0*eta); + default: return zero_vector(); + } + } +#endif +}; + +// ── HEX8 (trilinear hexahedron, 8 nodes) ───────────────────────────────────── +// Tensor product of three EDGE2 bases. +// Node ordering (same as libMesh): +// 0:(-1,-1,-1) 1:(+1,-1,-1) 2:(+1,+1,-1) 3:(-1,+1,-1) +// 4:(-1,-1,+1) 5:(+1,-1,+1) 6:(+1,+1,+1) 7:(-1,+1,+1) + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 8; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 0.125*(1.0-xi)*(1.0-eta)*(1.0-zeta); + case 1: return 0.125*(1.0+xi)*(1.0-eta)*(1.0-zeta); + case 2: return 0.125*(1.0+xi)*(1.0+eta)*(1.0-zeta); + case 3: return 0.125*(1.0-xi)*(1.0+eta)*(1.0-zeta); + case 4: return 0.125*(1.0-xi)*(1.0-eta)*(1.0+zeta); + case 5: return 0.125*(1.0+xi)*(1.0-eta)*(1.0+zeta); + case 6: return 0.125*(1.0+xi)*(1.0+eta)*(1.0+zeta); + case 7: return 0.125*(1.0-xi)*(1.0+eta)*(1.0+zeta); + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return make_vector(-0.125*(1.0-eta)*(1.0-zeta), + -0.125*(1.0-xi) *(1.0-zeta), + -0.125*(1.0-xi) *(1.0-eta)); + case 1: return make_vector( 0.125*(1.0-eta)*(1.0-zeta), + -0.125*(1.0+xi) *(1.0-zeta), + -0.125*(1.0+xi) *(1.0-eta)); + case 2: return make_vector( 0.125*(1.0+eta)*(1.0-zeta), + 0.125*(1.0+xi) *(1.0-zeta), + -0.125*(1.0+xi) *(1.0+eta)); + case 3: return make_vector(-0.125*(1.0+eta)*(1.0-zeta), + 0.125*(1.0-xi) *(1.0-zeta), + -0.125*(1.0-xi) *(1.0+eta)); + case 4: return make_vector(-0.125*(1.0-eta)*(1.0+zeta), + -0.125*(1.0-xi) *(1.0+zeta), + 0.125*(1.0-xi) *(1.0-eta)); + case 5: return make_vector( 0.125*(1.0-eta)*(1.0+zeta), + -0.125*(1.0+xi) *(1.0+zeta), + 0.125*(1.0+xi) *(1.0-eta)); + case 6: return make_vector( 0.125*(1.0+eta)*(1.0+zeta), + 0.125*(1.0+xi) *(1.0+zeta), + 0.125*(1.0+xi) *(1.0+eta)); + case 7: return make_vector(-0.125*(1.0+eta)*(1.0+zeta), + 0.125*(1.0-xi) *(1.0+zeta), + 0.125*(1.0-xi) *(1.0+eta)); + default: return zero_vector(); + } + } +#endif +}; + +// ── HEX20 (serendipity hexahedron, 20 nodes) ───────────────────────────────── +// Corner nodes: phi = 0.125*(1+sx*xi)*(1+sy*eta)*(1+sz*zeta)*(sx*xi+sy*eta+sz*zeta-2) +// Node ordering follows libMesh (nodes 0-7 corners, 8-19 midside). + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 20; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 0.125*(1.0-xi)*(1.0-eta)*(1.0-zeta)*(-xi-eta-zeta-2.0); + case 1: return 0.125*(1.0+xi)*(1.0-eta)*(1.0-zeta)*( xi-eta-zeta-2.0); + case 2: return 0.125*(1.0+xi)*(1.0+eta)*(1.0-zeta)*( xi+eta-zeta-2.0); + case 3: return 0.125*(1.0-xi)*(1.0+eta)*(1.0-zeta)*(-xi+eta-zeta-2.0); + case 4: return 0.125*(1.0-xi)*(1.0-eta)*(1.0+zeta)*(-xi-eta+zeta-2.0); + case 5: return 0.125*(1.0+xi)*(1.0-eta)*(1.0+zeta)*( xi-eta+zeta-2.0); + case 6: return 0.125*(1.0+xi)*(1.0+eta)*(1.0+zeta)*( xi+eta+zeta-2.0); + case 7: return 0.125*(1.0-xi)*(1.0+eta)*(1.0+zeta)*(-xi+eta+zeta-2.0); + case 8: return 0.25*(1.0-xi*xi)*(1.0-eta)*(1.0-zeta); + case 10: return 0.25*(1.0-xi*xi)*(1.0+eta)*(1.0-zeta); + case 16: return 0.25*(1.0-xi*xi)*(1.0-eta)*(1.0+zeta); + case 18: return 0.25*(1.0-xi*xi)*(1.0+eta)*(1.0+zeta); + case 9: return 0.25*(1.0+xi)*(1.0-eta*eta)*(1.0-zeta); + case 11: return 0.25*(1.0-xi)*(1.0-eta*eta)*(1.0-zeta); + case 17: return 0.25*(1.0+xi)*(1.0-eta*eta)*(1.0+zeta); + case 19: return 0.25*(1.0-xi)*(1.0-eta*eta)*(1.0+zeta); + case 12: return 0.25*(1.0-xi)*(1.0-eta)*(1.0-zeta*zeta); + case 13: return 0.25*(1.0+xi)*(1.0-eta)*(1.0-zeta*zeta); + case 14: return 0.25*(1.0+xi)*(1.0+eta)*(1.0-zeta*zeta); + case 15: return 0.25*(1.0-xi)*(1.0+eta)*(1.0-zeta*zeta); + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return make_vector( + -0.125*(1.0-eta)*(1.0-zeta)*(-2.0*xi-eta-zeta-1.0), + -0.125*(1.0-xi) *(1.0-zeta)*(-xi-2.0*eta-zeta-1.0), + -0.125*(1.0-xi) *(1.0-eta) *(-xi-eta-2.0*zeta-1.0)); + case 1: return make_vector( + 0.125*(1.0-eta)*(1.0-zeta)*(2.0*xi-eta-zeta-1.0), + -0.125*(1.0+xi) *(1.0-zeta)*(xi-2.0*eta-zeta-1.0), + -0.125*(1.0+xi) *(1.0-eta) *(xi-eta-2.0*zeta-1.0)); + case 2: return make_vector( + 0.125*(1.0+eta)*(1.0-zeta)*(2.0*xi+eta-zeta-1.0), + 0.125*(1.0+xi) *(1.0-zeta)*(xi+2.0*eta-zeta-1.0), + -0.125*(1.0+xi) *(1.0+eta) *(xi+eta-2.0*zeta-1.0)); + case 3: return make_vector( + -0.125*(1.0+eta)*(1.0-zeta)*(-2.0*xi+eta-zeta-1.0), + 0.125*(1.0-xi) *(1.0-zeta)*(-xi+2.0*eta-zeta-1.0), + -0.125*(1.0-xi) *(1.0+eta) *(-xi+eta-2.0*zeta-1.0)); + case 4: return make_vector( + -0.125*(1.0-eta)*(1.0+zeta)*(-2.0*xi-eta+zeta-1.0), + -0.125*(1.0-xi) *(1.0+zeta)*(-xi-2.0*eta+zeta-1.0), + 0.125*(1.0-xi) *(1.0-eta) *(-xi-eta+2.0*zeta-1.0)); + case 5: return make_vector( + 0.125*(1.0-eta)*(1.0+zeta)*(2.0*xi-eta+zeta-1.0), + -0.125*(1.0+xi) *(1.0+zeta)*(xi-2.0*eta+zeta-1.0), + 0.125*(1.0+xi) *(1.0-eta) *(xi-eta+2.0*zeta-1.0)); + case 6: return make_vector( + 0.125*(1.0+eta)*(1.0+zeta)*(2.0*xi+eta+zeta-1.0), + 0.125*(1.0+xi) *(1.0+zeta)*(xi+2.0*eta+zeta-1.0), + 0.125*(1.0+xi) *(1.0+eta) *(xi+eta+2.0*zeta-1.0)); + case 7: return make_vector( + -0.125*(1.0+eta)*(1.0+zeta)*(-2.0*xi+eta+zeta-1.0), + 0.125*(1.0-xi) *(1.0+zeta)*(-xi+2.0*eta+zeta-1.0), + 0.125*(1.0-xi) *(1.0+eta) *(-xi+eta+2.0*zeta-1.0)); + case 8: return make_vector(-0.5*xi*(1.0-eta)*(1.0-zeta), + -0.25*(1.0-xi*xi)*(1.0-zeta), + -0.25*(1.0-xi*xi)*(1.0-eta)); + case 10: return make_vector(-0.5*xi*(1.0+eta)*(1.0-zeta), + 0.25*(1.0-xi*xi)*(1.0-zeta), + -0.25*(1.0-xi*xi)*(1.0+eta)); + case 16: return make_vector(-0.5*xi*(1.0-eta)*(1.0+zeta), + -0.25*(1.0-xi*xi)*(1.0+zeta), + 0.25*(1.0-xi*xi)*(1.0-eta)); + case 18: return make_vector(-0.5*xi*(1.0+eta)*(1.0+zeta), + 0.25*(1.0-xi*xi)*(1.0+zeta), + 0.25*(1.0-xi*xi)*(1.0+eta)); + case 9: return make_vector( 0.25*(1.0-eta*eta)*(1.0-zeta), + -0.5*eta*(1.0+xi)*(1.0-zeta), + -0.25*(1.0+xi)*(1.0-eta*eta)); + case 11: return make_vector(-0.25*(1.0-eta*eta)*(1.0-zeta), + -0.5*eta*(1.0-xi)*(1.0-zeta), + -0.25*(1.0-xi)*(1.0-eta*eta)); + case 17: return make_vector( 0.25*(1.0-eta*eta)*(1.0+zeta), + -0.5*eta*(1.0+xi)*(1.0+zeta), + 0.25*(1.0+xi)*(1.0-eta*eta)); + case 19: return make_vector(-0.25*(1.0-eta*eta)*(1.0+zeta), + -0.5*eta*(1.0-xi)*(1.0+zeta), + 0.25*(1.0-xi)*(1.0-eta*eta)); + case 12: return make_vector(-0.25*(1.0-eta)*(1.0-zeta*zeta), + -0.25*(1.0-xi)*(1.0-zeta*zeta), + -0.5*zeta*(1.0-xi)*(1.0-eta)); + case 13: return make_vector( 0.25*(1.0-eta)*(1.0-zeta*zeta), + -0.25*(1.0+xi)*(1.0-zeta*zeta), + -0.5*zeta*(1.0+xi)*(1.0-eta)); + case 14: return make_vector( 0.25*(1.0+eta)*(1.0-zeta*zeta), + 0.25*(1.0+xi)*(1.0-zeta*zeta), + -0.5*zeta*(1.0+xi)*(1.0+eta)); + case 15: return make_vector(-0.25*(1.0+eta)*(1.0-zeta*zeta), + 0.25*(1.0-xi)*(1.0-zeta*zeta), + -0.5*zeta*(1.0-xi)*(1.0+eta)); + default: return zero_vector(); + } + } +#endif +}; + +// ── HEX27 (triquadratic hexahedron, 27 nodes) ───────────────────────────────── +// Tensor product of three EDGE3 bases. +// Index tables (libMesh fe_lagrange_shape_3D.C): +// i0[] = {0,1,1,0, 0,1,1,0, 2,1,2,0, 0,1,1,0, 2,1,2,0, 2,2,1,2,0,2,2} +// i1[] = {0,0,1,1, 0,0,1,1, 0,2,1,2, 0,0,1,1, 0,2,1,2, 2,0,2,1,2,2,2} +// i2[] = {0,0,0,0, 1,1,1,1, 0,0,0,0, 2,2,2,2, 1,1,1,1, 0,2,2,2,2,1,2} + +template <> +struct FEEvaluator +{ + static constexpr unsigned int n_dofs() { return 27; } + +#ifdef LIBMESH_HAVE_KOKKOS + LIBMESH_DEVICE_INLINE static Real L(unsigned int k, Real t) + { + switch (k) + { + case 0: return 0.5 * t * (t - 1.0); + case 1: return 0.5 * t * (t + 1.0); + case 2: return 1.0 - t * t; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static Real dL(unsigned int k, Real t) + { + switch (k) + { + case 0: return t - 0.5; + case 1: return t + 0.5; + case 2: return -2.0 * t; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + static const unsigned int i0[] = + {0,1,1,0, 0,1,1,0, 2,1,2,0, 0,1,1,0, 2,1,2,0, 2,2,1,2,0,2,2}; + static const unsigned int i1[] = + {0,0,1,1, 0,0,1,1, 0,2,1,2, 0,0,1,1, 0,2,1,2, 2,0,2,1,2,2,2}; + static const unsigned int i2[] = + {0,0,0,0, 1,1,1,1, 0,0,0,0, 2,2,2,2, 1,1,1,1, 0,2,2,2,2,1,2}; + return L(i0[i], xi) * L(i1[i], eta) * L(i2[i], zeta); + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + static const unsigned int i0[] = + {0,1,1,0, 0,1,1,0, 2,1,2,0, 0,1,1,0, 2,1,2,0, 2,2,1,2,0,2,2}; + static const unsigned int i1[] = + {0,0,1,1, 0,0,1,1, 0,2,1,2, 0,0,1,1, 0,2,1,2, 2,0,2,1,2,2,2}; + static const unsigned int i2[] = + {0,0,0,0, 1,1,1,1, 0,0,0,0, 2,2,2,2, 1,1,1,1, 0,2,2,2,2,1,2}; + const Real lxi = L(i0[i], xi); + const Real leta = L(i1[i], eta); + const Real lzeta = L(i2[i], zeta); + return make_vector(dL(i0[i], xi) * leta * lzeta, + lxi * dL(i1[i], eta) * lzeta, + lxi * leta * dL(i2[i], zeta)); + } +#endif +}; + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_LAGRANGE_3D_H diff --git a/include/gpu/kokkos_fe_map.h b/include/gpu/kokkos_fe_map.h new file mode 100644 index 00000000000..d71f81c931a --- /dev/null +++ b/include/gpu/kokkos_fe_map.h @@ -0,0 +1,235 @@ +// Kokkos device-compatible physical map evaluation. +// +// All functions are LIBMESH_DEVICE_INLINE — callable from both host and GPU. +// +// Two API levels: +// 1. Template on ElemType (preferred): eliminates the topology switch at +// compile time, producing small inlined functions with no stack pressure. +// 2. Runtime ElemType dispatch: convenient but requires increased CUDA +// stack size due to the large switch in map_shape. +// +// Given node coordinates and a reference-space point, these functions compute: +// - Physical coordinates (xyz) +// - Jacobian matrix (reference -> physical) +// - Jacobian measures and JxW +// - Outward normal helpers for face/edge integrals + +#ifndef LIBMESH_KOKKOS_FE_MAP_H +#define LIBMESH_KOKKOS_FE_MAP_H + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_scalar_types.h" + +namespace libMesh::Kokkos +{ + +template +LIBMESH_DEVICE_INLINE RealVector +physical_point(const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta) +{ + RealVector xyz = zero_vector(); + for (unsigned int i = 0; i < n_nodes; ++i) + xyz += map_shape(i, xi, eta, zeta) * nodes[i]; + return xyz; +} + +// ========================================================================= +// Compile-time dispatch (preferred for GPU — no switch overhead) +// +// Template on FEFamily and ElemType so nvcc only instantiates the specific +// FEEvaluator specialization. No topology switch means no stack pressure. +// ========================================================================= + +template +LIBMESH_DEVICE_INLINE RealTensor +jacobian(const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta) +{ + RealTensor J = zero_tensor(); + for (unsigned int k = 0; k < n_nodes; ++k) + J += libMesh::outer_product(grad_map_shape(k, xi, eta, zeta), nodes[k]); + return J; +} + +template +LIBMESH_DEVICE_INLINE void +physical_point_and_jacobian(const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta, + RealVector & xyz, + RealTensor & J) +{ + xyz = zero_vector(); + J = zero_tensor(); + for (unsigned int k = 0; k < n_nodes; ++k) + { + const Real phi = map_shape(k, xi, eta, zeta); + const RealVector grad = grad_map_shape(k, xi, eta, zeta); + xyz += phi * nodes[k]; + J += libMesh::outer_product(grad, nodes[k]); + } +} + +template +LIBMESH_DEVICE_INLINE RealTensor +face_jacobian(const RealVector * face_nodes, + unsigned int n_face_nodes, + Real xi, Real eta, Real zeta) +{ + RealTensor J = zero_tensor(); + for (unsigned int k = 0; k < n_face_nodes; ++k) + J += libMesh::outer_product(grad_map_shape(k, xi, eta, zeta), + face_nodes[k]); + return J; +} + +// ========================================================================= +// Runtime topology dispatch (convenient, but larger GPU stack usage) +// ========================================================================= + +/// Compute physical coordinate (runtime topology). +LIBMESH_DEVICE_INLINE RealVector +physical_point(libMesh::ElemMappingType mapping_type, + libMesh::ElemType topo, + const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta) +{ + RealVector xyz = zero_vector(); + for (unsigned int i = 0; i < n_nodes; ++i) + xyz += map_shape(mapping_type, topo, i, xi, eta, zeta) * nodes[i]; + return xyz; +} + +/// Compute Jacobian matrix (runtime topology), with rows d(x)/d(xi_r). +LIBMESH_DEVICE_INLINE RealTensor +jacobian(libMesh::ElemMappingType mapping_type, + libMesh::ElemType topo, + const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta) +{ + RealTensor J = zero_tensor(); + for (unsigned int k = 0; k < n_nodes; ++k) + J += libMesh::outer_product(grad_map_shape(mapping_type, topo, k, xi, eta, zeta), + nodes[k]); + return J; +} + +/// Compute physical point and Jacobian together (runtime topology). +LIBMESH_DEVICE_INLINE void +physical_point_and_jacobian(libMesh::ElemMappingType mapping_type, + libMesh::ElemType topo, + const RealVector * nodes, + unsigned int n_nodes, + Real xi, Real eta, Real zeta, + RealVector & xyz, + RealTensor & J) +{ + xyz = zero_vector(); + J = zero_tensor(); + for (unsigned int k = 0; k < n_nodes; ++k) + { + const Real phi = map_shape(mapping_type, topo, k, xi, eta, zeta); + const RealVector grad = grad_map_shape(mapping_type, topo, k, xi, eta, zeta); + xyz += phi * nodes[k]; + J += libMesh::outer_product(grad, nodes[k]); + } +} + +/// Face Jacobian (runtime topology). +LIBMESH_DEVICE_INLINE RealTensor +face_jacobian(libMesh::ElemMappingType mapping_type, + libMesh::ElemType face_topo, + const RealVector * face_nodes, + unsigned int n_face_nodes, + Real xi, Real eta, Real zeta) +{ + RealTensor J = zero_tensor(); + for (unsigned int k = 0; k < n_face_nodes; ++k) + J += libMesh::outer_product(grad_map_shape(mapping_type, face_topo, k, xi, eta, zeta), + face_nodes[k]); + return J; +} + +// ========================================================================= +// Geometry helpers (topology-independent) +// ========================================================================= + +/// libMesh FEMap-compatible volume measure * quadrature_weight. +/// 3D: det(J) * weight +/// 2D: ||J_row0 x J_row1|| * weight +/// 1D: ||J_row0|| * weight +/// 0D: weight +LIBMESH_DEVICE_INLINE Real +volume_jxw(const RealTensor & J, unsigned int dim, Real quad_weight) +{ + if (dim == 3) + return leading_determinant(J, 3) * quad_weight; + else if (dim == 2) + return J.row(0).cross(J.row(1)).norm() * quad_weight; + else if (dim == 1) + return J.row(0).norm() * quad_weight; + else + return quad_weight; +} + +/// Face JxW: surface measure * quadrature_weight +/// 3D: ||J_row0 x J_row1|| * weight +/// 2D: ||J_row0|| * weight +/// 1D: weight (face is a point) +LIBMESH_DEVICE_INLINE Real +face_jxw(const RealTensor & J, unsigned int parent_dim, Real quad_weight) +{ + if (parent_dim == 3) + return J.row(0).cross(J.row(1)).norm() * quad_weight; + else if (parent_dim == 2) + return J.row(0).norm() * quad_weight; + else + return quad_weight; +} + +/// Outward unit normal for a 3D face from the face Jacobian. +LIBMESH_DEVICE_INLINE RealVector +face_normal(const RealTensor & J, unsigned int parent_dim) +{ + if (parent_dim != 3) + { + detail::abort_unsupported("face_normal(): only 3D face normals are defined from face Jacobians alone; use edge_normal_on_parent_surface() for 2D parent elements"); + return zero_vector(); + } + + RealVector n = J.row(0).cross(J.row(1)); + + const Real len = n.norm(); + if (len > 0.0) + n *= 1.0 / len; + return n; +} + +/// Outward edge normal for a 2D parent element embedded in 3D. +/// Requires the edge Jacobian and the parent surface Jacobian at the mapped +/// parent-reference point. +LIBMESH_DEVICE_INLINE RealVector +edge_normal_on_parent_surface(const RealTensor & edge_J, + const RealTensor & parent_J) +{ + RealVector surface_normal = parent_J.row(0).cross(parent_J.row(1)); + const Real surface_len = surface_normal.norm(); + if (surface_len > 0.0) + surface_normal *= 1.0 / surface_len; + + RealVector n = edge_J.row(0).cross(surface_normal); + + const Real len = n.norm(); + if (len > 0.0) + n *= 1.0 / len; + return n; +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_MAP_H diff --git a/include/gpu/kokkos_fe_monomial.h b/include/gpu/kokkos_fe_monomial.h new file mode 100644 index 00000000000..b68289c72eb --- /dev/null +++ b/include/gpu/kokkos_fe_monomial.h @@ -0,0 +1,941 @@ +// Kokkos FEEvaluator specializations for MONOMIAL elements. +// +// MONOMIAL uses the complete total-degree polynomial space P_p. Following +// libMesh's FE, the basis is parameterised by spatial dimension, +// not element class — TRI and QUAD share MonomialImpl2D; TET/HEX/PRISM/PYRAMID +// share MonomialImpl3D. This gives 3 x 6 = 18 impl specializations (dims 1/2/3, +// orders 0-5), then per-topology FEEvaluator delegating specializations wire each +// libMesh::ElemType to the matching impl. +// +// Basis ordering: graded-lex (total degree first, then lexicographic by +// decreasing xi exponent). Matches libMesh::FE::shape ordering. + +#ifndef LIBMESH_KOKKOS_FE_MONOMIAL_H +#define LIBMESH_KOKKOS_FE_MONOMIAL_H + +#include "gpu/kokkos_fe_base.h" +#include "libmesh/enum_elem_type.h" + +namespace libMesh::Kokkos +{ + +// ═══════════════════════════════════════════════════════════════════════════ +// MonomialImpl1D — 1-D MONOMIAL basis, order N +// n_dofs = N + 1 +// Basis: {1, xi, xi², xi³, ...} +// ═══════════════════════════════════════════════════════════════════════════ + +template +struct MonomialImpl1D; + +template <> +struct MonomialImpl1D<0> +{ + static constexpr unsigned int n_dofs() { return 1; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return 1.0; + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return zero_vector(); + } +}; + +template <> +struct MonomialImpl1D<1> +{ + static constexpr unsigned int n_dofs() { return 2; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl1D<2> +{ + static constexpr unsigned int n_dofs() { return 3; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return xi * xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(2.0 * xi, 0.0, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl1D<3> +{ + static constexpr unsigned int n_dofs() { return 4; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return xi * xi; + case 3: return xi * xi * xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(2.0 * xi, 0.0, 0.0); + case 3: return make_vector(3.0 * xi * xi, 0.0, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl1D<4> +{ + static constexpr unsigned int n_dofs() { return 5; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return xi * xi; + case 3: return xi * xi * xi; + case 4: return xi * xi * xi * xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(2.0 * xi, 0.0, 0.0); + case 3: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 4: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl1D<5> +{ + static constexpr unsigned int n_dofs() { return 6; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return xi * xi; + case 3: return xi * xi * xi; + case 4: return xi * xi * xi * xi; + case 5: return xi * xi * xi * xi * xi; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(2.0 * xi, 0.0, 0.0); + case 3: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 4: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + case 5: return make_vector(5.0 * xi * xi * xi * xi, 0.0, 0.0); + default: return zero_vector(); + } + } +}; + +// ═══════════════════════════════════════════════════════════════════════════ +// MonomialImpl2D — 2-D MONOMIAL basis, order N +// n_dofs = (N+1)(N+2)/2 +// Graded-lex basis: {1, xi, eta, xi², xi·eta, eta², ...} +// Shared by TRI and QUAD element classes. +// ═══════════════════════════════════════════════════════════════════════════ + +template +struct MonomialImpl2D; + +template <> +struct MonomialImpl2D<0> +{ + static constexpr unsigned int n_dofs() { return 1; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return 1.0; + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return zero_vector(); + } +}; + +template <> +struct MonomialImpl2D<1> +{ + static constexpr unsigned int n_dofs() { return 3; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl2D<2> +{ + static constexpr unsigned int n_dofs() { return 6; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return xi * xi; + case 4: return xi * eta; + case 5: return eta * eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(2.0 * xi, 0.0, 0.0); + case 4: return make_vector(eta, xi, 0.0); + case 5: return make_vector(0.0, 2.0 * eta, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl2D<3> +{ + static constexpr unsigned int n_dofs() { return 10; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return xi * xi; + case 4: return xi * eta; + case 5: return eta * eta; + case 6: return xi * xi * xi; + case 7: return xi * xi * eta; + case 8: return xi * eta * eta; + case 9: return eta * eta * eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(2.0 * xi, 0.0, 0.0); + case 4: return make_vector(eta, xi, 0.0); + case 5: return make_vector(0.0, 2.0 * eta, 0.0); + case 6: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 7: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 8: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 9: return make_vector(0.0, 3.0 * eta * eta, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl2D<4> +{ + static constexpr unsigned int n_dofs() { return 15; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return xi * xi; + case 4: return xi * eta; + case 5: return eta * eta; + case 6: return xi * xi * xi; + case 7: return xi * xi * eta; + case 8: return xi * eta * eta; + case 9: return eta * eta * eta; + case 10: return xi * xi * xi * xi; + case 11: return xi * xi * xi * eta; + case 12: return xi * xi * eta * eta; + case 13: return xi * eta * eta * eta; + case 14: return eta * eta * eta * eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(2.0 * xi, 0.0, 0.0); + case 4: return make_vector(eta, xi, 0.0); + case 5: return make_vector(0.0, 2.0 * eta, 0.0); + case 6: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 7: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 8: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 9: return make_vector(0.0, 3.0 * eta * eta, 0.0); + case 10: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + case 11: return make_vector(3.0 * xi * xi * eta, xi * xi * xi, 0.0); + case 12: return make_vector(2.0 * xi * eta * eta, 2.0 * xi * xi * eta, 0.0); + case 13: return make_vector(eta * eta * eta, 3.0 * xi * eta * eta, 0.0); + case 14: return make_vector(0.0, 4.0 * eta * eta * eta, 0.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl2D<5> +{ + static constexpr unsigned int n_dofs() { return 21; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return xi * xi; + case 4: return xi * eta; + case 5: return eta * eta; + case 6: return xi * xi * xi; + case 7: return xi * xi * eta; + case 8: return xi * eta * eta; + case 9: return eta * eta * eta; + case 10: return xi * xi * xi * xi; + case 11: return xi * xi * xi * eta; + case 12: return xi * xi * eta * eta; + case 13: return xi * eta * eta * eta; + case 14: return eta * eta * eta * eta; + case 15: return xi * xi * xi * xi * xi; + case 16: return xi * xi * xi * xi * eta; + case 17: return xi * xi * xi * eta * eta; + case 18: return xi * xi * eta * eta * eta; + case 19: return xi * eta * eta * eta * eta; + case 20: return eta * eta * eta * eta * eta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(2.0 * xi, 0.0, 0.0); + case 4: return make_vector(eta, xi, 0.0); + case 5: return make_vector(0.0, 2.0 * eta, 0.0); + case 6: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 7: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 8: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 9: return make_vector(0.0, 3.0 * eta * eta, 0.0); + case 10: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + case 11: return make_vector(3.0 * xi * xi * eta, xi * xi * xi, 0.0); + case 12: return make_vector(2.0 * xi * eta * eta, 2.0 * xi * xi * eta, 0.0); + case 13: return make_vector(eta * eta * eta, 3.0 * xi * eta * eta, 0.0); + case 14: return make_vector(0.0, 4.0 * eta * eta * eta, 0.0); + case 15: return make_vector(5.0 * xi * xi * xi * xi, 0.0, 0.0); + case 16: return make_vector(4.0 * xi * xi * xi * eta, xi * xi * xi * xi, 0.0); + case 17: return make_vector(3.0 * xi * xi * eta * eta, 2.0 * xi * xi * xi * eta, 0.0); + case 18: return make_vector(2.0 * xi * eta * eta * eta, 3.0 * xi * xi * eta * eta, 0.0); + case 19: return make_vector(eta * eta * eta * eta, 4.0 * xi * eta * eta * eta, 0.0); + case 20: return make_vector(0.0, 5.0 * eta * eta * eta * eta, 0.0); + default: return zero_vector(); + } + } +}; + +// ═══════════════════════════════════════════════════════════════════════════ +// MonomialImpl3D — 3-D MONOMIAL basis, order N +// n_dofs = (N+1)(N+2)(N+3)/6 +// Basis ordering: graded-lex; for each total degree d, iterate c (zeta +// exponent) from 0 to d, then a (xi exponent) from d-c down to 0 (b=d-c-a). +// Shared by TET, HEX, PRISM, and PYRAMID element classes. +// ═══════════════════════════════════════════════════════════════════════════ + +template +struct MonomialImpl3D; + +template <> +struct MonomialImpl3D<0> +{ + static constexpr unsigned int n_dofs() { return 1; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return 1.0; + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int /*i*/, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + return zero_vector(); + } +}; + +template <> +struct MonomialImpl3D<1> +{ + static constexpr unsigned int n_dofs() { return 4; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real /*xi*/, Real /*eta*/, Real /*zeta*/) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 1.0); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl3D<2> +{ + static constexpr unsigned int n_dofs() { return 10; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + case 4: return xi * xi; + case 5: return xi * eta; + case 6: return eta * eta; + case 7: return xi * zeta; + case 8: return eta * zeta; + case 9: return zeta * zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 1.0); + case 4: return make_vector(2.0 * xi, 0.0, 0.0); + case 5: return make_vector(eta, xi, 0.0); + case 6: return make_vector(0.0, 2.0 * eta, 0.0); + case 7: return make_vector(zeta, 0.0, xi); + case 8: return make_vector(0.0, zeta, eta); + case 9: return make_vector(0.0, 0.0, 2.0 * zeta); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl3D<3> +{ + static constexpr unsigned int n_dofs() { return 20; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + case 4: return xi * xi; + case 5: return xi * eta; + case 6: return eta * eta; + case 7: return xi * zeta; + case 8: return eta * zeta; + case 9: return zeta * zeta; + case 10: return xi * xi * xi; + case 11: return xi * xi * eta; + case 12: return xi * eta * eta; + case 13: return eta * eta * eta; + case 14: return xi * xi * zeta; + case 15: return xi * eta * zeta; + case 16: return eta * eta * zeta; + case 17: return xi * zeta * zeta; + case 18: return eta * zeta * zeta; + case 19: return zeta * zeta * zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 1.0); + case 4: return make_vector(2.0 * xi, 0.0, 0.0); + case 5: return make_vector(eta, xi, 0.0); + case 6: return make_vector(0.0, 2.0 * eta, 0.0); + case 7: return make_vector(zeta, 0.0, xi); + case 8: return make_vector(0.0, zeta, eta); + case 9: return make_vector(0.0, 0.0, 2.0 * zeta); + case 10: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 11: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 12: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 13: return make_vector(0.0, 3.0 * eta * eta, 0.0); + case 14: return make_vector(2.0 * xi * zeta, 0.0, xi * xi); + case 15: return make_vector(eta * zeta, xi * zeta, xi * eta); + case 16: return make_vector(0.0, 2.0 * eta * zeta, eta * eta); + case 17: return make_vector(zeta * zeta, 0.0, 2.0 * xi * zeta); + case 18: return make_vector(0.0, zeta * zeta, 2.0 * eta * zeta); + case 19: return make_vector(0.0, 0.0, 3.0 * zeta * zeta); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl3D<4> +{ + static constexpr unsigned int n_dofs() { return 35; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + case 4: return xi * xi; + case 5: return xi * eta; + case 6: return eta * eta; + case 7: return xi * zeta; + case 8: return eta * zeta; + case 9: return zeta * zeta; + case 10: return xi * xi * xi; + case 11: return xi * xi * eta; + case 12: return xi * eta * eta; + case 13: return eta * eta * eta; + case 14: return xi * xi * zeta; + case 15: return xi * eta * zeta; + case 16: return eta * eta * zeta; + case 17: return xi * zeta * zeta; + case 18: return eta * zeta * zeta; + case 19: return zeta * zeta * zeta; + case 20: return xi * xi * xi * xi; + case 21: return xi * xi * xi * eta; + case 22: return xi * xi * eta * eta; + case 23: return xi * eta * eta * eta; + case 24: return eta * eta * eta * eta; + case 25: return xi * xi * xi * zeta; + case 26: return xi * xi * eta * zeta; + case 27: return xi * eta * eta * zeta; + case 28: return eta * eta * eta * zeta; + case 29: return xi * xi * zeta * zeta; + case 30: return xi * eta * zeta * zeta; + case 31: return eta * eta * zeta * zeta; + case 32: return xi * zeta * zeta * zeta; + case 33: return eta * zeta * zeta * zeta; + case 34: return zeta * zeta * zeta * zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 1.0); + case 4: return make_vector(2.0 * xi, 0.0, 0.0); + case 5: return make_vector(eta, xi, 0.0); + case 6: return make_vector(0.0, 2.0 * eta, 0.0); + case 7: return make_vector(zeta, 0.0, xi); + case 8: return make_vector(0.0, zeta, eta); + case 9: return make_vector(0.0, 0.0, 2.0 * zeta); + case 10: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 11: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 12: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 13: return make_vector(0.0, 3.0 * eta * eta, 0.0); + case 14: return make_vector(2.0 * xi * zeta, 0.0, xi * xi); + case 15: return make_vector(eta * zeta, xi * zeta, xi * eta); + case 16: return make_vector(0.0, 2.0 * eta * zeta, eta * eta); + case 17: return make_vector(zeta * zeta, 0.0, 2.0 * xi * zeta); + case 18: return make_vector(0.0, zeta * zeta, 2.0 * eta * zeta); + case 19: return make_vector(0.0, 0.0, 3.0 * zeta * zeta); + case 20: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + case 21: return make_vector(3.0 * xi * xi * eta, xi * xi * xi, 0.0); + case 22: return make_vector(2.0 * xi * eta * eta, 2.0 * xi * xi * eta, 0.0); + case 23: return make_vector(eta * eta * eta, 3.0 * xi * eta * eta, 0.0); + case 24: return make_vector(0.0, 4.0 * eta * eta * eta, 0.0); + case 25: return make_vector(3.0 * xi * xi * zeta, 0.0, xi * xi * xi); + case 26: return make_vector(2.0 * xi * eta * zeta, xi * xi * zeta, xi * xi * eta); + case 27: return make_vector(eta * eta * zeta, 2.0 * xi * eta * zeta, xi * eta * eta); + case 28: return make_vector(0.0, 3.0 * eta * eta * zeta, eta * eta * eta); + case 29: return make_vector(2.0 * xi * zeta * zeta, 0.0, 2.0 * xi * xi * zeta); + case 30: return make_vector(eta * zeta * zeta, xi * zeta * zeta, 2.0 * xi * eta * zeta); + case 31: return make_vector(0.0, 2.0 * eta * zeta * zeta, 2.0 * eta * eta * zeta); + case 32: return make_vector(zeta * zeta * zeta, 0.0, 3.0 * xi * zeta * zeta); + case 33: return make_vector(0.0, zeta * zeta * zeta, 3.0 * eta * zeta * zeta); + case 34: return make_vector(0.0, 0.0, 4.0 * zeta * zeta * zeta); + default: return zero_vector(); + } + } +}; + +template <> +struct MonomialImpl3D<5> +{ + static constexpr unsigned int n_dofs() { return 56; } + + LIBMESH_DEVICE_INLINE static Real + shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return 1.0; + case 1: return xi; + case 2: return eta; + case 3: return zeta; + case 4: return xi*xi; + case 5: return xi*eta; + case 6: return eta*eta; + case 7: return xi*zeta; + case 8: return eta*zeta; + case 9: return zeta*zeta; + case 10: return xi*xi*xi; + case 11: return xi*xi*eta; + case 12: return xi*eta*eta; + case 13: return eta*eta*eta; + case 14: return xi*xi*zeta; + case 15: return xi*eta*zeta; + case 16: return eta*eta*zeta; + case 17: return xi*zeta*zeta; + case 18: return eta*zeta*zeta; + case 19: return zeta*zeta*zeta; + case 20: return xi*xi*xi*xi; + case 21: return xi*xi*xi*eta; + case 22: return xi*xi*eta*eta; + case 23: return xi*eta*eta*eta; + case 24: return eta*eta*eta*eta; + case 25: return xi*xi*xi*zeta; + case 26: return xi*xi*eta*zeta; + case 27: return xi*eta*eta*zeta; + case 28: return eta*eta*eta*zeta; + case 29: return xi*xi*zeta*zeta; + case 30: return xi*eta*zeta*zeta; + case 31: return eta*eta*zeta*zeta; + case 32: return xi*zeta*zeta*zeta; + case 33: return eta*zeta*zeta*zeta; + case 34: return zeta*zeta*zeta*zeta; + case 35: return xi*xi*xi*xi*xi; + case 36: return xi*xi*xi*xi*eta; + case 37: return xi*xi*xi*eta*eta; + case 38: return xi*xi*eta*eta*eta; + case 39: return xi*eta*eta*eta*eta; + case 40: return eta*eta*eta*eta*eta; + case 41: return xi*xi*xi*xi*zeta; + case 42: return xi*xi*xi*eta*zeta; + case 43: return xi*xi*eta*eta*zeta; + case 44: return xi*eta*eta*eta*zeta; + case 45: return eta*eta*eta*eta*zeta; + case 46: return xi*xi*xi*zeta*zeta; + case 47: return xi*xi*eta*zeta*zeta; + case 48: return xi*eta*eta*zeta*zeta; + case 49: return eta*eta*eta*zeta*zeta; + case 50: return xi*xi*zeta*zeta*zeta; + case 51: return xi*eta*zeta*zeta*zeta; + case 52: return eta*eta*zeta*zeta*zeta; + case 53: return xi*zeta*zeta*zeta*zeta; + case 54: return eta*zeta*zeta*zeta*zeta; + case 55: return zeta*zeta*zeta*zeta*zeta; + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static RealVector + grad_shape(unsigned int i, Real xi, Real eta, Real zeta) + { + switch (i) + { + case 0: return zero_vector(); + case 1: return make_vector(1.0, 0.0, 0.0); + case 2: return make_vector(0.0, 1.0, 0.0); + case 3: return make_vector(0.0, 0.0, 1.0); + case 4: return make_vector(2.0 * xi, 0.0, 0.0); + case 5: return make_vector(eta, xi, 0.0); + case 6: return make_vector(0.0, 2.0 * eta, 0.0); + case 7: return make_vector(zeta, 0.0, xi); + case 8: return make_vector(0.0, zeta, eta); + case 9: return make_vector(0.0, 0.0, 2.0 * zeta); + case 10: return make_vector(3.0 * xi * xi, 0.0, 0.0); + case 11: return make_vector(2.0 * xi * eta, xi * xi, 0.0); + case 12: return make_vector(eta * eta, 2.0 * xi * eta, 0.0); + case 13: return make_vector(0.0, 3.0 * eta * eta, 0.0); + case 14: return make_vector(2.0 * xi * zeta, 0.0, xi * xi); + case 15: return make_vector(eta * zeta, xi * zeta, xi * eta); + case 16: return make_vector(0.0, 2.0 * eta * zeta, eta * eta); + case 17: return make_vector(zeta * zeta, 0.0, 2.0 * xi * zeta); + case 18: return make_vector(0.0, zeta * zeta, 2.0 * eta * zeta); + case 19: return make_vector(0.0, 0.0, 3.0 * zeta * zeta); + case 20: return make_vector(4.0 * xi * xi * xi, 0.0, 0.0); + case 21: return make_vector(3.0 * xi * xi * eta, xi * xi * xi, 0.0); + case 22: return make_vector(2.0 * xi * eta * eta, 2.0 * xi * xi * eta, 0.0); + case 23: return make_vector(eta * eta * eta, 3.0 * xi * eta * eta, 0.0); + case 24: return make_vector(0.0, 4.0 * eta * eta * eta, 0.0); + case 25: return make_vector(3.0 * xi * xi * zeta, 0.0, xi * xi * xi); + case 26: return make_vector(2.0 * xi * eta * zeta, xi * xi * zeta, xi * xi * eta); + case 27: return make_vector(eta * eta * zeta, 2.0 * xi * eta * zeta, xi * eta * eta); + case 28: return make_vector(0.0, 3.0 * eta * eta * zeta, eta * eta * eta); + case 29: return make_vector(2.0 * xi * zeta * zeta, 0.0, 2.0 * xi * xi * zeta); + case 30: return make_vector(eta * zeta * zeta, xi * zeta * zeta, 2.0 * xi * eta * zeta); + case 31: return make_vector(0.0, 2.0 * eta * zeta * zeta, 2.0 * eta * eta * zeta); + case 32: return make_vector(zeta * zeta * zeta, 0.0, 3.0 * xi * zeta * zeta); + case 33: return make_vector(0.0, zeta * zeta * zeta, 3.0 * eta * zeta * zeta); + case 34: return make_vector(0.0, 0.0, 4.0 * zeta * zeta * zeta); + case 35: return make_vector(5.0 * xi * xi * xi * xi, 0.0, 0.0); + case 36: return make_vector(4.0 * xi * xi * xi * eta, xi * xi * xi * xi, 0.0); + case 37: return make_vector(3.0 * xi * xi * eta * eta, 2.0 * xi * xi * xi * eta, 0.0); + case 38: return make_vector(2.0 * xi * eta * eta * eta, 3.0 * xi * xi * eta * eta, 0.0); + case 39: return make_vector(eta * eta * eta * eta, 4.0 * xi * eta * eta * eta, 0.0); + case 40: return make_vector(0.0, 5.0 * eta * eta * eta * eta, 0.0); + case 41: return make_vector(4.0 * xi * xi * xi * zeta, 0.0, xi * xi * xi * xi); + case 42: return make_vector(3.0 * xi * xi * eta * zeta, xi * xi * xi * zeta, xi * xi * xi * eta); + case 43: return make_vector(2.0 * xi * eta * eta * zeta, 2.0 * xi * xi * eta * zeta, xi * xi * eta * eta); + case 44: return make_vector(eta * eta * eta * zeta, 3.0 * xi * eta * eta * zeta, xi * eta * eta * eta); + case 45: return make_vector(0.0, 4.0 * eta * eta * eta * zeta, eta * eta * eta * eta); + case 46: return make_vector(3.0 * xi * xi * zeta * zeta, 0.0, 2.0 * xi * xi * xi * zeta); + case 47: return make_vector(2.0 * xi * eta * zeta * zeta, xi * xi * zeta * zeta, 2.0 * xi * xi * eta * zeta); + case 48: return make_vector(eta * eta * zeta * zeta, 2.0 * xi * eta * zeta * zeta, 2.0 * xi * eta * eta * zeta); + case 49: return make_vector(0.0, 3.0 * eta * eta * zeta * zeta, 2.0 * eta * eta * eta * zeta); + case 50: return make_vector(2.0 * xi * zeta * zeta * zeta, 0.0, 3.0 * xi * xi * zeta * zeta); + case 51: return make_vector(eta * zeta * zeta * zeta, xi * zeta * zeta * zeta, 3.0 * xi * eta * zeta * zeta); + case 52: return make_vector(0.0, 2.0 * eta * zeta * zeta * zeta, 3.0 * eta * eta * zeta * zeta); + case 53: return make_vector(zeta * zeta * zeta * zeta, 0.0, 4.0 * xi * zeta * zeta * zeta); + case 54: return make_vector(0.0, zeta * zeta * zeta * zeta, 4.0 * eta * zeta * zeta * zeta); + case 55: return make_vector(0.0, 0.0, 5.0 * zeta * zeta * zeta * zeta); + default: return zero_vector(); + } + } +}; + +// ═══════════════════════════════════════════════════════════════════════════ +// Per-topology FEEvaluator delegating specializations +// +// Each partial specialization fixes family=MONOMIAL and elem_type, leaving the +// polynomial Order as a template parameter, then inherits the matching impl. +// ═══════════════════════════════════════════════════════════════════════════ + +// ── 1-D ────────────────────────────────────────────────────────────────────── + +template +struct FEEvaluator : MonomialImpl1D {}; + +template +struct FEEvaluator : MonomialImpl1D {}; + +// ── 2-D ────────────────────────────────────────────────────────────────────── + +template +struct FEEvaluator : MonomialImpl2D {}; + +template +struct FEEvaluator : MonomialImpl2D {}; + +template +struct FEEvaluator : MonomialImpl2D {}; + +template +struct FEEvaluator : MonomialImpl2D {}; + +template +struct FEEvaluator : MonomialImpl2D {}; + +template +struct FEEvaluator : MonomialImpl2D {}; + +// ── 3-D ────────────────────────────────────────────────────────────────────── + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +template +struct FEEvaluator : MonomialImpl3D {}; + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_MONOMIAL_H diff --git a/include/gpu/kokkos_fe_types.h b/include/gpu/kokkos_fe_types.h new file mode 100644 index 00000000000..c266e6dc15a --- /dev/null +++ b/include/gpu/kokkos_fe_types.h @@ -0,0 +1,681 @@ +// Kokkos FE type helpers. +// +// Defines the FEShapeKey aggregate and device-callable dispatch functions used +// by both host-side assembly setup and device-side evaluation. +// +// Uses libMesh's own ElemType, FEFamily, and FEElemClass enums directly — +// no wrapper enums are needed. + +#ifndef LIBMESH_KOKKOS_FE_TYPES_H +#define LIBMESH_KOKKOS_FE_TYPES_H + +#include "libmesh/enum_elem_type.h" +#include "libmesh/enum_fe_family.h" +#include "libmesh/enum_fe_elem_class.h" +#include "libmesh/enum_order.h" +// ElemMappingType (LAGRANGE_MAP, RATIONAL_BERNSTEIN_MAP) is defined in enum_elem_type.h +#include "libmesh/libmesh_device.h" +#ifndef LIBMESH_KOKKOS_COMPILATION +# include "libmesh/libmesh_common.h" +#endif + +namespace libMesh::Kokkos +{ + +// Bring FEElemClass into this namespace so existing unqualified uses compile. +using libMesh::FEElemClass; + +namespace detail +{ + +LIBMESH_DEVICE_INLINE void +abort_unsupported(const char * msg) +{ +#ifdef LIBMESH_KOKKOS_COMPILATION + ::Kokkos::abort(msg); +#else + libmesh_error_msg(msg); +#endif +} + +} // namespace detail + +LIBMESH_DEVICE_INLINE bool +is_monomial_2d_elem_type(libMesh::ElemType elem_type) +{ + switch (elem_type) + { + case libMesh::C0POLYGON: + case libMesh::TRI3: + case libMesh::TRISHELL3: + case libMesh::TRI6: + case libMesh::TRI7: + case libMesh::QUAD4: + case libMesh::QUADSHELL4: + case libMesh::QUAD8: + case libMesh::QUADSHELL8: + case libMesh::QUAD9: + case libMesh::QUADSHELL9: + return true; + default: + return false; + } +} + +LIBMESH_DEVICE_INLINE bool +is_monomial_3d_elem_type(libMesh::ElemType elem_type, + bool include_pyramid18 = true) +{ + switch (elem_type) + { + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + case libMesh::PRISM6: + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + case libMesh::PYRAMID5: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::C0POLYHEDRON: + return true; + case libMesh::PYRAMID18: + return include_pyramid18; + default: + return false; + } +} + +// ── Shape function space key ────────────────────────────────────────────────── +// Uniquely identifies a libMesh FE space, including the exact element topology. +// This must be exact for LAGRANGE spaces, since libMesh distinguishes e.g. +// QUAD8 from QUAD9 and HEX20 from HEX27 at the same polynomial order. +// +// Trivially copyable; fits in a register (enum + enum + enum, no heap). + +struct FEShapeKey +{ + libMesh::FEFamily family; + libMesh::ElemType elem_type; + libMesh::Order order; +}; + +// ── Device-callable conversion helpers ─────────────────────────────────────── + +/// Return the Kokkos side topology used for dispatch for any side of parent +/// element type \p parent. +/// This helper is valid only for elements whose side topology is uniform. +/// Mixed-face elements such as prisms and pyramids require side-specific logic. +/// In 1D, libMesh sides are NODEELEM objects; this helper returns EDGE2 as the +/// internal surrogate topology used by the Kokkos map/shape path. +LIBMESH_DEVICE_INLINE libMesh::ElemType +get_side_topology(libMesh::ElemType parent) +{ + switch (parent) + { + // 1D: libMesh sides are NodeElem, but Kokkos dispatches them through + // a degenerate EDGE2 surrogate. + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return libMesh::EDGE2; + + // 2D first-order: sides are linear edges + case libMesh::TRI3: + case libMesh::QUAD4: + return libMesh::EDGE2; + + // 2D second-order: sides are quadratic edges + case libMesh::TRI6: + case libMesh::TRI7: + case libMesh::QUAD8: + case libMesh::QUAD9: + return libMesh::EDGE3; + + // 3D first-order: uniform-side-topology elements only + case libMesh::TET4: + return libMesh::TRI3; + case libMesh::HEX8: + return libMesh::QUAD4; + + // 3D second-order: uniform-side-topology elements only + case libMesh::TET10: + return libMesh::TRI6; + case libMesh::TET14: + return libMesh::TRI7; + case libMesh::HEX20: + return libMesh::QUAD8; + case libMesh::HEX27: + return libMesh::QUAD9; + + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::PRISM6: + case libMesh::PRISM20: + case libMesh::PRISM21: + case libMesh::PYRAMID5: + case libMesh::PYRAMID18: + detail::abort_unsupported("get_side_topology(): mixed-face elements require side-specific topology"); + return libMesh::INVALID_ELEM; + + default: + detail::abort_unsupported("get_side_topology(): unsupported element type"); + return libMesh::INVALID_ELEM; // unreachable after abort + } +} + +/// Map an ElemType to its base geometric class (order-independent). +/// e.g. QUAD4 / QUAD8 / QUAD9 all return FEElemClass::QUAD. +LIBMESH_DEVICE_INLINE libMesh::FEElemClass +class_from_topology(libMesh::ElemType topo) +{ + switch (topo) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return libMesh::FEElemClass::EDGE; + + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::TRI7: + return libMesh::FEElemClass::TRI; + + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return libMesh::FEElemClass::QUAD; + + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + return libMesh::FEElemClass::TET; + + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + return libMesh::FEElemClass::HEX; + + case libMesh::PRISM6: + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + return libMesh::FEElemClass::PRISM; + + case libMesh::PYRAMID5: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::PYRAMID18: + return libMesh::FEElemClass::PYRAMID; + + default: + detail::abort_unsupported("class_from_topology(): unsupported element type"); + return libMesh::FEElemClass::N_CLASSES; // unreachable after abort + } +} + +LIBMESH_DEVICE_INLINE libMesh::ElemType +lagrange_shape_topology_or_invalid(FEShapeKey key) +{ + switch (key.order) + { + case libMesh::FIRST: + switch (key.elem_type) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return libMesh::EDGE2; + + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::TRI7: + return libMesh::TRI3; + + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return libMesh::QUAD4; + + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + return libMesh::TET4; + + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + return libMesh::HEX8; + + default: + return libMesh::INVALID_ELEM; + } + + case libMesh::SECOND: + switch (key.elem_type) + { + case libMesh::EDGE3: + return libMesh::EDGE3; + + case libMesh::TRI6: + case libMesh::TRI7: + return libMesh::TRI6; + + case libMesh::QUAD8: + return libMesh::QUAD8; + + case libMesh::QUAD9: + return libMesh::QUAD9; + + case libMesh::TET10: + case libMesh::TET14: + return libMesh::TET10; + + case libMesh::HEX20: + return libMesh::HEX20; + + case libMesh::HEX27: + return libMesh::HEX27; + + default: + return libMesh::INVALID_ELEM; + } + + default: + return libMesh::INVALID_ELEM; + } +} + +LIBMESH_DEVICE_INLINE unsigned int +lagrange_exact_n_dofs_or_zero(libMesh::ElemType elem_type, + libMesh::Order order) +{ + switch (order) + { + case libMesh::CONSTANT: + return (elem_type == libMesh::NODEELEM) ? 1u : 0u; + + case libMesh::FIRST: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return 2; + + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::TRI7: + return 3; + + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return 4; + + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + return 4; + + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + return 8; + + case libMesh::PRISM6: + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + return 6; + + case libMesh::PYRAMID5: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::PYRAMID18: + return 5; + + default: + return 0; + } + + case libMesh::SECOND: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE3: + return 3; + + case libMesh::TRI6: + case libMesh::TRI7: + return 6; + + case libMesh::QUAD8: + return 8; + + case libMesh::QUAD9: + return 9; + + case libMesh::TET10: + case libMesh::TET14: + return 10; + + case libMesh::HEX20: + return 20; + + case libMesh::HEX27: + return 27; + + case libMesh::PRISM15: + return 15; + + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + return 18; + + case libMesh::PYRAMID13: + return 13; + + case libMesh::PYRAMID14: + case libMesh::PYRAMID18: + return 14; + + default: + return 0; + } + + case libMesh::THIRD: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE4: + return 4; + + case libMesh::TRI7: + return 7; + + case libMesh::TET14: + return 14; + + case libMesh::PRISM20: + return 20; + + case libMesh::PRISM21: + return 21; + + case libMesh::PYRAMID18: + return 18; + + default: + return 0; + } + + default: + return 0; + } +} + +LIBMESH_DEVICE_INLINE unsigned int +monomial_exact_n_dofs_or_zero(libMesh::ElemType elem_type, + libMesh::Order order) +{ + if (elem_type == libMesh::INVALID_ELEM) + return 0; + if (order < libMesh::CONSTANT) + return 0; + + switch (order) + { + case libMesh::CONSTANT: + return 1; + + case libMesh::FIRST: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return 2; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return 3; + if (is_monomial_3d_elem_type(elem_type)) + return 4; + return 0; + + case libMesh::SECOND: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return 3; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return 6; + if (is_monomial_3d_elem_type(elem_type)) + return 10; + return 0; + + case libMesh::THIRD: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return 4; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return 10; + if (is_monomial_3d_elem_type(elem_type)) + return 20; + return 0; + + case libMesh::FOURTH: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + return 5; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return 15; + if (is_monomial_3d_elem_type(elem_type, false)) + return 35; + return 0; + + case libMesh::FIFTH: + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + return 6; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return 21; + if (is_monomial_3d_elem_type(elem_type, false)) + return 56; + return 0; + + default: + { + const unsigned int p = static_cast(order); + + switch (elem_type) + { + case libMesh::NODEELEM: + return 1; + + case libMesh::EDGE2: + case libMesh::EDGE3: + return p + 1; + + default: + break; + } + + if (is_monomial_2d_elem_type(elem_type)) + return (p + 1) * (p + 2) / 2; + if (is_monomial_3d_elem_type(elem_type, false)) + return (p + 1) * (p + 2) * (p + 3) / 6; + return 0; + } + } +} + +LIBMESH_DEVICE_INLINE unsigned int +monomial_evaluator_dim_or_zero(libMesh::ElemType elem_type) +{ + switch (elem_type) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return 1; + + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::TRI7: + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return 2; + + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + case libMesh::PRISM6: + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + case libMesh::PYRAMID5: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::PYRAMID18: + return 3; + + default: + return 0; + } +} + +/// Return true iff the current Kokkos physics evaluators can evaluate \p key. +/// This boundary is the intersection of: +/// 1. exact libMesh-valid (family, elem_type, order) keys, and +/// 2. currently implemented Kokkos evaluator topologies/orders. +LIBMESH_DEVICE_INLINE bool +supports_shape(FEShapeKey key) +{ + switch (key.family) + { + case libMesh::LAGRANGE: + return lagrange_exact_n_dofs_or_zero(key.elem_type, key.order) != 0 && + lagrange_shape_topology_or_invalid(key) != libMesh::INVALID_ELEM; + + case libMesh::MONOMIAL: + return monomial_exact_n_dofs_or_zero(key.elem_type, key.order) != 0 && + monomial_evaluator_dim_or_zero(key.elem_type) != 0 && + key.order >= libMesh::CONSTANT && + key.order <= libMesh::FIFTH; + + default: + return false; + } +} + +LIBMESH_DEVICE_INLINE bool +supports_grad_shape(FEShapeKey key) +{ + return supports_shape(key); +} + +LIBMESH_DEVICE_INLINE bool +supports_n_dofs(FEShapeKey key) +{ + return supports_shape(key); +} + +/// Return the number of DOFs for a physics FE space described by \p key, +/// restricted to the current Kokkos evaluator support boundary. +LIBMESH_DEVICE_INLINE unsigned int +n_dofs(FEShapeKey key) +{ + if (!supports_n_dofs(key)) + { + detail::abort_unsupported("n_dofs(FEShapeKey): unsupported FE key for current Kokkos evaluator support boundary"); + return 0; + } + + switch (key.family) + { + case libMesh::LAGRANGE: + return lagrange_exact_n_dofs_or_zero(key.elem_type, key.order); + + case libMesh::MONOMIAL: + return monomial_exact_n_dofs_or_zero(key.elem_type, key.order); + + default: + detail::abort_unsupported("n_dofs(FEShapeKey): unsupported FE family"); + return 0; + } +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_FE_TYPES_H diff --git a/include/gpu/kokkos_quadrature.h b/include/gpu/kokkos_quadrature.h new file mode 100644 index 00000000000..4c2e8750bab --- /dev/null +++ b/include/gpu/kokkos_quadrature.h @@ -0,0 +1,652 @@ +// Kokkos device-compatible Gauss quadrature rules. +// +// All evaluation functions are LIBMESH_DEVICE_INLINE — callable from both +// host and GPU device code. +// +// GaussLegendre1D: 1-D Gauss-Legendre on [-1,1], 1-7 point rules. +// GaussQuadrature: Full quadrature dispatcher for all supported topologies. +// - n_points(topo, order): number of quadrature points +// - point(topo, order, qp): reference coordinate of qp-th point +// - weight(topo, order, qp): weight of qp-th point +// +// Values match the libMesh QGauss implementation. + +#ifndef LIBMESH_KOKKOS_QUADRATURE_H +#define LIBMESH_KOKKOS_QUADRATURE_H + +#include "gpu/kokkos_scalar_types.h" +#include "libmesh/enum_elem_type.h" +#include +#include + +namespace libMesh::Kokkos +{ + +// --------------------------------------------------------------------------- +// 1-D Gauss-Legendre quadrature on [-1, 1] +// --------------------------------------------------------------------------- + +struct GaussLegendre1D +{ + LIBMESH_DEVICE_INLINE static unsigned int n_points(unsigned int alg_order) + { + const unsigned int n = (alg_order + 2u) / 2u; + return (n < 1u) ? 1u : (n > 7u ? 7u : n); + } + + LIBMESH_DEVICE_INLINE static Real point(unsigned int n, unsigned int i) + { + switch (n) + { + case 1: return 0.0; + case 2: + switch (i) + { + case 0: return -5.7735026918962576450914878050196e-01; + case 1: return 5.7735026918962576450914878050196e-01; + default: return 0.0; + } + case 3: + switch (i) + { + case 0: return -7.7459666924148337703585307995648e-01; + case 1: return 0.0; + case 2: return 7.7459666924148337703585307995648e-01; + default: return 0.0; + } + case 4: + switch (i) + { + case 0: return -8.6113631159405257522394648889281e-01; + case 1: return -3.3998104358485626480266575910324e-01; + case 2: return 3.3998104358485626480266575910324e-01; + case 3: return 8.6113631159405257522394648889281e-01; + default: return 0.0; + } + case 5: + switch (i) + { + case 0: return -9.0617984593866399279762687829939e-01; + case 1: return -5.3846931010568309103631442070021e-01; + case 2: return 0.0; + case 3: return 5.3846931010568309103631442070021e-01; + case 4: return 9.0617984593866399279762687829939e-01; + default: return 0.0; + } + case 6: + switch (i) + { + case 0: return -9.3246951420315202781230155449399e-01; + case 1: return -6.6120938646626451366139959501991e-01; + case 2: return -2.3861918608319690863050172168071e-01; + case 3: return 2.3861918608319690863050172168071e-01; + case 4: return 6.6120938646626451366139959501991e-01; + case 5: return 9.3246951420315202781230155449399e-01; + default: return 0.0; + } + case 7: + switch (i) + { + case 0: return -9.4910791234275852452618968404785e-01; + case 1: return -7.4153118559939443986386477328079e-01; + case 2: return -4.0584515137739716690660641207696e-01; + case 3: return 0.0; + case 4: return 4.0584515137739716690660641207696e-01; + case 5: return 7.4153118559939443986386477328079e-01; + case 6: return 9.4910791234275852452618968404785e-01; + default: return 0.0; + } + default: return 0.0; + } + } + + LIBMESH_DEVICE_INLINE static Real weight(unsigned int n, unsigned int i) + { + switch (n) + { + case 1: return 2.0; + case 2: return 1.0; + case 3: + switch (i) + { + case 0: case 2: return 5.5555555555555555555555555555556e-01; + case 1: return 8.8888888888888888888888888888889e-01; + default: return 0.0; + } + case 4: + switch (i) + { + case 0: case 3: return 3.4785484513745385737306394922200e-01; + case 1: case 2: return 6.5214515486254614262693605077800e-01; + default: return 0.0; + } + case 5: + switch (i) + { + case 0: case 4: return 2.3692688505618908751426404071992e-01; + case 1: case 3: return 4.7862867049936646804129151483564e-01; + case 2: return 5.6888888888888888888888888888889e-01; + default: return 0.0; + } + case 6: + switch (i) + { + case 0: case 5: return 1.7132449237917034504029614217273e-01; + case 1: case 4: return 3.6076157304813860756983351383772e-01; + case 2: case 3: return 4.6791393457269104738987034398955e-01; + default: return 0.0; + } + case 7: + switch (i) + { + case 0: case 6: return 1.2948496616886969327061143267908e-01; + case 1: case 5: return 2.7970539148927666790146777142378e-01; + case 2: case 4: return 3.8183005050511894495036977548898e-01; + case 3: return 4.1795918367346938775510204081633e-01; + default: return 0.0; + } + default: return 0.0; + } + } +}; + +// --------------------------------------------------------------------------- +// GaussQuadrature — device-callable quadrature for all supported topologies +// +// Coordinate conventions (same as libMesh): +// EDGE: xi in [-1,1] +// QUAD: (xi,eta) in [-1,1]^2, tensor product +// HEX: (xi,eta,zeta) in [-1,1]^3, tensor product +// TRI: (x,y) on unit triangle {(0,0),(1,0),(0,1)} +// TET: (x,y,z) on unit tet {(0,0,0),(1,0,0),(0,1,0),(0,0,1)} +// --------------------------------------------------------------------------- + +struct GaussQuadrature +{ + /// Number of quadrature points for a given topology and polynomial order. + LIBMESH_DEVICE_INLINE static unsigned int + n_points(libMesh::ElemType topo, unsigned int order) + { + switch (topo) + { + case libMesh::EDGE2: case libMesh::EDGE3: + return GaussLegendre1D::n_points(order); + + case libMesh::QUAD4: case libMesh::QUAD8: case libMesh::QUAD9: + { + const unsigned int n = GaussLegendre1D::n_points(order); + return n * n; + } + + case libMesh::HEX8: case libMesh::HEX20: case libMesh::HEX27: + { + const unsigned int n = GaussLegendre1D::n_points(order); + return n * n * n; + } + + case libMesh::TRI3: case libMesh::TRI6: + switch (order) + { + case 0: case 1: return 1; + case 2: return 3; + case 3: return 4; + case 4: return 6; + case 5: return 7; + default: return 12; + } + + case libMesh::TET4: case libMesh::TET10: + switch (order) + { + case 0: case 1: return 1; + case 2: return 4; + case 3: return 5; + case 4: return 11; + case 5: return 14; + default: return 24; + } + + default: return 0; + } + } + + /// Reference coordinate of the qp-th quadrature point. + LIBMESH_DEVICE_INLINE static RealVector + point(libMesh::ElemType topo, unsigned int order, unsigned int qp) + { + switch (topo) + { + case libMesh::EDGE2: case libMesh::EDGE3: + return make_vector(GaussLegendre1D::point(GaussLegendre1D::n_points(order), qp), 0.0, 0.0); + + case libMesh::QUAD4: case libMesh::QUAD8: case libMesh::QUAD9: + { + const unsigned int n = GaussLegendre1D::n_points(order); + const unsigned int i = qp % n; + const unsigned int j = qp / n; + return make_vector(GaussLegendre1D::point(n, i), + GaussLegendre1D::point(n, j), 0.0); + } + + case libMesh::HEX8: case libMesh::HEX20: case libMesh::HEX27: + { + const unsigned int n = GaussLegendre1D::n_points(order); + const unsigned int i = qp % n; + const unsigned int j = (qp / n) % n; + const unsigned int k = qp / (n * n); + return make_vector(GaussLegendre1D::point(n, i), + GaussLegendre1D::point(n, j), + GaussLegendre1D::point(n, k)); + } + + case libMesh::TRI3: case libMesh::TRI6: + return tri_point(order, qp); + + case libMesh::TET4: case libMesh::TET10: + return tet_point(order, qp); + + default: return zero_vector(); + } + } + + /// Weight of the qp-th quadrature point. + LIBMESH_DEVICE_INLINE static Real + weight(libMesh::ElemType topo, unsigned int order, unsigned int qp) + { + switch (topo) + { + case libMesh::EDGE2: case libMesh::EDGE3: + { + const unsigned int n = GaussLegendre1D::n_points(order); + return GaussLegendre1D::weight(n, qp); + } + + case libMesh::QUAD4: case libMesh::QUAD8: case libMesh::QUAD9: + { + const unsigned int n = GaussLegendre1D::n_points(order); + return GaussLegendre1D::weight(n, qp % n) * + GaussLegendre1D::weight(n, qp / n); + } + + case libMesh::HEX8: case libMesh::HEX20: case libMesh::HEX27: + { + const unsigned int n = GaussLegendre1D::n_points(order); + return GaussLegendre1D::weight(n, qp % n) * + GaussLegendre1D::weight(n, (qp / n) % n) * + GaussLegendre1D::weight(n, qp / (n * n)); + } + + case libMesh::TRI3: case libMesh::TRI6: + return tri_weight(order, qp); + + case libMesh::TET4: case libMesh::TET10: + return tet_weight(order, qp); + + default: return 0.0; + } + } + +private: + // ── Triangle rules ──────────────────────────────────────────────────────── + + LIBMESH_DEVICE_INLINE static RealVector + tri_point(unsigned int order, unsigned int qp) + { + switch (order) + { + case 0: case 1: + return make_vector(1.0 / 3.0, 1.0 / 3.0, 0.0); + + case 2: + switch (qp) + { + case 0: return make_vector(2.0 / 3.0, 1.0 / 6.0, 0.0); + case 1: return make_vector(1.0 / 6.0, 2.0 / 3.0, 0.0); + case 2: return make_vector(1.0 / 6.0, 1.0 / 6.0, 0.0); + default: return zero_vector(); + } + + case 3: + switch (qp) + { + case 0: return make_vector(1.5505102572168219018e-01, 1.7855872826361642312e-01, 0.0); + case 1: return make_vector(6.4494897427831780982e-01, 7.5031110222608118177e-02, 0.0); + case 2: return make_vector(1.5505102572168219018e-01, 6.6639024601470138670e-01, 0.0); + case 3: return make_vector(6.4494897427831780982e-01, 2.8001991549907407200e-01, 0.0); + default: return zero_vector(); + } + + case 4: + { + constexpr Real a1 = 4.4594849091596488632e-01, b1 = 1.0 - 2.0 * a1; + constexpr Real a2 = 9.1576213509770743460e-02, b2 = 1.0 - 2.0 * a2; + switch (qp) + { + case 0: return make_vector(a1, a1, 0.0); + case 1: return make_vector(a1, b1, 0.0); + case 2: return make_vector(b1, a1, 0.0); + case 3: return make_vector(a2, a2, 0.0); + case 4: return make_vector(a2, b2, 0.0); + case 5: return make_vector(b2, a2, 0.0); + default: return zero_vector(); + } + } + + case 5: + { + const Real sq15 = 3.872983346207417; // sqrt(15) + const Real a1 = 2.0 / 7.0 + sq15 / 21.0; + const Real a2 = 2.0 / 7.0 - sq15 / 21.0; + const Real b1 = 1.0 - 2.0 * a1, b2 = 1.0 - 2.0 * a2; + switch (qp) + { + case 0: return make_vector(1.0 / 3.0, 1.0 / 3.0, 0.0); + case 1: return make_vector(a1, a1, 0.0); + case 2: return make_vector(a1, b1, 0.0); + case 3: return make_vector(b1, a1, 0.0); + case 4: return make_vector(a2, a2, 0.0); + case 5: return make_vector(a2, b2, 0.0); + case 6: return make_vector(b2, a2, 0.0); + default: return zero_vector(); + } + } + + case 6: + { + constexpr Real a1 = 2.4928674517091042129163855310701908e-01; + constexpr Real a2 = 6.3089014491502228340331602870819157e-02; + constexpr Real a3 = 3.1035245103378440541660773395655215e-01; + constexpr Real b1 = 1.0 - 2.0 * a1; + constexpr Real b2 = 1.0 - 2.0 * a2; + constexpr Real b3 = 6.3650249912139864723014259441204970e-01; + constexpr Real c3 = 1.0 - a3 - b3; + switch (qp) + { + case 0: return make_vector(a1, a1, 0.0); + case 1: return make_vector(a1, b1, 0.0); + case 2: return make_vector(b1, a1, 0.0); + case 3: return make_vector(a2, a2, 0.0); + case 4: return make_vector(a2, b2, 0.0); + case 5: return make_vector(b2, a2, 0.0); + case 6: return make_vector(a3, b3, 0.0); + case 7: return make_vector(b3, a3, 0.0); + case 8: return make_vector(a3, c3, 0.0); + case 9: return make_vector(c3, a3, 0.0); + case 10: return make_vector(b3, c3, 0.0); + case 11: return make_vector(c3, b3, 0.0); + default: return zero_vector(); + } + } + + default: // order >= 7: 12-point Ro3-invariant rule + { + constexpr Real rd[4][2] = { + {6.2382265094402118174e-02, 6.7517867073916085443e-02}, + {5.5225456656926611737e-02, 3.2150249385198182267e-01}, + {3.4324302945097146470e-02, 6.6094919618673565761e-01}, + {5.1584233435359177926e-01, 2.7771616697639178257e-01} + }; + const unsigned int row = qp / 3; + const unsigned int sub = qp % 3; + if (row >= 4) + return zero_vector(); + const Real z1 = rd[row][0], z2 = rd[row][1], z3 = 1.0 - z1 - z2; + switch (sub) + { + case 0: return make_vector(z1, z2, 0.0); + case 1: return make_vector(z3, z1, 0.0); + case 2: return make_vector(z2, z3, 0.0); + default: return zero_vector(); + } + } + } + } + + LIBMESH_DEVICE_INLINE static Real + tri_weight(unsigned int order, unsigned int qp) + { + switch (order) + { + case 0: case 1: return 0.5; + case 2: return 1.0 / 6.0; + case 3: return (qp % 2 == 0) ? 1.5902069087198858470e-01 : 9.0979309128011415303e-02; + case 4: return (qp < 3) ? 1.1169079483900573285e-01 : 5.4975871827660933819e-02; + case 5: + { + if (qp == 0) + return 9.0 / 80.0; + const Real sq15 = 3.872983346207417; + return (qp <= 3) ? (31.0 / 480.0 + sq15 / 2400.0) : (31.0 / 480.0 - sq15 / 2400.0); + } + case 6: + { + if (qp <= 2) + return 5.8393137863189683012644805692789721e-02; + if (qp <= 5) + return 2.5422453185103408460468404553434492e-02; + return 4.1425537809186787596776728210221227e-02; + } + default: + { + constexpr Real wts[4] = { + 2.6517028157436251429e-02, 4.3881408714446055037e-02, + 2.8775042784981585738e-02, 6.7493187009802774463e-02 + }; + return (qp / 3 < 4) ? wts[qp / 3] : 0.0; + } + } + } + + // ── Tetrahedral rules ───────────────────────────────────────────────────── + + LIBMESH_DEVICE_INLINE static RealVector + tet_point(unsigned int order, unsigned int qp) + { + switch (order) + { + case 0: case 1: + return make_vector(0.25, 0.25, 0.25); + + case 2: + { + const Real b = 0.25 * (1.0 - 1.0 / 2.2360679774997896964); // 1/sqrt(5) + const Real a = 1.0 - 3.0 * b; + switch (qp) + { + case 0: return make_vector(a, b, b); + case 1: return make_vector(b, a, b); + case 2: return make_vector(b, b, a); + case 3: return make_vector(b, b, b); + default: return zero_vector(); + } + } + + case 3: + switch (qp) + { + case 0: return make_vector(0.25, 0.25, 0.25); + case 1: return make_vector(0.5, 1.0 / 6.0, 1.0 / 6.0); + case 2: return make_vector(1.0 / 6.0, 0.5, 1.0 / 6.0); + case 3: return make_vector(1.0 / 6.0, 1.0 / 6.0, 0.5); + case 4: return make_vector(1.0 / 6.0, 1.0 / 6.0, 1.0 / 6.0); + default: return zero_vector(); + } + + case 4: + { + constexpr Real a1 = 2.5e-01; + constexpr Real a2 = 7.85714285714285714e-01, b2 = 7.14285714285714285e-02; + constexpr Real a3 = 3.99403576166799219e-01, b3 = 1.00596423833200785e-01; + switch (qp) + { + case 0: return make_vector(a1, a1, a1); + case 1: return make_vector(a2, b2, b2); + case 2: return make_vector(b2, a2, b2); + case 3: return make_vector(b2, b2, a2); + case 4: return make_vector(b2, b2, b2); + case 5: return make_vector(a3, a3, b3); + case 6: return make_vector(a3, b3, b3); + case 7: return make_vector(b3, b3, a3); + case 8: return make_vector(b3, a3, b3); + case 9: return make_vector(b3, a3, a3); + case 10: return make_vector(a3, b3, a3); + default: return zero_vector(); + } + } + + case 5: + { + constexpr Real af[3] = {3.1088591926330060980e-01, + 9.2735250310891226402e-02, + 4.5503704125649649492e-02}; + if (qp < 8) + { + const unsigned int g = qp / 4; + const unsigned int sub = qp % 4; + const Real ag = af[g], bg = 1.0 - 3.0 * ag; + switch (sub) + { + case 0: return make_vector(ag, ag, ag); + case 1: return make_vector(ag, bg, ag); + case 2: return make_vector(bg, ag, ag); + case 3: return make_vector(ag, ag, bg); + default: return zero_vector(); + } + } + else + { + const Real a2 = af[2], b2 = 0.5 * (1.0 - 2.0 * a2); + switch (qp - 8) + { + case 0: return make_vector(b2, b2, a2); + case 1: return make_vector(b2, a2, a2); + case 2: return make_vector(a2, a2, b2); + case 3: return make_vector(a2, b2, a2); + case 4: return make_vector(b2, a2, b2); + case 5: return make_vector(a2, b2, b2); + default: return zero_vector(); + } + } + } + + default: // order >= 6: 24-point Keast rule + { + constexpr Real data[4][3] = { + {3.56191386222544953e-01, 2.14602871259151684e-01, 0.0}, + {8.77978124396165982e-01, 4.06739585346113397e-02, 0.0}, + {3.29863295731730594e-02, 3.22337890142275646e-01, 0.0}, + {0.0, 0.0, 0.0} // 12-perm group handled separately + }; + + if (qp < 12) + { + // Three 4-permutation groups + const unsigned int grp = qp / 4; + const unsigned int sub = qp % 4; + const Real a = data[grp][0], b = data[grp][1]; + switch (sub) + { + case 0: return make_vector(a, b, b); + case 1: return make_vector(b, a, b); + case 2: return make_vector(b, b, a); + case 3: return make_vector(b, b, b); + default: return zero_vector(); + } + } + else + { + // 12-permutation group + constexpr Real a4 = 6.36610018750175299e-02; + constexpr Real b4 = 2.69672331458315867e-01; + constexpr Real c4 = 6.03005664791649076e-01; + switch (qp - 12) + { + case 0: return make_vector(a4, a4, b4); + case 1: return make_vector(a4, a4, c4); + case 2: return make_vector(b4, a4, a4); + case 3: return make_vector(c4, a4, a4); + case 4: return make_vector(a4, b4, a4); + case 5: return make_vector(a4, c4, a4); + case 6: return make_vector(a4, b4, c4); + case 7: return make_vector(a4, c4, b4); + case 8: return make_vector(b4, a4, c4); + case 9: return make_vector(b4, c4, a4); + case 10: return make_vector(c4, a4, b4); + case 11: return make_vector(c4, b4, a4); + default: return zero_vector(); + } + } + } + } + } + + LIBMESH_DEVICE_INLINE static Real + tet_weight(unsigned int order, unsigned int qp) + { + switch (order) + { + case 0: case 1: return 1.0 / 6.0; + case 2: return 1.0 / 24.0; + case 3: return (qp == 0) ? -2.0 / 15.0 : 0.075; + case 4: + { + if (qp == 0) + return -1.31555555555555556e-02; + if (qp <= 4) + return 7.62222222222222222e-03; + return 2.48888888888888889e-02; + } + case 5: + { + constexpr Real wf[3] = {1.8781320953002641800e-02, + 1.2248840519393658257e-02, + 7.0910034628469110730e-03}; + if (qp < 4) + return wf[0]; + if (qp < 8) + return wf[1]; + return wf[2]; + } + default: + { + constexpr Real wts[4] = {6.65379170969464506e-03, + 1.67953517588677620e-03, + 9.22619692394239843e-03, + 8.03571428571428248e-03}; + if (qp < 4) + return wts[0]; + if (qp < 8) + return wts[1]; + if (qp < 12) + return wts[2]; + return wts[3]; + } + } + } +}; + +// --------------------------------------------------------------------------- +// fill_quadrature — host-side convenience wrapper +// +// Fills std::vectors using the device-callable GaussQuadrature functions. +// --------------------------------------------------------------------------- + +inline void +fill_quadrature(libMesh::ElemType topo, + unsigned int order, + std::vector & qpts, + std::vector & weights) +{ + const unsigned int nqp = GaussQuadrature::n_points(topo, order); + qpts.resize(nqp); + weights.resize(nqp); + for (unsigned int q = 0; q < nqp; ++q) + { + qpts[q] = GaussQuadrature::point(topo, order, q); + weights[q] = GaussQuadrature::weight(topo, order, q); + } +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_QUADRATURE_H diff --git a/include/gpu/kokkos_scalar_types.h b/include/gpu/kokkos_scalar_types.h new file mode 100644 index 00000000000..b7386cf900f --- /dev/null +++ b/include/gpu/kokkos_scalar_types.h @@ -0,0 +1,118 @@ +// libMesh Kokkos device-compatible scalar types. +// +// This header provides dimension-aware Kokkos aliases/helpers that mirror +// libMesh host numerics at LIBMESH_DIM=1/2/3. + +#ifndef LIBMESH_KOKKOS_SCALAR_TYPES_H +#define LIBMESH_KOKKOS_SCALAR_TYPES_H + +#include "libmesh/libmesh_common.h" +#include "libmesh/libmesh_device.h" +#include "libmesh/type_vector.h" +#include "libmesh/type_tensor.h" +namespace libMesh::Kokkos +{ + +using Real = libMesh::Real; +using RealVector = libMesh::TypeVector; +using RealTensor = libMesh::TypeTensor; + +LIBMESH_DEVICE_INLINE +RealVector zero_vector() +{ + RealVector v; + v.zero(); + return v; +} + +LIBMESH_DEVICE_INLINE +RealVector make_vector(const Real x, const Real y = 0, const Real z = 0) +{ + RealVector v = zero_vector(); + + v(0) = x; + +#if LIBMESH_DIM > 1 + v(1) = y; +#else + libmesh_assert_equal_to(y, Real(0)); +#endif + +#if LIBMESH_DIM > 2 + v(2) = z; +#else + libmesh_assert_equal_to(z, Real(0)); +#endif + + return v; +} + +LIBMESH_DEVICE_INLINE +RealTensor zero_tensor() +{ + RealTensor J; + J.zero(); + return J; +} + +LIBMESH_DEVICE_INLINE +RealTensor leading_identity(const unsigned int dim = LIBMESH_DIM) +{ + libmesh_assert_less_equal(dim, LIBMESH_DIM); + + RealTensor I = zero_tensor(); + for (unsigned int i = 0; i < dim; ++i) + I(i, i) = Real(1); + + return I; +} + +LIBMESH_DEVICE_INLINE +Real leading_determinant(const RealTensor & J, const unsigned int dim = LIBMESH_DIM) +{ + libmesh_assert_less_equal(dim, LIBMESH_DIM); + + if (dim == 0) + return Real(1); + + if (dim == 1) + return J(0, 0); + + if (dim == 2) + return J(0, 0) * J(1, 1) - J(0, 1) * J(1, 0); + + return J.det(); +} + +LIBMESH_DEVICE_INLINE +RealTensor leading_inverse(const RealTensor & J, const unsigned int dim = LIBMESH_DIM) +{ + libmesh_assert_less_equal(dim, LIBMESH_DIM); + + if (dim == 0) + return leading_identity(0); + + if (dim == 1) + { + RealTensor inv = zero_tensor(); + inv(0, 0) = Real(1) / J(0, 0); + return inv; + } + + if (dim == 2) + { + const Real inv_det = Real(1) / leading_determinant(J, dim); + RealTensor inv = zero_tensor(); + inv(0, 0) = J(1, 1) * inv_det; + inv(0, 1) = -J(0, 1) * inv_det; + inv(1, 0) = -J(1, 0) * inv_det; + inv(1, 1) = J(0, 0) * inv_det; + return inv; + } + + return J.inverse(); +} + +} // namespace libMesh::Kokkos + +#endif // LIBMESH_KOKKOS_SCALAR_TYPES_H diff --git a/src/quadrature/quadrature_gauss_3D.C b/src/quadrature/quadrature_gauss_3D.C index e9986c216cb..8e2f96ed5cc 100644 --- a/src/quadrature/quadrature_gauss_3D.C +++ b/src/quadrature/quadrature_gauss_3D.C @@ -181,8 +181,6 @@ void QGauss::init_3D() // Note: if !allow_rules_with_negative_weights, fall through to next case. } - - // Originally a Keast rule, // Patrick Keast, // Moderate Degree Tetrahedral Quadrature Formulas, From bebe8b7b6bc2827cc880edaa189873c707757e11 Mon Sep 17 00:00:00 2001 From: rochi00 Date: Tue, 5 May 2026 10:28:33 -0600 Subject: [PATCH 6/8] Add Kokkos FE oracle test suite --- tests/Makefile.am | 110 +- tests/fe/kokkos_fe_contract_test.K | 333 ++++ tests/fe/kokkos_fe_invariant_test.K | 418 +++++ tests/fe/kokkos_fe_map_oracle_test.K | 529 +++++++ tests/fe/kokkos_fe_oracle_test_utils.h | 1386 +++++++++++++++++ tests/fe/kokkos_fe_permuted_map_oracle_test.K | 512 ++++++ .../fe/kokkos_fe_reconstruction_oracle_test.K | 320 ++++ tests/fe/kokkos_fe_shape_oracle_test.K | 629 ++++++++ tests/fe/kokkos_fe_side_trace_oracle_test.K | 342 ++++ tests/fe/kokkos_fe_types_oracle_test.K | 509 ++++++ tests/fe/kokkos_quadrature_oracle_test.K | 747 +++++++++ tests/quadrature/quadrature_exactness.h | 176 +++ tests/quadrature/quadrature_test.C | 108 +- 13 files changed, 6028 insertions(+), 91 deletions(-) create mode 100644 tests/fe/kokkos_fe_contract_test.K create mode 100644 tests/fe/kokkos_fe_invariant_test.K create mode 100644 tests/fe/kokkos_fe_map_oracle_test.K create mode 100644 tests/fe/kokkos_fe_oracle_test_utils.h create mode 100644 tests/fe/kokkos_fe_permuted_map_oracle_test.K create mode 100644 tests/fe/kokkos_fe_reconstruction_oracle_test.K create mode 100644 tests/fe/kokkos_fe_shape_oracle_test.K create mode 100644 tests/fe/kokkos_fe_side_trace_oracle_test.K create mode 100644 tests/fe/kokkos_fe_types_oracle_test.K create mode 100644 tests/fe/kokkos_quadrature_oracle_test.K create mode 100644 tests/quadrature/quadrature_exactness.h diff --git a/tests/Makefile.am b/tests/Makefile.am index 6efb6d23e88..a721cba160d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -135,6 +135,7 @@ unit_tests_sources = \ partitioning/morton_sfc_partitioner_test.C \ partitioning/parmetis_partitioner_test.C \ partitioning/sfc_partitioner_test.C \ + quadrature/quadrature_exactness.h \ quadrature/quadrature_test.C \ solvers/time_solver_test_common.h \ solvers/first_order_unsteady_solver_test.C \ @@ -241,7 +242,7 @@ data = matrices/geom_1_extraction_op.h5 \ unit_tests_data = $(data) # Why isn't this working automatically? -EXTRA_DIST = $(data) +EXTRA_DIST = $(data) fe/kokkos_fe_oracle_test_utils.h if LIBMESH_ENABLE_FPARSER unit_tests_sources += \ @@ -254,8 +255,75 @@ TESTS = if LIBMESH_ENABLE_KOKKOS KOKKOS_TEST_CPPFLAGS += -I$(top_srcdir)/include $(KOKKOS_CPPFLAGS) - check_PROGRAMS += kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit - TESTS += kokkos_vector_ops_oracle_unit kokkos_tensor_ops_oracle_unit + check_PROGRAMS += kokkos_fe_types_oracle_unit kokkos_fe_shape_oracle_unit \ + kokkos_fe_map_oracle_unit kokkos_fe_invariant_unit \ + kokkos_fe_contract_unit kokkos_fe_permuted_map_oracle_unit \ + kokkos_fe_reconstruction_oracle_unit \ + kokkos_fe_side_trace_oracle_unit + TESTS += kokkos_fe_types_oracle_unit kokkos_fe_shape_oracle_unit \ + kokkos_fe_map_oracle_unit kokkos_fe_invariant_unit \ + kokkos_fe_contract_unit kokkos_fe_permuted_map_oracle_unit \ + kokkos_fe_reconstruction_oracle_unit \ + kokkos_fe_side_trace_oracle_unit + + kokkos_fe_types_oracle_unit_SOURCES = fe/kokkos_fe_types_oracle_test.K + kokkos_fe_types_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_types_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_types_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_types_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_shape_oracle_unit_SOURCES = fe/kokkos_fe_shape_oracle_test.K + kokkos_fe_shape_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_shape_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_shape_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_shape_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_map_oracle_unit_SOURCES = fe/kokkos_fe_map_oracle_test.K + kokkos_fe_map_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_map_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_map_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_map_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_invariant_unit_SOURCES = fe/kokkos_fe_invariant_test.K + kokkos_fe_invariant_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_invariant_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_invariant_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_invariant_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_contract_unit_SOURCES = fe/kokkos_fe_contract_test.K + kokkos_fe_contract_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_contract_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_contract_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_contract_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_permuted_map_oracle_unit_SOURCES = fe/kokkos_fe_permuted_map_oracle_test.K + kokkos_fe_permuted_map_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_permuted_map_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_permuted_map_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_permuted_map_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_reconstruction_oracle_unit_SOURCES = fe/kokkos_fe_reconstruction_oracle_test.K + kokkos_fe_reconstruction_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_reconstruction_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_reconstruction_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_reconstruction_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + kokkos_fe_side_trace_oracle_unit_SOURCES = fe/kokkos_fe_side_trace_oracle_test.K + kokkos_fe_side_trace_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_fe_side_trace_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_fe_side_trace_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_fe_side_trace_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) + + check_PROGRAMS += kokkos_quadrature_oracle_unit kokkos_vector_ops_oracle_unit \ + kokkos_tensor_ops_oracle_unit + TESTS += kokkos_quadrature_oracle_unit kokkos_vector_ops_oracle_unit \ + kokkos_tensor_ops_oracle_unit + + kokkos_quadrature_oracle_unit_SOURCES = fe/kokkos_quadrature_oracle_test.K + kokkos_quadrature_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) + kokkos_quadrature_oracle_unit_CXXFLAGS = $(AM_CXXFLAGS) $(KOKKOS_CXXFLAGS) + kokkos_quadrature_oracle_unit_LDFLAGS = $(AM_LDFLAGS) $(KOKKOS_LDFLAGS) + kokkos_quadrature_oracle_unit_LDADD = $(top_builddir)/libmesh_opt.la $(KOKKOS_LIBS) $(libmesh_optional_LIBS) kokkos_vector_ops_oracle_unit_SOURCES = numerics/kokkos_vector_ops_oracle_test.K kokkos_vector_ops_oracle_unit_CPPFLAGS = $(AM_CPPFLAGS) $(KOKKOS_TEST_CPPFLAGS) @@ -392,6 +460,42 @@ endif -c $< -o $@ # Custom link rules so the Kokkos compiler drives the final link step. +kokkos_fe_types_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_types_oracle_unit_LDFLAGS) -o $@ + +kokkos_fe_shape_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_shape_oracle_unit_LDFLAGS) -o $@ + +kokkos_fe_map_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_map_oracle_unit_LDFLAGS) -o $@ + +kokkos_fe_invariant_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_invariant_unit_LDFLAGS) -o $@ + +kokkos_fe_contract_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_contract_unit_LDFLAGS) -o $@ + +kokkos_fe_permuted_map_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_permuted_map_oracle_unit_LDFLAGS) -o $@ + +kokkos_fe_reconstruction_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_reconstruction_oracle_unit_LDFLAGS) -o $@ + +kokkos_fe_side_trace_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_fe_side_trace_oracle_unit_LDFLAGS) -o $@ + +kokkos_quadrature_oracle_unit_LINK = \ + $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ + $(LDFLAGS) $(kokkos_quadrature_oracle_unit_LDFLAGS) -o $@ + kokkos_vector_ops_oracle_unit_LINK = \ $(LIBTOOL) --tag=CXX --mode=link $(KOKKOS_CXX) \ $(LDFLAGS) $(kokkos_vector_ops_oracle_unit_LDFLAGS) -o $@ diff --git a/tests/fe/kokkos_fe_contract_test.K b/tests/fe/kokkos_fe_contract_test.K new file mode 100644 index 00000000000..826693a2e93 --- /dev/null +++ b/tests/fe/kokkos_fe_contract_test.K @@ -0,0 +1,333 @@ +// Host-side contract tests for libMesh::Kokkos hard-fail paths. +// +// This executable self-spawns child processes that intentionally invoke +// unsupported Kokkos FE entry points. A child succeeds only if the call +// returns normally; the parent test expects those calls to terminate with a +// non-zero exit status instead. +// +// Returns 0 on success, non-zero on failure. + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" +#include "gpu/kokkos_fe_types.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/node.h" + +#include +#include +#include +#include +#include +#include + +using libMesh::Kokkos::RealTensor; +using libMesh::Kokkos::RealVector; + +namespace +{ + +struct contract_case +{ + const char * name; +}; + +struct element_fixture +{ + std::unique_ptr elem; + std::vector> nodes; +}; + +} // anonymous namespace + +static element_fixture +build_master_fixture(libMesh::ElemType elem_type) +{ + element_fixture fixture; + fixture.elem = libMesh::Elem::build(elem_type); + fixture.elem->set_mapping_type(libMesh::LAGRANGE_MAP); + fixture.nodes.reserve(fixture.elem->n_nodes()); + + std::vector refspace_nodes; + libMesh::FEBase::get_refspace_nodes(elem_type, refspace_nodes); + + for (unsigned int i = 0; i < fixture.elem->n_nodes(); ++i) + { + const libMesh::Point refspace = refspace_nodes[i]; + fixture.nodes.push_back(libMesh::Node::build(refspace(0), refspace(1), refspace(2), i)); + fixture.elem->set_node(i, fixture.nodes.back().get()); + } + + return fixture; +} + +static std::unique_ptr +find_side_of_type(const libMesh::Elem & parent, + libMesh::ElemType desired_type, + unsigned int & side_id) +{ + for (unsigned int s = 0; s < parent.n_sides(); ++s) + { + auto side = parent.build_side_ptr(s); + if (side->type() == desired_type) + { + side_id = s; + return side; + } + } + + side_id = libMesh::invalid_uint; + return nullptr; +} + +static void +invoke_face_jacobian_on_side(const libMesh::Elem & side) +{ + constexpr unsigned int max_face_nodes = 9; + + RealVector face_nodes[max_face_nodes]; + for (unsigned int i = 0; i < side.n_nodes(); ++i) + face_nodes[i] = libMesh::Kokkos::point_to_real_vector(side.point(i)); + + (void)libMesh::Kokkos::face_jacobian( + libMesh::LAGRANGE_MAP, side.type(), face_nodes, side.n_nodes(), 0.0, 0.0, 0.0); +} + +static int +run_child_case(const std::string & case_name) +{ + using libMesh::Kokkos::FEShapeKey; + + if (case_name == "noop") + return 0; + + if (case_name == "get_side_topology_prism6") + { + (void)libMesh::Kokkos::get_side_topology(libMesh::PRISM6); + return 0; + } + + if (case_name == "get_side_topology_pyramid5") + { + (void)libMesh::Kokkos::get_side_topology(libMesh::PYRAMID5); + return 0; + } + + if (case_name == "shape_lagrange_edge4_third") + { + (void)libMesh::Kokkos::shape( + FEShapeKey{libMesh::LAGRANGE, libMesh::EDGE4, libMesh::THIRD}, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "grad_shape_lagrange_prism6_first") + { + (void)libMesh::Kokkos::grad_shape( + FEShapeKey{libMesh::LAGRANGE, libMesh::PRISM6, libMesh::FIRST}, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "shape_monomial_hex27_sixth") + { + (void)libMesh::Kokkos::shape( + FEShapeKey{libMesh::MONOMIAL, libMesh::HEX27, libMesh::SIXTH}, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "grad_shape_monomial_tri7_sixth") + { + (void)libMesh::Kokkos::grad_shape( + FEShapeKey{libMesh::MONOMIAL, libMesh::TRI7, libMesh::SIXTH}, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "ndofs_lagrange_prism6_first") + { + (void)libMesh::Kokkos::n_dofs( + FEShapeKey{libMesh::LAGRANGE, libMesh::PRISM6, libMesh::FIRST}); + return 0; + } + + if (case_name == "map_shape_rational") + { + (void)libMesh::Kokkos::map_shape( + libMesh::RATIONAL_BERNSTEIN_MAP, libMesh::QUAD4, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "grad_map_shape_rational") + { + (void)libMesh::Kokkos::grad_map_shape( + libMesh::RATIONAL_BERNSTEIN_MAP, libMesh::QUAD4, 0, 0.0, 0.0, 0.0); + return 0; + } + + if (case_name == "face_normal_parent_dim2") + { + RealTensor J = libMesh::Kokkos::zero_tensor(); + J(0, 0) = 1.0; + J(0, 1) = 2.0; + (void)libMesh::Kokkos::face_normal(J, 2); + return 0; + } + + if (case_name == "map_face_qp_to_parent_prism20_tri7") + { + auto fixture = build_master_fixture(libMesh::PRISM20); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + (void)libMesh::Kokkos::map_face_qp_to_parent( + *side, libMesh::LAGRANGE_MAP, side->type(), libMesh::Kokkos::zero_vector()); + return 0; + } + + if (case_name == "map_face_qp_to_parent_prism21_tri7") + { + auto fixture = build_master_fixture(libMesh::PRISM21); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + (void)libMesh::Kokkos::map_face_qp_to_parent( + *side, libMesh::LAGRANGE_MAP, side->type(), libMesh::Kokkos::zero_vector()); + return 0; + } + + if (case_name == "map_face_qp_to_parent_pyramid18_tri7") + { + auto fixture = build_master_fixture(libMesh::PYRAMID18); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + (void)libMesh::Kokkos::map_face_qp_to_parent( + *side, libMesh::LAGRANGE_MAP, side->type(), libMesh::Kokkos::zero_vector()); + return 0; + } + + if (case_name == "face_jacobian_prism20_tri7") + { + auto fixture = build_master_fixture(libMesh::PRISM20); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + invoke_face_jacobian_on_side(*side); + return 0; + } + + if (case_name == "face_jacobian_prism21_tri7") + { + auto fixture = build_master_fixture(libMesh::PRISM21); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + invoke_face_jacobian_on_side(*side); + return 0; + } + + if (case_name == "face_jacobian_pyramid18_tri7") + { + auto fixture = build_master_fixture(libMesh::PYRAMID18); + unsigned int side_id = libMesh::invalid_uint; + auto side = find_side_of_type(*fixture.elem, libMesh::TRI7, side_id); + if (!side) + return 2; + invoke_face_jacobian_on_side(*side); + return 0; + } + + std::fprintf(stderr, "Unknown child case: %s\n", case_name.c_str()); + return 3; +} + +static int +run_command(const std::string & command) +{ + std::fflush(nullptr); + return std::system(command.c_str()); +} + +static bool +expect_child_success(const char * argv0, const char * case_name) +{ + const std::string command = + std::string(argv0) + " --child " + case_name + " >/dev/null 2>&1"; + const int status = run_command(command); + return status == 0; +} + +static bool +expect_child_abort(const char * argv0, const char * case_name) +{ + const std::string command = + std::string(argv0) + " --child " + case_name + " >/dev/null 2>&1"; + const int status = run_command(command); + if (status == -1) + return false; + + if (WIFSIGNALED(status)) + return true; + + if (!WIFEXITED(status)) + return false; + + const int exit_code = WEXITSTATUS(status); + return exit_code != 0 && exit_code != 2 && exit_code != 3; +} + +int +main(int argc, char ** argv) +{ + if (argc == 3 && std::string(argv[1]) == "--child") + return run_child_case(argv[2]); + + if (!expect_child_success(argv[0], "noop")) + { + std::printf("[contract_spawn] FAIL (could not successfully respawn test executable)\n"); + return 1; + } + + const contract_case cases[] = { + { "get_side_topology_prism6" }, + { "get_side_topology_pyramid5" }, + { "shape_lagrange_edge4_third" }, + { "grad_shape_lagrange_prism6_first" }, + { "shape_monomial_hex27_sixth" }, + { "grad_shape_monomial_tri7_sixth" }, + { "ndofs_lagrange_prism6_first" }, + { "map_shape_rational" }, + { "grad_map_shape_rational" }, + { "face_normal_parent_dim2" }, + { "face_jacobian_prism20_tri7" }, + { "face_jacobian_prism21_tri7" }, + { "face_jacobian_pyramid18_tri7" }, + { "map_face_qp_to_parent_prism20_tri7" }, + { "map_face_qp_to_parent_prism21_tri7" }, + { "map_face_qp_to_parent_pyramid18_tri7" } + }; + + int total_fail = 0; + for (const auto & info : cases) + { + const bool passed = expect_child_abort(argv[0], info.name); + const int fail = passed ? 0 : 1; + std::printf("[contract_abort] [%s] %s (%d failures)\n", + info.name, + passed ? "PASS" : "FAIL", + fail); + total_fail += fail; + } + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_invariant_test.K b/tests/fe/kokkos_fe_invariant_test.K new file mode 100644 index 00000000000..da089f74737 --- /dev/null +++ b/tests/fe/kokkos_fe_invariant_test.K @@ -0,0 +1,418 @@ +// Kokkos kernel regression tests for libMesh::Kokkos FE invariants and quadrature exactness. +// The test suite covers: +// A. Partition of unity for all implemented LAGRANGE map topologies. +// B. Zero-sum gradients for the same map topologies. +// C. Nodal Kronecker-delta behavior at master nodes for the same map topologies. +// D. Quadrature exactness sweeps for the canonical tensor-product and simplex +// reference topologies using analytic monomial integrals on the reference +// element. +// +// Returns 0 on success, non-zero on failure. + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_quadrature.h" +#include "../quadrature/quadrature_exactness.h" + +#include "libmesh/elem.h" +#include "libmesh/libmesh.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include +#include +#include + +using libMesh::Kokkos::GaussQuadrature; +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_qps; +using kokkos_test_utils::build_reference_elem; +using kokkos_test_utils::compare_device_values; +using kokkos_test_utils::dispatch_supported_lagrange_map_topology; +using kokkos_test_utils::upload_real; + +static constexpr double invariant_tol = 1.0e-13; +static constexpr double exactness_tol = 2.0e-12; +static constexpr unsigned int quadrature_order = 4; + +namespace +{ + +struct map_elem_info +{ + libMesh::ElemType topo; + unsigned int dim; + unsigned int n_dofs; + const char * name; +}; + +struct quadrature_exactness_case +{ + libMesh::ElemType topo; + unsigned int dim; + unsigned int max_order; + const char * name; +}; + +static const map_elem_info map_elems[] = { + { libMesh::EDGE2, 1, 2, "EDGE2" }, + { libMesh::EDGE3, 1, 3, "EDGE3" }, + { libMesh::TRI3, 2, 3, "TRI3" }, + { libMesh::TRI6, 2, 6, "TRI6" }, + { libMesh::QUAD4, 2, 4, "QUAD4" }, + { libMesh::QUAD8, 2, 8, "QUAD8" }, + { libMesh::QUAD9, 2, 9, "QUAD9" }, + { libMesh::TET4, 3, 4, "TET4" }, + { libMesh::TET10, 3, 10, "TET10" }, + { libMesh::HEX8, 3, 8, "HEX8" }, + { libMesh::HEX20, 3, 20, "HEX20" }, + { libMesh::HEX27, 3, 27, "HEX27" } +}; + +// These cases sweep the full exactness range provided by the current Kokkos +// QGauss helper: +// - tensor-product rules: through order 13 (7-point 1D Gauss-Legendre) +// - simplex rules: through order 6 (highest explicit triangle/tet tables) +static const quadrature_exactness_case quadrature_cases[] = { + { libMesh::EDGE2, 1, 13, "EDGE2" }, + { libMesh::TRI3, 2, 6, "TRI3" }, + { libMesh::QUAD4, 2, 13, "QUAD4" }, + { libMesh::TET4, 3, 6, "TET4" }, + { libMesh::HEX8, 3, 13, "HEX8" } +}; + +} // anonymous namespace + +LIBMESH_DEVICE_INLINE Real +int_pow(Real x, unsigned int p) +{ + Real result = 1.0; + for (unsigned int i = 0; i < p; ++i) + result *= x; + return result; +} + +template +static int +test_partition_of_unity_impl(const map_elem_info & info) +{ + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(info.topo, info.dim, quadrature_order, xi_h, eta_h, zeta_h); + + auto d_xi = upload_real(xi_h, "unity_xi"); + auto d_eta = upload_real(eta_h, "unity_eta"); + auto d_zeta = upload_real(zeta_h, "unity_zeta"); + + Kokkos::View d_sum(std::string("unity_sum"), nqp); + + const unsigned int n_dofs = info.n_dofs; + Kokkos::parallel_for( + nqp, + KOKKOS_LAMBDA(int q) { + Real sum = 0.0; + for (unsigned int i = 0; i < n_dofs; ++i) + sum += libMesh::Kokkos::map_shape(i, d_xi(q), d_eta(q), d_zeta(q)); + d_sum(q) = sum; + }); + Kokkos::fence(); + + std::vector ref_values(nqp, 1.0); + return compare_device_values(d_sum, ref_values, invariant_tol); +} + +struct partition_of_unity_dispatch +{ + explicit partition_of_unity_dispatch(const map_elem_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_partition_of_unity_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported partition topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_elem_info & info; +}; + +static int +test_partition_of_unity(const map_elem_info & info) +{ + const partition_of_unity_dispatch dispatch(info); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +template +static int +test_zero_sum_gradients_impl(const map_elem_info & info) +{ + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(info.topo, info.dim, quadrature_order, xi_h, eta_h, zeta_h); + + auto d_xi = upload_real(xi_h, "gradsum_xi"); + auto d_eta = upload_real(eta_h, "gradsum_eta"); + auto d_zeta = upload_real(zeta_h, "gradsum_zeta"); + + Kokkos::View d_sum(std::string("gradsum"), info.dim * nqp); + + const unsigned int n_dofs = info.n_dofs; + const unsigned int dim = info.dim; + Kokkos::parallel_for( + nqp, + KOKKOS_LAMBDA(int q) { + RealVector sum = libMesh::Kokkos::zero_vector(); + for (unsigned int i = 0; i < n_dofs; ++i) + sum += libMesh::Kokkos::grad_map_shape( + i, d_xi(q), d_eta(q), d_zeta(q)); + + for (unsigned int d = 0; d < dim; ++d) + d_sum(dim * q + d) = sum(d); + }); + Kokkos::fence(); + + std::vector ref_values(info.dim * nqp, 0.0); + return compare_device_values(d_sum, ref_values, invariant_tol); +} + +struct zero_sum_gradients_dispatch +{ + explicit zero_sum_gradients_dispatch(const map_elem_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_zero_sum_gradients_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported zero-sum gradient topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_elem_info & info; +}; + +static int +test_zero_sum_gradients(const map_elem_info & info) +{ + const zero_sum_gradients_dispatch dispatch(info); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +template +static int +test_kronecker_delta_impl(const map_elem_info & info) +{ + auto elem = build_reference_elem(Topo); + + std::vector xi_h(info.n_dofs), eta_h(info.n_dofs), zeta_h(info.n_dofs); + for (unsigned int j = 0; j < info.n_dofs; ++j) + { + const libMesh::Point p = elem->master_point(j); + xi_h[j] = p(0); + eta_h[j] = p(1); + zeta_h[j] = p(2); + } + + auto d_xi = upload_real(xi_h, "delta_xi"); + auto d_eta = upload_real(eta_h, "delta_eta"); + auto d_zeta = upload_real(zeta_h, "delta_zeta"); + + Kokkos::View d_values(std::string("delta_values"), info.n_dofs * info.n_dofs); + + const unsigned int n_dofs = info.n_dofs; + Kokkos::parallel_for( + n_dofs * n_dofs, + KOKKOS_LAMBDA(int idx) { + const unsigned int i = static_cast(idx) / n_dofs; + const unsigned int j = static_cast(idx) % n_dofs; + d_values(idx) = libMesh::Kokkos::map_shape( + i, d_xi(j), d_eta(j), d_zeta(j)); + }); + Kokkos::fence(); + + std::vector ref_values(info.n_dofs * info.n_dofs, 0.0); + for (unsigned int i = 0; i < info.n_dofs; ++i) + ref_values[i * info.n_dofs + i] = 1.0; + + return compare_device_values(d_values, ref_values, invariant_tol); +} + +struct kronecker_delta_dispatch +{ + explicit kronecker_delta_dispatch(const map_elem_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_kronecker_delta_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported kronecker topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_elem_info & info; +}; + +static int +test_kronecker_delta(const map_elem_info & info) +{ + const kronecker_delta_dispatch dispatch(info); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +static double +integrate_monomial_on_device(const quadrature_exactness_case & info, + unsigned int order, + unsigned int a, + unsigned int b, + unsigned int c) +{ + const unsigned int nqp = GaussQuadrature::n_points(info.topo, order); + const libMesh::ElemType topo = info.topo; + + double integral = 0.0; + Kokkos::parallel_reduce( + nqp, + KOKKOS_LAMBDA(int qp, double & local_sum) { + const RealVector pt = GaussQuadrature::point(topo, order, qp); + const Real weight = GaussQuadrature::weight(topo, order, qp); + Real monomial = int_pow(pt(0), a); + +#if LIBMESH_DIM > 1 + monomial *= int_pow(pt(1), b); +#else + libmesh_assert_equal_to(b, 0); +#endif + +#if LIBMESH_DIM > 2 + monomial *= int_pow(pt(2), c); +#else + libmesh_assert_equal_to(c, 0); +#endif + + local_sum += static_cast(weight) * static_cast(monomial); + }, + integral); + + return integral; +} + +static int +test_quadrature_exactness(const quadrature_exactness_case & info) +{ + int fail = 0; + + for (unsigned int order = 0; order <= info.max_order; ++order) + switch (info.dim) + { + case 1: + for (unsigned int a = 0; a <= order; ++a) + { + const double actual = integrate_monomial_on_device(info, order, a, 0, 0); + const double expected = quadrature_exactness::monomial_integral(info.topo, a, 0, 0); + if (std::fabs(actual - expected) > exactness_tol) + ++fail; + } + break; + + case 2: + for (unsigned int a = 0; a <= order; ++a) + for (unsigned int b = 0; a + b <= order; ++b) + { + const double actual = integrate_monomial_on_device(info, order, a, b, 0); + const double expected = quadrature_exactness::monomial_integral(info.topo, a, b, 0); + if (std::fabs(actual - expected) > exactness_tol) + ++fail; + } + break; + + case 3: + for (unsigned int a = 0; a <= order; ++a) + for (unsigned int b = 0; a + b <= order; ++b) + for (unsigned int c = 0; a + b + c <= order; ++c) + { + const double actual = integrate_monomial_on_device(info, order, a, b, c); + const double expected = quadrature_exactness::monomial_integral(info.topo, a, b, c); + if (std::fabs(actual - expected) > exactness_tol) + ++fail; + } + break; + + default: + ++fail; + break; + } + + return fail; +} + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + for (const auto & info : map_elems) + { + { + const int f = test_partition_of_unity(info); + std::printf("[partition_of_unity] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_zero_sum_gradients(info); + std::printf("[zero_sum_gradients] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_kronecker_delta(info); + std::printf("[kronecker_delta] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + for (const auto & info : quadrature_cases) + { + const int f = test_quadrature_exactness(info); + std::printf("[quadrature_exactness] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_map_oracle_test.K b/tests/fe/kokkos_fe_map_oracle_test.K new file mode 100644 index 00000000000..afde3b315ff --- /dev/null +++ b/tests/fe/kokkos_fe_map_oracle_test.K @@ -0,0 +1,529 @@ +// GPU kernel tests for libMesh::Kokkos map helpers across broad topology coverage. +// +// Standalone executable (no CppUnit). Uses libMesh::LibMeshInit so that +// FEMap, FEBase, and FEBase::side_map are available for oracle values. +// +// The test suite covers: +// A. physical_point_and_jacobian() and volume_jxw() against libMesh FEBase +// for all implemented LAGRANGE map topologies. +// B. face_jacobian(), face_jxw(), face_normal(), and +// edge_normal_on_parent_surface() against libMesh FE oracles for all +// sides of the implemented 2D and 3D parent topologies. +// C. map_face_qp_to_parent() against libMesh FEBase::side_map() for all +// sides and multiple side quadrature points, including supported +// mixed-face prism and pyramid element types. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/fe_map.h" +#include "libmesh/libmesh.h" +#include "libmesh/node.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include +#include +#include + +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_face_helper_context; +using kokkos_test_utils::build_map_helper_context; +using kokkos_test_utils::build_reference_fixture; +using kokkos_test_utils::dispatch_supported_lagrange_face_map_topology; +using kokkos_test_utils::dispatch_supported_lagrange_map_topology; +using kokkos_test_utils::element_fixture; +using kokkos_test_utils::evaluate_face_helper_context_2d; +using kokkos_test_utils::evaluate_face_helper_context_3d; +using kokkos_test_utils::evaluate_map_helper_context; +using kokkos_test_utils::face_helper_context; +using kokkos_test_utils::is_supported_lagrange_face_map_topology; +using kokkos_test_utils::vector_component; + +static constexpr double tol = 1.0e-13; + +namespace +{ + +struct map_helper_case +{ + libMesh::ElemType topo; + const char * name; +}; + +struct face_parent_case +{ + libMesh::ElemType topo; + const char * name; +}; + +struct face_qp_parent_case +{ + libMesh::ElemType topo; + const char * name; +}; + +} // anonymous namespace + +template +static int +test_map_helpers_case_impl(const map_helper_case & info) +{ + auto fixture = build_reference_fixture(Topo); + const auto context = build_map_helper_context(fixture, info.topo, "map_oracle"); + const int fail = evaluate_map_helper_context(context, "map_oracle_results", tol); + if (fail) + std::printf(" map helper mismatch: topo=%s (%d failures)\n", info.name, fail); + + return fail; +} + +struct map_helper_dispatch +{ + explicit map_helper_dispatch(const map_helper_case & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_map_helpers_case_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported map-helper topology: topo=%s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_helper_case & info; +}; + +static int +test_map_helpers_case(const map_helper_case & info) +{ + const map_helper_dispatch dispatch(info); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +template +static int +test_face_helper_side_case_3d_impl(const face_helper_context & context, + unsigned int side_id, + const char * parent_name, + libMesh::ElemType side_topo) +{ + const int fail = evaluate_face_helper_context_3d(context, "face_oracle_results", tol); + if (fail) + std::printf(" face helper mismatch: parent=%s side_id=%u side_type=%d (%d failures)\n", + parent_name, + side_id, + static_cast(side_topo), + fail); + + return fail; +} + +template +static int +test_face_helper_side_case_2d_impl(const face_helper_context & context, + unsigned int side_id, + const char * parent_name, + libMesh::ElemType side_topo) +{ + const int fail = + evaluate_face_helper_context_2d(context, "face_oracle_results", tol); + if (fail) + std::printf(" face helper mismatch: parent=%s side_id=%u side_type=%d (%d failures)\n", + parent_name, + side_id, + static_cast(side_topo), + fail); + + return fail; +} + +struct face_helper_side_dispatch_3d +{ + face_helper_side_dispatch_3d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_face_helper_side_case_3d_impl(context, side_id, parent_name, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported face-helper side: parent=%s side_id=%u side_type=%d\n", + parent_name, + side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + libMesh::ElemType side_topo; +}; + +template +struct face_helper_side_dispatch_2d +{ + face_helper_side_dispatch_2d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_face_helper_side_case_2d_impl( + context, side_id, parent_name, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported face-helper side: parent=%s side_id=%u side_type=%d\n", + parent_name, + side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + libMesh::ElemType side_topo; +}; + +struct face_helper_parent_dispatch_2d +{ + face_helper_parent_dispatch_2d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + const face_helper_side_dispatch_2d dispatch( + context, side_id, parent_name, side_topo); + return dispatch_supported_lagrange_face_map_topology(side_topo, dispatch); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported face-helper parent: parent=%s parent_type=%d side_id=%u\n", + parent_name, + static_cast(topo), + side_id); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + libMesh::ElemType side_topo; +}; + +static int +test_face_helper_side_case(const element_fixture & fixture, + unsigned int side_id, + const char * parent_name) +{ + auto side = fixture.elem->build_side_ptr(side_id); + const face_helper_context context = + build_face_helper_context(fixture, *side, side_id, "face_oracle"); + + if (context.parent_dim == 3) + { + const face_helper_side_dispatch_3d dispatch(context, side_id, parent_name, side->type()); + return dispatch_supported_lagrange_face_map_topology(side->type(), dispatch); + } + + if (context.parent_dim == 2) + { + const face_helper_parent_dispatch_2d dispatch(context, side_id, parent_name, side->type()); + return dispatch_supported_lagrange_map_topology(fixture.elem->type(), dispatch); + } + + std::printf(" unexpected unsupported face-helper parent dimension: parent=%s dim=%u side_id=%u\n", + parent_name, + context.parent_dim, + side_id); + return 1; +} + +static int +test_face_helpers_for_parent(const face_parent_case & info) +{ + auto fixture = build_reference_fixture(info.topo); + + int fail = 0; + for (unsigned int side_id = 0; side_id < fixture.elem->n_sides(); ++side_id) + fail += test_face_helper_side_case(fixture, side_id, info.name); + + return fail; +} + +static RealVector +host_face_qp_to_parent_oracle(const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + RealVector face_qpt) +{ + const libMesh::FEType fe_type(parent.default_order(), libMesh::FEMap::map_fe_type(parent)); + auto fe = libMesh::FEBase::build(parent.dim(), fe_type); + + // FE::side_map() relies on FEMap::psi_map, which is only populated after + // some mapping quantity (e.g. xyz) has been requested on the FE object. + fe->get_xyz(); + + std::vector ref_side_points(1); + ref_side_points[0] = libMesh::Point( + vector_component(face_qpt, 0), vector_component(face_qpt, 1), vector_component(face_qpt, 2)); + + std::vector ref_points; + fe->side_map(&parent, &side, side_id, ref_side_points, ref_points); + + return libMesh::Kokkos::make_vector(ref_points[0](0), ref_points[0](1), ref_points[0](2)); +} + +static int +check_face_qp_to_parent_case(const char * parent_name, + const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + RealVector face_qpt) +{ + using libMesh::Kokkos::map_face_qp_to_parent; + + const RealVector host = host_face_qp_to_parent_oracle(parent, side, side_id, face_qpt); + const RealVector kokkos = + map_face_qp_to_parent(side, libMesh::LAGRANGE_MAP, side.type(), face_qpt); + + int fail = 0; + for (unsigned int d = 0; d < 3; ++d) + if (std::fabs(vector_component(kokkos, d) - vector_component(host, d)) > tol) + ++fail; + + if (fail) + { + std::vector refspace_nodes; + libMesh::FEBase::get_refspace_nodes(parent.type(), refspace_nodes); + + std::printf(" face_qp mismatch: parent=%s side_id=%u parent_type=%d side_type=%d\n", + parent_name, + side_id, + static_cast(parent.type()), + static_cast(side.type())); + std::printf(" face_qpt=(%.17g, %.17g, %.17g)\n", + vector_component(face_qpt, 0), vector_component(face_qpt, 1), vector_component(face_qpt, 2)); + std::printf(" host =(%.17g, %.17g, %.17g)\n", + vector_component(host, 0), vector_component(host, 1), vector_component(host, 2)); + std::printf(" kokkos =(%.17g, %.17g, %.17g)\n", + vector_component(kokkos, 0), vector_component(kokkos, 1), vector_component(kokkos, 2)); + std::printf(" side nodes / parent refspace nodes:\n"); + + for (unsigned int k = 0; k < side.n_nodes(); ++k) + { + const unsigned int parent_node = parent.local_side_node(side_id, k); + const libMesh::Point parent_refspace = refspace_nodes[parent_node]; + std::printf(" k=%u side_node_id=%llu parent_node=%u parent_refspace=(%.17g, %.17g, %.17g)\n", + k, + libMesh::cast_int(side.node_id(k)), + parent_node, + parent_refspace(0), + parent_refspace(1), + parent_refspace(2)); + } + } + + return fail; +} + +static int +test_face_qp_to_parent_for_parent(const face_qp_parent_case & info) +{ + auto fixture = build_reference_fixture(info.topo); + + int fail = 0; + for (unsigned int side_id = 0; side_id < fixture.elem->n_sides(); ++side_id) + { + auto side = fixture.elem->build_side_ptr(side_id); + + if (side->n_nodes() == 1) + { + fail += + check_face_qp_to_parent_case(info.name, *fixture.elem, *side, side_id, libMesh::Kokkos::zero_vector()); + continue; + } + + if (!is_supported_lagrange_face_map_topology(side->type())) + { + std::printf(" unexpected unsupported face_qp side: parent=%s side_id=%u side_type=%d\n", + info.name, + side_id, + static_cast(side->type())); + ++fail; + continue; + } + + libMesh::QGauss qr(side->dim(), libMesh::FOURTH); + qr.allow_rules_with_negative_weights = true; + qr.init(side->type()); + + for (unsigned int q = 0; q < qr.n_points(); ++q) + { + const RealVector face_qpt = libMesh::Kokkos::make_vector( + qr.qp(q)(0), + (side->dim() >= 2) ? qr.qp(q)(1) : Real(0), + (side->dim() >= 3) ? qr.qp(q)(2) : Real(0)); + fail += check_face_qp_to_parent_case(info.name, *fixture.elem, *side, side_id, face_qpt); + } + } + + return fail; +} + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + { + const map_helper_case cases[] = { + { libMesh::EDGE2, "EDGE2" }, + { libMesh::EDGE3, "EDGE3" }, + { libMesh::TRI3, "TRI3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD4, "QUAD4" }, + { libMesh::QUAD8, "QUAD8" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET4, "TET4" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX8, "HEX8" }, + { libMesh::HEX20, "HEX20" }, + { libMesh::HEX27, "HEX27" } + }; + + for (const auto & info : cases) + { + const int f = test_map_helpers_case(info); + std::printf("[map_helper_breadth] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + { + const face_parent_case cases[] = { + { libMesh::TRI3, "TRI3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD4, "QUAD4" }, + { libMesh::QUAD8, "QUAD8" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET4, "TET4" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX8, "HEX8" }, + { libMesh::HEX20, "HEX20" }, + { libMesh::HEX27, "HEX27" }, + { libMesh::PRISM6, "PRISM6" }, + { libMesh::PRISM15, "PRISM15" }, + { libMesh::PRISM18, "PRISM18" }, + { libMesh::PYRAMID5, "PYRAMID5" }, + { libMesh::PYRAMID13, "PYRAMID13" }, + { libMesh::PYRAMID14, "PYRAMID14" } + }; + + for (const auto & info : cases) + { + const int f = test_face_helpers_for_parent(info); + std::printf("[face_helper_breadth] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + { + const face_qp_parent_case cases[] = { + { libMesh::EDGE2, "EDGE2" }, + { libMesh::EDGE3, "EDGE3" }, + { libMesh::EDGE4, "EDGE4" }, + { libMesh::TRI3, "TRI3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD4, "QUAD4" }, + { libMesh::QUAD8, "QUAD8" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET4, "TET4" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX8, "HEX8" }, + { libMesh::HEX20, "HEX20" }, + { libMesh::HEX27, "HEX27" }, + { libMesh::PRISM6, "PRISM6" }, + { libMesh::PRISM15, "PRISM15" }, + { libMesh::PRISM18, "PRISM18" }, + { libMesh::PYRAMID5, "PYRAMID5" }, + { libMesh::PYRAMID13, "PYRAMID13" }, + { libMesh::PYRAMID14, "PYRAMID14" } + }; + + for (const auto & info : cases) + { + const int f = test_face_qp_to_parent_for_parent(info); + std::printf("[face_qp_parent_breadth] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_oracle_test_utils.h b/tests/fe/kokkos_fe_oracle_test_utils.h new file mode 100644 index 00000000000..5d6f53e0920 --- /dev/null +++ b/tests/fe/kokkos_fe_oracle_test_utils.h @@ -0,0 +1,1386 @@ +#ifndef LIBMESH_TESTS_FE_KOKKOS_FE_ORACLE_TEST_UTILS_H +#define LIBMESH_TESTS_FE_KOKKOS_FE_ORACLE_TEST_UTILS_H + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" +#include "gpu/kokkos_fe_types.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/fe_map.h" +#include "libmesh/node.h" +#include "libmesh/quadrature_gauss.h" + +#include +#include +#include +#include + +// This header is intended for the standalone Kokkos test executables, which +// include Kokkos before pulling in these helpers. + +namespace kokkos_test_utils +{ + +LIBMESH_DEVICE_INLINE libMesh::Real +vector_component(const libMesh::Kokkos::RealVector & v, unsigned int component) +{ + switch (component) + { + case 0: + return v(0); + case 1: +#if LIBMESH_DIM > 1 + return v(1); +#else + return 0.0; +#endif + case 2: +#if LIBMESH_DIM > 2 + return v(2); +#else + return 0.0; +#endif + default: + return 0.0; + } +} + +LIBMESH_DEVICE_INLINE libMesh::Real +tensor_component(const libMesh::Kokkos::RealTensor & T, unsigned int i, unsigned int j) +{ +#if LIBMESH_DIM > 2 + return T(i, j); +#elif LIBMESH_DIM > 1 + if (i < 2 && j < 2) + return T(i, j); + return 0.0; +#else + if (i == 0 && j == 0) + return T(0, 0); + return 0.0; +#endif +} + +struct element_fixture +{ + std::unique_ptr elem; + std::vector> nodes; +}; + +struct map_helper_context +{ + std::vector ref_values; + Kokkos::View d_coords; + Kokkos::View d_xi; + Kokkos::View d_eta; + Kokkos::View d_zeta; + Kokkos::View d_w; + unsigned int nqp; + unsigned int dim; + unsigned int n_nodes; +}; + +struct face_helper_context +{ + std::vector ref_values; + Kokkos::View d_face_coords; + Kokkos::View d_parent_coords; + Kokkos::View d_xi; + Kokkos::View d_eta; + Kokkos::View d_zeta; + Kokkos::View d_w; + Kokkos::View d_parent_xi; + Kokkos::View d_parent_eta; + Kokkos::View d_parent_zeta; + unsigned int nqp; + unsigned int parent_dim; + unsigned int n_parent_nodes; + unsigned int n_face_nodes; +}; + +template +struct lagrange_evaluator_topology +{ + static const libMesh::ElemType value = libMesh::INVALID_ELEM; +}; + +#define KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(exact_topo, exact_order, evaluator_topo) \ + template <> \ + struct lagrange_evaluator_topology \ + { \ + static const libMesh::ElemType value = libMesh::evaluator_topo; \ + } + +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(EDGE2, FIRST, EDGE2); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(EDGE3, FIRST, EDGE2); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(EDGE3, SECOND, EDGE3); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(EDGE4, FIRST, EDGE2); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TRI3, FIRST, TRI3); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TRI6, FIRST, TRI3); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TRI6, SECOND, TRI6); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TRI7, FIRST, TRI3); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TRI7, SECOND, TRI6); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(QUAD4, FIRST, QUAD4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(QUAD8, FIRST, QUAD4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(QUAD8, SECOND, QUAD8); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(QUAD9, FIRST, QUAD4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(QUAD9, SECOND, QUAD9); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TET4, FIRST, TET4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TET10, FIRST, TET4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TET10, SECOND, TET10); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TET14, FIRST, TET4); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(TET14, SECOND, TET10); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(HEX8, FIRST, HEX8); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(HEX20, FIRST, HEX8); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(HEX20, SECOND, HEX20); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(HEX27, FIRST, HEX8); +KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE(HEX27, SECOND, HEX27); + +#undef KOKKOS_TEST_UTILS_LAGRANGE_TOPOLOGY_CASE + +template +struct monomial_evaluator_dim +{ + static const unsigned int value = 0; +}; + +#define KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(exact_topo, dim_value) \ + template <> \ + struct monomial_evaluator_dim \ + { \ + static const unsigned int value = dim_value; \ + } + +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(EDGE2, 1); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(EDGE3, 1); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(EDGE4, 1); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TRI3, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TRI6, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TRI7, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(QUAD4, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(QUAD8, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(QUAD9, 2); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TET4, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TET10, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(TET14, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(HEX8, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(HEX20, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(HEX27, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PRISM6, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PRISM15, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PRISM18, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PRISM20, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PRISM21, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PYRAMID5, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PYRAMID13, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PYRAMID14, 3); +KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE(PYRAMID18, 3); + +#undef KOKKOS_TEST_UTILS_MONOMIAL_DIM_CASE + +template +struct monomial_order_evaluator; + +#define KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(dim_value, exact_order, impl_suffix, impl_order) \ + template <> \ + struct monomial_order_evaluator \ + { \ + LIBMESH_DEVICE_INLINE static libMesh::Real shape(unsigned int i, \ + libMesh::Real xi, \ + libMesh::Real eta, \ + libMesh::Real zeta) \ + { \ + return libMesh::Kokkos::impl_suffix::shape(i, xi, eta, zeta); \ + } \ + \ + LIBMESH_DEVICE_INLINE static libMesh::Kokkos::RealVector grad_shape(unsigned int i, \ + libMesh::Real xi, \ + libMesh::Real eta, \ + libMesh::Real zeta) \ + { \ + return libMesh::Kokkos::impl_suffix::grad_shape(i, xi, eta, zeta); \ + } \ + } + +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, CONSTANT, MonomialImpl1D, 0); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, FIRST, MonomialImpl1D, 1); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, SECOND, MonomialImpl1D, 2); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, THIRD, MonomialImpl1D, 3); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, FOURTH, MonomialImpl1D, 4); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(1, FIFTH, MonomialImpl1D, 5); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, CONSTANT, MonomialImpl2D, 0); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, FIRST, MonomialImpl2D, 1); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, SECOND, MonomialImpl2D, 2); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, THIRD, MonomialImpl2D, 3); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, FOURTH, MonomialImpl2D, 4); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(2, FIFTH, MonomialImpl2D, 5); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, CONSTANT, MonomialImpl3D, 0); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, FIRST, MonomialImpl3D, 1); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, SECOND, MonomialImpl3D, 2); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, THIRD, MonomialImpl3D, 3); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, FOURTH, MonomialImpl3D, 4); +KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE(3, FIFTH, MonomialImpl3D, 5); + +#undef KOKKOS_TEST_UTILS_MONOMIAL_ORDER_CASE + +template +struct exact_shape_evaluator; + +template +struct exact_shape_evaluator +{ + LIBMESH_DEVICE_INLINE static libMesh::Real shape(unsigned int i, + libMesh::Real xi, + libMesh::Real eta, + libMesh::Real zeta) + { + return libMesh::Kokkos::map_shape::value>( + i, xi, eta, zeta); + } + + LIBMESH_DEVICE_INLINE static libMesh::Kokkos::RealVector grad_shape(unsigned int i, + libMesh::Real xi, + libMesh::Real eta, + libMesh::Real zeta) + { + return libMesh::Kokkos::grad_map_shape::value>( + i, xi, eta, zeta); + } +}; + +template +struct exact_shape_evaluator +{ + LIBMESH_DEVICE_INLINE static libMesh::Real shape(unsigned int i, + libMesh::Real xi, + libMesh::Real eta, + libMesh::Real zeta) + { + return monomial_order_evaluator::value, ExactOrder>::shape( + i, xi, eta, zeta); + } + + LIBMESH_DEVICE_INLINE static libMesh::Kokkos::RealVector grad_shape(unsigned int i, + libMesh::Real xi, + libMesh::Real eta, + libMesh::Real zeta) + { + return monomial_order_evaluator::value, ExactOrder>::grad_shape( + i, xi, eta, zeta); + } +}; + +template +LIBMESH_DEVICE_INLINE libMesh::Real +shape_for_key(unsigned int i, libMesh::Real xi, libMesh::Real eta, libMesh::Real zeta) +{ + return exact_shape_evaluator::shape(i, xi, eta, zeta); +} + +template +LIBMESH_DEVICE_INLINE libMesh::Kokkos::RealVector +grad_shape_for_key(unsigned int i, libMesh::Real xi, libMesh::Real eta, libMesh::Real zeta) +{ + return exact_shape_evaluator::grad_shape(i, xi, eta, zeta); +} + +template +inline int +dispatch_supported_monomial_order(libMesh::Order order, const Dispatcher & dispatcher) +{ + switch (order) + { + case libMesh::CONSTANT: + return dispatcher.template operator()(); + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + case libMesh::THIRD: + return dispatcher.template operator()(); + case libMesh::FOURTH: + return dispatcher.template operator()(); + case libMesh::FIFTH: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(libMesh::Kokkos::FEShapeKey{ libMesh::MONOMIAL, ExactTopo, order }); + } +} + +inline bool +is_supported_lagrange_map_topology(libMesh::ElemType topo); + +template +inline int +dispatch_supported_lagrange_shape_key(libMesh::Kokkos::FEShapeKey key, const Dispatcher & dispatcher) +{ + if (key.family != libMesh::LAGRANGE || !libMesh::Kokkos::supports_shape(key)) + return dispatcher.unsupported_key(key); + + switch (key.elem_type) + { + case libMesh::EDGE2: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::EDGE3: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::EDGE4: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TRI3: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TRI6: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TRI7: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD4: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD8: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD9: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TET4: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TET10: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TET14: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX8: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX20: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX27: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + default: + return dispatcher.unsupported_key(key); + } +} + +template +inline int +dispatch_supported_lagrange_shape_key_with_map(libMesh::Kokkos::FEShapeKey key, + const Dispatcher & dispatcher) +{ + if (key.family != libMesh::LAGRANGE || + !libMesh::Kokkos::supports_shape(key) || + !is_supported_lagrange_map_topology(key.elem_type)) + return dispatcher.unsupported_key(key); + + switch (key.elem_type) + { + case libMesh::EDGE2: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::EDGE3: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TRI3: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TRI6: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD4: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD8: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::QUAD9: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TET4: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::TET10: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX8: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX20: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + case libMesh::HEX27: + switch (key.order) + { + case libMesh::FIRST: + return dispatcher.template operator()(); + case libMesh::SECOND: + return dispatcher.template operator()(); + default: + return dispatcher.unsupported_key(key); + } + default: + return dispatcher.unsupported_key(key); + } +} + +template +inline int +dispatch_supported_shape_key(libMesh::Kokkos::FEShapeKey key, const Dispatcher & dispatcher) +{ + if (!libMesh::Kokkos::supports_shape(key)) + return dispatcher.unsupported_key(key); + + switch (key.family) + { + case libMesh::LAGRANGE: + return dispatch_supported_lagrange_shape_key(key, dispatcher); + + case libMesh::MONOMIAL: + switch (key.elem_type) + { + case libMesh::EDGE2: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::EDGE3: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::EDGE4: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TRI3: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TRI6: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TRI7: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD4: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD8: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD9: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TET4: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TET10: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TET14: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX8: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX20: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX27: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PRISM6: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PRISM15: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PRISM18: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PRISM20: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PRISM21: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PYRAMID5: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PYRAMID13: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PYRAMID14: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::PYRAMID18: + return dispatch_supported_monomial_order(key.order, dispatcher); + default: + return dispatcher.unsupported_key(key); + } + + default: + return dispatcher.unsupported_key(key); + } +} + +inline bool +is_supported_lagrange_map_topology(libMesh::ElemType topo) +{ + switch (topo) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + case libMesh::TET4: + case libMesh::TET10: + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + return true; + + default: + return false; + } +} + +inline bool +supports_shape_key_with_lagrange_map(libMesh::Kokkos::FEShapeKey key) +{ + return libMesh::Kokkos::supports_shape(key) && + is_supported_lagrange_map_topology(key.elem_type); +} + +template +inline int +dispatch_supported_shape_key_with_lagrange_map(libMesh::Kokkos::FEShapeKey key, + const Dispatcher & dispatcher) +{ + if (!supports_shape_key_with_lagrange_map(key)) + return dispatcher.unsupported_key(key); + + switch (key.family) + { + case libMesh::LAGRANGE: + return dispatch_supported_lagrange_shape_key_with_map(key, dispatcher); + + case libMesh::MONOMIAL: + switch (key.elem_type) + { + case libMesh::EDGE2: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::EDGE3: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TRI3: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TRI6: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD4: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD8: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::QUAD9: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TET4: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::TET10: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX8: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX20: + return dispatch_supported_monomial_order(key.order, dispatcher); + case libMesh::HEX27: + return dispatch_supported_monomial_order(key.order, dispatcher); + default: + return dispatcher.unsupported_key(key); + } + + default: + return dispatcher.unsupported_key(key); + } +} + +inline bool +is_supported_lagrange_face_map_topology(libMesh::ElemType topo) +{ + switch (topo) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return true; + + default: + return false; + } +} + +template +inline int +dispatch_supported_lagrange_map_topology(libMesh::ElemType topo, + const Dispatcher & dispatcher) +{ + switch (topo) + { + case libMesh::EDGE2: + return dispatcher.template operator()(); + case libMesh::EDGE3: + return dispatcher.template operator()(); + case libMesh::TRI3: + return dispatcher.template operator()(); + case libMesh::TRI6: + return dispatcher.template operator()(); + case libMesh::QUAD4: + return dispatcher.template operator()(); + case libMesh::QUAD8: + return dispatcher.template operator()(); + case libMesh::QUAD9: + return dispatcher.template operator()(); + case libMesh::TET4: + return dispatcher.template operator()(); + case libMesh::TET10: + return dispatcher.template operator()(); + case libMesh::HEX8: + return dispatcher.template operator()(); + case libMesh::HEX20: + return dispatcher.template operator()(); + case libMesh::HEX27: + return dispatcher.template operator()(); + + default: + return dispatcher.unsupported_topology(topo); + } +} + +template +inline int +dispatch_supported_lagrange_face_map_topology(libMesh::ElemType topo, + const Dispatcher & dispatcher) +{ + if (!is_supported_lagrange_face_map_topology(topo)) + return dispatcher.unsupported_topology(topo); + + return dispatch_supported_lagrange_map_topology(topo, dispatcher); +} + +inline int +compare_device_values(const Kokkos::View & d_values, + const std::vector & ref_values, + double tol = 1.0e-13) +{ + auto h_values = Kokkos::create_mirror_view(d_values); + Kokkos::deep_copy(h_values, d_values); + + int fail = 0; + for (std::size_t i = 0; i < ref_values.size(); ++i) + if (std::fabs(h_values(i) - ref_values[i]) > tol) + ++fail; + + return fail; +} + +inline std::unique_ptr +build_reference_elem(libMesh::ElemType elem_type) +{ + auto elem = libMesh::Elem::build(elem_type); + elem->set_mapping_type(libMesh::LAGRANGE_MAP); + return elem; +} + +inline unsigned int +build_qps(libMesh::ElemType elem_type, + unsigned int dim, + unsigned int quadrature_order, + std::vector & xi_h, + std::vector & eta_h, + std::vector & zeta_h) +{ + libMesh::QGauss qr(dim, static_cast(quadrature_order)); + qr.allow_rules_with_negative_weights = true; + qr.init(elem_type); + + const unsigned int nqp = qr.n_points(); + xi_h.resize(nqp); + eta_h.resize(nqp); + zeta_h.resize(nqp); + + for (unsigned int q = 0; q < nqp; ++q) + { + xi_h[q] = qr.qp(q)(0); + eta_h[q] = (dim >= 2) ? qr.qp(q)(1) : libMesh::Real(0); + zeta_h[q] = (dim >= 3) ? qr.qp(q)(2) : libMesh::Real(0); + } + + return nqp; +} + +inline unsigned int +build_qps(libMesh::ElemType elem_type, + unsigned int dim, + std::vector & xi_h, + std::vector & eta_h, + std::vector & zeta_h) +{ + return build_qps(elem_type, dim, /*quadrature_order=*/4, xi_h, eta_h, zeta_h); +} + +inline unsigned int +build_host_qgauss(libMesh::ElemType topo, + unsigned int dim, + unsigned int order, + std::vector & x_ref, + std::vector & y_ref, + std::vector & z_ref, + std::vector & w_ref) +{ + libMesh::QGauss qr(dim, static_cast(order)); + qr.allow_rules_with_negative_weights = true; + qr.init(topo); + + const unsigned int nqp = qr.n_points(); + x_ref.resize(nqp); + y_ref.resize(nqp); + z_ref.resize(nqp); + w_ref.resize(nqp); + + for (unsigned int q = 0; q < nqp; ++q) + { + x_ref[q] = qr.qp(q)(0); + y_ref[q] = (dim >= 2) ? qr.qp(q)(1) : libMesh::Real(0); + z_ref[q] = (dim >= 3) ? qr.qp(q)(2) : libMesh::Real(0); + w_ref[q] = qr.w(q); + } + + return nqp; +} + +inline Kokkos::View +upload_real(const std::vector & values, const char * label) +{ + Kokkos::View d(std::string(label), values.size()); + auto h = Kokkos::create_mirror_view(d); + for (std::size_t i = 0; i < values.size(); ++i) + h(i) = values[i]; + Kokkos::deep_copy(d, h); + return d; +} + +inline Kokkos::View +upload_point_coordinates(const libMesh::Elem & elem, const char * label) +{ + Kokkos::View d(std::string(label), 3 * elem.n_nodes()); + auto h = Kokkos::create_mirror_view(d); + for (unsigned int i = 0; i < elem.n_nodes(); ++i) + { + h(3 * i + 0) = elem.point(i)(0); + h(3 * i + 1) = elem.point(i)(1); + h(3 * i + 2) = elem.point(i)(2); + } + Kokkos::deep_copy(d, h); + return d; +} + +inline std::string +make_label(const char * prefix, const char * suffix) +{ + return std::string(prefix) + suffix; +} + +inline element_fixture +build_reference_fixture(libMesh::ElemType elem_type) +{ + element_fixture fixture; + fixture.elem = build_reference_elem(elem_type); + fixture.nodes.reserve(fixture.elem->n_nodes()); + + const unsigned int dim = fixture.elem->dim(); + + for (unsigned int i = 0; i < fixture.elem->n_nodes(); ++i) + { + const libMesh::Point master = fixture.elem->master_point(i); + const libMesh::Real xi = master(0); + const libMesh::Real eta = master(1); + const libMesh::Real zeta = master(2); + + libMesh::Point xyz; + switch (dim) + { + case 1: + xyz = libMesh::Point( + 0.7 + 0.8 * xi + 0.06 * xi * xi, + -0.3 + 0.25 * xi + 0.04 * xi * xi, + 0.2 + 0.1 * xi - 0.03 * xi * xi); + break; + + case 2: + xyz = libMesh::Point( + 0.4 + 0.9 * xi + 0.15 * eta + 0.04 * xi * eta + 0.03 * eta * eta, + -0.2 + 0.2 * xi + 0.85 * eta + 0.05 * xi * xi + 0.03 * xi * eta, + 0.1 + 0.12 * xi - 0.08 * eta + 0.02 * xi * eta); + break; + + case 3: + xyz = libMesh::Point( + 0.3 + 0.9 * xi + 0.12 * eta + 0.08 * zeta + 0.03 * xi * eta + 0.02 * zeta * zeta, + -0.1 + 0.18 * xi + 0.8 * eta + 0.11 * zeta + 0.02 * eta * zeta, + 0.2 + 0.10 * xi + 0.14 * eta + 0.85 * zeta + 0.02 * xi * zeta + 0.01 * xi * eta); + break; + + default: + xyz = libMesh::Point(); + break; + } + + fixture.nodes.push_back(libMesh::Node::build(xyz(0), xyz(1), xyz(2), i)); + fixture.elem->set_node(i, fixture.nodes.back().get()); + } + + return fixture; +} + +inline element_fixture +build_flat_reference_fixture(libMesh::ElemType elem_type) +{ + element_fixture fixture; + fixture.elem = build_reference_elem(elem_type); + fixture.nodes.reserve(fixture.elem->n_nodes()); + + const unsigned int dim = fixture.elem->dim(); + + for (unsigned int i = 0; i < fixture.elem->n_nodes(); ++i) + { + const libMesh::Point master = fixture.elem->master_point(i); + const libMesh::Real xi = master(0); + const libMesh::Real eta = master(1); + const libMesh::Real zeta = master(2); + + libMesh::Point xyz; + switch (dim) + { + case 1: + xyz = libMesh::Point(0.7 + 0.8 * xi + 0.06 * xi * xi, + 0.0, + 0.0); + break; + + case 2: + xyz = libMesh::Point(0.4 + 0.9 * xi + 0.15 * eta + 0.04 * xi * eta + 0.03 * eta * eta, + -0.2 + 0.2 * xi + 0.85 * eta + 0.05 * xi * xi + 0.03 * xi * eta, + 0.0); + break; + + case 3: + xyz = libMesh::Point( + 0.3 + 0.9 * xi + 0.12 * eta + 0.08 * zeta + 0.03 * xi * eta + 0.02 * zeta * zeta, + -0.1 + 0.18 * xi + 0.8 * eta + 0.11 * zeta + 0.02 * eta * zeta, + 0.2 + 0.10 * xi + 0.14 * eta + 0.85 * zeta + 0.02 * xi * zeta + 0.01 * xi * eta); + break; + + default: + xyz = libMesh::Point(); + break; + } + + fixture.nodes.push_back(libMesh::Node::build(xyz(0), xyz(1), xyz(2), i)); + fixture.elem->set_node(i, fixture.nodes.back().get()); + } + + return fixture; +} + +inline element_fixture +build_permuted_reference_fixture(libMesh::ElemType elem_type, + unsigned int perm_num) +{ + element_fixture fixture = build_reference_fixture(elem_type); + fixture.elem->permute(perm_num); + return fixture; +} + +inline map_helper_context +build_map_helper_context(const element_fixture & fixture, + libMesh::ElemType topo, + const char * label_prefix) +{ + map_helper_context context; + + const unsigned int dim = fixture.elem->dim(); + const unsigned int n_nodes = fixture.elem->n_nodes(); + const libMesh::FEType fe_type(fixture.elem->default_order(), + libMesh::FEMap::map_fe_type(*fixture.elem)); + auto fe = libMesh::FEBase::build(dim, fe_type); + + libMesh::QGauss qr(dim, libMesh::FOURTH); + qr.allow_rules_with_negative_weights = true; + qr.init(topo); + + fe->attach_quadrature_rule(&qr); + fe->get_xyz(); + fe->get_dxyzdxi(); + if (dim >= 2) + fe->get_dxyzdeta(); + if (dim >= 3) + fe->get_dxyzdzeta(); + fe->get_JxW(); + fe->reinit(fixture.elem.get()); + + const unsigned int nqp = qr.n_points(); + const auto & xyz = fe->get_xyz(); + const auto & dxyzdxi = fe->get_dxyzdxi(); + const auto & jxw = fe->get_JxW(); + + context.ref_values.resize(13 * nqp); + std::vector xi_h(nqp), eta_h(nqp), zeta_h(nqp), w_h(nqp); + for (unsigned int q = 0; q < nqp; ++q) + { + libMesh::RealGradient dxyzdeta(0.0); + libMesh::RealGradient dxyzdzeta(0.0); + if (dim >= 2) + dxyzdeta = fe->get_dxyzdeta()[q]; + if (dim >= 3) + dxyzdzeta = fe->get_dxyzdzeta()[q]; + + const unsigned int base = 13 * q; + context.ref_values[base + 0] = xyz[q](0); + context.ref_values[base + 1] = xyz[q](1); + context.ref_values[base + 2] = xyz[q](2); + context.ref_values[base + 3] = dxyzdxi[q](0); + context.ref_values[base + 4] = dxyzdxi[q](1); + context.ref_values[base + 5] = dxyzdxi[q](2); + context.ref_values[base + 6] = dxyzdeta(0); + context.ref_values[base + 7] = dxyzdeta(1); + context.ref_values[base + 8] = dxyzdeta(2); + context.ref_values[base + 9] = dxyzdzeta(0); + context.ref_values[base + 10] = dxyzdzeta(1); + context.ref_values[base + 11] = dxyzdzeta(2); + context.ref_values[base + 12] = jxw[q]; + + xi_h[q] = qr.qp(q)(0); + eta_h[q] = (dim >= 2) ? qr.qp(q)(1) : libMesh::Real(0); + zeta_h[q] = (dim >= 3) ? qr.qp(q)(2) : libMesh::Real(0); + w_h[q] = qr.w(q); + } + + context.d_coords = upload_point_coordinates(*fixture.elem, make_label(label_prefix, "_coords").c_str()); + context.d_xi = upload_real(xi_h, make_label(label_prefix, "_xi").c_str()); + context.d_eta = upload_real(eta_h, make_label(label_prefix, "_eta").c_str()); + context.d_zeta = upload_real(zeta_h, make_label(label_prefix, "_zeta").c_str()); + context.d_w = upload_real(w_h, make_label(label_prefix, "_w").c_str()); + context.nqp = nqp; + context.dim = dim; + context.n_nodes = n_nodes; + + return context; +} + +template +inline int +evaluate_map_helper_context(const map_helper_context & context, + const char * result_label, + double tol = 1.0e-13) +{ + constexpr unsigned int max_nodes = 27; + + Kokkos::View d_results(std::string(result_label), context.ref_values.size()); + const auto d_coords = context.d_coords; + const auto d_xi = context.d_xi; + const auto d_eta = context.d_eta; + const auto d_zeta = context.d_zeta; + const auto d_w = context.d_w; + const unsigned int dim_ = context.dim; + const unsigned int n_nodes_ = context.n_nodes; + + Kokkos::parallel_for( + context.nqp, + KOKKOS_LAMBDA(int q) { + libMesh::Kokkos::RealVector nodes[max_nodes]; + for (unsigned int i = 0; i < n_nodes_; ++i) + nodes[i] = libMesh::Kokkos::make_vector( + d_coords(3 * i + 0), d_coords(3 * i + 1), d_coords(3 * i + 2)); + + libMesh::Kokkos::RealVector xyz; + libMesh::Kokkos::RealTensor J; + libMesh::Kokkos::physical_point_and_jacobian( + nodes, n_nodes_, d_xi(q), d_eta(q), d_zeta(q), xyz, J); + + const libMesh::Real jxw_q = libMesh::Kokkos::volume_jxw(J, dim_, d_w(q)); + const unsigned int base = 13 * static_cast(q); + + d_results(base + 0) = vector_component(xyz, 0); + d_results(base + 1) = vector_component(xyz, 1); + d_results(base + 2) = vector_component(xyz, 2); + d_results(base + 3) = tensor_component(J, 0, 0); + d_results(base + 4) = tensor_component(J, 0, 1); + d_results(base + 5) = tensor_component(J, 0, 2); + d_results(base + 6) = tensor_component(J, 1, 0); + d_results(base + 7) = tensor_component(J, 1, 1); + d_results(base + 8) = tensor_component(J, 1, 2); + d_results(base + 9) = tensor_component(J, 2, 0); + d_results(base + 10) = tensor_component(J, 2, 1); + d_results(base + 11) = tensor_component(J, 2, 2); + d_results(base + 12) = jxw_q; + }); + Kokkos::fence(); + + return compare_device_values(d_results, context.ref_values, tol); +} + +inline face_helper_context +build_face_helper_context(const element_fixture & fixture, + const libMesh::Elem & side, + unsigned int side_id, + const char * label_prefix) +{ + face_helper_context context; + const unsigned int parent_dim = fixture.elem->dim(); + const libMesh::FEType fe_type(fixture.elem->default_order(), + libMesh::FEMap::map_fe_type(*fixture.elem)); + const unsigned int side_dim = side.dim(); + auto side_fe = libMesh::FEBase::build(parent_dim, fe_type); + + libMesh::QGauss qr(parent_dim - 1, libMesh::FOURTH); + qr.allow_rules_with_negative_weights = true; + qr.init(side.type()); + + side_fe->attach_quadrature_rule(&qr); + side_fe->get_JxW(); + side_fe->get_normals(); + side_fe->get_dxyzdxi(); + if (parent_dim >= 3) + side_fe->get_dxyzdeta(); + side_fe->reinit(fixture.elem.get(), side_id); + + const unsigned int nqp = qr.n_points(); + const unsigned int n_parent_nodes = fixture.elem->n_nodes(); + const unsigned int n_face_nodes = side.n_nodes(); + + std::vector side_ref_points(nqp); + for (unsigned int q = 0; q < nqp; ++q) + side_ref_points[q] = qr.qp(q); + + std::vector parent_ref_points; + if (parent_dim == 2) + { + auto side_map_fe = libMesh::FEBase::build(parent_dim, fe_type); + side_map_fe->get_xyz(); + side_map_fe->side_map(fixture.elem.get(), &side, side_id, side_ref_points, parent_ref_points); + } + + context.ref_values.resize(13 * nqp); + std::vector xi_h(nqp), eta_h(nqp), zeta_h(nqp), w_h(nqp); + std::vector parent_xi_h(nqp, 0.0), parent_eta_h(nqp, 0.0), parent_zeta_h(nqp, 0.0); + for (unsigned int q = 0; q < nqp; ++q) + { + const libMesh::Point row0 = libMesh::FEMap::map_deriv(side_dim, &side, 0, side_ref_points[q]); + libMesh::Point row1(0.0); + if (side_dim >= 2) + row1 = libMesh::FEMap::map_deriv(side_dim, &side, 1, side_ref_points[q]); + const auto & normal = side_fe->get_normals()[q]; + const unsigned int base = 13 * q; + + context.ref_values[base + 0] = row0(0); + context.ref_values[base + 1] = row0(1); + context.ref_values[base + 2] = row0(2); + context.ref_values[base + 3] = row1(0); + context.ref_values[base + 4] = row1(1); + context.ref_values[base + 5] = row1(2); + context.ref_values[base + 6] = 0.0; + context.ref_values[base + 7] = 0.0; + context.ref_values[base + 8] = 0.0; + context.ref_values[base + 9] = side_fe->get_JxW()[q]; + context.ref_values[base + 10] = normal(0); + context.ref_values[base + 11] = normal(1); + context.ref_values[base + 12] = normal(2); + + xi_h[q] = qr.qp(q)(0); + eta_h[q] = (parent_dim >= 3) ? qr.qp(q)(1) : libMesh::Real(0); + zeta_h[q] = 0.0; + w_h[q] = qr.w(q); + + if (parent_dim == 2) + { + parent_xi_h[q] = parent_ref_points[q](0); + parent_eta_h[q] = parent_ref_points[q](1); + parent_zeta_h[q] = parent_ref_points[q](2); + } + } + + context.d_face_coords = upload_point_coordinates(side, make_label(label_prefix, "_coords").c_str()); + context.d_parent_coords = upload_point_coordinates(*fixture.elem, make_label(label_prefix, "_parent_coords").c_str()); + context.d_xi = upload_real(xi_h, make_label(label_prefix, "_xi").c_str()); + context.d_eta = upload_real(eta_h, make_label(label_prefix, "_eta").c_str()); + context.d_zeta = upload_real(zeta_h, make_label(label_prefix, "_zeta").c_str()); + context.d_w = upload_real(w_h, make_label(label_prefix, "_w").c_str()); + context.d_parent_xi = upload_real(parent_xi_h, make_label(label_prefix, "_parent_xi").c_str()); + context.d_parent_eta = upload_real(parent_eta_h, make_label(label_prefix, "_parent_eta").c_str()); + context.d_parent_zeta = upload_real(parent_zeta_h, make_label(label_prefix, "_parent_zeta").c_str()); + context.nqp = nqp; + context.parent_dim = parent_dim; + context.n_parent_nodes = n_parent_nodes; + context.n_face_nodes = n_face_nodes; + + return context; +} + +template +inline int +evaluate_face_helper_context_2d(const face_helper_context & context, + const char * result_label, + double tol = 1.0e-13) +{ + constexpr unsigned int max_face_nodes = 9; + constexpr unsigned int max_parent_nodes = 27; + + Kokkos::View d_results(std::string(result_label), context.ref_values.size()); + const auto d_face_coords = context.d_face_coords; + const auto d_parent_coords = context.d_parent_coords; + const auto d_xi = context.d_xi; + const auto d_eta = context.d_eta; + const auto d_zeta = context.d_zeta; + const auto d_w = context.d_w; + const auto d_parent_xi = context.d_parent_xi; + const auto d_parent_eta = context.d_parent_eta; + const auto d_parent_zeta = context.d_parent_zeta; + const unsigned int n_parent_nodes_ = context.n_parent_nodes; + const unsigned int n_face_nodes_ = context.n_face_nodes; + + Kokkos::parallel_for( + context.nqp, + KOKKOS_LAMBDA(int q) { + libMesh::Kokkos::RealVector face_nodes[max_face_nodes]; + libMesh::Kokkos::RealVector parent_nodes[max_parent_nodes]; + for (unsigned int i = 0; i < n_face_nodes_; ++i) + face_nodes[i] = libMesh::Kokkos::make_vector( + d_face_coords(3 * i + 0), d_face_coords(3 * i + 1), d_face_coords(3 * i + 2)); + for (unsigned int i = 0; i < n_parent_nodes_; ++i) + parent_nodes[i] = libMesh::Kokkos::make_vector( + d_parent_coords(3 * i + 0), d_parent_coords(3 * i + 1), d_parent_coords(3 * i + 2)); + + const libMesh::Kokkos::RealTensor J = libMesh::Kokkos::face_jacobian( + face_nodes, n_face_nodes_, d_xi(q), d_eta(q), d_zeta(q)); + const libMesh::Kokkos::RealTensor parent_J = libMesh::Kokkos::jacobian( + parent_nodes, n_parent_nodes_, d_parent_xi(q), d_parent_eta(q), d_parent_zeta(q)); + const libMesh::Real jxw_q = libMesh::Kokkos::face_jxw(J, /*parent_dim=*/2u, d_w(q)); + const libMesh::Kokkos::RealVector normal_q = libMesh::Kokkos::edge_normal_on_parent_surface(J, parent_J); + const unsigned int base = 13 * static_cast(q); + + d_results(base + 0) = tensor_component(J, 0, 0); + d_results(base + 1) = tensor_component(J, 0, 1); + d_results(base + 2) = tensor_component(J, 0, 2); + d_results(base + 3) = tensor_component(J, 1, 0); + d_results(base + 4) = tensor_component(J, 1, 1); + d_results(base + 5) = tensor_component(J, 1, 2); + d_results(base + 6) = tensor_component(J, 2, 0); + d_results(base + 7) = tensor_component(J, 2, 1); + d_results(base + 8) = tensor_component(J, 2, 2); + d_results(base + 9) = jxw_q; + d_results(base + 10) = vector_component(normal_q, 0); + d_results(base + 11) = vector_component(normal_q, 1); + d_results(base + 12) = vector_component(normal_q, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_results, context.ref_values, tol); +} + +template +inline int +evaluate_face_helper_context_3d(const face_helper_context & context, + const char * result_label, + double tol = 1.0e-13) +{ + constexpr unsigned int max_face_nodes = 9; + + Kokkos::View d_results(std::string(result_label), context.ref_values.size()); + const auto d_face_coords = context.d_face_coords; + const auto d_xi = context.d_xi; + const auto d_eta = context.d_eta; + const auto d_zeta = context.d_zeta; + const auto d_w = context.d_w; + const unsigned int n_face_nodes_ = context.n_face_nodes; + + Kokkos::parallel_for( + context.nqp, + KOKKOS_LAMBDA(int q) { + libMesh::Kokkos::RealVector face_nodes[max_face_nodes]; + for (unsigned int i = 0; i < n_face_nodes_; ++i) + face_nodes[i] = libMesh::Kokkos::make_vector( + d_face_coords(3 * i + 0), d_face_coords(3 * i + 1), d_face_coords(3 * i + 2)); + + const libMesh::Kokkos::RealTensor J = libMesh::Kokkos::face_jacobian( + face_nodes, n_face_nodes_, d_xi(q), d_eta(q), d_zeta(q)); + const libMesh::Real jxw_q = libMesh::Kokkos::face_jxw(J, /*parent_dim=*/3u, d_w(q)); + const libMesh::Kokkos::RealVector normal_q = libMesh::Kokkos::face_normal(J, /*parent_dim=*/3u); + const unsigned int base = 13 * static_cast(q); + + d_results(base + 0) = tensor_component(J, 0, 0); + d_results(base + 1) = tensor_component(J, 0, 1); + d_results(base + 2) = tensor_component(J, 0, 2); + d_results(base + 3) = tensor_component(J, 1, 0); + d_results(base + 4) = tensor_component(J, 1, 1); + d_results(base + 5) = tensor_component(J, 1, 2); + d_results(base + 6) = tensor_component(J, 2, 0); + d_results(base + 7) = tensor_component(J, 2, 1); + d_results(base + 8) = tensor_component(J, 2, 2); + d_results(base + 9) = jxw_q; + d_results(base + 10) = vector_component(normal_q, 0); + d_results(base + 11) = vector_component(normal_q, 1); + d_results(base + 12) = vector_component(normal_q, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_results, context.ref_values, tol); +} + +} // namespace kokkos_test_utils + +#endif diff --git a/tests/fe/kokkos_fe_permuted_map_oracle_test.K b/tests/fe/kokkos_fe_permuted_map_oracle_test.K new file mode 100644 index 00000000000..d988bc9543e --- /dev/null +++ b/tests/fe/kokkos_fe_permuted_map_oracle_test.K @@ -0,0 +1,512 @@ +// GPU kernel tests for permuted libMesh::Kokkos map helpers. +// +// Standalone executable (no CppUnit). Uses libMesh::LibMeshInit so that +// FEMap, FEBase, and FEBase::side_map are available for oracle values. +// +// The test suite covers: +// A. physical_point_and_jacobian() and volume_jxw() against libMesh FEBase +// for every non-identity element permutation of the implemented +// LAGRANGE map topologies. +// B. face_jacobian(), face_jxw(), face_normal(), and +// edge_normal_on_parent_surface() against libMesh FE oracles for every +// non-identity parent permutation of the supported 2D and 3D parent +// topologies, including mixed-face prism and pyramid parents. +// C. map_face_qp_to_parent() against libMesh FEBase::side_map() for every +// non-identity permutation of those same parent topologies. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/fe_map.h" +#include "libmesh/libmesh.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include +#include + +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_face_helper_context; +using kokkos_test_utils::build_map_helper_context; +using kokkos_test_utils::build_permuted_reference_fixture; +using kokkos_test_utils::build_reference_elem; +using kokkos_test_utils::dispatch_supported_lagrange_face_map_topology; +using kokkos_test_utils::dispatch_supported_lagrange_map_topology; +using kokkos_test_utils::element_fixture; +using kokkos_test_utils::evaluate_face_helper_context_2d; +using kokkos_test_utils::evaluate_face_helper_context_3d; +using kokkos_test_utils::evaluate_map_helper_context; +using kokkos_test_utils::face_helper_context; +using kokkos_test_utils::is_supported_lagrange_face_map_topology; +using kokkos_test_utils::vector_component; + +static constexpr double tol = 1.0e-13; + +namespace +{ + +struct map_helper_case +{ + libMesh::ElemType topo; + const char * name; +}; + +struct face_parent_case +{ + libMesh::ElemType topo; + const char * name; +}; + +static const map_helper_case map_cases[] = { + { libMesh::TRI3, "TRI3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD4, "QUAD4" }, + { libMesh::QUAD8, "QUAD8" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET4, "TET4" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX8, "HEX8" }, + { libMesh::HEX20, "HEX20" }, + { libMesh::HEX27, "HEX27" } +}; + +static const face_parent_case face_cases[] = { + { libMesh::TRI3, "TRI3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD4, "QUAD4" }, + { libMesh::QUAD8, "QUAD8" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET4, "TET4" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX8, "HEX8" }, + { libMesh::HEX20, "HEX20" }, + { libMesh::HEX27, "HEX27" }, + { libMesh::PRISM6, "PRISM6" }, + { libMesh::PRISM15, "PRISM15" }, + { libMesh::PRISM18, "PRISM18" }, + { libMesh::PYRAMID5, "PYRAMID5" }, + { libMesh::PYRAMID13, "PYRAMID13" }, + { libMesh::PYRAMID14, "PYRAMID14" } +}; + +} // anonymous namespace + +template +static int +test_permuted_map_case_impl(const map_helper_case & info, unsigned int perm_num) +{ + auto fixture = build_permuted_reference_fixture(Topo, perm_num); + const auto context = build_map_helper_context(fixture, info.topo, "perm_map"); + const int fail = evaluate_map_helper_context(context, "perm_map_results", tol); + if (fail) + std::printf(" permuted map mismatch: topo=%s perm=%u (%d failures)\n", + info.name, perm_num, fail); + + return fail; +} + +struct permuted_map_dispatch +{ + permuted_map_dispatch(const map_helper_case & in_info, unsigned int in_perm_num) + : info(in_info), perm_num(in_perm_num) + { + } + + template + int operator()() const + { + return test_permuted_map_case_impl(info, perm_num); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported permuted map topology: topo=%s perm=%u type=%d\n", + info.name, + perm_num, + static_cast(topo)); + return 1; + } + + const map_helper_case & info; + unsigned int perm_num; +}; + +static int +test_permuted_map_case(const map_helper_case & info, unsigned int perm_num) +{ + const permuted_map_dispatch dispatch(info, perm_num); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +template +static int +test_permuted_face_helper_side_case_3d_impl(const face_helper_context & context, + unsigned int side_id, + const char * parent_name, + unsigned int perm_num, + libMesh::ElemType side_topo) +{ + const int fail = evaluate_face_helper_context_3d(context, "perm_face_results", tol); + if (fail) + std::printf(" permuted face mismatch: parent=%s perm=%u side_id=%u side_type=%d (%d failures)\n", + parent_name, + perm_num, + side_id, + static_cast(side_topo), + fail); + + return fail; +} + +template +static int +test_permuted_face_helper_side_case_2d_impl(const face_helper_context & context, + unsigned int side_id, + const char * parent_name, + unsigned int perm_num, + libMesh::ElemType side_topo) +{ + const int fail = + evaluate_face_helper_context_2d(context, "perm_face_results", tol); + if (fail) + std::printf(" permuted face mismatch: parent=%s perm=%u side_id=%u side_type=%d (%d failures)\n", + parent_name, + perm_num, + side_id, + static_cast(side_topo), + fail); + + return fail; +} + +struct permuted_face_side_dispatch_3d +{ + permuted_face_side_dispatch_3d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + unsigned int in_perm_num, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + perm_num(in_perm_num), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_permuted_face_helper_side_case_3d_impl( + context, side_id, parent_name, perm_num, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported permuted face-helper side: parent=%s perm=%u side_id=%u side_type=%d\n", + parent_name, + perm_num, + side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + unsigned int perm_num; + libMesh::ElemType side_topo; +}; + +template +struct permuted_face_side_dispatch_2d +{ + permuted_face_side_dispatch_2d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + unsigned int in_perm_num, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + perm_num(in_perm_num), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_permuted_face_helper_side_case_2d_impl( + context, side_id, parent_name, perm_num, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported permuted face-helper side: parent=%s perm=%u side_id=%u side_type=%d\n", + parent_name, + perm_num, + side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + unsigned int perm_num; + libMesh::ElemType side_topo; +}; + +struct permuted_face_parent_dispatch_2d +{ + permuted_face_parent_dispatch_2d(const face_helper_context & in_context, + unsigned int in_side_id, + const char * in_parent_name, + unsigned int in_perm_num, + libMesh::ElemType in_side_topo) + : context(in_context), + side_id(in_side_id), + parent_name(in_parent_name), + perm_num(in_perm_num), + side_topo(in_side_topo) + { + } + + template + int operator()() const + { + const permuted_face_side_dispatch_2d dispatch( + context, side_id, parent_name, perm_num, side_topo); + return dispatch_supported_lagrange_face_map_topology(side_topo, dispatch); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported permuted face-helper parent: parent=%s perm=%u side_id=%u parent_type=%d\n", + parent_name, + perm_num, + side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + unsigned int side_id; + const char * parent_name; + unsigned int perm_num; + libMesh::ElemType side_topo; +}; + +static int +test_permuted_face_helper_side_case(const element_fixture & fixture, + unsigned int side_id, + const char * parent_name, + unsigned int perm_num) +{ + auto side = fixture.elem->build_side_ptr(side_id); + const face_helper_context context = + build_face_helper_context(fixture, *side, side_id, "perm_face"); + + if (context.parent_dim == 3) + { + const permuted_face_side_dispatch_3d dispatch( + context, side_id, parent_name, perm_num, side->type()); + return dispatch_supported_lagrange_face_map_topology(side->type(), dispatch); + } + + if (context.parent_dim == 2) + { + const permuted_face_parent_dispatch_2d dispatch( + context, side_id, parent_name, perm_num, side->type()); + return dispatch_supported_lagrange_map_topology(fixture.elem->type(), dispatch); + } + + std::printf(" unexpected unsupported permuted face-helper parent dimension: parent=%s perm=%u side_id=%u dim=%u\n", + parent_name, + perm_num, + side_id, + context.parent_dim); + return 1; +} + +static RealVector +host_face_qp_to_parent_oracle(const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + RealVector face_qpt) +{ + const libMesh::FEType fe_type(parent.default_order(), libMesh::FEMap::map_fe_type(parent)); + auto fe = libMesh::FEBase::build(parent.dim(), fe_type); + fe->get_xyz(); + + std::vector ref_side_points(1); + ref_side_points[0] = libMesh::Point( + vector_component(face_qpt, 0), vector_component(face_qpt, 1), vector_component(face_qpt, 2)); + + std::vector ref_points; + fe->side_map(&parent, &side, side_id, ref_side_points, ref_points); + + return libMesh::Kokkos::make_vector(ref_points[0](0), ref_points[0](1), ref_points[0](2)); +} + +static int +check_permuted_face_qp_case(const char * parent_name, + const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + unsigned int perm_num, + RealVector face_qpt) +{ + using libMesh::Kokkos::map_face_qp_to_parent; + + const RealVector host = host_face_qp_to_parent_oracle(parent, side, side_id, face_qpt); + const RealVector kokkos = + map_face_qp_to_parent(side, libMesh::LAGRANGE_MAP, side.type(), face_qpt); + + int fail = 0; + for (unsigned int d = 0; d < 3; ++d) + if (std::fabs(vector_component(kokkos, d) - vector_component(host, d)) > tol) + ++fail; + + if (fail) + std::printf(" permuted face_qp mismatch: parent=%s perm=%u side_id=%u side_type=%d\n", + parent_name, + perm_num, + side_id, + static_cast(side.type())); + + return fail; +} + +static int +test_map_helpers_for_all_permutations() +{ + int fail = 0; + for (const auto & info : map_cases) + { + const auto elem = build_reference_elem(info.topo); + for (unsigned int perm = 1; perm < elem->n_permutations(); ++perm) + fail += test_permuted_map_case(info, perm); + } + return fail; +} + +static int +test_face_helpers_for_all_permutations() +{ + int fail = 0; + for (const auto & info : face_cases) + { + const auto elem = build_reference_elem(info.topo); + for (unsigned int perm = 1; perm < elem->n_permutations(); ++perm) + { + auto fixture = build_permuted_reference_fixture(info.topo, perm); + for (unsigned int side_id = 0; side_id < fixture.elem->n_sides(); ++side_id) + { + auto side = fixture.elem->build_side_ptr(side_id); + if (!is_supported_lagrange_face_map_topology(side->type())) + { + std::printf(" unexpected unsupported permuted face-helper side: parent=%s perm=%u side_id=%u side_type=%d\n", + info.name, + perm, + side_id, + static_cast(side->type())); + ++fail; + continue; + } + + fail += test_permuted_face_helper_side_case(fixture, side_id, info.name, perm); + } + } + } + return fail; +} + +static int +test_face_qp_to_parent_for_all_permutations() +{ + int fail = 0; + for (const auto & info : face_cases) + { + const auto elem = build_reference_elem(info.topo); + for (unsigned int perm = 1; perm < elem->n_permutations(); ++perm) + { + auto fixture = build_permuted_reference_fixture(info.topo, perm); + for (unsigned int side_id = 0; side_id < fixture.elem->n_sides(); ++side_id) + { + auto side = fixture.elem->build_side_ptr(side_id); + if (side->n_nodes() == 1) + { + fail += check_permuted_face_qp_case( + info.name, *fixture.elem, *side, side_id, perm, libMesh::Kokkos::zero_vector()); + continue; + } + + if (!is_supported_lagrange_face_map_topology(side->type())) + { + std::printf(" unexpected unsupported permuted face_qp side: parent=%s perm=%u side_id=%u side_type=%d\n", + info.name, + perm, + side_id, + static_cast(side->type())); + ++fail; + continue; + } + + libMesh::QGauss qr(side->dim(), libMesh::FOURTH); + qr.allow_rules_with_negative_weights = true; + qr.init(side->type()); + + for (unsigned int q = 0; q < qr.n_points(); ++q) + { + const RealVector face_qpt = libMesh::Kokkos::make_vector( + qr.qp(q)(0), + (side->dim() >= 2) ? qr.qp(q)(1) : Real(0), + (side->dim() >= 3) ? qr.qp(q)(2) : Real(0)); + fail += check_permuted_face_qp_case(info.name, *fixture.elem, *side, side_id, perm, face_qpt); + } + } + } + } + return fail; +} + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int fail = 0; + + const int map_fail = test_map_helpers_for_all_permutations(); + fail += map_fail; + std::printf("[permuted_map_helpers] %s (%d failures)\n", map_fail ? "FAIL" : "OK", map_fail); + + const int face_fail = test_face_helpers_for_all_permutations(); + fail += face_fail; + std::printf("[permuted_face_helpers] %s (%d failures)\n", face_fail ? "FAIL" : "OK", face_fail); + + const int face_qp_fail = test_face_qp_to_parent_for_all_permutations(); + fail += face_qp_fail; + std::printf("[permuted_face_qp] %s (%d failures)\n", face_qp_fail ? "FAIL" : "OK", face_qp_fail); + + Kokkos::finalize(); + return fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_reconstruction_oracle_test.K b/tests/fe/kokkos_fe_reconstruction_oracle_test.K new file mode 100644 index 00000000000..a00947f0ebf --- /dev/null +++ b/tests/fe/kokkos_fe_reconstruction_oracle_test.K @@ -0,0 +1,320 @@ +// GPU kernel tests for libMesh::Kokkos FE reconstruction on physical elements. +// +// Standalone executable (no CppUnit). Uses libMesh::LibMeshInit so that +// FEBase provides the host physical-space oracle values and gradients. +// +// The test suite covers: +// A. Reconstruction of solution values on distorted physical elements for +// every exact LAGRANGE key currently supported by the Kokkos evaluator. +// B. Reconstruction of physical-space gradients on the same elements by +// pulling reference-space gradients through the element Jacobian. +// C. The same value/gradient reconstruction parity for representative exact +// MONOMIAL keys across all supported dimensions and orders. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_fe_map.h" +#include "gpu/kokkos_fe_types.h" +#include "gpu/kokkos_scalar_types.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/libmesh.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include + +using libMesh::Kokkos::FEShapeKey; +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealTensor; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_flat_reference_fixture; +using kokkos_test_utils::compare_device_values; +using kokkos_test_utils::dispatch_supported_shape_key; +using kokkos_test_utils::dispatch_supported_shape_key_with_lagrange_map; +using kokkos_test_utils::element_fixture; +using kokkos_test_utils::grad_shape_for_key; +using kokkos_test_utils::shape_for_key; +using kokkos_test_utils::upload_point_coordinates; +using kokkos_test_utils::upload_real; +using kokkos_test_utils::vector_component; + +static constexpr double value_tol = 5.0e-13; +static constexpr double grad_tol = 5.0e-12; +static constexpr unsigned int quad_order = 4; + +namespace +{ + +struct reconstruction_case +{ + FEShapeKey key; + unsigned int dim; + unsigned int n_dofs; + const char * name; +}; + +constexpr unsigned int +monomial_n_dofs_for_dim(unsigned int dim, libMesh::Order order) +{ + const unsigned int p = static_cast(order); + + switch (dim) + { + case 1: + return p + 1; + case 2: + return (p + 1) * (p + 2) / 2; + case 3: + return (p + 1) * (p + 2) * (p + 3) / 6; + default: + return 0; + } +} + +static const reconstruction_case lagrange_cases[] = { + { { libMesh::LAGRANGE, libMesh::EDGE2, libMesh::FIRST }, 1, 2, "LAGRANGE/EDGE2/FIRST" }, + { { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::FIRST }, 1, 2, "LAGRANGE/EDGE3/FIRST" }, + { { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::SECOND }, 1, 3, "LAGRANGE/EDGE3/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::TRI3, libMesh::FIRST }, 2, 3, "LAGRANGE/TRI3/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::FIRST }, 2, 3, "LAGRANGE/TRI6/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::SECOND }, 2, 6, "LAGRANGE/TRI6/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::QUAD4, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::SECOND }, 2, 8, "LAGRANGE/QUAD8/SECOND" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD9/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::SECOND }, 2, 9, "LAGRANGE/QUAD9/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::TET4, libMesh::FIRST }, 3, 4, "LAGRANGE/TET4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::FIRST }, 3, 4, "LAGRANGE/TET10/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::SECOND }, 3, 10, "LAGRANGE/TET10/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::HEX8, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX20/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::SECOND }, 3, 20, "LAGRANGE/HEX20/SECOND" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX27/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::SECOND }, 3, 27, "LAGRANGE/HEX27/SECOND" } +}; + +static const reconstruction_case monomial_cases[] = { + { { libMesh::MONOMIAL, libMesh::EDGE2, libMesh::CONSTANT }, 1, monomial_n_dofs_for_dim(1, libMesh::CONSTANT), "MONOMIAL/EDGE2/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::EDGE2, libMesh::FIRST }, 1, monomial_n_dofs_for_dim(1, libMesh::FIRST), "MONOMIAL/EDGE2/FIRST" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::SECOND }, 1, monomial_n_dofs_for_dim(1, libMesh::SECOND), "MONOMIAL/EDGE3/SECOND" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::FOURTH }, 1, monomial_n_dofs_for_dim(1, libMesh::FOURTH), "MONOMIAL/EDGE3/FOURTH" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::FIFTH }, 1, monomial_n_dofs_for_dim(1, libMesh::FIFTH), "MONOMIAL/EDGE3/FIFTH" }, + + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::CONSTANT }, 2, monomial_n_dofs_for_dim(2, libMesh::CONSTANT), "MONOMIAL/TRI3/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/TRI3/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TRI6, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/TRI6/SECOND" }, + { { libMesh::MONOMIAL, libMesh::QUAD4, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/QUAD4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/QUAD9/SECOND" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::FIFTH }, 2, monomial_n_dofs_for_dim(2, libMesh::FIFTH), "MONOMIAL/QUAD9/FIFTH" }, + + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::CONSTANT }, 3, monomial_n_dofs_for_dim(3, libMesh::CONSTANT), "MONOMIAL/TET4/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/TET4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TET10, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/TET10/SECOND" }, + { { libMesh::MONOMIAL, libMesh::HEX8, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/HEX8/FIRST" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/HEX27/SECOND" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/HEX27/FIFTH" } +}; + +} // anonymous namespace + +static std::vector +build_coefficients(const reconstruction_case & info) +{ + std::vector coeffs(info.n_dofs); + const Real family_bias = (info.key.family == libMesh::MONOMIAL) ? Real(0.19) : Real(0.07); + const Real order_bias = Real(static_cast(info.key.order) + 1u) * Real(0.013); + + for (unsigned int i = 0; i < info.n_dofs; ++i) + { + const Real sign = (i % 2) ? Real(-1.0) : Real(1.0); + coeffs[i] = sign * (Real(0.17) + Real(0.041) * Real(i + 1u) + family_bias + order_bias); + } + + return coeffs; +} + +template +static int +test_reconstruction_case_impl(const reconstruction_case & info) +{ + constexpr unsigned int max_geom_nodes = 27; + + element_fixture fixture = build_flat_reference_fixture(ExactTopo); + const unsigned int n_geom_nodes = fixture.elem->n_nodes(); + + const libMesh::FEType fe_type(info.key.order, info.key.family); + auto fe = libMesh::FEBase::build(info.dim, fe_type); + + libMesh::QGauss qr(info.dim, static_cast(quad_order)); + qr.allow_rules_with_negative_weights = true; + qr.init(info.key.elem_type); + + fe->attach_quadrature_rule(&qr); + fe->get_phi(); + fe->get_dphi(); + fe->reinit(fixture.elem.get()); + + const auto & phi = fe->get_phi(); + const auto & dphi = fe->get_dphi(); + const unsigned int nqp = qr.n_points(); + + const std::vector coeffs = build_coefficients(info); + std::vector ref_u(nqp, 0.0); + std::vector ref_gx(nqp, 0.0); + std::vector ref_gy(nqp, 0.0); + std::vector ref_gz(nqp, 0.0); + std::vector xi_h(nqp), eta_h(nqp), zeta_h(nqp); + + for (unsigned int q = 0; q < nqp; ++q) + { + for (unsigned int i = 0; i < info.n_dofs; ++i) + { + ref_u[q] += phi[i][q] * coeffs[i]; + ref_gx[q] += dphi[i][q](0) * coeffs[i]; + ref_gy[q] += dphi[i][q](1) * coeffs[i]; + ref_gz[q] += dphi[i][q](2) * coeffs[i]; + } + + xi_h[q] = qr.qp(q)(0); + eta_h[q] = (info.dim >= 2) ? qr.qp(q)(1) : Real(0); + zeta_h[q] = (info.dim >= 3) ? qr.qp(q)(2) : Real(0); + } + + auto d_coords = upload_point_coordinates(*fixture.elem, "recon_coords"); + auto d_coeffs = upload_real(coeffs, "recon_coeffs"); + auto d_xi = upload_real(xi_h, "recon_xi"); + auto d_eta = upload_real(eta_h, "recon_eta"); + auto d_zeta = upload_real(zeta_h, "recon_zeta"); + + Kokkos::View d_u(std::string("recon_u"), nqp); + Kokkos::View d_gx(std::string("recon_gx"), nqp); + Kokkos::View d_gy(std::string("recon_gy"), nqp); + Kokkos::View d_gz(std::string("recon_gz"), nqp); + + const unsigned int dim = info.dim; + const unsigned int n_dofs = info.n_dofs; + const unsigned int n_geom_nodes_ = n_geom_nodes; + + Kokkos::parallel_for( + nqp, + KOKKOS_LAMBDA(int q) { + RealVector geom_nodes[max_geom_nodes]; + for (unsigned int i = 0; i < n_geom_nodes_; ++i) + geom_nodes[i] = libMesh::Kokkos::make_vector( + d_coords(3 * i + 0), d_coords(3 * i + 1), d_coords(3 * i + 2)); + + const RealTensor J = libMesh::Kokkos::jacobian( + geom_nodes, n_geom_nodes_, d_xi(q), d_eta(q), d_zeta(q)); + + Real u = 0.0; + RealVector grad_ref_sum = libMesh::Kokkos::zero_vector(); + for (unsigned int i = 0; i < n_dofs; ++i) + { + const Real coeff = d_coeffs(i); + u += coeff * shape_for_key(i, d_xi(q), d_eta(q), d_zeta(q)); + grad_ref_sum += + coeff * grad_shape_for_key(i, d_xi(q), d_eta(q), d_zeta(q)); + } + + const RealTensor invJ = libMesh::Kokkos::leading_inverse(J, dim); + const RealVector grad_phys = invJ * grad_ref_sum; + + d_u(q) = u; + d_gx(q) = vector_component(grad_phys, 0); + d_gy(q) = vector_component(grad_phys, 1); + d_gz(q) = vector_component(grad_phys, 2); + }); + Kokkos::fence(); + + int fail = 0; + fail += compare_device_values(d_u, ref_u, value_tol); + fail += compare_device_values(d_gx, ref_gx, grad_tol); + fail += compare_device_values(d_gy, ref_gy, grad_tol); + fail += compare_device_values(d_gz, ref_gz, grad_tol); + + if (fail) + std::printf(" reconstruction mismatch: %s (%d failures)\n", info.name, fail); + + return fail; +} + +struct reconstruction_dispatch +{ + explicit reconstruction_dispatch(const reconstruction_case & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_reconstruction_case_impl(info); + } + + int unsupported_key(FEShapeKey key) const + { + std::printf(" unexpected unsupported reconstruction key: %s family=%d elem_type=%d order=%d\n", + info.name, + static_cast(key.family), + static_cast(key.elem_type), + static_cast(key.order)); + return 1; + } + + const reconstruction_case & info; +}; + +static int +test_reconstruction_case(const reconstruction_case & info) +{ + const reconstruction_dispatch dispatch(info); + return dispatch_supported_shape_key_with_lagrange_map(info.key, dispatch); +} + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + for (const auto & info : lagrange_cases) + { + const int f = test_reconstruction_case(info); + std::printf("[reconstruction_lagrange] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + for (const auto & info : monomial_cases) + { + const int f = test_reconstruction_case(info); + std::printf("[reconstruction_monomial] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_shape_oracle_test.K b/tests/fe/kokkos_fe_shape_oracle_test.K new file mode 100644 index 00000000000..d98de26dce8 --- /dev/null +++ b/tests/fe/kokkos_fe_shape_oracle_test.K @@ -0,0 +1,629 @@ +// GPU kernel oracle tests for libMesh::Kokkos FE shape functions. +// The test suite covers: +// A. Geometry-map shape parity against the libMesh FE map oracle for the +// 12 implemented LAGRANGE map topologies. +// B. Geometry-map gradient parity against the libMesh FE map oracle for the +// same topologies. +// C. Physics FE parity for exact libMesh LAGRANGE keys that the Kokkos +// evaluator currently supports. +// D. Physics FE gradient parity for the same exact LAGRANGE keys. +// E. Physics FE parity for Kokkos-supported exact MONOMIAL keys. +// F. Physics FE gradient parity for the same exact MONOMIAL keys. +// +// Unsupported exact keys are expected to hard-abort in the Kokkos path and +// are therefore intentionally not invoked here. + +#include "libmesh/elem.h" +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_fe_types.h" +#include "gpu/kokkos_scalar_types.h" + +#include "libmesh/fe.h" +#include "libmesh/fe_interface.h" +#include "libmesh/fe_map.h" +#include "libmesh/libmesh.h" +#include "libmesh/quadrature_gauss.h" +#include "libmesh/enum_elem_type.h" +#include "libmesh/enum_order.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" +#include +#include +#include +#include + +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_qps; +using kokkos_test_utils::build_reference_elem; +using kokkos_test_utils::compare_device_values; +using kokkos_test_utils::dispatch_supported_lagrange_map_topology; +using kokkos_test_utils::dispatch_supported_shape_key; +using kokkos_test_utils::grad_shape_for_key; +using kokkos_test_utils::shape_for_key; +using kokkos_test_utils::upload_real; +using kokkos_test_utils::vector_component; + +static constexpr double tol = 1.0e-13; +static constexpr unsigned int quad_order = 4; + +namespace +{ + +struct map_elem_info +{ + libMesh::ElemType topo; + unsigned int dim; + unsigned int n_dofs; + const char * name; +}; + +struct physics_shape_info +{ + libMesh::Kokkos::FEShapeKey key; + unsigned int dim; + unsigned int n_dofs; + const char * name; +}; + +static const map_elem_info map_elems[] = { + { libMesh::EDGE2, 1, 2, "EDGE2" }, + { libMesh::EDGE3, 1, 3, "EDGE3" }, + { libMesh::TRI3, 2, 3, "TRI3" }, + { libMesh::TRI6, 2, 6, "TRI6" }, + { libMesh::QUAD4, 2, 4, "QUAD4" }, + { libMesh::QUAD8, 2, 8, "QUAD8" }, + { libMesh::QUAD9, 2, 9, "QUAD9" }, + { libMesh::TET4, 3, 4, "TET4" }, + { libMesh::TET10, 3, 10, "TET10" }, + { libMesh::HEX8, 3, 8, "HEX8" }, + { libMesh::HEX20, 3, 20, "HEX20" }, + { libMesh::HEX27, 3, 27, "HEX27" }, +}; +static constexpr unsigned int n_map_elems = sizeof(map_elems) / sizeof(map_elems[0]); + +constexpr unsigned int +monomial_n_dofs_for_dim(unsigned int dim, libMesh::Order order) +{ + const unsigned int p = static_cast(order); + + switch (dim) + { + case 1: + return p + 1; + case 2: + return (p + 1) * (p + 2) / 2; + case 3: + return (p + 1) * (p + 2) * (p + 3) / 6; + default: + return 0; + } +} + +// Only exact libMesh LAGRANGE keys whose evaluator topology is implemented in +// the current Kokkos path are included here. +static const physics_shape_info lagrange_physics_cases[] = { + { { libMesh::LAGRANGE, libMesh::EDGE2, libMesh::FIRST }, 1, 2, "EDGE2/FIRST" }, + { { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::FIRST }, 1, 2, "EDGE3/FIRST" }, + { { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::SECOND }, 1, 3, "EDGE3/SECOND" }, + { { libMesh::LAGRANGE, libMesh::EDGE4, libMesh::FIRST }, 1, 2, "EDGE4/FIRST" }, + + { { libMesh::LAGRANGE, libMesh::TRI3, libMesh::FIRST }, 2, 3, "TRI3/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::FIRST }, 2, 3, "TRI6/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::SECOND }, 2, 6, "TRI6/SECOND" }, + { { libMesh::LAGRANGE, libMesh::TRI7, libMesh::FIRST }, 2, 3, "TRI7/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI7, libMesh::SECOND }, 2, 6, "TRI7/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::QUAD4, libMesh::FIRST }, 2, 4, "QUAD4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::FIRST }, 2, 4, "QUAD8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::SECOND }, 2, 8, "QUAD8/SECOND" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::FIRST }, 2, 4, "QUAD9/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::SECOND }, 2, 9, "QUAD9/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::TET4, libMesh::FIRST }, 3, 4, "TET4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::FIRST }, 3, 4, "TET10/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::SECOND }, 3, 10, "TET10/SECOND" }, + { { libMesh::LAGRANGE, libMesh::TET14, libMesh::FIRST }, 3, 4, "TET14/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET14, libMesh::SECOND }, 3, 10, "TET14/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::HEX8, libMesh::FIRST }, 3, 8, "HEX8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::FIRST }, 3, 8, "HEX20/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::SECOND }, 3, 20, "HEX20/SECOND" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::FIRST }, 3, 8, "HEX27/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::SECOND }, 3, 27, "HEX27/SECOND" }, +}; +static constexpr unsigned int n_lagrange_physics_cases = + sizeof(lagrange_physics_cases) / sizeof(lagrange_physics_cases[0]); + +// These MONOMIAL cases cover all implemented MonomialImpl paths +// for orders 0..5, plus representative non-simplex exact keys. +static const physics_shape_info monomial_physics_cases[] = { + { { libMesh::MONOMIAL, libMesh::EDGE2, libMesh::CONSTANT }, 1, monomial_n_dofs_for_dim(1, libMesh::CONSTANT), "MONOMIAL/EDGE2/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::EDGE2, libMesh::FIRST }, 1, monomial_n_dofs_for_dim(1, libMesh::FIRST), "MONOMIAL/EDGE2/FIRST" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::SECOND }, 1, monomial_n_dofs_for_dim(1, libMesh::SECOND), "MONOMIAL/EDGE3/SECOND" }, + { { libMesh::MONOMIAL, libMesh::EDGE4, libMesh::THIRD }, 1, monomial_n_dofs_for_dim(1, libMesh::THIRD), "MONOMIAL/EDGE4/THIRD" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::FOURTH }, 1, monomial_n_dofs_for_dim(1, libMesh::FOURTH), "MONOMIAL/EDGE3/FOURTH" }, + { { libMesh::MONOMIAL, libMesh::EDGE3, libMesh::FIFTH }, 1, monomial_n_dofs_for_dim(1, libMesh::FIFTH), "MONOMIAL/EDGE3/FIFTH" }, + + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::CONSTANT }, 2, monomial_n_dofs_for_dim(2, libMesh::CONSTANT), "MONOMIAL/TRI3/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/TRI3/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TRI6, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/TRI6/SECOND" }, + { { libMesh::MONOMIAL, libMesh::TRI7, libMesh::THIRD }, 2, monomial_n_dofs_for_dim(2, libMesh::THIRD), "MONOMIAL/TRI7/THIRD" }, + { { libMesh::MONOMIAL, libMesh::TRI7, libMesh::FOURTH }, 2, monomial_n_dofs_for_dim(2, libMesh::FOURTH), "MONOMIAL/TRI7/FOURTH" }, + { { libMesh::MONOMIAL, libMesh::TRI7, libMesh::FIFTH }, 2, monomial_n_dofs_for_dim(2, libMesh::FIFTH), "MONOMIAL/TRI7/FIFTH" }, + { { libMesh::MONOMIAL, libMesh::QUAD4, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/QUAD4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/QUAD9/SECOND" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::FIFTH }, 2, monomial_n_dofs_for_dim(2, libMesh::FIFTH), "MONOMIAL/QUAD9/FIFTH" }, + + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::CONSTANT }, 3, monomial_n_dofs_for_dim(3, libMesh::CONSTANT), "MONOMIAL/TET4/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/TET4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TET10, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/TET10/SECOND" }, + { { libMesh::MONOMIAL, libMesh::TET14, libMesh::THIRD }, 3, monomial_n_dofs_for_dim(3, libMesh::THIRD), "MONOMIAL/TET14/THIRD" }, + { { libMesh::MONOMIAL, libMesh::TET14, libMesh::FOURTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FOURTH), "MONOMIAL/TET14/FOURTH" }, + { { libMesh::MONOMIAL, libMesh::TET14, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/TET14/FIFTH" }, + { { libMesh::MONOMIAL, libMesh::HEX8, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/HEX8/FIRST" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/HEX27/SECOND" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/HEX27/FIFTH" }, + { { libMesh::MONOMIAL, libMesh::PRISM6, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/PRISM6/FIRST" }, + { { libMesh::MONOMIAL, libMesh::PRISM21, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/PRISM21/FIFTH" }, + { { libMesh::MONOMIAL, libMesh::PYRAMID5, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/PYRAMID5/FIRST" }, + { { libMesh::MONOMIAL, libMesh::PYRAMID14, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/PYRAMID14/FIFTH" }, +}; +static constexpr unsigned int n_monomial_physics_cases = + sizeof(monomial_physics_cases) / sizeof(monomial_physics_cases[0]); + +} // anonymous namespace + +static Real +host_map_shape(const libMesh::Elem & elem, + const libMesh::FEType & fe_type, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + return libMesh::FEInterface::shape(fe_type, 0, &elem, i, libMesh::Point(xi, eta, zeta)); +} + +static RealVector +host_map_grad(const libMesh::Elem & elem, + const libMesh::FEType & fe_type, + unsigned int dim, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + const libMesh::Point p(xi, eta, zeta); + const Real gx = libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 0, p); + const Real gy = (dim >= 2) ? libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 1, p) + : Real(0); + const Real gz = (dim >= 3) ? libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 2, p) + : Real(0); + return libMesh::Kokkos::make_vector(gx, gy, gz); +} + +static Real +host_physics_shape(const libMesh::Elem & elem, + const libMesh::FEType & fe_type, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + return libMesh::FEInterface::shape(fe_type, 0, &elem, i, libMesh::Point(xi, eta, zeta)); +} + +static RealVector +host_physics_grad(const libMesh::Elem & elem, + const libMesh::FEType & fe_type, + unsigned int dim, + unsigned int i, + Real xi, + Real eta, + Real zeta) +{ + const libMesh::Point p(xi, eta, zeta); + const Real gx = libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 0, p); + const Real gy = (dim >= 2) ? libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 1, p) + : Real(0); + const Real gz = (dim >= 3) ? libMesh::FEInterface::shape_deriv(fe_type, 0, &elem, i, 2, p) + : Real(0); + return libMesh::Kokkos::make_vector(gx, gy, gz); +} + +// --------------------------------------------------------------------------- +// Test A: Geometry-map shape parity against libMesh FE map dispatch. +// --------------------------------------------------------------------------- +template +static int +test_map_shape_parity_impl(const map_elem_info & e) +{ + auto elem = build_reference_elem(Topo); + const libMesh::FEType fe_type(elem->default_order(), libMesh::FEMap::map_fe_type(*elem)); + + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(e.topo, e.dim, quad_order, xi_h, eta_h, zeta_h); + const unsigned int nd = e.n_dofs; + + std::vector ref_phi(nd * nqp); + for (unsigned int i = 0; i < nd; ++i) + for (unsigned int q = 0; q < nqp; ++q) + ref_phi[i * nqp + q] = + host_map_shape(*elem, fe_type, i, xi_h[q], eta_h[q], zeta_h[q]); + + auto d_xi = upload_real(xi_h, "xi"); + auto d_eta = upload_real(eta_h, "eta"); + auto d_zeta = upload_real(zeta_h, "zeta"); + + Kokkos::View d_phi(std::string("dev_phi"), nd * nqp); + + const unsigned int nd_ = nd; + const unsigned int nqp_ = nqp; + + Kokkos::parallel_for( + nd_ * nqp_, + KOKKOS_LAMBDA(int idx) { + const int i = idx / static_cast(nqp_); + const int q = idx % static_cast(nqp_); + d_phi(idx) = + libMesh::Kokkos::map_shape(static_cast(i), + d_xi(q), + d_eta(q), + d_zeta(q)); + }); + Kokkos::fence(); + + return compare_device_values(d_phi, ref_phi, tol); +} + +struct map_shape_dispatch +{ + explicit map_shape_dispatch(const map_elem_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_map_shape_parity_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported map-shape topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_elem_info & info; +}; + +static int +test_map_shape_parity(const map_elem_info & e) +{ + const map_shape_dispatch dispatch(e); + return dispatch_supported_lagrange_map_topology(e.topo, dispatch); +} + +// --------------------------------------------------------------------------- +// Test B: Geometry-map gradient parity against libMesh FE map dispatch. +// --------------------------------------------------------------------------- +template +static int +test_map_grad_parity_impl(const map_elem_info & e) +{ + auto elem = build_reference_elem(Topo); + const libMesh::FEType fe_type(elem->default_order(), libMesh::FEMap::map_fe_type(*elem)); + + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(e.topo, e.dim, quad_order, xi_h, eta_h, zeta_h); + const unsigned int nd = e.n_dofs; + const unsigned int dim = e.dim; + + std::vector ref_gx(nd * nqp); + std::vector ref_gy(nd * nqp); + std::vector ref_gz(nd * nqp); + for (unsigned int i = 0; i < nd; ++i) + for (unsigned int q = 0; q < nqp; ++q) + { + const RealVector g = host_map_grad(*elem, fe_type, dim, i, xi_h[q], eta_h[q], zeta_h[q]); + ref_gx[i * nqp + q] = vector_component(g, 0); + ref_gy[i * nqp + q] = vector_component(g, 1); + ref_gz[i * nqp + q] = vector_component(g, 2); + } + + auto d_xi = upload_real(xi_h, "xi"); + auto d_eta = upload_real(eta_h, "eta"); + auto d_zeta = upload_real(zeta_h, "zeta"); + + Kokkos::View d_gx(std::string("map_gx"), nd * nqp); + Kokkos::View d_gy(std::string("map_gy"), nd * nqp); + Kokkos::View d_gz(std::string("map_gz"), nd * nqp); + + const unsigned int nd_ = nd; + const unsigned int nqp_ = nqp; + + Kokkos::parallel_for( + nd_ * nqp_, + KOKKOS_LAMBDA(int idx) { + const int i = idx / static_cast(nqp_); + const int q = idx % static_cast(nqp_); + const RealVector g = + libMesh::Kokkos::grad_map_shape(static_cast(i), + d_xi(q), + d_eta(q), + d_zeta(q)); + d_gx(idx) = vector_component(g, 0); + d_gy(idx) = vector_component(g, 1); + d_gz(idx) = vector_component(g, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_gx, ref_gx, tol) + + compare_device_values(d_gy, ref_gy, tol) + + compare_device_values(d_gz, ref_gz, tol); +} + +struct map_grad_dispatch +{ + explicit map_grad_dispatch(const map_elem_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_map_grad_parity_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported map-grad topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_elem_info & info; +}; + +static int +test_map_grad_parity(const map_elem_info & e) +{ + const map_grad_dispatch dispatch(e); + return dispatch_supported_lagrange_map_topology(e.topo, dispatch); +} + +// --------------------------------------------------------------------------- +// Test C: Exact-key physics shape parity against libMesh CPU FE dispatch. +// --------------------------------------------------------------------------- +template +static int +test_shape_parity_impl(const physics_shape_info & info) +{ + auto elem = build_reference_elem(info.key.elem_type); + const libMesh::FEType fe_type(info.key.order, info.key.family); + + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(info.key.elem_type, info.dim, quad_order, xi_h, eta_h, zeta_h); + const unsigned int nd = info.n_dofs; + + std::vector ref_phi(nd * nqp); + for (unsigned int i = 0; i < nd; ++i) + for (unsigned int q = 0; q < nqp; ++q) + ref_phi[i * nqp + q] = + host_physics_shape(*elem, fe_type, i, xi_h[q], eta_h[q], zeta_h[q]); + + auto d_xi = upload_real(xi_h, "phys_xi"); + auto d_eta = upload_real(eta_h, "phys_eta"); + auto d_zeta = upload_real(zeta_h, "phys_zeta"); + + Kokkos::View d_phi(std::string("phys_phi"), nd * nqp); + + const unsigned int nqp_ = nqp; + const unsigned int nd_ = nd; + + Kokkos::parallel_for( + nd_ * nqp_, + KOKKOS_LAMBDA(int idx) { + const int i = idx / static_cast(nqp_); + const int q = idx % static_cast(nqp_); + d_phi(idx) = shape_for_key( + static_cast(i), d_xi(q), d_eta(q), d_zeta(q)); + }); + Kokkos::fence(); + + return compare_device_values(d_phi, ref_phi, tol); +} + +// --------------------------------------------------------------------------- +// Test D: Exact-key physics gradient parity against libMesh CPU FE dispatch. +// --------------------------------------------------------------------------- +template +static int +test_grad_shape_parity_impl(const physics_shape_info & info) +{ + auto elem = build_reference_elem(info.key.elem_type); + const libMesh::FEType fe_type(info.key.order, info.key.family); + + std::vector xi_h, eta_h, zeta_h; + const unsigned int nqp = build_qps(info.key.elem_type, info.dim, quad_order, xi_h, eta_h, zeta_h); + const unsigned int nd = info.n_dofs; + + std::vector ref_gx(nd * nqp); + std::vector ref_gy(nd * nqp); + std::vector ref_gz(nd * nqp); + for (unsigned int i = 0; i < nd; ++i) + for (unsigned int q = 0; q < nqp; ++q) + { + const RealVector g = + host_physics_grad(*elem, fe_type, info.dim, i, xi_h[q], eta_h[q], zeta_h[q]); + ref_gx[i * nqp + q] = vector_component(g, 0); + ref_gy[i * nqp + q] = vector_component(g, 1); + ref_gz[i * nqp + q] = vector_component(g, 2); + } + + auto d_xi = upload_real(xi_h, "grad_xi"); + auto d_eta = upload_real(eta_h, "grad_eta"); + auto d_zeta = upload_real(zeta_h, "grad_zeta"); + + Kokkos::View d_gx(std::string("phys_gx"), nd * nqp); + Kokkos::View d_gy(std::string("phys_gy"), nd * nqp); + Kokkos::View d_gz(std::string("phys_gz"), nd * nqp); + + const unsigned int nqp_ = nqp; + const unsigned int nd_ = nd; + + Kokkos::parallel_for( + nd_ * nqp_, + KOKKOS_LAMBDA(int idx) { + const int i = idx / static_cast(nqp_); + const int q = idx % static_cast(nqp_); + const RealVector g = grad_shape_for_key( + static_cast(i), d_xi(q), d_eta(q), d_zeta(q)); + d_gx(idx) = vector_component(g, 0); + d_gy(idx) = vector_component(g, 1); + d_gz(idx) = vector_component(g, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_gx, ref_gx, tol) + + compare_device_values(d_gy, ref_gy, tol) + + compare_device_values(d_gz, ref_gz, tol); +} + +struct shape_dispatch +{ + explicit shape_dispatch(const physics_shape_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_shape_parity_impl(info); + } + + int unsupported_key(libMesh::Kokkos::FEShapeKey key) const + { + std::printf(" unexpected unsupported shape key: %s family=%d elem_type=%d order=%d\n", + info.name, + static_cast(key.family), + static_cast(key.elem_type), + static_cast(key.order)); + return 1; + } + + const physics_shape_info & info; +}; + +struct grad_shape_dispatch +{ + explicit grad_shape_dispatch(const physics_shape_info & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_grad_shape_parity_impl(info); + } + + int unsupported_key(libMesh::Kokkos::FEShapeKey key) const + { + std::printf(" unexpected unsupported grad-shape key: %s family=%d elem_type=%d order=%d\n", + info.name, + static_cast(key.family), + static_cast(key.elem_type), + static_cast(key.order)); + return 1; + } + + const physics_shape_info & info; +}; + +static int +test_shape_parity(const physics_shape_info & info) +{ + const shape_dispatch dispatch(info); + return dispatch_supported_shape_key(info.key, dispatch); +} + +static int +test_grad_shape_parity(const physics_shape_info & info) +{ + const grad_shape_dispatch dispatch(info); + return dispatch_supported_shape_key(info.key, dispatch); +} + +// --------------------------------------------------------------------------- +// main +// --------------------------------------------------------------------------- +int main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + for (unsigned int e = 0; e < n_map_elems; ++e) + { + const map_elem_info & info = map_elems[e]; + + { + const int f = test_map_shape_parity(info); + std::printf("[map_shape_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_map_grad_parity(info); + std::printf("[map_grad_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + for (unsigned int c = 0; c < n_lagrange_physics_cases; ++c) + { + const physics_shape_info & info = lagrange_physics_cases[c]; + + { + const int f = test_shape_parity(info); + std::printf("[shape_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_grad_shape_parity(info); + std::printf("[grad_shape_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + for (unsigned int c = 0; c < n_monomial_physics_cases; ++c) + { + const physics_shape_info & info = monomial_physics_cases[c]; + + { + const int f = test_shape_parity(info); + std::printf("[shape_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_grad_shape_parity(info); + std::printf("[grad_shape_parity ][%s] %s (%d)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + Kokkos::finalize(); + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_side_trace_oracle_test.K b/tests/fe/kokkos_fe_side_trace_oracle_test.K new file mode 100644 index 00000000000..802545ccf31 --- /dev/null +++ b/tests/fe/kokkos_fe_side_trace_oracle_test.K @@ -0,0 +1,342 @@ +// GPU kernel tests for libMesh::Kokkos side-trace FE parity. +// +// Standalone executable (no CppUnit). Uses libMesh::LibMeshInit so that +// FEBase side reinit provides host side-trace oracle values. +// +// The test suite covers: +// A. Side-restricted shape values for supported exact LAGRANGE keys on +// distorted physical elements. +// B. Tangential physical gradients on those same sides, using host FEBase +// side traces as the oracle. +// C. The same side value and tangential-gradient parity for representative +// exact MONOMIAL keys whose parent geometry topology is supported by the +// current Kokkos map implementation. +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "gpu/kokkos_fe_evaluator.h" +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" +#include "gpu/kokkos_fe_types.h" +#include "gpu/kokkos_scalar_types.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/libmesh.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include + +using libMesh::Kokkos::FEShapeKey; +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealTensor; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_flat_reference_fixture; +using kokkos_test_utils::compare_device_values; +using kokkos_test_utils::dispatch_supported_shape_key; +using kokkos_test_utils::dispatch_supported_shape_key_with_lagrange_map; +using kokkos_test_utils::grad_shape_for_key; +using kokkos_test_utils::shape_for_key; +using kokkos_test_utils::upload_point_coordinates; +using kokkos_test_utils::upload_real; +using kokkos_test_utils::vector_component; + +static constexpr double value_tol = 5.0e-13; +static constexpr double grad_tol = 5.0e-12; + +namespace +{ + +struct side_trace_case +{ + FEShapeKey key; + unsigned int dim; + unsigned int n_dofs; + const char * name; +}; + +constexpr unsigned int +monomial_n_dofs_for_dim(unsigned int dim, libMesh::Order order) +{ + const unsigned int p = static_cast(order); + + switch (dim) + { + case 1: + return p + 1; + case 2: + return (p + 1) * (p + 2) / 2; + case 3: + return (p + 1) * (p + 2) * (p + 3) / 6; + default: + return 0; + } +} + +// Restrict to parent geometries currently handled by the Kokkos map path. +static const side_trace_case lagrange_cases[] = { + { { libMesh::LAGRANGE, libMesh::TRI3, libMesh::FIRST }, 2, 3, "LAGRANGE/TRI3/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::FIRST }, 2, 3, "LAGRANGE/TRI6/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TRI6, libMesh::SECOND }, 2, 6, "LAGRANGE/TRI6/SECOND" }, + { { libMesh::LAGRANGE, libMesh::QUAD4, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::SECOND }, 2, 8, "LAGRANGE/QUAD8/SECOND" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::FIRST }, 2, 4, "LAGRANGE/QUAD9/FIRST" }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::SECOND }, 2, 9, "LAGRANGE/QUAD9/SECOND" }, + + { { libMesh::LAGRANGE, libMesh::TET4, libMesh::FIRST }, 3, 4, "LAGRANGE/TET4/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::FIRST }, 3, 4, "LAGRANGE/TET10/FIRST" }, + { { libMesh::LAGRANGE, libMesh::TET10, libMesh::SECOND }, 3, 10, "LAGRANGE/TET10/SECOND" }, + { { libMesh::LAGRANGE, libMesh::HEX8, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX8/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX20/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX20, libMesh::SECOND }, 3, 20, "LAGRANGE/HEX20/SECOND" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::FIRST }, 3, 8, "LAGRANGE/HEX27/FIRST" }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::SECOND }, 3, 27, "LAGRANGE/HEX27/SECOND" } +}; + +static const side_trace_case monomial_cases[] = { + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::CONSTANT }, 2, monomial_n_dofs_for_dim(2, libMesh::CONSTANT), "MONOMIAL/TRI3/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TRI3, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/TRI3/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TRI6, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/TRI6/SECOND" }, + { { libMesh::MONOMIAL, libMesh::QUAD4, libMesh::FIRST }, 2, monomial_n_dofs_for_dim(2, libMesh::FIRST), "MONOMIAL/QUAD4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::SECOND }, 2, monomial_n_dofs_for_dim(2, libMesh::SECOND), "MONOMIAL/QUAD9/SECOND" }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::FIFTH }, 2, monomial_n_dofs_for_dim(2, libMesh::FIFTH), "MONOMIAL/QUAD9/FIFTH" }, + + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::CONSTANT }, 3, monomial_n_dofs_for_dim(3, libMesh::CONSTANT), "MONOMIAL/TET4/CONSTANT" }, + { { libMesh::MONOMIAL, libMesh::TET4, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/TET4/FIRST" }, + { { libMesh::MONOMIAL, libMesh::TET10, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/TET10/SECOND" }, + { { libMesh::MONOMIAL, libMesh::HEX8, libMesh::FIRST }, 3, monomial_n_dofs_for_dim(3, libMesh::FIRST), "MONOMIAL/HEX8/FIRST" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::SECOND }, 3, monomial_n_dofs_for_dim(3, libMesh::SECOND), "MONOMIAL/HEX27/SECOND" }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::FIFTH }, 3, monomial_n_dofs_for_dim(3, libMesh::FIFTH), "MONOMIAL/HEX27/FIFTH" } +}; + +} // anonymous namespace + +LIBMESH_DEVICE_INLINE RealVector +tangential_component(const RealVector & v, const RealVector & normal) +{ + return v - ((v * normal) * normal); +} + +template +static int +test_side_trace_case_impl(const side_trace_case & info) +{ + constexpr unsigned int max_geom_nodes = 27; + + auto fixture = build_flat_reference_fixture(ExactTopo); + const unsigned int n_geom_nodes = fixture.elem->n_nodes(); + const unsigned int parent_dim = fixture.elem->dim(); + + const libMesh::FEType fe_type(info.key.order, info.key.family); + auto side_fe = libMesh::FEBase::build(parent_dim, fe_type); + + int fail = 0; + + for (unsigned int side_id = 0; side_id < fixture.elem->n_sides(); ++side_id) + { + auto side = fixture.elem->build_side_ptr(side_id); + + libMesh::QGauss qr(parent_dim - 1, libMesh::FOURTH); + qr.allow_rules_with_negative_weights = true; + qr.init(side->type()); + + side_fe->attach_quadrature_rule(&qr); + side_fe->get_phi(); + side_fe->get_dphi(); + side_fe->get_normals(); + side_fe->reinit(fixture.elem.get(), side_id); + + const auto & phi = side_fe->get_phi(); + const auto & dphi = side_fe->get_dphi(); + const auto & normals = side_fe->get_normals(); + + if (phi.size() != info.n_dofs || dphi.size() != info.n_dofs) + { + std::printf(" unexpected host side FE size: %s side_id=%u phi=%llu dphi=%llu expected=%u\n", + info.name, + side_id, + libMesh::cast_int(phi.size()), + libMesh::cast_int(dphi.size()), + info.n_dofs); + fail += 1; + continue; + } + + const unsigned int nqp = qr.n_points(); + std::vector ref_phi(info.n_dofs * nqp); + std::vector ref_tgx(info.n_dofs * nqp); + std::vector ref_tgy(info.n_dofs * nqp); + std::vector ref_tgz(info.n_dofs * nqp); + std::vector parent_xi_h(nqp), parent_eta_h(nqp), parent_zeta_h(nqp); + std::vector normal_x_h(nqp), normal_y_h(nqp), normal_z_h(nqp); + + for (unsigned int q = 0; q < nqp; ++q) + { + const RealVector face_qpt = libMesh::Kokkos::make_vector( + qr.qp(q)(0), + (side->dim() >= 2) ? qr.qp(q)(1) : Real(0), + (side->dim() >= 3) ? qr.qp(q)(2) : Real(0)); + const RealVector parent_qpt = + libMesh::Kokkos::map_face_qp_to_parent(*side, libMesh::LAGRANGE_MAP, side->type(), face_qpt); + + parent_xi_h[q] = vector_component(parent_qpt, 0); + parent_eta_h[q] = vector_component(parent_qpt, 1); + parent_zeta_h[q] = vector_component(parent_qpt, 2); + + const auto & n = normals[q]; + normal_x_h[q] = n(0); + normal_y_h[q] = n(1); + normal_z_h[q] = n(2); + + for (unsigned int i = 0; i < info.n_dofs; ++i) + { + const unsigned int idx = q * info.n_dofs + i; + const RealVector host_tg = tangential_component( + libMesh::Kokkos::make_vector(dphi[i][q](0), dphi[i][q](1), dphi[i][q](2)), + libMesh::Kokkos::make_vector(n(0), n(1), n(2))); + + ref_phi[idx] = phi[i][q]; + ref_tgx[idx] = vector_component(host_tg, 0); + ref_tgy[idx] = vector_component(host_tg, 1); + ref_tgz[idx] = vector_component(host_tg, 2); + } + } + + auto d_coords = upload_point_coordinates(*fixture.elem, "side_trace_coords"); + auto d_parent_xi = upload_real(parent_xi_h, "side_trace_parent_xi"); + auto d_parent_eta = upload_real(parent_eta_h, "side_trace_parent_eta"); + auto d_parent_zeta = upload_real(parent_zeta_h, "side_trace_parent_zeta"); + auto d_normal_x = upload_real(normal_x_h, "side_trace_normal_x"); + auto d_normal_y = upload_real(normal_y_h, "side_trace_normal_y"); + auto d_normal_z = upload_real(normal_z_h, "side_trace_normal_z"); + + Kokkos::View d_phi(std::string("side_trace_phi"), ref_phi.size()); + Kokkos::View d_tgx(std::string("side_trace_tgx"), ref_tgx.size()); + Kokkos::View d_tgy(std::string("side_trace_tgy"), ref_tgy.size()); + Kokkos::View d_tgz(std::string("side_trace_tgz"), ref_tgz.size()); + + const unsigned int n_dofs = info.n_dofs; + const unsigned int n_geom_nodes_ = n_geom_nodes; + + Kokkos::parallel_for( + static_cast(ref_phi.size()), + KOKKOS_LAMBDA(int idx) { + const unsigned int q = static_cast(idx) / n_dofs; + const unsigned int i = static_cast(idx) % n_dofs; + + RealVector geom_nodes[max_geom_nodes]; + for (unsigned int k = 0; k < n_geom_nodes_; ++k) + geom_nodes[k] = libMesh::Kokkos::make_vector( + d_coords(3 * k + 0), d_coords(3 * k + 1), d_coords(3 * k + 2)); + + const Real xi = d_parent_xi(q); + const Real eta = d_parent_eta(q); + const Real zeta = d_parent_zeta(q); + const RealTensor J = + libMesh::Kokkos::jacobian(geom_nodes, n_geom_nodes_, xi, eta, zeta); + const RealVector grad_ref = grad_shape_for_key(i, xi, eta, zeta); + const RealVector grad_phys = libMesh::Kokkos::leading_inverse(J, parent_dim) * grad_ref; + const RealVector normal = libMesh::Kokkos::make_vector(d_normal_x(q), d_normal_y(q), d_normal_z(q)); + const RealVector tangential_grad = tangential_component(grad_phys, normal); + + d_phi(idx) = shape_for_key(i, xi, eta, zeta); + d_tgx(idx) = vector_component(tangential_grad, 0); + d_tgy(idx) = vector_component(tangential_grad, 1); + d_tgz(idx) = vector_component(tangential_grad, 2); + }); + Kokkos::fence(); + + const int side_fail = + compare_device_values(d_phi, ref_phi, value_tol) + + compare_device_values(d_tgx, ref_tgx, grad_tol) + + compare_device_values(d_tgy, ref_tgy, grad_tol) + + compare_device_values(d_tgz, ref_tgz, grad_tol); + + if (side_fail) + std::printf(" side-trace mismatch: %s side_id=%u side_type=%d (%d failures)\n", + info.name, + side_id, + static_cast(side->type()), + side_fail); + + fail += side_fail; + } + + return fail; +} + +struct side_trace_dispatch +{ + explicit side_trace_dispatch(const side_trace_case & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_side_trace_case_impl(info); + } + + int unsupported_key(FEShapeKey key) const + { + std::printf(" unexpected unsupported side-trace key: %s family=%d elem_type=%d order=%d\n", + info.name, + static_cast(key.family), + static_cast(key.elem_type), + static_cast(key.order)); + return 1; + } + + const side_trace_case & info; +}; + +static int +test_side_trace_case(const side_trace_case & info) +{ + const side_trace_dispatch dispatch(info); + return dispatch_supported_shape_key_with_lagrange_map(info.key, dispatch); +} + +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + for (const auto & info : lagrange_cases) + { + const int f = test_side_trace_case(info); + std::printf("[side_trace_lagrange] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + for (const auto & info : monomial_cases) + { + const int f = test_side_trace_case(info); + std::printf("[side_trace_monomial] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_fe_types_oracle_test.K b/tests/fe/kokkos_fe_types_oracle_test.K new file mode 100644 index 00000000000..cc6b3cfd640 --- /dev/null +++ b/tests/fe/kokkos_fe_types_oracle_test.K @@ -0,0 +1,509 @@ +// GPU kernel oracle tests for libMesh::Kokkos FE type helpers. +// The test suite covers: +// A. get_side_topology() against libMesh side topology, with the 1D +// NODEELEM -> EDGE2 surrogate used by the Kokkos path. +// B. class_from_topology() against a class inferred from libMesh +// first-order LAGRANGE FE spaces. +// C. n_dofs(FEShapeKey) for Kokkos-supported exact LAGRANGE keys against +// libMesh::FEInterface::n_dofs(). +// D. n_dofs(FEShapeKey) for Kokkos-supported MONOMIAL keys against +// libMesh::FEInterface::n_dofs(). +// E. supports_shape()/supports_grad_shape()/supports_n_dofs() agree on the +// current Kokkos evaluator support boundary. +// +// Returns 0 on success, non-zero on failure. + +#include "gpu/kokkos_fe_types.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_interface.h" +#include "libmesh/fe_type.h" +#include "libmesh/libmesh.h" + +#include "libmesh/enum_elem_type.h" +#include "libmesh/enum_fe_family.h" +#include "libmesh/enum_order.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include + +using kokkos_test_utils::build_reference_elem; + +namespace +{ + +struct side_topology_case +{ + libMesh::ElemType parent; + libMesh::ElemType expected; +}; + +struct class_from_topology_case +{ + libMesh::ElemType topo; + libMesh::FEElemClass expected; +}; + +struct n_dof_case +{ + libMesh::Kokkos::FEShapeKey key; + unsigned int expected; +}; + +struct support_case +{ + libMesh::Kokkos::FEShapeKey key; + bool expected; +}; + +static libMesh::ElemType +host_side_topology_oracle(libMesh::ElemType parent_type) +{ + auto elem = build_reference_elem(parent_type); + + if (elem->dim() == 1) + return libMesh::EDGE2; + + auto first_side = elem->build_side_ptr(0); + const libMesh::ElemType side_topo = first_side->type(); + + for (unsigned int s = 1; s < elem->n_sides(); ++s) + { + auto side = elem->build_side_ptr(s); + if (side->type() != side_topo) + return libMesh::INVALID_ELEM; + } + + return side_topo; +} + +static libMesh::FEElemClass +host_class_from_topology_oracle(libMesh::ElemType topo) +{ + auto elem = build_reference_elem(topo); + + if (elem->dim() == 1) + return libMesh::FEElemClass::EDGE; + + const libMesh::FEType fe_type(libMesh::FIRST, libMesh::LAGRANGE); + const unsigned int ndofs = libMesh::FEInterface::n_dofs(fe_type, 0, elem.get()); + + switch (elem->dim()) + { + case 2: + switch (ndofs) + { + case 3: return libMesh::FEElemClass::TRI; + case 4: return libMesh::FEElemClass::QUAD; + default: return libMesh::FEElemClass::N_CLASSES; + } + + case 3: + switch (ndofs) + { + case 4: return libMesh::FEElemClass::TET; + case 8: return libMesh::FEElemClass::HEX; + case 6: return libMesh::FEElemClass::PRISM; + case 5: return libMesh::FEElemClass::PYRAMID; + default: return libMesh::FEElemClass::N_CLASSES; + } + + default: + return libMesh::FEElemClass::N_CLASSES; + } +} + +static unsigned int +host_n_dofs_oracle(libMesh::Kokkos::FEShapeKey key) +{ + auto elem = build_reference_elem(key.elem_type); + return libMesh::FEInterface::n_dofs(libMesh::FEType(key.order, key.family), 0, elem.get()); +} + +} // anonymous namespace + +// --------------------------------------------------------------------------- +// Test 1: get_side_topology() against libMesh side topology. +// --------------------------------------------------------------------------- +static int +test_side_topology() +{ + static const libMesh::ElemType parents[] = { + libMesh::EDGE2, + libMesh::EDGE3, + libMesh::EDGE4, + libMesh::TRI3, + libMesh::TRI7, + libMesh::QUAD4, + libMesh::TRI6, + libMesh::QUAD8, + libMesh::QUAD9, + libMesh::TET4, + libMesh::HEX8, + libMesh::TET10, + libMesh::TET14, + libMesh::HEX20, + libMesh::HEX27 + }; + constexpr int n_cases = sizeof(parents) / sizeof(parents[0]); + + Kokkos::View d_cases(std::string("side_cases"), n_cases); + { + auto h = Kokkos::create_mirror_view(d_cases); + for (int i = 0; i < n_cases; ++i) + { + h(i).parent = parents[i]; + h(i).expected = host_side_topology_oracle(parents[i]); + } + Kokkos::deep_copy(d_cases, h); + } + + Kokkos::View d_fail(std::string("side_fail")); + Kokkos::deep_copy(d_fail, 0); + + Kokkos::parallel_for( + n_cases, + KOKKOS_LAMBDA(int i) { + using namespace libMesh::Kokkos; + if (get_side_topology(d_cases(i).parent) != d_cases(i).expected) + Kokkos::atomic_add(&d_fail(), 1); + }); + Kokkos::fence(); + + int fail = 0; + Kokkos::deep_copy(fail, d_fail); + return fail; +} + +// --------------------------------------------------------------------------- +// Test 2: class_from_topology() against libMesh FE oracle. +// --------------------------------------------------------------------------- +static int +test_class_from_topology() +{ + static const libMesh::ElemType topos[] = { + libMesh::EDGE2, + libMesh::EDGE3, + libMesh::EDGE4, + libMesh::TRI3, + libMesh::TRI6, + libMesh::TRI7, + libMesh::QUAD4, + libMesh::QUAD8, + libMesh::QUAD9, + libMesh::TET4, + libMesh::TET10, + libMesh::TET14, + libMesh::HEX8, + libMesh::HEX20, + libMesh::HEX27, + libMesh::PRISM6, + libMesh::PRISM15, + libMesh::PRISM18, + libMesh::PRISM20, + libMesh::PRISM21, + libMesh::PYRAMID5, + libMesh::PYRAMID13, + libMesh::PYRAMID14, + libMesh::PYRAMID18 + }; + constexpr int n_cases = sizeof(topos) / sizeof(topos[0]); + + Kokkos::View d_cases(std::string("class_cases"), n_cases); + { + auto h = Kokkos::create_mirror_view(d_cases); + for (int i = 0; i < n_cases; ++i) + { + h(i).topo = topos[i]; + h(i).expected = host_class_from_topology_oracle(topos[i]); + } + Kokkos::deep_copy(d_cases, h); + } + + Kokkos::View d_fail(std::string("class_fail")); + Kokkos::deep_copy(d_fail, 0); + + Kokkos::parallel_for( + n_cases, + KOKKOS_LAMBDA(int i) { + using namespace libMesh::Kokkos; + if (class_from_topology(d_cases(i).topo) != d_cases(i).expected) + Kokkos::atomic_add(&d_fail(), 1); + }); + Kokkos::fence(); + + int fail = 0; + Kokkos::deep_copy(fail, d_fail); + return fail; +} + +// --------------------------------------------------------------------------- +// Test 3: n_dofs() for Kokkos-supported exact LAGRANGE keys against +// libMesh FEInterface. +// --------------------------------------------------------------------------- +static int +test_n_dofs_lagrange() +{ + using libMesh::Kokkos::FEShapeKey; + + static const FEShapeKey keys[] = { + { libMesh::LAGRANGE, libMesh::EDGE2, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::EDGE4, libMesh::FIRST }, + + { libMesh::LAGRANGE, libMesh::TRI3, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TRI6, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TRI6, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::TRI7, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TRI7, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::QUAD4, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::QUAD8, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::SECOND }, + + { libMesh::LAGRANGE, libMesh::TET4, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TET10, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TET10, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::TET14, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::TET14, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::HEX8, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::HEX20, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::HEX20, libMesh::SECOND }, + { libMesh::LAGRANGE, libMesh::HEX27, libMesh::FIRST }, + { libMesh::LAGRANGE, libMesh::HEX27, libMesh::SECOND } + }; + constexpr int n_cases = sizeof(keys) / sizeof(keys[0]); + + Kokkos::View d_cases(std::string("lagrange_cases"), n_cases); + { + auto h = Kokkos::create_mirror_view(d_cases); + for (int i = 0; i < n_cases; ++i) + { + h(i).key = keys[i]; + h(i).expected = host_n_dofs_oracle(keys[i]); + } + Kokkos::deep_copy(d_cases, h); + } + + Kokkos::View d_fail(std::string("lagrange_fail")); + Kokkos::deep_copy(d_fail, 0); + + Kokkos::parallel_for( + n_cases, + KOKKOS_LAMBDA(int i) { + using namespace libMesh::Kokkos; + if (n_dofs(d_cases(i).key) != d_cases(i).expected) + Kokkos::atomic_add(&d_fail(), 1); + }); + Kokkos::fence(); + + int fail = 0; + Kokkos::deep_copy(fail, d_fail); + return fail; +} + +// --------------------------------------------------------------------------- +// Test 4: n_dofs() for Kokkos-supported MONOMIAL keys against libMesh +// FEInterface. +// --------------------------------------------------------------------------- +static int +test_n_dofs_monomial() +{ + using libMesh::Kokkos::FEShapeKey; + + static const libMesh::Order orders[] = { + libMesh::CONSTANT, + libMesh::FIRST, + libMesh::SECOND, + libMesh::THIRD, + libMesh::FOURTH, + libMesh::FIFTH + }; + static const libMesh::ElemType higher_dim_topos[] = { + libMesh::TRI7, + libMesh::QUAD9, + libMesh::TET14, + libMesh::HEX27, + libMesh::PRISM21 + }; + + constexpr int n_cases = sizeof(orders) / sizeof(orders[0]) * + (2 + sizeof(higher_dim_topos) / sizeof(higher_dim_topos[0])); + + Kokkos::View d_cases(std::string("monomial_cases"), n_cases); + { + auto h = Kokkos::create_mirror_view(d_cases); + int i = 0; + for (const auto order : orders) + { + const libMesh::ElemType edge_topo = + (order <= libMesh::THIRD) ? libMesh::EDGE4 : libMesh::EDGE3; + const libMesh::ElemType pyramid_topo = + (order <= libMesh::THIRD) ? libMesh::PYRAMID18 : libMesh::PYRAMID14; + + h(i).key = { libMesh::MONOMIAL, edge_topo, order }; + h(i).expected = host_n_dofs_oracle(h(i).key); + ++i; + + h(i).key = { libMesh::MONOMIAL, pyramid_topo, order }; + h(i).expected = host_n_dofs_oracle(h(i).key); + ++i; + + for (const auto topo : higher_dim_topos) + { + h(i).key = { libMesh::MONOMIAL, topo, order }; + h(i).expected = host_n_dofs_oracle(h(i).key); + ++i; + } + } + Kokkos::deep_copy(d_cases, h); + } + + Kokkos::View d_fail(std::string("monomial_fail")); + Kokkos::deep_copy(d_fail, 0); + + Kokkos::parallel_for( + n_cases, + KOKKOS_LAMBDA(int i) { + using namespace libMesh::Kokkos; + if (n_dofs(d_cases(i).key) != d_cases(i).expected) + Kokkos::atomic_add(&d_fail(), 1); + }); + Kokkos::fence(); + + int fail = 0; + Kokkos::deep_copy(fail, d_fail); + return fail; +} + +// --------------------------------------------------------------------------- +// Test 5: support predicates agree on the Kokkos evaluator boundary. +// --------------------------------------------------------------------------- +static int +test_support_contract() +{ + using libMesh::Kokkos::FEShapeKey; + + static const support_case cases[] = { + { { libMesh::LAGRANGE, libMesh::EDGE2, libMesh::FIRST }, true }, + { { libMesh::LAGRANGE, libMesh::EDGE3, libMesh::SECOND }, true }, + { { libMesh::LAGRANGE, libMesh::TRI7, libMesh::SECOND }, true }, + { { libMesh::LAGRANGE, libMesh::QUAD9, libMesh::SECOND }, true }, + { { libMesh::LAGRANGE, libMesh::TET14, libMesh::SECOND }, true }, + { { libMesh::LAGRANGE, libMesh::HEX27, libMesh::SECOND }, true }, + { { libMesh::LAGRANGE, libMesh::NODEELEM, libMesh::CONSTANT }, false }, + { { libMesh::LAGRANGE, libMesh::NODEELEM, libMesh::FIRST }, false }, + { { libMesh::LAGRANGE, libMesh::EDGE4, libMesh::THIRD }, false }, + { { libMesh::LAGRANGE, libMesh::TRI7, libMesh::THIRD }, false }, + { { libMesh::LAGRANGE, libMesh::TET14, libMesh::THIRD }, false }, + { { libMesh::LAGRANGE, libMesh::PRISM6, libMesh::FIRST }, false }, + { { libMesh::LAGRANGE, libMesh::PRISM15, libMesh::SECOND }, false }, + { { libMesh::LAGRANGE, libMesh::PYRAMID5, libMesh::FIRST }, false }, + { { libMesh::LAGRANGE, libMesh::PYRAMID14, libMesh::SECOND }, false }, + { { libMesh::LAGRANGE, libMesh::PYRAMID18, libMesh::THIRD }, false }, + { { libMesh::LAGRANGE, libMesh::EDGE2, libMesh::INVALID_ORDER }, false }, + { { libMesh::MONOMIAL, libMesh::EDGE4, libMesh::THIRD }, true }, + { { libMesh::MONOMIAL, libMesh::TRI7, libMesh::FIFTH }, true }, + { { libMesh::MONOMIAL, libMesh::QUAD9, libMesh::FIFTH }, true }, + { { libMesh::MONOMIAL, libMesh::TET14, libMesh::FIFTH }, true }, + { { libMesh::MONOMIAL, libMesh::PRISM21, libMesh::FIFTH }, true }, + { { libMesh::MONOMIAL, libMesh::PYRAMID14, libMesh::FIFTH }, true }, + { { libMesh::MONOMIAL, libMesh::NODEELEM, libMesh::CONSTANT }, false }, + { { libMesh::MONOMIAL, libMesh::EDGE4, libMesh::FOURTH }, false }, + { { libMesh::MONOMIAL, libMesh::PYRAMID18, libMesh::FOURTH }, false }, + { { libMesh::MONOMIAL, libMesh::TRI7, libMesh::SIXTH }, false }, + { { libMesh::MONOMIAL, libMesh::HEX27, libMesh::SIXTH }, false }, + { { libMesh::MONOMIAL, libMesh::EDGE2, libMesh::INVALID_ORDER }, false } + }; + constexpr int n_cases = sizeof(cases) / sizeof(cases[0]); + + Kokkos::View d_cases(std::string("support_cases"), n_cases); + { + auto h = Kokkos::create_mirror_view(d_cases); + for (int i = 0; i < n_cases; ++i) + h(i) = cases[i]; + Kokkos::deep_copy(d_cases, h); + } + + Kokkos::View d_fail(std::string("support_fail")); + Kokkos::deep_copy(d_fail, 0); + + Kokkos::parallel_for( + n_cases, + KOKKOS_LAMBDA(int i) { + using namespace libMesh::Kokkos; + + const bool shape_supported = supports_shape(d_cases(i).key); + const bool grad_supported = supports_grad_shape(d_cases(i).key); + const bool ndofs_supported = supports_n_dofs(d_cases(i).key); + + if (shape_supported != d_cases(i).expected || + grad_supported != d_cases(i).expected || + ndofs_supported != d_cases(i).expected || + shape_supported != grad_supported || + shape_supported != ndofs_supported) + Kokkos::atomic_add(&d_fail(), 1); + }); + Kokkos::fence(); + + int fail = 0; + Kokkos::deep_copy(fail, d_fail); + return fail; +} + +// --------------------------------------------------------------------------- +// main +// --------------------------------------------------------------------------- +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + { + const int f = test_side_topology(); + std::printf("[side_topology_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_class_from_topology(); + std::printf("[class_topology_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_n_dofs_lagrange(); + std::printf("[lagrange_ndofs_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_n_dofs_monomial(); + std::printf("[monomial_ndofs_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_support_contract(); + std::printf("[support_contract_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/fe/kokkos_quadrature_oracle_test.K b/tests/fe/kokkos_quadrature_oracle_test.K new file mode 100644 index 00000000000..96ebfe71640 --- /dev/null +++ b/tests/fe/kokkos_quadrature_oracle_test.K @@ -0,0 +1,747 @@ +// GPU kernel oracle tests for libMesh::Kokkos quadrature and map helpers. +// +// Standalone executable (no CppUnit). Uses libMesh::LibMeshInit so that +// QGauss, FEMap, and FEBase::side_map are available for oracle values. +// +// The test suite covers: +// A. GaussQuadrature point and weight tables against libMesh QGauss. +// B. physical_point() and jacobian() against libMesh FEMap::map() and +// FEMap::map_deriv(). +// C. physical_point_and_jacobian() and volume_jxw() against libMesh FEBase. +// D. face_jacobian(), face_jxw(), face_normal(), and +// edge_normal_on_parent_surface() against libMesh FE oracles. +// E. map_face_qp_to_parent() against libMesh FEBase::side_map(). +// +// Returns 0 on success, non-zero on failure. + +#include "libmesh/libmesh_config.h" + +#include "gpu/kokkos_fe_face_map.h" +#include "gpu/kokkos_fe_map.h" +#include "gpu/kokkos_quadrature.h" + +#include "libmesh/elem.h" +#include "libmesh/fe_base.h" +#include "libmesh/fe_map.h" +#include "libmesh/libmesh.h" +#include "libmesh/node.h" +#include "libmesh/quadrature_gauss.h" + +// Avoid conflicting complex operators between CUDA and PETSc +#define PETSC_SKIP_CXX_COMPLEX_FIX 1 +#include +#undef __CUDACC_VER__ + +#include "kokkos_fe_oracle_test_utils.h" + +#include +#include +#include +#include +#include + +using libMesh::Kokkos::GaussQuadrature; +using libMesh::Kokkos::Real; +using libMesh::Kokkos::RealTensor; +using libMesh::Kokkos::RealVector; +using kokkos_test_utils::build_face_helper_context; +using kokkos_test_utils::build_map_helper_context; +using kokkos_test_utils::build_host_qgauss; +using kokkos_test_utils::build_reference_fixture; +using kokkos_test_utils::compare_device_values; +using kokkos_test_utils::dispatch_supported_lagrange_face_map_topology; +using kokkos_test_utils::dispatch_supported_lagrange_map_topology; +using kokkos_test_utils::element_fixture; +using kokkos_test_utils::evaluate_face_helper_context_2d; +using kokkos_test_utils::evaluate_face_helper_context_3d; +using kokkos_test_utils::evaluate_map_helper_context; +using kokkos_test_utils::face_helper_context; +using kokkos_test_utils::tensor_component; +using kokkos_test_utils::upload_point_coordinates; +using kokkos_test_utils::vector_component; + +static constexpr double tol = 1.0e-13; + +namespace +{ + +struct quadrature_case +{ + libMesh::ElemType topo; + unsigned int dim; + unsigned int order; +}; + +struct map_helper_case +{ + libMesh::ElemType topo; + const char * name; +}; + +struct face_helper_case +{ + libMesh::ElemType parent_topo; + unsigned int side_id; + const char * name; +}; + +} // anonymous namespace + +static int +test_quadrature_case(const quadrature_case & info) +{ + std::vector x_ref, y_ref, z_ref, w_ref; + const unsigned int host_nqp = + build_host_qgauss(info.topo, info.dim, info.order, x_ref, y_ref, z_ref, w_ref); + + Kokkos::View d_nqp(std::string("nqp")); + Kokkos::parallel_for( + 1, + KOKKOS_LAMBDA(int) { + d_nqp() = GaussQuadrature::n_points(info.topo, info.order); + }); + Kokkos::fence(); + + unsigned int device_nqp = 0; + Kokkos::deep_copy(device_nqp, d_nqp); + + int fail = 0; + if (device_nqp != host_nqp) + ++fail; + + Kokkos::View d_x(std::string("qx"), host_nqp); + Kokkos::View d_y(std::string("qy"), host_nqp); + Kokkos::View d_z(std::string("qz"), host_nqp); + Kokkos::View d_w(std::string("qw"), host_nqp); + + Kokkos::parallel_for( + host_nqp, + KOKKOS_LAMBDA(int qp) { + const RealVector pt = GaussQuadrature::point(info.topo, info.order, qp); + d_x(qp) = vector_component(pt, 0); + d_y(qp) = vector_component(pt, 1); + d_z(qp) = vector_component(pt, 2); + d_w(qp) = GaussQuadrature::weight(info.topo, info.order, qp); + }); + Kokkos::fence(); + + fail += compare_device_values(d_x, x_ref); + fail += compare_device_values(d_y, y_ref); + fail += compare_device_values(d_z, z_ref); + fail += compare_device_values(d_w, w_ref); + + if (fail) + std::printf(" quadrature mismatch: topo=%d dim=%u order=%u (%d failures)\n", + static_cast(info.topo), info.dim, info.order, fail); + + return fail; +} + +static int +test_quadrature_against_qgauss() +{ + int fail = 0; + + const libMesh::ElemType edge_topos[] = { libMesh::EDGE2, libMesh::EDGE3 }; + const libMesh::ElemType quad_topos[] = { libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9 }; + const libMesh::ElemType hex_topos[] = { libMesh::HEX8, libMesh::HEX20, libMesh::HEX27 }; + const libMesh::ElemType tri_topos[] = { libMesh::TRI3, libMesh::TRI6 }; + const libMesh::ElemType tet_topos[] = { libMesh::TET4, libMesh::TET10 }; + + for (const auto topo : edge_topos) + for (unsigned int order = 0; order <= 12; ++order) + fail += test_quadrature_case({ topo, 1, order }); + + for (const auto topo : quad_topos) + for (unsigned int order = 0; order <= 12; ++order) + fail += test_quadrature_case({ topo, 2, order }); + + for (const auto topo : hex_topos) + for (unsigned int order = 0; order <= 12; ++order) + fail += test_quadrature_case({ topo, 3, order }); + + for (const auto topo : tri_topos) + for (unsigned int order = 0; order <= 6; ++order) + fail += test_quadrature_case({ topo, 2, order }); + + for (const auto topo : tet_topos) + for (unsigned int order = 0; order <= 6; ++order) + fail += test_quadrature_case({ topo, 3, order }); + + return fail; +} + + +static element_fixture +build_hex8_fixture() +{ + element_fixture fixture; + fixture.elem = libMesh::Elem::build(libMesh::HEX8); + fixture.elem->set_mapping_type(libMesh::LAGRANGE_MAP); + fixture.nodes.reserve(8); + + static const double coords[8][3] = { + {0.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, + {1.0, 1.0, 0.0}, + {0.0, 1.0, 0.0}, + {0.0, 0.0, 1.0}, + {1.0, 0.0, 1.0}, + {1.0, 1.0, 1.0}, + {0.0, 1.0, 1.0} + }; + + for (unsigned int i = 0; i < 8; ++i) + { + fixture.nodes.push_back(libMesh::Node::build(coords[i][0], coords[i][1], coords[i][2], i)); + fixture.elem->set_node(i, fixture.nodes.back().get()); + } + + return fixture; +} + +static element_fixture +build_tri3_fixture() +{ + element_fixture fixture; + fixture.elem = libMesh::Elem::build(libMesh::TRI3); + fixture.elem->set_mapping_type(libMesh::LAGRANGE_MAP); + fixture.nodes.reserve(3); + + static const double coords[3][3] = { + {0.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0} + }; + + for (unsigned int i = 0; i < 3; ++i) + { + fixture.nodes.push_back(libMesh::Node::build(coords[i][0], coords[i][1], coords[i][2], i)); + fixture.elem->set_node(i, fixture.nodes.back().get()); + } + + return fixture; +} + +static int +test_physical_map_hex8() +{ + auto fixture = build_hex8_fixture(); + + const libMesh::Point ref_center(0.0, 0.0, 0.0); + const libMesh::Point ref_corner(-1.0, -1.0, -1.0); + + const libMesh::Point host_center = libMesh::FEMap::map(3, fixture.elem.get(), ref_center); + const libMesh::Point host_corner = libMesh::FEMap::map(3, fixture.elem.get(), ref_corner); + const libMesh::Point host_dxi = libMesh::FEMap::map_deriv(3, fixture.elem.get(), 0, ref_center); + const libMesh::Point host_deta = libMesh::FEMap::map_deriv(3, fixture.elem.get(), 1, ref_center); + const libMesh::Point host_dzeta = libMesh::FEMap::map_deriv(3, fixture.elem.get(), 2, ref_center); + + std::vector ref_values = { + host_center(0), host_center(1), host_center(2), + host_dxi(0), host_dxi(1), host_dxi(2), + host_deta(0), host_deta(1), host_deta(2), + host_dzeta(0), host_dzeta(1), host_dzeta(2), + host_corner(0), host_corner(1), host_corner(2) + }; + + auto d_coords = upload_point_coordinates(*fixture.elem, "hex_coords"); + + Kokkos::View d_results(std::string("hex_results"), ref_values.size()); + Kokkos::parallel_for( + 1, + KOKKOS_LAMBDA(int) { + RealVector nodes[8]; + for (unsigned int i = 0; i < 8; ++i) + nodes[i] = libMesh::Kokkos::make_vector( + d_coords(3 * i + 0), d_coords(3 * i + 1), d_coords(3 * i + 2)); + + const RealVector xyz_center = + libMesh::Kokkos::physical_point(nodes, 8, 0.0, 0.0, 0.0); + const RealTensor J_center = + libMesh::Kokkos::jacobian(nodes, 8, 0.0, 0.0, 0.0); + const RealVector xyz_corner = libMesh::Kokkos::physical_point( + nodes, 8, -1.0, -1.0, -1.0); + + d_results(0) = vector_component(xyz_center, 0); + d_results(1) = vector_component(xyz_center, 1); + d_results(2) = vector_component(xyz_center, 2); + d_results(3) = tensor_component(J_center, 0, 0); + d_results(4) = tensor_component(J_center, 0, 1); + d_results(5) = tensor_component(J_center, 0, 2); + d_results(6) = tensor_component(J_center, 1, 0); + d_results(7) = tensor_component(J_center, 1, 1); + d_results(8) = tensor_component(J_center, 1, 2); + d_results(9) = tensor_component(J_center, 2, 0); + d_results(10) = tensor_component(J_center, 2, 1); + d_results(11) = tensor_component(J_center, 2, 2); + d_results(12) = vector_component(xyz_corner, 0); + d_results(13) = vector_component(xyz_corner, 1); + d_results(14) = vector_component(xyz_corner, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_results, ref_values); +} + +static int +test_physical_map_tri3() +{ + auto fixture = build_tri3_fixture(); + + const libMesh::Point ref_pt(1.0 / 3.0, 1.0 / 3.0, 0.0); + + const libMesh::Point host_xyz = libMesh::FEMap::map(2, fixture.elem.get(), ref_pt); + const libMesh::Point host_dxi = libMesh::FEMap::map_deriv(2, fixture.elem.get(), 0, ref_pt); + const libMesh::Point host_deta = libMesh::FEMap::map_deriv(2, fixture.elem.get(), 1, ref_pt); + + std::vector ref_values = { + host_xyz(0), host_xyz(1), host_xyz(2), + host_dxi(0), host_dxi(1), host_dxi(2), + host_deta(0), host_deta(1), host_deta(2) + }; + + auto d_coords = upload_point_coordinates(*fixture.elem, "tri_coords"); + + Kokkos::View d_results(std::string("tri_results"), ref_values.size()); + Kokkos::parallel_for( + 1, + KOKKOS_LAMBDA(int) { + RealVector nodes[3]; + for (unsigned int i = 0; i < 3; ++i) + nodes[i] = libMesh::Kokkos::make_vector( + d_coords(3 * i + 0), d_coords(3 * i + 1), d_coords(3 * i + 2)); + + const RealVector xyz = libMesh::Kokkos::physical_point( + nodes, 3, 1.0 / 3.0, 1.0 / 3.0, 0.0); + const RealTensor J = libMesh::Kokkos::jacobian( + nodes, 3, 1.0 / 3.0, 1.0 / 3.0, 0.0); + + d_results(0) = vector_component(xyz, 0); + d_results(1) = vector_component(xyz, 1); + d_results(2) = vector_component(xyz, 2); + d_results(3) = tensor_component(J, 0, 0); + d_results(4) = tensor_component(J, 0, 1); + d_results(5) = tensor_component(J, 0, 2); + d_results(6) = tensor_component(J, 1, 0); + d_results(7) = tensor_component(J, 1, 1); + d_results(8) = tensor_component(J, 1, 2); + }); + Kokkos::fence(); + + return compare_device_values(d_results, ref_values); +} + +template +static int +test_map_helpers_case_impl(const map_helper_case & info) +{ + auto fixture = build_reference_fixture(Topo); + const auto context = build_map_helper_context(fixture, info.topo, "map_helper"); + const int fail = evaluate_map_helper_context(context, "map_helper_results", tol); + if (fail) + std::printf(" quadrature map-helper mismatch: %s (%d failures)\n", + info.name, + fail); + return fail; +} + +struct quadrature_map_helper_dispatch +{ + explicit quadrature_map_helper_dispatch(const map_helper_case & in_info) : info(in_info) {} + + template + int operator()() const + { + return test_map_helpers_case_impl(info); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported quadrature map-helper topology: %s type=%d\n", + info.name, + static_cast(topo)); + return 1; + } + + const map_helper_case & info; +}; + +static int +test_map_helpers_case(const map_helper_case & info) +{ + const quadrature_map_helper_dispatch dispatch(info); + return dispatch_supported_lagrange_map_topology(info.topo, dispatch); +} + +template +static int +test_face_map_helpers_case_3d_impl(const face_helper_context & context, + const face_helper_case & info, + libMesh::ElemType side_topo) +{ + const int fail = evaluate_face_helper_context_3d(context, "face_helper_results", tol); + if (fail) + std::printf(" quadrature face-helper mismatch: %s parent_type=%d side_id=%u side_type=%d (%d failures)\n", + info.name, + static_cast(info.parent_topo), + info.side_id, + static_cast(side_topo), + fail); + + return fail; +} + +template +static int +test_face_map_helpers_case_2d_impl(const face_helper_context & context, + const face_helper_case & info, + libMesh::ElemType side_topo) +{ + const int fail = + evaluate_face_helper_context_2d(context, "face_helper_results", tol); + if (fail) + std::printf(" quadrature face-helper mismatch: %s parent_type=%d side_id=%u side_type=%d (%d failures)\n", + info.name, + static_cast(info.parent_topo), + info.side_id, + static_cast(side_topo), + fail); + + return fail; +} + +struct quadrature_face_side_dispatch_3d +{ + quadrature_face_side_dispatch_3d(const face_helper_context & in_context, + const face_helper_case & in_info, + libMesh::ElemType in_side_topo) + : context(in_context), info(in_info), side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_face_map_helpers_case_3d_impl(context, info, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported quadrature face-helper side: %s parent_type=%d side_id=%u side_type=%d\n", + info.name, + static_cast(info.parent_topo), + info.side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + const face_helper_case & info; + libMesh::ElemType side_topo; +}; + +template +struct quadrature_face_side_dispatch_2d +{ + quadrature_face_side_dispatch_2d(const face_helper_context & in_context, + const face_helper_case & in_info, + libMesh::ElemType in_side_topo) + : context(in_context), info(in_info), side_topo(in_side_topo) + { + } + + template + int operator()() const + { + return test_face_map_helpers_case_2d_impl(context, info, side_topo); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported quadrature face-helper side: %s parent_type=%d side_id=%u side_type=%d\n", + info.name, + static_cast(info.parent_topo), + info.side_id, + static_cast(topo)); + return 1; + } + + const face_helper_context & context; + const face_helper_case & info; + libMesh::ElemType side_topo; +}; + +struct quadrature_face_parent_dispatch_2d +{ + quadrature_face_parent_dispatch_2d(const face_helper_context & in_context, + const face_helper_case & in_info, + libMesh::ElemType in_side_topo) + : context(in_context), info(in_info), side_topo(in_side_topo) + { + } + + template + int operator()() const + { + const quadrature_face_side_dispatch_2d dispatch(context, info, side_topo); + return dispatch_supported_lagrange_face_map_topology(side_topo, dispatch); + } + + int unsupported_topology(libMesh::ElemType topo) const + { + std::printf(" unexpected unsupported quadrature face-helper parent: %s parent_type=%d side_id=%u\n", + info.name, + static_cast(topo), + info.side_id); + return 1; + } + + const face_helper_context & context; + const face_helper_case & info; + libMesh::ElemType side_topo; +}; + +static int +test_face_map_helpers_case(const face_helper_case & info) +{ + auto fixture = build_reference_fixture(info.parent_topo); + auto side = fixture.elem->build_side_ptr(info.side_id); + const face_helper_context context = + build_face_helper_context(fixture, *side, info.side_id, "face_helper"); + + if (context.parent_dim == 3) + { + const quadrature_face_side_dispatch_3d dispatch(context, info, side->type()); + return dispatch_supported_lagrange_face_map_topology(side->type(), dispatch); + } + + if (context.parent_dim == 2) + { + const quadrature_face_parent_dispatch_2d dispatch(context, info, side->type()); + return dispatch_supported_lagrange_map_topology(fixture.elem->type(), dispatch); + } + + std::printf(" unexpected unsupported quadrature face-helper parent dimension: %s parent_type=%d side_id=%u dim=%u\n", + info.name, + static_cast(info.parent_topo), + info.side_id, + context.parent_dim); + return 1; +} + +static RealVector +host_face_qp_to_parent_oracle(const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + RealVector face_qpt) +{ + const libMesh::FEType fe_type(parent.default_order(), libMesh::FEMap::map_fe_type(parent)); + auto fe = libMesh::FEBase::build(parent.dim(), fe_type); + + // FE::side_map() relies on FEMap::psi_map, which is only populated after + // some mapping quantity (e.g. xyz) has been requested on the FE object. + fe->get_xyz(); + + std::vector ref_side_points(1); + ref_side_points[0] = libMesh::Point( + vector_component(face_qpt, 0), vector_component(face_qpt, 1), vector_component(face_qpt, 2)); + + std::vector ref_points; + fe->side_map(&parent, &side, side_id, ref_side_points, ref_points); + + return libMesh::Kokkos::make_vector(ref_points[0](0), ref_points[0](1), ref_points[0](2)); +} + +static int +check_face_qp_to_parent_case(const char * case_name, + const libMesh::Elem & parent, + const libMesh::Elem & side, + unsigned int side_id, + RealVector face_qpt) +{ + using libMesh::Kokkos::map_face_qp_to_parent; + + const RealVector host = host_face_qp_to_parent_oracle(parent, side, side_id, face_qpt); + const RealVector kokkos = + map_face_qp_to_parent(side, libMesh::LAGRANGE_MAP, side.type(), face_qpt); + + int fail = 0; + for (unsigned int d = 0; d < 3; ++d) + if (std::fabs(vector_component(kokkos, d) - vector_component(host, d)) > tol) + ++fail; + + if (fail) + { + std::vector refspace_nodes; + libMesh::FEBase::get_refspace_nodes(parent.type(), refspace_nodes); + + std::printf(" face_qp mismatch: case=%s parent_type=%d side_type=%d side_id=%u\n", + case_name, + static_cast(parent.type()), + static_cast(side.type()), + side_id); + std::printf(" face_qpt=(%.17g, %.17g, %.17g)\n", + vector_component(face_qpt, 0), vector_component(face_qpt, 1), vector_component(face_qpt, 2)); + std::printf(" host =(%.17g, %.17g, %.17g)\n", + vector_component(host, 0), vector_component(host, 1), vector_component(host, 2)); + std::printf(" kokkos =(%.17g, %.17g, %.17g)\n", + vector_component(kokkos, 0), vector_component(kokkos, 1), vector_component(kokkos, 2)); + std::printf(" diff =(%.17g, %.17g, %.17g)\n", + vector_component(kokkos, 0) - vector_component(host, 0), + vector_component(kokkos, 1) - vector_component(host, 1), + vector_component(kokkos, 2) - vector_component(host, 2)); + std::printf(" side nodes / parent refspace nodes:\n"); + + for (unsigned int k = 0; k < side.n_nodes(); ++k) + { + const unsigned int parent_node = parent.local_side_node(side_id, k); + const libMesh::Point parent_refspace = refspace_nodes[parent_node]; + std::printf(" k=%u side_node_id=%llu parent_node=%u parent_refspace=(%.17g, %.17g, %.17g)\n", + k, + libMesh::cast_int(side.node_id(k)), + parent_node, + parent_refspace(0), + parent_refspace(1), + parent_refspace(2)); + } + } + + return fail; +} + +static int +test_face_qp_to_parent_ref_coords() +{ + using libMesh::Elem; + using libMesh::Node; + + int fail = 0; + + { + auto edge = Elem::build(libMesh::EDGE2); + edge->set_mapping_type(libMesh::LAGRANGE_MAP); + auto n0 = Node::build(3.25, -2.0, 5.0, 0); + auto n1 = Node::build(9.50, 4.0, -1.0, 1); + edge->set_node(0, n0.get()); + edge->set_node(1, n1.get()); + + auto side0 = edge->build_side_ptr(0); + auto side1 = edge->build_side_ptr(1); + + fail += check_face_qp_to_parent_case("edge2_side0", *edge, *side0, 0, libMesh::Kokkos::zero_vector()); + fail += check_face_qp_to_parent_case("edge2_side1", *edge, *side1, 1, libMesh::Kokkos::zero_vector()); + } + + { + auto tri3 = Elem::build(libMesh::TRI3); + tri3->set_mapping_type(libMesh::LAGRANGE_MAP); + auto n0 = Node::build(10.0, 20.0, 0.0, 0); + auto n1 = Node::build(14.0, 20.0, 0.0, 1); + auto n2 = Node::build(10.0, 23.0, 0.0, 2); + tri3->set_node(0, n0.get()); + tri3->set_node(1, n1.get()); + tri3->set_node(2, n2.get()); + + auto side0 = tri3->build_side_ptr(0); + + fail += check_face_qp_to_parent_case("tri3_side0", *tri3, *side0, 0, libMesh::Kokkos::zero_vector()); + } + + { + auto tri6 = Elem::build(libMesh::TRI6); + tri6->set_mapping_type(libMesh::LAGRANGE_MAP); + auto n0 = Node::build(4.0, 1.0, 0.0, 0); + auto n1 = Node::build(9.0, 2.0, 0.0, 1); + auto n2 = Node::build(3.0, 8.0, 0.0, 2); + auto n3 = Node::build(42.0, -17.0, 5.0, 3); + auto n4 = Node::build(11.0, 11.0, 1.0, 4); + auto n5 = Node::build(-7.0, 4.0, 2.0, 5); + tri6->set_node(0, n0.get()); + tri6->set_node(1, n1.get()); + tri6->set_node(2, n2.get()); + tri6->set_node(3, n3.get()); + tri6->set_node(4, n4.get()); + tri6->set_node(5, n5.get()); + + auto side0 = tri6->build_side_ptr(0); + + fail += check_face_qp_to_parent_case("tri6_side0", *tri6, *side0, 0, libMesh::Kokkos::zero_vector()); + } + + return fail; +} + +// --------------------------------------------------------------------------- +// main +// --------------------------------------------------------------------------- +int +main(int argc, char ** argv) +{ + Kokkos::initialize(argc, argv); + libMesh::LibMeshInit init(argc, argv); + + int total_fail = 0; + + { + const int f = test_quadrature_against_qgauss(); + std::printf("[quadrature_qgauss_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_physical_map_hex8(); + std::printf("[physical_map_hex8] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const int f = test_physical_map_tri3(); + std::printf("[physical_map_tri3] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + { + const map_helper_case cases[] = { + { libMesh::EDGE3, "EDGE3" }, + { libMesh::TRI6, "TRI6" }, + { libMesh::QUAD9, "QUAD9" }, + { libMesh::TET10, "TET10" }, + { libMesh::HEX20, "HEX20" } + }; + + for (const auto & info : cases) + { + const int f = test_map_helpers_case(info); + std::printf("[map_helper_oracle] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + { + const face_helper_case cases[] = { + { libMesh::TRI6, 0, "TRI6/side0" }, + { libMesh::TET10, 0, "TET10/side0" }, + { libMesh::HEX20, 0, "HEX20/side0" } + }; + + for (const auto & info : cases) + { + const int f = test_face_map_helpers_case(info); + std::printf("[face_helper_oracle] [%s] %s (%d failures)\n", + info.name, f ? "FAIL" : "PASS", f); + total_fail += f; + } + } + { + const int f = test_face_qp_to_parent_ref_coords(); + std::printf("[face_qp_parent_oracle] %s (%d failures)\n", f ? "FAIL" : "PASS", f); + total_fail += f; + } + + Kokkos::finalize(); + + if (total_fail == 0) + std::printf("ALL TESTS PASSED\n"); + else + std::printf("%d TEST(S) FAILED\n", total_fail); + + return total_fail ? 1 : 0; +} diff --git a/tests/quadrature/quadrature_exactness.h b/tests/quadrature/quadrature_exactness.h new file mode 100644 index 00000000000..5db510f09ef --- /dev/null +++ b/tests/quadrature/quadrature_exactness.h @@ -0,0 +1,176 @@ +#ifndef LIBMESH_QUADRATURE_EXACTNESS_H +#define LIBMESH_QUADRATURE_EXACTNESS_H + +#include +#include +#include + +#include +#include +#include + +namespace quadrature_exactness +{ + +inline libMesh::Real +axis_integral(const unsigned int power) +{ + return (power % 2) ? libMesh::Real(0) : (libMesh::Real(2) / (power + 1)); +} + +inline libMesh::Real +edge_integral(const unsigned int x_power) +{ + return axis_integral(x_power); +} + +inline libMesh::Real +quad_integral(const unsigned int x_power, + const unsigned int y_power) +{ + return axis_integral(x_power) * axis_integral(y_power); +} + +inline libMesh::Real +tri_integral(const unsigned int x_power, + const unsigned int y_power) +{ + libMesh::Real analytical = 1.0; + + const unsigned int larger_power = std::max(x_power, y_power); + const unsigned int smaller_power = std::min(x_power, y_power); + + std::vector numerator(smaller_power > 1 ? smaller_power - 1 : 0); + std::vector denominator(2 + smaller_power); + + std::iota(numerator.begin(), numerator.end(), 2); + std::iota(denominator.begin(), denominator.end(), larger_power + 1); + + for (std::size_t i = 0; i < denominator.size(); ++i) + { + if (i < numerator.size()) + analytical *= numerator[i]; + + analytical /= denominator[i]; + } + + return analytical; +} + +inline libMesh::Real +hex_integral(const unsigned int x_power, + const unsigned int y_power, + const unsigned int z_power) +{ + return axis_integral(x_power) * axis_integral(y_power) * axis_integral(z_power); +} + +inline libMesh::Real +tet_integral(const unsigned int x_power, + const unsigned int y_power, + const unsigned int z_power) +{ + libMesh::Real analytical = 1.0; + + unsigned int sorted_powers[3] = {x_power, y_power, z_power}; + std::sort(sorted_powers, sorted_powers + 3); + + std::vector numerator_1(sorted_powers[0] > 1 ? sorted_powers[0] - 1 : 0); + std::vector numerator_2(sorted_powers[1] > 1 ? sorted_powers[1] - 1 : 0); + std::vector denominator(3 + sorted_powers[0] + sorted_powers[1]); + + std::iota(numerator_1.begin(), numerator_1.end(), 2); + std::iota(numerator_2.begin(), numerator_2.end(), 2); + std::iota(denominator.begin(), denominator.end(), sorted_powers[2] + 1); + + for (std::size_t i = 0; i < denominator.size(); ++i) + { + if (i < numerator_1.size()) + analytical *= numerator_1[i]; + + if (i < numerator_2.size()) + analytical *= numerator_2[i]; + + analytical /= denominator[i]; + } + + return analytical; +} + +inline libMesh::Real +prism_integral(const unsigned int x_power, + const unsigned int y_power, + const unsigned int z_power) +{ + return tri_integral(x_power, y_power) * axis_integral(z_power); +} + +inline libMesh::Real +pyramid_integral(const unsigned int x_power, + const unsigned int y_power, + const unsigned int z_power) +{ + if (x_power % 2 || y_power % 2) + return libMesh::Real(0); + + const unsigned int binom = + libMesh::Utility::binomial(x_power + y_power + z_power + 3, z_power); + + return libMesh::Real(4) / + ((x_power + 1) * (y_power + 1) * binom * (x_power + y_power + z_power + 3)); +} + +inline libMesh::Real +monomial_integral(const libMesh::ElemType elem_type, + const unsigned int x_power, + const unsigned int y_power = 0, + const unsigned int z_power = 0) +{ + switch (elem_type) + { + case libMesh::EDGE2: + case libMesh::EDGE3: + case libMesh::EDGE4: + return edge_integral(x_power); + + case libMesh::TRI3: + case libMesh::TRI6: + case libMesh::TRI7: + return tri_integral(x_power, y_power); + + case libMesh::QUAD4: + case libMesh::QUAD8: + case libMesh::QUAD9: + return quad_integral(x_power, y_power); + + case libMesh::TET4: + case libMesh::TET10: + case libMesh::TET14: + return tet_integral(x_power, y_power, z_power); + + case libMesh::HEX8: + case libMesh::HEX20: + case libMesh::HEX27: + return hex_integral(x_power, y_power, z_power); + + case libMesh::PRISM6: + case libMesh::PRISM15: + case libMesh::PRISM18: + case libMesh::PRISM20: + case libMesh::PRISM21: + return prism_integral(x_power, y_power, z_power); + + case libMesh::PYRAMID5: + case libMesh::PYRAMID13: + case libMesh::PYRAMID14: + case libMesh::PYRAMID18: + return pyramid_integral(x_power, y_power, z_power); + + default: + return libMesh::Real(0); + } +} + +} // namespace quadrature_exactness + +#endif // LIBMESH_QUADRATURE_EXACTNESS_H diff --git a/tests/quadrature/quadrature_test.C b/tests/quadrature/quadrature_test.C index 1dd39a01832..f72440f417e 100644 --- a/tests/quadrature/quadrature_test.C +++ b/tests/quadrature/quadrature_test.C @@ -2,10 +2,10 @@ #include #include #include -#include #include -#include // std::iota + +#include "quadrature_exactness.h" #include "libmesh_cppunit.h" @@ -205,115 +205,47 @@ private: const std::function edge_integrals = [](int mode, int, int) { - return (mode % 2) ? 0 : (Real(2.0) / (mode+1)); + return quadrature_exactness::edge_integral(static_cast(mode)); }; const std::function quad_integrals = [](int modex, int modey, int) { - const Real exactx = (modex % 2) ? - 0 : (Real(2.0) / (modex+1)); - - const Real exacty = (modey % 2) ? - 0 : (Real(2.0) / (modey+1)); - - return exactx*exacty; + return quadrature_exactness::quad_integral(static_cast(modex), + static_cast(modey)); }; const std::function tri_integrals = [](int x_power, int y_power, int) { - // Compute the true integral, a! b! / (a + b + 2)! - Real analytical = 1.0; - - unsigned - larger_power = std::max(x_power, y_power), - smaller_power = std::min(x_power, y_power); - - // Cancel the larger of the two numerator terms with the - // denominator, and fill in the remaining entries. - std::vector - numerator(smaller_power > 1 ? smaller_power-1 : 0), - denominator(2+smaller_power); - - // Fill up the vectors with sequences starting at the right values. - std::iota(numerator.begin(), numerator.end(), 2); - std::iota(denominator.begin(), denominator.end(), larger_power+1); - - // The denominator is guaranteed to have more terms... - for (std::size_t i=0; i(x_power), + static_cast(y_power)); }; const std::function hex_integrals = [](int modex, int modey, int modez) { - const Real exactx = (modex % 2) ? - 0 : (Real(2.0) / (modex+1)); - - const Real exacty = (modey % 2) ? - 0 : (Real(2.0) / (modey+1)); - - const Real exactz = (modez % 2) ? - 0 : (Real(2.0) / (modez+1)); - - return exactx*exacty*exactz; + return quadrature_exactness::hex_integral(static_cast(modex), + static_cast(modey), + static_cast(modez)); }; const std::function tet_integrals = [](int x_power, int y_power, int z_power) { - // Compute the true integral, a! b! c! / (a + b + c + 3)! - Real analytical = 1.0; - - // Sort the a, b, c values - int sorted_powers[3] = {x_power, y_power, z_power}; - std::sort(sorted_powers, sorted_powers+3); - - // Cancel the largest power with the denominator, fill in the - // entries for the remaining numerator terms and the denominator. - std::vector - numerator_1(sorted_powers[0] > 1 ? sorted_powers[0]-1 : 0), - numerator_2(sorted_powers[1] > 1 ? sorted_powers[1]-1 : 0), - denominator(3 + sorted_powers[0] + sorted_powers[1]); - - // Fill up the vectors with sequences starting at the right values. - std::iota(numerator_1.begin(), numerator_1.end(), 2); - std::iota(numerator_2.begin(), numerator_2.end(), 2); - std::iota(denominator.begin(), denominator.end(), sorted_powers[2]+1); - - // The denominator is guaranteed to have the most terms... - for (std::size_t i=0; i(x_power), + static_cast(y_power), + static_cast(z_power)); }; const std::function prism_integrals = - [this](int modex, int modey, int modez) { - const Real exactz = (modez % 2) ? - 0 : (Real(2.0) / (modez+1)); - - return exactz * tri_integrals(modex, modey, 0); + [](int modex, int modey, int modez) { + return quadrature_exactness::prism_integral(static_cast(modex), + static_cast(modey), + static_cast(modez)); }; const std::function pyramid_integrals = [](int modex, int modey, int modez) { - - const int binom = Utility::binomial(modex+modey+modez+3, modez); - - if (modex%2 || modey%2) - return Real(0); - - return Real(4)/((modex+1)*(modey+1)*binom*(modex+modey+modez+3)); + return quadrature_exactness::pyramid_integral(static_cast(modex), + static_cast(modey), + static_cast(modez)); }; From 4cc3a11c8b0ce45d098b2d887204570cca9edaa2 Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 13:20:30 -0600 Subject: [PATCH 7/8] Fix installed Kokkos FE header support --- contrib/bin/libmesh-config.in | 2 +- contrib/utils/libmesh-dbg.pc.in | 1 + contrib/utils/libmesh-devel.pc.in | 1 + contrib/utils/libmesh-oprof.pc.in | 1 + contrib/utils/libmesh-opt.pc.in | 1 + contrib/utils/libmesh-prof.pc.in | 1 + include/gpu/kokkos_fe_base.h | 2 +- include/gpu/kokkos_fe_evaluator.h | 12 ++--- include/gpu/kokkos_fe_face_map.h | 2 +- include/gpu/kokkos_fe_lagrange_1d.h | 2 +- include/gpu/kokkos_fe_lagrange_2d.h | 2 +- include/gpu/kokkos_fe_lagrange_3d.h | 2 +- include/gpu/kokkos_fe_map.h | 4 +- include/gpu/kokkos_fe_monomial.h | 2 +- include/gpu/kokkos_quadrature.h | 2 +- include/gpu/kokkos_scalar_types.h | 68 +++++++++++++++++++++++++++++ 16 files changed, 89 insertions(+), 16 deletions(-) diff --git a/contrib/bin/libmesh-config.in b/contrib/bin/libmesh-config.in index b935b5b334b..e75de90ed95 100644 --- a/contrib/bin/libmesh-config.in +++ b/contrib/bin/libmesh-config.in @@ -106,7 +106,7 @@ while [ "x$1" != "x" ]; do ;; "--cppflags") - return_val="${CPPFLAGS} $return_val" + return_val="${CPPFLAGS} @KOKKOS_CPPFLAGS@ $return_val" ;; "--cxxflags") diff --git a/contrib/utils/libmesh-dbg.pc.in b/contrib/utils/libmesh-dbg.pc.in index ab532d664c1..f6671513a62 100644 --- a/contrib/utils/libmesh-dbg.pc.in +++ b/contrib/utils/libmesh-dbg.pc.in @@ -13,4 +13,5 @@ Libs: -Wl,-rpath,${libdir} -L${libdir} -lmesh_dbg -ltimpi_dbg \ Libs.private: Cflags: @CPPFLAGS_DBG@ \ -I${includedir} \ + @KOKKOS_CPPFLAGS@ \ @libmesh_optional_INCLUDES@ diff --git a/contrib/utils/libmesh-devel.pc.in b/contrib/utils/libmesh-devel.pc.in index 63b3d6c8097..75f4983cd62 100644 --- a/contrib/utils/libmesh-devel.pc.in +++ b/contrib/utils/libmesh-devel.pc.in @@ -13,4 +13,5 @@ Libs: -Wl,-rpath,${libdir} -L${libdir} -lmesh_devel -ltimpi_devel \ Libs.private: Cflags: @CPPFLAGS_DEVEL@ \ -I${includedir} \ + @KOKKOS_CPPFLAGS@ \ @libmesh_optional_INCLUDES@ diff --git a/contrib/utils/libmesh-oprof.pc.in b/contrib/utils/libmesh-oprof.pc.in index 1184f433eb5..0e955436cdc 100644 --- a/contrib/utils/libmesh-oprof.pc.in +++ b/contrib/utils/libmesh-oprof.pc.in @@ -13,4 +13,5 @@ Libs: -Wl,-rpath,${libdir} -L${libdir} -lmesh_oprof -ltimpi_oprof \ Libs.private: Cflags: @CPPFLAGS_OPROF@ \ -I${includedir} \ + @KOKKOS_CPPFLAGS@ \ @libmesh_optional_INCLUDES@ diff --git a/contrib/utils/libmesh-opt.pc.in b/contrib/utils/libmesh-opt.pc.in index 10deb13ec50..616875c1d0b 100644 --- a/contrib/utils/libmesh-opt.pc.in +++ b/contrib/utils/libmesh-opt.pc.in @@ -13,4 +13,5 @@ Libs: -Wl,-rpath,${libdir} -L${libdir} -lmesh_opt -ltimpi_opt \ Libs.private: Cflags: @CPPFLAGS_OPT@ \ -I${includedir} \ + @KOKKOS_CPPFLAGS@ \ @libmesh_optional_INCLUDES@ diff --git a/contrib/utils/libmesh-prof.pc.in b/contrib/utils/libmesh-prof.pc.in index 213601d795a..0684e99bf40 100644 --- a/contrib/utils/libmesh-prof.pc.in +++ b/contrib/utils/libmesh-prof.pc.in @@ -13,4 +13,5 @@ Libs: -Wl,-rpath,${libdir} -L${libdir} -lmesh_prof -ltimpi_prof \ Libs.private: Cflags: @CPPFLAGS_PROF@ \ -I${includedir} \ + @KOKKOS_CPPFLAGS@ \ @libmesh_optional_INCLUDES@ diff --git a/include/gpu/kokkos_fe_base.h b/include/gpu/kokkos_fe_base.h index 07664e627eb..4526ebdc67a 100644 --- a/include/gpu/kokkos_fe_base.h +++ b/include/gpu/kokkos_fe_base.h @@ -27,7 +27,7 @@ #ifndef LIBMESH_KOKKOS_FE_BASE_H #define LIBMESH_KOKKOS_FE_BASE_H -#include "gpu/kokkos_scalar_types.h" +#include "kokkos_scalar_types.h" #include "libmesh/libmesh_device.h" #include "libmesh/enum_elem_type.h" #include "libmesh/enum_fe_family.h" diff --git a/include/gpu/kokkos_fe_evaluator.h b/include/gpu/kokkos_fe_evaluator.h index 118880c614d..5fb7c1d1dc4 100644 --- a/include/gpu/kokkos_fe_evaluator.h +++ b/include/gpu/kokkos_fe_evaluator.h @@ -15,12 +15,12 @@ #ifndef LIBMESH_KOKKOS_FE_EVALUATOR_H #define LIBMESH_KOKKOS_FE_EVALUATOR_H -#include "gpu/kokkos_fe_base.h" -#include "gpu/kokkos_fe_types.h" -#include "gpu/kokkos_fe_lagrange_1d.h" -#include "gpu/kokkos_fe_lagrange_2d.h" -#include "gpu/kokkos_fe_lagrange_3d.h" -#include "gpu/kokkos_fe_monomial.h" +#include "kokkos_fe_base.h" +#include "kokkos_fe_types.h" +#include "kokkos_fe_lagrange_1d.h" +#include "kokkos_fe_lagrange_2d.h" +#include "kokkos_fe_lagrange_3d.h" +#include "kokkos_fe_monomial.h" #include "libmesh/enum_elem_type.h" #include "libmesh/enum_fe_family.h" diff --git a/include/gpu/kokkos_fe_face_map.h b/include/gpu/kokkos_fe_face_map.h index 822ce4da406..5cefdd2402b 100644 --- a/include/gpu/kokkos_fe_face_map.h +++ b/include/gpu/kokkos_fe_face_map.h @@ -3,7 +3,7 @@ #ifdef LIBMESH_HAVE_KOKKOS -#include "gpu/kokkos_fe_evaluator.h" +#include "kokkos_fe_evaluator.h" #include "libmesh/elem.h" namespace libMesh::Kokkos diff --git a/include/gpu/kokkos_fe_lagrange_1d.h b/include/gpu/kokkos_fe_lagrange_1d.h index 72e78692882..3ade1ee709c 100644 --- a/include/gpu/kokkos_fe_lagrange_1d.h +++ b/include/gpu/kokkos_fe_lagrange_1d.h @@ -12,7 +12,7 @@ #ifndef LIBMESH_KOKKOS_FE_LAGRANGE_1D_H #define LIBMESH_KOKKOS_FE_LAGRANGE_1D_H -#include "gpu/kokkos_fe_base.h" +#include "kokkos_fe_base.h" namespace libMesh::Kokkos { diff --git a/include/gpu/kokkos_fe_lagrange_2d.h b/include/gpu/kokkos_fe_lagrange_2d.h index 08d1e2f5ba6..f58097cbe21 100644 --- a/include/gpu/kokkos_fe_lagrange_2d.h +++ b/include/gpu/kokkos_fe_lagrange_2d.h @@ -8,7 +8,7 @@ #ifndef LIBMESH_KOKKOS_FE_LAGRANGE_2D_H #define LIBMESH_KOKKOS_FE_LAGRANGE_2D_H -#include "gpu/kokkos_fe_base.h" +#include "kokkos_fe_base.h" namespace libMesh::Kokkos { diff --git a/include/gpu/kokkos_fe_lagrange_3d.h b/include/gpu/kokkos_fe_lagrange_3d.h index 5f2fbb203c3..48afbccaa28 100644 --- a/include/gpu/kokkos_fe_lagrange_3d.h +++ b/include/gpu/kokkos_fe_lagrange_3d.h @@ -8,7 +8,7 @@ #ifndef LIBMESH_KOKKOS_FE_LAGRANGE_3D_H #define LIBMESH_KOKKOS_FE_LAGRANGE_3D_H -#include "gpu/kokkos_fe_base.h" +#include "kokkos_fe_base.h" namespace libMesh::Kokkos { diff --git a/include/gpu/kokkos_fe_map.h b/include/gpu/kokkos_fe_map.h index d71f81c931a..6e237997f81 100644 --- a/include/gpu/kokkos_fe_map.h +++ b/include/gpu/kokkos_fe_map.h @@ -17,8 +17,8 @@ #ifndef LIBMESH_KOKKOS_FE_MAP_H #define LIBMESH_KOKKOS_FE_MAP_H -#include "gpu/kokkos_fe_evaluator.h" -#include "gpu/kokkos_scalar_types.h" +#include "kokkos_fe_evaluator.h" +#include "kokkos_scalar_types.h" namespace libMesh::Kokkos { diff --git a/include/gpu/kokkos_fe_monomial.h b/include/gpu/kokkos_fe_monomial.h index b68289c72eb..2dde44785f6 100644 --- a/include/gpu/kokkos_fe_monomial.h +++ b/include/gpu/kokkos_fe_monomial.h @@ -13,7 +13,7 @@ #ifndef LIBMESH_KOKKOS_FE_MONOMIAL_H #define LIBMESH_KOKKOS_FE_MONOMIAL_H -#include "gpu/kokkos_fe_base.h" +#include "kokkos_fe_base.h" #include "libmesh/enum_elem_type.h" namespace libMesh::Kokkos diff --git a/include/gpu/kokkos_quadrature.h b/include/gpu/kokkos_quadrature.h index 4c2e8750bab..d8b94c56a5c 100644 --- a/include/gpu/kokkos_quadrature.h +++ b/include/gpu/kokkos_quadrature.h @@ -14,7 +14,7 @@ #ifndef LIBMESH_KOKKOS_QUADRATURE_H #define LIBMESH_KOKKOS_QUADRATURE_H -#include "gpu/kokkos_scalar_types.h" +#include "kokkos_scalar_types.h" #include "libmesh/enum_elem_type.h" #include #include diff --git a/include/gpu/kokkos_scalar_types.h b/include/gpu/kokkos_scalar_types.h index b7386cf900f..7584819413b 100644 --- a/include/gpu/kokkos_scalar_types.h +++ b/include/gpu/kokkos_scalar_types.h @@ -10,6 +10,7 @@ #include "libmesh/libmesh_device.h" #include "libmesh/type_vector.h" #include "libmesh/type_tensor.h" + namespace libMesh::Kokkos { @@ -17,6 +18,73 @@ using Real = libMesh::Real; using RealVector = libMesh::TypeVector; using RealTensor = libMesh::TypeTensor; +template +LIBMESH_DEVICE_INLINE +VectorType load_vector(const ViewType & view, const unsigned int i) +{ + VectorType v; + v.zero(); + + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + v(d) = view(i, d); + + return v; +} + +template +LIBMESH_DEVICE_INLINE +void store_vector(const ViewType & view, const unsigned int i, const VectorType & v) +{ + for (unsigned int d = 0; d < LIBMESH_DIM; ++d) + view(i, d) = v(d); +} + +template +LIBMESH_DEVICE_INLINE +Real vector_component(const ViewType & view, const unsigned int i, const unsigned int component) +{ + if (component < LIBMESH_DIM) + return view(i, component); + + return Real(0); +} + +template +LIBMESH_DEVICE_INLINE +TensorType load_tensor(const ViewType & view, const unsigned int i) +{ + TensorType T; + T.zero(); + + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + T(row, col) = view(i, row, col); + + return T; +} + +template +LIBMESH_DEVICE_INLINE +void store_tensor(const ViewType & view, const unsigned int i, const TensorType & T) +{ + for (unsigned int row = 0; row < LIBMESH_DIM; ++row) + for (unsigned int col = 0; col < LIBMESH_DIM; ++col) + view(i, row, col) = T(row, col); +} + +template +LIBMESH_DEVICE_INLINE +Real tensor_component(const ViewType & view, + const unsigned int i, + const unsigned int row, + const unsigned int col) +{ + if (row < LIBMESH_DIM && col < LIBMESH_DIM) + return view(i, row, col); + + return Real(0); +} + LIBMESH_DEVICE_INLINE RealVector zero_vector() { From 9b1aa45b77d2bfe7c61fe3229542b0cf61ad74ff Mon Sep 17 00:00:00 2001 From: rochi00 Date: Wed, 6 May 2026 15:03:32 -0600 Subject: [PATCH 8/8] Export enum_fe_elem_class header --- include/include_HEADERS | 1 + include/libmesh/Makefile.am | 4 ++++ include/libmesh/Makefile.in | 17 ++++++++++------- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/include_HEADERS b/include/include_HEADERS index 8d980280d31..61ce7391717 100644 --- a/include/include_HEADERS +++ b/include/include_HEADERS @@ -50,6 +50,7 @@ include_HEADERS = \ enums/enum_elem_quality.h \ enums/enum_elem_type.h \ enums/enum_error_estimator_type.h \ + enums/enum_fe_elem_class.h \ enums/enum_fe_family.h \ enums/enum_inf_map_type.h \ enums/enum_io_package.h \ diff --git a/include/libmesh/Makefile.am b/include/libmesh/Makefile.am index f6010488ff0..22549c7105d 100644 --- a/include/libmesh/Makefile.am +++ b/include/libmesh/Makefile.am @@ -41,6 +41,7 @@ BUILT_SOURCES = \ enum_elem_quality.h \ enum_elem_type.h \ enum_error_estimator_type.h \ + enum_fe_elem_class.h \ enum_fe_family.h \ enum_inf_map_type.h \ enum_io_package.h \ @@ -723,6 +724,9 @@ enum_elem_type.h: $(top_srcdir)/include/enums/enum_elem_type.h enum_error_estimator_type.h: $(top_srcdir)/include/enums/enum_error_estimator_type.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ +enum_fe_elem_class.h: $(top_srcdir)/include/enums/enum_fe_elem_class.h + $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ + enum_fe_family.h: $(top_srcdir)/include/enums/enum_fe_family.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ diff --git a/include/libmesh/Makefile.in b/include/libmesh/Makefile.in index 5c5b77c25db..f65449fe071 100644 --- a/include/libmesh/Makefile.in +++ b/include/libmesh/Makefile.in @@ -547,13 +547,13 @@ BUILT_SOURCES = dirichlet_boundaries.h dof_map.h dof_map_base.h \ single_predicates.h sparsity_pattern.h variable.h \ variant_filter_iterator.h enum_convergence_flags.h \ enum_eigen_solver_type.h enum_elem_quality.h enum_elem_type.h \ - enum_error_estimator_type.h enum_fe_family.h \ - enum_inf_map_type.h enum_io_package.h enum_matrix_build_type.h \ - enum_norm_type.h enum_order.h enum_parallel_type.h \ - enum_partitioner_type.h enum_point_locator_type.h \ - enum_preconditioner_type.h enum_quadrature_type.h \ - enum_solver_package.h enum_solver_type.h \ - enum_subset_solve_mode.h enum_xdr_mode.h \ + enum_error_estimator_type.h enum_fe_elem_class.h \ + enum_fe_family.h enum_inf_map_type.h enum_io_package.h \ + enum_matrix_build_type.h enum_norm_type.h enum_order.h \ + enum_parallel_type.h enum_partitioner_type.h \ + enum_point_locator_type.h enum_preconditioner_type.h \ + enum_quadrature_type.h enum_solver_package.h \ + enum_solver_type.h enum_subset_solve_mode.h enum_xdr_mode.h \ adjoint_refinement_estimator.h \ adjoint_residual_error_estimator.h discontinuity_measure.h \ error_estimator.h exact_error_estimator.h exact_solution.h \ @@ -1067,6 +1067,9 @@ enum_elem_type.h: $(top_srcdir)/include/enums/enum_elem_type.h enum_error_estimator_type.h: $(top_srcdir)/include/enums/enum_error_estimator_type.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ +enum_fe_elem_class.h: $(top_srcdir)/include/enums/enum_fe_elem_class.h + $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@ + enum_fe_family.h: $(top_srcdir)/include/enums/enum_fe_family.h $(AM_V_GEN)rm -f $@ && $(LN_S) -f $< $@