TRIQS/nda 2.0.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
ungqr.hpp
Go to the documentation of this file.
1// Copyright (c) 2024--present, The Simons Foundation
2// This file is part of TRIQS/nda and is licensed under the Apache License, Version 2.0.
3// SPDX-License-Identifier: Apache-2.0
4// See LICENSE in the root of this distribution for details.
5
10
11#pragma once
12
14#include "../basic_array.hpp"
15#include "../blas/tools.hpp"
16#include "../concepts.hpp"
17#include "../declarations.hpp"
18#include "../macros.hpp"
20#include "../traits.hpp"
21
22#include <algorithm>
23#include <cmath>
24#include <complex>
25#include <type_traits>
26
27namespace nda::lapack {
28
65 template <BlasArrayCplx<2> A, BlasArrayFor<A, 1> TAU, BlasArrayFor<A, 1> W = vector_value_t<A>>
66 requires(has_F_layout<A>)
67 int ungqr(A &&a, TAU &&tau, W &&work = vector_value_t<A>{}) { // NOLINT (temporary views are allowed here)
68 constexpr bool run_on_device = mem::have_device_compatible_addr_space<A, TAU, W>;
69
70 // check the dimensions of the input/output arrays/views
71 auto const [m, n] = a.shape();
72 auto const k = tau.size();
73 EXPECTS(m >= n);
74 EXPECTS(n >= k);
75
76 // arrays/views must be LAPACK compatible
77 EXPECTS(a.indexmap().min_stride() == 1);
78 EXPECTS(tau.indexmap().min_stride() == 1);
79
80 // first call to get the optimal buffer size
81 auto tmp_lwork = get_value_t<A>{};
82 int info = 0;
83 if constexpr (run_on_device) {
84 tmp_lwork = device::ungqr_buffer_size(m, n, k, a.data(), get_ld(a), tau.data());
85 } else {
86 f77::ungqr(m, n, k, a.data(), get_ld(a), tau.data(), &tmp_lwork, -1, info);
87 }
88 int lwork = static_cast<int>(std::ceil(std::real(tmp_lwork)));
89
90 // resize/check work buffer
91 resize_or_check_work_buffer(work, lwork);
92
93 // perform actual library call
94 if constexpr (run_on_device) {
95 device::ungqr(m, n, k, a.data(), get_ld(a), tau.data(), work.data(), lwork, info);
96 } else {
97 f77::ungqr(m, n, k, a.data(), get_ld(a), tau.data(), work.data(), lwork, info);
98 }
99
100 return info;
101 }
102
103} // namespace nda::lapack
Provides definitions and type traits involving the different memory address spaces supported by nda.
Provides the generic class for arrays.
Provides various traits and utilities for the BLAS interface.
Provides concepts for the nda library.
Provides various convenient aliases and helper functions for nda::basic_array and nda::basic_array_vi...
std::decay_t< decltype(get_first_element(std::declval< A const >()))> get_value_t
Get the value type of an array/view or a scalar type.
Definition traits.hpp:212
int get_ld(A const &a)
Get the leading dimension of an nda::MemoryArray with rank 1 or 2 for BLAS/LAPACK calls.
Definition tools.hpp:128
void resize_or_check_work_buffer(A &a, long min_size)
Resize or check the size of a 1D array/view.
Definition tools.hpp:207
vector< get_value_t< A >, heap< mem::get_addr_space< A > > > vector_value_t
Alias for an nda::vector with the same value type and address space as the given type.
Definition tools.hpp:161
static constexpr bool has_F_layout
Constexpr variable that is true if all given nda::Array types have nda::F_layout.
Definition tools.hpp:79
int ungqr(A &&a, TAU &&tau, W &&work=vector_value_t< A >{})
Interface to the LAPACK/cuSOLVER ungqr routine.
Definition ungqr.hpp:67
static constexpr bool have_device_compatible_addr_space
Constexpr variable that is true if all given types have an address space compatible with Device.
Provides a C++ interface for various LAPACK routines.
Macros used in the nda library.
Provides type traits for the nda library.