1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
     100
     101
     102
     103
     104
     105
     106
     107
     108
     109
     110
     111
     112
     113
     114
     115
     116
     117
     118
     119
     120
     121
     122
     123
     124
     125
     126
     127
     128
     129
     130
#define STR(x)      #x
#define STRING(x)   STR(x)

#include <flens/lapack/interface/include/config.h>

namespace flens { namespace lapack {

extern "C" {

//-- dgels ---------------------------------------------------------------------
void
LAPACK_DECL(dgels)(const char           *TRANS,
                   const INTEGER        *M,
                   const INTEGER        *N,
                   const INTEGER        *NRHS,
                   DOUBLE               *A,
                   const INTEGER        *LDA,
                   DOUBLE               *B,
                   const INTEGER        *LDB,
                   DOUBLE               *WORK,
                   const INTEGER        *LWORK,
                   INTEGER              *INFO)
{
    std::cerr << "dgels" << std::endl;
//
//  Test the input parameters so that we pass LAPACK error checks
//
    const bool lQuery = (*LWORK==0);
    const INTEGER mn = std::min(*M, *N);

    *INFO0;
    if (*TRANS!='N' && *TRANS!='T' && *TRANS!='C') {
        *INFO = -1;
    } else if (*M<0) {
        *INFO = -2;
    } else if (*N<0) {
        *INFO = -3;
    } else if (*NRHS<0) {
        *INFO = -4;
    } else if (*LDA<std::max(INTEGER(1), *M)) {
        *INFO = -6;
    } else if (*LDB<flens::max(INTEGER(1), *M, *N)) {
        *INFO = -8;
    } else if (*LWORK<std::max(INTEGER(1), mn+std::max(mn, *NRHS)) && !lQuery) {
        *INFO = -10;
    }
    if (*INFO!=0) {
        *INFO = -(*INFO);
        LAPACK_ERROR("DGELS", INFO);
        *INFO = -(*INFO);
        return;
    }
//
//  Call FLENS implementation
//
    Transpose           trans  = convertTo<Transpose>(*TRANS);
    DGeMatrixView       _A     = DFSView(*M, *N, A, *LDA);

    const INTEGER numRowsB = std::max(*M,*N);
    DGeMatrixView       _B     = DFSView(numRowsB, *NRHS, B, *LDB);
    DDenseVectorView    _WORK  = DArrayView(*LWORK, WORK1);

    ls(trans, _A, _B, _WORK);

}

//-- zgels ---------------------------------------------------------------------
void
LAPACK_DECL(zgels)(const char           *TRANS,
                   const INTEGER        *M,
                   const INTEGER        *N,
                   const INTEGER        *NRHS,
                   DOUBLE_COMPLEX       *A,
                   const INTEGER        *LDA,
                   DOUBLE_COMPLEX       *B,
                   const INTEGER        *LDB,
                   DOUBLE_COMPLEX       *WORK,
                   const INTEGER        *LWORK,
                   INTEGER              *INFO)
{
//
//  Test the input parameters so that we pass LAPACK error checks
//
    const bool lQuery = (*LWORK==0);
    const INTEGER mn = std::min(*M, *N);

    *INFO0;
    if (*TRANS!='N' && *TRANS!='T' && *TRANS!='C') {
        *INFO = -1;
    } else if (*M<0) {
        *INFO = -2;
    } else if (*N<0) {
        *INFO = -3;
    } else if (*NRHS<0) {
        *INFO = -4;
    } else if (*LDA<std::max(INTEGER(1), *M)) {
        *INFO = -6;
    } else if (*LDB<flens::max(INTEGER(1), *M, *N)) {
        *INFO = -8;
    } else if (*LWORK<std::max(INTEGER(1), mn+std::max(mn, *NRHS)) && !lQuery) {
        *INFO = -10;
    }
    if (*INFO!=0) {
        *INFO = -(*INFO);
        LAPACK_ERROR("ZGELS", INFO);
        *INFO = -(*INFO);
        return;
    }
//
//  Call FLENS implementation
//
    auto zA         = reinterpret_cast<CXX_DOUBLE_COMPLEX *>(A);
    auto zB         = reinterpret_cast<CXX_DOUBLE_COMPLEX *>(B);
    auto zWORK      = reinterpret_cast<CXX_DOUBLE_COMPLEX *>(WORK);

    Transpose           trans  = convertTo<Transpose>(*TRANS);
    ZGeMatrixView       _A     = ZFSView(*M, *N, zA, *LDA);

    const INTEGER numRowsB = std::max(*M,*N);
    ZGeMatrixView       _B     = ZFSView(numRowsB, *NRHS, zB, *LDB);
    ZDenseVectorView    _WORK  = ZArrayView(*LWORK, zWORK1);

    ls(trans, _A, _B, _WORK);

}


// extern "C"

} } // namespace lapack, flens