@@ -155,6 +155,17 @@ inline void vec_multiply(
155155 a1.array () *= a2.array ();
156156}
157157
158+ template <typename Derived>
159+ inline auto clone (const Eigen::MatrixBase<Derived>& a) {
160+ return a.eval ();
161+ }
162+
163+ template <typename XprType1, int BlockRows1, int BlockCols1, bool InnerPanel1>
164+ inline auto clone (
165+ const Eigen::Block<XprType1, BlockRows1, BlockCols1, InnerPanel1>& a) {
166+ return a.eval ();
167+ }
168+
158169template <typename Derived, typename S>
159170inline void scale (Eigen::MatrixBase<Derived>& a, S scaling_factor) {
160171 using numeric_type = typename Eigen::MatrixBase<Derived>::value_type;
@@ -239,6 +250,21 @@ inline auto norm2(
239250 return m.template lpNorm <2 >();
240251}
241252
253+ template <typename Derived>
254+ inline auto volume (const Eigen::MatrixBase<Derived>& m) {
255+ return m.size ();
256+ }
257+
258+ template <typename Derived>
259+ inline auto abs_min (const Eigen::MatrixBase<Derived>& m) {
260+ return m.array ().abs ().minCoeff ();
261+ }
262+
263+ template <typename Derived>
264+ inline auto abs_max (const Eigen::MatrixBase<Derived>& m) {
265+ return m.array ().abs ().maxCoeff ();
266+ }
267+
242268} // namespace Eigen
243269
244270#ifndef TILEDARRAY_MATH_LINALG_DISPATCH_W_TTG
@@ -253,12 +279,12 @@ inline auto norm2(
253279 return scalapack::FN; \
254280 return non_distributed::FN;
255281#elif (TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK)
256- #define TILEDARRAY_MATH_LINALG_DISPATCH_W_TTG (FN, MATRIX ) \
257- TA_MAX_THREADS; \
258- if (get_linalg_backend() == LinearAlgebraBackend::TTG || \
259- TiledArray::math::linalg::detail::prefer_distributed (MATRIX)) \
260- return TiledArray::math::linalg::ttg::FN; \
261- if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
282+ #define TILEDARRAY_MATH_LINALG_DISPATCH_W_TTG (FN, MATRIX ) \
283+ TA_MAX_THREADS; \
284+ if (get_linalg_backend() == LinearAlgebraBackend::TTG || \
285+ TiledArray::math::linalg::detail::prefer_distributed (MATRIX)) \
286+ return TiledArray::math::linalg::ttg::FN; \
287+ if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
262288 TA_EXCEPTION (" ScaLAPACK linear algebra backend is not available" ); \
263289 return non_distributed::FN;
264290#elif !TILEDARRAY_HAS_TTG && TILEDARRAY_HAS_SCALAPACK
@@ -271,11 +297,11 @@ inline auto norm2(
271297 return scalapack::FN; \
272298 return non_distributed::FN;
273299#else // !TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK
274- #define TILEDARRAY_MATH_LINALG_DISPATCH_W_TTG (FN, MATRIX ) \
275- TA_MAX_THREADS; \
276- if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
277- TA_EXCEPTION (" TTG linear algebra backend is not available" ); \
278- if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
300+ #define TILEDARRAY_MATH_LINALG_DISPATCH_W_TTG (FN, MATRIX ) \
301+ TA_MAX_THREADS; \
302+ if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
303+ TA_EXCEPTION (" TTG linear algebra backend is not available" ); \
304+ if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
279305 TA_EXCEPTION (" ScaLAPACK linear algebra backend is not available" ); \
280306 return non_distributed::FN;
281307#endif // !TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK
@@ -297,12 +323,12 @@ inline auto norm2(
297323 return scalapack::FN; \
298324 return non_distributed::FN;
299325#elif TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK
300- #define TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG (FN, MATRIX ) \
301- TA_MAX_THREADS; \
302- if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
303- TA_EXCEPTION (TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG_STRINGIFY( \
304- FN) " is not provided by the TTG backend"); \
305- if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
326+ #define TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG (FN, MATRIX ) \
327+ TA_MAX_THREADS; \
328+ if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
329+ TA_EXCEPTION (TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG_STRINGIFY( \
330+ FN) " is not provided by the TTG backend"); \
331+ if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
306332 TA_EXCEPTION (" ScaLAPACK linear algebra backend is not available" ); \
307333 return non_distributed::FN;
308334#elif !TILEDARRAY_HAS_TTG && TILEDARRAY_HAS_SCALAPACK
@@ -315,11 +341,11 @@ inline auto norm2(
315341 return scalapack::FN; \
316342 return non_distributed::FN;
317343#else // !TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK
318- #define TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG (FN, MATRIX ) \
319- TA_MAX_THREADS; \
320- if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
321- TA_EXCEPTION (" TTG linear algebra backend is not available" ); \
322- if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
344+ #define TILEDARRAY_MATH_LINALG_DISPATCH_WO_TTG (FN, MATRIX ) \
345+ TA_MAX_THREADS; \
346+ if (get_linalg_backend() == LinearAlgebraBackend::TTG) \
347+ TA_EXCEPTION (" TTG linear algebra backend is not available" ); \
348+ if (get_linalg_backend() == LinearAlgebraBackend::ScaLAPACK) \
323349 TA_EXCEPTION (" ScaLAPACK linear algebra backend is not available" ); \
324350 return non_distributed::FN;
325351#endif // !TILEDARRAY_HAS_TTG && !TILEDARRAY_HAS_SCALAPACK
0 commit comments